This commit is contained in:
leonZ 2024-08-03 19:59:21 +08:00
commit cb40797154
599 changed files with 75630 additions and 0 deletions

12
.gitignore vendored Normal file
View File

@ -0,0 +1,12 @@
.buildpath
.project
.settings
.idea/
.mvn/
wsdl/
caches/
target/
src/main/resources/static/
.DS_Store
*.iml
dump.rdb

661
LICENSE Normal file
View File

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

123
README.md Normal file
View File

@ -0,0 +1,123 @@
# fuint会员营销系统介绍
#### 介绍
fuint会员营销系统是一套开源的实体店铺会员管理和营销系统。系统基于前后端分离的架构后端采用<b>Java SpringBoot</b> + <b>Mysql</b>,前端基于当前流行的<b>Uniapp</b><b>Element UI</b>支持小程序、h5。主要功能包含电子优惠券、储值卡、实体卡、集次卡计次卡、短信发送、储值卡、会员积分、会员等级权益体系支付收款等会员日常营销工具。本系统适用于各类实体店铺如零售超市、酒吧、酒店、汽车4S店、鲜花店、奶茶店、甜品店、餐饮店、农家乐等是实体店铺会员营销必备的一款利器。
以下是前台的页面展示:
<p><img src="https://fuint-cn.oss-cn-shenzhen.aliyuncs.com/screenshots/g1.png?v=1" alt="前台页面1"></p>
<p><img src="https://fuint-cn.oss-cn-shenzhen.aliyuncs.com/screenshots/g2.png?v=2" alt="前台页面2"></p>
<p><img src="https://fuint-cn.oss-cn-shenzhen.aliyuncs.com/screenshots/g3.png?v=2" alt="前台页面3"></p>
<p><img src="https://fuint-cn.oss-cn-shenzhen.aliyuncs.com/screenshots/g4.png?v=1" alt="前台页面4"></p>
<p><img src="https://fuint-cn.oss-cn-shenzhen.aliyuncs.com/screenshots/g5.png?v=1" alt="前台页面4"></p>
fuint侧重于线下实体店的私域流量的运营同时提供会员端小程序和收银系统的线上线下统一渠道帮助商户降低获客成本。顾客通过扫码支付成为私域流量支付即可成为会员。积分和卡券功能建立起会员等级体系通过消息推送和短信营销方便触达用户。
<p>1、会员运营自动化商家通过日常活动设置如开卡礼设置沉睡唤醒等成为会员后自动给顾客送优惠券让顾客更有黏性提升会员运营效率。</p>
<p>2、打通收银系统和会员营销的壁垒代客下单收银支付即成为会员。</p>
<p>3、会员体系完整化积分兑换、积分转赠、会员等级权益、积分加速、买单折扣。</p>
<p>4、会员卡券齐全储值卡、电子券、优惠券、集次卡、计次卡、实体卡购买并兑换、会员充值、余额支付。</p>
<p>5、线上代客下单收银系统后台管理员可帮助临柜的会员下单、扫码支付。</p>
<p>6、支持手机短信、站内弹框消息、微信订阅消息支持包括发货消息、卡券到期提醒、活动提醒、会员到期提醒、积分余额变动提醒等消息。</p>
<p>小程序前端仓库https://gitee.com/fuint/fuint-uniapp</p>
<b>扫码小程序演示:</b><br>
<p><img src="https://fuint-cn.oss-cn-shenzhen.aliyuncs.com/screenshots/miniapp.png" alt="小程序演示"></p>
<br>
<b>官网演示地址:</b><br>
<p>
1、官网<a target="_blank" href="https://www.fuint.cn">https://www.fuint.cn</a> 点击 -> 系统演示演示账号fuint / 123456<br>
2、swagger接口文档<a target="_blank" href="https://www.fuint.cn/fuint-application/swagger-ui.html">https://www.fuint.cn/fuint-application/swagger-ui.html</a>
</p>
#### 软件架构
后端JAVA SpringBoot + MYSQL Mybatis Plus + Redis
前端采用基于Vue的Uniapp、Element UI前后端分离支持微信小程序、h5等
<p>后台截图:</p>
<p><img src="https://fuint-cn.oss-cn-shenzhen.aliyuncs.com/screenshots/login.png?v=fuint" alt="登录界面"></p>
<p><img src="https://fuint-cn.oss-cn-shenzhen.aliyuncs.com/screenshots/homeV2.png?v=fuint" alt="首页"></p>
前端使用技术<br>
2.1 Vue2<br>
2.2 Uniapp<br>
2.3 Element UI
2.4 Nodejs 14或16版本
后端使用技术<br>
1.1 SpringBoot 2.5<br>
1.2 Mybatis Plus<br>
1.3 Maven<br>
1.4 SpringSecurity<br>
1.5 Druid<br>
1.6 Slf4j<br>
1.7 Fastjson<br>
1.8 JWT<br>
1.9 Redis<br>
1.10 Quartz<br>
1.11 Mysql 5.7或8版<br>
1.12 Swagger UI<br>
#### 安装步骤
推荐软件环境版本jdk 1.8、mysql 5.8
1. 导入db目录下的数据库文件。
2. 修改config目录下的配置文件。
3. 将工程打包把jar包上传并执行。
<p>提示无后端和linux基础的朋友可以使用<b>宝塔</b>部署,非常方便简单。</p>
#### 前台使用说明
1. 会员登录,登录成功后可看到会员的卡券列表。
2. 卡券领取和购买,预存券的充值等。
3. 核销卡券,会员在前台出示二维码,管理员用微信扫一扫即可核销。
4. 卡券转赠,会员可将自己的卡券转赠给其他用户,输入对方的手机号即可完成转赠,获赠的好友会收到卡券赠送的短信。
<p><img src="https://fuint-cn.oss-cn-shenzhen.aliyuncs.com/screenshots/create.png?v=fuint" alt="卡券创建界面"></p>
<p><img src="https://fuint-cn.oss-cn-shenzhen.aliyuncs.com/screenshots/member.png?v=fuint" alt="卡券创建界面"></p>
#### 后台使用
1. 会员管理:会员新增、导入、禁用等。
2. 内容管理:焦点图管理、文章管理等。
3. 卡券管理电子券管理为2层结构即电子券组和电子券。
4. 会员积分:会员积分管理,会员积分的操作,会员积分明细查看。
5. 转赠管理:卡券转赠记录。
6. 短信管理:短信营销功能,已发送的短信列表。
7. 系统配置:配置系统管理员权限等。
8. 店铺管理:支持多店铺模式。
9. 核销管理员:核销人员管理主要包含3个功能核销人员列表、核销人员审核、核销人员信息编辑。
10. 短信模板管理:可配置不同场景和业务的短信内容。
11. 卡券发放:单独发放、批量发放,发放成功后给会员发送短信通知
12. 操作日志主要针对电子券系统后台的一些关键操作进行日志记录,方便排查相关操作人的行为等问题。
13. 发券记录主要根据发券的实际操作情况来记录,分为单用户发券和批量发券,同时可针对该次发券记录进行作废操作。
14. 代客下单、收银功能。
<p>卡券营销:</p>
<p><img src="https://fuint-cn.oss-cn-shenzhen.aliyuncs.com/screenshots/coupon-list.png?v=fuint" alt="卡券列表"></p>
<p>收银代客下单功能:店员角色登录后台,从首页的“下单首页”菜单可进入代客收银下单界面,完成代客下单收银的流程。</p>
<p><img src="https://fuint-cn.oss-cn-shenzhen.aliyuncs.com/screenshots/cashier.png?v=fuint3.0.8" alt="收银界面"></p>
<p>发起结算:</p>
<p><img src="https://fuint-cn.oss-cn-shenzhen.aliyuncs.com/screenshots/cashier-1.png?v=fuint3.0.8" alt="收银结算"></p>
#### 开发计划
1. 完善的报表统计;
2. 分享助力、分享领券、分享获得积分;
3. 员工提成、分销功能;
4. 店铺结算功能;
5. 更多营销工具,比如签到等。
#### 允许使用范围:
1. 允许个人学习使用
2. 允许用于毕业设计、论文参考代码
3. 推荐Watch、Star项目获取项目第一时间更新同时也是对项目最好的支持
4. 希望大家多多支持原创软件
5. 请勿去除版权标签,要商用请购买源码授权(非常便宜),感谢理解!
不足和待完善之处请谅解!源码仅供学习交流,更多功能欢迎进群咨询讨论,或需安装帮助请联系我们(<b>麻烦先点star</b>)。<br>
官方网站https://www.fuint.cn <br>
开源不易,感谢支持!<br>
<b>作者wxfsq_better</b><br>
<p><img src="https://fuint-cn.oss-cn-shenzhen.aliyuncs.com/screenshots/qr.png" alt="公众号二维码"></p>
特别鸣谢:<br>
Mybaits Plus: https://github.com/baomidou/mybatis-plus<br>
Vue: https://github.com/vuejs/vue<br>
Element UI: https://element.eleme.cn

View File

@ -0,0 +1,108 @@
# 数据库配置
spring.datasource.url=jdbc:mysql://127.0.0.1/:3306/member_card?useUnicode=true&characterEncoding=UTF8&useSSL=false
spring.datasource.username=root
spring.datasource.password=root
# Redis配置
spring.session.store-type=redis
spring.session.redis.namespace=member_card
# Redis数据库索引默认为0
spring.redis.database=0
# Redis服务器地址(生产)
spring.redis.host=127.0.0.1
# Redis服务器连接端口
spring.redis.port=6379
# Redis服务器连接密码默认为空
spring.redis.password=
# 连接池最大连接数(使用负值表示没有限制)
spring.redis.pool.max-active=-1
# 连接池最大阻塞等待时间(使用负值表示没有限制)
spring.redis.pool.max-wait=-1
# 连接池中的最大空闲连接
spring.redis.pool.max-idle=8
# 连接池中的最小空闲连接
spring.redis.pool.min-idle=0
# 连接超时时间(毫秒)
spring.redis.timeout=0
# 系统名称
system.name = fuint会员营销管理系统
# 前端h5地址
website.url=https://mc.keyelement.cn/h5/
# 上传图片本地地址
images.root=/target/classes
images.path=/static/uploadImages/
# 上传图片服务器域名
images.upload.url=http://localhost:8080
# 上传图片允许的大小单位MB
images.upload.maxSize=5
################## 定时脚本配置 #########################
# 定时发送消息
message.job.switch = 1
message.job.time = 0 0/1 * * * ?
# 卡券到期处理
couponExpire.job.switch = 1
couponExpire.job.time = 0 0/1 * * * ?
# 订单超时取消
orderCancel.job.switch = 1
orderCancel.job.time = 0 0/1 * * * ?
# 分佣提成计算
commission.job.switch = 1
commission.job.time = 0 0/1 * * * ?
################## 阿里云短信配置 #######################
# 短信接口模式[0-关闭 1-打开]
aliyun.sms.mode = 0
aliyun.sms.accessKeyId=LTAI4GJMjV123oXsrQJLnPZt
aliyun.sms.accessKeySecret=eGVBL30u5Ypj234d7XODlwYKWTaGT
# 阿里云短信签名
aliyun.sms.signName=延禾技术
################## 阿里云OSS存储配置######################
# 模式[0-关闭 1-打开]
aliyun.oss.mode = 0
aliyun.oss.accessKeyId = LTAI4GJMjVhBa212rQJLnPZtt
aliyun.oss.accessKeySecret = eGVBL30u53456gXd7XODlwYKWTaGT
aliyun.oss.endpoint = https://oss-cn-shenzhen.aliyuncs.com
aliyun.oss.bucketName = fuint-application
# 上传文件夹
aliyun.oss.folder = uploads
# 访问域名
aliyun.oss.domain = https://fuint-application.oss-cn-shenzhen.aliyuncs.com
################## 微信相关配置 ##########################
# 公众号配置
weixin.official.appId=wxf4327ef05c27a0
weixin.official.appSecret=1f55e8749332234d9a074873d8e6a3
# 小程序配置
wxpay.appId = wxb6af3741234162bc
wxpay.appSecret = 76a538bfa5b55a4564d5f2be5540
wxpay.mchId=1636980812
wxpay.apiV2=34354320201030y323e432342343
wxpay.certPath=/usr/local/fuint/cert/apiclient_cert.p12
wxpay.domain=https://www.fuint.cn/fuint-application
################## 支付宝支付相关配置 ######################
alipay.appId = 应用编号
alipay.privateKey = 应用私钥
alipay.publicKey = 支付宝公钥(通过应用公钥上传到支付宝开放平台换取支付宝公钥)
alipay.serverUrl=https://openapi.alipay.com/gateway.do
alipay.domain=https://www.fuint.cn/fuint-application/clientApi/pay/aliPayCallback
################ 微信订阅模板消息配置 ######################
weixin.subMessage.orderCreated=[{'key':'time', 'name':'订单时间'},{'key':'orderSn', 'name':'订单号'},{'key':'remark', 'name':'备注信息'}]
weixin.subMessage.deliverGoods=[{'key':'receiver', 'name':'收货人'}, {'key':'orderSn', 'name':'订单号'}, {'key':'expressCompany', 'name':'快递公司'}, {'key':'expressNo', 'name':'快递单号'}]
weixin.subMessage.couponExpire=[{'key':'name', 'name':'卡券名称'}, {'key':'expireTime', 'name':'到期时间'},{'key':'tips', 'name':'温馨提示'}]
weixin.subMessage.couponArrival=[{'key':'name', 'name':'卡券名称'},{'key':'amount', 'name':'金额'},{'key':'tips', 'name':'温馨提示'}]
weixin.subMessage.balanceChange=[{'key':'amount', 'name':'变动金额'},{'key':'time', 'name':'变动时间'},{'key':'tips', 'name':'温馨提示'}]
weixin.subMessage.couponConfirm=[{'key':'name', 'name':'卡券名称'},{'key':'time', 'name':'核销时间'}]
weixin.subMessage.pointChange=[{'key':'amount', 'name':'变动数量'},{'key':'time', 'name':'变动时间'},{'key':'remark', 'name':'备注信息'}]

View File

@ -0,0 +1,111 @@
# 数据库配置
spring.datasource.url=jdbc:mysql://121.37.2.239:8936/member_card?useUnicode=true&characterEncoding=UTF8&useSSL=false
#spring.datasource.url=jdbc:mysql://127.0.0.1:8936/member_card?useUnicode=true&characterEncoding=UTF8&useSSL=false
spring.datasource.username=member_card
spring.datasource.password=Pc4EM64yrGRBeCHz
# Redis配置
spring.session.store-type=redis
spring.session.redis.namespace=member_card
# Redis数据库索引默认为0
spring.redis.database=0
# Redis服务器地址(生产)
spring.redis.host=121.37.2.239
#spring.redis.host=127.0.0.1
# Redis服务器连接端口
spring.redis.port=2738
# Redis服务器连接密码默认为空
spring.redis.password=jfBgV5rKLw
# 连接池最大连接数(使用负值表示没有限制)
spring.redis.pool.max-active=-1
# 连接池最大阻塞等待时间(使用负值表示没有限制)
spring.redis.pool.max-wait=-1
# 连接池中的最大空闲连接
spring.redis.pool.max-idle=8
# 连接池中的最小空闲连接
spring.redis.pool.min-idle=0
# 连接超时时间(毫秒)
spring.redis.timeout=300
# 系统名称
system.name = 会员管理系统
# 前端h5地址
website.url=https://mc.keyelement.cn/h5/
# 上传图片本地地址
images.root=/Users/zhangcheng/Desktop/mc/server
#images.root=/www/wwwroot/MemberCard
images.path=/static/uploadImages/
# 上传图片服务器域名
images.upload.url=http://127.0.0.1:8080
# 上传图片允许的大小单位MB
images.upload.maxSize=5
################## 定时脚本配置 #########################
# 定时发送消息
message.job.switch = 1
message.job.time = 0 0/1 * * * ?
# 卡券到期处理
couponExpire.job.switch = 1
couponExpire.job.time = 0 0/1 * * * ?
# 订单超时取消
orderCancel.job.switch = 1
orderCancel.job.time = 0 0/1 * * * ?
# 分佣提成计算
commission.job.switch = 1
commission.job.time = 0 0/1 * * * ?
################## 阿里云短信配置 #######################
# 短信接口模式[0-关闭 1-打开]
aliyun.sms.mode = 1
aliyun.sms.accessKeyId=LTAI5tAuqN3Gd4D3F1yffMYF
aliyun.sms.accessKeySecret=j2VF2nAW2M1vhJwi3LSVYMNg1woE3i
# 阿里云短信签名
aliyun.sms.signName=关键元素科技
################## 阿里云OSS存储配置######################
# 模式[0-关闭 1-打开]
aliyun.oss.mode = 0
aliyun.oss.accessKeyId = LTAI4GJMjVhBa212rQJLnPZt
aliyun.oss.accessKeySecret = eGVBL30u53456gXd7XODlwYKWTaGT
aliyun.oss.endpoint = https://oss-cn-shenzhen.aliyuncs.com
aliyun.oss.bucketName = keyelement-application
# 上传文件夹
aliyun.oss.folder = uploads
# 访问域名
aliyun.oss.domain = https://keyelement-application.oss-cn-shenzhen.aliyuncs.com
################## 微信相关配置 ##########################
# 公众号配置
weixin.official.appId=wxf4327ef05c27a0
weixin.official.appSecret=1f55e8749332234d9a074873d8e6a3
# 小程序配置
wxpay.appId = wxb6af3741234162bc
wxpay.appSecret = 76a538bfa5b55a4564d5f2be5540
wxpay.mchId=1636980812
wxpay.apiV2=34354320201030y323e432342343
wxpay.certPath=/usr/local/keyelement/cert/apiclient_cert.p12
wxpay.domain=https://mc.keyelement.cn/fuint-application
################## 支付宝支付相关配置 ######################
alipay.appId = 应用编号
alipay.privateKey = 应用私钥
alipay.publicKey = 支付宝公钥(通过应用公钥上传到支付宝开放平台换取支付宝公钥)
alipay.serverUrl=https://openapi.alipay.com/gateway.do
alipay.domain=https://mc.keyelement.cn/application/clientApi/pay/aliPayCallback
################ 微信订阅模板消息配置 ######################
weixin.subMessage.orderCreated=[{'key':'time', 'name':'订单时间'},{'key':'orderSn', 'name':'订单号'},{'key':'remark', 'name':'备注信息'}]
weixin.subMessage.deliverGoods=[{'key':'receiver', 'name':'收货人'}, {'key':'orderSn', 'name':'订单号'}, {'key':'expressCompany', 'name':'快递公司'}, {'key':'expressNo', 'name':'快递单号'}]
weixin.subMessage.couponExpire=[{'key':'name', 'name':'卡券名称'}, {'key':'expireTime', 'name':'到期时间'},{'key':'tips', 'name':'温馨提示'}]
weixin.subMessage.couponArrival=[{'key':'name', 'name':'卡券名称'},{'key':'amount', 'name':'金额'},{'key':'tips', 'name':'温馨提示'}]
weixin.subMessage.balanceChange=[{'key':'amount', 'name':'变动金额'},{'key':'time', 'name':'变动时间'},{'key':'tips', 'name':'温馨提示'}]
weixin.subMessage.couponConfirm=[{'key':'name', 'name':'卡券名称'},{'key':'time', 'name':'核销时间'}]
weixin.subMessage.pointChange=[{'key':'amount', 'name':'变动数量'},{'key':'time', 'name':'变动时间'},{'key':'remark', 'name':'备注信息'}]

