update
30
.gitignore
vendored
Normal file
@ -0,0 +1,30 @@
|
||||
# General
|
||||
.DS_Store
|
||||
.AppleDouble
|
||||
.LSOverride
|
||||
.idea
|
||||
|
||||
runtime
|
||||
|
||||
# Icon must end with two \r
|
||||
Icon
|
||||
|
||||
|
||||
# Thumbnails
|
||||
._*
|
||||
|
||||
# Files that might appear in the root of a volume
|
||||
.DocumentRevisions-V100
|
||||
.fseventsd
|
||||
.Spotlight-V100
|
||||
.TemporaryItems
|
||||
.Trashes
|
||||
.VolumeIcon.icns
|
||||
.com.apple.timemachine.donotpresent
|
||||
|
||||
# Directories potentially created on remote AFP share
|
||||
.AppleDB
|
||||
.AppleDesktop
|
||||
Network Trash Folder
|
||||
Temporary Items
|
||||
.apdisk
|
674
LICENSE
Normal file
@ -0,0 +1,674 @@
|
||||
GNU GENERAL PUBLIC LICENSE
|
||||
Version 3, 29 June 2007
|
||||
|
||||
Copyright (C) 2007 Free Software Foundation, Inc. [http://fsf.org/]
|
||||
Everyone is permitted to copy and distribute verbatim copies
|
||||
of this license document, but changing it is not allowed.
|
||||
|
||||
Preamble
|
||||
|
||||
The GNU 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} {fullname}
|
||||
|
||||
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 [http://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:
|
||||
|
||||
Lsky Pro Copyright (C) 2018 熊二哈
|
||||
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
|
||||
[http://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
|
||||
[http://www.gnu.org/philosophy/why-not-lgpl.html].
|
70
README.md
@ -1,2 +1,68 @@
|
||||
# lsky-pro
|
||||
Lsky Pro,你的云上相册
|
||||
<p align="center">
|
||||
<a href="./public/static/app/images/logo.png" target="_blank">
|
||||
<img width="350" src="./public/static/app/images/logo.png">
|
||||
</a>
|
||||
</p>
|
||||
<h1>Lsky Pro - Your photo album on the cloud.</h1>
|
||||
|
||||
#### 简介:
|
||||
---
|
||||
Lsky Pro,为个人站长、开发者、写博文爱好者开发的图床程序。同时可用作网络云相册。
|
||||
|
||||
#### 主要特性
|
||||
---
|
||||
- 支持第三方云储存,支持本地、阿里云OSS、腾讯云COS、七牛云、又拍云。
|
||||
- 支持多图上传、拖拽上传、上传预览、全屏预览、页面响应式布局。
|
||||
- 简洁的图片管理功能,支持鼠标右键、单选多选等操作。
|
||||
- 强大的图片预览功能,支持响应式。
|
||||
- 支持全局配置用户初始剩余储存空间、支持单个设置用户剩余储存空间。
|
||||
- 支持一键复制图片外链、二维码扫描链接。
|
||||
|
||||
#### 安装需求:
|
||||
---
|
||||
|
||||
* PHP版本 ≥ 5.6
|
||||
* Mysqli
|
||||
* Curl拓展
|
||||
* Zip拓展
|
||||
* Rewrite
|
||||
|
||||
---
|
||||
|
||||
1. 下载兰空,上传至web运行环境,解压。
|
||||
2. 设置运行目录为 public。
|
||||
3. 配置Rewrite规则:
|
||||
##### Nginx:
|
||||
<pre>
|
||||
location / {
|
||||
if (!-e $request_filename) {
|
||||
rewrite ^(.*)$ /index.php?s=$1 last; break;
|
||||
}
|
||||
}
|
||||
</pre>
|
||||
|
||||
##### Apache:
|
||||
Apache直接使用.htaccess即可
|
||||
|
||||
4. 访问首页,未安装自动跳转至安装页面,根据页面提示安装即可。
|
||||
5. 安装完成以后请设置runtime目录0777权限,如果你使用本地存储,public 目录也需要设置为0777权限
|
||||
|
||||
#### 联系我
|
||||
---
|
||||
QQ:1591788658<br>
|
||||
Email: 1591788658@qq.com<br>
|
||||
Blog: <a target="_block" href="http://www.wispx.cn">www.wispx.cn</a>
|
||||
|
||||
#### 鸣谢
|
||||
- ThinkPHP
|
||||
- Jquery
|
||||
- BootStrap
|
||||
- Mdui
|
||||
- viewer.js
|
||||
- context.js
|
||||
|
||||
#### 开源许可
|
||||
---
|
||||
<a target="_block" href="https://opensource.org/licenses/GPL-3.0">GPL 3.0</a>
|
||||
|
||||
Copyright (c) 2017 Wisp X.
|
||||
|
1
application/.htaccess
Normal file
@ -0,0 +1 @@
|
||||
deny from all
|
12
application/command.php
Normal file
@ -0,0 +1,12 @@
|
||||
<?php
|
||||
// +----------------------------------------------------------------------
|
||||
// | ThinkPHP [ WE CAN DO IT JUST THINK ]
|
||||
// +----------------------------------------------------------------------
|
||||
// | Copyright (c) 2006-2016 http://thinkphp.cn All rights reserved.
|
||||
// +----------------------------------------------------------------------
|
||||
// | Licensed ( http://www.apache.org/licenses/LICENSE-2.0 )
|
||||
// +----------------------------------------------------------------------
|
||||
// | Author: yunwuxin <448901948@qq.com>
|
||||
// +----------------------------------------------------------------------
|
||||
|
||||
return [];
|
111
application/common.php
Normal file
@ -0,0 +1,111 @@
|
||||
<?php
|
||||
// +----------------------------------------------------------------------
|
||||
// | ThinkPHP [ WE CAN DO IT JUST THINK ]
|
||||
// +----------------------------------------------------------------------
|
||||
// | Copyright (c) 2006-2016 http://thinkphp.cn All rights reserved.
|
||||
// +----------------------------------------------------------------------
|
||||
// | Licensed ( http://www.apache.org/licenses/LICENSE-2.0 )
|
||||
// +----------------------------------------------------------------------
|
||||
// | Author: 流年 <liu21st@gmail.com>
|
||||
// +----------------------------------------------------------------------
|
||||
|
||||
// 应用公共文件
|
||||
|
||||
/**
|
||||
* 转换文件大小单位
|
||||
*
|
||||
* @param $size
|
||||
*
|
||||
* @return string
|
||||
*/
|
||||
function format_size($size)
|
||||
{
|
||||
if (0 == $size) {
|
||||
return "0.00 Bytes";
|
||||
}
|
||||
$unit = ['','K','M','G','T','P'];
|
||||
$base = 1024;
|
||||
$i = floor(log($size, $base));
|
||||
$n = count($unit);
|
||||
if($i >= $n) {
|
||||
$i = $n - 1;
|
||||
}
|
||||
|
||||
return sprintf("%.2f", $size / pow($base, $i)) . ' ' . $unit[$i] . 'B';
|
||||
}
|
||||
|
||||
/**
|
||||
* 过滤逗号(去除字符串两边的逗号,并将中文逗号转换成英文逗号)
|
||||
*
|
||||
* @param $str 字符串
|
||||
*
|
||||
* @return string
|
||||
*/
|
||||
function filter_comma($str)
|
||||
{
|
||||
return trim(str_replace(",", ",", $str), ",");
|
||||
}
|
||||
|
||||
/**
|
||||
* 获取文件后缀
|
||||
*
|
||||
* @param $name 文件名
|
||||
*
|
||||
* @return mixed
|
||||
*/
|
||||
function get_file_ext($name)
|
||||
{
|
||||
return pathinfo($name, PATHINFO_EXTENSION);
|
||||
}
|
||||
|
||||
/**
|
||||
* 随机字符串
|
||||
*
|
||||
* @param int $length
|
||||
* @param string $char
|
||||
* @return bool|string
|
||||
*/
|
||||
function str_rand($length = 16, $char = '0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ') {
|
||||
$string = '';
|
||||
for($i = $length; $i > 0; $i--) {
|
||||
$string .= $char[mt_rand(0, strlen($char) - 1)];
|
||||
}
|
||||
|
||||
return $string;
|
||||
}
|
||||
|
||||
/**
|
||||
* Make Token
|
||||
*
|
||||
* @return string
|
||||
*/
|
||||
function make_token()
|
||||
{
|
||||
return md5('LSKY PRO' .time());
|
||||
}
|
||||
|
||||
/**
|
||||
* Make Url
|
||||
*
|
||||
* @param $domain
|
||||
* @param null $pathname
|
||||
* @return mixed
|
||||
*/
|
||||
function make_url($domain, $pathname = null)
|
||||
{
|
||||
$domain = rtrim($domain, '/');
|
||||
if (false === strpos($domain, 'https://') && false === strpos($domain, 'http://')) {
|
||||
$domain = 'http://' . $domain;
|
||||
}
|
||||
return str_replace('\\', '/', $domain . ($pathname ? '/' . $pathname : null));
|
||||
}
|
||||
|
||||
/**
|
||||
* @param int $length
|
||||
* @return int
|
||||
*/
|
||||
function generate_code($length = 5) {
|
||||
$min = pow(10 , ($length - 1));
|
||||
$max = pow(10, $length) - 1;
|
||||
return rand($min, $max);
|
||||
}
|
18
application/common/model/Config.php
Normal file
@ -0,0 +1,18 @@
|
||||
<?php
|
||||
/**
|
||||
* User: Wisp X
|
||||
* Date: 2018/9/26
|
||||
* Time: 下午4:35
|
||||
* Link: http://gitee.com/wispx
|
||||
*/
|
||||
|
||||
namespace app\common\model;
|
||||
|
||||
use think\Model;
|
||||
|
||||
class Config extends Model
|
||||
{
|
||||
protected $createTime = false;
|
||||
|
||||
protected $json = ['extend'];
|
||||
}
|
27
application/common/model/Images.php
Normal file
@ -0,0 +1,27 @@
|
||||
<?php
|
||||
/**
|
||||
* User: Wisp X
|
||||
* Date: 2018/9/29
|
||||
* Time: 下午3:14
|
||||
* Link: http://gitee.com/wispx
|
||||
*/
|
||||
|
||||
namespace app\common\model;
|
||||
|
||||
use think\Model;
|
||||
|
||||
class Images extends Model
|
||||
{
|
||||
protected $updateTime = false;
|
||||
|
||||
public function getUrlAttr($url, $data)
|
||||
{
|
||||
// 图片链接
|
||||
$cdnDoamin = Config::where([
|
||||
'key' => $data['strategy'],
|
||||
'name' => $data['strategy'] . '_cdn_domain',
|
||||
])->value('value');
|
||||
$domain = $cdnDoamin ? $cdnDoamin : request()->domain();
|
||||
return make_url($domain, $data['pathname']);
|
||||
}
|
||||
}
|
75
application/common/model/Users.php
Normal file
@ -0,0 +1,75 @@
|
||||
<?php
|
||||
/**
|
||||
* User: Wisp X
|
||||
* Date: 2018/9/25
|
||||
* Time: 下午3:20
|
||||
* Link: http://gitee.com/wispx
|
||||
*/
|
||||
|
||||
namespace app\common\model;
|
||||
|
||||
use think\Exception;
|
||||
use think\facade\Session;
|
||||
use think\Model;
|
||||
use think\model\concern\SoftDelete;
|
||||
|
||||
class Users extends Model
|
||||
{
|
||||
use SoftDelete;
|
||||
|
||||
protected $insert = ['reg_ip'];
|
||||
|
||||
public function setPassWordAttr($password)
|
||||
{
|
||||
return md5($password);
|
||||
}
|
||||
|
||||
public function setRegIpAttr()
|
||||
{
|
||||
return request()->ip();
|
||||
}
|
||||
|
||||
public function setQuotaAttr()
|
||||
{
|
||||
return Config::where('name', 'user_initial_quota')->value('value');
|
||||
}
|
||||
|
||||
public function getUseQuotaAttr()
|
||||
{
|
||||
return $this->hasMany('Images', 'user_id', 'id')->sum('size');
|
||||
}
|
||||
|
||||
public static function login($account, $password)
|
||||
{
|
||||
$field = 'email';
|
||||
|
||||
if (!$account) {
|
||||
throw new Exception('请输入账号');
|
||||
}
|
||||
|
||||
if (!$password) {
|
||||
throw new Exception('请输入密码');
|
||||
}
|
||||
|
||||
if ($user = self::get([$field => $account])) {
|
||||
if (0 === $user->state) {
|
||||
throw new Exception('你的账户已被冻结,请联系管理员!');
|
||||
}
|
||||
if ($user->password !== md5($password)) {
|
||||
throw new Exception('密码不正确');
|
||||
}
|
||||
$token = make_token();
|
||||
Session::set('uid', $user->id);
|
||||
Session::set('token', $token);
|
||||
$user->token = $token;
|
||||
$user->save();
|
||||
} else {
|
||||
throw new Exception('用户不存在');
|
||||
}
|
||||
}
|
||||
|
||||
public function images()
|
||||
{
|
||||
return $this->hasMany('Images', 'user_id', 'id');
|
||||
}
|
||||
}
|
52
application/common/validate/Users.php
Normal file
@ -0,0 +1,52 @@
|
||||
<?php
|
||||
/**
|
||||
* User: Wisp X
|
||||
* Date: 2018/9/26
|
||||
* Time: 下午3:26
|
||||
* Link: http://gitee.com/wispx
|
||||
*/
|
||||
|
||||
namespace app\common\validate;
|
||||
|
||||
use think\Validate;
|
||||
|
||||
class Users extends Validate
|
||||
{
|
||||
protected $rule = [
|
||||
'username' => 'require|max:15|unique:users',
|
||||
'nickname' => 'max:15',
|
||||
'email' => 'require|email|max:50|unique:users',
|
||||
'password' => 'require|confirm',
|
||||
'captcha' => 'require|captcha|token',
|
||||
];
|
||||
|
||||
protected $message = [
|
||||
'username.require' => '用户名不能为空',
|
||||
'username.max' => '用户名字符长度超出',
|
||||
'username.unique' => '用户名已存在,请更换',
|
||||
'nickname.max' => '昵称字符长度超出',
|
||||
'email.require' => '邮箱不能为空',
|
||||
'email.email' => '邮箱格式不正确',
|
||||
'email.max' => '邮箱字符长度超出',
|
||||
'email.unique' => '邮箱已存在',
|
||||
'password.require' => '密码不能为空',
|
||||
'password.confirm' => '两次输入的密码不一致',
|
||||
'captcha.require' => '请输入验证码',
|
||||
'captcha.captcha' => '验证码错误',
|
||||
];
|
||||
|
||||
public function sceneEdit()
|
||||
{
|
||||
return $this->only(['nickname', 'password'])->remove('password', 'require');
|
||||
}
|
||||
|
||||
public function sceneAdminEdit()
|
||||
{
|
||||
return $this->only(['username', 'nickname', 'email', 'password'])->remove('password', 'require');
|
||||
}
|
||||
|
||||
public function sceneInstall()
|
||||
{
|
||||
return $this->only(['username', 'email', 'password']);
|
||||
}
|
||||
}
|
38
application/http/middleware/Auth.php
Normal file
@ -0,0 +1,38 @@
|
||||
<?php
|
||||
|
||||
namespace app\http\middleware;
|
||||
|
||||
use think\facade\Session;
|
||||
|
||||
class Auth
|
||||
{
|
||||
/**
|
||||
* 无需登录可访问的方法
|
||||
*
|
||||
* @var array
|
||||
*/
|
||||
private $noNeedLogin = [
|
||||
'Index/index',
|
||||
'Auth/login',
|
||||
'Auth/register',
|
||||
'Auth/forgot',
|
||||
'Auth/sendCode',
|
||||
'Api/upload',
|
||||
];
|
||||
|
||||
public function handle($request, \Closure $next)
|
||||
{
|
||||
$uri = strtolower($request->controller() . '/' . $request->action());
|
||||
if (!in_array($uri, array_map('strtolower', $this->noNeedLogin))) {
|
||||
if (!Session::has('uid') || !Session::has('token')) {
|
||||
return redirect(url('auth/login'));
|
||||
}
|
||||
/*if (!Users::get(['id' => Session::get('uid'), 'token' => Session::get('token')])) {
|
||||
Session::delete(['uid', 'token']);
|
||||
return redirect(url('auth/login'));
|
||||
}*/
|
||||
}
|
||||
|
||||
return $next($request);
|
||||
}
|
||||
}
|
178
application/index/config/naming.php
Normal file
@ -0,0 +1,178 @@
|
||||
<?php
|
||||
/**
|
||||
* User: Wisp X
|
||||
* Date: 2018/10/2
|
||||
* Time: 13:02
|
||||
* Link: https://gitee.com/wispx
|
||||
*/
|
||||
|
||||
// [命名规则配置文件]
|
||||
|
||||
use think\facade\Session;
|
||||
|
||||
$time = time();
|
||||
$md5 = md5('LSKY PRO'. time());
|
||||
$uid = Session::has('uid') ? Session::get('uid') : 0;
|
||||
|
||||
return [
|
||||
'path' => [
|
||||
[
|
||||
'name' => '{Y}',
|
||||
'example' => '2018',
|
||||
'explain' => '年',
|
||||
'value' => date('Y'),
|
||||
],
|
||||
[
|
||||
'name' => '{m}',
|
||||
'example' => '01',
|
||||
'explain' => '月',
|
||||
'value' => date('m'),
|
||||
],
|
||||
[
|
||||
'name' => '{d}',
|
||||
'example' => '04',
|
||||
'explain' => '日',
|
||||
'value' => date('d'),
|
||||
],
|
||||
[
|
||||
'name' => '{Ymd}',
|
||||
'example' => '20180104',
|
||||
'explain' => '上传日期',
|
||||
'value' => date('Ymd'),
|
||||
],
|
||||
[
|
||||
'name' => '{ymd}',
|
||||
'example' => '180104',
|
||||
'explain' => '上传日期',
|
||||
'value' => date('ymd'),
|
||||
],
|
||||
[
|
||||
'name' => '{Y-m-d}',
|
||||
'example' => '2018-01-04',
|
||||
'explain' => '上传日期',
|
||||
'value' => date('Y-m-d'),
|
||||
],
|
||||
[
|
||||
'name' => '{y-m-d}',
|
||||
'example' => '18-01-04',
|
||||
'explain' => '上传日期',
|
||||
'value' => date('y-m-d'),
|
||||
],
|
||||
[
|
||||
'name' => '{time-stamp}',
|
||||
'example' => '1514995200',
|
||||
'explain' => '上传日期',
|
||||
'value' => $time,
|
||||
],
|
||||
[
|
||||
'name' => '{uniqid}',
|
||||
'example' => '5bb2f89a38935',
|
||||
'explain' => '唯一ID',
|
||||
'value' => uniqid(),
|
||||
],
|
||||
[
|
||||
'name' => '{md5-32}',
|
||||
'example' => 'f96087bb0a9a5e8723dbde0d0f8dce34',
|
||||
'explain' => 'md5(非文件md5)',
|
||||
'value' => $md5,
|
||||
],
|
||||
[
|
||||
'name' => '{md5-16}',
|
||||
'example' => '0a9a5e8723dbde0d',
|
||||
'explain' => 'md5(非文件md5)',
|
||||
'value' => substr($md5, 8, 16),
|
||||
],
|
||||
[
|
||||
'name' => '{uid}',
|
||||
'example' => '1',
|
||||
'explain' => '用户ID(用户已登录可用,否则为0)',
|
||||
'value' => $uid,
|
||||
],
|
||||
[
|
||||
'name' => '{rend-character}',
|
||||
'example' => 'HgTLmGcDceplMduF',
|
||||
'explain' => '16位随机字符串',
|
||||
'value' => str_rand(),
|
||||
],
|
||||
],
|
||||
'file' => [
|
||||
[
|
||||
'name' => '{Y}',
|
||||
'example' => '2018',
|
||||
'explain' => '年',
|
||||
'value' => date('Y'),
|
||||
],
|
||||
[
|
||||
'name' => '{m}',
|
||||
'example' => '01',
|
||||
'explain' => '月',
|
||||
'value' => date('m'),
|
||||
],
|
||||
[
|
||||
'name' => '{d}',
|
||||
'example' => '04',
|
||||
'explain' => '日',
|
||||
'value' => date('d'),
|
||||
],
|
||||
[
|
||||
'name' => '{Ymd}',
|
||||
'example' => '20180104',
|
||||
'explain' => '上传日期',
|
||||
'value' => date('Ymd'),
|
||||
],
|
||||
[
|
||||
'name' => '{ymd}',
|
||||
'example' => '180104',
|
||||
'explain' => '上传日期',
|
||||
'value' => date('ymd'),
|
||||
],
|
||||
[
|
||||
'name' => '{Y-m-d}',
|
||||
'example' => '2018-01-04',
|
||||
'explain' => '上传日期',
|
||||
'value' => date('Y-m-d'),
|
||||
],
|
||||
[
|
||||
'name' => '{y-m-d}',
|
||||
'example' => '18-01-04',
|
||||
'explain' => '上传日期',
|
||||
'value' => date('y-m-d'),
|
||||
],
|
||||
[
|
||||
'name' => '{time-stamp}',
|
||||
'example' => '1514995200',
|
||||
'explain' => '上传日期',
|
||||
'value' => $time,
|
||||
],
|
||||
[
|
||||
'name' => '{uniqid}',
|
||||
'example' => '5bb2f89a38935',
|
||||
'explain' => '唯一ID',
|
||||
'value' => uniqid(),
|
||||
],
|
||||
[
|
||||
'name' => '{md5-32}',
|
||||
'example' => 'f96087bb0a9a5e8723dbde0d0f8dce34',
|
||||
'explain' => 'md5(非文件md5)',
|
||||
'value' => $md5,
|
||||
],
|
||||
[
|
||||
'name' => '{md5-16}',
|
||||
'example' => '0a9a5e8723dbde0d',
|
||||
'explain' => 'md5(非文件md5)',
|
||||
'value' => substr($md5, 8, 16),
|
||||
],
|
||||
[
|
||||
'name' => '{uid}',
|
||||
'example' => '1',
|
||||
'explain' => '用户ID(用户已登录可用,否则为0)',
|
||||
'value' => $uid,
|
||||
],
|
||||
[
|
||||
'name' => '{rend-character}',
|
||||
'example' => 'HgTLmGcDceplMduF',
|
||||
'explain' => '16位随机字符串',
|
||||
'value' => str_rand(),
|
||||
],
|
||||
],
|
||||
];
|
32
application/index/config/strategy.php
Normal file
@ -0,0 +1,32 @@
|
||||
<?php
|
||||
/**
|
||||
* User: Wisp X
|
||||
* Date: 2018/9/29
|
||||
* Time: 下午1:40
|
||||
* Link: http://gitee.com/wispx
|
||||
*/
|
||||
|
||||
// [策略组]
|
||||
|
||||
return [
|
||||
'local' => [
|
||||
'name' => '本地',
|
||||
'class' => \strategy\driver\Local::class
|
||||
],
|
||||
'oss' => [
|
||||
'name' => '阿里云OSS',
|
||||
'class' => \strategy\driver\Oss::class
|
||||
],
|
||||
'cos' => [
|
||||
'name' => '腾讯云COS',
|
||||
'class' => \strategy\driver\Cos::class
|
||||
],
|
||||
'qiniu' => [
|
||||
'name' => '七牛云',
|
||||
'class' => \strategy\driver\Qiniu::class
|
||||
],
|
||||
'upyun' => [
|
||||
'name' => '又拍云',
|
||||
'class' => \strategy\driver\Upyun::class
|
||||
],
|
||||
];
|
145
application/index/controller/Api.php
Normal file
@ -0,0 +1,145 @@
|
||||
<?php
|
||||
/**
|
||||
* User: Wisp X
|
||||
* Date: 2018/9/26
|
||||
* Time: 21:51
|
||||
* Link: https://gitee.com/wispx
|
||||
*/
|
||||
|
||||
namespace app\index\controller;
|
||||
|
||||
use app\common\model\Images;
|
||||
use think\Db;
|
||||
use think\Exception;
|
||||
use think\facade\Config;
|
||||
|
||||
class Api extends Base
|
||||
{
|
||||
public function upload()
|
||||
{
|
||||
if ($this->request->isPost()) {
|
||||
Db::startTrans();
|
||||
try {
|
||||
if (!$this->config['allowed_tourist_upload'] && !$this->user) {
|
||||
throw new Exception('管理员关闭了游客上传,请先登录账号', 401);
|
||||
}
|
||||
|
||||
$image = $this->getImage();
|
||||
$size = $image->getSize();
|
||||
$mime = $image->getMime();
|
||||
$sha1 = $image->hash('sha1');
|
||||
$md5 = $image->hash('md5');
|
||||
|
||||
if ($this->user) {
|
||||
if (($this->user->use_quota + $size) > $this->user->quota) {
|
||||
throw new Exception('保存失败!您的储存容量不足,请联系管理员!', 0);
|
||||
}
|
||||
}
|
||||
|
||||
// 当前储存策略
|
||||
$currentStrategy = strtolower($this->config['storage_strategy']);
|
||||
// 获取当前储存策略配置
|
||||
$strategyConfig = $this->currentStrategyConfig;
|
||||
// 获取当前驱动实例
|
||||
$strategy = $this->getStrategyInstance();
|
||||
|
||||
$pathname = $this->makePathname($image->getInfo('name'));
|
||||
if (!$strategy->create($pathname, $image->getPathname())) {
|
||||
if (Config::get('app.app_debug')) {
|
||||
throw new Exception($strategy->getError(), 500);
|
||||
}
|
||||
throw new Exception('上传失败', 500);
|
||||
}
|
||||
|
||||
$cdnDomain = $currentStrategy . '_cdn_domain';
|
||||
$domain = $this->request->domain();
|
||||
if (array_key_exists($cdnDomain, $strategyConfig)) {
|
||||
if ($strategyConfig[$cdnDomain]) {
|
||||
$domain = $strategyConfig[$cdnDomain];
|
||||
}
|
||||
}
|
||||
|
||||
if (!Images::create([
|
||||
'user_id' => $this->user ? $this->user->id : 0,
|
||||
'strategy' => $currentStrategy,
|
||||
'path' => dirname($pathname),
|
||||
'name' => basename($pathname),
|
||||
'pathname' => $pathname,
|
||||
'size' => $size,
|
||||
'mime' => $mime,
|
||||
'sha1' => $sha1,
|
||||
'md5' => $md5
|
||||
])) {
|
||||
$strategy->delete($pathname);
|
||||
throw new Exception('图片数据保存失败', 500);
|
||||
}
|
||||
|
||||
$data = [
|
||||
'name' => $image->getInfo('name'),
|
||||
'url' => make_url($domain, $pathname),
|
||||
];
|
||||
if ($this->user) {
|
||||
$data['quota'] = sprintf('%.2f', (float)$this->user->quota);
|
||||
$data['use_quota'] = sprintf('%.2f', (float)$this->user->use_quota);
|
||||
}
|
||||
|
||||
Db::commit();
|
||||
} catch (Exception $e) {
|
||||
Db::rollback();
|
||||
return $this->result(null, $e->getCode(), $e->getMessage());
|
||||
}
|
||||
|
||||
return $this->result($data, 200, '上传成功');
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* 获取图片资源
|
||||
*
|
||||
* @return array|null|\think\File
|
||||
* @throws Exception
|
||||
*/
|
||||
private function getImage()
|
||||
{
|
||||
$image = $this->request->file('image');
|
||||
if (null === $image) {
|
||||
throw new Exception('图片资源获取失败!');
|
||||
}
|
||||
if (!is_uploaded_file($image->getPathname())) {
|
||||
throw new Exception('file is not uploaded via HTTP POST');
|
||||
}
|
||||
if (!$image->check([
|
||||
'size' => $this->config['upload_max_size'],
|
||||
'ext' => filter_comma($this->config['upload_allowed_exts']),
|
||||
])) {
|
||||
throw new Exception($image->getError());
|
||||
}
|
||||
return $image;
|
||||
}
|
||||
|
||||
/**
|
||||
* Make pathname
|
||||
*
|
||||
* @param $name 文件名
|
||||
*
|
||||
* @return string
|
||||
*/
|
||||
private function makePathname($name)
|
||||
{
|
||||
$naming = Config::pull('naming');
|
||||
|
||||
$path = trim(str_replace(
|
||||
array_column($naming['path'], 'name'),
|
||||
array_column($naming['path'], 'value'),
|
||||
$this->config['path_naming_rule']
|
||||
), '/');
|
||||
|
||||
$file = trim(str_replace(
|
||||
array_column($naming['file'], 'name'),
|
||||
array_column($naming['file'], 'value'),
|
||||
$this->config['file_naming_rule']
|
||||
), '/') . '.' . get_file_ext($name);
|
||||
|
||||
return $path . '/' . $file;
|
||||
}
|
||||
}
|
115
application/index/controller/Auth.php
Normal file
@ -0,0 +1,115 @@
|
||||
<?php
|
||||
/**
|
||||
* User: Wisp X
|
||||
* Date: 2018/9/25
|
||||
* Time: 下午3:43
|
||||
* Link: http://gitee.com/wispx
|
||||
*/
|
||||
|
||||
namespace app\index\controller;
|
||||
|
||||
use app\common\model\Users;
|
||||
use think\Exception;
|
||||
use think\facade\Session;
|
||||
|
||||
class Auth extends Base
|
||||
{
|
||||
public function login($account = null, $password = null)
|
||||
{
|
||||
if ($this->request->isPost()) {
|
||||
try {
|
||||
Users::login($account, $password);
|
||||
} catch (Exception $e) {
|
||||
Session::flash('error', $e->getMessage());
|
||||
return $this->fetch();
|
||||
}
|
||||
$this->redirect(url('/'));
|
||||
}
|
||||
return $this->fetch();
|
||||
}
|
||||
|
||||
public function register()
|
||||
{
|
||||
if ($this->request->isPost()) {
|
||||
try {
|
||||
if ($this->config['close_register']) {
|
||||
throw new Exception('站点已关闭注册');
|
||||
}
|
||||
$data = $this->request->post();
|
||||
$validate = $this->validate($data, 'Users');
|
||||
if (true !== $validate) {
|
||||
throw new Exception($validate);
|
||||
}
|
||||
Users::create($data);
|
||||
} catch (Exception $e) {
|
||||
Session::flash('error', $e->getMessage());
|
||||
return $this->fetch();
|
||||
}
|
||||
Session::flash('success', '注册成功');
|
||||
$this->redirect(url('auth/login'));
|
||||
}
|
||||
return $this->fetch();
|
||||
}
|
||||
|
||||
public function forgot()
|
||||
{
|
||||
$delSession = function () {
|
||||
Session::delete('code', 'forgot_');
|
||||
Session::delete('email', 'forgot_');
|
||||
};
|
||||
if ($this->request->isPost()) {
|
||||
try {
|
||||
$data = $this->request->post();
|
||||
$validate = $this->validate($data, [
|
||||
'password|密码' => 'require|confirm',
|
||||
]);
|
||||
if (true !== $validate) {
|
||||
return $this->error($validate);
|
||||
}
|
||||
if ($data['code'] != Session::get('code', 'forgot_')) {
|
||||
throw new Exception('验证码不正确');
|
||||
}
|
||||
if (!$user = Users::get(['email' => Session::get('email', 'forgot_')])) {
|
||||
throw new Exception('用户不存在');
|
||||
}
|
||||
$user->password = $data['password'];
|
||||
$user->save();
|
||||
} catch (Exception $e) {
|
||||
return $this->error($e->getMessage());
|
||||
}
|
||||
$delSession();
|
||||
return $this->success('重置成功');
|
||||
}
|
||||
$delSession();
|
||||
return $this->fetch();
|
||||
}
|
||||
|
||||
public function sendCode()
|
||||
{
|
||||
if ($this->request->isPost()) {
|
||||
$data = $this->request->post();
|
||||
$validate = $this->validate($data, [
|
||||
'email|邮箱' => 'require|email',
|
||||
'captcha|验证码' => 'require|captcha'
|
||||
]);
|
||||
if (true !== $validate) {
|
||||
return $this->error($validate);
|
||||
}
|
||||
|
||||
if (!$user = Users::get(['email' => $data['email']])) {
|
||||
return $this->error('账号不存在');
|
||||
}
|
||||
|
||||
$code = generate_code();
|
||||
$err = $this->sendMail($data['email'], '找回密码', "尊敬的 {$user->username}, 您好,您正在申请重置密码操作,本次的验证码是 <b>{$code}</b>,如果不是您本人操作请忽略!");
|
||||
|
||||
if (true !== $err) {
|
||||
return $this->error($err);
|
||||
}
|
||||
|
||||
Session::set('code', $code, 'forgot_');
|
||||
Session::set('email', $data['email'], 'forgot_');
|
||||
return $this->success('发送成功');
|
||||
}
|
||||
}
|
||||
}
|
133
application/index/controller/Base.php
Normal file
@ -0,0 +1,133 @@
|
||||
<?php
|
||||
/**
|
||||
* User: Wisp X
|
||||
* Date: 2018/9/25
|
||||
* Time: 下午2:10
|
||||
* Link: http://gitee.com/wispx
|
||||
*/
|
||||
|
||||
namespace app\index\controller;
|
||||
|
||||
use app\common\model\Users;
|
||||
use PHPMailer\PHPMailer\PHPMailer;
|
||||
use think\Controller;
|
||||
use think\Exception;
|
||||
use think\facade\Config;
|
||||
use think\facade\Session;
|
||||
|
||||
class Base extends Controller
|
||||
{
|
||||
protected $middleware = ['auth'];
|
||||
|
||||
protected $user = null;
|
||||
|
||||
protected $config = null;
|
||||
|
||||
protected $configs = null;
|
||||
|
||||
/**
|
||||
* 当前储存策略配置
|
||||
*
|
||||
* @var null
|
||||
*/
|
||||
protected $currentStrategyConfig = null;
|
||||
|
||||
public function initialize()
|
||||
{
|
||||
parent::initialize();
|
||||
|
||||
// 检测程序是否已安装
|
||||
if (!file_exists(\think\facade\Env::get('root_path') . 'install.lock')) {
|
||||
return $this->redirect(url('/install'));
|
||||
}
|
||||
|
||||
$configs = \app\common\model\Config::all();
|
||||
foreach ($configs as $key => &$value) {
|
||||
$this->config[$value->name] = $value->value;
|
||||
}
|
||||
$this->configs = $configs;
|
||||
if (Session::has('uid') && Session::has('token')) {
|
||||
$this->user = Users::get([
|
||||
'id' => Session::get('uid'),
|
||||
'token' => Session::get('token')
|
||||
]);
|
||||
if (!$this->user) {
|
||||
Session::delete(['uid', 'token']);
|
||||
}
|
||||
}
|
||||
|
||||
$this->currentStrategyConfig = $this->getStrategyConfig(strtolower($this->config['storage_strategy']));
|
||||
|
||||
$this->assign([
|
||||
'config' => $this->config,
|
||||
'user' => $this->user,
|
||||
'uri' => strtolower($this->request->controller() . '/' . $this->request->action())
|
||||
]);
|
||||
}
|
||||
|
||||
/**
|
||||
* 当前储存策略配置
|
||||
*
|
||||
* @param $strategy
|
||||
* @return array
|
||||
*/
|
||||
public function getStrategyConfig($strategy)
|
||||
{
|
||||
$strategyConfig = [];
|
||||
foreach ($this->configs as $value) {
|
||||
if ($value->key === $strategy) {
|
||||
$strategyConfig[$value->name] = $value->value;
|
||||
}
|
||||
}
|
||||
|
||||
return $strategyConfig;
|
||||
}
|
||||
|
||||
/**
|
||||
* 获取储存策略驱动实例
|
||||
*
|
||||
* @param null $strategy
|
||||
* @return mixed
|
||||
*/
|
||||
public function getStrategyInstance($strategy = null)
|
||||
{
|
||||
$currentStrategy = $strategy ? $strategy : strtolower($this->config['storage_strategy']);
|
||||
// 驱动
|
||||
$driver = Config::get('strategy.' . $currentStrategy . '.class');
|
||||
// 获取该储存策略配置
|
||||
$strategyConfig = $this->getStrategyConfig($currentStrategy);
|
||||
|
||||
return new $driver($strategyConfig);
|
||||
}
|
||||
|
||||
public function sendMail($email, $subject, $body)
|
||||
{
|
||||
$mail = new PHPMailer();
|
||||
try {
|
||||
// $mail->SMTPDebug = 2;
|
||||
if ('smtp' === $this->config['mail_send_mode']) {
|
||||
$mail->isSMTP();
|
||||
} else {
|
||||
$mail->isMail();
|
||||
}
|
||||
$mail->Host = $this->config['mail_smtp_host'];
|
||||
$mail->CharSet = 'UTF-8';
|
||||
$mail->SMTPAuth = true;
|
||||
$mail->Username = $this->config['mail_smtp_username'];
|
||||
$mail->Password = $this->config['mail_smtp_password'];
|
||||
$mail->SMTPSecure = $this->config['mail_smtp_secure'];
|
||||
$mail->Port = $this->config['mail_smtp_port'];
|
||||
$mail->setFrom($this->config['mail_form_email'], $this->config['site_name']);
|
||||
$mail->addAddress($email);
|
||||
$mail->addReplyTo($this->config['mail_form_email'], $this->config['site_name']);
|
||||
$mail->isHTML(true);
|
||||
$mail->Subject = $subject;
|
||||
$mail->Body = $body;
|
||||
$mail->send();
|
||||
} catch (Exception $e) {
|
||||
return $this->error($e->getMessage());
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
}
|
17
application/index/controller/Index.php
Normal file
@ -0,0 +1,17 @@
|
||||
<?php
|
||||
/**
|
||||
* User: Wisp X
|
||||
* Date: 2018/9/27
|
||||
* Time: 下午4:00
|
||||
* Link: http://gitee.com/wispx
|
||||
*/
|
||||
|
||||
namespace app\index\controller;
|
||||
|
||||
class Index extends Base
|
||||
{
|
||||
public function index()
|
||||
{
|
||||
return $this->fetch();
|
||||
}
|
||||
}
|
121
application/index/controller/Install.php
Normal file
@ -0,0 +1,121 @@
|
||||
<?php
|
||||
/**
|
||||
* User: Wisp X
|
||||
* Date: 2018/10/12
|
||||
* Time: 19:15
|
||||
* Link: https://gitee.com/wispx
|
||||
*/
|
||||
|
||||
namespace app\index\controller;
|
||||
|
||||
use app\common\model\Users;
|
||||
use think\Controller;
|
||||
use think\Exception;
|
||||
use think\facade\Cookie;
|
||||
use think\facade\Env;
|
||||
use think\facade\Session;
|
||||
|
||||
class Install extends Controller
|
||||
{
|
||||
public function index($stop = 1)
|
||||
{
|
||||
// TODO 检测是否已安装
|
||||
|
||||
$rootPath = Env::get('root_path');
|
||||
$configPath = Env::get('config_path');
|
||||
|
||||
if (file_exists($rootPath . 'install.lock') && !Session::has('install_success')) {
|
||||
exit('你已安装成功,重新安装请删除根目录install.lock文件!');
|
||||
}
|
||||
|
||||
$phpVerGt56 = PHP_VERSION >= 5.6;
|
||||
$isCurl = function_exists('curl_init');
|
||||
$isZip = function_exists('zip_open');
|
||||
$isMysqli = class_exists('mysqli');
|
||||
|
||||
switch ($stop) {
|
||||
case 1:
|
||||
// 运行环境检测
|
||||
$testing = $phpVerGt56 && $isCurl && $isZip && $isMysqli;
|
||||
$this->assign([
|
||||
'phpVerGt56' => $phpVerGt56,
|
||||
'isCurl' => $isCurl,
|
||||
'isZip' => $isZip,
|
||||
'isMysqli' => $isMysqli,
|
||||
'testing' => $testing
|
||||
]);
|
||||
break;
|
||||
case 2:
|
||||
// 安装
|
||||
if ($this->request->isPost()) {
|
||||
$hostname = $this->request->post('hostname');
|
||||
$database = $this->request->post('database');
|
||||
$username = $this->request->post('username');
|
||||
$password = $this->request->post('password');
|
||||
$hostport = $this->request->post('hostport');
|
||||
try {
|
||||
if (!$sqlFile = file_get_contents($rootPath . 'install.sql')) {
|
||||
throw new Exception('安装文件不存在');
|
||||
}
|
||||
$mysqli = new \mysqli($hostname, $username, $password, $database, $hostport);
|
||||
if ($mysqli->connect_error) {
|
||||
$mysqli->close();
|
||||
throw new Exception($mysqli->connect_error);
|
||||
}
|
||||
if (!$mysqli->multi_query($sqlFile)) {
|
||||
throw new Exception('数据写入失败');
|
||||
}
|
||||
$dataBasePath = $configPath . 'database.php';
|
||||
$dataBaseFile = file_get_contents($dataBasePath);
|
||||
$dataBaseFile = str_replace([
|
||||
'{hostname}',
|
||||
'{database}',
|
||||
'{username}',
|
||||
'{password}',
|
||||
'{hostport}',
|
||||
], [
|
||||
$hostname,
|
||||
$database,
|
||||
$username,
|
||||
$password,
|
||||
$hostport,
|
||||
], $dataBaseFile);
|
||||
|
||||
file_put_contents($dataBasePath, $dataBaseFile);
|
||||
|
||||
} catch (Exception $e) {
|
||||
return $this->error($e->getMessage());
|
||||
}
|
||||
return $this->success('数据写入成功');
|
||||
}
|
||||
break;
|
||||
case 3:
|
||||
// 设置管理员账号密码
|
||||
if ($this->request->isPost()) {
|
||||
try {
|
||||
$data = $this->request->post();
|
||||
$validate = $this->validate($data, 'Users.Install');
|
||||
if (true !== $validate) {
|
||||
throw new Exception($validate);
|
||||
}
|
||||
$data['is_admin'] = 1;
|
||||
$data['quota'] = 1073741824;
|
||||
Users::create($data);
|
||||
fopen($rootPath . 'install.lock', 'w');
|
||||
} catch (Exception $e) {
|
||||
return $this->error($e->getMessage());
|
||||
}
|
||||
Session::flash('install_success', true);
|
||||
// 删除sql文件
|
||||
@unlink($rootPath . 'install.sql');
|
||||
return $this->success('设置成功');
|
||||
}
|
||||
break;
|
||||
}
|
||||
|
||||
$this->assign([
|
||||
'stop' => $stop
|
||||
]);
|
||||
return $this->fetch();
|
||||
}
|
||||
}
|
114
application/index/controller/User.php
Normal file
@ -0,0 +1,114 @@
|
||||
<?php
|
||||
/**
|
||||
* User: Wisp X
|
||||
* Date: 2018/9/26
|
||||
* Time: 19:37
|
||||
* Link: https://gitee.com/wispx
|
||||
*/
|
||||
|
||||
namespace app\index\controller;
|
||||
|
||||
use app\common\model\Images;
|
||||
use think\Db;
|
||||
use think\facade\Config;
|
||||
use think\facade\Session;
|
||||
use think\Exception;
|
||||
|
||||
class User extends Base
|
||||
{
|
||||
public function images($keyword = '', $limit = 30)
|
||||
{
|
||||
if ($this->request->isPost()) {
|
||||
try {
|
||||
$model = $this->user->images()->order('create_time', 'desc');
|
||||
if (!empty($keyword)) {
|
||||
$model = $model->where('pathname', 'like', "%{$keyword}%");
|
||||
}
|
||||
$images = $model->paginate($limit)->each(function ($item) {
|
||||
$item->url = $item->url;
|
||||
// TODO 生成缩略图
|
||||
return $item;
|
||||
});
|
||||
} catch (Exception $e) {
|
||||
exit(dump($e->getMessage()));
|
||||
}
|
||||
return $this->success('success', null, $images);
|
||||
}
|
||||
return $this->fetch();
|
||||
}
|
||||
|
||||
public function deleteImages()
|
||||
{
|
||||
if ($this->request->isPost()) {
|
||||
Db::startTrans();
|
||||
try {
|
||||
$id = $this->request->post('id');
|
||||
$deletes = []; // 需要删除的文件
|
||||
if (is_array($id)) {
|
||||
$images = Images::all($id);
|
||||
foreach ($images as &$value) {
|
||||
$deletes[$value->strategy][] = $value->pathname;
|
||||
$value->delete();
|
||||
unset($value);
|
||||
}
|
||||
} else {
|
||||
$image = Images::get($id);
|
||||
if (!$image) {
|
||||
throw new Exception('没有找到该图片数据');
|
||||
}
|
||||
$deletes[$image->strategy][] = $image->pathname;
|
||||
$image->delete();
|
||||
}
|
||||
// 是否开启软删除(开启了只删除记录,不删除文件)
|
||||
if (!$this->config['soft_delete']) {
|
||||
$strategy = [];
|
||||
// 实例化所有储存策略驱动
|
||||
$strategyAll = array_keys(Config::pull('strategy'));
|
||||
foreach ($strategyAll as $value) {
|
||||
// 获取储存策略驱动
|
||||
$strategy[$value] = $this->getStrategyInstance($value);
|
||||
}
|
||||
|
||||
foreach ($deletes as $key => $val) {
|
||||
$strategy[$key]->deletes($val);
|
||||
}
|
||||
}
|
||||
Db::commit();
|
||||
} catch (Exception $e) {
|
||||
Db::rollback();
|
||||
return $this->error($e->getMessage());
|
||||
}
|
||||
return $this->success('删除成功');
|
||||
}
|
||||
}
|
||||
|
||||
public function settings()
|
||||
{
|
||||
if ($this->request->isPost()) {
|
||||
try {
|
||||
$data = $this->request->post();
|
||||
$validate = $this->validate($data, 'Users.edit');
|
||||
if (true !== $validate) {
|
||||
throw new Exception($validate);
|
||||
}
|
||||
if ($data['password_old']) {
|
||||
if (md5($data['password_old']) != $this->user->password) {
|
||||
throw new Exception('原密码不正确');
|
||||
}
|
||||
}
|
||||
if (!$data['password']) unset($data['password']);
|
||||
$this->user->save($data);
|
||||
} catch (Exception $e) {
|
||||
return $this->error($e->getMessage());
|
||||
}
|
||||
return $this->success('保存成功');
|
||||
}
|
||||
return $this->fetch();
|
||||
}
|
||||
|
||||
public function logout()
|
||||
{
|
||||
Session::delete('uid');
|
||||
$this->redirect(url('/'));
|
||||
}
|
||||
}
|
36
application/index/controller/admin/Base.php
Normal file
@ -0,0 +1,36 @@
|
||||
<?php
|
||||
/**
|
||||
* User: Wisp X
|
||||
* Date: 2018/9/27
|
||||
* Time: 上午10:14
|
||||
* Link: http://gitee.com/wispx
|
||||
*/
|
||||
|
||||
namespace app\index\controller\admin;
|
||||
|
||||
use app\index\controller\Base as AdminBase;
|
||||
|
||||
class Base extends AdminBase
|
||||
{
|
||||
public function initialize()
|
||||
{
|
||||
parent::initialize();
|
||||
if (!$this->user) {
|
||||
$this->redirect(url('auth/login'));
|
||||
}
|
||||
if (!$this->user->is_admin) {
|
||||
$this->redirect(url('/'));
|
||||
}
|
||||
}
|
||||
|
||||
protected function getConfigs($keys)
|
||||
{
|
||||
$configs = [];
|
||||
foreach ($this->configs as &$value) {
|
||||
if (in_array($value->key, $keys)) {
|
||||
$configs[$value->key][] = $value;
|
||||
}
|
||||
}
|
||||
return $configs;
|
||||
}
|
||||
}
|
105
application/index/controller/admin/Images.php
Normal file
@ -0,0 +1,105 @@
|
||||
<?php
|
||||
/**
|
||||
* User: Wisp X
|
||||
* Date: 2018/9/27
|
||||
* Time: 上午10:29
|
||||
* Link: http://gitee.com/wispx
|
||||
*/
|
||||
|
||||
namespace app\index\controller\admin;
|
||||
|
||||
use app\common\model\Images as ImagesModel;
|
||||
use app\common\model\Users;
|
||||
use think\facade\Config;
|
||||
use think\Db;
|
||||
use think\Exception;
|
||||
|
||||
/**
|
||||
* 图片管理
|
||||
*
|
||||
* Class Images
|
||||
* @package app\index\controller\admin
|
||||
*/
|
||||
class Images extends Base
|
||||
{
|
||||
private $strategyList = [];
|
||||
|
||||
public function initialize()
|
||||
{
|
||||
parent::initialize();
|
||||
$this->strategyList = Config::pull('strategy');
|
||||
$this->assign('strategyList', $this->strategyList);
|
||||
}
|
||||
|
||||
public function index($strategy = '', $keyword = '', $limit = 15)
|
||||
{
|
||||
$model = new ImagesModel();
|
||||
if (!empty($strategy)) {
|
||||
$model = $model->where('strategy', $strategy);
|
||||
}
|
||||
if (!empty($keyword)) {
|
||||
$model = $model->where('pathname|sha1|md5', 'like', "%{$keyword}%");
|
||||
}
|
||||
$images = $model->order('id', 'desc')->paginate($limit, false, [
|
||||
'query' => [
|
||||
'keyword' => $keyword
|
||||
]
|
||||
])->each(function ($item) {
|
||||
$item->username = Users::where('id', $item->user_id)->value('username');
|
||||
$item->strategy = $this->strategyList[$item->strategy]['name'];
|
||||
return $item;
|
||||
});
|
||||
$this->assign([
|
||||
'images' => $images,
|
||||
'keyword' => $keyword,
|
||||
'strategyList' => $this->strategyList,
|
||||
'strategy' => $strategy
|
||||
]);
|
||||
return $this->fetch();
|
||||
}
|
||||
|
||||
public function delete()
|
||||
{
|
||||
if ($this->request->isPost()) {
|
||||
Db::startTrans();
|
||||
try {
|
||||
$id = $this->request->post('id');
|
||||
$deletes = []; // 需要删除的文件
|
||||
if (is_array($id)) {
|
||||
$images = ImagesModel::all($id);
|
||||
foreach ($images as &$value) {
|
||||
$deletes[$value->strategy][] = $value->pathname;
|
||||
$value->delete();
|
||||
unset($value);
|
||||
}
|
||||
} else {
|
||||
$image = ImagesModel::get($id);
|
||||
if (!$image) {
|
||||
throw new Exception('没有找到该图片数据');
|
||||
}
|
||||
$deletes[$image->strategy][] = $image->pathname;
|
||||
$image->delete();
|
||||
}
|
||||
// 是否开启软删除(开启了只删除记录,不删除文件)
|
||||
if (!$this->config['soft_delete']) {
|
||||
$strategy = [];
|
||||
// 实例化所有储存策略驱动
|
||||
$strategyAll = array_keys($this->strategyList);
|
||||
foreach ($strategyAll as $value) {
|
||||
// 获取储存策略驱动
|
||||
$strategy[$value] = $this->getStrategyInstance($value);
|
||||
}
|
||||
|
||||
foreach ($deletes as $key => $val) {
|
||||
$strategy[$key]->deletes($val);
|
||||
}
|
||||
}
|
||||
Db::commit();
|
||||
} catch (Exception $e) {
|
||||
Db::rollback();
|
||||
return $this->error($e->getMessage());
|
||||
}
|
||||
return $this->success('删除成功');
|
||||
}
|
||||
}
|
||||
}
|
51
application/index/controller/admin/Strategy.php
Normal file
@ -0,0 +1,51 @@
|
||||
<?php
|
||||
/**
|
||||
* User: Wisp X
|
||||
* Date: 2018/9/28
|
||||
* Time: 下午4:25
|
||||
* Link: http://gitee.com/wispx
|
||||
*/
|
||||
|
||||
namespace app\index\controller\admin;
|
||||
|
||||
use think\Db;
|
||||
use think\Exception;
|
||||
use app\common\model\Config;
|
||||
|
||||
/**
|
||||
* 储存策略
|
||||
*
|
||||
* Class Strategy
|
||||
* @package app\index\controller\admin
|
||||
*/
|
||||
class Strategy extends Base
|
||||
{
|
||||
public function initialize()
|
||||
{
|
||||
parent::initialize();
|
||||
$strategy = \think\facade\Config::pull('strategy');
|
||||
$this->assign([
|
||||
'configs' => parent::getConfigs(array_keys($strategy)),
|
||||
'strategy' => $strategy
|
||||
]);
|
||||
}
|
||||
|
||||
public function index()
|
||||
{
|
||||
if ($this->request->isPost()) {
|
||||
Db::startTrans();
|
||||
try {
|
||||
$data = $this->request->post();
|
||||
foreach ($data as $key => $value) {
|
||||
Config::where('name', $key)->setField('value', $value);
|
||||
}
|
||||
Db::commit();
|
||||
} catch (Exception $e) {
|
||||
Db::rollback();
|
||||
return $this->error($e->getMessage());
|
||||
}
|
||||
return $this->success('保存成功');
|
||||
}
|
||||
return $this->fetch();
|
||||
}
|
||||
}
|
62
application/index/controller/admin/System.php
Normal file
@ -0,0 +1,62 @@
|
||||
<?php
|
||||
/**
|
||||
* User: Wisp X
|
||||
* Date: 2018/9/27
|
||||
* Time: 上午10:31
|
||||
* Link: http://gitee.com/wispx
|
||||
*/
|
||||
|
||||
namespace app\index\controller\admin;
|
||||
|
||||
use app\common\model\Config;
|
||||
use think\Db;
|
||||
use think\Exception;
|
||||
|
||||
/**
|
||||
* 系统设置
|
||||
*
|
||||
* Class System
|
||||
* @package app\index\controller\admin
|
||||
*/
|
||||
class System extends Base
|
||||
{
|
||||
public function initialize()
|
||||
{
|
||||
parent::initialize();
|
||||
$this->assign('configs', parent::getConfigs(['basics', 'upload', 'user', 'mail', 'other']));
|
||||
}
|
||||
|
||||
public function index()
|
||||
{
|
||||
if ($this->request->isPost()) {
|
||||
Db::startTrans();
|
||||
try {
|
||||
$data = $this->request->post();
|
||||
foreach ($data as $key => $value) {
|
||||
Config::where('name', $key)->setField('value', $value);
|
||||
}
|
||||
Db::commit();
|
||||
} catch (Exception $e) {
|
||||
Db::rollback();
|
||||
return $this->error($e->getMessage());
|
||||
}
|
||||
return $this->success('保存成功');
|
||||
}
|
||||
// 命名规则
|
||||
$naming = \think\facade\Config::pull('naming');
|
||||
$this->assign('naming', $naming);
|
||||
return $this->fetch();
|
||||
}
|
||||
|
||||
public function testMail()
|
||||
{
|
||||
if ($this->request->isPost()) {
|
||||
$email = $this->request->post('email');
|
||||
$err = $this->sendMail($email, '测试', '这是一封测试邮件!');
|
||||
if (true !== $err) {
|
||||
return $this->error($err);
|
||||
}
|
||||
return $this->success('发送成功');
|
||||
}
|
||||
}
|
||||
}
|
350
application/index/controller/admin/Update.php
Normal file
@ -0,0 +1,350 @@
|
||||
<?php
|
||||
/**
|
||||
* User: Wisp X
|
||||
* Date: 2018/9/27
|
||||
* Time: 22:21
|
||||
* Link: https://gitee.com/wispx
|
||||
*/
|
||||
|
||||
namespace app\index\controller\admin;
|
||||
|
||||
use app\common\model\Config;
|
||||
use think\Db;
|
||||
use think\Exception;
|
||||
use think\facade\Env;
|
||||
|
||||
/**
|
||||
* 系统更新
|
||||
*
|
||||
* Class Update
|
||||
* @package app\index\controller\admin
|
||||
*/
|
||||
class Update extends Base
|
||||
{
|
||||
const VERSION_API = 'https://lsky.wispx.cn/version.php';
|
||||
|
||||
private $record = [];
|
||||
|
||||
public function initialize()
|
||||
{
|
||||
parent::initialize();
|
||||
$record = json_decode(@file_get_contents(Env::get('root_path') . 'update.json'), true);
|
||||
if ($record) {
|
||||
$this->record = $record;
|
||||
}
|
||||
$this->assign('record', $this->record);
|
||||
}
|
||||
|
||||
public function index()
|
||||
{
|
||||
// 检测是否为最新版
|
||||
$newest = json_decode($this->curl(self::VERSION_API), true);
|
||||
$this->assign('newest', $newest);
|
||||
return $this->fetch();
|
||||
}
|
||||
|
||||
public function toUpdate()
|
||||
{
|
||||
if ($this->request->isPost()) {
|
||||
Db::startTrans();
|
||||
try {
|
||||
// 获取最新版数据
|
||||
$newest = json_decode($this->curl(self::VERSION_API));
|
||||
if (!$newest) {
|
||||
throw new Exception('更新数据获取失败');
|
||||
}
|
||||
// 根目录路径
|
||||
$rootPath = Env::get('root_path');
|
||||
// 缓存目录路径
|
||||
$runtimePath = Env::get('runtime_path');
|
||||
// 版本缓存目录路径
|
||||
$verPath = $runtimePath . $newest->version . DIRECTORY_SEPARATOR;
|
||||
// 文件暂存路径
|
||||
$pathname = $verPath . basename($newest->link);
|
||||
// 下载文件
|
||||
if (!$this->getFile($newest->link, $pathname)) {
|
||||
throw new Exception('更新文件下载失败');
|
||||
}
|
||||
// 解压到暂存目录
|
||||
if (!$this->unZip($pathname, $verPath)) {
|
||||
@unlink($pathname);
|
||||
throw new Exception('更新文件解压失败');
|
||||
}
|
||||
// 是否存在更新配置文件
|
||||
$updateConfig = $verPath . 'update.php';
|
||||
if ($config = @include($updateConfig)) {
|
||||
foreach ($config as $key => $value) {
|
||||
switch ($key) {
|
||||
// 遍历删除文件
|
||||
case 'delete':
|
||||
foreach ($value as $val) {
|
||||
@unlink($rootPath . trim($val, '/'));
|
||||
}
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
// 删除配置文件
|
||||
@unlink($updateConfig);
|
||||
}
|
||||
// 是否存在sql文件
|
||||
$updateSql = $verPath . 'update.sql';
|
||||
if ($sql = @file_get_contents($updateSql)) {
|
||||
Db::execute($sql);
|
||||
|
||||
// 删除sql文件
|
||||
@unlink($updateSql);
|
||||
}
|
||||
// 更新版本号
|
||||
Config::where('name', 'system_version')->setField('value', $newest->version);
|
||||
// 删除压缩包
|
||||
@unlink($pathname);
|
||||
// 移动文件
|
||||
$this->recurseCopy($verPath, $rootPath);
|
||||
// 删除更新缓存目录
|
||||
$this->delFolder($verPath);
|
||||
// 写入更新记录文件
|
||||
array_unshift($this->record, $newest);
|
||||
file_put_contents($rootPath . 'update.json', json_encode($this->record, JSON_UNESCAPED_UNICODE|JSON_PRETTY_PRINT));
|
||||
Db::commit();
|
||||
} catch (Exception $e) {
|
||||
Db::rollback();
|
||||
//return $this->error($e->getLine());
|
||||
return $this->error($e->getMessage());
|
||||
}
|
||||
return $this->success('更新成功');
|
||||
}
|
||||
}
|
||||
|
||||
private function delFolder($path)
|
||||
{
|
||||
if (is_dir($path)) {
|
||||
// 扫描一个文件夹内的所有文件夹和文件并返回数组
|
||||
$p = scandir($path);
|
||||
foreach ($p as $val) {
|
||||
// 排除目录中的.和..
|
||||
if ($val != "." && $val != "..") {
|
||||
// 如果是目录则递归子目录,继续操作
|
||||
if (is_dir($path . $val)) {
|
||||
// 子目录中操作删除文件夹和文件
|
||||
$this->delFolder($path . $val . DIRECTORY_SEPARATOR);
|
||||
// 目录清空后删除空文件夹
|
||||
@rmdir($path . $val . DIRECTORY_SEPARATOR);
|
||||
} else {
|
||||
// 如果是文件直接删除
|
||||
@unlink($path . $val);
|
||||
}
|
||||
}
|
||||
}
|
||||
@rmdir($path);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* 递归移动源目录(包括文件和子文件)到目的目录【或移动源文件到新文件】
|
||||
*
|
||||
* @param [string] $source 源目录或源文件
|
||||
* @param [string] $target 目的目录或目的文件
|
||||
*
|
||||
* @return boolean true
|
||||
*/
|
||||
private function moveFolder($source, $target)
|
||||
{
|
||||
|
||||
if (!file_exists($source)) {
|
||||
return false;
|
||||
} //如果源目录/文件不存在返回false
|
||||
|
||||
//如果要移动文件
|
||||
if (filetype($source) == 'file') {
|
||||
$basedir = dirname($target);
|
||||
if (!is_dir($basedir)) {
|
||||
mkdir($basedir);
|
||||
} //目标目录不存在时给它创建目录
|
||||
copy($source, $target);
|
||||
unlink($source);
|
||||
|
||||
} else { //如果要移动目录
|
||||
|
||||
if (!file_exists($target)) {
|
||||
mkdir($target);
|
||||
} //目标目录不存在时就创建
|
||||
|
||||
$files = array(); //存放文件
|
||||
$dirs = array(); //存放目录
|
||||
$fh = opendir($source);
|
||||
|
||||
if ($fh != false) {
|
||||
while ($row = readdir($fh)) {
|
||||
$src_file = $source . DIRECTORY_SEPARATOR . $row; //每个源文件
|
||||
if ($row != '.' && $row != '..') {
|
||||
if (!is_dir($src_file)) {
|
||||
$files[] = $row;
|
||||
} else {
|
||||
$dirs[] = $row;
|
||||
}
|
||||
}
|
||||
}
|
||||
closedir($fh);
|
||||
}
|
||||
|
||||
foreach ($files as $v) {
|
||||
copy($source . DIRECTORY_SEPARATOR . $v, $target . DIRECTORY_SEPARATOR . $v);
|
||||
unlink($source . DIRECTORY_SEPARATOR . $v);
|
||||
}
|
||||
|
||||
if (count($dirs)) {
|
||||
foreach ($dirs as $v) {
|
||||
$this->moveFolder($source . DIRECTORY_SEPARATOR . $v, $target . DIRECTORY_SEPARATOR . $v);
|
||||
}
|
||||
}
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
|
||||
private function curl($url)
|
||||
{
|
||||
$curl = curl_init();
|
||||
curl_setopt($curl, CURLOPT_URL, $url);
|
||||
curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);
|
||||
curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, false);
|
||||
$data = curl_exec($curl);
|
||||
curl_close($curl);
|
||||
return $data;
|
||||
}
|
||||
|
||||
/**
|
||||
* 复制目录下的所有文件及文件夹
|
||||
*
|
||||
* @param $src 原目录
|
||||
* @param $dst 新目录
|
||||
*/
|
||||
private function recurseCopy($src, $dst)
|
||||
{
|
||||
$dir = opendir($src);
|
||||
@mkdir($dst);
|
||||
while (false !== ($file = readdir($dir))) {
|
||||
if (($file != '.') && ($file != '..')) {
|
||||
if (is_dir($src . DIRECTORY_SEPARATOR . $file)) {
|
||||
$this->recurseCopy($src . DIRECTORY_SEPARATOR . $file, $dst . DIRECTORY_SEPARATOR . $file);
|
||||
} else {
|
||||
copy($src . DIRECTORY_SEPARATOR . $file, $dst . DIRECTORY_SEPARATOR . $file);
|
||||
}
|
||||
}
|
||||
}
|
||||
closedir($dir);
|
||||
}
|
||||
|
||||
/**
|
||||
* 获取远程文件
|
||||
*
|
||||
* @param $url
|
||||
* @param string $pathname
|
||||
* @param int $timeout
|
||||
*
|
||||
* @return bool|mixed|string
|
||||
*/
|
||||
private function getFile($url, $pathname = "", $timeout = 60)
|
||||
{
|
||||
$pathname = empty($pathname) ? pathinfo($url, PATHINFO_BASENAME) : $pathname;
|
||||
$dir = pathinfo($pathname, PATHINFO_DIRNAME);
|
||||
!is_dir($dir) && @mkdir($dir, 0755, true);
|
||||
$url = str_replace(" ", "%20", $url);
|
||||
|
||||
if (function_exists('curl_init')) {
|
||||
$ch = curl_init();
|
||||
curl_setopt($ch, CURLOPT_URL, $url);
|
||||
curl_setopt($ch, CURLOPT_TIMEOUT, $timeout);
|
||||
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
|
||||
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
|
||||
$temp = curl_exec($ch);
|
||||
if (@file_put_contents($pathname, $temp) && !curl_error($ch)) {
|
||||
return $pathname;
|
||||
} else {
|
||||
return false;
|
||||
}
|
||||
} else {
|
||||
$options = [
|
||||
'http' => [
|
||||
'method' => 'GET',
|
||||
'header' => '',
|
||||
'timeout' => $timeout
|
||||
]
|
||||
];
|
||||
$context = stream_context_create($options);
|
||||
if (@copy($url, $pathname, $context)) {
|
||||
// $http_response_header
|
||||
return $pathname;
|
||||
} else {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* zip文件解压
|
||||
*
|
||||
* @param $zipFile zip文件的路径,可以不加zip文件后缀.如果其他类型的文件伪装成zip解压也会失败
|
||||
* @param $dir 解压到的文件夹路径
|
||||
* @param array $extArray 允许解压的文件后缀名数组,解压任何类型的文件
|
||||
*
|
||||
* @return bool 解压失败返回false,成功返回true
|
||||
*/
|
||||
private function unZip($zipFile, $dir, $extArray = [])
|
||||
{
|
||||
|
||||
if (!file_exists($zipFile)) {
|
||||
return false;
|
||||
}
|
||||
|
||||
if (!is_dir($dir)) {
|
||||
|
||||
if (!mkdir($dir, 0755, true)) {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
$resource = zip_open($zipFile);
|
||||
|
||||
// 其他类型的文件伪装成zip文件时出现此种情况
|
||||
if (is_numeric($resource)) {
|
||||
return false;
|
||||
}
|
||||
|
||||
while ($dirResource = zip_read($resource)) {
|
||||
if (!zip_entry_open($resource, $dirResource)) {
|
||||
continue;
|
||||
}
|
||||
|
||||
$fileName = str_replace(['/', '\\'], [DIRECTORY_SEPARATOR, DIRECTORY_SEPARATOR], $dir . zip_entry_name($dirResource));
|
||||
$filePath = substr($fileName, 0, strrpos($fileName, DIRECTORY_SEPARATOR));
|
||||
|
||||
if (!is_dir($filePath)) {
|
||||
if (!mkdir($filePath, 0755, true)) {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
if (is_dir($fileName)) {
|
||||
zip_entry_close($dirResource);
|
||||
continue;
|
||||
}
|
||||
|
||||
if (count($extArray) > 0) {
|
||||
if (!in_array(pathinfo($fileName, PATHINFO_EXTENSION), $extArray)) {
|
||||
continue;
|
||||
}
|
||||
}
|
||||
|
||||
$fileSize = zip_entry_filesize($dirResource);
|
||||
$fileContent = zip_entry_read($dirResource, $fileSize);
|
||||
file_put_contents($fileName, $fileContent);
|
||||
|
||||
zip_entry_close($dirResource);
|
||||
}
|
||||
|
||||
zip_close($resource);
|
||||
return true;
|
||||
}
|
||||
}
|
130
application/index/controller/admin/Users.php
Normal file
@ -0,0 +1,130 @@
|
||||
<?php
|
||||
/**
|
||||
* User: Wisp X
|
||||
* Date: 2018/9/27
|
||||
* Time: 上午10:23
|
||||
* Link: http://gitee.com/wispx
|
||||
*/
|
||||
|
||||
namespace app\index\controller\admin;
|
||||
|
||||
use app\common\model\Users as UserModel;
|
||||
use think\Exception;
|
||||
|
||||
/**
|
||||
* 用户管理
|
||||
*
|
||||
* Class Users
|
||||
* @package app\index\controller\admin
|
||||
*/
|
||||
class Users extends Base
|
||||
{
|
||||
public function index($state = '', $keyword = '', $limit = 15)
|
||||
{
|
||||
$model = new UserModel();
|
||||
if (!empty($state)) {
|
||||
$model = $model->where('state', $state);
|
||||
}
|
||||
if (!empty($keyword)) {
|
||||
$model = $model->where('username|nickname|email', 'like', "%{$keyword}%");
|
||||
}
|
||||
$users = $model->order('id', 'desc')->paginate($limit, false, [
|
||||
'query' => [
|
||||
'state' => $state,
|
||||
'keyword' => $keyword
|
||||
]
|
||||
]);
|
||||
$this->assign([
|
||||
'users' => $users,
|
||||
'state' => $state,
|
||||
'keyword' => $keyword
|
||||
]);
|
||||
return $this->fetch();
|
||||
}
|
||||
|
||||
public function delete()
|
||||
{
|
||||
if ($this->request->isPost()) {
|
||||
$id = $this->request->post('id');
|
||||
if (is_array($id)) {
|
||||
if (in_array($this->user->id, $id)) {
|
||||
return $this->error('不能删除自己的账号!');
|
||||
}
|
||||
} else {
|
||||
if ($id == $this->user->id) {
|
||||
return $this->error('不能删除自己的账号!');
|
||||
}
|
||||
}
|
||||
if (!UserModel::destroy($id)) {
|
||||
return $this->error('删除失败');
|
||||
}
|
||||
return $this->success('删除成功');
|
||||
}
|
||||
}
|
||||
|
||||
public function frozen()
|
||||
{
|
||||
if ($this->request->isPost()) {
|
||||
$id = $this->request->post('id');
|
||||
if (is_array($id)) {
|
||||
if (in_array($this->user->id, $id)) {
|
||||
return $this->error('不能冻结自己的账号!');
|
||||
}
|
||||
} else {
|
||||
if ($id == $this->user->id) {
|
||||
return $this->error('不能冻结自己的账号!');
|
||||
}
|
||||
}
|
||||
$model = new UserModel();
|
||||
if (!$model->where('id', 'in', $id)->update(['state' => 0])) {
|
||||
return $this->error('冻结失败');
|
||||
}
|
||||
return $this->success('冻结成功');
|
||||
}
|
||||
}
|
||||
|
||||
public function getUser()
|
||||
{
|
||||
if ($this->request->isPost()) {
|
||||
$id = $this->request->post('id');
|
||||
if (!$user = UserModel::get($id)) {
|
||||
return $this->error('数据获取失败');
|
||||
}
|
||||
unset($user->password);
|
||||
return $this->success('成功', null, $user);
|
||||
}
|
||||
}
|
||||
|
||||
public function edit()
|
||||
{
|
||||
if ($this->request->isPost()) {
|
||||
try {
|
||||
$data = $this->request->post();
|
||||
$validate = $this->validate($data, 'Users.AdminEdit');
|
||||
if (true !== $validate) {
|
||||
throw new Exception($validate);
|
||||
}
|
||||
if (!$data['password']) unset($data['password']);
|
||||
UserModel::update($data);
|
||||
} catch (Exception $e) {
|
||||
return $this->error($e->getMessage());
|
||||
}
|
||||
return $this->success('保存成功');
|
||||
}
|
||||
}
|
||||
|
||||
public function setState()
|
||||
{
|
||||
if ($this->request->isPost()) {
|
||||
$id = $this->request->post('id');
|
||||
$state = $this->request->post('state');
|
||||
if (!$user = UserModel::get($id)) {
|
||||
return $this->error('数据获取失败');
|
||||
}
|
||||
if (!$user->where('id', $id)->setField('state', $state)) {
|
||||
return $this->error('状态修改失败');
|
||||
}
|
||||
return $this->success('状态修改成功');
|
||||
}
|
||||
}
|
||||
}
|
134
application/index/view/admin/images/index.html
Normal file
@ -0,0 +1,134 @@
|
||||
{extend name="common:base" /}
|
||||
|
||||
{block name="title"}图片管理 - {$config.site_name}{/block}
|
||||
|
||||
{block name="css"}
|
||||
<link rel="stylesheet" href="/static/jquery-viewer/1.2.0/css/viewer.css">
|
||||
{/block}
|
||||
|
||||
{block name="main"}
|
||||
<div class="mdui-container">
|
||||
<main>
|
||||
<div class="mdui-chip">
|
||||
<span class="mdui-chip-icon"><i class="mdui-icon material-icons"></i></span>
|
||||
<span class="mdui-chip-title">系统共有 <small class="mdui-text-color-red">{$images->total()}</small> 张图片</span>
|
||||
<a href="" class="mdui-chip-delete" mdui-tooltip="{content: '刷新', position: 'right'}"><i class="mdui-icon material-icons"></i></a>
|
||||
</div>
|
||||
<div class="mdui-clearfix mdui-m-t-1"></div>
|
||||
<form action="" method="post" id="search-form">
|
||||
<select class="strategy mdui-select mdui-float-left" name="strategy" mdui-select>
|
||||
<option value="">全部</option>
|
||||
{foreach $strategyList as $key => $value}
|
||||
<option value="{$key}" {if $key eq $strategy}selected{/if}>{$value.name}</option>
|
||||
{/foreach}
|
||||
</select>
|
||||
<input type="hidden" name="page" value="1">
|
||||
<input class="mdui-textfield-input search-input mdui-float-left" type="text" name="keyword" placeholder="回车搜索..." value="{$keyword}" autocomplete="off"/>
|
||||
</form>
|
||||
<div class="mdui-clearfix"></div>
|
||||
<div class="mdui-table-fluid mdui-m-t-2 mdui-m-b-2">
|
||||
<table class="mdui-table mdui-table-selectable">
|
||||
<thead>
|
||||
<tr>
|
||||
<th>所属用户</th>
|
||||
<th>储存策略</th>
|
||||
<th>路径</th>
|
||||
<th>大小</th>
|
||||
<th>类型</th>
|
||||
<th>上传时间</th>
|
||||
<th>操作</th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
{foreach $images as $key => $value}
|
||||
<tr data-id="{$value.id}">
|
||||
<td>{$value.username}</td>
|
||||
<td>{$value.strategy}</td>
|
||||
<td>{$value.pathname}</td>
|
||||
<td class="mdui-text-color-light-blue">{$value.size|format_size}</td>
|
||||
<td>{$value.mime}</td>
|
||||
<td>{$value.create_time}</td>
|
||||
<td>
|
||||
<img class="none" data-original="{$value.url}" src="{$value.url}">
|
||||
<div class="mdui-btn-group">
|
||||
<button class="mdui-btn mdui-btn-raised mdui-ripple mdui-btn-dense see" data-key="{$key}">查看图片</button>
|
||||
<button class="mdui-btn mdui-btn-raised mdui-ripple mdui-color-red mdui-btn-dense del">删除</button>
|
||||
</div>
|
||||
</td>
|
||||
</tr>
|
||||
{/foreach}
|
||||
</tbody>
|
||||
</table>
|
||||
</div>
|
||||
<div class="page">
|
||||
{$images|raw}
|
||||
</div>
|
||||
<select class="operation mdui-select" mdui-select>
|
||||
<option value="">选中项</option>
|
||||
<option value="delete">删除</option>
|
||||
</select>
|
||||
</main>
|
||||
</div>
|
||||
{/block}
|
||||
|
||||
{block name="js"}
|
||||
<script src="/static/jquery-viewer/1.2.0/js/viewer.js"></script>
|
||||
<script src="/static/jquery-viewer/1.2.0/js/jquery-viewer.js"></script>
|
||||
<script>
|
||||
$(function () {
|
||||
var viewer = $('tbody').viewer({
|
||||
url: 'data-original',
|
||||
zIndex: 999999999
|
||||
});
|
||||
|
||||
var methods = {
|
||||
delete: function (id, batch, callback) {
|
||||
var msg = '确认删除该图片吗?';
|
||||
if (batch) {
|
||||
msg = '确认删除选中项图片吗?';
|
||||
}
|
||||
mdui.confirm(msg, function () {
|
||||
app.request("{:url('admin/images/delete')}", {id: id}, function () {
|
||||
callback && callback();
|
||||
});
|
||||
}, function () {
|
||||
|
||||
}, {confirmText: '确定', cancelText: '取消'});
|
||||
}
|
||||
};
|
||||
$('.mdui-select.operation').on('close.mdui.select', function () {
|
||||
if ($(this).val() !== '') {
|
||||
var selected = $('tr.mdui-table-row-selected');
|
||||
var val = $(this).val();
|
||||
var array = [];
|
||||
if (selected.length) {
|
||||
selected.each(function (index, value) {
|
||||
array.push($(value).data('id'));
|
||||
});
|
||||
|
||||
if ('delete' === val) {
|
||||
methods.delete(array, true, function () {
|
||||
selected.remove();
|
||||
});
|
||||
}
|
||||
} else {
|
||||
mdui.snackbar({
|
||||
message: '至少选择一项数据!'
|
||||
});
|
||||
}
|
||||
}
|
||||
});
|
||||
// 查看图片
|
||||
$('td button.see').click(function () {
|
||||
viewer.data('viewer').view($(this).data('key'))
|
||||
});
|
||||
// 删除
|
||||
$('td button.del').click(function () {
|
||||
var tr = $(this).closest('tr');
|
||||
methods.delete(tr.data('id'), false, function () {
|
||||
tr.remove();
|
||||
});
|
||||
});
|
||||
})
|
||||
</script>
|
||||
{/block}
|
62
application/index/view/admin/strategy/index.html
Normal file
@ -0,0 +1,62 @@
|
||||
{extend name="common:base" /}
|
||||
|
||||
{block name="title"}储存策略 - {$config.site_name}{/block}
|
||||
|
||||
{block name="main"}
|
||||
<div class="mdui-container">
|
||||
<main>
|
||||
<div class="strategy-container">
|
||||
<div class="mdui-chip current-strategy none mdui-m-b-2">
|
||||
<span class="mdui-chip-icon mdui-color-blue"><i class="mdui-icon material-icons"></i></span>
|
||||
<span class="mdui-chip-title"></span>
|
||||
</div>
|
||||
<div id="tab" class="mdui-tab mdui-tab-scrollable" mdui-tab>
|
||||
{foreach $strategy as $key => $value}
|
||||
<a href="#tab-{$key}" class="mdui-ripple {if $key eq $config.storage_strategy}mdui-tab-active{/if}">{$value.name}</a>
|
||||
{/foreach}
|
||||
</div>
|
||||
<div class="mdui-col-sm-8 mdui-col-md-8">
|
||||
{foreach $configs as $key => $value}
|
||||
<div id="tab-{$key}" class="{if $key neq $config.storage_strategy}none{/if}">
|
||||
<form action="{:url('admin/strategy/index')}" method="post">
|
||||
{foreach $value as $val}
|
||||
<div class="mdui-textfield">
|
||||
<label class="mdui-textfield-label">{$val.title}{$val.tip ? '(' . $val.tip . ')' : ''}</label>
|
||||
{switch $val.type}
|
||||
{case text}
|
||||
<input class="mdui-textfield-input" type="{$val.input_type}" name="{$val.name}" value="{$val.value}" autocomplete="off" placeholder="{$val.title}"/>
|
||||
{/case}
|
||||
{/switch}
|
||||
</div>
|
||||
{/foreach}
|
||||
<input type="hidden" name="storage_strategy" value="{$key}">
|
||||
<button type="submit" class="mdui-btn mdui-btn-raised mdui-ripple mdui-color-theme-accent">保存</button>
|
||||
<button type="reset" class="mdui-btn mdui-btn-raised mdui-ripple">重置</button>
|
||||
</form>
|
||||
</div>
|
||||
{/foreach}
|
||||
</div>
|
||||
</div>
|
||||
</main>
|
||||
</div>
|
||||
{/block}
|
||||
{block name="js"}
|
||||
<script>
|
||||
$(function () {
|
||||
|
||||
var currentStrategy = function () {
|
||||
$('.current-strategy .mdui-chip-title').text('当前使用储存策略:' + $('#tab a.mdui-tab-active').text());
|
||||
$('.current-strategy').is(":hidden") && $('.current-strategy').css('display', 'inline-block');
|
||||
};
|
||||
|
||||
currentStrategy();
|
||||
|
||||
$('form').submit(function (e) {
|
||||
e.preventDefault();
|
||||
app.request(this.action, $(this).serialize(), function () {
|
||||
currentStrategy();
|
||||
})
|
||||
});
|
||||
});
|
||||
</script>
|
||||
{/block}
|
141
application/index/view/admin/system/index.html
Normal file
@ -0,0 +1,141 @@
|
||||
{extend name="common:base" /}
|
||||
|
||||
{block name="title"}系统管理 - {$config.site_name}{/block}
|
||||
|
||||
{block name="main"}
|
||||
<div class="mdui-container">
|
||||
<main>
|
||||
<div class="system-container">
|
||||
<div class="mdui-tab mdui-tab-scrollable" mdui-tab>
|
||||
<a href="#tab-basics" class="mdui-ripple">基础配置</a>
|
||||
<a href="#tab-upload" class="mdui-ripple">上传配置</a>
|
||||
<a href="#tab-user" class="mdui-ripple">用户配置</a>
|
||||
<a href="#tab-mail" class="mdui-ripple">邮件配置</a>
|
||||
<a href="#tab-other" class="mdui-ripple">其他配置</a>
|
||||
</div>
|
||||
<div class="tabs mdui-col-sm-8 mdui-col-md-8">
|
||||
{foreach $configs as $key => $value}
|
||||
<div id="tab-{$key}" class="mdui-p-a-2" style="display: none;">
|
||||
<form action="{:url('admin/system/index')}" method="post">
|
||||
{foreach $value as $val}
|
||||
<div class="mdui-textfield">
|
||||
<label class="mdui-textfield-label">{$val.title}{$val.tip ? '(' . $val.tip . ')' : ''}</label>
|
||||
{switch $val.type}
|
||||
{case text}
|
||||
<input class="mdui-textfield-input" type="{$val.input_type}" name="{$val.name}" value="{$val.value}"
|
||||
autocomplete="off" placeholder="{$val.title}"/>
|
||||
{/case}
|
||||
{case textarea}
|
||||
<textarea class="mdui-textfield-input" name="{$val.name}" autocomplete="off" placeholder="{$val.title}">{$val.value}</textarea>
|
||||
{/case}
|
||||
{case bool}
|
||||
<label class="mdui-switch">
|
||||
<input type="{$val.input_type}" data-name="{$val.name}" value="1" {if 1 eq $val.value}checked{/if}/>
|
||||
<i class="mdui-switch-icon"></i>
|
||||
</label>
|
||||
{/case}
|
||||
{case select}
|
||||
<select name="{$val.name}" class="mdui-select">
|
||||
{foreach $val.extend as $k => $v}
|
||||
<option value="{$k}" {if $k eq $val.value}selected{
|
||||
/if}>{$v}</option>
|
||||
{/foreach}
|
||||
</select>
|
||||
{/case}
|
||||
{/switch}
|
||||
</div>
|
||||
{/foreach}
|
||||
<button type="submit" class="mdui-btn mdui-btn-raised mdui-ripple mdui-color-theme-accent">保存</button>
|
||||
<button type="reset" class="mdui-btn mdui-btn-raised mdui-ripple">重置</button>
|
||||
{if 'mail' eq $key}
|
||||
<!-- 测试邮件发送 -->
|
||||
<button type="button" id="test-send-mail"
|
||||
class="mdui-btn mdui-btn-raised mdui-ripple mdui-color-cyan-600 mdui-text-color-white">测试邮件发送
|
||||
</button>
|
||||
{/if}
|
||||
</form>
|
||||
</div>
|
||||
{/foreach}
|
||||
</div>
|
||||
</div>
|
||||
</main>
|
||||
<div class="mdui-dialog" id="path-var">
|
||||
<div class="mdui-dialog-content mdui-p-a-0">
|
||||
<div class="mdui-table-fluid">
|
||||
<table class="mdui-table mdui-table-hoverable">
|
||||
<thead>
|
||||
<tr>
|
||||
<th>变量名</th>
|
||||
<th>示例</th>
|
||||
<th>说明</th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
{foreach $naming.path as $value}
|
||||
<tr>
|
||||
<td>{$value.name}</td>
|
||||
<td>{$value.example}</td>
|
||||
<td>{$value.explain}</td>
|
||||
</tr>
|
||||
{/foreach}
|
||||
</tbody>
|
||||
</table>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="mdui-dialog" id="file-var">
|
||||
<div class="mdui-dialog-content mdui-p-a-0">
|
||||
<div class="mdui-table-fluid">
|
||||
<table class="mdui-table mdui-table-hoverable">
|
||||
<thead>
|
||||
<tr>
|
||||
<th>变量名</th>
|
||||
<th>示例</th>
|
||||
<th>说明</th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
{foreach $naming.file as $value}
|
||||
<tr>
|
||||
<td>{$value.name}</td>
|
||||
<td>{$value.example}</td>
|
||||
<td>{$value.explain}</td>
|
||||
</tr>
|
||||
{/foreach}
|
||||
</tbody>
|
||||
</table>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
{/block}
|
||||
{block name="js"}
|
||||
<script>
|
||||
$(function () {
|
||||
|
||||
$('form').submit(function (e) {
|
||||
e.preventDefault();
|
||||
var data = $(this).serialize();
|
||||
$(this).find("input[type='checkbox']").each(function (key, value) {
|
||||
data += ("&" + $(value).data('name') + "=") + (value.checked ? value.value : 0);
|
||||
});
|
||||
app.request(this.action, data)
|
||||
});
|
||||
|
||||
$('#test-send-mail').click(function () {
|
||||
mdui.prompt('请输入邮箱',
|
||||
function (value) {
|
||||
app.request("{:url('admin/system/testMail')}", {email: value});
|
||||
},
|
||||
function (value) {
|
||||
|
||||
},
|
||||
{
|
||||
confirmText: '确定',
|
||||
cancelText: '取消'
|
||||
}
|
||||
);
|
||||
});
|
||||
});
|
||||
</script>
|
||||
{/block}
|
81
application/index/view/admin/update/index.html
Normal file
@ -0,0 +1,81 @@
|
||||
{extend name="common:base" /}
|
||||
|
||||
{block name="title"}系统更新 - {$config.site_name}{/block}
|
||||
|
||||
{block name="main"}
|
||||
<div class="mdui-container">
|
||||
<main>
|
||||
<div class="update-container">
|
||||
<div class="mdui-chip">
|
||||
<span class="mdui-chip-icon mdui-color-blue"><i class="mdui-icon material-icons"></i></span>
|
||||
<span class="mdui-chip-title">当前版本:v{$config.system_version}</span>
|
||||
</div>
|
||||
<div class="mdui-divider mdui-m-t-1 mdui-m-b-1"></div>
|
||||
{if $newest.version <= $config.system_version}
|
||||
<button class="mdui-btn mdui-btn-raised mdui-ripple mdui-color-theme-accent" disabled>已经是最新版本</button>
|
||||
{else /}
|
||||
<h3 class="mdui-text-color-light-blue">检测到新版本!</h3>
|
||||
<div class="item">
|
||||
<h4>v{$newest.version} <small>[{$newest.name}] {$newest.date}</small></h4>
|
||||
<div class="info">
|
||||
{foreach $newest.info as $k => $val}
|
||||
<p>{$k + 1}. {$val}</p>
|
||||
{/foreach}
|
||||
</div>
|
||||
</div>
|
||||
<button id="update" class="mdui-btn mdui-btn-raised mdui-ripple mdui-color-theme-accent mdui-m-t-1">立即更新</button>
|
||||
{/if}
|
||||
<div class="mdui-divider mdui-m-t-2 mdui-m-b-2"></div>
|
||||
<h3 class="mdui-text-color-cyan">更新日志:</h3>
|
||||
{if $record}
|
||||
{foreach $record as $value}
|
||||
<div class="item">
|
||||
<h4>v{$value.version} <small>[{$value.name}] {$value.date}</small></h4>
|
||||
<div class="info">
|
||||
{foreach $value.info as $k => $val}
|
||||
<p>{$k + 1}. {$val}</p>
|
||||
{/foreach}
|
||||
</div>
|
||||
</div>
|
||||
{/foreach}
|
||||
{else /}
|
||||
<p class="mdui-m-t-1">暂无更新日志</p>
|
||||
{/if}
|
||||
</div>
|
||||
</main>
|
||||
</div>
|
||||
{/block}
|
||||
|
||||
{block name="js"}
|
||||
<script>
|
||||
$('#update').click(function () {
|
||||
var that = $(this);
|
||||
$.ajax({
|
||||
url: "{:url('admin/update/toUpdate')}",
|
||||
type: 'post',
|
||||
dataType: 'json',
|
||||
beforeSend: function () {
|
||||
that.attr('disabled', true).text('请求更新中...');
|
||||
},
|
||||
success: function (response) {
|
||||
that.attr('disabled', true).text(response.msg);
|
||||
if (response.code) {
|
||||
mdui.alert(response.msg, function () {
|
||||
setTimeout(function () {
|
||||
history.go(0);
|
||||
}, 300)
|
||||
}, {
|
||||
confirmText: '确定'
|
||||
})
|
||||
}
|
||||
},
|
||||
error: function () {
|
||||
|
||||
},
|
||||
complete: function () {
|
||||
that.attr('disabled', false).text('立即更新');
|
||||
}
|
||||
});
|
||||
});
|
||||
</script>
|
||||
{/block}
|
216
application/index/view/admin/users/index.html
Normal file
@ -0,0 +1,216 @@
|
||||
{extend name="common:base" /}
|
||||
|
||||
{block name="title"}用户管理 - {$config.site_name}{/block}
|
||||
|
||||
{block name="main"}
|
||||
<div class="mdui-container">
|
||||
<main>
|
||||
<div class="mdui-chip">
|
||||
<span class="mdui-chip-icon"><i class="mdui-icon material-icons"></i></span>
|
||||
<span class="mdui-chip-title">系统共有 <small class="mdui-text-color-red">{$users->total()}</small> 个用户</span>
|
||||
<a href="" class="mdui-chip-delete" mdui-tooltip="{content: '刷新', position: 'right'}"><i class="mdui-icon material-icons"></i></a>
|
||||
</div>
|
||||
<div class="mdui-clearfix mdui-m-t-1"></div>
|
||||
<form action="" method="post" id="search-form">
|
||||
<select class="where mdui-select mdui-float-left" name="state" mdui-select>
|
||||
<option value="">全部</option>
|
||||
<option value="1" {if 1 eq $state}selected{/if}>正常</option>
|
||||
<option value="2" {if 2 eq $state}selected{/if}>冻结</option>
|
||||
</select>
|
||||
<input type="hidden" name="page" value="1">
|
||||
<input class="mdui-textfield-input search-input mdui-float-left" type="text" name="keyword" placeholder="回车搜索..." value="{$keyword}" autocomplete="off"/>
|
||||
</form>
|
||||
<div class="mdui-clearfix"></div>
|
||||
<div class="mdui-table-fluid mdui-m-t-2 mdui-m-b-2">
|
||||
<table class="mdui-table mdui-table-selectable">
|
||||
<thead>
|
||||
<tr>
|
||||
<th>用户名</th>
|
||||
<th>昵称</th>
|
||||
<th>邮箱</th>
|
||||
<th>已使用容量</th>
|
||||
<th>总容量</th>
|
||||
<th>账号状态</th>
|
||||
<th>注册IP</th>
|
||||
<th>操作</th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
{foreach $users as $value}
|
||||
<tr data-id="{$value.id}">
|
||||
<td>{$value.username}</td>
|
||||
<td>{$value.nickname}</td>
|
||||
<td>{$value.email}</td>
|
||||
<td>{$value.use_quota|format_size}</td>
|
||||
<td>{$value.quota|format_size}</td>
|
||||
<td>
|
||||
<select class="mdui-select state">
|
||||
<option value="1" {if 1 eq $value.state}selected{/if}>正常</option>
|
||||
<option value="0" {if 0 eq $value.state}selected{/if}>冻结</option>
|
||||
</select>
|
||||
</td>
|
||||
<td>{$value.reg_ip}</td>
|
||||
<td>
|
||||
<div class="mdui-btn-group">
|
||||
<button class="mdui-btn mdui-btn-raised mdui-btn-dense edit">编辑</button>
|
||||
<button class="mdui-btn mdui-btn-raised mdui-ripple mdui-color-red mdui-btn-dense del">删除</button>
|
||||
</div>
|
||||
</td>
|
||||
</tr>
|
||||
{/foreach}
|
||||
</tbody>
|
||||
</table>
|
||||
</div>
|
||||
<div class="page">
|
||||
{$users|raw}
|
||||
</div>
|
||||
<select class="operation mdui-select" mdui-select>
|
||||
<option value="">选中项</option>
|
||||
<option value="frozen">冻结</option>
|
||||
<option value="delete">删除</option>
|
||||
</select>
|
||||
</main>
|
||||
<div class="mdui-dialog" id="edit-dialog">
|
||||
<form action="{:url('admin/users/edit')}" method="post">
|
||||
<div class="mdui-dialog-content">
|
||||
<div class="mdui-dialog-title">修改用户数据</div>
|
||||
<div class="mdui-textfield">
|
||||
<label class="mdui-textfield-label">用户名</label>
|
||||
<input class="mdui-textfield-input" type="text" name="username" value="" placeholder="用户名" autocomplete="off"/>
|
||||
</div>
|
||||
<div class="mdui-textfield">
|
||||
<label class="mdui-textfield-label">邮箱</label>
|
||||
<input class="mdui-textfield-input" type="email" name="email" value="" placeholder="邮箱" autocomplete="off"/>
|
||||
</div>
|
||||
<div class="mdui-textfield">
|
||||
<label class="mdui-textfield-label">昵称</label>
|
||||
<input class="mdui-textfield-input" type="text" name="nickname" value="" maxlength="15" placeholder="昵称" autocomplete="off"/>
|
||||
</div>
|
||||
<div class="mdui-textfield">
|
||||
<label class="mdui-textfield-label">储存容量</label>
|
||||
<input class="mdui-textfield-input" type="text" name="quota" value="" placeholder="储存容量" autocomplete="off"/>
|
||||
</div>
|
||||
<div class="mdui-textfield">
|
||||
<label class="mdui-textfield-label">已使用储存容量</label>
|
||||
<input class="mdui-textfield-input" type="text" name="quota" value="" placeholder="已使用储存容量" autocomplete="off"/>
|
||||
</div>
|
||||
<div class="mdui-textfield">
|
||||
<label class="mdui-textfield-label">密码</label>
|
||||
<input class="mdui-textfield-input" type="password" name="password" placeholder="密码,不修改请留空" autocomplete="off"/>
|
||||
</div>
|
||||
<div class="mdui-textfield">
|
||||
<label class="mdui-textfield-label">确认密码</label>
|
||||
<input class="mdui-textfield-input" type="password" name="password_confirm" placeholder="确认密码" autocomplete="off"/>
|
||||
</div>
|
||||
</div>
|
||||
<input type="hidden" name="id" value="">
|
||||
<div class="mdui-dialog-actions">
|
||||
<button type="button" class="mdui-btn mdui-ripple" mdui-dialog-cancel>取消</button>
|
||||
<button class="mdui-btn mdui-ripple">修改</button>
|
||||
</div>
|
||||
</form>
|
||||
</div>
|
||||
</div>
|
||||
{/block}
|
||||
|
||||
{block name="js"}
|
||||
<script>
|
||||
$(function () {
|
||||
var dialog = new mdui.Dialog('#edit-dialog');
|
||||
var methods = {
|
||||
delete: function (id, batch, callback) {
|
||||
var msg = '确认删除该用户吗?';
|
||||
if (batch) {
|
||||
msg = '确认删除选中项用户吗?';
|
||||
}
|
||||
mdui.confirm(msg, function () {
|
||||
app.request("{:url('admin/users/delete')}", {id: id}, function () {
|
||||
callback && callback();
|
||||
});
|
||||
}, function () {
|
||||
|
||||
}, {confirmText: '确定', cancelText: '取消'});
|
||||
},
|
||||
frozen: function (id, batch, callback) {
|
||||
var msg = '确认冻结该用户吗?';
|
||||
if (batch) {
|
||||
msg = '确认冻结选中项用户吗?';
|
||||
}
|
||||
mdui.confirm(msg, function () {
|
||||
app.request("{:url('admin/users/frozen')}", {id: id}, function () {
|
||||
callback && callback();
|
||||
});
|
||||
}, function () {
|
||||
|
||||
}, {confirmText: '确定', cancelText: '取消'});
|
||||
}
|
||||
};
|
||||
$('.mdui-select.operation').on('close.mdui.select', function () {
|
||||
if ($(this).val() !== '') {
|
||||
var selected = $('tr.mdui-table-row-selected');
|
||||
var val = $(this).val();
|
||||
var array = [];
|
||||
if (selected.length) {
|
||||
selected.each(function (index, value) {
|
||||
array.push($(value).data('id'));
|
||||
});
|
||||
|
||||
if ('frozen' === val) {
|
||||
methods.frozen(array, true, function () {
|
||||
history.go(0);
|
||||
})
|
||||
} else if ('delete' === val) {
|
||||
methods.delete(array, true, function () {
|
||||
selected.remove();
|
||||
});
|
||||
}
|
||||
} else {
|
||||
mdui.snackbar({
|
||||
message: '至少选择一项数据!'
|
||||
});
|
||||
}
|
||||
}
|
||||
});
|
||||
// 提交
|
||||
$('#edit-dialog form').submit(function (e) {
|
||||
e.preventDefault();
|
||||
app.request("{:url('admin/users/edit')}", $(this).serialize(), function () {
|
||||
dialog.close();
|
||||
history.go(0);
|
||||
});
|
||||
});
|
||||
// 状态切换
|
||||
$('td select.state').change(function () {
|
||||
var tr = $(this).closest('tr');
|
||||
app.request("{:url('admin/users/setState')}", {id: tr.data('id'), state: $(this).val()});
|
||||
});
|
||||
// 编辑
|
||||
$('td button.edit').click(function () {
|
||||
var tr = $(this).closest('tr');
|
||||
app.ajax("{:url('admin/users/getUser')}", {id: tr.data('id')}, function (response) {
|
||||
if (response.code) {
|
||||
var form = $("#edit-dialog form");
|
||||
for (x in response.data) {
|
||||
var input = form.find("input[name='" + x + "']");
|
||||
if (input.length) {
|
||||
input.val(response.data[x]);
|
||||
}
|
||||
}
|
||||
dialog.open();
|
||||
} else {
|
||||
mdui.snackbar({
|
||||
message: response.msg
|
||||
});
|
||||
}
|
||||
});
|
||||
});
|
||||
// 删除
|
||||
$('td button.del').click(function () {
|
||||
var tr = $(this).closest('tr');
|
||||
methods.delete(tr.data('id'), false, function () {
|
||||
tr.remove();
|
||||
});
|
||||
});
|
||||
});
|
||||
</script>
|
||||
{/block}
|
72
application/index/view/auth/forgot.html
Normal file
@ -0,0 +1,72 @@
|
||||
{extend name="common:base" /}
|
||||
|
||||
{block name="title"}找回密码 - {$config.site_name}{/block}
|
||||
|
||||
{block name="main"}
|
||||
<div class="mdui-container">
|
||||
<main>
|
||||
<div class="mdui-row">
|
||||
<div class="forgot-container">
|
||||
<div class="panel mdui-col-sm-6 mdui-col-md-6 mdui-col-offset-sm-3 mdui-col-offset-md-3">
|
||||
<div class="panel-header">找回密码</div>
|
||||
<div class="panel-body-box">
|
||||
<form id="send-code" action="{:url('auth/forgot')}" method="post">
|
||||
<div class="mdui-textfield mdui-textfield-floating-label">
|
||||
<label class="mdui-textfield-label">请输入邮箱</label>
|
||||
<input class="mdui-textfield-input" type="email" name="email" value="" required/>
|
||||
</div>
|
||||
<div class="mdui-textfield mdui-textfield-floating-label">
|
||||
<label class="mdui-textfield-label">验证码</label>
|
||||
<input class="mdui-textfield-input" type="text" name="captcha" maxlength="5" autocomplete="off" required/>
|
||||
<img src="{:captcha_src()}" class="captcha" onclick="this.src = '{:captcha_src()}' + '?t=' + new Date().getTime()" alt="验证码">
|
||||
</div>
|
||||
<div class="mdui-textfield mdui-textfield-floating-label">
|
||||
<button class="mdui-btn mdui-btn-block mdui-color-theme-accent mdui-ripple">发送验证码</button>
|
||||
</div>
|
||||
</form>
|
||||
<form id="reset-password" class="none" action="{:url('auth/forgot')}" method="post">
|
||||
<div class="mdui-textfield mdui-textfield-floating-label">
|
||||
<label class="mdui-textfield-label">邮件验证码</label>
|
||||
<input class="mdui-textfield-input" type="text" name="code" maxlength="5" autocomplete="off" required/>
|
||||
</div>
|
||||
<div class="mdui-textfield mdui-textfield-floating-label">
|
||||
<label class="mdui-textfield-label">新密码</label>
|
||||
<input class="mdui-textfield-input" type="password" name="password" value="" required/>
|
||||
</div>
|
||||
<div class="mdui-textfield mdui-textfield-floating-label">
|
||||
<label class="mdui-textfield-label">确认新密码</label>
|
||||
<input class="mdui-textfield-input" type="password" name="password_confirm" value="" required/>
|
||||
</div>
|
||||
<div class="mdui-textfield mdui-textfield-floating-label">
|
||||
<button class="mdui-btn mdui-btn-block mdui-color-theme-accent mdui-ripple">重置密码</button>
|
||||
</div>
|
||||
</form>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</main>
|
||||
</div>
|
||||
{/block}
|
||||
|
||||
{block name="js"}
|
||||
<script>
|
||||
$(function () {
|
||||
$('#send-code').submit(function (e) {
|
||||
e.preventDefault();
|
||||
app.request("{:url('auth/sendCode')}", $(this).serialize(), function () {
|
||||
$('#send-code').addClass('none');
|
||||
$('#reset-password').removeClass('none');
|
||||
}, function () {
|
||||
$('.captcha').click();
|
||||
});
|
||||
});
|
||||
$('#reset-password').submit(function (e) {
|
||||
e.preventDefault();
|
||||
app.request("{:url('auth/forgot')}", $(this).serialize(), function () {
|
||||
window.location.href = "{:url('auth/login')}";
|
||||
});
|
||||
});
|
||||
});
|
||||
</script>
|
||||
{/block}
|
46
application/index/view/auth/login.html
Normal file
@ -0,0 +1,46 @@
|
||||
{extend name="common:base" /}
|
||||
|
||||
{block name="title"}登录 - {$config.site_name}{/block}
|
||||
|
||||
{block name="css"}
|
||||
<link href="/static/bootstrap/3.3.7/css/bootstrap.min.css" rel="stylesheet">
|
||||
{/block}
|
||||
|
||||
{block name="main"}
|
||||
<div class="mdui-container">
|
||||
<main>
|
||||
<div class="mdui-row">
|
||||
<div class="login-container">
|
||||
<div class="panel mdui-col-sm-6 mdui-col-md-6 mdui-col-offset-sm-3 mdui-col-offset-md-3">
|
||||
<div class="panel-header">登录账号</div>
|
||||
<div class="panel-body-box">
|
||||
<form action="{:url('auth/login')}" method="post">
|
||||
{include file="common:alert"}
|
||||
<div class="mdui-textfield mdui-textfield-floating-label">
|
||||
<label class="mdui-textfield-label">邮箱</label>
|
||||
<input class="mdui-textfield-input" type="email" name="account" value="{:input('post.account')}"/>
|
||||
</div>
|
||||
<div class="mdui-textfield mdui-textfield-floating-label">
|
||||
<label class="mdui-textfield-label">密码</label>
|
||||
<input class="mdui-textfield-input" type="password" name="password"/>
|
||||
</div>
|
||||
<div class="mdui-textfield mdui-textfield-floating-label">
|
||||
<button class="mdui-btn mdui-btn-block mdui-color-theme-accent mdui-ripple">登录</button>
|
||||
</div>
|
||||
{:token()}
|
||||
</form>
|
||||
<p class="mdui-clearfix mdui-m-t-1">
|
||||
<a class="mdui-float-left" href="{:url('auth/forgot')}">忘记密码?</a>
|
||||
<a class="mdui-float-right" href="{:url('auth/register')}">注册账号</a>
|
||||
</p>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</main>
|
||||
</div>
|
||||
{/block}
|
||||
|
||||
{block name="js"}
|
||||
<script src="/static/bootstrap/3.3.7/js/bootstrap.min.js"></script>
|
||||
{/block}
|
62
application/index/view/auth/register.html
Normal file
@ -0,0 +1,62 @@
|
||||
{extend name="common:base" /}
|
||||
|
||||
{block name="title"}注册 - {$config.site_name}{/block}
|
||||
|
||||
{block name="css"}
|
||||
<link href="/static/bootstrap/3.3.7/css/bootstrap.min.css" rel="stylesheet">
|
||||
{/block}
|
||||
|
||||
{block name="main"}
|
||||
<div class="mdui-container">
|
||||
<main>
|
||||
<div class="mdui-row">
|
||||
<div class="register-container">
|
||||
<div class="panel mdui-col-sm-6 mdui-col-md-6 mdui-col-offset-sm-3 mdui-col-offset-md-3">
|
||||
<div class="panel-header">注册账号</div>
|
||||
<div class="panel-body-box">
|
||||
<form action="{:url('auth/register')}" method="post">
|
||||
{include file="common:alert"}
|
||||
<div class="mdui-textfield mdui-textfield-floating-label">
|
||||
<label class="mdui-textfield-label">用户名</label>
|
||||
<input class="mdui-textfield-input" type="text" name="username" maxlength="15" value="{:input('post.username')}"/>
|
||||
</div>
|
||||
<div class="mdui-textfield mdui-textfield-floating-label">
|
||||
<label class="mdui-textfield-label">邮箱</label>
|
||||
<input class="mdui-textfield-input" type="email" name="email" value="{:input('post.email')}"/>
|
||||
</div>
|
||||
<div class="mdui-textfield mdui-textfield-floating-label">
|
||||
<label class="mdui-textfield-label">密码</label>
|
||||
<input class="mdui-textfield-input" type="password" name="password" value="{:input('post.password')}"/>
|
||||
</div>
|
||||
<div class="mdui-textfield mdui-textfield-floating-label">
|
||||
<label class="mdui-textfield-label">确认密码</label>
|
||||
<input class="mdui-textfield-input" type="password" name="password_confirm"/>
|
||||
</div>
|
||||
<div class="mdui-textfield mdui-textfield-floating-label">
|
||||
<label class="mdui-textfield-label">验证码</label>
|
||||
<input class="mdui-textfield-input" type="text" name="captcha" maxlength="5" autocomplete="off"/>
|
||||
<img src="{:captcha_src()}" class="captcha" onclick="this.src = '{:captcha_src()}' + '?t=' + new Date().getTime()" alt="验证码">
|
||||
</div>
|
||||
<div class="mdui-textfield mdui-textfield-floating-label">
|
||||
{if $config.close_register}
|
||||
<button class="mdui-btn mdui-btn-block mdui-color-theme-accent mdui-ripple" disabled>已关闭注册</button>
|
||||
{else /}
|
||||
<button class="mdui-btn mdui-btn-block mdui-color-theme-accent mdui-ripple">注册</button>
|
||||
{/if}
|
||||
</div>
|
||||
{:token()}
|
||||
</form>
|
||||
<p class="mdui-clearfix mdui-m-t-1">
|
||||
已有账号?<a href="{:url('auth/login')}">登录</a>
|
||||
</p>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</main>
|
||||
</div>
|
||||
{/block}
|
||||
|
||||
{block name="js"}
|
||||
<script src="/static/bootstrap/3.3.7/js/bootstrap.min.js"></script>
|
||||
{/block}
|
12
application/index/view/common/alert.html
Normal file
@ -0,0 +1,12 @@
|
||||
{if session('?success')}
|
||||
<div class="error-box alert alert-success alert-dismissible" role="alert">
|
||||
<button type="button" class="close" data-dismiss="alert" aria-label="Close"><span aria-hidden="true">×</span></button>
|
||||
{:session('success')}
|
||||
</div>
|
||||
{/if}
|
||||
{if session('?error')}
|
||||
<div class="error-box alert alert-danger alert-dismissible" role="alert">
|
||||
<button type="button" class="close" data-dismiss="alert" aria-label="Close"><span aria-hidden="true">×</span></button>
|
||||
{:session('error')}
|
||||
</div>
|
||||
{/if}
|
159
application/index/view/common/base.html
Normal file
@ -0,0 +1,159 @@
|
||||
<!DOCTYPE html>
|
||||
<html lang="en">
|
||||
<head>
|
||||
<meta charset="UTF-8">
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1.0,maximum-scale=1.0, user-scalable=no"/>
|
||||
<meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1"/>
|
||||
<meta name="renderer" content="webkit">
|
||||
<meta http-equiv="Cache-Control" content="no-siteapp"/>
|
||||
<meta name="keywords" content="{$config.site_keywords}"/>
|
||||
<meta name="description" content="{$config.site_description}"/>
|
||||
<title>{block name="title"}Lsky Pro{/block}</title>
|
||||
{block name="css"}{/block}
|
||||
<link rel="stylesheet" href="/static/app/iconfont/iconfont.css">
|
||||
<link rel="stylesheet" href="/static/mdui/0.4.1/css/mdui.min.css">
|
||||
<link rel="stylesheet" href="/static/app/css/app.css">
|
||||
<!--[if IE]>
|
||||
<script>window.location.href = '/compatibility.html';</script>
|
||||
<![endif]-->
|
||||
</head>
|
||||
<body class="mdui-theme-accent-indigo mdui-appbar-with-toolbar {if cookie('?menu') and cookie('menu') eq 'open'}mdui-drawer-body-left{/if}">
|
||||
{block name="header"}
|
||||
<div class="mdui-appbar mdui-appbar-fixed">
|
||||
<div class="mdui-toolbar mdui-color-black">
|
||||
<span mdui-drawer="{target: '#menu'}" class="mdui-btn mdui-btn-icon open-menu"><i class="mdui-icon material-icons"></i></span>
|
||||
<a href="{:url('/')}" class="mdui-typo-headline">{$config.site_name}</a>
|
||||
<div class="mdui-toolbar-spacer"></div>
|
||||
{if $user}
|
||||
<!-- User -->
|
||||
<a href="javascript:void(0)" mdui-menu="{target: '#user'}" class="mdui-btn mdui-btn-icon"><i class="mdui-icon material-icons"></i></a>
|
||||
<ul class="mdui-menu" id="user">
|
||||
<li class="mdui-menu-item">
|
||||
<a href="{:url('user/images')}" class="mdui-ripple">我的图片</a>
|
||||
<a href="{:url('user/settings')}" class="mdui-ripple">设置</a>
|
||||
</li>
|
||||
<li class="mdui-divider"></li>
|
||||
<li class="mdui-menu-item">
|
||||
<a href="{:url('user/logout')}" class="mdui-ripple">退出账号</a>
|
||||
</li>
|
||||
</ul>
|
||||
{/if}
|
||||
<!-- More -->
|
||||
<span mdui-menu="{target: '#more'}" class="mdui-btn mdui-btn-icon"><i class="mdui-icon material-icons"></i></span>
|
||||
<ul class="mdui-menu" id="more">
|
||||
<li class="mdui-menu-item">
|
||||
<a href="https://www.wispx.cn" target="_blank" class="mdui-ripple">熊二哈的猫窝</a>
|
||||
</li>
|
||||
</ul>
|
||||
</div>
|
||||
</div>
|
||||
{/block}
|
||||
{block name="left"}
|
||||
<div id="menu" class="mdui-drawer mdui-drawer-{if cookie('?menu') and cookie('menu') eq 'open'}open{else /}close{/if}">
|
||||
<div class="mdui-list" mdui-collapse="{accordion: true}">
|
||||
<a class="mdui-list-item mdui-ripple {if $uri eq 'index/index'}mdui-list-item-active{/if}" href="/">
|
||||
<i class="mdui-list-item-icon mdui-icon material-icons mdui-text-color-blue"></i>
|
||||
<div class="mdui-list-item-content">首页</div>
|
||||
</a>
|
||||
{if $user}
|
||||
<a class="mdui-list-item mdui-ripple {if $uri eq 'user/images'}mdui-list-item-active{/if}" href="{:url('user/images')}">
|
||||
<i class="mdui-list-item-icon mdui-icon material-icons mdui-text-color-deep-orange"></i>
|
||||
<div class="mdui-list-item-content">我的图片</div>
|
||||
</a>
|
||||
<a class="mdui-list-item mdui-ripple {if $uri eq 'user/settings'}mdui-list-item-active{/if}" href="{:url('user/settings')}">
|
||||
<i class="mdui-list-item-icon mdui-icon material-icons mdui-text-color-theme"></i>
|
||||
<div class="mdui-list-item-content">设置</div>
|
||||
</a>
|
||||
{if $user.is_admin}
|
||||
<div class="mdui-collapse-item mdui-collapse-item-open">
|
||||
<div class="mdui-collapse-item-header mdui-list-item mdui-ripple">
|
||||
<i class="mdui-list-item-icon mdui-icon material-icons mdui-text-color-brown"></i>
|
||||
<div class="mdui-list-item-content">系统管理</div>
|
||||
<i class="mdui-collapse-item-arrow mdui-icon material-icons"></i>
|
||||
</div>
|
||||
<div class="mdui-collapse-item-body mdui-list">
|
||||
<a href="{:url('admin/users/index')}" class="mdui-list-item mdui-ripple {if $uri eq 'admin.users/index'}mdui-list-item-active{/if}">用户管理</a>
|
||||
<a href="{:url('admin/images/index')}" class="mdui-list-item mdui-ripple {if $uri eq 'admin.images/index'}mdui-list-item-active{/if}">图片管理</a>
|
||||
<a href="{:url('admin/strategy/index')}" class="mdui-list-item mdui-ripple {if $uri eq 'admin.strategy/index'}mdui-list-item-active{/if}">储存策略</a>
|
||||
<a href="{:url('admin/system/index')}" class="mdui-list-item mdui-ripple {if $uri eq 'admin.system/index'}mdui-list-item-active{/if}">系统设置</a>
|
||||
<a href="{:url('admin/update/index')}" class="mdui-list-item mdui-ripple {if $uri eq 'admin.update/index'}mdui-list-item-active{/if}">系统更新</a>
|
||||
</div>
|
||||
</div>
|
||||
{/if}
|
||||
<div class="quota-container">
|
||||
<p>容量使用:</p>
|
||||
<progress max="{$user.quota}" value="{$user.use_quota}"></progress>
|
||||
<p>
|
||||
<span class="use-quota">{:format_size($user.use_quota)}</span> /
|
||||
<span class="quota">{:format_size($user.quota)}</span>
|
||||
</p>
|
||||
</div>
|
||||
{else /}
|
||||
<a class="mdui-list-item mdui-ripple {if $uri eq 'auth/login'}mdui-list-item-active{/if}" href="{:url('auth/login')}">
|
||||
<i class="mdui-list-item-icon mdui-icon material-icons iconfont icon-login mdui-text-color-teal"></i>
|
||||
<div class="mdui-list-item-content">登录</div>
|
||||
</a>
|
||||
<a class="mdui-list-item mdui-ripple {if $uri eq 'auth/register'}mdui-list-item-active{/if}" href="{:url('auth/register')}">
|
||||
<i class="mdui-list-item-icon mdui-icon material-icons mdui-text-color-purple"></i>
|
||||
<div class="mdui-list-item-content">注册</div>
|
||||
</a>
|
||||
{/if}
|
||||
</div>
|
||||
</div>
|
||||
{/block}
|
||||
{block name="main"}
|
||||
<div class="mdui-container">
|
||||
<main></main>
|
||||
</div>
|
||||
{/block}
|
||||
{block name="footer"}
|
||||
<div class="mdui-fab-wrapper">
|
||||
<button id="to-top" class="mdui-fab mdui-ripple mdui-fab-hide mdui-color-theme-accent">
|
||||
<i class="mdui-icon material-icons"></i>
|
||||
</button>
|
||||
</div>
|
||||
<div id="loading-container">
|
||||
<div class="mask"></div>
|
||||
<div class="loading">
|
||||
<div class="mdui-spinner mdui-spinner-colorful"></div>
|
||||
</div>
|
||||
</div>
|
||||
<footer>
|
||||
<div class="mdui-container">
|
||||
Copyright © 2018 Wisp X. All rights reserved. 请勿上传违反中国大陆和香港法律的图片,违者后果自负。
|
||||
</div>
|
||||
</footer>
|
||||
{/block}
|
||||
<script src="/static/jquery/3.3.1/jquery.min.js"></script>
|
||||
<script src="/static/mdui/0.4.1/js/mdui.min.js"></script>
|
||||
<script src="/static/app/js/app.js"></script>
|
||||
{block name="js"}{/block}
|
||||
<script>
|
||||
$(function () {
|
||||
var toTop = $("#to-top"), toTopHide = function () {
|
||||
if ($(window).scrollTop() > 50) {
|
||||
toTop.removeClass('mdui-fab-hide');
|
||||
} else {
|
||||
toTop.addClass('mdui-fab-hide');
|
||||
}
|
||||
};
|
||||
if ($(window).scrollTop() > 50) {
|
||||
toTopHide();
|
||||
}
|
||||
$(window).scroll(function() {
|
||||
toTopHide();
|
||||
});
|
||||
|
||||
toTop.click(function () {
|
||||
$('body,html').animate({ scrollTop: 0 }, 500);
|
||||
});
|
||||
|
||||
$('.open-menu').click(function () {
|
||||
if ($(window).width() > 1024) {
|
||||
app.cookie.set('menu', $('body').hasClass('mdui-drawer-body-left') ? 'open' : 'close', 10, '/');
|
||||
}
|
||||
});
|
||||
});
|
||||
</script>
|
||||
</body>
|
||||
</html>
|
87
application/index/view/index/index.html
Normal file
@ -0,0 +1,87 @@
|
||||
{extend name="common:base" /}
|
||||
|
||||
{block name="title"}{$config.site_name}{/block}
|
||||
|
||||
{block name="css"}
|
||||
<link href="/static/bootstrap/3.3.7/css/bootstrap.min.css" rel="stylesheet">
|
||||
<link href="/static/bootstrap-fileinput/4.5.1/css/fileinput.min.css" rel="stylesheet">
|
||||
{/block}
|
||||
|
||||
{block name="main"}
|
||||
<div class="mdui-container">
|
||||
<main>
|
||||
{if (bool)$config.allowed_tourist_upload or $user}
|
||||
<div class="upload-container">
|
||||
<div class="title">
|
||||
<h1>Image Upload</h1>
|
||||
<p>最大可上传 {:round($config.upload_max_size / 1024 / 1024)} MB的图片,单次同时可上传 {$config.upload_single_num} 张。</p>
|
||||
</div>
|
||||
<form action="" method="post" enctype="multipart/form-data">
|
||||
<input id="image" style="display: none;" type="file" multiple data-overwrite-initial="false" data-min-file-count="1" data-max-file-count="10" name="image" accept="image/*">
|
||||
</form>
|
||||
<div class="success-info">
|
||||
<div class="mdui-tab mdui-tab-scrollable" mdui-tab>
|
||||
<a href="#code-url" class="mdui-ripple mdui-tab-active">URL</a>
|
||||
<a href="#code-html" class="mdui-ripple">HTML</a>
|
||||
<a href="#code-bbcode" class="mdui-ripple">BBCode</a>
|
||||
<a href="#code-markdown" class="mdui-ripple">Markdown</a>
|
||||
<a href="#code-markdown-with-link" class="mdui-ripple">Markdown with link</a>
|
||||
</div>
|
||||
<div id="code-url"><ul></ul></div>
|
||||
<div id="code-html"><ul></ul></div>
|
||||
<div id="code-bbcode"><ul></ul></div>
|
||||
<div id="code-markdown"><ul></ul></div>
|
||||
<div id="code-markdown-with-link"><ul></ul></div>
|
||||
</div>
|
||||
</div>
|
||||
{else /}
|
||||
<div class="not-logged-in jumbotron">
|
||||
<h2>请登录后体验</h2>
|
||||
<a href="{:url('auth/login')}" class="mdui-btn mdui-btn-raised mdui-ripple mdui-color-cyan mdui-text-color-white">登录</a>
|
||||
<a href="{:url('auth/register')}" class="mdui-btn mdui-btn-raised mdui-ripple mdui-color-green mdui-text-color-white">注册</a>
|
||||
</div>
|
||||
{/if}
|
||||
</main>
|
||||
</div>
|
||||
{/block}
|
||||
{block name="js"}
|
||||
<script src="/static/bootstrap-fileinput/4.5.1/js/fileinput.min.js"></script>
|
||||
<script src="/static/bootstrap-fileinput/4.5.1/js/locales/zh.js"></script>
|
||||
<script src="/static/bootstrap/3.3.7/js/bootstrap.min.js"></script>
|
||||
<script>
|
||||
$("#image").fileinput({
|
||||
uploadUrl: "{:url('api/upload')}",
|
||||
language: "zh",
|
||||
uploadAsync: true,
|
||||
overwriteInitial: false,
|
||||
//browseClass: "btn btn-file",
|
||||
maxFileSize: "{$config.upload_max_size / 1024}",// kb
|
||||
maxFileCount: "{$config.upload_single_num}",
|
||||
showCaption: true,
|
||||
dropZoneEnabled: true,
|
||||
browseIcon: "<i class=\"glyphicon glyphicon-picture\"></i> ",
|
||||
allowedFileExtensions: JSON.parse('{:json_encode(explode(",", filter_comma($config.upload_allowed_exts)))}'),
|
||||
}).on("fileuploaded", function(event, data, previewId, index) {
|
||||
var form = data.form, files = data.files, extra = data.extra, response = data.response, reader = data.reader;
|
||||
if(200 === response.code) {
|
||||
$("#code-url ul").prepend("<li>" + response.data.url + "</li>");
|
||||
$("#code-html ul").prepend("<li><img src=\"" + response.data.url + "\" alt=\"" + response.data.name + "\" title=\"" + response.data.name + "\" /></li>");
|
||||
$("#code-bbcode ul").prepend("<li>[img]" + response.data.url + "[/img]</li>");
|
||||
$("#code-markdown ul").prepend("<li>![" + response.data.name + "](" + response.data.url + ")</li>");
|
||||
$("#code-markdown-with-link ul").prepend("<li>[![" + response.data.name + "](" + response.data.url + ")](" + response.data.url + ")</li>");
|
||||
$(".success-info").css("width", "inherit");
|
||||
if (response.data.quota && response.data.use_quota) {
|
||||
$('.quota-container progress').attr('max', response.data.quota);
|
||||
$('.quota-container progress').val(response.data.use_quota);
|
||||
$('.quota-container span.quota').text(app.bytesToSize(response.data.quota));
|
||||
$('.quota-container span.use-quota').text(app.bytesToSize(response.data.use_quota));
|
||||
}
|
||||
} else if (500 === response.code) {
|
||||
mdui.alert(response.msg, '发生异常');
|
||||
} else {
|
||||
mdui.alert(response.msg);
|
||||
}
|
||||
});
|
||||
$('#image').css("display", "block");
|
||||
</script>
|
||||
{/block}
|
222
application/index/view/install/index.html
Normal file
@ -0,0 +1,222 @@
|
||||
<!DOCTYPE html>
|
||||
<html lang="en">
|
||||
<head>
|
||||
<title>Install Lsky Pro</title>
|
||||
<meta charset="UTF-8">
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1.0,maximum-scale=1.0, user-scalable=no"/>
|
||||
<meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1"/>
|
||||
<meta name="renderer" content="webkit">
|
||||
<meta http-equiv="Cache-Control" content="no-siteapp"/>
|
||||
<link href="https://cdnjs.cloudflare.com/ajax/libs/mdui/0.4.1/css/mdui.min.css" rel="stylesheet">
|
||||
</head>
|
||||
<body class="mdui-theme-accent-indigo">
|
||||
<style>
|
||||
main {
|
||||
margin: 5rem auto;
|
||||
max-width: 500px;
|
||||
border-radius: 3px;
|
||||
padding: 1rem;
|
||||
}
|
||||
table {
|
||||
width: 100%;
|
||||
}
|
||||
tr {
|
||||
display: table;
|
||||
width: 100%;
|
||||
border: 1px solid #ebebeb;
|
||||
}
|
||||
td {
|
||||
width: 50%;
|
||||
margin-bottom: .8rem;
|
||||
}
|
||||
</style>
|
||||
<div class="mdui-container">
|
||||
<main class="mdui-shadow-2">
|
||||
{switch stop}
|
||||
|
||||
{case 1}
|
||||
<h4>- 运行环境检测</h4>
|
||||
<table>
|
||||
<tbody>
|
||||
<tr>
|
||||
<td align="right">
|
||||
PHP版本 ≥ 5.6:
|
||||
</td>
|
||||
<td align="left">
|
||||
{if ($phpVerGt56) }
|
||||
<i class="mdui-icon material-icons mdui-text-color-green"></i>
|
||||
{else/}
|
||||
<i class="mdui-icon material-icons mdui-text-color-red"></i>
|
||||
{/if}
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td align="right">
|
||||
Curl拓展:
|
||||
</td>
|
||||
<td align="left">
|
||||
{if ($isCurl) }
|
||||
<i class="mdui-icon material-icons mdui-text-color-green"></i>
|
||||
{else/}
|
||||
<i class="mdui-icon material-icons mdui-text-color-red"></i>
|
||||
{/if}
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td align="right">
|
||||
Zip拓展:
|
||||
</td>
|
||||
<td align="left">
|
||||
{if ($isZip) }
|
||||
<i class="mdui-icon material-icons mdui-text-color-green"></i>
|
||||
{else/}
|
||||
<i class="mdui-icon material-icons mdui-text-color-red"></i>
|
||||
{/if}
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td align="right">
|
||||
Mysqli:
|
||||
</td>
|
||||
<td align="left">
|
||||
{if ($isMysqli) }
|
||||
<i class="mdui-icon material-icons mdui-text-color-green"></i>
|
||||
{else/}
|
||||
<i class="mdui-icon material-icons mdui-text-color-red"></i>
|
||||
{/if}
|
||||
</td>
|
||||
</tr>
|
||||
</tbody>
|
||||
</table>
|
||||
{if (!$testing) }
|
||||
<a href="javascript:void(0)" class="mdui-btn mdui-btn-block mdui-m-t-1 mdui-color-teal mdui-ripple" disabled>检测不通过</a>
|
||||
{else/}
|
||||
<a href="{:url('install/index', ['stop' => 2])}" class="mdui-btn mdui-btn-block mdui-m-t-1 mdui-color-teal mdui-ripple">下一步</a>
|
||||
{/if}
|
||||
{/case}
|
||||
|
||||
{case 2}
|
||||
<h4>- 完善数据库配置</h4>
|
||||
<form action="" method="post" id="configure-mysql-form">
|
||||
<div class="mdui-textfield">
|
||||
<label class="mdui-textfield-label">数据库连接地址</label>
|
||||
<input class="mdui-textfield-input" type="text" name="hostname" placeholder="数据库连接地址" value="127.0.0.1" autocomplete="off"/>
|
||||
</div>
|
||||
<div class="mdui-textfield">
|
||||
<label class="mdui-textfield-label">数据库名</label>
|
||||
<input class="mdui-textfield-input" type="text" name="database" placeholder="数据库名称" value="lsky" autocomplete="off"/>
|
||||
</div>
|
||||
<div class="mdui-textfield">
|
||||
<label class="mdui-textfield-label">数据库用户名</label>
|
||||
<input class="mdui-textfield-input" type="text" name="username" placeholder="数据库用户名" value="root" autocomplete="off"/>
|
||||
</div>
|
||||
<div class="mdui-textfield">
|
||||
<label class="mdui-textfield-label">数据库密码</label>
|
||||
<input class="mdui-textfield-input" type="password" name="password" placeholder="数据库密码" value="root" autocomplete="off"/>
|
||||
</div>
|
||||
<div class="mdui-textfield">
|
||||
<label class="mdui-textfield-label">数据库连接端口</label>
|
||||
<input class="mdui-textfield-input" type="number" name="hostport" placeholder="数据库连接端口" value="3306" autocomplete="off"/>
|
||||
</div>
|
||||
<button class="mdui-btn mdui-btn-block mdui-m-t-1 mdui-color-teal mdui-ripple">配置数据库</button>
|
||||
</form>
|
||||
{/case}
|
||||
|
||||
{case 3}
|
||||
<h4>- 设置管理员账号</h4>
|
||||
<form action="" method="post" id="configure-admin-form">
|
||||
<div class="mdui-textfield">
|
||||
<label class="mdui-textfield-label">管理员邮箱</label>
|
||||
<input class="mdui-textfield-input" type="email" name="email" placeholder="管理员邮箱" autocomplete="off"/>
|
||||
</div>
|
||||
<div class="mdui-textfield">
|
||||
<label class="mdui-textfield-label">管理员用户名</label>
|
||||
<input class="mdui-textfield-input" type="text" name="username" placeholder="管理员用户名" value="admin" autocomplete="off"/>
|
||||
</div>
|
||||
<div class="mdui-textfield">
|
||||
<label class="mdui-textfield-label">管理员密码</label>
|
||||
<input class="mdui-textfield-input" type="password" name="password" placeholder="管理员密码" autocomplete="off"/>
|
||||
</div>
|
||||
<div class="mdui-textfield">
|
||||
<label class="mdui-textfield-label">确认管理员密码</label>
|
||||
<input class="mdui-textfield-input" type="password" name="password_confirm" placeholder="确认管理员密码" autocomplete="off"/>
|
||||
</div>
|
||||
<button class="mdui-btn mdui-btn-block mdui-m-t-1 mdui-color-teal mdui-ripple">设置管理员账号</button>
|
||||
</form>
|
||||
{/case}
|
||||
|
||||
{case 4}
|
||||
<h4>- 安装成功</h4>
|
||||
<div class="mdui-text-center">
|
||||
<p>程序安装成功,请牢记管理员账号密码!</p>
|
||||
<a href="{:url('/')}" class="mdui-btn mdui-btn-block mdui-m-t-1 mdui-color-teal mdui-ripple">网站首页</a>
|
||||
<a href="https://www.wispx.cn" class="mdui-btn mdui-btn-block mdui-m-t-1 mdui-color-pink mdui-ripple">作者博客</a>
|
||||
</div>
|
||||
<div class="mdui-m-t-2 mdui-text-color-grey">Copyright © 2018 Wisp X All rights reserved.</div>
|
||||
{/case}
|
||||
|
||||
{default /}
|
||||
|
||||
{/switch}
|
||||
</main>
|
||||
</div>
|
||||
</body>
|
||||
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
|
||||
<script src="https://cdnjs.cloudflare.com/ajax/libs/mdui/0.4.1/js/mdui.min.js"></script>
|
||||
<script>
|
||||
$(function () {
|
||||
$('#configure-mysql-form').submit(function (e) {
|
||||
e.preventDefault();
|
||||
$.ajax({
|
||||
url: "{:url('install/index', ['stop' => 2])}",
|
||||
data: $(this).serialize(),
|
||||
type: 'POST',
|
||||
dataType: 'JSON',
|
||||
beforeSend: function () {
|
||||
},
|
||||
success: function (response) {
|
||||
if (response.code) {
|
||||
location.href = "{:url('install/index',['stop' => 3])}";
|
||||
} else {
|
||||
mdui.snackbar({
|
||||
message: response.msg,
|
||||
position: 'right-top'
|
||||
});
|
||||
}
|
||||
},
|
||||
error: function () {
|
||||
},
|
||||
complete: function () {
|
||||
|
||||
}
|
||||
});
|
||||
});
|
||||
$('#configure-admin-form').submit(function (e) {
|
||||
e.preventDefault();
|
||||
$.ajax({
|
||||
url: "{:url('install/index', ['stop' => 3])}",
|
||||
data: $(this).serialize(),
|
||||
type: 'POST',
|
||||
dataType: 'JSON',
|
||||
beforeSend: function () {
|
||||
},
|
||||
success: function (response) {
|
||||
if (response.code) {
|
||||
location.href = "{:url('install/index', ['stop' => 4])}";
|
||||
} else {
|
||||
mdui.snackbar({
|
||||
message: response.msg,
|
||||
position: 'right-top'
|
||||
});
|
||||
}
|
||||
},
|
||||
error: function () {
|
||||
},
|
||||
complete: function () {
|
||||
|
||||
}
|
||||
});
|
||||
});
|
||||
});
|
||||
</script>
|
||||
</html>
|
63
application/index/view/tpl/compatibility.html
Normal file
@ -0,0 +1,63 @@
|
||||
<!DOCTYPE html>
|
||||
<html style="background:#eeeeee">
|
||||
<head>
|
||||
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/>
|
||||
<title>抱歉,无法兼容您的IE版本</title>
|
||||
</head>
|
||||
<style>
|
||||
body {
|
||||
color: #666;
|
||||
text-align: center;
|
||||
font-family: Helvetica, 'microsoft yahei', Arial, sans-serif;
|
||||
margin: 0;
|
||||
max-width: 800px;
|
||||
margin: auto;
|
||||
font-size: 14px;
|
||||
padding-top: 100px;
|
||||
}
|
||||
|
||||
h1 {
|
||||
font-size: 56px;
|
||||
line-height: 100px;
|
||||
font-weight: normal;
|
||||
color: #456;
|
||||
}
|
||||
|
||||
h2 {
|
||||
font-size: 24px;
|
||||
color: #666;
|
||||
line-height: 1.5em;
|
||||
}
|
||||
|
||||
h3 {
|
||||
color: #456;
|
||||
font-size: 20px;
|
||||
font-weight: normal;
|
||||
line-height: 28px;
|
||||
margin: 15px 0;
|
||||
}
|
||||
|
||||
hr {
|
||||
margin: 18px 0;
|
||||
border: 0;
|
||||
border-top: 1px solid #EEE;
|
||||
border-bottom: 1px solid white;
|
||||
}
|
||||
|
||||
a {
|
||||
color: #17bc9b;
|
||||
text-decoration: none;
|
||||
}
|
||||
</style>
|
||||
<body>
|
||||
<h1>Oops!</h1>
|
||||
<h3>本站不支持 IE 9 及以下版本浏览器。</h3>
|
||||
<hr/>
|
||||
<p style="font-size:16px;">
|
||||
为了获得更好的浏览体验,我们强烈建议您
|
||||
<a href="http://browsehappy.com/">升级</a>到最新版本的IE浏览器,或者使用较新版本的
|
||||
<a href="http://browsehappy.com/" style="font-weight:bold;">Google Chrome</a>、 <a href="http://browsehappy.com/" style="font-weight:bold;">Firefox</a>、
|
||||
<a href="http://browsehappy.com/" style="font-weight:bold;">Safari</a> 等。 如果您使用的是 IE 10 或以上版本,请关闭“兼容性视图”。
|
||||
</p>
|
||||
</body>
|
||||
</html>
|
346
application/index/view/user/images.html
Normal file
@ -0,0 +1,346 @@
|
||||
{extend name="common:base" /}
|
||||
|
||||
{block name="title"}图片管理 - {$config.site_name}{/block}
|
||||
|
||||
{block name="css"}
|
||||
<link rel="stylesheet" href="/static/contextjs/css/context.standalone.css">
|
||||
<link rel="stylesheet" href="/static/jquery-viewer/1.2.0/css/viewer.css">
|
||||
{/block}
|
||||
|
||||
{block name="main"}
|
||||
<div class="mdui-container-fluid">
|
||||
<main>
|
||||
<div class="images-container">
|
||||
<div class="screen-box mdui-m-b-1">
|
||||
<div class="mdui-chip">
|
||||
<span class="mdui-chip-icon"><i class="mdui-icon material-icons"></i></span>
|
||||
<span class="mdui-chip-title">共有 <small class="mdui-text-color-red num">0</small> 张图片</span>
|
||||
<span id="reset" class="mdui-chip-delete" mdui-tooltip="{content: '重置数据', position: 'right'}"><i class="mdui-icon material-icons"></i></span>
|
||||
</div>
|
||||
<div class="mdui-clearfix mdui-m-t-1"></div>
|
||||
<form action="" method="post" id="search-form">
|
||||
<select class="operation mdui-select" name="state" mdui-select>
|
||||
<option value="">选中项</option>
|
||||
<option value="delete">删除</option>
|
||||
</select>
|
||||
<div class="mdui-btn-group mdui-m-r-1 mdui-float-left">
|
||||
<button type="button" id="all" class="mdui-btn mdui-ripple mdui-btn-raised mdui-float-right">全选</button>
|
||||
</div>
|
||||
<input class="mdui-textfield-input search-input mdui-float-right" type="text" name="keyword" placeholder="回车搜索..." value="" autocomplete="off"/>
|
||||
</form>
|
||||
<div class="mdui-clearfix"></div>
|
||||
</div>
|
||||
<div class="mdui-divider mdui-m-b-1"></div>
|
||||
<div class="mdui-row">
|
||||
<div id="images-box" class="images-box mdui-row-xs-3 mdui-row-sm-9 mdui-row-md-9 mdui-row-lg-10 mdui-col-xl-12"></div>
|
||||
</div>
|
||||
<button class="mdui-btn mdui-ripple mdui-center mdui-color-grey-300 mdui-text-color-black-secondary mdui-m-t-2 more"></button>
|
||||
<!-- Info Dialog -->
|
||||
<div class="mdui-dialog" id="info">
|
||||
<div class="mdui-dialog-title"></div>
|
||||
<div class="mdui-dialog-content">
|
||||
<div class="mdui-row">
|
||||
<div class="mdui-col-xs-12 mdui-col-sm-3 mdui-col-md-3 mdui-col-lg-3 mdui-col-xl-3">
|
||||
<img class="qrcode mdui-center" src="/static/app/images/loading.jpg" width="100%">
|
||||
</div>
|
||||
<div class="mdui-col-xs-12 mdui-col-sm-9 mdui-col-md-9 mdui-col-lg-9 mdui-col-xl-9">
|
||||
<table>
|
||||
<tbody>
|
||||
<tr class="url">
|
||||
<td align="right">链接:</td>
|
||||
<td align="left">
|
||||
<input class="mdui-textfield-input" type="text" placeholder="图片外链" value=""/>
|
||||
</td>
|
||||
</tr>
|
||||
<tr class="pathname">
|
||||
<td align="right">位置:</td>
|
||||
<td align="left"></td>
|
||||
</tr>
|
||||
<tr class="size">
|
||||
<td align="right">大小:</td>
|
||||
<td align="left"></td>
|
||||
</tr>
|
||||
<tr class="md5">
|
||||
<td align="right">MD5:</td>
|
||||
<td align="left"></td>
|
||||
</tr>
|
||||
<tr class="mime">
|
||||
<td align="right">类型:</td>
|
||||
<td align="left"></td>
|
||||
</tr>
|
||||
</tbody>
|
||||
</table>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="mdui-dialog-actions">
|
||||
<div class="mdui-btn-group">
|
||||
<a href="" target="_blank" class="open-url mdui-btn mdui-color-theme-accent mdui-ripple mdui-btn-dense">打开链接</a>
|
||||
<button data-clipboard-action="copy" data-clipboard-text="" class="copy-url mdui-btn mdui-color-teal mdui-ripple mdui-btn-dense">复制链接</button>
|
||||
<button data-id="" class="delete-image mdui-btn mdui-color-red mdui-ripple mdui-btn-dense">删除</button>
|
||||
<button class="mdui-btn mdui-ripple mdui-color-grey-600 mdui-btn-dense" mdui-dialog-cancel>关闭</button>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</main>
|
||||
</div>
|
||||
<!-- 用于右键复制 -->
|
||||
<span id="copy-url" class="none copy-url" data-clipboard-action="copy" data-clipboard-text=""></span>
|
||||
{/block}
|
||||
|
||||
{block name="js"}
|
||||
<script src="/static/clipboard.js/2.0.1/clipboard.min.js"></script>
|
||||
<script src="/static/contextjs/js/context.js"></script>
|
||||
<script src="/static/jquery-viewer/1.2.0/js/viewer.js"></script>
|
||||
<script src="/static/jquery-viewer/1.2.0/js/jquery-viewer.js"></script>
|
||||
<script>
|
||||
$(function () {
|
||||
|
||||
var params = {}, viewer, imagesBox = $('.images-box'), totalBox = $('small.num'), infoDialog = $(".mdui-dialog#info"), qrcodeApi = 'https://www.kuaizhan.com/common/encode-png?large=true&data=';
|
||||
params.page = 1;
|
||||
|
||||
// 函数库
|
||||
var methods = {
|
||||
getImages: function () {
|
||||
var more = $(".more");
|
||||
more.attr('disabled', true).text('加载中...');
|
||||
app.ajax("{:url('user/images')}", params, function (response) {
|
||||
if (response.code) {
|
||||
var list = response.data.data;
|
||||
totalBox.text(response.data.total);
|
||||
if (list.length) {
|
||||
for (var i = 0; i < list.length; i++) {
|
||||
imagesBox.append(
|
||||
'<div class="mdui-col">' +
|
||||
' <div data-id="' + list[i].id + '" data-json=\'' + JSON.stringify(list[i]) + '\' class="item" title=' + list[i].name + '>' +
|
||||
' <i class="choice iconfont icon-choice"></i>' +
|
||||
' <i class="info iconfont icon-info"></i>' +
|
||||
' <div class="info image">' +
|
||||
' <img data-original="' + list[i].url + '" src="' + list[i].url + '">' +
|
||||
' </div>' +
|
||||
' <p class="name">' + list[i].name + '</p>' +
|
||||
' </div>' +
|
||||
' </div>');
|
||||
}
|
||||
|
||||
// 图片预览插件
|
||||
if (!viewer) {
|
||||
viewer = $('.images-box').viewer({
|
||||
url: 'data-original',
|
||||
zIndex: 999999999
|
||||
});
|
||||
} else {
|
||||
viewer.data('viewer').update();
|
||||
}
|
||||
|
||||
if (response.data.current_page == response.data.last_page) {
|
||||
return more.attr('disabled', true).text('我也是有底线的~');
|
||||
}
|
||||
params.page++;
|
||||
return more.attr('disabled', false).text('加载更多');
|
||||
} else {
|
||||
more.attr('disabled', true).text('暂无数据');
|
||||
}
|
||||
}
|
||||
});
|
||||
},
|
||||
// 删除
|
||||
delete: function (id, batch, callback) {
|
||||
var msg = '确认删除该图片吗?';
|
||||
if (batch) {
|
||||
msg = '确认删除选中项图片吗?';
|
||||
}
|
||||
mdui.confirm(msg, function () {
|
||||
app.request("{:url('user/deleteImages')}", {id: id}, function () {
|
||||
callback && callback();
|
||||
});
|
||||
}, function () {
|
||||
|
||||
}, {confirmText: '确定', cancelText: '取消'});
|
||||
}
|
||||
};
|
||||
|
||||
methods.getImages();
|
||||
|
||||
// 监听复制操作
|
||||
var clipboard = new ClipboardJS('.copy-url');
|
||||
clipboard.on('success', function(e) {
|
||||
/*console.info('Action:', e.action);
|
||||
console.info('Text:', e.text);
|
||||
console.info('Trigger:', e.trigger);*/
|
||||
app.msg(true, '复制成功!');
|
||||
e.clearSelection();
|
||||
});
|
||||
|
||||
clipboard.on('error', function(e) {
|
||||
console.error('Action:', e.action);
|
||||
console.error('Trigger:', e.trigger);
|
||||
app.msg(false, '复制失败!');
|
||||
});
|
||||
|
||||
// Context Start
|
||||
context.init({
|
||||
fadeSpeed: 100,
|
||||
filter: function ($obj){},
|
||||
above: 'auto',
|
||||
preventDoubleContext: true,
|
||||
compress: false
|
||||
});
|
||||
|
||||
$('body').on('contextmenu', '.images-box .item', function(e) {
|
||||
var item = $(e.target).closest('.item'), data = item.data('json');
|
||||
context.attach('.images-box .item', [
|
||||
{header: 'Compressed Menu'},
|
||||
{text: '查看图片', action: function (e) {
|
||||
e.preventDefault();
|
||||
item.find('img').click();
|
||||
}
|
||||
},
|
||||
{text: '新窗口打开图片', href: data.url, target: '_blank'},
|
||||
{divider: true},
|
||||
{text: '复制链接', action: function (e) {
|
||||
e.preventDefault();
|
||||
$('#copy-url').attr('data-clipboard-text', data.url).click();
|
||||
}
|
||||
},
|
||||
{
|
||||
text: '删除', action: function (e) {
|
||||
e.preventDefault();
|
||||
methods.delete(data.id, false, function () {
|
||||
item.parent().remove();
|
||||
totalBox.text(parseInt(totalBox.text()) - 1);
|
||||
})
|
||||
}
|
||||
},
|
||||
{
|
||||
text: '属性', action: function (e) {
|
||||
e.preventDefault();
|
||||
item.find('i.info').click();
|
||||
}
|
||||
}
|
||||
]);
|
||||
});
|
||||
// Context End
|
||||
|
||||
// 加载更多
|
||||
$('.more').click(function () {
|
||||
methods.getImages();
|
||||
});
|
||||
|
||||
// 筛选
|
||||
$('.screen-box form').submit(function (e) {
|
||||
e.preventDefault();
|
||||
// 清空内容
|
||||
imagesBox.html('');
|
||||
params.keyword = $(this).find("input[name='keyword']").val();
|
||||
methods.getImages();
|
||||
});
|
||||
|
||||
// 选中项操作
|
||||
$('.screen-box .mdui-select.operation').on('close.mdui.select', function () {
|
||||
if ($(this).val() !== '') {
|
||||
var selected = $('.images-box .item.choice'), array = [];
|
||||
if (selected.length) {
|
||||
selected.each(function (index, value) {
|
||||
array.push($(value).data('id'));
|
||||
});
|
||||
|
||||
if ('delete' === $(this).val()) {
|
||||
methods.delete(array, true, function () {
|
||||
selected.remove();
|
||||
totalBox.text(parseInt(totalBox.text()) - selected.length);
|
||||
// methods.getImages();
|
||||
});
|
||||
}
|
||||
} else {
|
||||
app.msg(false, '至少选择一项数据!')
|
||||
}
|
||||
}
|
||||
});
|
||||
|
||||
// 全选
|
||||
var all = false;
|
||||
$('#all').click(function () {
|
||||
var item = $('.images-box .item');
|
||||
if (0 === item.length) {
|
||||
return mdui.snackbar({
|
||||
position: 'right-top',
|
||||
message: '暂无数据!'
|
||||
});
|
||||
}
|
||||
if (all) {
|
||||
item.removeClass('choice');
|
||||
$(this).text('全选');
|
||||
all = false;
|
||||
} else {
|
||||
item.removeClass('choice').addClass('choice');
|
||||
$(this).text('取消全选');
|
||||
all = true;
|
||||
}
|
||||
});
|
||||
|
||||
// 单选
|
||||
imagesBox.on('click', '.item i.choice', function () {
|
||||
$(this).parent('.item').toggleClass('choice');
|
||||
});
|
||||
|
||||
// 图片信息
|
||||
var info = new mdui.Dialog('#info');
|
||||
imagesBox.on('click', '.item i.info', function () {
|
||||
var data = $(this).parent('.item').data('json');
|
||||
if (data) {
|
||||
// 标题
|
||||
infoDialog.find('.mdui-dialog-title').text(data.name);
|
||||
// 二维码
|
||||
infoDialog.find('img.qrcode').attr('src', qrcodeApi + data.url);
|
||||
// 信息
|
||||
for (x in data) {
|
||||
var tr = infoDialog.find('tr.' + x);
|
||||
if (tr.length) {
|
||||
var value = data[x];
|
||||
if (x === 'size') {
|
||||
value = app.bytesToSize(data[x]);
|
||||
}
|
||||
if (tr.find('td:last-child input').length) {
|
||||
tr.find('td:last-child input').val(value);
|
||||
} else {
|
||||
tr.find('td:last-child').text(value);
|
||||
}
|
||||
}
|
||||
}
|
||||
// 按钮
|
||||
infoDialog.find('.open-url').attr('href', data.url);
|
||||
infoDialog.find('.copy-url').attr('data-clipboard-text', data.url);
|
||||
infoDialog.find('.delete-image').attr('data-id', data.id);
|
||||
info.open();
|
||||
} else {
|
||||
app.msg(false, '数据异常!');
|
||||
}
|
||||
});
|
||||
|
||||
// 删除单张图片
|
||||
infoDialog.find('.delete-image').click(function () {
|
||||
var id = $(this).data('id');
|
||||
if (id) {
|
||||
info.close();
|
||||
methods.delete(id, false, function () {
|
||||
imagesBox.find(".item[data-id='" + id + "']").parent().remove();
|
||||
totalBox.text(parseInt(totalBox.text()) - 1);
|
||||
});
|
||||
} else {
|
||||
app.msg(false, '数据异常!');
|
||||
}
|
||||
});
|
||||
|
||||
// 重置数据
|
||||
$('#reset').click(function () {
|
||||
params = {
|
||||
page: 1
|
||||
};
|
||||
imagesBox.html('');
|
||||
methods.getImages();
|
||||
});
|
||||
})
|
||||
</script>
|
||||
{/block}
|
54
application/index/view/user/settings.html
Normal file
@ -0,0 +1,54 @@
|
||||
{extend name="common:base" /}
|
||||
|
||||
{block name="title"}设置 - {$config.site_name}{/block}
|
||||
|
||||
{block name="main"}
|
||||
<div class="mdui-container">
|
||||
<main>
|
||||
<div class="mdui-col-sm-8 mdui-col-md-8">
|
||||
<form action="{:url('user/settings')}" method="post">
|
||||
<div class="mdui-textfield">
|
||||
<label class="mdui-textfield-label">用户名</label>
|
||||
<input class="mdui-textfield-input" type="text" value="{$user.username}" disabled/>
|
||||
</div>
|
||||
<div class="mdui-textfield">
|
||||
<label class="mdui-textfield-label">邮箱</label>
|
||||
<input class="mdui-textfield-input" type="email" value="{$user.email}" disabled/>
|
||||
</div>
|
||||
<div class="mdui-textfield">
|
||||
<label class="mdui-textfield-label">昵称</label>
|
||||
<input class="mdui-textfield-input" type="text" name="nickname" value="{$user.nickname}" maxlength="15" placeholder="昵称"/>
|
||||
</div>
|
||||
<div class="mdui-textfield">
|
||||
<label class="mdui-textfield-label">原密码</label>
|
||||
<input class="mdui-textfield-input" type="password" name="password_old" placeholder="原密码,不修改请留空"/>
|
||||
</div>
|
||||
<div class="mdui-textfield">
|
||||
<label class="mdui-textfield-label">密码</label>
|
||||
<input class="mdui-textfield-input" type="password" name="password" placeholder="密码,不修改请留空"/>
|
||||
</div>
|
||||
<div class="mdui-textfield">
|
||||
<label class="mdui-textfield-label">确认密码</label>
|
||||
<input class="mdui-textfield-input" type="password" name="password_confirm" placeholder="确认密码"/>
|
||||
</div>
|
||||
<div class="mdui-textfield">
|
||||
<button type="submit" class="mdui-btn mdui-btn-raised mdui-ripple mdui-color-theme-accent">保存</button>
|
||||
<button type="reset" class="mdui-btn mdui-btn-raised mdui-ripple">重置</button>
|
||||
</div>
|
||||
</form>
|
||||
</div>
|
||||
</main>
|
||||
</div>
|
||||
{/block}
|
||||
{block name="js"}
|
||||
<script>
|
||||
$(function () {
|
||||
$('form').submit(function (e) {
|
||||
e.preventDefault();
|
||||
app.request(this.action, $(this).serialize(), function () {
|
||||
history.go(0)
|
||||
})
|
||||
});
|
||||
});
|
||||
</script>
|
||||
{/block}
|
13
application/provider.php
Normal file
@ -0,0 +1,13 @@
|
||||
<?php
|
||||
// +----------------------------------------------------------------------
|
||||
// | ThinkPHP [ WE CAN DO IT JUST THINK ]
|
||||
// +----------------------------------------------------------------------
|
||||
// | Copyright (c) 2006~2018 http://thinkphp.cn All rights reserved.
|
||||
// +----------------------------------------------------------------------
|
||||
// | Licensed ( http://www.apache.org/licenses/LICENSE-2.0 )
|
||||
// +----------------------------------------------------------------------
|
||||
// | Author: liu21st <liu21st@gmail.com>
|
||||
// +----------------------------------------------------------------------
|
||||
|
||||
// 应用容器绑定定义
|
||||
return [];
|
28
application/tags.php
Normal file
@ -0,0 +1,28 @@
|
||||
<?php
|
||||
// +----------------------------------------------------------------------
|
||||
// | ThinkPHP [ WE CAN DO IT JUST THINK ]
|
||||
// +----------------------------------------------------------------------
|
||||
// | Copyright (c) 2006~2018 http://thinkphp.cn All rights reserved.
|
||||
// +----------------------------------------------------------------------
|
||||
// | Licensed ( http://www.apache.org/licenses/LICENSE-2.0 )
|
||||
// +----------------------------------------------------------------------
|
||||
// | Author: liu21st <liu21st@gmail.com>
|
||||
// +----------------------------------------------------------------------
|
||||
|
||||
// 应用行为扩展定义文件
|
||||
return [
|
||||
// 应用初始化
|
||||
'app_init' => [],
|
||||
// 应用开始
|
||||
'app_begin' => [],
|
||||
// 模块初始化
|
||||
'module_init' => [],
|
||||
// 操作开始执行
|
||||
'action_begin' => [],
|
||||
// 视图内容过滤
|
||||
'view_filter' => [],
|
||||
// 日志写入
|
||||
'log_write' => [],
|
||||
// 应用结束
|
||||
'app_end' => [],
|
||||
];
|
33
composer.json
Normal file
@ -0,0 +1,33 @@
|
||||
{
|
||||
"name": "wisp-x/lsky-pro",
|
||||
"description": "Lsky Pro, your photo album on the cloud.",
|
||||
"type": "project",
|
||||
"keywords": [
|
||||
"lsky",
|
||||
"lsky Pro"
|
||||
],
|
||||
"homepage": "http://lsys.wispx.cn/",
|
||||
"license": "GPL-3.0-only",
|
||||
"authors": [
|
||||
{
|
||||
"name": "Wisp X",
|
||||
"email": "1591788658@qq.com"
|
||||
}
|
||||
],
|
||||
"require": {
|
||||
"php": ">=5.6.0",
|
||||
"topthink/framework": "5.1.*",
|
||||
"topthink/think-captcha": "^2.0",
|
||||
"aliyuncs/oss-sdk-php": "^2.3",
|
||||
"qiniu/php-sdk": "^7.2",
|
||||
"upyun/sdk": "^3.3",
|
||||
"qcloud/cos-sdk-v5": "^1.2",
|
||||
"topthink/think-image": "^1.0",
|
||||
"phpmailer/phpmailer": "^6.0"
|
||||
},
|
||||
"autoload": {
|
||||
"psr-4": {
|
||||
"app\\": "application"
|
||||
}
|
||||
}
|
||||
}
|
842
composer.lock
generated
Normal file
@ -0,0 +1,842 @@
|
||||
{
|
||||
"_readme": [
|
||||
"This file locks the dependencies of your project to a known state",
|
||||
"Read more about it at https://getcomposer.org/doc/01-basic-usage.md#composer-lock-the-lock-file",
|
||||
"This file is @generated automatically"
|
||||
],
|
||||
"content-hash": "f3a07db17ca2f758f19303939f3bb3d6",
|
||||
"packages": [
|
||||
{
|
||||
"name": "aliyuncs/oss-sdk-php",
|
||||
"version": "v2.3.0",
|
||||
"source": {
|
||||
"type": "git",
|
||||
"url": "https://github.com/aliyun/aliyun-oss-php-sdk.git",
|
||||
"reference": "e69f57916678458642ac9d2fd341ae78a56996c8"
|
||||
},
|
||||
"dist": {
|
||||
"type": "zip",
|
||||
"url": "https://api.github.com/repos/aliyun/aliyun-oss-php-sdk/zipball/e69f57916678458642ac9d2fd341ae78a56996c8",
|
||||
"reference": "e69f57916678458642ac9d2fd341ae78a56996c8",
|
||||
"shasum": ""
|
||||
},
|
||||
"require": {
|
||||
"php": ">=5.3"
|
||||
},
|
||||
"require-dev": {
|
||||
"phpunit/phpunit": "~4.0",
|
||||
"satooshi/php-coveralls": "~1.0"
|
||||
},
|
||||
"type": "library",
|
||||
"autoload": {
|
||||
"psr-4": {
|
||||
"OSS\\": "src/OSS"
|
||||
}
|
||||
},
|
||||
"notification-url": "https://packagist.org/downloads/",
|
||||
"license": [
|
||||
"MIT"
|
||||
],
|
||||
"authors": [
|
||||
{
|
||||
"name": "Aliyuncs",
|
||||
"homepage": "http://www.aliyun.com"
|
||||
}
|
||||
],
|
||||
"description": "Aliyun OSS SDK for PHP",
|
||||
"homepage": "http://www.aliyun.com/product/oss/",
|
||||
"time": "2018-01-08T06:59:35+00:00"
|
||||
},
|
||||
{
|
||||
"name": "guzzle/guzzle",
|
||||
"version": "v3.9.3",
|
||||
"source": {
|
||||
"type": "git",
|
||||
"url": "https://github.com/guzzle/guzzle3.git",
|
||||
"reference": "0645b70d953bc1c067bbc8d5bc53194706b628d9"
|
||||
},
|
||||
"dist": {
|
||||
"type": "zip",
|
||||
"url": "https://api.github.com/repos/guzzle/guzzle3/zipball/0645b70d953bc1c067bbc8d5bc53194706b628d9",
|
||||
"reference": "0645b70d953bc1c067bbc8d5bc53194706b628d9",
|
||||
"shasum": ""
|
||||
},
|
||||
"require": {
|
||||
"ext-curl": "*",
|
||||
"php": ">=5.3.3",
|
||||
"symfony/event-dispatcher": "~2.1"
|
||||
},
|
||||
"replace": {
|
||||
"guzzle/batch": "self.version",
|
||||
"guzzle/cache": "self.version",
|
||||
"guzzle/common": "self.version",
|
||||
"guzzle/http": "self.version",
|
||||
"guzzle/inflection": "self.version",
|
||||
"guzzle/iterator": "self.version",
|
||||
"guzzle/log": "self.version",
|
||||
"guzzle/parser": "self.version",
|
||||
"guzzle/plugin": "self.version",
|
||||
"guzzle/plugin-async": "self.version",
|
||||
"guzzle/plugin-backoff": "self.version",
|
||||
"guzzle/plugin-cache": "self.version",
|
||||
"guzzle/plugin-cookie": "self.version",
|
||||
"guzzle/plugin-curlauth": "self.version",
|
||||
"guzzle/plugin-error-response": "self.version",
|
||||
"guzzle/plugin-history": "self.version",
|
||||
"guzzle/plugin-log": "self.version",
|
||||
"guzzle/plugin-md5": "self.version",
|
||||
"guzzle/plugin-mock": "self.version",
|
||||
"guzzle/plugin-oauth": "self.version",
|
||||
"guzzle/service": "self.version",
|
||||
"guzzle/stream": "self.version"
|
||||
},
|
||||
"require-dev": {
|
||||
"doctrine/cache": "~1.3",
|
||||
"monolog/monolog": "~1.0",
|
||||
"phpunit/phpunit": "3.7.*",
|
||||
"psr/log": "~1.0",
|
||||
"symfony/class-loader": "~2.1",
|
||||
"zendframework/zend-cache": "2.*,<2.3",
|
||||
"zendframework/zend-log": "2.*,<2.3"
|
||||
},
|
||||
"suggest": {
|
||||
"guzzlehttp/guzzle": "Guzzle 5 has moved to a new package name. The package you have installed, Guzzle 3, is deprecated."
|
||||
},
|
||||
"type": "library",
|
||||
"extra": {
|
||||
"branch-alias": {
|
||||
"dev-master": "3.9-dev"
|
||||
}
|
||||
},
|
||||
"autoload": {
|
||||
"psr-0": {
|
||||
"Guzzle": "src/",
|
||||
"Guzzle\\Tests": "tests/"
|
||||
}
|
||||
},
|
||||
"notification-url": "https://packagist.org/downloads/",
|
||||
"license": [
|
||||
"MIT"
|
||||
],
|
||||
"authors": [
|
||||
{
|
||||
"name": "Michael Dowling",
|
||||
"email": "mtdowling@gmail.com",
|
||||
"homepage": "https://github.com/mtdowling"
|
||||
},
|
||||
{
|
||||
"name": "Guzzle Community",
|
||||
"homepage": "https://github.com/guzzle/guzzle/contributors"
|
||||
}
|
||||
],
|
||||
"description": "PHP HTTP client. This library is deprecated in favor of https://packagist.org/packages/guzzlehttp/guzzle",
|
||||
"homepage": "http://guzzlephp.org/",
|
||||
"keywords": [
|
||||
"client",
|
||||
"curl",
|
||||
"framework",
|
||||
"http",
|
||||
"http client",
|
||||
"rest",
|
||||
"web service"
|
||||
],
|
||||
"abandoned": "guzzlehttp/guzzle",
|
||||
"time": "2015-03-18T18:23:50+00:00"
|
||||
},
|
||||
{
|
||||
"name": "guzzlehttp/guzzle",
|
||||
"version": "6.3.3",
|
||||
"source": {
|
||||
"type": "git",
|
||||
"url": "https://github.com/guzzle/guzzle.git",
|
||||
"reference": "407b0cb880ace85c9b63c5f9551db498cb2d50ba"
|
||||
},
|
||||
"dist": {
|
||||
"type": "zip",
|
||||
"url": "https://api.github.com/repos/guzzle/guzzle/zipball/407b0cb880ace85c9b63c5f9551db498cb2d50ba",
|
||||
"reference": "407b0cb880ace85c9b63c5f9551db498cb2d50ba",
|
||||
"shasum": ""
|
||||
},
|
||||
"require": {
|
||||
"guzzlehttp/promises": "^1.0",
|
||||
"guzzlehttp/psr7": "^1.4",
|
||||
"php": ">=5.5"
|
||||
},
|
||||
"require-dev": {
|
||||
"ext-curl": "*",
|
||||
"phpunit/phpunit": "^4.8.35 || ^5.7 || ^6.4 || ^7.0",
|
||||
"psr/log": "^1.0"
|
||||
},
|
||||
"suggest": {
|
||||
"psr/log": "Required for using the Log middleware"
|
||||
},
|
||||
"type": "library",
|
||||
"extra": {
|
||||
"branch-alias": {
|
||||
"dev-master": "6.3-dev"
|
||||
}
|
||||
},
|
||||
"autoload": {
|
||||
"files": [
|
||||
"src/functions_include.php"
|
||||
],
|
||||
"psr-4": {
|
||||
"GuzzleHttp\\": "src/"
|
||||
}
|
||||
},
|
||||
"notification-url": "https://packagist.org/downloads/",
|
||||
"license": [
|
||||
"MIT"
|
||||
],
|
||||
"authors": [
|
||||
{
|
||||
"name": "Michael Dowling",
|
||||
"email": "mtdowling@gmail.com",
|
||||
"homepage": "https://github.com/mtdowling"
|
||||
}
|
||||
],
|
||||
"description": "Guzzle is a PHP HTTP client library",
|
||||
"homepage": "http://guzzlephp.org/",
|
||||
"keywords": [
|
||||
"client",
|
||||
"curl",
|
||||
"framework",
|
||||
"http",
|
||||
"http client",
|
||||
"rest",
|
||||
"web service"
|
||||
],
|
||||
"time": "2018-04-22T15:46:56+00:00"
|
||||
},
|
||||
{
|
||||
"name": "guzzlehttp/promises",
|
||||
"version": "v1.3.1",
|
||||
"source": {
|
||||
"type": "git",
|
||||
"url": "https://github.com/guzzle/promises.git",
|
||||
"reference": "a59da6cf61d80060647ff4d3eb2c03a2bc694646"
|
||||
},
|
||||
"dist": {
|
||||
"type": "zip",
|
||||
"url": "https://api.github.com/repos/guzzle/promises/zipball/a59da6cf61d80060647ff4d3eb2c03a2bc694646",
|
||||
"reference": "a59da6cf61d80060647ff4d3eb2c03a2bc694646",
|
||||
"shasum": ""
|
||||
},
|
||||
"require": {
|
||||
"php": ">=5.5.0"
|
||||
},
|
||||
"require-dev": {
|
||||
"phpunit/phpunit": "^4.0"
|
||||
},
|
||||
"type": "library",
|
||||
"extra": {
|
||||
"branch-alias": {
|
||||
"dev-master": "1.4-dev"
|
||||
}
|
||||
},
|
||||
"autoload": {
|
||||
"psr-4": {
|
||||
"GuzzleHttp\\Promise\\": "src/"
|
||||
},
|
||||
"files": [
|
||||
"src/functions_include.php"
|
||||
]
|
||||
},
|
||||
"notification-url": "https://packagist.org/downloads/",
|
||||
"license": [
|
||||
"MIT"
|
||||
],
|
||||
"authors": [
|
||||
{
|
||||
"name": "Michael Dowling",
|
||||
"email": "mtdowling@gmail.com",
|
||||
"homepage": "https://github.com/mtdowling"
|
||||
}
|
||||
],
|
||||
"description": "Guzzle promises library",
|
||||
"keywords": [
|
||||
"promise"
|
||||
],
|
||||
"time": "2016-12-20T10:07:11+00:00"
|
||||
},
|
||||
{
|
||||
"name": "guzzlehttp/psr7",
|
||||
"version": "1.4.2",
|
||||
"source": {
|
||||
"type": "git",
|
||||
"url": "https://github.com/guzzle/psr7.git",
|
||||
"reference": "f5b8a8512e2b58b0071a7280e39f14f72e05d87c"
|
||||
},
|
||||
"dist": {
|
||||
"type": "zip",
|
||||
"url": "https://api.github.com/repos/guzzle/psr7/zipball/f5b8a8512e2b58b0071a7280e39f14f72e05d87c",
|
||||
"reference": "f5b8a8512e2b58b0071a7280e39f14f72e05d87c",
|
||||
"shasum": ""
|
||||
},
|
||||
"require": {
|
||||
"php": ">=5.4.0",
|
||||
"psr/http-message": "~1.0"
|
||||
},
|
||||
"provide": {
|
||||
"psr/http-message-implementation": "1.0"
|
||||
},
|
||||
"require-dev": {
|
||||
"phpunit/phpunit": "~4.0"
|
||||
},
|
||||
"type": "library",
|
||||
"extra": {
|
||||
"branch-alias": {
|
||||
"dev-master": "1.4-dev"
|
||||
}
|
||||
},
|
||||
"autoload": {
|
||||
"psr-4": {
|
||||
"GuzzleHttp\\Psr7\\": "src/"
|
||||
},
|
||||
"files": [
|
||||
"src/functions_include.php"
|
||||
]
|
||||
},
|
||||
"notification-url": "https://packagist.org/downloads/",
|
||||
"license": [
|
||||
"MIT"
|
||||
],
|
||||
"authors": [
|
||||
{
|
||||
"name": "Michael Dowling",
|
||||
"email": "mtdowling@gmail.com",
|
||||
"homepage": "https://github.com/mtdowling"
|
||||
},
|
||||
{
|
||||
"name": "Tobias Schultze",
|
||||
"homepage": "https://github.com/Tobion"
|
||||
}
|
||||
],
|
||||
"description": "PSR-7 message implementation that also provides common utility methods",
|
||||
"keywords": [
|
||||
"http",
|
||||
"message",
|
||||
"request",
|
||||
"response",
|
||||
"stream",
|
||||
"uri",
|
||||
"url"
|
||||
],
|
||||
"time": "2017-03-20T17:10:46+00:00"
|
||||
},
|
||||
{
|
||||
"name": "phpmailer/phpmailer",
|
||||
"version": "v6.0.5",
|
||||
"source": {
|
||||
"type": "git",
|
||||
"url": "https://github.com/PHPMailer/PHPMailer.git",
|
||||
"reference": "cb3ea134d4d3729e7857737d5f320cce9caf4d32"
|
||||
},
|
||||
"dist": {
|
||||
"type": "zip",
|
||||
"url": "https://api.github.com/repos/PHPMailer/PHPMailer/zipball/cb3ea134d4d3729e7857737d5f320cce9caf4d32",
|
||||
"reference": "cb3ea134d4d3729e7857737d5f320cce9caf4d32",
|
||||
"shasum": ""
|
||||
},
|
||||
"require": {
|
||||
"ext-ctype": "*",
|
||||
"ext-filter": "*",
|
||||
"php": ">=5.5.0"
|
||||
},
|
||||
"require-dev": {
|
||||
"doctrine/annotations": "1.2.*",
|
||||
"friendsofphp/php-cs-fixer": "^2.2",
|
||||
"phpdocumentor/phpdocumentor": "2.*",
|
||||
"phpunit/phpunit": "^4.8 || ^5.7",
|
||||
"zendframework/zend-eventmanager": "3.0.*",
|
||||
"zendframework/zend-i18n": "2.7.3",
|
||||
"zendframework/zend-serializer": "2.7.*"
|
||||
},
|
||||
"suggest": {
|
||||
"ext-mbstring": "Needed to send email in multibyte encoding charset",
|
||||
"hayageek/oauth2-yahoo": "Needed for Yahoo XOAUTH2 authentication",
|
||||
"league/oauth2-google": "Needed for Google XOAUTH2 authentication",
|
||||
"psr/log": "For optional PSR-3 debug logging",
|
||||
"stevenmaguire/oauth2-microsoft": "Needed for Microsoft XOAUTH2 authentication",
|
||||
"symfony/polyfill-mbstring": "To support UTF-8 if the Mbstring PHP extension is not enabled (^1.2)"
|
||||
},
|
||||
"type": "library",
|
||||
"autoload": {
|
||||
"psr-4": {
|
||||
"PHPMailer\\PHPMailer\\": "src/"
|
||||
}
|
||||
},
|
||||
"notification-url": "https://packagist.org/downloads/",
|
||||
"license": [
|
||||
"LGPL-2.1"
|
||||
],
|
||||
"authors": [
|
||||
{
|
||||
"name": "Jim Jagielski",
|
||||
"email": "jimjag@gmail.com"
|
||||
},
|
||||
{
|
||||
"name": "Marcus Bointon",
|
||||
"email": "phpmailer@synchromedia.co.uk"
|
||||
},
|
||||
{
|
||||
"name": "Andy Prevost",
|
||||
"email": "codeworxtech@users.sourceforge.net"
|
||||
},
|
||||
{
|
||||
"name": "Brent R. Matzelle"
|
||||
}
|
||||
],
|
||||
"description": "PHPMailer is a full-featured email creation and transfer class for PHP",
|
||||
"time": "2018-03-27T13:49:45+00:00"
|
||||
},
|
||||
{
|
||||
"name": "psr/http-message",
|
||||
"version": "1.0.1",
|
||||
"source": {
|
||||
"type": "git",
|
||||
"url": "https://github.com/php-fig/http-message.git",
|
||||
"reference": "f6561bf28d520154e4b0ec72be95418abe6d9363"
|
||||
},
|
||||
"dist": {
|
||||
"type": "zip",
|
||||
"url": "https://api.github.com/repos/php-fig/http-message/zipball/f6561bf28d520154e4b0ec72be95418abe6d9363",
|
||||
"reference": "f6561bf28d520154e4b0ec72be95418abe6d9363",
|
||||
"shasum": ""
|
||||
},
|
||||
"require": {
|
||||
"php": ">=5.3.0"
|
||||
},
|
||||
"type": "library",
|
||||
"extra": {
|
||||
"branch-alias": {
|
||||
"dev-master": "1.0.x-dev"
|
||||
}
|
||||
},
|
||||
"autoload": {
|
||||
"psr-4": {
|
||||
"Psr\\Http\\Message\\": "src/"
|
||||
}
|
||||
},
|
||||
"notification-url": "https://packagist.org/downloads/",
|
||||
"license": [
|
||||
"MIT"
|
||||
],
|
||||
"authors": [
|
||||
{
|
||||
"name": "PHP-FIG",
|
||||
"homepage": "http://www.php-fig.org/"
|
||||
}
|
||||
],
|
||||
"description": "Common interface for HTTP messages",
|
||||
"homepage": "https://github.com/php-fig/http-message",
|
||||
"keywords": [
|
||||
"http",
|
||||
"http-message",
|
||||
"psr",
|
||||
"psr-7",
|
||||
"request",
|
||||
"response"
|
||||
],
|
||||
"time": "2016-08-06T14:39:51+00:00"
|
||||
},
|
||||
{
|
||||
"name": "qcloud/cos-sdk-v5",
|
||||
"version": "v1.2.3",
|
||||
"source": {
|
||||
"type": "git",
|
||||
"url": "https://github.com/tencentyun/cos-php-sdk-v5.git",
|
||||
"reference": "50d99c6ebfa32d3715fc5736340ac904b7398c93"
|
||||
},
|
||||
"dist": {
|
||||
"type": "zip",
|
||||
"url": "https://api.github.com/repos/tencentyun/cos-php-sdk-v5/zipball/50d99c6ebfa32d3715fc5736340ac904b7398c93",
|
||||
"reference": "50d99c6ebfa32d3715fc5736340ac904b7398c93",
|
||||
"shasum": ""
|
||||
},
|
||||
"require": {
|
||||
"guzzle/guzzle": "~3.7",
|
||||
"php": ">=5.3.0"
|
||||
},
|
||||
"type": "library",
|
||||
"autoload": {
|
||||
"psr-0": {
|
||||
"Qcloud\\Cos\\": "src/"
|
||||
}
|
||||
},
|
||||
"notification-url": "https://packagist.org/downloads/",
|
||||
"license": [
|
||||
"MIT"
|
||||
],
|
||||
"authors": [
|
||||
{
|
||||
"name": "yaozongyou",
|
||||
"email": "yaozongyou@vip.qq.com"
|
||||
},
|
||||
{
|
||||
"name": "lewzylu",
|
||||
"email": "327874225@qq.com"
|
||||
}
|
||||
],
|
||||
"description": "PHP SDK for QCloud COS",
|
||||
"keywords": [
|
||||
"cos",
|
||||
"php",
|
||||
"qcloud"
|
||||
],
|
||||
"time": "2018-05-28T08:35:28+00:00"
|
||||
},
|
||||
{
|
||||
"name": "qiniu/php-sdk",
|
||||
"version": "v7.2.6",
|
||||
"source": {
|
||||
"type": "git",
|
||||
"url": "https://github.com/qiniu/php-sdk.git",
|
||||
"reference": "305ce1c1c0c71f794661fe45a96facf61ef96c5d"
|
||||
},
|
||||
"dist": {
|
||||
"type": "zip",
|
||||
"url": "https://api.github.com/repos/qiniu/php-sdk/zipball/305ce1c1c0c71f794661fe45a96facf61ef96c5d",
|
||||
"reference": "305ce1c1c0c71f794661fe45a96facf61ef96c5d",
|
||||
"shasum": ""
|
||||
},
|
||||
"require": {
|
||||
"php": ">=5.3.3"
|
||||
},
|
||||
"require-dev": {
|
||||
"phpunit/phpunit": "~4.0",
|
||||
"squizlabs/php_codesniffer": "~2.3"
|
||||
},
|
||||
"type": "library",
|
||||
"autoload": {
|
||||
"psr-4": {
|
||||
"Qiniu\\": "src/Qiniu"
|
||||
},
|
||||
"files": [
|
||||
"src/Qiniu/functions.php"
|
||||
]
|
||||
},
|
||||
"notification-url": "https://packagist.org/downloads/",
|
||||
"license": [
|
||||
"MIT"
|
||||
],
|
||||
"authors": [
|
||||
{
|
||||
"name": "Qiniu",
|
||||
"email": "sdk@qiniu.com",
|
||||
"homepage": "http://www.qiniu.com"
|
||||
}
|
||||
],
|
||||
"description": "Qiniu Resource (Cloud) Storage SDK for PHP",
|
||||
"homepage": "http://developer.qiniu.com/",
|
||||
"keywords": [
|
||||
"cloud",
|
||||
"qiniu",
|
||||
"sdk",
|
||||
"storage"
|
||||
],
|
||||
"time": "2018-05-18T04:37:29+00:00"
|
||||
},
|
||||
{
|
||||
"name": "symfony/event-dispatcher",
|
||||
"version": "v2.8.42",
|
||||
"source": {
|
||||
"type": "git",
|
||||
"url": "https://github.com/symfony/event-dispatcher.git",
|
||||
"reference": "9b69aad7d4c086dc94ebade2d5eb9145da5dac8c"
|
||||
},
|
||||
"dist": {
|
||||
"type": "zip",
|
||||
"url": "https://api.github.com/repos/symfony/event-dispatcher/zipball/9b69aad7d4c086dc94ebade2d5eb9145da5dac8c",
|
||||
"reference": "9b69aad7d4c086dc94ebade2d5eb9145da5dac8c",
|
||||
"shasum": ""
|
||||
},
|
||||
"require": {
|
||||
"php": ">=5.3.9"
|
||||
},
|
||||
"require-dev": {
|
||||
"psr/log": "~1.0",
|
||||
"symfony/config": "^2.0.5|~3.0.0",
|
||||
"symfony/dependency-injection": "~2.6|~3.0.0",
|
||||
"symfony/expression-language": "~2.6|~3.0.0",
|
||||
"symfony/stopwatch": "~2.3|~3.0.0"
|
||||
},
|
||||
"suggest": {
|
||||
"symfony/dependency-injection": "",
|
||||
"symfony/http-kernel": ""
|
||||
},
|
||||
"type": "library",
|
||||
"extra": {
|
||||
"branch-alias": {
|
||||
"dev-master": "2.8-dev"
|
||||
}
|
||||
},
|
||||
"autoload": {
|
||||
"psr-4": {
|
||||
"Symfony\\Component\\EventDispatcher\\": ""
|
||||
},
|
||||
"exclude-from-classmap": [
|
||||
"/Tests/"
|
||||
]
|
||||
},
|
||||
"notification-url": "https://packagist.org/downloads/",
|
||||
"license": [
|
||||
"MIT"
|
||||
],
|
||||
"authors": [
|
||||
{
|
||||
"name": "Fabien Potencier",
|
||||
"email": "fabien@symfony.com"
|
||||
},
|
||||
{
|
||||
"name": "Symfony Community",
|
||||
"homepage": "https://symfony.com/contributors"
|
||||
}
|
||||
],
|
||||
"description": "Symfony EventDispatcher Component",
|
||||
"homepage": "https://symfony.com",
|
||||
"time": "2018-04-06T07:35:03+00:00"
|
||||
},
|
||||
{
|
||||
"name": "topthink/framework",
|
||||
"version": "v5.1.19",
|
||||
"source": {
|
||||
"type": "git",
|
||||
"url": "https://github.com/top-think/framework.git",
|
||||
"reference": "3a0fea90ed2a99b181ce503090e08be1171ed091"
|
||||
},
|
||||
"dist": {
|
||||
"type": "zip",
|
||||
"url": "https://api.github.com/repos/top-think/framework/zipball/3a0fea90ed2a99b181ce503090e08be1171ed091",
|
||||
"reference": "3a0fea90ed2a99b181ce503090e08be1171ed091",
|
||||
"shasum": ""
|
||||
},
|
||||
"require": {
|
||||
"php": ">=5.6.0",
|
||||
"topthink/think-installer": "2.*"
|
||||
},
|
||||
"require-dev": {
|
||||
"johnkary/phpunit-speedtrap": "^1.0",
|
||||
"mikey179/vfsstream": "~1.6",
|
||||
"phpdocumentor/reflection-docblock": "^2.0",
|
||||
"phploc/phploc": "2.*",
|
||||
"phpunit/phpunit": "^5.0|^6.0",
|
||||
"sebastian/phpcpd": "2.*",
|
||||
"squizlabs/php_codesniffer": "2.*"
|
||||
},
|
||||
"type": "think-framework",
|
||||
"notification-url": "https://packagist.org/downloads/",
|
||||
"license": [
|
||||
"Apache-2.0"
|
||||
],
|
||||
"authors": [
|
||||
{
|
||||
"name": "liu21st",
|
||||
"email": "liu21st@gmail.com"
|
||||
},
|
||||
{
|
||||
"name": "yunwuxin",
|
||||
"email": "448901948@qq.com"
|
||||
}
|
||||
],
|
||||
"description": "the new thinkphp framework",
|
||||
"homepage": "http://thinkphp.cn/",
|
||||
"keywords": [
|
||||
"framework",
|
||||
"orm",
|
||||
"thinkphp"
|
||||
],
|
||||
"time": "2018-07-13T14:10:28+00:00"
|
||||
},
|
||||
{
|
||||
"name": "topthink/think-captcha",
|
||||
"version": "v2.0.2",
|
||||
"source": {
|
||||
"type": "git",
|
||||
"url": "https://github.com/top-think/think-captcha.git",
|
||||
"reference": "54c8a51552f99ff9ea89ea9c272383a8f738ceee"
|
||||
},
|
||||
"dist": {
|
||||
"type": "zip",
|
||||
"url": "https://api.github.com/repos/top-think/think-captcha/zipball/54c8a51552f99ff9ea89ea9c272383a8f738ceee",
|
||||
"reference": "54c8a51552f99ff9ea89ea9c272383a8f738ceee",
|
||||
"shasum": ""
|
||||
},
|
||||
"require": {
|
||||
"topthink/framework": "5.1.*"
|
||||
},
|
||||
"type": "library",
|
||||
"autoload": {
|
||||
"psr-4": {
|
||||
"think\\captcha\\": "src/"
|
||||
},
|
||||
"files": [
|
||||
"src/helper.php"
|
||||
]
|
||||
},
|
||||
"notification-url": "https://packagist.org/downloads/",
|
||||
"license": [
|
||||
"Apache-2.0"
|
||||
],
|
||||
"authors": [
|
||||
{
|
||||
"name": "yunwuxin",
|
||||
"email": "448901948@qq.com"
|
||||
}
|
||||
],
|
||||
"description": "captcha package for thinkphp5",
|
||||
"time": "2017-12-31T16:37:49+00:00"
|
||||
},
|
||||
{
|
||||
"name": "topthink/think-image",
|
||||
"version": "v1.0.7",
|
||||
"source": {
|
||||
"type": "git",
|
||||
"url": "https://github.com/top-think/think-image.git",
|
||||
"reference": "8586cf47f117481c6d415b20f7dedf62e79d5512"
|
||||
},
|
||||
"dist": {
|
||||
"type": "zip",
|
||||
"url": "https://api.github.com/repos/top-think/think-image/zipball/8586cf47f117481c6d415b20f7dedf62e79d5512",
|
||||
"reference": "8586cf47f117481c6d415b20f7dedf62e79d5512",
|
||||
"shasum": ""
|
||||
},
|
||||
"require": {
|
||||
"ext-gd": "*"
|
||||
},
|
||||
"require-dev": {
|
||||
"phpunit/phpunit": "4.8.*",
|
||||
"topthink/framework": "^5.0"
|
||||
},
|
||||
"type": "library",
|
||||
"autoload": {
|
||||
"psr-4": {
|
||||
"think\\": "src"
|
||||
}
|
||||
},
|
||||
"notification-url": "https://packagist.org/downloads/",
|
||||
"license": [
|
||||
"Apache-2.0"
|
||||
],
|
||||
"authors": [
|
||||
{
|
||||
"name": "yunwuxin",
|
||||
"email": "448901948@qq.com"
|
||||
}
|
||||
],
|
||||
"description": "The ThinkPHP5 Image Package",
|
||||
"time": "2016-09-29T06:05:43+00:00"
|
||||
},
|
||||
{
|
||||
"name": "topthink/think-installer",
|
||||
"version": "v2.0.0",
|
||||
"source": {
|
||||
"type": "git",
|
||||
"url": "https://github.com/top-think/think-installer.git",
|
||||
"reference": "f5400a12c60e513911aef41fe443fa6920952675"
|
||||
},
|
||||
"dist": {
|
||||
"type": "zip",
|
||||
"url": "https://api.github.com/repos/top-think/think-installer/zipball/f5400a12c60e513911aef41fe443fa6920952675",
|
||||
"reference": "f5400a12c60e513911aef41fe443fa6920952675",
|
||||
"shasum": ""
|
||||
},
|
||||
"require": {
|
||||
"composer-plugin-api": "^1.0"
|
||||
},
|
||||
"require-dev": {
|
||||
"composer/composer": "1.0.*@dev"
|
||||
},
|
||||
"type": "composer-plugin",
|
||||
"extra": {
|
||||
"class": "think\\composer\\Plugin"
|
||||
},
|
||||
"autoload": {
|
||||
"psr-4": {
|
||||
"think\\composer\\": "src"
|
||||
}
|
||||
},
|
||||
"notification-url": "https://packagist.org/downloads/",
|
||||
"license": [
|
||||
"Apache-2.0"
|
||||
],
|
||||
"authors": [
|
||||
{
|
||||
"name": "yunwuxin",
|
||||
"email": "448901948@qq.com"
|
||||
}
|
||||
],
|
||||
"time": "2018-05-11T06:45:42+00:00"
|
||||
},
|
||||
{
|
||||
"name": "upyun/sdk",
|
||||
"version": "3.3.0",
|
||||
"source": {
|
||||
"type": "git",
|
||||
"url": "https://github.com/upyun/php-sdk.git",
|
||||
"reference": "1a2dd5ae31047956c733aef0f764f3a527d30628"
|
||||
},
|
||||
"dist": {
|
||||
"type": "zip",
|
||||
"url": "https://api.github.com/repos/upyun/php-sdk/zipball/1a2dd5ae31047956c733aef0f764f3a527d30628",
|
||||
"reference": "1a2dd5ae31047956c733aef0f764f3a527d30628",
|
||||
"shasum": ""
|
||||
},
|
||||
"require": {
|
||||
"ext-curl": "*",
|
||||
"guzzlehttp/guzzle": "~6.0",
|
||||
"php": ">=5.5.0"
|
||||
},
|
||||
"require-dev": {
|
||||
"consolidation/robo": "^1.0",
|
||||
"phpdocumentor/phpdocumentor": "^2.9",
|
||||
"phpunit/phpunit": "~4.0"
|
||||
},
|
||||
"type": "library",
|
||||
"autoload": {
|
||||
"psr-4": {
|
||||
"Upyun\\": "src/Upyun/"
|
||||
}
|
||||
},
|
||||
"notification-url": "https://packagist.org/downloads/",
|
||||
"license": [
|
||||
"MIT"
|
||||
],
|
||||
"authors": [
|
||||
{
|
||||
"name": "totoleo",
|
||||
"email": "totoleo@163.com"
|
||||
},
|
||||
{
|
||||
"name": "lfeng",
|
||||
"email": "bonevv@gmail.com"
|
||||
},
|
||||
{
|
||||
"name": "lvtongda",
|
||||
"email": "riyao.lyu@gmail.com"
|
||||
},
|
||||
{
|
||||
"name": "sabakugaara",
|
||||
"email": "senellise@gmail.com"
|
||||
}
|
||||
],
|
||||
"description": "UPYUN sdk for php",
|
||||
"homepage": "https://github.com/upyun/php-sdk/",
|
||||
"keywords": [
|
||||
"sdk",
|
||||
"upyun"
|
||||
],
|
||||
"time": "2017-11-12T09:17:42+00:00"
|
||||
}
|
||||
],
|
||||
"packages-dev": [],
|
||||
"aliases": [],
|
||||
"minimum-stability": "stable",
|
||||
"stability-flags": [],
|
||||
"prefer-stable": false,
|
||||
"prefer-lowest": false,
|
||||
"platform": {
|
||||
"php": ">=5.6.0"
|
||||
},
|
||||
"platform-dev": []
|
||||
}
|
146
config/app.php
Normal file
@ -0,0 +1,146 @@
|
||||
<?php
|
||||
// +----------------------------------------------------------------------
|
||||
// | ThinkPHP [ WE CAN DO IT JUST THINK ]
|
||||
// +----------------------------------------------------------------------
|
||||
// | Copyright (c) 2006~2018 http://thinkphp.cn All rights reserved.
|
||||
// +----------------------------------------------------------------------
|
||||
// | Licensed ( http://www.apache.org/licenses/LICENSE-2.0 )
|
||||
// +----------------------------------------------------------------------
|
||||
// | Author: liu21st <liu21st@gmail.com>
|
||||
// +----------------------------------------------------------------------
|
||||
|
||||
// +----------------------------------------------------------------------
|
||||
// | 应用设置
|
||||
// +----------------------------------------------------------------------
|
||||
|
||||
return [
|
||||
// 应用名称
|
||||
'app_name' => 'Lsky Pro',
|
||||
// 应用地址
|
||||
'app_host' => '',
|
||||
// 应用调试模式
|
||||
'app_debug' => false,
|
||||
// 应用Trace
|
||||
'app_trace' => false,
|
||||
// 是否支持多模块
|
||||
'app_multi_module' => true,
|
||||
// 入口自动绑定模块
|
||||
'auto_bind_module' => false,
|
||||
// 注册的根命名空间
|
||||
'root_namespace' => ['app'],
|
||||
// 默认输出类型
|
||||
'default_return_type' => 'html',
|
||||
// 默认AJAX 数据返回格式,可选json xml ...
|
||||
'default_ajax_return' => 'json',
|
||||
// 默认JSONP格式返回的处理方法
|
||||
'default_jsonp_handler' => 'jsonpReturn',
|
||||
// 默认JSONP处理方法
|
||||
'var_jsonp_handler' => 'callback',
|
||||
// 默认时区
|
||||
'default_timezone' => 'Asia/Shanghai',
|
||||
// 是否开启多语言
|
||||
'lang_switch_on' => false,
|
||||
// 默认全局过滤方法 用逗号分隔多个
|
||||
'default_filter' => '',
|
||||
// 默认语言
|
||||
'default_lang' => 'zh-cn',
|
||||
// 应用类库后缀
|
||||
'class_suffix' => false,
|
||||
// 控制器类后缀
|
||||
'controller_suffix' => false,
|
||||
|
||||
// +----------------------------------------------------------------------
|
||||
// | 模块设置
|
||||
// +----------------------------------------------------------------------
|
||||
|
||||
// 默认模块名
|
||||
'default_module' => 'index',
|
||||
// 禁止访问模块
|
||||
'deny_module_list' => ['common'],
|
||||
// 默认控制器名
|
||||
'default_controller' => 'Index',
|
||||
// 默认操作名
|
||||
'default_action' => 'index',
|
||||
// 默认验证器
|
||||
'default_validate' => '',
|
||||
// 默认的空模块名
|
||||
'empty_module' => '',
|
||||
// 默认的空控制器名
|
||||
'empty_controller' => 'Error',
|
||||
// 操作方法前缀
|
||||
'use_action_prefix' => false,
|
||||
// 操作方法后缀
|
||||
'action_suffix' => '',
|
||||
// 自动搜索控制器
|
||||
'controller_auto_search' => true,
|
||||
|
||||
// +----------------------------------------------------------------------
|
||||
// | URL设置
|
||||
// +----------------------------------------------------------------------
|
||||
|
||||
// PATHINFO变量名 用于兼容模式
|
||||
'var_pathinfo' => 's',
|
||||
// 兼容PATH_INFO获取
|
||||
'pathinfo_fetch' => ['ORIG_PATH_INFO', 'REDIRECT_PATH_INFO', 'REDIRECT_URL'],
|
||||
// pathinfo分隔符
|
||||
'pathinfo_depr' => '/',
|
||||
// HTTPS代理标识
|
||||
'https_agent_name' => '',
|
||||
// IP代理获取标识
|
||||
'http_agent_ip' => 'X-REAL-IP',
|
||||
// URL伪静态后缀
|
||||
'url_html_suffix' => 'html',
|
||||
// URL普通方式参数 用于自动生成
|
||||
'url_common_param' => true,
|
||||
// URL参数方式 0 按名称成对解析 1 按顺序解析
|
||||
'url_param_type' => 0,
|
||||
// 是否开启路由延迟解析
|
||||
'url_lazy_route' => false,
|
||||
// 是否强制使用路由
|
||||
'url_route_must' => false,
|
||||
// 合并路由规则
|
||||
'route_rule_merge' => false,
|
||||
// 路由是否完全匹配
|
||||
'route_complete_match' => true,
|
||||
// 使用注解路由
|
||||
'route_annotation' => false,
|
||||
// 域名根,如thinkphp.cn
|
||||
'url_domain_root' => '',
|
||||
// 是否自动转换URL中的控制器和操作名
|
||||
'url_convert' => false,
|
||||
// 默认的访问控制器层
|
||||
'url_controller_layer' => 'controller',
|
||||
// 表单请求类型伪装变量
|
||||
'var_method' => '_method',
|
||||
// 表单ajax伪装变量
|
||||
'var_ajax' => '_ajax',
|
||||
// 表单pjax伪装变量
|
||||
'var_pjax' => '_pjax',
|
||||
// 是否开启请求缓存 true自动缓存 支持设置请求缓存规则
|
||||
'request_cache' => false,
|
||||
// 请求缓存有效期
|
||||
'request_cache_expire' => null,
|
||||
// 全局请求缓存排除规则
|
||||
'request_cache_except' => [],
|
||||
// 是否开启路由缓存
|
||||
'route_check_cache' => false,
|
||||
// 路由缓存的Key自定义设置(闭包),默认为当前URL和请求类型的md5
|
||||
'route_check_cache_key' => '',
|
||||
// 路由缓存类型及参数
|
||||
'route_cache_option' => [],
|
||||
|
||||
// 默认跳转页面对应的模板文件
|
||||
'dispatch_success_tmpl' => Env::get('think_path') . 'tpl/dispatch_jump.tpl',
|
||||
'dispatch_error_tmpl' => Env::get('think_path') . 'tpl/dispatch_jump.tpl',
|
||||
|
||||
// 异常页面的模板文件
|
||||
'exception_tmpl' => Env::get('think_path') . 'tpl/think_exception.tpl',
|
||||
|
||||
// 错误显示信息,非调试模式有效
|
||||
'error_message' => '页面错误!请稍后再试~',
|
||||
// 显示错误信息
|
||||
'show_error_msg' => false,
|
||||
// 异常处理handle类 留空使用 \think\exception\Handle
|
||||
'exception_handle' => '',
|
||||
|
||||
];
|
25
config/cache.php
Normal file
@ -0,0 +1,25 @@
|
||||
<?php
|
||||
// +----------------------------------------------------------------------
|
||||
// | ThinkPHP [ WE CAN DO IT JUST THINK ]
|
||||
// +----------------------------------------------------------------------
|
||||
// | Copyright (c) 2006~2018 http://thinkphp.cn All rights reserved.
|
||||
// +----------------------------------------------------------------------
|
||||
// | Licensed ( http://www.apache.org/licenses/LICENSE-2.0 )
|
||||
// +----------------------------------------------------------------------
|
||||
// | Author: liu21st <liu21st@gmail.com>
|
||||
// +----------------------------------------------------------------------
|
||||
|
||||
// +----------------------------------------------------------------------
|
||||
// | 缓存设置
|
||||
// +----------------------------------------------------------------------
|
||||
|
||||
return [
|
||||
// 驱动方式
|
||||
'type' => 'File',
|
||||
// 缓存保存目录
|
||||
'path' => '',
|
||||
// 缓存前缀
|
||||
'prefix' => '',
|
||||
// 缓存有效期 0表示永久缓存
|
||||
'expire' => 0,
|
||||
];
|
19
config/console.php
Normal file
@ -0,0 +1,19 @@
|
||||
<?php
|
||||
// +----------------------------------------------------------------------
|
||||
// | ThinkPHP [ WE CAN DO IT JUST THINK ]
|
||||
// +----------------------------------------------------------------------
|
||||
// | Copyright (c) 2006~2018 http://thinkphp.cn All rights reserved.
|
||||
// +----------------------------------------------------------------------
|
||||
// | Licensed ( http://www.apache.org/licenses/LICENSE-2.0 )
|
||||
// +----------------------------------------------------------------------
|
||||
// | Author: liu21st <liu21st@gmail.com>
|
||||
// +----------------------------------------------------------------------
|
||||
|
||||
// +----------------------------------------------------------------------
|
||||
// | 控制台配置
|
||||
// +----------------------------------------------------------------------
|
||||
return [
|
||||
'name' => 'Think Console',
|
||||
'version' => '0.1',
|
||||
'user' => null,
|
||||
];
|
30
config/cookie.php
Normal file
@ -0,0 +1,30 @@
|
||||
<?php
|
||||
// +----------------------------------------------------------------------
|
||||
// | ThinkPHP [ WE CAN DO IT JUST THINK ]
|
||||
// +----------------------------------------------------------------------
|
||||
// | Copyright (c) 2006~2018 http://thinkphp.cn All rights reserved.
|
||||
// +----------------------------------------------------------------------
|
||||
// | Licensed ( http://www.apache.org/licenses/LICENSE-2.0 )
|
||||
// +----------------------------------------------------------------------
|
||||
// | Author: liu21st <liu21st@gmail.com>
|
||||
// +----------------------------------------------------------------------
|
||||
|
||||
// +----------------------------------------------------------------------
|
||||
// | Cookie设置
|
||||
// +----------------------------------------------------------------------
|
||||
return [
|
||||
// cookie 名称前缀
|
||||
'prefix' => '',
|
||||
// cookie 保存时间
|
||||
'expire' => 0,
|
||||
// cookie 保存路径
|
||||
'path' => '/',
|
||||
// cookie 有效域名
|
||||
'domain' => '',
|
||||
// cookie 启用安全传输
|
||||
'secure' => false,
|
||||
// httponly设置
|
||||
'httponly' => '',
|
||||
// 是否使用 setcookie
|
||||
'setcookie' => true,
|
||||
];
|
63
config/database.php
Normal file
@ -0,0 +1,63 @@
|
||||
<?php
|
||||
// +----------------------------------------------------------------------
|
||||
// | ThinkPHP [ WE CAN DO IT JUST THINK ]
|
||||
// +----------------------------------------------------------------------
|
||||
// | Copyright (c) 2006~2018 http://thinkphp.cn All rights reserved.
|
||||
// +----------------------------------------------------------------------
|
||||
// | Licensed ( http://www.apache.org/licenses/LICENSE-2.0 )
|
||||
// +----------------------------------------------------------------------
|
||||
// | Author: liu21st <liu21st@gmail.com>
|
||||
// +----------------------------------------------------------------------
|
||||
|
||||
return [
|
||||
// 数据库类型
|
||||
'type' => 'mysql',
|
||||
// 服务器地址
|
||||
'hostname' => '{hostname}',
|
||||
// 数据库名
|
||||
'database' => '{database}',
|
||||
// 用户名
|
||||
'username' => '{username}',
|
||||
// 密码
|
||||
'password' => '{password}',
|
||||
// 端口
|
||||
'hostport' => '{hostport}',
|
||||
// 连接dsn
|
||||
'dsn' => '',
|
||||
// 数据库连接参数
|
||||
'params' => [],
|
||||
// 数据库编码默认采用utf8
|
||||
'charset' => 'utf8',
|
||||
// 数据库表前缀
|
||||
'prefix' => 'lsky_',
|
||||
// 数据库调试模式
|
||||
'debug' => true,
|
||||
// 数据库部署方式:0 集中式(单一服务器),1 分布式(主从服务器)
|
||||
'deploy' => 0,
|
||||
// 数据库读写是否分离 主从式有效
|
||||
'rw_separate' => false,
|
||||
// 读写分离后 主服务器数量
|
||||
'master_num' => 1,
|
||||
// 指定从服务器序号
|
||||
'slave_no' => '',
|
||||
// 自动读取主库数据
|
||||
'read_master' => false,
|
||||
// 是否严格检查字段是否存在
|
||||
'fields_strict' => true,
|
||||
// 数据集返回类型
|
||||
'resultset_type' => 'array',
|
||||
// 自动写入时间戳字段
|
||||
'auto_timestamp' => true,
|
||||
// 时间字段取出后的默认时间格式
|
||||
'datetime_format' => 'Y-m-d H:i:s',
|
||||
// 是否需要进行SQL性能分析
|
||||
'sql_explain' => false,
|
||||
// Builder类
|
||||
'builder' => '',
|
||||
// Query类
|
||||
'query' => '\\think\\db\\Query',
|
||||
// 是否需要断线重连
|
||||
'break_reconnect' => false,
|
||||
// 断线标识字符串
|
||||
'break_match_str' => [],
|
||||
];
|
30
config/log.php
Normal file
@ -0,0 +1,30 @@
|
||||
<?php
|
||||
// +----------------------------------------------------------------------
|
||||
// | ThinkPHP [ WE CAN DO IT JUST THINK ]
|
||||
// +----------------------------------------------------------------------
|
||||
// | Copyright (c) 2006~2018 http://thinkphp.cn All rights reserved.
|
||||
// +----------------------------------------------------------------------
|
||||
// | Licensed ( http://www.apache.org/licenses/LICENSE-2.0 )
|
||||
// +----------------------------------------------------------------------
|
||||
// | Author: liu21st <liu21st@gmail.com>
|
||||
// +----------------------------------------------------------------------
|
||||
|
||||
// +----------------------------------------------------------------------
|
||||
// | 日志设置
|
||||
// +----------------------------------------------------------------------
|
||||
return [
|
||||
// 日志记录方式,内置 file socket 支持扩展
|
||||
'type' => 'File',
|
||||
// 日志保存目录
|
||||
'path' => '',
|
||||
// 日志记录级别
|
||||
'level' => [],
|
||||
// 单文件日志写入
|
||||
'single' => false,
|
||||
// 独立日志级别
|
||||
'apart_level' => [],
|
||||
// 最大日志文件数量
|
||||
'max_files' => 0,
|
||||
// 是否关闭日志写入
|
||||
'close' => false,
|
||||
];
|
17
config/middleware.php
Normal file
@ -0,0 +1,17 @@
|
||||
<?php
|
||||
// +----------------------------------------------------------------------
|
||||
// | ThinkPHP [ WE CAN DO IT JUST THINK ]
|
||||
// +----------------------------------------------------------------------
|
||||
// | Copyright (c) 2006~2018 http://thinkphp.cn All rights reserved.
|
||||
// +----------------------------------------------------------------------
|
||||
// | Licensed ( http://www.apache.org/licenses/LICENSE-2.0 )
|
||||
// +----------------------------------------------------------------------
|
||||
// | Author: liu21st <liu21st@gmail.com>
|
||||
// +----------------------------------------------------------------------
|
||||
|
||||
// +----------------------------------------------------------------------
|
||||
// | 中间件配置
|
||||
// +----------------------------------------------------------------------
|
||||
return [
|
||||
'auth' => app\http\middleware\Auth::class
|
||||
];
|
26
config/session.php
Normal file
@ -0,0 +1,26 @@
|
||||
<?php
|
||||
// +----------------------------------------------------------------------
|
||||
// | ThinkPHP [ WE CAN DO IT JUST THINK ]
|
||||
// +----------------------------------------------------------------------
|
||||
// | Copyright (c) 2006~2018 http://thinkphp.cn All rights reserved.
|
||||
// +----------------------------------------------------------------------
|
||||
// | Licensed ( http://www.apache.org/licenses/LICENSE-2.0 )
|
||||
// +----------------------------------------------------------------------
|
||||
// | Author: liu21st <liu21st@gmail.com>
|
||||
// +----------------------------------------------------------------------
|
||||
|
||||
// +----------------------------------------------------------------------
|
||||
// | 会话设置
|
||||
// +----------------------------------------------------------------------
|
||||
|
||||
return [
|
||||
'id' => '',
|
||||
// SESSION_ID的提交变量,解决flash上传跨域
|
||||
'var_session_id' => '',
|
||||
// SESSION 前缀
|
||||
'prefix' => 'think',
|
||||
// 驱动方式 支持redis memcache memcached
|
||||
'type' => '',
|
||||
// 是否自动开启 SESSION
|
||||
'auto_start' => true,
|
||||
];
|
35
config/template.php
Normal file
@ -0,0 +1,35 @@
|
||||
<?php
|
||||
// +----------------------------------------------------------------------
|
||||
// | ThinkPHP [ WE CAN DO IT JUST THINK ]
|
||||
// +----------------------------------------------------------------------
|
||||
// | Copyright (c) 2006~2018 http://thinkphp.cn All rights reserved.
|
||||
// +----------------------------------------------------------------------
|
||||
// | Licensed ( http://www.apache.org/licenses/LICENSE-2.0 )
|
||||
// +----------------------------------------------------------------------
|
||||
// | Author: liu21st <liu21st@gmail.com>
|
||||
// +----------------------------------------------------------------------
|
||||
|
||||
// +----------------------------------------------------------------------
|
||||
// | 模板设置
|
||||
// +----------------------------------------------------------------------
|
||||
|
||||
return [
|
||||
// 模板引擎类型 支持 php think 支持扩展
|
||||
'type' => 'Think',
|
||||
// 默认模板渲染规则 1 解析为小写+下划线 2 全部转换小写 3 保持操作方法
|
||||
'auto_rule' => 1,
|
||||
// 模板路径
|
||||
'view_path' => '',
|
||||
// 模板后缀
|
||||
'view_suffix' => 'html',
|
||||
// 模板文件名分隔符
|
||||
'view_depr' => DIRECTORY_SEPARATOR,
|
||||
// 模板引擎普通标签开始标记
|
||||
'tpl_begin' => '{',
|
||||
// 模板引擎普通标签结束标记
|
||||
'tpl_end' => '}',
|
||||
// 标签库标签开始标记
|
||||
'taglib_begin' => '{',
|
||||
// 标签库标签结束标记
|
||||
'taglib_end' => '}',
|
||||
];
|
18
config/trace.php
Normal file
@ -0,0 +1,18 @@
|
||||
<?php
|
||||
// +----------------------------------------------------------------------
|
||||
// | ThinkPHP [ WE CAN DO IT JUST THINK ]
|
||||
// +----------------------------------------------------------------------
|
||||
// | Copyright (c) 2006~2018 http://thinkphp.cn All rights reserved.
|
||||
// +----------------------------------------------------------------------
|
||||
// | Licensed ( http://www.apache.org/licenses/LICENSE-2.0 )
|
||||
// +----------------------------------------------------------------------
|
||||
// | Author: liu21st <liu21st@gmail.com>
|
||||
// +----------------------------------------------------------------------
|
||||
|
||||
// +----------------------------------------------------------------------
|
||||
// | Trace设置 开启 app_trace 后 有效
|
||||
// +----------------------------------------------------------------------
|
||||
return [
|
||||
// 内置Html Console 支持扩展
|
||||
'type' => 'Html',
|
||||
];
|
50
extend/strategy/Driver.php
Normal file
@ -0,0 +1,50 @@
|
||||
<?php
|
||||
/**
|
||||
* User: Wisp X
|
||||
* Date: 2018/9/29
|
||||
* Time: 下午2:17
|
||||
* Link: http://gitee.com/wispx
|
||||
*/
|
||||
|
||||
namespace strategy;
|
||||
|
||||
/**
|
||||
* 对象储存接口
|
||||
*
|
||||
* Interface Driver
|
||||
* @package strategy
|
||||
*/
|
||||
interface Driver
|
||||
{
|
||||
/**
|
||||
* 创建文件
|
||||
*
|
||||
* @param $pathname
|
||||
* @param $file
|
||||
* @return mixed
|
||||
*/
|
||||
public function create($pathname, $file);
|
||||
|
||||
/**
|
||||
* 删除单个文件
|
||||
*
|
||||
* @param $pathname
|
||||
* @return mixed
|
||||
*/
|
||||
public function delete($pathname);
|
||||
|
||||
/**
|
||||
* 删除多个文件
|
||||
*
|
||||
* @param array $list 一维数组
|
||||
* @return mixed
|
||||
*/
|
||||
public function deletes(array $list);
|
||||
|
||||
/**
|
||||
* 获取出错信息
|
||||
*
|
||||
* @return mixed
|
||||
*/
|
||||
public function getError();
|
||||
}
|
139
extend/strategy/driver/Cos.php
Normal file
@ -0,0 +1,139 @@
|
||||
<?php
|
||||
/**
|
||||
* User: Wisp X
|
||||
* Date: 2018/9/30
|
||||
* Time: 下午4:28
|
||||
* Link: http://gitee.com/wispx
|
||||
*/
|
||||
|
||||
namespace strategy\driver;
|
||||
|
||||
use Qcloud\Cos\Client;
|
||||
use strategy\Driver;
|
||||
|
||||
/**
|
||||
* 腾讯云COS储存驱动
|
||||
*
|
||||
* Class Cos
|
||||
* @package strategy\driver
|
||||
*/
|
||||
class Cos implements Driver
|
||||
{
|
||||
/**
|
||||
* 当前储存策略参数
|
||||
*
|
||||
* @var array
|
||||
*/
|
||||
protected $options = [];
|
||||
|
||||
/**
|
||||
* 错误信息
|
||||
*
|
||||
* @var null
|
||||
*/
|
||||
protected $error = null;
|
||||
|
||||
/**
|
||||
* Cos实例
|
||||
*
|
||||
* @var null
|
||||
*/
|
||||
protected $cos = null;
|
||||
|
||||
/**
|
||||
* Cos constructor.
|
||||
*
|
||||
* @param array $options
|
||||
*/
|
||||
public function __construct($options = [])
|
||||
{
|
||||
$this->options = $options;
|
||||
try {
|
||||
$this->cos = new Client([
|
||||
'region' => $this->options['cos_region'],
|
||||
'credentials' => [
|
||||
'secretId' => $this->options['cos_secret_id'],
|
||||
'secretKey' => $this->options['cos_secret_key'],
|
||||
],
|
||||
]);
|
||||
} catch (\Exception $e) {
|
||||
$this->error = $e->getMessage();
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* 创建文件
|
||||
*
|
||||
* @param $pathname
|
||||
* @param $file
|
||||
*
|
||||
* @return bool
|
||||
*/
|
||||
public function create($pathname, $file)
|
||||
{
|
||||
try {
|
||||
$this->cos->putObject(array(
|
||||
'Bucket' => $this->options['cos_bucket'],
|
||||
'Key' => $pathname,
|
||||
'Body' => fopen($file, 'rb')
|
||||
));
|
||||
} catch (\Exception $e) {
|
||||
$this->error = $e->getMessage();
|
||||
return false;
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
/**
|
||||
* 删除文件
|
||||
*
|
||||
* @param $pathname
|
||||
*
|
||||
* @return bool
|
||||
*/
|
||||
public function delete($pathname)
|
||||
{
|
||||
try {
|
||||
$this->cos->deleteObject([
|
||||
'Bucket' => $this->options['cos_bucket'],
|
||||
'Key' => $pathname,
|
||||
]);
|
||||
} catch (\Exception $e) {
|
||||
$this->error = $e->getMessage();
|
||||
return false;
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
/**
|
||||
* 删除多个文件
|
||||
*
|
||||
* @param array $list
|
||||
* @return bool|mixed
|
||||
*/
|
||||
public function deletes(array $list)
|
||||
{
|
||||
try {
|
||||
foreach ($list as $value) {
|
||||
if (is_string($value)) {
|
||||
$this->cos->deleteObject([
|
||||
'Bucket' => $this->options['cos_bucket'],
|
||||
'Key' => $value,
|
||||
]);
|
||||
}
|
||||
}
|
||||
} catch (\Exception $e) {
|
||||
$this->error = $e->getMessage();
|
||||
return false;
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
public function getError()
|
||||
{
|
||||
return 'Cos:' . $this->error;
|
||||
}
|
||||
}
|
130
extend/strategy/driver/Local.php
Normal file
@ -0,0 +1,130 @@
|
||||
<?php
|
||||
/**
|
||||
* User: Wisp X
|
||||
* Date: 2018/9/29
|
||||
* Time: 下午1:44
|
||||
* Link: http://gitee.com/wispx
|
||||
*/
|
||||
|
||||
namespace strategy\driver;
|
||||
|
||||
use strategy\Driver;
|
||||
|
||||
/**
|
||||
* 本地储存驱动
|
||||
*
|
||||
* Class Local
|
||||
* @package strategy\driver
|
||||
*/
|
||||
class Local implements Driver
|
||||
{
|
||||
/**
|
||||
* 根目录路径(结尾加斜杠)
|
||||
*/
|
||||
const ROOT_PATH = ROOT_PATH;
|
||||
|
||||
/**
|
||||
* 当前储存策略参数
|
||||
*
|
||||
* @var array
|
||||
*/
|
||||
protected $options = [];
|
||||
|
||||
/**
|
||||
* 错误信息
|
||||
*
|
||||
* @var null
|
||||
*/
|
||||
protected $error = null;
|
||||
|
||||
/**
|
||||
* Driver constructor.
|
||||
*
|
||||
* @param array $options
|
||||
*/
|
||||
public function __construct($options = [])
|
||||
{
|
||||
$this->options = $options;
|
||||
}
|
||||
|
||||
/**
|
||||
* 创建本地文件
|
||||
*
|
||||
* @param $pathname 文件路径加文件名
|
||||
* @param $file 文件资源路径
|
||||
*
|
||||
* @return bool
|
||||
*/
|
||||
public function create($pathname, $file)
|
||||
{
|
||||
$path = self::ROOT_PATH . dirname($pathname) . DIRECTORY_SEPARATOR;
|
||||
if (true === $this->checkPath($path)) {
|
||||
if (move_uploaded_file($file, $pathname)) {
|
||||
return true;
|
||||
}
|
||||
}
|
||||
$this->error = '文件移动失败';
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
/**
|
||||
* 删除本地文件
|
||||
*
|
||||
* @param $pathname 文件路径加文件名
|
||||
*
|
||||
* @return bool
|
||||
*/
|
||||
public function delete($pathname)
|
||||
{
|
||||
$delete = unlink(self::ROOT_PATH . ltrim($pathname, DIRECTORY_SEPARATOR));
|
||||
if (!$delete) {
|
||||
$this->error = '文件删除失败';
|
||||
}
|
||||
|
||||
return $delete;
|
||||
}
|
||||
|
||||
/**
|
||||
* 批量删除本地文件
|
||||
*
|
||||
* @param array $list
|
||||
* @return bool|mixed
|
||||
*/
|
||||
public function deletes(array $list)
|
||||
{
|
||||
foreach ($list as $value) {
|
||||
if (is_string($value)) {
|
||||
@unlink(self::ROOT_PATH . ltrim($value, DIRECTORY_SEPARATOR));
|
||||
}
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
/**
|
||||
* 检测目录是否可写,不存在则创建
|
||||
*
|
||||
* @param $path 路径
|
||||
*
|
||||
* @return bool
|
||||
*/
|
||||
protected function checkPath($path)
|
||||
{
|
||||
if (is_dir($path)) {
|
||||
return true;
|
||||
}
|
||||
|
||||
if (mkdir($path, 0755, true)) {
|
||||
return true;
|
||||
}
|
||||
$this->error = '目录[' . $path . ']无写入权限';
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
public function getError()
|
||||
{
|
||||
return 'Local:' . $this->error;
|
||||
}
|
||||
}
|
127
extend/strategy/driver/Oss.php
Normal file
@ -0,0 +1,127 @@
|
||||
<?php
|
||||
/**
|
||||
* User: Wisp X
|
||||
* Date: 2018/9/29
|
||||
* Time: 下午1:48
|
||||
* Link: http://gitee.com/wispx
|
||||
*/
|
||||
|
||||
namespace strategy\driver;
|
||||
|
||||
use OSS\Core\OssException;
|
||||
use OSS\OssClient;
|
||||
use strategy\Driver;
|
||||
|
||||
/**
|
||||
* 阿里云OSS对象储存驱动
|
||||
*
|
||||
* Class Oss
|
||||
* @package strategy\driver
|
||||
*/
|
||||
class Oss implements Driver
|
||||
{
|
||||
/**
|
||||
* 当前储存策略参数
|
||||
*
|
||||
* @var array
|
||||
*/
|
||||
protected $options = [];
|
||||
|
||||
/**
|
||||
* 错误信息
|
||||
*
|
||||
* @var null
|
||||
*/
|
||||
protected $error = null;
|
||||
|
||||
/**
|
||||
* Oss实例
|
||||
*
|
||||
* @var null
|
||||
*/
|
||||
protected $oss = null;
|
||||
|
||||
/**
|
||||
* Oss constructor.
|
||||
*
|
||||
* @param array $options
|
||||
*/
|
||||
public function __construct($options = [])
|
||||
{
|
||||
$this->options = $options;
|
||||
try {
|
||||
$this->oss = new OssClient(
|
||||
$this->options['oss_access_key_id'],
|
||||
$this->options['oss_access_key_secret'],
|
||||
$this->options['oss_endpoint'],
|
||||
false,
|
||||
null,
|
||||
null
|
||||
);
|
||||
} catch (OssException $e) {
|
||||
$this->error = $e->getMessage();
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* 创建文件
|
||||
*
|
||||
* @param $pathname
|
||||
* @param $file
|
||||
*
|
||||
* @return bool
|
||||
*/
|
||||
public function create($pathname, $file)
|
||||
{
|
||||
try {
|
||||
$this->oss->uploadFile($this->options['oss_bucket'], $pathname, $file);
|
||||
} catch (OssException $e) {
|
||||
$this->error = $e->getMessage();
|
||||
return false;
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
/**
|
||||
* 删除文件
|
||||
*
|
||||
* @param $pathname
|
||||
*
|
||||
* @return bool
|
||||
*/
|
||||
public function delete($pathname)
|
||||
{
|
||||
try {
|
||||
$this->oss->deleteObject($this->options['oss_bucket'], $pathname);
|
||||
} catch (OssException $e) {
|
||||
$this->error = $e->getMessage();
|
||||
return false;
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
/**
|
||||
* 删除多个文件
|
||||
*
|
||||
* @param array $list
|
||||
* @return bool|mixed
|
||||
*/
|
||||
public function deletes(array $list)
|
||||
{
|
||||
try {
|
||||
$this->oss->deleteObjects($this->options['oss_bucket'], $list);
|
||||
} catch (OssException $e) {
|
||||
$this->error = $e->getMessage();
|
||||
return false;
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
public function getError()
|
||||
{
|
||||
return 'Oss:' . $this->error;
|
||||
}
|
||||
}
|
141
extend/strategy/driver/Qiniu.php
Normal file
@ -0,0 +1,141 @@
|
||||
<?php
|
||||
/**
|
||||
* User: Wisp X
|
||||
* Date: 2018/9/29
|
||||
* Time: 下午1:50
|
||||
* Link: http://gitee.com/wispx
|
||||
*/
|
||||
|
||||
namespace strategy\driver;
|
||||
|
||||
use Qiniu\Auth;
|
||||
use Qiniu\Config;
|
||||
use Qiniu\Storage\BucketManager;
|
||||
use Qiniu\Storage\UploadManager;
|
||||
use strategy\Driver;
|
||||
|
||||
/**
|
||||
* 七牛云对象储存驱动
|
||||
*
|
||||
* Class Qiniu
|
||||
* @package strategy\driver
|
||||
*/
|
||||
class Qiniu implements Driver
|
||||
{
|
||||
/**
|
||||
* 当前储存策略参数
|
||||
*
|
||||
* @var array
|
||||
*/
|
||||
protected $options = [];
|
||||
|
||||
/**
|
||||
* 错误信息
|
||||
*
|
||||
* @var null
|
||||
*/
|
||||
protected $error = null;
|
||||
|
||||
/**
|
||||
* UploadManager实例
|
||||
*
|
||||
* @var null
|
||||
*/
|
||||
protected $uploadMgr = null;
|
||||
|
||||
/**
|
||||
* BucketManager实例
|
||||
*
|
||||
* @var null
|
||||
*/
|
||||
protected $bucketMgr = null;
|
||||
|
||||
/**
|
||||
* 上传凭证
|
||||
*
|
||||
* @var null
|
||||
*/
|
||||
protected $uploadToken = null;
|
||||
|
||||
/**
|
||||
* Qiniu constructor.
|
||||
*
|
||||
* @param array $options
|
||||
*/
|
||||
public function __construct($options = [])
|
||||
{
|
||||
$this->options = $options;
|
||||
try {
|
||||
$auth = new Auth($this->options['qiniu_access_key'], $this->options['qiniu_secret_key']);
|
||||
$this->uploadToken = $auth->uploadToken($this->options['qiniu_bucket']);
|
||||
$config = new Config();
|
||||
$this->uploadMgr = new UploadManager();
|
||||
$this->bucketMgr = new BucketManager($auth, $config);
|
||||
} catch (\Exception $e) {
|
||||
$this->error = $e->getMessage();
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* 创建一个文件
|
||||
*
|
||||
* @param $pathname
|
||||
* @param $file
|
||||
*
|
||||
* @return bool
|
||||
* @throws \Exception
|
||||
*/
|
||||
public function create($pathname, $file)
|
||||
{
|
||||
list($ret, $err) = $this->uploadMgr->putFile($this->uploadToken, $pathname, $file);
|
||||
if (null !== $err) {
|
||||
$this->error = $err;
|
||||
return false;
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
/**
|
||||
* 删除文件
|
||||
*
|
||||
* @param $pathname
|
||||
*
|
||||
* @return bool
|
||||
*/
|
||||
public function delete($pathname)
|
||||
{
|
||||
$err = $this->bucketMgr->delete($this->options['qiniu_bucket'], $pathname);
|
||||
if ($err) {
|
||||
$this->error = $err;
|
||||
return false;
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
/**
|
||||
* 删除多个文件
|
||||
*
|
||||
* @param array $list
|
||||
* @return bool|mixed
|
||||
*/
|
||||
public function deletes(array $list)
|
||||
{
|
||||
foreach ($list as $value) {
|
||||
if (is_string($value)) {
|
||||
$err = $this->bucketMgr->delete($this->options['qiniu_bucket'], $value);
|
||||
if ($err) {
|
||||
$this->error = $err;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
public function getError()
|
||||
{
|
||||
return 'Qiniu:' . $this->error;
|
||||
}
|
||||
}
|
128
extend/strategy/driver/Upyun.php
Normal file
@ -0,0 +1,128 @@
|
||||
<?php
|
||||
/**
|
||||
* User: Wisp X
|
||||
* Date: 2018/9/29
|
||||
* Time: 下午1:50
|
||||
* Link: http://gitee.com/wispx
|
||||
*/
|
||||
|
||||
namespace strategy\driver;
|
||||
|
||||
use strategy\Driver;
|
||||
|
||||
/**
|
||||
* 又拍云对象储存驱动
|
||||
*
|
||||
* Class Upyun
|
||||
* @package strategy\driver
|
||||
*/
|
||||
class Upyun implements Driver
|
||||
{
|
||||
/**
|
||||
* 当前储存策略参数
|
||||
*
|
||||
* @var array
|
||||
*/
|
||||
protected $options = [];
|
||||
|
||||
/**
|
||||
* 错误信息
|
||||
*
|
||||
* @var null
|
||||
*/
|
||||
protected $error = null;
|
||||
|
||||
/**
|
||||
* Upyun实例
|
||||
*
|
||||
* @var null
|
||||
*/
|
||||
protected $upyun = null;
|
||||
|
||||
/**
|
||||
* Upyun constructor.
|
||||
*
|
||||
* @param array $options
|
||||
*/
|
||||
public function __construct($options = [])
|
||||
{
|
||||
$this->options = $options;
|
||||
try {
|
||||
$serviceConfig = new \Upyun\Config(
|
||||
$this->options['upyun_service_name'],
|
||||
$this->options['upyun_operator_name'],
|
||||
$this->options['upyun_operator_pwd']
|
||||
);
|
||||
$this->upyun = new \Upyun\Upyun($serviceConfig);
|
||||
} catch (\Exception $e) {
|
||||
$this->error = $e->getMessage();
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* 创建文件
|
||||
*
|
||||
* @param $pathname
|
||||
* @param $file
|
||||
*
|
||||
* @return bool
|
||||
*/
|
||||
public function create($pathname, $file)
|
||||
{
|
||||
try {
|
||||
$this->upyun->write($pathname, fopen($file, 'r'));
|
||||
} catch (\Exception $e) {
|
||||
$this->error = $e->getMessage();
|
||||
return false;
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
/**
|
||||
* 删除文件
|
||||
*
|
||||
* @param $pathname
|
||||
*
|
||||
* @return bool
|
||||
*/
|
||||
public function delete($pathname)
|
||||
{
|
||||
try {
|
||||
$this->upyun->delete($pathname);
|
||||
} catch (\Exception $e) {
|
||||
$this->error = $e->getMessage();
|
||||
return false;
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
/**
|
||||
* 删除多个文件
|
||||
*
|
||||
* @param array $list
|
||||
* @return bool|mixed
|
||||
*/
|
||||
public function deletes(array $list)
|
||||
{
|
||||
try {
|
||||
foreach ($list as $value) {
|
||||
if (is_string($value)) {
|
||||
// 异步删除
|
||||
$this->upyun->delete($value, true);
|
||||
}
|
||||
}
|
||||
} catch (\Exception $e) {
|
||||
$this->error = $e->getMessage();
|
||||
return false;
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
public function getError()
|
||||
{
|
||||
return 'Upyun:' . $this->error;
|
||||
}
|
||||
}
|
171
install.sql
Normal file
@ -0,0 +1,171 @@
|
||||
-- phpMyAdmin SQL Dump
|
||||
-- version 4.8.2
|
||||
-- https://www.phpmyadmin.net/
|
||||
--
|
||||
-- Host: localhost:3306
|
||||
-- Generation Time: 2018-09-28 17:54:47
|
||||
-- 服务器版本: 5.7.21
|
||||
-- PHP Version: 7.2.7
|
||||
|
||||
SET SQL_MODE = "NO_AUTO_VALUE_ON_ZERO";
|
||||
SET time_zone = "+00:00";
|
||||
|
||||
--
|
||||
-- Database: `lsky`
|
||||
--
|
||||
|
||||
-- --------------------------------------------------------
|
||||
|
||||
--
|
||||
-- 表的结构 `lsky_config`
|
||||
--
|
||||
|
||||
CREATE TABLE `lsky_config` (
|
||||
`id` smallint(6) UNSIGNED NOT NULL,
|
||||
`key` varchar(32) DEFAULT NULL COMMENT 'key',
|
||||
`type` varchar(32) NOT NULL DEFAULT 'text' COMMENT 'text|bool|textarea|select',
|
||||
`input_type` varchar(32) NOT NULL DEFAULT 'text' COMMENT 'input type属性',
|
||||
`name` varchar(32) CHARACTER SET utf8mb4 NOT NULL COMMENT '配置名',
|
||||
`title` varchar(100) CHARACTER SET utf8mb4 DEFAULT NULL COMMENT '配置标题',
|
||||
`tip` varchar(100) CHARACTER SET utf8mb4 DEFAULT NULL COMMENT '配置描述',
|
||||
`value` text CHARACTER SET utf8mb4 NOT NULL COMMENT '配置值',
|
||||
`extend` text CHARACTER SET utf8mb4 NOT NULL COMMENT '扩展属性'
|
||||
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='系统配置' ROW_FORMAT=COMPACT;
|
||||
|
||||
--
|
||||
-- 转存表中的数据 `lsky_config`
|
||||
--
|
||||
|
||||
INSERT INTO `lsky_config` (`id`, `key`, `type`, `input_type`, `name`, `title`, `tip`, `value`, `extend`) VALUES
|
||||
(1, 'basics', 'bool', 'checkbox', 'close_register', '关闭注册', NULL, '0', ''),
|
||||
(2, 'basics', 'text', 'text', 'site_name', '网站标题', NULL, 'Lsky Pro', ''),
|
||||
(3, 'basics', 'text', 'text', 'site_keywords', '网站关键字', NULL, 'Lsky Pro', ''),
|
||||
(4, 'basics', 'text', 'text', 'site_description', '网站描述', NULL, 'Lsky Pro', ''),
|
||||
(5, 'basics', 'text', 'text', 'icp_number', '备案号', NULL, '皖ICP备16011445号', ''),
|
||||
(6, 'upload', 'bool', 'checkbox', 'allowed_tourist_upload', '允许游客上传', '是否允许游客上传', '1', ''),
|
||||
(7, 'upload', 'text', 'text', 'upload_max_size', '最大上传大小', '单位:b,默认5242880:5M', '5242880', ''),
|
||||
(8, 'upload', 'text', 'number', 'upload_single_num', '单次同时上传数量', NULL, '10', ''),
|
||||
(9, 'upload', 'text', 'text', 'upload_allowed_exts', '允许上传的文件后缀', '逗号隔开', 'jpg,jpeg,gif,png,ico', ''),
|
||||
(10, 'upload', 'text', 'text', 'path_naming_rule', '文件路径命名规则', '<a href="javascript:void(0)" mdui-dialog="{target: \'#path-var\'}">路径命名变量对照表</a>', '{Y}/{m}/{d}', ''),
|
||||
(11, 'upload', 'text', 'text', 'file_naming_rule', '文件路径命名规则', '<a href="javascript:void(0)" mdui-dialog="{target: \'#file-var\'}">文件命名变量对照表</a>', '{uniqid}', ''),
|
||||
(12, 'user', 'text', 'text', 'user_initial_quota', '用户初始配额容量', '单位:b,默认1073741824:1G,最大18位', '1073741824', ''),
|
||||
(13, 'mail', 'select', 'text', 'mail_send_mode', '邮件发送方式', NULL, 'smtp', '{\"smtp\":\"SMTP\",\"mail\":\"Mail\"}'),
|
||||
(14, 'mail', 'select', 'text', 'mail_smtp_secure', 'SMTP验证方式', NULL, 'none', '{\"none\":\"None\",\"tls\":\"TLS\",\"ssl\":\"SSL\"}'),
|
||||
(15, 'mail', 'text', 'text', 'mail_smtp_host', 'SMTP主机地址', NULL, '', ''),
|
||||
(16, 'mail', 'text', 'text', 'mail_smtp_username', 'SMTP用户名', NULL, '', ''),
|
||||
(17, 'mail', 'text', 'password', 'mail_smtp_password', 'SMTP密码', NULL, '', ''),
|
||||
(18, 'mail', 'text', 'number', 'mail_smtp_port', 'SMTP端口', '25/465', '25', ''),
|
||||
(19, 'mail', 'text', 'email', 'mail_form_email', '发件人邮箱', NULL, '', ''),
|
||||
(20, 'other', 'bool', 'checkbox', 'soft_delete', '软删除', '删除图片时不删除源文件,不建议开启', '0', ''),
|
||||
|
||||
(21, 'storage_strategy', 'select', 'text', 'storage_strategy', '储存策略', NULL, 'local', ''),
|
||||
(22, 'local', 'text', 'text', 'local_cdn_domain', 'CDN加速域名', '为空使用当前站点域名', '', ''),
|
||||
(23, 'oss', 'text', 'text', 'oss_cdn_domain', 'Bucket域名', '为空使用当前站点域名', '', ''),
|
||||
(24, 'oss', 'text', 'text', 'oss_access_key_id', 'AccessKeyId', NULL, '', ''),
|
||||
(25, 'oss', 'text', 'text', 'oss_access_key_secret', 'AccessKeySecret', NULL, '', ''),
|
||||
(26, 'oss', 'text', 'text', 'oss_endpoint', 'Endpoint', '地域节点', '', ''),
|
||||
(27, 'oss', 'text', 'text', 'oss_bucket', 'Bucket', NULL, '', ''),
|
||||
(28, 'cos', 'text', 'text', 'cos_cdn_domain', 'CDN加速域名', '为空使用当前站点域名,储存桶->域名管理->加速域名', '', ''),
|
||||
(29, 'cos', 'text', 'text', 'cos_secret_id', 'SecretId', NULL, '', ''),
|
||||
(30, 'cos', 'text', 'text', 'cos_secret_key', 'SecretKey', NULL, '', ''),
|
||||
(31, 'cos', 'text', 'text', 'cos_region', '所属地域', NULL, '', ''),
|
||||
(32, 'cos', 'text', 'text', 'cos_bucket', 'Bucket', '储存桶名称', '', ''),
|
||||
(33, 'qiniu', 'text', 'text', 'qiniu_cdn_domain', 'CDN加速域名', '为空使用当前站点域名', '', ''),
|
||||
(34, 'qiniu', 'text', 'text', 'qiniu_access_key', 'AccessKey', NULL, '', ''),
|
||||
(35, 'qiniu', 'text', 'text', 'qiniu_secret_key', 'SecretKey', NULL, '', ''),
|
||||
(36, 'qiniu', 'text', 'text', 'qiniu_bucket', 'Bucket', NULL, '', ''),
|
||||
(37, 'upyun', 'text', 'text', 'upyun_cdn_domain', 'CDN加速域名', '为空使用当前站点域名', '', ''),
|
||||
(38, 'upyun', 'text', 'text', 'upyun_operator_name', 'OperatorName', '操作员账号', '', ''),
|
||||
(39, 'upyun', 'text', 'password', 'upyun_operator_pwd', 'OperatorPwd', '操作员密码', '', ''),
|
||||
(40, 'upyun', 'text', 'text', 'upyun_service_name', 'ServiceName', '云储存服务名称', '', ''),
|
||||
(41, '', 'text', 'text', 'system_version', '系统版本', NULL, '1.0', '');
|
||||
|
||||
|
||||
-- --------------------------------------------------------
|
||||
|
||||
--
|
||||
-- 表的结构 `lsky_images`
|
||||
--
|
||||
|
||||
CREATE TABLE `lsky_images` (
|
||||
`id` int(11) UNSIGNED NOT NULL COMMENT 'ID',
|
||||
`user_id` int(11) NOT NULL DEFAULT 0 COMMENT '用户ID,为0表示游客上传',
|
||||
`strategy` varchar(32) NOT NULL DEFAULT 'local' COMMENT '储存策略,默认本地',
|
||||
`path` varchar(500) NOT NULL COMMENT '保存路径',
|
||||
`name` varchar(500) NOT NULL COMMENT '保存名称',
|
||||
`pathname` varchar(500) NOT NULL COMMENT '保存名称',
|
||||
`size` decimal(12,2) NOT NULL DEFAULT '0.00' COMMENT '图片大小(字节:b)',
|
||||
`mime` varchar(32) NOT NULL COMMENT '文件MIME类型',
|
||||
`sha1` varchar(100) NOT NULL COMMENT 'hash sha1',
|
||||
`md5` varchar(32) NOT NULL COMMENT 'hash md5',
|
||||
`create_time` int(11) NOT NULL COMMENT '创建时间'
|
||||
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='图片表';
|
||||
|
||||
-- --------------------------------------------------------
|
||||
|
||||
--
|
||||
-- 表的结构 `lsky_users`
|
||||
--
|
||||
|
||||
CREATE TABLE `lsky_users` (
|
||||
`id` int(11) UNSIGNED NOT NULL,
|
||||
`username` varchar(32) NOT NULL COMMENT '用户名',
|
||||
`nickname` varchar(32) DEFAULT NULL COMMENT '昵称',
|
||||
`email` varchar(100) NOT NULL COMMENT '邮箱',
|
||||
`password` varchar(32) NOT NULL COMMENT '密码',
|
||||
`quota` decimal(20,2) NOT NULL DEFAULT '0.00' COMMENT '可用配额容量(字节:b)',
|
||||
`is_admin` tinyint(1) NOT NULL DEFAULT '0' COMMENT '是否为管理员',
|
||||
`state` tinyint(1) NOT NULL DEFAULT '1' COMMENT '0:冻结,1:正常',
|
||||
`token` varchar(32) DEFAULT NULL COMMENT 'Token',
|
||||
`reg_ip` varchar(32) DEFAULT NULL COMMENT '注册IP',
|
||||
`delete_time` int(11) DEFAULT NULL COMMENT '删除时间',
|
||||
`update_time` int(11) NOT NULL COMMENT '更新时间',
|
||||
`create_time` int(11) NOT NULL COMMENT '添加时间'
|
||||
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='用户表';
|
||||
|
||||
--
|
||||
-- Indexes for dumped tables
|
||||
--
|
||||
|
||||
--
|
||||
-- Indexes for table `lsky_config`
|
||||
--
|
||||
ALTER TABLE `lsky_config`
|
||||
ADD PRIMARY KEY (`id`),
|
||||
ADD UNIQUE KEY `name` (`name`);
|
||||
|
||||
--
|
||||
-- Indexes for table `lsky_images`
|
||||
--
|
||||
ALTER TABLE `lsky_images`
|
||||
ADD PRIMARY KEY (`id`);
|
||||
|
||||
--
|
||||
-- Indexes for table `lsky_users`
|
||||
--
|
||||
ALTER TABLE `lsky_users`
|
||||
ADD PRIMARY KEY (`id`),
|
||||
ADD UNIQUE KEY `username` (`username`),
|
||||
ADD UNIQUE KEY `email` (`email`);
|
||||
|
||||
--
|
||||
-- 在导出的表使用AUTO_INCREMENT
|
||||
--
|
||||
|
||||
--
|
||||
-- 使用表AUTO_INCREMENT `lsky_config`
|
||||
--
|
||||
ALTER TABLE `lsky_config`
|
||||
MODIFY `id` smallint(6) UNSIGNED NOT NULL AUTO_INCREMENT, AUTO_INCREMENT=42;
|
||||
|
||||
--
|
||||
-- 使用表AUTO_INCREMENT `lsky_images`
|
||||
--
|
||||
ALTER TABLE `lsky_images`
|
||||
MODIFY `id` int(11) UNSIGNED NOT NULL AUTO_INCREMENT COMMENT 'ID';
|
||||
|
||||
--
|
||||
-- 使用表AUTO_INCREMENT `lsky_users`
|
||||
--
|
||||
ALTER TABLE `lsky_users`
|
||||
MODIFY `id` int(11) UNSIGNED NOT NULL AUTO_INCREMENT, AUTO_INCREMENT=2;
|
8
public/.htaccess
Normal file
@ -0,0 +1,8 @@
|
||||
<IfModule mod_rewrite.c>
|
||||
Options +FollowSymlinks -Multiviews
|
||||
RewriteEngine On
|
||||
|
||||
RewriteCond %{REQUEST_FILENAME} !-d
|
||||
RewriteCond %{REQUEST_FILENAME} !-f
|
||||
RewriteRule ^(.*)$ index.php?s=/$1 [QSA,PT,L]
|
||||
</IfModule>
|
BIN
public/favicon.ico
Normal file
After Width: | Height: | Size: 4.2 KiB |
22
public/index.php
Normal file
@ -0,0 +1,22 @@
|
||||
<?php
|
||||
// +----------------------------------------------------------------------
|
||||
// | ThinkPHP [ WE CAN DO IT JUST THINK ]
|
||||
// +----------------------------------------------------------------------
|
||||
// | Copyright (c) 2006-2018 http://thinkphp.cn All rights reserved.
|
||||
// +----------------------------------------------------------------------
|
||||
// | Licensed ( http://www.apache.org/licenses/LICENSE-2.0 )
|
||||
// +----------------------------------------------------------------------
|
||||
// | Author: liu21st <liu21st@gmail.com>
|
||||
// +----------------------------------------------------------------------
|
||||
|
||||
// [ 应用入口文件 ]
|
||||
namespace think;
|
||||
|
||||
// 根目录常量配置(和本文件同级)
|
||||
define('ROOT_PATH', __DIR__ . DIRECTORY_SEPARATOR);
|
||||
|
||||
// 加载基础文件
|
||||
require __DIR__ . '/../thinkphp/base.php';
|
||||
|
||||
// 执行应用并响应
|
||||
Container::get('app')->bind('index')->run()->send();
|
2
public/robots.txt
Normal file
@ -0,0 +1,2 @@
|
||||
User-agent: *
|
||||
Disallow:
|
497
public/static/app/css/app.css
Normal file
@ -0,0 +1,497 @@
|
||||
*,
|
||||
*:before,
|
||||
*:after {
|
||||
box-sizing: border-box;
|
||||
}
|
||||
a {
|
||||
color: #03A9F4;
|
||||
}
|
||||
a,
|
||||
a:hover,
|
||||
a:active,
|
||||
a:focus {
|
||||
text-decoration: none;
|
||||
}
|
||||
a:focus {
|
||||
outline-style: none;
|
||||
}
|
||||
audio,
|
||||
body,
|
||||
caption,
|
||||
div,
|
||||
footer,
|
||||
form,
|
||||
h1,
|
||||
h2,
|
||||
h3,
|
||||
h4,
|
||||
h5,
|
||||
h6,
|
||||
header,
|
||||
html,
|
||||
iframe,
|
||||
label,
|
||||
legend,
|
||||
li,
|
||||
main,
|
||||
mark,
|
||||
menu,
|
||||
nav,
|
||||
ol,
|
||||
p,
|
||||
section,
|
||||
span,
|
||||
summary,
|
||||
table,
|
||||
textarea,
|
||||
time,
|
||||
ul,
|
||||
video {
|
||||
padding: 0;
|
||||
margin: 0;
|
||||
border: 0;
|
||||
outline: 0 none;
|
||||
}
|
||||
html {
|
||||
position: relative;
|
||||
min-height: 100%;
|
||||
}
|
||||
html,
|
||||
body {
|
||||
width: 100%;
|
||||
margin: 0;
|
||||
padding: 0;
|
||||
}
|
||||
body {
|
||||
margin-bottom: 60px;
|
||||
overflow-x: hidden;
|
||||
}
|
||||
.mdui-drawer-body-left footer {
|
||||
width: calc(100% - 240px);
|
||||
}
|
||||
main {
|
||||
position: relative;
|
||||
top: 0;
|
||||
left: 0;
|
||||
right: 0;
|
||||
margin: 1.7rem 0;
|
||||
}
|
||||
main .login-container,
|
||||
main .register-container {
|
||||
margin-top: 4rem;
|
||||
margin-bottom: 4rem;
|
||||
}
|
||||
main .not-logged-in {
|
||||
margin: 10rem 0;
|
||||
text-align: center;
|
||||
}
|
||||
main .not-logged-in h2 {
|
||||
margin-bottom: 2rem;
|
||||
}
|
||||
main .upload-container .title {
|
||||
margin: 1rem 0;
|
||||
}
|
||||
main .upload-container .title h1 {
|
||||
font-weight: 300;
|
||||
font-size: 3rem;
|
||||
text-shadow: -5px 5px 0 rgba(0, 0, 0, 0.1);
|
||||
}
|
||||
main .upload-container .title p {
|
||||
margin-top: 1rem;
|
||||
font-size: 1.3rem;
|
||||
color: #999;
|
||||
}
|
||||
main .upload-container .success-info {
|
||||
margin-top: 1rem;
|
||||
width: 0;
|
||||
}
|
||||
main .upload-container .success-info .mdui-tab a {
|
||||
text-transform: inherit;
|
||||
}
|
||||
main .upload-container .success-info ul {
|
||||
list-style: none;
|
||||
}
|
||||
main .upload-container .success-info ul li {
|
||||
margin-top: 0.5rem;
|
||||
padding: 1rem;
|
||||
border: 1px solid #dadada;
|
||||
background-color: #f7f7f7;
|
||||
font-size: 14px;
|
||||
color: #555;
|
||||
white-space: pre-wrap;
|
||||
word-break: break-all;
|
||||
word-wrap: break-word;
|
||||
border-radius: 0;
|
||||
font-family: Menlo, Monaco, Consolas, "Courier New", monospace;
|
||||
}
|
||||
main .system-container .mdui-textfield-label {
|
||||
pointer-events: inherit;
|
||||
}
|
||||
main .images-container #info .mdui-dialog-content {
|
||||
word-break: break-all;
|
||||
word-wrap: break-word;
|
||||
}
|
||||
main .images-container #info .mdui-btn-group .mdui-btn {
|
||||
margin-left: 0;
|
||||
min-width: inherit;
|
||||
}
|
||||
main .images-container #info img.qrcode {
|
||||
text-align: center;
|
||||
}
|
||||
main .images-container #info .mdui-dialog-content {
|
||||
padding-bottom: 0;
|
||||
}
|
||||
main .images-container #info table {
|
||||
width: 100%;
|
||||
}
|
||||
main .images-container #info table tbody tr td[align="right"] {
|
||||
width: 50px;
|
||||
color: #998;
|
||||
}
|
||||
main .images-container .images-box .item {
|
||||
position: relative;
|
||||
padding: 2rem 0.4rem 0.4rem;
|
||||
text-align: center;
|
||||
width: 100%;
|
||||
height: auto;
|
||||
transition: all 0.1s;
|
||||
border: 1px solid transparent;
|
||||
margin-top: 1rem;
|
||||
}
|
||||
main .images-container .images-box .item i.iconfont {
|
||||
display: none;
|
||||
position: absolute;
|
||||
cursor: pointer;
|
||||
font-size: 19px;
|
||||
}
|
||||
main .images-container .images-box .item i.icon-choice {
|
||||
top: 5px;
|
||||
left: 5px;
|
||||
color: #cecece;
|
||||
}
|
||||
main .images-container .images-box .item i.icon-choice:hover {
|
||||
color: #999;
|
||||
}
|
||||
main .images-container .images-box .item i.icon-info {
|
||||
top: 5px;
|
||||
right: 5px;
|
||||
color: #129cff;
|
||||
}
|
||||
main .images-container .images-box .item:hover {
|
||||
background-color: #ebebeb;
|
||||
}
|
||||
main .images-container .images-box .item.choice {
|
||||
background: rgba(204, 232, 255, 0.5);
|
||||
border: 1px solid rgba(153, 209, 255, 0.57);
|
||||
}
|
||||
main .images-container .images-box .item.choice i.icon-choice {
|
||||
display: block;
|
||||
color: #3b8cff;
|
||||
}
|
||||
main .images-container .images-box .item:hover i.icon-choice,
|
||||
main .images-container .images-box .item.choice i.icon-choice,
|
||||
main .images-container .images-box .item:hover i.icon-info,
|
||||
main .images-container .images-box .item.choice i.icon-info {
|
||||
display: block;
|
||||
}
|
||||
main .images-container .images-box .item .info {
|
||||
cursor: pointer;
|
||||
height: 90px;
|
||||
overflow: hidden;
|
||||
display: block;
|
||||
text-align: center;
|
||||
vertical-align: middle;
|
||||
}
|
||||
main .images-container .images-box .item .info img {
|
||||
max-height: 100%;
|
||||
max-width: 100%;
|
||||
border-radius: 0;
|
||||
position: relative;
|
||||
top: 50%;
|
||||
transform: translateY(-50%);
|
||||
}
|
||||
main .images-container .images-box .item .info.image img {
|
||||
-webkit-box-shadow: 1px 1px 5px rgba(0, 0, 0, 0.2);
|
||||
-moz-box-shadow: 1px 1px 5px rgba(0, 0, 0, 0.2);
|
||||
box-shadow: 1px 1px 5px rgba(0, 0, 0, 0.2);
|
||||
}
|
||||
main .images-container .images-box .item p.name {
|
||||
color: #555;
|
||||
cursor: default;
|
||||
text-align: center;
|
||||
word-break: break-all;
|
||||
font-size: 12px;
|
||||
margin: 0.3rem auto;
|
||||
line-height: 1.5em;
|
||||
padding-bottom: 5px;
|
||||
overflow: hidden;
|
||||
display: -webkit-box;
|
||||
-webkit-box-orient: vertical;
|
||||
-webkit-line-clamp: 3;
|
||||
}
|
||||
main .update-container .item {
|
||||
margin-top: 1rem;
|
||||
}
|
||||
main .update-container .item h4 {
|
||||
font-size: 1.1rem;
|
||||
margin-bottom: 0.5rem;
|
||||
color: #555;
|
||||
}
|
||||
main .update-container .item h4 small {
|
||||
color: #777777;
|
||||
}
|
||||
main .update-container .item .info {
|
||||
margin-left: 0.8rem;
|
||||
}
|
||||
main .update-container .item .info p {
|
||||
color: #777;
|
||||
margin-bottom: 0.3em;
|
||||
}
|
||||
main .update-container p {
|
||||
color: #444;
|
||||
}
|
||||
main .mdui-textfield .captcha {
|
||||
position: absolute;
|
||||
top: 34px;
|
||||
right: 0;
|
||||
bottom: 0;
|
||||
width: 140px;
|
||||
cursor: pointer;
|
||||
}
|
||||
.file-input .file-preview {
|
||||
border-radius: 0;
|
||||
border: none;
|
||||
box-shadow: 0 0 15px 0 rgba(0, 0, 0, 0.13);
|
||||
}
|
||||
.file-input .file-preview .fileinput-remove {
|
||||
top: 6px;
|
||||
right: 6px;
|
||||
}
|
||||
.file-input .file-preview .file-preview-thumbnails .krajee-default.file-preview-frame {
|
||||
border: 0;
|
||||
box-shadow: 0 0 15px 0 rgba(0, 0, 0, 0.13);
|
||||
}
|
||||
.file-input .file-preview .kv-fileinput-error ul {
|
||||
list-style: none;
|
||||
}
|
||||
.file-input .file-caption-main .form-control {
|
||||
box-shadow: 0 2px 15px 0 rgba(0, 0, 0, 0.13);
|
||||
border: none;
|
||||
border-radius: 0;
|
||||
padding: 7px 12px;
|
||||
}
|
||||
.file-input .file-caption-main .form-control:focus {
|
||||
z-index: 0;
|
||||
}
|
||||
.file-input .file-caption-main .btn {
|
||||
padding: 7px 12px;
|
||||
border: 0;
|
||||
}
|
||||
.file-input .file-caption-main .btn:first-child {
|
||||
border-left: 1px solid #e2e2e2;
|
||||
}
|
||||
.file-input .file-caption-main .btn:last-child {
|
||||
margin-right: -1px;
|
||||
}
|
||||
.file-input .file-caption-main .btn-file {
|
||||
border-color: #2383eb;
|
||||
background-color: #2383eb;
|
||||
border-radius: 0;
|
||||
}
|
||||
.file-input .file-caption-main .input-group-append {
|
||||
box-shadow: 0 0 15px 0 rgba(0, 0, 0, 0.13);
|
||||
}
|
||||
.file-zoom-fullscreen.modal {
|
||||
z-index: 999999;
|
||||
}
|
||||
.mdui-tab-scrollable {
|
||||
padding-left: 0;
|
||||
}
|
||||
.panel {
|
||||
padding: 0;
|
||||
overflow: hidden;
|
||||
white-space: normal;
|
||||
word-break: break-all;
|
||||
box-shadow: 0 0 20px 0 rgba(0, 0, 0, 0.13);
|
||||
border-radius: 0.5rem;
|
||||
}
|
||||
.panel .panel-header {
|
||||
padding: 1rem;
|
||||
}
|
||||
.panel .panel-body {
|
||||
border-top: 1px solid #f1f1f1;
|
||||
border-bottom: 1px solid #f1f1f1;
|
||||
padding: 1rem;
|
||||
}
|
||||
.panel .panel-body-box {
|
||||
border-top: 1px solid #f1f1f1;
|
||||
padding: 1rem;
|
||||
border-bottom-left-radius: 0.5rem;
|
||||
border-bottom-right-radius: 0.5rem;
|
||||
}
|
||||
.panel .panel-footer {
|
||||
padding: 1rem;
|
||||
}
|
||||
.error-box {
|
||||
border: none;
|
||||
margin: 0;
|
||||
}
|
||||
.none {
|
||||
display: none;
|
||||
}
|
||||
#loading-container {
|
||||
position: fixed;
|
||||
top: 0;
|
||||
left: 0;
|
||||
right: 0;
|
||||
bottom: 0;
|
||||
display: none;
|
||||
}
|
||||
#loading-container .mask {
|
||||
position: absolute;
|
||||
width: 100%;
|
||||
z-index: 9999;
|
||||
}
|
||||
#loading-container .loading {
|
||||
position: absolute;
|
||||
top: 5rem;
|
||||
right: 1rem;
|
||||
z-index: 10000;
|
||||
}
|
||||
.panel-box {
|
||||
overflow: hidden;
|
||||
white-space: normal;
|
||||
word-break: break-all;
|
||||
box-shadow: 0 0 20px 0 rgba(0, 0, 0, 0.13);
|
||||
border-radius: 0.5rem;
|
||||
padding: 1rem;
|
||||
}
|
||||
#menu .quota-container {
|
||||
position: absolute;
|
||||
left: 50%;
|
||||
bottom: 2rem;
|
||||
text-align: left;
|
||||
transform: translateX(-50%);
|
||||
}
|
||||
#menu .quota-container progress {
|
||||
background-color: #f6f6f6;
|
||||
display: inline;
|
||||
height: 0.5rem;
|
||||
}
|
||||
#menu .quota-container progress::-webkit-progress-bar {
|
||||
background-color: #e0eaf0;
|
||||
}
|
||||
#menu .quota-container progress::-webkit-progress-value {
|
||||
background-color: #1abc9c;
|
||||
}
|
||||
#menu .quota-container progress::-moz-progress-bar {
|
||||
background-color: #e0eaf0;
|
||||
}
|
||||
#menu .quota-container progress::-moz-progress-value {
|
||||
background-color: #708d9b;
|
||||
}
|
||||
#search-form .search-input {
|
||||
display: inline-block;
|
||||
padding-bottom: 0.6rem;
|
||||
width: 140px;
|
||||
}
|
||||
footer {
|
||||
position: absolute;
|
||||
bottom: 0;
|
||||
width: 100%;
|
||||
height: 60px;
|
||||
line-height: 60px;
|
||||
color: #999;
|
||||
text-align: left;
|
||||
background-color: #f5f5f5;
|
||||
}
|
||||
.pagination {
|
||||
display: inline-block;
|
||||
padding-left: 0;
|
||||
margin: 20px 0;
|
||||
border-radius: 4px;
|
||||
}
|
||||
.pagination > li {
|
||||
display: inline;
|
||||
}
|
||||
.pagination > li > a,
|
||||
.pagination > li > span {
|
||||
position: relative;
|
||||
float: left;
|
||||
text-decoration: none;
|
||||
color: #00b5ad;
|
||||
background-color: #fff;
|
||||
border: 1px solid #ddd;
|
||||
margin-left: -1px;
|
||||
padding: 5px 10px;
|
||||
font-size: 12px;
|
||||
line-height: 1.5;
|
||||
}
|
||||
.pagination > li:first-child > a,
|
||||
.pagination > li:first-child > span {
|
||||
margin-left: 0;
|
||||
border-bottom-left-radius: 3px;
|
||||
border-top-left-radius: 3px;
|
||||
}
|
||||
.pagination > li:last-child > a,
|
||||
.pagination > li:last-child > span {
|
||||
border-bottom-right-radius: 3px;
|
||||
border-top-right-radius: 3px;
|
||||
}
|
||||
.pagination > li > a:hover,
|
||||
.pagination > li > a:focus,
|
||||
.pagination > li > span:hover,
|
||||
.pagination > li > span:focus {
|
||||
z-index: 2;
|
||||
color: #22ddde;
|
||||
background-color: #eeeeee;
|
||||
border-color: #ddd;
|
||||
}
|
||||
.pagination > .active > a,
|
||||
.pagination > .active > a:hover,
|
||||
.pagination > .active > a:focus,
|
||||
.pagination > .active > span,
|
||||
.pagination > .active > span:hover,
|
||||
.pagination > .active > span:focus {
|
||||
z-index: 3;
|
||||
color: #e4e4e4;
|
||||
background-color: transparent;
|
||||
border-color: #e4e4e4;
|
||||
cursor: default;
|
||||
}
|
||||
.pagination > .disabled > span,
|
||||
.pagination > .disabled > span:hover,
|
||||
.pagination > .disabled > span:focus,
|
||||
.pagination > .disabled > a,
|
||||
.pagination > .disabled > a:hover,
|
||||
.pagination > .disabled > a:focus {
|
||||
color: #777777;
|
||||
background-color: #fff;
|
||||
border-color: #ddd;
|
||||
cursor: not-allowed;
|
||||
}
|
||||
@media (max-width: 768px) {
|
||||
body {
|
||||
margin-bottom: 90px;
|
||||
}
|
||||
.krajee-default.file-preview-frame {
|
||||
width: 95%;
|
||||
}
|
||||
.krajee-default.file-preview-frame .kv-file-content {
|
||||
width: 100%;
|
||||
height: 100%;
|
||||
}
|
||||
#loading-container .loading {
|
||||
top: 4.5rem;
|
||||
}
|
||||
main .images-container #info img.qrcode {
|
||||
width: 150px;
|
||||
}
|
||||
footer {
|
||||
height: auto;
|
||||
width: 100% !important;
|
||||
line-height: 1.666;
|
||||
padding: 1rem 0;
|
||||
}
|
||||
}
|
||||
/*# sourceMappingURL=app.css.map */
|
1
public/static/app/css/app.css.map
Normal file
562
public/static/app/css/app.less
Normal file
@ -0,0 +1,562 @@
|
||||
*, *:before, *:after {
|
||||
box-sizing: border-box;
|
||||
}
|
||||
|
||||
a {
|
||||
color: #03A9F4;
|
||||
}
|
||||
|
||||
a, a:hover, a:active, a:focus {
|
||||
text-decoration: none;
|
||||
}
|
||||
|
||||
a:focus {
|
||||
outline-style: none;
|
||||
}
|
||||
|
||||
audio, body, caption, div, footer, form, h1, h2, h3, h4, h5, h6, header, html, iframe, label, legend, li, main, mark, menu, nav, ol, p, section, span, summary, table, textarea, time, ul, video {
|
||||
padding: 0;
|
||||
margin: 0;
|
||||
border: 0;
|
||||
outline: 0 none;
|
||||
}
|
||||
|
||||
html {
|
||||
position: relative;
|
||||
min-height: 100%;
|
||||
}
|
||||
|
||||
html, body {
|
||||
width: 100%;
|
||||
margin: 0;
|
||||
padding: 0;
|
||||
}
|
||||
|
||||
body {
|
||||
margin-bottom: 60px;
|
||||
overflow-x: hidden;
|
||||
}
|
||||
|
||||
.mdui-drawer-body-left {
|
||||
footer {
|
||||
width: calc(100% - 240px);
|
||||
}
|
||||
}
|
||||
|
||||
main {
|
||||
position: relative;
|
||||
top: 0;
|
||||
left: 0;
|
||||
right: 0;
|
||||
margin: 1.7rem 0;
|
||||
.login-container, .register-container {
|
||||
margin-top: 4rem;
|
||||
margin-bottom: 4rem;
|
||||
}
|
||||
.not-logged-in {
|
||||
margin: 10rem 0;
|
||||
text-align: center;
|
||||
h2 {
|
||||
margin-bottom: 2rem;
|
||||
}
|
||||
}
|
||||
.upload-container {
|
||||
.title {
|
||||
margin: 1rem 0;
|
||||
h1 {
|
||||
font-weight: 300;
|
||||
font-size: 3rem;
|
||||
text-shadow: -5px 5px 0 rgba(0, 0, 0, .1);
|
||||
}
|
||||
p {
|
||||
margin-top: 1rem;
|
||||
font-size: 1.3rem;
|
||||
color: #999;
|
||||
}
|
||||
}
|
||||
.success-info {
|
||||
margin-top: 1rem;
|
||||
width: 0;
|
||||
.mdui-tab a {
|
||||
text-transform: inherit;
|
||||
}
|
||||
ul {
|
||||
list-style: none;
|
||||
li {
|
||||
margin-top: 0.5rem;
|
||||
padding: 1rem;
|
||||
border: 1px solid #dadada;
|
||||
background-color: #f7f7f7;
|
||||
font-size: 14px;
|
||||
color: #555;
|
||||
white-space: pre-wrap;
|
||||
word-break: break-all;
|
||||
word-wrap: break-word;
|
||||
border-radius: 0;
|
||||
font-family: Menlo, Monaco, Consolas, "Courier New", monospace;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
// 系统设置
|
||||
.system-container {
|
||||
.mdui-textfield-label {
|
||||
pointer-events: inherit;
|
||||
}
|
||||
}
|
||||
// 我的图片
|
||||
.images-container {
|
||||
#info {
|
||||
.mdui-dialog-content {
|
||||
word-break: break-all;
|
||||
word-wrap: break-word;
|
||||
}
|
||||
.mdui-btn-group {
|
||||
.mdui-btn {
|
||||
margin-left: 0;
|
||||
min-width: inherit;
|
||||
}
|
||||
}
|
||||
img.qrcode {
|
||||
text-align: center;
|
||||
}
|
||||
.mdui-dialog-content {
|
||||
padding-bottom: 0;
|
||||
}
|
||||
table {
|
||||
width: 100%;
|
||||
tbody {
|
||||
tr {
|
||||
td {
|
||||
&[align="right"] {
|
||||
width: 50px;
|
||||
color: #998;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
.screen-box {
|
||||
}
|
||||
.images-box {
|
||||
.item {
|
||||
position: relative;
|
||||
padding: 2rem .4rem .4rem;
|
||||
text-align: center;
|
||||
width: 100%;
|
||||
height: auto;
|
||||
transition: all .1s;
|
||||
border: 1px solid transparent;
|
||||
margin-top: 1rem;
|
||||
i.iconfont {
|
||||
display: none;
|
||||
position: absolute;
|
||||
cursor: pointer;
|
||||
font-size: 19px;
|
||||
}
|
||||
// 选择
|
||||
i.icon-choice {
|
||||
top: 5px;
|
||||
left: 5px;
|
||||
color: #cecece;
|
||||
&:hover {
|
||||
color: #999;
|
||||
}
|
||||
}
|
||||
// 信息
|
||||
i.icon-info {
|
||||
top: 5px;
|
||||
right: 5px;
|
||||
color: #129cff;
|
||||
}
|
||||
&:hover {
|
||||
background-color: #ebebeb;
|
||||
}
|
||||
&.choice {
|
||||
background: rgba(204, 232, 255, 0.5);
|
||||
border: 1px solid rgba(153, 209, 255, 0.57);
|
||||
i.icon-choice {
|
||||
display: block;
|
||||
color: #3b8cff;
|
||||
}
|
||||
}
|
||||
&:hover, &.choice {
|
||||
i.icon-choice, i.icon-info {
|
||||
display: block;
|
||||
}
|
||||
}
|
||||
.info {
|
||||
cursor: pointer;
|
||||
height: 90px;
|
||||
overflow: hidden;
|
||||
display: block;
|
||||
text-align: center;
|
||||
vertical-align: middle;
|
||||
img {
|
||||
max-height: 100%;
|
||||
max-width: 100%;
|
||||
border-radius: 0;
|
||||
position: relative;
|
||||
top: 50%;
|
||||
transform: translateY(-50%);
|
||||
}
|
||||
&.image {
|
||||
img {
|
||||
-webkit-box-shadow: 1px 1px 5px rgba(0, 0, 0, 0.2);
|
||||
-moz-box-shadow: 1px 1px 5px rgba(0, 0, 0, 0.2);
|
||||
box-shadow: 1px 1px 5px rgba(0, 0, 0, 0.2);
|
||||
}
|
||||
}
|
||||
}
|
||||
p.name {
|
||||
color: #555;
|
||||
cursor: default;
|
||||
text-align: center;
|
||||
word-break: break-all;
|
||||
font-size: 12px;
|
||||
margin: .3rem auto;
|
||||
line-height: 1.5em;
|
||||
padding-bottom: 5px;
|
||||
overflow: hidden;
|
||||
display: -webkit-box;
|
||||
-webkit-box-orient: vertical;
|
||||
-webkit-line-clamp: 3;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
// 系统更新
|
||||
.update-container {
|
||||
.item {
|
||||
margin-top: 1rem;
|
||||
h4 {
|
||||
font-size: 1.1rem;
|
||||
margin-bottom: .5rem;
|
||||
color: #555;
|
||||
small {
|
||||
color: #777777;
|
||||
}
|
||||
}
|
||||
.info {
|
||||
margin-left: .8rem;
|
||||
p {
|
||||
color: #777;
|
||||
margin-bottom: .3em;
|
||||
}
|
||||
}
|
||||
}
|
||||
p {
|
||||
color: #444;
|
||||
}
|
||||
}
|
||||
.mdui-textfield {
|
||||
.captcha {
|
||||
position: absolute;
|
||||
top: 34px;
|
||||
right: 0;
|
||||
bottom: 0;
|
||||
width: 140px;
|
||||
cursor: pointer;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// 重写fileinput插件样式
|
||||
.file-input {
|
||||
@box-shadow: 0 0 15px 0 rgba(0, 0, 0, 0.13);
|
||||
@form-control-padding: 7px 12px;
|
||||
.file-preview {
|
||||
border-radius: 0;
|
||||
border: none;
|
||||
box-shadow: @box-shadow;
|
||||
.fileinput-remove {
|
||||
top: 6px;
|
||||
right: 6px;
|
||||
}
|
||||
.file-preview-thumbnails {
|
||||
.krajee-default.file-preview-frame {
|
||||
border: 0;
|
||||
box-shadow: @box-shadow;
|
||||
}
|
||||
}
|
||||
.kv-fileinput-error {
|
||||
ul {
|
||||
list-style: none;
|
||||
}
|
||||
}
|
||||
}
|
||||
.file-caption-main {
|
||||
.form-control {
|
||||
box-shadow: 0 2px 15px 0 rgba(0, 0, 0, 0.13);
|
||||
border: none;
|
||||
border-radius: 0;
|
||||
padding: @form-control-padding;
|
||||
&:focus {
|
||||
z-index: 0;
|
||||
}
|
||||
}
|
||||
.btn {
|
||||
padding: @form-control-padding;
|
||||
border: 0;
|
||||
&:first-child {
|
||||
border-left: 1px solid #e2e2e2;
|
||||
}
|
||||
&:last-child {
|
||||
margin-right: -1px;
|
||||
}
|
||||
}
|
||||
.btn-file {
|
||||
border-color: #2383eb;
|
||||
background-color: #2383eb;
|
||||
border-radius: 0;
|
||||
}
|
||||
.input-group-append {
|
||||
box-shadow: @box-shadow;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// 摸态框全屏
|
||||
.file-zoom-fullscreen.modal {
|
||||
z-index: 999999;
|
||||
}
|
||||
|
||||
// mdui
|
||||
.mdui-tab-scrollable {
|
||||
padding-left: 0;
|
||||
}
|
||||
|
||||
.panel {
|
||||
@border-radius: .5rem;
|
||||
@padding: 1rem;
|
||||
@border-color: #f1f1f1;
|
||||
padding: 0;
|
||||
overflow: hidden;
|
||||
white-space: normal;
|
||||
word-break: break-all;
|
||||
box-shadow: 0 0 20px 0 rgba(0, 0, 0, 0.13);
|
||||
border-radius: @border-radius;
|
||||
.panel-header {
|
||||
padding: @padding;
|
||||
}
|
||||
.panel-body {
|
||||
border-top: 1px solid @border-color;
|
||||
border-bottom: 1px solid @border-color;
|
||||
padding: @padding;
|
||||
}
|
||||
.panel-body-box {
|
||||
border-top: 1px solid @border-color;
|
||||
padding: @padding;
|
||||
border-bottom-left-radius: @border-radius;
|
||||
border-bottom-right-radius: @border-radius;
|
||||
}
|
||||
.panel-footer {
|
||||
padding: @padding;
|
||||
}
|
||||
}
|
||||
|
||||
.error-box {
|
||||
border: none;
|
||||
margin: 0;
|
||||
}
|
||||
|
||||
.none {
|
||||
display: none;
|
||||
}
|
||||
|
||||
#loading-container {
|
||||
position: fixed;
|
||||
top: 0;
|
||||
left: 0;
|
||||
right: 0;
|
||||
bottom: 0;
|
||||
display: none;
|
||||
.mask {
|
||||
position: absolute;
|
||||
width: 100%;
|
||||
z-index: 9999;
|
||||
}
|
||||
.loading {
|
||||
position: absolute;
|
||||
top: 5rem;
|
||||
right: 1rem;
|
||||
z-index: 10000;
|
||||
}
|
||||
}
|
||||
|
||||
.panel-box {
|
||||
overflow: hidden;
|
||||
white-space: normal;
|
||||
word-break: break-all;
|
||||
box-shadow: 0 0 20px 0 rgba(0, 0, 0, 0.13);
|
||||
border-radius: .5rem;
|
||||
padding: 1rem;
|
||||
}
|
||||
|
||||
#menu {
|
||||
.quota-container {
|
||||
position: absolute;
|
||||
left: 50%;
|
||||
bottom: 2rem;
|
||||
text-align: left;
|
||||
transform: translateX(-50%);
|
||||
progress {
|
||||
background-color: #f6f6f6;
|
||||
display: inline;
|
||||
height: .5rem;
|
||||
}
|
||||
progress::-webkit-progress-bar {
|
||||
background-color: #e0eaf0;
|
||||
}
|
||||
progress::-webkit-progress-value {
|
||||
background-color: #1abc9c;
|
||||
}
|
||||
progress::-moz-progress-bar {
|
||||
background-color: #e0eaf0;
|
||||
}
|
||||
progress::-moz-progress-value {
|
||||
background-color: #708d9b;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
#search-form {
|
||||
.search-input {
|
||||
display: inline-block;
|
||||
padding-bottom: .6rem;
|
||||
width: 140px;
|
||||
}
|
||||
}
|
||||
|
||||
footer {
|
||||
position: absolute;
|
||||
bottom: 0;
|
||||
width: 100%;
|
||||
height: 60px;
|
||||
line-height: 60px;
|
||||
color: #999;
|
||||
text-align: left;
|
||||
background-color: #f5f5f5;
|
||||
}
|
||||
|
||||
.pagination {
|
||||
display: inline-block;
|
||||
padding-left: 0;
|
||||
margin: 20px 0;
|
||||
border-radius: 4px;
|
||||
}
|
||||
|
||||
.pagination > li {
|
||||
display: inline;
|
||||
}
|
||||
|
||||
.pagination > li > a,
|
||||
.pagination > li > span {
|
||||
position: relative;
|
||||
float: left;
|
||||
text-decoration: none;
|
||||
color: #00b5ad;
|
||||
background-color: #fff;
|
||||
border: 1px solid #ddd;
|
||||
margin-left: -1px;
|
||||
padding: 5px 10px;
|
||||
font-size: 12px;
|
||||
line-height: 1.5;
|
||||
}
|
||||
|
||||
.pagination > li:first-child > a,
|
||||
.pagination > li:first-child > span {
|
||||
margin-left: 0;
|
||||
border-bottom-left-radius: 3px;
|
||||
border-top-left-radius: 3px;
|
||||
}
|
||||
|
||||
.pagination > li:last-child > a,
|
||||
.pagination > li:last-child > span {
|
||||
border-bottom-right-radius: 3px;
|
||||
border-top-right-radius: 3px;
|
||||
}
|
||||
|
||||
.pagination > li > a:hover,
|
||||
.pagination > li > a:focus,
|
||||
.pagination > li > span:hover,
|
||||
.pagination > li > span:focus {
|
||||
z-index: 2;
|
||||
color: #22ddde;
|
||||
background-color: #eeeeee;
|
||||
border-color: #ddd;
|
||||
}
|
||||
|
||||
.pagination > .active > a,
|
||||
.pagination > .active > a:hover,
|
||||
.pagination > .active > a:focus,
|
||||
.pagination > .active > span,
|
||||
.pagination > .active > span:hover,
|
||||
.pagination > .active > span:focus {
|
||||
z-index: 3;
|
||||
color: #e4e4e4;
|
||||
background-color: transparent;
|
||||
border-color: #e4e4e4;
|
||||
cursor: default;
|
||||
}
|
||||
|
||||
.pagination > .disabled > span,
|
||||
.pagination > .disabled > span:hover,
|
||||
.pagination > .disabled > span:focus,
|
||||
.pagination > .disabled > a,
|
||||
.pagination > .disabled > a:hover,
|
||||
.pagination > .disabled > a:focus {
|
||||
color: #777777;
|
||||
background-color: #fff;
|
||||
border-color: #ddd;
|
||||
cursor: not-allowed;
|
||||
}
|
||||
|
||||
@media (max-width: 1200px) {
|
||||
}
|
||||
|
||||
@media (max-width: 992px) {
|
||||
}
|
||||
|
||||
@media (max-width: 768px) {
|
||||
body {
|
||||
margin-bottom: 90px;
|
||||
}
|
||||
|
||||
.krajee-default.file-preview-frame {
|
||||
width: 95%;
|
||||
.kv-file-content {
|
||||
width: 100%;
|
||||
height: 100%;
|
||||
}
|
||||
}
|
||||
|
||||
#loading-container {
|
||||
.loading {
|
||||
top: 4.5rem;
|
||||
}
|
||||
}
|
||||
|
||||
main {
|
||||
// 我的图片
|
||||
.images-container {
|
||||
#info {
|
||||
img.qrcode {
|
||||
width: 150px;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
footer {
|
||||
height: auto;
|
||||
width: 100% !important;
|
||||
line-height: 1.666;
|
||||
padding: 1rem 0;
|
||||
}
|
||||
}
|
||||
|
||||
@media (max-width: 576px) {
|
||||
|
||||
}
|
25
public/static/app/iconfont/iconfont.css
Normal file
@ -0,0 +1,25 @@
|
||||
|
||||
@font-face {font-family: "iconfont";
|
||||
src: url('iconfont.eot?t=1538632687575'); /* IE9*/
|
||||
src: url('iconfont.eot?t=1538632687575#iefix') format('embedded-opentype'), /* IE6-IE8 */
|
||||
url('data:application/x-font-woff;charset=utf-8;base64,d09GRgABAAAAAAZsAAsAAAAACUAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAABHU1VCAAABCAAAADMAAABCsP6z7U9TLzIAAAE8AAAARAAAAFY8hE3CY21hcAAAAYAAAABsAAABsuLGn6BnbHlmAAAB7AAAAmkAAALctxm+EGhlYWQAAARYAAAALwAAADYS1t3baGhlYQAABIgAAAAeAAAAJAfeA4lobXR4AAAEqAAAABEAAAAUFAMAAGxvY2EAAAS8AAAADAAAAAwB0gJKbWF4cAAABMgAAAAfAAAAIAESAJJuYW1lAAAE6AAAAUUAAAJtPlT+fXBvc3QAAAYwAAAAOQAAAEpzmDqXeJxjYGRgYOBikGPQYWB0cfMJYeBgYGGAAJAMY05meiJQDMoDyrGAaQ4gZoOIAgCKIwNPAHicY2BkYWScwMDKwMHUyXSGgYGhH0IzvmYwYuRgYGBiYGVmwAoC0lxTGBye8b0+z9zwv4EhhrmBoQEozAiSAwDuXwzGeJztkbsNgDAMRF8+IIQQa4SCIRiIikXZIikyRLBjCobgrBedT05jAwMQhF2I4C4cqlNS1/PA3PPIIf3MhMfnNaey1bs1+PpXTuas1Af568WM/Fr6e7xd1O0Zuu2cDL1I2QydqbeBfwDrxBnbeJw9Uj2IE1EQfvN+d7M/ySa7G+Pt5W+TDRwmd0k2WU7Jmhwcwh2Ipdx1tqeNNjY2gniFnaUH9trZCXJnp6WChdpYaCmIIFddNk4OFN6D7837Zr6ZjyGMkMUf9oSZxCHr5BEh7WaPxikdVKlr0zAJR3HUlKsQNqXrXwHP9QfjCQy9wTiOwo7N8yCVTf1ylZURIK3HOz1IUpakNEbU6dFOj6WQxEkqhli1XIWyr6oUsxT90t7qB0F/a2e2EQQbs/bNaaFib5qOY27alcLUchzrM1OGLalg0nU1Lpi9slb3ggvbXX8yTYctoWmKR8PEKxQVUN9UOY3JXE5nSjKer7eijlNeawW6WxQcW2UUDEsrBf3ZztZSEpX7wYfJUnHiVMx0qZhSu+J8tT3XsLW8pl3s9y55hWarWRCMcSaVpnE1Ha7WnLxlFF3PLHqG8Dwcx14pO6parVzuBnllFD2zMglqdW4ULadkoNFLr1+zd+waIkUKhMAo9EpO6JQG+Krjpd29vb3uG8hlp9lhdgo5qu/vZ0/ByX7RF/9icB9y57XeshM2IyZpkhBr2aDQWnQaTS+BjNYhiq/CeFCDZOzXoAqqD4uTOefzk+O5EPPj39lHbskjIdrClgdn3EYAgs3w6z8te4UkEEfIaAtxcIaESFiCEIr6Z+whXZBVMkL1xnJJhqOGcho4lF9u4KYMB6ifOHEEGFjiGHsKpfLOychhd+fvlb4Nzx5nP7eZAbu6ZPS7BD3rUYuzQzxMWDT7pjQwIaQLXX16fj3bfvkjR29JDW4zSR8oPdvlFtA73OT3GFg3dBlZaA/5CxEHgD4AAAB4nGNgZGBgAOKObMWYeH6brwzcLAwgcP32mfcI+v9OFgZmdyCXg4EJJAoASfcMCwB4nGNgZGBgbvjfwBDDwswABCwMDIwMqIAVAEdWAnEAAHicY2FgYGBBxswMDAABDQAYAAAAAAAAAAC2ANwBHAFueJxjYGRgYGBlaGNgZgABJiDmAkIGhv9gPgMAFiwBpQB4nGWPTU7DMBCFX/oHpBKqqGCH5AViASj9EatuWFRq911036ZOmyqJI8et1ANwHo7ACTgC3IA78EgnmzaWx9+8eWNPANzgBx6O3y33kT1cMjtyDRe4F65TfxBukF+Em2jjVbhF/U3YxzOmwm10YXmD17hi9oR3YQ8dfAjXcI1P4Tr1L+EG+Vu4iTv8CrfQ8erCPuZeV7iNRy/2x1YvnF6p5UHFockikzm/gple75KFrdLqnGtbxCZTg6BfSVOdaVvdU+zXQ+ciFVmTqgmrOkmMyq3Z6tAFG+fyUa8XiR6EJuVYY/62xgKOcQWFJQ6MMUIYZIjK6Og7VWb0r7FDwl57Vj3N53RbFNT/c4UBAvTPXFO6stJ5Ok+BPV8bUnV0K27LnpQ0kV7NSRKyQl7WtlRC6gE2ZVeOEXpc0Yk/KGdI/wAJWm7IAAAAeJxjYGKAAC4G7ICVkYmRmZGFkZWRjYGjKDU9s7gktYglMy8tny05Iz8zOZU1Jz89M4+BAQCf6wnXAAAA') format('woff'),
|
||||
url('iconfont.ttf?t=1538632687575') format('truetype'), /* chrome, firefox, opera, Safari, Android, iOS 4.2+*/
|
||||
url('iconfont.svg?t=1538632687575#iconfont') format('svg'); /* iOS 4.1- */
|
||||
}
|
||||
|
||||
.iconfont {
|
||||
font-family:"iconfont" !important;
|
||||
font-size:16px;
|
||||
font-style:normal;
|
||||
-webkit-font-smoothing: antialiased;
|
||||
-moz-osx-font-smoothing: grayscale;
|
||||
}
|
||||
|
||||
.icon-register:before { content: "\e60e"; }
|
||||
|
||||
.icon-info:before { content: "\ebcf"; }
|
||||
|
||||
.icon-choice:before { content: "\e627"; }
|
||||
|
||||
.icon-login:before { content: "\e728"; }
|
||||
|
BIN
public/static/app/iconfont/iconfont.eot
Normal file
1
public/static/app/iconfont/iconfont.js
Normal file
38
public/static/app/iconfont/iconfont.svg
Normal file
After Width: | Height: | Size: 10 KiB |
BIN
public/static/app/iconfont/iconfont.ttf
Normal file
BIN
public/static/app/iconfont/iconfont.woff
Normal file
BIN
public/static/app/images/loading.jpg
Normal file
After Width: | Height: | Size: 12 KiB |
BIN
public/static/app/images/logo.png
Normal file
After Width: | Height: | Size: 10 KiB |
118
public/static/app/js/app.js
Normal file
@ -0,0 +1,118 @@
|
||||
var app = {
|
||||
/**
|
||||
* ajax
|
||||
* @param url
|
||||
* @param data
|
||||
* @param success
|
||||
* @param error
|
||||
*/
|
||||
ajax: function (url, data, success, error) {
|
||||
var loading = $('#loading-container');
|
||||
$.ajax({
|
||||
url: url,
|
||||
type: 'post',
|
||||
data: data,
|
||||
dataType: 'json',
|
||||
beforeSend: function () {
|
||||
loading.fadeIn(500);
|
||||
},
|
||||
success: success,
|
||||
error: error,
|
||||
complete: function () {
|
||||
loading.fadeOut(100);
|
||||
}
|
||||
});
|
||||
},
|
||||
/**
|
||||
* 执行请求
|
||||
* @param url 请求地址
|
||||
* @param data 数据
|
||||
* @param success 后端返回成功后执行的回调
|
||||
* @param error 后端返回失败后执行的回调
|
||||
* @returns {*|void}
|
||||
*/
|
||||
request: function (url, data, success, error) {
|
||||
return app.ajax(url, data, function (response) {
|
||||
mdui.snackbar({
|
||||
message: "<i class=\"mdui-icon material-icons\">" + (response.code ? '' : '') + ";</i> " + response.msg,
|
||||
position: 'right-top',
|
||||
timeout: response.code ? 1000 : 2000,
|
||||
onClose: function () {
|
||||
if (response.code) {
|
||||
success && success();
|
||||
} else {
|
||||
error && error();
|
||||
}
|
||||
}
|
||||
});
|
||||
});
|
||||
},
|
||||
/**
|
||||
* Msg
|
||||
* @param bool
|
||||
* @param msg
|
||||
* @param callback
|
||||
*/
|
||||
msg: function (bool, msg, callback) {
|
||||
mdui.snackbar({
|
||||
message: "<i class=\"mdui-icon material-icons\">" + (bool ? '' : '') + ";</i> " + msg,
|
||||
position: 'right-top',
|
||||
timeout: bool ? 1000 : 2000,
|
||||
onClose: function () {
|
||||
if (bool) callback && callback();
|
||||
}
|
||||
});
|
||||
},
|
||||
cookie: {
|
||||
/**
|
||||
* 设置cookie
|
||||
* @param key cookie名称
|
||||
* @param val cookie值
|
||||
* @param time 过期时间(天)
|
||||
* @param path cookie路径
|
||||
*/
|
||||
set: function (key, val, time, path) {
|
||||
var date = new Date();
|
||||
var expiresDays = time;
|
||||
date.setTime(date.getTime() + expiresDays * 24 * 3600 * 1000);
|
||||
document.cookie = key + "=" + val + ";expires=" + date.toGMTString() + (path ? (";path=" + path) : '');
|
||||
},
|
||||
/**
|
||||
* 获取cookie
|
||||
* @param key cookie名称
|
||||
* @returns {*}
|
||||
*/
|
||||
get: function (key) {
|
||||
var getCookie = document.cookie.replace(/[ ]/g, "");
|
||||
var arrCookie = getCookie.split(";");
|
||||
var tips;
|
||||
for (var i = 0; i < arrCookie.length; i++) {
|
||||
var arr = arrCookie[i].split("=");
|
||||
if (key === arr[0]) {
|
||||
tips = arr[1];
|
||||
break;
|
||||
}
|
||||
}
|
||||
return tips;
|
||||
},
|
||||
/**
|
||||
* 删除cookie
|
||||
* @param key
|
||||
*/
|
||||
delete: function (key) {
|
||||
var date = new Date();
|
||||
date.setTime(date.getTime() - 10000);
|
||||
document.cookie = key + "=v; expires =" + date.toGMTString();
|
||||
}
|
||||
},
|
||||
/**
|
||||
* 字节换算
|
||||
* @param bytes
|
||||
* @returns {string}
|
||||
*/
|
||||
bytesToSize: function (bytes) {
|
||||
if (bytes === 0) return '0 B';
|
||||
var k = 1024, sizes = ['B', 'KB', 'MB', 'GB', 'TB', 'PB', 'EB', 'ZB', 'YB'], i = Math.floor(Math.log(bytes) / Math.log(k));
|
||||
return (bytes / Math.pow(k, i)).toFixed(2) + ' ' + sizes[i];
|
||||
}
|
||||
};
|
12
public/static/bootstrap-fileinput/4.5.1/css/fileinput.min.css
vendored
Normal file
BIN
public/static/bootstrap-fileinput/4.5.1/img/loading-sm.gif
Normal file
After Width: | Height: | Size: 2.6 KiB |
BIN
public/static/bootstrap-fileinput/4.5.1/img/loading.gif
Normal file
After Width: | Height: | Size: 847 B |
11
public/static/bootstrap-fileinput/4.5.1/js/fileinput.min.js
vendored
Normal file
100
public/static/bootstrap-fileinput/4.5.1/js/locales/zh.js
Normal file
@ -0,0 +1,100 @@
|
||||
/*!
|
||||
* FileInput Chinese Translations
|
||||
*
|
||||
* This file must be loaded after 'fileinput.js'. Patterns in braces '{}', or
|
||||
* any HTML markup tags in the messages must not be converted or translated.
|
||||
*
|
||||
* @see http://github.com/kartik-v/bootstrap-fileinput
|
||||
* @author kangqf <kangqingfei@gmail.com>
|
||||
*
|
||||
* NOTE: this file must be saved in UTF-8 encoding.
|
||||
*/
|
||||
(function ($) {
|
||||
"use strict";
|
||||
|
||||
$.fn.fileinputLocales['zh'] = {
|
||||
fileSingle: '文件',
|
||||
filePlural: '个文件',
|
||||
browseLabel: '选择 …',
|
||||
removeLabel: '移除',
|
||||
removeTitle: '清除选中文件',
|
||||
cancelLabel: '取消',
|
||||
cancelTitle: '取消进行中的上传',
|
||||
uploadLabel: '上传',
|
||||
uploadTitle: '上传选中文件',
|
||||
msgNo: '没有',
|
||||
msgNoFilesSelected: '未选择文件',
|
||||
msgCancelled: '取消',
|
||||
msgPlaceholder: '选择 {files}...',
|
||||
msgZoomModalHeading: '详细预览',
|
||||
msgFileRequired: '必须选择一个文件上传.',
|
||||
msgSizeTooSmall: '文件 "{name}" (<b>{size} KB</b>) 必须大于限定大小 <b>{minSize} KB</b>.',
|
||||
msgSizeTooLarge: '文件 "{name}" (<b>{size} KB</b>) 超过了允许大小 <b>{maxSize} KB</b>.',
|
||||
msgFilesTooLess: '你必须选择最少 <b>{n}</b> {files} 来上传. ',
|
||||
msgFilesTooMany: '选择的上传文件个数 <b>({n})</b> 超出最大文件的限制个数 <b>{m}</b>.',
|
||||
msgFileNotFound: '文件 "{name}" 未找到!',
|
||||
msgFileSecured: '安全限制,为了防止读取文件 "{name}".',
|
||||
msgFileNotReadable: '文件 "{name}" 不可读.',
|
||||
msgFilePreviewAborted: '取消 "{name}" 的预览.',
|
||||
msgFilePreviewError: '读取 "{name}" 时出现了一个错误.',
|
||||
msgInvalidFileName: '文件名 "{name}" 包含非法字符.',
|
||||
msgInvalidFileType: '不正确的类型 "{name}". 只支持 "{types}" 类型的文件.',
|
||||
msgInvalidFileExtension: '不正确的文件扩展名 "{name}". 只支持 "{extensions}" 的文件扩展名.',
|
||||
msgFileTypes: {
|
||||
'image': 'image',
|
||||
'html': 'HTML',
|
||||
'text': 'text',
|
||||
'video': 'video',
|
||||
'audio': 'audio',
|
||||
'flash': 'flash',
|
||||
'pdf': 'PDF',
|
||||
'object': 'object'
|
||||
},
|
||||
msgUploadAborted: '该文件上传被中止',
|
||||
msgUploadThreshold: '处理中...',
|
||||
msgUploadBegin: '正在初始化...',
|
||||
msgUploadEnd: '完成',
|
||||
msgUploadEmpty: '无效的文件上传.',
|
||||
msgUploadError: '上传出错',
|
||||
msgValidationError: '验证错误',
|
||||
msgLoading: '加载第 {index} 文件 共 {files} …',
|
||||
msgProgress: '加载第 {index} 文件 共 {files} - {name} - {percent}% 完成.',
|
||||
msgSelected: '{n} {files} 选中',
|
||||
msgFoldersNotAllowed: '只支持拖拽文件! 跳过 {n} 拖拽的文件夹.',
|
||||
msgImageWidthSmall: '图像文件的"{name}"的宽度必须是至少{size}像素.',
|
||||
msgImageHeightSmall: '图像文件的"{name}"的高度必须至少为{size}像素.',
|
||||
msgImageWidthLarge: '图像文件"{name}"的宽度不能超过{size}像素.',
|
||||
msgImageHeightLarge: '图像文件"{name}"的高度不能超过{size}像素.',
|
||||
msgImageResizeError: '无法获取的图像尺寸调整。',
|
||||
msgImageResizeException: '调整图像大小时发生错误。<pre>{errors}</pre>',
|
||||
msgAjaxError: '{operation} 发生错误. 请重试!',
|
||||
msgAjaxProgressError: '{operation} 失败',
|
||||
ajaxOperations: {
|
||||
deleteThumb: '删除文件',
|
||||
uploadThumb: '上传文件',
|
||||
uploadBatch: '批量上传',
|
||||
uploadExtra: '表单数据上传'
|
||||
},
|
||||
dropZoneTitle: '拖拽文件到这里 …<br>支持多文件同时上传',
|
||||
dropZoneClickTitle: '<br>(或点击{files}按钮选择文件)',
|
||||
fileActionSettings: {
|
||||
removeTitle: '删除文件',
|
||||
uploadTitle: '上传文件',
|
||||
uploadRetryTitle: '重试',
|
||||
zoomTitle: '查看详情',
|
||||
dragTitle: '移动 / 重置',
|
||||
indicatorNewTitle: '没有上传',
|
||||
indicatorSuccessTitle: '上传',
|
||||
indicatorErrorTitle: '上传错误',
|
||||
indicatorLoadingTitle: '上传 ...'
|
||||
},
|
||||
previewZoomButtonTitles: {
|
||||
prev: '预览上一个文件',
|
||||
next: '预览下一个文件',
|
||||
toggleheader: '缩放',
|
||||
fullscreen: '全屏',
|
||||
borderless: '无边界模式',
|
||||
close: '关闭当前预览'
|
||||
}
|
||||
};
|
||||
})(window.jQuery);
|
6
public/static/bootstrap/3.3.7/css/bootstrap.min.css
vendored
Normal file
@ -0,0 +1,288 @@
|
||||
<?xml version="1.0" standalone="no"?>
|
||||
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd" >
|
||||
<svg xmlns="http://www.w3.org/2000/svg">
|
||||
<metadata></metadata>
|
||||
<defs>
|
||||
<font id="glyphicons_halflingsregular" horiz-adv-x="1200" >
|
||||
<font-face units-per-em="1200" ascent="960" descent="-240" />
|
||||
<missing-glyph horiz-adv-x="500" />
|
||||
<glyph horiz-adv-x="0" />
|
||||
<glyph horiz-adv-x="400" />
|
||||
<glyph unicode=" " />
|
||||
<glyph unicode="*" d="M600 1100q15 0 34 -1.5t30 -3.5l11 -1q10 -2 17.5 -10.5t7.5 -18.5v-224l158 158q7 7 18 8t19 -6l106 -106q7 -8 6 -19t-8 -18l-158 -158h224q10 0 18.5 -7.5t10.5 -17.5q6 -41 6 -75q0 -15 -1.5 -34t-3.5 -30l-1 -11q-2 -10 -10.5 -17.5t-18.5 -7.5h-224l158 -158 q7 -7 8 -18t-6 -19l-106 -106q-8 -7 -19 -6t-18 8l-158 158v-224q0 -10 -7.5 -18.5t-17.5 -10.5q-41 -6 -75 -6q-15 0 -34 1.5t-30 3.5l-11 1q-10 2 -17.5 10.5t-7.5 18.5v224l-158 -158q-7 -7 -18 -8t-19 6l-106 106q-7 8 -6 19t8 18l158 158h-224q-10 0 -18.5 7.5 t-10.5 17.5q-6 41 -6 75q0 15 1.5 34t3.5 30l1 11q2 10 10.5 17.5t18.5 7.5h224l-158 158q-7 7 -8 18t6 19l106 106q8 7 19 6t18 -8l158 -158v224q0 10 7.5 18.5t17.5 10.5q41 6 75 6z" />
|
||||
<glyph unicode="+" d="M450 1100h200q21 0 35.5 -14.5t14.5 -35.5v-350h350q21 0 35.5 -14.5t14.5 -35.5v-200q0 -21 -14.5 -35.5t-35.5 -14.5h-350v-350q0 -21 -14.5 -35.5t-35.5 -14.5h-200q-21 0 -35.5 14.5t-14.5 35.5v350h-350q-21 0 -35.5 14.5t-14.5 35.5v200q0 21 14.5 35.5t35.5 14.5 h350v350q0 21 14.5 35.5t35.5 14.5z" />
|
||||
<glyph unicode=" " />
|
||||
<glyph unicode="¥" d="M825 1100h250q10 0 12.5 -5t-5.5 -13l-364 -364q-6 -6 -11 -18h268q10 0 13 -6t-3 -14l-120 -160q-6 -8 -18 -14t-22 -6h-125v-100h275q10 0 13 -6t-3 -14l-120 -160q-6 -8 -18 -14t-22 -6h-125v-174q0 -11 -7.5 -18.5t-18.5 -7.5h-148q-11 0 -18.5 7.5t-7.5 18.5v174 h-275q-10 0 -13 6t3 14l120 160q6 8 18 14t22 6h125v100h-275q-10 0 -13 6t3 14l120 160q6 8 18 14t22 6h118q-5 12 -11 18l-364 364q-8 8 -5.5 13t12.5 5h250q25 0 43 -18l164 -164q8 -8 18 -8t18 8l164 164q18 18 43 18z" />
|
||||
<glyph unicode=" " horiz-adv-x="650" />
|
||||
<glyph unicode=" " horiz-adv-x="1300" />
|
||||
<glyph unicode=" " horiz-adv-x="650" />
|
||||
<glyph unicode=" " horiz-adv-x="1300" />
|
||||
<glyph unicode=" " horiz-adv-x="433" />
|
||||
<glyph unicode=" " horiz-adv-x="325" />
|
||||
<glyph unicode=" " horiz-adv-x="216" />
|
||||
<glyph unicode=" " horiz-adv-x="216" />
|
||||
<glyph unicode=" " horiz-adv-x="162" />
|
||||
<glyph unicode=" " horiz-adv-x="260" />
|
||||
<glyph unicode=" " horiz-adv-x="72" />
|
||||
<glyph unicode=" " horiz-adv-x="260" />
|
||||
<glyph unicode=" " horiz-adv-x="325" />
|
||||
<glyph unicode="€" d="M744 1198q242 0 354 -189q60 -104 66 -209h-181q0 45 -17.5 82.5t-43.5 61.5t-58 40.5t-60.5 24t-51.5 7.5q-19 0 -40.5 -5.5t-49.5 -20.5t-53 -38t-49 -62.5t-39 -89.5h379l-100 -100h-300q-6 -50 -6 -100h406l-100 -100h-300q9 -74 33 -132t52.5 -91t61.5 -54.5t59 -29 t47 -7.5q22 0 50.5 7.5t60.5 24.5t58 41t43.5 61t17.5 80h174q-30 -171 -128 -278q-107 -117 -274 -117q-206 0 -324 158q-36 48 -69 133t-45 204h-217l100 100h112q1 47 6 100h-218l100 100h134q20 87 51 153.5t62 103.5q117 141 297 141z" />
|
||||
<glyph unicode="₽" d="M428 1200h350q67 0 120 -13t86 -31t57 -49.5t35 -56.5t17 -64.5t6.5 -60.5t0.5 -57v-16.5v-16.5q0 -36 -0.5 -57t-6.5 -61t-17 -65t-35 -57t-57 -50.5t-86 -31.5t-120 -13h-178l-2 -100h288q10 0 13 -6t-3 -14l-120 -160q-6 -8 -18 -14t-22 -6h-138v-175q0 -11 -5.5 -18 t-15.5 -7h-149q-10 0 -17.5 7.5t-7.5 17.5v175h-267q-10 0 -13 6t3 14l120 160q6 8 18 14t22 6h117v100h-267q-10 0 -13 6t3 14l120 160q6 8 18 14t22 6h117v475q0 10 7.5 17.5t17.5 7.5zM600 1000v-300h203q64 0 86.5 33t22.5 119q0 84 -22.5 116t-86.5 32h-203z" />
|
||||
<glyph unicode="−" d="M250 700h800q21 0 35.5 -14.5t14.5 -35.5v-200q0 -21 -14.5 -35.5t-35.5 -14.5h-800q-21 0 -35.5 14.5t-14.5 35.5v200q0 21 14.5 35.5t35.5 14.5z" />
|
||||
<glyph unicode="⌛" d="M1000 1200v-150q0 -21 -14.5 -35.5t-35.5 -14.5h-50v-100q0 -91 -49.5 -165.5t-130.5 -109.5q81 -35 130.5 -109.5t49.5 -165.5v-150h50q21 0 35.5 -14.5t14.5 -35.5v-150h-800v150q0 21 14.5 35.5t35.5 14.5h50v150q0 91 49.5 165.5t130.5 109.5q-81 35 -130.5 109.5 t-49.5 165.5v100h-50q-21 0 -35.5 14.5t-14.5 35.5v150h800zM400 1000v-100q0 -60 32.5 -109.5t87.5 -73.5q28 -12 44 -37t16 -55t-16 -55t-44 -37q-55 -24 -87.5 -73.5t-32.5 -109.5v-150h400v150q0 60 -32.5 109.5t-87.5 73.5q-28 12 -44 37t-16 55t16 55t44 37 q55 24 87.5 73.5t32.5 109.5v100h-400z" />
|
||||
<glyph unicode="◼" horiz-adv-x="500" d="M0 0z" />
|
||||
<glyph unicode="☁" d="M503 1089q110 0 200.5 -59.5t134.5 -156.5q44 14 90 14q120 0 205 -86.5t85 -206.5q0 -121 -85 -207.5t-205 -86.5h-750q-79 0 -135.5 57t-56.5 137q0 69 42.5 122.5t108.5 67.5q-2 12 -2 37q0 153 108 260.5t260 107.5z" />
|
||||
<glyph unicode="⛺" d="M774 1193.5q16 -9.5 20.5 -27t-5.5 -33.5l-136 -187l467 -746h30q20 0 35 -18.5t15 -39.5v-42h-1200v42q0 21 15 39.5t35 18.5h30l468 746l-135 183q-10 16 -5.5 34t20.5 28t34 5.5t28 -20.5l111 -148l112 150q9 16 27 20.5t34 -5zM600 200h377l-182 112l-195 534v-646z " />
|
||||
<glyph unicode="✉" d="M25 1100h1150q10 0 12.5 -5t-5.5 -13l-564 -567q-8 -8 -18 -8t-18 8l-564 567q-8 8 -5.5 13t12.5 5zM18 882l264 -264q8 -8 8 -18t-8 -18l-264 -264q-8 -8 -13 -5.5t-5 12.5v550q0 10 5 12.5t13 -5.5zM918 618l264 264q8 8 13 5.5t5 -12.5v-550q0 -10 -5 -12.5t-13 5.5 l-264 264q-8 8 -8 18t8 18zM818 482l364 -364q8 -8 5.5 -13t-12.5 -5h-1150q-10 0 -12.5 5t5.5 13l364 364q8 8 18 8t18 -8l164 -164q8 -8 18 -8t18 8l164 164q8 8 18 8t18 -8z" />
|
||||
<glyph unicode="✏" d="M1011 1210q19 0 33 -13l153 -153q13 -14 13 -33t-13 -33l-99 -92l-214 214l95 96q13 14 32 14zM1013 800l-615 -614l-214 214l614 614zM317 96l-333 -112l110 335z" />
|
||||
<glyph unicode="" d="M700 650v-550h250q21 0 35.5 -14.5t14.5 -35.5v-50h-800v50q0 21 14.5 35.5t35.5 14.5h250v550l-500 550h1200z" />
|
||||
<glyph unicode="" d="M368 1017l645 163q39 15 63 0t24 -49v-831q0 -55 -41.5 -95.5t-111.5 -63.5q-79 -25 -147 -4.5t-86 75t25.5 111.5t122.5 82q72 24 138 8v521l-600 -155v-606q0 -42 -44 -90t-109 -69q-79 -26 -147 -5.5t-86 75.5t25.5 111.5t122.5 82.5q72 24 138 7v639q0 38 14.5 59 t53.5 34z" />
|
||||
<glyph unicode="" d="M500 1191q100 0 191 -39t156.5 -104.5t104.5 -156.5t39 -191l-1 -2l1 -5q0 -141 -78 -262l275 -274q23 -26 22.5 -44.5t-22.5 -42.5l-59 -58q-26 -20 -46.5 -20t-39.5 20l-275 274q-119 -77 -261 -77l-5 1l-2 -1q-100 0 -191 39t-156.5 104.5t-104.5 156.5t-39 191 t39 191t104.5 156.5t156.5 104.5t191 39zM500 1022q-88 0 -162 -43t-117 -117t-43 -162t43 -162t117 -117t162 -43t162 43t117 117t43 162t-43 162t-117 117t-162 43z" />
|
||||
<glyph unicode="" d="M649 949q48 68 109.5 104t121.5 38.5t118.5 -20t102.5 -64t71 -100.5t27 -123q0 -57 -33.5 -117.5t-94 -124.5t-126.5 -127.5t-150 -152.5t-146 -174q-62 85 -145.5 174t-150 152.5t-126.5 127.5t-93.5 124.5t-33.5 117.5q0 64 28 123t73 100.5t104 64t119 20 t120.5 -38.5t104.5 -104z" />
|
||||
<glyph unicode="" d="M407 800l131 353q7 19 17.5 19t17.5 -19l129 -353h421q21 0 24 -8.5t-14 -20.5l-342 -249l130 -401q7 -20 -0.5 -25.5t-24.5 6.5l-343 246l-342 -247q-17 -12 -24.5 -6.5t-0.5 25.5l130 400l-347 251q-17 12 -14 20.5t23 8.5h429z" />
|
||||
<glyph unicode="" d="M407 800l131 353q7 19 17.5 19t17.5 -19l129 -353h421q21 0 24 -8.5t-14 -20.5l-342 -249l130 -401q7 -20 -0.5 -25.5t-24.5 6.5l-343 246l-342 -247q-17 -12 -24.5 -6.5t-0.5 25.5l130 400l-347 251q-17 12 -14 20.5t23 8.5h429zM477 700h-240l197 -142l-74 -226 l193 139l195 -140l-74 229l192 140h-234l-78 211z" />
|
||||
<glyph unicode="" d="M600 1200q124 0 212 -88t88 -212v-250q0 -46 -31 -98t-69 -52v-75q0 -10 6 -21.5t15 -17.5l358 -230q9 -5 15 -16.5t6 -21.5v-93q0 -10 -7.5 -17.5t-17.5 -7.5h-1150q-10 0 -17.5 7.5t-7.5 17.5v93q0 10 6 21.5t15 16.5l358 230q9 6 15 17.5t6 21.5v75q-38 0 -69 52 t-31 98v250q0 124 88 212t212 88z" />
|
||||
<glyph unicode="" d="M25 1100h1150q10 0 17.5 -7.5t7.5 -17.5v-1050q0 -10 -7.5 -17.5t-17.5 -7.5h-1150q-10 0 -17.5 7.5t-7.5 17.5v1050q0 10 7.5 17.5t17.5 7.5zM100 1000v-100h100v100h-100zM875 1000h-550q-10 0 -17.5 -7.5t-7.5 -17.5v-350q0 -10 7.5 -17.5t17.5 -7.5h550 q10 0 17.5 7.5t7.5 17.5v350q0 10 -7.5 17.5t-17.5 7.5zM1000 1000v-100h100v100h-100zM100 800v-100h100v100h-100zM1000 800v-100h100v100h-100zM100 600v-100h100v100h-100zM1000 600v-100h100v100h-100zM875 500h-550q-10 0 -17.5 -7.5t-7.5 -17.5v-350q0 -10 7.5 -17.5 t17.5 -7.5h550q10 0 17.5 7.5t7.5 17.5v350q0 10 -7.5 17.5t-17.5 7.5zM100 400v-100h100v100h-100zM1000 400v-100h100v100h-100zM100 200v-100h100v100h-100zM1000 200v-100h100v100h-100z" />
|
||||
<glyph unicode="" d="M50 1100h400q21 0 35.5 -14.5t14.5 -35.5v-400q0 -21 -14.5 -35.5t-35.5 -14.5h-400q-21 0 -35.5 14.5t-14.5 35.5v400q0 21 14.5 35.5t35.5 14.5zM650 1100h400q21 0 35.5 -14.5t14.5 -35.5v-400q0 -21 -14.5 -35.5t-35.5 -14.5h-400q-21 0 -35.5 14.5t-14.5 35.5v400 q0 21 14.5 35.5t35.5 14.5zM50 500h400q21 0 35.5 -14.5t14.5 -35.5v-400q0 -21 -14.5 -35.5t-35.5 -14.5h-400q-21 0 -35.5 14.5t-14.5 35.5v400q0 21 14.5 35.5t35.5 14.5zM650 500h400q21 0 35.5 -14.5t14.5 -35.5v-400q0 -21 -14.5 -35.5t-35.5 -14.5h-400 q-21 0 -35.5 14.5t-14.5 35.5v400q0 21 14.5 35.5t35.5 14.5z" />
|
||||
<glyph unicode="" d="M50 1100h200q21 0 35.5 -14.5t14.5 -35.5v-200q0 -21 -14.5 -35.5t-35.5 -14.5h-200q-21 0 -35.5 14.5t-14.5 35.5v200q0 21 14.5 35.5t35.5 14.5zM450 1100h200q21 0 35.5 -14.5t14.5 -35.5v-200q0 -21 -14.5 -35.5t-35.5 -14.5h-200q-21 0 -35.5 14.5t-14.5 35.5v200 q0 21 14.5 35.5t35.5 14.5zM850 1100h200q21 0 35.5 -14.5t14.5 -35.5v-200q0 -21 -14.5 -35.5t-35.5 -14.5h-200q-21 0 -35.5 14.5t-14.5 35.5v200q0 21 14.5 35.5t35.5 14.5zM50 700h200q21 0 35.5 -14.5t14.5 -35.5v-200q0 -21 -14.5 -35.5t-35.5 -14.5h-200 q-21 0 -35.5 14.5t-14.5 35.5v200q0 21 14.5 35.5t35.5 14.5zM450 700h200q21 0 35.5 -14.5t14.5 -35.5v-200q0 -21 -14.5 -35.5t-35.5 -14.5h-200q-21 0 -35.5 14.5t-14.5 35.5v200q0 21 14.5 35.5t35.5 14.5zM850 700h200q21 0 35.5 -14.5t14.5 -35.5v-200 q0 -21 -14.5 -35.5t-35.5 -14.5h-200q-21 0 -35.5 14.5t-14.5 35.5v200q0 21 14.5 35.5t35.5 14.5zM50 300h200q21 0 35.5 -14.5t14.5 -35.5v-200q0 -21 -14.5 -35.5t-35.5 -14.5h-200q-21 0 -35.5 14.5t-14.5 35.5v200q0 21 14.5 35.5t35.5 14.5zM450 300h200 q21 0 35.5 -14.5t14.5 -35.5v-200q0 -21 -14.5 -35.5t-35.5 -14.5h-200q-21 0 -35.5 14.5t-14.5 35.5v200q0 21 14.5 35.5t35.5 14.5zM850 300h200q21 0 35.5 -14.5t14.5 -35.5v-200q0 -21 -14.5 -35.5t-35.5 -14.5h-200q-21 0 -35.5 14.5t-14.5 35.5v200q0 21 14.5 35.5 t35.5 14.5z" />
|
||||
<glyph unicode="" d="M50 1100h200q21 0 35.5 -14.5t14.5 -35.5v-200q0 -21 -14.5 -35.5t-35.5 -14.5h-200q-21 0 -35.5 14.5t-14.5 35.5v200q0 21 14.5 35.5t35.5 14.5zM450 1100h700q21 0 35.5 -14.5t14.5 -35.5v-200q0 -21 -14.5 -35.5t-35.5 -14.5h-700q-21 0 -35.5 14.5t-14.5 35.5v200 q0 21 14.5 35.5t35.5 14.5zM50 700h200q21 0 35.5 -14.5t14.5 -35.5v-200q0 -21 -14.5 -35.5t-35.5 -14.5h-200q-21 0 -35.5 14.5t-14.5 35.5v200q0 21 14.5 35.5t35.5 14.5zM450 700h700q21 0 35.5 -14.5t14.5 -35.5v-200q0 -21 -14.5 -35.5t-35.5 -14.5h-700 q-21 0 -35.5 14.5t-14.5 35.5v200q0 21 14.5 35.5t35.5 14.5zM50 300h200q21 0 35.5 -14.5t14.5 -35.5v-200q0 -21 -14.5 -35.5t-35.5 -14.5h-200q-21 0 -35.5 14.5t-14.5 35.5v200q0 21 14.5 35.5t35.5 14.5zM450 300h700q21 0 35.5 -14.5t14.5 -35.5v-200 q0 -21 -14.5 -35.5t-35.5 -14.5h-700q-21 0 -35.5 14.5t-14.5 35.5v200q0 21 14.5 35.5t35.5 14.5z" />
|
||||
<glyph unicode="" d="M465 477l571 571q8 8 18 8t17 -8l177 -177q8 -7 8 -17t-8 -18l-783 -784q-7 -8 -17.5 -8t-17.5 8l-384 384q-8 8 -8 18t8 17l177 177q7 8 17 8t18 -8l171 -171q7 -7 18 -7t18 7z" />
|
||||
<glyph unicode="" d="M904 1083l178 -179q8 -8 8 -18.5t-8 -17.5l-267 -268l267 -268q8 -7 8 -17.5t-8 -18.5l-178 -178q-8 -8 -18.5 -8t-17.5 8l-268 267l-268 -267q-7 -8 -17.5 -8t-18.5 8l-178 178q-8 8 -8 18.5t8 17.5l267 268l-267 268q-8 7 -8 17.5t8 18.5l178 178q8 8 18.5 8t17.5 -8 l268 -267l268 268q7 7 17.5 7t18.5 -7z" />
|
||||
<glyph unicode="" d="M507 1177q98 0 187.5 -38.5t154.5 -103.5t103.5 -154.5t38.5 -187.5q0 -141 -78 -262l300 -299q8 -8 8 -18.5t-8 -18.5l-109 -108q-7 -8 -17.5 -8t-18.5 8l-300 299q-119 -77 -261 -77q-98 0 -188 38.5t-154.5 103t-103 154.5t-38.5 188t38.5 187.5t103 154.5 t154.5 103.5t188 38.5zM506.5 1023q-89.5 0 -165.5 -44t-120 -120.5t-44 -166t44 -165.5t120 -120t165.5 -44t166 44t120.5 120t44 165.5t-44 166t-120.5 120.5t-166 44zM425 900h150q10 0 17.5 -7.5t7.5 -17.5v-75h75q10 0 17.5 -7.5t7.5 -17.5v-150q0 -10 -7.5 -17.5 t-17.5 -7.5h-75v-75q0 -10 -7.5 -17.5t-17.5 -7.5h-150q-10 0 -17.5 7.5t-7.5 17.5v75h-75q-10 0 -17.5 7.5t-7.5 17.5v150q0 10 7.5 17.5t17.5 7.5h75v75q0 10 7.5 17.5t17.5 7.5z" />
|
||||
<glyph unicode="" d="M507 1177q98 0 187.5 -38.5t154.5 -103.5t103.5 -154.5t38.5 -187.5q0 -141 -78 -262l300 -299q8 -8 8 -18.5t-8 -18.5l-109 -108q-7 -8 -17.5 -8t-18.5 8l-300 299q-119 -77 -261 -77q-98 0 -188 38.5t-154.5 103t-103 154.5t-38.5 188t38.5 187.5t103 154.5 t154.5 103.5t188 38.5zM506.5 1023q-89.5 0 -165.5 -44t-120 -120.5t-44 -166t44 -165.5t120 -120t165.5 -44t166 44t120.5 120t44 165.5t-44 166t-120.5 120.5t-166 44zM325 800h350q10 0 17.5 -7.5t7.5 -17.5v-150q0 -10 -7.5 -17.5t-17.5 -7.5h-350q-10 0 -17.5 7.5 t-7.5 17.5v150q0 10 7.5 17.5t17.5 7.5z" />
|
||||
<glyph unicode="" d="M550 1200h100q21 0 35.5 -14.5t14.5 -35.5v-400q0 -21 -14.5 -35.5t-35.5 -14.5h-100q-21 0 -35.5 14.5t-14.5 35.5v400q0 21 14.5 35.5t35.5 14.5zM800 975v166q167 -62 272 -209.5t105 -331.5q0 -117 -45.5 -224t-123 -184.5t-184.5 -123t-224 -45.5t-224 45.5 t-184.5 123t-123 184.5t-45.5 224q0 184 105 331.5t272 209.5v-166q-103 -55 -165 -155t-62 -220q0 -116 57 -214.5t155.5 -155.5t214.5 -57t214.5 57t155.5 155.5t57 214.5q0 120 -62 220t-165 155z" />
|
||||
<glyph unicode="" d="M1025 1200h150q10 0 17.5 -7.5t7.5 -17.5v-1150q0 -10 -7.5 -17.5t-17.5 -7.5h-150q-10 0 -17.5 7.5t-7.5 17.5v1150q0 10 7.5 17.5t17.5 7.5zM725 800h150q10 0 17.5 -7.5t7.5 -17.5v-750q0 -10 -7.5 -17.5t-17.5 -7.5h-150q-10 0 -17.5 7.5t-7.5 17.5v750 q0 10 7.5 17.5t17.5 7.5zM425 500h150q10 0 17.5 -7.5t7.5 -17.5v-450q0 -10 -7.5 -17.5t-17.5 -7.5h-150q-10 0 -17.5 7.5t-7.5 17.5v450q0 10 7.5 17.5t17.5 7.5zM125 300h150q10 0 17.5 -7.5t7.5 -17.5v-250q0 -10 -7.5 -17.5t-17.5 -7.5h-150q-10 0 -17.5 7.5t-7.5 17.5 v250q0 10 7.5 17.5t17.5 7.5z" />
|
||||
<glyph unicode="" d="M600 1174q33 0 74 -5l38 -152l5 -1q49 -14 94 -39l5 -2l134 80q61 -48 104 -105l-80 -134l3 -5q25 -44 39 -93l1 -6l152 -38q5 -43 5 -73q0 -34 -5 -74l-152 -38l-1 -6q-15 -49 -39 -93l-3 -5l80 -134q-48 -61 -104 -105l-134 81l-5 -3q-44 -25 -94 -39l-5 -2l-38 -151 q-43 -5 -74 -5q-33 0 -74 5l-38 151l-5 2q-49 14 -94 39l-5 3l-134 -81q-60 48 -104 105l80 134l-3 5q-25 45 -38 93l-2 6l-151 38q-6 42 -6 74q0 33 6 73l151 38l2 6q13 48 38 93l3 5l-80 134q47 61 105 105l133 -80l5 2q45 25 94 39l5 1l38 152q43 5 74 5zM600 815 q-89 0 -152 -63t-63 -151.5t63 -151.5t152 -63t152 63t63 151.5t-63 151.5t-152 63z" />
|
||||
<glyph unicode="" d="M500 1300h300q41 0 70.5 -29.5t29.5 -70.5v-100h275q10 0 17.5 -7.5t7.5 -17.5v-75h-1100v75q0 10 7.5 17.5t17.5 7.5h275v100q0 41 29.5 70.5t70.5 29.5zM500 1200v-100h300v100h-300zM1100 900v-800q0 -41 -29.5 -70.5t-70.5 -29.5h-700q-41 0 -70.5 29.5t-29.5 70.5 v800h900zM300 800v-700h100v700h-100zM500 800v-700h100v700h-100zM700 800v-700h100v700h-100zM900 800v-700h100v700h-100z" />
|
||||
<glyph unicode="" d="M18 618l620 608q8 7 18.5 7t17.5 -7l608 -608q8 -8 5.5 -13t-12.5 -5h-175v-575q0 -10 -7.5 -17.5t-17.5 -7.5h-250q-10 0 -17.5 7.5t-7.5 17.5v375h-300v-375q0 -10 -7.5 -17.5t-17.5 -7.5h-250q-10 0 -17.5 7.5t-7.5 17.5v575h-175q-10 0 -12.5 5t5.5 13z" />
|
||||
<glyph unicode="" d="M600 1200v-400q0 -41 29.5 -70.5t70.5 -29.5h300v-650q0 -21 -14.5 -35.5t-35.5 -14.5h-800q-21 0 -35.5 14.5t-14.5 35.5v1100q0 21 14.5 35.5t35.5 14.5h450zM1000 800h-250q-21 0 -35.5 14.5t-14.5 35.5v250z" />
|
||||
<glyph unicode="" d="M600 1177q117 0 224 -45.5t184.5 -123t123 -184.5t45.5 -224t-45.5 -224t-123 -184.5t-184.5 -123t-224 -45.5t-224 45.5t-184.5 123t-123 184.5t-45.5 224t45.5 224t123 184.5t184.5 123t224 45.5zM600 1027q-116 0 -214.5 -57t-155.5 -155.5t-57 -214.5t57 -214.5 t155.5 -155.5t214.5 -57t214.5 57t155.5 155.5t57 214.5t-57 214.5t-155.5 155.5t-214.5 57zM525 900h50q10 0 17.5 -7.5t7.5 -17.5v-275h175q10 0 17.5 -7.5t7.5 -17.5v-50q0 -10 -7.5 -17.5t-17.5 -7.5h-250q-10 0 -17.5 7.5t-7.5 17.5v350q0 10 7.5 17.5t17.5 7.5z" />
|
||||
<glyph unicode="" d="M1300 0h-538l-41 400h-242l-41 -400h-538l431 1200h209l-21 -300h162l-20 300h208zM515 800l-27 -300h224l-27 300h-170z" />
|
||||
<glyph unicode="" d="M550 1200h200q21 0 35.5 -14.5t14.5 -35.5v-450h191q20 0 25.5 -11.5t-7.5 -27.5l-327 -400q-13 -16 -32 -16t-32 16l-327 400q-13 16 -7.5 27.5t25.5 11.5h191v450q0 21 14.5 35.5t35.5 14.5zM1125 400h50q10 0 17.5 -7.5t7.5 -17.5v-350q0 -10 -7.5 -17.5t-17.5 -7.5 h-1050q-10 0 -17.5 7.5t-7.5 17.5v350q0 10 7.5 17.5t17.5 7.5h50q10 0 17.5 -7.5t7.5 -17.5v-175h900v175q0 10 7.5 17.5t17.5 7.5z" />
|
||||
<glyph unicode="" d="M600 1177q117 0 224 -45.5t184.5 -123t123 -184.5t45.5 -224t-45.5 -224t-123 -184.5t-184.5 -123t-224 -45.5t-224 45.5t-184.5 123t-123 184.5t-45.5 224t45.5 224t123 184.5t184.5 123t224 45.5zM600 1027q-116 0 -214.5 -57t-155.5 -155.5t-57 -214.5t57 -214.5 t155.5 -155.5t214.5 -57t214.5 57t155.5 155.5t57 214.5t-57 214.5t-155.5 155.5t-214.5 57zM525 900h150q10 0 17.5 -7.5t7.5 -17.5v-275h137q21 0 26 -11.5t-8 -27.5l-223 -275q-13 -16 -32 -16t-32 16l-223 275q-13 16 -8 27.5t26 11.5h137v275q0 10 7.5 17.5t17.5 7.5z " />
|
||||
<glyph unicode="" d="M600 1177q117 0 224 -45.5t184.5 -123t123 -184.5t45.5 -224t-45.5 -224t-123 -184.5t-184.5 -123t-224 -45.5t-224 45.5t-184.5 123t-123 184.5t-45.5 224t45.5 224t123 184.5t184.5 123t224 45.5zM600 1027q-116 0 -214.5 -57t-155.5 -155.5t-57 -214.5t57 -214.5 t155.5 -155.5t214.5 -57t214.5 57t155.5 155.5t57 214.5t-57 214.5t-155.5 155.5t-214.5 57zM632 914l223 -275q13 -16 8 -27.5t-26 -11.5h-137v-275q0 -10 -7.5 -17.5t-17.5 -7.5h-150q-10 0 -17.5 7.5t-7.5 17.5v275h-137q-21 0 -26 11.5t8 27.5l223 275q13 16 32 16 t32 -16z" />
|
||||
<glyph unicode="" d="M225 1200h750q10 0 19.5 -7t12.5 -17l186 -652q7 -24 7 -49v-425q0 -12 -4 -27t-9 -17q-12 -6 -37 -6h-1100q-12 0 -27 4t-17 8q-6 13 -6 38l1 425q0 25 7 49l185 652q3 10 12.5 17t19.5 7zM878 1000h-556q-10 0 -19 -7t-11 -18l-87 -450q-2 -11 4 -18t16 -7h150 q10 0 19.5 -7t11.5 -17l38 -152q2 -10 11.5 -17t19.5 -7h250q10 0 19.5 7t11.5 17l38 152q2 10 11.5 17t19.5 7h150q10 0 16 7t4 18l-87 450q-2 11 -11 18t-19 7z" />
|
||||
<glyph unicode="" d="M600 1177q117 0 224 -45.5t184.5 -123t123 -184.5t45.5 -224t-45.5 -224t-123 -184.5t-184.5 -123t-224 -45.5t-224 45.5t-184.5 123t-123 184.5t-45.5 224t45.5 224t123 184.5t184.5 123t224 45.5zM600 1027q-116 0 -214.5 -57t-155.5 -155.5t-57 -214.5t57 -214.5 t155.5 -155.5t214.5 -57t214.5 57t155.5 155.5t57 214.5t-57 214.5t-155.5 155.5t-214.5 57zM540 820l253 -190q17 -12 17 -30t-17 -30l-253 -190q-16 -12 -28 -6.5t-12 26.5v400q0 21 12 26.5t28 -6.5z" />
|
||||
<glyph unicode="" d="M947 1060l135 135q7 7 12.5 5t5.5 -13v-362q0 -10 -7.5 -17.5t-17.5 -7.5h-362q-11 0 -13 5.5t5 12.5l133 133q-109 76 -238 76q-116 0 -214.5 -57t-155.5 -155.5t-57 -214.5t57 -214.5t155.5 -155.5t214.5 -57t214.5 57t155.5 155.5t57 214.5h150q0 -117 -45.5 -224 t-123 -184.5t-184.5 -123t-224 -45.5t-224 45.5t-184.5 123t-123 184.5t-45.5 224t45.5 224t123 184.5t184.5 123t224 45.5q192 0 347 -117z" />
|
||||
<glyph unicode="" d="M947 1060l135 135q7 7 12.5 5t5.5 -13v-361q0 -11 -7.5 -18.5t-18.5 -7.5h-361q-11 0 -13 5.5t5 12.5l134 134q-110 75 -239 75q-116 0 -214.5 -57t-155.5 -155.5t-57 -214.5h-150q0 117 45.5 224t123 184.5t184.5 123t224 45.5q192 0 347 -117zM1027 600h150 q0 -117 -45.5 -224t-123 -184.5t-184.5 -123t-224 -45.5q-192 0 -348 118l-134 -134q-7 -8 -12.5 -5.5t-5.5 12.5v360q0 11 7.5 18.5t18.5 7.5h360q10 0 12.5 -5.5t-5.5 -12.5l-133 -133q110 -76 240 -76q116 0 214.5 57t155.5 155.5t57 214.5z" />
|
||||
<glyph unicode="" d="M125 1200h1050q10 0 17.5 -7.5t7.5 -17.5v-1150q0 -10 -7.5 -17.5t-17.5 -7.5h-1050q-10 0 -17.5 7.5t-7.5 17.5v1150q0 10 7.5 17.5t17.5 7.5zM1075 1000h-850q-10 0 -17.5 -7.5t-7.5 -17.5v-850q0 -10 7.5 -17.5t17.5 -7.5h850q10 0 17.5 7.5t7.5 17.5v850 q0 10 -7.5 17.5t-17.5 7.5zM325 900h50q10 0 17.5 -7.5t7.5 -17.5v-50q0 -10 -7.5 -17.5t-17.5 -7.5h-50q-10 0 -17.5 7.5t-7.5 17.5v50q0 10 7.5 17.5t17.5 7.5zM525 900h450q10 0 17.5 -7.5t7.5 -17.5v-50q0 -10 -7.5 -17.5t-17.5 -7.5h-450q-10 0 -17.5 7.5t-7.5 17.5v50 q0 10 7.5 17.5t17.5 7.5zM325 700h50q10 0 17.5 -7.5t7.5 -17.5v-50q0 -10 -7.5 -17.5t-17.5 -7.5h-50q-10 0 -17.5 7.5t-7.5 17.5v50q0 10 7.5 17.5t17.5 7.5zM525 700h450q10 0 17.5 -7.5t7.5 -17.5v-50q0 -10 -7.5 -17.5t-17.5 -7.5h-450q-10 0 -17.5 7.5t-7.5 17.5v50 q0 10 7.5 17.5t17.5 7.5zM325 500h50q10 0 17.5 -7.5t7.5 -17.5v-50q0 -10 -7.5 -17.5t-17.5 -7.5h-50q-10 0 -17.5 7.5t-7.5 17.5v50q0 10 7.5 17.5t17.5 7.5zM525 500h450q10 0 17.5 -7.5t7.5 -17.5v-50q0 -10 -7.5 -17.5t-17.5 -7.5h-450q-10 0 -17.5 7.5t-7.5 17.5v50 q0 10 7.5 17.5t17.5 7.5zM325 300h50q10 0 17.5 -7.5t7.5 -17.5v-50q0 -10 -7.5 -17.5t-17.5 -7.5h-50q-10 0 -17.5 7.5t-7.5 17.5v50q0 10 7.5 17.5t17.5 7.5zM525 300h450q10 0 17.5 -7.5t7.5 -17.5v-50q0 -10 -7.5 -17.5t-17.5 -7.5h-450q-10 0 -17.5 7.5t-7.5 17.5v50 q0 10 7.5 17.5t17.5 7.5z" />
|
||||
<glyph unicode="" d="M900 800v200q0 83 -58.5 141.5t-141.5 58.5h-300q-82 0 -141 -59t-59 -141v-200h-100q-41 0 -70.5 -29.5t-29.5 -70.5v-600q0 -41 29.5 -70.5t70.5 -29.5h900q41 0 70.5 29.5t29.5 70.5v600q0 41 -29.5 70.5t-70.5 29.5h-100zM400 800v150q0 21 15 35.5t35 14.5h200 q20 0 35 -14.5t15 -35.5v-150h-300z" />
|
||||
<glyph unicode="" d="M125 1100h50q10 0 17.5 -7.5t7.5 -17.5v-1075h-100v1075q0 10 7.5 17.5t17.5 7.5zM1075 1052q4 0 9 -2q16 -6 16 -23v-421q0 -6 -3 -12q-33 -59 -66.5 -99t-65.5 -58t-56.5 -24.5t-52.5 -6.5q-26 0 -57.5 6.5t-52.5 13.5t-60 21q-41 15 -63 22.5t-57.5 15t-65.5 7.5 q-85 0 -160 -57q-7 -5 -15 -5q-6 0 -11 3q-14 7 -14 22v438q22 55 82 98.5t119 46.5q23 2 43 0.5t43 -7t32.5 -8.5t38 -13t32.5 -11q41 -14 63.5 -21t57 -14t63.5 -7q103 0 183 87q7 8 18 8z" />
|
||||
<glyph unicode="" d="M600 1175q116 0 227 -49.5t192.5 -131t131 -192.5t49.5 -227v-300q0 -10 -7.5 -17.5t-17.5 -7.5h-50q-10 0 -17.5 7.5t-7.5 17.5v300q0 127 -70.5 231.5t-184.5 161.5t-245 57t-245 -57t-184.5 -161.5t-70.5 -231.5v-300q0 -10 -7.5 -17.5t-17.5 -7.5h-50 q-10 0 -17.5 7.5t-7.5 17.5v300q0 116 49.5 227t131 192.5t192.5 131t227 49.5zM220 500h160q8 0 14 -6t6 -14v-460q0 -8 -6 -14t-14 -6h-160q-8 0 -14 6t-6 14v460q0 8 6 14t14 6zM820 500h160q8 0 14 -6t6 -14v-460q0 -8 -6 -14t-14 -6h-160q-8 0 -14 6t-6 14v460 q0 8 6 14t14 6z" />
|
||||
<glyph unicode="" d="M321 814l258 172q9 6 15 2.5t6 -13.5v-750q0 -10 -6 -13.5t-15 2.5l-258 172q-21 14 -46 14h-250q-10 0 -17.5 7.5t-7.5 17.5v350q0 10 7.5 17.5t17.5 7.5h250q25 0 46 14zM900 668l120 120q7 7 17 7t17 -7l34 -34q7 -7 7 -17t-7 -17l-120 -120l120 -120q7 -7 7 -17 t-7 -17l-34 -34q-7 -7 -17 -7t-17 7l-120 119l-120 -119q-7 -7 -17 -7t-17 7l-34 34q-7 7 -7 17t7 17l119 120l-119 120q-7 7 -7 17t7 17l34 34q7 8 17 8t17 -8z" />
|
||||
<glyph unicode="" d="M321 814l258 172q9 6 15 2.5t6 -13.5v-750q0 -10 -6 -13.5t-15 2.5l-258 172q-21 14 -46 14h-250q-10 0 -17.5 7.5t-7.5 17.5v350q0 10 7.5 17.5t17.5 7.5h250q25 0 46 14zM766 900h4q10 -1 16 -10q96 -129 96 -290q0 -154 -90 -281q-6 -9 -17 -10l-3 -1q-9 0 -16 6 l-29 23q-7 7 -8.5 16.5t4.5 17.5q72 103 72 229q0 132 -78 238q-6 8 -4.5 18t9.5 17l29 22q7 5 15 5z" />
|
||||
<glyph unicode="" d="M967 1004h3q11 -1 17 -10q135 -179 135 -396q0 -105 -34 -206.5t-98 -185.5q-7 -9 -17 -10h-3q-9 0 -16 6l-42 34q-8 6 -9 16t5 18q111 150 111 328q0 90 -29.5 176t-84.5 157q-6 9 -5 19t10 16l42 33q7 5 15 5zM321 814l258 172q9 6 15 2.5t6 -13.5v-750q0 -10 -6 -13.5 t-15 2.5l-258 172q-21 14 -46 14h-250q-10 0 -17.5 7.5t-7.5 17.5v350q0 10 7.5 17.5t17.5 7.5h250q25 0 46 14zM766 900h4q10 -1 16 -10q96 -129 96 -290q0 -154 -90 -281q-6 -9 -17 -10l-3 -1q-9 0 -16 6l-29 23q-7 7 -8.5 16.5t4.5 17.5q72 103 72 229q0 132 -78 238 q-6 8 -4.5 18.5t9.5 16.5l29 22q7 5 15 5z" />
|
||||
<glyph unicode="" d="M500 900h100v-100h-100v-100h-400v-100h-100v600h500v-300zM1200 700h-200v-100h200v-200h-300v300h-200v300h-100v200h600v-500zM100 1100v-300h300v300h-300zM800 1100v-300h300v300h-300zM300 900h-100v100h100v-100zM1000 900h-100v100h100v-100zM300 500h200v-500 h-500v500h200v100h100v-100zM800 300h200v-100h-100v-100h-200v100h-100v100h100v200h-200v100h300v-300zM100 400v-300h300v300h-300zM300 200h-100v100h100v-100zM1200 200h-100v100h100v-100zM700 0h-100v100h100v-100zM1200 0h-300v100h300v-100z" />
|
||||
<glyph unicode="" d="M100 200h-100v1000h100v-1000zM300 200h-100v1000h100v-1000zM700 200h-200v1000h200v-1000zM900 200h-100v1000h100v-1000zM1200 200h-200v1000h200v-1000zM400 0h-300v100h300v-100zM600 0h-100v91h100v-91zM800 0h-100v91h100v-91zM1100 0h-200v91h200v-91z" />
|
||||
<glyph unicode="" d="M500 1200l682 -682q8 -8 8 -18t-8 -18l-464 -464q-8 -8 -18 -8t-18 8l-682 682l1 475q0 10 7.5 17.5t17.5 7.5h474zM319.5 1024.5q-29.5 29.5 -71 29.5t-71 -29.5t-29.5 -71.5t29.5 -71.5t71 -29.5t71 29.5t29.5 71.5t-29.5 71.5z" />
|
||||
<glyph unicode="" d="M500 1200l682 -682q8 -8 8 -18t-8 -18l-464 -464q-8 -8 -18 -8t-18 8l-682 682l1 475q0 10 7.5 17.5t17.5 7.5h474zM800 1200l682 -682q8 -8 8 -18t-8 -18l-464 -464q-8 -8 -18 -8t-18 8l-56 56l424 426l-700 700h150zM319.5 1024.5q-29.5 29.5 -71 29.5t-71 -29.5 t-29.5 -71.5t29.5 -71.5t71 -29.5t71 29.5t29.5 71.5t-29.5 71.5z" />
|
||||
<glyph unicode="" d="M300 1200h825q75 0 75 -75v-900q0 -25 -18 -43l-64 -64q-8 -8 -13 -5.5t-5 12.5v950q0 10 -7.5 17.5t-17.5 7.5h-700q-25 0 -43 -18l-64 -64q-8 -8 -5.5 -13t12.5 -5h700q10 0 17.5 -7.5t7.5 -17.5v-950q0 -10 -7.5 -17.5t-17.5 -7.5h-850q-10 0 -17.5 7.5t-7.5 17.5v975 q0 25 18 43l139 139q18 18 43 18z" />
|
||||
<glyph unicode="" d="M250 1200h800q21 0 35.5 -14.5t14.5 -35.5v-1150l-450 444l-450 -445v1151q0 21 14.5 35.5t35.5 14.5z" />
|
||||
<glyph unicode="" d="M822 1200h-444q-11 0 -19 -7.5t-9 -17.5l-78 -301q-7 -24 7 -45l57 -108q6 -9 17.5 -15t21.5 -6h450q10 0 21.5 6t17.5 15l62 108q14 21 7 45l-83 301q-1 10 -9 17.5t-19 7.5zM1175 800h-150q-10 0 -21 -6.5t-15 -15.5l-78 -156q-4 -9 -15 -15.5t-21 -6.5h-550 q-10 0 -21 6.5t-15 15.5l-78 156q-4 9 -15 15.5t-21 6.5h-150q-10 0 -17.5 -7.5t-7.5 -17.5v-650q0 -10 7.5 -17.5t17.5 -7.5h150q10 0 17.5 7.5t7.5 17.5v150q0 10 7.5 17.5t17.5 7.5h750q10 0 17.5 -7.5t7.5 -17.5v-150q0 -10 7.5 -17.5t17.5 -7.5h150q10 0 17.5 7.5 t7.5 17.5v650q0 10 -7.5 17.5t-17.5 7.5zM850 200h-500q-10 0 -19.5 -7t-11.5 -17l-38 -152q-2 -10 3.5 -17t15.5 -7h600q10 0 15.5 7t3.5 17l-38 152q-2 10 -11.5 17t-19.5 7z" />
|
||||
<glyph unicode="" d="M500 1100h200q56 0 102.5 -20.5t72.5 -50t44 -59t25 -50.5l6 -20h150q41 0 70.5 -29.5t29.5 -70.5v-600q0 -41 -29.5 -70.5t-70.5 -29.5h-1000q-41 0 -70.5 29.5t-29.5 70.5v600q0 41 29.5 70.5t70.5 29.5h150q2 8 6.5 21.5t24 48t45 61t72 48t102.5 21.5zM900 800v-100 h100v100h-100zM600 730q-95 0 -162.5 -67.5t-67.5 -162.5t67.5 -162.5t162.5 -67.5t162.5 67.5t67.5 162.5t-67.5 162.5t-162.5 67.5zM600 603q43 0 73 -30t30 -73t-30 -73t-73 -30t-73 30t-30 73t30 73t73 30z" />
|
||||
<glyph unicode="" d="M681 1199l385 -998q20 -50 60 -92q18 -19 36.5 -29.5t27.5 -11.5l10 -2v-66h-417v66q53 0 75 43.5t5 88.5l-82 222h-391q-58 -145 -92 -234q-11 -34 -6.5 -57t25.5 -37t46 -20t55 -6v-66h-365v66q56 24 84 52q12 12 25 30.5t20 31.5l7 13l399 1006h93zM416 521h340 l-162 457z" />
|
||||
<glyph unicode="" d="M753 641q5 -1 14.5 -4.5t36 -15.5t50.5 -26.5t53.5 -40t50.5 -54.5t35.5 -70t14.5 -87q0 -67 -27.5 -125.5t-71.5 -97.5t-98.5 -66.5t-108.5 -40.5t-102 -13h-500v89q41 7 70.5 32.5t29.5 65.5v827q0 24 -0.5 34t-3.5 24t-8.5 19.5t-17 13.5t-28 12.5t-42.5 11.5v71 l471 -1q57 0 115.5 -20.5t108 -57t80.5 -94t31 -124.5q0 -51 -15.5 -96.5t-38 -74.5t-45 -50.5t-38.5 -30.5zM400 700h139q78 0 130.5 48.5t52.5 122.5q0 41 -8.5 70.5t-29.5 55.5t-62.5 39.5t-103.5 13.5h-118v-350zM400 200h216q80 0 121 50.5t41 130.5q0 90 -62.5 154.5 t-156.5 64.5h-159v-400z" />
|
||||
<glyph unicode="" d="M877 1200l2 -57q-83 -19 -116 -45.5t-40 -66.5l-132 -839q-9 -49 13 -69t96 -26v-97h-500v97q186 16 200 98l173 832q3 17 3 30t-1.5 22.5t-9 17.5t-13.5 12.5t-21.5 10t-26 8.5t-33.5 10q-13 3 -19 5v57h425z" />
|
||||
<glyph unicode="" d="M1300 900h-50q0 21 -4 37t-9.5 26.5t-18 17.5t-22 11t-28.5 5.5t-31 2t-37 0.5h-200v-850q0 -22 25 -34.5t50 -13.5l25 -2v-100h-400v100q4 0 11 0.5t24 3t30 7t24 15t11 24.5v850h-200q-25 0 -37 -0.5t-31 -2t-28.5 -5.5t-22 -11t-18 -17.5t-9.5 -26.5t-4 -37h-50v300 h1000v-300zM175 1000h-75v-800h75l-125 -167l-125 167h75v800h-75l125 167z" />
|
||||
<glyph unicode="" d="M1100 900h-50q0 21 -4 37t-9.5 26.5t-18 17.5t-22 11t-28.5 5.5t-31 2t-37 0.5h-200v-650q0 -22 25 -34.5t50 -13.5l25 -2v-100h-400v100q4 0 11 0.5t24 3t30 7t24 15t11 24.5v650h-200q-25 0 -37 -0.5t-31 -2t-28.5 -5.5t-22 -11t-18 -17.5t-9.5 -26.5t-4 -37h-50v300 h1000v-300zM1167 50l-167 -125v75h-800v-75l-167 125l167 125v-75h800v75z" />
|
||||
<glyph unicode="" d="M50 1100h600q21 0 35.5 -14.5t14.5 -35.5v-100q0 -21 -14.5 -35.5t-35.5 -14.5h-600q-21 0 -35.5 14.5t-14.5 35.5v100q0 21 14.5 35.5t35.5 14.5zM50 800h1000q21 0 35.5 -14.5t14.5 -35.5v-100q0 -21 -14.5 -35.5t-35.5 -14.5h-1000q-21 0 -35.5 14.5t-14.5 35.5v100 q0 21 14.5 35.5t35.5 14.5zM50 500h800q21 0 35.5 -14.5t14.5 -35.5v-100q0 -21 -14.5 -35.5t-35.5 -14.5h-800q-21 0 -35.5 14.5t-14.5 35.5v100q0 21 14.5 35.5t35.5 14.5zM50 200h1100q21 0 35.5 -14.5t14.5 -35.5v-100q0 -21 -14.5 -35.5t-35.5 -14.5h-1100 q-21 0 -35.5 14.5t-14.5 35.5v100q0 21 14.5 35.5t35.5 14.5z" />
|
||||
<glyph unicode="" d="M250 1100h700q21 0 35.5 -14.5t14.5 -35.5v-100q0 -21 -14.5 -35.5t-35.5 -14.5h-700q-21 0 -35.5 14.5t-14.5 35.5v100q0 21 14.5 35.5t35.5 14.5zM50 800h1100q21 0 35.5 -14.5t14.5 -35.5v-100q0 -21 -14.5 -35.5t-35.5 -14.5h-1100q-21 0 -35.5 14.5t-14.5 35.5v100 q0 21 14.5 35.5t35.5 14.5zM250 500h700q21 0 35.5 -14.5t14.5 -35.5v-100q0 -21 -14.5 -35.5t-35.5 -14.5h-700q-21 0 -35.5 14.5t-14.5 35.5v100q0 21 14.5 35.5t35.5 14.5zM50 200h1100q21 0 35.5 -14.5t14.5 -35.5v-100q0 -21 -14.5 -35.5t-35.5 -14.5h-1100 q-21 0 -35.5 14.5t-14.5 35.5v100q0 21 14.5 35.5t35.5 14.5z" />
|
||||
<glyph unicode="" d="M500 950v100q0 21 14.5 35.5t35.5 14.5h600q21 0 35.5 -14.5t14.5 -35.5v-100q0 -21 -14.5 -35.5t-35.5 -14.5h-600q-21 0 -35.5 14.5t-14.5 35.5zM100 650v100q0 21 14.5 35.5t35.5 14.5h1000q21 0 35.5 -14.5t14.5 -35.5v-100q0 -21 -14.5 -35.5t-35.5 -14.5h-1000 q-21 0 -35.5 14.5t-14.5 35.5zM300 350v100q0 21 14.5 35.5t35.5 14.5h800q21 0 35.5 -14.5t14.5 -35.5v-100q0 -21 -14.5 -35.5t-35.5 -14.5h-800q-21 0 -35.5 14.5t-14.5 35.5zM0 50v100q0 21 14.5 35.5t35.5 14.5h1100q21 0 35.5 -14.5t14.5 -35.5v-100 q0 -21 -14.5 -35.5t-35.5 -14.5h-1100q-21 0 -35.5 14.5t-14.5 35.5z" />
|
||||
<glyph unicode="" d="M50 1100h1100q21 0 35.5 -14.5t14.5 -35.5v-100q0 -21 -14.5 -35.5t-35.5 -14.5h-1100q-21 0 -35.5 14.5t-14.5 35.5v100q0 21 14.5 35.5t35.5 14.5zM50 800h1100q21 0 35.5 -14.5t14.5 -35.5v-100q0 -21 -14.5 -35.5t-35.5 -14.5h-1100q-21 0 -35.5 14.5t-14.5 35.5v100 q0 21 14.5 35.5t35.5 14.5zM50 500h1100q21 0 35.5 -14.5t14.5 -35.5v-100q0 -21 -14.5 -35.5t-35.5 -14.5h-1100q-21 0 -35.5 14.5t-14.5 35.5v100q0 21 14.5 35.5t35.5 14.5zM50 200h1100q21 0 35.5 -14.5t14.5 -35.5v-100q0 -21 -14.5 -35.5t-35.5 -14.5h-1100 q-21 0 -35.5 14.5t-14.5 35.5v100q0 21 14.5 35.5t35.5 14.5z" />
|
||||
<glyph unicode="" d="M50 1100h100q21 0 35.5 -14.5t14.5 -35.5v-100q0 -21 -14.5 -35.5t-35.5 -14.5h-100q-21 0 -35.5 14.5t-14.5 35.5v100q0 21 14.5 35.5t35.5 14.5zM350 1100h800q21 0 35.5 -14.5t14.5 -35.5v-100q0 -21 -14.5 -35.5t-35.5 -14.5h-800q-21 0 -35.5 14.5t-14.5 35.5v100 q0 21 14.5 35.5t35.5 14.5zM50 800h100q21 0 35.5 -14.5t14.5 -35.5v-100q0 -21 -14.5 -35.5t-35.5 -14.5h-100q-21 0 -35.5 14.5t-14.5 35.5v100q0 21 14.5 35.5t35.5 14.5zM350 800h800q21 0 35.5 -14.5t14.5 -35.5v-100q0 -21 -14.5 -35.5t-35.5 -14.5h-800 q-21 0 -35.5 14.5t-14.5 35.5v100q0 21 14.5 35.5t35.5 14.5zM50 500h100q21 0 35.5 -14.5t14.5 -35.5v-100q0 -21 -14.5 -35.5t-35.5 -14.5h-100q-21 0 -35.5 14.5t-14.5 35.5v100q0 21 14.5 35.5t35.5 14.5zM350 500h800q21 0 35.5 -14.5t14.5 -35.5v-100 q0 -21 -14.5 -35.5t-35.5 -14.5h-800q-21 0 -35.5 14.5t-14.5 35.5v100q0 21 14.5 35.5t35.5 14.5zM50 200h100q21 0 35.5 -14.5t14.5 -35.5v-100q0 -21 -14.5 -35.5t-35.5 -14.5h-100q-21 0 -35.5 14.5t-14.5 35.5v100q0 21 14.5 35.5t35.5 14.5zM350 200h800 q21 0 35.5 -14.5t14.5 -35.5v-100q0 -21 -14.5 -35.5t-35.5 -14.5h-800q-21 0 -35.5 14.5t-14.5 35.5v100q0 21 14.5 35.5t35.5 14.5z" />
|
||||
<glyph unicode="" d="M400 0h-100v1100h100v-1100zM550 1100h100q21 0 35.5 -14.5t14.5 -35.5v-100q0 -21 -14.5 -35.5t-35.5 -14.5h-100q-21 0 -35.5 14.5t-14.5 35.5v100q0 21 14.5 35.5t35.5 14.5zM550 800h500q21 0 35.5 -14.5t14.5 -35.5v-100q0 -21 -14.5 -35.5t-35.5 -14.5h-500 q-21 0 -35.5 14.5t-14.5 35.5v100q0 21 14.5 35.5t35.5 14.5zM267 550l-167 -125v75h-200v100h200v75zM550 500h300q21 0 35.5 -14.5t14.5 -35.5v-100q0 -21 -14.5 -35.5t-35.5 -14.5h-300q-21 0 -35.5 14.5t-14.5 35.5v100q0 21 14.5 35.5t35.5 14.5zM550 200h600 q21 0 35.5 -14.5t14.5 -35.5v-100q0 -21 -14.5 -35.5t-35.5 -14.5h-600q-21 0 -35.5 14.5t-14.5 35.5v100q0 21 14.5 35.5t35.5 14.5z" />
|
||||
<glyph unicode="" d="M50 1100h100q21 0 35.5 -14.5t14.5 -35.5v-100q0 -21 -14.5 -35.5t-35.5 -14.5h-100q-21 0 -35.5 14.5t-14.5 35.5v100q0 21 14.5 35.5t35.5 14.5zM900 0h-100v1100h100v-1100zM50 800h500q21 0 35.5 -14.5t14.5 -35.5v-100q0 -21 -14.5 -35.5t-35.5 -14.5h-500 q-21 0 -35.5 14.5t-14.5 35.5v100q0 21 14.5 35.5t35.5 14.5zM1100 600h200v-100h-200v-75l-167 125l167 125v-75zM50 500h300q21 0 35.5 -14.5t14.5 -35.5v-100q0 -21 -14.5 -35.5t-35.5 -14.5h-300q-21 0 -35.5 14.5t-14.5 35.5v100q0 21 14.5 35.5t35.5 14.5zM50 200h600 q21 0 35.5 -14.5t14.5 -35.5v-100q0 -21 -14.5 -35.5t-35.5 -14.5h-600q-21 0 -35.5 14.5t-14.5 35.5v100q0 21 14.5 35.5t35.5 14.5z" />
|
||||
<glyph unicode="" d="M75 1000h750q31 0 53 -22t22 -53v-650q0 -31 -22 -53t-53 -22h-750q-31 0 -53 22t-22 53v650q0 31 22 53t53 22zM1200 300l-300 300l300 300v-600z" />
|
||||
<glyph unicode="" d="M44 1100h1112q18 0 31 -13t13 -31v-1012q0 -18 -13 -31t-31 -13h-1112q-18 0 -31 13t-13 31v1012q0 18 13 31t31 13zM100 1000v-737l247 182l298 -131l-74 156l293 318l236 -288v500h-1000zM342 884q56 0 95 -39t39 -94.5t-39 -95t-95 -39.5t-95 39.5t-39 95t39 94.5 t95 39z" />
|
||||
<glyph unicode="" d="M648 1169q117 0 216 -60t156.5 -161t57.5 -218q0 -115 -70 -258q-69 -109 -158 -225.5t-143 -179.5l-54 -62q-9 8 -25.5 24.5t-63.5 67.5t-91 103t-98.5 128t-95.5 148q-60 132 -60 249q0 88 34 169.5t91.5 142t137 96.5t166.5 36zM652.5 974q-91.5 0 -156.5 -65 t-65 -157t65 -156.5t156.5 -64.5t156.5 64.5t65 156.5t-65 157t-156.5 65z" />
|
||||
<glyph unicode="" d="M600 1177q117 0 224 -45.5t184.5 -123t123 -184.5t45.5 -224t-45.5 -224t-123 -184.5t-184.5 -123t-224 -45.5t-224 45.5t-184.5 123t-123 184.5t-45.5 224t45.5 224t123 184.5t184.5 123t224 45.5zM600 173v854q-116 0 -214.5 -57t-155.5 -155.5t-57 -214.5t57 -214.5 t155.5 -155.5t214.5 -57z" />
|
||||
<glyph unicode="" d="M554 1295q21 -72 57.5 -143.5t76 -130t83 -118t82.5 -117t70 -116t49.5 -126t18.5 -136.5q0 -71 -25.5 -135t-68.5 -111t-99 -82t-118.5 -54t-125.5 -23q-84 5 -161.5 34t-139.5 78.5t-99 125t-37 164.5q0 69 18 136.5t49.5 126.5t69.5 116.5t81.5 117.5t83.5 119 t76.5 131t58.5 143zM344 710q-23 -33 -43.5 -70.5t-40.5 -102.5t-17 -123q1 -37 14.5 -69.5t30 -52t41 -37t38.5 -24.5t33 -15q21 -7 32 -1t13 22l6 34q2 10 -2.5 22t-13.5 19q-5 4 -14 12t-29.5 40.5t-32.5 73.5q-26 89 6 271q2 11 -6 11q-8 1 -15 -10z" />
|
||||
<glyph unicode="" d="M1000 1013l108 115q2 1 5 2t13 2t20.5 -1t25 -9.5t28.5 -21.5q22 -22 27 -43t0 -32l-6 -10l-108 -115zM350 1100h400q50 0 105 -13l-187 -187h-368q-41 0 -70.5 -29.5t-29.5 -70.5v-500q0 -41 29.5 -70.5t70.5 -29.5h500q41 0 70.5 29.5t29.5 70.5v182l200 200v-332 q0 -165 -93.5 -257.5t-256.5 -92.5h-400q-165 0 -257.5 92.5t-92.5 257.5v400q0 165 92.5 257.5t257.5 92.5zM1009 803l-362 -362l-161 -50l55 170l355 355z" />
|
||||
<glyph unicode="" d="M350 1100h361q-164 -146 -216 -200h-195q-41 0 -70.5 -29.5t-29.5 -70.5v-500q0 -41 29.5 -70.5t70.5 -29.5h500q41 0 70.5 29.5t29.5 70.5l200 153v-103q0 -165 -92.5 -257.5t-257.5 -92.5h-400q-165 0 -257.5 92.5t-92.5 257.5v400q0 165 92.5 257.5t257.5 92.5z M824 1073l339 -301q8 -7 8 -17.5t-8 -17.5l-340 -306q-7 -6 -12.5 -4t-6.5 11v203q-26 1 -54.5 0t-78.5 -7.5t-92 -17.5t-86 -35t-70 -57q10 59 33 108t51.5 81.5t65 58.5t68.5 40.5t67 24.5t56 13.5t40 4.5v210q1 10 6.5 12.5t13.5 -4.5z" />
|
||||
<glyph unicode="" d="M350 1100h350q60 0 127 -23l-178 -177h-349q-41 0 -70.5 -29.5t-29.5 -70.5v-500q0 -41 29.5 -70.5t70.5 -29.5h500q41 0 70.5 29.5t29.5 70.5v69l200 200v-219q0 -165 -92.5 -257.5t-257.5 -92.5h-400q-165 0 -257.5 92.5t-92.5 257.5v400q0 165 92.5 257.5t257.5 92.5z M643 639l395 395q7 7 17.5 7t17.5 -7l101 -101q7 -7 7 -17.5t-7 -17.5l-531 -532q-7 -7 -17.5 -7t-17.5 7l-248 248q-7 7 -7 17.5t7 17.5l101 101q7 7 17.5 7t17.5 -7l111 -111q8 -7 18 -7t18 7z" />
|
||||
<glyph unicode="" d="M318 918l264 264q8 8 18 8t18 -8l260 -264q7 -8 4.5 -13t-12.5 -5h-170v-200h200v173q0 10 5 12t13 -5l264 -260q8 -7 8 -17.5t-8 -17.5l-264 -265q-8 -7 -13 -5t-5 12v173h-200v-200h170q10 0 12.5 -5t-4.5 -13l-260 -264q-8 -8 -18 -8t-18 8l-264 264q-8 8 -5.5 13 t12.5 5h175v200h-200v-173q0 -10 -5 -12t-13 5l-264 265q-8 7 -8 17.5t8 17.5l264 260q8 7 13 5t5 -12v-173h200v200h-175q-10 0 -12.5 5t5.5 13z" />
|
||||
<glyph unicode="" d="M250 1100h100q21 0 35.5 -14.5t14.5 -35.5v-438l464 453q15 14 25.5 10t10.5 -25v-1000q0 -21 -10.5 -25t-25.5 10l-464 453v-438q0 -21 -14.5 -35.5t-35.5 -14.5h-100q-21 0 -35.5 14.5t-14.5 35.5v1000q0 21 14.5 35.5t35.5 14.5z" />
|
||||
<glyph unicode="" d="M50 1100h100q21 0 35.5 -14.5t14.5 -35.5v-438l464 453q15 14 25.5 10t10.5 -25v-438l464 453q15 14 25.5 10t10.5 -25v-1000q0 -21 -10.5 -25t-25.5 10l-464 453v-438q0 -21 -10.5 -25t-25.5 10l-464 453v-438q0 -21 -14.5 -35.5t-35.5 -14.5h-100q-21 0 -35.5 14.5 t-14.5 35.5v1000q0 21 14.5 35.5t35.5 14.5z" />
|
||||
<glyph unicode="" d="M1200 1050v-1000q0 -21 -10.5 -25t-25.5 10l-464 453v-438q0 -21 -10.5 -25t-25.5 10l-492 480q-15 14 -15 35t15 35l492 480q15 14 25.5 10t10.5 -25v-438l464 453q15 14 25.5 10t10.5 -25z" />
|
||||
<glyph unicode="" d="M243 1074l814 -498q18 -11 18 -26t-18 -26l-814 -498q-18 -11 -30.5 -4t-12.5 28v1000q0 21 12.5 28t30.5 -4z" />
|
||||
<glyph unicode="" d="M250 1000h200q21 0 35.5 -14.5t14.5 -35.5v-800q0 -21 -14.5 -35.5t-35.5 -14.5h-200q-21 0 -35.5 14.5t-14.5 35.5v800q0 21 14.5 35.5t35.5 14.5zM650 1000h200q21 0 35.5 -14.5t14.5 -35.5v-800q0 -21 -14.5 -35.5t-35.5 -14.5h-200q-21 0 -35.5 14.5t-14.5 35.5v800 q0 21 14.5 35.5t35.5 14.5z" />
|
||||
<glyph unicode="" d="M1100 950v-800q0 -21 -14.5 -35.5t-35.5 -14.5h-800q-21 0 -35.5 14.5t-14.5 35.5v800q0 21 14.5 35.5t35.5 14.5h800q21 0 35.5 -14.5t14.5 -35.5z" />
|
||||
<glyph unicode="" d="M500 612v438q0 21 10.5 25t25.5 -10l492 -480q15 -14 15 -35t-15 -35l-492 -480q-15 -14 -25.5 -10t-10.5 25v438l-464 -453q-15 -14 -25.5 -10t-10.5 25v1000q0 21 10.5 25t25.5 -10z" />
|
||||
<glyph unicode="" d="M1048 1102l100 1q20 0 35 -14.5t15 -35.5l5 -1000q0 -21 -14.5 -35.5t-35.5 -14.5l-100 -1q-21 0 -35.5 14.5t-14.5 35.5l-2 437l-463 -454q-14 -15 -24.5 -10.5t-10.5 25.5l-2 437l-462 -455q-15 -14 -25.5 -9.5t-10.5 24.5l-5 1000q0 21 10.5 25.5t25.5 -10.5l466 -450 l-2 438q0 20 10.5 24.5t25.5 -9.5l466 -451l-2 438q0 21 14.5 35.5t35.5 14.5z" />
|
||||
<glyph unicode="" d="M850 1100h100q21 0 35.5 -14.5t14.5 -35.5v-1000q0 -21 -14.5 -35.5t-35.5 -14.5h-100q-21 0 -35.5 14.5t-14.5 35.5v438l-464 -453q-15 -14 -25.5 -10t-10.5 25v1000q0 21 10.5 25t25.5 -10l464 -453v438q0 21 14.5 35.5t35.5 14.5z" />
|
||||
<glyph unicode="" d="M686 1081l501 -540q15 -15 10.5 -26t-26.5 -11h-1042q-22 0 -26.5 11t10.5 26l501 540q15 15 36 15t36 -15zM150 400h1000q21 0 35.5 -14.5t14.5 -35.5v-100q0 -21 -14.5 -35.5t-35.5 -14.5h-1000q-21 0 -35.5 14.5t-14.5 35.5v100q0 21 14.5 35.5t35.5 14.5z" />
|
||||
<glyph unicode="" d="M885 900l-352 -353l352 -353l-197 -198l-552 552l552 550z" />
|
||||
<glyph unicode="" d="M1064 547l-551 -551l-198 198l353 353l-353 353l198 198z" />
|
||||
<glyph unicode="" d="M600 1177q117 0 224 -45.5t184.5 -123t123 -184.5t45.5 -224t-45.5 -224t-123 -184.5t-184.5 -123t-224 -45.5t-224 45.5t-184.5 123t-123 184.5t-45.5 224t45.5 224t123 184.5t184.5 123t224 45.5zM650 900h-100q-21 0 -35.5 -14.5t-14.5 -35.5v-150h-150 q-21 0 -35.5 -14.5t-14.5 -35.5v-100q0 -21 14.5 -35.5t35.5 -14.5h150v-150q0 -21 14.5 -35.5t35.5 -14.5h100q21 0 35.5 14.5t14.5 35.5v150h150q21 0 35.5 14.5t14.5 35.5v100q0 21 -14.5 35.5t-35.5 14.5h-150v150q0 21 -14.5 35.5t-35.5 14.5z" />
|
||||
<glyph unicode="" d="M600 1177q117 0 224 -45.5t184.5 -123t123 -184.5t45.5 -224t-45.5 -224t-123 -184.5t-184.5 -123t-224 -45.5t-224 45.5t-184.5 123t-123 184.5t-45.5 224t45.5 224t123 184.5t184.5 123t224 45.5zM850 700h-500q-21 0 -35.5 -14.5t-14.5 -35.5v-100q0 -21 14.5 -35.5 t35.5 -14.5h500q21 0 35.5 14.5t14.5 35.5v100q0 21 -14.5 35.5t-35.5 14.5z" />
|
||||
<glyph unicode="" d="M600 1177q117 0 224 -45.5t184.5 -123t123 -184.5t45.5 -224t-45.5 -224t-123 -184.5t-184.5 -123t-224 -45.5t-224 45.5t-184.5 123t-123 184.5t-45.5 224t45.5 224t123 184.5t184.5 123t224 45.5zM741.5 913q-12.5 0 -21.5 -9l-120 -120l-120 120q-9 9 -21.5 9 t-21.5 -9l-141 -141q-9 -9 -9 -21.5t9 -21.5l120 -120l-120 -120q-9 -9 -9 -21.5t9 -21.5l141 -141q9 -9 21.5 -9t21.5 9l120 120l120 -120q9 -9 21.5 -9t21.5 9l141 141q9 9 9 21.5t-9 21.5l-120 120l120 120q9 9 9 21.5t-9 21.5l-141 141q-9 9 -21.5 9z" />
|
||||
<glyph unicode="" d="M600 1177q117 0 224 -45.5t184.5 -123t123 -184.5t45.5 -224t-45.5 -224t-123 -184.5t-184.5 -123t-224 -45.5t-224 45.5t-184.5 123t-123 184.5t-45.5 224t45.5 224t123 184.5t184.5 123t224 45.5zM546 623l-84 85q-7 7 -17.5 7t-18.5 -7l-139 -139q-7 -8 -7 -18t7 -18 l242 -241q7 -8 17.5 -8t17.5 8l375 375q7 7 7 17.5t-7 18.5l-139 139q-7 7 -17.5 7t-17.5 -7z" />
|
||||
<glyph unicode="" d="M600 1177q117 0 224 -45.5t184.5 -123t123 -184.5t45.5 -224t-45.5 -224t-123 -184.5t-184.5 -123t-224 -45.5t-224 45.5t-184.5 123t-123 184.5t-45.5 224t45.5 224t123 184.5t184.5 123t224 45.5zM588 941q-29 0 -59 -5.5t-63 -20.5t-58 -38.5t-41.5 -63t-16.5 -89.5 q0 -25 20 -25h131q30 -5 35 11q6 20 20.5 28t45.5 8q20 0 31.5 -10.5t11.5 -28.5q0 -23 -7 -34t-26 -18q-1 0 -13.5 -4t-19.5 -7.5t-20 -10.5t-22 -17t-18.5 -24t-15.5 -35t-8 -46q-1 -8 5.5 -16.5t20.5 -8.5h173q7 0 22 8t35 28t37.5 48t29.5 74t12 100q0 47 -17 83 t-42.5 57t-59.5 34.5t-64 18t-59 4.5zM675 400h-150q-10 0 -17.5 -7.5t-7.5 -17.5v-150q0 -10 7.5 -17.5t17.5 -7.5h150q10 0 17.5 7.5t7.5 17.5v150q0 10 -7.5 17.5t-17.5 7.5z" />
|
||||
<glyph unicode="" d="M600 1177q117 0 224 -45.5t184.5 -123t123 -184.5t45.5 -224t-45.5 -224t-123 -184.5t-184.5 -123t-224 -45.5t-224 45.5t-184.5 123t-123 184.5t-45.5 224t45.5 224t123 184.5t184.5 123t224 45.5zM675 1000h-150q-10 0 -17.5 -7.5t-7.5 -17.5v-150q0 -10 7.5 -17.5 t17.5 -7.5h150q10 0 17.5 7.5t7.5 17.5v150q0 10 -7.5 17.5t-17.5 7.5zM675 700h-250q-10 0 -17.5 -7.5t-7.5 -17.5v-50q0 -10 7.5 -17.5t17.5 -7.5h75v-200h-75q-10 0 -17.5 -7.5t-7.5 -17.5v-50q0 -10 7.5 -17.5t17.5 -7.5h350q10 0 17.5 7.5t7.5 17.5v50q0 10 -7.5 17.5 t-17.5 7.5h-75v275q0 10 -7.5 17.5t-17.5 7.5z" />
|
||||
<glyph unicode="" d="M525 1200h150q10 0 17.5 -7.5t7.5 -17.5v-194q103 -27 178.5 -102.5t102.5 -178.5h194q10 0 17.5 -7.5t7.5 -17.5v-150q0 -10 -7.5 -17.5t-17.5 -7.5h-194q-27 -103 -102.5 -178.5t-178.5 -102.5v-194q0 -10 -7.5 -17.5t-17.5 -7.5h-150q-10 0 -17.5 7.5t-7.5 17.5v194 q-103 27 -178.5 102.5t-102.5 178.5h-194q-10 0 -17.5 7.5t-7.5 17.5v150q0 10 7.5 17.5t17.5 7.5h194q27 103 102.5 178.5t178.5 102.5v194q0 10 7.5 17.5t17.5 7.5zM700 893v-168q0 -10 -7.5 -17.5t-17.5 -7.5h-150q-10 0 -17.5 7.5t-7.5 17.5v168q-68 -23 -119 -74 t-74 -119h168q10 0 17.5 -7.5t7.5 -17.5v-150q0 -10 -7.5 -17.5t-17.5 -7.5h-168q23 -68 74 -119t119 -74v168q0 10 7.5 17.5t17.5 7.5h150q10 0 17.5 -7.5t7.5 -17.5v-168q68 23 119 74t74 119h-168q-10 0 -17.5 7.5t-7.5 17.5v150q0 10 7.5 17.5t17.5 7.5h168 q-23 68 -74 119t-119 74z" />
|
||||
<glyph unicode="" d="M600 1177q117 0 224 -45.5t184.5 -123t123 -184.5t45.5 -224t-45.5 -224t-123 -184.5t-184.5 -123t-224 -45.5t-224 45.5t-184.5 123t-123 184.5t-45.5 224t45.5 224t123 184.5t184.5 123t224 45.5zM600 1027q-116 0 -214.5 -57t-155.5 -155.5t-57 -214.5t57 -214.5 t155.5 -155.5t214.5 -57t214.5 57t155.5 155.5t57 214.5t-57 214.5t-155.5 155.5t-214.5 57zM759 823l64 -64q7 -7 7 -17.5t-7 -17.5l-124 -124l124 -124q7 -7 7 -17.5t-7 -17.5l-64 -64q-7 -7 -17.5 -7t-17.5 7l-124 124l-124 -124q-7 -7 -17.5 -7t-17.5 7l-64 64 q-7 7 -7 17.5t7 17.5l124 124l-124 124q-7 7 -7 17.5t7 17.5l64 64q7 7 17.5 7t17.5 -7l124 -124l124 124q7 7 17.5 7t17.5 -7z" />
|
||||
<glyph unicode="" d="M600 1177q117 0 224 -45.5t184.5 -123t123 -184.5t45.5 -224t-45.5 -224t-123 -184.5t-184.5 -123t-224 -45.5t-224 45.5t-184.5 123t-123 184.5t-45.5 224t45.5 224t123 184.5t184.5 123t224 45.5zM600 1027q-116 0 -214.5 -57t-155.5 -155.5t-57 -214.5t57 -214.5 t155.5 -155.5t214.5 -57t214.5 57t155.5 155.5t57 214.5t-57 214.5t-155.5 155.5t-214.5 57zM782 788l106 -106q7 -7 7 -17.5t-7 -17.5l-320 -321q-8 -7 -18 -7t-18 7l-202 203q-8 7 -8 17.5t8 17.5l106 106q7 8 17.5 8t17.5 -8l79 -79l197 197q7 7 17.5 7t17.5 -7z" />
|
||||
<glyph unicode="" d="M600 1177q117 0 224 -45.5t184.5 -123t123 -184.5t45.5 -224t-45.5 -224t-123 -184.5t-184.5 -123t-224 -45.5t-224 45.5t-184.5 123t-123 184.5t-45.5 224t45.5 224t123 184.5t184.5 123t224 45.5zM600 1027q-116 0 -214.5 -57t-155.5 -155.5t-57 -214.5q0 -120 65 -225 l587 587q-105 65 -225 65zM965 819l-584 -584q104 -62 219 -62q116 0 214.5 57t155.5 155.5t57 214.5q0 115 -62 219z" />
|
||||
<glyph unicode="" d="M39 582l522 427q16 13 27.5 8t11.5 -26v-291h550q21 0 35.5 -14.5t14.5 -35.5v-200q0 -21 -14.5 -35.5t-35.5 -14.5h-550v-291q0 -21 -11.5 -26t-27.5 8l-522 427q-16 13 -16 32t16 32z" />
|
||||
<glyph unicode="" d="M639 1009l522 -427q16 -13 16 -32t-16 -32l-522 -427q-16 -13 -27.5 -8t-11.5 26v291h-550q-21 0 -35.5 14.5t-14.5 35.5v200q0 21 14.5 35.5t35.5 14.5h550v291q0 21 11.5 26t27.5 -8z" />
|
||||
<glyph unicode="" d="M682 1161l427 -522q13 -16 8 -27.5t-26 -11.5h-291v-550q0 -21 -14.5 -35.5t-35.5 -14.5h-200q-21 0 -35.5 14.5t-14.5 35.5v550h-291q-21 0 -26 11.5t8 27.5l427 522q13 16 32 16t32 -16z" />
|
||||
<glyph unicode="" d="M550 1200h200q21 0 35.5 -14.5t14.5 -35.5v-550h291q21 0 26 -11.5t-8 -27.5l-427 -522q-13 -16 -32 -16t-32 16l-427 522q-13 16 -8 27.5t26 11.5h291v550q0 21 14.5 35.5t35.5 14.5z" />
|
||||
<glyph unicode="" d="M639 1109l522 -427q16 -13 16 -32t-16 -32l-522 -427q-16 -13 -27.5 -8t-11.5 26v291q-94 -2 -182 -20t-170.5 -52t-147 -92.5t-100.5 -135.5q5 105 27 193.5t67.5 167t113 135t167 91.5t225.5 42v262q0 21 11.5 26t27.5 -8z" />
|
||||
<glyph unicode="" d="M850 1200h300q21 0 35.5 -14.5t14.5 -35.5v-300q0 -21 -10.5 -25t-24.5 10l-94 94l-249 -249q-8 -7 -18 -7t-18 7l-106 106q-7 8 -7 18t7 18l249 249l-94 94q-14 14 -10 24.5t25 10.5zM350 0h-300q-21 0 -35.5 14.5t-14.5 35.5v300q0 21 10.5 25t24.5 -10l94 -94l249 249 q8 7 18 7t18 -7l106 -106q7 -8 7 -18t-7 -18l-249 -249l94 -94q14 -14 10 -24.5t-25 -10.5z" />
|
||||
<glyph unicode="" d="M1014 1120l106 -106q7 -8 7 -18t-7 -18l-249 -249l94 -94q14 -14 10 -24.5t-25 -10.5h-300q-21 0 -35.5 14.5t-14.5 35.5v300q0 21 10.5 25t24.5 -10l94 -94l249 249q8 7 18 7t18 -7zM250 600h300q21 0 35.5 -14.5t14.5 -35.5v-300q0 -21 -10.5 -25t-24.5 10l-94 94 l-249 -249q-8 -7 -18 -7t-18 7l-106 106q-7 8 -7 18t7 18l249 249l-94 94q-14 14 -10 24.5t25 10.5z" />
|
||||
<glyph unicode="" d="M600 1177q117 0 224 -45.5t184.5 -123t123 -184.5t45.5 -224t-45.5 -224t-123 -184.5t-184.5 -123t-224 -45.5t-224 45.5t-184.5 123t-123 184.5t-45.5 224t45.5 224t123 184.5t184.5 123t224 45.5zM704 900h-208q-20 0 -32 -14.5t-8 -34.5l58 -302q4 -20 21.5 -34.5 t37.5 -14.5h54q20 0 37.5 14.5t21.5 34.5l58 302q4 20 -8 34.5t-32 14.5zM675 400h-150q-10 0 -17.5 -7.5t-7.5 -17.5v-150q0 -10 7.5 -17.5t17.5 -7.5h150q10 0 17.5 7.5t7.5 17.5v150q0 10 -7.5 17.5t-17.5 7.5z" />
|
||||
<glyph unicode="" d="M260 1200q9 0 19 -2t15 -4l5 -2q22 -10 44 -23l196 -118q21 -13 36 -24q29 -21 37 -12q11 13 49 35l196 118q22 13 45 23q17 7 38 7q23 0 47 -16.5t37 -33.5l13 -16q14 -21 18 -45l25 -123l8 -44q1 -9 8.5 -14.5t17.5 -5.5h61q10 0 17.5 -7.5t7.5 -17.5v-50 q0 -10 -7.5 -17.5t-17.5 -7.5h-50q-10 0 -17.5 -7.5t-7.5 -17.5v-175h-400v300h-200v-300h-400v175q0 10 -7.5 17.5t-17.5 7.5h-50q-10 0 -17.5 7.5t-7.5 17.5v50q0 10 7.5 17.5t17.5 7.5h61q11 0 18 3t7 8q0 4 9 52l25 128q5 25 19 45q2 3 5 7t13.5 15t21.5 19.5t26.5 15.5 t29.5 7zM915 1079l-166 -162q-7 -7 -5 -12t12 -5h219q10 0 15 7t2 17l-51 149q-3 10 -11 12t-15 -6zM463 917l-177 157q-8 7 -16 5t-11 -12l-51 -143q-3 -10 2 -17t15 -7h231q11 0 12.5 5t-5.5 12zM500 0h-375q-10 0 -17.5 7.5t-7.5 17.5v375h400v-400zM1100 400v-375 q0 -10 -7.5 -17.5t-17.5 -7.5h-375v400h400z" />
|
||||
<glyph unicode="" d="M1165 1190q8 3 21 -6.5t13 -17.5q-2 -178 -24.5 -323.5t-55.5 -245.5t-87 -174.5t-102.5 -118.5t-118 -68.5t-118.5 -33t-120 -4.5t-105 9.5t-90 16.5q-61 12 -78 11q-4 1 -12.5 0t-34 -14.5t-52.5 -40.5l-153 -153q-26 -24 -37 -14.5t-11 43.5q0 64 42 102q8 8 50.5 45 t66.5 58q19 17 35 47t13 61q-9 55 -10 102.5t7 111t37 130t78 129.5q39 51 80 88t89.5 63.5t94.5 45t113.5 36t129 31t157.5 37t182 47.5zM1116 1098q-8 9 -22.5 -3t-45.5 -50q-38 -47 -119 -103.5t-142 -89.5l-62 -33q-56 -30 -102 -57t-104 -68t-102.5 -80.5t-85.5 -91 t-64 -104.5q-24 -56 -31 -86t2 -32t31.5 17.5t55.5 59.5q25 30 94 75.5t125.5 77.5t147.5 81q70 37 118.5 69t102 79.5t99 111t86.5 148.5q22 50 24 60t-6 19z" />
|
||||
<glyph unicode="" d="M653 1231q-39 -67 -54.5 -131t-10.5 -114.5t24.5 -96.5t47.5 -80t63.5 -62.5t68.5 -46.5t65 -30q-4 7 -17.5 35t-18.5 39.5t-17 39.5t-17 43t-13 42t-9.5 44.5t-2 42t4 43t13.5 39t23 38.5q96 -42 165 -107.5t105 -138t52 -156t13 -159t-19 -149.5q-13 -55 -44 -106.5 t-68 -87t-78.5 -64.5t-72.5 -45t-53 -22q-72 -22 -127 -11q-31 6 -13 19q6 3 17 7q13 5 32.5 21t41 44t38.5 63.5t21.5 81.5t-6.5 94.5t-50 107t-104 115.5q10 -104 -0.5 -189t-37 -140.5t-65 -93t-84 -52t-93.5 -11t-95 24.5q-80 36 -131.5 114t-53.5 171q-2 23 0 49.5 t4.5 52.5t13.5 56t27.5 60t46 64.5t69.5 68.5q-8 -53 -5 -102.5t17.5 -90t34 -68.5t44.5 -39t49 -2q31 13 38.5 36t-4.5 55t-29 64.5t-36 75t-26 75.5q-15 85 2 161.5t53.5 128.5t85.5 92.5t93.5 61t81.5 25.5z" />
|
||||
<glyph unicode="" d="M600 1094q82 0 160.5 -22.5t140 -59t116.5 -82.5t94.5 -95t68 -95t42.5 -82.5t14 -57.5t-14 -57.5t-43 -82.5t-68.5 -95t-94.5 -95t-116.5 -82.5t-140 -59t-159.5 -22.5t-159.5 22.5t-140 59t-116.5 82.5t-94.5 95t-68.5 95t-43 82.5t-14 57.5t14 57.5t42.5 82.5t68 95 t94.5 95t116.5 82.5t140 59t160.5 22.5zM888 829q-15 15 -18 12t5 -22q25 -57 25 -119q0 -124 -88 -212t-212 -88t-212 88t-88 212q0 59 23 114q8 19 4.5 22t-17.5 -12q-70 -69 -160 -184q-13 -16 -15 -40.5t9 -42.5q22 -36 47 -71t70 -82t92.5 -81t113 -58.5t133.5 -24.5 t133.5 24t113 58.5t92.5 81.5t70 81.5t47 70.5q11 18 9 42.5t-14 41.5q-90 117 -163 189zM448 727l-35 -36q-15 -15 -19.5 -38.5t4.5 -41.5q37 -68 93 -116q16 -13 38.5 -11t36.5 17l35 34q14 15 12.5 33.5t-16.5 33.5q-44 44 -89 117q-11 18 -28 20t-32 -12z" />
|
||||
<glyph unicode="" d="M592 0h-148l31 120q-91 20 -175.5 68.5t-143.5 106.5t-103.5 119t-66.5 110t-22 76q0 21 14 57.5t42.5 82.5t68 95t94.5 95t116.5 82.5t140 59t160.5 22.5q61 0 126 -15l32 121h148zM944 770l47 181q108 -85 176.5 -192t68.5 -159q0 -26 -19.5 -71t-59.5 -102t-93 -112 t-129 -104.5t-158 -75.5l46 173q77 49 136 117t97 131q11 18 9 42.5t-14 41.5q-54 70 -107 130zM310 824q-70 -69 -160 -184q-13 -16 -15 -40.5t9 -42.5q18 -30 39 -60t57 -70.5t74 -73t90 -61t105 -41.5l41 154q-107 18 -178.5 101.5t-71.5 193.5q0 59 23 114q8 19 4.5 22 t-17.5 -12zM448 727l-35 -36q-15 -15 -19.5 -38.5t4.5 -41.5q37 -68 93 -116q16 -13 38.5 -11t36.5 17l12 11l22 86l-3 4q-44 44 -89 117q-11 18 -28 20t-32 -12z" />
|
||||
<glyph unicode="" d="M-90 100l642 1066q20 31 48 28.5t48 -35.5l642 -1056q21 -32 7.5 -67.5t-50.5 -35.5h-1294q-37 0 -50.5 34t7.5 66zM155 200h345v75q0 10 7.5 17.5t17.5 7.5h150q10 0 17.5 -7.5t7.5 -17.5v-75h345l-445 723zM496 700h208q20 0 32 -14.5t8 -34.5l-58 -252 q-4 -20 -21.5 -34.5t-37.5 -14.5h-54q-20 0 -37.5 14.5t-21.5 34.5l-58 252q-4 20 8 34.5t32 14.5z" />
|
||||
<glyph unicode="" d="M650 1200q62 0 106 -44t44 -106v-339l363 -325q15 -14 26 -38.5t11 -44.5v-41q0 -20 -12 -26.5t-29 5.5l-359 249v-263q100 -93 100 -113v-64q0 -21 -13 -29t-32 1l-205 128l-205 -128q-19 -9 -32 -1t-13 29v64q0 20 100 113v263l-359 -249q-17 -12 -29 -5.5t-12 26.5v41 q0 20 11 44.5t26 38.5l363 325v339q0 62 44 106t106 44z" />
|
||||
<glyph unicode="" d="M850 1200h100q21 0 35.5 -14.5t14.5 -35.5v-50h50q21 0 35.5 -14.5t14.5 -35.5v-150h-1100v150q0 21 14.5 35.5t35.5 14.5h50v50q0 21 14.5 35.5t35.5 14.5h100q21 0 35.5 -14.5t14.5 -35.5v-50h500v50q0 21 14.5 35.5t35.5 14.5zM1100 800v-750q0 -21 -14.5 -35.5 t-35.5 -14.5h-1000q-21 0 -35.5 14.5t-14.5 35.5v750h1100zM100 600v-100h100v100h-100zM300 600v-100h100v100h-100zM500 600v-100h100v100h-100zM700 600v-100h100v100h-100zM900 600v-100h100v100h-100zM100 400v-100h100v100h-100zM300 400v-100h100v100h-100zM500 400 v-100h100v100h-100zM700 400v-100h100v100h-100zM900 400v-100h100v100h-100zM100 200v-100h100v100h-100zM300 200v-100h100v100h-100zM500 200v-100h100v100h-100zM700 200v-100h100v100h-100zM900 200v-100h100v100h-100z" />
|
||||
<glyph unicode="" d="M1135 1165l249 -230q15 -14 15 -35t-15 -35l-249 -230q-14 -14 -24.5 -10t-10.5 25v150h-159l-600 -600h-291q-21 0 -35.5 14.5t-14.5 35.5v100q0 21 14.5 35.5t35.5 14.5h209l600 600h241v150q0 21 10.5 25t24.5 -10zM522 819l-141 -141l-122 122h-209q-21 0 -35.5 14.5 t-14.5 35.5v100q0 21 14.5 35.5t35.5 14.5h291zM1135 565l249 -230q15 -14 15 -35t-15 -35l-249 -230q-14 -14 -24.5 -10t-10.5 25v150h-241l-181 181l141 141l122 -122h159v150q0 21 10.5 25t24.5 -10z" />
|
||||
<glyph unicode="" d="M100 1100h1000q41 0 70.5 -29.5t29.5 -70.5v-600q0 -41 -29.5 -70.5t-70.5 -29.5h-596l-304 -300v300h-100q-41 0 -70.5 29.5t-29.5 70.5v600q0 41 29.5 70.5t70.5 29.5z" />
|
||||
<glyph unicode="" d="M150 1200h200q21 0 35.5 -14.5t14.5 -35.5v-250h-300v250q0 21 14.5 35.5t35.5 14.5zM850 1200h200q21 0 35.5 -14.5t14.5 -35.5v-250h-300v250q0 21 14.5 35.5t35.5 14.5zM1100 800v-300q0 -41 -3 -77.5t-15 -89.5t-32 -96t-58 -89t-89 -77t-129 -51t-174 -20t-174 20 t-129 51t-89 77t-58 89t-32 96t-15 89.5t-3 77.5v300h300v-250v-27v-42.5t1.5 -41t5 -38t10 -35t16.5 -30t25.5 -24.5t35 -19t46.5 -12t60 -4t60 4.5t46.5 12.5t35 19.5t25 25.5t17 30.5t10 35t5 38t2 40.5t-0.5 42v25v250h300z" />
|
||||
<glyph unicode="" d="M1100 411l-198 -199l-353 353l-353 -353l-197 199l551 551z" />
|
||||
<glyph unicode="" d="M1101 789l-550 -551l-551 551l198 199l353 -353l353 353z" />
|
||||
<glyph unicode="" d="M404 1000h746q21 0 35.5 -14.5t14.5 -35.5v-551h150q21 0 25 -10.5t-10 -24.5l-230 -249q-14 -15 -35 -15t-35 15l-230 249q-14 14 -10 24.5t25 10.5h150v401h-381zM135 984l230 -249q14 -14 10 -24.5t-25 -10.5h-150v-400h385l215 -200h-750q-21 0 -35.5 14.5 t-14.5 35.5v550h-150q-21 0 -25 10.5t10 24.5l230 249q14 15 35 15t35 -15z" />
|
||||
<glyph unicode="" d="M56 1200h94q17 0 31 -11t18 -27l38 -162h896q24 0 39 -18.5t10 -42.5l-100 -475q-5 -21 -27 -42.5t-55 -21.5h-633l48 -200h535q21 0 35.5 -14.5t14.5 -35.5t-14.5 -35.5t-35.5 -14.5h-50v-50q0 -21 -14.5 -35.5t-35.5 -14.5t-35.5 14.5t-14.5 35.5v50h-300v-50 q0 -21 -14.5 -35.5t-35.5 -14.5t-35.5 14.5t-14.5 35.5v50h-31q-18 0 -32.5 10t-20.5 19l-5 10l-201 961h-54q-20 0 -35 14.5t-15 35.5t15 35.5t35 14.5z" />
|
||||
<glyph unicode="" d="M1200 1000v-100h-1200v100h200q0 41 29.5 70.5t70.5 29.5h300q41 0 70.5 -29.5t29.5 -70.5h500zM0 800h1200v-800h-1200v800z" />
|
||||
<glyph unicode="" d="M200 800l-200 -400v600h200q0 41 29.5 70.5t70.5 29.5h300q42 0 71 -29.5t29 -70.5h500v-200h-1000zM1500 700l-300 -700h-1200l300 700h1200z" />
|
||||
<glyph unicode="" d="M635 1184l230 -249q14 -14 10 -24.5t-25 -10.5h-150v-601h150q21 0 25 -10.5t-10 -24.5l-230 -249q-14 -15 -35 -15t-35 15l-230 249q-14 14 -10 24.5t25 10.5h150v601h-150q-21 0 -25 10.5t10 24.5l230 249q14 15 35 15t35 -15z" />
|
||||
<glyph unicode="" d="M936 864l249 -229q14 -15 14 -35.5t-14 -35.5l-249 -229q-15 -15 -25.5 -10.5t-10.5 24.5v151h-600v-151q0 -20 -10.5 -24.5t-25.5 10.5l-249 229q-14 15 -14 35.5t14 35.5l249 229q15 15 25.5 10.5t10.5 -25.5v-149h600v149q0 21 10.5 25.5t25.5 -10.5z" />
|
||||
<glyph unicode="" d="M1169 400l-172 732q-5 23 -23 45.5t-38 22.5h-672q-20 0 -38 -20t-23 -41l-172 -739h1138zM1100 300h-1000q-41 0 -70.5 -29.5t-29.5 -70.5v-100q0 -41 29.5 -70.5t70.5 -29.5h1000q41 0 70.5 29.5t29.5 70.5v100q0 41 -29.5 70.5t-70.5 29.5zM800 100v100h100v-100h-100 zM1000 100v100h100v-100h-100z" />
|
||||
<glyph unicode="" d="M1150 1100q21 0 35.5 -14.5t14.5 -35.5v-850q0 -21 -14.5 -35.5t-35.5 -14.5t-35.5 14.5t-14.5 35.5v850q0 21 14.5 35.5t35.5 14.5zM1000 200l-675 200h-38l47 -276q3 -16 -5.5 -20t-29.5 -4h-7h-84q-20 0 -34.5 14t-18.5 35q-55 337 -55 351v250v6q0 16 1 23.5t6.5 14 t17.5 6.5h200l675 250v-850zM0 750v-250q-4 0 -11 0.5t-24 6t-30 15t-24 30t-11 48.5v50q0 26 10.5 46t25 30t29 16t25.5 7z" />
|
||||
<glyph unicode="" d="M553 1200h94q20 0 29 -10.5t3 -29.5l-18 -37q83 -19 144 -82.5t76 -140.5l63 -327l118 -173h17q19 0 33 -14.5t14 -35t-13 -40.5t-31 -27q-8 -4 -23 -9.5t-65 -19.5t-103 -25t-132.5 -20t-158.5 -9q-57 0 -115 5t-104 12t-88.5 15.5t-73.5 17.5t-54.5 16t-35.5 12l-11 4 q-18 8 -31 28t-13 40.5t14 35t33 14.5h17l118 173l63 327q15 77 76 140t144 83l-18 32q-6 19 3.5 32t28.5 13zM498 110q50 -6 102 -6q53 0 102 6q-12 -49 -39.5 -79.5t-62.5 -30.5t-63 30.5t-39 79.5z" />
|
||||
<glyph unicode="" d="M800 946l224 78l-78 -224l234 -45l-180 -155l180 -155l-234 -45l78 -224l-224 78l-45 -234l-155 180l-155 -180l-45 234l-224 -78l78 224l-234 45l180 155l-180 155l234 45l-78 224l224 -78l45 234l155 -180l155 180z" />
|
||||
<glyph unicode="" d="M650 1200h50q40 0 70 -40.5t30 -84.5v-150l-28 -125h328q40 0 70 -40.5t30 -84.5v-100q0 -45 -29 -74l-238 -344q-16 -24 -38 -40.5t-45 -16.5h-250q-7 0 -42 25t-66 50l-31 25h-61q-45 0 -72.5 18t-27.5 57v400q0 36 20 63l145 196l96 198q13 28 37.5 48t51.5 20z M650 1100l-100 -212l-150 -213v-375h100l136 -100h214l250 375v125h-450l50 225v175h-50zM50 800h100q21 0 35.5 -14.5t14.5 -35.5v-500q0 -21 -14.5 -35.5t-35.5 -14.5h-100q-21 0 -35.5 14.5t-14.5 35.5v500q0 21 14.5 35.5t35.5 14.5z" />
|
||||
<glyph unicode="" d="M600 1100h250q23 0 45 -16.5t38 -40.5l238 -344q29 -29 29 -74v-100q0 -44 -30 -84.5t-70 -40.5h-328q28 -118 28 -125v-150q0 -44 -30 -84.5t-70 -40.5h-50q-27 0 -51.5 20t-37.5 48l-96 198l-145 196q-20 27 -20 63v400q0 39 27.5 57t72.5 18h61q124 100 139 100z M50 1000h100q21 0 35.5 -14.5t14.5 -35.5v-500q0 -21 -14.5 -35.5t-35.5 -14.5h-100q-21 0 -35.5 14.5t-14.5 35.5v500q0 21 14.5 35.5t35.5 14.5zM636 1000l-136 -100h-100v-375l150 -213l100 -212h50v175l-50 225h450v125l-250 375h-214z" />
|
||||
<glyph unicode="" d="M356 873l363 230q31 16 53 -6l110 -112q13 -13 13.5 -32t-11.5 -34l-84 -121h302q84 0 138 -38t54 -110t-55 -111t-139 -39h-106l-131 -339q-6 -21 -19.5 -41t-28.5 -20h-342q-7 0 -90 81t-83 94v525q0 17 14 35.5t28 28.5zM400 792v-503l100 -89h293l131 339 q6 21 19.5 41t28.5 20h203q21 0 30.5 25t0.5 50t-31 25h-456h-7h-6h-5.5t-6 0.5t-5 1.5t-5 2t-4 2.5t-4 4t-2.5 4.5q-12 25 5 47l146 183l-86 83zM50 800h100q21 0 35.5 -14.5t14.5 -35.5v-500q0 -21 -14.5 -35.5t-35.5 -14.5h-100q-21 0 -35.5 14.5t-14.5 35.5v500 q0 21 14.5 35.5t35.5 14.5z" />
|
||||
<glyph unicode="" d="M475 1103l366 -230q2 -1 6 -3.5t14 -10.5t18 -16.5t14.5 -20t6.5 -22.5v-525q0 -13 -86 -94t-93 -81h-342q-15 0 -28.5 20t-19.5 41l-131 339h-106q-85 0 -139.5 39t-54.5 111t54 110t138 38h302l-85 121q-11 15 -10.5 34t13.5 32l110 112q22 22 53 6zM370 945l146 -183 q17 -22 5 -47q-2 -2 -3.5 -4.5t-4 -4t-4 -2.5t-5 -2t-5 -1.5t-6 -0.5h-6h-6.5h-6h-475v-100h221q15 0 29 -20t20 -41l130 -339h294l106 89v503l-342 236zM1050 800h100q21 0 35.5 -14.5t14.5 -35.5v-500q0 -21 -14.5 -35.5t-35.5 -14.5h-100q-21 0 -35.5 14.5t-14.5 35.5 v500q0 21 14.5 35.5t35.5 14.5z" />
|
||||
<glyph unicode="" d="M550 1294q72 0 111 -55t39 -139v-106l339 -131q21 -6 41 -19.5t20 -28.5v-342q0 -7 -81 -90t-94 -83h-525q-17 0 -35.5 14t-28.5 28l-9 14l-230 363q-16 31 6 53l112 110q13 13 32 13.5t34 -11.5l121 -84v302q0 84 38 138t110 54zM600 972v203q0 21 -25 30.5t-50 0.5 t-25 -31v-456v-7v-6v-5.5t-0.5 -6t-1.5 -5t-2 -5t-2.5 -4t-4 -4t-4.5 -2.5q-25 -12 -47 5l-183 146l-83 -86l236 -339h503l89 100v293l-339 131q-21 6 -41 19.5t-20 28.5zM450 200h500q21 0 35.5 -14.5t14.5 -35.5v-100q0 -21 -14.5 -35.5t-35.5 -14.5h-500 q-21 0 -35.5 14.5t-14.5 35.5v100q0 21 14.5 35.5t35.5 14.5z" />
|
||||
<glyph unicode="" d="M350 1100h500q21 0 35.5 14.5t14.5 35.5v100q0 21 -14.5 35.5t-35.5 14.5h-500q-21 0 -35.5 -14.5t-14.5 -35.5v-100q0 -21 14.5 -35.5t35.5 -14.5zM600 306v-106q0 -84 -39 -139t-111 -55t-110 54t-38 138v302l-121 -84q-15 -12 -34 -11.5t-32 13.5l-112 110 q-22 22 -6 53l230 363q1 2 3.5 6t10.5 13.5t16.5 17t20 13.5t22.5 6h525q13 0 94 -83t81 -90v-342q0 -15 -20 -28.5t-41 -19.5zM308 900l-236 -339l83 -86l183 146q22 17 47 5q2 -1 4.5 -2.5t4 -4t2.5 -4t2 -5t1.5 -5t0.5 -6v-5.5v-6v-7v-456q0 -22 25 -31t50 0.5t25 30.5 v203q0 15 20 28.5t41 19.5l339 131v293l-89 100h-503z" />
|
||||
<glyph unicode="" d="M600 1178q118 0 225 -45.5t184.5 -123t123 -184.5t45.5 -225t-45.5 -225t-123 -184.5t-184.5 -123t-225 -45.5t-225 45.5t-184.5 123t-123 184.5t-45.5 225t45.5 225t123 184.5t184.5 123t225 45.5zM914 632l-275 223q-16 13 -27.5 8t-11.5 -26v-137h-275 q-10 0 -17.5 -7.5t-7.5 -17.5v-150q0 -10 7.5 -17.5t17.5 -7.5h275v-137q0 -21 11.5 -26t27.5 8l275 223q16 13 16 32t-16 32z" />
|
||||
<glyph unicode="" d="M600 1178q118 0 225 -45.5t184.5 -123t123 -184.5t45.5 -225t-45.5 -225t-123 -184.5t-184.5 -123t-225 -45.5t-225 45.5t-184.5 123t-123 184.5t-45.5 225t45.5 225t123 184.5t184.5 123t225 45.5zM561 855l-275 -223q-16 -13 -16 -32t16 -32l275 -223q16 -13 27.5 -8 t11.5 26v137h275q10 0 17.5 7.5t7.5 17.5v150q0 10 -7.5 17.5t-17.5 7.5h-275v137q0 21 -11.5 26t-27.5 -8z" />
|
||||
<glyph unicode="" d="M600 1178q118 0 225 -45.5t184.5 -123t123 -184.5t45.5 -225t-45.5 -225t-123 -184.5t-184.5 -123t-225 -45.5t-225 45.5t-184.5 123t-123 184.5t-45.5 225t45.5 225t123 184.5t184.5 123t225 45.5zM855 639l-223 275q-13 16 -32 16t-32 -16l-223 -275q-13 -16 -8 -27.5 t26 -11.5h137v-275q0 -10 7.5 -17.5t17.5 -7.5h150q10 0 17.5 7.5t7.5 17.5v275h137q21 0 26 11.5t-8 27.5z" />
|
||||
<glyph unicode="" d="M600 1178q118 0 225 -45.5t184.5 -123t123 -184.5t45.5 -225t-45.5 -225t-123 -184.5t-184.5 -123t-225 -45.5t-225 45.5t-184.5 123t-123 184.5t-45.5 225t45.5 225t123 184.5t184.5 123t225 45.5zM675 900h-150q-10 0 -17.5 -7.5t-7.5 -17.5v-275h-137q-21 0 -26 -11.5 t8 -27.5l223 -275q13 -16 32 -16t32 16l223 275q13 16 8 27.5t-26 11.5h-137v275q0 10 -7.5 17.5t-17.5 7.5z" />
|
||||
<glyph unicode="" d="M600 1176q116 0 222.5 -46t184 -123.5t123.5 -184t46 -222.5t-46 -222.5t-123.5 -184t-184 -123.5t-222.5 -46t-222.5 46t-184 123.5t-123.5 184t-46 222.5t46 222.5t123.5 184t184 123.5t222.5 46zM627 1101q-15 -12 -36.5 -20.5t-35.5 -12t-43 -8t-39 -6.5 q-15 -3 -45.5 0t-45.5 -2q-20 -7 -51.5 -26.5t-34.5 -34.5q-3 -11 6.5 -22.5t8.5 -18.5q-3 -34 -27.5 -91t-29.5 -79q-9 -34 5 -93t8 -87q0 -9 17 -44.5t16 -59.5q12 0 23 -5t23.5 -15t19.5 -14q16 -8 33 -15t40.5 -15t34.5 -12q21 -9 52.5 -32t60 -38t57.5 -11 q7 -15 -3 -34t-22.5 -40t-9.5 -38q13 -21 23 -34.5t27.5 -27.5t36.5 -18q0 -7 -3.5 -16t-3.5 -14t5 -17q104 -2 221 112q30 29 46.5 47t34.5 49t21 63q-13 8 -37 8.5t-36 7.5q-15 7 -49.5 15t-51.5 19q-18 0 -41 -0.5t-43 -1.5t-42 -6.5t-38 -16.5q-51 -35 -66 -12 q-4 1 -3.5 25.5t0.5 25.5q-6 13 -26.5 17.5t-24.5 6.5q1 15 -0.5 30.5t-7 28t-18.5 11.5t-31 -21q-23 -25 -42 4q-19 28 -8 58q6 16 22 22q6 -1 26 -1.5t33.5 -4t19.5 -13.5q7 -12 18 -24t21.5 -20.5t20 -15t15.5 -10.5l5 -3q2 12 7.5 30.5t8 34.5t-0.5 32q-3 18 3.5 29 t18 22.5t15.5 24.5q6 14 10.5 35t8 31t15.5 22.5t34 22.5q-6 18 10 36q8 0 24 -1.5t24.5 -1.5t20 4.5t20.5 15.5q-10 23 -31 42.5t-37.5 29.5t-49 27t-43.5 23q0 1 2 8t3 11.5t1.5 10.5t-1 9.5t-4.5 4.5q31 -13 58.5 -14.5t38.5 2.5l12 5q5 28 -9.5 46t-36.5 24t-50 15 t-41 20q-18 -4 -37 0zM613 994q0 -17 8 -42t17 -45t9 -23q-8 1 -39.5 5.5t-52.5 10t-37 16.5q3 11 16 29.5t16 25.5q10 -10 19 -10t14 6t13.5 14.5t16.5 12.5z" />
|
||||
<glyph unicode="" d="M756 1157q164 92 306 -9l-259 -138l145 -232l251 126q6 -89 -34 -156.5t-117 -110.5q-60 -34 -127 -39.5t-126 16.5l-596 -596q-15 -16 -36.5 -16t-36.5 16l-111 110q-15 15 -15 36.5t15 37.5l600 599q-34 101 5.5 201.5t135.5 154.5z" />
|
||||
<glyph unicode="" horiz-adv-x="1220" d="M100 1196h1000q41 0 70.5 -29.5t29.5 -70.5v-100q0 -41 -29.5 -70.5t-70.5 -29.5h-1000q-41 0 -70.5 29.5t-29.5 70.5v100q0 41 29.5 70.5t70.5 29.5zM1100 1096h-200v-100h200v100zM100 796h1000q41 0 70.5 -29.5t29.5 -70.5v-100q0 -41 -29.5 -70.5t-70.5 -29.5h-1000 q-41 0 -70.5 29.5t-29.5 70.5v100q0 41 29.5 70.5t70.5 29.5zM1100 696h-500v-100h500v100zM100 396h1000q41 0 70.5 -29.5t29.5 -70.5v-100q0 -41 -29.5 -70.5t-70.5 -29.5h-1000q-41 0 -70.5 29.5t-29.5 70.5v100q0 41 29.5 70.5t70.5 29.5zM1100 296h-300v-100h300v100z " />
|
||||
<glyph unicode="" d="M150 1200h900q21 0 35.5 -14.5t14.5 -35.5t-14.5 -35.5t-35.5 -14.5h-900q-21 0 -35.5 14.5t-14.5 35.5t14.5 35.5t35.5 14.5zM700 500v-300l-200 -200v500l-350 500h900z" />
|
||||
<glyph unicode="" d="M500 1200h200q41 0 70.5 -29.5t29.5 -70.5v-100h300q41 0 70.5 -29.5t29.5 -70.5v-400h-500v100h-200v-100h-500v400q0 41 29.5 70.5t70.5 29.5h300v100q0 41 29.5 70.5t70.5 29.5zM500 1100v-100h200v100h-200zM1200 400v-200q0 -41 -29.5 -70.5t-70.5 -29.5h-1000 q-41 0 -70.5 29.5t-29.5 70.5v200h1200z" />
|
||||
<glyph unicode="" d="M50 1200h300q21 0 25 -10.5t-10 -24.5l-94 -94l199 -199q7 -8 7 -18t-7 -18l-106 -106q-8 -7 -18 -7t-18 7l-199 199l-94 -94q-14 -14 -24.5 -10t-10.5 25v300q0 21 14.5 35.5t35.5 14.5zM850 1200h300q21 0 35.5 -14.5t14.5 -35.5v-300q0 -21 -10.5 -25t-24.5 10l-94 94 l-199 -199q-8 -7 -18 -7t-18 7l-106 106q-7 8 -7 18t7 18l199 199l-94 94q-14 14 -10 24.5t25 10.5zM364 470l106 -106q7 -8 7 -18t-7 -18l-199 -199l94 -94q14 -14 10 -24.5t-25 -10.5h-300q-21 0 -35.5 14.5t-14.5 35.5v300q0 21 10.5 25t24.5 -10l94 -94l199 199 q8 7 18 7t18 -7zM1071 271l94 94q14 14 24.5 10t10.5 -25v-300q0 -21 -14.5 -35.5t-35.5 -14.5h-300q-21 0 -25 10.5t10 24.5l94 94l-199 199q-7 8 -7 18t7 18l106 106q8 7 18 7t18 -7z" />
|
||||
<glyph unicode="" d="M596 1192q121 0 231.5 -47.5t190 -127t127 -190t47.5 -231.5t-47.5 -231.5t-127 -190.5t-190 -127t-231.5 -47t-231.5 47t-190.5 127t-127 190.5t-47 231.5t47 231.5t127 190t190.5 127t231.5 47.5zM596 1010q-112 0 -207.5 -55.5t-151 -151t-55.5 -207.5t55.5 -207.5 t151 -151t207.5 -55.5t207.5 55.5t151 151t55.5 207.5t-55.5 207.5t-151 151t-207.5 55.5zM454.5 905q22.5 0 38.5 -16t16 -38.5t-16 -39t-38.5 -16.5t-38.5 16.5t-16 39t16 38.5t38.5 16zM754.5 905q22.5 0 38.5 -16t16 -38.5t-16 -39t-38 -16.5q-14 0 -29 10l-55 -145 q17 -23 17 -51q0 -36 -25.5 -61.5t-61.5 -25.5t-61.5 25.5t-25.5 61.5q0 32 20.5 56.5t51.5 29.5l122 126l1 1q-9 14 -9 28q0 23 16 39t38.5 16zM345.5 709q22.5 0 38.5 -16t16 -38.5t-16 -38.5t-38.5 -16t-38.5 16t-16 38.5t16 38.5t38.5 16zM854.5 709q22.5 0 38.5 -16 t16 -38.5t-16 -38.5t-38.5 -16t-38.5 16t-16 38.5t16 38.5t38.5 16z" />
|
||||
<glyph unicode="" d="M546 173l469 470q91 91 99 192q7 98 -52 175.5t-154 94.5q-22 4 -47 4q-34 0 -66.5 -10t-56.5 -23t-55.5 -38t-48 -41.5t-48.5 -47.5q-376 -375 -391 -390q-30 -27 -45 -41.5t-37.5 -41t-32 -46.5t-16 -47.5t-1.5 -56.5q9 -62 53.5 -95t99.5 -33q74 0 125 51l548 548 q36 36 20 75q-7 16 -21.5 26t-32.5 10q-26 0 -50 -23q-13 -12 -39 -38l-341 -338q-15 -15 -35.5 -15.5t-34.5 13.5t-14 34.5t14 34.5q327 333 361 367q35 35 67.5 51.5t78.5 16.5q14 0 29 -1q44 -8 74.5 -35.5t43.5 -68.5q14 -47 2 -96.5t-47 -84.5q-12 -11 -32 -32 t-79.5 -81t-114.5 -115t-124.5 -123.5t-123 -119.5t-96.5 -89t-57 -45q-56 -27 -120 -27q-70 0 -129 32t-93 89q-48 78 -35 173t81 163l511 511q71 72 111 96q91 55 198 55q80 0 152 -33q78 -36 129.5 -103t66.5 -154q17 -93 -11 -183.5t-94 -156.5l-482 -476 q-15 -15 -36 -16t-37 14t-17.5 34t14.5 35z" />
|
||||
<glyph unicode="" d="M649 949q48 68 109.5 104t121.5 38.5t118.5 -20t102.5 -64t71 -100.5t27 -123q0 -57 -33.5 -117.5t-94 -124.5t-126.5 -127.5t-150 -152.5t-146 -174q-62 85 -145.5 174t-150 152.5t-126.5 127.5t-93.5 124.5t-33.5 117.5q0 64 28 123t73 100.5t104 64t119 20 t120.5 -38.5t104.5 -104zM896 972q-33 0 -64.5 -19t-56.5 -46t-47.5 -53.5t-43.5 -45.5t-37.5 -19t-36 19t-40 45.5t-43 53.5t-54 46t-65.5 19q-67 0 -122.5 -55.5t-55.5 -132.5q0 -23 13.5 -51t46 -65t57.5 -63t76 -75l22 -22q15 -14 44 -44t50.5 -51t46 -44t41 -35t23 -12 t23.5 12t42.5 36t46 44t52.5 52t44 43q4 4 12 13q43 41 63.5 62t52 55t46 55t26 46t11.5 44q0 79 -53 133.5t-120 54.5z" />
|
||||
<glyph unicode="" d="M776.5 1214q93.5 0 159.5 -66l141 -141q66 -66 66 -160q0 -42 -28 -95.5t-62 -87.5l-29 -29q-31 53 -77 99l-18 18l95 95l-247 248l-389 -389l212 -212l-105 -106l-19 18l-141 141q-66 66 -66 159t66 159l283 283q65 66 158.5 66zM600 706l105 105q10 -8 19 -17l141 -141 q66 -66 66 -159t-66 -159l-283 -283q-66 -66 -159 -66t-159 66l-141 141q-66 66 -66 159.5t66 159.5l55 55q29 -55 75 -102l18 -17l-95 -95l247 -248l389 389z" />
|
||||
<glyph unicode="" d="M603 1200q85 0 162 -15t127 -38t79 -48t29 -46v-953q0 -41 -29.5 -70.5t-70.5 -29.5h-600q-41 0 -70.5 29.5t-29.5 70.5v953q0 21 30 46.5t81 48t129 37.5t163 15zM300 1000v-700h600v700h-600zM600 254q-43 0 -73.5 -30.5t-30.5 -73.5t30.5 -73.5t73.5 -30.5t73.5 30.5 t30.5 73.5t-30.5 73.5t-73.5 30.5z" />
|
||||
<glyph unicode="" d="M902 1185l283 -282q15 -15 15 -36t-14.5 -35.5t-35.5 -14.5t-35 15l-36 35l-279 -267v-300l-212 210l-308 -307l-280 -203l203 280l307 308l-210 212h300l267 279l-35 36q-15 14 -15 35t14.5 35.5t35.5 14.5t35 -15z" />
|
||||
<glyph unicode="" d="M700 1248v-78q38 -5 72.5 -14.5t75.5 -31.5t71 -53.5t52 -84t24 -118.5h-159q-4 36 -10.5 59t-21 45t-40 35.5t-64.5 20.5v-307l64 -13q34 -7 64 -16.5t70 -32t67.5 -52.5t47.5 -80t20 -112q0 -139 -89 -224t-244 -97v-77h-100v79q-150 16 -237 103q-40 40 -52.5 93.5 t-15.5 139.5h139q5 -77 48.5 -126t117.5 -65v335l-27 8q-46 14 -79 26.5t-72 36t-63 52t-40 72.5t-16 98q0 70 25 126t67.5 92t94.5 57t110 27v77h100zM600 754v274q-29 -4 -50 -11t-42 -21.5t-31.5 -41.5t-10.5 -65q0 -29 7 -50.5t16.5 -34t28.5 -22.5t31.5 -14t37.5 -10 q9 -3 13 -4zM700 547v-310q22 2 42.5 6.5t45 15.5t41.5 27t29 42t12 59.5t-12.5 59.5t-38 44.5t-53 31t-66.5 24.5z" />
|
||||
<glyph unicode="" d="M561 1197q84 0 160.5 -40t123.5 -109.5t47 -147.5h-153q0 40 -19.5 71.5t-49.5 48.5t-59.5 26t-55.5 9q-37 0 -79 -14.5t-62 -35.5q-41 -44 -41 -101q0 -26 13.5 -63t26.5 -61t37 -66q6 -9 9 -14h241v-100h-197q8 -50 -2.5 -115t-31.5 -95q-45 -62 -99 -112 q34 10 83 17.5t71 7.5q32 1 102 -16t104 -17q83 0 136 30l50 -147q-31 -19 -58 -30.5t-55 -15.5t-42 -4.5t-46 -0.5q-23 0 -76 17t-111 32.5t-96 11.5q-39 -3 -82 -16t-67 -25l-23 -11l-55 145q4 3 16 11t15.5 10.5t13 9t15.5 12t14.5 14t17.5 18.5q48 55 54 126.5 t-30 142.5h-221v100h166q-23 47 -44 104q-7 20 -12 41.5t-6 55.5t6 66.5t29.5 70.5t58.5 71q97 88 263 88z" />
|
||||
<glyph unicode="" d="M400 300h150q21 0 25 -11t-10 -25l-230 -250q-14 -15 -35 -15t-35 15l-230 250q-14 14 -10 25t25 11h150v900h200v-900zM935 1184l230 -249q14 -14 10 -24.5t-25 -10.5h-150v-900h-200v900h-150q-21 0 -25 10.5t10 24.5l230 249q14 15 35 15t35 -15z" />
|
||||
<glyph unicode="" d="M1000 700h-100v100h-100v-100h-100v500h300v-500zM400 300h150q21 0 25 -11t-10 -25l-230 -250q-14 -15 -35 -15t-35 15l-230 250q-14 14 -10 25t25 11h150v900h200v-900zM801 1100v-200h100v200h-100zM1000 350l-200 -250h200v-100h-300v150l200 250h-200v100h300v-150z " />
|
||||
<glyph unicode="" d="M400 300h150q21 0 25 -11t-10 -25l-230 -250q-14 -15 -35 -15t-35 15l-230 250q-14 14 -10 25t25 11h150v900h200v-900zM1000 1050l-200 -250h200v-100h-300v150l200 250h-200v100h300v-150zM1000 0h-100v100h-100v-100h-100v500h300v-500zM801 400v-200h100v200h-100z " />
|
||||
<glyph unicode="" d="M400 300h150q21 0 25 -11t-10 -25l-230 -250q-14 -15 -35 -15t-35 15l-230 250q-14 14 -10 25t25 11h150v900h200v-900zM1000 700h-100v400h-100v100h200v-500zM1100 0h-100v100h-200v400h300v-500zM901 400v-200h100v200h-100z" />
|
||||
<glyph unicode="" d="M400 300h150q21 0 25 -11t-10 -25l-230 -250q-14 -15 -35 -15t-35 15l-230 250q-14 14 -10 25t25 11h150v900h200v-900zM1100 700h-100v100h-200v400h300v-500zM901 1100v-200h100v200h-100zM1000 0h-100v400h-100v100h200v-500z" />
|
||||
<glyph unicode="" d="M400 300h150q21 0 25 -11t-10 -25l-230 -250q-14 -15 -35 -15t-35 15l-230 250q-14 14 -10 25t25 11h150v900h200v-900zM900 1000h-200v200h200v-200zM1000 700h-300v200h300v-200zM1100 400h-400v200h400v-200zM1200 100h-500v200h500v-200z" />
|
||||
<glyph unicode="" d="M400 300h150q21 0 25 -11t-10 -25l-230 -250q-14 -15 -35 -15t-35 15l-230 250q-14 14 -10 25t25 11h150v900h200v-900zM1200 1000h-500v200h500v-200zM1100 700h-400v200h400v-200zM1000 400h-300v200h300v-200zM900 100h-200v200h200v-200z" />
|
||||
<glyph unicode="" d="M350 1100h400q162 0 256 -93.5t94 -256.5v-400q0 -165 -93.5 -257.5t-256.5 -92.5h-400q-165 0 -257.5 92.5t-92.5 257.5v400q0 165 92.5 257.5t257.5 92.5zM800 900h-500q-41 0 -70.5 -29.5t-29.5 -70.5v-500q0 -41 29.5 -70.5t70.5 -29.5h500q41 0 70.5 29.5t29.5 70.5 v500q0 41 -29.5 70.5t-70.5 29.5z" />
|
||||
<glyph unicode="" d="M350 1100h400q165 0 257.5 -92.5t92.5 -257.5v-400q0 -165 -92.5 -257.5t-257.5 -92.5h-400q-163 0 -256.5 92.5t-93.5 257.5v400q0 163 94 256.5t256 93.5zM800 900h-500q-41 0 -70.5 -29.5t-29.5 -70.5v-500q0 -41 29.5 -70.5t70.5 -29.5h500q41 0 70.5 29.5t29.5 70.5 v500q0 41 -29.5 70.5t-70.5 29.5zM440 770l253 -190q17 -12 17 -30t-17 -30l-253 -190q-16 -12 -28 -6.5t-12 26.5v400q0 21 12 26.5t28 -6.5z" />
|
||||
<glyph unicode="" d="M350 1100h400q163 0 256.5 -94t93.5 -256v-400q0 -165 -92.5 -257.5t-257.5 -92.5h-400q-165 0 -257.5 92.5t-92.5 257.5v400q0 163 92.5 256.5t257.5 93.5zM800 900h-500q-41 0 -70.5 -29.5t-29.5 -70.5v-500q0 -41 29.5 -70.5t70.5 -29.5h500q41 0 70.5 29.5t29.5 70.5 v500q0 41 -29.5 70.5t-70.5 29.5zM350 700h400q21 0 26.5 -12t-6.5 -28l-190 -253q-12 -17 -30 -17t-30 17l-190 253q-12 16 -6.5 28t26.5 12z" />
|
||||
<glyph unicode="" d="M350 1100h400q165 0 257.5 -92.5t92.5 -257.5v-400q0 -163 -92.5 -256.5t-257.5 -93.5h-400q-163 0 -256.5 94t-93.5 256v400q0 165 92.5 257.5t257.5 92.5zM800 900h-500q-41 0 -70.5 -29.5t-29.5 -70.5v-500q0 -41 29.5 -70.5t70.5 -29.5h500q41 0 70.5 29.5t29.5 70.5 v500q0 41 -29.5 70.5t-70.5 29.5zM580 693l190 -253q12 -16 6.5 -28t-26.5 -12h-400q-21 0 -26.5 12t6.5 28l190 253q12 17 30 17t30 -17z" />
|
||||
<glyph unicode="" d="M550 1100h400q165 0 257.5 -92.5t92.5 -257.5v-400q0 -165 -92.5 -257.5t-257.5 -92.5h-400q-21 0 -35.5 14.5t-14.5 35.5v100q0 21 14.5 35.5t35.5 14.5h450q41 0 70.5 29.5t29.5 70.5v500q0 41 -29.5 70.5t-70.5 29.5h-450q-21 0 -35.5 14.5t-14.5 35.5v100 q0 21 14.5 35.5t35.5 14.5zM338 867l324 -284q16 -14 16 -33t-16 -33l-324 -284q-16 -14 -27 -9t-11 26v150h-250q-21 0 -35.5 14.5t-14.5 35.5v200q0 21 14.5 35.5t35.5 14.5h250v150q0 21 11 26t27 -9z" />
|
||||
<glyph unicode="" d="M793 1182l9 -9q8 -10 5 -27q-3 -11 -79 -225.5t-78 -221.5l300 1q24 0 32.5 -17.5t-5.5 -35.5q-1 0 -133.5 -155t-267 -312.5t-138.5 -162.5q-12 -15 -26 -15h-9l-9 8q-9 11 -4 32q2 9 42 123.5t79 224.5l39 110h-302q-23 0 -31 19q-10 21 6 41q75 86 209.5 237.5 t228 257t98.5 111.5q9 16 25 16h9z" />
|
||||
<glyph unicode="" d="M350 1100h400q21 0 35.5 -14.5t14.5 -35.5v-100q0 -21 -14.5 -35.5t-35.5 -14.5h-450q-41 0 -70.5 -29.5t-29.5 -70.5v-500q0 -41 29.5 -70.5t70.5 -29.5h450q21 0 35.5 -14.5t14.5 -35.5v-100q0 -21 -14.5 -35.5t-35.5 -14.5h-400q-165 0 -257.5 92.5t-92.5 257.5v400 q0 165 92.5 257.5t257.5 92.5zM938 867l324 -284q16 -14 16 -33t-16 -33l-324 -284q-16 -14 -27 -9t-11 26v150h-250q-21 0 -35.5 14.5t-14.5 35.5v200q0 21 14.5 35.5t35.5 14.5h250v150q0 21 11 26t27 -9z" />
|
||||
<glyph unicode="" d="M750 1200h400q21 0 35.5 -14.5t14.5 -35.5v-400q0 -21 -10.5 -25t-24.5 10l-109 109l-312 -312q-15 -15 -35.5 -15t-35.5 15l-141 141q-15 15 -15 35.5t15 35.5l312 312l-109 109q-14 14 -10 24.5t25 10.5zM456 900h-156q-41 0 -70.5 -29.5t-29.5 -70.5v-500 q0 -41 29.5 -70.5t70.5 -29.5h500q41 0 70.5 29.5t29.5 70.5v148l200 200v-298q0 -165 -93.5 -257.5t-256.5 -92.5h-400q-165 0 -257.5 92.5t-92.5 257.5v400q0 165 92.5 257.5t257.5 92.5h300z" />
|
||||
<glyph unicode="" d="M600 1186q119 0 227.5 -46.5t187 -125t125 -187t46.5 -227.5t-46.5 -227.5t-125 -187t-187 -125t-227.5 -46.5t-227.5 46.5t-187 125t-125 187t-46.5 227.5t46.5 227.5t125 187t187 125t227.5 46.5zM600 1022q-115 0 -212 -56.5t-153.5 -153.5t-56.5 -212t56.5 -212 t153.5 -153.5t212 -56.5t212 56.5t153.5 153.5t56.5 212t-56.5 212t-153.5 153.5t-212 56.5zM600 794q80 0 137 -57t57 -137t-57 -137t-137 -57t-137 57t-57 137t57 137t137 57z" />
|
||||
<glyph unicode="" d="M450 1200h200q21 0 35.5 -14.5t14.5 -35.5v-350h245q20 0 25 -11t-9 -26l-383 -426q-14 -15 -33.5 -15t-32.5 15l-379 426q-13 15 -8.5 26t25.5 11h250v350q0 21 14.5 35.5t35.5 14.5zM50 300h1000q21 0 35.5 -14.5t14.5 -35.5v-250h-1100v250q0 21 14.5 35.5t35.5 14.5z M900 200v-50h100v50h-100z" />
|
||||
<glyph unicode="" d="M583 1182l378 -435q14 -15 9 -31t-26 -16h-244v-250q0 -20 -17 -35t-39 -15h-200q-20 0 -32 14.5t-12 35.5v250h-250q-20 0 -25.5 16.5t8.5 31.5l383 431q14 16 33.5 17t33.5 -14zM50 300h1000q21 0 35.5 -14.5t14.5 -35.5v-250h-1100v250q0 21 14.5 35.5t35.5 14.5z M900 200v-50h100v50h-100z" />
|
||||
<glyph unicode="" d="M396 723l369 369q7 7 17.5 7t17.5 -7l139 -139q7 -8 7 -18.5t-7 -17.5l-525 -525q-7 -8 -17.5 -8t-17.5 8l-292 291q-7 8 -7 18t7 18l139 139q8 7 18.5 7t17.5 -7zM50 300h1000q21 0 35.5 -14.5t14.5 -35.5v-250h-1100v250q0 21 14.5 35.5t35.5 14.5zM900 200v-50h100v50 h-100z" />
|
||||
<glyph unicode="" d="M135 1023l142 142q14 14 35 14t35 -14l77 -77l-212 -212l-77 76q-14 15 -14 36t14 35zM655 855l210 210q14 14 24.5 10t10.5 -25l-2 -599q-1 -20 -15.5 -35t-35.5 -15l-597 -1q-21 0 -25 10.5t10 24.5l208 208l-154 155l212 212zM50 300h1000q21 0 35.5 -14.5t14.5 -35.5 v-250h-1100v250q0 21 14.5 35.5t35.5 14.5zM900 200v-50h100v50h-100z" />
|
||||
<glyph unicode="" d="M350 1200l599 -2q20 -1 35 -15.5t15 -35.5l1 -597q0 -21 -10.5 -25t-24.5 10l-208 208l-155 -154l-212 212l155 154l-210 210q-14 14 -10 24.5t25 10.5zM524 512l-76 -77q-15 -14 -36 -14t-35 14l-142 142q-14 14 -14 35t14 35l77 77zM50 300h1000q21 0 35.5 -14.5 t14.5 -35.5v-250h-1100v250q0 21 14.5 35.5t35.5 14.5zM900 200v-50h100v50h-100z" />
|
||||
<glyph unicode="" d="M1200 103l-483 276l-314 -399v423h-399l1196 796v-1096zM483 424v-230l683 953z" />
|
||||
<glyph unicode="" d="M1100 1000v-850q0 -21 -14.5 -35.5t-35.5 -14.5h-150v400h-700v-400h-150q-21 0 -35.5 14.5t-14.5 35.5v1000q0 20 14.5 35t35.5 15h250v-300h500v300h100zM700 1000h-100v200h100v-200z" />
|
||||
<glyph unicode="" d="M1100 1000l-2 -149l-299 -299l-95 95q-9 9 -21.5 9t-21.5 -9l-149 -147h-312v-400h-150q-21 0 -35.5 14.5t-14.5 35.5v1000q0 20 14.5 35t35.5 15h250v-300h500v300h100zM700 1000h-100v200h100v-200zM1132 638l106 -106q7 -7 7 -17.5t-7 -17.5l-420 -421q-8 -7 -18 -7 t-18 7l-202 203q-8 7 -8 17.5t8 17.5l106 106q7 8 17.5 8t17.5 -8l79 -79l297 297q7 7 17.5 7t17.5 -7z" />
|
||||
<glyph unicode="" d="M1100 1000v-269l-103 -103l-134 134q-15 15 -33.5 16.5t-34.5 -12.5l-266 -266h-329v-400h-150q-21 0 -35.5 14.5t-14.5 35.5v1000q0 20 14.5 35t35.5 15h250v-300h500v300h100zM700 1000h-100v200h100v-200zM1202 572l70 -70q15 -15 15 -35.5t-15 -35.5l-131 -131 l131 -131q15 -15 15 -35.5t-15 -35.5l-70 -70q-15 -15 -35.5 -15t-35.5 15l-131 131l-131 -131q-15 -15 -35.5 -15t-35.5 15l-70 70q-15 15 -15 35.5t15 35.5l131 131l-131 131q-15 15 -15 35.5t15 35.5l70 70q15 15 35.5 15t35.5 -15l131 -131l131 131q15 15 35.5 15 t35.5 -15z" />
|
||||
<glyph unicode="" d="M1100 1000v-300h-350q-21 0 -35.5 -14.5t-14.5 -35.5v-150h-500v-400h-150q-21 0 -35.5 14.5t-14.5 35.5v1000q0 20 14.5 35t35.5 15h250v-300h500v300h100zM700 1000h-100v200h100v-200zM850 600h100q21 0 35.5 -14.5t14.5 -35.5v-250h150q21 0 25 -10.5t-10 -24.5 l-230 -230q-14 -14 -35 -14t-35 14l-230 230q-14 14 -10 24.5t25 10.5h150v250q0 21 14.5 35.5t35.5 14.5z" />
|
||||
<glyph unicode="" d="M1100 1000v-400l-165 165q-14 15 -35 15t-35 -15l-263 -265h-402v-400h-150q-21 0 -35.5 14.5t-14.5 35.5v1000q0 20 14.5 35t35.5 15h250v-300h500v300h100zM700 1000h-100v200h100v-200zM935 565l230 -229q14 -15 10 -25.5t-25 -10.5h-150v-250q0 -20 -14.5 -35 t-35.5 -15h-100q-21 0 -35.5 15t-14.5 35v250h-150q-21 0 -25 10.5t10 25.5l230 229q14 15 35 15t35 -15z" />
|
||||
<glyph unicode="" d="M50 1100h1100q21 0 35.5 -14.5t14.5 -35.5v-150h-1200v150q0 21 14.5 35.5t35.5 14.5zM1200 800v-550q0 -21 -14.5 -35.5t-35.5 -14.5h-1100q-21 0 -35.5 14.5t-14.5 35.5v550h1200zM100 500v-200h400v200h-400z" />
|
||||
<glyph unicode="" d="M935 1165l248 -230q14 -14 14 -35t-14 -35l-248 -230q-14 -14 -24.5 -10t-10.5 25v150h-400v200h400v150q0 21 10.5 25t24.5 -10zM200 800h-50q-21 0 -35.5 14.5t-14.5 35.5v100q0 21 14.5 35.5t35.5 14.5h50v-200zM400 800h-100v200h100v-200zM18 435l247 230 q14 14 24.5 10t10.5 -25v-150h400v-200h-400v-150q0 -21 -10.5 -25t-24.5 10l-247 230q-15 14 -15 35t15 35zM900 300h-100v200h100v-200zM1000 500h51q20 0 34.5 -14.5t14.5 -35.5v-100q0 -21 -14.5 -35.5t-34.5 -14.5h-51v200z" />
|
||||
<glyph unicode="" d="M862 1073l276 116q25 18 43.5 8t18.5 -41v-1106q0 -21 -14.5 -35.5t-35.5 -14.5h-200q-21 0 -35.5 14.5t-14.5 35.5v397q-4 1 -11 5t-24 17.5t-30 29t-24 42t-11 56.5v359q0 31 18.5 65t43.5 52zM550 1200q22 0 34.5 -12.5t14.5 -24.5l1 -13v-450q0 -28 -10.5 -59.5 t-25 -56t-29 -45t-25.5 -31.5l-10 -11v-447q0 -21 -14.5 -35.5t-35.5 -14.5h-200q-21 0 -35.5 14.5t-14.5 35.5v447q-4 4 -11 11.5t-24 30.5t-30 46t-24 55t-11 60v450q0 2 0.5 5.5t4 12t8.5 15t14.5 12t22.5 5.5q20 0 32.5 -12.5t14.5 -24.5l3 -13v-350h100v350v5.5t2.5 12 t7 15t15 12t25.5 5.5q23 0 35.5 -12.5t13.5 -24.5l1 -13v-350h100v350q0 2 0.5 5.5t3 12t7 15t15 12t24.5 5.5z" />
|
||||
<glyph unicode="" d="M1200 1100v-56q-4 0 -11 -0.5t-24 -3t-30 -7.5t-24 -15t-11 -24v-888q0 -22 25 -34.5t50 -13.5l25 -2v-56h-400v56q75 0 87.5 6.5t12.5 43.5v394h-500v-394q0 -37 12.5 -43.5t87.5 -6.5v-56h-400v56q4 0 11 0.5t24 3t30 7.5t24 15t11 24v888q0 22 -25 34.5t-50 13.5 l-25 2v56h400v-56q-75 0 -87.5 -6.5t-12.5 -43.5v-394h500v394q0 37 -12.5 43.5t-87.5 6.5v56h400z" />
|
||||
<glyph unicode="" d="M675 1000h375q21 0 35.5 -14.5t14.5 -35.5v-150h-105l-295 -98v98l-200 200h-400l100 100h375zM100 900h300q41 0 70.5 -29.5t29.5 -70.5v-500q0 -41 -29.5 -70.5t-70.5 -29.5h-300q-41 0 -70.5 29.5t-29.5 70.5v500q0 41 29.5 70.5t70.5 29.5zM100 800v-200h300v200 h-300zM1100 535l-400 -133v163l400 133v-163zM100 500v-200h300v200h-300zM1100 398v-248q0 -21 -14.5 -35.5t-35.5 -14.5h-375l-100 -100h-375l-100 100h400l200 200h105z" />
|
||||
<glyph unicode="" d="M17 1007l162 162q17 17 40 14t37 -22l139 -194q14 -20 11 -44.5t-20 -41.5l-119 -118q102 -142 228 -268t267 -227l119 118q17 17 42.5 19t44.5 -12l192 -136q19 -14 22.5 -37.5t-13.5 -40.5l-163 -162q-3 -1 -9.5 -1t-29.5 2t-47.5 6t-62.5 14.5t-77.5 26.5t-90 42.5 t-101.5 60t-111 83t-119 108.5q-74 74 -133.5 150.5t-94.5 138.5t-60 119.5t-34.5 100t-15 74.5t-4.5 48z" />
|
||||
<glyph unicode="" d="M600 1100q92 0 175 -10.5t141.5 -27t108.5 -36.5t81.5 -40t53.5 -37t31 -27l9 -10v-200q0 -21 -14.5 -33t-34.5 -9l-202 34q-20 3 -34.5 20t-14.5 38v146q-141 24 -300 24t-300 -24v-146q0 -21 -14.5 -38t-34.5 -20l-202 -34q-20 -3 -34.5 9t-14.5 33v200q3 4 9.5 10.5 t31 26t54 37.5t80.5 39.5t109 37.5t141 26.5t175 10.5zM600 795q56 0 97 -9.5t60 -23.5t30 -28t12 -24l1 -10v-50l365 -303q14 -15 24.5 -40t10.5 -45v-212q0 -21 -14.5 -35.5t-35.5 -14.5h-1100q-21 0 -35.5 14.5t-14.5 35.5v212q0 20 10.5 45t24.5 40l365 303v50 q0 4 1 10.5t12 23t30 29t60 22.5t97 10z" />
|
||||
<glyph unicode="" d="M1100 700l-200 -200h-600l-200 200v500h200v-200h200v200h200v-200h200v200h200v-500zM250 400h700q21 0 35.5 -14.5t14.5 -35.5t-14.5 -35.5t-35.5 -14.5h-12l137 -100h-950l137 100h-12q-21 0 -35.5 14.5t-14.5 35.5t14.5 35.5t35.5 14.5zM50 100h1100q21 0 35.5 -14.5 t14.5 -35.5v-50h-1200v50q0 21 14.5 35.5t35.5 14.5z" />
|
||||
<glyph unicode="" d="M700 1100h-100q-41 0 -70.5 -29.5t-29.5 -70.5v-1000h300v1000q0 41 -29.5 70.5t-70.5 29.5zM1100 800h-100q-41 0 -70.5 -29.5t-29.5 -70.5v-700h300v700q0 41 -29.5 70.5t-70.5 29.5zM400 0h-300v400q0 41 29.5 70.5t70.5 29.5h100q41 0 70.5 -29.5t29.5 -70.5v-400z " />
|
||||
<glyph unicode="" d="M200 1100h700q124 0 212 -88t88 -212v-500q0 -124 -88 -212t-212 -88h-700q-124 0 -212 88t-88 212v500q0 124 88 212t212 88zM100 900v-700h900v700h-900zM500 700h-200v-100h200v-300h-300v100h200v100h-200v300h300v-100zM900 700v-300l-100 -100h-200v500h200z M700 700v-300h100v300h-100z" />
|
||||
<glyph unicode="" d="M200 1100h700q124 0 212 -88t88 -212v-500q0 -124 -88 -212t-212 -88h-700q-124 0 -212 88t-88 212v500q0 124 88 212t212 88zM100 900v-700h900v700h-900zM500 300h-100v200h-100v-200h-100v500h100v-200h100v200h100v-500zM900 700v-300l-100 -100h-200v500h200z M700 700v-300h100v300h-100z" />
|
||||
<glyph unicode="" d="M200 1100h700q124 0 212 -88t88 -212v-500q0 -124 -88 -212t-212 -88h-700q-124 0 -212 88t-88 212v500q0 124 88 212t212 88zM100 900v-700h900v700h-900zM500 700h-200v-300h200v-100h-300v500h300v-100zM900 700h-200v-300h200v-100h-300v500h300v-100z" />
|
||||
<glyph unicode="" d="M200 1100h700q124 0 212 -88t88 -212v-500q0 -124 -88 -212t-212 -88h-700q-124 0 -212 88t-88 212v500q0 124 88 212t212 88zM100 900v-700h900v700h-900zM500 400l-300 150l300 150v-300zM900 550l-300 -150v300z" />
|
||||
<glyph unicode="" d="M200 1100h700q124 0 212 -88t88 -212v-500q0 -124 -88 -212t-212 -88h-700q-124 0 -212 88t-88 212v500q0 124 88 212t212 88zM100 900v-700h900v700h-900zM900 300h-700v500h700v-500zM800 700h-130q-38 0 -66.5 -43t-28.5 -108t27 -107t68 -42h130v300zM300 700v-300 h130q41 0 68 42t27 107t-28.5 108t-66.5 43h-130z" />
|
||||
<glyph unicode="" d="M200 1100h700q124 0 212 -88t88 -212v-500q0 -124 -88 -212t-212 -88h-700q-124 0 -212 88t-88 212v500q0 124 88 212t212 88zM100 900v-700h900v700h-900zM500 700h-200v-100h200v-300h-300v100h200v100h-200v300h300v-100zM900 300h-100v400h-100v100h200v-500z M700 300h-100v100h100v-100z" />
|
||||
<glyph unicode="" d="M200 1100h700q124 0 212 -88t88 -212v-500q0 -124 -88 -212t-212 -88h-700q-124 0 -212 88t-88 212v500q0 124 88 212t212 88zM100 900v-700h900v700h-900zM300 700h200v-400h-300v500h100v-100zM900 300h-100v400h-100v100h200v-500zM300 600v-200h100v200h-100z M700 300h-100v100h100v-100z" />
|
||||
<glyph unicode="" d="M200 1100h700q124 0 212 -88t88 -212v-500q0 -124 -88 -212t-212 -88h-700q-124 0 -212 88t-88 212v500q0 124 88 212t212 88zM100 900v-700h900v700h-900zM500 500l-199 -200h-100v50l199 200v150h-200v100h300v-300zM900 300h-100v400h-100v100h200v-500zM701 300h-100 v100h100v-100z" />
|
||||
<glyph unicode="" d="M600 1191q120 0 229.5 -47t188.5 -126t126 -188.5t47 -229.5t-47 -229.5t-126 -188.5t-188.5 -126t-229.5 -47t-229.5 47t-188.5 126t-126 188.5t-47 229.5t47 229.5t126 188.5t188.5 126t229.5 47zM600 1021q-114 0 -211 -56.5t-153.5 -153.5t-56.5 -211t56.5 -211 t153.5 -153.5t211 -56.5t211 56.5t153.5 153.5t56.5 211t-56.5 211t-153.5 153.5t-211 56.5zM800 700h-300v-200h300v-100h-300l-100 100v200l100 100h300v-100z" />
|
||||
<glyph unicode="" d="M600 1191q120 0 229.5 -47t188.5 -126t126 -188.5t47 -229.5t-47 -229.5t-126 -188.5t-188.5 -126t-229.5 -47t-229.5 47t-188.5 126t-126 188.5t-47 229.5t47 229.5t126 188.5t188.5 126t229.5 47zM600 1021q-114 0 -211 -56.5t-153.5 -153.5t-56.5 -211t56.5 -211 t153.5 -153.5t211 -56.5t211 56.5t153.5 153.5t56.5 211t-56.5 211t-153.5 153.5t-211 56.5zM800 700v-100l-50 -50l100 -100v-50h-100l-100 100h-150v-100h-100v400h300zM500 700v-100h200v100h-200z" />
|
||||
<glyph unicode="" d="M503 1089q110 0 200.5 -59.5t134.5 -156.5q44 14 90 14q120 0 205 -86.5t85 -207t-85 -207t-205 -86.5h-128v250q0 21 -14.5 35.5t-35.5 14.5h-300q-21 0 -35.5 -14.5t-14.5 -35.5v-250h-222q-80 0 -136 57.5t-56 136.5q0 69 43 122.5t108 67.5q-2 19 -2 37q0 100 49 185 t134 134t185 49zM525 500h150q10 0 17.5 -7.5t7.5 -17.5v-275h137q21 0 26 -11.5t-8 -27.5l-223 -244q-13 -16 -32 -16t-32 16l-223 244q-13 16 -8 27.5t26 11.5h137v275q0 10 7.5 17.5t17.5 7.5z" />
|
||||
<glyph unicode="" d="M502 1089q110 0 201 -59.5t135 -156.5q43 15 89 15q121 0 206 -86.5t86 -206.5q0 -99 -60 -181t-150 -110l-378 360q-13 16 -31.5 16t-31.5 -16l-381 -365h-9q-79 0 -135.5 57.5t-56.5 136.5q0 69 43 122.5t108 67.5q-2 19 -2 38q0 100 49 184.5t133.5 134t184.5 49.5z M632 467l223 -228q13 -16 8 -27.5t-26 -11.5h-137v-275q0 -10 -7.5 -17.5t-17.5 -7.5h-150q-10 0 -17.5 7.5t-7.5 17.5v275h-137q-21 0 -26 11.5t8 27.5q199 204 223 228q19 19 31.5 19t32.5 -19z" />
|
||||
<glyph unicode="" d="M700 100v100h400l-270 300h170l-270 300h170l-300 333l-300 -333h170l-270 -300h170l-270 -300h400v-100h-50q-21 0 -35.5 -14.5t-14.5 -35.5v-50h400v50q0 21 -14.5 35.5t-35.5 14.5h-50z" />
|
||||
<glyph unicode="" d="M600 1179q94 0 167.5 -56.5t99.5 -145.5q89 -6 150.5 -71.5t61.5 -155.5q0 -61 -29.5 -112.5t-79.5 -82.5q9 -29 9 -55q0 -74 -52.5 -126.5t-126.5 -52.5q-55 0 -100 30v-251q21 0 35.5 -14.5t14.5 -35.5v-50h-300v50q0 21 14.5 35.5t35.5 14.5v251q-45 -30 -100 -30 q-74 0 -126.5 52.5t-52.5 126.5q0 18 4 38q-47 21 -75.5 65t-28.5 97q0 74 52.5 126.5t126.5 52.5q5 0 23 -2q0 2 -1 10t-1 13q0 116 81.5 197.5t197.5 81.5z" />
|
||||
<glyph unicode="" d="M1010 1010q111 -111 150.5 -260.5t0 -299t-150.5 -260.5q-83 -83 -191.5 -126.5t-218.5 -43.5t-218.5 43.5t-191.5 126.5q-111 111 -150.5 260.5t0 299t150.5 260.5q83 83 191.5 126.5t218.5 43.5t218.5 -43.5t191.5 -126.5zM476 1065q-4 0 -8 -1q-121 -34 -209.5 -122.5 t-122.5 -209.5q-4 -12 2.5 -23t18.5 -14l36 -9q3 -1 7 -1q23 0 29 22q27 96 98 166q70 71 166 98q11 3 17.5 13.5t3.5 22.5l-9 35q-3 13 -14 19q-7 4 -15 4zM512 920q-4 0 -9 -2q-80 -24 -138.5 -82.5t-82.5 -138.5q-4 -13 2 -24t19 -14l34 -9q4 -1 8 -1q22 0 28 21 q18 58 58.5 98.5t97.5 58.5q12 3 18 13.5t3 21.5l-9 35q-3 12 -14 19q-7 4 -15 4zM719.5 719.5q-49.5 49.5 -119.5 49.5t-119.5 -49.5t-49.5 -119.5t49.5 -119.5t119.5 -49.5t119.5 49.5t49.5 119.5t-49.5 119.5zM855 551q-22 0 -28 -21q-18 -58 -58.5 -98.5t-98.5 -57.5 q-11 -4 -17 -14.5t-3 -21.5l9 -35q3 -12 14 -19q7 -4 15 -4q4 0 9 2q80 24 138.5 82.5t82.5 138.5q4 13 -2.5 24t-18.5 14l-34 9q-4 1 -8 1zM1000 515q-23 0 -29 -22q-27 -96 -98 -166q-70 -71 -166 -98q-11 -3 -17.5 -13.5t-3.5 -22.5l9 -35q3 -13 14 -19q7 -4 15 -4 q4 0 8 1q121 34 209.5 122.5t122.5 209.5q4 12 -2.5 23t-18.5 14l-36 9q-3 1 -7 1z" />
|
||||
<glyph unicode="" d="M700 800h300v-380h-180v200h-340v-200h-380v755q0 10 7.5 17.5t17.5 7.5h575v-400zM1000 900h-200v200zM700 300h162l-212 -212l-212 212h162v200h100v-200zM520 0h-395q-10 0 -17.5 7.5t-7.5 17.5v395zM1000 220v-195q0 -10 -7.5 -17.5t-17.5 -7.5h-195z" />
|
||||
<glyph unicode="" d="M700 800h300v-520l-350 350l-550 -550v1095q0 10 7.5 17.5t17.5 7.5h575v-400zM1000 900h-200v200zM862 200h-162v-200h-100v200h-162l212 212zM480 0h-355q-10 0 -17.5 7.5t-7.5 17.5v55h380v-80zM1000 80v-55q0 -10 -7.5 -17.5t-17.5 -7.5h-155v80h180z" />
|
||||
<glyph unicode="" d="M1162 800h-162v-200h100l100 -100h-300v300h-162l212 212zM200 800h200q27 0 40 -2t29.5 -10.5t23.5 -30t7 -57.5h300v-100h-600l-200 -350v450h100q0 36 7 57.5t23.5 30t29.5 10.5t40 2zM800 400h240l-240 -400h-800l300 500h500v-100z" />
|
||||
<glyph unicode="" d="M650 1100h100q21 0 35.5 -14.5t14.5 -35.5v-50h50q21 0 35.5 -14.5t14.5 -35.5v-100q0 -21 -14.5 -35.5t-35.5 -14.5h-300q-21 0 -35.5 14.5t-14.5 35.5v100q0 21 14.5 35.5t35.5 14.5h50v50q0 21 14.5 35.5t35.5 14.5zM1000 850v150q41 0 70.5 -29.5t29.5 -70.5v-800 q0 -41 -29.5 -70.5t-70.5 -29.5h-600q-1 0 -20 4l246 246l-326 326v324q0 41 29.5 70.5t70.5 29.5v-150q0 -62 44 -106t106 -44h300q62 0 106 44t44 106zM412 250l-212 -212v162h-200v100h200v162z" />
|
||||
<glyph unicode="" d="M450 1100h100q21 0 35.5 -14.5t14.5 -35.5v-50h50q21 0 35.5 -14.5t14.5 -35.5v-100q0 -21 -14.5 -35.5t-35.5 -14.5h-300q-21 0 -35.5 14.5t-14.5 35.5v100q0 21 14.5 35.5t35.5 14.5h50v50q0 21 14.5 35.5t35.5 14.5zM800 850v150q41 0 70.5 -29.5t29.5 -70.5v-500 h-200v-300h200q0 -36 -7 -57.5t-23.5 -30t-29.5 -10.5t-40 -2h-600q-41 0 -70.5 29.5t-29.5 70.5v800q0 41 29.5 70.5t70.5 29.5v-150q0 -62 44 -106t106 -44h300q62 0 106 44t44 106zM1212 250l-212 -212v162h-200v100h200v162z" />
|
||||
<glyph unicode="" d="M658 1197l637 -1104q23 -38 7 -65.5t-60 -27.5h-1276q-44 0 -60 27.5t7 65.5l637 1104q22 39 54 39t54 -39zM704 800h-208q-20 0 -32 -14.5t-8 -34.5l58 -302q4 -20 21.5 -34.5t37.5 -14.5h54q20 0 37.5 14.5t21.5 34.5l58 302q4 20 -8 34.5t-32 14.5zM500 300v-100h200 v100h-200z" />
|
||||
<glyph unicode="" d="M425 1100h250q10 0 17.5 -7.5t7.5 -17.5v-150q0 -10 -7.5 -17.5t-17.5 -7.5h-250q-10 0 -17.5 7.5t-7.5 17.5v150q0 10 7.5 17.5t17.5 7.5zM425 800h250q10 0 17.5 -7.5t7.5 -17.5v-150q0 -10 -7.5 -17.5t-17.5 -7.5h-250q-10 0 -17.5 7.5t-7.5 17.5v150q0 10 7.5 17.5 t17.5 7.5zM825 800h250q10 0 17.5 -7.5t7.5 -17.5v-150q0 -10 -7.5 -17.5t-17.5 -7.5h-250q-10 0 -17.5 7.5t-7.5 17.5v150q0 10 7.5 17.5t17.5 7.5zM25 500h250q10 0 17.5 -7.5t7.5 -17.5v-150q0 -10 -7.5 -17.5t-17.5 -7.5h-250q-10 0 -17.5 7.5t-7.5 17.5v150 q0 10 7.5 17.5t17.5 7.5zM425 500h250q10 0 17.5 -7.5t7.5 -17.5v-150q0 -10 -7.5 -17.5t-17.5 -7.5h-250q-10 0 -17.5 7.5t-7.5 17.5v150q0 10 7.5 17.5t17.5 7.5zM825 500h250q10 0 17.5 -7.5t7.5 -17.5v-150q0 -10 -7.5 -17.5t-17.5 -7.5h-250q-10 0 -17.5 7.5t-7.5 17.5 v150q0 10 7.5 17.5t17.5 7.5zM25 200h250q10 0 17.5 -7.5t7.5 -17.5v-150q0 -10 -7.5 -17.5t-17.5 -7.5h-250q-10 0 -17.5 7.5t-7.5 17.5v150q0 10 7.5 17.5t17.5 7.5zM425 200h250q10 0 17.5 -7.5t7.5 -17.5v-150q0 -10 -7.5 -17.5t-17.5 -7.5h-250q-10 0 -17.5 7.5 t-7.5 17.5v150q0 10 7.5 17.5t17.5 7.5zM825 200h250q10 0 17.5 -7.5t7.5 -17.5v-150q0 -10 -7.5 -17.5t-17.5 -7.5h-250q-10 0 -17.5 7.5t-7.5 17.5v150q0 10 7.5 17.5t17.5 7.5z" />
|
||||
<glyph unicode="" d="M700 1200h100v-200h-100v-100h350q62 0 86.5 -39.5t-3.5 -94.5l-66 -132q-41 -83 -81 -134h-772q-40 51 -81 134l-66 132q-28 55 -3.5 94.5t86.5 39.5h350v100h-100v200h100v100h200v-100zM250 400h700q21 0 35.5 -14.5t14.5 -35.5t-14.5 -35.5t-35.5 -14.5h-12l137 -100 h-950l138 100h-13q-21 0 -35.5 14.5t-14.5 35.5t14.5 35.5t35.5 14.5zM50 100h1100q21 0 35.5 -14.5t14.5 -35.5v-50h-1200v50q0 21 14.5 35.5t35.5 14.5z" />
|
||||
<glyph unicode="" d="M600 1300q40 0 68.5 -29.5t28.5 -70.5h-194q0 41 28.5 70.5t68.5 29.5zM443 1100h314q18 -37 18 -75q0 -8 -3 -25h328q41 0 44.5 -16.5t-30.5 -38.5l-175 -145h-678l-178 145q-34 22 -29 38.5t46 16.5h328q-3 17 -3 25q0 38 18 75zM250 700h700q21 0 35.5 -14.5 t14.5 -35.5t-14.5 -35.5t-35.5 -14.5h-150v-200l275 -200h-950l275 200v200h-150q-21 0 -35.5 14.5t-14.5 35.5t14.5 35.5t35.5 14.5zM50 100h1100q21 0 35.5 -14.5t14.5 -35.5v-50h-1200v50q0 21 14.5 35.5t35.5 14.5z" />
|
||||
<glyph unicode="" d="M600 1181q75 0 128 -53t53 -128t-53 -128t-128 -53t-128 53t-53 128t53 128t128 53zM602 798h46q34 0 55.5 -28.5t21.5 -86.5q0 -76 39 -183h-324q39 107 39 183q0 58 21.5 86.5t56.5 28.5h45zM250 400h700q21 0 35.5 -14.5t14.5 -35.5t-14.5 -35.5t-35.5 -14.5h-13 l138 -100h-950l137 100h-12q-21 0 -35.5 14.5t-14.5 35.5t14.5 35.5t35.5 14.5zM50 100h1100q21 0 35.5 -14.5t14.5 -35.5v-50h-1200v50q0 21 14.5 35.5t35.5 14.5z" />
|
||||
<glyph unicode="" d="M600 1300q47 0 92.5 -53.5t71 -123t25.5 -123.5q0 -78 -55.5 -133.5t-133.5 -55.5t-133.5 55.5t-55.5 133.5q0 62 34 143l144 -143l111 111l-163 163q34 26 63 26zM602 798h46q34 0 55.5 -28.5t21.5 -86.5q0 -76 39 -183h-324q39 107 39 183q0 58 21.5 86.5t56.5 28.5h45 zM250 400h700q21 0 35.5 -14.5t14.5 -35.5t-14.5 -35.5t-35.5 -14.5h-13l138 -100h-950l137 100h-12q-21 0 -35.5 14.5t-14.5 35.5t14.5 35.5t35.5 14.5zM50 100h1100q21 0 35.5 -14.5t14.5 -35.5v-50h-1200v50q0 21 14.5 35.5t35.5 14.5z" />
|
||||
<glyph unicode="" d="M600 1200l300 -161v-139h-300q0 -57 18.5 -108t50 -91.5t63 -72t70 -67.5t57.5 -61h-530q-60 83 -90.5 177.5t-30.5 178.5t33 164.5t87.5 139.5t126 96.5t145.5 41.5v-98zM250 400h700q21 0 35.5 -14.5t14.5 -35.5t-14.5 -35.5t-35.5 -14.5h-13l138 -100h-950l137 100 h-12q-21 0 -35.5 14.5t-14.5 35.5t14.5 35.5t35.5 14.5zM50 100h1100q21 0 35.5 -14.5t14.5 -35.5v-50h-1200v50q0 21 14.5 35.5t35.5 14.5z" />
|
||||
<glyph unicode="" d="M600 1300q41 0 70.5 -29.5t29.5 -70.5v-78q46 -26 73 -72t27 -100v-50h-400v50q0 54 27 100t73 72v78q0 41 29.5 70.5t70.5 29.5zM400 800h400q54 0 100 -27t72 -73h-172v-100h200v-100h-200v-100h200v-100h-200v-100h200q0 -83 -58.5 -141.5t-141.5 -58.5h-400 q-83 0 -141.5 58.5t-58.5 141.5v400q0 83 58.5 141.5t141.5 58.5z" />
|
||||
<glyph unicode="" d="M150 1100h900q21 0 35.5 -14.5t14.5 -35.5v-500q0 -21 -14.5 -35.5t-35.5 -14.5h-900q-21 0 -35.5 14.5t-14.5 35.5v500q0 21 14.5 35.5t35.5 14.5zM125 400h950q10 0 17.5 -7.5t7.5 -17.5v-50q0 -10 -7.5 -17.5t-17.5 -7.5h-283l224 -224q13 -13 13 -31.5t-13 -32 t-31.5 -13.5t-31.5 13l-88 88h-524l-87 -88q-13 -13 -32 -13t-32 13.5t-13 32t13 31.5l224 224h-289q-10 0 -17.5 7.5t-7.5 17.5v50q0 10 7.5 17.5t17.5 7.5zM541 300l-100 -100h324l-100 100h-124z" />
|
||||
<glyph unicode="" d="M200 1100h800q83 0 141.5 -58.5t58.5 -141.5v-200h-100q0 41 -29.5 70.5t-70.5 29.5h-250q-41 0 -70.5 -29.5t-29.5 -70.5h-100q0 41 -29.5 70.5t-70.5 29.5h-250q-41 0 -70.5 -29.5t-29.5 -70.5h-100v200q0 83 58.5 141.5t141.5 58.5zM100 600h1000q41 0 70.5 -29.5 t29.5 -70.5v-300h-1200v300q0 41 29.5 70.5t70.5 29.5zM300 100v-50q0 -21 -14.5 -35.5t-35.5 -14.5h-100q-21 0 -35.5 14.5t-14.5 35.5v50h200zM1100 100v-50q0 -21 -14.5 -35.5t-35.5 -14.5h-100q-21 0 -35.5 14.5t-14.5 35.5v50h200z" />
|
||||
<glyph unicode="" d="M480 1165l682 -683q31 -31 31 -75.5t-31 -75.5l-131 -131h-481l-517 518q-32 31 -32 75.5t32 75.5l295 296q31 31 75.5 31t76.5 -31zM108 794l342 -342l303 304l-341 341zM250 100h800q21 0 35.5 -14.5t14.5 -35.5v-50h-900v50q0 21 14.5 35.5t35.5 14.5z" />
|
||||
<glyph unicode="" d="M1057 647l-189 506q-8 19 -27.5 33t-40.5 14h-400q-21 0 -40.5 -14t-27.5 -33l-189 -506q-8 -19 1.5 -33t30.5 -14h625v-150q0 -21 14.5 -35.5t35.5 -14.5t35.5 14.5t14.5 35.5v150h125q21 0 30.5 14t1.5 33zM897 0h-595v50q0 21 14.5 35.5t35.5 14.5h50v50 q0 21 14.5 35.5t35.5 14.5h48v300h200v-300h47q21 0 35.5 -14.5t14.5 -35.5v-50h50q21 0 35.5 -14.5t14.5 -35.5v-50z" />
|
||||
<glyph unicode="" d="M900 800h300v-575q0 -10 -7.5 -17.5t-17.5 -7.5h-375v591l-300 300v84q0 10 7.5 17.5t17.5 7.5h375v-400zM1200 900h-200v200zM400 600h300v-575q0 -10 -7.5 -17.5t-17.5 -7.5h-650q-10 0 -17.5 7.5t-7.5 17.5v950q0 10 7.5 17.5t17.5 7.5h375v-400zM700 700h-200v200z " />
|
||||
<glyph unicode="" d="M484 1095h195q75 0 146 -32.5t124 -86t89.5 -122.5t48.5 -142q18 -14 35 -20q31 -10 64.5 6.5t43.5 48.5q10 34 -15 71q-19 27 -9 43q5 8 12.5 11t19 -1t23.5 -16q41 -44 39 -105q-3 -63 -46 -106.5t-104 -43.5h-62q-7 -55 -35 -117t-56 -100l-39 -234q-3 -20 -20 -34.5 t-38 -14.5h-100q-21 0 -33 14.5t-9 34.5l12 70q-49 -14 -91 -14h-195q-24 0 -65 8l-11 -64q-3 -20 -20 -34.5t-38 -14.5h-100q-21 0 -33 14.5t-9 34.5l26 157q-84 74 -128 175l-159 53q-19 7 -33 26t-14 40v50q0 21 14.5 35.5t35.5 14.5h124q11 87 56 166l-111 95 q-16 14 -12.5 23.5t24.5 9.5h203q116 101 250 101zM675 1000h-250q-10 0 -17.5 -7.5t-7.5 -17.5v-50q0 -10 7.5 -17.5t17.5 -7.5h250q10 0 17.5 7.5t7.5 17.5v50q0 10 -7.5 17.5t-17.5 7.5z" />
|
||||
<glyph unicode="" d="M641 900l423 247q19 8 42 2.5t37 -21.5l32 -38q14 -15 12.5 -36t-17.5 -34l-139 -120h-390zM50 1100h106q67 0 103 -17t66 -71l102 -212h823q21 0 35.5 -14.5t14.5 -35.5v-50q0 -21 -14 -40t-33 -26l-737 -132q-23 -4 -40 6t-26 25q-42 67 -100 67h-300q-62 0 -106 44 t-44 106v200q0 62 44 106t106 44zM173 928h-80q-19 0 -28 -14t-9 -35v-56q0 -51 42 -51h134q16 0 21.5 8t5.5 24q0 11 -16 45t-27 51q-18 28 -43 28zM550 727q-32 0 -54.5 -22.5t-22.5 -54.5t22.5 -54.5t54.5 -22.5t54.5 22.5t22.5 54.5t-22.5 54.5t-54.5 22.5zM130 389 l152 130q18 19 34 24t31 -3.5t24.5 -17.5t25.5 -28q28 -35 50.5 -51t48.5 -13l63 5l48 -179q13 -61 -3.5 -97.5t-67.5 -79.5l-80 -69q-47 -40 -109 -35.5t-103 51.5l-130 151q-40 47 -35.5 109.5t51.5 102.5zM380 377l-102 -88q-31 -27 2 -65l37 -43q13 -15 27.5 -19.5 t31.5 6.5l61 53q19 16 14 49q-2 20 -12 56t-17 45q-11 12 -19 14t-23 -8z" />
|
||||
<glyph unicode="" d="M625 1200h150q10 0 17.5 -7.5t7.5 -17.5v-109q79 -33 131 -87.5t53 -128.5q1 -46 -15 -84.5t-39 -61t-46 -38t-39 -21.5l-17 -6q6 0 15 -1.5t35 -9t50 -17.5t53 -30t50 -45t35.5 -64t14.5 -84q0 -59 -11.5 -105.5t-28.5 -76.5t-44 -51t-49.5 -31.5t-54.5 -16t-49.5 -6.5 t-43.5 -1v-75q0 -10 -7.5 -17.5t-17.5 -7.5h-150q-10 0 -17.5 7.5t-7.5 17.5v75h-100v-75q0 -10 -7.5 -17.5t-17.5 -7.5h-150q-10 0 -17.5 7.5t-7.5 17.5v75h-175q-10 0 -17.5 7.5t-7.5 17.5v150q0 10 7.5 17.5t17.5 7.5h75v600h-75q-10 0 -17.5 7.5t-7.5 17.5v150 q0 10 7.5 17.5t17.5 7.5h175v75q0 10 7.5 17.5t17.5 7.5h150q10 0 17.5 -7.5t7.5 -17.5v-75h100v75q0 10 7.5 17.5t17.5 7.5zM400 900v-200h263q28 0 48.5 10.5t30 25t15 29t5.5 25.5l1 10q0 4 -0.5 11t-6 24t-15 30t-30 24t-48.5 11h-263zM400 500v-200h363q28 0 48.5 10.5 t30 25t15 29t5.5 25.5l1 10q0 4 -0.5 11t-6 24t-15 30t-30 24t-48.5 11h-363z" />
|
||||
<glyph unicode="" d="M212 1198h780q86 0 147 -61t61 -147v-416q0 -51 -18 -142.5t-36 -157.5l-18 -66q-29 -87 -93.5 -146.5t-146.5 -59.5h-572q-82 0 -147 59t-93 147q-8 28 -20 73t-32 143.5t-20 149.5v416q0 86 61 147t147 61zM600 1045q-70 0 -132.5 -11.5t-105.5 -30.5t-78.5 -41.5 t-57 -45t-36 -41t-20.5 -30.5l-6 -12l156 -243h560l156 243q-2 5 -6 12.5t-20 29.5t-36.5 42t-57 44.5t-79 42t-105 29.5t-132.5 12zM762 703h-157l195 261z" />
|
||||
<glyph unicode="" d="M475 1300h150q103 0 189 -86t86 -189v-500q0 -41 -42 -83t-83 -42h-450q-41 0 -83 42t-42 83v500q0 103 86 189t189 86zM700 300v-225q0 -21 -27 -48t-48 -27h-150q-21 0 -48 27t-27 48v225h300z" />
|
||||
<glyph unicode="" d="M475 1300h96q0 -150 89.5 -239.5t239.5 -89.5v-446q0 -41 -42 -83t-83 -42h-450q-41 0 -83 42t-42 83v500q0 103 86 189t189 86zM700 300v-225q0 -21 -27 -48t-48 -27h-150q-21 0 -48 27t-27 48v225h300z" />
|
||||
<glyph unicode="" d="M1294 767l-638 -283l-378 170l-78 -60v-224l100 -150v-199l-150 148l-150 -149v200l100 150v250q0 4 -0.5 10.5t0 9.5t1 8t3 8t6.5 6l47 40l-147 65l642 283zM1000 380l-350 -166l-350 166v147l350 -165l350 165v-147z" />
|
||||
<glyph unicode="" d="M250 800q62 0 106 -44t44 -106t-44 -106t-106 -44t-106 44t-44 106t44 106t106 44zM650 800q62 0 106 -44t44 -106t-44 -106t-106 -44t-106 44t-44 106t44 106t106 44zM1050 800q62 0 106 -44t44 -106t-44 -106t-106 -44t-106 44t-44 106t44 106t106 44z" />
|
||||
<glyph unicode="" d="M550 1100q62 0 106 -44t44 -106t-44 -106t-106 -44t-106 44t-44 106t44 106t106 44zM550 700q62 0 106 -44t44 -106t-44 -106t-106 -44t-106 44t-44 106t44 106t106 44zM550 300q62 0 106 -44t44 -106t-44 -106t-106 -44t-106 44t-44 106t44 106t106 44z" />
|
||||
<glyph unicode="" d="M125 1100h950q10 0 17.5 -7.5t7.5 -17.5v-150q0 -10 -7.5 -17.5t-17.5 -7.5h-950q-10 0 -17.5 7.5t-7.5 17.5v150q0 10 7.5 17.5t17.5 7.5zM125 700h950q10 0 17.5 -7.5t7.5 -17.5v-150q0 -10 -7.5 -17.5t-17.5 -7.5h-950q-10 0 -17.5 7.5t-7.5 17.5v150q0 10 7.5 17.5 t17.5 7.5zM125 300h950q10 0 17.5 -7.5t7.5 -17.5v-150q0 -10 -7.5 -17.5t-17.5 -7.5h-950q-10 0 -17.5 7.5t-7.5 17.5v150q0 10 7.5 17.5t17.5 7.5z" />
|
||||
<glyph unicode="" d="M350 1200h500q162 0 256 -93.5t94 -256.5v-500q0 -165 -93.5 -257.5t-256.5 -92.5h-500q-165 0 -257.5 92.5t-92.5 257.5v500q0 165 92.5 257.5t257.5 92.5zM900 1000h-600q-41 0 -70.5 -29.5t-29.5 -70.5v-600q0 -41 29.5 -70.5t70.5 -29.5h600q41 0 70.5 29.5 t29.5 70.5v600q0 41 -29.5 70.5t-70.5 29.5zM350 900h500q21 0 35.5 -14.5t14.5 -35.5v-300q0 -21 -14.5 -35.5t-35.5 -14.5h-500q-21 0 -35.5 14.5t-14.5 35.5v300q0 21 14.5 35.5t35.5 14.5zM400 800v-200h400v200h-400z" />
|
||||
<glyph unicode="" d="M150 1100h1000q21 0 35.5 -14.5t14.5 -35.5t-14.5 -35.5t-35.5 -14.5h-50v-200h50q21 0 35.5 -14.5t14.5 -35.5t-14.5 -35.5t-35.5 -14.5h-50v-200h50q21 0 35.5 -14.5t14.5 -35.5t-14.5 -35.5t-35.5 -14.5h-50v-200h50q21 0 35.5 -14.5t14.5 -35.5t-14.5 -35.5 t-35.5 -14.5h-1000q-21 0 -35.5 14.5t-14.5 35.5t14.5 35.5t35.5 14.5h50v200h-50q-21 0 -35.5 14.5t-14.5 35.5t14.5 35.5t35.5 14.5h50v200h-50q-21 0 -35.5 14.5t-14.5 35.5t14.5 35.5t35.5 14.5h50v200h-50q-21 0 -35.5 14.5t-14.5 35.5t14.5 35.5t35.5 14.5z" />
|
||||
<glyph unicode="" d="M650 1187q87 -67 118.5 -156t0 -178t-118.5 -155q-87 66 -118.5 155t0 178t118.5 156zM300 800q124 0 212 -88t88 -212q-124 0 -212 88t-88 212zM1000 800q0 -124 -88 -212t-212 -88q0 124 88 212t212 88zM300 500q124 0 212 -88t88 -212q-124 0 -212 88t-88 212z M1000 500q0 -124 -88 -212t-212 -88q0 124 88 212t212 88zM700 199v-144q0 -21 -14.5 -35.5t-35.5 -14.5t-35.5 14.5t-14.5 35.5v142q40 -4 43 -4q17 0 57 6z" />
|
||||
<glyph unicode="" d="M745 878l69 19q25 6 45 -12l298 -295q11 -11 15 -26.5t-2 -30.5q-5 -14 -18 -23.5t-28 -9.5h-8q1 0 1 -13q0 -29 -2 -56t-8.5 -62t-20 -63t-33 -53t-51 -39t-72.5 -14h-146q-184 0 -184 288q0 24 10 47q-20 4 -62 4t-63 -4q11 -24 11 -47q0 -288 -184 -288h-142 q-48 0 -84.5 21t-56 51t-32 71.5t-16 75t-3.5 68.5q0 13 2 13h-7q-15 0 -27.5 9.5t-18.5 23.5q-6 15 -2 30.5t15 25.5l298 296q20 18 46 11l76 -19q20 -5 30.5 -22.5t5.5 -37.5t-22.5 -31t-37.5 -5l-51 12l-182 -193h891l-182 193l-44 -12q-20 -5 -37.5 6t-22.5 31t6 37.5 t31 22.5z" />
|
||||
<glyph unicode="" d="M1200 900h-50q0 21 -4 37t-9.5 26.5t-18 17.5t-22 11t-28.5 5.5t-31 2t-37 0.5h-200v-850q0 -22 25 -34.5t50 -13.5l25 -2v-100h-400v100q4 0 11 0.5t24 3t30 7t24 15t11 24.5v850h-200q-25 0 -37 -0.5t-31 -2t-28.5 -5.5t-22 -11t-18 -17.5t-9.5 -26.5t-4 -37h-50v300 h1000v-300zM500 450h-25q0 15 -4 24.5t-9 14.5t-17 7.5t-20 3t-25 0.5h-100v-425q0 -11 12.5 -17.5t25.5 -7.5h12v-50h-200v50q50 0 50 25v425h-100q-17 0 -25 -0.5t-20 -3t-17 -7.5t-9 -14.5t-4 -24.5h-25v150h500v-150z" />
|
||||
<glyph unicode="" d="M1000 300v50q-25 0 -55 32q-14 14 -25 31t-16 27l-4 11l-289 747h-69l-300 -754q-18 -35 -39 -56q-9 -9 -24.5 -18.5t-26.5 -14.5l-11 -5v-50h273v50q-49 0 -78.5 21.5t-11.5 67.5l69 176h293l61 -166q13 -34 -3.5 -66.5t-55.5 -32.5v-50h312zM412 691l134 342l121 -342 h-255zM1100 150v-100q0 -21 -14.5 -35.5t-35.5 -14.5h-1000q-21 0 -35.5 14.5t-14.5 35.5v100q0 21 14.5 35.5t35.5 14.5h1000q21 0 35.5 -14.5t14.5 -35.5z" />
|
||||
<glyph unicode="" d="M50 1200h1100q21 0 35.5 -14.5t14.5 -35.5v-1100q0 -21 -14.5 -35.5t-35.5 -14.5h-1100q-21 0 -35.5 14.5t-14.5 35.5v1100q0 21 14.5 35.5t35.5 14.5zM611 1118h-70q-13 0 -18 -12l-299 -753q-17 -32 -35 -51q-18 -18 -56 -34q-12 -5 -12 -18v-50q0 -8 5.5 -14t14.5 -6 h273q8 0 14 6t6 14v50q0 8 -6 14t-14 6q-55 0 -71 23q-10 14 0 39l63 163h266l57 -153q11 -31 -6 -55q-12 -17 -36 -17q-8 0 -14 -6t-6 -14v-50q0 -8 6 -14t14 -6h313q8 0 14 6t6 14v50q0 7 -5.5 13t-13.5 7q-17 0 -42 25q-25 27 -40 63h-1l-288 748q-5 12 -19 12zM639 611 h-197l103 264z" />
|
||||
<glyph unicode="" d="M1200 1100h-1200v100h1200v-100zM50 1000h400q21 0 35.5 -14.5t14.5 -35.5v-900q0 -21 -14.5 -35.5t-35.5 -14.5h-400q-21 0 -35.5 14.5t-14.5 35.5v900q0 21 14.5 35.5t35.5 14.5zM650 1000h400q21 0 35.5 -14.5t14.5 -35.5v-400q0 -21 -14.5 -35.5t-35.5 -14.5h-400 q-21 0 -35.5 14.5t-14.5 35.5v400q0 21 14.5 35.5t35.5 14.5zM700 900v-300h300v300h-300z" />
|
||||
<glyph unicode="" d="M50 1200h400q21 0 35.5 -14.5t14.5 -35.5v-900q0 -21 -14.5 -35.5t-35.5 -14.5h-400q-21 0 -35.5 14.5t-14.5 35.5v900q0 21 14.5 35.5t35.5 14.5zM650 700h400q21 0 35.5 -14.5t14.5 -35.5v-400q0 -21 -14.5 -35.5t-35.5 -14.5h-400q-21 0 -35.5 14.5t-14.5 35.5v400 q0 21 14.5 35.5t35.5 14.5zM700 600v-300h300v300h-300zM1200 0h-1200v100h1200v-100z" />
|
||||
<glyph unicode="" d="M50 1000h400q21 0 35.5 -14.5t14.5 -35.5v-350h100v150q0 21 14.5 35.5t35.5 14.5h400q21 0 35.5 -14.5t14.5 -35.5v-150h100v-100h-100v-150q0 -21 -14.5 -35.5t-35.5 -14.5h-400q-21 0 -35.5 14.5t-14.5 35.5v150h-100v-350q0 -21 -14.5 -35.5t-35.5 -14.5h-400 q-21 0 -35.5 14.5t-14.5 35.5v800q0 21 14.5 35.5t35.5 14.5zM700 700v-300h300v300h-300z" />
|
||||
<glyph unicode="" d="M100 0h-100v1200h100v-1200zM250 1100h400q21 0 35.5 -14.5t14.5 -35.5v-400q0 -21 -14.5 -35.5t-35.5 -14.5h-400q-21 0 -35.5 14.5t-14.5 35.5v400q0 21 14.5 35.5t35.5 14.5zM300 1000v-300h300v300h-300zM250 500h900q21 0 35.5 -14.5t14.5 -35.5v-400 q0 -21 -14.5 -35.5t-35.5 -14.5h-900q-21 0 -35.5 14.5t-14.5 35.5v400q0 21 14.5 35.5t35.5 14.5z" />
|
||||
<glyph unicode="" d="M600 1100h150q21 0 35.5 -14.5t14.5 -35.5v-400q0 -21 -14.5 -35.5t-35.5 -14.5h-150v-100h450q21 0 35.5 -14.5t14.5 -35.5v-400q0 -21 -14.5 -35.5t-35.5 -14.5h-900q-21 0 -35.5 14.5t-14.5 35.5v400q0 21 14.5 35.5t35.5 14.5h350v100h-150q-21 0 -35.5 14.5 t-14.5 35.5v400q0 21 14.5 35.5t35.5 14.5h150v100h100v-100zM400 1000v-300h300v300h-300z" />
|
||||
<glyph unicode="" d="M1200 0h-100v1200h100v-1200zM550 1100h400q21 0 35.5 -14.5t14.5 -35.5v-400q0 -21 -14.5 -35.5t-35.5 -14.5h-400q-21 0 -35.5 14.5t-14.5 35.5v400q0 21 14.5 35.5t35.5 14.5zM600 1000v-300h300v300h-300zM50 500h900q21 0 35.5 -14.5t14.5 -35.5v-400 q0 -21 -14.5 -35.5t-35.5 -14.5h-900q-21 0 -35.5 14.5t-14.5 35.5v400q0 21 14.5 35.5t35.5 14.5z" />
|
||||
<glyph unicode="" d="M865 565l-494 -494q-23 -23 -41 -23q-14 0 -22 13.5t-8 38.5v1000q0 25 8 38.5t22 13.5q18 0 41 -23l494 -494q14 -14 14 -35t-14 -35z" />
|
||||
<glyph unicode="" d="M335 635l494 494q29 29 50 20.5t21 -49.5v-1000q0 -41 -21 -49.5t-50 20.5l-494 494q-14 14 -14 35t14 35z" />
|
||||
<glyph unicode="" d="M100 900h1000q41 0 49.5 -21t-20.5 -50l-494 -494q-14 -14 -35 -14t-35 14l-494 494q-29 29 -20.5 50t49.5 21z" />
|
||||
<glyph unicode="" d="M635 865l494 -494q29 -29 20.5 -50t-49.5 -21h-1000q-41 0 -49.5 21t20.5 50l494 494q14 14 35 14t35 -14z" />
|
||||
<glyph unicode="" d="M700 741v-182l-692 -323v221l413 193l-413 193v221zM1200 0h-800v200h800v-200z" />
|
||||
<glyph unicode="" d="M1200 900h-200v-100h200v-100h-300v300h200v100h-200v100h300v-300zM0 700h50q0 21 4 37t9.5 26.5t18 17.5t22 11t28.5 5.5t31 2t37 0.5h100v-550q0 -22 -25 -34.5t-50 -13.5l-25 -2v-100h400v100q-4 0 -11 0.5t-24 3t-30 7t-24 15t-11 24.5v550h100q25 0 37 -0.5t31 -2 t28.5 -5.5t22 -11t18 -17.5t9.5 -26.5t4 -37h50v300h-800v-300z" />
|
||||
<glyph unicode="" d="M800 700h-50q0 21 -4 37t-9.5 26.5t-18 17.5t-22 11t-28.5 5.5t-31 2t-37 0.5h-100v-550q0 -22 25 -34.5t50 -14.5l25 -1v-100h-400v100q4 0 11 0.5t24 3t30 7t24 15t11 24.5v550h-100q-25 0 -37 -0.5t-31 -2t-28.5 -5.5t-22 -11t-18 -17.5t-9.5 -26.5t-4 -37h-50v300 h800v-300zM1100 200h-200v-100h200v-100h-300v300h200v100h-200v100h300v-300z" />
|
||||
<glyph unicode="" d="M701 1098h160q16 0 21 -11t-7 -23l-464 -464l464 -464q12 -12 7 -23t-21 -11h-160q-13 0 -23 9l-471 471q-7 8 -7 18t7 18l471 471q10 9 23 9z" />
|
||||
<glyph unicode="" d="M339 1098h160q13 0 23 -9l471 -471q7 -8 7 -18t-7 -18l-471 -471q-10 -9 -23 -9h-160q-16 0 -21 11t7 23l464 464l-464 464q-12 12 -7 23t21 11z" />
|
||||
<glyph unicode="" d="M1087 882q11 -5 11 -21v-160q0 -13 -9 -23l-471 -471q-8 -7 -18 -7t-18 7l-471 471q-9 10 -9 23v160q0 16 11 21t23 -7l464 -464l464 464q12 12 23 7z" />
|
||||
<glyph unicode="" d="M618 993l471 -471q9 -10 9 -23v-160q0 -16 -11 -21t-23 7l-464 464l-464 -464q-12 -12 -23 -7t-11 21v160q0 13 9 23l471 471q8 7 18 7t18 -7z" />
|
||||
<glyph unicode="" d="M1000 1200q0 -124 -88 -212t-212 -88q0 124 88 212t212 88zM450 1000h100q21 0 40 -14t26 -33l79 -194q5 1 16 3q34 6 54 9.5t60 7t65.5 1t61 -10t56.5 -23t42.5 -42t29 -64t5 -92t-19.5 -121.5q-1 -7 -3 -19.5t-11 -50t-20.5 -73t-32.5 -81.5t-46.5 -83t-64 -70 t-82.5 -50q-13 -5 -42 -5t-65.5 2.5t-47.5 2.5q-14 0 -49.5 -3.5t-63 -3.5t-43.5 7q-57 25 -104.5 78.5t-75 111.5t-46.5 112t-26 90l-7 35q-15 63 -18 115t4.5 88.5t26 64t39.5 43.5t52 25.5t58.5 13t62.5 2t59.5 -4.5t55.5 -8l-147 192q-12 18 -5.5 30t27.5 12z" />
|
||||
<glyph unicode="🔑" d="M250 1200h600q21 0 35.5 -14.5t14.5 -35.5v-400q0 -21 -14.5 -35.5t-35.5 -14.5h-150v-500l-255 -178q-19 -9 -32 -1t-13 29v650h-150q-21 0 -35.5 14.5t-14.5 35.5v400q0 21 14.5 35.5t35.5 14.5zM400 1100v-100h300v100h-300z" />
|
||||
<glyph unicode="🚪" d="M250 1200h750q39 0 69.5 -40.5t30.5 -84.5v-933l-700 -117v950l600 125h-700v-1000h-100v1025q0 23 15.5 49t34.5 26zM500 525v-100l100 20v100z" />
|
||||
</font>
|
||||
</defs></svg>
|
After Width: | Height: | Size: 106 KiB |
7
public/static/bootstrap/3.3.7/js/bootstrap.min.js
vendored
Normal file
7
public/static/clipboard.js/2.0.1/clipboard.min.js
vendored
Normal file
228
public/static/contextjs/css/context.standalone.css
Normal file
@ -0,0 +1,228 @@
|
||||
/**
|
||||
* ContextJS Styles
|
||||
* For use WITHOUT Twitters Bootstrap CSS
|
||||
*/
|
||||
|
||||
.nav-header {
|
||||
display: block;
|
||||
padding: 3px 15px;
|
||||
font-size: 11px;
|
||||
font-weight: bold;
|
||||
line-height: 20px;
|
||||
color: #999;
|
||||
text-shadow: 0 1px 0 rgba(255, 255, 255, 0.5);
|
||||
text-transform: uppercase;
|
||||
}
|
||||
.dropdown-menu {
|
||||
position: absolute;
|
||||
top: 100%;
|
||||
left: 0;
|
||||
z-index: 1000;
|
||||
display: none;
|
||||
float: left;
|
||||
min-width: 160px;
|
||||
padding: 5px 0;
|
||||
margin: 2px 0 0;
|
||||
list-style: none;
|
||||
background-color: #ffffff;
|
||||
border: 1px solid #ccc;
|
||||
border: 1px solid rgba(0, 0, 0, 0.2);
|
||||
font-family: "Helvetica Neue", Helvetica, Arial, sans-serif;
|
||||
font-size: 14px;
|
||||
*border-right-width: 2px;
|
||||
*border-bottom-width: 2px;
|
||||
-webkit-border-radius: 6px;
|
||||
-moz-border-radius: 6px;
|
||||
border-radius: 6px;
|
||||
-webkit-box-shadow: 0 5px 10px rgba(0, 0, 0, 0.2);
|
||||
-moz-box-shadow: 0 5px 10px rgba(0, 0, 0, 0.2);
|
||||
box-shadow: 0 5px 10px rgba(0, 0, 0, 0.2);
|
||||
-webkit-background-clip: padding-box;
|
||||
-moz-background-clip: padding;
|
||||
background-clip: padding-box;
|
||||
text-align:left;
|
||||
}
|
||||
.dropdown-menu.pull-right {
|
||||
right: 0;
|
||||
left: auto;
|
||||
}
|
||||
.dropdown-menu .divider {
|
||||
*width: 100%;
|
||||
height: 1px;
|
||||
margin: 9px 1px;
|
||||
*margin: -5px 0 5px;
|
||||
overflow: hidden;
|
||||
background-color: #e5e5e5;
|
||||
border-bottom: 1px solid #ffffff;
|
||||
}
|
||||
.dropdown-menu a {
|
||||
display: block;
|
||||
padding: 3px 20px;
|
||||
clear: both;
|
||||
font-weight: normal;
|
||||
line-height: 20px;
|
||||
color: #333333;
|
||||
white-space: nowrap;
|
||||
text-decoration: none;
|
||||
}
|
||||
.dropdown-menu li > a:hover, .dropdown-menu li > a:focus, .dropdown-submenu:hover > a {
|
||||
color: #ffffff;
|
||||
text-decoration: none;
|
||||
background-color: #0088cc;
|
||||
background-color: #0081c2;
|
||||
background-image: -moz-linear-gradient(top, #0088cc, #0077b3);
|
||||
background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#0088cc), to(#0077b3));
|
||||
background-image: -webkit-linear-gradient(top, #0088cc, #0077b3);
|
||||
background-image: -o-linear-gradient(top, #0088cc, #0077b3);
|
||||
background-image: linear-gradient(to bottom, #0088cc, #0077b3);
|
||||
background-repeat: repeat-x;
|
||||
filter: progid: dximagetransform.microsoft.gradient(startColorstr='#ff0088cc', endColorstr='#ff0077b3', GradientType=0);
|
||||
}
|
||||
.dropdown-menu .active > a, .dropdown-menu .active > a:hover {
|
||||
color: #ffffff;
|
||||
text-decoration: none;
|
||||
background-color: #0088cc;
|
||||
background-color: #0081c2;
|
||||
background-image: linear-gradient(to bottom, #0088cc, #0077b3);
|
||||
background-image: -moz-linear-gradient(top, #0088cc, #0077b3);
|
||||
background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#0088cc), to(#0077b3));
|
||||
background-image: -webkit-linear-gradient(top, #0088cc, #0077b3);
|
||||
background-image: -o-linear-gradient(top, #0088cc, #0077b3);
|
||||
background-repeat: repeat-x;
|
||||
outline: 0;
|
||||
filter: progid
|
||||
: dximagetransform.microsoft.gradient(startColorstr='#ff0088cc', endColorstr='#ff0077b3', GradientType=0);
|
||||
}
|
||||
.dropdown-menu .disabled > a, .dropdown-menu .disabled > a:hover {
|
||||
color: #999999;
|
||||
}
|
||||
.dropdown-menu .disabled > a:hover {
|
||||
text-decoration: none;
|
||||
cursor: default;
|
||||
background-color: transparent;
|
||||
}
|
||||
.open {
|
||||
*z-index: 1000;
|
||||
}
|
||||
.open > .dropdown-menu {
|
||||
display: block;
|
||||
}
|
||||
.pull-right > .dropdown-menu {
|
||||
right: 0;
|
||||
left: auto;
|
||||
}
|
||||
.dropup .caret, .navbar-fixed-bottom .dropdown .caret {
|
||||
border-top: 0;
|
||||
border-bottom: 4px solid #000000;
|
||||
content: "\2191";
|
||||
}
|
||||
.dropup .dropdown-menu, .navbar-fixed-bottom .dropdown .dropdown-menu {
|
||||
top: auto;
|
||||
bottom: 100%;
|
||||
margin-bottom: 1px;
|
||||
}
|
||||
.dropdown-submenu {
|
||||
position: relative;
|
||||
}
|
||||
.dropdown-submenu > .dropdown-menu {
|
||||
top: 0;
|
||||
left: 100%;
|
||||
margin-top: -6px;
|
||||
margin-left: -1px;
|
||||
-webkit-border-radius: 0 6px 6px 6px;
|
||||
-moz-border-radius: 0 6px 6px 6px;
|
||||
border-radius: 0 6px 6px 6px;
|
||||
}
|
||||
.dropdown-submenu > .dropdown-menu.drop-left{
|
||||
left:-100%;
|
||||
}
|
||||
.dropdown-submenu:hover .dropdown-menu {
|
||||
display: block;
|
||||
}
|
||||
.dropdown-submenu > a:after {
|
||||
display: block;
|
||||
float: right;
|
||||
width: 0;
|
||||
height: 0;
|
||||
margin-top: 5px;
|
||||
margin-right: -10px;
|
||||
border-color: transparent;
|
||||
border-left-color: #cccccc;
|
||||
border-style: solid;
|
||||
border-width: 5px 0 5px 5px;
|
||||
content: " ";
|
||||
}
|
||||
.dropdown-submenu:hover > a:after {
|
||||
border-left-color: #ffffff;
|
||||
}
|
||||
.dropdown .dropdown-menu .nav-header {
|
||||
padding-right: 20px;
|
||||
padding-left: 20px;
|
||||
}
|
||||
/**
|
||||
* Context Styles
|
||||
*/
|
||||
|
||||
.dropdown-context .nav-header {
|
||||
cursor: default;
|
||||
}
|
||||
.dropdown-context:before, .dropdown-context-up:before {
|
||||
position: absolute;
|
||||
top: -7px;
|
||||
left: 9px;
|
||||
display: inline-block;
|
||||
border-right: 7px solid transparent;
|
||||
border-bottom: 7px solid #ccc;
|
||||
border-left: 7px solid transparent;
|
||||
border-bottom-color: rgba(0, 0, 0, 0.2);
|
||||
content: '';
|
||||
}
|
||||
.dropdown-context:after, .dropdown-context-up:after {
|
||||
position: absolute;
|
||||
top: -6px;
|
||||
left: 10px;
|
||||
display: inline-block;
|
||||
border-right: 6px solid transparent;
|
||||
border-bottom: 6px solid #ffffff;
|
||||
border-left: 6px solid transparent;
|
||||
content: '';
|
||||
}
|
||||
.dropdown-context-up:before, .dropdown-context-up:after {
|
||||
top: auto;
|
||||
bottom: -7px;
|
||||
z-index: 9999;
|
||||
}
|
||||
.dropdown-context-up:before {
|
||||
border-right: 7px solid transparent;
|
||||
border-top: 7px solid #ccc;
|
||||
border-bottom: none;
|
||||
border-left: 7px solid transparent;
|
||||
}
|
||||
.dropdown-context-up:after {
|
||||
border-right: 6px solid transparent;
|
||||
border-top: 6px solid #ffffff;
|
||||
border-left: 6px solid transparent;
|
||||
border-bottom: none;
|
||||
}
|
||||
.dropdown-context-sub:before, .dropdown-context-sub:after {
|
||||
display: none;
|
||||
}
|
||||
.dropdown-context .dropdown-submenu:hover .dropdown-menu {
|
||||
display: none;
|
||||
}
|
||||
.dropdown-context .dropdown-submenu:hover > .dropdown-menu {
|
||||
display: block;
|
||||
}
|
||||
|
||||
.compressed-context a{
|
||||
padding-left: 14px;
|
||||
padding-top: 0;
|
||||
padding-bottom: 0;
|
||||
font-size: 13px;
|
||||
}
|
||||
.compressed-context .divider{
|
||||
margin: 5px 1px;
|
||||
}
|
||||
.compressed-context .nav-header{
|
||||
padding:1px 13px;
|
||||
}
|
141
public/static/contextjs/js/context.js
Normal file
@ -0,0 +1,141 @@
|
||||
/*
|
||||
* Context.js
|
||||
* Copyright Jacob Kelley
|
||||
* MIT License
|
||||
*/
|
||||
|
||||
var context = context || (function () {
|
||||
|
||||
var options = {
|
||||
fadeSpeed: 100,
|
||||
filter: function ($obj) {
|
||||
// Modify $obj, Do not return
|
||||
},
|
||||
above: 'auto',
|
||||
preventDoubleContext: true,
|
||||
compress: false
|
||||
};
|
||||
|
||||
function initialize(opts) {
|
||||
|
||||
options = $.extend({}, options, opts);
|
||||
|
||||
$(document).on('click', 'html', function () {
|
||||
$('.dropdown-context').fadeOut(options.fadeSpeed, function(){
|
||||
$('.dropdown-context').css({display:''}).find('.drop-left').removeClass('drop-left');
|
||||
});
|
||||
});
|
||||
if(options.preventDoubleContext){
|
||||
$(document).on('contextmenu', '.dropdown-context', function (e) {
|
||||
e.preventDefault();
|
||||
});
|
||||
}
|
||||
$(document).on('mouseenter', '.dropdown-submenu', function(){
|
||||
var $sub = $(this).find('.dropdown-context-sub:first'),
|
||||
subWidth = $sub.width(),
|
||||
subLeft = $sub.offset().left,
|
||||
collision = (subWidth+subLeft) > window.innerWidth;
|
||||
if(collision){
|
||||
$sub.addClass('drop-left');
|
||||
}
|
||||
});
|
||||
|
||||
}
|
||||
|
||||
function updateOptions(opts){
|
||||
options = $.extend({}, options, opts);
|
||||
}
|
||||
|
||||
function buildMenu(data, id, subMenu) {
|
||||
var subClass = (subMenu) ? ' dropdown-context-sub' : '',
|
||||
compressed = options.compress ? ' compressed-context' : '',
|
||||
$menu = $('<ul class="dropdown-menu dropdown-context' + subClass + compressed+'" id="dropdown-' + id + '"></ul>');
|
||||
var i = 0, linkTarget = '';
|
||||
for(i; i<data.length; i++) {
|
||||
if (typeof data[i].divider !== 'undefined') {
|
||||
$menu.append('<li class="divider"></li>');
|
||||
} else if (typeof data[i].header !== 'undefined') {
|
||||
$menu.append('<li class="nav-header">' + data[i].header + '</li>');
|
||||
} else {
|
||||
if (typeof data[i].href == 'undefined') {
|
||||
data[i].href = '#';
|
||||
}
|
||||
if (typeof data[i].target !== 'undefined') {
|
||||
linkTarget = ' target="'+data[i].target+'"';
|
||||
}
|
||||
if (typeof data[i].subMenu !== 'undefined') {
|
||||
$sub = ('<li class="dropdown-submenu"><a tabindex="-1" href="' + data[i].href + '">' + data[i].text + '</a></li>');
|
||||
} else {
|
||||
$sub = $('<li><a tabindex="-1" href="' + data[i].href + '"'+linkTarget+'>' + data[i].text + '</a></li>');
|
||||
}
|
||||
if (typeof data[i].action !== 'undefined') {
|
||||
var actiond = new Date(),
|
||||
actionID = 'event-' + actiond.getTime() * Math.floor(Math.random()*100000),
|
||||
eventAction = data[i].action;
|
||||
$sub.find('a').attr('id', actionID);
|
||||
$('#' + actionID).addClass('context-event');
|
||||
$(document).on('click', '#' + actionID, eventAction);
|
||||
}
|
||||
$menu.append($sub);
|
||||
if (typeof data[i].subMenu != 'undefined') {
|
||||
var subMenuData = buildMenu(data[i].subMenu, id, true);
|
||||
$menu.find('li:last').append(subMenuData);
|
||||
}
|
||||
}
|
||||
if (typeof options.filter == 'function') {
|
||||
options.filter($menu.find('li:last'));
|
||||
}
|
||||
}
|
||||
return $menu;
|
||||
}
|
||||
|
||||
function addContext(selector, data) {
|
||||
|
||||
var d = new Date(),
|
||||
id = d.getTime(),
|
||||
$menu = buildMenu(data, id);
|
||||
|
||||
$('body').append($menu);
|
||||
|
||||
|
||||
$(document).on('contextmenu', selector, function (e) {
|
||||
e.preventDefault();
|
||||
e.stopPropagation();
|
||||
|
||||
$('.dropdown-context:not(.dropdown-context-sub)').hide();
|
||||
|
||||
$dd = $('#dropdown-' + id);
|
||||
if (typeof options.above == 'boolean' && options.above) {
|
||||
$dd.addClass('dropdown-context-up').css({
|
||||
top: e.pageY - 20 - $('#dropdown-' + id).height(),
|
||||
left: e.pageX - 13
|
||||
}).fadeIn(options.fadeSpeed);
|
||||
} else if (typeof options.above == 'string' && options.above == 'auto') {
|
||||
$dd.removeClass('dropdown-context-up');
|
||||
var autoH = $dd.height() + 12;
|
||||
if ((e.pageY + autoH) > $('html').height()) {
|
||||
$dd.addClass('dropdown-context-up').css({
|
||||
top: e.pageY - 20 - autoH,
|
||||
left: e.pageX - 13
|
||||
}).fadeIn(options.fadeSpeed);
|
||||
} else {
|
||||
$dd.css({
|
||||
top: e.pageY + 10,
|
||||
left: e.pageX - 13
|
||||
}).fadeIn(options.fadeSpeed);
|
||||
}
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
function destroyContext(selector) {
|
||||
$(document).off('contextmenu', selector).off('click', '.context-event');
|
||||
}
|
||||
|
||||
return {
|
||||
init: initialize,
|
||||
settings: updateOptions,
|
||||
attach: addContext,
|
||||
destroy: destroyContext
|
||||
};
|
||||
})();
|
455
public/static/jquery-viewer/1.2.0/css/viewer.css
Normal file
@ -0,0 +1,455 @@
|
||||
/*!
|
||||
* Viewer.js v1.2.0
|
||||
* https://fengyuanchen.github.io/viewerjs
|
||||
*
|
||||
* Copyright 2015-present Chen Fengyuan
|
||||
* Released under the MIT license
|
||||
*
|
||||
* Date: 2018-07-15T10:09:17.532Z
|
||||
*/
|
||||
|
||||
.viewer-zoom-in::before,
|
||||
.viewer-zoom-out::before,
|
||||
.viewer-one-to-one::before,
|
||||
.viewer-reset::before,
|
||||
.viewer-prev::before,
|
||||
.viewer-play::before,
|
||||
.viewer-next::before,
|
||||
.viewer-rotate-left::before,
|
||||
.viewer-rotate-right::before,
|
||||
.viewer-flip-horizontal::before,
|
||||
.viewer-flip-vertical::before,
|
||||
.viewer-fullscreen::before,
|
||||
.viewer-fullscreen-exit::before,
|
||||
.viewer-close::before {
|
||||
background-image: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAARgAAAAUCAYAAABWOyJDAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAABx0RVh0U29mdHdhcmUAQWRvYmUgRmlyZXdvcmtzIENTNui8sowAAAQPSURBVHic7Zs/iFxVFMa/0U2UaJGksUgnIVhYxVhpjDbZCBmLdAYECxsRFBTUamcXUiSNncgKQbSxsxH8gzAP3FU2jY0kKKJNiiiIghFlccnP4p3nPCdv3p9778vsLOcHB2bfveeb7955c3jvvNkBIMdxnD64a94GHMfZu3iBcRynN7zAOI7TG15gHCeeNUkr8zaxG2lbYDYsdgMbktBsP03jdQwljSXdtBhLOmtjowC9Mg9L+knSlcD8TNKpSA9lBpK2JF2VdDSR5n5J64m0qli399hNFMUlpshQii5jbXTbHGviB0nLNeNDSd9VO4A2UdB2fp+x0eCnaXxWXGA2X0au/3HgN9P4LFCjIANOJdrLr0zzZ+BEpNYDwKbpnQMeAw4m8HjQtM6Z9qa917zPQwFr3M5KgA6J5rTJCdFZJj9/lyvGhsDvwFNVuV2MhhjrK6b9bFiE+j1r87eBl4HDwCF7/U/k+ofAX5b/EXBv5JoLMuILzf3Ap6Z3EzgdqHMCuF7hcQf4HDgeoHnccncqdK/TvSDWffFXI/exICY/xZyqc6XLWF1UFZna4gJ7q8BsRvgd2/xXpo6P+D9dfT7PpECtA3cnWPM0GXGFZh/wgWltA+cDNC7X+AP4GzjZQe+k5dRxuYPeiuXU7e1qwLpDz7dFjXKRaSwuMLvAlG8zZlG+YmiK1HoFqT7wP2z+4Q45TfEGcMt01xLoNZEBTwRqD4BLpnMLeC1A41UmVxsXgXeBayV/Wx20rpTyrpnWRft7p6O/FdqzGrDukPNtkaMoMo3FBdBSQMOnYBCReyf05s126fU9ytfX98+mY54Kxnp7S9K3kj6U9KYdG0h6UdLbkh7poFXMfUnSOyVvL0h6VtIXHbS6nOP+s/Zm9mvyXW1uuC9ohZ72E9uDmXWLJOB1GxsH+DxPftsB8B6wlGDN02TAkxG6+4D3TWsbeC5CS8CDFce+AW500LhhOW2020TRjK3b21HEmgti9m0RonxbdMZeVzV+/4tF3cBpP7E9mKHNL5q8h5g0eYsCMQz0epq8gQrwMXAgcs0FGXGFRcB9wCemF9PkbYqM/Bas7fxLwNeJPdTdpo4itQti8lPMqTpXuozVRVXPpbHI3KkNTB1NfkL81j2mvhDp91HgV9MKuRIqrykj3WPq4rHyL+axj8/qGPmTqi6F9YDlHOvJU6oYcTsh/TYSzWmTE6JT19CtLTJt32D6CmHe0eQn1O8z5AXgT4sx4Vcu0/EQecMydB8z0hUWkTd2t4CrwNEePqMBcAR4mrBbwyXLPWJa8zrXmmLEhNBmfpkuY2102xxrih+pb+ieAb6vGhuA97UcJ5KR8gZ77K+99xxeYBzH6Q3/Z0fHcXrDC4zjOL3hBcZxnN74F+zlvXFWXF9PAAAAAElFTkSuQmCC');
|
||||
background-repeat: no-repeat;
|
||||
color: transparent;
|
||||
display: block;
|
||||
font-size: 0;
|
||||
height: 20px;
|
||||
line-height: 0;
|
||||
width: 20px;
|
||||
}
|
||||
|
||||
.viewer-zoom-in::before {
|
||||
background-position: 0 0;
|
||||
content: 'Zoom In';
|
||||
}
|
||||
|
||||
.viewer-zoom-out::before {
|
||||
background-position: -20px 0;
|
||||
content: 'Zoom Out';
|
||||
}
|
||||
|
||||
.viewer-one-to-one::before {
|
||||
background-position: -40px 0;
|
||||
content: 'One to One';
|
||||
}
|
||||
|
||||
.viewer-reset::before {
|
||||
background-position: -60px 0;
|
||||
content: 'Reset';
|
||||
}
|
||||
|
||||
.viewer-prev::before {
|
||||
background-position: -80px 0;
|
||||
content: 'Previous';
|
||||
}
|
||||
|
||||
.viewer-play::before {
|
||||
background-position: -100px 0;
|
||||
content: 'Play';
|
||||
}
|
||||
|
||||
.viewer-next::before {
|
||||
background-position: -120px 0;
|
||||
content: 'Next';
|
||||
}
|
||||
|
||||
.viewer-rotate-left::before {
|
||||
background-position: -140px 0;
|
||||
content: 'Rotate Left';
|
||||
}
|
||||
|
||||
.viewer-rotate-right::before {
|
||||
background-position: -160px 0;
|
||||
content: 'Rotate Right';
|
||||
}
|
||||
|
||||
.viewer-flip-horizontal::before {
|
||||
background-position: -180px 0;
|
||||
content: 'Flip Horizontal';
|
||||
}
|
||||
|
||||
.viewer-flip-vertical::before {
|
||||
background-position: -200px 0;
|
||||
content: 'Flip Vertical';
|
||||
}
|
||||
|
||||
.viewer-fullscreen::before {
|
||||
background-position: -220px 0;
|
||||
content: 'Enter Full Screen';
|
||||
}
|
||||
|
||||
.viewer-fullscreen-exit::before {
|
||||
background-position: -240px 0;
|
||||
content: 'Exit Full Screen';
|
||||
}
|
||||
|
||||
.viewer-close::before {
|
||||
background-position: -260px 0;
|
||||
content: 'Close';
|
||||
}
|
||||
|
||||
.viewer-container {
|
||||
bottom: 0;
|
||||
direction: ltr;
|
||||
font-size: 0;
|
||||
left: 0;
|
||||
line-height: 0;
|
||||
overflow: hidden;
|
||||
position: absolute;
|
||||
right: 0;
|
||||
-webkit-tap-highlight-color: transparent;
|
||||
top: 0;
|
||||
-webkit-touch-callout: none;
|
||||
-ms-touch-action: none;
|
||||
touch-action: none;
|
||||
-webkit-user-select: none;
|
||||
-moz-user-select: none;
|
||||
-ms-user-select: none;
|
||||
user-select: none;
|
||||
}
|
||||
|
||||
.viewer-container::-moz-selection,
|
||||
.viewer-container *::-moz-selection {
|
||||
background-color: transparent;
|
||||
}
|
||||
|
||||
.viewer-container::selection,
|
||||
.viewer-container *::selection {
|
||||
background-color: transparent;
|
||||
}
|
||||
|
||||
.viewer-container img {
|
||||
display: block;
|
||||
height: auto;
|
||||
max-height: none !important;
|
||||
max-width: none !important;
|
||||
min-height: 0 !important;
|
||||
min-width: 0 !important;
|
||||
width: 100%;
|
||||
}
|
||||
|
||||
.viewer-canvas {
|
||||
bottom: 0;
|
||||
left: 0;
|
||||
overflow: hidden;
|
||||
position: absolute;
|
||||
right: 0;
|
||||
top: 0;
|
||||
}
|
||||
|
||||
.viewer-canvas > img {
|
||||
height: auto;
|
||||
margin: 15px auto;
|
||||
max-width: 90% !important;
|
||||
width: auto;
|
||||
}
|
||||
|
||||
.viewer-footer {
|
||||
bottom: 0;
|
||||
left: 0;
|
||||
overflow: hidden;
|
||||
position: absolute;
|
||||
right: 0;
|
||||
text-align: center;
|
||||
}
|
||||
|
||||
.viewer-navbar {
|
||||
background-color: rgba(0, 0, 0, .5);
|
||||
overflow: hidden;
|
||||
}
|
||||
|
||||
.viewer-list {
|
||||
-webkit-box-sizing: content-box;
|
||||
box-sizing: content-box;
|
||||
height: 50px;
|
||||
margin: 0;
|
||||
overflow: hidden;
|
||||
padding: 1px 0;
|
||||
}
|
||||
|
||||
.viewer-list > li {
|
||||
color: transparent;
|
||||
cursor: pointer;
|
||||
float: left;
|
||||
font-size: 0;
|
||||
height: 50px;
|
||||
line-height: 0;
|
||||
opacity: .5;
|
||||
overflow: hidden;
|
||||
-webkit-transition: opacity .15s;
|
||||
transition: opacity .15s;
|
||||
width: 30px;
|
||||
}
|
||||
|
||||
.viewer-list > li:hover {
|
||||
opacity: .75;
|
||||
}
|
||||
|
||||
.viewer-list > li + li {
|
||||
margin-left: 1px;
|
||||
}
|
||||
|
||||
.viewer-list > .viewer-loading {
|
||||
position: relative;
|
||||
}
|
||||
|
||||
.viewer-list > .viewer-loading::after {
|
||||
border-width: 2px;
|
||||
height: 20px;
|
||||
margin-left: -10px;
|
||||
margin-top: -10px;
|
||||
width: 20px;
|
||||
}
|
||||
|
||||
.viewer-list > .viewer-active,
|
||||
.viewer-list > .viewer-active:hover {
|
||||
opacity: 1;
|
||||
}
|
||||
|
||||
.viewer-player {
|
||||
background-color: #000;
|
||||
bottom: 0;
|
||||
cursor: none;
|
||||
display: none;
|
||||
left: 0;
|
||||
position: absolute;
|
||||
right: 0;
|
||||
top: 0;
|
||||
}
|
||||
|
||||
.viewer-player > img {
|
||||
left: 0;
|
||||
position: absolute;
|
||||
top: 0;
|
||||
}
|
||||
|
||||
.viewer-toolbar > ul {
|
||||
display: inline-block;
|
||||
margin: 0 auto 5px;
|
||||
overflow: hidden;
|
||||
padding: 3px 0;
|
||||
}
|
||||
|
||||
.viewer-toolbar > ul > li {
|
||||
background-color: rgba(0, 0, 0, .5);
|
||||
border-radius: 50%;
|
||||
cursor: pointer;
|
||||
float: left;
|
||||
height: 24px;
|
||||
overflow: hidden;
|
||||
-webkit-transition: background-color .15s;
|
||||
transition: background-color .15s;
|
||||
width: 24px;
|
||||
}
|
||||
|
||||
.viewer-toolbar > ul > li:hover {
|
||||
background-color: rgba(0, 0, 0, .8);
|
||||
}
|
||||
|
||||
.viewer-toolbar > ul > li::before {
|
||||
margin: 2px;
|
||||
}
|
||||
|
||||
.viewer-toolbar > ul > li + li {
|
||||
margin-left: 1px;
|
||||
}
|
||||
|
||||
.viewer-toolbar > ul > .viewer-small {
|
||||
height: 18px;
|
||||
margin-bottom: 3px;
|
||||
margin-top: 3px;
|
||||
width: 18px;
|
||||
}
|
||||
|
||||
.viewer-toolbar > ul > .viewer-small::before {
|
||||
margin: -1px;
|
||||
}
|
||||
|
||||
.viewer-toolbar > ul > .viewer-large {
|
||||
height: 30px;
|
||||
margin-bottom: -3px;
|
||||
margin-top: -3px;
|
||||
width: 30px;
|
||||
}
|
||||
|
||||
.viewer-toolbar > ul > .viewer-large::before {
|
||||
margin: 5px;
|
||||
}
|
||||
|
||||
.viewer-tooltip {
|
||||
background-color: rgba(0, 0, 0, 0.8);
|
||||
border-radius: 10px;
|
||||
color: #fff;
|
||||
display: none;
|
||||
font-size: 12px;
|
||||
height: 20px;
|
||||
left: 50%;
|
||||
line-height: 20px;
|
||||
margin-left: -25px;
|
||||
margin-top: -10px;
|
||||
position: absolute;
|
||||
text-align: center;
|
||||
top: 50%;
|
||||
width: 50px;
|
||||
}
|
||||
|
||||
.viewer-title {
|
||||
color: #ccc;
|
||||
display: inline-block;
|
||||
font-size: 12px;
|
||||
line-height: 1;
|
||||
margin: 0 5% 5px;
|
||||
max-width: 90%;
|
||||
opacity: .8;
|
||||
overflow: hidden;
|
||||
text-overflow: ellipsis;
|
||||
-webkit-transition: opacity .15s;
|
||||
transition: opacity .15s;
|
||||
white-space: nowrap;
|
||||
}
|
||||
|
||||
.viewer-title:hover {
|
||||
opacity: 1;
|
||||
}
|
||||
|
||||
.viewer-button {
|
||||
background-color: rgba(0, 0, 0, .5);
|
||||
border-radius: 50%;
|
||||
cursor: pointer;
|
||||
height: 80px;
|
||||
overflow: hidden;
|
||||
position: absolute;
|
||||
right: -40px;
|
||||
top: -40px;
|
||||
-webkit-transition: background-color .15s;
|
||||
transition: background-color .15s;
|
||||
width: 80px;
|
||||
}
|
||||
|
||||
.viewer-button:focus,
|
||||
.viewer-button:hover {
|
||||
background-color: rgba(0, 0, 0, .8);
|
||||
}
|
||||
|
||||
.viewer-button::before {
|
||||
bottom: 15px;
|
||||
left: 15px;
|
||||
position: absolute;
|
||||
}
|
||||
|
||||
.viewer-fixed {
|
||||
position: fixed;
|
||||
}
|
||||
|
||||
.viewer-open {
|
||||
overflow: hidden;
|
||||
}
|
||||
|
||||
.viewer-show {
|
||||
display: block;
|
||||
}
|
||||
|
||||
.viewer-hide {
|
||||
display: none;
|
||||
}
|
||||
|
||||
.viewer-backdrop {
|
||||
background-color: rgba(0, 0, 0, .5);
|
||||
}
|
||||
|
||||
.viewer-invisible {
|
||||
visibility: hidden;
|
||||
}
|
||||
|
||||
.viewer-move {
|
||||
cursor: move;
|
||||
cursor: -webkit-grab;
|
||||
cursor: grab;
|
||||
}
|
||||
|
||||
.viewer-fade {
|
||||
opacity: 0;
|
||||
}
|
||||
|
||||
.viewer-in {
|
||||
opacity: 1;
|
||||
}
|
||||
|
||||
.viewer-transition {
|
||||
-webkit-transition: all .3s;
|
||||
transition: all .3s;
|
||||
}
|
||||
|
||||
@-webkit-keyframes viewer-spinner {
|
||||
0% {
|
||||
-webkit-transform: rotate(0deg);
|
||||
transform: rotate(0deg);
|
||||
}
|
||||
|
||||
100% {
|
||||
-webkit-transform: rotate(360deg);
|
||||
transform: rotate(360deg);
|
||||
}
|
||||
}
|
||||
|
||||
@keyframes viewer-spinner {
|
||||
0% {
|
||||
-webkit-transform: rotate(0deg);
|
||||
transform: rotate(0deg);
|
||||
}
|
||||
|
||||
100% {
|
||||
-webkit-transform: rotate(360deg);
|
||||
transform: rotate(360deg);
|
||||
}
|
||||
}
|
||||
|
||||
.viewer-loading::after {
|
||||
-webkit-animation: viewer-spinner 1s linear infinite;
|
||||
animation: viewer-spinner 1s linear infinite;
|
||||
border: 4px solid rgba(255, 255, 255, .1);
|
||||
border-left-color: rgba(255, 255, 255, .5);
|
||||
border-radius: 50%;
|
||||
content: '';
|
||||
display: inline-block;
|
||||
height: 40px;
|
||||
left: 50%;
|
||||
margin-left: -20px;
|
||||
margin-top: -20px;
|
||||
position: absolute;
|
||||
top: 50%;
|
||||
width: 40px;
|
||||
z-index: 1;
|
||||
}
|
||||
|
||||
@media (max-width: 767px) {
|
||||
.viewer-hide-xs-down {
|
||||
display: none;
|
||||
}
|
||||
}
|
||||
|
||||
@media (max-width: 991px) {
|
||||
.viewer-hide-sm-down {
|
||||
display: none;
|
||||
}
|
||||
}
|
||||
|
||||
@media (max-width: 1199px) {
|
||||
.viewer-hide-md-down {
|
||||
display: none;
|
||||
}
|
||||
}
|
75
public/static/jquery-viewer/1.2.0/js/jquery-viewer.js
vendored
Normal file
@ -0,0 +1,75 @@
|
||||
/*!
|
||||
* jQuery Viewer v1.0.0
|
||||
* https://github.com/fengyuanchen/jquery-viewer
|
||||
*
|
||||
* Copyright (c) 2018 Chen Fengyuan
|
||||
* Released under the MIT license
|
||||
*
|
||||
* Date: 2018-04-01T05:58:29.617Z
|
||||
*/
|
||||
|
||||
(function (global, factory) {
|
||||
typeof exports === 'object' && typeof module !== 'undefined' ? factory(require('jquery'), require('viewerjs')) :
|
||||
typeof define === 'function' && define.amd ? define(['jquery', 'viewerjs'], factory) :
|
||||
(factory(global.jQuery,global.Viewer));
|
||||
}(this, (function ($,Viewer) { 'use strict';
|
||||
|
||||
$ = $ && $.hasOwnProperty('default') ? $['default'] : $;
|
||||
Viewer = Viewer && Viewer.hasOwnProperty('default') ? Viewer['default'] : Viewer;
|
||||
|
||||
if ($.fn) {
|
||||
var AnotherViewer = $.fn.viewer;
|
||||
var NAMESPACE = 'viewer';
|
||||
|
||||
$.fn.viewer = function jQueryViewer(option) {
|
||||
for (var _len = arguments.length, args = Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) {
|
||||
args[_key - 1] = arguments[_key];
|
||||
}
|
||||
|
||||
var result = void 0;
|
||||
|
||||
this.each(function (i, element) {
|
||||
var $element = $(element);
|
||||
var isDestroy = option === 'destroy';
|
||||
var viewer = $element.data(NAMESPACE);
|
||||
|
||||
if (!viewer) {
|
||||
if (isDestroy) {
|
||||
return;
|
||||
}
|
||||
|
||||
var options = $.extend({}, $element.data(), $.isPlainObject(option) && option);
|
||||
|
||||
viewer = new Viewer(element, options);
|
||||
$element.data(NAMESPACE, viewer);
|
||||
}
|
||||
|
||||
if (typeof option === 'string') {
|
||||
var fn = viewer[option];
|
||||
|
||||
if ($.isFunction(fn)) {
|
||||
result = fn.apply(viewer, args);
|
||||
|
||||
if (result === viewer) {
|
||||
result = undefined;
|
||||
}
|
||||
|
||||
if (isDestroy) {
|
||||
$element.removeData(NAMESPACE);
|
||||
}
|
||||
}
|
||||
}
|
||||
});
|
||||
|
||||
return result !== undefined ? result : this;
|
||||
};
|
||||
|
||||
$.fn.viewer.Constructor = Viewer;
|
||||
$.fn.viewer.setDefaults = Viewer.setDefaults;
|
||||
$.fn.viewer.noConflict = function noConflict() {
|
||||
$.fn.viewer = AnotherViewer;
|
||||
return this;
|
||||
};
|
||||
}
|
||||
|
||||
})));
|
3142
public/static/jquery-viewer/1.2.0/js/viewer.js
Normal file
2
public/static/jquery/3.3.1/jquery.min.js
vendored
Normal file
6
public/static/mdui/0.4.1/css/mdui.min.css
vendored
Normal file
201
public/static/mdui/0.4.1/fonts/roboto/LICENSE.txt
Normal file
@ -0,0 +1,201 @@
|
||||
Apache License
|
||||
Version 2.0, January 2004
|
||||
http://www.apache.org/licenses/
|
||||
|
||||
TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
|
||||
|
||||
1. Definitions.
|
||||
|
||||
"License" shall mean the terms and conditions for use, reproduction,
|
||||
and distribution as defined by Sections 1 through 9 of this document.
|
||||
|
||||
"Licensor" shall mean the copyright owner or entity authorized by
|
||||
the copyright owner that is granting the License.
|
||||
|
||||
"Legal Entity" shall mean the union of the acting entity and all
|
||||
other entities that control, are controlled by, or are under common
|
||||
control with that entity. For the purposes of this definition,
|
||||
"control" means (i) the power, direct or indirect, to cause the
|
||||
direction or management of such entity, whether by contract or
|
||||
otherwise, or (ii) ownership of fifty percent (50%) or more of the
|
||||
outstanding shares, or (iii) beneficial ownership of such entity.
|
||||
|
||||
"You" (or "Your") shall mean an individual or Legal Entity
|
||||
exercising permissions granted by this License.
|
||||
|
||||
"Source" form shall mean the preferred form for making modifications,
|
||||
including but not limited to software source code, documentation
|
||||
source, and configuration files.
|
||||
|
||||
"Object" form shall mean any form resulting from mechanical
|
||||
transformation or translation of a Source form, including but
|
||||
not limited to compiled object code, generated documentation,
|
||||
and conversions to other media types.
|
||||
|
||||
"Work" shall mean the work of authorship, whether in Source or
|
||||
Object form, made available under the License, as indicated by a
|
||||
copyright notice that is included in or attached to the work
|
||||
(an example is provided in the Appendix below).
|
||||
|
||||
"Derivative Works" shall mean any work, whether in Source or Object
|
||||
form, that is based on (or derived from) the Work and for which the
|
||||
editorial revisions, annotations, elaborations, or other modifications
|
||||
represent, as a whole, an original work of authorship. For the purposes
|
||||
of this License, Derivative Works shall not include works that remain
|
||||
separable from, or merely link (or bind by name) to the interfaces of,
|
||||
the Work and Derivative Works thereof.
|
||||
|
||||
"Contribution" shall mean any work of authorship, including
|
||||
the original version of the Work and any modifications or additions
|
||||
to that Work or Derivative Works thereof, that is intentionally
|
||||
submitted to Licensor for inclusion in the Work by the copyright owner
|
||||
or by an individual or Legal Entity authorized to submit on behalf of
|
||||
the copyright owner. For the purposes of this definition, "submitted"
|
||||
means any form of electronic, verbal, or written communication sent
|
||||
to the Licensor or its representatives, including but not limited to
|
||||
communication on electronic mailing lists, source code control systems,
|
||||
and issue tracking systems that are managed by, or on behalf of, the
|
||||
Licensor for the purpose of discussing and improving the Work, but
|
||||
excluding communication that is conspicuously marked or otherwise
|
||||
designated in writing by the copyright owner as "Not a Contribution."
|
||||
|
||||
"Contributor" shall mean Licensor and any individual or Legal Entity
|
||||
on behalf of whom a Contribution has been received by Licensor and
|
||||
subsequently incorporated within the Work.
|
||||
|
||||
2. Grant of Copyright License. Subject to the terms and conditions of
|
||||
this License, each Contributor hereby grants to You a perpetual,
|
||||
worldwide, non-exclusive, no-charge, royalty-free, irrevocable
|
||||
copyright license to reproduce, prepare Derivative Works of,
|
||||
publicly display, publicly perform, sublicense, and distribute the
|
||||
Work and such Derivative Works in Source or Object form.
|
||||
|
||||
3. Grant of Patent License. Subject to the terms and conditions of
|
||||
this License, each Contributor hereby grants to You a perpetual,
|
||||
worldwide, non-exclusive, no-charge, royalty-free, irrevocable
|
||||
(except as stated in this section) patent license to make, have made,
|
||||
use, offer to sell, sell, import, and otherwise transfer the Work,
|
||||
where such license applies only to those patent claims licensable
|
||||
by such Contributor that are necessarily infringed by their
|
||||
Contribution(s) alone or by combination of their Contribution(s)
|
||||
with the Work to which such Contribution(s) was submitted. If You
|
||||
institute patent litigation against any entity (including a
|
||||
cross-claim or counterclaim in a lawsuit) alleging that the Work
|
||||
or a Contribution incorporated within the Work constitutes direct
|
||||
or contributory patent infringement, then any patent licenses
|
||||
granted to You under this License for that Work shall terminate
|
||||
as of the date such litigation is filed.
|
||||
|
||||
4. Redistribution. You may reproduce and distribute copies of the
|
||||
Work or Derivative Works thereof in any medium, with or without
|
||||
modifications, and in Source or Object form, provided that You
|
||||
meet the following conditions:
|
||||
|
||||
(a) You must give any other recipients of the Work or
|
||||
Derivative Works a copy of this License; and
|
||||
|
||||
(b) You must cause any modified files to carry prominent notices
|
||||
stating that You changed the files; and
|
||||
|
||||
(c) You must retain, in the Source form of any Derivative Works
|
||||
that You distribute, all copyright, patent, trademark, and
|
||||
attribution notices from the Source form of the Work,
|
||||
excluding those notices that do not pertain to any part of
|
||||
the Derivative Works; and
|
||||
|
||||
(d) If the Work includes a "NOTICE" text file as part of its
|
||||
distribution, then any Derivative Works that You distribute must
|
||||
include a readable copy of the attribution notices contained
|
||||
within such NOTICE file, excluding those notices that do not
|
||||
pertain to any part of the Derivative Works, in at least one
|
||||
of the following places: within a NOTICE text file distributed
|
||||
as part of the Derivative Works; within the Source form or
|
||||
documentation, if provided along with the Derivative Works; or,
|
||||
within a display generated by the Derivative Works, if and
|
||||
wherever such third-party notices normally appear. The contents
|
||||
of the NOTICE file are for informational purposes only and
|
||||
do not modify the License. You may add Your own attribution
|
||||
notices within Derivative Works that You distribute, alongside
|
||||
or as an addendum to the NOTICE text from the Work, provided
|
||||
that such additional attribution notices cannot be construed
|
||||
as modifying the License.
|
||||
|
||||
You may add Your own copyright statement to Your modifications and
|
||||
may provide additional or different license terms and conditions
|
||||
for use, reproduction, or distribution of Your modifications, or
|
||||
for any such Derivative Works as a whole, provided Your use,
|
||||
reproduction, and distribution of the Work otherwise complies with
|
||||
the conditions stated in this License.
|
||||
|
||||
5. Submission of Contributions. Unless You explicitly state otherwise,
|
||||
any Contribution intentionally submitted for inclusion in the Work
|
||||
by You to the Licensor shall be under the terms and conditions of
|
||||
this License, without any additional terms or conditions.
|
||||
Notwithstanding the above, nothing herein shall supersede or modify
|
||||
the terms of any separate license agreement you may have executed
|
||||
with Licensor regarding such Contributions.
|
||||
|
||||
6. Trademarks. This License does not grant permission to use the trade
|
||||
names, trademarks, service marks, or product names of the Licensor,
|
||||
except as required for reasonable and customary use in describing the
|
||||
origin of the Work and reproducing the content of the NOTICE file.
|
||||
|
||||
7. Disclaimer of Warranty. Unless required by applicable law or
|
||||
agreed to in writing, Licensor provides the Work (and each
|
||||
Contributor provides its Contributions) on an "AS IS" BASIS,
|
||||
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
|
||||
implied, including, without limitation, any warranties or conditions
|
||||
of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
|
||||
PARTICULAR PURPOSE. You are solely responsible for determining the
|
||||
appropriateness of using or redistributing the Work and assume any
|
||||
risks associated with Your exercise of permissions under this License.
|
||||
|
||||
8. Limitation of Liability. In no event and under no legal theory,
|
||||
whether in tort (including negligence), contract, or otherwise,
|
||||
unless required by applicable law (such as deliberate and grossly
|
||||
negligent acts) or agreed to in writing, shall any Contributor be
|
||||
liable to You for damages, including any direct, indirect, special,
|
||||
incidental, or consequential damages of any character arising as a
|
||||
result of this License or out of the use or inability to use the
|
||||
Work (including but not limited to damages for loss of goodwill,
|
||||
work stoppage, computer failure or malfunction, or any and all
|
||||
other commercial damages or losses), even if such Contributor
|
||||
has been advised of the possibility of such damages.
|
||||
|
||||
9. Accepting Warranty or Additional Liability. While redistributing
|
||||
the Work or Derivative Works thereof, You may choose to offer,
|
||||
and charge a fee for, acceptance of support, warranty, indemnity,
|
||||
or other liability obligations and/or rights consistent with this
|
||||
License. However, in accepting such obligations, You may act only
|
||||
on Your own behalf and on Your sole responsibility, not on behalf
|
||||
of any other Contributor, and only if You agree to indemnify,
|
||||
defend, and hold each Contributor harmless for any liability
|
||||
incurred by, or claims asserted against, such Contributor by reason
|
||||
of your accepting any such warranty or additional liability.
|
||||
|
||||
END OF TERMS AND CONDITIONS
|
||||
|
||||
APPENDIX: How to apply the Apache License to your work.
|
||||
|
||||
To apply the Apache License to your work, attach the following
|
||||
boilerplate notice, with the fields enclosed by brackets "[]"
|
||||
replaced with your own identifying information. (Don't include
|
||||
the brackets!) The text should be enclosed in the appropriate
|
||||
comment syntax for the file format. We also recommend that a
|
||||
file or class name and description of purpose be included on the
|
||||
same "printed page" as the copyright notice for easier
|
||||
identification within third-party archives.
|
||||
|
||||
Copyright [yyyy] [name of copyright owner]
|
||||
|
||||
Licensed under the Apache License, Version 2.0 (the "License");
|
||||
you may not use this file except in compliance with the License.
|
||||
You may obtain a copy of the License at
|
||||
|
||||
http://www.apache.org/licenses/LICENSE-2.0
|
||||
|
||||
Unless required by applicable law or agreed to in writing, software
|
||||
distributed under the License is distributed on an "AS IS" BASIS,
|
||||
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
See the License for the specific language governing permissions and
|
||||
limitations under the License.
|