diff --git a/.jpb/persistence-units.xml b/.jpb/persistence-units.xml
new file mode 100644
index 00000000..85dbf08a
--- /dev/null
+++ b/.jpb/persistence-units.xml
@@ -0,0 +1,12 @@
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/LICENSE b/LICENSE
index 261eeb9e..94a9ed02 100644
--- a/LICENSE
+++ b/LICENSE
@@ -1,201 +1,674 @@
- Apache License
- Version 2.0, January 2004
- http://www.apache.org/licenses/
-
- TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
-
- 1. Definitions.
-
- "License" shall mean the terms and conditions for use, reproduction,
- and distribution as defined by Sections 1 through 9 of this document.
-
- "Licensor" shall mean the copyright owner or entity authorized by
- the copyright owner that is granting the License.
-
- "Legal Entity" shall mean the union of the acting entity and all
- other entities that control, are controlled by, or are under common
- control with that entity. For the purposes of this definition,
- "control" means (i) the power, direct or indirect, to cause the
- direction or management of such entity, whether by contract or
- otherwise, or (ii) ownership of fifty percent (50%) or more of the
- outstanding shares, or (iii) beneficial ownership of such entity.
-
- "You" (or "Your") shall mean an individual or Legal Entity
- exercising permissions granted by this License.
-
- "Source" form shall mean the preferred form for making modifications,
- including but not limited to software source code, documentation
- source, and configuration files.
-
- "Object" form shall mean any form resulting from mechanical
- transformation or translation of a Source form, including but
- not limited to compiled object code, generated documentation,
- and conversions to other media types.
-
- "Work" shall mean the work of authorship, whether in Source or
- Object form, made available under the License, as indicated by a
- copyright notice that is included in or attached to the work
- (an example is provided in the Appendix below).
-
- "Derivative Works" shall mean any work, whether in Source or Object
- form, that is based on (or derived from) the Work and for which the
- editorial revisions, annotations, elaborations, or other modifications
- represent, as a whole, an original work of authorship. For the purposes
- of this License, Derivative Works shall not include works that remain
- separable from, or merely link (or bind by name) to the interfaces of,
- the Work and Derivative Works thereof.
-
- "Contribution" shall mean any work of authorship, including
- the original version of the Work and any modifications or additions
- to that Work or Derivative Works thereof, that is intentionally
- submitted to Licensor for inclusion in the Work by the copyright owner
- or by an individual or Legal Entity authorized to submit on behalf of
- the copyright owner. For the purposes of this definition, "submitted"
- means any form of electronic, verbal, or written communication sent
- to the Licensor or its representatives, including but not limited to
- communication on electronic mailing lists, source code control systems,
- and issue tracking systems that are managed by, or on behalf of, the
- Licensor for the purpose of discussing and improving the Work, but
- excluding communication that is conspicuously marked or otherwise
- designated in writing by the copyright owner as "Not a Contribution."
-
- "Contributor" shall mean Licensor and any individual or Legal Entity
- on behalf of whom a Contribution has been received by Licensor and
- subsequently incorporated within the Work.
-
- 2. Grant of Copyright License. Subject to the terms and conditions of
- this License, each Contributor hereby grants to You a perpetual,
- worldwide, non-exclusive, no-charge, royalty-free, irrevocable
- copyright license to reproduce, prepare Derivative Works of,
- publicly display, publicly perform, sublicense, and distribute the
- Work and such Derivative Works in Source or Object form.
-
- 3. Grant of Patent License. Subject to the terms and conditions of
- this License, each Contributor hereby grants to You a perpetual,
- worldwide, non-exclusive, no-charge, royalty-free, irrevocable
- (except as stated in this section) patent license to make, have made,
- use, offer to sell, sell, import, and otherwise transfer the Work,
- where such license applies only to those patent claims licensable
- by such Contributor that are necessarily infringed by their
- Contribution(s) alone or by combination of their Contribution(s)
- with the Work to which such Contribution(s) was submitted. If You
- institute patent litigation against any entity (including a
- cross-claim or counterclaim in a lawsuit) alleging that the Work
- or a Contribution incorporated within the Work constitutes direct
- or contributory patent infringement, then any patent licenses
- granted to You under this License for that Work shall terminate
- as of the date such litigation is filed.
-
- 4. Redistribution. You may reproduce and distribute copies of the
- Work or Derivative Works thereof in any medium, with or without
- modifications, and in Source or Object form, provided that You
- meet the following conditions:
-
- (a) You must give any other recipients of the Work or
- Derivative Works a copy of this License; and
-
- (b) You must cause any modified files to carry prominent notices
- stating that You changed the files; and
-
- (c) You must retain, in the Source form of any Derivative Works
- that You distribute, all copyright, patent, trademark, and
- attribution notices from the Source form of the Work,
- excluding those notices that do not pertain to any part of
- the Derivative Works; and
-
- (d) If the Work includes a "NOTICE" text file as part of its
- distribution, then any Derivative Works that You distribute must
- include a readable copy of the attribution notices contained
- within such NOTICE file, excluding those notices that do not
- pertain to any part of the Derivative Works, in at least one
- of the following places: within a NOTICE text file distributed
- as part of the Derivative Works; within the Source form or
- documentation, if provided along with the Derivative Works; or,
- within a display generated by the Derivative Works, if and
- wherever such third-party notices normally appear. The contents
- of the NOTICE file are for informational purposes only and
- do not modify the License. You may add Your own attribution
- notices within Derivative Works that You distribute, alongside
- or as an addendum to the NOTICE text from the Work, provided
- that such additional attribution notices cannot be construed
- as modifying the License.
-
- You may add Your own copyright statement to Your modifications and
- may provide additional or different license terms and conditions
- for use, reproduction, or distribution of Your modifications, or
- for any such Derivative Works as a whole, provided Your use,
- reproduction, and distribution of the Work otherwise complies with
- the conditions stated in this License.
-
- 5. Submission of Contributions. Unless You explicitly state otherwise,
- any Contribution intentionally submitted for inclusion in the Work
- by You to the Licensor shall be under the terms and conditions of
- this License, without any additional terms or conditions.
- Notwithstanding the above, nothing herein shall supersede or modify
- the terms of any separate license agreement you may have executed
- with Licensor regarding such Contributions.
-
- 6. Trademarks. This License does not grant permission to use the trade
- names, trademarks, service marks, or product names of the Licensor,
- except as required for reasonable and customary use in describing the
- origin of the Work and reproducing the content of the NOTICE file.
-
- 7. Disclaimer of Warranty. Unless required by applicable law or
- agreed to in writing, Licensor provides the Work (and each
- Contributor provides its Contributions) on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
- implied, including, without limitation, any warranties or conditions
- of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
- PARTICULAR PURPOSE. You are solely responsible for determining the
- appropriateness of using or redistributing the Work and assume any
- risks associated with Your exercise of permissions under this License.
-
- 8. Limitation of Liability. In no event and under no legal theory,
- whether in tort (including negligence), contract, or otherwise,
- unless required by applicable law (such as deliberate and grossly
- negligent acts) or agreed to in writing, shall any Contributor be
- liable to You for damages, including any direct, indirect, special,
- incidental, or consequential damages of any character arising as a
- result of this License or out of the use or inability to use the
- Work (including but not limited to damages for loss of goodwill,
- work stoppage, computer failure or malfunction, or any and all
- other commercial damages or losses), even if such Contributor
- has been advised of the possibility of such damages.
-
- 9. Accepting Warranty or Additional Liability. While redistributing
- the Work or Derivative Works thereof, You may choose to offer,
- and charge a fee for, acceptance of support, warranty, indemnity,
- or other liability obligations and/or rights consistent with this
- License. However, in accepting such obligations, You may act only
- on Your own behalf and on Your sole responsibility, not on behalf
- of any other Contributor, and only if You agree to indemnify,
- defend, and hold each Contributor harmless for any liability
- incurred by, or claims asserted against, such Contributor by reason
- of your accepting any such warranty or additional liability.
-
- END OF TERMS AND CONDITIONS
-
- APPENDIX: How to apply the Apache License to your work.
-
- To apply the Apache License to your work, attach the following
- boilerplate notice, with the fields enclosed by brackets "[]"
- replaced with your own identifying information. (Don't include
- the brackets!) The text should be enclosed in the appropriate
- comment syntax for the file format. We also recommend that a
- file or class name and description of purpose be included on the
- same "printed page" as the copyright notice for easier
- identification within third-party archives.
-
- Copyright [yyyy] [name of copyright owner]
-
- Licensed under the Apache License, Version 2.0 (the "License");
- you may not use this file except in compliance with the License.
- You may obtain a copy of the License at
-
- http://www.apache.org/licenses/LICENSE-2.0
-
- Unless required by applicable law or agreed to in writing, software
- distributed under the License is distributed on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- See the License for the specific language governing permissions and
- limitations under the License.
+ GNU GENERAL PUBLIC LICENSE
+ Version 3, 29 June 2007
+
+ Copyright (C) 2007 Free Software Foundation, Inc.
+ Everyone is permitted to copy and distribute verbatim copies
+ of this license document, but changing it is not allowed.
+
+ Preamble
+
+ The GNU General Public License is a free, copyleft license for
+software and other kinds of works.
+
+ The licenses for most software and other practical works are designed
+to take away your freedom to share and change the works. By contrast,
+the GNU General Public License is intended to guarantee your freedom to
+share and change all versions of a program--to make sure it remains free
+software for all its users. We, the Free Software Foundation, use the
+GNU General Public License for most of our software; it applies also to
+any other work released this way by its authors. You can apply it to
+your programs, too.
+
+ When we speak of free software, we are referring to freedom, not
+price. Our General Public Licenses are designed to make sure that you
+have the freedom to distribute copies of free software (and charge for
+them if you wish), that you receive source code or can get it if you
+want it, that you can change the software or use pieces of it in new
+free programs, and that you know you can do these things.
+
+ To protect your rights, we need to prevent others from denying you
+these rights or asking you to surrender the rights. Therefore, you have
+certain responsibilities if you distribute copies of the software, or if
+you modify it: responsibilities to respect the freedom of others.
+
+ For example, if you distribute copies of such a program, whether
+gratis or for a fee, you must pass on to the recipients the same
+freedoms that you received. You must make sure that they, too, receive
+or can get the source code. And you must show them these terms so they
+know their rights.
+
+ Developers that use the GNU GPL protect your rights with two steps:
+(1) assert copyright on the software, and (2) offer you this License
+giving you legal permission to copy, distribute and/or modify it.
+
+ For the developers' and authors' protection, the GPL clearly explains
+that there is no warranty for this free software. For both users' and
+authors' sake, the GPL requires that modified versions be marked as
+changed, so that their problems will not be attributed erroneously to
+authors of previous versions.
+
+ Some devices are designed to deny users access to install or run
+modified versions of the software inside them, although the manufacturer
+can do so. This is fundamentally incompatible with the aim of
+protecting users' freedom to change the software. The systematic
+pattern of such abuse occurs in the area of products for individuals to
+use, which is precisely where it is most unacceptable. Therefore, we
+have designed this version of the GPL to prohibit the practice for those
+products. If such problems arise substantially in other domains, we
+stand ready to extend this provision to those domains in future versions
+of the GPL, as needed to protect the freedom of users.
+
+ Finally, every program is threatened constantly by software patents.
+States should not allow patents to restrict development and use of
+software on general-purpose computers, but in those that do, we wish to
+avoid the special danger that patents applied to a free program could
+make it effectively proprietary. To prevent this, the GPL assures that
+patents cannot be used to render the program non-free.
+
+ The precise terms and conditions for copying, distribution and
+modification follow.
+
+ TERMS AND CONDITIONS
+
+ 0. Definitions.
+
+ "This License" refers to version 3 of the GNU General Public License.
+
+ "Copyright" also means copyright-like laws that apply to other kinds of
+works, such as semiconductor masks.
+
+ "The Program" refers to any copyrightable work licensed under this
+License. Each licensee is addressed as "you". "Licensees" and
+"recipients" may be individuals or organizations.
+
+ To "modify" a work means to copy from or adapt all or part of the work
+in a fashion requiring copyright permission, other than the making of an
+exact copy. The resulting work is called a "modified version" of the
+earlier work or a work "based on" the earlier work.
+
+ A "covered work" means either the unmodified Program or a work based
+on the Program.
+
+ To "propagate" a work means to do anything with it that, without
+permission, would make you directly or secondarily liable for
+infringement under applicable copyright law, except executing it on a
+computer or modifying a private copy. Propagation includes copying,
+distribution (with or without modification), making available to the
+public, and in some countries other activities as well.
+
+ To "convey" a work means any kind of propagation that enables other
+parties to make or receive copies. Mere interaction with a user through
+a computer network, with no transfer of a copy, is not conveying.
+
+ An interactive user interface displays "Appropriate Legal Notices"
+to the extent that it includes a convenient and prominently visible
+feature that (1) displays an appropriate copyright notice, and (2)
+tells the user that there is no warranty for the work (except to the
+extent that warranties are provided), that licensees may convey the
+work under this License, and how to view a copy of this License. If
+the interface presents a list of user commands or options, such as a
+menu, a prominent item in the list meets this criterion.
+
+ 1. Source Code.
+
+ The "source code" for a work means the preferred form of the work
+for making modifications to it. "Object code" means any non-source
+form of a work.
+
+ A "Standard Interface" means an interface that either is an official
+standard defined by a recognized standards body, or, in the case of
+interfaces specified for a particular programming language, one that
+is widely used among developers working in that language.
+
+ The "System Libraries" of an executable work include anything, other
+than the work as a whole, that (a) is included in the normal form of
+packaging a Major Component, but which is not part of that Major
+Component, and (b) serves only to enable use of the work with that
+Major Component, or to implement a Standard Interface for which an
+implementation is available to the public in source code form. A
+"Major Component", in this context, means a major essential component
+(kernel, window system, and so on) of the specific operating system
+(if any) on which the executable work runs, or a compiler used to
+produce the work, or an object code interpreter used to run it.
+
+ The "Corresponding Source" for a work in object code form means all
+the source code needed to generate, install, and (for an executable
+work) run the object code and to modify the work, including scripts to
+control those activities. However, it does not include the work's
+System Libraries, or general-purpose tools or generally available free
+programs which are used unmodified in performing those activities but
+which are not part of the work. For example, Corresponding Source
+includes interface definition files associated with source files for
+the work, and the source code for shared libraries and dynamically
+linked subprograms that the work is specifically designed to require,
+such as by intimate data communication or control flow between those
+subprograms and other parts of the work.
+
+ The Corresponding Source need not include anything that users
+can regenerate automatically from other parts of the Corresponding
+Source.
+
+ The Corresponding Source for a work in source code form is that
+same work.
+
+ 2. Basic Permissions.
+
+ All rights granted under this License are granted for the term of
+copyright on the Program, and are irrevocable provided the stated
+conditions are met. This License explicitly affirms your unlimited
+permission to run the unmodified Program. The output from running a
+covered work is covered by this License only if the output, given its
+content, constitutes a covered work. This License acknowledges your
+rights of fair use or other equivalent, as provided by copyright law.
+
+ You may make, run and propagate covered works that you do not
+convey, without conditions so long as your license otherwise remains
+in force. You may convey covered works to others for the sole purpose
+of having them make modifications exclusively for you, or provide you
+with facilities for running those works, provided that you comply with
+the terms of this License in conveying all material for which you do
+not control copyright. Those thus making or running the covered works
+for you must do so exclusively on your behalf, under your direction
+and control, on terms that prohibit them from making any copies of
+your copyrighted material outside their relationship with you.
+
+ Conveying under any other circumstances is permitted solely under
+the conditions stated below. Sublicensing is not allowed; section 10
+makes it unnecessary.
+
+ 3. Protecting Users' Legal Rights From Anti-Circumvention Law.
+
+ No covered work shall be deemed part of an effective technological
+measure under any applicable law fulfilling obligations under article
+11 of the WIPO copyright treaty adopted on 20 December 1996, or
+similar laws prohibiting or restricting circumvention of such
+measures.
+
+ When you convey a covered work, you waive any legal power to forbid
+circumvention of technological measures to the extent such circumvention
+is effected by exercising rights under this License with respect to
+the covered work, and you disclaim any intention to limit operation or
+modification of the work as a means of enforcing, against the work's
+users, your or third parties' legal rights to forbid circumvention of
+technological measures.
+
+ 4. Conveying Verbatim Copies.
+
+ You may convey verbatim copies of the Program's source code as you
+receive it, in any medium, provided that you conspicuously and
+appropriately publish on each copy an appropriate copyright notice;
+keep intact all notices stating that this License and any
+non-permissive terms added in accord with section 7 apply to the code;
+keep intact all notices of the absence of any warranty; and give all
+recipients a copy of this License along with the Program.
+
+ You may charge any price or no price for each copy that you convey,
+and you may offer support or warranty protection for a fee.
+
+ 5. Conveying Modified Source Versions.
+
+ You may convey a work based on the Program, or the modifications to
+produce it from the Program, in the form of source code under the
+terms of section 4, provided that you also meet all of these conditions:
+
+ a) The work must carry prominent notices stating that you modified
+ it, and giving a relevant date.
+
+ b) The work must carry prominent notices stating that it is
+ released under this License and any conditions added under section
+ 7. This requirement modifies the requirement in section 4 to
+ "keep intact all notices".
+
+ c) You must license the entire work, as a whole, under this
+ License to anyone who comes into possession of a copy. This
+ License will therefore apply, along with any applicable section 7
+ additional terms, to the whole of the work, and all its parts,
+ regardless of how they are packaged. This License gives no
+ permission to license the work in any other way, but it does not
+ invalidate such permission if you have separately received it.
+
+ d) If the work has interactive user interfaces, each must display
+ Appropriate Legal Notices; however, if the Program has interactive
+ interfaces that do not display Appropriate Legal Notices, your
+ work need not make them do so.
+
+ A compilation of a covered work with other separate and independent
+works, which are not by their nature extensions of the covered work,
+and which are not combined with it such as to form a larger program,
+in or on a volume of a storage or distribution medium, is called an
+"aggregate" if the compilation and its resulting copyright are not
+used to limit the access or legal rights of the compilation's users
+beyond what the individual works permit. Inclusion of a covered work
+in an aggregate does not cause this License to apply to the other
+parts of the aggregate.
+
+ 6. Conveying Non-Source Forms.
+
+ You may convey a covered work in object code form under the terms
+of sections 4 and 5, provided that you also convey the
+machine-readable Corresponding Source under the terms of this License,
+in one of these ways:
+
+ a) Convey the object code in, or embodied in, a physical product
+ (including a physical distribution medium), accompanied by the
+ Corresponding Source fixed on a durable physical medium
+ customarily used for software interchange.
+
+ b) Convey the object code in, or embodied in, a physical product
+ (including a physical distribution medium), accompanied by a
+ written offer, valid for at least three years and valid for as
+ long as you offer spare parts or customer support for that product
+ model, to give anyone who possesses the object code either (1) a
+ copy of the Corresponding Source for all the software in the
+ product that is covered by this License, on a durable physical
+ medium customarily used for software interchange, for a price no
+ more than your reasonable cost of physically performing this
+ conveying of source, or (2) access to copy the
+ Corresponding Source from a network server at no charge.
+
+ c) Convey individual copies of the object code with a copy of the
+ written offer to provide the Corresponding Source. This
+ alternative is allowed only occasionally and noncommercially, and
+ only if you received the object code with such an offer, in accord
+ with subsection 6b.
+
+ d) Convey the object code by offering access from a designated
+ place (gratis or for a charge), and offer equivalent access to the
+ Corresponding Source in the same way through the same place at no
+ further charge. You need not require recipients to copy the
+ Corresponding Source along with the object code. If the place to
+ copy the object code is a network server, the Corresponding Source
+ may be on a different server (operated by you or a third party)
+ that supports equivalent copying facilities, provided you maintain
+ clear directions next to the object code saying where to find the
+ Corresponding Source. Regardless of what server hosts the
+ Corresponding Source, you remain obligated to ensure that it is
+ available for as long as needed to satisfy these requirements.
+
+ e) Convey the object code using peer-to-peer transmission, provided
+ you inform other peers where the object code and Corresponding
+ Source of the work are being offered to the general public at no
+ charge under subsection 6d.
+
+ A separable portion of the object code, whose source code is excluded
+from the Corresponding Source as a System Library, need not be
+included in conveying the object code work.
+
+ A "User Product" is either (1) a "consumer product", which means any
+tangible personal property which is normally used for personal, family,
+or household purposes, or (2) anything designed or sold for incorporation
+into a dwelling. In determining whether a product is a consumer product,
+doubtful cases shall be resolved in favor of coverage. For a particular
+product received by a particular user, "normally used" refers to a
+typical or common use of that class of product, regardless of the status
+of the particular user or of the way in which the particular user
+actually uses, or expects or is expected to use, the product. A product
+is a consumer product regardless of whether the product has substantial
+commercial, industrial or non-consumer uses, unless such uses represent
+the only significant mode of use of the product.
+
+ "Installation Information" for a User Product means any methods,
+procedures, authorization keys, or other information required to install
+and execute modified versions of a covered work in that User Product from
+a modified version of its Corresponding Source. The information must
+suffice to ensure that the continued functioning of the modified object
+code is in no case prevented or interfered with solely because
+modification has been made.
+
+ If you convey an object code work under this section in, or with, or
+specifically for use in, a User Product, and the conveying occurs as
+part of a transaction in which the right of possession and use of the
+User Product is transferred to the recipient in perpetuity or for a
+fixed term (regardless of how the transaction is characterized), the
+Corresponding Source conveyed under this section must be accompanied
+by the Installation Information. But this requirement does not apply
+if neither you nor any third party retains the ability to install
+modified object code on the User Product (for example, the work has
+been installed in ROM).
+
+ The requirement to provide Installation Information does not include a
+requirement to continue to provide support service, warranty, or updates
+for a work that has been modified or installed by the recipient, or for
+the User Product in which it has been modified or installed. Access to a
+network may be denied when the modification itself materially and
+adversely affects the operation of the network or violates the rules and
+protocols for communication across the network.
+
+ Corresponding Source conveyed, and Installation Information provided,
+in accord with this section must be in a format that is publicly
+documented (and with an implementation available to the public in
+source code form), and must require no special password or key for
+unpacking, reading or copying.
+
+ 7. Additional Terms.
+
+ "Additional permissions" are terms that supplement the terms of this
+License by making exceptions from one or more of its conditions.
+Additional permissions that are applicable to the entire Program shall
+be treated as though they were included in this License, to the extent
+that they are valid under applicable law. If additional permissions
+apply only to part of the Program, that part may be used separately
+under those permissions, but the entire Program remains governed by
+this License without regard to the additional permissions.
+
+ When you convey a copy of a covered work, you may at your option
+remove any additional permissions from that copy, or from any part of
+it. (Additional permissions may be written to require their own
+removal in certain cases when you modify the work.) You may place
+additional permissions on material, added by you to a covered work,
+for which you have or can give appropriate copyright permission.
+
+ Notwithstanding any other provision of this License, for material you
+add to a covered work, you may (if authorized by the copyright holders of
+that material) supplement the terms of this License with terms:
+
+ a) Disclaiming warranty or limiting liability differently from the
+ terms of sections 15 and 16 of this License; or
+
+ b) Requiring preservation of specified reasonable legal notices or
+ author attributions in that material or in the Appropriate Legal
+ Notices displayed by works containing it; or
+
+ c) Prohibiting misrepresentation of the origin of that material, or
+ requiring that modified versions of such material be marked in
+ reasonable ways as different from the original version; or
+
+ d) Limiting the use for publicity purposes of names of licensors or
+ authors of the material; or
+
+ e) Declining to grant rights under trademark law for use of some
+ trade names, trademarks, or service marks; or
+
+ f) Requiring indemnification of licensors and authors of that
+ material by anyone who conveys the material (or modified versions of
+ it) with contractual assumptions of liability to the recipient, for
+ any liability that these contractual assumptions directly impose on
+ those licensors and authors.
+
+ All other non-permissive additional terms are considered "further
+restrictions" within the meaning of section 10. If the Program as you
+received it, or any part of it, contains a notice stating that it is
+governed by this License along with a term that is a further
+restriction, you may remove that term. If a license document contains
+a further restriction but permits relicensing or conveying under this
+License, you may add to a covered work material governed by the terms
+of that license document, provided that the further restriction does
+not survive such relicensing or conveying.
+
+ If you add terms to a covered work in accord with this section, you
+must place, in the relevant source files, a statement of the
+additional terms that apply to those files, or a notice indicating
+where to find the applicable terms.
+
+ Additional terms, permissive or non-permissive, may be stated in the
+form of a separately written license, or stated as exceptions;
+the above requirements apply either way.
+
+ 8. Termination.
+
+ You may not propagate or modify a covered work except as expressly
+provided under this License. Any attempt otherwise to propagate or
+modify it is void, and will automatically terminate your rights under
+this License (including any patent licenses granted under the third
+paragraph of section 11).
+
+ However, if you cease all violation of this License, then your
+license from a particular copyright holder is reinstated (a)
+provisionally, unless and until the copyright holder explicitly and
+finally terminates your license, and (b) permanently, if the copyright
+holder fails to notify you of the violation by some reasonable means
+prior to 60 days after the cessation.
+
+ Moreover, your license from a particular copyright holder is
+reinstated permanently if the copyright holder notifies you of the
+violation by some reasonable means, this is the first time you have
+received notice of violation of this License (for any work) from that
+copyright holder, and you cure the violation prior to 30 days after
+your receipt of the notice.
+
+ Termination of your rights under this section does not terminate the
+licenses of parties who have received copies or rights from you under
+this License. If your rights have been terminated and not permanently
+reinstated, you do not qualify to receive new licenses for the same
+material under section 10.
+
+ 9. Acceptance Not Required for Having Copies.
+
+ You are not required to accept this License in order to receive or
+run a copy of the Program. Ancillary propagation of a covered work
+occurring solely as a consequence of using peer-to-peer transmission
+to receive a copy likewise does not require acceptance. However,
+nothing other than this License grants you permission to propagate or
+modify any covered work. These actions infringe copyright if you do
+not accept this License. Therefore, by modifying or propagating a
+covered work, you indicate your acceptance of this License to do so.
+
+ 10. Automatic Licensing of Downstream Recipients.
+
+ Each time you convey a covered work, the recipient automatically
+receives a license from the original licensors, to run, modify and
+propagate that work, subject to this License. You are not responsible
+for enforcing compliance by third parties with this License.
+
+ An "entity transaction" is a transaction transferring control of an
+organization, or substantially all assets of one, or subdividing an
+organization, or merging organizations. If propagation of a covered
+work results from an entity transaction, each party to that
+transaction who receives a copy of the work also receives whatever
+licenses to the work the party's predecessor in interest had or could
+give under the previous paragraph, plus a right to possession of the
+Corresponding Source of the work from the predecessor in interest, if
+the predecessor has it or can get it with reasonable efforts.
+
+ You may not impose any further restrictions on the exercise of the
+rights granted or affirmed under this License. For example, you may
+not impose a license fee, royalty, or other charge for exercise of
+rights granted under this License, and you may not initiate litigation
+(including a cross-claim or counterclaim in a lawsuit) alleging that
+any patent claim is infringed by making, using, selling, offering for
+sale, or importing the Program or any portion of it.
+
+ 11. Patents.
+
+ A "contributor" is a copyright holder who authorizes use under this
+License of the Program or a work on which the Program is based. The
+work thus licensed is called the contributor's "contributor version".
+
+ A contributor's "essential patent claims" are all patent claims
+owned or controlled by the contributor, whether already acquired or
+hereafter acquired, that would be infringed by some manner, permitted
+by this License, of making, using, or selling its contributor version,
+but do not include claims that would be infringed only as a
+consequence of further modification of the contributor version. For
+purposes of this definition, "control" includes the right to grant
+patent sublicenses in a manner consistent with the requirements of
+this License.
+
+ Each contributor grants you a non-exclusive, worldwide, royalty-free
+patent license under the contributor's essential patent claims, to
+make, use, sell, offer for sale, import and otherwise run, modify and
+propagate the contents of its contributor version.
+
+ In the following three paragraphs, a "patent license" is any express
+agreement or commitment, however denominated, not to enforce a patent
+(such as an express permission to practice a patent or covenant not to
+sue for patent infringement). To "grant" such a patent license to a
+party means to make such an agreement or commitment not to enforce a
+patent against the party.
+
+ If you convey a covered work, knowingly relying on a patent license,
+and the Corresponding Source of the work is not available for anyone
+to copy, free of charge and under the terms of this License, through a
+publicly available network server or other readily accessible means,
+then you must either (1) cause the Corresponding Source to be so
+available, or (2) arrange to deprive yourself of the benefit of the
+patent license for this particular work, or (3) arrange, in a manner
+consistent with the requirements of this License, to extend the patent
+license to downstream recipients. "Knowingly relying" means you have
+actual knowledge that, but for the patent license, your conveying the
+covered work in a country, or your recipient's use of the covered work
+in a country, would infringe one or more identifiable patents in that
+country that you have reason to believe are valid.
+
+ If, pursuant to or in connection with a single transaction or
+arrangement, you convey, or propagate by procuring conveyance of, a
+covered work, and grant a patent license to some of the parties
+receiving the covered work authorizing them to use, propagate, modify
+or convey a specific copy of the covered work, then the patent license
+you grant is automatically extended to all recipients of the covered
+work and works based on it.
+
+ A patent license is "discriminatory" if it does not include within
+the scope of its coverage, prohibits the exercise of, or is
+conditioned on the non-exercise of one or more of the rights that are
+specifically granted under this License. You may not convey a covered
+work if you are a party to an arrangement with a third party that is
+in the business of distributing software, under which you make payment
+to the third party based on the extent of your activity of conveying
+the work, and under which the third party grants, to any of the
+parties who would receive the covered work from you, a discriminatory
+patent license (a) in connection with copies of the covered work
+conveyed by you (or copies made from those copies), or (b) primarily
+for and in connection with specific products or compilations that
+contain the covered work, unless you entered into that arrangement,
+or that patent license was granted, prior to 28 March 2007.
+
+ Nothing in this License shall be construed as excluding or limiting
+any implied license or other defenses to infringement that may
+otherwise be available to you under applicable patent law.
+
+ 12. No Surrender of Others' Freedom.
+
+ If conditions are imposed on you (whether by court order, agreement or
+otherwise) that contradict the conditions of this License, they do not
+excuse you from the conditions of this License. If you cannot convey a
+covered work so as to satisfy simultaneously your obligations under this
+License and any other pertinent obligations, then as a consequence you may
+not convey it at all. For example, if you agree to terms that obligate you
+to collect a royalty for further conveying from those to whom you convey
+the Program, the only way you could satisfy both those terms and this
+License would be to refrain entirely from conveying the Program.
+
+ 13. Use with the GNU Affero General Public License.
+
+ Notwithstanding any other provision of this License, you have
+permission to link or combine any covered work with a work licensed
+under version 3 of the GNU Affero General Public License into a single
+combined work, and to convey the resulting work. The terms of this
+License will continue to apply to the part which is the covered work,
+but the special requirements of the GNU Affero General Public License,
+section 13, concerning interaction through a network will apply to the
+combination as such.
+
+ 14. Revised Versions of this License.
+
+ The Free Software Foundation may publish revised and/or new versions of
+the GNU General Public License from time to time. Such new versions will
+be similar in spirit to the present version, but may differ in detail to
+address new problems or concerns.
+
+ Each version is given a distinguishing version number. If the
+Program specifies that a certain numbered version of the GNU General
+Public License "or any later version" applies to it, you have the
+option of following the terms and conditions either of that numbered
+version or of any later version published by the Free Software
+Foundation. If the Program does not specify a version number of the
+GNU General Public License, you may choose any version ever published
+by the Free Software Foundation.
+
+ If the Program specifies that a proxy can decide which future
+versions of the GNU General Public License can be used, that proxy's
+public statement of acceptance of a version permanently authorizes you
+to choose that version for the Program.
+
+ Later license versions may give you additional or different
+permissions. However, no additional obligations are imposed on any
+author or copyright holder as a result of your choosing to follow a
+later version.
+
+ 15. Disclaimer of Warranty.
+
+ THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY
+APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT
+HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY
+OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO,
+THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM
+IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF
+ALL NECESSARY SERVICING, REPAIR OR CORRECTION.
+
+ 16. Limitation of Liability.
+
+ IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
+WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS
+THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY
+GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE
+USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF
+DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD
+PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS),
+EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF
+SUCH DAMAGES.
+
+ 17. Interpretation of Sections 15 and 16.
+
+ If the disclaimer of warranty and limitation of liability provided
+above cannot be given local legal effect according to their terms,
+reviewing courts shall apply local law that most closely approximates
+an absolute waiver of all civil liability in connection with the
+Program, unless a warranty or assumption of liability accompanies a
+copy of the Program in return for a fee.
+
+ END OF TERMS AND CONDITIONS
+
+ How to Apply These Terms to Your New Programs
+
+ If you develop a new program, and you want it to be of the greatest
+possible use to the public, the best way to achieve this is to make it
+free software which everyone can redistribute and change under these terms.
+
+ To do so, attach the following notices to the program. It is safest
+to attach them to the start of each source file to most effectively
+state the exclusion of warranty; and each file should have at least
+the "copyright" line and a pointer to where the full notice is found.
+
+
+ Copyright (C)
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation, either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see .
+
+Also add information on how to contact you by electronic and paper mail.
+
+ If the program does terminal interaction, make it output a short
+notice like this when it starts in an interactive mode:
+
+ Copyright (C)
+ This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
+ This is free software, and you are welcome to redistribute it
+ under certain conditions; type `show c' for details.
+
+The hypothetical commands `show w' and `show c' should show the appropriate
+parts of the General Public License. Of course, your program's commands
+might be different; for a GUI interface, you would use an "about box".
+
+ You should also get your employer (if you work as a programmer) or school,
+if any, to sign a "copyright disclaimer" for the program, if necessary.
+For more information on this, and how to apply and follow the GNU GPL, see
+.
+
+ The GNU General Public License does not permit incorporating your program
+into proprietary programs. If your program is a subroutine library, you
+may consider it more useful to permit linking proprietary applications with
+the library. If this is what you want to do, use the GNU Lesser General
+Public License instead of this License. But first, please read
+.
diff --git a/README.md b/README.md
index e5301b78..97fce518 100644
--- a/README.md
+++ b/README.md
@@ -2,8 +2,90 @@ PassJava 项目全套学习教程连载中,[关注公众号](#公众号)第一
可落地的 Spring Cloud项目:`PassJava` https://github.com/Jackson0714/PassJava-Platform
+**此项目分为公开版和 VIP 版**
+VIP 版请加入我的星球获取。
+
+> VIP 版提供全功能的的代码仓库,预计代码量在 2W+ 以上。
+>
+> VIP 版提供新开发功能的文档,计划 80+ 讲。公开版目前更新了 30+讲,且不系统。
+>
+> VIP 版提供更加规范和系统的文档 🌹
+>
+> VIP 版提供技术支持💪🏻
+>
+> VIP 版提供正确学习项目的路线☀️
+
+
+
+
+
# PassJava 学习教程
+## 关于我
+
+🌈InfoQ 签约作者、蓝桥签约作者、阿里云社区博客专家、51CTO Top红人。
+
+🍭公众号:悟空聊架构,20000+ 技术爱好者关注。
+
+💪🏻擅长微服务、分布式、架构设计。
+
+🍎目前在一家上市公司从事基础架构建设工作。
+
+[我的 B站](https://space.bilibili.com/493005591?spm_id_from=333.999.0.0)
+
+
+### 技术支持
+
+💪🏻💪🏻💪🏻欢迎加入我的知识星球(下方扫码加入),提供`技术1v1解答`、简历修改、500人技术交流群。当然你也可以加我微信好友:passjava。
+
+
+
+**悟空的多个技术专题**:
+
+33 篇 SpringCloud 实战,回复PDF获取。
+
+8 篇分布式算法文章,回复分布式获取。
+
+7 篇JVM 专项训练,回复JVM获取。
+
+Elasticsearch 筋斗云版蓝皮书1.0,回复ES获取
+
+面试必备资料,关注公众号`悟空聊架构`即可获取。
+
+
+## Java 学习路线(赛亚人版)
+
+[🌈Java 学习路线(赛亚人版)](http://passjava.cn/#/01.%E9%A1%B9%E7%9B%AE%E7%AE%80%E4%BB%8B/9.Java%E5%AD%A6%E4%B9%A0%E8%B7%AF%E7%BA%BF)
+
+## PassJava 部署教程
+
+### 1、Mac M1 部署项目
+
+[Mac M1 部署项目](http://www.passjava.cn/#/01.项目简介/7.本地部署项目Mac版):heavy_check_mark:
+
+Windows 版正在更新中,可参考 Mac 版的部署教程。
+
+
+前后端都在这个仓库:
+
+后台代码地址:https://github.com/Jackson0714/PassJava-Platform
+
+### 2、后端部署教程
+
+[后端部署教程](http://www.passjava.cn/#/01.PassJava/01.Introduction/7.%E6%9C%AC%E5%9C%B0%E9%83%A8%E7%BD%B2%E9%A1%B9%E7%9B%AEMac%E7%89%88):heavy_check_mark:
+
+### 3、前端部署教程
+
+[前端部署教程](https://github.com/Jackson0714/PassJava-Platform/tree/master/passjava-portal):heavy_check_mark:
+
+前端 Vue 代码地址:https://github.com/Jackson0714/PassJava-Platform/tree/master/passjava-portal
+
+### 小程序部署教程
+
+[小程序部署教程](https://github.com/Jackson0714/PassJava-Platform/blob/master/passjava-miniApp/README.md):heavy_check_mark:
+
+小程序代码地址:https://github.com/Jackson0714/PassJava-Platform/tree/master/passjava-miniApp
+
## 简介
- PassJava-Learning项目是PassJava(佳必过)项目的学习教程。对架构、业务、技术要点进行讲解。
@@ -13,43 +95,52 @@ PassJava 项目全套学习教程连载中,[关注公众号](#公众号)第一
## 更好的阅读体验
-- 文档地址:[http://www.jayh.club](http://www.jayh.club)
-- 备用地址1:[https://jackson0714.github.io/PassJava-Learning](https://jackson0714.github.io/PassJava-Learning/)
+- 文档地址:[http://www.passjava.cn](http://www.passjava.cn)
+- 备用地址1:[https://jackson0714.github.io/PassJava-Learning](https://jackson0714.github.io/PassJava-Learning/)
- 备用地址2:http://jayh2018.gitee.io/passjava-learning/#/README
## PassJava 教程连载目录
+关注公众号:悟空聊架构,回复 PDF 获取离线版教程。
+
- [打造一款 刷Java 知识的小程序](https://www.cnblogs.com/jackson0714/p/passJava1.html)
- [打造一款 刷Java 知识的小程序(二)](https://www.cnblogs.com/jackson0714/p/passJava2.html)
-- [01.五分钟搞懂分布式基础概念](http://www.jayh.club/#/04.SpringCloud学习篇/01.分布式基础概念)
-- [02.快速搭建Linux环境-运维必备](http://www.jayh.club/#/05.安装部署篇/01.环境搭建篇)
-- [03.配置虚拟机网络](http://www.jayh.club/#/05.安装部署篇/02.配置虚拟机网络)
-- [04.安装Docker](http://www.jayh.club/#/05.安装部署篇/03.安装docker)
-- [05.Docker安装mysql](http://www.jayh.club/#/05.安装部署篇/04.docker安装mysql)
-- [06.Docker安装redis](http://www.jayh.club/#/05.安装部署篇/05.docker安装redis)
-- [07.本地开发环境配置](http://www.jayh.club/#/05.安装部署篇/06.本地开发环境配置)
-- [08.配置Git](http://www.jayh.club/#/05.安装部署篇/07.配置git)
-- [09.初始化项目和添加微服务](http://www.jayh.club/#/02.PassJava架构篇/01.创建项目和添加模块)
-- [10.PassJava-微服务划分图](http://www.jayh.club/#/01.项目简介/3.微服务划分图)
-- [11.初始化数据库和表](http://www.jayh.club/#/02.PassJava架构篇/02.创建数据库和表)
-- [12.搭建管理后台](http://www.jayh.club/#/02.PassJava架构篇/03.搭建管理后台)
-- [13.自动生成前后端代码](http://www.jayh.club/#/02.PassJava架构篇/04.自动生成前后端代码)
-- [14.整合MyBatis-Plus实现CRUD](http://www.jayh.club/#/02.PassJava架构篇/05.整合MyBatis-Plus实现CRUD)
-- [15.生成所有微服务的CRUD代码](http://www.jayh.club/#/02.PassJava架构篇/06.生成所有微服务的CRUD代码)
-- [16.Spring Cloud Alibaba 组件简介](http://www.jayh.club/#/02.PassJava架构篇/07.SpringCloudAlibaba组件简介)
-- [17.SpringCloud整合Alibaba-Nacos注册中心](http://www.jayh.club/#/02.PassJava架构篇/08.SpringCloud整合Alibaba-Nacos组件)
-- [18.SpringCloud整合OpenFeign组件](http://www.jayh.club/#/02.PassJava架构篇/09.SpringCloud整合OpenFeign组件)
-- [19.SpringCloud整合Alibaba-Nacos配置中心](http://www.jayh.club/#/02.PassJava架构篇/10.SpringCloud整合Nacos配置中心)
-- [20.SpringCloud整合Gateway网关](http://www.jayh.club/#/02.PassJava架构篇/11.SpringCloud整合Gateway网关)
-- [21.管理后台-题目类型功能](http://www.jayh.club/#/06.PassJava业务篇/01.管理后台-题目类型功能)
-- [22.SpringCloud整合OSS对象存储](http://www.jayh.club/#/02.PassJava架构篇/12.SpringCloud整合OSS对象存储)
-- [23.整合统一异常处理](http://www.jayh.club/#/02.PassJava架构篇/13.整合统一异常处理.md)
+- [01.五分钟搞懂分布式基础概念](http://www.passjava.cn/#/03.Distributed/01.分布式基础概念)
+- [02.快速搭建Linux环境-运维必备](http://www.passjava.cn/#/01.PassJava/03.Deploy/01.环境搭建篇)
+- [03.配置虚拟机网络](http://www.passjava.cn/#/01.PassJava/03.Deploy/02.配置虚拟机网络)
+- [04.安装Docker](http://www.passjava.cn/#/01.PassJava/03.Deploy/03.安装docker)
+- [05.Docker安装mysql](http://www.passjava.cn/#/01.PassJava/03.Deploy/04.docker安装mysql)
+- [06.Docker安装redis](http://www.passjava.cn/#/01.PassJava/03.Deploy/05.docker安装redis)
+- [07.本地开发环境配置](http://www.passjava.cn/#/01.PassJava/03.Deploy/06.本地开发环境配置)
+- [08.配置Git](http://www.passjava.cn/#/01.PassJava/03.Deploy/07.配置git)
+- [09.初始化项目和添加微服务](http://www.passjava.cn/#/01.PassJava/02.PassJava_Architecture/01.创建项目和添加模块)
+- [10.PassJava-微服务划分图](http://www.passjava.cn/#/01.项目简介/3.微服务划分图)
+- [11.初始化数据库和表](http://www.passjava.cn/#/01.PassJava/02.PassJava_Architecture/02.创建数据库和表)
+- [12.搭建管理后台](http://www.passjava.cn/#/01.PassJava/02.PassJava_Architecture/03.搭建管理后台)
+- [13.自动生成前后端代码](http://www.passjava.cn/#/01.PassJava/02.PassJava_Architecture/04.自动生成前后端代码)
+- [14.整合MyBatis-Plus实现CRUD](http://www.passjava.cn/#/01.PassJava/02.PassJava_Architecture/05.整合MyBatis-Plus实现CRUD)
+- [15.生成所有微服务的CRUD代码](http://www.passjava.cn/#/01.PassJava/02.PassJava_Architecture/06.生成所有微服务的CRUD代码)
+- [16.Spring Cloud Alibaba 组件简介](http://www.passjava.cn/#/01.PassJava/02.PassJava_Architecture/07.SpringCloudAlibaba组件简介)
+- [17.SpringCloud整合Alibaba-Nacos注册中心](http://www.passjava.cn/#/01.PassJava/02.PassJava_Architecture/08.SpringCloud整合Alibaba-Nacos组件)
+- [18.SpringCloud整合OpenFeign组件](http://www.passjava.cn/#/01.PassJava/02.PassJava_Architecture/09.SpringCloud整合OpenFeign组件)
+- [19.SpringCloud整合Alibaba-Nacos配置中心](http://www.passjava.cn/#/01.PassJava/02.PassJava_Architecture/10.SpringCloud整合Nacos配置中心)
+- [20.SpringCloud整合Gateway网关](http://www.passjava.cn/#/01.PassJava/02.PassJava_Architecture/11.SpringCloud整合Gateway网关)
+- [21.管理后台-题目类型功能](http://www.passjava.cn/#/01.PassJava/04.PassJava_Business/01.管理后台-题目类型功能)
+- [22.SpringCloud整合OSS对象存储](http://www.passjava.cn/#/01.PassJava/02.PassJava_Architecture/12.SpringCloud整合OSS对象存储)
+- [23.整合统一异常处理](http://www.passjava.cn/#/01.PassJava/02.PassJava_Architecture/13.整合统一异常处理.md)
+- [24.Elasticsearch上篇(原理)](http://www.passjava.cn/#/01.PassJava/02.PassJava_Architecture/14.Elasticsearch原理.md)
+- [25.Elasticsearch中篇(实战)](http://www.passjava.cn/#/01.PassJava/02.PassJava_Architecture/15.Elasticsearch实战.md)
+- [26.Elasticsearch下篇(集群部署)更新中](http://www.passjava.cn/#/01.PassJava/02.PassJava_Architecture/16.Elasticsearch集群部署.md)
+- [27.微服务架构中的链路追踪](http://www.passjava.cn/#/01.PassJava/02.PassJava_Architecture/17.微服务架构中的链路追踪.md)
+- [28.48张图手摸手教你性能压测](http://www.passjava.cn/#/01.PassJava/02.PassJava_Architecture/18.48张图手摸手教你性能压测.md)
+- [29.缓存实战(一)](http://www.passjava.cn/#/01.PassJava/02.PassJava_Architecture/19.缓存实战(一).md)
+- [30.缓存实战(二)Redis分布式锁](http://www.passjava.cn/#/01.PassJava/02.PassJava_Architecture/22.缓存实战(二)Redis分布式锁.md)
+- [31.缓存实战(三)Redisson分布式锁](http://www.passjava.cn/#/01.PassJava/02.PassJava_Architecture/23.缓存实战(三)Redisson分布式锁.md)
+- [32.缓存实战(四)实战 Spring Cache](http://www.passjava.cn/#/01.PassJava/02.PassJava_Architecture/24.缓存实战(四)SpringCache.md)
## 小程序演示
-
-
-
+
## 项目地址
@@ -57,28 +148,162 @@ PassJava 项目全套学习教程连载中,[关注公众号](#公众号)第一
## 介绍
-- [PassJava 架构及功能概览](http://www.jayh.club/#/01.项目简介/2.项目微服务架构图)
-- [PassJava 学习所需知识点](http://www.jayh.club/#/01.项目简介/5.项目前置要求)
+- [PassJava 架构及功能概览](http://www.passjava.cn/#/01.项目简介/2.项目微服务架构图)
+- [PassJava 学习所需知识点](http://www.passjava.cn/#/01.项目简介/5.项目前置要求)
## 架构篇
> 手把手教你搭建一个PassJava 中使用的 SpringCloud框架
-- [01.初始化项目和添加微服务](http://www.jayh.club/#/02.PassJava架构篇/01.创建项目和添加模块)
-- [02.PassJava-微服务划分图](http://www.jayh.club/#/01.项目简介/3.微服务划分图)
-- [03.初始化数据库和表](http://www.jayh.club/#/02.PassJava架构篇/02.创建数据库和表)
-- [04.搭建管理后台](http://www.jayh.club/#/02.PassJava架构篇/03.搭建管理后台)
-- [05.自动生成前后端代码](http://www.jayh.club/#/02.PassJava架构篇/04.自动生成前后端代码)
-- [06.整合MyBatis-Plus实现CRUD](http://www.jayh.club/#/02.PassJava架构篇/05.整合MyBatis-Plus实现CRUD)
-- [07.生成所有微服务的CRUD代码](http://www.jayh.club/#/02.PassJava架构篇/06.生成所有微服务的CRUD代码)
-- [08.Spring Cloud Alibaba 组件简介](http://www.jayh.club/#/02.PassJava架构篇/07.SpringCloudAlibaba组件简介)
-- [09.SpringCloud整合Alibaba-Nacos注册中心](http://www.jayh.club/#/02.PassJava架构篇/08.SpringCloud整合Alibaba-Nacos组件)
-- [10.SpringCloud整合OpenFeign组件](http://www.jayh.club/#/02.PassJava架构篇/09.SpringCloud整合OpenFeign组件)
-- [11.SpringCloud整合Alibaba-Nacos配置中心](http://www.jayh.club/#/02.PassJava架构篇/10.SpringCloud整合Nacos配置中心)
-- [12.SpringCloud整合Gateway网关](http://www.jayh.club/#/02.PassJava架构篇/11.SpringCloud整合Gateway网关)
-- [13.SpringCloud整合OSS对象存储](http://www.jayh.club/#/02.PassJava架构篇/12.SpringCloud整合OSS对象存储)
-- [14.整合统一异常处理-更新中](http://www.jayh.club/#/02.PassJava架构篇/13.整合统一异常处理)
-- [15.Elasticsearch基础-更新中]()
+- [01.Spring Cloud Alibaba 组件简介](http://www.passjava.cn/#/01.PassJava/02.PassJava_Architecture/07.SpringCloudAlibaba组件简介)
+- [02.SpringCloud整合Alibaba-Nacos注册中心](http://www.passjava.cn/#/01.PassJava/02.PassJava_Architecture/08.SpringCloud整合Alibaba-Nacos组件)
+- [03.SpringCloud整合OpenFeign组件](http://www.passjava.cn/#/01.PassJava/02.PassJava_Architecture/09.SpringCloud整合OpenFeign组件)
+- [04.SpringCloud整合Alibaba-Nacos配置中心](http://www.passjava.cn/#/01.PassJava/02.PassJava_Architecture/10.SpringCloud整合Nacos配置中心)
+- [05.SpringCloud整合Gateway网关](http://www.passjava.cn/#/01.PassJava/02.PassJava_Architecture/11.SpringCloud整合Gateway网关)
+- [06.SpringCloud整合OSS对象存储](http://www.passjava.cn/#/01.PassJava/02.PassJava_Architecture/12.SpringCloud整合OSS对象存储)
+- [07.整合统一异常处理](http://www.passjava.cn/#/01.PassJava/02.PassJava_Architecture/13.整合统一异常处理)
+- [08.Elasticsearch上篇(原理)](http://www.passjava.cn/#/01.PassJava/02.PassJava_Architecture/14.Elasticsearch原理)
+- [09.Elasticsearch中篇(实战)](http://www.passjava.cn/#/01.PassJava/02.PassJava_Architecture/15.Elasticsearch实战.md)
+- [10.Elasticsearch下篇(集群部署)更新中](http://www.passjava.cn/#/01.PassJava/02.PassJava_Architecture/16.Elasticsearch集群部署.md)
+- [11.微服务架构中的链路追踪](http://www.passjava.cn/#/01.PassJava/02.PassJava_Architecture/17.微服务架构中的链路追踪.md)
+- [12.48张图手摸手教你性能压测](http://www.passjava.cn/#/01.PassJava/02.PassJava_Architecture/18.48张图手摸手教你性能压测.md)
+- [13.缓存实战(一)](http://www.passjava.cn/#/01.PassJava/02.PassJava_Architecture/19.缓存实战(一).md)
+- [14.缓存实战(二)Redis分布式锁](http://www.passjava.cn/#/01.PassJava/02.PassJava_Architecture/22.缓存实战(二)Redis分布式锁.md)
+- [15.缓存实战(三)Redisson分布式锁](http://www.passjava.cn/#/01.PassJava/02.PassJava_Architecture/23.缓存实战(三)Redisson分布式锁.md)
+- [16.缓存实战(四)实战 Spring Cache](http://www.passjava.cn/#/01.PassJava/02.PassJava_Architecture/24.缓存实战(四)SpringCache.md)
+
+
+## Java并发多线程
+
+> 从源码层面详细讲解并发多线程
+> 关注公众号:悟空聊架构,回复`多线程`获取离线版教程。
+
+- [01.反制面试官-14张原理图-再也不怕被问volatile!](http://www.passjava.cn/#/10.并发多线程/01.反制面试官-14张原理图-再也不怕被问volatile!.md)
+- [02.我跟老婆讲CAS原理,被鄙视太简单!15张图-源码调试](http://www.passjava.cn/#/10.并发多线程/02.我跟老婆讲CAS原理-被鄙视太简单-15张图-源码调试.md)
+- [03.Java并发必知必会第三弹:用积木讲解ABA原理](http://www.passjava.cn/#/10.并发多线程/03.Java并发必知必会第三弹:用积木讲解ABA原理.md)
+- [04.全网最细-21张图带你领略集合的线程不安全](http://www.passjava.cn/#/10.并发多线程/04.全网最细-21张图带你领略集合的线程不安全.md)
+- [05.5000字-24张图带你彻底理解Java中的21种锁](http://www.passjava.cn/#/10.并发多线程/05.5000字-24张图带你彻底理解Java中的21种锁.md)
+- [06.干货-45张图庖丁解牛18种Queue,你知道几种?](http://www.passjava.cn/#/10.并发多线程/06.干货-45张图庖丁解牛18种Queue,你知道几种.md)
+
+
+## 分布式
+
+关注公众号:悟空聊架构,回复`分布式`获取离线版教程。
+
+- [01.分布式基础概念](http://www.passjava.cn/#/03.Distributed/01.分布式基础概念.md)
+- [02.这三年被分布式坑惨了,曝光十大坑](http://www.passjava.cn/#/03.Distributed/02.分布式中的十种坑.md)
+- [03.用三国杀讲分布式算法,舒适了吧?](http://www.passjava.cn/#/03.Distributed/03.用三国杀讲分布式算法,舒适了吧?.md)
+- [04.用太极拳讲分布式理论,舒服!](http://www.passjava.cn/#/03.Distributed/04.用太极拳讲分布式理论,舒服!.md)
+- [05.诸葛VS庞统,拿下Paxos](http://www.passjava.cn/#/03.Distributed/05.诸葛VS庞统,拿下Paxos.md)
+- [06.用动图讲解分布式Raft](http://www.passjava.cn/#/03.Distributed/06.用动图讲解分布式Raft.md)
+- [07.韩信大招:一致性哈希](http://www.passjava.cn/#/03.Distributed/07.韩信大招:一致性哈希.md)
+- [08.Gossip协议](http://www.passjava.cn/#/03.Distributed/08.Gossip协议.md)
+- [09.QuorumNWR算法](http://www.passjava.cn/#/03.Distributed/09.QuorumNWR算法.md)
+- [10.区块链12问和Pow算法](http://www.passjava.cn/#/03.Distributed/10.区块链12问.md)
+- [11.Zookeeper中的ZAB协议](http://www.passjava.cn/#/03.Distributed/14.ZAB协议.md)
+
+## 架构设计
+
+- [01.微服务架构中的两款流量防卫兵](http://www.passjava.cn/#/04.Architecture/01.架构图解/01.微服务架构中的两款流量防卫兵.md)
+- [02.浅析扣减库存的方案设计](http://www.passjava.cn/#/04.Architecture/01.架构图解/02.浅析扣减库存的方案设计.md)
+- [03.订单系统中的补偿事务设计](http://www.passjava.cn/#/04.Architecture/01.架构图解/03.订单系统中的补偿事务设计.md)
+- [04.请警惕Elasticsearch的三大坑](http://www.passjava.cn/#/04.Architecture/01.架构图解/04.请警惕Elasticsearch的三大坑.md)
+- [05.B站崩了,聊聊高可用和异地多活](http://www.passjava.cn/#/04.Architecture/01.架构图解/05.B站崩了,聊聊高可用和异地多活.md)
+- [06.查漏补缺,DDD领域驱动设计2022-02-15](http://www.passjava.cn/#/15.DDD领域驱动设计/01.查漏补缺,DDD领域驱动设计.md)
+- [07.自研简易版任务调度框架2022-03-04](http://www.passjava.cn/#/04.Architecture/01.架构图解/06.自研简易版任务调度框架2022-03-04.md)
+- [96.闲鱼架构演进](http://www.passjava.cn/#/04.Architecture/01.架构图解/96.闲鱼架构演进.md)
+- [97.京东白条数据架构演进](http://www.passjava.cn/#/04.Architecture/01.架构图解/97.京东白条数据架构演进.md)
+- [98.春晚红包架构](http://www.passjava.cn/#/04.Architecture/01.架构图解/98.春晚红包架构.md)
+- [99.淘宝架构10年](http://www.passjava.cn/#/04.Architecture/01.架构图解/99.淘宝架构10年.md)
+
+
+## SpringCloud 架构剖析🔥🔥🔥
+
+- 注册中心Eureka
+ - [01.Eureka基本原理和简单使用](http://www.passjava.cn/#/02.SpringCloud/01.Eureka注册中心/01.Eureka基本原理和简单使用.md)
+ - [02.Eureka本地集群搭建](http://www.passjava.cn/#/02.SpringCloud/01.Eureka注册中心/02.Eureka本地集群搭建.md)
+ - [03.Eureka源码之启动过程](http://www.passjava.cn/#/02.SpringCloud/01.Eureka注册中心/03.Eureka源码之启动过程.md)
+ - [04.Eureka源码之客户端注册](http://www.passjava.cn/#/02.SpringCloud/01.Eureka注册中心/04.Eureka源码之客户端注册.md)
+ - [05.Eureka源码之服务端接收注册信息](http://www.passjava.cn/#/02.SpringCloud/01.Eureka注册中心/05.Eureka源码之服务端接收注册信息.md)
+ - [06.Eureka源码之客户端首次获取注册表](http://www.passjava.cn/#/02.SpringCloud/01.Eureka注册中心/06.Eureka源码之客户端首次获取注册表.md)
+ - [07.Eureka源码之客户端增量获取注册表](http://www.passjava.cn/#/02.SpringCloud/01.Eureka注册中心/07.Eureka源码之客户端增量获取注册表.md)
+ - [08.Eureka源码之Server端的多级缓存机制](http://www.passjava.cn/#/02.SpringCloud/01.Eureka注册中心/08.Eureka源码之Server端的多级缓存机制.md)
+ - [98.Eureka控制台参数说明](http://www.passjava.cn/#/02.SpringCloud/01.Eureka注册中心/98.Eureka控制台参数说明.md)
+- 负载均衡Ribbon
+ - [01.Ribbon架构剖析](http://www.passjava.cn/#/02.SpringCloud/02.Ribbon负载均衡/01.Ribbon架构剖析.md)
+- 远程调用Feign
+ - [01.Feign远程调用基本原理和使用](http://www.passjava.cn/#/02.SpringCloud/03.Feign远程调用/01.Feign远程调用基本原理和使用.md)
+ - [02.Feign架构剖析](http://www.passjava.cn/#/02.SpringCloud/03.Feign远程调用/02.Feign架构剖析.md)
+- 熔断限流Hystrix
+ - [01.Hystrix架构剖析](http://www.passjava.cn/#/02.SpringCloud/04.Hystrix限流熔断器/01.Hystrix架构剖析.md)
+- Gateway网关
+ - [01.SpringCloud整合Gateway网关](02.SpringCloud/06.Gateway网关/01.SpringCloud整合Gateway网关.md)
+ - [02.深入浅入Gateway](http://www.passjava.cn/#/02.SpringCloud/06.Gateway网关/02.深入浅入Gateway.md)
+- Nacos配置注册中心
+ - [01.使用Nacos作为注册中心](http://www.passjava.cn/#/02.SpringCloud/07.Nacos配置注册中心/01.使用Nacos作为注册中心和配置中心.md)
+ - [02.Nacos架构原理①:一条注册请求会经历什么?](http://www.passjava.cn/#/02.SpringCloud/07.Nacos配置注册中心/02.Nacos架构原理①:一条注册请求会经历什么?.md)
+ - [03.Nacos架构原理②:揭秘AP架构——Distro一致性协议](http://www.passjava.cn/#/02.SpringCloud/07.Nacos配置注册中心/03.Nacos架构原理②:揭秘AP架构——Distro一致性协议.md)
+- Sentinel限流
+ - [01.Hystrix和Sentinel选型对比](http://www.passjava.cn/#/02.SpringCloud/08.Sentinel限流/01.Hystrix和Sentinel选型对比.md)
+
+## 用故事讲解技术
+
+* 中间件选型
+ - [01.如果把4个「消息队列」都在一个群里,他们会聊什么?](http://www.passjava.cn/#/04.Architecture/03.用故事讲解技术/01.中间件选型/01.如果消息队列都在一个群里,他们会聊什么?.md)
+ - [02.如果把4个「链路追踪」组件放到一个群里,他们会聊些什么?](http://www.passjava.cn/#/04.Architecture/03.用故事讲解技术/01.中间件选型/02.链路追踪如何选型)
+* 高可用
+ * [01.东汉末年,他们把熔断限流玩到了极致](http://www.passjava.cn/#04.Architecture/03.用故事讲解技术/02.高可用/01.东汉末年,他们把熔断限流玩到了极致.md)
+ * [02.我是一个秒杀请求,正在逃离这颗星球](http://www.passjava.cn/#/04.Architecture/03.用故事讲解技术/02.高可用/02.我是一个秒杀请求,正在逃离这颗星球.md)
+ * [03.为什么要除夕,原来是内存爆了](http://www.passjava.cn/#/04.Architecture/03.用故事讲解技术/02.高可用/03.为什么要除夕,原来是内存爆了.md)
+
+
+## 面试必背
+- [01.Redis 面试题汇总 第一季](http://www.passjava.cn/#/88.Interview/01.Redis/Redis1.md)
+- [02.并发编程 面试突击](http://www.passjava.cn/#/88.Interview/02.Thread/Thread1.md)
+- [03.MySQL 面试突击](http://www.passjava.cn/#/88.Interview/03.Database/MySQL1.md)
+- [04.JVM 面试突击](http://www.passjava.cn/#/88.Interview/04.JVM/JVM1.md)
+- 05.设计模式
+ - [01.观察者模式ObserverPattern](http://www.passjava.cn/#/88.Interview/05.DesignPattern/01.观察者模式ObserverPattern.md)
+ - [02.备忘录模式MementoPattern](http://www.passjava.cn/#/88.Interview/05.DesignPattern/02.备忘录模式MementoPattern.md)
+ - [03.原型模式PrototypePattern](http://www.passjava.cn/#/88.Interview/05.DesignPattern/03.原型模式PrototypePattern.md)
+ -[04.中介者模式MediatorPattern](http://www.passjava.cn/#/88.Interview/05.DesignPattern/04.中介者模式MediatorPattern.md)
+
+
+## 悟空学习群问题汇总
+- [01.悟空群聊问题20201026-删除binlog问题](http://www.passjava.cn/#/102.学习群问题汇总/01.20201026_删除binlog问题.md)
+- [02.悟空群聊问题20201028_导出报表问题](http://www.passjava.cn/#/102.学习群问题汇总/02.20201028_导出报表问题.md)
+- [03.悟空群聊问题20201030_List和ArrayList如何选择](http://www.passjava.cn/#/102.学习群问题汇总/03.20201030_List和ArrayList如何选择.md)
+## 群成员学习分享
+- [01.Nginx Location 正则](http://www.passjava.cn/#/104.群成员学习分享/01.NginxLocation正则.md)
+
+## JVM
+- [01.50+道JVM面试题+11张思维导图就是让你懂JVM](http://www.passjava.cn/#/06.Java核心知识/04.JVM进阶/01.50+道JVM面试题+11张思维导图就是让你懂JVM.md)
+- [02.秒懂JVM的三大参数类型,就靠这十个小实验了](http://www.passjava.cn/#/06.Java核心知识/04.JVM进阶/02.秒懂JVM的三大参数类型,就靠这十个小实验了.md)
+- [98.字节码指令表](http://www.passjava.cn/#/06.Java核心知识/04.JVM进阶/98.字节码指令表.md)
+- [99.JVM参数列表](http://www.passjava.cn/#/06.Java核心知识/04.JVM进阶/99.JVM参数列表.md)
+
+## 工具篇
+
+> 一些常用开发工具的使用
+
+- [01.自定义Markdown神器Typora的主题样式](https://juejin.im/post/6864745378558771214)
+- [02.使用docsify写开源文档](http://www.passjava.cn/#/99.tools/02.使用docsify写开源文档)
+- [03.Git同时上传到码云和github](https://juejin.im/post/6859388700858679303)
+- [04.图床神器配置](http://www.passjava.cn/#/99.tools/04.图床神器配置)
+- [05.我的常用工具](http://www.passjava.cn/#/99.tools/05.我的常用工具)
+- [06.Idea的十八般武艺](http://www.passjava.cn/#/99.tools/06.Idea的十八般武艺)
+- [07.画架构原理图,还是它好使](http://www.passjava.cn/#/99.tools/07.画架构原理图,还是它好使)
+- [08.添加Gitee密钥](http://www.passjava.cn/#/99.tools/08.添加Gitee密钥)
+- [09.给自己的博客docsify加上评论功能](http://www.passjava.cn/#/99.tools/09.给自己的博客docsify加上评论功能)
+- [91.Maven配置](http://www.passjava.cn/#/99.tools/91.Maven配置)
+- [92.Java环境问题](http://www.passjava.cn/#/99.tools/92.Java环境问题)
+- [93.IDEA快捷键](http://www.passjava.cn/#/99.tools/93.IDEA快捷键)
+- [94.Ubuntu16.04安装最新版nodejs](http://www.passjava.cn/#/99.tools/94.Ubuntu16_04安装最新版nodejs)
+- [95.VSCode快速生成Vue模板](http://www.passjava.cn/#/99.tools/95.VSCode快速生成Vue模板)
+- [96.HTML特殊符号](http://www.passjava.cn/#/99.tools/96.HTML特殊符号)
+- [97.IDEA设置代码彩虹颜色](http://www.passjava.cn/#/99.tools/97.IDEA设置代码彩虹颜色)
+- [98.IDEA调试Java多线程](http://www.passjava.cn/#/99.tools/98.IDEA调试Java多线程)
+- [99.IDEA调试Java源码](http://www.passjava.cn/#/99.tools/99.IDEA调试Java源码)
## 业务篇
@@ -88,62 +313,354 @@ PassJava 项目全套学习教程连载中,[关注公众号](#公众号)第一
> PassJava 中一些功能的技术要点解析
-- [05.SpringBoot整合Jdbc](http://www.jayh.club/#/03.SpringBoot学习篇/spring-boot-05-data-jdbc.md)
-- [06.SpringBoot整合Druid](http://www.jayh.club/#/03.SpringBoot学习篇/spring-boot-06-data-druid.md)
-- [07.spring-boot-05-data-jdbc](http://www.jayh.club/#/03.SpringBoot学习篇/spring-boot-07-data-mybatis.md)
-- [08.SpringBoot Mybatis逻辑删除](http://www.jayh.club/#/03.SpringBoot学习篇/08.SpringBoot-Mybatis逻辑删除.md)
-- [09.Object划分](http://www.jayh.club/#/03.SpringBoot学习篇/09.Object划分.md)
+- [05.SpringBoot整合Jdbc](http://www.passjava.cn/#/03.SpringBoot学习篇/spring-boot-05-data-jdbc.md)
+- [06.SpringBoot整合Druid](http://www.passjava.cn/#/03.SpringBoot学习篇/spring-boot-06-data-druid.md)
+- [07.spring-boot-05-data-jdbc](http://www.passjava.cn/#/03.SpringBoot学习篇/spring-boot-07-data-mybatis.md)
+- [08.SpringBoot Mybatis逻辑删除](http://www.passjava.cn/#/03.SpringBoot学习篇/08.SpringBoot-Mybatis逻辑删除.md)
+- [09.Object划分](http://www.passjava.cn/#/03.SpringBoot学习篇/09.Object划分.md)
## 部署篇
> PassJava 开发及生产环境的搭建
-- [01.快速搭建Linux环境-运维必备](http://www.jayh.club/#/05.安装部署篇/01.环境搭建篇)
-- [02.配置虚拟机网络](http://www.jayh.club/#/05.安装部署篇/02.配置虚拟机网络)
-- [03.安装Docker](http://www.jayh.club/#/05.安装部署篇/03.安装docker)
-- [04.Docker安装mysql](http://www.jayh.club/#/05.安装部署篇/04.docker安装mysql)
-- [05.Docker安装redis](http://www.jayh.club/#/05.安装部署篇/05.docker安装redis)
-- [06.本地开发环境配置](http://www.jayh.club/#/05.安装部署篇/06.本地开发环境配置)
-- [07.配置Git](http://www.jayh.club/#/05.安装部署篇/07.配置git)
+- [01.快速搭建Linux环境-运维必备](http://www.passjava.cn/#/01.PassJava/03.Deploy/01.环境搭建篇)
+- [02.配置虚拟机网络](http://www.passjava.cn/#/01.PassJava/03.Deploy/02.配置虚拟机网络)
+- [03.安装Docker](http://www.passjava.cn/#/01.PassJava/03.Deploy/03.安装docker)
+- [04.Docker安装mysql](http://www.passjava.cn/#/01.PassJava/03.Deploy/04.docker安装mysql)
+- [05.Docker安装redis](http://www.passjava.cn/#/01.PassJava/03.Deploy/05.docker安装redis)
+- [06.本地开发环境配置](http://www.passjava.cn/#/01.PassJava/03.Deploy/06.本地开发环境配置)
+- [07.配置Git](http://www.passjava.cn/#/01.PassJava/03.Deploy/07.配置git)
+
+## LeetCode刷题
+- [LeetCode数组第一题](http://www.passjava.cn/#/92.LeetCode算法题/01.数组/001.两数之和-数组-LeetCode第1题)
+
+
+## 公众号
+
+PassJava 项目全套学习教程连载中,关注公众号「**PassJava666**」第一时间获取。
+
+PassJava 项目全套学习教程连载中,[关注公众号](#公众号)第一时间获取。
+
+可落地的 Spring Cloud项目:`PassJava` https://github.com/Jackson0714/PassJava-Platform
+
+# PassJava 学习教程
+
+## 关于我
+
+🌈InfoQ 签约作者、蓝桥签约作者、阿里云社区博客专家、51CTO Top红人。
+
+🍭公众号:悟空聊架构,20000+ 技术爱好者关注。
+
+💪🏻擅长微服务、分布式、架构设计。
+
+🍎目前在一家上市公司从事基础架构建设工作。
+
+[我的 B站](https://space.bilibili.com/493005591?spm_id_from=333.999.0.0)
+
+
+### 技术支持
+
+💪🏻💪🏻💪🏻欢迎加入我的知识星球(下方扫码加入),提供`技术1v1解答`、简历修改、500人技术交流群。当然你也可以加我微信好友:passjava。
+
+
+
+**悟空的多个技术专题**:
+
+33 篇 SpringCloud 实战,回复PDF获取。
+
+8 篇分布式算法文章,回复分布式获取。
+
+7 篇JVM 专项训练,回复JVM获取。
+
+Elasticsearch 筋斗云版蓝皮书1.0,回复ES获取
+
+面试必备资料,关注公众号`悟空聊架构`即可获取。
+
+
+## Java 学习路线(赛亚人版)
+
+[🌈Java 学习路线(赛亚人版)](http://passjava.cn/#/01.%E9%A1%B9%E7%9B%AE%E7%AE%80%E4%BB%8B/9.Java%E5%AD%A6%E4%B9%A0%E8%B7%AF%E7%BA%BF)
+
+## PassJava 部署教程
+
+### 1、Mac M1 部署项目
+
+[Mac M1 部署项目](http://www.passjava.cn/#/01.项目简介/7.本地部署项目Mac版):heavy_check_mark:
+
+Windows 版正在更新中,可参考 Mac 版的部署教程。
+
+
+前后端都在这个仓库:
+
+后台代码地址:https://github.com/Jackson0714/PassJava-Platform
+
+### 2、后端部署教程
+
+[后端部署教程](http://www.passjava.cn/#/01.PassJava/01.Introduction/7.%E6%9C%AC%E5%9C%B0%E9%83%A8%E7%BD%B2%E9%A1%B9%E7%9B%AEMac%E7%89%88):heavy_check_mark:
+
+### 3、前端部署教程
+
+[前端部署教程](https://github.com/Jackson0714/PassJava-Platform/tree/master/passjava-portal):heavy_check_mark:
+
+前端 Vue 代码地址:https://github.com/Jackson0714/PassJava-Platform/tree/master/passjava-portal
+
+### 小程序部署教程
+
+[小程序部署教程](https://github.com/Jackson0714/PassJava-Platform/blob/master/passjava-miniApp/README.md):heavy_check_mark:
+
+小程序代码地址:https://github.com/Jackson0714/PassJava-Platform/tree/master/passjava-miniApp
+
+## 简介
+
+- PassJava-Learning项目是PassJava(佳必过)项目的学习教程。对架构、业务、技术要点进行讲解。
+- PassJava 是一款Java`面试刷题`的开源系统,可以用零碎时间利用小程序查看常见面试题,夯实Java基础。
+- PassJava 项目可以教会你如何搭建SpringBoot项目,Spring Cloud项目
+- 采用流行的技术,如 SpringBoot、MyBatis、Redis、 MySql、 MongoDB、 RabbitMQ、Elasticsearch,采用Docker容器化部署。
+
+## 更好的阅读体验
+
+- 文档地址:[http://www.passjava.cn](http://www.passjava.cn)
+- 备用地址1:[https://jackson0714.github.io/PassJava-Learning](https://jackson0714.github.io/PassJava-Learning/)
+- 备用地址2:http://jayh2018.gitee.io/passjava-learning/#/README
+
+## PassJava 教程连载目录
+
+关注公众号:悟空聊架构,回复 PDF 获取离线版教程。
+
+- [打造一款 刷Java 知识的小程序](https://www.cnblogs.com/jackson0714/p/passJava1.html)
+- [打造一款 刷Java 知识的小程序(二)](https://www.cnblogs.com/jackson0714/p/passJava2.html)
+- [01.五分钟搞懂分布式基础概念](http://www.passjava.cn/#/03.Distributed/01.分布式基础概念)
+- [02.快速搭建Linux环境-运维必备](http://www.passjava.cn/#/01.PassJava/03.Deploy/01.环境搭建篇)
+- [03.配置虚拟机网络](http://www.passjava.cn/#/01.PassJava/03.Deploy/02.配置虚拟机网络)
+- [04.安装Docker](http://www.passjava.cn/#/01.PassJava/03.Deploy/03.安装docker)
+- [05.Docker安装mysql](http://www.passjava.cn/#/01.PassJava/03.Deploy/04.docker安装mysql)
+- [06.Docker安装redis](http://www.passjava.cn/#/01.PassJava/03.Deploy/05.docker安装redis)
+- [07.本地开发环境配置](http://www.passjava.cn/#/01.PassJava/03.Deploy/06.本地开发环境配置)
+- [08.配置Git](http://www.passjava.cn/#/01.PassJava/03.Deploy/07.配置git)
+- [09.初始化项目和添加微服务](http://www.passjava.cn/#/01.PassJava/02.PassJava_Architecture/01.创建项目和添加模块)
+- [10.PassJava-微服务划分图](http://www.passjava.cn/#/01.项目简介/3.微服务划分图)
+- [11.初始化数据库和表](http://www.passjava.cn/#/01.PassJava/02.PassJava_Architecture/02.创建数据库和表)
+- [12.搭建管理后台](http://www.passjava.cn/#/01.PassJava/02.PassJava_Architecture/03.搭建管理后台)
+- [13.自动生成前后端代码](http://www.passjava.cn/#/01.PassJava/02.PassJava_Architecture/04.自动生成前后端代码)
+- [14.整合MyBatis-Plus实现CRUD](http://www.passjava.cn/#/01.PassJava/02.PassJava_Architecture/05.整合MyBatis-Plus实现CRUD)
+- [15.生成所有微服务的CRUD代码](http://www.passjava.cn/#/01.PassJava/02.PassJava_Architecture/06.生成所有微服务的CRUD代码)
+- [16.Spring Cloud Alibaba 组件简介](http://www.passjava.cn/#/01.PassJava/02.PassJava_Architecture/07.SpringCloudAlibaba组件简介)
+- [17.SpringCloud整合Alibaba-Nacos注册中心](http://www.passjava.cn/#/01.PassJava/02.PassJava_Architecture/08.SpringCloud整合Alibaba-Nacos组件)
+- [18.SpringCloud整合OpenFeign组件](http://www.passjava.cn/#/01.PassJava/02.PassJava_Architecture/09.SpringCloud整合OpenFeign组件)
+- [19.SpringCloud整合Alibaba-Nacos配置中心](http://www.passjava.cn/#/01.PassJava/02.PassJava_Architecture/10.SpringCloud整合Nacos配置中心)
+- [20.SpringCloud整合Gateway网关](http://www.passjava.cn/#/01.PassJava/02.PassJava_Architecture/11.SpringCloud整合Gateway网关)
+- [21.管理后台-题目类型功能](http://www.passjava.cn/#/01.PassJava/04.PassJava_Business/01.管理后台-题目类型功能)
+- [22.SpringCloud整合OSS对象存储](http://www.passjava.cn/#/01.PassJava/02.PassJava_Architecture/12.SpringCloud整合OSS对象存储)
+- [23.整合统一异常处理](http://www.passjava.cn/#/01.PassJava/02.PassJava_Architecture/13.整合统一异常处理.md)
+- [24.Elasticsearch上篇(原理)](http://www.passjava.cn/#/01.PassJava/02.PassJava_Architecture/14.Elasticsearch原理.md)
+- [25.Elasticsearch中篇(实战)](http://www.passjava.cn/#/01.PassJava/02.PassJava_Architecture/15.Elasticsearch实战.md)
+- [26.Elasticsearch下篇(集群部署)更新中](http://www.passjava.cn/#/01.PassJava/02.PassJava_Architecture/16.Elasticsearch集群部署.md)
+- [27.微服务架构中的链路追踪](http://www.passjava.cn/#/01.PassJava/02.PassJava_Architecture/17.微服务架构中的链路追踪.md)
+- [28.48张图手摸手教你性能压测](http://www.passjava.cn/#/01.PassJava/02.PassJava_Architecture/18.48张图手摸手教你性能压测.md)
+- [29.缓存实战(一)](http://www.passjava.cn/#/01.PassJava/02.PassJava_Architecture/19.缓存实战(一).md)
+- [30.缓存实战(二)Redis分布式锁](http://www.passjava.cn/#/01.PassJava/02.PassJava_Architecture/22.缓存实战(二)Redis分布式锁.md)
+- [31.缓存实战(三)Redisson分布式锁](http://www.passjava.cn/#/01.PassJava/02.PassJava_Architecture/23.缓存实战(三)Redisson分布式锁.md)
+- [32.缓存实战(四)实战 Spring Cache](http://www.passjava.cn/#/01.PassJava/02.PassJava_Architecture/24.缓存实战(四)SpringCache.md)
+
+## 小程序演示
+
+
+
+## 项目地址
+
+[PassJava](https://github.com/Jackson0714/PassJava-Platform)
+
+## 介绍
+
+- [PassJava 架构及功能概览](http://www.passjava.cn/#/01.项目简介/2.项目微服务架构图)
+- [PassJava 学习所需知识点](http://www.passjava.cn/#/01.项目简介/5.项目前置要求)
+
+## 架构篇
+
+> 手把手教你搭建一个PassJava 中使用的 SpringCloud框架
+
+- [01.Spring Cloud Alibaba 组件简介](http://www.passjava.cn/#/01.PassJava/02.PassJava_Architecture/07.SpringCloudAlibaba组件简介)
+- [02.SpringCloud整合Alibaba-Nacos注册中心](http://www.passjava.cn/#/01.PassJava/02.PassJava_Architecture/08.SpringCloud整合Alibaba-Nacos组件)
+- [03.SpringCloud整合OpenFeign组件](http://www.passjava.cn/#/01.PassJava/02.PassJava_Architecture/09.SpringCloud整合OpenFeign组件)
+- [04.SpringCloud整合Alibaba-Nacos配置中心](http://www.passjava.cn/#/01.PassJava/02.PassJava_Architecture/10.SpringCloud整合Nacos配置中心)
+- [05.SpringCloud整合Gateway网关](http://www.passjava.cn/#/01.PassJava/02.PassJava_Architecture/11.SpringCloud整合Gateway网关)
+- [06.SpringCloud整合OSS对象存储](http://www.passjava.cn/#/01.PassJava/02.PassJava_Architecture/12.SpringCloud整合OSS对象存储)
+- [07.整合统一异常处理](http://www.passjava.cn/#/01.PassJava/02.PassJava_Architecture/13.整合统一异常处理)
+- [08.Elasticsearch上篇(原理)](http://www.passjava.cn/#/01.PassJava/02.PassJava_Architecture/14.Elasticsearch原理)
+- [09.Elasticsearch中篇(实战)](http://www.passjava.cn/#/01.PassJava/02.PassJava_Architecture/15.Elasticsearch实战.md)
+- [10.Elasticsearch下篇(集群部署)更新中](http://www.passjava.cn/#/01.PassJava/02.PassJava_Architecture/16.Elasticsearch集群部署.md)
+- [11.微服务架构中的链路追踪](http://www.passjava.cn/#/01.PassJava/02.PassJava_Architecture/17.微服务架构中的链路追踪.md)
+- [12.48张图手摸手教你性能压测](http://www.passjava.cn/#/01.PassJava/02.PassJava_Architecture/18.48张图手摸手教你性能压测.md)
+- [13.缓存实战(一)](http://www.passjava.cn/#/01.PassJava/02.PassJava_Architecture/19.缓存实战(一).md)
+- [14.缓存实战(二)Redis分布式锁](http://www.passjava.cn/#/01.PassJava/02.PassJava_Architecture/22.缓存实战(二)Redis分布式锁.md)
+- [15.缓存实战(三)Redisson分布式锁](http://www.passjava.cn/#/01.PassJava/02.PassJava_Architecture/23.缓存实战(三)Redisson分布式锁.md)
+- [16.缓存实战(四)实战 Spring Cache](http://www.passjava.cn/#/01.PassJava/02.PassJava_Architecture/24.缓存实战(四)SpringCache.md)
+
## Java并发多线程
> 从源码层面详细讲解并发多线程
+> 关注公众号:悟空聊架构,回复`多线程`获取离线版教程。
+
+- [01.反制面试官-14张原理图-再也不怕被问volatile!](http://www.passjava.cn/#/10.并发多线程/01.反制面试官-14张原理图-再也不怕被问volatile!.md)
+- [02.我跟老婆讲CAS原理,被鄙视太简单!15张图-源码调试](http://www.passjava.cn/#/10.并发多线程/02.我跟老婆讲CAS原理-被鄙视太简单-15张图-源码调试.md)
+- [03.Java并发必知必会第三弹:用积木讲解ABA原理](http://www.passjava.cn/#/10.并发多线程/03.Java并发必知必会第三弹:用积木讲解ABA原理.md)
+- [04.全网最细-21张图带你领略集合的线程不安全](http://www.passjava.cn/#/10.并发多线程/04.全网最细-21张图带你领略集合的线程不安全.md)
+- [05.5000字-24张图带你彻底理解Java中的21种锁](http://www.passjava.cn/#/10.并发多线程/05.5000字-24张图带你彻底理解Java中的21种锁.md)
+- [06.干货-45张图庖丁解牛18种Queue,你知道几种?](http://www.passjava.cn/#/10.并发多线程/06.干货-45张图庖丁解牛18种Queue,你知道几种.md)
-- [01.反制面试官-14张原理图-再也不怕被问volatile!](https://juejin.im/post/6861885337568804871)
-- [02.我跟老婆讲CAS原理,被鄙视太简单!15张图 -源码调试 .md](https://juejin.im/post/6863799243182702599)
-- [03.Java并发必知必会第三弹:用积木讲解ABA原理.md](https://juejin.im/post/6864945088721027079)
-- [04.全网最细-21张图带你领略集合的线程不安全](https://juejin.im/post/6866444584688451591)
-- [05.5000字 | 24张图带你彻底理解Java中的21种锁](https://juejin.im/post/6867922895536914446)
-- [06.干货 | 45张图庖丁解牛18种Queue,你知道几种?](https://juejin.im/post/6870298844425371655)
## 分布式
+关注公众号:悟空聊架构,回复`分布式`获取离线版教程。
+
+- [01.分布式基础概念](http://www.passjava.cn/#/03.Distributed/01.分布式基础概念.md)
+- [02.这三年被分布式坑惨了,曝光十大坑](http://www.passjava.cn/#/03.Distributed/02.分布式中的十种坑.md)
+- [03.用三国杀讲分布式算法,舒适了吧?](http://www.passjava.cn/#/03.Distributed/03.用三国杀讲分布式算法,舒适了吧?.md)
+- [04.用太极拳讲分布式理论,舒服!](http://www.passjava.cn/#/03.Distributed/04.用太极拳讲分布式理论,舒服!.md)
+- [05.诸葛VS庞统,拿下Paxos](http://www.passjava.cn/#/03.Distributed/05.诸葛VS庞统,拿下Paxos.md)
+- [06.用动图讲解分布式Raft](http://www.passjava.cn/#/03.Distributed/06.用动图讲解分布式Raft.md)
+- [07.韩信大招:一致性哈希](http://www.passjava.cn/#/03.Distributed/07.韩信大招:一致性哈希.md)
+- [08.Gossip协议](http://www.passjava.cn/#/03.Distributed/08.Gossip协议.md)
+- [09.QuorumNWR算法](http://www.passjava.cn/#/03.Distributed/09.QuorumNWR算法.md)
+- [10.区块链12问和Pow算法](http://www.passjava.cn/#/03.Distributed/10.区块链12问.md)
+- [11.Zookeeper中的ZAB协议](http://www.passjava.cn/#/03.Distributed/14.ZAB协议.md)
+
+## 架构设计
+
+- [01.微服务架构中的两款流量防卫兵](http://www.passjava.cn/#/04.Architecture/01.架构图解/01.微服务架构中的两款流量防卫兵.md)
+- [02.浅析扣减库存的方案设计](http://www.passjava.cn/#/04.Architecture/01.架构图解/02.浅析扣减库存的方案设计.md)
+- [03.订单系统中的补偿事务设计](http://www.passjava.cn/#/04.Architecture/01.架构图解/03.订单系统中的补偿事务设计.md)
+- [04.请警惕Elasticsearch的三大坑](http://www.passjava.cn/#/04.Architecture/01.架构图解/04.请警惕Elasticsearch的三大坑.md)
+- [05.B站崩了,聊聊高可用和异地多活](http://www.passjava.cn/#/04.Architecture/01.架构图解/05.B站崩了,聊聊高可用和异地多活.md)
+- [06.查漏补缺,DDD领域驱动设计2022-02-15](http://www.passjava.cn/#/15.DDD领域驱动设计/01.查漏补缺,DDD领域驱动设计.md)
+- [07.自研简易版任务调度框架2022-03-04](http://www.passjava.cn/#/04.Architecture/01.架构图解/06.自研简易版任务调度框架2022-03-04.md)
+- [96.闲鱼架构演进](http://www.passjava.cn/#/04.Architecture/01.架构图解/96.闲鱼架构演进.md)
+- [97.京东白条数据架构演进](http://www.passjava.cn/#/04.Architecture/01.架构图解/97.京东白条数据架构演进.md)
+- [98.春晚红包架构](http://www.passjava.cn/#/04.Architecture/01.架构图解/98.春晚红包架构.md)
+- [99.淘宝架构10年](http://www.passjava.cn/#/04.Architecture/01.架构图解/99.淘宝架构10年.md)
+
+
+## SpringCloud 架构剖析🔥🔥🔥
+
+- 注册中心Eureka
+ - [01.Eureka基本原理和简单使用](http://www.passjava.cn/#/02.SpringCloud/01.Eureka注册中心/01.Eureka基本原理和简单使用.md)
+ - [02.Eureka本地集群搭建](http://www.passjava.cn/#/02.SpringCloud/01.Eureka注册中心/02.Eureka本地集群搭建.md)
+ - [03.Eureka源码之启动过程](http://www.passjava.cn/#/02.SpringCloud/01.Eureka注册中心/03.Eureka源码之启动过程.md)
+ - [04.Eureka源码之客户端注册](http://www.passjava.cn/#/02.SpringCloud/01.Eureka注册中心/04.Eureka源码之客户端注册.md)
+ - [05.Eureka源码之服务端接收注册信息](http://www.passjava.cn/#/02.SpringCloud/01.Eureka注册中心/05.Eureka源码之服务端接收注册信息.md)
+ - [06.Eureka源码之客户端首次获取注册表](http://www.passjava.cn/#/02.SpringCloud/01.Eureka注册中心/06.Eureka源码之客户端首次获取注册表.md)
+ - [07.Eureka源码之客户端增量获取注册表](http://www.passjava.cn/#/02.SpringCloud/01.Eureka注册中心/07.Eureka源码之客户端增量获取注册表.md)
+ - [08.Eureka源码之Server端的多级缓存机制](http://www.passjava.cn/#/02.SpringCloud/01.Eureka注册中心/08.Eureka源码之Server端的多级缓存机制.md)
+ - [98.Eureka控制台参数说明](http://www.passjava.cn/#/02.SpringCloud/01.Eureka注册中心/98.Eureka控制台参数说明.md)
+- 负载均衡Ribbon
+ - [01.Ribbon架构剖析](http://www.passjava.cn/#/02.SpringCloud/02.Ribbon负载均衡/01.Ribbon架构剖析.md)
+- 远程调用Feign
+ - [01.Feign远程调用基本原理和使用](http://www.passjava.cn/#/02.SpringCloud/03.Feign远程调用/01.Feign远程调用基本原理和使用.md)
+ - [02.Feign架构剖析](http://www.passjava.cn/#/02.SpringCloud/03.Feign远程调用/02.Feign架构剖析.md)
+- 熔断限流Hystrix
+ - [01.Hystrix架构剖析](http://www.passjava.cn/#/02.SpringCloud/04.Hystrix限流熔断器/01.Hystrix架构剖析.md)
+- Gateway网关
+ - [01.SpringCloud整合Gateway网关](02.SpringCloud/06.Gateway网关/01.SpringCloud整合Gateway网关.md)
+ - [02.深入浅入Gateway](http://www.passjava.cn/#/02.SpringCloud/06.Gateway网关/02.深入浅入Gateway.md)
+- Nacos配置注册中心
+ - [01.使用Nacos作为注册中心](http://www.passjava.cn/#/02.SpringCloud/07.Nacos配置注册中心/01.使用Nacos作为注册中心和配置中心.md)
+ - [02.Nacos架构原理①:一条注册请求会经历什么?](http://www.passjava.cn/#/02.SpringCloud/07.Nacos配置注册中心/02.Nacos架构原理①:一条注册请求会经历什么?.md)
+ - [03.Nacos架构原理②:揭秘AP架构——Distro一致性协议](http://www.passjava.cn/#/02.SpringCloud/07.Nacos配置注册中心/03.Nacos架构原理②:揭秘AP架构——Distro一致性协议.md)
+- Sentinel限流
+ - [01.Hystrix和Sentinel选型对比](http://www.passjava.cn/#/02.SpringCloud/08.Sentinel限流/01.Hystrix和Sentinel选型对比.md)
+
+## 用故事讲解技术
+
+* 中间件选型
+ - [01.如果把4个「消息队列」都在一个群里,他们会聊什么?](http://www.passjava.cn/#/04.Architecture/03.用故事讲解技术/01.中间件选型/01.如果消息队列都在一个群里,他们会聊什么?.md)
+ - [02.如果把4个「链路追踪」组件放到一个群里,他们会聊些什么?](http://www.passjava.cn/#/04.Architecture/03.用故事讲解技术/01.中间件选型/02.链路追踪如何选型)
+* 高可用
+ * [01.东汉末年,他们把熔断限流玩到了极致](http://www.passjava.cn/#04.Architecture/03.用故事讲解技术/02.高可用/01.东汉末年,他们把熔断限流玩到了极致.md)
+ * [02.我是一个秒杀请求,正在逃离这颗星球](http://www.passjava.cn/#/04.Architecture/03.用故事讲解技术/02.高可用/02.我是一个秒杀请求,正在逃离这颗星球.md)
+ * [03.为什么要除夕,原来是内存爆了](http://www.passjava.cn/#/04.Architecture/03.用故事讲解技术/02.高可用/03.为什么要除夕,原来是内存爆了.md)
+
+
+## 面试必背
+- [01.Redis 面试题汇总 第一季](http://www.passjava.cn/#/88.Interview/01.Redis/Redis1.md)
+- [02.并发编程 面试突击](http://www.passjava.cn/#/88.Interview/02.Thread/Thread1.md)
+- [03.MySQL 面试突击](http://www.passjava.cn/#/88.Interview/03.Database/MySQL1.md)
+- [04.JVM 面试突击](http://www.passjava.cn/#/88.Interview/04.JVM/JVM1.md)
+- 05.设计模式
+ - [01.观察者模式ObserverPattern](http://www.passjava.cn/#/88.Interview/05.DesignPattern/01.观察者模式ObserverPattern.md)
+ - [02.备忘录模式MementoPattern](http://www.passjava.cn/#/88.Interview/05.DesignPattern/02.备忘录模式MementoPattern.md)
+ - [03.原型模式PrototypePattern](http://www.passjava.cn/#/88.Interview/05.DesignPattern/03.原型模式PrototypePattern.md)
+ -[04.中介者模式MediatorPattern](http://www.passjava.cn/#/88.Interview/05.DesignPattern/04.中介者模式MediatorPattern.md)
+
+
+## 悟空学习群问题汇总
+- [01.悟空群聊问题20201026-删除binlog问题](http://www.passjava.cn/#/102.学习群问题汇总/01.20201026_删除binlog问题.md)
+- [02.悟空群聊问题20201028_导出报表问题](http://www.passjava.cn/#/102.学习群问题汇总/02.20201028_导出报表问题.md)
+- [03.悟空群聊问题20201030_List和ArrayList如何选择](http://www.passjava.cn/#/102.学习群问题汇总/03.20201030_List和ArrayList如何选择.md)
+## 群成员学习分享
+- [01.Nginx Location 正则](http://www.passjava.cn/#/104.群成员学习分享/01.NginxLocation正则.md)
+
+## JVM
+- [01.50+道JVM面试题+11张思维导图就是让你懂JVM](http://www.passjava.cn/#/06.Java核心知识/04.JVM进阶/01.50+道JVM面试题+11张思维导图就是让你懂JVM.md)
+- [02.秒懂JVM的三大参数类型,就靠这十个小实验了](http://www.passjava.cn/#/06.Java核心知识/04.JVM进阶/02.秒懂JVM的三大参数类型,就靠这十个小实验了.md)
+- [98.字节码指令表](http://www.passjava.cn/#/06.Java核心知识/04.JVM进阶/98.字节码指令表.md)
+- [99.JVM参数列表](http://www.passjava.cn/#/06.Java核心知识/04.JVM进阶/99.JVM参数列表.md)
## 工具篇
> 一些常用开发工具的使用
- [01.自定义Markdown神器Typora的主题样式](https://juejin.im/post/6864745378558771214)
-- [02.使用docsify写开源文档](http://www.jayh.club/#/99.tools/02.使用docsify写开源文档)
+- [02.使用docsify写开源文档](http://www.passjava.cn/#/99.tools/02.使用docsify写开源文档)
- [03.Git同时上传到码云和github](https://juejin.im/post/6859388700858679303)
-- [04.图床神器配置](http://www.jayh.club/#/99.tools/04.图床神器配置)
-- [05.我的常用工具](http://www.jayh.club/#/99.tools/05.我的常用工具)
-- [06.Idea的十八般武艺](http://www.jayh.club/#/99.tools/06.Idea的十八般武艺)
-- [93.IDEA快捷键](http://www.jayh.club/#/99.tools/93.IDEA快捷键)
-- [94.Ubuntu16.04安装最新版nodejs](http://www.jayh.club/#/99.tools/94.Ubuntu16_04安装最新版nodejs)
-- [95.VSCode快速生成Vue模板](http://www.jayh.club/#/99.tools/95.VSCode快速生成Vue模板)
-- [96.HTML特殊符号](http://www.jayh.club/#/99.tools/96.HTML特殊符号)
-- [97.IDEA设置代码彩虹颜色](http://www.jayh.club/#/99.tools/97.IDEA设置代码彩虹颜色)
-- [98.IDEA调试Java多线程](http://www.jayh.club/#/99.tools/98.IDEA调试Java多线程)
-- [99.IDEA调试Java源码](http://www.jayh.club/#/99.tools/99.IDEA调试Java源码)
+- [04.图床神器配置](http://www.passjava.cn/#/99.tools/04.图床神器配置)
+- [05.我的常用工具](http://www.passjava.cn/#/99.tools/05.我的常用工具)
+- [06.Idea的十八般武艺](http://www.passjava.cn/#/99.tools/06.Idea的十八般武艺)
+- [07.画架构原理图,还是它好使](http://www.passjava.cn/#/99.tools/07.画架构原理图,还是它好使)
+- [08.添加Gitee密钥](http://www.passjava.cn/#/99.tools/08.添加Gitee密钥)
+- [09.给自己的博客docsify加上评论功能](http://www.passjava.cn/#/99.tools/09.给自己的博客docsify加上评论功能)
+- [91.Maven配置](http://www.passjava.cn/#/99.tools/91.Maven配置)
+- [92.Java环境问题](http://www.passjava.cn/#/99.tools/92.Java环境问题)
+- [93.IDEA快捷键](http://www.passjava.cn/#/99.tools/93.IDEA快捷键)
+- [94.Ubuntu16.04安装最新版nodejs](http://www.passjava.cn/#/99.tools/94.Ubuntu16_04安装最新版nodejs)
+- [95.VSCode快速生成Vue模板](http://www.passjava.cn/#/99.tools/95.VSCode快速生成Vue模板)
+- [96.HTML特殊符号](http://www.passjava.cn/#/99.tools/96.HTML特殊符号)
+- [97.IDEA设置代码彩虹颜色](http://www.passjava.cn/#/99.tools/97.IDEA设置代码彩虹颜色)
+- [98.IDEA调试Java多线程](http://www.passjava.cn/#/99.tools/98.IDEA调试Java多线程)
+- [99.IDEA调试Java源码](http://www.passjava.cn/#/99.tools/99.IDEA调试Java源码)
+
+## 业务篇
+
+> 全面解析 PassJava 中使用的数据库表结构和功能
+
+## SpringBoot 学习篇
+
+> PassJava 中一些功能的技术要点解析
+
+- [05.SpringBoot整合Jdbc](http://www.passjava.cn/#/03.SpringBoot学习篇/spring-boot-05-data-jdbc.md)
+- [06.SpringBoot整合Druid](http://www.passjava.cn/#/03.SpringBoot学习篇/spring-boot-06-data-druid.md)
+- [07.spring-boot-05-data-jdbc](http://www.passjava.cn/#/03.SpringBoot学习篇/spring-boot-07-data-mybatis.md)
+- [08.SpringBoot Mybatis逻辑删除](http://www.passjava.cn/#/03.SpringBoot学习篇/08.SpringBoot-Mybatis逻辑删除.md)
+- [09.Object划分](http://www.passjava.cn/#/03.SpringBoot学习篇/09.Object划分.md)
+
+## 部署篇
+
+> PassJava 开发及生产环境的搭建
+
+- [01.快速搭建Linux环境-运维必备](http://www.passjava.cn/#/01.PassJava/03.Deploy/01.环境搭建篇)
+- [02.配置虚拟机网络](http://www.passjava.cn/#/01.PassJava/03.Deploy/02.配置虚拟机网络)
+- [03.安装Docker](http://www.passjava.cn/#/01.PassJava/03.Deploy/03.安装docker)
+- [04.Docker安装mysql](http://www.passjava.cn/#/01.PassJava/03.Deploy/04.docker安装mysql)
+- [05.Docker安装redis](http://www.passjava.cn/#/01.PassJava/03.Deploy/05.docker安装redis)
+- [06.本地开发环境配置](http://www.passjava.cn/#/01.PassJava/03.Deploy/06.本地开发环境配置)
+- [07.配置Git](http://www.passjava.cn/#/01.PassJava/03.Deploy/07.配置git)
## LeetCode刷题
-- [LeetCode数组第一题](http://www.jayh.club/#/92.LeetCode/01.数组/001.两数之和-数组-LeetCode第1题)
+- [LeetCode数组第一题](http://www.passjava.cn/#/92.LeetCode算法题/01.数组/001.两数之和-数组-LeetCode第1题)
## 公众号
PassJava 项目全套学习教程连载中,关注公众号「**PassJava666**」第一时间获取。
-
+
\ No newline at end of file
diff --git "a/data/sql/01.\345\210\235\345\247\213\345\214\226\344\270\232\345\212\241\346\225\260\346\215\256\345\272\223.sql" "b/data/sql/01.\345\210\235\345\247\213\345\214\226\344\270\232\345\212\241\346\225\260\346\215\256\345\272\223.sql"
index bfe3f96d..fa7b8ef0 100644
--- "a/data/sql/01.\345\210\235\345\247\213\345\214\226\344\270\232\345\212\241\346\225\260\346\215\256\345\272\223.sql"
+++ "b/data/sql/01.\345\210\235\345\247\213\345\214\226\344\270\232\345\212\241\346\225\260\346\215\256\345\272\223.sql"
@@ -3,13 +3,14 @@ DROP DATABASE IF EXISTS `passjava_qms`;
DROP DATABASE IF EXISTS `passjava_sms`;
DROP DATABASE IF EXISTS `passjava_cms`;
DROP DATABASE IF EXISTS `passjava_chms`;
+DROP DATABASE IF EXISTS `passjava_auth`;
CREATE DATABASE passjava_ums CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci;
CREATE DATABASE passjava_qms CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci;
CREATE DATABASE passjava_sms CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci;
CREATE DATABASE passjava_cms CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci;
CREATE DATABASE passjava_chms CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci;
-
+CREATE DATABASE passjava_auth CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci;
USE passjava_ums;
@@ -41,6 +42,7 @@ CREATE TABLE ums_member
del_flag TINYINT(1) DEFAULT 0 COMMENT '删除标记(0-正常,1-删除)',
create_time DATETIME DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
update_time DATETIME DEFAULT CURRENT_TIMESTAMP COMMENT '更新时间',
+ user_id VARCHAR(64) COMMENT '用户账户名',
PRIMARY KEY (id)
);
@@ -250,3 +252,24 @@ CREATE TABLE chms_access_token
ALTER TABLE chms_access_token COMMENT '渠道-认证表';
+
+USE passjava_auth;
+
+/*==============================================================*/
+/* Table: sys_user */
+/*==============================================================*/
+
+DROP TABLE IF EXISTS `sys_user`;
+CREATE TABLE `sys_user` (
+ `username` varchar(50) NOT NULL,
+ `password` varchar(255) DEFAULT NULL,
+ `org_id` int DEFAULT NULL,
+ `enabled` bit(1) DEFAULT NULL,
+ `phone` varchar(20) DEFAULT NULL,
+ `email` varchar(50) DEFAULT NULL,
+ `create_time` datetime DEFAULT NULL,
+ `update_time` datetime DEFAULT NULL,
+ `id` int NOT NULL AUTO_INCREMENT,
+ `user_id` varchar(64) NOT NULL,
+ PRIMARY KEY (`id`,`user_id`) USING BTREE
+) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci;
\ No newline at end of file
diff --git "a/data/sql/02.\345\210\235\345\247\213\345\214\226\347\263\273\347\273\237\346\225\260\346\215\256\345\272\223.sql" "b/data/sql/02.\345\210\235\345\247\213\345\214\226\347\263\273\347\273\237\346\225\260\346\215\256\345\272\223.sql"
index ba437d51..4220b1b5 100644
--- "a/data/sql/02.\345\210\235\345\247\213\345\214\226\347\263\273\347\273\237\346\225\260\346\215\256\345\272\223.sql"
+++ "b/data/sql/02.\345\210\235\345\247\213\345\214\226\347\263\273\347\273\237\346\225\260\346\215\256\345\272\223.sql"
@@ -2,6 +2,8 @@ DROP DATABASE IF EXISTS `passjava_admin`;
CREATE DATABASE passjava_admin CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci;
+USE passjava_admin;
+
-- 菜单
CREATE TABLE `sys_menu` (
`menu_id` bigint NOT NULL AUTO_INCREMENT,
diff --git "a/data/sql/03.\345\210\235\345\247\213\345\214\226\350\217\234\345\215\225\351\205\215\347\275\256.sql" "b/data/sql/03.\345\210\235\345\247\213\345\214\226\350\217\234\345\215\225\351\205\215\347\275\256.sql"
index 68411e4d..c132927c 100644
--- "a/data/sql/03.\345\210\235\345\247\213\345\214\226\350\217\234\345\215\225\351\205\215\347\275\256.sql"
+++ "b/data/sql/03.\345\210\235\345\247\213\345\214\226\350\217\234\345\215\225\351\205\215\347\275\256.sql"
@@ -1,9 +1,11 @@
-
+USE passjava_admin;
+
insert into `sys_menu`(`menu_id`,`parent_id`,`name`,`url`,`perms`,`type`,`icon`,`order_num`)
values
-#(31,0,'题目中心','','',0,'editor',0),
-# (32,31,'题目配置','question/question','',1,'config', 0),
-# (33,31,'类型配置','question/type','',1,'config', 0);
+(31,0,'题目中心','','',0,'editor',0),
+(32,31,'题目配置','question/question','',1,'config', 0),
+(33,31,'类型配置','question/type','',1,'config', 0),
+
(34,0,'内容中心','','',0,'editor',0),
- (35,34,'横幅配置','content/banner','',1,'config', 0),
- (36,34,'资讯配置','content/news','',1,'config', 0);
\ No newline at end of file
+(35,34,'横幅配置','content/banner','',1,'config', 0),
+(36,34,'资讯配置','content/news','',1,'config', 0);
\ No newline at end of file
diff --git "a/data/sql/04.\346\217\222\345\205\245\344\270\232\345\212\241\346\225\260\346\215\256.sql" "b/data/sql/04.\346\217\222\345\205\245\344\270\232\345\212\241\346\225\260\346\215\256.sql"
new file mode 100644
index 00000000..4f9441ab
--- /dev/null
+++ "b/data/sql/04.\346\217\222\345\205\245\344\270\232\345\212\241\346\225\260\346\215\256.sql"
@@ -0,0 +1,24 @@
+use passjava_ums;
+
+BEGIN;
+INSERT INTO `ums_member` (`id`, `mini_openid`, `mp_openid`, `unionid`, `level_id`, `user_name`, `PASSWORD`, `nickname`, `phone`, `email`, `avatar`, `gender`, `birth`, `city`, `source_type`, `integration`, `register_time`, `del_flag`, `create_time`, `update_time`, `user_id`) VALUES (123, NULL, NULL, NULL, NULL, '悟空', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, 0, '2022-08-12 16:22:53', '2022-08-12 16:22:53', 'wukong');
+COMMIT;
+
+
+use passjava_auth;
+
+BEGIN;
+INSERT INTO `sys_user` (`username`, `password`, `org_id`, `enabled`, `phone`, `email`, `create_time`, `update_time`, `id`, `user_id`) VALUES ('wukong', '$2a$10$IAHUqoKYSgu/P0l9CiraTOQ/SJottVw9uS.QX9AS.NpZsLmtP5QgW', 1, b'1', '15912345678', 'abc@qq.com', '2022-08-10 07:20:30', '2022-08-10 07:24:33', 1, 'wukong');
+COMMIT;
+
+
+USE passjava_qms;
+BEGIN;
+INSERT INTO `qms_type` (`id`, `TYPE`, `comments`, `logo_url`, `del_flag`, `create_time`, `update_time`) VALUES (1, 'javaBasic', 'Java基础', 'https://passjava.oss-cn-beijing.aliyuncs.com/2022-08-16/b150bdb3-9e57-4354-85e0-21c0d48d3581_logo.png', 0, '2022-08-16 22:28:16', '2022-08-16 22:28:16');
+INSERT INTO `qms_type` (`id`, `TYPE`, `comments`, `logo_url`, `del_flag`, `create_time`, `update_time`) VALUES (2, 'jvm', 'Java虚拟机', 'https://passjava.oss-cn-beijing.aliyuncs.com/2022-08-16/b150bdb3-9e57-4354-85e0-21c0d48d3581_logo.png', 0, '2022-08-16 22:28:16', '2022-08-16 22:28:16');
+INSERT INTO `qms_type` (`id`, `TYPE`, `comments`, `logo_url`, `del_flag`, `create_time`, `update_time`) VALUES (3, 'spring', 'Spring核心原理', 'https://passjava.oss-cn-beijing.aliyuncs.com/2022-08-16/b150bdb3-9e57-4354-85e0-21c0d48d3581_logo.png', 0, '2022-08-16 22:28:16', '2022-08-16 22:28:16');
+INSERT INTO `qms_type` (`id`, `TYPE`, `comments`, `logo_url`, `del_flag`, `create_time`, `update_time`) VALUES (4, 'bigData', '大数据', 'https://passjava.oss-cn-beijing.aliyuncs.com/2022-08-16/b150bdb3-9e57-4354-85e0-21c0d48d3581_logo.png', 0, '2022-08-16 22:28:16', '2022-08-16 22:28:16');
+INSERT INTO `qms_type` (`id`, `TYPE`, `comments`, `logo_url`, `del_flag`, `create_time`, `update_time`) VALUES (5, 'thread', '多线程', 'https://passjava.oss-cn-beijing.aliyuncs.com/2022-08-16/b150bdb3-9e57-4354-85e0-21c0d48d3581_logo.png', 0, '2022-08-16 22:28:16', '2022-08-16 22:28:16');
+
+INSERT INTO `passjava_qms`.`qms_question` (`id`, `title`, `answer`, `LEVEL`, `display_order`, `sub_title`, `TYPE`, `ENABLE`, `del_flag`, `create_time`, `update_time`) VALUES (1, 'JVM垃圾回收机制', '垃圾自动回收', 1, 1, 'GC', 1, 1, 0, '2022-08-16 22:40:53', '2022-08-16 22:40:53');
+COMMIT;
\ No newline at end of file
diff --git a/passjava-auth/pom.xml b/passjava-auth/pom.xml
new file mode 100644
index 00000000..640c0d1a
--- /dev/null
+++ b/passjava-auth/pom.xml
@@ -0,0 +1,82 @@
+
+
+
+ org.springframework.boot
+ spring-boot-starter-parent
+ 2.2.6.RELEASE
+
+
+ 4.0.0
+ com.jackson0714.passjava
+
+ passjava-auth
+ 0.0.1-SNAPSHOT
+ passjava-auth
+ 佳必过-认证服务
+
+
+ 1.8
+ Hoxton.SR3
+
+
+
+
+ com.jackson0714.passjava
+ passjava-common
+ 0.0.1-SNAPSHOT
+
+
+ org.springframework.boot
+ spring-boot-starter-data-jpa
+
+
+ mysql
+ mysql-connector-java
+
+
+ org.springframework.boot
+ spring-boot-autoconfigure
+
+
+ org.springframework.boot
+ spring-boot-starter-web
+
+
+ org.apache.commons
+ commons-lang3
+
+
+ com.jackson0714.passjava
+ passjava-jwt
+ 0.0.1-SNAPSHOT
+ compile
+
+
+ io.projectreactor
+ reactor-core
+
+
+
+
+
+
+ org.springframework.cloud
+ spring-cloud-dependencies
+ ${spring-cloud.version}
+ pom
+ import
+
+
+
+
+
+
+
+ org.springframework.boot
+ spring-boot-maven-plugin
+
+
+
+
\ No newline at end of file
diff --git a/passjava-auth/src/main/java/com/jackson0714/passjava/auth/PassjavaAuthApplication.java b/passjava-auth/src/main/java/com/jackson0714/passjava/auth/PassjavaAuthApplication.java
new file mode 100644
index 00000000..bb319ac0
--- /dev/null
+++ b/passjava-auth/src/main/java/com/jackson0714/passjava/auth/PassjavaAuthApplication.java
@@ -0,0 +1,20 @@
+package com.jackson0714.passjava.auth;
+
+import org.springframework.boot.SpringApplication;
+import org.springframework.boot.autoconfigure.SpringBootApplication;
+import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
+import org.springframework.cloud.context.config.annotation.RefreshScope;
+
+/**
+ * @author wukong
+ */
+@RefreshScope
+@EnableDiscoveryClient
+@SpringBootApplication(scanBasePackages = {"com.jackson0714.passjava"})
+public class PassjavaAuthApplication {
+
+ public static void main(String[] args) {
+ SpringApplication.run(PassjavaAuthApplication.class, args);
+ }
+
+}
diff --git a/passjava-auth/src/main/java/com/jackson0714/passjava/auth/controller/JwtAuthController.java b/passjava-auth/src/main/java/com/jackson0714/passjava/auth/controller/JwtAuthController.java
new file mode 100644
index 00000000..90b51fb3
--- /dev/null
+++ b/passjava-auth/src/main/java/com/jackson0714/passjava/auth/controller/JwtAuthController.java
@@ -0,0 +1,144 @@
+package com.jackson0714.passjava.auth.controller;
+
+import com.jackson0714.passjava.common.utils.SecurityUtils;
+import com.jackson0714.passjava.jwt.common.ResponseCodeEnum;
+import com.jackson0714.passjava.jwt.config.PassJavaJwtProperties;
+import com.jackson0714.passjava.auth.jpa.SysUser;
+import com.jackson0714.passjava.auth.jpa.SysUserRepository;
+import com.jackson0714.passjava.jwt.utils.PassJavaJwtTokenUtil;
+import org.apache.commons.lang3.StringUtils;
+import org.springframework.security.crypto.password.PasswordEncoder;
+import org.springframework.web.bind.annotation.*;
+
+import javax.annotation.Resource;
+import java.util.HashMap;
+import java.util.Map;
+import reactor.core.publisher.Mono;
+import com.jackson0714.passjava.jwt.common.ResponseResult;
+
+/**
+ * 获取 JWT 令牌和刷新 JWT 令牌接口
+ *
+ * @author 悟空聊架构
+ * @site www.passjava.cn
+ * @date 2022-08-09
+ *
+ * @startuml
+ * @enduml
+ */
+@RestController
+@RequestMapping("/auth")
+//@ConditionalOnProperty(name = "passjava.gateway.jwt.useDefaultController", havingValue = "true")
+public class JwtAuthController {
+
+ @Resource
+ private PassJavaJwtProperties jwtProperties;
+ @Resource
+ private SysUserRepository sysUserRepository;
+ @Resource
+ private PassJavaJwtTokenUtil jwtTokenUtil;
+ @Resource
+ private PasswordEncoder passwordEncoder;
+
+ /**
+ * 使用用户名密码换 JWT 令牌
+ */
+ @PostMapping("/login")
+ public ResponseResult> login(@RequestBody Map map){
+ // 从请求体中获取用户名密码
+ String userId = map.get(jwtProperties.getUserParamName());
+ String password = map.get(jwtProperties.getPwdParamName());
+
+ // 如果用户名和密码为空
+ if(StringUtils.isEmpty(userId) || StringUtils.isEmpty(password)){
+ return ResponseResult.error(ResponseCodeEnum.LOGIN_ERROR.getCode(), ResponseCodeEnum.LOGIN_ERROR.getMessage());
+ }
+ // 根据 userId 去数据库查找该用户
+ SysUser sysUser = sysUserRepository.findByUserId(userId);
+ if(sysUser != null){
+ // 将数据库的加密密码与用户明文密码做比对
+ boolean isAuthenticated = passwordEncoder.matches(password,
+ sysUser.getPassword());
+ // 如果密码匹配成功
+ if(isAuthenticated){
+ // 通过 jwtTokenUtil 生成 JWT 令牌和刷新令牌
+ Map tokenMap = jwtTokenUtil
+ .generateTokenAndRefreshToken(userId, sysUser.getUsername());
+ return ResponseResult.success(tokenMap);
+ }
+ // 如果密码匹配失败
+ return ResponseResult.error(ResponseCodeEnum.LOGIN_ERROR.getCode(), ResponseCodeEnum.LOGIN_ERROR.getMessage());
+ }
+ // 如果未找到用户
+ return ResponseResult.error(ResponseCodeEnum.LOGIN_ERROR.getCode(), ResponseCodeEnum.LOGIN_ERROR.getMessage());
+ }
+
+ /**
+ * 刷新JWT令牌,用旧的令牌换新的令牌
+ */
+ @GetMapping("/refreshtoken")
+ public Mono refreshToken(@RequestHeader("${passjava.jwt.header}") String token){
+ token = SecurityUtils.replaceTokenPrefix(token);
+
+ if (StringUtils.isEmpty(token)) {
+ return buildErrorResponse(ResponseCodeEnum.TOKEN_MISSION);
+ }
+
+ // 对Token解签名,并验证Token是否过期
+ boolean isJwtNotValid = jwtTokenUtil.isTokenExpired(token);
+ if(isJwtNotValid){
+ return buildErrorResponse(ResponseCodeEnum.TOKEN_INVALID);
+ }
+ // 验证 token 里面的 userId 是否为空
+
+ String userId = jwtTokenUtil.getUserIdFromToken(token);
+ String username = jwtTokenUtil.getUserNameFromToken(token);
+ if (StringUtils.isEmpty(userId)) {
+ return buildErrorResponse(ResponseCodeEnum.TOKEN_CHECK_INFO_FAILED);
+ }
+
+ // 这里为了保证 refreshToken 只能用一次,刷新后,会从 redis 中删除。
+ // 如果用的不是 redis 中的 refreshToken 进行刷新令牌,则不能刷新。
+ // 如果使用 redis 中已过期的 refreshToken 也不能刷新令牌。
+ boolean isRefreshTokenNotExisted = jwtTokenUtil.isRefreshTokenNotExistCache(token);
+ if(isRefreshTokenNotExisted){
+ return buildErrorResponse(ResponseCodeEnum.REFRESH_TOKEN_INVALID);
+ }
+
+ String us = jwtTokenUtil.getUserIdFromToken(token);
+ Map tokenMap = jwtTokenUtil.refreshTokenAndGenerateToken(userId, username);
+
+ return buildSuccessResponse(tokenMap);
+ }
+
+ /**
+ * 登出,删除 redis 中的 accessToken 和 refreshToken
+ * 只保证 refreshToken 不能使用,accessToken 还是能使用的。
+ * 如果用户拿到了之前的 accessToken,则可以一直使用到过期,但是因为 refreshToken 已经无法使用了,所以保证了 accessToken 的时效性。
+ * 下次登录时,需要重新获取新的 accessToken 和 refreshToken,这样才能利用 refreshToken 进行续期。
+ */
+ @PostMapping("/logout")
+ public Mono logout(@RequestParam("username") String username){
+
+ boolean logoutResult = jwtTokenUtil.removeToken(username);
+ if (logoutResult) {
+ buildSuccessResponse(ResponseCodeEnum.SUCCESS);
+ } else {
+ buildErrorResponse(ResponseCodeEnum.LOGOUT_ERROR);
+ }
+
+ return buildSuccessResponse(ResponseCodeEnum.SUCCESS);
+ }
+
+ private Mono buildErrorResponse(ResponseCodeEnum responseCodeEnum){
+ return Mono.create(callback -> callback.success(
+ ResponseResult.error(responseCodeEnum.getCode(), responseCodeEnum.getMessage())
+ ));
+ }
+
+ private Mono buildSuccessResponse(Object data){
+ return Mono.create(callback -> callback.success(ResponseResult.success(data)
+ ));
+ }
+
+}
diff --git a/passjava-auth/src/main/java/com/jackson0714/passjava/auth/jpa/SysUser.java b/passjava-auth/src/main/java/com/jackson0714/passjava/auth/jpa/SysUser.java
new file mode 100644
index 00000000..1c16ea5a
--- /dev/null
+++ b/passjava-auth/src/main/java/com/jackson0714/passjava/auth/jpa/SysUser.java
@@ -0,0 +1,49 @@
+package com.jackson0714.passjava.auth.jpa;
+
+import lombok.AllArgsConstructor;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+import javax.persistence.*;
+import java.util.Date;
+
+/**
+ * 系统用户表
+ *
+ * @author 悟空聊架构
+ * @site www.passjava.cn
+ * @date 2022-08-09
+ */
+
+@Data
+@AllArgsConstructor
+@NoArgsConstructor
+@Entity
+@Table(name="sys_user")
+public class SysUser {
+
+ @Id
+ @GeneratedValue(strategy = GenerationType.IDENTITY)
+ private String userId;
+
+ @Column
+ private String password;
+
+ @Column
+ private String username;
+
+ @Column
+ private Integer orgId;
+
+ @Column
+ private Boolean enabled;
+
+ @Column
+ private String phone;
+
+ @Column
+ private String email;
+
+ @Column
+ private Date createTime;
+}
diff --git a/passjava-auth/src/main/java/com/jackson0714/passjava/auth/jpa/SysUserRepository.java b/passjava-auth/src/main/java/com/jackson0714/passjava/auth/jpa/SysUserRepository.java
new file mode 100644
index 00000000..d8bd65e7
--- /dev/null
+++ b/passjava-auth/src/main/java/com/jackson0714/passjava/auth/jpa/SysUserRepository.java
@@ -0,0 +1,23 @@
+package com.jackson0714.passjava.auth.jpa;
+
+import org.springframework.data.jpa.repository.JpaRepository;
+import org.springframework.stereotype.Repository;
+
+/**
+ * 系统用户 repository
+ *
+ * @author 悟空聊架构
+ * @site www.passjava.cn
+ * @date 2022-08-09
+ */
+@Repository("SysUserRepository")
+public interface SysUserRepository extends JpaRepository {
+
+ /**
+ * 注意这个方法的名称,JPA 会根据方法名自动生成 SQL 执行,完全不用自己写SQL
+ *
+ * @param userId 用户姓名
+ * @return SysUser
+ */
+ SysUser findByUserId(String userId);
+}
diff --git a/passjava-auth/src/main/resources/application.properties b/passjava-auth/src/main/resources/application.properties
new file mode 100644
index 00000000..fd47b1de
--- /dev/null
+++ b/passjava-auth/src/main/resources/application.properties
@@ -0,0 +1,5 @@
+spring.cloud.nacos.config.server-addr=127.0.0.1:8848
+spring.cloud.nacos.config.namespace=passjava-auth
+
+spring.application.name=passjava-auth
+server.port=10001
\ No newline at end of file
diff --git a/passjava-auth/src/main/resources/application.yml b/passjava-auth/src/main/resources/application.yml
new file mode 100644
index 00000000..681b0249
--- /dev/null
+++ b/passjava-auth/src/main/resources/application.yml
@@ -0,0 +1,17 @@
+spring:
+ profiles:
+ include: jwt
+ datasource:
+ url: jdbc:mysql://localhost:3306/passjava_auth?useUnicode=true&characterEncoding=UTF-8&serverTimezone=Asia/Shanghai
+ username: root
+ password: abc123__
+ driver-class-name: com.mysql.cj.jdbc.Driver
+ jpa:
+ hibernate:
+ ddl-auto: validate
+ database: mysql
+ show-sql: true
+
+logging:
+ level:
+ com.jackson0714.passjava: debug
\ No newline at end of file
diff --git a/passjava-channel/src/main/java/com/jackson0714/passjava/channel/controller/AccessTokenController.java b/passjava-channel/src/main/java/com/jackson0714/passjava/channel/controller/AccessTokenController.java
index 0b21f697..c814db6c 100644
--- a/passjava-channel/src/main/java/com/jackson0714/passjava/channel/controller/AccessTokenController.java
+++ b/passjava-channel/src/main/java/com/jackson0714/passjava/channel/controller/AccessTokenController.java
@@ -12,16 +12,16 @@
import com.jackson0714.passjava.channel.entity.AccessTokenEntity;
import com.jackson0714.passjava.channel.service.AccessTokenService;
-import com.jackson0714.common.utils.PageUtils;
-import com.jackson0714.common.utils.R;
+import com.jackson0714.passjava.common.utils.PageUtils;
+import com.jackson0714.passjava.common.utils.R;
/**
* 渠道-认证表
*
- * @author jackson0714
- * @email jackson0585@163.com
+ * @author 公众号:悟空聊架构
+ * @site www.passjava.cn
* @date 2020-04-15 15:08:21
*/
@RestController
diff --git a/passjava-channel/src/main/java/com/jackson0714/passjava/channel/controller/ChannelController.java b/passjava-channel/src/main/java/com/jackson0714/passjava/channel/controller/ChannelController.java
index b92a3502..711782b6 100644
--- a/passjava-channel/src/main/java/com/jackson0714/passjava/channel/controller/ChannelController.java
+++ b/passjava-channel/src/main/java/com/jackson0714/passjava/channel/controller/ChannelController.java
@@ -12,16 +12,16 @@
import com.jackson0714.passjava.channel.entity.ChannelEntity;
import com.jackson0714.passjava.channel.service.ChannelService;
-import com.jackson0714.common.utils.PageUtils;
-import com.jackson0714.common.utils.R;
+import com.jackson0714.passjava.common.utils.PageUtils;
+import com.jackson0714.passjava.common.utils.R;
/**
* 渠道-渠道表
*
- * @author jackson0714
- * @email jackson0585@163.com
+ * @author 公众号:悟空聊架构
+ * @site www.passjava.cn
* @date 2020-04-15 15:08:21
*/
@RestController
diff --git a/passjava-channel/src/main/java/com/jackson0714/passjava/channel/dao/AccessTokenDao.java b/passjava-channel/src/main/java/com/jackson0714/passjava/channel/dao/AccessTokenDao.java
index 5667c845..2d8e5cfb 100644
--- a/passjava-channel/src/main/java/com/jackson0714/passjava/channel/dao/AccessTokenDao.java
+++ b/passjava-channel/src/main/java/com/jackson0714/passjava/channel/dao/AccessTokenDao.java
@@ -7,8 +7,8 @@
/**
* 渠道-认证表
*
- * @author jackson0714
- * @email jackson0585@163.com
+ * @author 公众号:悟空聊架构
+ * @site www.passjava.cn
* @date 2020-04-15 15:08:21
*/
@Mapper
diff --git a/passjava-channel/src/main/java/com/jackson0714/passjava/channel/dao/ChannelDao.java b/passjava-channel/src/main/java/com/jackson0714/passjava/channel/dao/ChannelDao.java
index 9584bdfa..fd788e85 100644
--- a/passjava-channel/src/main/java/com/jackson0714/passjava/channel/dao/ChannelDao.java
+++ b/passjava-channel/src/main/java/com/jackson0714/passjava/channel/dao/ChannelDao.java
@@ -7,8 +7,8 @@
/**
* 渠道-渠道表
*
- * @author jackson0714
- * @email jackson0585@163.com
+ * @author 公众号:悟空聊架构
+ * @site www.passjava.cn
* @date 2020-04-15 15:08:21
*/
@Mapper
diff --git a/passjava-channel/src/main/java/com/jackson0714/passjava/channel/entity/AccessTokenEntity.java b/passjava-channel/src/main/java/com/jackson0714/passjava/channel/entity/AccessTokenEntity.java
index b4c86c18..7ccb621c 100644
--- a/passjava-channel/src/main/java/com/jackson0714/passjava/channel/entity/AccessTokenEntity.java
+++ b/passjava-channel/src/main/java/com/jackson0714/passjava/channel/entity/AccessTokenEntity.java
@@ -11,8 +11,8 @@
/**
* 渠道-认证表
*
- * @author jackson0714
- * @email jackson0585@163.com
+ * @author 公众号:悟空聊架构
+ * @site www.passjava.cn
* @date 2020-04-15 15:08:21
*/
@Data
diff --git a/passjava-channel/src/main/java/com/jackson0714/passjava/channel/entity/ChannelEntity.java b/passjava-channel/src/main/java/com/jackson0714/passjava/channel/entity/ChannelEntity.java
index 168c3121..76ada55a 100644
--- a/passjava-channel/src/main/java/com/jackson0714/passjava/channel/entity/ChannelEntity.java
+++ b/passjava-channel/src/main/java/com/jackson0714/passjava/channel/entity/ChannelEntity.java
@@ -11,8 +11,8 @@
/**
* 渠道-渠道表
*
- * @author jackson0714
- * @email jackson0585@163.com
+ * @author 公众号:悟空聊架构
+ * @site www.passjava.cn
* @date 2020-04-15 15:08:21
*/
@Data
diff --git a/passjava-channel/src/main/java/com/jackson0714/passjava/channel/service/AccessTokenService.java b/passjava-channel/src/main/java/com/jackson0714/passjava/channel/service/AccessTokenService.java
index 9b3fecbf..11d4d9b7 100644
--- a/passjava-channel/src/main/java/com/jackson0714/passjava/channel/service/AccessTokenService.java
+++ b/passjava-channel/src/main/java/com/jackson0714/passjava/channel/service/AccessTokenService.java
@@ -1,7 +1,7 @@
package com.jackson0714.passjava.channel.service;
import com.baomidou.mybatisplus.extension.service.IService;
-import com.jackson0714.common.utils.PageUtils;
+import com.jackson0714.passjava.common.utils.PageUtils;
import com.jackson0714.passjava.channel.entity.AccessTokenEntity;
import java.util.Map;
@@ -9,8 +9,8 @@
/**
* 渠道-认证表
*
- * @author jackson0714
- * @email jackson0585@163.com
+ * @author 公众号:悟空聊架构
+ * @site www.passjava.cn
* @date 2020-04-15 15:08:21
*/
public interface AccessTokenService extends IService {
diff --git a/passjava-channel/src/main/java/com/jackson0714/passjava/channel/service/ChannelService.java b/passjava-channel/src/main/java/com/jackson0714/passjava/channel/service/ChannelService.java
index 0d067457..bce4447c 100644
--- a/passjava-channel/src/main/java/com/jackson0714/passjava/channel/service/ChannelService.java
+++ b/passjava-channel/src/main/java/com/jackson0714/passjava/channel/service/ChannelService.java
@@ -1,7 +1,7 @@
package com.jackson0714.passjava.channel.service;
import com.baomidou.mybatisplus.extension.service.IService;
-import com.jackson0714.common.utils.PageUtils;
+import com.jackson0714.passjava.common.utils.PageUtils;
import com.jackson0714.passjava.channel.entity.ChannelEntity;
import java.util.Map;
@@ -9,8 +9,8 @@
/**
* 渠道-渠道表
*
- * @author jackson0714
- * @email jackson0585@163.com
+ * @author 公众号:悟空聊架构
+ * @site www.passjava.cn
* @date 2020-04-15 15:08:21
*/
public interface ChannelService extends IService {
diff --git a/passjava-channel/src/main/java/com/jackson0714/passjava/channel/service/impl/AccessTokenServiceImpl.java b/passjava-channel/src/main/java/com/jackson0714/passjava/channel/service/impl/AccessTokenServiceImpl.java
index 15346f49..49735dad 100644
--- a/passjava-channel/src/main/java/com/jackson0714/passjava/channel/service/impl/AccessTokenServiceImpl.java
+++ b/passjava-channel/src/main/java/com/jackson0714/passjava/channel/service/impl/AccessTokenServiceImpl.java
@@ -5,8 +5,8 @@
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
-import com.jackson0714.common.utils.PageUtils;
-import com.jackson0714.common.utils.Query;
+import com.jackson0714.passjava.common.utils.PageUtils;
+import com.jackson0714.passjava.common.utils.Query;
import com.jackson0714.passjava.channel.dao.AccessTokenDao;
import com.jackson0714.passjava.channel.entity.AccessTokenEntity;
diff --git a/passjava-channel/src/main/java/com/jackson0714/passjava/channel/service/impl/ChannelServiceImpl.java b/passjava-channel/src/main/java/com/jackson0714/passjava/channel/service/impl/ChannelServiceImpl.java
index 399c87b8..12481973 100644
--- a/passjava-channel/src/main/java/com/jackson0714/passjava/channel/service/impl/ChannelServiceImpl.java
+++ b/passjava-channel/src/main/java/com/jackson0714/passjava/channel/service/impl/ChannelServiceImpl.java
@@ -5,8 +5,8 @@
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
-import com.jackson0714.common.utils.PageUtils;
-import com.jackson0714.common.utils.Query;
+import com.jackson0714.passjava.common.utils.PageUtils;
+import com.jackson0714.passjava.common.utils.Query;
import com.jackson0714.passjava.channel.dao.ChannelDao;
import com.jackson0714.passjava.channel.entity.ChannelEntity;
diff --git a/passjava-common/pom.xml b/passjava-common/pom.xml
index 4cc930bc..29f841da 100644
--- a/passjava-common/pom.xml
+++ b/passjava-common/pom.xml
@@ -17,8 +17,8 @@
org.apache.maven.pluginsmaven-compiler-plugin
- 7
- 7
+ 8
+ 8
@@ -92,18 +92,43 @@
3.3.1compile
+
+ org.springframework
+ spring-web
+ 5.2.5.RELEASE
+ compile
+
+
+ org.springframework
+ spring-web
+ 5.2.5.RELEASE
+ compile
+
-
+
+
+ com.alibaba
+ transmittable-thread-local
+ 2.13.2
+
+
+ org.springframework
+ spring-webmvc
+ 5.2.5.RELEASE
+ compile
+
+
+
-
- org.springframework.cloud
- spring-cloud-starter-zipkin
-
+
+
+
+
diff --git a/passjava-common/src/main/java/com/jackson0714/passjava/common/config/WebMvcConfig.java b/passjava-common/src/main/java/com/jackson0714/passjava/common/config/WebMvcConfig.java
new file mode 100644
index 00000000..0f44eef3
--- /dev/null
+++ b/passjava-common/src/main/java/com/jackson0714/passjava/common/config/WebMvcConfig.java
@@ -0,0 +1,32 @@
+package com.jackson0714.passjava.common.config;
+
+import com.jackson0714.passjava.common.interceptor.HeaderInterceptor;
+import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
+import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
+
+/**
+ * 拦截器配置
+ *
+ */
+public class WebMvcConfig implements WebMvcConfigurer
+{
+ /** 不需要拦截地址 */
+ public static final String[] excludeUrls = { "/login", "/logout", "/refresh" };
+
+ @Override
+ public void addInterceptors(InterceptorRegistry registry)
+ {
+ registry.addInterceptor(getHeaderInterceptor())
+ .addPathPatterns("/**")
+ .excludePathPatterns(excludeUrls)
+ .order(-10);
+ }
+
+ /**
+ * 自定义请求头拦截器
+ */
+ public HeaderInterceptor getHeaderInterceptor()
+ {
+ return new HeaderInterceptor();
+ }
+}
diff --git a/passjava-common/src/main/java/com/jackson0714/passjava/common/constant/Constants.java b/passjava-common/src/main/java/com/jackson0714/passjava/common/constant/Constants.java
new file mode 100644
index 00000000..837e6c52
--- /dev/null
+++ b/passjava-common/src/main/java/com/jackson0714/passjava/common/constant/Constants.java
@@ -0,0 +1,124 @@
+package com.jackson0714.passjava.common.constant;
+
+/**
+ * 通用常量信息
+ *
+ */
+public class Constants
+{
+ /**
+ * UTF-8 字符集
+ */
+ public static final String UTF8 = "UTF-8";
+
+ /**
+ * GBK 字符集
+ */
+ public static final String GBK = "GBK";
+
+ /**
+ * RMI 远程方法调用
+ */
+ public static final String LOOKUP_RMI = "rmi:";
+
+ /**
+ * LDAP 远程方法调用
+ */
+ public static final String LOOKUP_LDAP = "ldap:";
+
+ /**
+ * LDAPS 远程方法调用
+ */
+ public static final String LOOKUP_LDAPS = "ldaps:";
+
+ /**
+ * http请求
+ */
+ public static final String HTTP = "http://";
+
+ /**
+ * https请求
+ */
+ public static final String HTTPS = "https://";
+
+ /**
+ * 成功标记
+ */
+ public static final Integer SUCCESS = 200;
+
+ /**
+ * 失败标记
+ */
+ public static final Integer FAIL = 500;
+
+ /**
+ * 登录成功状态
+ */
+ public static final String LOGIN_SUCCESS_STATUS = "0";
+
+ /**
+ * 登录失败状态
+ */
+ public static final String LOGIN_FAIL_STATUS = "1";
+
+ /**
+ * 登录成功
+ */
+ public static final String LOGIN_SUCCESS = "Success";
+
+ /**
+ * 注销
+ */
+ public static final String LOGOUT = "Logout";
+
+ /**
+ * 注册
+ */
+ public static final String REGISTER = "Register";
+
+ /**
+ * 登录失败
+ */
+ public static final String LOGIN_FAIL = "Error";
+
+ /**
+ * 当前记录起始索引
+ */
+ public static final String PAGE_NUM = "pageNum";
+
+ /**
+ * 每页显示记录数
+ */
+ public static final String PAGE_SIZE = "pageSize";
+
+ /**
+ * 排序列
+ */
+ public static final String ORDER_BY_COLUMN = "orderByColumn";
+
+ /**
+ * 排序的方向 "desc" 或者 "asc".
+ */
+ public static final String IS_ASC = "isAsc";
+
+ /**
+ * 验证码有效期(分钟)
+ */
+ public static final long CAPTCHA_EXPIRATION = 2;
+
+ /**
+ * 资源映射路径 前缀
+ */
+ public static final String RESOURCE_PREFIX = "/profile";
+
+ /**
+ * 定时任务白名单配置(仅允许访问的包名,如其他需要可以自行添加)
+ */
+ public static final String[] JOB_WHITELIST_STR = { "com.ruoyi" };
+
+ /**
+ * 定时任务违规的字符
+ */
+ public static final String[] JOB_ERROR_STR = { "java.net.URL", "javax.naming.InitialContext", "org.yaml.snakeyaml",
+ "org.springframework", "org.apache", "com.ruoyi.common.core.utils.file" };
+}
diff --git a/passjava-common/src/main/java/com/jackson0714/passjava/common/constant/SecurityConstants.java b/passjava-common/src/main/java/com/jackson0714/passjava/common/constant/SecurityConstants.java
new file mode 100644
index 00000000..0bf30206
--- /dev/null
+++ b/passjava-common/src/main/java/com/jackson0714/passjava/common/constant/SecurityConstants.java
@@ -0,0 +1,44 @@
+package com.jackson0714.passjava.common.constant;
+
+/**
+ * 权限相关通用常量
+ *
+ * @author ruoyi
+ */
+public class SecurityConstants
+{
+ /**
+ * 用户ID字段
+ */
+ public static final String DETAILS_USER_ID = "userId";
+
+ /**
+ * 用户名字段
+ */
+ public static final String DETAILS_USERNAME = "username";
+
+ /**
+ * 授权信息字段
+ */
+ public static final String AUTHORIZATION_HEADER = "authorization";
+
+ /**
+ * 请求来源
+ */
+ public static final String FROM_SOURCE = "from-source";
+
+ /**
+ * 内部请求
+ */
+ public static final String INNER = "inner";
+
+ /**
+ * 用户标识
+ */
+ public static final String USER_KEY = "user_key";
+
+ /**
+ * 登录用户
+ */
+ public static final String LOGIN_USER = "login_user";
+}
diff --git a/passjava-common/src/main/java/com/jackson0714/passjava/common/constant/TokenConstants.java b/passjava-common/src/main/java/com/jackson0714/passjava/common/constant/TokenConstants.java
new file mode 100644
index 00000000..904ce4eb
--- /dev/null
+++ b/passjava-common/src/main/java/com/jackson0714/passjava/common/constant/TokenConstants.java
@@ -0,0 +1,19 @@
+package com.jackson0714.passjava.common.constant;
+
+
+/**
+ * @author wukong
+ */
+public class TokenConstants
+{
+ /**
+ * 令牌自定义标识
+ */
+ public static final String AUTHENTICATION = "Authorization";
+
+ /**
+ * 令牌前缀
+ */
+ public static final String PREFIX = "Bearer ";
+
+}
diff --git a/passjava-common/src/main/java/com/jackson0714/passjava/common/context/SecurityContextHolder.java b/passjava-common/src/main/java/com/jackson0714/passjava/common/context/SecurityContextHolder.java
new file mode 100644
index 00000000..8019e37a
--- /dev/null
+++ b/passjava-common/src/main/java/com/jackson0714/passjava/common/context/SecurityContextHolder.java
@@ -0,0 +1,88 @@
+package com.jackson0714.passjava.common.context;
+
+import com.alibaba.ttl.TransmittableThreadLocal;
+import com.jackson0714.passjava.common.constant.SecurityConstants;
+import com.jackson0714.passjava.common.text.Convert;
+import com.jackson0714.passjava.common.utils.StringUtils;
+
+import java.util.Map;
+import java.util.concurrent.ConcurrentHashMap;
+
+/**
+ * 获取当前线程变量中的 用户id、用户名称、Token等信息
+ * 注意: 必须在网关通过请求头的方法传入,同时在HeaderInterceptor拦截器设置值。 否则这里无法获取
+ *
+ */
+public class SecurityContextHolder
+{
+ private static final TransmittableThreadLocal