6404
db/member_card.sql Normal file

File diff suppressed because it is too large Load Diff

2
db/说明.txt Normal file
View File

@ -0,0 +1,2 @@
1、fuint-db.sql是全量的数据库
2、update_for_xxx是从上个版本升级到最新版本用的

171
fuint-application/pom.xml Normal file
View File

@ -0,0 +1,171 @@
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<parent>
<artifactId>fuint</artifactId>
<groupId>com.fuint</groupId>
<version>1.0.0</version>
</parent>
<modelVersion>4.0.0</modelVersion>
<artifactId>fuint-application</artifactId>
<version>1.0.0</version>
<packaging>jar</packaging>
<properties>
<kaptcha.version>0.0.9</kaptcha.version>
</properties>
<dependencies>
<dependency>
<groupId>com.fuint</groupId>
<artifactId>fuint-framework</artifactId>
<version>1.0.0</version>
</dependency>
<dependency>
<groupId>io.sentry</groupId>
<artifactId>sentry-logback</artifactId>
<version>1.2.0</version>
</dependency>
<dependency>
<groupId>org.springframework.ws</groupId>
<artifactId>spring-ws-core</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-security</artifactId>
</dependency>
<dependency>
<groupId>org.aspectj</groupId>
<artifactId>aspectjweaver</artifactId>
</dependency>
<dependency>
<groupId>commons-httpclient</groupId>
<artifactId>commons-httpclient</artifactId>
<version>3.1</version>
</dependency>
<dependency>
<groupId>nl.bitwalker</groupId>
<artifactId>UserAgentUtils</artifactId>
<version>1.2.4</version>
</dependency>
<dependency>
<groupId>commons-lang</groupId>
<artifactId>commons-lang</artifactId>
<version>2.6</version>
</dependency>
<dependency>
<groupId>io.springfox</groupId>
<artifactId>springfox-swagger2</artifactId>
<version>2.9.2</version>
</dependency>
<dependency>
<groupId>io.springfox</groupId>
<artifactId>springfox-swagger-ui</artifactId>
<version>2.9.2</version>
</dependency>
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-boot-starter</artifactId>
<version>${mybatis-plus.version}</version>
</dependency>
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus</artifactId>
<version>${mybatis-plus.version}</version>
</dependency>
<dependency>
<groupId>com.github.pagehelper</groupId>
<artifactId>pagehelper-spring-boot-starter</artifactId>
<version>1.2.5</version>
<exclusions>
<exclusion>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>org.mockito</groupId>
<artifactId>mockito-core</artifactId>
</dependency>
<dependency>
<groupId>com.github.axet</groupId>
<artifactId>kaptcha</artifactId>
<version>${kaptcha.version}</version>
</dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.javassist</groupId>
<artifactId>javassist</artifactId>
<version>3.24.0-GA</version>
</dependency>
<dependency>
<groupId>com.aliyun.oss</groupId>
<artifactId>aliyun-sdk-oss</artifactId>
<version>3.10.2</version>
</dependency>
<!-- aliyun短信API -->
<dependency>
<groupId>com.aliyun</groupId>
<artifactId>aliyun-java-sdk-core</artifactId>
<version>4.4.6</version>
</dependency>
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>transmittable-thread-local</artifactId>
<version>2.2.0</version>
</dependency>
<dependency>
<groupId>com.github.javen205</groupId>
<artifactId>IJPay-WxPay</artifactId>
<version>2.9.6</version>
</dependency>
<dependency>
<groupId>com.github.javen205</groupId>
<artifactId>IJPay-AliPay</artifactId>
<version>2.9.6</version>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<version>2.5.12</version>
<executions>
<execution>
<goals>
<goal>repackage</goal>
</goals>
</execution>
</executions>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.1</version>
<configuration>
<source>1.8</source>
<target>1.8</target>
</configuration>
</plugin>
</plugins>
</build>
</project>

View File

@ -0,0 +1,35 @@
package com.fuint.common;
import java.util.HashMap;
import java.util.Map;
/**
* 常量定义
*
* Created by FSQ
* CopyRight https://www.fuint.cn
*/
public class Constants {
// 第几页默认第1页
public static final int PAGE_NUMBER = 1;
// 每页记录数默认20条
public static final int PAGE_SIZE = 20;
// 读取数据最多行数
public static final int MAX_ROWS = 2000;
/**
* 系统配置, 从setting表中读取
*/
public static Map<String, String> SYS_CONFIGS = new HashMap<String, String>();
public static final int HTTP_RESPONSE_CODE_PARAM_ERROR = 202;
public static final int HTTP_RESPONSE_CODE_USER_NOT_EXIST = 402;
public static final int HTTP_RESPONSE_CODE_USER_LOGIN_ERROR = 403;
public static final int HTTP_RESPONSE_CODE_NOLOGIN = 1001;
public static final String SESSION_USER = "USER";
public static final String SESSION_ADMIN_USER = "ADMIN_USER";
}

View File

@ -0,0 +1,147 @@
package com.fuint.common.aspect;
import javassist.ClassClassPath;
import javassist.ClassPool;
import javassist.CtClass;
import javassist.CtMethod;
import javassist.Modifier;
import javassist.bytecode.CodeAttribute;
import javassist.bytecode.LocalVariableAttribute;
import javassist.bytecode.MethodInfo;
import org.apache.commons.lang.ArrayUtils;
import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.EnableAspectJAutoProxy;
import org.springframework.stereotype.Component;
/**
* 控制器日志
*
* Created by FSQ
* CopyRight https://www.fuint.cn
*/
@Component // 声明组件
@Aspect // 声明切面
@ComponentScan //组件自动扫描
@EnableAspectJAutoProxy // spring自动切换JDK动态代理和CGLIB
public class LogAop {
/**
*自定义日志
*/
private Logger logger = LoggerFactory.getLogger(LogAop.class);
/**
* 打印类method的名称以及参数
* @param point 切面
*/
public void printMethodParams(JoinPoint point){
if (point == null) {
return;
}
try {
// 获取方法的参数值数组方法名类型以及地址等信息
String className = point.getTarget().getClass().getName();
String methodName = point.getSignature().getName();
// 重新定义日志
logger = LoggerFactory.getLogger(point.getTarget().getClass());
logger.info("-------------------------"+className+"------------------------------------");
logger.info("methodName = {}", methodName);
// 获取方法的参数值数组
Object[] methodArgs = point.getArgs();
// 获取方法参数名称
String[] paramNames = getFieldsName(className, methodName);
// 输出方法的参数名和参数值
printParams(paramNames, methodArgs);
} catch (Exception e) {
e.printStackTrace();
}
}
/**
* 使用获取方法参数名称
* @param class_name 类名
* @param method_name 方法名
* @throws Exception
*/
private String[] getFieldsName(String class_name, String method_name) throws Exception {
Class<?> clazz = Class.forName(class_name);
String clazz_name = clazz.getName();
ClassPool pool = ClassPool.getDefault();
ClassClassPath classPath = new ClassClassPath(clazz);
pool.insertClassPath(classPath);
try {
CtClass ctClass = pool.get(clazz_name);
CtMethod ctMethod = ctClass.getDeclaredMethod(method_name);
MethodInfo methodInfo = ctMethod.getMethodInfo();
CodeAttribute codeAttribute = methodInfo.getCodeAttribute();
LocalVariableAttribute attr = (LocalVariableAttribute) codeAttribute.getAttribute(LocalVariableAttribute.tag);
if (attr == null) {
return null;
}
String[] paramsArgsName = new String[ctMethod.getParameterTypes().length];
int pos = Modifier.isStatic(ctMethod.getModifiers()) ? 0 : 1;
for (int i = 0; i < paramsArgsName.length; i++) {
paramsArgsName[i] = attr.variableName(i + pos);
}
return paramsArgsName;
} catch (Exception ex) {
return null;
}
}
/**
* 判断是否为基本类型
*/
private boolean isPrimite(Class<?> clazz) {
if (clazz.isPrimitive() || clazz == String.class){
return true;
}else {
return false;
}
}
/**
* 打印方法参数值 基本类型直接打印非基本类型需要重写toString方法
* @param paramsArgsName 方法参数名数组
* @param paramsArgsValue 方法参数值数组
*/
private void printParams(String[] paramsArgsName, Object[] paramsArgsValue) {
if (ArrayUtils.isEmpty(paramsArgsName) || ArrayUtils.isEmpty(paramsArgsValue)) {
return;
}
StringBuffer buffer = new StringBuffer();
for (int i = 0; i < paramsArgsName.length; i++) {
// 参数名
String name = paramsArgsName[i];
// 参数值
Object value = paramsArgsValue[i];
buffer.append(name +" = ");
if (isPrimite(value.getClass())) {
buffer.append(value + " ,");
} else {
buffer.append(value.toString() + " ,");
}
}
logger.info("params : " + buffer.toString());
logger.info("-------------------------------------------------------------");
}
/**
* 在方法执行前进行切面
* 定义切面表达式
* @param point 切面
*/
@Before("execution(public * com.fuint.module..*.*(..))")
public void before(JoinPoint point) {
this.printMethodParams(point);
}
}

View File

@ -0,0 +1,16 @@
package com.fuint.common.aspect;
import org.aspectj.lang.annotation.Aspect;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Component;
/**
* Created by FSQ
* CopyRight https://www.fuint.cn
*/
@Component
@Aspect
public class RedisModelAspect {
public static final Logger logger = LoggerFactory.getLogger(RedisModelAspect.class);
}

View File

@ -0,0 +1,138 @@
package com.fuint.common.aspect;
import com.fuint.common.dto.AccountInfo;
import com.fuint.common.service.ActionLogService;
import com.fuint.common.util.CommonUtil;
import com.fuint.common.util.TokenUtil;
import com.fuint.framework.annoation.OperationServiceLog;
import com.fuint.repository.model.TActionLog;
import org.apache.commons.lang.StringUtils;
import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.annotation.*;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Lazy;
import org.springframework.stereotype.Component;
import javax.servlet.http.HttpServletRequest;
import org.springframework.web.context.request.RequestContextHolder;
import org.springframework.web.context.request.ServletRequestAttributes;
import java.math.BigDecimal;
import java.util.Date;
/**
* 后台操作日志
*
* Created by FSQ
* CopyRight https://www.fuint.cn
*/
@Component
@Aspect
public class TActionLogAop {
private Logger LOGGER = LoggerFactory.getLogger(TActionLogAop.class);
@Lazy
@Autowired
private ActionLogService tActionLogService;
private String userName = ""; // 用户名
private Integer merchantId = 0; // 商户ID
private Integer storeId = 0; // 店铺ID
private Long startTimeMillis = 0l; // 开始时间
private Long endTimeMillis = 0l; // 结束时间
private String clientIp = "";
private Integer clientPort = 0;
private String module = "";
private String url = "";
private String userAgent = "";
// Service层切点
@Pointcut("@annotation(com.fuint.framework.annoation.OperationServiceLog)")
public void serviceAspect() {
// empty
}
/**
* service 方法前调用
*
* @param joinPoint
*/
@Before("serviceAspect()")
public void doBeforeService(JoinPoint joinPoint) {
startTimeMillis = System.currentTimeMillis(); // 记录方法开始执行的时间
}
/**
* 方法后调用
*
* @param operationServiceLog
*/
@After("serviceAspect() && @annotation(operationServiceLog)")
public void doAfterInService(OperationServiceLog operationServiceLog) {
try {
endTimeMillis = System.currentTimeMillis(); // 记录方法执行完成的时间
clientIp = CommonUtil.getIPFromHttpRequest(getRequest());
userAgent = getRequest().getHeader("user-agent");
url = getRequest().getRequestURI();
clientPort = 0;
module = operationServiceLog.description();
userName = "";
merchantId = 0;
storeId = 0;
if (module.length() > 255) {
module = module.substring(0, 255);
}
HttpServletRequest request = getRequest();
String token = request.getHeader("Access-Token");
if (StringUtils.isNotEmpty(token)) {
AccountInfo accountInfo = TokenUtil.getAccountInfoByToken(token);
if (accountInfo != null) {
userName = accountInfo.getAccountName();
}
if (accountInfo != null) {
merchantId = accountInfo.getMerchantId() == null ? 0 : accountInfo.getMerchantId();
}
if (accountInfo != null) {
storeId = accountInfo.getStoreId() == null ? 0 : accountInfo.getStoreId();
}
}
this.printOptLog();
} catch (Exception e) {
// empty
}
}
/**
* 组装日志
*/
private void printOptLog() {
if (userAgent.length() > 255) {
userAgent = userAgent.substring(0, 255);
}
if (url.length() > 255) {
url = url.substring(0, 255);
}
TActionLog hal = new TActionLog();
hal.setAcctName(userName);
hal.setModule(module);
hal.setActionTime(new Date());
hal.setClientIp(clientIp);
hal.setClientPort(clientPort);
hal.setUrl(url);
hal.setTimeConsuming(new BigDecimal(endTimeMillis - startTimeMillis));
hal.setUserAgent(userAgent);
hal.setMerchantId(merchantId);
hal.setStoreId(storeId);
if (StringUtils.isNotEmpty(module) && StringUtils.isNotEmpty(userName)) {
this.tActionLogService.saveActionLog(hal);
}
}
protected HttpServletRequest getRequest(){
return ((ServletRequestAttributes) (RequestContextHolder.currentRequestAttributes())).getRequest();
}
}

View File

@ -0,0 +1,104 @@
package com.fuint.common.bean;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.context.annotation.PropertySource;
import org.springframework.stereotype.Component;
/**
* 支付宝支付Bean
*
* Created by FSQ
* CopyRight https://www.fuint.cn
*/
@Component
@PropertySource("file:${env.properties.path}/${env.profile}/application.properties")
@ConfigurationProperties(prefix = "alipay")
public class AliPayBean {
private String appId;
private String privateKey;
private String publicKey;
private String appCertPath;
private String aliPayCertPath;
private String aliPayRootCertPath;
private String serverUrl;
private String domain;
public String getAppId() {
return appId;
}
public void setAppId(String appId) {
this.appId = appId;
}
public String getPrivateKey() {
return privateKey;
}
public void setPrivateKey(String privateKey) {
this.privateKey = privateKey;
}
public String getPublicKey() {
return publicKey;
}
public void setPublicKey(String publicKey) {
this.publicKey = publicKey;
}
public String getAppCertPath() {
return appCertPath;
}
public void setAppCertPath(String appCertPath) {
this.appCertPath = appCertPath;
}
public String getAliPayCertPath() {
return aliPayCertPath;
}
public void setAliPayCertPath(String aliPayCertPath) {
this.aliPayCertPath = aliPayCertPath;
}
public String getAliPayRootCertPath() {
return aliPayRootCertPath;
}
public void setAliPayRootCertPath(String aliPayRootCertPath) {
this.aliPayRootCertPath = aliPayRootCertPath;
}
public String getServerUrl() {
return serverUrl;
}
public void setServerUrl(String serverUrl) {
this.serverUrl = serverUrl;
}
public String getDomain() {
return domain;
}
public void setDomain(String domain) {
this.domain = domain;
}
@Override
public String toString() {
return "AliPayBean{" +
"appId='" + appId + '\'' +
", privateKey='" + privateKey + '\'' +
", publicKey='" + publicKey + '\'' +
", appCertPath='" + appCertPath + '\'' +
", aliPayCertPath='" + aliPayCertPath + '\'' +
", aliPayRootCertPath='" + aliPayRootCertPath + '\'' +
", serverUrl='" + serverUrl + '\'' +
", domain='" + domain + '\'' +
'}';
}
}

View File

@ -0,0 +1,83 @@
package com.fuint.common.bean;
import com.alibaba.fastjson.JSON;
/**
* H5支付Bean
*
* Created by FSQ
* CopyRight https://www.fuint.cn
*/
public class H5SceneInfo {
private H5 h5_info;
public H5 getH5Info() {
return h5_info;
}
public void setH5Info(H5 h5_info) {
this.h5_info = h5_info;
}
@Override
public String toString() {
return JSON.toJSONString(this);
}
public static class H5 {
private String type;
private String app_name;
private String bundle_id;
private String package_name;
private String wap_url;
private String wap_name;
public String getType() {
return type;
}
public void setType(String type) {
this.type = type;
}
public String getApp_name() {
return app_name;
}
public void setApp_name(String app_name) {
this.app_name = app_name;
}
public String getBundle_id() {
return bundle_id;
}
public void setBundle_id(String bundle_id) {
this.bundle_id = bundle_id;
}
public String getPackage_name() {
return package_name;
}
public void setPackage_name(String package_name) {
this.package_name = package_name;
}
public String getWap_url() {
return wap_url;
}
public void setWap_url(String wap_url) {
this.wap_url = wap_url;
}
public String getWap_name() {
return wap_name;
}
public void setWap_name(String wap_name) {
this.wap_name = wap_name;
}
}
}

View File

@ -0,0 +1,64 @@
package com.fuint.common.bean;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.context.annotation.PropertySource;
import org.springframework.stereotype.Component;
/**
* 云闪付支付Bean
*
* Created by FSQ
* CopyRight https://www.fuint.cn
*/
@Component
@PropertySource("file:${env.properties.path}/${env.profile}/application.properties")
@ConfigurationProperties(prefix = "union")
public class UnionPayBean {
private String machId;
private String key;
private String serverUrl;
private String domain;
public String getMachId() {
return machId;
}
public void setMachId(String machId) {
this.machId = machId;
}
public String getKey() {
return key;
}
public void setKey(String key) {
this.key = key;
}
public String getServerUrl() {
return serverUrl;
}
public void setServerUrl(String serverUrl) {
this.serverUrl = serverUrl;
}
public String getDomain() {
return domain;
}
public void setDomain(String domain) {
this.domain = domain;
}
@Override
public String toString() {
return "UnionPayBean{" +
"machId='" + machId + '\'' +
", key='" + key + '\'' +
", serverUrl='" + serverUrl + '\'' +
", domain='" + domain + '\'' +
'}';
}
}

View File

@ -0,0 +1,78 @@
package com.fuint.common.bean;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.context.annotation.PropertySource;
import org.springframework.stereotype.Component;
/**
* 微信支付Bean
*
* Created by FSQ
* CopyRight https://www.fuint.cn
*/
@Component
@PropertySource("file:${env.properties.path}/${env.profile}/application.properties")
@ConfigurationProperties(prefix = "wxpay")
public class WxPayBean {
private String appId;
private String appSecret;
private String mchId;
private String apiV2;
private String certPath;
private String domain; // 填写完整的回调地址
public String getAppId() {
return appId;
}
public void setAppId(String appId) {
this.appId = appId;
}
public String getAppSecret() {
return appSecret;
}
public void setAppSecret(String appSecret) {
this.appSecret = appSecret;
}
public String getMchId() {
return mchId;
}
public void setMchId(String mchId) {
this.mchId = mchId;
}
public String getApiV2() {
return apiV2;
}
public void setApiV2(String apiV2) {
this.apiV2 = apiV2;
}
public String getCertPath() {
return certPath;
}
public void setCertPath(String certPath) {
this.certPath = certPath;
}
public String getDomain() {
return domain;
}
public void setDomain(String domain) {
this.domain = domain;
}
@Override
public String toString() {
return "WxPayBean [appId=" + appId + ", appSecret=" + appSecret + ", mchId=" + mchId + ", apiV2="
+ apiV2 + ", certPath=" + certPath + ", domain=" + domain + "]";
}
}

View File

@ -0,0 +1,113 @@
package com.fuint.common.bean;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.context.annotation.PropertySource;
import org.springframework.stereotype.Component;
/**
* 微信V3支付Bean
*
* Created by FSQ
* CopyRight https://www.fuint.cn
*/
@Component
@PropertySource("file:${env.properties.path}/${env.profile}/application.properties")
@ConfigurationProperties(prefix = "v3")
public class WxPayV3Bean {
private String appId;
private String keyPath;
private String certPath;
private String certP12Path;
private String platformCertPath;
private String mchId;
private String apiKey;
private String apiKey3;
private String domain;
public String getAppId() {
return appId;
}
public void setAppId(String appId) {
this.appId = appId;
}
public String getKeyPath() {
return keyPath;
}
public void setKeyPath(String keyPath) {
this.keyPath = keyPath;
}
public String getCertPath() {
return certPath;
}
public void setCertPath(String certPath) {
this.certPath = certPath;
}
public String getCertP12Path() {
return certP12Path;
}
public void setCertP12Path(String certP12Path) {
this.certP12Path = certP12Path;
}
public String getPlatformCertPath() {
return platformCertPath;
}
public void setPlatformCertPath(String platformCertPath) {
this.platformCertPath = platformCertPath;
}
public String getMchId() {
return mchId;
}
public void setMchId(String mchId) {
this.mchId = mchId;
}
public String getApiKey() {
return apiKey;
}
public void setApiKey(String apiKey) {
this.apiKey = apiKey;
}
public String getApiKey3() {
return apiKey3;
}
public void setApiKey3(String apiKey3) {
this.apiKey3 = apiKey3;
}
public String getDomain() {
return domain;
}
public void setDomain(String domain) {
this.domain = domain;
}
@Override
public String toString() {
return "WxPayV3Bean{" +
"keyPath='" + keyPath + '\'' +
", certPath='" + certPath + '\'' +
", certP12Path='" + certP12Path + '\'' +
", platformCertPath='" + platformCertPath + '\'' +
", mchId='" + mchId + '\'' +
", apiKey='" + apiKey + '\'' +
", apiKey3='" + apiKey3 + '\'' +
", domain='" + domain + '\'' +
'}';
}
}

View File

@ -0,0 +1,41 @@
package com.fuint.common.config;
import com.google.code.kaptcha.impl.DefaultKaptcha;
import com.google.code.kaptcha.util.Config;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import java.io.InputStream;
import java.util.Properties;
/**
* 图形验证码组件配置
*
* Created by FSQ
* CopyRight https://www.fuint.cn
*/
@Configuration
public class CaptchaConfig {
private static final Logger logger = LoggerFactory.getLogger(CaptchaConfig.class);
/**
* 验证码
*/
@Bean
public DefaultKaptcha defaultCaptcha() {
DefaultKaptcha defaultKaptcha = new DefaultKaptcha();
Properties property = new Properties();
try {
InputStream inputStream = this.getClass().getClassLoader().getResourceAsStream("captcha-conf.properties");
property.load(inputStream);
Config config = new Config(property);
defaultKaptcha.setConfig(config);
} catch (Exception e) {
logger.error("Kaptcha properties load error {}", e);
throw new RuntimeException("Kaptcha properties load error");
}
return defaultKaptcha;
}
}

View File

@ -0,0 +1,22 @@
package com.fuint.common.config;
/**
* 消息定义
*
* Created by FSQ
* CopyRight https://www.fuint.cn
*/
public class Message {
public static final String PARAM_ERROR = "参数出错";
public static final String COUPON_NOT_EXIST = "该卡券不存在";
public static final String COUPON_IS_EXPIRE = "该卡券未生效";
public static final String USER_NOT_EXIST = "该用户不存在";
public static final String MAX_COUPON_LIMIT = "已经领取过了";
public static final String COUPON_TYPE_ERROR = "卡券类型有误";
public static final String POINT_LIMIT = "您的积分不足";
public static final String NEED_CODE = "需要领取码";
public static final String CODE_ERROR = "领取码错误";
public static final String CODE_ERROR_1 = "核销码错误";
public static final String GRADE_ERROR = "该卡券不适于您的会员等级";
public static final String HAS_COUPON = "您已领取过该卡券";
}

View File

@ -0,0 +1,51 @@
package com.fuint.common.config;
import com.baomidou.mybatisplus.core.injector.ISqlInjector;
import com.baomidou.mybatisplus.extension.injector.LogicSqlInjector;
import com.baomidou.mybatisplus.extension.plugins.OptimisticLockerInterceptor;
import com.baomidou.mybatisplus.extension.plugins.PaginationInterceptor;
import org.mybatis.spring.annotation.MapperScan;
import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
/**
* MybatisPlus配置
*
* Created by FSQ
* CopyRight https://www.fuint.cn
*/
@Configuration
@MapperScan({"com.fuint.repository.**.mapper"})
public class MybatisPlusConfig {
/**
* 分页插件
* @return PaginationInterceptor
*/
@Bean
@ConditionalOnMissingBean
public PaginationInterceptor paginationInterceptor() {
return new PaginationInterceptor();
}
/**
* 逻辑删除插件
*
* @return LogicSqlInjector
*/
@Bean
@ConditionalOnMissingBean
public ISqlInjector sqlInjector() {
return new LogicSqlInjector();
}
/**
* 乐观锁插件
* @return
*/
@Bean
public OptimisticLockerInterceptor optimisticLockerInterceptor() {
return new OptimisticLockerInterceptor();
}
}

View File

@ -0,0 +1,67 @@
package com.fuint.common.config;
import com.fasterxml.jackson.databind.ObjectMapper;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.cache.annotation.CachingConfigurerSupport;
import org.springframework.cache.annotation.EnableCaching;
import org.springframework.cache.interceptor.KeyGenerator;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.data.redis.connection.RedisConnectionFactory;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.data.redis.serializer.Jackson2JsonRedisSerializer;
import org.springframework.data.redis.serializer.StringRedisSerializer;
import org.springframework.session.data.redis.config.ConfigureRedisAction;
import org.springframework.session.data.redis.config.annotation.web.http.EnableRedisHttpSession;
/**
* 配置redis缓存
*
* Created by FSQ
* CopyRight https://www.fuint.cn
*/
@Configuration
@EnableCaching
@EnableRedisHttpSession
public class RedisConfig extends CachingConfigurerSupport {
@Autowired
private RedisConnectionFactory redisConnectionFactory;
@Bean
public KeyGenerator keyGenerator() {
return (target, method, params) -> {
StringBuilder sb = new StringBuilder();
sb.append(target.getClass().getName());
sb.append(method.getName());
for (Object obj : params) {
sb.append(obj.toString());
}
return sb.toString();
};
}
@Bean
public static ConfigureRedisAction configureRedisAction() {
return ConfigureRedisAction.NO_OP;
}
@Bean
Jackson2JsonRedisSerializer<Object> jackson2JsonRedisSerializer(ObjectMapper objectMapper) {
Jackson2JsonRedisSerializer<Object> jackson2JsonRedisSerializer = new Jackson2JsonRedisSerializer<>(
Object.class);
jackson2JsonRedisSerializer.setObjectMapper(objectMapper);
return jackson2JsonRedisSerializer;
}
@Bean
RedisTemplate<String, Object> redisTemplate(Jackson2JsonRedisSerializer<Object> jackson2JsonRedisSerializer) {
RedisTemplate<String, Object> redisTemplate = new RedisTemplate<>();
redisTemplate.setConnectionFactory(redisConnectionFactory);
redisTemplate.setDefaultSerializer(jackson2JsonRedisSerializer);
StringRedisSerializer stringRedisSerializer = new StringRedisSerializer();
redisTemplate.setKeySerializer(stringRedisSerializer);
redisTemplate.setHashKeySerializer(stringRedisSerializer);
return redisTemplate;
}
}

View File

@ -0,0 +1,100 @@
package com.fuint.common.config;
import org.springframework.context.annotation.Bean;
import org.springframework.http.HttpMethod;
import org.springframework.security.authentication.AuthenticationManager;
import org.springframework.security.config.annotation.authentication.builders.AuthenticationManagerBuilder;
import org.springframework.security.config.annotation.method.configuration.EnableGlobalMethodSecurity;
import org.springframework.security.config.annotation.web.builders.HttpSecurity;
import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter;
import org.springframework.security.config.http.SessionCreationPolicy;
import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder;
/**
* 安全中心配置
*
* Created by FSQ
* CopyRight https://www.fuint.cn
*/
@EnableGlobalMethodSecurity(prePostEnabled = true, securedEnabled = true)
public class SecurityConfig extends WebSecurityConfigurerAdapter {
/**
* 解决 无法直接注入 AuthenticationManager
*
* @return
* @throws Exception
*/
@Bean
@Override
public AuthenticationManager authenticationManagerBean() throws Exception {
return super.authenticationManagerBean();
}
/**
* anyRequest | 匹配所有请求路径
* access | SpringEl表达式结果为true时可以访问
* anonymous | 匿名可以访问
* denyAll | 用户不能访问
* fullyAuthenticated | 用户完全认证可以访问非remember-me下自动登录
* hasAnyAuthority | 如果有参数参数表示权限则其中任何一个权限可以访问
* hasAnyRole | 如果有参数参数表示角色则其中任何一个角色可以访问
* hasAuthority | 如果有参数参数表示权限则其权限可以访问
* hasIpAddress | 如果有参数参数表示IP地址如果用户IP和参数匹配则可以访问
* hasRole | 如果有参数参数表示角色则其角色可以访问
* permitAll | 用户可以任意访问
* rememberMe | 允许通过remember-me登录的用户访问
* authenticated | 用户登录后可访问
*/
@Override
protected void configure(HttpSecurity httpSecurity) throws Exception {
httpSecurity
// CSRF禁用因为不使用session
.csrf().disable()
// 基于token所以不需要session
.sessionManagement().sessionCreationPolicy(SessionCreationPolicy.STATELESS).and()
// 过滤请求
.authorizeRequests()
// 允许匿名访问
.antMatchers(
"/clientApi/**",
"/backendApi/**",
"/merchantApi/**"
).anonymous()
.antMatchers(
HttpMethod.GET,
"/",
"/static/**",
"/*.html",
"/**/*.html",
"/**/*.css",
"/**/*.js",
"/profile/**"
).permitAll()
.antMatchers("/swagger-ui.html").anonymous()
.antMatchers("/swagger-resources/**").anonymous()
.antMatchers("/webjars/**").anonymous()
.antMatchers("/*/api-docs").anonymous()
.antMatchers("/druid/**").anonymous()
// 除上面外的所有请求全部需要鉴权认证
.anyRequest().authenticated()
.and()
.headers().frameOptions().disable();
}
/**
* 强散列哈希加密实现
*/
@Bean
public BCryptPasswordEncoder bCryptPasswordEncoder() {
return new BCryptPasswordEncoder();
}
/**
* 身份认证接口
*/
@Override
protected void configure(AuthenticationManagerBuilder auth) {
// empty
}
}

View File

@ -0,0 +1,44 @@
package com.fuint.common.config;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
import springfox.documentation.builders.ApiInfoBuilder;
import springfox.documentation.builders.RequestHandlerSelectors;
import springfox.documentation.service.ApiInfo;
import springfox.documentation.service.Contact;
import springfox.documentation.spi.DocumentationType;
import springfox.documentation.spring.web.plugins.Docket;
import springfox.documentation.swagger2.annotations.EnableSwagger2;
/**
* Swagger接口文档
*
* Created by FSQ
* CopyRight https://www.fuint.cn
*/
@Configuration
@EnableSwagger2
public class SwaggerConfig implements WebMvcConfigurer {
@Bean
public Docket createRestApi() {
return new Docket(DocumentationType.SWAGGER_2)
.apiInfo(apiInfo())
.enable(true)
.select()
.apis(RequestHandlerSelectors.basePackage("com.fuint.module"))
.build();
}
@Bean
public ApiInfo apiInfo() {
return new ApiInfoBuilder()
.title("fuint会员营销系统接口文档")
.description("fuint会员营销系统接口文档“/clientApi”目录接口为会员端相关接口“/backendApi”目录接口为后台管理端相关接口。")
.termsOfServiceUrl("https://www.fuint.cn/")
.contact(new Contact("海南延禾信息技术有限公司","https://www.fuint.cn/", "fushengqian@qq.com"))
.version("1.0")
.build();
}
}

View File

@ -0,0 +1,98 @@
package com.fuint.common.config;
import com.fuint.common.web.AdminUserInterceptor;
import com.fuint.common.web.CommandInterceptor;
import com.fuint.common.web.ClientUserInterceptor;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.http.CacheControl;
import org.springframework.web.filter.CharacterEncodingFilter;
import org.springframework.web.servlet.config.annotation.*;
import org.springframework.web.servlet.resource.CssLinkResourceTransformer;
import org.springframework.web.servlet.resource.VersionResourceResolver;
import java.util.concurrent.TimeUnit;
/**
* web配置
*
* Created by FSQ
* CopyRight https://www.fuint.cn
*/
@Configuration
public class WebConfig extends WebMvcConfigurationSupport {
@Override
public void addResourceHandlers(ResourceHandlerRegistry registry) {
registry.addResourceHandler("/resources/**")
.addResourceLocations("/resources/", "classpath:/other-resources/")
.setCacheControl(CacheControl.maxAge(365, TimeUnit.DAYS))
.resourceChain(false)
.addResolver(new VersionResourceResolver().addContentVersionStrategy("/**"))
.addTransformer(new CssLinkResourceTransformer());
registry.addResourceHandler("/static/**").addResourceLocations("classpath:/static/");
registry.addResourceHandler("/**").addResourceLocations(
"classpath:/static/");
registry.addResourceHandler("swagger-ui.html").addResourceLocations(
"classpath:/META-INF/resources/");
registry.addResourceHandler("/webjars/**").addResourceLocations(
"classpath:/META-INF/resources/webjars/");
super.addResourceHandlers(registry);
}
@Bean
public CommandInterceptor commandInterceptor() {
return new CommandInterceptor();
}
@Bean
public AdminUserInterceptor adminUserInterceptor() {
return new AdminUserInterceptor();
}
@Bean
public ClientUserInterceptor portalUserInterceptor() {
return new ClientUserInterceptor();
}
@Override
public void addInterceptors(InterceptorRegistry registry) {
// Command
registry.addInterceptor(commandInterceptor())
.addPathPatterns("/cmd/**");
// 后台拦截
registry.addInterceptor(adminUserInterceptor())
.addPathPatterns("/backendApi/**")
.excludePathPatterns("/clientApi/captcha/**")
.excludePathPatterns("/backendApi/captcha/**")
.excludePathPatterns("/backendApi/userCoupon/exportList")
.excludePathPatterns("/backendApi/login/**");
// 客户端拦截
registry.addInterceptor(portalUserInterceptor())
.addPathPatterns("/clientApi/**")
.excludePathPatterns("/clientApi/sign/**")
.excludePathPatterns("/clientApi/page/home")
.excludePathPatterns("/clientApi/captcha/**")
.excludePathPatterns("/clientApi/goodsApi/**")
.excludePathPatterns("/clientApi/cart/**")
.excludePathPatterns("/clientApi/user/**")
.excludePathPatterns("/clientApi/settlement/submit")
.excludePathPatterns("/clientApi/pay/**")
.excludePathPatterns("/clientApi/order/todoCounts")
.excludePathPatterns("/clientApi/store/**")
.excludePathPatterns("/clientApi/article/**")
.excludePathPatterns("/clientApi/message/getOne")
.excludePathPatterns("/clientApi/message/wxPush")
.excludePathPatterns("/clientApi/sms/**");
}
@Bean
public CharacterEncodingFilter characterEncodingFilter() {
CharacterEncodingFilter filter = new CharacterEncodingFilter();
filter.setEncoding("UTF-8");
filter.setForceEncoding(true);
return filter;
}
}

View File

@ -0,0 +1,69 @@
package com.fuint.common.domain;
import io.swagger.annotations.ApiModelProperty;
import lombok.Getter;
import lombok.Setter;
import java.io.Serializable;
import java.util.ArrayList;
import java.util.List;
/**
* 树状结构节点实体
*
* Created by FSQ
* CopyRight https://www.fuint.cn
*/
@Getter
@Setter
public class TreeNode implements Serializable {
@ApiModelProperty("菜单ID")
private long id;
@ApiModelProperty("菜单名称")
private String name;
@ApiModelProperty("菜单名称(字母)")
private String ename;
@ApiModelProperty("节点是否打开")
private Boolean open;
@ApiModelProperty("是否菜单")
private int isMenu;
@ApiModelProperty("节点是否选中")
private Boolean checked;
@ApiModelProperty("url")
private String url;
@ApiModelProperty("路径")
private String path;
@ApiModelProperty("权限标识")
private String perms;
@ApiModelProperty("子菜单")
private List<TreeNode> childrens = new ArrayList<>();
@ApiModelProperty("菜单级别")
private int level;
@ApiModelProperty("上级菜单")
private long pId;
@ApiModelProperty("图标")
private String icon;
@ApiModelProperty("新图标")
private String newIcon;
@ApiModelProperty("排序")
private Integer sort;
@ApiModelProperty("状态")
private String status;
}

View File

@ -0,0 +1,61 @@
package com.fuint.common.domain;
import java.io.Serializable;
import java.util.List;
import java.util.stream.Collectors;
import com.fasterxml.jackson.annotation.JsonInclude;
/**
* TreeSelect树结构实体类
*
* Created by FSQ
* CopyRight https://www.fuint.cn
*/
public class TreeSelect implements Serializable {
private static final long serialVersionUID = 1L;
// 节点ID
private Long id;
// 节点名称
private String label;
// 子节点
@JsonInclude(JsonInclude.Include.NON_EMPTY)
private List<TreeSelect> childrens;
public TreeSelect() {
// empty
}
public TreeSelect(TreeNode menu) {
this.id = menu.getId();
this.label = menu.getName();
this.childrens = menu.getChildrens().stream().map(TreeSelect::new).collect(Collectors.toList());
}
public Long getId() {
return id;
}
public void setId(Long id) {
this.id = id;
}
public String getLabel() {
return label;
}
public void setLabel(String label) {
this.label = label;
}
public List<TreeSelect> getChildrens() {
return childrens;
}
public void setChildrens(List<TreeSelect> childrens) {
this.childrens = childrens;
}
}

View File

@ -0,0 +1,68 @@
package com.fuint.common.dto;
import com.fasterxml.jackson.annotation.JsonFormat;
import io.swagger.annotations.ApiModelProperty;
import lombok.Getter;
import lombok.Setter;
import java.util.Date;
/**
* 后台账户实体类
*
* Created by FSQ
* CopyRight https://www.fuint.cn
*/
@Getter
@Setter
public class AccountDto {
@ApiModelProperty("账户主键id")
private Integer id;
@ApiModelProperty("账户编码")
private String accountKey;
@ApiModelProperty("账户名称")
private String accountName;
@ApiModelProperty("密码")
private String password;
@ApiModelProperty("状态 : 0 无效 1 有效")
private int accountStatus;
@ApiModelProperty("激活状态 : 0 未激活 1已激活")
private int isActive;
@ApiModelProperty("创建时间")
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
private Date createDate;
@ApiModelProperty("修改时间")
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
private Date modifyDate;
@ApiModelProperty("随机码(公盐)")
private String salt;
@ApiModelProperty("是否被锁定")
private int locked;
@ApiModelProperty("真实姓名")
private String realName;
@ApiModelProperty("所属商户ID")
private Integer merchantId;
@ApiModelProperty("所属商户名称")
private String merchantName;
@ApiModelProperty("所属店铺ID")
private Integer storeId;
@ApiModelProperty("所属店铺名称")
private String storeName;
@ApiModelProperty("关联员工ID")
private Integer staffId;
}

View File

@ -0,0 +1,74 @@
package com.fuint.common.dto;
import com.fasterxml.jackson.annotation.JsonFormat;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import java.io.Serializable;
import java.util.Date;
/**
* 后台登录账号信息
*
* Created by FSQ
* CopyRight https://www.fuint.cn
*/
@Data
public class AccountInfo implements Serializable {
@ApiModelProperty("账户主键id")
private Integer id;
@ApiModelProperty("账户编码")
private String accountKey;
@ApiModelProperty("账户名称")
private String accountName;
@ApiModelProperty("状态 : 0 无效 1 有效")
private int accountStatus;
@ApiModelProperty("激活状态 : 0 未激活 1已激活")
private String isActive;
@ApiModelProperty("创建时间")
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
private Date createDate;
@ApiModelProperty("修改时间")
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
private Date modifyDate;
@ApiModelProperty("随机码(公盐)")
private String salt;
@ApiModelProperty("所属角色ID")
private String roleIds;
@ApiModelProperty("是否被锁定")
private int locked;
@ApiModelProperty("从属对象")
private int ownerId;
@ApiModelProperty("真实姓名")
private String realName;
@ApiModelProperty("所属商户ID")
private Integer merchantId;
@ApiModelProperty("所属商户名称")
private String merchantName;
@ApiModelProperty("所属店铺ID")
private Integer storeId;
@ApiModelProperty("所属店铺名称")
private String storeName;
@ApiModelProperty("关联员工ID")
private Integer staffId;
@ApiModelProperty("登录的Token")
private String token;
}

View File

@ -0,0 +1,56 @@
package com.fuint.common.dto;
import io.swagger.annotations.ApiModelProperty;
import lombok.Getter;
import lombok.Setter;
import java.io.Serializable;
/**
* 会员地址信息
*
* Created by FSQ
* CopyRight https://www.fuint.cn
*/
@Getter
@Setter
public class AddressDto implements Serializable {
@ApiModelProperty("账户主键ID")
private Integer id;
@ApiModelProperty("会员ID")
private Integer userId;
@ApiModelProperty("会员名称")
private String name;
@ApiModelProperty("会员手机号")
private String mobile;
@ApiModelProperty("省份ID")
private Integer provinceId;
@ApiModelProperty("省份名称")
private String provinceName;
@ApiModelProperty("城市ID")
private Integer cityId;
@ApiModelProperty("城市名称")
private String cityName;
@ApiModelProperty("区ID")
private Integer regionId;
@ApiModelProperty("区名称")
private String regionName;
@ApiModelProperty("详细地址")
private String detail;
@ApiModelProperty("是否默认地址")
private String isDefault;
@ApiModelProperty("状态")
private String status;
}

View File

@ -0,0 +1,167 @@
package com.fuint.common.dto;
import java.io.Serializable;
import java.util.Date;
/**
* 文章实体类
* Created by FSQ
*/
public class ArticleDto implements Serializable {
/**
* 自增ID
*/
private Integer id;
/**
* 标题
*/
private String title;
/**
* 简介
*/
private String brief;
/**
* 所属商户
* */
private Integer merchantId;
/**
* 所属店铺
* */
private Integer storeId;
/**
* 链接地址
*/
private String url;
/**
* 点击数
*/
private Long click;
/**
* 图片地址
*/
private String image;
/**
* 描述
*/
private String description;
/**
* 创建时间
*/
private Date createTime;
/**
* 更新时间
*/
private Date updateTime;
/**
* 最后操作人
*/
private String operator;
/**
* A正常D删除
*/
private String status;
/**
* 排序
* */
private Integer sort;
public Integer getId(){
return id;
}
public void setId(Integer id){
this.id=id;
}
public String getTitle(){
return title;
}
public void setTitle(String title){
this.title=title;
}
public String getBrief(){
return brief;
}
public void setBrief(String brief){
this.brief=brief;
}
public Integer getMerchantId(){
return merchantId;
}
public void setMerchantId(Integer merchantId){
this.merchantId=merchantId;
}
public Integer getStoreId(){
return storeId;
}
public void setStoreId(Integer storeId){
this.storeId=storeId;
}
public String getUrl(){
return url;
}
public void setUrl(String url){
this.url=url;
}
public Long getClick(){
return click;
}
public void setClick(Long click){
this.click=click;
}
public String getImage(){
return image;
}
public void setImage(String image){
this.image=image;
}
public String getDescription(){
return description;
}
public void setDescription(String description){
this.description=description;
}
public Date getCreateTime(){
return createTime;
}
public void setCreateTime(Date createTime){
this.createTime=createTime;
}
public Date getUpdateTime(){
return updateTime;
}
public void setUpdateTime(Date updateTime){
this.updateTime=updateTime;
}
public String getOperator(){
return operator;
}
public void setOperator(String operator){
this.operator=operator;
}
public String getStatus(){
return status;
}
public void setStatus(String status){
this.status=status;
}
public Integer getSort(){
return sort;
}
public void setSort(Integer sort){
this.sort=sort;
}
}

View File

@ -0,0 +1,27 @@
package com.fuint.common.dto;
import io.swagger.annotations.ApiModelProperty;
import lombok.Getter;
import lombok.Setter;
import java.math.BigDecimal;
/**
* 个人资产实体类
*/
@Getter
@Setter
public class AssetDto {
@ApiModelProperty("次卡数量")
private Integer timer;
@ApiModelProperty("储值卡数量")
private Integer prestore;
@ApiModelProperty("优惠券数量")
private Integer coupon;
@ApiModelProperty("预付金总额")
private BigDecimal totalPrePayment;
}

View File

@ -0,0 +1,56 @@
package com.fuint.common.dto;
import com.fasterxml.jackson.annotation.JsonFormat;
import com.fuint.repository.model.MtUser;
import io.swagger.annotations.ApiModelProperty;
import lombok.Getter;
import lombok.Setter;
import java.io.Serializable;
import java.math.BigDecimal;
import java.util.Date;
/**
* 余额变动实体类
*
* Created by FSQ
* CopyRight https://www.fuint.cn
*/
@Getter
@Setter
public class BalanceDto implements Serializable {
@ApiModelProperty("自增ID")
private Integer id;
@ApiModelProperty("会员ID")
private Integer userId;
@ApiModelProperty("会员信息")
private MtUser userInfo;
@ApiModelProperty("订单号")
private String orderSn;
@ApiModelProperty("余额变化数量")
private BigDecimal amount;
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
@ApiModelProperty("创建时间")
private Date createTime;
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
@ApiModelProperty("更新时间")
private Date updateTime;
@ApiModelProperty("备注说明")
private String description;
@ApiModelProperty("状态A正常D删除")
private String status;
@ApiModelProperty("最后操作人")
private String operator;
}

View File

@ -0,0 +1,59 @@
package com.fuint.common.dto;
import com.fasterxml.jackson.annotation.JsonFormat;
import io.swagger.annotations.ApiModelProperty;
import lombok.Getter;
import lombok.Setter;
import java.io.Serializable;
import java.util.Date;
/**
* 焦点图实体类
*
* Created by FSQ
* CopyRight https://www.fuint.cn
*/
@Getter
@Setter
public class BannerDto implements Serializable {
@ApiModelProperty("自增ID")
private Integer id;
@ApiModelProperty("标题")
private String title;
@ApiModelProperty("所属商户ID")
private Integer merchantId;
@ApiModelProperty("所属店铺ID")
private Integer storeId;
@ApiModelProperty("链接地址")
private String url;
@ApiModelProperty("图片地址")
private String image;
@ApiModelProperty("描述信息")
private String description;
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
@ApiModelProperty("创建时间")
private Date createTime;
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
@ApiModelProperty("更新时间")
private Date updateTime;
@ApiModelProperty("最后操作人")
private String operator;
@ApiModelProperty("排序")
private Integer sort;
@ApiModelProperty("状态A正常D删除")
private String status;
}

View File

@ -0,0 +1,33 @@
package com.fuint.common.dto;
import io.swagger.annotations.ApiModelProperty;
import lombok.Getter;
import lombok.Setter;
import java.io.Serializable;
import java.util.Map;
/**
* 消息体Body信息
*
* Created by FSQ
* CopyRight https://www.fuint.cn
*/
@Getter
@Setter
public class Body implements Serializable {
@ApiModelProperty("入参信息")
private Map<String,Object> inParams;
@ApiModelProperty("出参信息")
private Map<String,Object> outParams;
@Override
public String toString() {
final StringBuilder sb = new StringBuilder("Body{");
sb.append("inParams=").append(inParams);
sb.append(", outParams=").append(outParams);
sb.append('}');
return sb.toString();
}
}

View File

@ -0,0 +1,93 @@
package com.fuint.common.dto;
import com.fuint.repository.model.MtCommissionRule;
import com.fuint.repository.model.MtOrder;
import com.fuint.repository.model.MtStaff;
import com.fuint.repository.model.MtStore;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import java.io.Serializable;
import java.math.BigDecimal;
import java.util.Date;
/**
* 分销提成记录实体
* Created by FSQ
* CopyRight https://www.fuint.cn
*/
@Data
public class CommissionLogDto implements Serializable {
@ApiModelProperty("自增ID")
private Integer id;
@ApiModelProperty("分佣类型")
private String type;
@ApiModelProperty("分佣类型名称")
private String typeName;
@ApiModelProperty("分佣等级")
private Integer level;
@ApiModelProperty("会员ID")
private Integer userId;
@ApiModelProperty("用户信息")
private OrderUserDto userInfo;
@ApiModelProperty("商户ID")
private Integer merchantId;
@ApiModelProperty("店铺ID")
private Integer storeId;
@ApiModelProperty("所属店铺信息")
private MtStore storeInfo;
@ApiModelProperty("员工ID")
private Integer staffId;
@ApiModelProperty("所属店铺信息")
private MtStaff staffInfo;
@ApiModelProperty("订单ID")
private Integer orderId;
@ApiModelProperty("订单信息")
private MtOrder orderInfo;
@ApiModelProperty("分佣金额")
private BigDecimal amount;
@ApiModelProperty("规则ID")
private Integer ruleId;
@ApiModelProperty("分佣规则信息")
private MtCommissionRule ruleInfo;
@ApiModelProperty("备注")
private String description;
@ApiModelProperty("提现记录ID")
private Integer cashId;
@ApiModelProperty("最后操作人")
private String isCash;
@ApiModelProperty("提现时间")
private Date cashTime;
@ApiModelProperty("创建时间")
private Date createTime;
@ApiModelProperty("更新时间")
private Date updateTime;
@ApiModelProperty("最后操作人")
private String operator;
@ApiModelProperty("状态")
private String status;
}

View File

@ -0,0 +1,56 @@
package com.fuint.common.dto;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import java.io.Serializable;
import java.util.Date;
import java.util.List;
/**
* 分销提成规则实体
* Created by FSQ
* CopyRight https://www.fuint.cn
*/
@Data
public class CommissionRuleDto implements Serializable {
@ApiModelProperty("自增ID")
private Integer id;
@ApiModelProperty("规则名称")
private String name;
@ApiModelProperty("方案类型,goods:商品销售coupon卡券销售recharge会员充值")
private String type;
@ApiModelProperty("分佣对象,member:会员分销staff员工提成")
private String target;
@ApiModelProperty("商户ID")
private Integer merchantId;
@ApiModelProperty("店铺ID")
private Integer storeId;
@ApiModelProperty("适用店铺ID列表")
private List<Integer> storeIdList;
@ApiModelProperty("具体项目列表")
private List<CommissionRuleItemDto> detailList;
@ApiModelProperty("备注")
private String description;
@ApiModelProperty("创建时间")
private Date createTime;
@ApiModelProperty("更新时间")
private Date updateTime;
@ApiModelProperty("最后操作人")
private String operator;
@ApiModelProperty("状态")
private String status;
}

View File

@ -0,0 +1,40 @@
package com.fuint.common.dto;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import java.io.Serializable;
import java.math.BigDecimal;
/**
* 分销提成规则项目实体
* Created by FSQ
* CopyRight https://www.fuint.cn
*/
@Data
public class CommissionRuleItemDto implements Serializable {
@ApiModelProperty("商品ID")
private Integer goodsId;
@ApiModelProperty("商品名称")
private String goodsName;
@ApiModelProperty("商品logo")
private String logo;
@ApiModelProperty("商品价格")
private BigDecimal price;
@ApiModelProperty("方案类型,goods:商品销售coupon卡券销售recharge会员充值")
private String type;
@ApiModelProperty("提成方式")
private String method;
@ApiModelProperty("散客值")
private BigDecimal visitorVal;
@ApiModelProperty("会员值")
private BigDecimal memberVal;
}

View File

@ -0,0 +1,67 @@
package com.fuint.common.dto;
import com.alibaba.fastjson.annotation.JSONField;
import com.fuint.repository.model.MtCoupon;
import com.fuint.repository.model.MtStore;
import com.fuint.repository.model.MtUser;
import io.swagger.annotations.ApiModelProperty;
import lombok.Getter;
import lombok.Setter;
import java.io.Serializable;
import java.math.BigDecimal;
import java.util.Date;
/**
* 核销卡券流水dto
*
* Created by FSQ
* CopyRight https://www.fuint.cn
*/
@Getter
@Setter
public class ConfirmLogDto implements Serializable {
@ApiModelProperty("自增ID")
private Integer id;
@ApiModelProperty("核销编码")
private String code;
@ApiModelProperty("核销状态")
private String status;
@ApiModelProperty("会员卡券ID")
private Integer userCouponId;
@ApiModelProperty("卡券信息")
private MtCoupon couponInfo;
@ApiModelProperty("会员信息")
private MtUser userInfo;
@ApiModelProperty("核销店铺信息")
private MtStore storeInfo;
@JSONField(format="yyyy-MM-dd HH:mm:ss")
@ApiModelProperty("创建时间")
private Date createTime;
@JSONField(format="yyyy-MM-dd HH:mm:ss")
@ApiModelProperty("更新时间")
private Date updateTime;
@ApiModelProperty("核销金额")
private BigDecimal amount;
@ApiModelProperty("核销uuid")
private String uuid;
@ApiModelProperty("核销备注")
private String remark;
@ApiModelProperty("最后操作人")
private String operator;
}

View File

@ -0,0 +1,30 @@
package com.fuint.common.dto;
import io.swagger.annotations.ApiModelProperty;
import lombok.Getter;
import lombok.Setter;
import java.util.List;
/**
* 卡券导入单元实体
*
* Created by FSQ
* CopyRight https://www.fuint.cn
*/
@Getter
@Setter
public class CouponCellDto {
@ApiModelProperty("手机号")
private String mobile;
@ApiModelProperty("商户ID")
private Integer merchantId;
@ApiModelProperty("分组ID")
private List<Integer> groupId;
@ApiModelProperty("发放数量")
private List<Integer> num;
}

View File

@ -0,0 +1,71 @@
package com.fuint.common.dto;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import java.io.Serializable;
import java.math.BigDecimal;
/**
* 卡券实体
*
* Created by FSQ
* CopyRight https://www.fuint.cn
*/
@Data
public class CouponDto implements Serializable {
@ApiModelProperty("自增ID")
private Integer id;
@ApiModelProperty("卡券名称")
private String name;
@ApiModelProperty("卡券类型")
private String type;
@ApiModelProperty("状态")
private String status;
@ApiModelProperty("获取规则")
private String inRule;
@ApiModelProperty("使用规则")
private String outRule;
@ApiModelProperty("图片")
private String image;
@ApiModelProperty("面额")
private BigDecimal amount;
@ApiModelProperty("领取需要积分数量")
private Integer point;
@ApiModelProperty("卖点")
private String sellingPoint;
@ApiModelProperty("已领取、预存数量")
private Integer gotNum;
@ApiModelProperty("剩余数量")
private Integer leftNum;
@ApiModelProperty("限制数量")
private Integer limitNum;
@ApiModelProperty("是否领取")
private Boolean isReceive;
@ApiModelProperty("是否需要领取码")
private boolean needReceiveCode;
@ApiModelProperty("会员卡券ID")
private int userCouponId;
@ApiModelProperty("有效期")
private String effectiveDate;
@ApiModelProperty("卡券说明")
private String description;
}

View File

@ -0,0 +1,22 @@
package com.fuint.common.dto;
import io.swagger.annotations.ApiModelProperty;
import lombok.Getter;
import lombok.Setter;
/**
* 日期实体
*
* Created by FSQ
* CopyRight https://www.fuint.cn
*/
@Getter
@Setter
public class DateDto {
@ApiModelProperty("开始时间")
private String startDate;
@ApiModelProperty("结束时间")
private String endDate;
}

View File

@ -0,0 +1,26 @@
package com.fuint.common.dto;
import io.swagger.annotations.ApiModelProperty;
import lombok.Getter;
import lombok.Setter;
/**
* 订单物流信息dto
*
* Created by FSQ
* CopyRight https://www.fuint.cn
*/
@Getter
@Setter
public class ExpressDto {
@ApiModelProperty("物流公司")
private String expressCompany;
@ApiModelProperty("物流单号")
private String expressNo;
@ApiModelProperty("发货时间")
private String expressTime;
}

View File

@ -0,0 +1,78 @@
package com.fuint.common.dto;
import com.fasterxml.jackson.annotation.JsonFormat;
import io.swagger.annotations.ApiModelProperty;
import lombok.Getter;
import lombok.Setter;
import java.io.Serializable;
import java.math.BigDecimal;
/**
* 卡券转赠实体类
*
* Created by FSQ
* CopyRight https://www.fuint.cn
*/
@Getter
@Setter
public class GiveDto implements Serializable {
@ApiModelProperty("自增ID")
private Integer id;
@ApiModelProperty("获赠者会员ID")
private Integer userId;
@ApiModelProperty("店铺ID")
private Integer storeId;
@ApiModelProperty("赠送者会员ID")
private Integer giveUserId;
@ApiModelProperty("获赠者手机号")
private String mobile;
@ApiModelProperty("转赠者手机号")
private String userMobile;
@ApiModelProperty("分组ID逗号隔开")
private String groupIds;
@ApiModelProperty("分组名称,逗号隔开")
private String groupNames;
@ApiModelProperty("图片")
private String image;
@ApiModelProperty("券ID逗号隔开")
private String couponIds;
@ApiModelProperty("券名称,逗号隔开")
private String couponNames;
@ApiModelProperty("数量")
private Integer num;
@ApiModelProperty("总金额")
private BigDecimal money;
@ApiModelProperty("备注")
private String note;
@ApiModelProperty("留言")
private String message;
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
@ApiModelProperty("赠送时间")
private String createTime;
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
@ApiModelProperty("更新时间")
private String updateTime;
@ApiModelProperty("状态A正常C取消 ")
private String status;
}

View File

@ -0,0 +1,50 @@
package com.fuint.common.dto;
import com.fasterxml.jackson.annotation.JsonFormat;
import io.swagger.annotations.ApiModelProperty;
import lombok.Getter;
import lombok.Setter;
import java.io.Serializable;
import java.math.BigDecimal;
import java.util.Date;
/**
* 转赠明细实体类
*
* Created by FSQ
* CopyRight https://www.fuint.cn
*/
@Getter
@Setter
public class GiveItemDto implements Serializable {
@ApiModelProperty("自增ID")
private Integer id;
@ApiModelProperty("赠予对象手机号")
private String mobile;
@ApiModelProperty("用户手机")
private String userMobile;
@ApiModelProperty("分组ID")
private Integer groupId;
@ApiModelProperty("分组名称")
private String groupName;
@ApiModelProperty("卡券ID")
private Integer couponId;
@ApiModelProperty("卡券名称")
private String couponName;
@ApiModelProperty("总金额")
private BigDecimal money;
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
@ApiModelProperty("赠送时间")
private Date createTime;
}

View File

@ -0,0 +1,61 @@
package com.fuint.common.dto;
import java.io.Serializable;
import java.util.Date;
import com.fasterxml.jackson.annotation.JsonFormat;
import io.swagger.annotations.ApiModelProperty;
import lombok.Getter;
import lombok.Setter;
/**
* 商品分类DTO
*
* Created by FSQ
* CopyRight https://www.fuint.cn
*/
@Getter
@Setter
public class GoodsCateDto implements Serializable {
@ApiModelProperty("自增ID")
private Integer id;
@ApiModelProperty("所属商户ID")
private Integer merchantId;
@ApiModelProperty("所属商户名称")
private String merchantName;
@ApiModelProperty("所属店铺ID")
private Integer storeId;
@ApiModelProperty("所属店铺名称")
private String storeName;
@ApiModelProperty("分类名称")
private String name;
@ApiModelProperty("LOGO地址")
private String logo;
@ApiModelProperty("分类描述")
private String description;
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
@ApiModelProperty("创建时间")
private Date createTime;
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
@ApiModelProperty("更新时间")
private Date updateTime;
@ApiModelProperty("最后操作人")
private String operator;
@ApiModelProperty("排序")
private Integer sort;
@ApiModelProperty("A正常D删除")
private String status;
}

View File

@ -0,0 +1,95 @@
package com.fuint.common.dto;
import com.fasterxml.jackson.annotation.JsonFormat;
import io.swagger.annotations.ApiModelProperty;
import lombok.Getter;
import lombok.Setter;
import java.io.Serializable;
import java.math.BigDecimal;
import java.util.Date;
import java.util.List;
/**
* 商品详情实体
*
* Created by FSQ
* CopyRight https://www.fuint.cn
*/
@Getter
@Setter
public class GoodsDetailDto implements Serializable {
@ApiModelProperty("自增ID")
private Integer goodsId;
@ApiModelProperty("商品名称")
private String name;
@ApiModelProperty("分类ID")
private Integer cateId;
@ApiModelProperty("商品条码")
private String goodsNo;
@ApiModelProperty("可否单规格")
private String isSingleSpec;
@ApiModelProperty("主图地址")
private String logo;
@ApiModelProperty("图片地址")
private List<String> images;
@ApiModelProperty("商品价格")
private BigDecimal price;
@ApiModelProperty("划线价格")
private BigDecimal linePrice;
@ApiModelProperty("库存")
private Integer stock;
@ApiModelProperty("商品重量")
private BigDecimal weight;
@ApiModelProperty("初始销量")
private Integer initSale;
@ApiModelProperty("商品卖点")
private String salePoint;
@ApiModelProperty("可否使用积分抵扣")
private String canUsePoint;
@ApiModelProperty("会员是否有折扣")
private String isMemberDiscount;
@ApiModelProperty("排序")
private Integer sort;
@ApiModelProperty("商品描述")
private String description;
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
@ApiModelProperty("创建时间")
private Date createTime;
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
@ApiModelProperty("更新时间")
private Date updateTime;
@ApiModelProperty("最后操作人")
private String operator;
@ApiModelProperty("状态A正常D删除")
private String status;
@ApiModelProperty("sku列表")
private List<GoodsSkuDto> skuList;
@ApiModelProperty("规格列表")
private List<GoodsSpecDto> specList;
}

View File

@ -0,0 +1,123 @@
package com.fuint.common.dto;
import com.fasterxml.jackson.annotation.JsonFormat;
import com.fuint.repository.model.MtGoodsCate;
import com.fuint.repository.model.MtGoodsSku;
import com.fuint.repository.model.MtGoodsSpec;
import com.fuint.repository.model.MtStore;
import io.swagger.annotations.ApiModelProperty;
import lombok.Getter;
import lombok.Setter;
import java.io.Serializable;
import java.math.BigDecimal;
import java.util.Date;
import java.util.List;
/**
* 商品DTO
*
* Created by FSQ
* CopyRight https://www.fuint.cn
*/
@Getter
@Setter
public class GoodsDto implements Serializable {
@ApiModelProperty("自增ID")
private Integer id;
@ApiModelProperty("所属店铺ID")
private Integer storeId;
@ApiModelProperty("所属店铺信息")
private MtStore storeInfo;
@ApiModelProperty("商品名称")
private String name;
@ApiModelProperty("商品类型")
private String type;
@ApiModelProperty("分类ID")
private Integer cateId;
@ApiModelProperty("分类信息")
private MtGoodsCate cateInfo;
@ApiModelProperty("商品条码")
private String goodsNo;
@ApiModelProperty("可否单规格")
private String isSingleSpec;
@ApiModelProperty("主图地址")
private String logo;
@ApiModelProperty("图片地址")
private String images;
@ApiModelProperty("价格")
private BigDecimal price;
@ApiModelProperty("划线价格")
private BigDecimal linePrice;
@ApiModelProperty("库存")
private Integer stock;
@ApiModelProperty("数量")
private Integer num;
@ApiModelProperty("服务时长")
private Integer serviceTime;
@ApiModelProperty("卡券ID")
private String couponIds;
@ApiModelProperty("重量")
private BigDecimal weight;
@ApiModelProperty("初始销量")
private Integer initSale;
@ApiModelProperty("商品卖点")
private String salePoint;
@ApiModelProperty("可否使用积分抵扣")
private String canUsePoint;
@ApiModelProperty("会员是否有折扣")
private String isMemberDiscount;
@ApiModelProperty("排序")
private Integer sort;
@ApiModelProperty("商品描述")
private String description;
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
@ApiModelProperty("创建时间")
private Date createTime;
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
@ApiModelProperty("更新时间")
private Date updateTime;
@ApiModelProperty("最后操作人")
private String operator;
@ApiModelProperty("状态A正常D删除")
private String status;
@ApiModelProperty("skuId")
private Integer skuId;
@ApiModelProperty("sku列表")
private List<MtGoodsSku> skuList;
@ApiModelProperty("规格列表")
private List<MtGoodsSpec> specList;
}

View File

@ -0,0 +1,52 @@
package com.fuint.common.dto;
import com.fuint.repository.model.MtGoodsSpec;
import io.swagger.annotations.ApiModelProperty;
import lombok.Getter;
import lombok.Setter;
import java.io.Serializable;
import java.util.List;
import java.math.BigDecimal;
/**
* 商品sku实体
*
* Created by FSQ
* CopyRight https://www.fuint.cn
*/
@Getter
@Setter
public class GoodsSkuDto implements Serializable {
@ApiModelProperty("自增ID")
private Integer id;
@ApiModelProperty("sku编码")
private String skuNo;
@ApiModelProperty("图片")
private String logo;
@ApiModelProperty("商品ID")
private Integer goodsId;
@ApiModelProperty("规格ID")
private String specIds;
@ApiModelProperty("规格列表")
private List<MtGoodsSpec> specList;
@ApiModelProperty("库存")
private Integer stock;
@ApiModelProperty("价格")
private BigDecimal price;
@ApiModelProperty("划线价格")
private BigDecimal linePrice;
@ApiModelProperty("重量")
private BigDecimal weight;
}

View File

@ -0,0 +1,29 @@
package com.fuint.common.dto;
import io.swagger.annotations.ApiModelProperty;
import lombok.Getter;
import lombok.Setter;
import java.io.Serializable;
/**
* 商品规格子类实体
*
* Created by FSQ
* CopyRight https://www.fuint.cn
*/
@Getter
@Setter
public class GoodsSpecChildDto implements Serializable {
@ApiModelProperty("自增ID")
private Integer id;
@ApiModelProperty("规格名称")
private String name;
@ApiModelProperty("是否选择")
private boolean checked;
}

View File

@ -0,0 +1,30 @@
package com.fuint.common.dto;
import io.swagger.annotations.ApiModelProperty;
import lombok.Getter;
import lombok.Setter;
import java.io.Serializable;
import java.util.List;
/**
* 商品规格实体
*
* Created by FSQ
* CopyRight https://www.fuint.cn
*/
@Getter
@Setter
public class GoodsSpecDto implements Serializable {
@ApiModelProperty("自增ID")
private Integer specId;
@ApiModelProperty("规格名称")
private String name;
@ApiModelProperty("规格值列表")
private List<GoodsSpecValueDto> valueList;
}

View File

@ -0,0 +1,30 @@
package com.fuint.common.dto;
import io.swagger.annotations.ApiModelProperty;
import lombok.Getter;
import lombok.Setter;
import java.io.Serializable;
import java.util.List;
/**
* 商品规格项实体
*
* Created by FSQ
* CopyRight https://www.fuint.cn
*/
@Getter
@Setter
public class GoodsSpecItemDto implements Serializable {
@ApiModelProperty("自增ID")
private Integer id;
@ApiModelProperty("规格名称")
private String name;
@ApiModelProperty("规格子类")
private List<GoodsSpecChildDto> child;
}

View File

@ -0,0 +1,29 @@
package com.fuint.common.dto;
import io.swagger.annotations.ApiModelProperty;
import lombok.Getter;
import lombok.Setter;
import java.io.Serializable;
/**
* 商品规格值实体
*
* Created by FSQ
* CopyRight https://www.fuint.cn
*/
@Getter
@Setter
public class GoodsSpecValueDto implements Serializable {
@ApiModelProperty("值ID")
private Integer specValueId;
@ApiModelProperty("规格名")
private String specName;
@ApiModelProperty("规格值")
private String specValue;
}

View File

@ -0,0 +1,36 @@
package com.fuint.common.dto;
import io.swagger.annotations.ApiModelProperty;
import lombok.Getter;
import lombok.Setter;
import java.io.Serializable;
import java.math.BigDecimal;
/**
* 商品排行DTO
*
* Created by FSQ
* CopyRight https://www.fuint.cn
*/
@Getter
@Setter
public class GoodsTopDto implements Serializable {
@ApiModelProperty("商品ID")
private Integer id;
@ApiModelProperty("商品名称")
private String name;
@ApiModelProperty("商品条码")
private String goodsNo;
@ApiModelProperty("销售金额")
private BigDecimal amount;
@ApiModelProperty("销售数量")
private Integer num;
}

View File

@ -0,0 +1,33 @@
package com.fuint.common.dto;
import io.swagger.annotations.ApiModelProperty;
import lombok.Getter;
import lombok.Setter;
import java.io.Serializable;
/**
* 卡券分组数据DTO
*
* Created by FSQ
* CopyRight https://www.fuint.cn
*/
@Getter
@Setter
public class GroupDataDto implements Serializable {
@ApiModelProperty("发放数量")
private Integer sendNum;
@ApiModelProperty("未发放数量")
private Integer unSendNum;
@ApiModelProperty("使用数量")
private Integer useNum;
@ApiModelProperty("过期数量")
private Integer expireNum;
@ApiModelProperty("取消数量")
private Integer cancelNum;
}

View File

@ -0,0 +1,23 @@
package com.fuint.common.dto;
import io.swagger.annotations.ApiModelProperty;
import lombok.Getter;
import lombok.Setter;
/**
* 卡券分组数据DTO
*
* Created by FSQ
* CopyRight https://www.fuint.cn
*/
@Getter
@Setter
public class GroupDataListDto {
@ApiModelProperty("键值")
private String key;
@ApiModelProperty("数据")
private GroupDataDto data;
}

View File

@ -0,0 +1,30 @@
package com.fuint.common.dto;
import io.swagger.annotations.ApiModelProperty;
import lombok.Getter;
import lombok.Setter;
import java.io.Serializable;
/**
* 分组会员DTO
*
* Created by FSQ
* CopyRight https://www.fuint.cn
*/
@Getter
@Setter
public class GroupMemberDto implements Serializable {
@ApiModelProperty("会员ID")
private Integer id;
@ApiModelProperty("会员名称")
private String name;
@ApiModelProperty("会员号")
private String userNo;
@ApiModelProperty("会员名称")
private String mobile;
}

View File

@ -0,0 +1,45 @@
package com.fuint.common.dto;
import com.fuint.repository.model.MtUser;
import io.swagger.annotations.ApiModelProperty;
import lombok.Getter;
import lombok.Setter;
import java.math.BigDecimal;
import java.sql.Array;
/**
* 收银挂单实体类
*
* Created by FSQ
* CopyRight https://www.fuint.cn
*/
@Getter
@Setter
public class HangUpDto {
@ApiModelProperty("挂单号")
private String hangNo;
@ApiModelProperty("CardId")
private Integer[] cardIds;
@ApiModelProperty("是否空白")
private Boolean isEmpty;
@ApiModelProperty("会员信息")
private MtUser memberInfo;
@ApiModelProperty("件数")
private Integer num;
@ApiModelProperty("金额")
private BigDecimal amount;
@ApiModelProperty("预付金额")
private BigDecimal prePayment;
@ApiModelProperty("时间")
private String dateTime;
}

View File

@ -0,0 +1,40 @@
package com.fuint.common.dto;
import io.swagger.annotations.ApiModelProperty;
import lombok.Getter;
import lombok.Setter;
import java.io.Serializable;
/**
* 消息体头信息
*
* Created by FSQ
* CopyRight https://www.fuint.cn
*/
@Getter
@Setter
public class Head implements Serializable {
@ApiModelProperty("服务编号,用于确定唯一的服务")
private String serviceId;
@ApiModelProperty("授权Token信息")
private String token;
@ApiModelProperty("服务执行返回码(000000:正常)")
private String returnCode;
@ApiModelProperty("服务执行返回信息")
private String returnDesc;
@Override
public String toString() {
final StringBuilder sb = new StringBuilder("Head{");
sb.append("serviceId='").append(serviceId).append('\'');
sb.append(", token='").append(token).append('\'');
sb.append(", returnCode='").append(returnCode).append('\'');
sb.append(", returnDesc='").append(returnDesc).append('\'');
sb.append('}');
return sb.toString();
}
}

View File

@ -0,0 +1,50 @@
package com.fuint.common.dto;
import java.io.Serializable;
import java.util.Date;
import io.swagger.annotations.ApiModelProperty;
import lombok.Getter;
import lombok.Setter;
/**
* 会员分组实体
*
* Created by FSQ
* CopyRight https://www.fuint.cn
*/
@Getter
@Setter
public class MemberGroupDto implements Serializable {
private static final long serialVersionUID = 1L;
@ApiModelProperty("分组ID")
private Integer id;
@ApiModelProperty("分组名称")
private String name;
@ApiModelProperty("所属商户ID")
private Integer merchantId;
@ApiModelProperty("默认店铺")
private Integer storeId;
@ApiModelProperty("父ID")
private Integer parentId;
@ApiModelProperty("创建时间")
private Date createTime;
@ApiModelProperty("更新时间")
private Date updateTime;
@ApiModelProperty("状态A激活N禁用D删除")
private String status;
@ApiModelProperty("备注信息")
private String description;
@ApiModelProperty("最后操作人")
private String operator;
}

View File

@ -0,0 +1,36 @@
package com.fuint.common.dto;
import io.swagger.annotations.ApiModelProperty;
import lombok.Getter;
import lombok.Setter;
import java.io.Serializable;
import java.math.BigDecimal;
/**
* 会员排行DTO
*
* Created by FSQ
* CopyRight https://www.fuint.cn
*/
@Getter
@Setter
public class MemberTopDto implements Serializable {
@ApiModelProperty("会员ID")
private Integer id;
@ApiModelProperty("会员名称")
private String name;
@ApiModelProperty("会员号")
private String userNo;
@ApiModelProperty("消费金额")
private BigDecimal amount;
@ApiModelProperty("购买数量")
private Integer num;
}

View File

@ -0,0 +1,26 @@
package com.fuint.common.dto;
import io.swagger.annotations.ApiModelProperty;
import lombok.Getter;
import lombok.Setter;
/**
* 短信发送返回实体
*
* Created by FSQ
* CopyRight https://www.fuint.cn
*/
@Getter
@Setter
public class MessageResDto {
@ApiModelProperty("发送ID")
private String[] sendIds;
@ApiModelProperty("发送结果")
private Boolean result;
@ApiModelProperty("短信ID")
private String[] smsId;
}

View File

@ -0,0 +1,74 @@
package com.fuint.common.dto;
import com.fuint.repository.model.MtStore;
import com.fuint.repository.model.MtUser;
import io.swagger.annotations.ApiModelProperty;
import lombok.Getter;
import lombok.Setter;
import java.io.Serializable;
import java.math.BigDecimal;
import java.util.Date;
/**
* 我的卡券DTO
*
* Created by FSQ
* CopyRight https://www.fuint.cn
*/
@Getter
@Setter
public class MyCouponDto implements Serializable {
@ApiModelProperty("自增ID")
private Integer id;
@ApiModelProperty("卡券名称")
private String name;
@ApiModelProperty("核销编码")
private String code;
@ApiModelProperty("卡券类型")
private String type;
@ApiModelProperty("状态")
private String status;
@ApiModelProperty("卡券ID")
private Integer couponId;
@ApiModelProperty("使用规则")
private String useRule;
@ApiModelProperty("图片")
private String image;
@ApiModelProperty("面额")
private BigDecimal amount;
@ApiModelProperty("余额")
private BigDecimal balance;
@ApiModelProperty("是否可用")
private boolean canUse;
@ApiModelProperty("有效期")
private String effectiveDate;
@ApiModelProperty("提示信息")
private String tips;
@ApiModelProperty("使用时间")
private Date usedTime;
@ApiModelProperty("领券时间")
private Date createTime;
@ApiModelProperty("会员信息")
private MtUser userInfo;
@ApiModelProperty("使用店铺")
private MtStore storeInfo;
}

View File

@ -0,0 +1,53 @@
package com.fuint.common.dto;
import com.fuint.repository.model.MtCoupon;
import com.fuint.repository.model.MtStore;
import com.fuint.repository.model.MtUserGrade;
import io.swagger.annotations.ApiModelProperty;
import lombok.Getter;
import lombok.Setter;
import java.io.Serializable;
/**
* 开卡赠礼实体类
*
* Created by FSQ
* CopyRight https://www.fuint.cn
*/
@Getter
@Setter
public class OpenGiftDto implements Serializable {
@ApiModelProperty("自增ID")
private Integer id;
@ApiModelProperty("店铺信息")
private MtStore storeInfo;
@ApiModelProperty("会员等级信息")
private MtUserGrade gradeInfo;
@ApiModelProperty("赠送积分")
private Integer point;
@ApiModelProperty("卡券信息")
private MtCoupon couponInfo;
@ApiModelProperty("卡券数量")
private Integer couponNum;
@ApiModelProperty("创建时间")
private String createTime;
@ApiModelProperty("更新时间")
private String updateTime;
@ApiModelProperty("状态")
private String status;
@ApiModelProperty("最后操作人")
private String operator;
}

View File

@ -0,0 +1,127 @@
package com.fuint.common.dto;
import io.swagger.annotations.ApiModelProperty;
import lombok.Getter;
import lombok.Setter;
import java.io.Serializable;
import java.math.BigDecimal;
import java.util.Date;
/**
* 订单实体类
*
* Created by FSQ
* CopyRight https://www.fuint.cn
*/
@Getter
@Setter
public class OrderDto implements Serializable {
@ApiModelProperty("自增ID")
private Integer id;
@ApiModelProperty("订单类型")
private String type;
@ApiModelProperty("下单平台")
private String platform;
@ApiModelProperty("支付类型")
private String payType;
@ApiModelProperty("订单类型名称")
private String orderMode;
@ApiModelProperty("核销码")
private String verifyCode;
@ApiModelProperty("订单号")
private String orderSn;
@ApiModelProperty("卡券ID")
private Integer couponId;
@ApiModelProperty("购物车ID")
private String cartIds;
@ApiModelProperty("商品ID")
private Integer goodsId;
@ApiModelProperty("skuID")
private Integer skuId;
@ApiModelProperty("购买数量")
private Integer buyNum;
@ApiModelProperty("会员ID")
private Integer userId;
@ApiModelProperty("是否游客")
private String isVisitor;
@ApiModelProperty("店铺ID")
private Integer storeId;
@ApiModelProperty("商户ID")
private Integer merchantId;
@ApiModelProperty("员工ID")
private Integer staffId;
@ApiModelProperty("订单金额")
private BigDecimal amount;
@ApiModelProperty("支付金额")
private BigDecimal payAmount;
@ApiModelProperty("使用积分数量")
private Integer usePoint;
@ApiModelProperty("积分金额")
private BigDecimal pointAmount;
@ApiModelProperty("折扣金额")
private BigDecimal discount;
@ApiModelProperty("配送费用")
private BigDecimal deliveryFee;
@ApiModelProperty("物流信息")
private ExpressDto expressInfo;
@ApiModelProperty("订单参数")
private String param;
@ApiModelProperty("用户备注")
private String remark;
@ApiModelProperty("创建时间")
private Date createTime;
@ApiModelProperty("更新时间")
private Date updateTime;
@ApiModelProperty("支付时间")
private Date payTime;
@ApiModelProperty("订单状态")
private String status;
@ApiModelProperty("支付状态")
private String payStatus;
@ApiModelProperty(value="结算状态")
private String settleStatus;
@ApiModelProperty("最后操作人")
private String operator;
@ApiModelProperty("收银地点ID")
private Integer storeLocationId;
@ApiModelProperty("预付金额")
private BigDecimal prePayment;
}

View File

@ -0,0 +1,51 @@
package com.fuint.common.dto;
import io.swagger.annotations.ApiModelProperty;
import lombok.Getter;
import lombok.Setter;
import java.io.Serializable;
import java.util.List;
/**
* 订单商品实体类
*
* Created by FSQ
* CopyRight https://www.fuint.cn
*/
@Getter
@Setter
public class OrderGoodsDto implements Serializable {
@ApiModelProperty("自增ID")
private Integer id;
@ApiModelProperty("商品ID")
private Integer goodsId;
@ApiModelProperty("订单类型")
private String type;
@ApiModelProperty("商品名称")
private String name;
@ApiModelProperty("价格")
private String price;
@ApiModelProperty("折扣")
private String discount;
@ApiModelProperty("购买数量")
private Integer num;
@ApiModelProperty("图片")
private String image;
@ApiModelProperty("skuId")
private Integer skuId;
@ApiModelProperty("规格列表")
private List<GoodsSpecValueDto> specList;
}

View File

@ -0,0 +1,39 @@
package com.fuint.common.dto;
import io.swagger.annotations.ApiModelProperty;
import lombok.Getter;
import lombok.Setter;
import java.io.Serializable;
/**
* 下单用户DTO
*
* Created by FSQ
* CopyRight https://www.fuint.cn
*/
@Getter
@Setter
public class OrderUserDto implements Serializable {
@ApiModelProperty("会员ID")
private Integer id;
@ApiModelProperty("会员姓名")
private String name;
@ApiModelProperty("会员手机")
private String mobile;
@ApiModelProperty("会员卡号")
private String userNo;
@ApiModelProperty("证件类型")
private String cardType;
@ApiModelProperty("证件号")
private String cardNo;
@ApiModelProperty("地址")
private String address;
}

View File

@ -0,0 +1,120 @@
package com.fuint.common.dto;
import java.io.Serializable;
/**
* 消息体分页信息
*
* Created by FSQ
* CopyRight https://www.fuint.cn
*/
public class Page implements Serializable {
private static final Long DEFAULT_PAGE_NO = 1L;
private static final Long DEFAULT_PAGE_SIZE = 100L;
private Long pageNo;// 页号
private Long pageSize;// 每页行数
private Long totalRows;// 总行数
private Long totalPages;// 总页数
private Boolean firstPage;// 是否首页
private Boolean lastPage;// 是否尾页
public Page() {
}
public Page(Long pageNo, Long pageSize) {
setPageNo(pageNo);
setPageSize(pageSize);
}
public Long getPageNo() {
return pageNo;
}
public void setPageNo(Long pageNo) {
if (pageNo == null || pageNo < 1) {
pageNo = DEFAULT_PAGE_NO;
} else if (totalPages != null && pageNo > totalPages) {
pageNo = totalPages;
}
this.pageNo = pageNo;
}
public Long getPageSize() {
return pageSize;
}
public void setPageSize(Long pageSize) {
if (pageSize == null) {
this.pageSize = DEFAULT_PAGE_SIZE;
} else if (pageSize < 1L) {
this.pageSize = 1L;
} else {
this.pageSize = pageSize;
}
}
public Long getTotalRows() {
return totalRows;
}
public void setTotalRows(Long totalRows) {
//总行数
this.totalRows = totalRows;
//总页数
this.totalPages = totalRows / this.pageSize;
if (totalRows % this.pageSize > 0) {
this.totalPages++;
}
//首页
if (this.pageNo <= 1) {
firstPage = true;
} else {
firstPage = false;
}
//尾页
if (this.pageNo >= this.totalPages) {
lastPage = true;
} else {
lastPage = false;
}
}
public Long getTotalPages() {
return totalPages;
}
public void setTotalPages(Long totalPages) {
this.totalPages = totalPages;
}
public Boolean isFirstPage() {
return firstPage;
}
public void setFirstPage(Boolean firstPage) {
this.firstPage = firstPage;
}
public Boolean isLastPage() {
return lastPage;
}
public void setLastPage(Boolean lastPage) {
this.lastPage = lastPage;
}
@Override
public String toString() {
final StringBuilder sb = new StringBuilder("Page{");
sb.append("pageNo=").append(pageNo);
sb.append(", pageSize=").append(pageSize);
sb.append(", totalRows=").append(totalRows);
sb.append(", totalPages=").append(totalPages);
sb.append(", firstPage=").append(firstPage);
sb.append(", lastPage=").append(lastPage);
sb.append('}');
return sb.toString();
}
}

View File

@ -0,0 +1,28 @@
package com.fuint.common.dto;
import io.swagger.annotations.ApiModelProperty;
import lombok.Getter;
import lombok.Setter;
import java.io.Serializable;
/**
* 请求参数实体类
*
* Created by FSQ
* CopyRight https://www.fuint.cn
*/
@Getter
@Setter
public class ParamDto implements Serializable {
@ApiModelProperty("参数键值")
private String key;
@ApiModelProperty("参数名称")
private String name;
@ApiModelProperty("参数值")
private String value;
}

View File

@ -0,0 +1,52 @@
package com.fuint.common.dto;
import com.fuint.repository.model.MtUser;
import io.swagger.annotations.ApiModelProperty;
import lombok.Getter;
import lombok.Setter;
import java.io.Serializable;
import java.util.Date;
/**
* 积分记录实体类
*
* Created by FSQ
* CopyRight https://www.fuint.cn
*/
@Getter
@Setter
public class PointDto implements Serializable {
@ApiModelProperty("自增ID")
private Integer id;
@ApiModelProperty("会员ID")
private Integer userId;
@ApiModelProperty("会员信息")
private MtUser userInfo;
@ApiModelProperty("订单号")
private String orderSn;
@ApiModelProperty("积分变化数量")
private Integer amount;
@ApiModelProperty("创建时间")
private Date createTime;
@ApiModelProperty("更新时间")
private Date updateTime;
@ApiModelProperty("备注说明")
private String description;
@ApiModelProperty("最后操作人")
private String operator;
@ApiModelProperty("状态A正常D删除")
private String status;
}

View File

@ -0,0 +1,25 @@
package com.fuint.common.dto;
import io.swagger.annotations.ApiModelProperty;
import lombok.Getter;
import lombok.Setter;
import java.io.Serializable;
/**
* 预存规则实体类
*
* Created by FSQ
* CopyRight https://www.fuint.cn
*/
@Getter
@Setter
public class PreStoreRuleDto implements Serializable {
@ApiModelProperty("预存金额")
private String preStoreAmount;
@ApiModelProperty("目标金额")
private String targetAmount;
}

View File

@ -0,0 +1,25 @@
package com.fuint.common.dto;
import io.swagger.annotations.ApiModelProperty;
import lombok.Getter;
import lombok.Setter;
import java.io.Serializable;
/**
* 充值规则实体类
*
* Created by FSQ
* CopyRight https://www.fuint.cn
*/
@Getter
@Setter
public class RechargeRuleDto implements Serializable {
@ApiModelProperty("充值金额")
private String rechargeAmount;
@ApiModelProperty("赠送金额")
private String giveAmount;
}

View File

@ -0,0 +1,85 @@
package com.fuint.common.dto;
import io.swagger.annotations.ApiModelProperty;
import lombok.Getter;
import lombok.Setter;
import java.io.Serializable;
import java.math.BigDecimal;
import java.util.List;
/**
* 售后实体类
*/
@Getter
@Setter
public class RefundDto implements Serializable {
@ApiModelProperty("自增ID")
private Integer id;
@ApiModelProperty("订单ID")
private Integer orderId;
@ApiModelProperty("商户ID")
private Integer merchantId;
@ApiModelProperty("店铺ID")
private Integer storeId;
@ApiModelProperty("退款金额")
private BigDecimal amount;
@ApiModelProperty("售后类型")
private String type;
@ApiModelProperty("会员ID")
private Integer userId;
@ApiModelProperty("用户备注")
private String remark;
@ApiModelProperty("申请凭证图片")
private List<String> imageList;
@ApiModelProperty("申请凭证图片")
private String images;
@ApiModelProperty("最后操作人")
private String operator;
@ApiModelProperty("订单详情")
private UserOrderDto orderInfo;
@ApiModelProperty("退货地址")
private AddressDto address;
@ApiModelProperty("创建时间")
private String createTime;
@ApiModelProperty("更新时间")
private String updateTime;
@ApiModelProperty("状态")
private String status;
@ApiModelProperty("状态说明")
private String statusText;
@ApiModelProperty("申请人")
private String applicant;
@ApiModelProperty("驳回原因")
private String rejectReason;
@ApiModelProperty("订单号")
private String orderSn;
@ApiModelProperty("订单用户信息")
private UserDto userInfo;
@ApiModelProperty("店铺信息")
private StoreDto storeInfo;
}

View File

@ -0,0 +1,41 @@
package com.fuint.common.dto;
import io.swagger.annotations.ApiModelProperty;
import lombok.Getter;
import lombok.Setter;
import java.io.Serializable;
import java.util.List;
/**
* 地区实体类
*
* Created by FSQ
* CopyRight https://www.fuint.cn
*/
@Getter
@Setter
public class RegionDto implements Serializable {
@ApiModelProperty("自增ID")
private Integer id;
@ApiModelProperty("名称")
private String name;
@ApiModelProperty("父ID")
private Integer pid;
@ApiModelProperty("编码")
private String code;
@ApiModelProperty("层级")
private String level;
@ApiModelProperty("城市")
private List<RegionDto> city;
@ApiModelProperty("区域")
private List<RegionDto> region;
}

View File

@ -0,0 +1,119 @@
package com.fuint.common.dto;
import io.swagger.annotations.ApiModelProperty;
import lombok.Getter;
import lombok.Setter;
import java.io.Serializable;
import java.math.BigDecimal;
/**
* 卡券请求DTO
*
* Created by FSQ
* CopyRight https://www.fuint.cn
*/
@Getter
@Setter
public class ReqCouponDto implements Serializable {
@ApiModelProperty("卡券ID")
private Integer id;
@ApiModelProperty("商户ID")
private Integer merchantId;
@ApiModelProperty("店铺ID")
private Integer storeId;
@ApiModelProperty("分组ID")
private Integer groupId;
@ApiModelProperty("类型")
private String type;
@ApiModelProperty("名称")
private String name;
@ApiModelProperty("是否允许转赠")
private Integer isGive;
@ApiModelProperty("获得卡券所消耗积分")
private Integer point;
@ApiModelProperty("获得计次卡卡所消耗积分")
private Integer timerPoint;
@ApiModelProperty("领取码")
private String receiveCode;
@ApiModelProperty("使用专项")
private String useFor;
@ApiModelProperty("过期类型")
private String expireType;
@ApiModelProperty("有效天数")
private Integer expireTime;
@ApiModelProperty("计次卡领取码")
private String timerReceiveCode;
@ApiModelProperty("有效期开始时间")
private String beginTime;
@ApiModelProperty("有效期结束时间")
private String endTime;
@ApiModelProperty("价值金额")
private BigDecimal amount;
@ApiModelProperty("发放方式")
private String sendWay;
@ApiModelProperty("适用商品")
private String applyGoods;
@ApiModelProperty("每次发放数量")
private Integer sendNum;
@ApiModelProperty("发行总数量")
private Integer total;
@ApiModelProperty("每人最多拥有数量")
private Integer limitNum;
@ApiModelProperty("例外时间")
private String exceptTime;
@ApiModelProperty("适用店铺ID逗号分隔")
private String storeIds;
@ApiModelProperty("会员等级ID逗号分隔")
private String gradeIds;
@ApiModelProperty("适用商品")
private String goodsIds;
@ApiModelProperty("后台备注")
private String remarks;
@ApiModelProperty("图片")
private String image;
@ApiModelProperty("备注")
private String description;
@ApiModelProperty("预存规则")
private String inRule;
@ApiModelProperty("核销规则")
private String outRule;
@ApiModelProperty("操作人")
private String operator;
@ApiModelProperty("状态")
private String status;
}

View File

@ -0,0 +1,46 @@
package com.fuint.common.dto;
import io.swagger.annotations.ApiModelProperty;
import lombok.Getter;
import lombok.Setter;
import java.io.Serializable;
import java.math.BigDecimal;
/**
* 卡券分组请求DTO
*
* Created by FSQ
* CopyRight https://www.fuint.cn
*/
@Getter
@Setter
public class ReqCouponGroupDto implements Serializable {
@ApiModelProperty("自增ID")
private Integer id;
@ApiModelProperty("商户ID")
private Integer merchantId;
@ApiModelProperty("店铺ID")
private Integer storeId;
@ApiModelProperty("分组名称")
private String name;
@ApiModelProperty("价值金额")
private BigDecimal money;
@ApiModelProperty("发行数量")
private Integer total;
@ApiModelProperty("分组描述")
private String description;
@ApiModelProperty("操作人")
private String operator;
@ApiModelProperty("状态")
private String status;
}

View File

@ -0,0 +1,31 @@
package com.fuint.common.dto;
import io.swagger.annotations.ApiModelProperty;
import lombok.Getter;
import lombok.Setter;
import java.io.Serializable;
import java.util.Map;
/**
* 请求返回结果
*
* Created by FSQ
* CopyRight https://www.fuint.cn
*/
@Getter
@Setter
public class ReqResult implements Serializable {
@ApiModelProperty("返回代码")
private String code;
@ApiModelProperty("返回消息")
private String msg;
@ApiModelProperty("返回结果")
private boolean result;
@ApiModelProperty("返回数据")
private Map<String, Object> data;
}

View File

@ -0,0 +1,68 @@
package com.fuint.common.dto;
import io.swagger.annotations.ApiModelProperty;
import lombok.Getter;
import lombok.Setter;
import java.io.Serializable;
import java.util.Date;
/**
* 发放卡券记录请求DTO
*
* Created by FSQ
* CopyRight https://www.fuint.cn
*/
@Getter
@Setter
public class ReqSendLogDto implements Serializable {
@ApiModelProperty("自增ID")
private Integer id;
@ApiModelProperty("商户ID")
private Integer merchantId;
@ApiModelProperty("店铺ID")
private Integer storeId;
@ApiModelProperty("类型1单用户发券2批量发券")
private Integer type;
@ApiModelProperty("会员ID")
private Integer userId;
@ApiModelProperty("导入文件名")
private String fileName;
@ApiModelProperty("导入文件路径")
private String filePath;
@ApiModelProperty("手机号")
private String mobile;
@ApiModelProperty("分组ID")
private Integer groupId;
@ApiModelProperty("卡券ID")
private Integer couponId;
@ApiModelProperty("分组名称")
private String groupName;
@ApiModelProperty("发放数量")
private Integer sendNum;
@ApiModelProperty("发放时间")
private Date createTime;
@ApiModelProperty("操作人")
private String operator;
@ApiModelProperty("状态")
private String status;
@ApiModelProperty("uuid")
private String uuid;
}

View File

@ -0,0 +1,52 @@
package com.fuint.common.dto;
import com.fuint.repository.model.MtGoods;
import io.swagger.annotations.ApiModelProperty;
import lombok.Getter;
import lombok.Setter;
import java.io.Serializable;
import java.math.BigDecimal;
import java.util.List;
/**
* 购物车返回DTO
*
* Created by FSQ
* CopyRight https://www.fuint.cn
*/
@Getter
@Setter
public class ResCartDto implements Serializable {
@ApiModelProperty("自增ID")
private Integer id;
@ApiModelProperty("会员ID")
private Integer userId;
@ApiModelProperty("商品ID")
private Integer goodsId;
@ApiModelProperty("skuId")
private Integer skuId;
@ApiModelProperty("数量")
private Integer num;
@ApiModelProperty("商品自定义价格")
private BigDecimal selfPrice;
@ApiModelProperty("预付金")
private BigDecimal prePayment;
@ApiModelProperty("是否有效")
private Boolean isEffect;
@ApiModelProperty("商品规格")
private List<GoodsSpecValueDto> specList;
@ApiModelProperty("商品数据")
private MtGoods goodsInfo;
}

View File

@ -0,0 +1,33 @@
package com.fuint.common.dto;
import com.fuint.repository.model.MtGoods;
import io.swagger.annotations.ApiModelProperty;
import lombok.Getter;
import lombok.Setter;
import java.io.Serializable;
import java.util.List;
/**
* 商品分类返回DTO
*
* Created by FSQ
* CopyRight https://www.fuint.cn
*/
@Getter
@Setter
public class ResCateDto implements Serializable {
@ApiModelProperty("分类ID")
private Integer cateId;
@ApiModelProperty("分类名称")
private String name;
@ApiModelProperty("logo")
private String logo;
@ApiModelProperty("商品列表")
private List<MtGoods> goodsList;
}

View File

@ -0,0 +1,35 @@
package com.fuint.common.dto;
import io.swagger.annotations.ApiModelProperty;
import lombok.Getter;
import lombok.Setter;
/**
* 角色信息实体类
*
* Created by FSQ
* CopyRight https://www.fuint.cn
*/
@Getter
@Setter
public class RoleDto {
@ApiModelProperty("账户主键ID")
private Long id;
@ApiModelProperty("商户ID")
private Integer merchantId;
@ApiModelProperty("名称")
private String name;
@ApiModelProperty("角色类型")
private String type;
@ApiModelProperty("备注")
private String description;
@ApiModelProperty("状态 : A有效 D无效")
private String status;
}

View File

@ -0,0 +1,60 @@
package com.fuint.common.dto;
import java.io.Serializable;
import java.math.BigDecimal;
import java.util.Date;
import com.fuint.framework.pagination.PaginationResponse;
import io.swagger.annotations.ApiModelProperty;
import lombok.Getter;
import lombok.Setter;
/**
* 结算实体类
*
* Created by FSQ
* CopyRight https://www.fuint.cn
*/
@Getter
@Setter
public class SettlementDto implements Serializable {
@ApiModelProperty("自增ID")
private Integer id;
@ApiModelProperty("结算单号")
private String settlementNo;
@ApiModelProperty("商户ID")
private Integer merchantId;
@ApiModelProperty("店铺ID")
private Integer storeId;
@ApiModelProperty("订单总金额")
private BigDecimal totalOrderAmount;
@ApiModelProperty("结算金额")
private BigDecimal amount;
@ApiModelProperty("结算订单")
private PaginationResponse<SettlementOrderDto> orderList;
@ApiModelProperty("创建时间")
private Date createTime;
@ApiModelProperty("更新时间")
private Date updateTime;
@ApiModelProperty("备注说明")
private String description;
@ApiModelProperty("最后操作人")
private String operator;
@ApiModelProperty("支付状态A待支付B已支付")
private String payStatus;
@ApiModelProperty("状态A正常D删除")
private String status;
}

View File

@ -0,0 +1,46 @@
package com.fuint.common.dto;
import java.io.Serializable;
import java.util.Date;
import io.swagger.annotations.ApiModelProperty;
import lombok.Getter;
import lombok.Setter;
/**
* 结算订单表
*
* Created by FSQ
* CopyRight https://www.fuint.cn
*/
@Getter
@Setter
public class SettlementOrderDto implements Serializable {
@ApiModelProperty("自增ID")
private Integer id;
@ApiModelProperty("结算ID")
private Integer settlementId;
@ApiModelProperty("订单ID")
private Integer orderId;
@ApiModelProperty("订单信息")
private UserOrderDto orderInfo;
@ApiModelProperty("创建时间")
private Date createTime;
@ApiModelProperty("更新时间")
private Date updateTime;
@ApiModelProperty("备注说明")
private String description;
@ApiModelProperty("最后操作人")
private String operator;
@ApiModelProperty("状态A正常D删除")
private String status;
}

View File

@ -0,0 +1,47 @@
package com.fuint.common.dto;
import io.swagger.annotations.ApiModelProperty;
import lombok.Getter;
import lombok.Setter;
import java.io.Serializable;
import java.util.Date;
/**
* 短信模板实体类
*
* Created by FSQ
* CopyRight https://www.fuint.cn
*/
@Getter
@Setter
public class SmsTemplateDto implements Serializable {
@ApiModelProperty("自增ID")
private Integer id;
@ApiModelProperty("商户ID")
private Integer merchantId;
@ApiModelProperty("模板名称")
private String name;
@ApiModelProperty("模板英文名称")
private String uname;
@ApiModelProperty("模板编码")
private String code;
@ApiModelProperty("模板内容")
private String content;
@ApiModelProperty("创建时间")
private Date createTime;
@ApiModelProperty("更新时间")
private Date updateTime;
@ApiModelProperty("状态1正常2删除")
private String status;
}

View File

@ -0,0 +1,70 @@
package com.fuint.common.dto;
import io.swagger.annotations.ApiModelProperty;
import lombok.Getter;
import lombok.Setter;
import java.io.Serializable;
import java.util.List;
/**
* 菜单信息实体
*/
@Getter
@Setter
public class SourceDto implements Serializable {
@ApiModelProperty("自增ID")
private long id;
@ApiModelProperty("商户ID")
private Integer merchantId;
@ApiModelProperty("菜单名称")
private String name;
@ApiModelProperty("菜单名称(字母)")
private String ename;
@ApiModelProperty("节点是否打开")
private Boolean open;
@ApiModelProperty("是否菜单")
private int isMenu;
@ApiModelProperty("节点是否选中")
private Boolean checked;
@ApiModelProperty("url")
private String url;
@ApiModelProperty("路径")
private String path;
@ApiModelProperty("权限标识")
private String perms;
@ApiModelProperty("菜单级别")
private int level;
@ApiModelProperty("上级菜单")
private long parentId;
@ApiModelProperty("子菜单")
private List<SourceDto> children;
@ApiModelProperty("图标")
private String icon;
@ApiModelProperty("新图标")
private String newIcon;
@ApiModelProperty("描述信息")
private String description;
@ApiModelProperty("排序")
private String sort;
@ApiModelProperty("状态")
private String status;
}

View File

@ -0,0 +1,109 @@
package com.fuint.common.dto;
import io.swagger.annotations.ApiModelProperty;
import lombok.Getter;
import lombok.Setter;
import java.io.Serializable;
import java.util.Date;
/**
* 店铺实体
*
* Created by FSQ
* CopyRight https://www.fuint.cn
* */
@Getter
@Setter
public class StoreDto implements Serializable {
@ApiModelProperty("自增ID")
private Integer id;
@ApiModelProperty("商户ID")
private Integer merchantId;
@ApiModelProperty("商户号")
private String merchantNo;
@ApiModelProperty("商户名称")
private String merchantName;
@ApiModelProperty("店铺名称")
private String name;
@ApiModelProperty("店铺二维码")
private String qrCode;
@ApiModelProperty("店铺LOGO")
private String logo;
@ApiModelProperty("是否默认店铺")
private String isDefault;
@ApiModelProperty("联系人")
private String contact;
@ApiModelProperty("联系电话")
private String phone;
@ApiModelProperty("店铺地址")
private String address;
@ApiModelProperty("营业时间")
private String hours;
@ApiModelProperty("经度")
private String latitude;
@ApiModelProperty("纬度")
private String longitude;
@ApiModelProperty("备注信息")
private String description;
@ApiModelProperty("微信商户号")
private String wxMchId;
@ApiModelProperty("微信支付秘钥")
private String wxApiV2;
@ApiModelProperty("微信支付证书")
private String wxCertPath;
@ApiModelProperty("支付宝appId")
private String alipayAppId;
@ApiModelProperty("支付宝应用私钥")
private String alipayPrivateKey;
@ApiModelProperty("支付宝支付公钥")
private String alipayPublicKey;
@ApiModelProperty("营业执照")
private String license;
@ApiModelProperty("统一社会信用代码")
private String creditCode;
@ApiModelProperty("银行名称")
private String bankName;
@ApiModelProperty("银行卡账户名")
private String bankCardName;
@ApiModelProperty("银行卡卡号")
private String bankCardNo;
@ApiModelProperty("创建时间")
private Date createTime;
@ApiModelProperty("更新时间")
private Date updateTime;
@ApiModelProperty("状态1正常2删除")
private String status;
@ApiModelProperty("最后操作人")
private String operator;
}

View File

@ -0,0 +1,37 @@
package com.fuint.common.dto;
import io.swagger.annotations.ApiModelProperty;
import lombok.Getter;
import lombok.Setter;
import java.io.Serializable;
import java.util.Date;
/**
* 店铺地点实体类
*/
@Getter
@Setter
public class StoreLocationDto implements Serializable {
@ApiModelProperty("自增ID")
private Integer id;
@ApiModelProperty("地点名称")
private String name;
@ApiModelProperty("备注信息")
private String content;
@ApiModelProperty("创建时间")
private Date createTime;
@ApiModelProperty("更新时间")
private Date updateTime;
@ApiModelProperty("更后操作人")
private String operator;
@ApiModelProperty("状态1正常2删除")
private String status;
}

View File

@ -0,0 +1,40 @@
package com.fuint.common.dto;
import io.swagger.annotations.ApiModelProperty;
import lombok.Getter;
import lombok.Setter;
import java.io.Serializable;
import java.util.List;
/**
* 小程序订阅消息dto
*
* Created by FSQ
* CopyRight https://www.fuint.cn
*/
@Getter
@Setter
public class SubMessageDto implements Serializable {
@ApiModelProperty("键值")
private String key;
@ApiModelProperty("模板ID")
private String templateId;
@ApiModelProperty("TID")
private String tid;
@ApiModelProperty("标题")
private String title;
@ApiModelProperty("内容")
private String content;
@ApiModelProperty("状态")
private String status;
@ApiModelProperty("模板参数")
private List<ParamDto> params;
}

View File

@ -0,0 +1,30 @@
package com.fuint.common.dto;
import io.swagger.annotations.ApiModelProperty;
import lombok.Getter;
import lombok.Setter;
import java.io.Serializable;
/**
* 登录Token实体
*
* Created by FSQ
* CopyRight https://www.fuint.cn
*/
@Getter
@Setter
public class TokenDto implements Serializable {
@ApiModelProperty("token")
private String token;
@ApiModelProperty("创建时间")
private Long tokenCreatedTime;
@ApiModelProperty("失效时间")
private Long tokenExpiryTime;
@ApiModelProperty("是否登录")
private String isLogin;
}

View File

@ -0,0 +1,76 @@
package com.fuint.common.dto;
import com.fuint.repository.model.MtConfirmLog;
import io.swagger.annotations.ApiModelProperty;
import lombok.Getter;
import lombok.Setter;
import java.io.Serializable;
import java.math.BigDecimal;
import java.util.List;
/**
* 我的卡券实体类
*
* Created by FSQ
* CopyRight https://www.fuint.cn
*/
@Getter
@Setter
public class UserCouponDto implements Serializable {
@ApiModelProperty("自增ID")
private Integer id;
@ApiModelProperty("卡券名称")
private String name;
@ApiModelProperty("卡券类型")
private String type;
@ApiModelProperty("状态")
private String status;
@ApiModelProperty("卡券ID")
private Integer couponId;
@ApiModelProperty("使用规则")
private String useRule;
@ApiModelProperty("核销编码")
private String code;
@ApiModelProperty("二维码")
private String qrCode;
@ApiModelProperty("图片")
private String image;
@ApiModelProperty("面额")
private BigDecimal amount;
@ApiModelProperty("是否允许转赠")
private Boolean isGive;
@ApiModelProperty("余额")
private BigDecimal balance;
@ApiModelProperty("核销次数")
private Integer confirmCount;
@ApiModelProperty("核销记录")
private List<MtConfirmLog> confirmLogs;
@ApiModelProperty("是否可用(过期、状态等)")
private boolean canUse;
@ApiModelProperty("有效期")
private String effectiveDate;
@ApiModelProperty("提示信息")
private String tips;
@ApiModelProperty("描述信息")
private String description;
}

View File

@ -0,0 +1,114 @@
package com.fuint.common.dto;
import java.io.Serializable;
import java.math.BigDecimal;
import java.util.Date;
import com.fasterxml.jackson.annotation.JsonFormat;
import io.swagger.annotations.ApiModelProperty;
import lombok.Getter;
import lombok.Setter;
/**
* 会员个人信息
*/
@Getter
@Setter
public class UserDto implements Serializable {
@ApiModelProperty("会员ID")
private Integer id;
@ApiModelProperty("会员号")
private String userNo;
@ApiModelProperty("头像")
private String avatar;
@ApiModelProperty("称呼")
private String name;
@ApiModelProperty("是否设置密码")
private String hasPassword;
@ApiModelProperty("分组ID")
private Integer groupId;
@ApiModelProperty("分组信息")
private UserGroupDto groupInfo;
@ApiModelProperty("微信open_id")
private String openId;
@ApiModelProperty("手机号码")
private String mobile;
@ApiModelProperty("证件号码")
private String idcard;
@ApiModelProperty("等级ID")
private String gradeId;
@ApiModelProperty("等级名称")
private String gradeName;
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
@ApiModelProperty("会员开始时间")
private Date startTime;
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
@ApiModelProperty("会员结束时间")
private Date endTime;
@ApiModelProperty("余额")
private BigDecimal balance;
@ApiModelProperty("积分")
private Integer point;
@ApiModelProperty("性别 1男0女")
private Integer sex;
@ApiModelProperty("出生日期")
private String birthday;
@ApiModelProperty("车牌号")
private String carNo;
@ApiModelProperty("来源渠道")
private String source;
@ApiModelProperty("地址")
private String address;
@ApiModelProperty("所属商户ID")
private Integer merchantId;
@ApiModelProperty("所属商户名称")
private String merchantName;
@ApiModelProperty("默认店铺ID")
private Integer storeId;
@ApiModelProperty("默认店铺名称")
private String storeName;
@ApiModelProperty("创建时间")
private Date createTime;
@ApiModelProperty("更新时间")
private Date updateTime;
@ApiModelProperty("最近登录时间")
private String lastLoginTime;
@ApiModelProperty("状态A激活N禁用D删除")
private String status;
@ApiModelProperty("备注信息")
private String description;
@ApiModelProperty("最后操作人")
private String operator;
}

View File

@ -0,0 +1,56 @@
package com.fuint.common.dto;
import java.io.Serializable;
import java.util.Date;
import java.util.List;
import io.swagger.annotations.ApiModelProperty;
import lombok.Getter;
import lombok.Setter;
/**
* 会员分组
*
* Created by FSQ
* CopyRight https://www.fuint.cn
*/
@Getter
@Setter
public class UserGroupDto implements Serializable {
@ApiModelProperty("分组ID")
private Integer id;
@ApiModelProperty("分组名称")
private String name;
@ApiModelProperty("所属商户ID")
private Integer merchantId;
@ApiModelProperty("默认店铺")
private Integer storeId;
@ApiModelProperty("父ID")
private Integer parentId;
@ApiModelProperty("子分组")
private List<UserGroupDto> children;
@ApiModelProperty("会员数量")
private Long memberNum;
@ApiModelProperty("创建时间")
private Date createTime;
@ApiModelProperty("更新时间")
private Date updateTime;
@ApiModelProperty("状态A激活N禁用D删除")
private String status;
@ApiModelProperty("备注信息")
private String description;
@ApiModelProperty("最后操作人")
private String operator;
}

View File

@ -0,0 +1,22 @@
package com.fuint.common.dto;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import java.io.Serializable;
/**
* 会员登录信息实体类
*
* Created by FSQ
* CopyRight https://www.fuint.cn
*/
@Data
public class UserInfo implements Serializable {
@ApiModelProperty("会员ID")
private Integer id;
@ApiModelProperty("登录Token")
private String token;
}

View File

@ -0,0 +1,137 @@
package com.fuint.common.dto;
import com.fuint.repository.model.MtRefund;
import com.fuint.repository.model.MtStore;
import io.swagger.annotations.ApiModelProperty;
import lombok.Getter;
import lombok.Setter;
import java.io.Serializable;
import java.math.BigDecimal;
import java.util.List;
/**
* 会员订单实体类
*
* Created by FSQ
* CopyRight https://www.fuint.cn
*/
@Getter
@Setter
public class UserOrderDto implements Serializable {
@ApiModelProperty("自增ID")
private Integer id;
@ApiModelProperty("商户ID")
private Integer merchantId;
@ApiModelProperty("订单号")
private String orderSn;
@ApiModelProperty("订单类型")
private String type;
@ApiModelProperty("订单类型名称")
private String typeName;
@ApiModelProperty("支付类型")
private String payType;
@ApiModelProperty("订单模式")
private String orderMode;
@ApiModelProperty("是否核销")
private Boolean isVerify;
@ApiModelProperty("卡券ID")
private Integer couponId;
@ApiModelProperty("会员ID")
private Integer userId;
@ApiModelProperty("是否游客")
private String isVisitor;
@ApiModelProperty("核销码")
private String verifyCode;
@ApiModelProperty("员工ID")
private Integer staffId;
@ApiModelProperty("总金额")
private BigDecimal amount;
@ApiModelProperty("支付金额")
private BigDecimal payAmount;
@ApiModelProperty("优惠金额")
private BigDecimal discount;
@ApiModelProperty("配送费用")
private BigDecimal deliveryFee;
@ApiModelProperty("使用积分")
private Integer usePoint;
@ApiModelProperty("积分金额")
private BigDecimal pointAmount;
@ApiModelProperty("订单参数")
private String param;
@ApiModelProperty("备注信息")
private String remark;
@ApiModelProperty("创建时间")
private String createTime;
@ApiModelProperty("更新时间")
private String updateTime;
@ApiModelProperty("支付时间")
private String payTime;
@ApiModelProperty("订单状态")
private String status;
@ApiModelProperty("支付状态")
private String payStatus;
@ApiModelProperty(value="结算状态")
private String settleStatus;
@ApiModelProperty("状态说明")
private String statusText;
@ApiModelProperty("最后操作人")
private String operator;
@ApiModelProperty("订单商品列表")
private List<OrderGoodsDto> goods;
@ApiModelProperty("下单用户信息")
private OrderUserDto userInfo;
@ApiModelProperty("配送地址")
private AddressDto address;
@ApiModelProperty("物流信息")
private ExpressDto expressInfo;
@ApiModelProperty("所属店铺信息")
private MtStore storeInfo;
@ApiModelProperty("售后订单")
private MtRefund refundInfo;
@ApiModelProperty("使用卡券")
private UserCouponDto couponInfo;
@ApiModelProperty("收银地点ID")
private Integer storeLocationId;
@ApiModelProperty("订单预付金")
private BigDecimal prePayment;
}

View File

@ -0,0 +1,77 @@
package com.fuint.common.enums;
/**
* 后台角色枚举
*
* Created by FSQ
* CopyRight https://www.fuint.cn
*/
public enum AdminRoleEnum {
ADMIN("1", "超级管理员","admin"),
COMMON("2", "普通管理员","common"),
USER("3", "用户角色","user");
private String key;
private String name;
private String value;
AdminRoleEnum(String key, String name, String value) {
this.key = key;
this.name = name;
this.value = value;
}
public String getKey() {
return key;
}
public void setKey(String key) {
this.key = key;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getValue() {
return value;
}
public void setValue(String value) {
this.value = value;
}
// 普通方法通过key获取value
public static String getValue(String k) {
for (AdminRoleEnum c : AdminRoleEnum.values()) {
if (c.getKey().equals(k)) {
return c.getValue();
}
}
return null;
}
// 普通方法通过key获取name
public static String getName(String k) {
for (AdminRoleEnum c : AdminRoleEnum.values()) {
if (c.getKey().equals(k)) {
return c.getName();
}
}
return null;
}
// 普通方法通过Value获取key
public static String getKey(String v) {
for (AdminRoleEnum c : AdminRoleEnum.values()) {
if (c.getValue() == v) {
return c.getKey();
}
}
return null;
}
}

View File

@ -0,0 +1,57 @@
package com.fuint.common.enums;
/**
* 卡券适用商品
*
* Created by FSQ
* CopyRight https://www.fuint.cn
*/
public enum ApplyGoodsEnum {
ALL_GOODS("allGoods", "全场通用"),
PARK_GOODS("parkGoods", "指定商品");
private String key;
private String value;
ApplyGoodsEnum(String key, String value) {
this.key = key;
this.value = value;
}
public String getKey() {
return key;
}
public void setKey(String key) {
this.key = key;
}
public String getValue() {
return value;
}
public void setValue(String value) {
this.value = value;
}
// 普通方法通过key获取value
public static String getValue(String k) {
for (ApplyGoodsEnum c : ApplyGoodsEnum.values()) {
if (c.getKey().equals(k)) {
return c.getValue();
}
}
return null;
}
// 普通方法通过Value获取key
public static String getKey(String v) {
for (ApplyGoodsEnum c : ApplyGoodsEnum.values()) {
if (c.getValue() == v) {
return c.getKey();
}
}
return null;
}
}

View File

@ -0,0 +1,57 @@
package com.fuint.common.enums;
/**
* 充值配置项枚举
*
* Created by FSQ
* CopyRight https://www.fuint.cn
*/
public enum BalanceSettingEnum {
RECHARGE_RULE("rechargeRule", "充值规则"),
RECHARGE_REMARK("rechargeRemark", "充值说明");
private String key;
private String value;
BalanceSettingEnum(String key, String value) {
this.key = key;
this.value = value;
}
public String getKey() {
return key;
}
public void setKey(String key) {
this.key = key;
}
public String getValue() {
return value;
}
public void setValue(String value) {
this.value = value;
}
// 普通方法通过key获取value
public static String getValue(String k) {
for (BalanceSettingEnum c : BalanceSettingEnum.values()) {
if (c.getKey().equals(k)) {
return c.getValue();
}
}
return null;
}
// 普通方法通过Value获取key
public static String getKey(String v) {
for (BalanceSettingEnum c : BalanceSettingEnum.values()) {
if (c.getValue() == v) {
return c.getKey();
}
}
return null;
}
}

View File

@ -0,0 +1,37 @@
package com.fuint.common.enums;
/**
* 分佣状态
*
* Created by FSQ
* CopyRight https://www.fuint.cn
*/
public enum CommissionStatusEnum {
NORMAL("A", "正常"),
CANCEL("N", "作废");
private String key;
private String value;
CommissionStatusEnum(String key, String value) {
this.key = key;
this.value = value;
}
public String getKey() {
return key;
}
public void setKey(String key) {
this.key = key;
}
public String getValue() {
return value;
}
public void setValue(String value) {
this.value = value;
}
}

View File

@ -0,0 +1,37 @@
package com.fuint.common.enums;
/**
* 分佣对象枚举
*
* Created by FSQ
* CopyRight https://www.fuint.cn
*/
public enum CommissionTargetEnum {
MEMBER("member", "会员分销"),
STAFF("staff", "员工提成");
private String key;
private String value;
CommissionTargetEnum(String key, String value) {
this.key = key;
this.value = value;
}
public String getKey() {
return key;
}
public void setKey(String key) {
this.key = key;
}
public String getValue() {
return value;
}
public void setValue(String value) {
this.value = value;
}
}

View File

@ -0,0 +1,40 @@
package com.fuint.common.enums;
/**
* 卡券内容枚举
*
* Created by FSQ
* CopyRight https://www.fuint.cn
*/
public enum CouponContentEnum {
ROOM("1", "房间"),
ROOM_BTEAKFAST("2", "房间+早餐"),
MEALS("3", "餐食"),
WASH("4", "洗衣"),
HEALTH("5", "康乐");
private String key;
private String value;
CouponContentEnum(String key, String value) {
this.key = key;
this.value = value;
}
public String getKey() {
return key;
}
public void setKey(String key) {
this.key = key;
}
public String getValue() {
return value;
}
public void setValue(String value) {
this.value = value;
}
}

View File

@ -0,0 +1,37 @@
package com.fuint.common.enums;
/**
* 卡券过期类型枚举
*
* Created by FSQ
* CopyRight https://www.fuint.cn
*/
public enum CouponExpireTypeEnum {
FIX("fix", "固定期限"),
FLEX("flex", "领取后生效");
private String key;
private String value;
CouponExpireTypeEnum(String key, String value) {
this.key = key;
this.value = value;
}
public String getKey() {
return key;
}
public void setKey(String key) {
this.key = key;
}
public String getValue() {
return value;
}
public void setValue(String value) {
this.value = value;
}
}

Some files were not shown because too many files have changed in this diff Show More