commit aeb1ab829b8a667ff9c1b2e1fad571666c692983 Author: abu <3109389044@qq.com> Date: Fri Mar 14 16:27:50 2025 +0800 init diff --git a/.gitignore b/.gitignore new file mode 100644 index 00000000..75c76a49 --- /dev/null +++ b/.gitignore @@ -0,0 +1,10 @@ +# OSX +# +.DS_Store + +#Intellij idea +.idea/ +/idea/ +.vscode/ +/unpackage/ +.hbuilderx/launch.json diff --git a/App.vue b/App.vue new file mode 100644 index 00000000..c60f073d --- /dev/null +++ b/App.vue @@ -0,0 +1,269 @@ + + + \ No newline at end of file diff --git a/CustomStartPage/start-page.9.png b/CustomStartPage/start-page.9.png new file mode 100644 index 00000000..63f99f70 Binary files /dev/null and b/CustomStartPage/start-page.9.png differ diff --git a/CustomStoryboard/1@2x.png b/CustomStoryboard/1@2x.png new file mode 100644 index 00000000..49fec5d5 Binary files /dev/null and b/CustomStoryboard/1@2x.png differ diff --git a/CustomStoryboard/1@3x.png b/CustomStoryboard/1@3x.png new file mode 100644 index 00000000..49fec5d5 Binary files /dev/null and b/CustomStoryboard/1@3x.png differ diff --git a/CustomStoryboard/2@2x.png b/CustomStoryboard/2@2x.png new file mode 100644 index 00000000..c26ea5b2 Binary files /dev/null and b/CustomStoryboard/2@2x.png differ diff --git a/CustomStoryboard/2@3x.png b/CustomStoryboard/2@3x.png new file mode 100644 index 00000000..cb50bd8c Binary files /dev/null and b/CustomStoryboard/2@3x.png differ diff --git a/CustomStoryboard/LaunchScreen.storyboard b/CustomStoryboard/LaunchScreen.storyboard new file mode 100644 index 00000000..2c10cef5 --- /dev/null +++ b/CustomStoryboard/LaunchScreen.storyboard @@ -0,0 +1,71 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/LICENSE b/LICENSE new file mode 100644 index 00000000..80a61fa1 --- /dev/null +++ b/LICENSE @@ -0,0 +1,661 @@ + GNU AFFERO GENERAL PUBLIC LICENSE + Version 3, 19 November 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 Affero General Public License is a free, copyleft license for +software and other kinds of works, specifically designed to ensure +cooperation with the community in the case of network server software. + + The licenses for most software and other practical works are designed +to take away your freedom to share and change the works. By contrast, +our General Public Licenses are intended to guarantee your freedom to +share and change all versions of a program--to make sure it remains free +software for all its users. + + When we speak of free software, we are referring to freedom, not +price. Our General Public Licenses are designed to make sure that you +have the freedom to distribute copies of free software (and charge for +them if you wish), that you receive source code or can get it if you +want it, that you can change the software or use pieces of it in new +free programs, and that you know you can do these things. + + Developers that use our General Public Licenses protect your rights +with two steps: (1) assert copyright on the software, and (2) offer +you this License which gives you legal permission to copy, distribute +and/or modify the software. + + A secondary benefit of defending all users' freedom is that +improvements made in alternate versions of the program, if they +receive widespread use, become available for other developers to +incorporate. Many developers of free software are heartened and +encouraged by the resulting cooperation. However, in the case of +software used on network servers, this result may fail to come about. +The GNU General Public License permits making a modified version and +letting the public access it on a server without ever releasing its +source code to the public. + + The GNU Affero General Public License is designed specifically to +ensure that, in such cases, the modified source code becomes available +to the community. It requires the operator of a network server to +provide the source code of the modified version running there to the +users of that server. Therefore, public use of a modified version, on +a publicly accessible server, gives the public access to the source +code of the modified version. + + An older license, called the Affero General Public License and +published by Affero, was designed to accomplish similar goals. This is +a different license, not a version of the Affero GPL, but Affero has +released a new version of the Affero GPL which permits relicensing under +this license. + + The precise terms and conditions for copying, distribution and +modification follow. + + TERMS AND CONDITIONS + + 0. Definitions. + + "This License" refers to version 3 of the GNU Affero General Public License. + + "Copyright" also means copyright-like laws that apply to other kinds of +works, such as semiconductor masks. + + "The Program" refers to any copyrightable work licensed under this +License. Each licensee is addressed as "you". "Licensees" and +"recipients" may be individuals or organizations. + + To "modify" a work means to copy from or adapt all or part of the work +in a fashion requiring copyright permission, other than the making of an +exact copy. The resulting work is called a "modified version" of the +earlier work or a work "based on" the earlier work. + + A "covered work" means either the unmodified Program or a work based +on the Program. + + To "propagate" a work means to do anything with it that, without +permission, would make you directly or secondarily liable for +infringement under applicable copyright law, except executing it on a +computer or modifying a private copy. Propagation includes copying, +distribution (with or without modification), making available to the +public, and in some countries other activities as well. + + To "convey" a work means any kind of propagation that enables other +parties to make or receive copies. Mere interaction with a user through +a computer network, with no transfer of a copy, is not conveying. + + An interactive user interface displays "Appropriate Legal Notices" +to the extent that it includes a convenient and prominently visible +feature that (1) displays an appropriate copyright notice, and (2) +tells the user that there is no warranty for the work (except to the +extent that warranties are provided), that licensees may convey the +work under this License, and how to view a copy of this License. If +the interface presents a list of user commands or options, such as a +menu, a prominent item in the list meets this criterion. + + 1. Source Code. + + The "source code" for a work means the preferred form of the work +for making modifications to it. "Object code" means any non-source +form of a work. + + A "Standard Interface" means an interface that either is an official +standard defined by a recognized standards body, or, in the case of +interfaces specified for a particular programming language, one that +is widely used among developers working in that language. + + The "System Libraries" of an executable work include anything, other +than the work as a whole, that (a) is included in the normal form of +packaging a Major Component, but which is not part of that Major +Component, and (b) serves only to enable use of the work with that +Major Component, or to implement a Standard Interface for which an +implementation is available to the public in source code form. A +"Major Component", in this context, means a major essential component +(kernel, window system, and so on) of the specific operating system +(if any) on which the executable work runs, or a compiler used to +produce the work, or an object code interpreter used to run it. + + The "Corresponding Source" for a work in object code form means all +the source code needed to generate, install, and (for an executable +work) run the object code and to modify the work, including scripts to +control those activities. However, it does not include the work's +System Libraries, or general-purpose tools or generally available free +programs which are used unmodified in performing those activities but +which are not part of the work. For example, Corresponding Source +includes interface definition files associated with source files for +the work, and the source code for shared libraries and dynamically +linked subprograms that the work is specifically designed to require, +such as by intimate data communication or control flow between those +subprograms and other parts of the work. + + The Corresponding Source need not include anything that users +can regenerate automatically from other parts of the Corresponding +Source. + + The Corresponding Source for a work in source code form is that +same work. + + 2. Basic Permissions. + + All rights granted under this License are granted for the term of +copyright on the Program, and are irrevocable provided the stated +conditions are met. This License explicitly affirms your unlimited +permission to run the unmodified Program. The output from running a +covered work is covered by this License only if the output, given its +content, constitutes a covered work. This License acknowledges your +rights of fair use or other equivalent, as provided by copyright law. + + You may make, run and propagate covered works that you do not +convey, without conditions so long as your license otherwise remains +in force. You may convey covered works to others for the sole purpose +of having them make modifications exclusively for you, or provide you +with facilities for running those works, provided that you comply with +the terms of this License in conveying all material for which you do +not control copyright. Those thus making or running the covered works +for you must do so exclusively on your behalf, under your direction +and control, on terms that prohibit them from making any copies of +your copyrighted material outside their relationship with you. + + Conveying under any other circumstances is permitted solely under +the conditions stated below. Sublicensing is not allowed; section 10 +makes it unnecessary. + + 3. Protecting Users' Legal Rights From Anti-Circumvention Law. + + No covered work shall be deemed part of an effective technological +measure under any applicable law fulfilling obligations under article +11 of the WIPO copyright treaty adopted on 20 December 1996, or +similar laws prohibiting or restricting circumvention of such +measures. + + When you convey a covered work, you waive any legal power to forbid +circumvention of technological measures to the extent such circumvention +is effected by exercising rights under this License with respect to +the covered work, and you disclaim any intention to limit operation or +modification of the work as a means of enforcing, against the work's +users, your or third parties' legal rights to forbid circumvention of +technological measures. + + 4. Conveying Verbatim Copies. + + You may convey verbatim copies of the Program's source code as you +receive it, in any medium, provided that you conspicuously and +appropriately publish on each copy an appropriate copyright notice; +keep intact all notices stating that this License and any +non-permissive terms added in accord with section 7 apply to the code; +keep intact all notices of the absence of any warranty; and give all +recipients a copy of this License along with the Program. + + You may charge any price or no price for each copy that you convey, +and you may offer support or warranty protection for a fee. + + 5. Conveying Modified Source Versions. + + You may convey a work based on the Program, or the modifications to +produce it from the Program, in the form of source code under the +terms of section 4, provided that you also meet all of these conditions: + + a) The work must carry prominent notices stating that you modified + it, and giving a relevant date. + + b) The work must carry prominent notices stating that it is + released under this License and any conditions added under section + 7. This requirement modifies the requirement in section 4 to + "keep intact all notices". + + c) You must license the entire work, as a whole, under this + License to anyone who comes into possession of a copy. This + License will therefore apply, along with any applicable section 7 + additional terms, to the whole of the work, and all its parts, + regardless of how they are packaged. This License gives no + permission to license the work in any other way, but it does not + invalidate such permission if you have separately received it. + + d) If the work has interactive user interfaces, each must display + Appropriate Legal Notices; however, if the Program has interactive + interfaces that do not display Appropriate Legal Notices, your + work need not make them do so. + + A compilation of a covered work with other separate and independent +works, which are not by their nature extensions of the covered work, +and which are not combined with it such as to form a larger program, +in or on a volume of a storage or distribution medium, is called an +"aggregate" if the compilation and its resulting copyright are not +used to limit the access or legal rights of the compilation's users +beyond what the individual works permit. Inclusion of a covered work +in an aggregate does not cause this License to apply to the other +parts of the aggregate. + + 6. Conveying Non-Source Forms. + + You may convey a covered work in object code form under the terms +of sections 4 and 5, provided that you also convey the +machine-readable Corresponding Source under the terms of this License, +in one of these ways: + + a) Convey the object code in, or embodied in, a physical product + (including a physical distribution medium), accompanied by the + Corresponding Source fixed on a durable physical medium + customarily used for software interchange. + + b) Convey the object code in, or embodied in, a physical product + (including a physical distribution medium), accompanied by a + written offer, valid for at least three years and valid for as + long as you offer spare parts or customer support for that product + model, to give anyone who possesses the object code either (1) a + copy of the Corresponding Source for all the software in the + product that is covered by this License, on a durable physical + medium customarily used for software interchange, for a price no + more than your reasonable cost of physically performing this + conveying of source, or (2) access to copy the + Corresponding Source from a network server at no charge. + + c) Convey individual copies of the object code with a copy of the + written offer to provide the Corresponding Source. This + alternative is allowed only occasionally and noncommercially, and + only if you received the object code with such an offer, in accord + with subsection 6b. + + d) Convey the object code by offering access from a designated + place (gratis or for a charge), and offer equivalent access to the + Corresponding Source in the same way through the same place at no + further charge. You need not require recipients to copy the + Corresponding Source along with the object code. If the place to + copy the object code is a network server, the Corresponding Source + may be on a different server (operated by you or a third party) + that supports equivalent copying facilities, provided you maintain + clear directions next to the object code saying where to find the + Corresponding Source. Regardless of what server hosts the + Corresponding Source, you remain obligated to ensure that it is + available for as long as needed to satisfy these requirements. + + e) Convey the object code using peer-to-peer transmission, provided + you inform other peers where the object code and Corresponding + Source of the work are being offered to the general public at no + charge under subsection 6d. + + A separable portion of the object code, whose source code is excluded +from the Corresponding Source as a System Library, need not be +included in conveying the object code work. + + A "User Product" is either (1) a "consumer product", which means any +tangible personal property which is normally used for personal, family, +or household purposes, or (2) anything designed or sold for incorporation +into a dwelling. In determining whether a product is a consumer product, +doubtful cases shall be resolved in favor of coverage. For a particular +product received by a particular user, "normally used" refers to a +typical or common use of that class of product, regardless of the status +of the particular user or of the way in which the particular user +actually uses, or expects or is expected to use, the product. A product +is a consumer product regardless of whether the product has substantial +commercial, industrial or non-consumer uses, unless such uses represent +the only significant mode of use of the product. + + "Installation Information" for a User Product means any methods, +procedures, authorization keys, or other information required to install +and execute modified versions of a covered work in that User Product from +a modified version of its Corresponding Source. The information must +suffice to ensure that the continued functioning of the modified object +code is in no case prevented or interfered with solely because +modification has been made. + + If you convey an object code work under this section in, or with, or +specifically for use in, a User Product, and the conveying occurs as +part of a transaction in which the right of possession and use of the +User Product is transferred to the recipient in perpetuity or for a +fixed term (regardless of how the transaction is characterized), the +Corresponding Source conveyed under this section must be accompanied +by the Installation Information. But this requirement does not apply +if neither you nor any third party retains the ability to install +modified object code on the User Product (for example, the work has +been installed in ROM). + + The requirement to provide Installation Information does not include a +requirement to continue to provide support service, warranty, or updates +for a work that has been modified or installed by the recipient, or for +the User Product in which it has been modified or installed. Access to a +network may be denied when the modification itself materially and +adversely affects the operation of the network or violates the rules and +protocols for communication across the network. + + Corresponding Source conveyed, and Installation Information provided, +in accord with this section must be in a format that is publicly +documented (and with an implementation available to the public in +source code form), and must require no special password or key for +unpacking, reading or copying. + + 7. Additional Terms. + + "Additional permissions" are terms that supplement the terms of this +License by making exceptions from one or more of its conditions. +Additional permissions that are applicable to the entire Program shall +be treated as though they were included in this License, to the extent +that they are valid under applicable law. If additional permissions +apply only to part of the Program, that part may be used separately +under those permissions, but the entire Program remains governed by +this License without regard to the additional permissions. + + When you convey a copy of a covered work, you may at your option +remove any additional permissions from that copy, or from any part of +it. (Additional permissions may be written to require their own +removal in certain cases when you modify the work.) You may place +additional permissions on material, added by you to a covered work, +for which you have or can give appropriate copyright permission. + + Notwithstanding any other provision of this License, for material you +add to a covered work, you may (if authorized by the copyright holders of +that material) supplement the terms of this License with terms: + + a) Disclaiming warranty or limiting liability differently from the + terms of sections 15 and 16 of this License; or + + b) Requiring preservation of specified reasonable legal notices or + author attributions in that material or in the Appropriate Legal + Notices displayed by works containing it; or + + c) Prohibiting misrepresentation of the origin of that material, or + requiring that modified versions of such material be marked in + reasonable ways as different from the original version; or + + d) Limiting the use for publicity purposes of names of licensors or + authors of the material; or + + e) Declining to grant rights under trademark law for use of some + trade names, trademarks, or service marks; or + + f) Requiring indemnification of licensors and authors of that + material by anyone who conveys the material (or modified versions of + it) with contractual assumptions of liability to the recipient, for + any liability that these contractual assumptions directly impose on + those licensors and authors. + + All other non-permissive additional terms are considered "further +restrictions" within the meaning of section 10. If the Program as you +received it, or any part of it, contains a notice stating that it is +governed by this License along with a term that is a further +restriction, you may remove that term. If a license document contains +a further restriction but permits relicensing or conveying under this +License, you may add to a covered work material governed by the terms +of that license document, provided that the further restriction does +not survive such relicensing or conveying. + + If you add terms to a covered work in accord with this section, you +must place, in the relevant source files, a statement of the +additional terms that apply to those files, or a notice indicating +where to find the applicable terms. + + Additional terms, permissive or non-permissive, may be stated in the +form of a separately written license, or stated as exceptions; +the above requirements apply either way. + + 8. Termination. + + You may not propagate or modify a covered work except as expressly +provided under this License. Any attempt otherwise to propagate or +modify it is void, and will automatically terminate your rights under +this License (including any patent licenses granted under the third +paragraph of section 11). + + However, if you cease all violation of this License, then your +license from a particular copyright holder is reinstated (a) +provisionally, unless and until the copyright holder explicitly and +finally terminates your license, and (b) permanently, if the copyright +holder fails to notify you of the violation by some reasonable means +prior to 60 days after the cessation. + + Moreover, your license from a particular copyright holder is +reinstated permanently if the copyright holder notifies you of the +violation by some reasonable means, this is the first time you have +received notice of violation of this License (for any work) from that +copyright holder, and you cure the violation prior to 30 days after +your receipt of the notice. + + Termination of your rights under this section does not terminate the +licenses of parties who have received copies or rights from you under +this License. If your rights have been terminated and not permanently +reinstated, you do not qualify to receive new licenses for the same +material under section 10. + + 9. Acceptance Not Required for Having Copies. + + You are not required to accept this License in order to receive or +run a copy of the Program. Ancillary propagation of a covered work +occurring solely as a consequence of using peer-to-peer transmission +to receive a copy likewise does not require acceptance. However, +nothing other than this License grants you permission to propagate or +modify any covered work. These actions infringe copyright if you do +not accept this License. Therefore, by modifying or propagating a +covered work, you indicate your acceptance of this License to do so. + + 10. Automatic Licensing of Downstream Recipients. + + Each time you convey a covered work, the recipient automatically +receives a license from the original licensors, to run, modify and +propagate that work, subject to this License. You are not responsible +for enforcing compliance by third parties with this License. + + An "entity transaction" is a transaction transferring control of an +organization, or substantially all assets of one, or subdividing an +organization, or merging organizations. If propagation of a covered +work results from an entity transaction, each party to that +transaction who receives a copy of the work also receives whatever +licenses to the work the party's predecessor in interest had or could +give under the previous paragraph, plus a right to possession of the +Corresponding Source of the work from the predecessor in interest, if +the predecessor has it or can get it with reasonable efforts. + + You may not impose any further restrictions on the exercise of the +rights granted or affirmed under this License. For example, you may +not impose a license fee, royalty, or other charge for exercise of +rights granted under this License, and you may not initiate litigation +(including a cross-claim or counterclaim in a lawsuit) alleging that +any patent claim is infringed by making, using, selling, offering for +sale, or importing the Program or any portion of it. + + 11. Patents. + + A "contributor" is a copyright holder who authorizes use under this +License of the Program or a work on which the Program is based. The +work thus licensed is called the contributor's "contributor version". + + A contributor's "essential patent claims" are all patent claims +owned or controlled by the contributor, whether already acquired or +hereafter acquired, that would be infringed by some manner, permitted +by this License, of making, using, or selling its contributor version, +but do not include claims that would be infringed only as a +consequence of further modification of the contributor version. For +purposes of this definition, "control" includes the right to grant +patent sublicenses in a manner consistent with the requirements of +this License. + + Each contributor grants you a non-exclusive, worldwide, royalty-free +patent license under the contributor's essential patent claims, to +make, use, sell, offer for sale, import and otherwise run, modify and +propagate the contents of its contributor version. + + In the following three paragraphs, a "patent license" is any express +agreement or commitment, however denominated, not to enforce a patent +(such as an express permission to practice a patent or covenant not to +sue for patent infringement). To "grant" such a patent license to a +party means to make such an agreement or commitment not to enforce a +patent against the party. + + If you convey a covered work, knowingly relying on a patent license, +and the Corresponding Source of the work is not available for anyone +to copy, free of charge and under the terms of this License, through a +publicly available network server or other readily accessible means, +then you must either (1) cause the Corresponding Source to be so +available, or (2) arrange to deprive yourself of the benefit of the +patent license for this particular work, or (3) arrange, in a manner +consistent with the requirements of this License, to extend the patent +license to downstream recipients. "Knowingly relying" means you have +actual knowledge that, but for the patent license, your conveying the +covered work in a country, or your recipient's use of the covered work +in a country, would infringe one or more identifiable patents in that +country that you have reason to believe are valid. + + If, pursuant to or in connection with a single transaction or +arrangement, you convey, or propagate by procuring conveyance of, a +covered work, and grant a patent license to some of the parties +receiving the covered work authorizing them to use, propagate, modify +or convey a specific copy of the covered work, then the patent license +you grant is automatically extended to all recipients of the covered +work and works based on it. + + A patent license is "discriminatory" if it does not include within +the scope of its coverage, prohibits the exercise of, or is +conditioned on the non-exercise of one or more of the rights that are +specifically granted under this License. You may not convey a covered +work if you are a party to an arrangement with a third party that is +in the business of distributing software, under which you make payment +to the third party based on the extent of your activity of conveying +the work, and under which the third party grants, to any of the +parties who would receive the covered work from you, a discriminatory +patent license (a) in connection with copies of the covered work +conveyed by you (or copies made from those copies), or (b) primarily +for and in connection with specific products or compilations that +contain the covered work, unless you entered into that arrangement, +or that patent license was granted, prior to 28 March 2007. + + Nothing in this License shall be construed as excluding or limiting +any implied license or other defenses to infringement that may +otherwise be available to you under applicable patent law. + + 12. No Surrender of Others' Freedom. + + If conditions are imposed on you (whether by court order, agreement or +otherwise) that contradict the conditions of this License, they do not +excuse you from the conditions of this License. If you cannot convey a +covered work so as to satisfy simultaneously your obligations under this +License and any other pertinent obligations, then as a consequence you may +not convey it at all. For example, if you agree to terms that obligate you +to collect a royalty for further conveying from those to whom you convey +the Program, the only way you could satisfy both those terms and this +License would be to refrain entirely from conveying the Program. + + 13. Remote Network Interaction; Use with the GNU General Public License. + + Notwithstanding any other provision of this License, if you modify the +Program, your modified version must prominently offer all users +interacting with it remotely through a computer network (if your version +supports such interaction) an opportunity to receive the Corresponding +Source of your version by providing access to the Corresponding Source +from a network server at no charge, through some standard or customary +means of facilitating copying of software. This Corresponding Source +shall include the Corresponding Source for any work covered by version 3 +of the GNU General Public License that is incorporated pursuant to the +following paragraph. + + Notwithstanding any other provision of this License, you have +permission to link or combine any covered work with a work licensed +under version 3 of the GNU General Public License into a single +combined work, and to convey the resulting work. The terms of this +License will continue to apply to the part which is the covered work, +but the work with which it is combined will remain governed by version +3 of the GNU General Public License. + + 14. Revised Versions of this License. + + The Free Software Foundation may publish revised and/or new versions of +the GNU Affero General Public License from time to time. Such new versions +will be similar in spirit to the present version, but may differ in detail to +address new problems or concerns. + + Each version is given a distinguishing version number. If the +Program specifies that a certain numbered version of the GNU Affero General +Public License "or any later version" applies to it, you have the +option of following the terms and conditions either of that numbered +version or of any later version published by the Free Software +Foundation. If the Program does not specify a version number of the +GNU Affero General Public License, you may choose any version ever published +by the Free Software Foundation. + + If the Program specifies that a proxy can decide which future +versions of the GNU Affero General Public License can be used, that proxy's +public statement of acceptance of a version permanently authorizes you +to choose that version for the Program. + + Later license versions may give you additional or different +permissions. However, no additional obligations are imposed on any +author or copyright holder as a result of your choosing to follow a +later version. + + 15. Disclaimer of Warranty. + + THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY +APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT +HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY +OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, +THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM +IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF +ALL NECESSARY SERVICING, REPAIR OR CORRECTION. + + 16. Limitation of Liability. + + IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING +WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS +THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY +GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE +USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF +DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD +PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), +EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF +SUCH DAMAGES. + + 17. Interpretation of Sections 15 and 16. + + If the disclaimer of warranty and limitation of liability provided +above cannot be given local legal effect according to their terms, +reviewing courts shall apply local law that most closely approximates +an absolute waiver of all civil liability in connection with the +Program, unless a warranty or assumption of liability accompanies a +copy of the Program in return for a fee. + + END OF TERMS AND CONDITIONS + + How to Apply These Terms to Your New Programs + + If you develop a new program, and you want it to be of the greatest +possible use to the public, the best way to achieve this is to make it +free software which everyone can redistribute and change under these terms. + + To do so, attach the following notices to the program. It is safest +to attach them to the start of each source file to most effectively +state the exclusion of warranty; and each file should have at least +the "copyright" line and a pointer to where the full notice is found. + + + Copyright (C) + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU Affero General Public License as published + by the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU Affero General Public License for more details. + + You should have received a copy of the GNU Affero General Public License + along with this program. If not, see . + +Also add information on how to contact you by electronic and paper mail. + + If your software can interact with users remotely through a computer +network, you should also make sure that it provides a way for users to +get its source. For example, if your program is a web application, its +interface could display a "Source" link that leads users to an archive +of the code. There are many ways you could offer source, and different +solutions will be better for different programs; see section 13 for the +specific requirements. + + You should also get your employer (if you work as a programmer) or school, +if any, to sign a "copyright disclaimer" for the program, if necessary. +For more information on this, and how to apply and follow the GNU AGPL, see +. diff --git a/MP_verify_qSyvBPhDsPdxvOhC.txt b/MP_verify_qSyvBPhDsPdxvOhC.txt new file mode 100644 index 00000000..767ab3e8 --- /dev/null +++ b/MP_verify_qSyvBPhDsPdxvOhC.txt @@ -0,0 +1 @@ +qSyvBPhDsPdxvOhC \ No newline at end of file diff --git a/README.md b/README.md new file mode 100644 index 00000000..6e5ea9db --- /dev/null +++ b/README.md @@ -0,0 +1,218 @@ +## 🔥 Lilishop B2B2C商城系统 + +##### 🌹 开源不易,如有帮助请点Star + + + +#### 欢迎交流需求,交流业务,交流技术(基础问题自行解决,进群先看文档后提问) + +##### 交流 qq 1群 961316482(已满) + +##### 交流 qq 2群 875294241 + + + +##### 商城 公众号/小程序体验,扫描二维码 + +![image-20210511171611793](https://pickmall.cn/assets/imgs/h5-qrcode.png) + +[![star](https://gitee.com/beijing_hongye_huicheng/lilishop/badge/star.svg?theme=dark)](https://gitee.com/beijing_hongye_huicheng/lilishop/stargazers) +  ![github](https://img.shields.io/github/stars/hongyehuicheng/lilishop.svg?style=social&logo=#181717) + + +### 🔥 商城介绍 +**官网**:https://pickmall.cn + +Lilishop 商城系统 基于SpringBoot 研发,B2B2C多用户商城系统,前端使用 Vue、uniapp开发 **系统全端全部代码开源** + +业务兼容O2O商城/B2B商城/B2B2C商城/F2B2C商城/S2B2C商城。支持小程序商城、H5商城、APP商城、 PC商城。 + + +商城前后端分离、支持分布式部署。 + +商城包含 会员模块、**第三方登录模块**、**第三方支付模块**、**楼层装修模块**、订单模块、分销模块、文章模块、系统设置模块、流量分析模块 + +商城包含各种中间件、搜索引擎、多级缓存、分布式事务、分布式任务调度等,支持Docker,支持k8s。是一款高性能,支持高并发的商城系统。 + +##### 商城 API/消费者 聚合版 +api不需要单独部署,只需启动一个jar包就可以正常运转 如有需要,可以点击跳转https://gitee.com/beijing_hongye_huicheng/lilishop-simplify + +### ☃️ 商城 开发/使用/常见问题 帮助文档 + +https://docs.pickmall.cn + +### 💧 开源商城项目地址(gitee) + +**API(商城所有API)**:https://gitee.com/beijing_hongye_huicheng/lilishop.git + +**UI(商城管理端/商家端/买家PC端)**: https://gitee.com/beijing_hongye_huicheng/lilishop-ui.git + +**uniapp(商城移动端,支持小程序/APP/H5)**:https://gitee.com/beijing_hongye_huicheng/lilishop-uniapp.git + +**docker一键部署(商城部署脚本)**:https://gitee.com/beijing_hongye_huicheng/docker.git + +### 💧 开源商城项目地址(github) + +**API(商城所有API)**:https://github.com/hongyehuicheng/lilishop.git + +**UI(商城管理端/商家端/买家PC端)**: https://github.com/hongyehuicheng/lilishop-ui.git + +**uniapp(商城移动端,支持小程序/APP/H5)**:https://github.com/hongyehuicheng/lilishop-uniapp.git + +**docker一键部署(商城部署脚本)**:https://github.com/hongyehuicheng/docker.git + + +☃️ UI 项目下3个文件夹 buyer:买家PC端,seller:商家端,manager:后台管理端 + + +### 💧 演示地址(手机验证码为 ‘111111’) + +**商城管理端**:https://admin-b2b2c.pickmall.cn 账号:admin/123456 + +**商城店铺后台**:https://store-b2b2c.pickmall.cn 账号:13011111111/111111 + +**商城PC页面**:https://pc-b2b2c.pickmall.cn + +**商城移动端(请使浏览器手机模式,或者用手机浏览器打开)**:https://m-b2b2c.pickmall.cn + +**小程序/公众号**:扫描二维码 + +![image-20210511171611793](https://pickmall.cn/assets/imgs/h5-qrcode.png) + +### 🚙 3行命令搭建本地商城(注:只能本机访问,如需调整,请自行操作镜像) + +温馨提示:由于服务中间件较多,如果笔记本环境启动内存没有32g可能无法启动成功(macbookpro 2020 16g内存启动无法成功),台式机在16g内存、AMD 3700x 的ubuntu系统成功运行。 + + + +##### docker环境安装 [点击跳转](https://docs.pickmall.cn/deploy/%E8%BF%90%E8%A1%8C%E7%8E%AF%E5%A2%83%E5%87%86%E5%A4%87.html) + + + +##### 下载docker-compose脚本 +`git clone https://gitee.com/beijing_hongye_huicheng/docker.git ` + +##### 部署商城所需中间件 +`docker-compose up -d` + +##### 部署商城应用 +`docker-compose -f docker-compose-application.yml up -d` + + + +PS:商城数据库单独部署 https://gitee.com/beijing_hongye_huicheng/docker/tree/master/init/mysql 这里有与tag版本一致的sql,根据tag获取sql,如果使用master代码,则需要在lilishop项目根目录的DB目录中,获取对应的升级sql。 + +##### 商城 API/UI 地址 + +| API | 地址 | +| -------------- | --------------- | +| 商城买家API | http://127.0.0.1:8888 | +| 商城商家API | http://127.0.0.1:8889 | +| 商城管理端API | http://127.0.0.1:8887 | +| 商城基础API | http://127.0.0.1:8890 | + +| 前端演示 | 地址 | +| -------------- | --------------- | +| 商城PC端 | http://127.0.0.1:10000 | +| 商城WAP端 | http://127.0.0.1:10001 | +| 商城卖家端 | http://127.0.0.1:10002 | +| 商城管理端 | http://127.0.0.1:10003 | + + + + + +### ⚾️ 功能列表 + + + +#### 🥎 商城平台功能 + +![平台功能](https://pickmall.cn/assets/imgs/other/managerList.jpg) + + + +#### 🥎 商城卖家功能 + +![商家端功能](https://pickmall.cn/assets/imgs/other/storeList.jpg) + + + + + +### 🧩 商城前端功能展示 + + + +#### ⚽️ 商城移动端 + +移动端功能展示 + + + +#### ⚽️ 商城管理端 + +![管理端功能展示](https://pickmall.cn/assets/imgs/other/manager.gif) + + +### 商城技术选型 + +#### 🥅 架构图 + +![架构](https://lili-system.oss-cn-beijing.aliyuncs.com/docs/%E6%9E%B6%E6%9E%84.png) + +##### 🕹 后台技术选型 + +| 说明 | 框架 | 说明 | | +| -------------- | --------------- | -------------- | ------------- | +| 基础框架 | Spring Boot | MVC框架 | Spring MVC | +| 持久框架 | Mybatis-Plus | 程序构建 | Maven | +| 关系型数据库 | MySQL | 消息中间件AMQP | RocketMQ | +| 缓存 | Redis +MongoDB | 搜索引擎 | Elasticsearch | +| 安全框架 | Spring Security | 数据库连接池 | Druid | +| 数据库分库分表 | sharding | 定时任务 | xxl-job | +| 负载均衡 | Nginx | 静态资源 | 阿里云OSS | +| 短信 | 阿里云短信 | 认证 | JWT | +| 日志处理 | Log4j | 接口规范 | RESTful | + +##### 🖥 前端-运营后台、店铺后台 + +| 说明 | 框架 | 说明 | 框架 | +| ---------- | ---------- | ---------- | ------- | +| 构建工具 | webpack | JS版本 | ES6 | +| 基础JS框架 | Vue.js | 视频播放器 | Dplayer | +| 路由管理 | Vue Router | 状态管理 | Vuex | +| 基础UI库 | iView | UI界面基于 | iView | +| 网络请求 | axios | | | + +##### 📱前端-移动端 + +| 说明 | 架构 | 说明 | 架构 | +| --------- | ------- | -------- | ------- | +| 基础UI库 | uViewui | 基础框架 | uni-app | +| CSS预处理 | scss | 地图引擎 | amap | + +### 🌟 版本升级 + +``` +商城后续会持续版本升级,修复bug,完善功能,覆盖更多业务场景 o2o/b2b/s2b2b2c/跨境电商 + +后续会考虑推出微服务商城系统/商城中台等 +``` + + +### ⚠️ 开源须知 +1.仅允许用于个人学习研究使用. + +2.禁止将本开源的代码和资源进行任何形式任何名义的出售. + +3.软件受国家计算机软件著作权保护(登记号:2021SR0805085)。 + +4.限制商用,如果需要商业使用请联系我们。QQ3409056806. + + +### 🐧 交流群 + +##### 官方qq 1群 961316482(已满) +##### 官方qq 2群 875294241 + diff --git a/api/address.js b/api/address.js new file mode 100644 index 00000000..1eee63f8 --- /dev/null +++ b/api/address.js @@ -0,0 +1,115 @@ +/** + * 收货地址相关API + */ + +import { http, Method } from "@/utils/request.js"; + +import api from "@/config/api.js"; + +/** + * 获取收货地址列表 + * @returns {AxiosPromise} + */ +export function getAddressList(pageNumber, pageSize) { + return http.request({ + url: "/member/address", + method: Method.GET, + needToken: true, + params: { pageNumber, pageSize }, + }); +} + + +/** + * 获取物流公司 + */ +export function getLogistics() { + return http.request({ + url: "/logistics", + method: Method.GET, + needToken: true, + params: { pageNumber: 1, pageSize: 200, disabled: "OPEN" }, + }); +} + +/** + * 通过cityCode获取地区代码 + */ +export function getAddressCode(cityCode, townName) { + return http.request({ + url: api.common + "/common/region/region", + method: Method.GET, + needToken: true, + params: { cityCode, townName }, + }); +} + +/** + * 添加收货地址 + * @param params 地址参数 + * @returns {AxiosPromise} + */ +export function addAddress(data) { + return http.request({ + url: "/member/address", + method: Method.POST, + needToken: true, + header: { "content-type": "application/x-www-form-urlencoded" }, + data: data, + }); +} + +/** + * 编辑地址 + * @param id 地址ID + * @param params 地址参数 + * @returns {AxiosPromise} + */ +export function editAddress(params) { + return http.request({ + url: `/member/address`, + method: Method.PUT, + needToken: true, + header: { "content-type": "application/x-www-form-urlencoded" }, + data: params, + }); +} + +/** + * 删除收货地址 + * @param id + */ +export function deleteAddress(id) { + return http.request({ + url: `/member/address/delById/${id}`, + method: Method.DELETE, + needToken: true, + }); +} + + + +/** + * 根据ID获取会员收件地址 + * @param id + */ +export function getAddressDetail(id) { + return http.request({ + url: `/member/address/get/${id}`, + method: Method.GET, + loading: false, + needToken: true, + }); +} + +/** + * + */ +export function getAddressDefault() { + return http.request({ + url: `/member/address/get/default`, + method: Method.GET, + loading: false, + needToken: true, + }); +} diff --git a/api/after-sale.js b/api/after-sale.js new file mode 100644 index 00000000..eb61cbde --- /dev/null +++ b/api/after-sale.js @@ -0,0 +1,220 @@ +/** + * 申请售后相关API + */ + +import { http, Method } from "@/utils/request.js"; + +/** + * 获取售后列表 + * @param params + * @returns {AxiosPromise} + */ +export function getAfterSale(params) { + return http.request({ + url: "after-sales/refunds", + method: Method.GET, + needToken: true, + loading: false, + params, + }); +} + + +/******************* 以下为新方法 ***********************/ +/** + * 申请取消订单 + * @param params + */ +export function applyCancelOrder(params) { + return http.request({ + url: "after-sales/apply/cancel/order", + method: Method.POST, + needToken: true, + params, + }); +} + +/** +/** + * 获取商家售后收件地址 + */ +export function getStoreAfterSaleAddress(sn) { + return http.request({ + url: `/order/afterSale/getStoreAfterSaleAddress/${sn}`, + method: Method.GET, + needToken: true, + }); +} +/** + * 取消售后 + */ +export function cancelAfterSale(afterSaleSn) { + return http.request({ + url: `/order/afterSale/cancel/${afterSaleSn}`, + method: Method.POST, + needToken: true, + }); +} + + + +/** + * 获取售后服务记录相关数据 + * @param params 参数 + */ +export function getAfterSaleList(params) { + return http.request({ + url: `/order/afterSale/page`, + method: Method.GET, + needToken: true, + params, + }); +} + +/** + * 查看售后服务详情 + * @param sn 售后服务单编号 + */ +export function getServiceDetail(sn) { + return http.request({ + url: `/order/afterSale/get/${sn}`, + method: Method.GET, + needToken: true, + }); +} + + +/** + * 添加投诉 + */ +export function addComplain(params) { + return http.request({ + url: `/order/complain`, + method: Method.POST, + needToken: true, + header: { + "Content-Type": "application/x-www-form-urlencoded", + }, + data: params, + }); +} + +/** + * 取消投诉 + */ +export function clearComplain(id, params) { + return http.request({ + url: `/order/complain/status/${id}`, + method: Method.PUT, + needToken: true, + params, + }); +} + +/** + * 取消投诉 + */ +export function getAfterSaleLog(sn) { + return http.request({ + url: `/order/afterSale/get/getAfterSaleLog/${sn}`, + method: Method.GET, + needToken: true, + }); +} + +/** + * 投诉列表 + */ +export function getComplain(params) { + return http.request({ + url: `/order/complain`, + method: Method.GET, + needToken: true, + params, + }); +} + +/** + * 获取申请原因 + */ +export function getAfterSaleReason(serviceType) { + return http.request({ + url: `/order/afterSale/get/afterSaleReason/${serviceType}`, + method: Method.GET, + needToken: true, + }); +} + +/** + * 获取取消原因 + */ +export function getClearReason() { + return http.request({ + url: `/order/afterSale/get/afterSaleReason/CANCEL`, + method: Method.GET, + needToken: true, + }); +} + +/** + * 获取投诉原因 + */ +export function getComplainReason() { + return http.request({ + url: `/order/afterSale/get/afterSaleReason/COMPLAIN`, + method: Method.GET, + needToken: true, + }); +} +/** + * 获取投诉详情 + */ +export function getComplainDetail(id) { + return http.request({ + url: `/order/complain/${id}`, + method: Method.GET, + needToken: true, + }); +} + +/** + * 获取申请售后页面信息 + */ +export function getAfterSaleInfo(sn) { + return http.request({ + url: `/order/afterSale/applyAfterSaleInfo/${sn}`, + method: Method.GET, + needToken: true, + }); +} + +/** + * 申请退货服务 + * @param params + */ +export function applyReturn(orderItemSn, params) { + return http.request({ + url: `/order/afterSale/save/${orderItemSn}`, + method: Method.POST, + header: { + "Content-Type": "application/x-www-form-urlencoded", + }, + data: params, + }); +} + +/** + * 填充物流信息 + * @param afterSaleSn 售后服务单号 + * @param params 参数信息 + */ +export function fillShipInfo(afterSaleSn, params) { + return http.request({ + url: `/order/afterSale/delivery/${afterSaleSn}`, + method: Method.POST, + header: { + "Content-Type": "application/x-www-form-urlencoded", + }, + data: params, + }); +} diff --git a/api/article.js b/api/article.js new file mode 100644 index 00000000..0d5baccf --- /dev/null +++ b/api/article.js @@ -0,0 +1,30 @@ +/** + * 文章相关API + */ + +import {http,Method} from '@/utils/request.js'; +import api from '@/config/api.js'; + +/** + * 获取某个分类的文章列表 + * @param category_type + */ +export function getArticleCategory(category_type) { + return http.request({ + url: `${api.base}/pages/article-categories`, + method: Method.GET, + params: {category_type}, + }); +} + +/** + * 获取文章详情 + * @param type + */ +export function getArticleDetail(type) { + return http.request({ + url: `/other/article/get/${type}`, + method: Method.GET, + }); +} + diff --git a/api/common.js b/api/common.js new file mode 100644 index 00000000..20f7ce3a --- /dev/null +++ b/api/common.js @@ -0,0 +1,32 @@ +/** + * 公共API + */ +import { http, Method } from "@/utils/request.js"; +import api from "@/config/api.js"; + +/** + * 获取地区数据 + * @param id + */ +export function getRegionsById(id = 0) { + return http.request({ + url: `${api.common}/common/region/item/${id}`, + method: Method.GET, + message: false, + }); +} + +// 获取IM接口前缀 +export function getIMDetail() { + return http.request({ + url: `${api.common}/IM`, + method: Method.GET, + message: false, + }); +} + +/** + * 文件上传地址 + * @type {string} + */ +export const upload = api.common + "/common/upload/file"; diff --git a/api/connect.js b/api/connect.js new file mode 100644 index 00000000..b5cf1910 --- /dev/null +++ b/api/connect.js @@ -0,0 +1,61 @@ +/** + * 信任登录相关API + */ + +import { + http, + Method +} from '@/utils/request.js'; +const request = http.request; + + +/** + * web 第三方登录 + * @param {Object} code + */ +export function webConnect(code) { + return http.request({ + url: `passport/connect/connect/login/web/${code}`, + method: Method.GET, + needToken: true, + header: { + "clientType": "H5" + } + }); +} +export function openIdLogin(params, clientType) { + return http.request({ + url: `passport/connect/connect/app/login`, + method: Method.GET, + needToken: true, + data: params, + header: { + "clientType": clientType + } + }); +} + +/** + * 第三方登录成功 回调接口 + */ +export function loginCallback(state) { + return http.request({ + url: `passport/connect/connect/result?state=${state}`, + method: Method.GET, + needToken: false + }); +} + + + +/** + * 小程序自动登录 + * @param params + */ +export function mpAutoLogin(params) { + return http.request({ + url: 'passport/connect/miniProgram/auto-login', + method: Method.GET, + params + }); +} diff --git a/api/goods.js b/api/goods.js new file mode 100644 index 00000000..bc8ae300 --- /dev/null +++ b/api/goods.js @@ -0,0 +1,220 @@ +/** + * 商品相关API + */ + +import { http, Method } from "@/utils/request.js"; + +/** + * 从ES中获取相关商品品牌名称,分类名称及属性 + */ + export function getGoodsMessage(goodsId) { + return http.request({ + url: `/goods/goods/get/${goodsId}`, + method: Method.GET, + }); +} + +/** + * 从ES中获取相关商品品牌名称,分类名称及属性 + */ +export function getGoodsRelated(params) { + return http.request({ + url: `/goods/goods/es/related`, + method: Method.GET, + params, + }); +} + +/** + * 获取商品详情 + * @param skuId 商品ID + * @returns {AxiosPromise} + */ + export function getGoods(skuId, goodsId) { + return http.request({ + url: `/goods/goods/sku/${goodsId}/${skuId}`, + method: Method.GET, + }); +} + +/** + * 获取商品分销 + * @param distributionId 商品分销ID + */ + export function getGoodsDistribution(distributionId) { + return http.request({ + url: `/distribution/distribution/bindingDistribution/${distributionId}`, + method: Method.GET, + }); +} + + +/** + * 获取商品列表 + * @param params + * @returns {AxiosPromise} + */ +export function getGoodsList(params) { + return http.request({ + url: "/goods/goods/es", + method: Method.GET, + params, + }); +} + +/** + * 获取上新商品列表 + * @param params + * @returns {AxiosPromise} + */ +export function getGoodsListUplog(params) { + return http.request({ + url: "goods/search/uplog", + method: Method.GET, + params, + }); +} + + + +/** + * 获取标签商品 + * @param storeId 卖家id + * @param mark 标签 hot:热卖 new:新品 recommend:推荐 + * @param num 获取个数 + */ +export function getTagGoods(storeId, mark = "hot", num = 5) { + return http.request({ + url: `goods/tags/${mark}/goods`, + method: Method.GET, + loading: false, + params: { + storeId, + mark, + num, + }, + }); +} +/** + * 获取标签商品 + */ +export function getPlateformTagGoods(tag_id) { + return http.request({ + url: `goods/tags/byid/${tag_id}`, + method: Method.GET, + loading: false, + }); +} + +/** + * 获取首页商品分类 左侧列表 + * @param parent_id + */ +export function getCategoryList(id) { + return http.request({ + url: `/goods/category/get/${id}`, + method: Method.GET, + loading: false, + }); +} + + + + +/** + * 获取当前会员的分销商信息 可根据分销商信息查询待提现金额以及冻结金额等信息 + */ +export function distribution() { + return http.request({ + url: `/distribution/distribution`, + method: Method.GET, + }); +} + +/** + * 申请分销商 + */ +export function applyDistribution(params) { + return http.request({ + url: `/distribution/distribution`, + method: Method.POST, + params, + }); +} + +/** + * 分销商提现 + */ +export function cash(params) { + return http.request({ + url: `/distribution/cash`, + method: Method.POST, + params, + }); +} + +/** + * 分销商提现历史 + */ +export function cashLog(params) { + return http.request({ + url: `/distribution/cash`, + method: Method.GET, + params + + }); +} + +/** + * 获取分销商分页订单列表 + */ +export function distributionOrderList(params) { + return http.request({ + url: `/distribution/distribution/distributionOrder`, + method: Method.GET, + params + }); +} + +/** + * 获取分销商商品列表 + */ +export function distributionGoods(params) { + return http.request({ + url: `/distribution/goods`, + method: Method.GET, + params, + }); +} +/** + * 选择分销商品 分销商品id + */ +export function checkedDistributionGoods(params) { + return http.request({ + url: `/distribution/goods/checked/${params.id}`, + method: Method.GET, + params + }); +} + +/** + * 获取 小程序码 + */ + export function getMpCode(params){ + return http.request({ + url:`/passport/connect/miniProgram/mp/unlimited`, + method:Method.GET, + params + }) +} + +/** + * 根据shortlink 获取页面参数 + */ + export function getMpScene(id){ + return http.request({ + url:`/passport/connect/miniProgram/mp/unlimited/scene?id=${id}`, + method:Method.GET, + + }) +} diff --git a/api/home.js b/api/home.js new file mode 100644 index 00000000..a5dee697 --- /dev/null +++ b/api/home.js @@ -0,0 +1,62 @@ +import { http, Method } from "@/utils/request.js"; + + + +/** + * 获取广告图 + */ +export function getAdvertisement() { + return http.request({ + url: "/advertisement", + method: Method.GET, + }); +} + + + +/** + * 获取首页商品分类 + * @param parent_id + */ +export function getCategory(parent_id = 0) { + return http.request({ + url: `goods/categories/${parent_id}/children`, + method: Method.GET, + loading: false, + }); +} + +/** + * 获取热门关键词 + * @param num + */ +export function getHotKeywords(count) { + return http.request({ + url: "/goods/goods/hot-words", + method: Method.GET, + loading: false, + params: { count }, + }); +} + +/** + * 获取楼层数据 + * @param client_type + * @param page_type + */ +export function getFloorData() { + return http.request({ + url: `/other/pageData/getIndex?clientType=H5`, + method: "get", + }); +} + +/** + * 获取获取首页分类数据 + */ +export function getCategoryIndexData(parentId = 0) { + return http.request({ + url: `/goods/category/get/${parentId}`, + method: "get", + }); +} diff --git a/api/login.js b/api/login.js new file mode 100644 index 00000000..64df2b78 --- /dev/null +++ b/api/login.js @@ -0,0 +1,76 @@ +import { http } from "@/utils/request.js"; + +import api from "@/config/api.js"; + +/** + * 通过短信重置密码 + * @param mobile + */ +export function resetByMobile(params) { + return http.request({ + url: `/passport/member/resetByMobile`, + method: "POST", + params, + }); +} + +/** + * 发送验证码 + * @param mobile + */ +export function sendMobile(mobile,type='LOGIN') { + return http.request({ + url: `${api.common}/common/sms/${type}/${mobile}`, + method: "GET", + }); +} + +/** + * 短信登录 + * @param mobile + * @param smsCode + */ +export function smsLogin(params, clientType) { + return http.request({ + url: `/passport/member/smsLogin`, + method: "POST", + data: params, + header: { + "content-type": "application/x-www-form-urlencoded", + clientType: clientType, + }, + }); +} + +/** + * 修改密码 + * @param newPassword + * @param password + */ + +export function modifyPass(params) { + return http.request({ + url: `/passport/member/modifyPass`, + method: "PUT", + params, + }); +} + +/** + * 刷新token + */ +export function refreshTokenFn(refresh_token) { + return http.request({ + url: `/passport/member/refresh/${refresh_token}`, + method: "GET", + }); +} + +// 获取密码状态 +export function logout () { + return http.request({ + url: '/passport/member/logout', + method: "POST", + needToken: true, + }) +} diff --git a/api/members.js b/api/members.js new file mode 100644 index 00000000..989af858 --- /dev/null +++ b/api/members.js @@ -0,0 +1,421 @@ +import storage from "@/utils/storage"; +import { http, Method } from "@/utils/request.js"; + +/** + * 意见反馈 + */ +export function feedBack(params) { + return http.request({ + url: "/other/feedback", + method: Method.POST, + needToken: true, + params, + }); +} + +// 提现 +export function withdrawalApply(params) { + return http.request({ + url: "/wallet/wallet/withdrawal", + method: Method.POST, + needToken: true, + params, + }); +} + +/** + * 支付结果查询 + * @param orderType 交易类型,可用值:TRADE,ORDER,RECHARGE + * @param sn 订单编号 + */ +export function payCallback(params) { + return http.request({ + url: `/payment/cashier/result`, + method: Method.GET, + params, + }); +} + +// 在线充值 +export function recharge(params) { + return http.request({ + url: "/trade/recharge", + method: Method.POST, + params, + }); +} + +/** + * 分页获取预存款充值记录 + * @param params + */ +export function getUserRecharge(params) { + return http.request({ + url: "/member/recharge", + method: Method.GET, + needToken: true, + params, + }); +} + +/** + * 分页获取预存款充值记录 + * @param params + */ +export function getWalletLog(params) { + return http.request({ + url: "/wallet/log", + method: Method.GET, + needToken: true, + params, + }); +} + +/** + * 获取优惠券列表 + * @param params + */ +export function getCoupons(params) { + return http.request({ + url: "/promotion/coupon/getCoupons", + method: Method.GET, + needToken: true, + params, + }); +} + +/** + * 领取优惠券 + * @param couponId + */ +export function receiveCoupons(couponId) { + return http.request({ + url: `/promotion/coupon/receive/${couponId}`, + method: Method.GET, + needToken: true, + }); +} + +/** + * 获取积分明细数据 + * @param params + * @returns {AxiosPromise} + */ +export function getPointsData(params) { + return http.request({ + url: "member/memberPointsHistory/getByPage", + method: Method.GET, + needToken: true, + params, + }); +} + +/** + * 获取我的评论列表 + * @param params + * @returns {AxiosPromise} + */ +export function getComments(params) { + return http.request({ + url: "/member/evaluation", + method: Method.GET, + needToken: true, + params, + }); +} + +/** + * 获取当前会员的浏览数量是多少 + * @param params + * @returns {AxiosPromise} + */ +export function getFootprintNum(params) { + return http.request({ + url: "/member/footprint/getFootprintNum", + method: Method.GET, + needToken: true, + params, + }); +} + +/** + * 订单评论 + * @param params + */ +export function commentsMemberOrder(params) { + return http.request({ + url: "/member/evaluation", + method: Method.POST, + needToken: true, + header: { "content-type": "application/x-www-form-urlencoded" }, + data: params, + }); +} + +/** + * 追加评论 + * @param params + */ +export function AppendCommentsOrder(params) { + return http.request({ + url: "members/comments/additional", + method: Method.POST, + needToken: true, + header: { "content-type": "application/x-www-form-urlencoded" }, + data: params, + }); +} + +// TODO 第一版本暂未实现此功能 +/** + * 商品咨询 + * @param goods_id + * @param ask_content + */ +export function consultating(goods_id, ask_content, anonymous) { + return http.request({ + url: "members/asks", + method: Method.POST, + header: { "content-type": "application/x-www-form-urlencoded" }, + needToken: true, + data: { + goods_id, + ask_content, + anonymous, + }, + }); +} + +/** + * 获取商品收藏 + * @param params + * @returns {AxiosPromise} + */ +export function getGoodsCollection(params, type) { + return http.request({ + url: `/member/collection/${type}`, + method: Method.GET, + needToken: true, + loading: false, + message: false, + params, + }); +} + +/** + * 收藏商品 + * @returns {AxiosPromise} + */ +export function collectionGoods(type, id) { + return http.request({ + url: `/member/collection/add/${type}/${id}`, + method: Method.POST, + needToken: true, + }); +} + +/** + * 删除商品收藏 + * @param ids 收藏ID【集合或单个商品ID】 + * @returns {AxiosPromise} + */ +export function deleteGoodsCollection(ids) { + if (Array.isArray(ids)) { + ids = ids.join(","); + } + return http.request({ + url: `/member/collection/delete/GOODS/${ids}`, + method: Method.DELETE, + needToken: true, + }); +} + +/** + * 删除店铺收藏 + * @param store_id + */ +export function deleteStoreCollection(store_id) { + return http.request({ + url: `/member/collection/delete/STORE/${store_id}`, + method: Method.DELETE, + needToken: true, + }); +} + +/** + * 获取商品是否被收藏 + * @param good_id + */ +export function getGoodsIsCollect(type, good_id) { + return http.request({ + url: `/member/collection/isCollection/${type}/${good_id}`, + method: Method.GET, + needToken: true, + loading: false, + }); +} + +/** + * 收藏店铺 + * @param store_id 店铺ID + * @returns {AxiosPromise} + */ +export function collectionStore(store_id) { + return http.request({ + url: "members/collection/store", + header: { "content-type": "application/x-www-form-urlencoded" }, + method: Method.POST, + data: { store_id }, + }); +} + +/** + * 获取当前登录的用户信息 + * @returns {AxiosPromise} + */ +export function getUserInfo() { + return http.request({ + url: "/passport/member", + method: Method.GET, + needToken: true, + }); +} + +/** + * 获取当前用户的预存款 + * @returns {AxiosPromise} + */ +export function getUserWallet() { + return http.request({ + url: "/wallet/wallet", + method: Method.GET, + needToken: true, + }); +} + +/** + * 保存用户信息 + * @param params + * @returns {AxiosPromise} + */ +export function saveUserInfo(params) { + return http.request({ + url: "/passport/member/editOwn", + method: Method.PUT, + header: { "content-type": "application/x-www-form-urlencoded" }, + needToken: true, + data: params, + }); +} + +/** + * 添加发票 + * @param params + */ +export function addReceipt(params) { + return http.request({ + url: "/trade/receipt", + method: Method.POST, + needToken: true, + params, + }); +} + +/** + * 获取商品评论列表 + * @param goodsId + * @param params + */ +export function getGoodsComments(goodsId, params) { + return http.request({ + url: `/member/evaluation/${goodsId}/goodsEvaluation`, + method: Method.GET, + loading: false, + params, + }); +} + +/** + * 获取商品评论数量统计 + * @param goodsId + */ +export function getGoodsCommentsCount(goodsId) { + return http.request({ + url: `/member/evaluation/${goodsId}/evaluationNumber`, + method: Method.GET, + loading: false, + }); +} + +/** + * 获取未读消息数量信息 + */ +export function getNoReadMessageNum() { + return http.request({ + url: `members/member-nocice-logs/number`, + method: Method.GET, + needToken: true, + }); +} + +/** + * 我的足迹列表 + * @param pageNumber pageSize + * + */ +export function myTrackList(params) { + return http.request({ + url: `/member/footprint`, + method: Method.GET, + needToken: true, + params, + }); +} + +/** + * 根据id删除会员足迹 + * @param id + */ +export function deleteHistoryListId(ids) { + return http.request({ + url: `/member/footprint/delByIds/${ids}`, + method: Method.DELETE, + needToken: true, + }); +} + +/** + * 获取当前会员优惠券列表 + * @param + */ +export function getMemberCoupons(data) { + return http.request({ + url: `/promotion/coupon/getCoupons`, + method: Method.GET, + needToken: true, + params: data, + }); +} + +/** + * 获取当前会员可使用的优惠券数量 + * + */ +export function getCouponsNum() { + return http.request({ + url: `/promotion/coupon/getCouponsNum`, + method: Method.GET, + needToken: true, + }); +} + +/** + * 获取会员积分VO + * @param + */ +export function getMemberPointSum() { + return http.request({ + url: `member/memberPointsHistory/getMemberPointsHistoryVO`, + method: Method.GET, + }); +} diff --git a/api/message.js b/api/message.js new file mode 100644 index 00000000..b7cc5e82 --- /dev/null +++ b/api/message.js @@ -0,0 +1,94 @@ +/** + * 站内消息相关API + */ + +import {http,Method} from '@/utils/request.js'; +const request = http.request + +import api from '@/config/api.js'; + +/** + * 获取微信消息订阅 + * @param params + * @returns {AxiosPromise} + */ +export function getWeChatMpMessage() { + return http.request({ + url: 'mini-program/subscribeMessage', + method: Method.GET + }); +} + +/** + * 获取消息列表 + * @param params + * @returns {AxiosPromise} + */ +export function getMessages(params) { + params = params || {}; + params.pageSize = params.pageSize || 5; + return http.request({ + url: 'members/member-nocice-logs', + method: Method.GET, + needToken: true, + params, + }); +} + + +/** + * 标记消息为已读 + * @param ids + */ +export function messageMarkAsRead(ids) { + return http.request({ + url: `members/member-nocice-logs/${ids}/read`, + method: Method.PUT, + needToken: true, + }); +} + + +/** + * 获取物流消息列表 + * @param params + * @returns {AxiosPromise} + */ +export function getLogisticsMessages(params) { + params = params || {}; + params.pageSize = params.pageSize || 5; + return http.request({ + url: 'trade/logistics/message', + method: Method.GET, + needToken: true, + params, + }); +} + + +/** + * @param appType + * @returns {AxiosPromise} + * + */ + export function getAppVersion(appType) { + return http.request({ + url: `/appVersion/${appType}`, + method: Method.GET, + type:"manager" + }); +} + +/** + * @param appType + * @returns {AxiosPromise} + * + */ + export function getAppVersionList(type,data) { + return http.request({ + url: `/appVersion/appVersion/${type}`, + method: Method.GET, + type:"manager", + data + }); +} diff --git a/api/order.js b/api/order.js new file mode 100644 index 00000000..a718297c --- /dev/null +++ b/api/order.js @@ -0,0 +1,115 @@ +/** + * 订单相关API + */ + +import { http, Method } from "@/utils/request.js"; + + + + +/** + * 选择发票 + * @param params + */ + export function getReceipt(params) { + return http.request({ + url: "/trade/carts/select/receipt", + method: Method.GET, + needToken: true, + params, + }); +} + +/** + * 选择发票 + * @param id + */ +export function getReceiptDetail(id) { + return http.request({ + url: `/trade/receipt/${id}`, + method: Method.GET, + needToken: true, + }); +} + +/** + * 选择配送方式 + * @param params + */ +export function selectedShipMethod(params) { + return http.request({ + url: "/trade/carts/shippingMethod", + method: Method.GET, + needToken: true, + params, + }); +} + +/** + * 获取订单列表 + * @param params + */ +export function getOrderList(params) { + return http.request({ + url: "/order/order", + method: Method.GET, + needToken: true, + params, + }); +} + +/** + * 获取订单详情 + * @param orderSn 订单编号 + */ +export function getOrderDetail(orderSn) { + return http.request({ + url: `/order/order/${orderSn}`, + method: Method.GET, + needToken: true, + }); +} + +/** + * 取消订单 + * @param orderSn 订单编号 + * @param reason 取消原因 + */ +export function cancelOrder(orderSn, reason) { + return http.request({ + url: `/order/order/${orderSn}/cancel`, + method: Method.POST, + needToken: true, + header: { "content-type": "application/x-www-form-urlencoded" }, + data: reason, + }); +} + +/** + * 确认收货 + * @param orderSn 订单编号 + */ +export function confirmReceipt(orderSn) { + return http.request({ + url: `/order/order/${orderSn}/receiving`, + method: Method.POST, + needToken: true, + }); +} + + + +/** + * 获取当前拼团订单的拼团分享信息 + * @param {*} parentOrderSn + * @param {*} skuId + */ +export function getPinTuanShare(parentOrderSn,skuId) { + return http.request({ + url: `promotion/pintuan/share`, + method: Method.GET, + needToken: true, + params:{parentOrderSn,skuId} + }); +} + diff --git a/api/passport.js b/api/passport.js new file mode 100644 index 00000000..b15cb05b --- /dev/null +++ b/api/passport.js @@ -0,0 +1,111 @@ +/** + * Created by Andste on 2018/5/2. + * 用户认证相关API + */ +import storage from '@/utils/storage.js'; +import {http, Method} from '@/utils/request.js'; +import { md5 } from '@/utils/md5.js'; + +/** + * 普通登录 + * @param username + * @param password + * @param captcha + */ +export function login(username, password, captcha) { + return http.request({ + url: 'passport/login', + method: Method.POST, + params: { + username, + password: md5(password), + captcha, + uuid: storage.getUuid(), + }, + }); +} + + + + + +/** + * 验证账户信息 + * @param captcha + * @param account + */ +export function validAccount(captcha, account) { + return http.request({ + url: 'passport/find-pwd', + method: Method.GET, + params: { + uuid: storage.getUuid(), + captcha, + account, + }, + }); +} + +/** + * 发送找回密码短信 + * @param uuid + * @param captcha + */ +export function sendFindPasswordSms(uuid,captcha) { + return http.request({ + url: 'passport/find-pwd/send', + method: Method.POST, + header:{'content-type':"application/x-www-form-urlencoded"}, + data: { + uuid:uuid, + captcha, + }, + }); +} + +/** + * 校验找回密码验证码 + * @param uuid + * @param sms_code + */ +export function validFindPasswordSms(uuid, sms_code) { + return http.request({ + url: 'passport/find-pwd/valid', + method: Method.GET, + params: { + uuid, + sms_code, + }, + }); +} + +/** + * 修改密码【找回密码用】 + * @param password + * @param uuid + */ +export function changePassword(password, uuid) { + if (!uuid) { + uuid = storage.getUuid(); + } + return http.request({ + url: 'passport/find-pwd/update-password', + method: Method.PUT, + header:{'content-type':"application/x-www-form-urlencoded"}, + data: { + uuid, + password: md5(password), + }, + }); +} + + + +// 保存生物认证登录 +export function setBiolofy(params) { + return http.request({ + url: `passport/login/save/biology`, + method: 'POST', + params + }) +} diff --git a/api/point.js b/api/point.js new file mode 100644 index 00000000..784aaae9 --- /dev/null +++ b/api/point.js @@ -0,0 +1,28 @@ + +import {http, Method} from '@/utils/request.js'; + +/** + * 签到 + * @param params + */ +export function sign() { + return http.request({ + url: '/members/sign', + method: Method.POST, + needToken: true, + }); +} + + + +/** + * 签到时间获取 + * @param params + */ +export function signTime(time) { + return http.request({ + url: '/members/sign?time='+time, + method: Method.GET, + needToken: true, + }); +} diff --git a/api/promotions.js b/api/promotions.js new file mode 100644 index 00000000..e7d5eaea --- /dev/null +++ b/api/promotions.js @@ -0,0 +1,188 @@ +/** + * 促销相关API + */ +import { http, Method } from "@/utils/request.js"; + +/** + * 获取当前直播列表 + * + * @param {*} + * @returns + */ +export function getLiveList(params) { + return http.request({ + url: `broadcast/studio`, + method: Method.GET, + params, + }); +} + +/** + * 获取当前拼团活动的未成团的会员 + */ +export function getPromotionGroupMember(pintuanId) { + return http.request({ + url: `promotion/pintuan/${pintuanId}/members`, + method: Method.GET, + }); +} + +/** 获取拼团列表 */ +export function getAssembleList(params) { + return http.request({ + url: "promotion/pintuan", + method: Method.GET, + loading: false, + params, + }); +} + +/** + * 获取积分商城分类 + */ +export function getPointsCategory() { + return http.request({ + url: "/promotion/pointsGoods/category", + method: Method.GET, + }); +} + +/** + * 获取积分商城商品 + * @param params + */ + export function getPointsGoods(params) { + return http.request({ + url: "/promotion/pointsGoods", + method: Method.GET, + params, + }); +} +/** + * 获取积分商城商品详情 + * @param params + */ +export function getPointsGoodsDetail(id) { + return http.request({ + url: "/promotion/pointsGoods/"+id, + method: Method.GET, + }); +} + + + +/** + * 获取限时抢购时间线 当天限时抢购信息 + */ +export function getSeckillTimeLine() { + return http.request({ + url: "promotion/seckill", + method: Method.GET, + }); +} + +/** + * 获取限时抢购商品 获取某个时刻的限时抢购商品信息 + * @param params + */ +export function getSeckillTimeGoods(timeline) { + return http.request({ + url: `promotion/seckill/${timeline}`, + method: Method.GET, + }); +} + +/** + * 获取全部优惠券 + * @param params + */ +export function getAllCoupons(params) { + return http.request({ + url: "/promotion/coupon", + method: Method.GET, + params, + }); +} + +/** + * 分页获取砍价商品 + * @param params + */ +export function getBargainList(params) { + return http.request({ + url: "/promotion/kanjiaGoods", + method: Method.GET, + params, + }); +} + +/** + * 分页获取砍价商品 + * @param params + */ +export function getBargainDetail(id) { + return http.request({ + url: `/promotion/kanjiaGoods/${id}`, + method: Method.GET, + }); +} + +/** + * 获取砍价活动 + * @param params + */ +export function getBargainActivity(params) { + return http.request({ + url: `/promotion/kanjiaGoods/getKanjiaActivity`, + method: Method.POST, + params, + }); +} + +/** + * 发起砍价活动 + * @param params + */ +export function openBargain(params) { + return http.request({ + url: `/promotion/kanjiaGoods`, + method: Method.POST, + header: { "content-type": "application/x-www-form-urlencoded" }, + data: params, + }); +} + +/** + * 分页获取砍价活动-帮砍记录 + */ +export function getBargainLog(params) { + return http.request({ + url: `/promotion/kanjiaGoods/getKanjiaActivity/logs`, + method: Method.GET, + data: params, + }); +} + + +/** + * 分页获取砍价活动-帮砍记录 + */ + export function helpBargain(kanJiaActivityId) { + return http.request({ + url: `promotion/kanjiaGoods/help/${kanJiaActivityId}`, + method: Method.POST, + }); +} + +/** + * 分页获取已参与的砍价活动 + */ +export function getMineBargainLog(params) { + return http.request({ + url: `/promotion/kanjiaGoods/kanjiaActivity/mine/`, + method: Method.GET, + params + }); +} + + diff --git a/api/safe.js b/api/safe.js new file mode 100644 index 00000000..d06e423f --- /dev/null +++ b/api/safe.js @@ -0,0 +1,136 @@ +/** + * 安全相关API + */ + +import {http,Method} from '@/utils/request.js'; +import storage from "@/utils/storage.js" +import { md5 } from '@/utils/md5.js' + +/** + * 发送绑定手机验证码 + * @param mobile + * @param captcha + */ +export function sendBindMobileSms(mobile, captcha) { + return http.request({ + url: `members/security/bind/send/${mobile}`, + method: Method.POST, + needToken: true, + header:{'content-type':"application/x-www-form-urlencoded"}, + data: { + uuid: storage.getUuid(), + captcha, + }, + }); +} + +/** + * 绑定手机号 + * @param mobile + * @param sms_code + */ +export function bindMobile(mobile, sms_code) { + return http.request({ + url: `members/security/bind/${mobile}`, + method: Method.PUT, + needToken: true, + data: {sms_code}, + }); +} + +/** + * 发送手机验证码 + * 在修改手机号和更改密码时通用 + * @param captcha + */ +export function sendMobileSms(captcha) { + return http.request({ + url: 'members/security/send', + method: Method.POST, + needToken: true, + header:{'content-type':"application/x-www-form-urlencoded"}, + data: { + uuid: storage.getUuid(), + captcha, + }, + }); +} + +/** + * 验证更换手机号短信 + * @param sms_code + */ +export function validChangeMobileSms(sms_code) { + return http.request({ + url: 'members/security/exchange-bind', + method: Method.GET, + needToken: true, + params: {sms_code}, + }); +} + +/** + * 更换手机号 + * @param mobile + * @param sms_code + */ +export function changeMobile(mobile, sms_code) { + return http.request({ + url: `members/security/exchange-bind/${mobile}`, + method: Method.PUT, + header:{'content-type':"application/x-www-form-urlencoded"}, + needToken: true, + data: {sms_code}, + }); +} + + +/** + * 更改密码 + * @param captcha + * @param password + */ +export function changePassword(captcha, password) { + return http.request({ + url: 'members/security/password', + method: Method.PUT, + header:{'content-type':"application/x-www-form-urlencoded"}, + needToken: true, + data: { + uuid: storage.getUuid(), + captcha, + password: md5(password), + }, + }); +} + +/** + * 获取当前实名认证进度 + * @param email + * @param email_code + */ +export function contractStep() { + return http.request({ + url: `members/contract/step`, + method: Method.GET, + needToken: true + }) +} + +/** + * 实名认证 + * @param email + * @param email_code + */ +export function authentication(params) { + return http.request({ + url: `members/contract/authentication`, + method: Method.POST, + needToken: true, + header:{'content-type':"application/x-www-form-urlencoded"}, + data: params + }) +} + + + diff --git a/api/store.js b/api/store.js new file mode 100644 index 00000000..20e5ee2c --- /dev/null +++ b/api/store.js @@ -0,0 +1,59 @@ +/** + * 店铺相关API + */ + +import {http, Method} from '@/utils/request.js'; + + + + +/** + * 获取店铺列表 + * @param params + */ +export function getStoreList(params) { + return http.request({ + url: '/store', + method: Method.GET, + params, + }); +} + +/** + * 获取店铺基本信息 + * @param storeId + */ + export function getStoreBaseInfo(storeId) { + return http.request({ + url: `/store/store/get/detail/${storeId}`, + method: Method.GET, + loading: false, + }); +} + +/** + * 获取店铺分类 + * @param id + */ + export function getStoreCategory(id) { + return http.request({ + url: `/store/store/label/get/${id}`, + method: Method.GET, + }); +} + + +/** + * 营业执照 + * @param id + */ + export function getLicencePhoto(id) { + return http.request({ + url: `/store/store/get/licencePhoto/${id}`, + method: Method.GET, + }); +} + + + + diff --git a/api/trade.js b/api/trade.js new file mode 100644 index 00000000..bc4beb15 --- /dev/null +++ b/api/trade.js @@ -0,0 +1,283 @@ +/** + * 交♂易相关API + */ + +import { http, Method } from "@/utils/request.js"; + +/** + * 获取购物车列表 + * @param show_type 要显示的类型 all:全部 checked:已选中的 + */ +export function getCarts() { + return http.request({ + url: `/trade/carts/all`, + method: Method.GET, + needToken: true, + loading: false, + }); +} + +/** + * 获取购物车总数 + * @param show_type 要显示的类型 all:全部 checked:已选中的 + */ +export function getCartNum() { + return http.request({ + url: `/trade/carts/count`, + method: Method.GET, + needToken: true, + loading: false, + }); +} + +/** + * 获取购物车可用优惠券数量 + * @param way 购物车购买:CART/立即购买:BUY_NOW/拼团购买:PINTUAN / 积分购买:POINT + */ +export function getCartCouponNum(way) { + return http.request({ + url: `/trade/carts/coupon/num?way=${way}`, + method: Method.GET, + needToken: true, + loading: false, + }); +} + +/** + * 添加货品到购物车 + * @param skuId 产品ID + * @param num 产品的购买数量 + * @param cartType 购物车类型,默认加入购物车 + */ +export function addToCart(data) { + return http.request({ + url: "/trade/carts", + method: Method.POST, + needToken: true, + header: { "content-type": "application/x-www-form-urlencoded" }, + data, + }); +} + + + +/** + * 更新购物车商品数量 + * @param skuId + * @param num + */ +export function updateSkuNum(skuId, num = 1) { + return http.request({ + url: `/trade/carts/sku/num/${skuId}`, + method: Method.POST, + header: { "content-type": "application/x-www-form-urlencoded" }, + needToken: true, + data: { num }, + }); +} + +/** + * 更新购物车货品选中状态 + * @param skuId + * @param checked + */ +export function updateSkuChecked(skuId, checked) { + return http.request({ + url: `/trade/carts/sku/checked/${skuId}`, + method: Method.POST, + needToken: true, + header: { "content-type": "application/x-www-form-urlencoded" }, + data: { checked }, + }); +} + +/** + * 删除多个货品项 + * @param skuIds + */ +export function deleteSkuItem(skuIds) { + return http.request({ + url: `/trade/carts/sku/remove?skuIds=${skuIds}`, + method: Method.DELETE, + needToken: true, + }); +} + + +/** + * 设置全部货品为选中或不选中 + * @param checked + */ +export function checkAll(checked) { + return http.request({ + url: "/trade/carts/sku/checked", + method: Method.POST, + needToken: true, + params: { checked }, + }); +} + +/** + * 设置店铺内全部货品选中状态 + * @param storeId + * @param checked + */ +export function checkStore(storeId, checked) { + return http.request({ + url: `/trade/carts/store/${storeId}`, + method: Method.POST, + needToken: true, + header: { "content-type": "application/x-www-form-urlencoded" }, + data: { checked }, + }); +} + +/** + * 获取结算参数 + */ +export function getCheckoutParams(way) { + return http.request({ + url: "/trade/carts/checked?way=" + way, + method: Method.GET, + needToken: true, + }); +} + +/** + * 设置收货地址ID + * @param addressId + */ +export function setAddressId(addressId,way) { + return http.request({ + url: `/trade/carts/shippingAddress?shippingAddressId=${addressId}&way=${way}`, + method: Method.GET, + needToken: true, + + }); +} + + +/** + * 创建交易 + */ +export function createTrade(params) { + return http.request({ + url: "/trade/carts/create/trade", + method: Method.POST, + needToken: true, + message: false, + data:params, + }); +} + + +/** + * 根据交易编号或订单编号查询收银台数据 + * @param params + */ +export function getCashierData(params) { + return http.request({ + url: "payment/cashier/tradeDetail", + method: Method.GET, + needToken: true, + params, + }); +} + + +/** + * 发起支付 + * @param paymentMethod + * @param paymentClient + * @param params + * @returns {*|*} + */ +export function initiatePay(paymentMethod, paymentClient, params) { + return http.request({ + url: `payment/cashier/pay/${paymentMethod}/${paymentClient}`, + method: Method.GET, + needToken: true, + params, + }); +} + + +/** + * 查询物流 + * @param orderSn + + */ +export function getExpress(orderSn) { + return http.request({ + url: `/order/order/getTraces/${orderSn}`, + method: Method.POST, + needToken: true, + + }); +} + + +/** + * 获取当前会员的对于当前商品可使用的优惠券列表 + */ + export function getMemberCanUse(data) { + return http.request({ + url: `/promotion/coupon/canUse`, + method: Method.GET, + params: data, + }); +} + + + +/** + * 获取当前会员的优惠券列表 + */ +export function getMemberCouponList(data) { + return http.request({ + url: `/promotion/coupon/getCoupons`, + method: Method.GET, + params: data, + }); +} + +/** + * 使用优惠券 + + */ +export function useCoupon(params) { + return http.request({ + url: `/trade/carts/select/coupon`, + method: Method.GET, + needToken: true, + params: params, + }); +} + + +/** + * 更换参与活动 + * @param params + */ +export function changeActivity(params) { + return http.request({ + url: "trade/promotion", + method: Method.POST, + needToken: true, + data: params, + + header: { "content-type": "application/x-www-form-urlencoded" }, + }); +} + +/** + * 根据交易单号查询订单列表 + * @param trade_sn + */ +export function reBuy(sn) { + return http.request({ + url: `trade/carts/rebuy/${sn}`, + method: Method.POST, + needToken: true, + }); +} diff --git a/api/vlog.js b/api/vlog.js new file mode 100644 index 00000000..26c8f4c0 --- /dev/null +++ b/api/vlog.js @@ -0,0 +1,164 @@ +/** + * 短视频相关API + */ + +import { http, Method } from "@/utils/request.js"; + +import api from "@/config/api.js"; + + + +/** + * 短视频列表 + */ +export function vlogList(page, pageSize) { + return http.request({ + url: api.vlog + "/vlog/indexList", + method: Method.GET, + needToken: false, + params: { page, pageSize }, + }); +} + +/** + * 短视频喜欢 + */ +export function vlogLike({userId,vlogId,vlogerId}) { + return http.request({ + url: api.vlog + "/vlog/like", + method: Method.POST, + needToken: true, + params: {userId,vlogId,vlogerId} + }); +} + +/** + * 短视频不喜欢 + */ +export function vlogUnLike({userId,vlogId,vlogerId}) { + return http.request({ + url: api.vlog + "/vlog/unlike", + method: Method.POST, + needToken: true, + params: {userId,vlogId,vlogerId} + }); +} + +/** + * 短视频评论 + */ +export function vlogComment(vlogId) { + return http.request({ + url: api.vlog + "/comment/counts", + method: Method.GET, + needToken: true, + params: { vlogId }, + }); +} + +/** + * 短视频关注博主 + */ +export function vlogFollow({myId,vlogerId}) { + return http.request({ + url: api.vlog + "/fans/follow", + method: Method.POST, + needToken: true, + params: {myId,vlogerId} + }); +} + +/** + * 短视频查询当前点赞数 + */ +export function vlogTotalLikedCounts(vlogId) { + return http.request({ + url: api.vlog + "/vlog/totalLikedCounts", + method: Method.POST, + needToken: true, + params: {vlogId} + }); +} + + +/** + * 通过cityCode获取地区代码 + */ +export function getAddressCode(cityCode, townName) { + return http.request({ + url: api.common + "/common/region/region", + method: Method.GET, + needToken: true, + params: { cityCode, townName }, + }); +} + +/** + * 添加收货地址 + * @param params 地址参数 + * @returns {AxiosPromise} + */ +export function addAddress(data) { + return http.request({ + url: "/member/address", + method: Method.POST, + needToken: true, + header: { "content-type": "application/x-www-form-urlencoded" }, + data: data, + }); +} + +/** + * 编辑地址 + * @param id 地址ID + * @param params 地址参数 + * @returns {AxiosPromise} + */ +export function editAddress(params) { + return http.request({ + url: `/member/address`, + method: Method.PUT, + needToken: true, + header: { "content-type": "application/x-www-form-urlencoded" }, + data: params, + }); +} + +/** + * 删除收货地址 + * @param id + */ +export function deleteAddress(id) { + return http.request({ + url: `/member/address/delById/${id}`, + method: Method.DELETE, + needToken: true, + }); +} + + + +/** + * 根据ID获取会员收件地址 + * @param id + */ +export function getAddressDetail(id) { + return http.request({ + url: `/member/address/get/${id}`, + method: Method.GET, + loading: false, + needToken: true, + }); +} + +/** + * + */ +export function getAddressDefault() { + return http.request({ + url: `/member/address/get/default`, + method: Method.GET, + loading: false, + needToken: true, + }); +} diff --git a/components/default-page/default-page.vue b/components/default-page/default-page.vue new file mode 100644 index 00000000..a1d6d7d7 --- /dev/null +++ b/components/default-page/default-page.vue @@ -0,0 +1,86 @@ + + + + + diff --git a/components/m-airbtn/index.vue b/components/m-airbtn/index.vue new file mode 100644 index 00000000..72e40dfe --- /dev/null +++ b/components/m-airbtn/index.vue @@ -0,0 +1,117 @@ + + + + + diff --git a/components/m-buy/README.md b/components/m-buy/README.md new file mode 100644 index 00000000..c004c1f4 --- /dev/null +++ b/components/m-buy/README.md @@ -0,0 +1,3 @@ +## 购买组件 +1.本组件是砍价,积分购买,参团等复用组 +2.后续会将此组件和商品购买组件合并,文档后续再出 diff --git a/components/m-buy/goods.vue b/components/m-buy/goods.vue new file mode 100644 index 00000000..cca176f7 --- /dev/null +++ b/components/m-buy/goods.vue @@ -0,0 +1,515 @@ + + + diff --git a/components/m-buy/popup.js b/components/m-buy/popup.js new file mode 100644 index 00000000..28336331 --- /dev/null +++ b/components/m-buy/popup.js @@ -0,0 +1,8 @@ + + +export default { + height:"1000rpx", //弹出层高度 + mode:"bottom", //弹出层位置 + radius:"32", //圆角 rpx, + close:false //能否点击遮罩退出 +} \ No newline at end of file diff --git a/components/m-buy/popup.scss b/components/m-buy/popup.scss new file mode 100644 index 00000000..d571c30d --- /dev/null +++ b/components/m-buy/popup.scss @@ -0,0 +1,37 @@ +.view-class-title { + font-size: 26rpx; + color: #262626; + + font-weight: 700; + height: 80rpx; + line-height: 80rpx; +} +.confirmBtn { + width: 90%; +} +.confirmBtn, +.box-btn { + line-height: 80rpx; + height: 80rpx; + + background: $price-color; + color: #fff; + border-radius: 200px; + text-align: center; + margin: 5rpx auto; +} + +.btns { + display: flex; + width: 100%; + + margin: 0 auto; +} +.goods-price-bigshow { + font-size: 48rpx; + font-weight: bold; +} +.box-btn { + flex: 1; + margin: 0 10rpx; +} diff --git a/components/m-canvas/README.md b/components/m-canvas/README.md new file mode 100644 index 00000000..53ba0e40 --- /dev/null +++ b/components/m-canvas/README.md @@ -0,0 +1 @@ +### 说明 https://ext.dcloud.net.cn/plugin?id=3237 diff --git a/components/m-canvas/index.vue b/components/m-canvas/index.vue new file mode 100644 index 00000000..65803146 --- /dev/null +++ b/components/m-canvas/index.vue @@ -0,0 +1,211 @@ + + + + diff --git a/components/m-city/m-city.vue b/components/m-city/m-city.vue new file mode 100644 index 00000000..c4cd9593 --- /dev/null +++ b/components/m-city/m-city.vue @@ -0,0 +1,390 @@ + + + + + \ No newline at end of file diff --git a/components/m-goods-recommend/README.md b/components/m-goods-recommend/README.md new file mode 100644 index 00000000..b33849ab --- /dev/null +++ b/components/m-goods-recommend/README.md @@ -0,0 +1,10 @@ +## 商品推荐 + + +### OBJECT 参数说明 +属性|说明|类型|必填 +---|---|---|--- +`title`|标题,用于顶部显示的内容|String|否 +`pageSize`|显示多少条数据,建议是2的倍数,默认为12条|*|否 +`categoryId`|分类id|Function|否 +`storeId`|卖家id,搜索店铺商品的时候使用|String|否 \ No newline at end of file diff --git a/components/m-goods-recommend/index.vue b/components/m-goods-recommend/index.vue new file mode 100644 index 00000000..dbd58158 --- /dev/null +++ b/components/m-goods-recommend/index.vue @@ -0,0 +1,152 @@ + + + + + \ No newline at end of file diff --git a/components/m-search-revision/m-search-revision.vue b/components/m-search-revision/m-search-revision.vue new file mode 100644 index 00000000..43184719 --- /dev/null +++ b/components/m-search-revision/m-search-revision.vue @@ -0,0 +1,246 @@ + + + + + diff --git a/components/m-share/index.vue b/components/m-share/index.vue new file mode 100644 index 00000000..449ea4ba --- /dev/null +++ b/components/m-share/index.vue @@ -0,0 +1,179 @@ + + + \ No newline at end of file diff --git a/components/m-share/mp-share.scss b/components/m-share/mp-share.scss new file mode 100644 index 00000000..44e02a90 --- /dev/null +++ b/components/m-share/mp-share.scss @@ -0,0 +1,8 @@ +.share-btn { + background: none; + font-size: 24rpx; + color: #666; + display: flex; + flex-direction: column; + align-items: center; +} diff --git a/components/popups/popups.vue b/components/popups/popups.vue new file mode 100644 index 00000000..a9ae5934 --- /dev/null +++ b/components/popups/popups.vue @@ -0,0 +1,343 @@ + + + + + diff --git a/components/uni-load-more/uni-load-more.vue b/components/uni-load-more/uni-load-more.vue new file mode 100644 index 00000000..9e4db2db --- /dev/null +++ b/components/uni-load-more/uni-load-more.vue @@ -0,0 +1,200 @@ + + + + + diff --git a/components/verification/animation.css b/components/verification/animation.css new file mode 100644 index 00000000..931bb513 --- /dev/null +++ b/components/verification/animation.css @@ -0,0 +1,184 @@ +/* + Animation 微动画 + 基于ColorUI组建库的动画模块 by 文晓港 2019年3月26日19:52:28 + */ + +/* css 滤镜 控制黑白底色gif的 */ +.gif-black{ + mix-blend-mode: screen; +} +.gif-white{ + mix-blend-mode: multiply; +} + + +/* Animation css */ +[class*=animation-] { + animation-duration: .5s; + animation-timing-function: ease-out; + animation-fill-mode: both +} + +.animation-fade { + animation-name: fade; + animation-duration: .8s; + animation-timing-function: linear +} + +.animation-scale-up { + animation-name: scale-up +} + +.animation-scale-down { + animation-name: scale-down +} + +.animation-slide-top { + animation-name: slide-top +} + +.animation-slide-bottom { + animation-name: slide-bottom +} + +.animation-slide-left { + animation-name: slide-left +} + +.animation-slide-right { + animation-name: slide-right +} + +.animation-shake { + animation-name: shake +} + +.animation-reverse { + animation-direction: reverse +} + +@keyframes fade { + 0% { + opacity: 0 + } + + 100% { + opacity: 1 + } +} + +@keyframes scale-up { + 0% { + opacity: 0; + transform: scale(.2) + } + + 100% { + opacity: 1; + transform: scale(1) + } +} + +@keyframes scale-down { + 0% { + opacity: 0; + transform: scale(1.8) + } + + 100% { + opacity: 1; + transform: scale(1) + } +} + +@keyframes slide-top { + 0% { + opacity: 0; + transform: translateY(-100%) + } + + 100% { + opacity: 1; + transform: translateY(0) + } +} + +@keyframes slide-bottom { + 0% { + opacity: 0; + transform: translateY(100%) + } + + 100% { + opacity: 1; + transform: translateY(0) + } +} + +@keyframes shake { + + 0%, + 100% { + transform: translateX(0) + } + + 10% { + transform: translateX(-9px) + } + + 20% { + transform: translateX(8px) + } + + 30% { + transform: translateX(-7px) + } + + 40% { + transform: translateX(6px) + } + + 50% { + transform: translateX(-5px) + } + + 60% { + transform: translateX(4px) + } + + 70% { + transform: translateX(-3px) + } + + 80% { + transform: translateX(2px) + } + + 90% { + transform: translateX(-1px) + } +} + +@keyframes slide-left { + 0% { + opacity: 0; + transform: translateX(-100%) + } + + 100% { + opacity: 1; + transform: translateX(0) + } +} + +@keyframes slide-right { + 0% { + opacity: 0; + transform: translateX(100%) + } + + 100% { + opacity: 1; + transform: translateX(0) + } +} \ No newline at end of file diff --git a/components/verification/icon.css b/components/verification/icon.css new file mode 100644 index 00000000..a2eedf5b --- /dev/null +++ b/components/verification/icon.css @@ -0,0 +1,1226 @@ +@keyframes cuIcon-spin { + 0% { + -webkit-transform: rotate(0); + transform: rotate(0); + } + + 100% { + -webkit-transform: rotate(359deg); + transform: rotate(359deg); + } +} + +.cuIconfont-spin { + -webkit-animation: cuIcon-spin 2s infinite linear; + animation: cuIcon-spin 2s infinite linear; + display: inline-block; +} + +.cuIconfont-pulse { + -webkit-animation: cuIcon-spin 1s infinite steps(8); + animation: cuIcon-spin 1s infinite steps(8); + display: inline-block; +} + +[class*="cuIcon-"] { + font-family: "cuIcon"; + font-size: inherit; + font-style: normal; +} + +@font-face { + font-family: "cuIcon"; + src: url('//at.alicdn.com/t/font_533566_yfq2d9wdij.eot?t=1545239985831'); + /* IE9*/ + src: url('//at.alicdn.com/t/font_533566_yfq2d9wdij.eot?t=1545239985831#iefix') format('embedded-opentype'), + /* IE6-IE8 */ + url('data:application/x-font-woff;charset=utf-8;base64,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') format('woff'), + url('//at.alicdn.com/t/font_533566_yfq2d9wdij.ttf?t=1545239985831') format('truetype'), + /* chrome, firefox, opera, Safari, Android, iOS 4.2+*/ + url('//at.alicdn.com/t/font_533566_yfq2d9wdij.svg?t=1545239985831#cuIconfont') format('svg'); + /* iOS 4.1- */ +} + +.cuIcon-appreciate:before { + content: "\e644"; +} + +.cuIcon-check:before { + content: "\e645"; +} + +.cuIcon-close:before { + content: "\e646"; +} + +.cuIcon-edit:before { + content: "\e649"; +} + +.cuIcon-emoji:before { + content: "\e64a"; +} + +.cuIcon-favorfill:before { + content: "\e64b"; +} + +.cuIcon-favor:before { + content: "\e64c"; +} + +.cuIcon-loading:before { + content: "\e64f"; +} + +.cuIcon-locationfill:before { + content: "\e650"; +} + +.cuIcon-location:before { + content: "\e651"; +} + +.cuIcon-phone:before { + content: "\e652"; +} + +.cuIcon-roundcheckfill:before { + content: "\e656"; +} + +.cuIcon-roundcheck:before { + content: "\e657"; +} + +.cuIcon-roundclosefill:before { + content: "\e658"; +} + +.cuIcon-roundclose:before { + content: "\e659"; +} + +.cuIcon-roundrightfill:before { + content: "\e65a"; +} + +.cuIcon-roundright:before { + content: "\e65b"; +} + +.cuIcon-search:before { + content: "\e65c"; +} + +.cuIcon-taxi:before { + content: "\e65d"; +} + +.cuIcon-timefill:before { + content: "\e65e"; +} + +.cuIcon-time:before { + content: "\e65f"; +} + +.cuIcon-unfold:before { + content: "\e661"; +} + +.cuIcon-warnfill:before { + content: "\e662"; +} + +.cuIcon-warn:before { + content: "\e663"; +} + +.cuIcon-camerafill:before { + content: "\e664"; +} + +.cuIcon-camera:before { + content: "\e665"; +} + +.cuIcon-commentfill:before { + content: "\e666"; +} + +.cuIcon-comment:before { + content: "\e667"; +} + +.cuIcon-likefill:before { + content: "\e668"; +} + +.cuIcon-like:before { + content: "\e669"; +} + +.cuIcon-notificationfill:before { + content: "\e66a"; +} + +.cuIcon-notification:before { + content: "\e66b"; +} + +.cuIcon-order:before { + content: "\e66c"; +} + +.cuIcon-samefill:before { + content: "\e66d"; +} + +.cuIcon-same:before { + content: "\e66e"; +} + +.cuIcon-deliver:before { + content: "\e671"; +} + +.cuIcon-evaluate:before { + content: "\e672"; +} + +.cuIcon-pay:before { + content: "\e673"; +} + +.cuIcon-send:before { + content: "\e675"; +} + +.cuIcon-store:before { + content: "\e676"; +} + +.cuIcon-ticket:before { + content: "\e677"; +} + +.cuIcon-back:before { + content: "\e679"; +} + +.cuIcon-cascades:before { + content: "\e67c"; +} + +.cuIcon-discover:before { + content: "\e67e"; +} + +.cuIcon-list:before { + content: "\e682"; +} + +.cuIcon-more:before { + content: "\e684"; +} + +.cuIcon-scan:before { + content: "\e689"; +} + +.cuIcon-settings:before { + content: "\e68a"; +} + +.cuIcon-questionfill:before { + content: "\e690"; +} + +.cuIcon-question:before { + content: "\e691"; +} + +.cuIcon-storefill:before { + content: "\e697"; +} + +.cuIcon-form:before { + content: "\e699"; +} + +.cuIcon-pic:before { + content: "\e69b"; +} + +.cuIcon-filter:before { + content: "\e69c"; +} + +.cuIcon-footprint:before { + content: "\e69d"; +} + +.cuIcon-top:before { + content: "\e69e"; +} + +.cuIcon-pulldown:before { + content: "\e69f"; +} + +.cuIcon-pullup:before { + content: "\e6a0"; +} + +.cuIcon-right:before { + content: "\e6a3"; +} + +.cuIcon-refresh:before { + content: "\e6a4"; +} + +.cuIcon-moreandroid:before { + content: "\e6a5"; +} + +.cuIcon-deletefill:before { + content: "\e6a6"; +} + +.cuIcon-refund:before { + content: "\e6ac"; +} + +.cuIcon-cart:before { + content: "\e6af"; +} + +.cuIcon-qrcode:before { + content: "\e6b0"; +} + +.cuIcon-remind:before { + content: "\e6b2"; +} + +.cuIcon-delete:before { + content: "\e6b4"; +} + +.cuIcon-profile:before { + content: "\e6b7"; +} + +.cuIcon-home:before { + content: "\e6b8"; +} + +.cuIcon-cartfill:before { + content: "\e6b9"; +} + +.cuIcon-discoverfill:before { + content: "\e6ba"; +} + +.cuIcon-homefill:before { + content: "\e6bb"; +} + +.cuIcon-message:before { + content: "\e6bc"; +} + +.cuIcon-addressbook:before { + content: "\e6bd"; +} + +.cuIcon-link:before { + content: "\e6bf"; +} + +.cuIcon-lock:before { + content: "\e6c0"; +} + +.cuIcon-unlock:before { + content: "\e6c2"; +} + +.cuIcon-vip:before { + content: "\e6c3"; +} + +.cuIcon-weibo:before { + content: "\e6c4"; +} + +.cuIcon-activity:before { + content: "\e6c5"; +} + +.cuIcon-friendaddfill:before { + content: "\e6c9"; +} + +.cuIcon-friendadd:before { + content: "\e6ca"; +} + +.cuIcon-friendfamous:before { + content: "\e6cb"; +} + +.cuIcon-friend:before { + content: "\e6cc"; +} + +.cuIcon-goods:before { + content: "\e6cd"; +} + +.cuIcon-selection:before { + content: "\e6ce"; +} + +.cuIcon-explore:before { + content: "\e6d2"; +} + +.cuIcon-present:before { + content: "\e6d3"; +} + +.cuIcon-squarecheckfill:before { + content: "\e6d4"; +} + +.cuIcon-square:before { + content: "\e6d5"; +} + +.cuIcon-squarecheck:before { + content: "\e6d6"; +} + +.cuIcon-round:before { + content: "\e6d7"; +} + +.cuIcon-roundaddfill:before { + content: "\e6d8"; +} + +.cuIcon-roundadd:before { + content: "\e6d9"; +} + +.cuIcon-add:before { + content: "\e6da"; +} + +.cuIcon-notificationforbidfill:before { + content: "\e6db"; +} + +.cuIcon-explorefill:before { + content: "\e6dd"; +} + +.cuIcon-fold:before { + content: "\e6de"; +} + +.cuIcon-game:before { + content: "\e6df"; +} + +.cuIcon-redpacket:before { + content: "\e6e0"; +} + +.cuIcon-selectionfill:before { + content: "\e6e1"; +} + +.cuIcon-similar:before { + content: "\e6e2"; +} + +.cuIcon-appreciatefill:before { + content: "\e6e3"; +} + +.cuIcon-infofill:before { + content: "\e6e4"; +} + +.cuIcon-info:before { + content: "\e6e5"; +} + +.cuIcon-forwardfill:before { + content: "\e6ea"; +} + +.cuIcon-forward:before { + content: "\e6eb"; +} + +.cuIcon-rechargefill:before { + content: "\e6ec"; +} + +.cuIcon-recharge:before { + content: "\e6ed"; +} + +.cuIcon-vipcard:before { + content: "\e6ee"; +} + +.cuIcon-voice:before { + content: "\e6ef"; +} + +.cuIcon-voicefill:before { + content: "\e6f0"; +} + +.cuIcon-friendfavor:before { + content: "\e6f1"; +} + +.cuIcon-wifi:before { + content: "\e6f2"; +} + +.cuIcon-share:before { + content: "\e6f3"; +} + +.cuIcon-wefill:before { + content: "\e6f4"; +} + +.cuIcon-we:before { + content: "\e6f5"; +} + +.cuIcon-lightauto:before { + content: "\e6f6"; +} + +.cuIcon-lightforbid:before { + content: "\e6f7"; +} + +.cuIcon-lightfill:before { + content: "\e6f8"; +} + +.cuIcon-camerarotate:before { + content: "\e6f9"; +} + +.cuIcon-light:before { + content: "\e6fa"; +} + +.cuIcon-barcode:before { + content: "\e6fb"; +} + +.cuIcon-flashlightclose:before { + content: "\e6fc"; +} + +.cuIcon-flashlightopen:before { + content: "\e6fd"; +} + +.cuIcon-searchlist:before { + content: "\e6fe"; +} + +.cuIcon-service:before { + content: "\e6ff"; +} + +.cuIcon-sort:before { + content: "\e700"; +} + +.cuIcon-down:before { + content: "\e703"; +} + +.cuIcon-mobile:before { + content: "\e704"; +} + +.cuIcon-mobilefill:before { + content: "\e705"; +} + +.cuIcon-copy:before { + content: "\e706"; +} + +.cuIcon-countdownfill:before { + content: "\e707"; +} + +.cuIcon-countdown:before { + content: "\e708"; +} + +.cuIcon-noticefill:before { + content: "\e709"; +} + +.cuIcon-notice:before { + content: "\e70a"; +} + +.cuIcon-upstagefill:before { + content: "\e70e"; +} + +.cuIcon-upstage:before { + content: "\e70f"; +} + +.cuIcon-babyfill:before { + content: "\e710"; +} + +.cuIcon-baby:before { + content: "\e711"; +} + +.cuIcon-brandfill:before { + content: "\e712"; +} + +.cuIcon-brand:before { + content: "\e713"; +} + +.cuIcon-choicenessfill:before { + content: "\e714"; +} + +.cuIcon-choiceness:before { + content: "\e715"; +} + +.cuIcon-clothesfill:before { + content: "\e716"; +} + +.cuIcon-clothes:before { + content: "\e717"; +} + +.cuIcon-creativefill:before { + content: "\e718"; +} + +.cuIcon-creative:before { + content: "\e719"; +} + +.cuIcon-female:before { + content: "\e71a"; +} + +.cuIcon-keyboard:before { + content: "\e71b"; +} + +.cuIcon-male:before { + content: "\e71c"; +} + +.cuIcon-newfill:before { + content: "\e71d"; +} + +.cuIcon-new:before { + content: "\e71e"; +} + +.cuIcon-pullleft:before { + content: "\e71f"; +} + +.cuIcon-pullright:before { + content: "\e720"; +} + +.cuIcon-rankfill:before { + content: "\e721"; +} + +.cuIcon-rank:before { + content: "\e722"; +} + +.cuIcon-bad:before { + content: "\e723"; +} + +.cuIcon-cameraadd:before { + content: "\e724"; +} + +.cuIcon-focus:before { + content: "\e725"; +} + +.cuIcon-friendfill:before { + content: "\e726"; +} + +.cuIcon-cameraaddfill:before { + content: "\e727"; +} + +.cuIcon-apps:before { + content: "\e729"; +} + +.cuIcon-paintfill:before { + content: "\e72a"; +} + +.cuIcon-paint:before { + content: "\e72b"; +} + +.cuIcon-picfill:before { + content: "\e72c"; +} + +.cuIcon-refresharrow:before { + content: "\e72d"; +} + +.cuIcon-colorlens:before { + content: "\e6e6"; +} + +.cuIcon-markfill:before { + content: "\e730"; +} + +.cuIcon-mark:before { + content: "\e731"; +} + +.cuIcon-presentfill:before { + content: "\e732"; +} + +.cuIcon-repeal:before { + content: "\e733"; +} + +.cuIcon-album:before { + content: "\e734"; +} + +.cuIcon-peoplefill:before { + content: "\e735"; +} + +.cuIcon-people:before { + content: "\e736"; +} + +.cuIcon-servicefill:before { + content: "\e737"; +} + +.cuIcon-repair:before { + content: "\e738"; +} + +.cuIcon-file:before { + content: "\e739"; +} + +.cuIcon-repairfill:before { + content: "\e73a"; +} + +.cuIcon-taoxiaopu:before { + content: "\e73b"; +} + +.cuIcon-weixin:before { + content: "\e612"; +} + +.cuIcon-attentionfill:before { + content: "\e73c"; +} + +.cuIcon-attention:before { + content: "\e73d"; +} + +.cuIcon-commandfill:before { + content: "\e73e"; +} + +.cuIcon-command:before { + content: "\e73f"; +} + +.cuIcon-communityfill:before { + content: "\e740"; +} + +.cuIcon-community:before { + content: "\e741"; +} + +.cuIcon-read:before { + content: "\e742"; +} + +.cuIcon-calendar:before { + content: "\e74a"; +} + +.cuIcon-cut:before { + content: "\e74b"; +} + +.cuIcon-magic:before { + content: "\e74c"; +} + +.cuIcon-backwardfill:before { + content: "\e74d"; +} + +.cuIcon-playfill:before { + content: "\e74f"; +} + +.cuIcon-stop:before { + content: "\e750"; +} + +.cuIcon-tagfill:before { + content: "\e751"; +} + +.cuIcon-tag:before { + content: "\e752"; +} + +.cuIcon-group:before { + content: "\e753"; +} + +.cuIcon-all:before { + content: "\e755"; +} + +.cuIcon-backdelete:before { + content: "\e756"; +} + +.cuIcon-hotfill:before { + content: "\e757"; +} + +.cuIcon-hot:before { + content: "\e758"; +} + +.cuIcon-post:before { + content: "\e759"; +} + +.cuIcon-radiobox:before { + content: "\e75b"; +} + +.cuIcon-rounddown:before { + content: "\e75c"; +} + +.cuIcon-upload:before { + content: "\e75d"; +} + +.cuIcon-writefill:before { + content: "\e760"; +} + +.cuIcon-write:before { + content: "\e761"; +} + +.cuIcon-radioboxfill:before { + content: "\e763"; +} + +.cuIcon-punch:before { + content: "\e764"; +} + +.cuIcon-shake:before { + content: "\e765"; +} + +.cuIcon-move:before { + content: "\e768"; +} + +.cuIcon-safe:before { + content: "\e769"; +} + +.cuIcon-activityfill:before { + content: "\e775"; +} + +.cuIcon-crownfill:before { + content: "\e776"; +} + +.cuIcon-crown:before { + content: "\e777"; +} + +.cuIcon-goodsfill:before { + content: "\e778"; +} + +.cuIcon-messagefill:before { + content: "\e779"; +} + +.cuIcon-profilefill:before { + content: "\e77a"; +} + +.cuIcon-sound:before { + content: "\e77b"; +} + +.cuIcon-sponsorfill:before { + content: "\e77c"; +} + +.cuIcon-sponsor:before { + content: "\e77d"; +} + +.cuIcon-upblock:before { + content: "\e77e"; +} + +.cuIcon-weblock:before { + content: "\e77f"; +} + +.cuIcon-weunblock:before { + content: "\e780"; +} + +.cuIcon-my:before { + content: "\e78b"; +} + +.cuIcon-myfill:before { + content: "\e78c"; +} + +.cuIcon-emojifill:before { + content: "\e78d"; +} + +.cuIcon-emojiflashfill:before { + content: "\e78e"; +} + +.cuIcon-flashbuyfill:before { + content: "\e78f"; +} + +.cuIcon-text:before { + content: "\e791"; +} + +.cuIcon-goodsfavor:before { + content: "\e794"; +} + +.cuIcon-musicfill:before { + content: "\e795"; +} + +.cuIcon-musicforbidfill:before { + content: "\e796"; +} + +.cuIcon-card:before { + content: "\e624"; +} + +.cuIcon-triangledownfill:before { + content: "\e79b"; +} + +.cuIcon-triangleupfill:before { + content: "\e79c"; +} + +.cuIcon-roundleftfill-copy:before { + content: "\e79e"; +} + +.cuIcon-font:before { + content: "\e76a"; +} + +.cuIcon-title:before { + content: "\e82f"; +} + +.cuIcon-recordfill:before { + content: "\e7a4"; +} + +.cuIcon-record:before { + content: "\e7a6"; +} + +.cuIcon-cardboardfill:before { + content: "\e7a9"; +} + +.cuIcon-cardboard:before { + content: "\e7aa"; +} + +.cuIcon-formfill:before { + content: "\e7ab"; +} + +.cuIcon-coin:before { + content: "\e7ac"; +} + +.cuIcon-cardboardforbid:before { + content: "\e7af"; +} + +.cuIcon-circlefill:before { + content: "\e7b0"; +} + +.cuIcon-circle:before { + content: "\e7b1"; +} + +.cuIcon-attentionforbid:before { + content: "\e7b2"; +} + +.cuIcon-attentionforbidfill:before { + content: "\e7b3"; +} + +.cuIcon-attentionfavorfill:before { + content: "\e7b4"; +} + +.cuIcon-attentionfavor:before { + content: "\e7b5"; +} + +.cuIcon-titles:before { + content: "\e701"; +} + +.cuIcon-icloading:before { + content: "\e67a"; +} + +.cuIcon-full:before { + content: "\e7bc"; +} + +.cuIcon-mail:before { + content: "\e7bd"; +} + +.cuIcon-peoplelist:before { + content: "\e7be"; +} + +.cuIcon-goodsnewfill:before { + content: "\e7bf"; +} + +.cuIcon-goodsnew:before { + content: "\e7c0"; +} + +.cuIcon-medalfill:before { + content: "\e7c1"; +} + +.cuIcon-medal:before { + content: "\e7c2"; +} + +.cuIcon-newsfill:before { + content: "\e7c3"; +} + +.cuIcon-newshotfill:before { + content: "\e7c4"; +} + +.cuIcon-newshot:before { + content: "\e7c5"; +} + +.cuIcon-news:before { + content: "\e7c6"; +} + +.cuIcon-videofill:before { + content: "\e7c7"; +} + +.cuIcon-video:before { + content: "\e7c8"; +} + +.cuIcon-exit:before { + content: "\e7cb"; +} + +.cuIcon-skinfill:before { + content: "\e7cc"; +} + +.cuIcon-skin:before { + content: "\e7cd"; +} + +.cuIcon-moneybagfill:before { + content: "\e7ce"; +} + +.cuIcon-usefullfill:before { + content: "\e7cf"; +} + +.cuIcon-usefull:before { + content: "\e7d0"; +} + +.cuIcon-moneybag:before { + content: "\e7d1"; +} + +.cuIcon-redpacket_fill:before { + content: "\e7d3"; +} + +.cuIcon-subscription:before { + content: "\e7d4"; +} + +.cuIcon-loading1:before { + content: "\e633"; +} + +.cuIcon-github:before { + content: "\e692"; +} + +.cuIcon-global:before { + content: "\e7eb"; +} + +.cuIcon-settingsfill:before { + content: "\e6ab"; +} + +.cuIcon-back_android:before { + content: "\e7ed"; +} + +.cuIcon-expressman:before { + content: "\e7ef"; +} + +.cuIcon-evaluate_fill:before { + content: "\e7f0"; +} + +.cuIcon-group_fill:before { + content: "\e7f5"; +} + +.cuIcon-play_forward_fill:before { + content: "\e7f6"; +} + +.cuIcon-deliver_fill:before { + content: "\e7f7"; +} + +.cuIcon-notice_forbid_fill:before { + content: "\e7f8"; +} + +.cuIcon-fork:before { + content: "\e60c"; +} + +.cuIcon-pick:before { + content: "\e7fa"; +} + +.cuIcon-wenzi:before { + content: "\e6a7"; +} + +.cuIcon-ellipse:before { + content: "\e600"; +} + +.cuIcon-qr_code:before { + content: "\e61b"; +} + +.cuIcon-dianhua:before { + content: "\e64d"; +} + +.cuIcon-cuIcon:before { + content: "\e602"; +} + +.cuIcon-loading2:before { + content: "\e7f1"; +} + +.cuIcon-btn:before { + content: "\e601"; +} diff --git a/components/verification/verification.vue b/components/verification/verification.vue new file mode 100644 index 00000000..f015c47c --- /dev/null +++ b/components/verification/verification.vue @@ -0,0 +1,531 @@ + + + + + diff --git a/components/verify-code/verify-code.vue b/components/verify-code/verify-code.vue new file mode 100644 index 00000000..2d873aad --- /dev/null +++ b/components/verify-code/verify-code.vue @@ -0,0 +1,278 @@ + + + diff --git a/components/vlog/videoComp.vue b/components/vlog/videoComp.vue new file mode 100755 index 00000000..bddc67f4 --- /dev/null +++ b/components/vlog/videoComp.vue @@ -0,0 +1,713 @@ + + + + + \ No newline at end of file diff --git a/components/vlog/videoDetail.vue b/components/vlog/videoDetail.vue new file mode 100755 index 00000000..67873a7e --- /dev/null +++ b/components/vlog/videoDetail.vue @@ -0,0 +1,714 @@ + + + + + diff --git a/components/vlog/videoFollowComp.vue b/components/vlog/videoFollowComp.vue new file mode 100755 index 00000000..43baf6df --- /dev/null +++ b/components/vlog/videoFollowComp.vue @@ -0,0 +1,776 @@ + + + + + + + diff --git a/config/api.js b/config/api.js new file mode 100644 index 00000000..b318692f --- /dev/null +++ b/config/api.js @@ -0,0 +1,41 @@ +/** + * base : 基础业务API + * buyer : 买家API + */ +// 开发环境 +const dev = { + // common: "https://common-api.pickmall.cn", + // buyer: "https://buyer-api.pickmall.cn", + + common: "http://192.168.1.200:8890", + buyer: "http://192.168.1.200:8888", + vlog: "http://192.168.1.86:8099" + +}; +// 生产环境 +const prod = { + // common: "https://common-api.pickmall.cn", + // buyer: "https://buyer-api.pickmall.cn", + common: "http://192.168.1.200:8890", + buyer: "http://192.168.1.200:8888", + vlog: "http://192.168.1.86:8099" +}; + +//默认生产环境 +let api = dev; +//如果是开发环境 +if (process.env.NODE_ENV == "development") { + api = dev; +} else { + api = prod; +} +//微信小程序,app的打包方式建议为生产环境,所以这块直接条件编译赋值 +// #ifdef MP-WEIXIN || APP-PLUS +api = prod; +// #endif + +api.buyer += "/buyer"; +api.common += "/common"; +export default { + ...api, +}; \ No newline at end of file diff --git a/config/config.js b/config/config.js new file mode 100644 index 00000000..48013e54 --- /dev/null +++ b/config/config.js @@ -0,0 +1,16 @@ +const name = "lilishop"; //全局商城name +const schemeName = 'lilishop' //唤醒app需要的schemeName +export default { + name: name, + schemeLink: `${schemeName}://`, //唤起app地址 + downloadLink: "https://pickmall.cn/download-page/index.html", //下载地址,下载app的地址 + shareLink: "https://m-b2b2c.pickmall.cn", //分享地址,也就是在h5中默认的复制地址 + appid: "wx6f10f29075dc1b0b", //小程序唯一凭证,即 AppID,可在「微信公众平台 - 设置 - 开发设置」页中获得。(需要已经成为开发者,且帐号没有异常状态) + appSecret: "6dfbe0c72380dce5d49d65b3c91059b1", //可在 manifest.json 查看 + aMapKey: "d649892b3937a5ad20b76dacb2bcb5bd", //在高德中申请web端key + scanAuthNavigation:['https://m-b2b2c.pickmall.cn/'], //扫码认证跳转域名配置 会根据此处配置的路由进行跳转 + iosAppId:"id1564638363", //AppStore的应用地址id 具体在分享->拷贝链接中查看 + logo:"https://lilishop-oss.oss-cn-beijing.aliyuncs.com/4c864e133c2944efad1f7282ac8a3b9e.png", //logo地址 + customerServiceMobile:"13161366885", //客服电话 + customerServiceEmail:"lili@lili.com" //客服邮箱 +}; diff --git a/hybrid/html/advertise/advertise.html b/hybrid/html/advertise/advertise.html new file mode 100644 index 00000000..68bcff80 --- /dev/null +++ b/hybrid/html/advertise/advertise.html @@ -0,0 +1,123 @@ + + + + + + 广告启动页 + + + + + +
+
+ +
+
+
跳过
+
+
+
+
+
+
+
+
+
+
+ + + diff --git a/hybrid/html/css/advertise.css b/hybrid/html/css/advertise.css new file mode 100644 index 00000000..9654a8b7 --- /dev/null +++ b/hybrid/html/css/advertise.css @@ -0,0 +1,149 @@ +* { + margin: 0; + padding: 0; +} + +html, +body { + width: 100%; + height: 100%; +} + +.content { + width: 100%; + height: 100%; +} + +.content .con { + width: 100%; + height: 100%; + font-size: 0; + display: flex; + align-items: center; +} + +#img { + width: 100%; + height: 100%; +} + +#timer { + display: inline-block; + position: fixed; + top: 40px; + right: 10px; +} + +#info { + position: absolute; + top: 0; + left: 0; + width: 36px; + height: 36px; + line-height: 36px; + border-radius: 50%; + background-color: rgba(0, 0, 0, 0.3); + text-align: center; + color: #FFFFFF; + font-size: 12px; +} + +.circleProgress_wrapper { + width: 36px; + height: 36px; + position: relative; +} + +.wrapper { + width: 18px; + height: 36px; + position: absolute; + top: 0; + overflow: hidden; +} + +.right { + right: 0; +} + +.left { + left: 0; +} + +.circleProgress { + width: 32px; + height: 32px; + border: 2px solid #FFFFFF; + border-radius: 50%; + position: absolute; + top: 0; + -webkit-transform: rotate(45deg); +} + +.rightcircle { + border-top: 2px solid #03A9F4; + border-right: 2px solid #03A9F4; + right: 0; + -webkit-animation: circleProgressLoad_right 4s linear; + /*动画停留在最后一帧*/ + animation-fill-mode: forwards; + -moz-animation-fill-mode: forwards; + -webkit-animation-fill-mode: forwards; + -o-animation-fill-mode: forwards; +} + +.leftcircle { + border-bottom: 2px solid #03A9F4; + border-left: 2px solid #03A9F4; + left: 0; + -webkit-animation: circleProgressLoad_left 4s linear; + /*动画停留在最后一帧*/ + animation-fill-mode: forwards; + -moz-animation-fill-mode: forwards; + -webkit-animation-fill-mode: forwards; + -o-animation-fill-mode: forwards; +} + +@-webkit-keyframes circleProgressLoad_right { + 0% { + border-top: 2px solid #03A9F4; + border-right: 2px solid #03A9F4; + -webkit-transform: rotate(45deg); + } + + 50% { + border-top: 2px solid #03A9F4; + border-right: 2px solid #03A9F4; + border-left: 2px solid #FFFFFF; + border-bottom: 2px solid #FFFFFF; + -webkit-transform: rotate(225deg); + } + + 100% { + border-left: 2px solid #FFFFFF; + border-bottom: 2px solid #FFFFFF; + -webkit-transform: rotate(225deg); + } +} + +@-webkit-keyframes circleProgressLoad_left { + 0% { + border-bottom: 2px solid #03A9F4; + border-left: 2px solid #03A9F4; + -webkit-transform: rotate(45deg); + } + + 50% { + border-bottom: 2px solid #03A9F4; + border-left: 2px solid #03A9F4; + border-top: 2px solid #FFFFFF; + border-right: 2px solid #FFFFFF; + -webkit-transform: rotate(45deg); + } + + 100% { + border-top: 2px solid #FFFFFF; + border-right: 2px solid #FFFFFF; + -webkit-transform: rotate(225deg); + } +} diff --git a/hybrid/html/error.html b/hybrid/html/error.html new file mode 100644 index 00000000..650a72b2 --- /dev/null +++ b/hybrid/html/error.html @@ -0,0 +1,94 @@ + + + + + + 服务器异常 + + + + + + +
+
服务器异常
+ + + +
+ + + diff --git a/hybrid/html/imgs/domain.jpeg b/hybrid/html/imgs/domain.jpeg new file mode 100644 index 00000000..e084eb97 Binary files /dev/null and b/hybrid/html/imgs/domain.jpeg differ diff --git a/hybrid/html/js/webView.js b/hybrid/html/js/webView.js new file mode 100644 index 00000000..b0c84451 --- /dev/null +++ b/hybrid/html/js/webView.js @@ -0,0 +1 @@ +!function(e,n){"object"==typeof exports&&"undefined"!=typeof module?module.exports=n():"function"==typeof define&&define.amd?define(n):(e=e||self).uni=n()}(this,(function(){"use strict";try{var e={};Object.defineProperty(e,"passive",{get:function(){!0}}),window.addEventListener("test-passive",null,e)}catch(e){}var n=Object.prototype.hasOwnProperty;function t(e,t){return n.call(e,t)}var i=[],a=function(e,n){var t={options:{timestamp:+new Date},name:e,arg:n};if(window.__dcloud_weex_postMessage||window.__dcloud_weex_){if("postMessage"===e){var a={data:[n]};return window.__dcloud_weex_postMessage?window.__dcloud_weex_postMessage(a):window.__dcloud_weex_.postMessage(JSON.stringify(a))}var o={type:"WEB_INVOKE_APPSERVICE",args:{data:t,webviewIds:i}};window.__dcloud_weex_postMessage?window.__dcloud_weex_postMessageToService(o):window.__dcloud_weex_.postMessageToService(JSON.stringify(o))}if(!window.plus)return window.parent.postMessage({type:"WEB_INVOKE_APPSERVICE",data:t,pageId:""},"*");if(0===i.length){var r=plus.webview.currentWebview();if(!r)throw new Error("plus.webview.currentWebview() is undefined");var d=r.parent(),s="";s=d?d.id:r.id,i.push(s)}if(plus.webview.getWebviewById("__uniapp__service"))plus.webview.postMessageToUniNView({type:"WEB_INVOKE_APPSERVICE",args:{data:t,webviewIds:i}},"__uniapp__service");else{var w=JSON.stringify(t);plus.webview.getLaunchWebview().evalJS('UniPlusBridge.subscribeHandler("'.concat("WEB_INVOKE_APPSERVICE",'",').concat(w,",").concat(JSON.stringify(i),");"))}},o={navigateTo:function(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{},n=e.url;a("navigateTo",{url:encodeURI(n)})},navigateBack:function(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{},n=e.delta;a("navigateBack",{delta:parseInt(n)||1})},switchTab:function(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{},n=e.url;a("switchTab",{url:encodeURI(n)})},reLaunch:function(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{},n=e.url;a("reLaunch",{url:encodeURI(n)})},redirectTo:function(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{},n=e.url;a("redirectTo",{url:encodeURI(n)})},getEnv:function(e){window.plus?e({plus:!0}):e({h5:!0})},postMessage:function(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{};a("postMessage",e.data||{})}},r=/uni-app/i.test(navigator.userAgent),d=/Html5Plus/i.test(navigator.userAgent),s=/complete|loaded|interactive/;var w=window.my&&navigator.userAgent.indexOf("AlipayClient")>-1;var u=window.swan&&window.swan.webView&&/swan/i.test(navigator.userAgent);var c=window.qq&&window.qq.miniProgram&&/QQ/i.test(navigator.userAgent)&&/miniProgram/i.test(navigator.userAgent);var g=window.tt&&window.tt.miniProgram&&/toutiaomicroapp/i.test(navigator.userAgent);var v=window.wx&&window.wx.miniProgram&&/micromessenger/i.test(navigator.userAgent)&&/miniProgram/i.test(navigator.userAgent);var p=window.qa&&/quickapp/i.test(navigator.userAgent);for(var l,_=function(){window.UniAppJSBridge=!0,document.dispatchEvent(new CustomEvent("UniAppJSBridgeReady",{bubbles:!0,cancelable:!0}))},f=[function(e){if(r||d)return window.__dcloud_weex_postMessage||window.__dcloud_weex_?document.addEventListener("DOMContentLoaded",e):window.plus&&s.test(document.readyState)?setTimeout(e,0):document.addEventListener("plusready",e),o},function(e){if(v)return window.WeixinJSBridge&&window.WeixinJSBridge.invoke?setTimeout(e,0):document.addEventListener("WeixinJSBridgeReady",e),window.wx.miniProgram},function(e){if(c)return window.QQJSBridge&&window.QQJSBridge.invoke?setTimeout(e,0):document.addEventListener("QQJSBridgeReady",e),window.qq.miniProgram},function(e){if(w){document.addEventListener("DOMContentLoaded",e);var n=window.my;return{navigateTo:n.navigateTo,navigateBack:n.navigateBack,switchTab:n.switchTab,reLaunch:n.reLaunch,redirectTo:n.redirectTo,postMessage:n.postMessage,getEnv:n.getEnv}}},function(e){if(u)return document.addEventListener("DOMContentLoaded",e),window.swan.webView},function(e){if(g)return document.addEventListener("DOMContentLoaded",e),window.tt.miniProgram},function(e){if(p){window.QaJSBridge&&window.QaJSBridge.invoke?setTimeout(e,0):document.addEventListener("QaJSBridgeReady",e);var n=window.qa;return{navigateTo:n.navigateTo,navigateBack:n.navigateBack,switchTab:n.switchTab,reLaunch:n.reLaunch,redirectTo:n.redirectTo,postMessage:n.postMessage,getEnv:n.getEnv}}},function(e){return document.addEventListener("DOMContentLoaded",e),o}],m=0;m { + // #ifndef H5 + uni.getClipboardData({ + success: ({ data }) => success(data), + fail + }) + // #endif + + // #ifdef H5 + try { + navigator.clipboard.readText().then(success).catch(fail) + } catch (error) { + fail(error) + } + // #endif + }) +} \ No newline at end of file diff --git a/js_sdk/lili-pay/wx-pay.js b/js_sdk/lili-pay/wx-pay.js new file mode 100644 index 00000000..5d292d16 --- /dev/null +++ b/js_sdk/lili-pay/wx-pay.js @@ -0,0 +1,116 @@ +/** + * 微信小程序支付 + * 此处针对于微信小程序开发的支付插件 + * 第一次支付成功后会跳出订阅的消息 如果用户拒绝或同意都会跳转到支付成功页面 + * 如果点击订阅 会将状态写进缓存 之后不再提醒。 + * + * @param {sn,price} + */ + +import { initiatePay } from "@/api/trade"; +import { getWeChatMpMessage } from "@/api/message.js"; +class LiLiWXPay { + constructor(...payList) { + this.data = payList[0]; + console.log(payList); + // 调用支付 + this.pay = () => { + uni.showLoading({ + title: "加载中", + }); + + let submitData = { + sn: this.data.sn, + orderType: this.data.orderType || "TRADE", + clientType: "WECHAT_MP", + }; + const paymentMethod = "WECHAT"; + const paymentClient = "MP"; + // 调用支付 + initiatePay(paymentMethod, paymentClient, submitData).then((res) => { + let response = res.data.result; + uni.hideLoading(); + uni.requestPayment({ + provider: "wxpay", + appid: response.appid, + timeStamp: response.timeStamp, + nonceStr: response.nonceStr, + package: response.package, + signType: response.signType, + paySign: response.paySign, + success: (e) => { + uni.showToast({ + icon: "none", + title: "支付成功!", + }); + sendMessage(payList[0].price); + }, + fail: (e) => { + this.exception = e; + // 支付异常或支付失败之后跳转到订单页面 + uni.showModal({ + content: "支付失败,如果您已支付,请勿反复支付", + showCancel: false, + success: () => { + uni.redirectTo({ + url: "/pages/order/myOrder?status=0", + }); + }, + }); + }, + }); + }); + }; + } +} + +function sendMessage(price) { + //判断用户是否已经进行了订阅 + if (!uni.getStorageSync("acceptSubscribeMessage")) { + //订阅消息 + getWeChatMpMessage().then((res) => { + var message = res.data.result; + var templateid = message.map((item) => item.code); + uni.requestSubscribeMessage({ + tmplIds: templateid, + success: (res) => { + for (let key in res) { + // 表示用户拒绝订阅该信息 + if (res[key] == "reject") { + this.checked = false; + } else { + uni.setStorageSync("acceptSubscribeMessage", res); + } + } + }, + fail: (res) => { + uni.removeStorageSync("acceptSubscribeMessage"); + this.checked = false; + }, + complete: () => { + /** + * 已经支付成功 + */ + uni.redirectTo({ + url: + "/pages/cart/payment/success?paymentMethod=WECHAT" + + "&payPrice=" + + price, + }); + }, + }); + }); + } else { + /** + * 已经支付成功 + */ + uni.redirectTo({ + url: + "/pages/cart/payment/success?paymentMethod=WECHAT" + + "&payPrice=" + + price, + }); + } +} + +export default LiLiWXPay; diff --git a/js_sdk/u-draw-poster/draw-poster.d.ts b/js_sdk/u-draw-poster/draw-poster.d.ts new file mode 100644 index 00000000..4b65874a --- /dev/null +++ b/js_sdk/u-draw-poster/draw-poster.d.ts @@ -0,0 +1,38 @@ +import { Canvas, DrawPosterCanvasCtx, CreateImagePathOptions, DrawPosterBuildOpts, DrawPosterUseOpts, drawPosterExtends, DrawPosterUseCtxOpts } from "./utils/interface"; +declare type DrawPosterInstanceType = InstanceType & drawPosterExtends; +declare class DrawPoster { + canvas: Canvas; + ctx: DrawPosterCanvasCtx; + canvasId: string; + loading: boolean; + debugging: boolean; + loadingText: string; + createText: string; + [key: string]: any; + private executeOnions; + private stopStatus; + private drawType; + /** 构建器, 构建返回当前实例, 并挂载多个方法 */ + constructor(canvas: Canvas, ctx: DrawPosterCanvasCtx, canvasId: string, loading: boolean, debugging: boolean, loadingText: string, createText: string, tips: boolean); + /** 提示器, 传入消息与数据 */ + private debuggingLog; + /** 传入挂载配置对象, 添加扩展方法 */ + static use: (opts: DrawPosterUseOpts) => void; + /** 传入挂载配置对象, 添加绘画扩展方法 */ + static useCtx: (opts: DrawPosterUseCtxOpts) => void; + /** 构建绘制海报矩形方法, 传入canvas选择器或配置对象, 返回绘制对象 */ + static build: (options: string | DrawPosterBuildOpts, tips?: boolean) => Promise; + /** 构建多个绘制海报矩形方法, 传入选择器或配置对象的数组, 返回多个绘制对象 */ + static buildAll: (optionsAll: (string | DrawPosterBuildOpts)[]) => Promise<{ + [key: string]: DrawPosterInstanceType; + }>; + /** 绘制器, 接收执行器函数, 添加到绘制容器中 */ + draw: (execute: (ctx: DrawPosterCanvasCtx) => Promise | void) => void; + /** 等待创建绘画, 成功后清空绘制器容器 */ + awaitCreate: () => Promise; + /** 创建canvas本地地址 @returns {string} 本地地址 */ + createImagePath: (baseOptions?: CreateImagePathOptions) => Promise; + /** 停止当前绘画, 调用则停止当前绘画堆栈的绘画 */ + stop: () => void; +} +export default DrawPoster; diff --git a/js_sdk/u-draw-poster/draw-poster.js b/js_sdk/u-draw-poster/draw-poster.js new file mode 100644 index 00000000..5da76cc1 --- /dev/null +++ b/js_sdk/u-draw-poster/draw-poster.js @@ -0,0 +1,194 @@ +import uni from "./utils/global"; +import { handleBuildOpts, extendMount } from "./utils/utils"; +import { getCanvas2dContext } from "./utils/wx-utils"; +// 扩展挂载储存 +let drawPosterExtend = {}; +let drawCtxPosterExtend = {}; +class DrawPoster { + /** 构建器, 构建返回当前实例, 并挂载多个方法 */ + constructor(canvas, ctx, canvasId, loading, debugging, loadingText, createText, tips) { + var _a; + this.canvas = canvas; + this.ctx = ctx; + + this.canvasId = canvasId; + this.loading = loading; + this.debugging = debugging; + this.loadingText = loadingText; + this.createText = createText; + this.executeOnions = []; + this.stopStatus = false; + /** 提示器, 传入消息与数据 */ + this.debuggingLog = (message, data, color = "#3489fd") => { + if (this.debugging) { + if (data) { + console.log(`%c${this.canvasId} -> ${message}`, `color: ${color}`, data); + } + else { + console.log(`%c${this.canvasId} -> ${message}`, `color: ${color}`); + } + } + }; + /** 绘制器, 接收执行器函数, 添加到绘制容器中 */ + this.draw = (execute) => { + const length = this.executeOnions.length; + this.executeOnions.push(async () => { + var _a, _b; + try { + this.ctx.save(); + await execute(this.ctx); + this.ctx.restore(); + return true; + } + catch (error) { + const isOutError = ((_b = (_a = error === null || error === void 0 ? void 0 : error.message) === null || _a === void 0 ? void 0 : _a.search) === null || _b === void 0 ? void 0 : _b.call(_a, `'nodeId' of undefined`)) >= 0; + !isOutError && console.error(`${this.canvasId} -> 绘画栈(${length}),绘制错误:`, error); + return false; + } + }); + }; + /** 等待创建绘画, 成功后清空绘制器容器 */ + this.awaitCreate = async () => { + this.debuggingLog('绘制海报中...'); + this.loading && uni.showLoading({ title: this.loadingText }); + const tips = []; + for (let i = 0; i < this.executeOnions.length; i++) { + const execute = this.executeOnions[i]; + tips.push(await execute()); + } + this.executeOnions = []; + this.debuggingLog('绘制状况', tips); + // 当前绘制为 type2 绘制 + if (this.drawType === 'type2d') { + this.loading && uni.hideLoading(); + + return tips; + } + // 当前绘制为 context 绘制 + return await new Promise((resolve) => { + this.ctx.draw(true, () => { + resolve(tips); + this.loading && uni.hideLoading(); + }); + }); + }; + /** 创建canvas本地地址 @returns {string} 本地地址 */ + this.createImagePath = async (baseOptions = {}) => { + const { canvas, canvasId, executeOnions, awaitCreate } = this; + executeOnions.length && await awaitCreate(); + // 如果当前为停止状态 + if (this.stopStatus) { + this.stopStatus = false; + return '---stop createImagePath---'; + } + this.loading && uni.showLoading({ title: this.createText }); + const options = Object.assign({}, baseOptions); + if (this.drawType === 'context') + options.canvasId = canvasId; + if (this.drawType === 'type2d') + options.canvas = canvas; + + console.log(options) + return new Promise((resolve, reject) => { + options.success = (res) => { + resolve(res.tempFilePath); + this.loading && uni.hideLoading(); + this.debuggingLog('绘制成功 🎉', res, '#19be6b'); + }; + options.fail = (err) => { + reject(err); + this.loading && uni.hideLoading(); + this.debuggingLog('绘制失败 🌟', err, '#fa3534'); + }; + uni.canvasToTempFilePath(options); + }); + }; + /** 停止当前绘画, 调用则停止当前绘画堆栈的绘画 */ + this.stop = () => { + this.executeOnions = []; + this.stopStatus = true; + }; + if (!canvas || !ctx || !canvasId) { + throw new Error("DrawPoster Error: Use DrawPoster.build(string | ops) to build drawPoster instance objects"); + } + // 判断当前绘制类型 + ctx.drawType = this.drawType = (ctx.draw) ? 'context' : 'type2d'; + // 挂载全局实例, 绘画扩展 + extendMount(this.ctx, drawCtxPosterExtend, (extend, target) => { + var _a; + (_a = target === null || target === void 0 ? void 0 : target.init) === null || _a === void 0 ? void 0 : _a.call(target, this.canvas, this.ctx); + return (...args) => extend(this.canvas, this.ctx, ...args); + }); + extendMount(this, drawPosterExtend, (extend, target) => { + var _a; + (_a = target === null || target === void 0 ? void 0 : target.init) === null || _a === void 0 ? void 0 : _a.call(target, this); + return (...args) => extend(this, ...args); + }); + // 当离开页面时, 自动调用停止绘画 + const _this = this; + const pages = getCurrentPages(); + const page = pages[pages.length - 1]; + // 查询标识, 不存在, 在替换页面卸载回调, 避免产生死循环 + if (!((_a = page === null || page === void 0 ? void 0 : page.onUnload) === null || _a === void 0 ? void 0 : _a.identification)) { + page.oldOnUnload = page.onUnload; + page.onUnload = function () { + _this === null || _this === void 0 ? void 0 : _this.stop(); + page.oldOnUnload(); + }; + page.onUnload.identification = true; + } + tips && this.debuggingLog('构建完成', { canvas, ctx, selector: canvasId }, '#19be6b'); + } +} +/** 传入挂载配置对象, 添加扩展方法 */ +DrawPoster.use = (opts) => { + if (opts.name) + drawPosterExtend[opts.name] = opts; +}; +/** 传入挂载配置对象, 添加绘画扩展方法 */ +DrawPoster.useCtx = (opts) => { + if (opts.name) + drawCtxPosterExtend[opts.name] = opts; +}; +/** 构建绘制海报矩形方法, 传入canvas选择器或配置对象, 返回绘制对象 */ +DrawPoster.build = async (options, tips = true) => { + var _a, _b, _c, _d, _e; + const config = handleBuildOpts(options); + // 初始化监测当前页面绘制对象 + const pages = getCurrentPages(); + const page = pages[pages.length - 1]; + const gcanvas = DrawPoster.prototype['gcanvas']; + if (page[config.selector + '__dp']) { + return page[config.selector + '__dp']; + } + if (config.gcanvas) { + if (!gcanvas) + console.error('--- 当前未引入gcanvas扩展, 将自动切换为普通 canvas ---'); + else + gcanvas.enable((_b = (_a = config.componentThis) === null || _a === void 0 ? void 0 : _a.$refs) === null || _b === void 0 ? void 0 : _b[config.selector], { + bridge: gcanvas.WeexBridge + }); + } + // 获取canvas实例 + const canvas = config.gcanvas && gcanvas ? + gcanvas.enable((_d = (_c = config.componentThis) === null || _c === void 0 ? void 0 : _c.$refs) === null || _d === void 0 ? void 0 : _d[config.selector], { + bridge: gcanvas.WeexBridge + }) : + await getCanvas2dContext(config.selector, config.componentThis); + const ctx = (((_e = canvas.getContext) === null || _e === void 0 ? void 0 : _e.call(canvas, "2d")) || uni.createCanvasContext(config.selector, config.componentThis)); + const dp = new DrawPoster(canvas, ctx, config.selector, config.loading, config.debugging, config.loadingText, config.createText, tips); + // 储存当前绘制对象 + page[config.selector + '__dp'] = dp; + return page[config.selector + '__dp']; +}; +/** 构建多个绘制海报矩形方法, 传入选择器或配置对象的数组, 返回多个绘制对象 */ +DrawPoster.buildAll = async (optionsAll) => { + const dpsArr = await Promise.all(optionsAll.map(async (options) => { + return await DrawPoster.build(options, false); + })); + const dpsObj = {}; + dpsArr.forEach(dp => dpsObj[dp.canvasId] = dp); + console.log("%cdraw-poster 构建完成:", "#E3712A", dpsObj); + return dpsObj; +}; +export default DrawPoster; diff --git a/js_sdk/u-draw-poster/extends/create-from-list/index.d.ts b/js_sdk/u-draw-poster/extends/create-from-list/index.d.ts new file mode 100644 index 00000000..af5b77fe --- /dev/null +++ b/js_sdk/u-draw-poster/extends/create-from-list/index.d.ts @@ -0,0 +1,17 @@ +import { DrawPosterUseOpts } from '../../utils/interface'; +export interface CreateLayerOpts { + background?: string; + self?: boolean; + line?: boolean; + lineHeight?: number; +} +export interface DrawRowOpt { + text?: string; + font?: string; + color?: string; + center?: boolean; + width?: number; +} +declare const _default: DrawPosterUseOpts; +/** 绘制表单扩展方法 */ +export default _default; diff --git a/js_sdk/u-draw-poster/extends/create-from-list/index.js b/js_sdk/u-draw-poster/extends/create-from-list/index.js new file mode 100644 index 00000000..0bea0e5f --- /dev/null +++ b/js_sdk/u-draw-poster/extends/create-from-list/index.js @@ -0,0 +1,140 @@ +/** 绘制表单扩展方法 */ +export default { + name: 'createLayer', + init: (dp) => { + dp.from = { + height: 0, + padding: 8, + margin: 0 + }; + dp.setFromOptions = (opts) => { + if (typeof opts.height !== 'undefined') { + dp.from.height = opts.height; + } + if (typeof opts.margin !== 'undefined') { + dp.from.margin = opts.margin; + } + if (typeof opts.padding !== 'undefined') { + dp.from.padding = opts.padding; + } + }; + }, + handle: (dp, afferOpts, rowList) => { + // 当前配置(头部偏移量, 列内边距, 表单外边距) + const height = dp.from.height; + const margin = dp.from.margin; + const padding = dp.from.padding; + // 当前层宽度 + const containerWidth = dp.canvas.width - (margin * 2); + // 基本层配置 + const opts = Object.assign({ background: "#fff", columnY: height || margin, self: true, line: true, lineHeight: 0, border: true }, afferOpts); + // 基本列配置 + const baseRowOpts = { + text: "", + font: "24px sans-serif", + color: "#333", + center: false, + width: 0, + }; + // 累计最高的列为标准定义为层高度 + let maxRowHeight = 0; + // 累计固定栅格列偏移量 + let columnOffsetX = margin; + // 创建行绘制任务 + const drawLayerInfos = rowList.map((afferRowOpts = {}, index) => { + const rowOpts = Object.assign(Object.assign({}, baseRowOpts), afferRowOpts); + let columnX = 0; // 每列的X轴 + let columnW = 0; // 每列的宽度 + let fontOffsetX = 0; // 字体偏移X轴 + let fontMaxWidth = 100; // 字体最大宽度 + opts.lineHeight = opts.lineHeight || Number(rowOpts.font.replace(/[^0-9.]/g, "")); + if (opts.self) { + // 自适应栅格格子计算 + columnX = containerWidth - (containerWidth / (index + 1)) + margin; + columnW = containerWidth / rowList.length; + if (columnX > 0 && columnX < containerWidth - columnW) { + columnX = (columnW * index) + margin; + } + fontOffsetX = rowOpts.center ? columnX + (columnW / 2) : columnX + padding; + fontMaxWidth = columnW - (padding * 3); + } + if (!opts.self) { + // 固定栅格格子计算 + columnW = rowOpts.width; + columnX = columnOffsetX; + fontMaxWidth = columnW - (padding * 3); + fontOffsetX = rowOpts.center ? columnOffsetX + (rowOpts.width / 2) : columnOffsetX + padding; + columnOffsetX += rowOpts.width; + } + dp.ctx.font = rowOpts.font; + const drawFontInfos = dp.ctx.fillWarpText({ + text: rowOpts.text, + maxWidth: fontMaxWidth, + lineHeight: opts.lineHeight, + x: fontOffsetX, + y: opts.columnY, + layer: 10, + notFillText: true + }); + // 当前行的高度 + const rowHeight = (opts.lineHeight * drawFontInfos.length) + (padding * 3); + // 若该列高度大于累计高度, 将累计高度替换 + if (rowHeight > maxRowHeight) { + maxRowHeight = rowHeight; + } + return { + font: rowOpts.font, + center: rowOpts.center, + color: rowOpts.color, + border: opts.border, + background: opts.background, + lineHeight: opts.lineHeight, + line: opts.line, + drawFontInfos, + columnY: opts.columnY, + columnX, + columnW, + columnH: maxRowHeight, + margin, + padding + }; + }); + // 将行绘制任务添加至绘制容器中 + dp.draw((ctx) => drawLayerInfos.forEach((rowOpts, index) => { + ctx.font = rowOpts.font; + ctx.fillStyle = rowOpts.background; + ctx.strokeStyle = "#333"; + ctx.textBaseline = "middle"; + ctx.textAlign = 'left'; + if (rowOpts.center) { + ctx.textAlign = "center"; + } + ctx.fillRect(rowOpts.columnX, rowOpts.columnY, rowOpts.columnW, rowOpts.columnH); + if (rowOpts.border) { + dp.ctx.strokeRect(margin, rowOpts.columnY, dp.canvas.width - margin, maxRowHeight); + } + if (rowOpts.line && rowOpts.columnX !== margin) { + ctx.moveTo(rowOpts.columnX, rowOpts.columnY); + ctx.lineTo(rowOpts.columnX, rowOpts.columnY + rowOpts.columnH); + ctx.stroke(); + ctx.beginPath(); + } + ctx.fillStyle = rowOpts.color; + rowOpts.drawFontInfos.forEach(fontInfo => { + // 计算每行字体绘制y轴长度 + // y(当前列置顶轴) + (rowOpts.columnH(当前列最高长度) / 2) - (((总列数-1) * 行高) / 2) + const textTotal = rowOpts.drawFontInfos.length - 1; + const textMiddleY = (textTotal * rowOpts.lineHeight) / 2; + let fontOffsetY = fontInfo.y + (rowOpts.columnH / 2); + fontOffsetY -= textMiddleY; + ctx.fillText(fontInfo.text, fontInfo.x, fontOffsetY); + }); + })); + if (opts.columnY === 0 || opts.columnY === margin) { + maxRowHeight += margin; + } + // 叠加高度 + dp.from.height += maxRowHeight; + return maxRowHeight; + }, +}; diff --git a/js_sdk/u-draw-poster/extends/create-gcanvas/index.d.ts b/js_sdk/u-draw-poster/extends/create-gcanvas/index.d.ts new file mode 100644 index 00000000..d99e5560 --- /dev/null +++ b/js_sdk/u-draw-poster/extends/create-gcanvas/index.d.ts @@ -0,0 +1,4 @@ +import { DrawPosterUseOpts } from '../../utils/interface'; +export * from './gcanvas'; +declare const _default: DrawPosterUseOpts; +export default _default; diff --git a/js_sdk/u-draw-poster/extends/create-gcanvas/index.js b/js_sdk/u-draw-poster/extends/create-gcanvas/index.js new file mode 100644 index 00000000..608744fa --- /dev/null +++ b/js_sdk/u-draw-poster/extends/create-gcanvas/index.js @@ -0,0 +1,9 @@ +import { WeexBridge, enable, Image } from './gcanvas'; +export * from './gcanvas'; +import DrawPoster from "../../draw-poster"; +DrawPoster.prototype['gcanvas'] = { + WeexBridge, + enable, + Image +}; +export default {}; diff --git a/js_sdk/u-draw-poster/extends/draw-function/draw-image-fit.d.ts b/js_sdk/u-draw-poster/extends/draw-function/draw-image-fit.d.ts new file mode 100644 index 00000000..c2783c82 --- /dev/null +++ b/js_sdk/u-draw-poster/extends/draw-function/draw-image-fit.d.ts @@ -0,0 +1,12 @@ +import { DrawPosterUseCtxOpts } from '../../utils/interface'; +import { ObjectFit, ObjectPosition, Size } from "../../utils/object-sizing"; +export interface ImageFitOption { + radius?: number; + objectFit?: ObjectFit; + intrinsicSize?: Size; + specifiedSize?: Size; + intrinsicPosition?: ObjectPosition; + specifiedPosition?: [number, number]; +} +declare const _default: DrawPosterUseCtxOpts; +export default _default; diff --git a/js_sdk/u-draw-poster/extends/draw-function/draw-image-fit.js b/js_sdk/u-draw-poster/extends/draw-function/draw-image-fit.js new file mode 100644 index 00000000..b67ebc4a --- /dev/null +++ b/js_sdk/u-draw-poster/extends/draw-function/draw-image-fit.js @@ -0,0 +1,25 @@ +import { calculateConcreteRect } from "../../utils/object-sizing"; +import uni from "../../utils/global"; +export default { + name: 'drawImageFit', + handle: async (canvas, ctx, url, options) => { + var _a, _b, _c; + const [error, imageInfo] = await uni.getImageInfo({ src: url }); + // 配置默认值 + const style = Object.assign({ radius: 0, objectFit: 'cover', intrinsicSize: { width: (_a = imageInfo === null || imageInfo === void 0 ? void 0 : imageInfo.width) !== null && _a !== void 0 ? _a : 100, height: (_b = imageInfo === null || imageInfo === void 0 ? void 0 : imageInfo.height) !== null && _b !== void 0 ? _b : 100 }, specifiedSize: { width: 100, height: 100 }, intrinsicPosition: ['center', 'center'], specifiedPosition: [0, 0] }, options); + // 计算图片尺寸 + const drawImageInfo = calculateConcreteRect(style, style.intrinsicSize, style.specifiedSize); + // 如有圆角, 则进行裁剪 + if (style.radius > 0) { + ctx.save(); + (_c = ctx.setFillStyle) === null || _c === void 0 ? void 0 : _c.call(ctx, 'transparent'); + ctx.fillStyle = 'transparent'; + ctx.fillRoundRect(style.specifiedPosition[0], style.specifiedPosition[1], style.specifiedSize.width, style.specifiedSize.height, style.radius); + ctx.clip(); + } + const result = await ctx.drawImage(url, ...Object.values(drawImageInfo)); + if (style.radius > 0) + ctx.restore(); + return result; + } +}; diff --git a/js_sdk/u-draw-poster/extends/draw-function/draw-image.d.ts b/js_sdk/u-draw-poster/extends/draw-function/draw-image.d.ts new file mode 100644 index 00000000..8edfae72 --- /dev/null +++ b/js_sdk/u-draw-poster/extends/draw-function/draw-image.d.ts @@ -0,0 +1,4 @@ +import { DrawPosterUseCtxOpts } from '../../utils/interface'; +declare const _default: DrawPosterUseCtxOpts; +/** 等待绘制图片原型方法 */ +export default _default; diff --git a/js_sdk/u-draw-poster/extends/draw-function/draw-image.js b/js_sdk/u-draw-poster/extends/draw-function/draw-image.js new file mode 100644 index 00000000..221bcc64 --- /dev/null +++ b/js_sdk/u-draw-poster/extends/draw-function/draw-image.js @@ -0,0 +1,42 @@ +import { downloadImgUrl } from '../../utils/wx-utils'; +/** 等待绘制图片原型方法 */ +export default { + name: 'drawImage', + init: (canvas, ctx) => { + ctx.drawImageProto = ctx.drawImage; + }, + handle: async (canvas, ctx, url, sx, sy, sh, sw, dx, dy, dh, dw) => { + // 下载路径 + const path = await downloadImgUrl(url); + // 标记当前绘画存在图片绘制 + let result = false; + // 基本绘制方法, 如果是 fit 方式, 则传入所有参数, 不然则只传入四个参数 + const baseDrawImage = (imageResource) => { + const isFit = typeof dx === 'number' && typeof dw === 'number'; + if (isFit) { + ctx.drawImageProto(imageResource, sx, sy, sh, sw, dx, dy, dh, dw); + } + else { + ctx.drawImageProto(imageResource, sx, sy, sh, sw); + } + }; + // 如果是 context 绘制方式, 则直接绘制 + if (ctx.drawType === 'context') { + baseDrawImage(path); + result = true; + } + // 如果是 type2d 绘制方式, 则等待图片绘制完毕 + if (ctx.drawType === 'type2d') { + result = await new Promise(resolve => { + const image = canvas.createImage(); + image.src = path; + image.onload = () => { + baseDrawImage(image); + resolve(true); + }; + image.onerror = () => resolve(false); + }); + } + return result; + } +}; diff --git a/js_sdk/u-draw-poster/extends/draw-function/draw-round-image.d.ts b/js_sdk/u-draw-poster/extends/draw-function/draw-round-image.d.ts new file mode 100644 index 00000000..fd576961 --- /dev/null +++ b/js_sdk/u-draw-poster/extends/draw-function/draw-round-image.d.ts @@ -0,0 +1,4 @@ +import { DrawPosterUseCtxOpts } from '../../utils/interface'; +declare const _default: DrawPosterUseCtxOpts; +/** 绘制圆角图片原型方法 */ +export default _default; diff --git a/js_sdk/u-draw-poster/extends/draw-function/draw-round-image.js b/js_sdk/u-draw-poster/extends/draw-function/draw-round-image.js new file mode 100644 index 00000000..8f9d9569 --- /dev/null +++ b/js_sdk/u-draw-poster/extends/draw-function/draw-round-image.js @@ -0,0 +1,15 @@ +/** 绘制圆角图片原型方法 */ +export default { + name: 'drawRoundImage', + handle: async (canvas, ctx, url, x, y, w, h, r = 15) => { + var _a; + ctx.save(); + (_a = ctx.setFillStyle) === null || _a === void 0 ? void 0 : _a.call(ctx, 'transparent'); + ctx.fillStyle = 'transparent'; + ctx.fillRoundRect(x, y, w, h, r); + ctx.clip(); + const result = await ctx.drawImage(url, x, y, w, h); + ctx.restore(); + return result; + } +}; diff --git a/js_sdk/u-draw-poster/extends/draw-function/fill-round-rect.d.ts b/js_sdk/u-draw-poster/extends/draw-function/fill-round-rect.d.ts new file mode 100644 index 00000000..aafc6120 --- /dev/null +++ b/js_sdk/u-draw-poster/extends/draw-function/fill-round-rect.d.ts @@ -0,0 +1,4 @@ +import { DrawPosterUseCtxOpts } from '../../utils/interface'; +declare const _default: DrawPosterUseCtxOpts; +/** 绘制填充圆角矩形方法 */ +export default _default; diff --git a/js_sdk/u-draw-poster/extends/draw-function/fill-round-rect.js b/js_sdk/u-draw-poster/extends/draw-function/fill-round-rect.js new file mode 100644 index 00000000..2e12c61a --- /dev/null +++ b/js_sdk/u-draw-poster/extends/draw-function/fill-round-rect.js @@ -0,0 +1,7 @@ +/** 绘制填充圆角矩形方法 */ +export default { + name: 'fillRoundRect', + handle: (canvas, ctx, x, y, w, h, r) => { + ctx.roundRect(x, y, w, h, r, true); + } +}; diff --git a/js_sdk/u-draw-poster/extends/draw-function/fill-warp-text.d.ts b/js_sdk/u-draw-poster/extends/draw-function/fill-warp-text.d.ts new file mode 100644 index 00000000..3cd9a5da --- /dev/null +++ b/js_sdk/u-draw-poster/extends/draw-function/fill-warp-text.d.ts @@ -0,0 +1,4 @@ +import { DrawPosterUseCtxOpts } from '../../utils/interface'; +declare const _default: DrawPosterUseCtxOpts; +/** 绘制换行字体原型方法 */ +export default _default; diff --git a/js_sdk/u-draw-poster/extends/draw-function/fill-warp-text.js b/js_sdk/u-draw-poster/extends/draw-function/fill-warp-text.js new file mode 100644 index 00000000..7403afb0 --- /dev/null +++ b/js_sdk/u-draw-poster/extends/draw-function/fill-warp-text.js @@ -0,0 +1,76 @@ +/** 绘制换行字体原型方法 */ +export default { + name: 'fillWarpText', + handle: (canvas, ctx, config) => { + const newConfig = config = Object.assign({ maxWidth: 100, layer: 2, lineHeight: Number(ctx.font.replace(/[^0-9.]/g, '')), x: 0, y: Number(ctx.font.replace(/[^0-9.]/g, '')) / 1.2, splitText: '', notFillText: false }, config); + const { text, splitText, maxWidth, layer, lineHeight, notFillText, x, y } = newConfig; + // 当字符串为空时, 抛出错误 + if (!text) { + throw Error('warpFillText Error: text is empty string'); + } + // 分割所有单个字符串 + const chr = text.split(splitText); + // 存入的每行字体的容器 + let row = []; + // 判断字符串 + let timp = ''; + if (splitText) { + row = chr; + } + else { + // 遍历所有字符串, 填充行容器 + for (let i = 0; i < chr.length; i++) { + // 当超出行列时, 停止执行遍历, 节省计算时间 + if (row.length > layer) { + break; + } + if (ctx.measureText(timp).width < maxWidth) { + // 如果超出长度, 添加进row数组 + timp += chr[i]; + } + else { + // 如超出一行长度, 则换行, 并清除容器 + i--; + row.push(timp); + timp = ''; + } + } + // 如有剩下字体, 则在最后时添加一行 + if (timp) { + row.push(timp); + } + // 如果数组长度大于指定行数 + if (row.length > layer) { + row = row.slice(0, layer); + // 结束的索引 + const end = layer - 1; + for (let i = 0; i < row[end].length; i++) { + const currentWidth = ctx.measureText(`${row[end]}...`).width; + if (currentWidth > maxWidth) { + // 加上... 当前宽度大于最大宽度时, 去除一位字符串 + const strEnd = row[end].length - 1; + row[end] = row[end].slice(0, strEnd); + } + else { + row[end] += '...'; + break; + } + } + } + } + // 储存并返回绘制信息 + const drawInfos = row.map((item, index) => { + const info = { + text: item, + y: y + index * lineHeight, + x: x, + }; + // 默认执行绘制信息 + if (!notFillText) { + ctx.fillText(info.text, info.x, info.y); + } + return info; + }); + return drawInfos; + } +}; diff --git a/js_sdk/u-draw-poster/extends/draw-function/index.d.ts b/js_sdk/u-draw-poster/extends/draw-function/index.d.ts new file mode 100644 index 00000000..8ac52fd6 --- /dev/null +++ b/js_sdk/u-draw-poster/extends/draw-function/index.d.ts @@ -0,0 +1,7 @@ +export { default as drawImage } from "./draw-image"; +export { default as roundRect } from "./round-rect"; +export { default as fillRoundRect } from "./fill-round-rect"; +export { default as strokeRoundRect } from "./stroke-round-rect"; +export { default as fillWarpText } from "./fill-warp-text"; +export { default as drawRoundImage } from "./draw-round-image"; +export { default as drawImageFit } from "./draw-image-fit"; diff --git a/js_sdk/u-draw-poster/extends/draw-function/index.js b/js_sdk/u-draw-poster/extends/draw-function/index.js new file mode 100644 index 00000000..3a3d2d8f --- /dev/null +++ b/js_sdk/u-draw-poster/extends/draw-function/index.js @@ -0,0 +1,15 @@ +/* + * @Author: Mr.Mao + * @LastEditors: Mr.Mao + * @Date: 2020-11-11 20:43:33 + * @LastEditTime: 2021-01-02 00:16:59 + * @Description: + * @任何一个傻子都能写出让电脑能懂的代码,而只有好的程序员可以写出让人能看懂的代码 + */ +export { default as drawImage } from "./draw-image"; +export { default as roundRect } from "./round-rect"; +export { default as fillRoundRect } from "./fill-round-rect"; +export { default as strokeRoundRect } from "./stroke-round-rect"; +export { default as fillWarpText } from "./fill-warp-text"; +export { default as drawRoundImage } from "./draw-round-image"; +export { default as drawImageFit } from "./draw-image-fit"; diff --git a/js_sdk/u-draw-poster/extends/draw-function/round-rect.d.ts b/js_sdk/u-draw-poster/extends/draw-function/round-rect.d.ts new file mode 100644 index 00000000..e4c123d2 --- /dev/null +++ b/js_sdk/u-draw-poster/extends/draw-function/round-rect.d.ts @@ -0,0 +1,4 @@ +import { DrawPosterUseCtxOpts } from '../../utils/interface'; +declare const _default: DrawPosterUseCtxOpts; +/** 绘制圆角矩形原型方法 */ +export default _default; diff --git a/js_sdk/u-draw-poster/extends/draw-function/round-rect.js b/js_sdk/u-draw-poster/extends/draw-function/round-rect.js new file mode 100644 index 00000000..8ede5549 --- /dev/null +++ b/js_sdk/u-draw-poster/extends/draw-function/round-rect.js @@ -0,0 +1,41 @@ +/** 绘制圆角矩形原型方法 */ +export default { + name: 'roundRect', + handle: (canvas, ctx, x, y, w, h, r = 15, fill = false, stroke = false) => { + if (r === 0) { + if (stroke) + ctx.strokeRect(x, y, w, h); + if (fill) + ctx.fillRect(x, y, w, h); + return; + } + if (w < 2 * r) { + r = w / 2; + } + if (h < 2 * r) { + r = h / 2; + } + // 开始绘制 + ctx.beginPath(); + ctx.arc(x + r, y + r, r, Math.PI, Math.PI * 1.5); + // 移动复制 + ctx.moveTo(x + r, y); + ctx.lineTo(x + w - r, y); + ctx.lineTo(x + w, y + r); + // (x,y,z,j,f) x,y圆心z半径,j起始弧度f,终止弧度 + ctx.arc(x + w - r, y + r, r, Math.PI * 1.5, Math.PI * 2); + ctx.lineTo(x + w, y + h - r); + ctx.lineTo(x + w - r, y + h); + ctx.arc(x + w - r, y + h - r, r, 0, Math.PI * 0.5); + ctx.lineTo(x + r, y + h); + ctx.lineTo(x, y + h - r); + ctx.arc(x + r, y + h - r, r, Math.PI * 0.5, Math.PI); + ctx.lineTo(x, y + r); + ctx.lineTo(x + r, y); + if (stroke) + ctx.stroke(); + if (fill) + ctx.fill(); + ctx.closePath(); + } +}; diff --git a/js_sdk/u-draw-poster/extends/draw-function/stroke-round-rect.d.ts b/js_sdk/u-draw-poster/extends/draw-function/stroke-round-rect.d.ts new file mode 100644 index 00000000..aafc6120 --- /dev/null +++ b/js_sdk/u-draw-poster/extends/draw-function/stroke-round-rect.d.ts @@ -0,0 +1,4 @@ +import { DrawPosterUseCtxOpts } from '../../utils/interface'; +declare const _default: DrawPosterUseCtxOpts; +/** 绘制填充圆角矩形方法 */ +export default _default; diff --git a/js_sdk/u-draw-poster/extends/draw-function/stroke-round-rect.js b/js_sdk/u-draw-poster/extends/draw-function/stroke-round-rect.js new file mode 100644 index 00000000..86d1279e --- /dev/null +++ b/js_sdk/u-draw-poster/extends/draw-function/stroke-round-rect.js @@ -0,0 +1,7 @@ +/** 绘制填充圆角矩形方法 */ +export default { + name: 'strokeRoundRect', + handle: (canvas, ctx, x, y, w, h, r) => { + ctx.roundRect(x, y, w, h, r, false, true); + } +}; diff --git a/js_sdk/u-draw-poster/extends/draw-painter/index.d.ts b/js_sdk/u-draw-poster/extends/draw-painter/index.d.ts new file mode 100644 index 00000000..5fcd15a6 --- /dev/null +++ b/js_sdk/u-draw-poster/extends/draw-painter/index.d.ts @@ -0,0 +1,101 @@ +import { DrawPosterUseOpts } from '../../utils/interface'; +import { ImageFitOption } from '../draw-function/draw-image-fit'; +/** 矩形基本信息 */ +interface PainterItemSize { + /** 容器的宽度,固定值 */ + width: number; + /** 容器的高度,固定值 */ + height: number; +} +/** 元素位置信息 */ +interface PainterItemSite { + /** 元素锚点距左边的距离; 默认: 0 */ + left?: number; + /** 元素锚点距上边的距离; 默认: 0 */ + top?: number; +} +/** 绘制图片信息 */ +interface PainterImageInfo extends PainterItemSize, PainterItemSite { + /** 绘制图片元素 */ + type: 'image'; + /** 图片地址 */ + src: string; + /** 图片自适应, 可参考 css 属性 object-fit */ + objectFit?: ImageFitOption['objectFit']; + /** 图片在元素容器中显示的位置,可参考 css 属性 object-position */ + position?: ImageFitOption['intrinsicPosition']; + /** 圆角尺寸; 默认: 0 */ + radius?: number; +} +/** 绘制矩形信息 */ +interface PainterRectInfo extends PainterItemSize, PainterItemSite { + /** 绘制矩形元素 */ + type: "rect"; + /** 矩形背景颜色; 默认: "#000" */ + background?: string; + /** 圆角尺寸; 默认: 0 */ + radius?: number; +} +/** 绘制单行文字信息 */ +interface PainterTextInfo extends PainterItemSite { + /** 绘制文本元素 */ + type: "text"; + /** 文本颜色; 默认: "#000" */ + color?: string; + /** 字体; 默认: "serial" */ + fontFamily?: string; + /** 字号(单位rpx); 默认: 30 rpx */ + fontSize?: number; + /** 字重; 默认: "normal" 可选项: "bold" */ + fontWeight?: string; + /** 字型 默认: "normal" 可选项: "italic" */ + fontStyle?: string; + /** 元素的宽度(单位rpx), 水平排布时影响后一个元素的位置,为 null 时根据文字实际占用的宽度计算 */ + width?: number; + /** 文本内容 */ + content: string; +} +/** 绘制多行文字信息 */ +interface PainterLineFeedTextInfo extends PainterItemSite { + /** 绘制换行文本元素 */ + type: "line-feed-text"; + /** 文本颜色; 默认: "#000" */ + color?: string; + /** 字体; 默认: "serial" */ + fontFamily?: string; + /** 字号(单位rpx); 默认: 30 rpx */ + fontSize?: number; + /** 字重; 默认: "normal" 可选项: "bold" */ + fontWeight?: string; + /** 字型 默认: "normal" 可选项: "italic" */ + fontStyle?: string; + /** 文本块的宽度,不能为空 */ + width: number; + /** 行高; 默认取当前文字行高 */ + lineHeight?: number; + /** 文本最大行数,超出即显示省略号; 默认3行 */ + lineClamp?: number; + /** 文本内容 */ + content: string; +} +/** 绘制二维码信息 */ +interface PainterQrCodeInfo extends PainterItemSite { + /** 绘制换行文本元素 */ + type: "qr-code"; + /** 二维码尺寸 */ + size: number; + /** 二维码内容 */ + content: string; + /** 边距,二维码实际尺寸会根据所设边距值进行缩放调整(默认:5) */ + margin?: number; + /** 背景色(默认:'#ffffff')*/ + backgroundColor?: string; + /** 前景色(默认:'#000000') */ + foregroundColor?: string; +} +export interface PainterContainerOption extends PainterItemSize { + /** 绘制项的数组 */ + contents: Array; +} +declare const _default: DrawPosterUseOpts; +export default _default; diff --git a/js_sdk/u-draw-poster/extends/draw-painter/index.js b/js_sdk/u-draw-poster/extends/draw-painter/index.js new file mode 100644 index 00000000..fecb79f1 --- /dev/null +++ b/js_sdk/u-draw-poster/extends/draw-painter/index.js @@ -0,0 +1,73 @@ +export default { + name: 'painter', + handle: (dp, option) => { + dp.canvas.width = option.width; + dp.canvas.height = option.height; + dp.draw(async (ctx) => { + for (let i = 0; i < option.contents.length; i++) { + ctx.save(); + const drawInfo = option.contents[i]; + const { left = 0, top = 0 } = drawInfo; + if (drawInfo.type === 'rect') { + ctx.fillStyle = drawInfo.background || '#000000'; + ctx.fillRoundRect(left, top, drawInfo.width, drawInfo.height, drawInfo.radius || 0); + } + if (drawInfo.type === 'image') { + await ctx.drawImageFit(drawInfo.src, { + objectFit: drawInfo.objectFit || 'cover', + intrinsicPosition: drawInfo.position || ['center', 'center'], + specifiedPosition: [left, top], + specifiedSize: { + width: drawInfo.width, + height: drawInfo.height + }, + radius: drawInfo.radius + }); + } + if (drawInfo.type === 'text') { + ctx.fillStyle = drawInfo.color || '#000000'; + ctx.font = `\ + ${drawInfo.fontStyle || 'normal'} \ + ${drawInfo.fontWeight || 'normal'} \ + ${drawInfo.fontSize || 30} \ + ${drawInfo.fontFamily || 'serial'}\ + `; + ctx.fillText(drawInfo.content, left, top, drawInfo.width); + } + if (drawInfo.type === 'line-feed-text') { + ctx.fillStyle = drawInfo.color || '#000000'; + ctx.font = `\ + ${drawInfo.fontStyle || 'normal'} \ + ${drawInfo.fontWeight || 'normal'} \ + ${drawInfo.fontSize || 30} \ + ${drawInfo.fontFamily || 'serial'}\ + `; + ctx.fillWarpText({ + x: drawInfo.left, + y: drawInfo.top, + layer: drawInfo.lineClamp, + lineHeight: drawInfo.lineHeight, + maxWidth: drawInfo.width, + text: drawInfo.content + }); + } + if (drawInfo.type === 'qr-code') { + if (typeof ctx.drawQrCode !== 'function') { + console.error('--- 当前未引入qr-code扩展, 将自动省略该二维码绘制 ---'); + return false; + } + ctx.drawQrCode({ + x: left, + y: top, + size: drawInfo.size, + text: drawInfo.content, + margin: drawInfo.margin || 5, + backgroundColor: drawInfo.backgroundColor || '#ffffff', + foregroundColor: drawInfo.foregroundColor || '#000000', + }); + } + ctx.restore(); + } + }); + } +}; diff --git a/js_sdk/u-draw-poster/extends/draw-qr-code/index.d.ts b/js_sdk/u-draw-poster/extends/draw-qr-code/index.d.ts new file mode 100644 index 00000000..67d9d45d --- /dev/null +++ b/js_sdk/u-draw-poster/extends/draw-qr-code/index.d.ts @@ -0,0 +1,6 @@ +declare const _default: { + name: string; + handle: any; + errorCorrectLevel: any; +}; +export default _default; diff --git a/js_sdk/u-draw-poster/extends/draw-qr-code/index.js b/js_sdk/u-draw-poster/extends/draw-qr-code/index.js new file mode 100644 index 00000000..0140e0f0 --- /dev/null +++ b/js_sdk/u-draw-poster/extends/draw-qr-code/index.js @@ -0,0 +1,6 @@ +import uQRCode from "./uQRCode"; +export default { + name: "drawQrCode", + handle: uQRCode.make.bind(uQRCode), + errorCorrectLevel: uQRCode.errorCorrectLevel +}; diff --git a/js_sdk/u-draw-poster/extends/draw-qr-code/uQRCode.d.ts b/js_sdk/u-draw-poster/extends/draw-qr-code/uQRCode.d.ts new file mode 100644 index 00000000..db604a11 --- /dev/null +++ b/js_sdk/u-draw-poster/extends/draw-qr-code/uQRCode.d.ts @@ -0,0 +1,10 @@ +/* + * @Author: Mr.Mao + * @LastEditors: Mr.Mao + * @Date: 2021-01-02 13:30:58 + * @LastEditTime: 2021-01-02 13:31:27 + * @Description: + * @任何一个傻子都能写出让电脑能懂的代码,而只有好的程序员可以写出让人能看懂的代码 + */ +declare const uQRCode: any +export default uQRCode \ No newline at end of file diff --git a/js_sdk/u-draw-poster/extends/draw-qr-code/uQRCode.js b/js_sdk/u-draw-poster/extends/draw-qr-code/uQRCode.js new file mode 100644 index 00000000..a1d320bd --- /dev/null +++ b/js_sdk/u-draw-poster/extends/draw-qr-code/uQRCode.js @@ -0,0 +1,1355 @@ +/* + * @Author: Mr.Mao + * @LastEditors: Mr.Mao + * @Date: 2021-01-02 13:30:58 + * @LastEditTime: 2021-01-02 13:30:58 + * @Description: + * @任何一个傻子都能写出让电脑能懂的代码,而只有好的程序员可以写出让人能看懂的代码 + */ +//--------------------------------------------------------------------- +// github https://github.com/Sansnn/uQRCode +//--------------------------------------------------------------------- + +let uQRCode = {}; + +(function () { + //--------------------------------------------------------------------- + // QRCode for JavaScript + // + // Copyright (c) 2009 Kazuhiko Arase + // + // URL: http://www.d-project.com/ + // + // Licensed under the MIT license: + // http://www.opensource.org/licenses/mit-license.php + // + // The word "QR Code" is registered trademark of + // DENSO WAVE INCORPORATED + // http://www.denso-wave.com/qrcode/faqpatent-e.html + // + //--------------------------------------------------------------------- + + //--------------------------------------------------------------------- + // QR8bitByte + //--------------------------------------------------------------------- + + function QR8bitByte(data) { + this.mode = QRMode.MODE_8BIT_BYTE; + this.data = data; + } + + QR8bitByte.prototype = { + + getLength: function (buffer) { + return this.data.length; + }, + + write: function (buffer) { + for (var i = 0; i < this.data.length; i++) { + // not JIS ... + buffer.put(this.data.charCodeAt(i), 8); + } + } + }; + + //--------------------------------------------------------------------- + // QRCode + //--------------------------------------------------------------------- + + function QRCode(typeNumber, errorCorrectLevel) { + this.typeNumber = typeNumber; + this.errorCorrectLevel = errorCorrectLevel; + this.modules = null; + this.moduleCount = 0; + this.dataCache = null; + this.dataList = new Array(); + } + + QRCode.prototype = { + + addData: function (data) { + var newData = new QR8bitByte(data); + this.dataList.push(newData); + this.dataCache = null; + }, + + isDark: function (row, col) { + if (row < 0 || this.moduleCount <= row || col < 0 || this.moduleCount <= col) { + throw new Error(row + "," + col); + } + return this.modules[row][col]; + }, + + getModuleCount: function () { + return this.moduleCount; + }, + + make: function () { + // Calculate automatically typeNumber if provided is < 1 + if (this.typeNumber < 1) { + var typeNumber = 1; + for (typeNumber = 1; typeNumber < 40; typeNumber++) { + var rsBlocks = QRRSBlock.getRSBlocks(typeNumber, this.errorCorrectLevel); + + var buffer = new QRBitBuffer(); + var totalDataCount = 0; + for (var i = 0; i < rsBlocks.length; i++) { + totalDataCount += rsBlocks[i].dataCount; + } + + for (var i = 0; i < this.dataList.length; i++) { + var data = this.dataList[i]; + buffer.put(data.mode, 4); + buffer.put(data.getLength(), QRUtil.getLengthInBits(data.mode, typeNumber)); + data.write(buffer); + } + if (buffer.getLengthInBits() <= totalDataCount * 8) + break; + } + this.typeNumber = typeNumber; + } + this.makeImpl(false, this.getBestMaskPattern()); + }, + + makeImpl: function (test, maskPattern) { + + this.moduleCount = this.typeNumber * 4 + 17; + this.modules = new Array(this.moduleCount); + + for (var row = 0; row < this.moduleCount; row++) { + + this.modules[row] = new Array(this.moduleCount); + + for (var col = 0; col < this.moduleCount; col++) { + this.modules[row][col] = null; //(col + row) % 3; + } + } + + this.setupPositionProbePattern(0, 0); + this.setupPositionProbePattern(this.moduleCount - 7, 0); + this.setupPositionProbePattern(0, this.moduleCount - 7); + this.setupPositionAdjustPattern(); + this.setupTimingPattern(); + this.setupTypeInfo(test, maskPattern); + + if (this.typeNumber >= 7) { + this.setupTypeNumber(test); + } + + if (this.dataCache == null) { + this.dataCache = QRCode.createData(this.typeNumber, this.errorCorrectLevel, this.dataList); + } + + this.mapData(this.dataCache, maskPattern); + }, + + setupPositionProbePattern: function (row, col) { + + for (var r = -1; r <= 7; r++) { + + if (row + r <= -1 || this.moduleCount <= row + r) continue; + + for (var c = -1; c <= 7; c++) { + + if (col + c <= -1 || this.moduleCount <= col + c) continue; + + if ((0 <= r && r <= 6 && (c == 0 || c == 6)) || + (0 <= c && c <= 6 && (r == 0 || r == 6)) || + (2 <= r && r <= 4 && 2 <= c && c <= 4)) { + this.modules[row + r][col + c] = true; + } else { + this.modules[row + r][col + c] = false; + } + } + } + }, + + getBestMaskPattern: function () { + + var minLostPoint = 0; + var pattern = 0; + + for (var i = 0; i < 8; i++) { + + this.makeImpl(true, i); + + var lostPoint = QRUtil.getLostPoint(this); + + if (i == 0 || minLostPoint > lostPoint) { + minLostPoint = lostPoint; + pattern = i; + } + } + + return pattern; + }, + + createMovieClip: function (target_mc, instance_name, depth) { + + var qr_mc = target_mc.createEmptyMovieClip(instance_name, depth); + var cs = 1; + + this.make(); + + for (var row = 0; row < this.modules.length; row++) { + + var y = row * cs; + + for (var col = 0; col < this.modules[row].length; col++) { + + var x = col * cs; + var dark = this.modules[row][col]; + + if (dark) { + qr_mc.beginFill(0, 100); + qr_mc.moveTo(x, y); + qr_mc.lineTo(x + cs, y); + qr_mc.lineTo(x + cs, y + cs); + qr_mc.lineTo(x, y + cs); + qr_mc.endFill(); + } + } + } + + return qr_mc; + }, + + setupTimingPattern: function () { + + for (var r = 8; r < this.moduleCount - 8; r++) { + if (this.modules[r][6] != null) { + continue; + } + this.modules[r][6] = (r % 2 == 0); + } + + for (var c = 8; c < this.moduleCount - 8; c++) { + if (this.modules[6][c] != null) { + continue; + } + this.modules[6][c] = (c % 2 == 0); + } + }, + + setupPositionAdjustPattern: function () { + + var pos = QRUtil.getPatternPosition(this.typeNumber); + + for (var i = 0; i < pos.length; i++) { + + for (var j = 0; j < pos.length; j++) { + + var row = pos[i]; + var col = pos[j]; + + if (this.modules[row][col] != null) { + continue; + } + + for (var r = -2; r <= 2; r++) { + + for (var c = -2; c <= 2; c++) { + + if (r == -2 || r == 2 || c == -2 || c == 2 || + (r == 0 && c == 0)) { + this.modules[row + r][col + c] = true; + } else { + this.modules[row + r][col + c] = false; + } + } + } + } + } + }, + + setupTypeNumber: function (test) { + + var bits = QRUtil.getBCHTypeNumber(this.typeNumber); + + for (var i = 0; i < 18; i++) { + var mod = (!test && ((bits >> i) & 1) == 1); + this.modules[Math.floor(i / 3)][i % 3 + this.moduleCount - 8 - 3] = mod; + } + + for (var i = 0; i < 18; i++) { + var mod = (!test && ((bits >> i) & 1) == 1); + this.modules[i % 3 + this.moduleCount - 8 - 3][Math.floor(i / 3)] = mod; + } + }, + + setupTypeInfo: function (test, maskPattern) { + + var data = (this.errorCorrectLevel << 3) | maskPattern; + var bits = QRUtil.getBCHTypeInfo(data); + + // vertical + for (var i = 0; i < 15; i++) { + + var mod = (!test && ((bits >> i) & 1) == 1); + + if (i < 6) { + this.modules[i][8] = mod; + } else if (i < 8) { + this.modules[i + 1][8] = mod; + } else { + this.modules[this.moduleCount - 15 + i][8] = mod; + } + } + + // horizontal + for (var i = 0; i < 15; i++) { + + var mod = (!test && ((bits >> i) & 1) == 1); + + if (i < 8) { + this.modules[8][this.moduleCount - i - 1] = mod; + } else if (i < 9) { + this.modules[8][15 - i - 1 + 1] = mod; + } else { + this.modules[8][15 - i - 1] = mod; + } + } + + // fixed module + this.modules[this.moduleCount - 8][8] = (!test); + + }, + + mapData: function (data, maskPattern) { + + var inc = -1; + var row = this.moduleCount - 1; + var bitIndex = 7; + var byteIndex = 0; + + for (var col = this.moduleCount - 1; col > 0; col -= 2) { + + if (col == 6) col--; + + while (true) { + + for (var c = 0; c < 2; c++) { + + if (this.modules[row][col - c] == null) { + + var dark = false; + + if (byteIndex < data.length) { + dark = (((data[byteIndex] >>> bitIndex) & 1) == 1); + } + + var mask = QRUtil.getMask(maskPattern, row, col - c); + + if (mask) { + dark = !dark; + } + + this.modules[row][col - c] = dark; + bitIndex--; + + if (bitIndex == -1) { + byteIndex++; + bitIndex = 7; + } + } + } + + row += inc; + + if (row < 0 || this.moduleCount <= row) { + row -= inc; + inc = -inc; + break; + } + } + } + + } + + }; + + QRCode.PAD0 = 0xEC; + QRCode.PAD1 = 0x11; + + QRCode.createData = function (typeNumber, errorCorrectLevel, dataList) { + + var rsBlocks = QRRSBlock.getRSBlocks(typeNumber, errorCorrectLevel); + + var buffer = new QRBitBuffer(); + + for (var i = 0; i < dataList.length; i++) { + var data = dataList[i]; + buffer.put(data.mode, 4); + buffer.put(data.getLength(), QRUtil.getLengthInBits(data.mode, typeNumber)); + data.write(buffer); + } + + // calc num max data. + var totalDataCount = 0; + for (var i = 0; i < rsBlocks.length; i++) { + totalDataCount += rsBlocks[i].dataCount; + } + + if (buffer.getLengthInBits() > totalDataCount * 8) { + throw new Error("code length overflow. (" + + buffer.getLengthInBits() + + ">" + + totalDataCount * 8 + + ")"); + } + + // end code + if (buffer.getLengthInBits() + 4 <= totalDataCount * 8) { + buffer.put(0, 4); + } + + // padding + while (buffer.getLengthInBits() % 8 != 0) { + buffer.putBit(false); + } + + // padding + while (true) { + + if (buffer.getLengthInBits() >= totalDataCount * 8) { + break; + } + buffer.put(QRCode.PAD0, 8); + + if (buffer.getLengthInBits() >= totalDataCount * 8) { + break; + } + buffer.put(QRCode.PAD1, 8); + } + + return QRCode.createBytes(buffer, rsBlocks); + } + + QRCode.createBytes = function (buffer, rsBlocks) { + + var offset = 0; + + var maxDcCount = 0; + var maxEcCount = 0; + + var dcdata = new Array(rsBlocks.length); + var ecdata = new Array(rsBlocks.length); + + for (var r = 0; r < rsBlocks.length; r++) { + + var dcCount = rsBlocks[r].dataCount; + var ecCount = rsBlocks[r].totalCount - dcCount; + + maxDcCount = Math.max(maxDcCount, dcCount); + maxEcCount = Math.max(maxEcCount, ecCount); + + dcdata[r] = new Array(dcCount); + + for (var i = 0; i < dcdata[r].length; i++) { + dcdata[r][i] = 0xff & buffer.buffer[i + offset]; + } + offset += dcCount; + + var rsPoly = QRUtil.getErrorCorrectPolynomial(ecCount); + var rawPoly = new QRPolynomial(dcdata[r], rsPoly.getLength() - 1); + + var modPoly = rawPoly.mod(rsPoly); + ecdata[r] = new Array(rsPoly.getLength() - 1); + for (var i = 0; i < ecdata[r].length; i++) { + var modIndex = i + modPoly.getLength() - ecdata[r].length; + ecdata[r][i] = (modIndex >= 0) ? modPoly.get(modIndex) : 0; + } + + } + + var totalCodeCount = 0; + for (var i = 0; i < rsBlocks.length; i++) { + totalCodeCount += rsBlocks[i].totalCount; + } + + var data = new Array(totalCodeCount); + var index = 0; + + for (var i = 0; i < maxDcCount; i++) { + for (var r = 0; r < rsBlocks.length; r++) { + if (i < dcdata[r].length) { + data[index++] = dcdata[r][i]; + } + } + } + + for (var i = 0; i < maxEcCount; i++) { + for (var r = 0; r < rsBlocks.length; r++) { + if (i < ecdata[r].length) { + data[index++] = ecdata[r][i]; + } + } + } + + return data; + + } + + //--------------------------------------------------------------------- + // QRMode + //--------------------------------------------------------------------- + + var QRMode = { + MODE_NUMBER: 1 << 0, + MODE_ALPHA_NUM: 1 << 1, + MODE_8BIT_BYTE: 1 << 2, + MODE_KANJI: 1 << 3 + }; + + //--------------------------------------------------------------------- + // QRErrorCorrectLevel + //--------------------------------------------------------------------- + + var QRErrorCorrectLevel = { + L: 1, + M: 0, + Q: 3, + H: 2 + }; + + //--------------------------------------------------------------------- + // QRMaskPattern + //--------------------------------------------------------------------- + + var QRMaskPattern = { + PATTERN000: 0, + PATTERN001: 1, + PATTERN010: 2, + PATTERN011: 3, + PATTERN100: 4, + PATTERN101: 5, + PATTERN110: 6, + PATTERN111: 7 + }; + + //--------------------------------------------------------------------- + // QRUtil + //--------------------------------------------------------------------- + + var QRUtil = { + + PATTERN_POSITION_TABLE: [ + [], + [6, 18], + [6, 22], + [6, 26], + [6, 30], + [6, 34], + [6, 22, 38], + [6, 24, 42], + [6, 26, 46], + [6, 28, 50], + [6, 30, 54], + [6, 32, 58], + [6, 34, 62], + [6, 26, 46, 66], + [6, 26, 48, 70], + [6, 26, 50, 74], + [6, 30, 54, 78], + [6, 30, 56, 82], + [6, 30, 58, 86], + [6, 34, 62, 90], + [6, 28, 50, 72, 94], + [6, 26, 50, 74, 98], + [6, 30, 54, 78, 102], + [6, 28, 54, 80, 106], + [6, 32, 58, 84, 110], + [6, 30, 58, 86, 114], + [6, 34, 62, 90, 118], + [6, 26, 50, 74, 98, 122], + [6, 30, 54, 78, 102, 126], + [6, 26, 52, 78, 104, 130], + [6, 30, 56, 82, 108, 134], + [6, 34, 60, 86, 112, 138], + [6, 30, 58, 86, 114, 142], + [6, 34, 62, 90, 118, 146], + [6, 30, 54, 78, 102, 126, 150], + [6, 24, 50, 76, 102, 128, 154], + [6, 28, 54, 80, 106, 132, 158], + [6, 32, 58, 84, 110, 136, 162], + [6, 26, 54, 82, 110, 138, 166], + [6, 30, 58, 86, 114, 142, 170] + ], + + G15: (1 << 10) | (1 << 8) | (1 << 5) | (1 << 4) | (1 << 2) | (1 << 1) | (1 << 0), + G18: (1 << 12) | (1 << 11) | (1 << 10) | (1 << 9) | (1 << 8) | (1 << 5) | (1 << 2) | (1 << 0), + G15_MASK: (1 << 14) | (1 << 12) | (1 << 10) | (1 << 4) | (1 << 1), + + getBCHTypeInfo: function (data) { + var d = data << 10; + while (QRUtil.getBCHDigit(d) - QRUtil.getBCHDigit(QRUtil.G15) >= 0) { + d ^= (QRUtil.G15 << (QRUtil.getBCHDigit(d) - QRUtil.getBCHDigit(QRUtil.G15))); + } + return ((data << 10) | d) ^ QRUtil.G15_MASK; + }, + + getBCHTypeNumber: function (data) { + var d = data << 12; + while (QRUtil.getBCHDigit(d) - QRUtil.getBCHDigit(QRUtil.G18) >= 0) { + d ^= (QRUtil.G18 << (QRUtil.getBCHDigit(d) - QRUtil.getBCHDigit(QRUtil.G18))); + } + return (data << 12) | d; + }, + + getBCHDigit: function (data) { + + var digit = 0; + + while (data != 0) { + digit++; + data >>>= 1; + } + + return digit; + }, + + getPatternPosition: function (typeNumber) { + return QRUtil.PATTERN_POSITION_TABLE[typeNumber - 1]; + }, + + getMask: function (maskPattern, i, j) { + + switch (maskPattern) { + + case QRMaskPattern.PATTERN000: + return (i + j) % 2 == 0; + case QRMaskPattern.PATTERN001: + return i % 2 == 0; + case QRMaskPattern.PATTERN010: + return j % 3 == 0; + case QRMaskPattern.PATTERN011: + return (i + j) % 3 == 0; + case QRMaskPattern.PATTERN100: + return (Math.floor(i / 2) + Math.floor(j / 3)) % 2 == 0; + case QRMaskPattern.PATTERN101: + return (i * j) % 2 + (i * j) % 3 == 0; + case QRMaskPattern.PATTERN110: + return ((i * j) % 2 + (i * j) % 3) % 2 == 0; + case QRMaskPattern.PATTERN111: + return ((i * j) % 3 + (i + j) % 2) % 2 == 0; + + default: + throw new Error("bad maskPattern:" + maskPattern); + } + }, + + getErrorCorrectPolynomial: function (errorCorrectLength) { + + var a = new QRPolynomial([1], 0); + + for (var i = 0; i < errorCorrectLength; i++) { + a = a.multiply(new QRPolynomial([1, QRMath.gexp(i)], 0)); + } + + return a; + }, + + getLengthInBits: function (mode, type) { + + if (1 <= type && type < 10) { + + // 1 - 9 + + switch (mode) { + case QRMode.MODE_NUMBER: + return 10; + case QRMode.MODE_ALPHA_NUM: + return 9; + case QRMode.MODE_8BIT_BYTE: + return 8; + case QRMode.MODE_KANJI: + return 8; + default: + throw new Error("mode:" + mode); + } + + } else if (type < 27) { + + // 10 - 26 + + switch (mode) { + case QRMode.MODE_NUMBER: + return 12; + case QRMode.MODE_ALPHA_NUM: + return 11; + case QRMode.MODE_8BIT_BYTE: + return 16; + case QRMode.MODE_KANJI: + return 10; + default: + throw new Error("mode:" + mode); + } + + } else if (type < 41) { + + // 27 - 40 + + switch (mode) { + case QRMode.MODE_NUMBER: + return 14; + case QRMode.MODE_ALPHA_NUM: + return 13; + case QRMode.MODE_8BIT_BYTE: + return 16; + case QRMode.MODE_KANJI: + return 12; + default: + throw new Error("mode:" + mode); + } + + } else { + throw new Error("type:" + type); + } + }, + + getLostPoint: function (qrCode) { + + var moduleCount = qrCode.getModuleCount(); + + var lostPoint = 0; + + // LEVEL1 + + for (var row = 0; row < moduleCount; row++) { + + for (var col = 0; col < moduleCount; col++) { + + var sameCount = 0; + var dark = qrCode.isDark(row, col); + + for (var r = -1; r <= 1; r++) { + + if (row + r < 0 || moduleCount <= row + r) { + continue; + } + + for (var c = -1; c <= 1; c++) { + + if (col + c < 0 || moduleCount <= col + c) { + continue; + } + + if (r == 0 && c == 0) { + continue; + } + + if (dark == qrCode.isDark(row + r, col + c)) { + sameCount++; + } + } + } + + if (sameCount > 5) { + lostPoint += (3 + sameCount - 5); + } + } + } + + // LEVEL2 + + for (var row = 0; row < moduleCount - 1; row++) { + for (var col = 0; col < moduleCount - 1; col++) { + var count = 0; + if (qrCode.isDark(row, col)) count++; + if (qrCode.isDark(row + 1, col)) count++; + if (qrCode.isDark(row, col + 1)) count++; + if (qrCode.isDark(row + 1, col + 1)) count++; + if (count == 0 || count == 4) { + lostPoint += 3; + } + } + } + + // LEVEL3 + + for (var row = 0; row < moduleCount; row++) { + for (var col = 0; col < moduleCount - 6; col++) { + if (qrCode.isDark(row, col) && + !qrCode.isDark(row, col + 1) && + qrCode.isDark(row, col + 2) && + qrCode.isDark(row, col + 3) && + qrCode.isDark(row, col + 4) && + !qrCode.isDark(row, col + 5) && + qrCode.isDark(row, col + 6)) { + lostPoint += 40; + } + } + } + + for (var col = 0; col < moduleCount; col++) { + for (var row = 0; row < moduleCount - 6; row++) { + if (qrCode.isDark(row, col) && + !qrCode.isDark(row + 1, col) && + qrCode.isDark(row + 2, col) && + qrCode.isDark(row + 3, col) && + qrCode.isDark(row + 4, col) && + !qrCode.isDark(row + 5, col) && + qrCode.isDark(row + 6, col)) { + lostPoint += 40; + } + } + } + + // LEVEL4 + + var darkCount = 0; + + for (var col = 0; col < moduleCount; col++) { + for (var row = 0; row < moduleCount; row++) { + if (qrCode.isDark(row, col)) { + darkCount++; + } + } + } + + var ratio = Math.abs(100 * darkCount / moduleCount / moduleCount - 50) / 5; + lostPoint += ratio * 10; + + return lostPoint; + } + + }; + + + //--------------------------------------------------------------------- + // QRMath + //--------------------------------------------------------------------- + + var QRMath = { + + glog: function (n) { + + if (n < 1) { + throw new Error("glog(" + n + ")"); + } + + return QRMath.LOG_TABLE[n]; + }, + + gexp: function (n) { + + while (n < 0) { + n += 255; + } + + while (n >= 256) { + n -= 255; + } + + return QRMath.EXP_TABLE[n]; + }, + + EXP_TABLE: new Array(256), + + LOG_TABLE: new Array(256) + + }; + + for (var i = 0; i < 8; i++) { + QRMath.EXP_TABLE[i] = 1 << i; + } + for (var i = 8; i < 256; i++) { + QRMath.EXP_TABLE[i] = QRMath.EXP_TABLE[i - 4] ^ + QRMath.EXP_TABLE[i - 5] ^ + QRMath.EXP_TABLE[i - 6] ^ + QRMath.EXP_TABLE[i - 8]; + } + for (var i = 0; i < 255; i++) { + QRMath.LOG_TABLE[QRMath.EXP_TABLE[i]] = i; + } + + //--------------------------------------------------------------------- + // QRPolynomial + //--------------------------------------------------------------------- + + function QRPolynomial(num, shift) { + + if (num.length == undefined) { + throw new Error(num.length + "/" + shift); + } + + var offset = 0; + + while (offset < num.length && num[offset] == 0) { + offset++; + } + + this.num = new Array(num.length - offset + shift); + for (var i = 0; i < num.length - offset; i++) { + this.num[i] = num[i + offset]; + } + } + + QRPolynomial.prototype = { + + get: function (index) { + return this.num[index]; + }, + + getLength: function () { + return this.num.length; + }, + + multiply: function (e) { + + var num = new Array(this.getLength() + e.getLength() - 1); + + for (var i = 0; i < this.getLength(); i++) { + for (var j = 0; j < e.getLength(); j++) { + num[i + j] ^= QRMath.gexp(QRMath.glog(this.get(i)) + QRMath.glog(e.get(j))); + } + } + + return new QRPolynomial(num, 0); + }, + + mod: function (e) { + + if (this.getLength() - e.getLength() < 0) { + return this; + } + + var ratio = QRMath.glog(this.get(0)) - QRMath.glog(e.get(0)); + + var num = new Array(this.getLength()); + + for (var i = 0; i < this.getLength(); i++) { + num[i] = this.get(i); + } + + for (var i = 0; i < e.getLength(); i++) { + num[i] ^= QRMath.gexp(QRMath.glog(e.get(i)) + ratio); + } + + // recursive call + return new QRPolynomial(num, 0).mod(e); + } + }; + + //--------------------------------------------------------------------- + // QRRSBlock + //--------------------------------------------------------------------- + + function QRRSBlock(totalCount, dataCount) { + this.totalCount = totalCount; + this.dataCount = dataCount; + } + + QRRSBlock.RS_BLOCK_TABLE = [ + + // L + // M + // Q + // H + + // 1 + [1, 26, 19], + [1, 26, 16], + [1, 26, 13], + [1, 26, 9], + + // 2 + [1, 44, 34], + [1, 44, 28], + [1, 44, 22], + [1, 44, 16], + + // 3 + [1, 70, 55], + [1, 70, 44], + [2, 35, 17], + [2, 35, 13], + + // 4 + [1, 100, 80], + [2, 50, 32], + [2, 50, 24], + [4, 25, 9], + + // 5 + [1, 134, 108], + [2, 67, 43], + [2, 33, 15, 2, 34, 16], + [2, 33, 11, 2, 34, 12], + + // 6 + [2, 86, 68], + [4, 43, 27], + [4, 43, 19], + [4, 43, 15], + + // 7 + [2, 98, 78], + [4, 49, 31], + [2, 32, 14, 4, 33, 15], + [4, 39, 13, 1, 40, 14], + + // 8 + [2, 121, 97], + [2, 60, 38, 2, 61, 39], + [4, 40, 18, 2, 41, 19], + [4, 40, 14, 2, 41, 15], + + // 9 + [2, 146, 116], + [3, 58, 36, 2, 59, 37], + [4, 36, 16, 4, 37, 17], + [4, 36, 12, 4, 37, 13], + + // 10 + [2, 86, 68, 2, 87, 69], + [4, 69, 43, 1, 70, 44], + [6, 43, 19, 2, 44, 20], + [6, 43, 15, 2, 44, 16], + + // 11 + [4, 101, 81], + [1, 80, 50, 4, 81, 51], + [4, 50, 22, 4, 51, 23], + [3, 36, 12, 8, 37, 13], + + // 12 + [2, 116, 92, 2, 117, 93], + [6, 58, 36, 2, 59, 37], + [4, 46, 20, 6, 47, 21], + [7, 42, 14, 4, 43, 15], + + // 13 + [4, 133, 107], + [8, 59, 37, 1, 60, 38], + [8, 44, 20, 4, 45, 21], + [12, 33, 11, 4, 34, 12], + + // 14 + [3, 145, 115, 1, 146, 116], + [4, 64, 40, 5, 65, 41], + [11, 36, 16, 5, 37, 17], + [11, 36, 12, 5, 37, 13], + + // 15 + [5, 109, 87, 1, 110, 88], + [5, 65, 41, 5, 66, 42], + [5, 54, 24, 7, 55, 25], + [11, 36, 12], + + // 16 + [5, 122, 98, 1, 123, 99], + [7, 73, 45, 3, 74, 46], + [15, 43, 19, 2, 44, 20], + [3, 45, 15, 13, 46, 16], + + // 17 + [1, 135, 107, 5, 136, 108], + [10, 74, 46, 1, 75, 47], + [1, 50, 22, 15, 51, 23], + [2, 42, 14, 17, 43, 15], + + // 18 + [5, 150, 120, 1, 151, 121], + [9, 69, 43, 4, 70, 44], + [17, 50, 22, 1, 51, 23], + [2, 42, 14, 19, 43, 15], + + // 19 + [3, 141, 113, 4, 142, 114], + [3, 70, 44, 11, 71, 45], + [17, 47, 21, 4, 48, 22], + [9, 39, 13, 16, 40, 14], + + // 20 + [3, 135, 107, 5, 136, 108], + [3, 67, 41, 13, 68, 42], + [15, 54, 24, 5, 55, 25], + [15, 43, 15, 10, 44, 16], + + // 21 + [4, 144, 116, 4, 145, 117], + [17, 68, 42], + [17, 50, 22, 6, 51, 23], + [19, 46, 16, 6, 47, 17], + + // 22 + [2, 139, 111, 7, 140, 112], + [17, 74, 46], + [7, 54, 24, 16, 55, 25], + [34, 37, 13], + + // 23 + [4, 151, 121, 5, 152, 122], + [4, 75, 47, 14, 76, 48], + [11, 54, 24, 14, 55, 25], + [16, 45, 15, 14, 46, 16], + + // 24 + [6, 147, 117, 4, 148, 118], + [6, 73, 45, 14, 74, 46], + [11, 54, 24, 16, 55, 25], + [30, 46, 16, 2, 47, 17], + + // 25 + [8, 132, 106, 4, 133, 107], + [8, 75, 47, 13, 76, 48], + [7, 54, 24, 22, 55, 25], + [22, 45, 15, 13, 46, 16], + + // 26 + [10, 142, 114, 2, 143, 115], + [19, 74, 46, 4, 75, 47], + [28, 50, 22, 6, 51, 23], + [33, 46, 16, 4, 47, 17], + + // 27 + [8, 152, 122, 4, 153, 123], + [22, 73, 45, 3, 74, 46], + [8, 53, 23, 26, 54, 24], + [12, 45, 15, 28, 46, 16], + + // 28 + [3, 147, 117, 10, 148, 118], + [3, 73, 45, 23, 74, 46], + [4, 54, 24, 31, 55, 25], + [11, 45, 15, 31, 46, 16], + + // 29 + [7, 146, 116, 7, 147, 117], + [21, 73, 45, 7, 74, 46], + [1, 53, 23, 37, 54, 24], + [19, 45, 15, 26, 46, 16], + + // 30 + [5, 145, 115, 10, 146, 116], + [19, 75, 47, 10, 76, 48], + [15, 54, 24, 25, 55, 25], + [23, 45, 15, 25, 46, 16], + + // 31 + [13, 145, 115, 3, 146, 116], + [2, 74, 46, 29, 75, 47], + [42, 54, 24, 1, 55, 25], + [23, 45, 15, 28, 46, 16], + + // 32 + [17, 145, 115], + [10, 74, 46, 23, 75, 47], + [10, 54, 24, 35, 55, 25], + [19, 45, 15, 35, 46, 16], + + // 33 + [17, 145, 115, 1, 146, 116], + [14, 74, 46, 21, 75, 47], + [29, 54, 24, 19, 55, 25], + [11, 45, 15, 46, 46, 16], + + // 34 + [13, 145, 115, 6, 146, 116], + [14, 74, 46, 23, 75, 47], + [44, 54, 24, 7, 55, 25], + [59, 46, 16, 1, 47, 17], + + // 35 + [12, 151, 121, 7, 152, 122], + [12, 75, 47, 26, 76, 48], + [39, 54, 24, 14, 55, 25], + [22, 45, 15, 41, 46, 16], + + // 36 + [6, 151, 121, 14, 152, 122], + [6, 75, 47, 34, 76, 48], + [46, 54, 24, 10, 55, 25], + [2, 45, 15, 64, 46, 16], + + // 37 + [17, 152, 122, 4, 153, 123], + [29, 74, 46, 14, 75, 47], + [49, 54, 24, 10, 55, 25], + [24, 45, 15, 46, 46, 16], + + // 38 + [4, 152, 122, 18, 153, 123], + [13, 74, 46, 32, 75, 47], + [48, 54, 24, 14, 55, 25], + [42, 45, 15, 32, 46, 16], + + // 39 + [20, 147, 117, 4, 148, 118], + [40, 75, 47, 7, 76, 48], + [43, 54, 24, 22, 55, 25], + [10, 45, 15, 67, 46, 16], + + // 40 + [19, 148, 118, 6, 149, 119], + [18, 75, 47, 31, 76, 48], + [34, 54, 24, 34, 55, 25], + [20, 45, 15, 61, 46, 16] + ]; + + QRRSBlock.getRSBlocks = function (typeNumber, errorCorrectLevel) { + + var rsBlock = QRRSBlock.getRsBlockTable(typeNumber, errorCorrectLevel); + + if (rsBlock == undefined) { + throw new Error("bad rs block @ typeNumber:" + typeNumber + "/errorCorrectLevel:" + errorCorrectLevel); + } + + var length = rsBlock.length / 3; + + var list = new Array(); + + for (var i = 0; i < length; i++) { + + var count = rsBlock[i * 3 + 0]; + var totalCount = rsBlock[i * 3 + 1]; + var dataCount = rsBlock[i * 3 + 2]; + + for (var j = 0; j < count; j++) { + list.push(new QRRSBlock(totalCount, dataCount)); + } + } + + return list; + } + + QRRSBlock.getRsBlockTable = function (typeNumber, errorCorrectLevel) { + + switch (errorCorrectLevel) { + case QRErrorCorrectLevel.L: + return QRRSBlock.RS_BLOCK_TABLE[(typeNumber - 1) * 4 + 0]; + case QRErrorCorrectLevel.M: + return QRRSBlock.RS_BLOCK_TABLE[(typeNumber - 1) * 4 + 1]; + case QRErrorCorrectLevel.Q: + return QRRSBlock.RS_BLOCK_TABLE[(typeNumber - 1) * 4 + 2]; + case QRErrorCorrectLevel.H: + return QRRSBlock.RS_BLOCK_TABLE[(typeNumber - 1) * 4 + 3]; + default: + return undefined; + } + } + + //--------------------------------------------------------------------- + // QRBitBuffer + //--------------------------------------------------------------------- + + function QRBitBuffer() { + this.buffer = new Array(); + this.length = 0; + } + + QRBitBuffer.prototype = { + + get: function (index) { + var bufIndex = Math.floor(index / 8); + return ((this.buffer[bufIndex] >>> (7 - index % 8)) & 1) == 1; + }, + + put: function (num, length) { + for (var i = 0; i < length; i++) { + this.putBit(((num >>> (length - i - 1)) & 1) == 1); + } + }, + + getLengthInBits: function () { + return this.length; + }, + + putBit: function (bit) { + + var bufIndex = Math.floor(this.length / 8); + if (this.buffer.length <= bufIndex) { + this.buffer.push(0); + } + + if (bit) { + this.buffer[bufIndex] |= (0x80 >>> (this.length % 8)); + } + + this.length++; + } + }; + + //--------------------------------------------------------------------- + // Support Chinese + //--------------------------------------------------------------------- + function utf16To8(text) { + var result = ''; + var c; + for (var i = 0; i < text.length; i++) { + c = text.charCodeAt(i); + if (c >= 0x0001 && c <= 0x007F) { + result += text.charAt(i); + } else if (c > 0x07FF) { + result += String.fromCharCode(0xE0 | c >> 12 & 0x0F); + result += String.fromCharCode(0x80 | c >> 6 & 0x3F); + result += String.fromCharCode(0x80 | c >> 0 & 0x3F); + } else { + result += String.fromCharCode(0xC0 | c >> 6 & 0x1F); + result += String.fromCharCode(0x80 | c >> 0 & 0x3F); + } + } + return result; + } + + uQRCode = { + + errorCorrectLevel: QRErrorCorrectLevel, + + defaults: { + size: 354, + margin: 0, + backgroundColor: '#ffffff', + foregroundColor: '#000000', + errorCorrectLevel: QRErrorCorrectLevel.H, + typeNumber: -1 + }, + + make: function (canvas, ctx, options) { + var defaultOptions = { + x: 0, + y: 0, + text: options.text, + size: this.defaults.size, + margin: this.defaults.margin, + backgroundColor: this.defaults.backgroundColor, + foregroundColor: this.defaults.foregroundColor, + errorCorrectLevel: this.defaults.errorCorrectLevel, + typeNumber: this.defaults.typeNumber + }; + if (options) { + for (var i in options) { + defaultOptions[i] = options[i]; + } + } + options = defaultOptions; + + var qrcode = new QRCode(options.typeNumber, options.errorCorrectLevel); + qrcode.addData(utf16To8(options.text)); + qrcode.make(); + + ctx.fill + ctx.fillStyle = options.backgroundColor; + ctx.fillRect(options.x, options.y, options.size, options.size); + + var tileW = (options.size - options.margin * 2) / qrcode.getModuleCount(); + var tileH = tileW; + + for (var row = 0; row < qrcode.getModuleCount(); row++) { + for (var col = 0; col < qrcode.getModuleCount(); col++) { + var style = qrcode.isDark(row, col) ? options.foregroundColor : options.backgroundColor; + ctx.fillStyle = style + var x = Math.round(col * tileW) + options.margin; + var y = Math.round(row * tileH) + options.margin; + var w = Math.ceil((col + 1) * tileW) - Math.floor(col * tileW); + var h = Math.ceil((row + 1) * tileW) - Math.floor(row * tileW); + ctx.fillRect(options.x + x, options.y + y, w, h); + } + } + } + } + +})() + +export default uQRCode \ No newline at end of file diff --git a/js_sdk/u-draw-poster/index.d.ts b/js_sdk/u-draw-poster/index.d.ts new file mode 100644 index 00000000..add931f9 --- /dev/null +++ b/js_sdk/u-draw-poster/index.d.ts @@ -0,0 +1,11 @@ +import { DrawPosterBuildOpts } from "./utils/interface"; +import DrawPoster from "./draw-poster"; +import drawQrCode from "./extends/draw-qr-code/index"; +import createFromList from './extends/create-from-list/index'; +import drawPainter from './extends/draw-painter/index'; +declare const useDrawPoster: (options: string | DrawPosterBuildOpts) => Promise; +declare const useDrawPosters: (optionsAll: (string | DrawPosterBuildOpts)[]) => Promise<{ + [key: string]: DrawPoster & import("./utils/interface").drawPosterExtends; +}>; +export { DrawPoster, useDrawPoster, useDrawPosters, drawQrCode, drawPainter, createFromList }; +export default DrawPoster; diff --git a/js_sdk/u-draw-poster/index.js b/js_sdk/u-draw-poster/index.js new file mode 100644 index 00000000..2b093985 --- /dev/null +++ b/js_sdk/u-draw-poster/index.js @@ -0,0 +1,22 @@ +import * as dfucs from "./extends/draw-function/index"; +import DrawPoster from "./draw-poster"; +import drawQrCode from "./extends/draw-qr-code/index"; +import createFromList from './extends/create-from-list/index'; +import drawPainter from './extends/draw-painter/index'; +DrawPoster.useCtx(dfucs.drawImage); +DrawPoster.useCtx(dfucs.fillWarpText); +DrawPoster.useCtx(dfucs.roundRect); +DrawPoster.useCtx(dfucs.fillRoundRect); +DrawPoster.useCtx(dfucs.strokeRoundRect); +DrawPoster.useCtx(dfucs.drawRoundImage); +DrawPoster.useCtx(dfucs.drawImageFit); +const useDrawPoster = async (options) => { + const dp = await DrawPoster.build(options); + return dp; +}; +const useDrawPosters = async (optionsAll) => { + const dps = await DrawPoster.buildAll(optionsAll); + return dps; +}; +export { DrawPoster, useDrawPoster, useDrawPosters, drawQrCode, drawPainter, createFromList }; +export default DrawPoster; diff --git a/js_sdk/u-draw-poster/package.json b/js_sdk/u-draw-poster/package.json new file mode 100644 index 00000000..11080014 --- /dev/null +++ b/js_sdk/u-draw-poster/package.json @@ -0,0 +1,13 @@ +{ + "id": "u-draw-poster", + "name": "u-draw-poster uniVue2|3适用 海报绘制工具", + "version": "1.1.5", + "description": "全端支持,内置多种海报绘制方法、表单绘制、二维码生成,图片裁剪。原生开发体验,上手快,不污染组件数据", + "keywords": [ + "海报", + "绘制", + "分享", + "小程序", + "canvas" + ] +} \ No newline at end of file diff --git a/js_sdk/u-draw-poster/utils/global.d.ts b/js_sdk/u-draw-poster/utils/global.d.ts new file mode 100644 index 00000000..9acdfe78 --- /dev/null +++ b/js_sdk/u-draw-poster/utils/global.d.ts @@ -0,0 +1,7 @@ +/// +/** 当前环境类型 */ +export declare type UniPlatforms = 'app-plus' | 'app-plus-nvue' | 'h5' | 'mp-weixin' | 'mp-alipay' | 'mp-baidu' | 'mp-toutiao' | 'mp-qq' | 'mp-360' | 'mp' | 'quickapp-webview' | 'quickapp-webview-union' | 'quickapp-webview-huawei' | undefined; +export declare const PLATFORM: UniPlatforms; +/** 全局对象 */ +declare const _uni: UniApp.Uni; +export default _uni; diff --git a/js_sdk/u-draw-poster/utils/global.js b/js_sdk/u-draw-poster/utils/global.js new file mode 100644 index 00000000..872b77d8 --- /dev/null +++ b/js_sdk/u-draw-poster/utils/global.js @@ -0,0 +1,11 @@ +var _a; +export const PLATFORM = typeof process !== 'undefined' ? (_a = process === null || process === void 0 ? void 0 : process.env) === null || _a === void 0 ? void 0 : _a.VUE_APP_PLATFORM : undefined; +/** 全局对象 */ +const _uni = (function () { + if (typeof uni != "undefined") + return uni; + if (typeof wx != "undefined") + return wx; + return uni; +})(); +export default _uni; diff --git a/js_sdk/u-draw-poster/utils/interface.d.ts b/js_sdk/u-draw-poster/utils/interface.d.ts new file mode 100644 index 00000000..6fb9a5c5 --- /dev/null +++ b/js_sdk/u-draw-poster/utils/interface.d.ts @@ -0,0 +1,175 @@ +/// +import DrawPoster from "../draw-poster"; +import { ImageFitOption } from '../extends/draw-function/draw-image-fit'; +import { CreateLayerOpts, DrawRowOpt } from "../extends/create-from-list"; +import { PainterContainerOption } from "../extends/draw-painter"; +/** 绘制容器 */ +export declare type Execute = Array<() => Promise>; +export interface drawPosterExtends { + from: { + height: number; + padding: number; + margin: number; + }; + createLayer: (afferOpts: CreateLayerOpts, rowList: DrawRowOpt[]) => number; + setFromOptions: (opts: Partial<{ + height: number; + padding: number; + margin: number; + }>) => void; + gcanvas: { + WeexBridge: any; + Image: any; + enable: (el: any, options: { + bridge?: any; + debug?: boolean; + disableAutoSwap?: any; + disableComboCommands?: any; + }) => Canvas; + }; + painter: (option: PainterContainerOption) => void; +} +/** 构建器配置 */ +export interface DrawPosterBuildOpts { + /** 查询选择器; 注意不需要加# */ + selector: string; + /** 选取组件范围 */ + componentThis?: any; + /** 绘制类型为2d绘制, 默认开启, 在微信小程序的时候动态加载 */ + type2d?: boolean; + /** 是否在绘制时进行加载提示 */ + loading?: boolean; + /** 当存在绘制图片时, 等待绘画完毕的时间(秒)仅App中生效 + * + * 具体查看文档说明:https://github.com/TuiMao233/uni-draw-poster + */ + drawImageTime?: number; + /** 是否开启调试模式 */ + debugging?: boolean; + /** 加载提示文字 */ + loadingText?: string; + /** 创建图片提示文字 */ + createText?: string; + /** 是否启动gcanvas(nvue) */ + gcanvas?: boolean; +} +/** 绘制换行配置 */ +export interface FillWarpTextOpts { + text: string; + maxWidth?: number; + lineHeight?: number; + layer?: number; + x?: number; + y?: number; + splitText?: string; + notFillText?: boolean; +} +/** 绘制二维码配置 */ +export interface DrawQrCodeOpts { + text: string; + x?: number; + y?: number; + size?: number; + margin?: number; + backgroundColor?: string; + foregroundColor?: string; +} +/** 绘制换行, 单行信息 */ +export interface FillWarpTextItemInfo { + text: string; + y: number; + x: number; +} +/** 绘制画笔 */ +export interface DrawPosterCanvasCtx extends UniApp.CanvasContext { + [key: string]: any; + createImageData: () => ImageData; + textAlign: CanvasTextDrawingStyles["textAlign"]; + textBaseline: CanvasTextDrawingStyles["textBaseline"]; + transform: CanvasTransform["transform"]; + /** 绘制图片原型 */ + drawImageProto: UniApp.CanvasContext['drawImage']; + /** 当前绘制类型 */ + drawType: 'context' | 'type2d'; + /** 等待绘制图片 + * + * 说明文档: https://tuimao233.gitee.io/mao-blog/my-extends/u-draw-poste + */ + drawImage(url: string, dx?: number | undefined, dy?: number | undefined, dWidth?: number | undefined, dHeigt?: number | undefined, sx?: number | undefined, sy?: number | undefined, sWidth?: number | undefined, sHeight?: number | undefined): Promise; + /** 绘制圆角图片 + * + * 说明文档: https://tuimao233.gitee.io/mao-blog/my-extends/u-draw-poste + */ + drawRoundImage(url: string, x: number, y: number, w: number, h: number, r?: number): Promise; + /** 绘制 Object-Fit 模式图片 + * + * 说明文档: https://tuimao233.gitee.io/mao-blog/my-extends/u-draw-poste + */ + drawImageFit(url: string, opts?: ImageFitOption): Promise; + /** 绘制换行字体 + * + * 说明文档: https://tuimao233.gitee.io/mao-blog/my-extends/u-draw-poste + */ + fillWarpText(options: FillWarpTextOpts): Array; + /** 绘制圆角矩形(原型) + * + */ + roundRect(x: number, y: number, w: number, h: number, r: number, fill?: boolean, stroke?: boolean): void; + /** 绘制圆角矩形(填充) + * + * 说明文档: https://tuimao233.gitee.io/mao-blog/my-extends/u-draw-poste + */ + fillRoundRect(x: number, y: number, w: number, h: number, r: number): void; + /** 绘制圆角矩形(边框) + * + * 说明文档: https://tuimao233.gitee.io/mao-blog/my-extends/u-draw-poste + */ + strokeRoundRect(x: number, y: number, w: number, h: number, r: number): void; + /** 绘制二维码 + * + * 说明文档: https://tuimao233.gitee.io/mao-blog/my-extends/u-draw-poste + */ + drawQrCode(options: DrawQrCodeOpts): void; +} +/** Canvas2d实例 */ +export interface Canvas { + width: number; + height: number; + getContext(contextType: "2d" | "webgl"): DrawPosterCanvasCtx | WebGLRenderingContext; + createImage(): { + src: string; + width: number; + height: number; + onload: () => void; + onerror: () => void; + }; + requestAnimationFrame(callback: Function): number; + cancelAnimationFrame(requestID: number): void; + createImageData(): ImageData; + createPath2D(path: Path2D): Path2D; + toDataURL(type: string, encoderOptions: number): string; +} +/** 创建图片路径配置项 */ +export interface CreateImagePathOptions { + x?: number; + y?: number; + width?: number; + height?: number; + destWidth?: number; + destHeight?: number; +} +/** 绘制实例扩展配置 */ +export interface DrawPosterUseOpts { + name: string; + init?: (dp: InstanceType) => void; + handle: (dp: InstanceType, ...args: any[]) => any; + createImage?: (dp: InstanceType) => void; + [key: string]: any; +} +/** 绘制画笔实例扩展配置 */ +export interface DrawPosterUseCtxOpts { + name: string; + init?: (canvas: Canvas, ctx: DrawPosterCanvasCtx) => void; + handle: (canvas: Canvas, ctx: DrawPosterCanvasCtx, ...args: any[]) => any; + [key: string]: any; +} diff --git a/js_sdk/u-draw-poster/utils/interface.js b/js_sdk/u-draw-poster/utils/interface.js new file mode 100644 index 00000000..509db186 --- /dev/null +++ b/js_sdk/u-draw-poster/utils/interface.js @@ -0,0 +1 @@ +export {}; diff --git a/js_sdk/u-draw-poster/utils/object-sizing.d.ts b/js_sdk/u-draw-poster/utils/object-sizing.d.ts new file mode 100644 index 00000000..2774fa74 --- /dev/null +++ b/js_sdk/u-draw-poster/utils/object-sizing.d.ts @@ -0,0 +1,38 @@ +export declare type ObjectFit = "contain" | "cover"; +export declare type ObjectPosition = ["left" | "center" | "right", "top" | "center" | "bottom"]; +export interface Size { + width: number; + height: number; +} +/** + * 用于计算图片的宽高比例 + * @see https://drafts.csswg.org/css-images-3/#sizing-terms + * + * ## 名词解释 + * ### intrinsic dimensions + * 图片本身的尺寸 + * + * ### specified size + * 用户指定的元素尺寸 + * + * ### concrete object size + * 应用了 `objectFit` 之后图片的显示尺寸 + * + * ### default object size + */ +export declare function calculateConcreteRect(style: { + /** @see https://developer.mozilla.org/zh-CN/docs/Web/CSS/object-fit */ + objectFit?: ObjectFit; + /** @see https://developer.mozilla.org/zh-CN/docs/Web/CSS/object-position */ + intrinsicPosition?: ObjectPosition; + specifiedPosition?: [number, number]; +}, intrinsicSize: Size, specifiedSize: Size): { + sx: number; + sy: number; + sw: number; + sh: number; + dx: number; + dy: number; + dw: number; + dh: number; +}; diff --git a/js_sdk/u-draw-poster/utils/object-sizing.js b/js_sdk/u-draw-poster/utils/object-sizing.js new file mode 100644 index 00000000..8a2ceca1 --- /dev/null +++ b/js_sdk/u-draw-poster/utils/object-sizing.js @@ -0,0 +1,78 @@ +/** + * 用于计算图片的宽高比例 + * @see https://drafts.csswg.org/css-images-3/#sizing-terms + * + * ## 名词解释 + * ### intrinsic dimensions + * 图片本身的尺寸 + * + * ### specified size + * 用户指定的元素尺寸 + * + * ### concrete object size + * 应用了 `objectFit` 之后图片的显示尺寸 + * + * ### default object size + */ +export function calculateConcreteRect(style, intrinsicSize, specifiedSize) { + var _a, _b; + const isContain = style.objectFit === 'contain'; + const specifiedPosition = style.specifiedPosition || [0, 0]; + // ratio 越大表示矩形越"扁" + let intrinsicRatio = intrinsicSize.width / intrinsicSize.height; + let specifiedRatio = specifiedSize.width / specifiedSize.height; + /** 图片原始尺寸与最终尺寸之比 */ + let concreteScale = 1; + if (intrinsicRatio > specifiedRatio && style.objectFit == "contain" || + intrinsicRatio <= specifiedRatio && style.objectFit == "cover") + // 图片较"胖"时完整显示图片,图片较"瘦"时完全覆盖容器 + // 这两种情况下有 concreteRect.width = specifiedSize.width + // 因为 concreteRect.width = intrinsicSize.width * concreteScale + // 所以: + concreteScale = specifiedSize.width / intrinsicSize.width; + else if (intrinsicRatio > specifiedRatio && style.objectFit == "cover" || + intrinsicRatio <= specifiedRatio && style.objectFit == "contain") + // 图片较"瘦"时完整显示图片,图片较"胖"时完全覆盖容器 + // 这两种情况下有 concreteRect.height = specifiedSize.height + // 因为 concreteRect.height = intrinsicSize.height * concreteScale + // 所以: + concreteScale = specifiedSize.height / intrinsicSize.height; + else + throw new Error("Unkonwn concreteScale"); + let concreteRectWidth = intrinsicSize.width * concreteScale; + let concreteRectHeight = intrinsicSize.height * concreteScale; + // 这里可以把 left top 的计算想象成投影 + let xRelativeOrigin = { left: 0, center: .5, right: 1 }[((_a = style.intrinsicPosition) === null || _a === void 0 ? void 0 : _a[0]) || "center"]; + let yRelativeOrigin = { top: 0, center: .5, bottom: 1 }[((_b = style.intrinsicPosition) === null || _b === void 0 ? void 0 : _b[1]) || "center"]; + let concreteRectLeft = (specifiedSize.width - concreteRectWidth) * xRelativeOrigin; + let concreteRectTop = (specifiedSize.height - concreteRectHeight) * yRelativeOrigin; + if (isContain) { + concreteRectLeft += specifiedPosition[0]; + concreteRectTop += specifiedPosition[1]; + } + // 这里有两个坐标系,一个是 specified (dist) 的坐标系,一个是 intrinsic (src) 的坐标系 + // 这里将两个坐标系的点位置进行变换 + // 例: 带入 x=0, y=0, 得到的结果就是 specifiedRect 的左上角在 intrinsic 坐标系下的坐标位置 + // 在 specified 坐标系下, intrinsic 的零点在 (concreteRectLeft, concreteRectTop), 缩放为 concreteScale + // 所以有 x_dist = x_src * concreteScale + concreteRectLeft + // y_dist = y_src * concreteScale + concreteRectTop + let dist2src = (distX, distY) => [ + /* srcX = */ (distX - concreteRectLeft) / concreteScale, + /* srcY = */ (distY - concreteRectTop) / concreteScale + ]; + let [srcLeft, srcTop] = dist2src(0, 0); + // srcRight = 图片 specified 框右边在 src 坐标系下的 x 坐标 + // srcBottom = 图片 specified 框下边在 src 坐标系下的 y 坐标 + let [srcRight, srcBottom] = dist2src(specifiedSize.width, specifiedSize.height); + // 这里要对 src 和 disc 两个框进行约束 + return { + sx: Math.max(srcLeft, 0), + sy: Math.max(srcTop, 0), + sw: Math.min(srcRight - srcLeft, intrinsicSize.width), + sh: Math.min(srcBottom - srcTop, intrinsicSize.height), + dx: isContain ? Math.max(concreteRectLeft, 0) : specifiedPosition[0], + dy: isContain ? Math.max(concreteRectTop, 0) : specifiedPosition[1], + dw: Math.min(concreteRectWidth, specifiedSize.width), + dh: Math.min(concreteRectHeight, specifiedSize.height) + }; +} diff --git a/js_sdk/u-draw-poster/utils/utils.d.ts b/js_sdk/u-draw-poster/utils/utils.d.ts new file mode 100644 index 00000000..6d279248 --- /dev/null +++ b/js_sdk/u-draw-poster/utils/utils.d.ts @@ -0,0 +1,20 @@ +import { DrawPosterBuildOpts } from "./interface"; +/** 是否是base64本地地址 */ +export declare const isBaseUrl: (str: string) => boolean; +/** 是否是小程序本地地址 */ +export declare const isTmpUrl: (str: string) => boolean; +/** 是否是网络地址 */ +export declare const isNetworkUrl: (str: string) => boolean; +/** 对象target挂载到对象current */ +export declare const extendMount: (current: Record, target: Record, handle?: (extend: Function, target?: Record | undefined) => any) => void; +/** 处理构建配置 */ +export declare const handleBuildOpts: (options: string | DrawPosterBuildOpts) => { + selector: string; + componentThis: any; + type2d: boolean; + loading: boolean; + debugging: boolean; + loadingText: string; + createText: string; + gcanvas: boolean; +}; diff --git a/js_sdk/u-draw-poster/utils/utils.js b/js_sdk/u-draw-poster/utils/utils.js new file mode 100644 index 00000000..8f388127 --- /dev/null +++ b/js_sdk/u-draw-poster/utils/utils.js @@ -0,0 +1,49 @@ +import { PLATFORM } from "./global"; +/** 是否是base64本地地址 */ +export const isBaseUrl = (str) => { + return /^\s*data:(?:[a-z]+\/[a-z0-9-+.]+(?:;[a-z-]+=[a-z0-9-]+)?)?(?:;base64)?,([a-z0-9!$&',()*+;=\-._~:@\/?%\s]*?)\s*$/i.test(str); +}; +/** 是否是小程序本地地址 */ +export const isTmpUrl = (str) => { + return /http:\/\/temp\/wx/.test(str); +}; +/** 是否是网络地址 */ +export const isNetworkUrl = (str) => { + return /^(((ht|f)tps?):\/\/)?[\w-]+(\.[\w-]+)+([\w.,@?^=%&:/~+#-]*[\w@?^=%&/~+#-])?$/.test(str); +}; +/** 对象target挂载到对象current */ +export const extendMount = (current, target, handle = (extend, target) => undefined) => { + for (const key in target) { + current[key] = handle(target[key].handle, target[key]) || target[key].handle; + } +}; +/** 处理构建配置 */ +export const handleBuildOpts = (options) => { + let defaultOpts = { + selector: '', + componentThis: undefined, + type2d: true, + loading: false, + debugging: false, + loadingText: '绘制海报中...', + createText: '生成图片中...', + gcanvas: false + }; + if (typeof options === "string") { + defaultOpts.selector = options; + } + else { + defaultOpts = Object.assign(Object.assign({}, defaultOpts), options); + } + const oldSelector = defaultOpts.selector; + if (PLATFORM === 'mp-weixin' && defaultOpts.type2d) { + defaultOpts.selector = '#' + defaultOpts.selector; + } + if (!PLATFORM) { + console.error('注意! draw-poster未开启uni条件编译! 当环境是微信小程序将不会动态切换为type2d模式'); + console.error(`请在vue.config.js中的transpileDependencies中添加'uni-draw-poster'`); + console.error(`或者可以在选择器字符串前缀中添加#来切换为type2d绘制`); + defaultOpts.selector = oldSelector; + } + return defaultOpts; +}; diff --git a/js_sdk/u-draw-poster/utils/wx-utils.d.ts b/js_sdk/u-draw-poster/utils/wx-utils.d.ts new file mode 100644 index 00000000..9027ce6a --- /dev/null +++ b/js_sdk/u-draw-poster/utils/wx-utils.d.ts @@ -0,0 +1,3 @@ +import { Canvas } from "./interface"; +export declare const downloadImgUrl: (url: string) => Promise; +export declare const getCanvas2dContext: (selector: string, componentThis?: any) => Promise; diff --git a/js_sdk/u-draw-poster/utils/wx-utils.js b/js_sdk/u-draw-poster/utils/wx-utils.js new file mode 100644 index 00000000..0d11c4b9 --- /dev/null +++ b/js_sdk/u-draw-poster/utils/wx-utils.js @@ -0,0 +1,37 @@ +/* + * @Author: Mr.Mao + * @LastEditors: Mr.Mao + * @Date: 2020-10-12 08:49:27 + * @LastEditTime: 2020-12-09 13:54:10 + * @Description: + * @任何一个傻子都能写出让电脑能懂的代码,而只有好的程序员可以写出让人能看懂的代码 + */ +import uni from "./global"; +import { isBaseUrl, isNetworkUrl, isTmpUrl } from './utils'; +// 下载指定地址图片, 如果不符合下载图片, 则直接返回 +export const downloadImgUrl = (url) => { + const isLocalFile = isBaseUrl(url) || isTmpUrl(url) || !isNetworkUrl(url); + return new Promise((resolve, reject) => { + if (isLocalFile) { + return resolve(url); + } + uni.downloadFile({ + url, + success: (res) => resolve(res.tempFilePath), + fail: reject + }); + }); +}; +// 获取当前指定 node 节点 +export const getCanvas2dContext = (selector, componentThis) => { + return new Promise(resolve => { + const query = (componentThis ? + uni.createSelectorQuery().in(componentThis) : + uni.createSelectorQuery()); + query.select(selector) + .fields({ node: true }, res => { + const node = res === null || res === void 0 ? void 0 : res.node; + resolve(node || {}); + }).exec(); + }); +}; diff --git a/js_sdk/wa-permission/permission.js b/js_sdk/wa-permission/permission.js new file mode 100644 index 00000000..c40dfb27 --- /dev/null +++ b/js_sdk/wa-permission/permission.js @@ -0,0 +1,273 @@ +/** + * 本模块封装了Android、iOS的应用权限判断、打开应用权限设置界面、以及位置系统服务是否开启 + * https://ext.dcloud.net.cn/plugin?id=594 + */ + +var isIos +// #ifdef APP-PLUS +isIos = (plus.os.name == "iOS") +// #endif + +// 判断推送权限是否开启 +function judgeIosPermissionPush() { + var result = false; + var UIApplication = plus.ios.import("UIApplication"); + var app = UIApplication.sharedApplication(); + var enabledTypes = 0; + if (app.currentUserNotificationSettings) { + var settings = app.currentUserNotificationSettings(); + enabledTypes = settings.plusGetAttribute("types"); + console.log("enabledTypes1:" + enabledTypes); + if (enabledTypes == 0) { + console.log("推送权限没有开启"); + } else { + result = true; + console.log("已经开启推送功能!") + } + plus.ios.deleteObject(settings); + } else { + enabledTypes = app.enabledRemoteNotificationTypes(); + if (enabledTypes == 0) { + console.log("推送权限没有开启!"); + } else { + result = true; + console.log("已经开启推送功能!") + } + console.log("enabledTypes2:" + enabledTypes); + } + plus.ios.deleteObject(app); + plus.ios.deleteObject(UIApplication); + return result; +} + +// 判断定位权限是否开启 +function judgeIosPermissionLocation() { + var result = false; + var cllocationManger = plus.ios.import("CLLocationManager"); + var status = cllocationManger.authorizationStatus(); + result = (status != 2) + console.log("定位权限开启:" + result); + // 以下代码判断了手机设备的定位是否关闭,推荐另行使用方法 checkSystemEnableLocation + /* var enable = cllocationManger.locationServicesEnabled(); + var status = cllocationManger.authorizationStatus(); + console.log("enable:" + enable); + console.log("status:" + status); + if (enable && status != 2) { + result = true; + console.log("手机定位服务已开启且已授予定位权限"); + } else { + console.log("手机系统的定位没有打开或未给予定位权限"); + } */ + plus.ios.deleteObject(cllocationManger); + return result; +} + +// 判断麦克风权限是否开启 +function judgeIosPermissionRecord() { + var result = false; + var avaudiosession = plus.ios.import("AVAudioSession"); + var avaudio = avaudiosession.sharedInstance(); + var permissionStatus = avaudio.recordPermission(); + console.log("permissionStatus:" + permissionStatus); + if (permissionStatus == 1684369017 || permissionStatus == 1970168948) { + console.log("麦克风权限没有开启"); + } else { + result = true; + console.log("麦克风权限已经开启"); + } + plus.ios.deleteObject(avaudiosession); + return result; +} + +// 判断相机权限是否开启 +function judgeIosPermissionCamera() { + var result = false; + var AVCaptureDevice = plus.ios.import("AVCaptureDevice"); + var authStatus = AVCaptureDevice.authorizationStatusForMediaType('vide'); + console.log("authStatus:" + authStatus); + if (authStatus == 3) { + result = true; + console.log("相机权限已经开启"); + } else { + console.log("相机权限没有开启"); + } + plus.ios.deleteObject(AVCaptureDevice); + return result; +} + +// 判断相册权限是否开启 +function judgeIosPermissionPhotoLibrary() { + var result = false; + var PHPhotoLibrary = plus.ios.import("PHPhotoLibrary"); + var authStatus = PHPhotoLibrary.authorizationStatus(); + console.log("authStatus:" + authStatus); + if (authStatus == 3) { + result = true; + console.log("相册权限已经开启"); + } else { + console.log("相册权限没有开启"); + } + plus.ios.deleteObject(PHPhotoLibrary); + return result; +} + +// 判断通讯录权限是否开启 +function judgeIosPermissionContact() { + var result = false; + var CNContactStore = plus.ios.import("CNContactStore"); + var cnAuthStatus = CNContactStore.authorizationStatusForEntityType(0); + if (cnAuthStatus == 3) { + result = true; + console.log("通讯录权限已经开启"); + } else { + console.log("通讯录权限没有开启"); + } + plus.ios.deleteObject(CNContactStore); + return result; +} + +// 判断日历权限是否开启 +function judgeIosPermissionCalendar() { + var result = false; + var EKEventStore = plus.ios.import("EKEventStore"); + var ekAuthStatus = EKEventStore.authorizationStatusForEntityType(0); + if (ekAuthStatus == 3) { + result = true; + console.log("日历权限已经开启"); + } else { + console.log("日历权限没有开启"); + } + plus.ios.deleteObject(EKEventStore); + return result; +} + +// 判断备忘录权限是否开启 +function judgeIosPermissionMemo() { + var result = false; + var EKEventStore = plus.ios.import("EKEventStore"); + var ekAuthStatus = EKEventStore.authorizationStatusForEntityType(1); + if (ekAuthStatus == 3) { + result = true; + console.log("备忘录权限已经开启"); + } else { + console.log("备忘录权限没有开启"); + } + plus.ios.deleteObject(EKEventStore); + return result; +} + +// Android权限查询 +function requestAndroidPermission(permissionID) { + return new Promise((resolve, reject) => { + plus.android.requestPermissions( + [permissionID], // 理论上支持多个权限同时查询,但实际上本函数封装只处理了一个权限的情况。有需要的可自行扩展封装 + function(resultObj) { + var result = 0; + for (var i = 0; i < resultObj.granted.length; i++) { + var grantedPermission = resultObj.granted[i]; + console.log('已获取的权限:' + grantedPermission); + result = 1 + } + for (var i = 0; i < resultObj.deniedPresent.length; i++) { + var deniedPresentPermission = resultObj.deniedPresent[i]; + console.log('拒绝本次申请的权限:' + deniedPresentPermission); + result = 0 + } + for (var i = 0; i < resultObj.deniedAlways.length; i++) { + var deniedAlwaysPermission = resultObj.deniedAlways[i]; + console.log('永久拒绝申请的权限:' + deniedAlwaysPermission); + result = -1 + } + resolve(result); + // 若所需权限被拒绝,则打开APP设置界面,可以在APP设置界面打开相应权限 + // if (result != 1) { + // gotoAppPermissionSetting() + // } + }, + function(error) { + console.log('申请权限错误:' + error.code + " = " + error.message); + resolve({ + code: error.code, + message: error.message + }); + } + ); + }); +} + +// 使用一个方法,根据参数判断权限 +function judgeIosPermission(permissionID) { + if (permissionID == "location") { + return judgeIosPermissionLocation() + } else if (permissionID == "camera") { + return judgeIosPermissionCamera() + } else if (permissionID == "photoLibrary") { + return judgeIosPermissionPhotoLibrary() + } else if (permissionID == "record") { + return judgeIosPermissionRecord() + } else if (permissionID == "push") { + return judgeIosPermissionPush() + } else if (permissionID == "contact") { + return judgeIosPermissionContact() + } else if (permissionID == "calendar") { + return judgeIosPermissionCalendar() + } else if (permissionID == "memo") { + return judgeIosPermissionMemo() + } + return false; +} + +// 跳转到**应用**的权限页面 +function gotoAppPermissionSetting() { + if (isIos) { + var UIApplication = plus.ios.import("UIApplication"); + var application2 = UIApplication.sharedApplication(); + var NSURL2 = plus.ios.import("NSURL"); + // var setting2 = NSURL2.URLWithString("prefs:root=LOCATION_SERVICES"); + var setting2 = NSURL2.URLWithString("app-settings:"); + application2.openURL(setting2); + + plus.ios.deleteObject(setting2); + plus.ios.deleteObject(NSURL2); + plus.ios.deleteObject(application2); + } else { + // console.log(plus.device.vendor); + var Intent = plus.android.importClass("android.content.Intent"); + var Settings = plus.android.importClass("android.provider.Settings"); + var Uri = plus.android.importClass("android.net.Uri"); + var mainActivity = plus.android.runtimeMainActivity(); + var intent = new Intent(); + intent.setAction(Settings.ACTION_APPLICATION_DETAILS_SETTINGS); + var uri = Uri.fromParts("package", mainActivity.getPackageName(), null); + intent.setData(uri); + mainActivity.startActivity(intent); + } +} + +// 检查系统的设备服务是否开启 +// var checkSystemEnableLocation = async function () { +function checkSystemEnableLocation() { + if (isIos) { + var result = false; + var cllocationManger = plus.ios.import("CLLocationManager"); + var result = cllocationManger.locationServicesEnabled(); + console.log("系统定位开启:" + result); + plus.ios.deleteObject(cllocationManger); + return result; + } else { + var context = plus.android.importClass("android.content.Context"); + var locationManager = plus.android.importClass("android.location.LocationManager"); + var main = plus.android.runtimeMainActivity(); + var mainSvr = main.getSystemService(context.LOCATION_SERVICE); + var result = mainSvr.isProviderEnabled(locationManager.GPS_PROVIDER); + console.log("系统定位开启:" + result); + return result + } +} + +module.exports = { + judgeIosPermission: judgeIosPermission, + requestAndroidPermission: requestAndroidPermission, + checkSystemEnableLocation: checkSystemEnableLocation, + gotoAppPermissionSetting: gotoAppPermissionSetting +} diff --git a/json/area_city.js b/json/area_city.js new file mode 100755 index 00000000..fe0896fd --- /dev/null +++ b/json/area_city.js @@ -0,0 +1,2763 @@ +let data = [ + { + "city_id": "1", + "city_name": "北京市", + "spell": "BEIJINGSHI", + "easy_spell": "BJS", + "zipcode": "100000", + "province_id": "1" + }, + { + "city_id": "2", + "city_name": "天津市", + "spell": "TIANJINSHI", + "easy_spell": "TJS", + "zipcode": "100000", + "province_id": "2" + }, + { + "city_id": "3", + "city_name": "石家庄市", + "spell": "SHIJIAZHUANGSHI", + "easy_spell": "SJZS", + "zipcode": "050000", + "province_id": "3" + }, + { + "city_id": "4", + "city_name": "唐山市", + "spell": "TANGSHANSHI", + "easy_spell": "TSS", + "zipcode": "063000", + "province_id": "3" + }, + { + "city_id": "5", + "city_name": "秦皇岛市", + "spell": "QINHUANGDAOSHI", + "easy_spell": "QHDS", + "zipcode": "066000", + "province_id": "3" + }, + { + "city_id": "6", + "city_name": "邯郸市", + "spell": "HANDANSHI", + "easy_spell": "HDS", + "zipcode": "056000", + "province_id": "3" + }, + { + "city_id": "7", + "city_name": "邢台市", + "spell": "XINGTAISHI", + "easy_spell": "XTS", + "zipcode": "054000", + "province_id": "3" + }, + { + "city_id": "8", + "city_name": "保定市", + "spell": "BAODINGSHI", + "easy_spell": "BDS", + "zipcode": "071000", + "province_id": "3" + }, + { + "city_id": "9", + "city_name": "张家口市", + "spell": "ZHANGJIAKOUSHI", + "easy_spell": "ZJKS", + "zipcode": "075000", + "province_id": "3" + }, + { + "city_id": "10", + "city_name": "承德市", + "spell": "CHENGDESHI", + "easy_spell": "CDS", + "zipcode": "067000", + "province_id": "3" + }, + { + "city_id": "11", + "city_name": "沧州市", + "spell": "CANGZHOUSHI", + "easy_spell": "CZS", + "zipcode": "061000", + "province_id": "3" + }, + { + "city_id": "12", + "city_name": "廊坊市", + "spell": "LANGFANGSHI", + "easy_spell": "LFS", + "zipcode": "065000", + "province_id": "3" + }, + { + "city_id": "13", + "city_name": "衡水市", + "spell": "HENGSHUISHI", + "easy_spell": "HSS", + "zipcode": "053000", + "province_id": "3" + }, + { + "city_id": "14", + "city_name": "太原市", + "spell": "TAIYUANSHI", + "easy_spell": "TYS", + "zipcode": "030000", + "province_id": "4" + }, + { + "city_id": "15", + "city_name": "大同市", + "spell": "DATONGSHI", + "easy_spell": "DTS", + "zipcode": "037000", + "province_id": "4" + }, + { + "city_id": "16", + "city_name": "阳泉市", + "spell": "YANGQUANSHI", + "easy_spell": "YQS", + "zipcode": "045000", + "province_id": "4" + }, + { + "city_id": "17", + "city_name": "长治市", + "spell": "CHANGZHISHI", + "easy_spell": "CZS", + "zipcode": "046000", + "province_id": "4" + }, + { + "city_id": "18", + "city_name": "晋城市", + "spell": "JINCHENGSHI", + "easy_spell": "JCS", + "zipcode": "048000", + "province_id": "4" + }, + { + "city_id": "19", + "city_name": "朔州市", + "spell": "SHUOZHOUSHI", + "easy_spell": "SZS", + "zipcode": "036000", + "province_id": "4" + }, + { + "city_id": "20", + "city_name": "晋中市", + "spell": "JINZHONGSHI", + "easy_spell": "JZS", + "zipcode": "030600", + "province_id": "4" + }, + { + "city_id": "21", + "city_name": "运城市", + "spell": "YUNCHENGSHI", + "easy_spell": "YCS", + "zipcode": "044000", + "province_id": "4" + }, + { + "city_id": "22", + "city_name": "忻州市", + "spell": "XINZHOUSHI", + "easy_spell": "XZS", + "zipcode": "034000", + "province_id": "4" + }, + { + "city_id": "23", + "city_name": "临汾市", + "spell": "LINFENSHI", + "easy_spell": "LFS", + "zipcode": "041000", + "province_id": "4" + }, + { + "city_id": "24", + "city_name": "吕梁市", + "spell": "LVLIANGSHI", + "easy_spell": "LLS", + "zipcode": "030500", + "province_id": "4" + }, + { + "city_id": "25", + "city_name": "呼和浩特市", + "spell": "HUHEHAOTESHI", + "easy_spell": "HHHTS", + "zipcode": "010000", + "province_id": "5" + }, + { + "city_id": "26", + "city_name": "包头市", + "spell": "BAOTOUSHI", + "easy_spell": "BTS", + "zipcode": "014000", + "province_id": "5" + }, + { + "city_id": "27", + "city_name": "乌海市", + "spell": "WUHAISHI", + "easy_spell": "WHS", + "zipcode": "016000", + "province_id": "5" + }, + { + "city_id": "28", + "city_name": "赤峰市", + "spell": "CHIFENGSHI", + "easy_spell": "CFS", + "zipcode": "024000", + "province_id": "5" + }, + { + "city_id": "29", + "city_name": "通辽市", + "spell": "TONGLIAOSHI", + "easy_spell": "TLS", + "zipcode": "028000", + "province_id": "5" + }, + { + "city_id": "30", + "city_name": "鄂尔多斯市", + "spell": "EERDUOSISHI", + "easy_spell": "EEDSS", + "zipcode": "010300", + "province_id": "5" + }, + { + "city_id": "31", + "city_name": "呼伦贝尔市", + "spell": "HULUNBEIERSHI", + "easy_spell": "HLBES", + "zipcode": "021000", + "province_id": "5" + }, + { + "city_id": "32", + "city_name": "巴彦淖尔市", + "spell": "BAYANNAOERSHI", + "easy_spell": "BYNES", + "zipcode": "014400", + "province_id": "5" + }, + { + "city_id": "33", + "city_name": "乌兰察布市", + "spell": "WULANCHABUSHI", + "easy_spell": "WLCBS", + "zipcode": "011800", + "province_id": "5" + }, + { + "city_id": "34", + "city_name": "兴安盟", + "spell": "XINGANMENG", + "easy_spell": "XAM", + "zipcode": "137500", + "province_id": "5" + }, + { + "city_id": "35", + "city_name": "锡林郭勒盟", + "spell": "XILINGUOLEMENG", + "easy_spell": "XLGLM", + "zipcode": "011100", + "province_id": "5" + }, + { + "city_id": "36", + "city_name": "阿拉善盟", + "spell": "ALASHANMENG", + "easy_spell": "ALSM", + "zipcode": "016000", + "province_id": "5" + }, + { + "city_id": "37", + "city_name": "沈阳市", + "spell": "SHENYANGSHI", + "easy_spell": "SYS", + "zipcode": "110000", + "province_id": "6" + }, + { + "city_id": "38", + "city_name": "大连市", + "spell": "DALIANSHI", + "easy_spell": "DLS", + "zipcode": "116000", + "province_id": "6" + }, + { + "city_id": "39", + "city_name": "鞍山市", + "spell": "ANSHANSHI", + "easy_spell": "ASS", + "zipcode": "114000", + "province_id": "6" + }, + { + "city_id": "40", + "city_name": "抚顺市", + "spell": "FUSHUNSHI", + "easy_spell": "FSS", + "zipcode": "113000", + "province_id": "6" + }, + { + "city_id": "41", + "city_name": "本溪市", + "spell": "BENXISHI", + "easy_spell": "BXS", + "zipcode": "117000", + "province_id": "6" + }, + { + "city_id": "42", + "city_name": "丹东市", + "spell": "DANDONGSHI", + "easy_spell": "DDS", + "zipcode": "118000", + "province_id": "6" + }, + { + "city_id": "43", + "city_name": "锦州市", + "spell": "JINZHOUSHI", + "easy_spell": "JZS", + "zipcode": "121000", + "province_id": "6" + }, + { + "city_id": "44", + "city_name": "营口市", + "spell": "YINGKOUSHI", + "easy_spell": "YKS", + "zipcode": "115000", + "province_id": "6" + }, + { + "city_id": "45", + "city_name": "阜新市", + "spell": "FUXINSHI", + "easy_spell": "FXS", + "zipcode": "123000", + "province_id": "6" + }, + { + "city_id": "46", + "city_name": "辽阳市", + "spell": "LIAOYANGSHI", + "easy_spell": "LYS", + "zipcode": "111000", + "province_id": "6" + }, + { + "city_id": "47", + "city_name": "盘锦市", + "spell": "PANJINSHI", + "easy_spell": "PJS", + "zipcode": "124000", + "province_id": "6" + }, + { + "city_id": "48", + "city_name": "铁岭市", + "spell": "TIELINGSHI", + "easy_spell": "TLS", + "zipcode": "112000", + "province_id": "6" + }, + { + "city_id": "49", + "city_name": "朝阳市", + "spell": "CHAOYANGSHI", + "easy_spell": "CYS", + "zipcode": "122000", + "province_id": "6" + }, + { + "city_id": "50", + "city_name": "葫芦岛市", + "spell": "HULUDAOSHI", + "easy_spell": "HLDS", + "zipcode": "125000", + "province_id": "6" + }, + { + "city_id": "51", + "city_name": "长春市", + "spell": "CHANGCHUNSHI", + "easy_spell": "CCS", + "zipcode": "130000", + "province_id": "7" + }, + { + "city_id": "52", + "city_name": "吉林市", + "spell": "JILINSHI", + "easy_spell": "JLS", + "zipcode": "132000", + "province_id": "7" + }, + { + "city_id": "53", + "city_name": "四平市", + "spell": "SIPINGSHI", + "easy_spell": "SPS", + "zipcode": "136000", + "province_id": "7" + }, + { + "city_id": "54", + "city_name": "辽源市", + "spell": "LIAOYUANSHI", + "easy_spell": "LYS", + "zipcode": "136200", + "province_id": "7" + }, + { + "city_id": "55", + "city_name": "通化市", + "spell": "TONGHUASHI", + "easy_spell": "THS", + "zipcode": "134000", + "province_id": "7" + }, + { + "city_id": "56", + "city_name": "白山市", + "spell": "BAISHANSHI", + "easy_spell": "BSS", + "zipcode": "134300", + "province_id": "7" + }, + { + "city_id": "57", + "city_name": "松原市", + "spell": "SONGYUANSHI", + "easy_spell": "SYS", + "zipcode": "131100", + "province_id": "7" + }, + { + "city_id": "58", + "city_name": "白城市", + "spell": "BAICHENGSHI", + "easy_spell": "BCS", + "zipcode": "137000", + "province_id": "7" + }, + { + "city_id": "59", + "city_name": "延边朝鲜族自治州", + "spell": "YANBIANCHAOXIANZUZIZHIZHOU", + "easy_spell": "YBCXZZZZ", + "zipcode": "133000", + "province_id": "7" + }, + { + "city_id": "60", + "city_name": "哈尔滨市", + "spell": "HAERBINSHI", + "easy_spell": "HEBS", + "zipcode": "150000", + "province_id": "8" + }, + { + "city_id": "61", + "city_name": "齐齐哈尔市", + "spell": "QIQIHAERSHI", + "easy_spell": "QQHES", + "zipcode": "161000", + "province_id": "8" + }, + { + "city_id": "62", + "city_name": "鸡西市", + "spell": "JIXISHI", + "easy_spell": "JXS", + "zipcode": "158100", + "province_id": "8" + }, + { + "city_id": "63", + "city_name": "鹤岗市", + "spell": "HEGANGSHI", + "easy_spell": "HGS", + "zipcode": "154100", + "province_id": "8" + }, + { + "city_id": "64", + "city_name": "双鸭山市", + "spell": "SHUANGYASHANSHI", + "easy_spell": "SYSS", + "zipcode": "155100", + "province_id": "8" + }, + { + "city_id": "65", + "city_name": "大庆市", + "spell": "DAQINGSHI", + "easy_spell": "DQS", + "zipcode": "163000", + "province_id": "8" + }, + { + "city_id": "66", + "city_name": "伊春市", + "spell": "YICHUNSHI", + "easy_spell": "YCS", + "zipcode": "152300", + "province_id": "8" + }, + { + "city_id": "67", + "city_name": "佳木斯市", + "spell": "JIAMUSISHI", + "easy_spell": "JMSS", + "zipcode": "154000", + "province_id": "8" + }, + { + "city_id": "68", + "city_name": "七台河市", + "spell": "QITAIHESHI", + "easy_spell": "QTHS", + "zipcode": "154600", + "province_id": "8" + }, + { + "city_id": "69", + "city_name": "牡丹江市", + "spell": "MUDANJIANGSHI", + "easy_spell": "MDJS", + "zipcode": "157000", + "province_id": "8" + }, + { + "city_id": "70", + "city_name": "黑河市", + "spell": "HEIHESHI", + "easy_spell": "HHS", + "zipcode": "164300", + "province_id": "8" + }, + { + "city_id": "71", + "city_name": "绥化市", + "spell": "SUIHUASHI", + "easy_spell": "SHS", + "zipcode": "152000", + "province_id": "8" + }, + { + "city_id": "72", + "city_name": "大兴安岭地区", + "spell": "DAXINGANLINGDIQU", + "easy_spell": "DXALDQ", + "zipcode": "165000", + "province_id": "8" + }, + { + "city_id": "73", + "city_name": "上海市", + "spell": "SHANGHAISHI", + "easy_spell": "SHS", + "zipcode": "200000", + "province_id": "9" + }, + { + "city_id": "74", + "city_name": "南京市", + "spell": "NANJINGSHI", + "easy_spell": "NJS", + "zipcode": "210000", + "province_id": "10" + }, + { + "city_id": "75", + "city_name": "无锡市", + "spell": "WUXISHI", + "easy_spell": "WXS", + "zipcode": "214000", + "province_id": "10" + }, + { + "city_id": "76", + "city_name": "徐州市", + "spell": "XUZHOUSHI", + "easy_spell": "XZS", + "zipcode": "221000", + "province_id": "10" + }, + { + "city_id": "77", + "city_name": "常州市", + "spell": "CHANGZHOUSHI", + "easy_spell": "CZS", + "zipcode": "213000", + "province_id": "10" + }, + { + "city_id": "78", + "city_name": "苏州市", + "spell": "SUZHOUSHI", + "easy_spell": "SZS", + "zipcode": "215000", + "province_id": "10" + }, + { + "city_id": "79", + "city_name": "南通市", + "spell": "NANTONGSHI", + "easy_spell": "NTS", + "zipcode": "226000", + "province_id": "10" + }, + { + "city_id": "80", + "city_name": "连云港市", + "spell": "LIANYUNGANGSHI", + "easy_spell": "LYGS", + "zipcode": "222000", + "province_id": "10" + }, + { + "city_id": "81", + "city_name": "淮安市", + "spell": "HUAIANSHI", + "easy_spell": "HAS", + "zipcode": "223200", + "province_id": "10" + }, + { + "city_id": "82", + "city_name": "盐城市", + "spell": "YANCHENGSHI", + "easy_spell": "YCS", + "zipcode": "224000", + "province_id": "10" + }, + { + "city_id": "83", + "city_name": "扬州市", + "spell": "YANGZHOUSHI", + "easy_spell": "YZS", + "zipcode": "225000", + "province_id": "10" + }, + { + "city_id": "84", + "city_name": "镇江市", + "spell": "ZHENJIANGSHI", + "easy_spell": "ZJS", + "zipcode": "212000", + "province_id": "10" + }, + { + "city_id": "85", + "city_name": "泰州市", + "spell": "TAIZHOUSHI", + "easy_spell": "TZS", + "zipcode": "225300", + "province_id": "10" + }, + { + "city_id": "86", + "city_name": "宿迁市", + "spell": "SUQIANSHI", + "easy_spell": "SQS", + "zipcode": "223800", + "province_id": "10" + }, + { + "city_id": "87", + "city_name": "杭州市", + "spell": "HANGZHOUSHI", + "easy_spell": "HZS", + "zipcode": "310000", + "province_id": "11" + }, + { + "city_id": "88", + "city_name": "宁波市", + "spell": "NINGBOSHI", + "easy_spell": "NBS", + "zipcode": "315000", + "province_id": "11" + }, + { + "city_id": "89", + "city_name": "温州市", + "spell": "WENZHOUSHI", + "easy_spell": "WZS", + "zipcode": "325000", + "province_id": "11" + }, + { + "city_id": "90", + "city_name": "嘉兴市", + "spell": "JIAXINGSHI", + "easy_spell": "JXS", + "zipcode": "314000", + "province_id": "11" + }, + { + "city_id": "91", + "city_name": "湖州市", + "spell": "HUZHOUSHI", + "easy_spell": "HZS", + "zipcode": "313000", + "province_id": "11" + }, + { + "city_id": "92", + "city_name": "绍兴市", + "spell": "SHAOXINGSHI", + "easy_spell": "SXS", + "zipcode": "312000", + "province_id": "11" + }, + { + "city_id": "93", + "city_name": "金华市", + "spell": "JINHUASHI", + "easy_spell": "JHS", + "zipcode": "321000", + "province_id": "11" + }, + { + "city_id": "94", + "city_name": "衢州市", + "spell": "ZUOZHOUSHI", + "easy_spell": "ZZS", + "zipcode": "324000", + "province_id": "11" + }, + { + "city_id": "95", + "city_name": "舟山市", + "spell": "ZHOUSHANSHI", + "easy_spell": "ZSS", + "zipcode": "316000", + "province_id": "11" + }, + { + "city_id": "96", + "city_name": "台州市", + "spell": "TAIZHOUSHI", + "easy_spell": "TZS", + "zipcode": "318000", + "province_id": "11" + }, + { + "city_id": "97", + "city_name": "丽水市", + "spell": "LISHUISHI", + "easy_spell": "LSS", + "zipcode": "323000", + "province_id": "11" + }, + { + "city_id": "98", + "city_name": "合肥市", + "spell": "HEFEISHI", + "easy_spell": "HFS", + "zipcode": "230000", + "province_id": "12" + }, + { + "city_id": "99", + "city_name": "芜湖市", + "spell": "WUHUSHI", + "easy_spell": "WHS", + "zipcode": "241000", + "province_id": "12" + }, + { + "city_id": "100", + "city_name": "蚌埠市", + "spell": "BANGBUSHI", + "easy_spell": "BBS", + "zipcode": "233000", + "province_id": "12" + }, + { + "city_id": "101", + "city_name": "淮南市", + "spell": "HUAINANSHI", + "easy_spell": "HNS", + "zipcode": "232000", + "province_id": "12" + }, + { + "city_id": "102", + "city_name": "马鞍山市", + "spell": "MAANSHANSHI", + "easy_spell": "MASS", + "zipcode": "243000", + "province_id": "12" + }, + { + "city_id": "103", + "city_name": "淮北市", + "spell": "HUAIBEISHI", + "easy_spell": "HBS", + "zipcode": "235000", + "province_id": "12" + }, + { + "city_id": "104", + "city_name": "铜陵市", + "spell": "TONGLINGSHI", + "easy_spell": "TLS", + "zipcode": "244000", + "province_id": "12" + }, + { + "city_id": "105", + "city_name": "安庆市", + "spell": "ANQINGSHI", + "easy_spell": "AQS", + "zipcode": "246000", + "province_id": "12" + }, + { + "city_id": "106", + "city_name": "黄山市", + "spell": "HUANGSHANSHI", + "easy_spell": "HSS", + "zipcode": "242700", + "province_id": "12" + }, + { + "city_id": "107", + "city_name": "滁州市", + "spell": "CHUZHOUSHI", + "easy_spell": "CZS", + "zipcode": "239000", + "province_id": "12" + }, + { + "city_id": "108", + "city_name": "阜阳市", + "spell": "FUYANGSHI", + "easy_spell": "FYS", + "zipcode": "236100", + "province_id": "12" + }, + { + "city_id": "109", + "city_name": "宿州市", + "spell": "SUZHOUSHI", + "easy_spell": "SZS", + "zipcode": "234100", + "province_id": "12" + }, + { + "city_id": "110", + "city_name": "巢湖市", + "spell": "CHAOHUSHI", + "easy_spell": "CHS", + "zipcode": "238000", + "province_id": "12" + }, + { + "city_id": "111", + "city_name": "六安市", + "spell": "LIUANSHI", + "easy_spell": "LAS", + "zipcode": "237000", + "province_id": "12" + }, + { + "city_id": "112", + "city_name": "亳州市", + "spell": "ZUOZHOUSHI", + "easy_spell": "ZZS", + "zipcode": "236800", + "province_id": "12" + }, + { + "city_id": "113", + "city_name": "池州市", + "spell": "CHIZHOUSHI", + "easy_spell": "CZS", + "zipcode": "247100", + "province_id": "12" + }, + { + "city_id": "114", + "city_name": "宣城市", + "spell": "XUANCHENGSHI", + "easy_spell": "XCS", + "zipcode": "366000", + "province_id": "12" + }, + { + "city_id": "115", + "city_name": "福州市", + "spell": "FUZHOUSHI", + "easy_spell": "FZS", + "zipcode": "350000", + "province_id": "13" + }, + { + "city_id": "116", + "city_name": "厦门市", + "spell": "XIAMENSHI", + "easy_spell": "XMS", + "zipcode": "361000", + "province_id": "13" + }, + { + "city_id": "117", + "city_name": "莆田市", + "spell": "PUTIANSHI", + "easy_spell": "PTS", + "zipcode": "351100", + "province_id": "13" + }, + { + "city_id": "118", + "city_name": "三明市", + "spell": "SANMINGSHI", + "easy_spell": "SMS", + "zipcode": "365000", + "province_id": "13" + }, + { + "city_id": "119", + "city_name": "泉州市", + "spell": "QUANZHOUSHI", + "easy_spell": "QZS", + "zipcode": "362000", + "province_id": "13" + }, + { + "city_id": "120", + "city_name": "漳州市", + "spell": "ZHANGZHOUSHI", + "easy_spell": "ZZS", + "zipcode": "363000", + "province_id": "13" + }, + { + "city_id": "121", + "city_name": "南平市", + "spell": "NANPINGSHI", + "easy_spell": "NPS", + "zipcode": "353000", + "province_id": "13" + }, + { + "city_id": "122", + "city_name": "龙岩市", + "spell": "LONGYANSHI", + "easy_spell": "LYS", + "zipcode": "364000", + "province_id": "13" + }, + { + "city_id": "123", + "city_name": "宁德市", + "spell": "NINGDESHI", + "easy_spell": "NDS", + "zipcode": "352100", + "province_id": "13" + }, + { + "city_id": "124", + "city_name": "南昌市", + "spell": "NANCHANGSHI", + "easy_spell": "NCS", + "zipcode": "330000", + "province_id": "14" + }, + { + "city_id": "125", + "city_name": "景德镇市", + "spell": "JINGDEZHENSHI", + "easy_spell": "JDZS", + "zipcode": "333000", + "province_id": "14" + }, + { + "city_id": "126", + "city_name": "萍乡市", + "spell": "PINGXIANGSHI", + "easy_spell": "PXS", + "zipcode": "337000", + "province_id": "14" + }, + { + "city_id": "127", + "city_name": "九江市", + "spell": "JIUJIANGSHI", + "easy_spell": "JJS", + "zipcode": "332000", + "province_id": "14" + }, + { + "city_id": "128", + "city_name": "新余市", + "spell": "XINYUSHI", + "easy_spell": "XYS", + "zipcode": "338000", + "province_id": "14" + }, + { + "city_id": "129", + "city_name": "鹰潭市", + "spell": "YINGTANSHI", + "easy_spell": "YTS", + "zipcode": "335000", + "province_id": "14" + }, + { + "city_id": "130", + "city_name": "赣州市", + "spell": "GANZHOUSHI", + "easy_spell": "GZS", + "zipcode": "341000", + "province_id": "14" + }, + { + "city_id": "131", + "city_name": "吉安市", + "spell": "JIANSHI", + "easy_spell": "JAS", + "zipcode": "343000", + "province_id": "14" + }, + { + "city_id": "132", + "city_name": "宜春市", + "spell": "YICHUNSHI", + "easy_spell": "YCS", + "zipcode": "336000", + "province_id": "14" + }, + { + "city_id": "133", + "city_name": "抚州市", + "spell": "FUZHOUSHI", + "easy_spell": "FZS", + "zipcode": "332900", + "province_id": "14" + }, + { + "city_id": "134", + "city_name": "上饶市", + "spell": "SHANGRAOSHI", + "easy_spell": "SRS", + "zipcode": "334000", + "province_id": "14" + }, + { + "city_id": "135", + "city_name": "济南市", + "spell": "JINANSHI", + "easy_spell": "JNS", + "zipcode": "250000", + "province_id": "15" + }, + { + "city_id": "136", + "city_name": "青岛市", + "spell": "QINGDAOSHI", + "easy_spell": "QDS", + "zipcode": "266000", + "province_id": "15" + }, + { + "city_id": "137", + "city_name": "淄博市", + "spell": "ZIBOSHI", + "easy_spell": "ZBS", + "zipcode": "255000", + "province_id": "15" + }, + { + "city_id": "138", + "city_name": "枣庄市", + "spell": "ZAOZHUANGSHI", + "easy_spell": "ZZS", + "zipcode": "277100", + "province_id": "15" + }, + { + "city_id": "139", + "city_name": "东营市", + "spell": "DONGYINGSHI", + "easy_spell": "DYS", + "zipcode": "257000", + "province_id": "15" + }, + { + "city_id": "140", + "city_name": "烟台市", + "spell": "YANTAISHI", + "easy_spell": "YTS", + "zipcode": "264000", + "province_id": "15" + }, + { + "city_id": "141", + "city_name": "潍坊市", + "spell": "WEIFANGSHI", + "easy_spell": "WFS", + "zipcode": "261000", + "province_id": "15" + }, + { + "city_id": "142", + "city_name": "济宁市", + "spell": "JININGSHI", + "easy_spell": "JNS", + "zipcode": "272100", + "province_id": "15" + }, + { + "city_id": "143", + "city_name": "泰安市", + "spell": "TAIANSHI", + "easy_spell": "TAS", + "zipcode": "271000", + "province_id": "15" + }, + { + "city_id": "144", + "city_name": "威海市", + "spell": "WEIHAISHI", + "easy_spell": "WHS", + "zipcode": "265700", + "province_id": "15" + }, + { + "city_id": "145", + "city_name": "日照市", + "spell": "RIZHAOSHI", + "easy_spell": "RZS", + "zipcode": "276800", + "province_id": "15" + }, + { + "city_id": "146", + "city_name": "莱芜市", + "spell": "LAIWUSHI", + "easy_spell": "LWS", + "zipcode": "271100", + "province_id": "15" + }, + { + "city_id": "147", + "city_name": "临沂市", + "spell": "LINYISHI", + "easy_spell": "LYS", + "zipcode": "276000", + "province_id": "15" + }, + { + "city_id": "148", + "city_name": "德州市", + "spell": "DEZHOUSHI", + "easy_spell": "DZS", + "zipcode": "253000", + "province_id": "15" + }, + { + "city_id": "149", + "city_name": "聊城市", + "spell": "LIAOCHENGSHI", + "easy_spell": "LCS", + "zipcode": "252000", + "province_id": "15" + }, + { + "city_id": "150", + "city_name": "滨州市", + "spell": "BINZHOUSHI", + "easy_spell": "BZS", + "zipcode": "256600", + "province_id": "15" + }, + { + "city_id": "151", + "city_name": "荷泽市", + "spell": "HEZESHI", + "easy_spell": "HZS", + "zipcode": "255000", + "province_id": "15" + }, + { + "city_id": "152", + "city_name": "郑州市", + "spell": "ZHENGZHOUSHI", + "easy_spell": "ZZS", + "zipcode": "450000", + "province_id": "16" + }, + { + "city_id": "153", + "city_name": "开封市", + "spell": "KAIFENGSHI", + "easy_spell": "KFS", + "zipcode": "475000", + "province_id": "16" + }, + { + "city_id": "154", + "city_name": "洛阳市", + "spell": "LUOYANGSHI", + "easy_spell": "LYS", + "zipcode": "471000", + "province_id": "16" + }, + { + "city_id": "155", + "city_name": "平顶山市", + "spell": "PINGDINGSHANSHI", + "easy_spell": "PDSS", + "zipcode": "467000", + "province_id": "16" + }, + { + "city_id": "156", + "city_name": "安阳市", + "spell": "ANYANGSHI", + "easy_spell": "AYS", + "zipcode": "454900", + "province_id": "16" + }, + { + "city_id": "157", + "city_name": "鹤壁市", + "spell": "HEBISHI", + "easy_spell": "HBS", + "zipcode": "456600", + "province_id": "16" + }, + { + "city_id": "158", + "city_name": "新乡市", + "spell": "XINXIANGSHI", + "easy_spell": "XXS", + "zipcode": "453000", + "province_id": "16" + }, + { + "city_id": "159", + "city_name": "焦作市", + "spell": "JIAOZUOSHI", + "easy_spell": "JZS", + "zipcode": "454100", + "province_id": "16" + }, + { + "city_id": "160", + "city_name": "濮阳市", + "spell": "ZUOYANGSHI", + "easy_spell": "ZYS", + "zipcode": "457000", + "province_id": "16" + }, + { + "city_id": "161", + "city_name": "许昌市", + "spell": "XUCHANGSHI", + "easy_spell": "XCS", + "zipcode": "461000", + "province_id": "16" + }, + { + "city_id": "162", + "city_name": "漯河市", + "spell": "ZUOHESHI", + "easy_spell": "ZHS", + "zipcode": "462000", + "province_id": "16" + }, + { + "city_id": "163", + "city_name": "三门峡市", + "spell": "SANMENXIASHI", + "easy_spell": "SMXS", + "zipcode": "472000", + "province_id": "16" + }, + { + "city_id": "164", + "city_name": "南阳市", + "spell": "NANYANGSHI", + "easy_spell": "NYS", + "zipcode": "473000", + "province_id": "16" + }, + { + "city_id": "165", + "city_name": "商丘市", + "spell": "SHANGQIUSHI", + "easy_spell": "SQS", + "zipcode": "476000", + "province_id": "16" + }, + { + "city_id": "166", + "city_name": "信阳市", + "spell": "XINYANGSHI", + "easy_spell": "XYS", + "zipcode": "464000", + "province_id": "16" + }, + { + "city_id": "167", + "city_name": "周口市", + "spell": "ZHOUKOUSHI", + "easy_spell": "ZKS", + "zipcode": "466000", + "province_id": "16" + }, + { + "city_id": "168", + "city_name": "驻马店市", + "spell": "ZHUMADIANSHI", + "easy_spell": "ZMDS", + "zipcode": "463000", + "province_id": "16" + }, + { + "city_id": "169", + "city_name": "武汉市", + "spell": "WUHANSHI", + "easy_spell": "WHS", + "zipcode": "430000", + "province_id": "17" + }, + { + "city_id": "170", + "city_name": "黄石市", + "spell": "HUANGSHISHI", + "easy_spell": "HSS", + "zipcode": "435000", + "province_id": "17" + }, + { + "city_id": "171", + "city_name": "十堰市", + "spell": "SHIYANSHI", + "easy_spell": "SYS", + "zipcode": "442000", + "province_id": "17" + }, + { + "city_id": "172", + "city_name": "宜昌市", + "spell": "YICHANGSHI", + "easy_spell": "YCS", + "zipcode": "443000", + "province_id": "17" + }, + { + "city_id": "173", + "city_name": "襄樊市", + "spell": "XIANGFANSHI", + "easy_spell": "XFS", + "zipcode": "441000", + "province_id": "17" + }, + { + "city_id": "174", + "city_name": "鄂州市", + "spell": "EZHOUSHI", + "easy_spell": "EZS", + "zipcode": "436000", + "province_id": "17" + }, + { + "city_id": "175", + "city_name": "荆门市", + "spell": "JINGMENSHI", + "easy_spell": "JMS", + "zipcode": "448000", + "province_id": "17" + }, + { + "city_id": "176", + "city_name": "孝感市", + "spell": "XIAOGANSHI", + "easy_spell": "XGS", + "zipcode": "432100", + "province_id": "17" + }, + { + "city_id": "177", + "city_name": "荆州市", + "spell": "JINGZHOUSHI", + "easy_spell": "JZS", + "zipcode": "434000", + "province_id": "17" + }, + { + "city_id": "178", + "city_name": "黄冈市", + "spell": "HUANGGANGSHI", + "easy_spell": "HGS", + "zipcode": "438000", + "province_id": "17" + }, + { + "city_id": "179", + "city_name": "咸宁市", + "spell": "XIANNINGSHI", + "easy_spell": "XNS", + "zipcode": "437000", + "province_id": "17" + }, + { + "city_id": "180", + "city_name": "随州市", + "spell": "SUIZHOUSHI", + "easy_spell": "SZS", + "zipcode": "441300", + "province_id": "17" + }, + { + "city_id": "181", + "city_name": "恩施土家族苗族自治州", + "spell": "ENSHITUJIAZUMIAOZUZIZHIZHOU", + "easy_spell": "ESTJZMZZZZ", + "zipcode": "445000", + "province_id": "17" + }, + { + "city_id": "182", + "city_name": "神农架", + "spell": "SHENNONGJIA", + "easy_spell": "SNJ", + "zipcode": "442400", + "province_id": "17" + }, + { + "city_id": "183", + "city_name": "长沙市", + "spell": "CHANGSHASHI", + "easy_spell": "CSS", + "zipcode": "410000", + "province_id": "18" + }, + { + "city_id": "184", + "city_name": "株洲市", + "spell": "ZHUZHOUSHI", + "easy_spell": "ZZS", + "zipcode": "412000", + "province_id": "18" + }, + { + "city_id": "185", + "city_name": "湘潭市", + "spell": "XIANGTANSHI", + "easy_spell": "XTS", + "zipcode": "411100", + "province_id": "18" + }, + { + "city_id": "186", + "city_name": "衡阳市", + "spell": "HENGYANGSHI", + "easy_spell": "HYS", + "zipcode": "421000", + "province_id": "18" + }, + { + "city_id": "187", + "city_name": "邵阳市", + "spell": "SHAOYANGSHI", + "easy_spell": "SYS", + "zipcode": "422000", + "province_id": "18" + }, + { + "city_id": "188", + "city_name": "岳阳市", + "spell": "YUEYANGSHI", + "easy_spell": "YYS", + "zipcode": "414000", + "province_id": "18" + }, + { + "city_id": "189", + "city_name": "常德市", + "spell": "CHANGDESHI", + "easy_spell": "CDS", + "zipcode": "415000", + "province_id": "18" + }, + { + "city_id": "190", + "city_name": "张家界市", + "spell": "ZHANGJIAJIESHI", + "easy_spell": "ZJJS", + "zipcode": "427000", + "province_id": "18" + }, + { + "city_id": "191", + "city_name": "益阳市", + "spell": "YIYANGSHI", + "easy_spell": "YYS", + "zipcode": "413000", + "province_id": "18" + }, + { + "city_id": "192", + "city_name": "郴州市", + "spell": "CHENZHOUSHI", + "easy_spell": "CZS", + "zipcode": "423000", + "province_id": "18" + }, + { + "city_id": "193", + "city_name": "永州市", + "spell": "YONGZHOUSHI", + "easy_spell": "YZS", + "zipcode": "425000", + "province_id": "18" + }, + { + "city_id": "194", + "city_name": "怀化市", + "spell": "HUAIHUASHI", + "easy_spell": "HHS", + "zipcode": "418000", + "province_id": "18" + }, + { + "city_id": "195", + "city_name": "娄底市", + "spell": "LOUDISHI", + "easy_spell": "LDS", + "zipcode": "417000", + "province_id": "18" + }, + { + "city_id": "196", + "city_name": "湘西土家族苗族自治州", + "spell": "XIANGXITUJIAZUMIAOZUZIZHIZHOU", + "easy_spell": "XXTJZMZZZZ", + "zipcode": "416000", + "province_id": "18" + }, + { + "city_id": "197", + "city_name": "广州市", + "spell": "GUANGZHOUSHI", + "easy_spell": "GZS", + "zipcode": "510000", + "province_id": "19" + }, + { + "city_id": "198", + "city_name": "韶关市", + "spell": "SHAOGUANSHI", + "easy_spell": "SGS", + "zipcode": "521000", + "province_id": "19" + }, + { + "city_id": "199", + "city_name": "深圳市", + "spell": "SHENZUOSHI", + "easy_spell": "SZS", + "zipcode": "518000", + "province_id": "19" + }, + { + "city_id": "200", + "city_name": "珠海市", + "spell": "ZHUHAISHI", + "easy_spell": "ZHS", + "zipcode": "519000", + "province_id": "19" + }, + { + "city_id": "201", + "city_name": "汕头市", + "spell": "SHANTOUSHI", + "easy_spell": "STS", + "zipcode": "515000", + "province_id": "19" + }, + { + "city_id": "202", + "city_name": "佛山市", + "spell": "FOSHANSHI", + "easy_spell": "FSS", + "zipcode": "528000", + "province_id": "19" + }, + { + "city_id": "203", + "city_name": "江门市", + "spell": "JIANGMENSHI", + "easy_spell": "JMS", + "zipcode": "529000", + "province_id": "19" + }, + { + "city_id": "204", + "city_name": "湛江市", + "spell": "ZHANJIANGSHI", + "easy_spell": "ZJS", + "zipcode": "524000", + "province_id": "19" + }, + { + "city_id": "205", + "city_name": "茂名市", + "spell": "MAOMINGSHI", + "easy_spell": "MMS", + "zipcode": "525000", + "province_id": "19" + }, + { + "city_id": "206", + "city_name": "肇庆市", + "spell": "ZHAOQINGSHI", + "easy_spell": "ZQS", + "zipcode": "526000", + "province_id": "19" + }, + { + "city_id": "207", + "city_name": "惠州市", + "spell": "HUIZHOUSHI", + "easy_spell": "HZS", + "zipcode": "516000", + "province_id": "19" + }, + { + "city_id": "208", + "city_name": "梅州市", + "spell": "MEIZHOUSHI", + "easy_spell": "MZS", + "zipcode": "514000", + "province_id": "19" + }, + { + "city_id": "209", + "city_name": "汕尾市", + "spell": "SHANWEISHI", + "easy_spell": "SWS", + "zipcode": "516600", + "province_id": "19" + }, + { + "city_id": "210", + "city_name": "河源市", + "spell": "HEYUANSHI", + "easy_spell": "HYS", + "zipcode": "517000", + "province_id": "19" + }, + { + "city_id": "211", + "city_name": "阳江市", + "spell": "YANGJIANGSHI", + "easy_spell": "YJS", + "zipcode": "529500", + "province_id": "19" + }, + { + "city_id": "212", + "city_name": "清远市", + "spell": "QINGYUANSHI", + "easy_spell": "QYS", + "zipcode": "511500", + "province_id": "19" + }, + { + "city_id": "213", + "city_name": "东莞市", + "spell": "DONGZUOSHI", + "easy_spell": "DZS", + "zipcode": "511700", + "province_id": "19" + }, + { + "city_id": "214", + "city_name": "中山市", + "spell": "ZHONGSHANSHI", + "easy_spell": "ZSS", + "zipcode": "528400", + "province_id": "19" + }, + { + "city_id": "215", + "city_name": "潮州市", + "spell": "CHAOZHOUSHI", + "easy_spell": "CZS", + "zipcode": "515600", + "province_id": "19" + }, + { + "city_id": "216", + "city_name": "揭阳市", + "spell": "JIEYANGSHI", + "easy_spell": "JYS", + "zipcode": "522000", + "province_id": "19" + }, + { + "city_id": "217", + "city_name": "云浮市", + "spell": "YUNFUSHI", + "easy_spell": "YFS", + "zipcode": "527300", + "province_id": "19" + }, + { + "city_id": "218", + "city_name": "南宁市", + "spell": "NANNINGSHI", + "easy_spell": "NNS", + "zipcode": "530000", + "province_id": "20" + }, + { + "city_id": "219", + "city_name": "柳州市", + "spell": "LIUZHOUSHI", + "easy_spell": "LZS", + "zipcode": "545000", + "province_id": "20" + }, + { + "city_id": "220", + "city_name": "桂林市", + "spell": "GUILINSHI", + "easy_spell": "GLS", + "zipcode": "541000", + "province_id": "20" + }, + { + "city_id": "221", + "city_name": "梧州市", + "spell": "WUZHOUSHI", + "easy_spell": "WZS", + "zipcode": "543000", + "province_id": "20" + }, + { + "city_id": "222", + "city_name": "北海市", + "spell": "BEIHAISHI", + "easy_spell": "BHS", + "zipcode": "536000", + "province_id": "20" + }, + { + "city_id": "223", + "city_name": "防城港市", + "spell": "FANGCHENGGANGSHI", + "easy_spell": "FCGS", + "zipcode": "538000", + "province_id": "20" + }, + { + "city_id": "224", + "city_name": "钦州市", + "spell": "QINZHOUSHI", + "easy_spell": "QZS", + "zipcode": "535000", + "province_id": "20" + }, + { + "city_id": "225", + "city_name": "贵港市", + "spell": "GUIGANGSHI", + "easy_spell": "GGS", + "zipcode": "537100", + "province_id": "20" + }, + { + "city_id": "226", + "city_name": "玉林市", + "spell": "YULINSHI", + "easy_spell": "YLS", + "zipcode": "537000", + "province_id": "20" + }, + { + "city_id": "227", + "city_name": "百色市", + "spell": "BAISESHI", + "easy_spell": "BSS", + "zipcode": "533000", + "province_id": "20" + }, + { + "city_id": "228", + "city_name": "贺州市", + "spell": "HEZHOUSHI", + "easy_spell": "HZS", + "zipcode": "542800", + "province_id": "20" + }, + { + "city_id": "229", + "city_name": "河池市", + "spell": "HECHISHI", + "easy_spell": "HCS", + "zipcode": "547000", + "province_id": "20" + }, + { + "city_id": "230", + "city_name": "来宾市", + "spell": "LAIBINSHI", + "easy_spell": "LBS", + "zipcode": "546100", + "province_id": "20" + }, + { + "city_id": "231", + "city_name": "崇左市", + "spell": "CHONGZUOSHI", + "easy_spell": "CZS", + "zipcode": "532200", + "province_id": "20" + }, + { + "city_id": "232", + "city_name": "海口市", + "spell": "HAIKOUSHI", + "easy_spell": "HKS", + "zipcode": "570000", + "province_id": "21" + }, + { + "city_id": "233", + "city_name": "三亚市", + "spell": "SANYASHI", + "easy_spell": "SYS", + "zipcode": "572000", + "province_id": "21" + }, + { + "city_id": "234", + "city_name": "重庆市", + "spell": "ZHONGQINGSHI", + "easy_spell": "ZQS", + "zipcode": "400000", + "province_id": "22" + }, + { + "city_id": "235", + "city_name": "成都市", + "spell": "CHENGDUSHI", + "easy_spell": "CDS", + "zipcode": "610000", + "province_id": "23" + }, + { + "city_id": "236", + "city_name": "自贡市", + "spell": "ZIGONGSHI", + "easy_spell": "ZGS", + "zipcode": "643000", + "province_id": "23" + }, + { + "city_id": "237", + "city_name": "攀枝花市", + "spell": "PANZHIHUASHI", + "easy_spell": "PZHS", + "zipcode": "617000", + "province_id": "23" + }, + { + "city_id": "238", + "city_name": "泸州市", + "spell": "ZUOZHOUSHI", + "easy_spell": "ZZS", + "zipcode": "646100", + "province_id": "23" + }, + { + "city_id": "239", + "city_name": "德阳市", + "spell": "DEYANGSHI", + "easy_spell": "DYS", + "zipcode": "618000", + "province_id": "23" + }, + { + "city_id": "240", + "city_name": "绵阳市", + "spell": "MIANYANGSHI", + "easy_spell": "MYS", + "zipcode": "621000", + "province_id": "23" + }, + { + "city_id": "241", + "city_name": "广元市", + "spell": "GUANGYUANSHI", + "easy_spell": "GYS", + "zipcode": "628000", + "province_id": "23" + }, + { + "city_id": "242", + "city_name": "遂宁市", + "spell": "SUININGSHI", + "easy_spell": "SNS", + "zipcode": "629000", + "province_id": "23" + }, + { + "city_id": "243", + "city_name": "内江市", + "spell": "NEIJIANGSHI", + "easy_spell": "NJS", + "zipcode": "641000", + "province_id": "23" + }, + { + "city_id": "244", + "city_name": "乐山市", + "spell": "LESHANSHI", + "easy_spell": "LSS", + "zipcode": "614000", + "province_id": "23" + }, + { + "city_id": "245", + "city_name": "南充市", + "spell": "NANCHONGSHI", + "easy_spell": "NCS", + "zipcode": "637000", + "province_id": "23" + }, + { + "city_id": "246", + "city_name": "眉山市", + "spell": "MEISHANSHI", + "easy_spell": "MSS", + "zipcode": "612100", + "province_id": "23" + }, + { + "city_id": "247", + "city_name": "宜宾市", + "spell": "YIBINSHI", + "easy_spell": "YBS", + "zipcode": "644000", + "province_id": "23" + }, + { + "city_id": "248", + "city_name": "广安市", + "spell": "GUANGANSHI", + "easy_spell": "GAS", + "zipcode": "638000", + "province_id": "23" + }, + { + "city_id": "249", + "city_name": "达州市", + "spell": "DAZHOUSHI", + "easy_spell": "DZS", + "zipcode": "635000", + "province_id": "23" + }, + { + "city_id": "250", + "city_name": "雅安市", + "spell": "YAANSHI", + "easy_spell": "YAS", + "zipcode": "625000", + "province_id": "23" + }, + { + "city_id": "251", + "city_name": "巴中市", + "spell": "BAZHONGSHI", + "easy_spell": "BZS", + "zipcode": "635500", + "province_id": "23" + }, + { + "city_id": "252", + "city_name": "资阳市", + "spell": "ZIYANGSHI", + "easy_spell": "ZYS", + "zipcode": "641300", + "province_id": "23" + }, + { + "city_id": "253", + "city_name": "阿坝藏族羌族自治州", + "spell": "ABACANGZUQIANGZUZIZHIZHOU", + "easy_spell": "ABCZQZZZZ", + "zipcode": "624600", + "province_id": "23" + }, + { + "city_id": "254", + "city_name": "甘孜藏族自治州", + "spell": "GANZICANGZUZIZHIZHOU", + "easy_spell": "GZCZZZZ", + "zipcode": "626000", + "province_id": "23" + }, + { + "city_id": "255", + "city_name": "凉山彝族自治州", + "spell": "LIANGSHANYIZUZIZHIZHOU", + "easy_spell": "LSYZZZZ", + "zipcode": "615000", + "province_id": "23" + }, + { + "city_id": "256", + "city_name": "贵阳市", + "spell": "GUIYANGSHI", + "easy_spell": "GYS", + "zipcode": "55000", + "province_id": "24" + }, + { + "city_id": "257", + "city_name": "六盘水市", + "spell": "LIUPANSHUISHI", + "easy_spell": "LPSS", + "zipcode": "553000", + "province_id": "24" + }, + { + "city_id": "258", + "city_name": "遵义市", + "spell": "ZUNYISHI", + "easy_spell": "ZYS", + "zipcode": "563000", + "province_id": "24" + }, + { + "city_id": "259", + "city_name": "安顺市", + "spell": "ANSHUNSHI", + "easy_spell": "ASS", + "zipcode": "561000", + "province_id": "24" + }, + { + "city_id": "260", + "city_name": "铜仁地区", + "spell": "TONGRENDIQU", + "easy_spell": "TRDQ", + "zipcode": "554300", + "province_id": "24" + }, + { + "city_id": "261", + "city_name": "黔西南布依族苗族自治州", + "spell": "QIANXINANBUYIZUMIAOZUZIZHIZHOU", + "easy_spell": "QXNBYZMZZZZ", + "zipcode": "551500", + "province_id": "24" + }, + { + "city_id": "262", + "city_name": "毕节地区", + "spell": "BIJIEDIQU", + "easy_spell": "BJDQ", + "zipcode": "551700", + "province_id": "24" + }, + { + "city_id": "263", + "city_name": "黔东南苗族侗族自治州", + "spell": "QIANDONGNANMIAOZUDONGZUZIZHIZHOU", + "easy_spell": "QDNMZDZZZZ", + "zipcode": "551500", + "province_id": "24" + }, + { + "city_id": "264", + "city_name": "黔南布依族苗族自治州", + "spell": "QIANNANBUYIZUMIAOZUZIZHIZHOU", + "easy_spell": "QNBYZMZZZZ", + "zipcode": "550100", + "province_id": "24" + }, + { + "city_id": "265", + "city_name": "昆明市", + "spell": "KUNMINGSHI", + "easy_spell": "KMS", + "zipcode": "650000", + "province_id": "25" + }, + { + "city_id": "266", + "city_name": "曲靖市", + "spell": "QUJINGSHI", + "easy_spell": "QJS", + "zipcode": "655000", + "province_id": "25" + }, + { + "city_id": "267", + "city_name": "玉溪市", + "spell": "YUXISHI", + "easy_spell": "YXS", + "zipcode": "653100", + "province_id": "25" + }, + { + "city_id": "268", + "city_name": "保山市", + "spell": "BAOSHANSHI", + "easy_spell": "BSS", + "zipcode": "678000", + "province_id": "25" + }, + { + "city_id": "269", + "city_name": "昭通市", + "spell": "ZHAOTONGSHI", + "easy_spell": "ZTS", + "zipcode": "657000", + "province_id": "25" + }, + { + "city_id": "270", + "city_name": "丽江市", + "spell": "LIJIANGSHI", + "easy_spell": "LJS", + "zipcode": "674100", + "province_id": "25" + }, + { + "city_id": "271", + "city_name": "思茅市", + "spell": "SIMAOSHI", + "easy_spell": "SMS", + "zipcode": "665000", + "province_id": "25" + }, + { + "city_id": "272", + "city_name": "临沧市", + "spell": "LINCANGSHI", + "easy_spell": "LCS", + "zipcode": "677000", + "province_id": "25" + }, + { + "city_id": "273", + "city_name": "楚雄彝族自治州", + "spell": "CHUXIONGYIZUZIZHIZHOU", + "easy_spell": "CXYZZZZ", + "zipcode": "675000", + "province_id": "25" + }, + { + "city_id": "274", + "city_name": "红河哈尼族彝族自治州", + "spell": "HONGHEHANIZUYIZUZIZHIZHOU", + "easy_spell": "HHHNZYZZZZ", + "zipcode": "654400", + "province_id": "25" + }, + { + "city_id": "275", + "city_name": "文山壮族苗族自治州", + "spell": "WENSHANZHUANGZUMIAOZUZIZHIZHOU", + "easy_spell": "WSZZMZZZZ", + "zipcode": "663000", + "province_id": "25" + }, + { + "city_id": "276", + "city_name": "西双版纳傣族自治州", + "spell": "XISHUANGBANNADAIZUZIZHIZHOU", + "easy_spell": "XSBNDZZZZ", + "zipcode": "666200", + "province_id": "25" + }, + { + "city_id": "277", + "city_name": "大理白族自治州", + "spell": "DALIBAIZUZIZHIZHOU", + "easy_spell": "DLBZZZZ", + "zipcode": "671000", + "province_id": "25" + }, + { + "city_id": "278", + "city_name": "德宏傣族景颇族自治州", + "spell": "DEHONGDAIZUJINGPOZUZIZHIZHOU", + "easy_spell": "DHDZJPZZZZ", + "zipcode": "678400", + "province_id": "25" + }, + { + "city_id": "279", + "city_name": "怒江傈僳族自治州", + "spell": "NUJIANGLISUZUZIZHIZHOU", + "easy_spell": "NJLSZZZZ", + "zipcode": "671400", + "province_id": "25" + }, + { + "city_id": "280", + "city_name": "迪庆藏族自治州", + "spell": "DIQINGCANGZUZIZHIZHOU", + "easy_spell": "DQCZZZZ", + "zipcode": "674400", + "province_id": "25" + }, + { + "city_id": "281", + "city_name": "拉萨市", + "spell": "LASASHI", + "easy_spell": "LSS", + "zipcode": "850000", + "province_id": "26" + }, + { + "city_id": "282", + "city_name": "昌都地区", + "spell": "CHANGDUDIQU", + "easy_spell": "CDDQ", + "zipcode": "854000", + "province_id": "26" + }, + { + "city_id": "283", + "city_name": "山南地区", + "spell": "SHANNANDIQU", + "easy_spell": "SNDQ", + "zipcode": "856000", + "province_id": "26" + }, + { + "city_id": "284", + "city_name": "日喀则地区", + "spell": "RIKAZEDIQU", + "easy_spell": "RKZDQ", + "zipcode": "857000", + "province_id": "26" + }, + { + "city_id": "285", + "city_name": "那曲地区", + "spell": "NAQUDIQU", + "easy_spell": "NQDQ", + "zipcode": "852000", + "province_id": "26" + }, + { + "city_id": "286", + "city_name": "阿里地区", + "spell": "ALIDIQU", + "easy_spell": "ALDQ", + "zipcode": "859100", + "province_id": "26" + }, + { + "city_id": "287", + "city_name": "林芝地区", + "spell": "LINZHIDIQU", + "easy_spell": "LZDQ", + "zipcode": "860100", + "province_id": "26" + }, + { + "city_id": "288", + "city_name": "西安市", + "spell": "XIANSHI", + "easy_spell": "XAS", + "zipcode": "710000", + "province_id": "27" + }, + { + "city_id": "289", + "city_name": "铜川市", + "spell": "TONGCHUANSHI", + "easy_spell": "TCS", + "zipcode": "727000", + "province_id": "27" + }, + { + "city_id": "290", + "city_name": "宝鸡市", + "spell": "BAOJISHI", + "easy_spell": "BJS", + "zipcode": "721000", + "province_id": "27" + }, + { + "city_id": "291", + "city_name": "咸阳市", + "spell": "XIANYANGSHI", + "easy_spell": "XYS", + "zipcode": "712000", + "province_id": "27" + }, + { + "city_id": "292", + "city_name": "渭南市", + "spell": "WEINANSHI", + "easy_spell": "WNS", + "zipcode": "714000", + "province_id": "27" + }, + { + "city_id": "293", + "city_name": "延安市", + "spell": "YANANSHI", + "easy_spell": "YAS", + "zipcode": "716000", + "province_id": "27" + }, + { + "city_id": "294", + "city_name": "汉中市", + "spell": "HANZHONGSHI", + "easy_spell": "HZS", + "zipcode": "723000", + "province_id": "27" + }, + { + "city_id": "295", + "city_name": "榆林市", + "spell": "YULINSHI", + "easy_spell": "YLS", + "zipcode": "719000", + "province_id": "27" + }, + { + "city_id": "296", + "city_name": "安康市", + "spell": "ANKANGSHI", + "easy_spell": "AKS", + "zipcode": "725000", + "province_id": "27" + }, + { + "city_id": "297", + "city_name": "商洛市", + "spell": "SHANGLUOSHI", + "easy_spell": "SLS", + "zipcode": "711500", + "province_id": "27" + }, + { + "city_id": "298", + "city_name": "兰州市", + "spell": "LANZHOUSHI", + "easy_spell": "LZS", + "zipcode": "730000", + "province_id": "28" + }, + { + "city_id": "299", + "city_name": "嘉峪关市", + "spell": "JIAYUGUANSHI", + "easy_spell": "JYGS", + "zipcode": "735100", + "province_id": "28" + }, + { + "city_id": "300", + "city_name": "金昌市", + "spell": "JINCHANGSHI", + "easy_spell": "JCS", + "zipcode": "737100", + "province_id": "28" + }, + { + "city_id": "301", + "city_name": "白银市", + "spell": "BAIYINSHI", + "easy_spell": "BYS", + "zipcode": "730900", + "province_id": "28" + }, + { + "city_id": "302", + "city_name": "天水市", + "spell": "TIANSHUISHI", + "easy_spell": "TSS", + "zipcode": "741000", + "province_id": "28" + }, + { + "city_id": "303", + "city_name": "武威市", + "spell": "WUWEISHI", + "easy_spell": "WWS", + "zipcode": "733000", + "province_id": "28" + }, + { + "city_id": "304", + "city_name": "张掖市", + "spell": "ZHANGYESHI", + "easy_spell": "ZYS", + "zipcode": "734000", + "province_id": "28" + }, + { + "city_id": "305", + "city_name": "平凉市", + "spell": "PINGLIANGSHI", + "easy_spell": "PLS", + "zipcode": "744000", + "province_id": "28" + }, + { + "city_id": "306", + "city_name": "酒泉市", + "spell": "JIUQUANSHI", + "easy_spell": "JQS", + "zipcode": "735000", + "province_id": "28" + }, + { + "city_id": "307", + "city_name": "庆阳市", + "spell": "QINGYANGSHI", + "easy_spell": "QYS", + "zipcode": "744500", + "province_id": "28" + }, + { + "city_id": "308", + "city_name": "定西市", + "spell": "DINGXISHI", + "easy_spell": "DXS", + "zipcode": "743000", + "province_id": "28" + }, + { + "city_id": "309", + "city_name": "陇南市", + "spell": "LONGNANSHI", + "easy_spell": "LNS", + "zipcode": "742100", + "province_id": "28" + }, + { + "city_id": "310", + "city_name": "临夏回族自治州", + "spell": "LINXIAHUIZUZIZHIZHOU", + "easy_spell": "LXHZZZZ", + "zipcode": "731100", + "province_id": "28" + }, + { + "city_id": "311", + "city_name": "甘南藏族自治州", + "spell": "GANNANCANGZUZIZHIZHOU", + "easy_spell": "GNCZZZZ", + "zipcode": "747000", + "province_id": "28" + }, + { + "city_id": "312", + "city_name": "西宁市", + "spell": "XININGSHI", + "easy_spell": "XNS", + "zipcode": "810000", + "province_id": "29" + }, + { + "city_id": "313", + "city_name": "海东地区", + "spell": "HAIDONGDIQU", + "easy_spell": "HDDQ", + "zipcode": "810600", + "province_id": "29" + }, + { + "city_id": "314", + "city_name": "海北藏族自治州", + "spell": "HAIBEICANGZUZIZHIZHOU", + "easy_spell": "HBCZZZZ", + "zipcode": "810300", + "province_id": "29" + }, + { + "city_id": "315", + "city_name": "黄南藏族自治州", + "spell": "HUANGNANCANGZUZIZHIZHOU", + "easy_spell": "HNCZZZZ", + "zipcode": "811300", + "province_id": "29" + }, + { + "city_id": "316", + "city_name": "海南藏族自治州", + "spell": "HAINANCANGZUZIZHIZHOU", + "easy_spell": "HNCZZZZ", + "zipcode": "813000", + "province_id": "29" + }, + { + "city_id": "317", + "city_name": "果洛藏族自治州", + "spell": "GUOLUOCANGZUZIZHIZHOU", + "easy_spell": "GLCZZZZ", + "zipcode": "814000", + "province_id": "29" + }, + { + "city_id": "318", + "city_name": "玉树藏族自治州", + "spell": "YUSHUCANGZUZIZHIZHOU", + "easy_spell": "YSCZZZZ", + "zipcode": "815000", + "province_id": "29" + }, + { + "city_id": "319", + "city_name": "海西蒙古族藏族自治州", + "spell": "HAIXIMENGGUZUCANGZUZIZHIZHOU", + "easy_spell": "HXMGZCZZZZ", + "zipcode": "817000", + "province_id": "29" + }, + { + "city_id": "320", + "city_name": "银川市", + "spell": "YINCHUANSHI", + "easy_spell": "YCS", + "zipcode": "750000", + "province_id": "30" + }, + { + "city_id": "321", + "city_name": "石嘴山市", + "spell": "SHIZUISHANSHI", + "easy_spell": "SZSS", + "zipcode": "753000", + "province_id": "30" + }, + { + "city_id": "322", + "city_name": "吴忠市", + "spell": "WUZHONGSHI", + "easy_spell": "WZS", + "zipcode": "751100", + "province_id": "30" + }, + { + "city_id": "323", + "city_name": "固原市", + "spell": "GUYUANSHI", + "easy_spell": "GYS", + "zipcode": "756000", + "province_id": "30" + }, + { + "city_id": "324", + "city_name": "中卫市", + "spell": "ZHONGWEISHI", + "easy_spell": "ZWS", + "zipcode": "751700", + "province_id": "30" + }, + { + "city_id": "325", + "city_name": "乌鲁木齐市", + "spell": "WULUMUQISHI", + "easy_spell": "WLMQS", + "zipcode": "830000", + "province_id": "31" + }, + { + "city_id": "326", + "city_name": "克拉玛依市", + "spell": "KELAMAYISHI", + "easy_spell": "KLMYS", + "zipcode": "834000", + "province_id": "31" + }, + { + "city_id": "327", + "city_name": "吐鲁番地区", + "spell": "TULUFANDIQU", + "easy_spell": "TLFDQ", + "zipcode": "838000", + "province_id": "31" + }, + { + "city_id": "328", + "city_name": "哈密地区", + "spell": "HAMIDIQU", + "easy_spell": "HMDQ", + "zipcode": "839000", + "province_id": "31" + }, + { + "city_id": "329", + "city_name": "昌吉回族自治州", + "spell": "CHANGJIHUIZUZIZHIZHOU", + "easy_spell": "CJHZZZZ", + "zipcode": "831100", + "province_id": "31" + }, + { + "city_id": "330", + "city_name": "博尔塔拉蒙古自治州", + "spell": "BOERTALAMENGGUZIZHIZHOU", + "easy_spell": "BETLMGZZZ", + "zipcode": "833400", + "province_id": "31" + }, + { + "city_id": "331", + "city_name": "巴音郭楞蒙古自治州", + "spell": "BAYINGUOLENGMENGGUZIZHIZHOU", + "easy_spell": "BYGLMGZZZ", + "zipcode": "841000", + "province_id": "31" + }, + { + "city_id": "332", + "city_name": "阿克苏地区", + "spell": "AKESUDIQU", + "easy_spell": "AKSDQ", + "zipcode": "843000", + "province_id": "31" + }, + { + "city_id": "333", + "city_name": "克孜勒苏柯尔克孜自治州", + "spell": "KEZILESUKEERKEZIZIZHIZHOU", + "easy_spell": "KZLSKEKZZZZ", + "zipcode": "835600", + "province_id": "31" + }, + { + "city_id": "334", + "city_name": "喀什地区", + "spell": "KASHIDIQU", + "easy_spell": "KSDQ", + "zipcode": "844000", + "province_id": "31" + }, + { + "city_id": "335", + "city_name": "和田地区", + "spell": "HETIANDIQU", + "easy_spell": "HTDQ", + "zipcode": "848000", + "province_id": "31" + }, + { + "city_id": "336", + "city_name": "伊犁哈萨克自治州", + "spell": "YILIHASAKEZIZHIZHOU", + "easy_spell": "YLHSKZZZ", + "zipcode": "833200", + "province_id": "31" + }, + { + "city_id": "337", + "city_name": "塔城地区", + "spell": "TACHENGDIQU", + "easy_spell": "TCDQ", + "zipcode": "834700", + "province_id": "31" + }, + { + "city_id": "338", + "city_name": "阿勒泰地区", + "spell": "ALETAIDIQU", + "easy_spell": "ALTDQ", + "zipcode": "836500", + "province_id": "31" + }, + { + "city_id": "339", + "city_name": "石河子市", + "spell": "SHIHEZISHI", + "easy_spell": "SHZS", + "zipcode": "832000", + "province_id": "31" + }, + { + "city_id": "340", + "city_name": "阿拉尔市", + "spell": "ALAERSHI", + "easy_spell": "ALES", + "zipcode": "843300", + "province_id": "31" + }, + { + "city_id": "341", + "city_name": "图木舒克市", + "spell": "TUMUSHUKESHI", + "easy_spell": "TMSKS", + "zipcode": "843900", + "province_id": "31" + }, + { + "city_id": "342", + "city_name": "五家渠市", + "spell": "WUJIAQUSHI", + "easy_spell": "WJQS", + "zipcode": "831300", + "province_id": "31" + }, + { + "city_id": "343", + "city_name": "香港", + "spell": "XIANGGANGTEBIEXINGZHENGQU", + "easy_spell": "XGTBXZQ", + "zipcode": "000000", + "province_id": "32" + }, + { + "city_id": "344", + "city_name": "澳门", + "spell": "AOMENTEBIEXINGZHENGQU", + "easy_spell": "AMTBXZQ", + "zipcode": "000000", + "province_id": "33" + }, + { + "city_id": "345", + "city_name": "台湾", + "spell": "TAIWANSHENG", + "easy_spell": "TWS", + "zipcode": "000000", + "province_id": "34" + } +] +module.exports = data; diff --git a/json/area_district.js b/json/area_district.js new file mode 100755 index 00000000..e5825bcc --- /dev/null +++ b/json/area_district.js @@ -0,0 +1,20058 @@ +let data = [ + { + "district_id": "1", + "district_name": "东城区", + "spell": "dongchengqu", + "easy_spell": "dcq", + "city_id": "1" + }, + { + "district_id": "2", + "district_name": "西城区", + "spell": "xichengqu", + "easy_spell": "xcq", + "city_id": "1" + }, + { + "district_id": "3", + "district_name": "崇文区", + "spell": "chongwenqu", + "easy_spell": "cwq", + "city_id": "1" + }, + { + "district_id": "4", + "district_name": "宣武区", + "spell": "xuanwuqu", + "easy_spell": "xwq", + "city_id": "1" + }, + { + "district_id": "5", + "district_name": "朝阳区", + "spell": "chaoyangqu", + "easy_spell": "cyq", + "city_id": "1" + }, + { + "district_id": "6", + "district_name": "丰台区", + "spell": "fengtaiqu", + "easy_spell": "ftq", + "city_id": "1" + }, + { + "district_id": "7", + "district_name": "石景山区", + "spell": "shijingshanqu", + "easy_spell": "sjsq", + "city_id": "1" + }, + { + "district_id": "8", + "district_name": "海淀区", + "spell": "haidianqu", + "easy_spell": "hdq", + "city_id": "1" + }, + { + "district_id": "9", + "district_name": "门头沟区", + "spell": "mentougouqu", + "easy_spell": "mtgq", + "city_id": "1" + }, + { + "district_id": "10", + "district_name": "房山区", + "spell": "fangshanqu", + "easy_spell": "fsq", + "city_id": "1" + }, + { + "district_id": "11", + "district_name": "通州区", + "spell": "tongzhouqu", + "easy_spell": "tzq", + "city_id": "1" + }, + { + "district_id": "12", + "district_name": "顺义区", + "spell": "shunyiqu", + "easy_spell": "syq", + "city_id": "1" + }, + { + "district_id": "13", + "district_name": "昌平区", + "spell": "changpingqu", + "easy_spell": "cpq", + "city_id": "1" + }, + { + "district_id": "14", + "district_name": "大兴区", + "spell": "daxingqu", + "easy_spell": "dxq", + "city_id": "1" + }, + { + "district_id": "15", + "district_name": "怀柔区", + "spell": "huairouqu", + "easy_spell": "hrq", + "city_id": "1" + }, + { + "district_id": "16", + "district_name": "平谷区", + "spell": "pingguqu", + "easy_spell": "pgq", + "city_id": "1" + }, + { + "district_id": "17", + "district_name": "密云县", + "spell": "miyunxian", + "easy_spell": "myx", + "city_id": "1" + }, + { + "district_id": "18", + "district_name": "延庆县", + "spell": "yanqingxian", + "easy_spell": "yqx", + "city_id": "1" + }, + { + "district_id": "19", + "district_name": "和平区", + "spell": "hepingqu", + "easy_spell": "hpq", + "city_id": "2" + }, + { + "district_id": "20", + "district_name": "河东区", + "spell": "hedongqu", + "easy_spell": "hdq", + "city_id": "2" + }, + { + "district_id": "21", + "district_name": "河西区", + "spell": "hexiqu", + "easy_spell": "hxq", + "city_id": "2" + }, + { + "district_id": "22", + "district_name": "南开区", + "spell": "nankaiqu", + "easy_spell": "nkq", + "city_id": "2" + }, + { + "district_id": "23", + "district_name": "河北区", + "spell": "hebeiqu", + "easy_spell": "hbq", + "city_id": "2" + }, + { + "district_id": "24", + "district_name": "红桥区", + "spell": "hongqiaoqu", + "easy_spell": "hqq", + "city_id": "2" + }, + { + "district_id": "25", + "district_name": "塘沽区", + "spell": "tangguqu", + "easy_spell": "tgq", + "city_id": "2" + }, + { + "district_id": "26", + "district_name": "汉沽区", + "spell": "hanguqu", + "easy_spell": "hgq", + "city_id": "2" + }, + { + "district_id": "27", + "district_name": "大港区", + "spell": "dagangqu", + "easy_spell": "dgq", + "city_id": "2" + }, + { + "district_id": "28", + "district_name": "东丽区", + "spell": "dongliqu", + "easy_spell": "dlq", + "city_id": "2" + }, + { + "district_id": "29", + "district_name": "西青区", + "spell": "xiqingqu", + "easy_spell": "xqq", + "city_id": "2" + }, + { + "district_id": "30", + "district_name": "津南区", + "spell": "jinnanqu", + "easy_spell": "jnq", + "city_id": "2" + }, + { + "district_id": "31", + "district_name": "北辰区", + "spell": "beichenqu", + "easy_spell": "bcq", + "city_id": "2" + }, + { + "district_id": "32", + "district_name": "武清区", + "spell": "wuqingqu", + "easy_spell": "wqq", + "city_id": "2" + }, + { + "district_id": "33", + "district_name": "宝坻区", + "spell": "baozuoqu", + "easy_spell": "bzq", + "city_id": "2" + }, + { + "district_id": "34", + "district_name": "宁河县", + "spell": "ninghexian", + "easy_spell": "nhx", + "city_id": "2" + }, + { + "district_id": "35", + "district_name": "静海县", + "spell": "jinghaixian", + "easy_spell": "jhx", + "city_id": "2" + }, + { + "district_id": "36", + "district_name": "蓟县", + "spell": "jixian", + "easy_spell": "jx", + "city_id": "2" + }, + { + "district_id": "37", + "district_name": "长安区", + "spell": "changanqu", + "easy_spell": "caq", + "city_id": "3" + }, + { + "district_id": "38", + "district_name": "桥东区", + "spell": "qiaodongqu", + "easy_spell": "qdq", + "city_id": "3" + }, + { + "district_id": "39", + "district_name": "桥西区", + "spell": "qiaoxiqu", + "easy_spell": "qxq", + "city_id": "3" + }, + { + "district_id": "40", + "district_name": "新华区", + "spell": "xinhuaqu", + "easy_spell": "xhq", + "city_id": "3" + }, + { + "district_id": "41", + "district_name": "井陉矿区", + "spell": "jingzuokuangqu", + "easy_spell": "jzkq", + "city_id": "3" + }, + { + "district_id": "42", + "district_name": "裕华区", + "spell": "yuhuaqu", + "easy_spell": "yhq", + "city_id": "3" + }, + { + "district_id": "43", + "district_name": "井陉县", + "spell": "jingzuoxian", + "easy_spell": "jzx", + "city_id": "3" + }, + { + "district_id": "44", + "district_name": "正定县", + "spell": "zhengdingxian", + "easy_spell": "zdx", + "city_id": "3" + }, + { + "district_id": "45", + "district_name": "栾城县", + "spell": "zuochengxian", + "easy_spell": "zcx", + "city_id": "3" + }, + { + "district_id": "46", + "district_name": "行唐县", + "spell": "xingtangxian", + "easy_spell": "xtx", + "city_id": "3" + }, + { + "district_id": "47", + "district_name": "灵寿县", + "spell": "lingshouxian", + "easy_spell": "lsx", + "city_id": "3" + }, + { + "district_id": "48", + "district_name": "高邑县", + "spell": "gaoyixian", + "easy_spell": "gyx", + "city_id": "3" + }, + { + "district_id": "49", + "district_name": "深泽县", + "spell": "shenzexian", + "easy_spell": "szx", + "city_id": "3" + }, + { + "district_id": "50", + "district_name": "赞皇县", + "spell": "zanhuangxian", + "easy_spell": "zhx", + "city_id": "3" + }, + { + "district_id": "51", + "district_name": "无极县", + "spell": "wujixian", + "easy_spell": "wjx", + "city_id": "3" + }, + { + "district_id": "52", + "district_name": "平山县", + "spell": "pingshanxian", + "easy_spell": "psx", + "city_id": "3" + }, + { + "district_id": "53", + "district_name": "元氏县", + "spell": "yuanshixian", + "easy_spell": "ysx", + "city_id": "3" + }, + { + "district_id": "54", + "district_name": "赵县", + "spell": "zhaoxian", + "easy_spell": "zx", + "city_id": "3" + }, + { + "district_id": "55", + "district_name": "辛集市", + "spell": "xinjishi", + "easy_spell": "xjs", + "city_id": "3" + }, + { + "district_id": "56", + "district_name": "藁城市", + "spell": "zuochengshi", + "easy_spell": "zcs", + "city_id": "3" + }, + { + "district_id": "57", + "district_name": "晋州市", + "spell": "jinzhoushi", + "easy_spell": "jzs", + "city_id": "3" + }, + { + "district_id": "58", + "district_name": "新乐市", + "spell": "xinleshi", + "easy_spell": "xls", + "city_id": "3" + }, + { + "district_id": "59", + "district_name": "鹿泉市", + "spell": "luquanshi", + "easy_spell": "lqs", + "city_id": "3" + }, + { + "district_id": "60", + "district_name": "路南区", + "spell": "lunanqu", + "easy_spell": "lnq", + "city_id": "4" + }, + { + "district_id": "61", + "district_name": "路北区", + "spell": "lubeiqu", + "easy_spell": "lbq", + "city_id": "4" + }, + { + "district_id": "62", + "district_name": "古冶区", + "spell": "guyequ", + "easy_spell": "gyq", + "city_id": "4" + }, + { + "district_id": "63", + "district_name": "开平区", + "spell": "kaipingqu", + "easy_spell": "kpq", + "city_id": "4" + }, + { + "district_id": "64", + "district_name": "丰南区", + "spell": "fengnanqu", + "easy_spell": "fnq", + "city_id": "4" + }, + { + "district_id": "65", + "district_name": "丰润区", + "spell": "fengrunqu", + "easy_spell": "frq", + "city_id": "4" + }, + { + "district_id": "66", + "district_name": "滦县", + "spell": "luanxian", + "easy_spell": "lx", + "city_id": "4" + }, + { + "district_id": "67", + "district_name": "滦南县", + "spell": "luannanxian", + "easy_spell": "lnx", + "city_id": "4" + }, + { + "district_id": "68", + "district_name": "乐亭县", + "spell": "letingxian", + "easy_spell": "ltx", + "city_id": "4" + }, + { + "district_id": "69", + "district_name": "迁西县", + "spell": "qianxixian", + "easy_spell": "qxx", + "city_id": "4" + }, + { + "district_id": "70", + "district_name": "玉田县", + "spell": "yutianxian", + "easy_spell": "ytx", + "city_id": "4" + }, + { + "district_id": "71", + "district_name": "唐海县", + "spell": "tanghaixian", + "easy_spell": "thx", + "city_id": "4" + }, + { + "district_id": "72", + "district_name": "遵化市", + "spell": "zunhuashi", + "easy_spell": "zhs", + "city_id": "4" + }, + { + "district_id": "73", + "district_name": "迁安市", + "spell": "qiananshi", + "easy_spell": "qas", + "city_id": "4" + }, + { + "district_id": "74", + "district_name": "海港区", + "spell": "haigangqu", + "easy_spell": "hgq", + "city_id": "5" + }, + { + "district_id": "75", + "district_name": "山海关区", + "spell": "shanhaiguanqu", + "easy_spell": "shgq", + "city_id": "5" + }, + { + "district_id": "76", + "district_name": "北戴河区", + "spell": "beidaihequ", + "easy_spell": "bdhq", + "city_id": "5" + }, + { + "district_id": "77", + "district_name": "青龙满族自治县", + "spell": "qinglongmanzuzizhixian", + "easy_spell": "qlmzzzx", + "city_id": "5" + }, + { + "district_id": "78", + "district_name": "昌黎县", + "spell": "changlixian", + "easy_spell": "clx", + "city_id": "5" + }, + { + "district_id": "79", + "district_name": "抚宁县", + "spell": "funingxian", + "easy_spell": "fnx", + "city_id": "5" + }, + { + "district_id": "80", + "district_name": "卢龙县", + "spell": "lulongxian", + "easy_spell": "llx", + "city_id": "5" + }, + { + "district_id": "81", + "district_name": "邯山区", + "spell": "hanshanqu", + "easy_spell": "hsq", + "city_id": "6" + }, + { + "district_id": "82", + "district_name": "丛台区", + "spell": "congtaiqu", + "easy_spell": "ctq", + "city_id": "6" + }, + { + "district_id": "83", + "district_name": "复兴区", + "spell": "fuxingqu", + "easy_spell": "fxq", + "city_id": "6" + }, + { + "district_id": "84", + "district_name": "峰峰矿区", + "spell": "fengfengkuangqu", + "easy_spell": "ffkq", + "city_id": "6" + }, + { + "district_id": "85", + "district_name": "邯郸县", + "spell": "handanxian", + "easy_spell": "hdx", + "city_id": "6" + }, + { + "district_id": "86", + "district_name": "临漳县", + "spell": "linzhangxian", + "easy_spell": "lzx", + "city_id": "6" + }, + { + "district_id": "87", + "district_name": "成安县", + "spell": "chenganxian", + "easy_spell": "cax", + "city_id": "6" + }, + { + "district_id": "88", + "district_name": "大名县", + "spell": "damingxian", + "easy_spell": "dmx", + "city_id": "6" + }, + { + "district_id": "89", + "district_name": "涉县", + "spell": "shexian", + "easy_spell": "sx", + "city_id": "6" + }, + { + "district_id": "90", + "district_name": "磁县", + "spell": "cixian", + "easy_spell": "cx", + "city_id": "6" + }, + { + "district_id": "91", + "district_name": "肥乡县", + "spell": "feixiangxian", + "easy_spell": "fxx", + "city_id": "6" + }, + { + "district_id": "92", + "district_name": "永年县", + "spell": "yongnianxian", + "easy_spell": "ynx", + "city_id": "6" + }, + { + "district_id": "93", + "district_name": "邱县", + "spell": "qiuxian", + "easy_spell": "qx", + "city_id": "6" + }, + { + "district_id": "94", + "district_name": "鸡泽县", + "spell": "jizexian", + "easy_spell": "jzx", + "city_id": "6" + }, + { + "district_id": "95", + "district_name": "广平县", + "spell": "guangpingxian", + "easy_spell": "gpx", + "city_id": "6" + }, + { + "district_id": "96", + "district_name": "馆陶县", + "spell": "guantaoxian", + "easy_spell": "gtx", + "city_id": "6" + }, + { + "district_id": "97", + "district_name": "魏县", + "spell": "weixian", + "easy_spell": "wx", + "city_id": "6" + }, + { + "district_id": "98", + "district_name": "曲周县", + "spell": "quzhouxian", + "easy_spell": "qzx", + "city_id": "6" + }, + { + "district_id": "99", + "district_name": "武安市", + "spell": "wuanshi", + "easy_spell": "was", + "city_id": "6" + }, + { + "district_id": "100", + "district_name": "桥东区", + "spell": "qiaodongqu", + "easy_spell": "qdq", + "city_id": "7" + }, + { + "district_id": "101", + "district_name": "桥西区", + "spell": "qiaoxiqu", + "easy_spell": "qxq", + "city_id": "7" + }, + { + "district_id": "102", + "district_name": "邢台县", + "spell": "xingtaixian", + "easy_spell": "xtx", + "city_id": "7" + }, + { + "district_id": "103", + "district_name": "临城县", + "spell": "linchengxian", + "easy_spell": "lcx", + "city_id": "7" + }, + { + "district_id": "104", + "district_name": "内丘县", + "spell": "neiqiuxian", + "easy_spell": "nqx", + "city_id": "7" + }, + { + "district_id": "105", + "district_name": "柏乡县", + "spell": "baixiangxian", + "easy_spell": "bxx", + "city_id": "7" + }, + { + "district_id": "106", + "district_name": "隆尧县", + "spell": "longyaoxian", + "easy_spell": "lyx", + "city_id": "7" + }, + { + "district_id": "107", + "district_name": "任县", + "spell": "renxian", + "easy_spell": "rx", + "city_id": "7" + }, + { + "district_id": "108", + "district_name": "南和县", + "spell": "nanhexian", + "easy_spell": "nhx", + "city_id": "7" + }, + { + "district_id": "109", + "district_name": "宁晋县", + "spell": "ningjinxian", + "easy_spell": "njx", + "city_id": "7" + }, + { + "district_id": "110", + "district_name": "巨鹿县", + "spell": "juluxian", + "easy_spell": "jlx", + "city_id": "7" + }, + { + "district_id": "111", + "district_name": "新河县", + "spell": "xinhexian", + "easy_spell": "xhx", + "city_id": "7" + }, + { + "district_id": "112", + "district_name": "广宗县", + "spell": "guangzongxian", + "easy_spell": "gzx", + "city_id": "7" + }, + { + "district_id": "113", + "district_name": "平乡县", + "spell": "pingxiangxian", + "easy_spell": "pxx", + "city_id": "7" + }, + { + "district_id": "114", + "district_name": "威县", + "spell": "weixian", + "easy_spell": "wx", + "city_id": "7" + }, + { + "district_id": "115", + "district_name": "清河县", + "spell": "qinghexian", + "easy_spell": "qhx", + "city_id": "7" + }, + { + "district_id": "116", + "district_name": "临西县", + "spell": "linxixian", + "easy_spell": "lxx", + "city_id": "7" + }, + { + "district_id": "117", + "district_name": "南宫市", + "spell": "nangongshi", + "easy_spell": "ngs", + "city_id": "7" + }, + { + "district_id": "118", + "district_name": "沙河市", + "spell": "shaheshi", + "easy_spell": "shs", + "city_id": "7" + }, + { + "district_id": "119", + "district_name": "新市区", + "spell": "xinshiqu", + "easy_spell": "xsq", + "city_id": "8" + }, + { + "district_id": "120", + "district_name": "北市区", + "spell": "beishiqu", + "easy_spell": "bsq", + "city_id": "8" + }, + { + "district_id": "121", + "district_name": "南市区", + "spell": "nanshiqu", + "easy_spell": "nsq", + "city_id": "8" + }, + { + "district_id": "122", + "district_name": "满城县", + "spell": "manchengxian", + "easy_spell": "mcx", + "city_id": "8" + }, + { + "district_id": "123", + "district_name": "清苑县", + "spell": "qingyuanxian", + "easy_spell": "qyx", + "city_id": "8" + }, + { + "district_id": "124", + "district_name": "涞水县", + "spell": "zuoshuixian", + "easy_spell": "zsx", + "city_id": "8" + }, + { + "district_id": "125", + "district_name": "阜平县", + "spell": "fupingxian", + "easy_spell": "fpx", + "city_id": "8" + }, + { + "district_id": "126", + "district_name": "徐水县", + "spell": "xushuixian", + "easy_spell": "xsx", + "city_id": "8" + }, + { + "district_id": "127", + "district_name": "定兴县", + "spell": "dingxingxian", + "easy_spell": "dxx", + "city_id": "8" + }, + { + "district_id": "128", + "district_name": "唐县", + "spell": "tangxian", + "easy_spell": "tx", + "city_id": "8" + }, + { + "district_id": "129", + "district_name": "高阳县", + "spell": "gaoyangxian", + "easy_spell": "gyx", + "city_id": "8" + }, + { + "district_id": "130", + "district_name": "容城县", + "spell": "rongchengxian", + "easy_spell": "rcx", + "city_id": "8" + }, + { + "district_id": "131", + "district_name": "涞源县", + "spell": "zuoyuanxian", + "easy_spell": "zyx", + "city_id": "8" + }, + { + "district_id": "132", + "district_name": "望都县", + "spell": "wangduxian", + "easy_spell": "wdx", + "city_id": "8" + }, + { + "district_id": "133", + "district_name": "安新县", + "spell": "anxinxian", + "easy_spell": "axx", + "city_id": "8" + }, + { + "district_id": "134", + "district_name": "易县", + "spell": "yixian", + "easy_spell": "yx", + "city_id": "8" + }, + { + "district_id": "135", + "district_name": "曲阳县", + "spell": "quyangxian", + "easy_spell": "qyx", + "city_id": "8" + }, + { + "district_id": "136", + "district_name": "蠡县", + "spell": "zuoxian", + "easy_spell": "zx", + "city_id": "8" + }, + { + "district_id": "137", + "district_name": "顺平县", + "spell": "shunpingxian", + "easy_spell": "spx", + "city_id": "8" + }, + { + "district_id": "138", + "district_name": "博野县", + "spell": "boyexian", + "easy_spell": "byx", + "city_id": "8" + }, + { + "district_id": "139", + "district_name": "雄县", + "spell": "xiongxian", + "easy_spell": "xx", + "city_id": "8" + }, + { + "district_id": "140", + "district_name": "涿州市", + "spell": "zuozhoushi", + "easy_spell": "zzs", + "city_id": "8" + }, + { + "district_id": "141", + "district_name": "定州市", + "spell": "dingzhoushi", + "easy_spell": "dzs", + "city_id": "8" + }, + { + "district_id": "142", + "district_name": "安国市", + "spell": "anguoshi", + "easy_spell": "ags", + "city_id": "8" + }, + { + "district_id": "143", + "district_name": "高碑店市", + "spell": "gaobeidianshi", + "easy_spell": "gbds", + "city_id": "8" + }, + { + "district_id": "144", + "district_name": "桥东区", + "spell": "qiaodongqu", + "easy_spell": "qdq", + "city_id": "9" + }, + { + "district_id": "145", + "district_name": "桥西区", + "spell": "qiaoxiqu", + "easy_spell": "qxq", + "city_id": "9" + }, + { + "district_id": "146", + "district_name": "宣化区", + "spell": "xuanhuaqu", + "easy_spell": "xhq", + "city_id": "9" + }, + { + "district_id": "147", + "district_name": "下花园区", + "spell": "xiahuayuanqu", + "easy_spell": "xhyq", + "city_id": "9" + }, + { + "district_id": "148", + "district_name": "宣化县", + "spell": "xuanhuaxian", + "easy_spell": "xhx", + "city_id": "9" + }, + { + "district_id": "149", + "district_name": "张北县", + "spell": "zhangbeixian", + "easy_spell": "zbx", + "city_id": "9" + }, + { + "district_id": "150", + "district_name": "康保县", + "spell": "kangbaoxian", + "easy_spell": "kbx", + "city_id": "9" + }, + { + "district_id": "151", + "district_name": "沽源县", + "spell": "guyuanxian", + "easy_spell": "gyx", + "city_id": "9" + }, + { + "district_id": "152", + "district_name": "尚义县", + "spell": "shangyixian", + "easy_spell": "syx", + "city_id": "9" + }, + { + "district_id": "153", + "district_name": "蔚县", + "spell": "weixian", + "easy_spell": "wx", + "city_id": "9" + }, + { + "district_id": "154", + "district_name": "阳原县", + "spell": "yangyuanxian", + "easy_spell": "yyx", + "city_id": "9" + }, + { + "district_id": "155", + "district_name": "怀安县", + "spell": "huaianxian", + "easy_spell": "hax", + "city_id": "9" + }, + { + "district_id": "156", + "district_name": "万全县", + "spell": "wanquanxian", + "easy_spell": "wqx", + "city_id": "9" + }, + { + "district_id": "157", + "district_name": "怀来县", + "spell": "huailaixian", + "easy_spell": "hlx", + "city_id": "9" + }, + { + "district_id": "158", + "district_name": "涿鹿县", + "spell": "zuoluxian", + "easy_spell": "zlx", + "city_id": "9" + }, + { + "district_id": "159", + "district_name": "赤城县", + "spell": "chichengxian", + "easy_spell": "ccx", + "city_id": "9" + }, + { + "district_id": "160", + "district_name": "崇礼县", + "spell": "chonglixian", + "easy_spell": "clx", + "city_id": "9" + }, + { + "district_id": "161", + "district_name": "双桥区", + "spell": "shuangqiaoqu", + "easy_spell": "sqq", + "city_id": "10" + }, + { + "district_id": "162", + "district_name": "双滦区", + "spell": "shuangluanqu", + "easy_spell": "slq", + "city_id": "10" + }, + { + "district_id": "163", + "district_name": "鹰手营子矿区", + "spell": "yingshouyingzikuangqu", + "easy_spell": "ysyzkq", + "city_id": "10" + }, + { + "district_id": "164", + "district_name": "承德县", + "spell": "chengdexian", + "easy_spell": "cdx", + "city_id": "10" + }, + { + "district_id": "165", + "district_name": "兴隆县", + "spell": "xinglongxian", + "easy_spell": "xlx", + "city_id": "10" + }, + { + "district_id": "166", + "district_name": "平泉县", + "spell": "pingquanxian", + "easy_spell": "pqx", + "city_id": "10" + }, + { + "district_id": "167", + "district_name": "滦平县", + "spell": "luanpingxian", + "easy_spell": "lpx", + "city_id": "10" + }, + { + "district_id": "168", + "district_name": "隆化县", + "spell": "longhuaxian", + "easy_spell": "lhx", + "city_id": "10" + }, + { + "district_id": "169", + "district_name": "丰宁满族自治县", + "spell": "fengningmanzuzizhixian", + "easy_spell": "fnmzzzx", + "city_id": "10" + }, + { + "district_id": "170", + "district_name": "宽城满族自治县", + "spell": "kuanchengmanzuzizhixian", + "easy_spell": "kcmzzzx", + "city_id": "10" + }, + { + "district_id": "171", + "district_name": "围场满族蒙古族自治县", + "spell": "weichangmanzumengguzuzizhixian", + "easy_spell": "wcmzmgzzzx", + "city_id": "10" + }, + { + "district_id": "172", + "district_name": "新华区", + "spell": "xinhuaqu", + "easy_spell": "xhq", + "city_id": "11" + }, + { + "district_id": "173", + "district_name": "运河区", + "spell": "yunhequ", + "easy_spell": "yhq", + "city_id": "11" + }, + { + "district_id": "174", + "district_name": "沧县", + "spell": "cangxian", + "easy_spell": "cx", + "city_id": "11" + }, + { + "district_id": "175", + "district_name": "青县", + "spell": "qingxian", + "easy_spell": "qx", + "city_id": "11" + }, + { + "district_id": "176", + "district_name": "东光县", + "spell": "dongguangxian", + "easy_spell": "dgx", + "city_id": "11" + }, + { + "district_id": "177", + "district_name": "海兴县", + "spell": "haixingxian", + "easy_spell": "hxx", + "city_id": "11" + }, + { + "district_id": "178", + "district_name": "盐山县", + "spell": "yanshanxian", + "easy_spell": "ysx", + "city_id": "11" + }, + { + "district_id": "179", + "district_name": "肃宁县", + "spell": "suningxian", + "easy_spell": "snx", + "city_id": "11" + }, + { + "district_id": "180", + "district_name": "南皮县", + "spell": "nanpixian", + "easy_spell": "npx", + "city_id": "11" + }, + { + "district_id": "181", + "district_name": "吴桥县", + "spell": "wuqiaoxian", + "easy_spell": "wqx", + "city_id": "11" + }, + { + "district_id": "182", + "district_name": "献县", + "spell": "xianxian", + "easy_spell": "xx", + "city_id": "11" + }, + { + "district_id": "183", + "district_name": "孟村回族自治县", + "spell": "mengcunhuizuzizhixian", + "easy_spell": "mchzzzx", + "city_id": "11" + }, + { + "district_id": "184", + "district_name": "泊头市", + "spell": "botoushi", + "easy_spell": "bts", + "city_id": "11" + }, + { + "district_id": "185", + "district_name": "任丘市", + "spell": "renqiushi", + "easy_spell": "rqs", + "city_id": "11" + }, + { + "district_id": "186", + "district_name": "黄骅市", + "spell": "huangzuoshi", + "easy_spell": "hzs", + "city_id": "11" + }, + { + "district_id": "187", + "district_name": "河间市", + "spell": "hejianshi", + "easy_spell": "hjs", + "city_id": "11" + }, + { + "district_id": "188", + "district_name": "安次区", + "spell": "anciqu", + "easy_spell": "acq", + "city_id": "12" + }, + { + "district_id": "189", + "district_name": "广阳区", + "spell": "guangyangqu", + "easy_spell": "gyq", + "city_id": "12" + }, + { + "district_id": "190", + "district_name": "固安县", + "spell": "guanxian", + "easy_spell": "gax", + "city_id": "12" + }, + { + "district_id": "191", + "district_name": "永清县", + "spell": "yongqingxian", + "easy_spell": "yqx", + "city_id": "12" + }, + { + "district_id": "192", + "district_name": "香河县", + "spell": "xianghexian", + "easy_spell": "xhx", + "city_id": "12" + }, + { + "district_id": "193", + "district_name": "大城县", + "spell": "dachengxian", + "easy_spell": "dcx", + "city_id": "12" + }, + { + "district_id": "194", + "district_name": "文安县", + "spell": "wenanxian", + "easy_spell": "wax", + "city_id": "12" + }, + { + "district_id": "195", + "district_name": "大厂回族自治县", + "spell": "dachanghuizuzizhixian", + "easy_spell": "dchzzzx", + "city_id": "12" + }, + { + "district_id": "196", + "district_name": "霸州市", + "spell": "bazhoushi", + "easy_spell": "bzs", + "city_id": "12" + }, + { + "district_id": "197", + "district_name": "三河市", + "spell": "sanheshi", + "easy_spell": "shs", + "city_id": "12" + }, + { + "district_id": "198", + "district_name": "桃城区", + "spell": "taochengqu", + "easy_spell": "tcq", + "city_id": "13" + }, + { + "district_id": "199", + "district_name": "枣强县", + "spell": "zaoqiangxian", + "easy_spell": "zqx", + "city_id": "13" + }, + { + "district_id": "200", + "district_name": "武邑县", + "spell": "wuyixian", + "easy_spell": "wyx", + "city_id": "13" + }, + { + "district_id": "201", + "district_name": "武强县", + "spell": "wuqiangxian", + "easy_spell": "wqx", + "city_id": "13" + }, + { + "district_id": "202", + "district_name": "饶阳县", + "spell": "raoyangxian", + "easy_spell": "ryx", + "city_id": "13" + }, + { + "district_id": "203", + "district_name": "安平县", + "spell": "anpingxian", + "easy_spell": "apx", + "city_id": "13" + }, + { + "district_id": "204", + "district_name": "故城县", + "spell": "guchengxian", + "easy_spell": "gcx", + "city_id": "13" + }, + { + "district_id": "205", + "district_name": "景县", + "spell": "jingxian", + "easy_spell": "jx", + "city_id": "13" + }, + { + "district_id": "206", + "district_name": "阜城县", + "spell": "fuchengxian", + "easy_spell": "fcx", + "city_id": "13" + }, + { + "district_id": "207", + "district_name": "冀州市", + "spell": "jizhoushi", + "easy_spell": "jzs", + "city_id": "13" + }, + { + "district_id": "208", + "district_name": "深州市", + "spell": "shenzhoushi", + "easy_spell": "szs", + "city_id": "13" + }, + { + "district_id": "209", + "district_name": "小店区", + "spell": "xiaodianqu", + "easy_spell": "xdq", + "city_id": "14" + }, + { + "district_id": "210", + "district_name": "迎泽区", + "spell": "yingzequ", + "easy_spell": "yzq", + "city_id": "14" + }, + { + "district_id": "211", + "district_name": "杏花岭区", + "spell": "xinghualingqu", + "easy_spell": "xhlq", + "city_id": "14" + }, + { + "district_id": "212", + "district_name": "尖草坪区", + "spell": "jiancaopingqu", + "easy_spell": "jcpq", + "city_id": "14" + }, + { + "district_id": "213", + "district_name": "万柏林区", + "spell": "wanbailinqu", + "easy_spell": "wblq", + "city_id": "14" + }, + { + "district_id": "214", + "district_name": "晋源区", + "spell": "jinyuanqu", + "easy_spell": "jyq", + "city_id": "14" + }, + { + "district_id": "215", + "district_name": "清徐县", + "spell": "qingxuxian", + "easy_spell": "qxx", + "city_id": "14" + }, + { + "district_id": "216", + "district_name": "阳曲县", + "spell": "yangquxian", + "easy_spell": "yqx", + "city_id": "14" + }, + { + "district_id": "217", + "district_name": "娄烦县", + "spell": "loufanxian", + "easy_spell": "lfx", + "city_id": "14" + }, + { + "district_id": "218", + "district_name": "古交市", + "spell": "gujiaoshi", + "easy_spell": "gjs", + "city_id": "14" + }, + { + "district_id": "219", + "district_name": "城区", + "spell": "chengqu", + "easy_spell": "cq", + "city_id": "15" + }, + { + "district_id": "220", + "district_name": "矿区", + "spell": "kuangqu", + "easy_spell": "kq", + "city_id": "15" + }, + { + "district_id": "221", + "district_name": "南郊区", + "spell": "nanjiaoqu", + "easy_spell": "njq", + "city_id": "15" + }, + { + "district_id": "222", + "district_name": "新荣区", + "spell": "xinrongqu", + "easy_spell": "xrq", + "city_id": "15" + }, + { + "district_id": "223", + "district_name": "阳高县", + "spell": "yanggaoxian", + "easy_spell": "ygx", + "city_id": "15" + }, + { + "district_id": "224", + "district_name": "天镇县", + "spell": "tianzhenxian", + "easy_spell": "tzx", + "city_id": "15" + }, + { + "district_id": "225", + "district_name": "广灵县", + "spell": "guanglingxian", + "easy_spell": "glx", + "city_id": "15" + }, + { + "district_id": "226", + "district_name": "灵丘县", + "spell": "lingqiuxian", + "easy_spell": "lqx", + "city_id": "15" + }, + { + "district_id": "227", + "district_name": "浑源县", + "spell": "hunyuanxian", + "easy_spell": "hyx", + "city_id": "15" + }, + { + "district_id": "228", + "district_name": "左云县", + "spell": "zuoyunxian", + "easy_spell": "zyx", + "city_id": "15" + }, + { + "district_id": "229", + "district_name": "大同县", + "spell": "datongxian", + "easy_spell": "dtx", + "city_id": "15" + }, + { + "district_id": "230", + "district_name": "城区", + "spell": "chengqu", + "easy_spell": "cq", + "city_id": "16" + }, + { + "district_id": "231", + "district_name": "矿区", + "spell": "kuangqu", + "easy_spell": "kq", + "city_id": "16" + }, + { + "district_id": "232", + "district_name": "郊区", + "spell": "jiaoqu", + "easy_spell": "jq", + "city_id": "16" + }, + { + "district_id": "233", + "district_name": "平定县", + "spell": "pingdingxian", + "easy_spell": "pdx", + "city_id": "16" + }, + { + "district_id": "234", + "district_name": "盂县", + "spell": "yuxian", + "easy_spell": "yx", + "city_id": "16" + }, + { + "district_id": "235", + "district_name": "城区", + "spell": "chengqu", + "easy_spell": "cq", + "city_id": "17" + }, + { + "district_id": "236", + "district_name": "郊区", + "spell": "jiaoqu", + "easy_spell": "jq", + "city_id": "17" + }, + { + "district_id": "237", + "district_name": "长治县", + "spell": "changzhixian", + "easy_spell": "czx", + "city_id": "17" + }, + { + "district_id": "238", + "district_name": "襄垣县", + "spell": "xiangyuanxian", + "easy_spell": "xyx", + "city_id": "17" + }, + { + "district_id": "239", + "district_name": "屯留县", + "spell": "tunliuxian", + "easy_spell": "tlx", + "city_id": "17" + }, + { + "district_id": "240", + "district_name": "平顺县", + "spell": "pingshunxian", + "easy_spell": "psx", + "city_id": "17" + }, + { + "district_id": "241", + "district_name": "黎城县", + "spell": "lichengxian", + "easy_spell": "lcx", + "city_id": "17" + }, + { + "district_id": "242", + "district_name": "壶关县", + "spell": "huguanxian", + "easy_spell": "hgx", + "city_id": "17" + }, + { + "district_id": "243", + "district_name": "长子县", + "spell": "changzixian", + "easy_spell": "czx", + "city_id": "17" + }, + { + "district_id": "244", + "district_name": "武乡县", + "spell": "wuxiangxian", + "easy_spell": "wxx", + "city_id": "17" + }, + { + "district_id": "245", + "district_name": "沁县", + "spell": "qinxian", + "easy_spell": "qx", + "city_id": "17" + }, + { + "district_id": "246", + "district_name": "沁源县", + "spell": "qinyuanxian", + "easy_spell": "qyx", + "city_id": "17" + }, + { + "district_id": "247", + "district_name": "潞城市", + "spell": "luchengshi", + "easy_spell": "lcs", + "city_id": "17" + }, + { + "district_id": "248", + "district_name": "城区", + "spell": "chengqu", + "easy_spell": "cq", + "city_id": "18" + }, + { + "district_id": "249", + "district_name": "沁水县", + "spell": "qinshuixian", + "easy_spell": "qsx", + "city_id": "18" + }, + { + "district_id": "250", + "district_name": "阳城县", + "spell": "yangchengxian", + "easy_spell": "ycx", + "city_id": "18" + }, + { + "district_id": "251", + "district_name": "陵川县", + "spell": "lingchuanxian", + "easy_spell": "lcx", + "city_id": "18" + }, + { + "district_id": "252", + "district_name": "泽州县", + "spell": "zezhouxian", + "easy_spell": "zzx", + "city_id": "18" + }, + { + "district_id": "253", + "district_name": "高平市", + "spell": "gaopingshi", + "easy_spell": "gps", + "city_id": "18" + }, + { + "district_id": "254", + "district_name": "朔城区", + "spell": "shuochengqu", + "easy_spell": "scq", + "city_id": "19" + }, + { + "district_id": "255", + "district_name": "平鲁区", + "spell": "pingluqu", + "easy_spell": "plq", + "city_id": "19" + }, + { + "district_id": "256", + "district_name": "山阴县", + "spell": "shanyinxian", + "easy_spell": "syx", + "city_id": "19" + }, + { + "district_id": "257", + "district_name": "应县", + "spell": "yingxian", + "easy_spell": "yx", + "city_id": "19" + }, + { + "district_id": "258", + "district_name": "右玉县", + "spell": "youyuxian", + "easy_spell": "yyx", + "city_id": "19" + }, + { + "district_id": "259", + "district_name": "怀仁县", + "spell": "huairenxian", + "easy_spell": "hrx", + "city_id": "19" + }, + { + "district_id": "260", + "district_name": "榆次区", + "spell": "yuciqu", + "easy_spell": "ycq", + "city_id": "20" + }, + { + "district_id": "261", + "district_name": "榆社县", + "spell": "yushexian", + "easy_spell": "ysx", + "city_id": "20" + }, + { + "district_id": "262", + "district_name": "左权县", + "spell": "zuoquanxian", + "easy_spell": "zqx", + "city_id": "20" + }, + { + "district_id": "263", + "district_name": "和顺县", + "spell": "heshunxian", + "easy_spell": "hsx", + "city_id": "20" + }, + { + "district_id": "264", + "district_name": "昔阳县", + "spell": "xiyangxian", + "easy_spell": "xyx", + "city_id": "20" + }, + { + "district_id": "265", + "district_name": "寿阳县", + "spell": "shouyangxian", + "easy_spell": "syx", + "city_id": "20" + }, + { + "district_id": "266", + "district_name": "太谷县", + "spell": "taiguxian", + "easy_spell": "tgx", + "city_id": "20" + }, + { + "district_id": "267", + "district_name": "祁县", + "spell": "qixian", + "easy_spell": "qx", + "city_id": "20" + }, + { + "district_id": "268", + "district_name": "平遥县", + "spell": "pingyaoxian", + "easy_spell": "pyx", + "city_id": "20" + }, + { + "district_id": "269", + "district_name": "灵石县", + "spell": "lingshixian", + "easy_spell": "lsx", + "city_id": "20" + }, + { + "district_id": "270", + "district_name": "介休市", + "spell": "jiexiushi", + "easy_spell": "jxs", + "city_id": "20" + }, + { + "district_id": "271", + "district_name": "盐湖区", + "spell": "yanhuqu", + "easy_spell": "yhq", + "city_id": "21" + }, + { + "district_id": "272", + "district_name": "临猗县", + "spell": "linzuoxian", + "easy_spell": "lzx", + "city_id": "21" + }, + { + "district_id": "273", + "district_name": "万荣县", + "spell": "wanrongxian", + "easy_spell": "wrx", + "city_id": "21" + }, + { + "district_id": "274", + "district_name": "闻喜县", + "spell": "wenxixian", + "easy_spell": "wxx", + "city_id": "21" + }, + { + "district_id": "275", + "district_name": "稷山县", + "spell": "zuoshanxian", + "easy_spell": "zsx", + "city_id": "21" + }, + { + "district_id": "276", + "district_name": "新绛县", + "spell": "xinzuoxian", + "easy_spell": "xzx", + "city_id": "21" + }, + { + "district_id": "277", + "district_name": "绛县", + "spell": "zuoxian", + "easy_spell": "zx", + "city_id": "21" + }, + { + "district_id": "278", + "district_name": "垣曲县", + "spell": "yuanquxian", + "easy_spell": "yqx", + "city_id": "21" + }, + { + "district_id": "279", + "district_name": "夏县", + "spell": "xiaxian", + "easy_spell": "xx", + "city_id": "21" + }, + { + "district_id": "280", + "district_name": "平陆县", + "spell": "pingluxian", + "easy_spell": "plx", + "city_id": "21" + }, + { + "district_id": "281", + "district_name": "芮城县", + "spell": "zuochengxian", + "easy_spell": "zcx", + "city_id": "21" + }, + { + "district_id": "282", + "district_name": "永济市", + "spell": "yongjishi", + "easy_spell": "yjs", + "city_id": "21" + }, + { + "district_id": "283", + "district_name": "河津市", + "spell": "hejinshi", + "easy_spell": "hjs", + "city_id": "21" + }, + { + "district_id": "284", + "district_name": "忻府区", + "spell": "xinfuqu", + "easy_spell": "xfq", + "city_id": "22" + }, + { + "district_id": "285", + "district_name": "定襄县", + "spell": "dingxiangxian", + "easy_spell": "dxx", + "city_id": "22" + }, + { + "district_id": "286", + "district_name": "五台县", + "spell": "wutaixian", + "easy_spell": "wtx", + "city_id": "22" + }, + { + "district_id": "287", + "district_name": "代县", + "spell": "daixian", + "easy_spell": "dx", + "city_id": "22" + }, + { + "district_id": "288", + "district_name": "繁峙县", + "spell": "fanzhixian", + "easy_spell": "fzx", + "city_id": "22" + }, + { + "district_id": "289", + "district_name": "宁武县", + "spell": "ningwuxian", + "easy_spell": "nwx", + "city_id": "22" + }, + { + "district_id": "290", + "district_name": "静乐县", + "spell": "jinglexian", + "easy_spell": "jlx", + "city_id": "22" + }, + { + "district_id": "291", + "district_name": "神池县", + "spell": "shenchixian", + "easy_spell": "scx", + "city_id": "22" + }, + { + "district_id": "292", + "district_name": "五寨县", + "spell": "wuzhaixian", + "easy_spell": "wzx", + "city_id": "22" + }, + { + "district_id": "293", + "district_name": "岢岚县", + "spell": "zuozuoxian", + "easy_spell": "zzx", + "city_id": "22" + }, + { + "district_id": "294", + "district_name": "河曲县", + "spell": "hequxian", + "easy_spell": "hqx", + "city_id": "22" + }, + { + "district_id": "295", + "district_name": "保德县", + "spell": "baodexian", + "easy_spell": "bdx", + "city_id": "22" + }, + { + "district_id": "296", + "district_name": "偏关县", + "spell": "pianguanxian", + "easy_spell": "pgx", + "city_id": "22" + }, + { + "district_id": "297", + "district_name": "原平市", + "spell": "yuanpingshi", + "easy_spell": "yps", + "city_id": "22" + }, + { + "district_id": "298", + "district_name": "尧都区", + "spell": "yaoduqu", + "easy_spell": "ydq", + "city_id": "23" + }, + { + "district_id": "299", + "district_name": "曲沃县", + "spell": "quwoxian", + "easy_spell": "qwx", + "city_id": "23" + }, + { + "district_id": "300", + "district_name": "翼城县", + "spell": "yichengxian", + "easy_spell": "ycx", + "city_id": "23" + }, + { + "district_id": "301", + "district_name": "襄汾县", + "spell": "xiangfenxian", + "easy_spell": "xfx", + "city_id": "23" + }, + { + "district_id": "302", + "district_name": "洪洞县", + "spell": "hongdongxian", + "easy_spell": "hdx", + "city_id": "23" + }, + { + "district_id": "303", + "district_name": "古县", + "spell": "guxian", + "easy_spell": "gx", + "city_id": "23" + }, + { + "district_id": "304", + "district_name": "安泽县", + "spell": "anzexian", + "easy_spell": "azx", + "city_id": "23" + }, + { + "district_id": "305", + "district_name": "浮山县", + "spell": "fushanxian", + "easy_spell": "fsx", + "city_id": "23" + }, + { + "district_id": "306", + "district_name": "吉县", + "spell": "jixian", + "easy_spell": "jx", + "city_id": "23" + }, + { + "district_id": "307", + "district_name": "乡宁县", + "spell": "xiangningxian", + "easy_spell": "xnx", + "city_id": "23" + }, + { + "district_id": "308", + "district_name": "大宁县", + "spell": "daningxian", + "easy_spell": "dnx", + "city_id": "23" + }, + { + "district_id": "309", + "district_name": "隰县", + "spell": "zuoxian", + "easy_spell": "zx", + "city_id": "23" + }, + { + "district_id": "310", + "district_name": "永和县", + "spell": "yonghexian", + "easy_spell": "yhx", + "city_id": "23" + }, + { + "district_id": "311", + "district_name": "蒲县", + "spell": "puxian", + "easy_spell": "px", + "city_id": "23" + }, + { + "district_id": "312", + "district_name": "汾西县", + "spell": "fenxixian", + "easy_spell": "fxx", + "city_id": "23" + }, + { + "district_id": "313", + "district_name": "侯马市", + "spell": "houmashi", + "easy_spell": "hms", + "city_id": "23" + }, + { + "district_id": "314", + "district_name": "霍州市", + "spell": "huozhoushi", + "easy_spell": "hzs", + "city_id": "23" + }, + { + "district_id": "315", + "district_name": "离石区", + "spell": "lishiqu", + "easy_spell": "lsq", + "city_id": "24" + }, + { + "district_id": "316", + "district_name": "文水县", + "spell": "wenshuixian", + "easy_spell": "wsx", + "city_id": "24" + }, + { + "district_id": "317", + "district_name": "交城县", + "spell": "jiaochengxian", + "easy_spell": "jcx", + "city_id": "24" + }, + { + "district_id": "318", + "district_name": "兴县", + "spell": "xingxian", + "easy_spell": "xx", + "city_id": "24" + }, + { + "district_id": "319", + "district_name": "临县", + "spell": "linxian", + "easy_spell": "lx", + "city_id": "24" + }, + { + "district_id": "320", + "district_name": "柳林县", + "spell": "liulinxian", + "easy_spell": "llx", + "city_id": "24" + }, + { + "district_id": "321", + "district_name": "石楼县", + "spell": "shilouxian", + "easy_spell": "slx", + "city_id": "24" + }, + { + "district_id": "322", + "district_name": "岚县", + "spell": "zuoxian", + "easy_spell": "zx", + "city_id": "24" + }, + { + "district_id": "323", + "district_name": "方山县", + "spell": "fangshanxian", + "easy_spell": "fsx", + "city_id": "24" + }, + { + "district_id": "324", + "district_name": "中阳县", + "spell": "zhongyangxian", + "easy_spell": "zyx", + "city_id": "24" + }, + { + "district_id": "325", + "district_name": "交口县", + "spell": "jiaokouxian", + "easy_spell": "jkx", + "city_id": "24" + }, + { + "district_id": "326", + "district_name": "孝义市", + "spell": "xiaoyishi", + "easy_spell": "xys", + "city_id": "24" + }, + { + "district_id": "327", + "district_name": "汾阳市", + "spell": "fenyangshi", + "easy_spell": "fys", + "city_id": "24" + }, + { + "district_id": "328", + "district_name": "新城区", + "spell": "xinchengqu", + "easy_spell": "xcq", + "city_id": "25" + }, + { + "district_id": "329", + "district_name": "回民区", + "spell": "huiminqu", + "easy_spell": "hmq", + "city_id": "25" + }, + { + "district_id": "330", + "district_name": "玉泉区", + "spell": "yuquanqu", + "easy_spell": "yqq", + "city_id": "25" + }, + { + "district_id": "331", + "district_name": "赛罕区", + "spell": "saihanqu", + "easy_spell": "shq", + "city_id": "25" + }, + { + "district_id": "332", + "district_name": "土默特左旗", + "spell": "tumotezuoqi", + "easy_spell": "tmtzq", + "city_id": "25" + }, + { + "district_id": "333", + "district_name": "托克托县", + "spell": "tuoketuoxian", + "easy_spell": "tktx", + "city_id": "25" + }, + { + "district_id": "334", + "district_name": "和林格尔县", + "spell": "helingeerxian", + "easy_spell": "hlgex", + "city_id": "25" + }, + { + "district_id": "335", + "district_name": "清水河县", + "spell": "qingshuihexian", + "easy_spell": "qshx", + "city_id": "25" + }, + { + "district_id": "336", + "district_name": "武川县", + "spell": "wuchuanxian", + "easy_spell": "wcx", + "city_id": "25" + }, + { + "district_id": "337", + "district_name": "东河区", + "spell": "donghequ", + "easy_spell": "dhq", + "city_id": "26" + }, + { + "district_id": "338", + "district_name": "昆都仑区", + "spell": "kundulunqu", + "easy_spell": "kdlq", + "city_id": "26" + }, + { + "district_id": "339", + "district_name": "青山区", + "spell": "qingshanqu", + "easy_spell": "qsq", + "city_id": "26" + }, + { + "district_id": "340", + "district_name": "石拐区", + "spell": "shiguaiqu", + "easy_spell": "sgq", + "city_id": "26" + }, + { + "district_id": "341", + "district_name": "白云矿区", + "spell": "baiyunkuangqu", + "easy_spell": "bykq", + "city_id": "26" + }, + { + "district_id": "342", + "district_name": "九原区", + "spell": "jiuyuanqu", + "easy_spell": "jyq", + "city_id": "26" + }, + { + "district_id": "343", + "district_name": "土默特右旗", + "spell": "tumoteyouqi", + "easy_spell": "tmtyq", + "city_id": "26" + }, + { + "district_id": "344", + "district_name": "固阳县", + "spell": "guyangxian", + "easy_spell": "gyx", + "city_id": "26" + }, + { + "district_id": "345", + "district_name": "达尔罕茂明安联合旗", + "spell": "daerhanmaominganlianheqi", + "easy_spell": "dehmmalhq", + "city_id": "26" + }, + { + "district_id": "346", + "district_name": "海勃湾区", + "spell": "haibowanqu", + "easy_spell": "hbwq", + "city_id": "27" + }, + { + "district_id": "347", + "district_name": "海南区", + "spell": "hainanqu", + "easy_spell": "hnq", + "city_id": "27" + }, + { + "district_id": "348", + "district_name": "乌达区", + "spell": "wudaqu", + "easy_spell": "wdq", + "city_id": "27" + }, + { + "district_id": "349", + "district_name": "红山区", + "spell": "hongshanqu", + "easy_spell": "hsq", + "city_id": "28" + }, + { + "district_id": "350", + "district_name": "元宝山区", + "spell": "yuanbaoshanqu", + "easy_spell": "ybsq", + "city_id": "28" + }, + { + "district_id": "351", + "district_name": "松山区", + "spell": "songshanqu", + "easy_spell": "ssq", + "city_id": "28" + }, + { + "district_id": "352", + "district_name": "阿鲁科尔沁旗", + "spell": "alukeerqinqi", + "easy_spell": "alkeqq", + "city_id": "28" + }, + { + "district_id": "353", + "district_name": "巴林左旗", + "spell": "balinzuoqi", + "easy_spell": "blzq", + "city_id": "28" + }, + { + "district_id": "354", + "district_name": "巴林右旗", + "spell": "balinyouqi", + "easy_spell": "blyq", + "city_id": "28" + }, + { + "district_id": "355", + "district_name": "林西县", + "spell": "linxixian", + "easy_spell": "lxx", + "city_id": "28" + }, + { + "district_id": "356", + "district_name": "克什克腾旗", + "spell": "keshiketengqi", + "easy_spell": "ksktq", + "city_id": "28" + }, + { + "district_id": "357", + "district_name": "翁牛特旗", + "spell": "wengniuteqi", + "easy_spell": "wntq", + "city_id": "28" + }, + { + "district_id": "358", + "district_name": "喀喇沁旗", + "spell": "kalaqinqi", + "easy_spell": "klqq", + "city_id": "28" + }, + { + "district_id": "359", + "district_name": "宁城县", + "spell": "ningchengxian", + "easy_spell": "ncx", + "city_id": "28" + }, + { + "district_id": "360", + "district_name": "敖汉旗", + "spell": "aohanqi", + "easy_spell": "ahq", + "city_id": "28" + }, + { + "district_id": "361", + "district_name": "科尔沁区", + "spell": "keerqinqu", + "easy_spell": "keqq", + "city_id": "29" + }, + { + "district_id": "362", + "district_name": "科尔沁左翼中旗", + "spell": "keerqinzuoyizhongqi", + "easy_spell": "keqzyzq", + "city_id": "29" + }, + { + "district_id": "363", + "district_name": "科尔沁左翼后旗", + "spell": "keerqinzuoyihouqi", + "easy_spell": "keqzyhq", + "city_id": "29" + }, + { + "district_id": "364", + "district_name": "开鲁县", + "spell": "kailuxian", + "easy_spell": "klx", + "city_id": "29" + }, + { + "district_id": "365", + "district_name": "库伦旗", + "spell": "kulunqi", + "easy_spell": "klq", + "city_id": "29" + }, + { + "district_id": "366", + "district_name": "奈曼旗", + "spell": "naimanqi", + "easy_spell": "nmq", + "city_id": "29" + }, + { + "district_id": "367", + "district_name": "扎鲁特旗", + "spell": "zhaluteqi", + "easy_spell": "zltq", + "city_id": "29" + }, + { + "district_id": "368", + "district_name": "霍林郭勒市", + "spell": "huolinguoleshi", + "easy_spell": "hlgls", + "city_id": "29" + }, + { + "district_id": "369", + "district_name": "东胜区", + "spell": "dongshengqu", + "easy_spell": "dsq", + "city_id": "30" + }, + { + "district_id": "370", + "district_name": "达拉特旗", + "spell": "dalateqi", + "easy_spell": "dltq", + "city_id": "30" + }, + { + "district_id": "371", + "district_name": "准格尔旗", + "spell": "zhungeerqi", + "easy_spell": "zgeq", + "city_id": "30" + }, + { + "district_id": "372", + "district_name": "鄂托克前旗", + "spell": "etuokeqianqi", + "easy_spell": "etkqq", + "city_id": "30" + }, + { + "district_id": "373", + "district_name": "鄂托克旗", + "spell": "etuokeqi", + "easy_spell": "etkq", + "city_id": "30" + }, + { + "district_id": "374", + "district_name": "杭锦旗", + "spell": "hangjinqi", + "easy_spell": "hjq", + "city_id": "30" + }, + { + "district_id": "375", + "district_name": "乌审旗", + "spell": "wushenqi", + "easy_spell": "wsq", + "city_id": "30" + }, + { + "district_id": "376", + "district_name": "伊金霍洛旗", + "spell": "yijinhuoluoqi", + "easy_spell": "yjhlq", + "city_id": "30" + }, + { + "district_id": "377", + "district_name": "海拉尔区", + "spell": "hailaerqu", + "easy_spell": "hleq", + "city_id": "31" + }, + { + "district_id": "378", + "district_name": "阿荣旗", + "spell": "arongqi", + "easy_spell": "arq", + "city_id": "31" + }, + { + "district_id": "379", + "district_name": "莫力达瓦达斡尔族自治旗", + "spell": "molidawadawoerzuzizhiqi", + "easy_spell": "mldwdwezzzq", + "city_id": "31" + }, + { + "district_id": "380", + "district_name": "鄂伦春自治旗", + "spell": "elunchunzizhiqi", + "easy_spell": "elczzq", + "city_id": "31" + }, + { + "district_id": "381", + "district_name": "鄂温克族自治旗", + "spell": "ewenkezuzizhiqi", + "easy_spell": "ewkzzzq", + "city_id": "31" + }, + { + "district_id": "382", + "district_name": "陈巴尔虎旗", + "spell": "chenbaerhuqi", + "easy_spell": "cbehq", + "city_id": "31" + }, + { + "district_id": "383", + "district_name": "新巴尔虎左旗", + "spell": "xinbaerhuzuoqi", + "easy_spell": "xbehzq", + "city_id": "31" + }, + { + "district_id": "384", + "district_name": "新巴尔虎右旗", + "spell": "xinbaerhuyouqi", + "easy_spell": "xbehyq", + "city_id": "31" + }, + { + "district_id": "385", + "district_name": "满洲里市", + "spell": "manzhoulishi", + "easy_spell": "mzls", + "city_id": "31" + }, + { + "district_id": "386", + "district_name": "牙克石市", + "spell": "yakeshishi", + "easy_spell": "ykss", + "city_id": "31" + }, + { + "district_id": "387", + "district_name": "扎兰屯市", + "spell": "zhalantunshi", + "easy_spell": "zlts", + "city_id": "31" + }, + { + "district_id": "388", + "district_name": "额尔古纳市", + "spell": "eergunashi", + "easy_spell": "eegns", + "city_id": "31" + }, + { + "district_id": "389", + "district_name": "根河市", + "spell": "genheshi", + "easy_spell": "ghs", + "city_id": "31" + }, + { + "district_id": "390", + "district_name": "临河区", + "spell": "linhequ", + "easy_spell": "lhq", + "city_id": "32" + }, + { + "district_id": "391", + "district_name": "五原县", + "spell": "wuyuanxian", + "easy_spell": "wyx", + "city_id": "32" + }, + { + "district_id": "392", + "district_name": "磴口县", + "spell": "zuokouxian", + "easy_spell": "zkx", + "city_id": "32" + }, + { + "district_id": "393", + "district_name": "乌拉特前旗", + "spell": "wulateqianqi", + "easy_spell": "wltqq", + "city_id": "32" + }, + { + "district_id": "394", + "district_name": "乌拉特中旗", + "spell": "wulatezhongqi", + "easy_spell": "wltzq", + "city_id": "32" + }, + { + "district_id": "395", + "district_name": "乌拉特后旗", + "spell": "wulatehouqi", + "easy_spell": "wlthq", + "city_id": "32" + }, + { + "district_id": "396", + "district_name": "杭锦后旗", + "spell": "hangjinhouqi", + "easy_spell": "hjhq", + "city_id": "32" + }, + { + "district_id": "397", + "district_name": "集宁区", + "spell": "jiningqu", + "easy_spell": "jnq", + "city_id": "33" + }, + { + "district_id": "398", + "district_name": "卓资县", + "spell": "zhuozixian", + "easy_spell": "zzx", + "city_id": "33" + }, + { + "district_id": "399", + "district_name": "化德县", + "spell": "huadexian", + "easy_spell": "hdx", + "city_id": "33" + }, + { + "district_id": "400", + "district_name": "商都县", + "spell": "shangduxian", + "easy_spell": "sdx", + "city_id": "33" + }, + { + "district_id": "401", + "district_name": "兴和县", + "spell": "xinghexian", + "easy_spell": "xhx", + "city_id": "33" + }, + { + "district_id": "402", + "district_name": "凉城县", + "spell": "liangchengxian", + "easy_spell": "lcx", + "city_id": "33" + }, + { + "district_id": "403", + "district_name": "察哈尔右翼前旗", + "spell": "chahaeryouyiqianqi", + "easy_spell": "cheyyqq", + "city_id": "33" + }, + { + "district_id": "404", + "district_name": "察哈尔右翼中旗", + "spell": "chahaeryouyizhongqi", + "easy_spell": "cheyyzq", + "city_id": "33" + }, + { + "district_id": "405", + "district_name": "察哈尔右翼后旗", + "spell": "chahaeryouyihouqi", + "easy_spell": "cheyyhq", + "city_id": "33" + }, + { + "district_id": "406", + "district_name": "四子王旗", + "spell": "siziwangqi", + "easy_spell": "szwq", + "city_id": "33" + }, + { + "district_id": "407", + "district_name": "丰镇市", + "spell": "fengzhenshi", + "easy_spell": "fzs", + "city_id": "33" + }, + { + "district_id": "408", + "district_name": "乌兰浩特市", + "spell": "wulanhaoteshi", + "easy_spell": "wlhts", + "city_id": "34" + }, + { + "district_id": "409", + "district_name": "阿尔山市", + "spell": "aershanshi", + "easy_spell": "aess", + "city_id": "34" + }, + { + "district_id": "410", + "district_name": "科尔沁右翼前旗", + "spell": "keerqinyouyiqianqi", + "easy_spell": "keqyyqq", + "city_id": "34" + }, + { + "district_id": "411", + "district_name": "科尔沁右翼中旗", + "spell": "keerqinyouyizhongqi", + "easy_spell": "keqyyzq", + "city_id": "34" + }, + { + "district_id": "412", + "district_name": "扎赉特旗", + "spell": "zhazuoteqi", + "easy_spell": "zztq", + "city_id": "34" + }, + { + "district_id": "413", + "district_name": "突泉县", + "spell": "tuquanxian", + "easy_spell": "tqx", + "city_id": "34" + }, + { + "district_id": "414", + "district_name": "二连浩特市", + "spell": "erlianhaoteshi", + "easy_spell": "elhts", + "city_id": "35" + }, + { + "district_id": "415", + "district_name": "锡林浩特市", + "spell": "xilinhaoteshi", + "easy_spell": "xlhts", + "city_id": "35" + }, + { + "district_id": "416", + "district_name": "阿巴嘎旗", + "spell": "abagaqi", + "easy_spell": "abgq", + "city_id": "35" + }, + { + "district_id": "417", + "district_name": "苏尼特左旗", + "spell": "sunitezuoqi", + "easy_spell": "sntzq", + "city_id": "35" + }, + { + "district_id": "418", + "district_name": "苏尼特右旗", + "spell": "suniteyouqi", + "easy_spell": "sntyq", + "city_id": "35" + }, + { + "district_id": "419", + "district_name": "东乌珠穆沁旗", + "spell": "dongwuzhumuqinqi", + "easy_spell": "dwzmqq", + "city_id": "35" + }, + { + "district_id": "420", + "district_name": "西乌珠穆沁旗", + "spell": "xiwuzhumuqinqi", + "easy_spell": "xwzmqq", + "city_id": "35" + }, + { + "district_id": "421", + "district_name": "太仆寺旗", + "spell": "taipusiqi", + "easy_spell": "tpsq", + "city_id": "35" + }, + { + "district_id": "422", + "district_name": "镶黄旗", + "spell": "xianghuangqi", + "easy_spell": "xhq", + "city_id": "35" + }, + { + "district_id": "423", + "district_name": "正镶白旗", + "spell": "zhengxiangbaiqi", + "easy_spell": "zxbq", + "city_id": "35" + }, + { + "district_id": "424", + "district_name": "正蓝旗", + "spell": "zhenglanqi", + "easy_spell": "zlq", + "city_id": "35" + }, + { + "district_id": "425", + "district_name": "多伦县", + "spell": "duolunxian", + "easy_spell": "dlx", + "city_id": "35" + }, + { + "district_id": "426", + "district_name": "阿拉善左旗", + "spell": "alashanzuoqi", + "easy_spell": "alszq", + "city_id": "36" + }, + { + "district_id": "427", + "district_name": "阿拉善右旗", + "spell": "alashanyouqi", + "easy_spell": "alsyq", + "city_id": "36" + }, + { + "district_id": "428", + "district_name": "额济纳旗", + "spell": "ejinaqi", + "easy_spell": "ejnq", + "city_id": "36" + }, + { + "district_id": "429", + "district_name": "和平区", + "spell": "hepingqu", + "easy_spell": "hpq", + "city_id": "37" + }, + { + "district_id": "430", + "district_name": "沈河区", + "spell": "shenhequ", + "easy_spell": "shq", + "city_id": "37" + }, + { + "district_id": "431", + "district_name": "大东区", + "spell": "dadongqu", + "easy_spell": "ddq", + "city_id": "37" + }, + { + "district_id": "432", + "district_name": "皇姑区", + "spell": "huangguqu", + "easy_spell": "hgq", + "city_id": "37" + }, + { + "district_id": "433", + "district_name": "铁西区", + "spell": "tiexiqu", + "easy_spell": "txq", + "city_id": "37" + }, + { + "district_id": "434", + "district_name": "苏家屯区", + "spell": "sujiatunqu", + "easy_spell": "sjtq", + "city_id": "37" + }, + { + "district_id": "435", + "district_name": "东陵区", + "spell": "donglingqu", + "easy_spell": "dlq", + "city_id": "37" + }, + { + "district_id": "436", + "district_name": "新城子区", + "spell": "xinchengziqu", + "easy_spell": "xczq", + "city_id": "37" + }, + { + "district_id": "437", + "district_name": "于洪区", + "spell": "yuhongqu", + "easy_spell": "yhq", + "city_id": "37" + }, + { + "district_id": "438", + "district_name": "辽中县", + "spell": "liaozhongxian", + "easy_spell": "lzx", + "city_id": "37" + }, + { + "district_id": "439", + "district_name": "康平县", + "spell": "kangpingxian", + "easy_spell": "kpx", + "city_id": "37" + }, + { + "district_id": "440", + "district_name": "法库县", + "spell": "fakuxian", + "easy_spell": "fkx", + "city_id": "37" + }, + { + "district_id": "441", + "district_name": "新民市", + "spell": "xinminshi", + "easy_spell": "xms", + "city_id": "37" + }, + { + "district_id": "442", + "district_name": "中山区", + "spell": "zhongshanqu", + "easy_spell": "zsq", + "city_id": "38" + }, + { + "district_id": "443", + "district_name": "西岗区", + "spell": "xigangqu", + "easy_spell": "xgq", + "city_id": "38" + }, + { + "district_id": "444", + "district_name": "沙河口区", + "spell": "shahekouqu", + "easy_spell": "shkq", + "city_id": "38" + }, + { + "district_id": "445", + "district_name": "甘井子区", + "spell": "ganjingziqu", + "easy_spell": "gjzq", + "city_id": "38" + }, + { + "district_id": "446", + "district_name": "旅顺口区", + "spell": "lvshunkouqu", + "easy_spell": "lskq", + "city_id": "38" + }, + { + "district_id": "447", + "district_name": "金州区", + "spell": "jinzhouqu", + "easy_spell": "jzq", + "city_id": "38" + }, + { + "district_id": "448", + "district_name": "长海县", + "spell": "changhaixian", + "easy_spell": "chx", + "city_id": "38" + }, + { + "district_id": "449", + "district_name": "瓦房店市", + "spell": "wafangdianshi", + "easy_spell": "wfds", + "city_id": "38" + }, + { + "district_id": "450", + "district_name": "普兰店市", + "spell": "pulandianshi", + "easy_spell": "plds", + "city_id": "38" + }, + { + "district_id": "451", + "district_name": "庄河市", + "spell": "zhuangheshi", + "easy_spell": "zhs", + "city_id": "38" + }, + { + "district_id": "452", + "district_name": "铁东区", + "spell": "tiedongqu", + "easy_spell": "tdq", + "city_id": "39" + }, + { + "district_id": "453", + "district_name": "铁西区", + "spell": "tiexiqu", + "easy_spell": "txq", + "city_id": "39" + }, + { + "district_id": "454", + "district_name": "立山区", + "spell": "lishanqu", + "easy_spell": "lsq", + "city_id": "39" + }, + { + "district_id": "455", + "district_name": "千山区", + "spell": "qianshanqu", + "easy_spell": "qsq", + "city_id": "39" + }, + { + "district_id": "456", + "district_name": "台安县", + "spell": "taianxian", + "easy_spell": "tax", + "city_id": "39" + }, + { + "district_id": "457", + "district_name": "岫岩满族自治县", + "spell": "zuoyanmanzuzizhixian", + "easy_spell": "zymzzzx", + "city_id": "39" + }, + { + "district_id": "458", + "district_name": "海城市", + "spell": "haichengshi", + "easy_spell": "hcs", + "city_id": "39" + }, + { + "district_id": "459", + "district_name": "新抚区", + "spell": "xinfuqu", + "easy_spell": "xfq", + "city_id": "40" + }, + { + "district_id": "460", + "district_name": "东洲区", + "spell": "dongzhouqu", + "easy_spell": "dzq", + "city_id": "40" + }, + { + "district_id": "461", + "district_name": "望花区", + "spell": "wanghuaqu", + "easy_spell": "whq", + "city_id": "40" + }, + { + "district_id": "462", + "district_name": "顺城区", + "spell": "shunchengqu", + "easy_spell": "scq", + "city_id": "40" + }, + { + "district_id": "463", + "district_name": "抚顺县", + "spell": "fushunxian", + "easy_spell": "fsx", + "city_id": "40" + }, + { + "district_id": "464", + "district_name": "新宾满族自治县", + "spell": "xinbinmanzuzizhixian", + "easy_spell": "xbmzzzx", + "city_id": "40" + }, + { + "district_id": "465", + "district_name": "清原满族自治县", + "spell": "qingyuanmanzuzizhixian", + "easy_spell": "qymzzzx", + "city_id": "40" + }, + { + "district_id": "466", + "district_name": "平山区", + "spell": "pingshanqu", + "easy_spell": "psq", + "city_id": "41" + }, + { + "district_id": "467", + "district_name": "溪湖区", + "spell": "xihuqu", + "easy_spell": "xhq", + "city_id": "41" + }, + { + "district_id": "468", + "district_name": "明山区", + "spell": "mingshanqu", + "easy_spell": "msq", + "city_id": "41" + }, + { + "district_id": "469", + "district_name": "南芬区", + "spell": "nanfenqu", + "easy_spell": "nfq", + "city_id": "41" + }, + { + "district_id": "470", + "district_name": "本溪满族自治县", + "spell": "benximanzuzizhixian", + "easy_spell": "bxmzzzx", + "city_id": "41" + }, + { + "district_id": "471", + "district_name": "桓仁满族自治县", + "spell": "huanrenmanzuzizhixian", + "easy_spell": "hrmzzzx", + "city_id": "41" + }, + { + "district_id": "472", + "district_name": "元宝区", + "spell": "yuanbaoqu", + "easy_spell": "ybq", + "city_id": "42" + }, + { + "district_id": "473", + "district_name": "振兴区", + "spell": "zhenxingqu", + "easy_spell": "zxq", + "city_id": "42" + }, + { + "district_id": "474", + "district_name": "振安区", + "spell": "zhenanqu", + "easy_spell": "zaq", + "city_id": "42" + }, + { + "district_id": "475", + "district_name": "宽甸满族自治县", + "spell": "kuandianmanzuzizhixian", + "easy_spell": "kdmzzzx", + "city_id": "42" + }, + { + "district_id": "476", + "district_name": "东港市", + "spell": "donggangshi", + "easy_spell": "dgs", + "city_id": "42" + }, + { + "district_id": "477", + "district_name": "凤城市", + "spell": "fengchengshi", + "easy_spell": "fcs", + "city_id": "42" + }, + { + "district_id": "478", + "district_name": "古塔区", + "spell": "gutaqu", + "easy_spell": "gtq", + "city_id": "43" + }, + { + "district_id": "479", + "district_name": "凌河区", + "spell": "linghequ", + "easy_spell": "lhq", + "city_id": "43" + }, + { + "district_id": "480", + "district_name": "太和区", + "spell": "taihequ", + "easy_spell": "thq", + "city_id": "43" + }, + { + "district_id": "481", + "district_name": "黑山县", + "spell": "heishanxian", + "easy_spell": "hsx", + "city_id": "43" + }, + { + "district_id": "482", + "district_name": "义县", + "spell": "yixian", + "easy_spell": "yx", + "city_id": "43" + }, + { + "district_id": "483", + "district_name": "凌海市", + "spell": "linghaishi", + "easy_spell": "lhs", + "city_id": "43" + }, + { + "district_id": "484", + "district_name": "北宁市", + "spell": "beiningshi", + "easy_spell": "bns", + "city_id": "43" + }, + { + "district_id": "485", + "district_name": "站前区", + "spell": "zhanqianqu", + "easy_spell": "zqq", + "city_id": "44" + }, + { + "district_id": "486", + "district_name": "西市区", + "spell": "xishiqu", + "easy_spell": "xsq", + "city_id": "44" + }, + { + "district_id": "487", + "district_name": "鲅鱼圈区", + "spell": "zuoyuquanqu", + "easy_spell": "zyqq", + "city_id": "44" + }, + { + "district_id": "488", + "district_name": "老边区", + "spell": "laobianqu", + "easy_spell": "lbq", + "city_id": "44" + }, + { + "district_id": "489", + "district_name": "盖州市", + "spell": "gaizhoushi", + "easy_spell": "gzs", + "city_id": "44" + }, + { + "district_id": "490", + "district_name": "大石桥市", + "spell": "dashiqiaoshi", + "easy_spell": "dsqs", + "city_id": "44" + }, + { + "district_id": "491", + "district_name": "海州区", + "spell": "haizhouqu", + "easy_spell": "hzq", + "city_id": "45" + }, + { + "district_id": "492", + "district_name": "新邱区", + "spell": "xinqiuqu", + "easy_spell": "xqq", + "city_id": "45" + }, + { + "district_id": "493", + "district_name": "太平区", + "spell": "taipingqu", + "easy_spell": "tpq", + "city_id": "45" + }, + { + "district_id": "494", + "district_name": "清河门区", + "spell": "qinghemenqu", + "easy_spell": "qhmq", + "city_id": "45" + }, + { + "district_id": "495", + "district_name": "细河区", + "spell": "xihequ", + "easy_spell": "xhq", + "city_id": "45" + }, + { + "district_id": "496", + "district_name": "阜新蒙古族自治县", + "spell": "fuxinmengguzuzizhixian", + "easy_spell": "fxmgzzzx", + "city_id": "45" + }, + { + "district_id": "497", + "district_name": "彰武县", + "spell": "zhangwuxian", + "easy_spell": "zwx", + "city_id": "45" + }, + { + "district_id": "498", + "district_name": "白塔区", + "spell": "baitaqu", + "easy_spell": "btq", + "city_id": "46" + }, + { + "district_id": "499", + "district_name": "文圣区", + "spell": "wenshengqu", + "easy_spell": "wsq", + "city_id": "46" + }, + { + "district_id": "500", + "district_name": "宏伟区", + "spell": "hongweiqu", + "easy_spell": "hwq", + "city_id": "46" + }, + { + "district_id": "501", + "district_name": "弓长岭区", + "spell": "gongchanglingqu", + "easy_spell": "gclq", + "city_id": "46" + }, + { + "district_id": "502", + "district_name": "太子河区", + "spell": "taizihequ", + "easy_spell": "tzhq", + "city_id": "46" + }, + { + "district_id": "503", + "district_name": "辽阳县", + "spell": "liaoyangxian", + "easy_spell": "lyx", + "city_id": "46" + }, + { + "district_id": "504", + "district_name": "灯塔市", + "spell": "dengtashi", + "easy_spell": "dts", + "city_id": "46" + }, + { + "district_id": "505", + "district_name": "双台子区", + "spell": "shuangtaiziqu", + "easy_spell": "stzq", + "city_id": "47" + }, + { + "district_id": "506", + "district_name": "兴隆台区", + "spell": "xinglongtaiqu", + "easy_spell": "xltq", + "city_id": "47" + }, + { + "district_id": "507", + "district_name": "大洼县", + "spell": "dawaxian", + "easy_spell": "dwx", + "city_id": "47" + }, + { + "district_id": "508", + "district_name": "盘山县", + "spell": "panshanxian", + "easy_spell": "psx", + "city_id": "47" + }, + { + "district_id": "509", + "district_name": "银州区", + "spell": "yinzhouqu", + "easy_spell": "yzq", + "city_id": "48" + }, + { + "district_id": "510", + "district_name": "清河区", + "spell": "qinghequ", + "easy_spell": "qhq", + "city_id": "48" + }, + { + "district_id": "511", + "district_name": "铁岭县", + "spell": "tielingxian", + "easy_spell": "tlx", + "city_id": "48" + }, + { + "district_id": "512", + "district_name": "西丰县", + "spell": "xifengxian", + "easy_spell": "xfx", + "city_id": "48" + }, + { + "district_id": "513", + "district_name": "昌图县", + "spell": "changtuxian", + "easy_spell": "ctx", + "city_id": "48" + }, + { + "district_id": "514", + "district_name": "调兵山市", + "spell": "diaobingshanshi", + "easy_spell": "dbss", + "city_id": "48" + }, + { + "district_id": "515", + "district_name": "开原市", + "spell": "kaiyuanshi", + "easy_spell": "kys", + "city_id": "48" + }, + { + "district_id": "516", + "district_name": "双塔区", + "spell": "shuangtaqu", + "easy_spell": "stq", + "city_id": "49" + }, + { + "district_id": "517", + "district_name": "龙城区", + "spell": "longchengqu", + "easy_spell": "lcq", + "city_id": "49" + }, + { + "district_id": "518", + "district_name": "朝阳县", + "spell": "chaoyangxian", + "easy_spell": "cyx", + "city_id": "49" + }, + { + "district_id": "519", + "district_name": "建平县", + "spell": "jianpingxian", + "easy_spell": "jpx", + "city_id": "49" + }, + { + "district_id": "520", + "district_name": "喀喇沁左翼蒙古族自治县", + "spell": "kalaqinzuoyimengguzuzizhixian", + "easy_spell": "klqzymgzzzx", + "city_id": "49" + }, + { + "district_id": "521", + "district_name": "北票市", + "spell": "beipiaoshi", + "easy_spell": "bps", + "city_id": "49" + }, + { + "district_id": "522", + "district_name": "凌源市", + "spell": "lingyuanshi", + "easy_spell": "lys", + "city_id": "49" + }, + { + "district_id": "523", + "district_name": "连山区", + "spell": "lianshanqu", + "easy_spell": "lsq", + "city_id": "50" + }, + { + "district_id": "524", + "district_name": "龙港区", + "spell": "longgangqu", + "easy_spell": "lgq", + "city_id": "50" + }, + { + "district_id": "525", + "district_name": "南票区", + "spell": "nanpiaoqu", + "easy_spell": "npq", + "city_id": "50" + }, + { + "district_id": "526", + "district_name": "绥中县", + "spell": "suizhongxian", + "easy_spell": "szx", + "city_id": "50" + }, + { + "district_id": "527", + "district_name": "建昌县", + "spell": "jianchangxian", + "easy_spell": "jcx", + "city_id": "50" + }, + { + "district_id": "528", + "district_name": "兴城市", + "spell": "xingchengshi", + "easy_spell": "xcs", + "city_id": "50" + }, + { + "district_id": "529", + "district_name": "南关区", + "spell": "nanguanqu", + "easy_spell": "ngq", + "city_id": "51" + }, + { + "district_id": "530", + "district_name": "宽城区", + "spell": "kuanchengqu", + "easy_spell": "kcq", + "city_id": "51" + }, + { + "district_id": "531", + "district_name": "朝阳区", + "spell": "chaoyangqu", + "easy_spell": "cyq", + "city_id": "51" + }, + { + "district_id": "532", + "district_name": "二道区", + "spell": "erdaoqu", + "easy_spell": "edq", + "city_id": "51" + }, + { + "district_id": "533", + "district_name": "绿园区", + "spell": "lvyuanqu", + "easy_spell": "lyq", + "city_id": "51" + }, + { + "district_id": "534", + "district_name": "双阳区", + "spell": "shuangyangqu", + "easy_spell": "syq", + "city_id": "51" + }, + { + "district_id": "535", + "district_name": "农安县", + "spell": "nonganxian", + "easy_spell": "nax", + "city_id": "51" + }, + { + "district_id": "536", + "district_name": "九台市", + "spell": "jiutaishi", + "easy_spell": "jts", + "city_id": "51" + }, + { + "district_id": "537", + "district_name": "榆树市", + "spell": "yushushi", + "easy_spell": "yss", + "city_id": "51" + }, + { + "district_id": "538", + "district_name": "德惠市", + "spell": "dehuishi", + "easy_spell": "dhs", + "city_id": "51" + }, + { + "district_id": "539", + "district_name": "昌邑区", + "spell": "changyiqu", + "easy_spell": "cyq", + "city_id": "52" + }, + { + "district_id": "540", + "district_name": "龙潭区", + "spell": "longtanqu", + "easy_spell": "ltq", + "city_id": "52" + }, + { + "district_id": "541", + "district_name": "船营区", + "spell": "chuanyingqu", + "easy_spell": "cyq", + "city_id": "52" + }, + { + "district_id": "542", + "district_name": "丰满区", + "spell": "fengmanqu", + "easy_spell": "fmq", + "city_id": "52" + }, + { + "district_id": "543", + "district_name": "永吉县", + "spell": "yongjixian", + "easy_spell": "yjx", + "city_id": "52" + }, + { + "district_id": "544", + "district_name": "蛟河市", + "spell": "zuoheshi", + "easy_spell": "zhs", + "city_id": "52" + }, + { + "district_id": "545", + "district_name": "桦甸市", + "spell": "zuodianshi", + "easy_spell": "zds", + "city_id": "52" + }, + { + "district_id": "546", + "district_name": "舒兰市", + "spell": "shulanshi", + "easy_spell": "sls", + "city_id": "52" + }, + { + "district_id": "547", + "district_name": "磐石市", + "spell": "panshishi", + "easy_spell": "pss", + "city_id": "52" + }, + { + "district_id": "548", + "district_name": "铁西区", + "spell": "tiexiqu", + "easy_spell": "txq", + "city_id": "53" + }, + { + "district_id": "549", + "district_name": "铁东区", + "spell": "tiedongqu", + "easy_spell": "tdq", + "city_id": "53" + }, + { + "district_id": "550", + "district_name": "梨树县", + "spell": "lishuxian", + "easy_spell": "lsx", + "city_id": "53" + }, + { + "district_id": "551", + "district_name": "伊通满族自治县", + "spell": "yitongmanzuzizhixian", + "easy_spell": "ytmzzzx", + "city_id": "53" + }, + { + "district_id": "552", + "district_name": "公主岭市", + "spell": "gongzhulingshi", + "easy_spell": "gzls", + "city_id": "53" + }, + { + "district_id": "553", + "district_name": "双辽市", + "spell": "shuangliaoshi", + "easy_spell": "sls", + "city_id": "53" + }, + { + "district_id": "554", + "district_name": "龙山区", + "spell": "longshanqu", + "easy_spell": "lsq", + "city_id": "54" + }, + { + "district_id": "555", + "district_name": "西安区", + "spell": "xianqu", + "easy_spell": "xaq", + "city_id": "54" + }, + { + "district_id": "556", + "district_name": "东丰县", + "spell": "dongfengxian", + "easy_spell": "dfx", + "city_id": "54" + }, + { + "district_id": "557", + "district_name": "东辽县", + "spell": "dongliaoxian", + "easy_spell": "dlx", + "city_id": "54" + }, + { + "district_id": "558", + "district_name": "东昌区", + "spell": "dongchangqu", + "easy_spell": "dcq", + "city_id": "55" + }, + { + "district_id": "559", + "district_name": "二道江区", + "spell": "erdaojiangqu", + "easy_spell": "edjq", + "city_id": "55" + }, + { + "district_id": "560", + "district_name": "通化县", + "spell": "tonghuaxian", + "easy_spell": "thx", + "city_id": "55" + }, + { + "district_id": "561", + "district_name": "辉南县", + "spell": "huinanxian", + "easy_spell": "hnx", + "city_id": "55" + }, + { + "district_id": "562", + "district_name": "柳河县", + "spell": "liuhexian", + "easy_spell": "lhx", + "city_id": "55" + }, + { + "district_id": "563", + "district_name": "梅河口市", + "spell": "meihekoushi", + "easy_spell": "mhks", + "city_id": "55" + }, + { + "district_id": "564", + "district_name": "集安市", + "spell": "jianshi", + "easy_spell": "jas", + "city_id": "55" + }, + { + "district_id": "565", + "district_name": "八道江区", + "spell": "badaojiangqu", + "easy_spell": "bdjq", + "city_id": "56" + }, + { + "district_id": "566", + "district_name": "抚松县", + "spell": "fusongxian", + "easy_spell": "fsx", + "city_id": "56" + }, + { + "district_id": "567", + "district_name": "靖宇县", + "spell": "jingyuxian", + "easy_spell": "jyx", + "city_id": "56" + }, + { + "district_id": "568", + "district_name": "长白朝鲜族自治县", + "spell": "changbaichaoxianzuzizhixian", + "easy_spell": "cbcxzzzx", + "city_id": "56" + }, + { + "district_id": "569", + "district_name": "江源县", + "spell": "jiangyuanxian", + "easy_spell": "jyx", + "city_id": "56" + }, + { + "district_id": "570", + "district_name": "临江市", + "spell": "linjiangshi", + "easy_spell": "ljs", + "city_id": "56" + }, + { + "district_id": "571", + "district_name": "宁江区", + "spell": "ningjiangqu", + "easy_spell": "njq", + "city_id": "57" + }, + { + "district_id": "572", + "district_name": "前郭尔罗斯蒙古族自治县", + "spell": "qianguoerluosimengguzuzizhixian", + "easy_spell": "qgelsmgzzzx", + "city_id": "57" + }, + { + "district_id": "573", + "district_name": "长岭县", + "spell": "changlingxian", + "easy_spell": "clx", + "city_id": "57" + }, + { + "district_id": "574", + "district_name": "乾安县", + "spell": "qiananxian", + "easy_spell": "qax", + "city_id": "57" + }, + { + "district_id": "575", + "district_name": "扶余县", + "spell": "fuyuxian", + "easy_spell": "fyx", + "city_id": "57" + }, + { + "district_id": "576", + "district_name": "洮北区", + "spell": "zuobeiqu", + "easy_spell": "zbq", + "city_id": "58" + }, + { + "district_id": "577", + "district_name": "镇赉县", + "spell": "zhenzuoxian", + "easy_spell": "zzx", + "city_id": "58" + }, + { + "district_id": "578", + "district_name": "通榆县", + "spell": "tongyuxian", + "easy_spell": "tyx", + "city_id": "58" + }, + { + "district_id": "579", + "district_name": "洮南市", + "spell": "zuonanshi", + "easy_spell": "zns", + "city_id": "58" + }, + { + "district_id": "580", + "district_name": "大安市", + "spell": "daanshi", + "easy_spell": "das", + "city_id": "58" + }, + { + "district_id": "581", + "district_name": "延吉市", + "spell": "yanjishi", + "easy_spell": "yjs", + "city_id": "59" + }, + { + "district_id": "582", + "district_name": "图们市", + "spell": "tumenshi", + "easy_spell": "tms", + "city_id": "59" + }, + { + "district_id": "583", + "district_name": "敦化市", + "spell": "dunhuashi", + "easy_spell": "dhs", + "city_id": "59" + }, + { + "district_id": "584", + "district_name": "珲春市", + "spell": "zuochunshi", + "easy_spell": "zcs", + "city_id": "59" + }, + { + "district_id": "585", + "district_name": "龙井市", + "spell": "longjingshi", + "easy_spell": "ljs", + "city_id": "59" + }, + { + "district_id": "586", + "district_name": "和龙市", + "spell": "helongshi", + "easy_spell": "hls", + "city_id": "59" + }, + { + "district_id": "587", + "district_name": "汪清县", + "spell": "wangqingxian", + "easy_spell": "wqx", + "city_id": "59" + }, + { + "district_id": "588", + "district_name": "安图县", + "spell": "antuxian", + "easy_spell": "atx", + "city_id": "59" + }, + { + "district_id": "589", + "district_name": "道里区", + "spell": "daoliqu", + "easy_spell": "dlq", + "city_id": "60" + }, + { + "district_id": "590", + "district_name": "南岗区", + "spell": "nangangqu", + "easy_spell": "ngq", + "city_id": "60" + }, + { + "district_id": "591", + "district_name": "道外区", + "spell": "daowaiqu", + "easy_spell": "dwq", + "city_id": "60" + }, + { + "district_id": "592", + "district_name": "香坊区", + "spell": "xiangfangqu", + "easy_spell": "xfq", + "city_id": "60" + }, + { + "district_id": "593", + "district_name": "动力区", + "spell": "dongliqu", + "easy_spell": "dlq", + "city_id": "60" + }, + { + "district_id": "594", + "district_name": "平房区", + "spell": "pingfangqu", + "easy_spell": "pfq", + "city_id": "60" + }, + { + "district_id": "595", + "district_name": "松北区", + "spell": "songbeiqu", + "easy_spell": "sbq", + "city_id": "60" + }, + { + "district_id": "596", + "district_name": "呼兰区", + "spell": "hulanqu", + "easy_spell": "hlq", + "city_id": "60" + }, + { + "district_id": "597", + "district_name": "依兰县", + "spell": "yilanxian", + "easy_spell": "ylx", + "city_id": "60" + }, + { + "district_id": "598", + "district_name": "方正县", + "spell": "fangzhengxian", + "easy_spell": "fzx", + "city_id": "60" + }, + { + "district_id": "599", + "district_name": "宾县", + "spell": "binxian", + "easy_spell": "bx", + "city_id": "60" + }, + { + "district_id": "600", + "district_name": "巴彦县", + "spell": "bayanxian", + "easy_spell": "byx", + "city_id": "60" + }, + { + "district_id": "601", + "district_name": "木兰县", + "spell": "mulanxian", + "easy_spell": "mlx", + "city_id": "60" + }, + { + "district_id": "602", + "district_name": "通河县", + "spell": "tonghexian", + "easy_spell": "thx", + "city_id": "60" + }, + { + "district_id": "603", + "district_name": "延寿县", + "spell": "yanshouxian", + "easy_spell": "ysx", + "city_id": "60" + }, + { + "district_id": "604", + "district_name": "阿城市", + "spell": "achengshi", + "easy_spell": "acs", + "city_id": "60" + }, + { + "district_id": "605", + "district_name": "双城市", + "spell": "shuangchengshi", + "easy_spell": "scs", + "city_id": "60" + }, + { + "district_id": "606", + "district_name": "尚志市", + "spell": "shangzhishi", + "easy_spell": "szs", + "city_id": "60" + }, + { + "district_id": "607", + "district_name": "五常市", + "spell": "wuchangshi", + "easy_spell": "wcs", + "city_id": "60" + }, + { + "district_id": "608", + "district_name": "龙沙区", + "spell": "longshaqu", + "easy_spell": "lsq", + "city_id": "61" + }, + { + "district_id": "609", + "district_name": "建华区", + "spell": "jianhuaqu", + "easy_spell": "jhq", + "city_id": "61" + }, + { + "district_id": "610", + "district_name": "铁锋区", + "spell": "tiefengqu", + "easy_spell": "tfq", + "city_id": "61" + }, + { + "district_id": "611", + "district_name": "昂昂溪区", + "spell": "angangxiqu", + "easy_spell": "aaxq", + "city_id": "61" + }, + { + "district_id": "612", + "district_name": "富拉尔基区", + "spell": "fulaerjiqu", + "easy_spell": "flejq", + "city_id": "61" + }, + { + "district_id": "613", + "district_name": "碾子山区", + "spell": "nianzishanqu", + "easy_spell": "nzsq", + "city_id": "61" + }, + { + "district_id": "614", + "district_name": "梅里斯达斡尔族区", + "spell": "meilisidawoerzuqu", + "easy_spell": "mlsdwezq", + "city_id": "61" + }, + { + "district_id": "615", + "district_name": "龙江县", + "spell": "longjiangxian", + "easy_spell": "ljx", + "city_id": "61" + }, + { + "district_id": "616", + "district_name": "依安县", + "spell": "yianxian", + "easy_spell": "yax", + "city_id": "61" + }, + { + "district_id": "617", + "district_name": "泰来县", + "spell": "tailaixian", + "easy_spell": "tlx", + "city_id": "61" + }, + { + "district_id": "618", + "district_name": "甘南县", + "spell": "gannanxian", + "easy_spell": "gnx", + "city_id": "61" + }, + { + "district_id": "619", + "district_name": "富裕县", + "spell": "fuyuxian", + "easy_spell": "fyx", + "city_id": "61" + }, + { + "district_id": "620", + "district_name": "克山县", + "spell": "keshanxian", + "easy_spell": "ksx", + "city_id": "61" + }, + { + "district_id": "621", + "district_name": "克东县", + "spell": "kedongxian", + "easy_spell": "kdx", + "city_id": "61" + }, + { + "district_id": "622", + "district_name": "拜泉县", + "spell": "baiquanxian", + "easy_spell": "bqx", + "city_id": "61" + }, + { + "district_id": "623", + "district_name": "讷河市", + "spell": "zuoheshi", + "easy_spell": "zhs", + "city_id": "61" + }, + { + "district_id": "624", + "district_name": "鸡冠区", + "spell": "jiguanqu", + "easy_spell": "jgq", + "city_id": "62" + }, + { + "district_id": "625", + "district_name": "恒山区", + "spell": "hengshanqu", + "easy_spell": "hsq", + "city_id": "62" + }, + { + "district_id": "626", + "district_name": "滴道区", + "spell": "didaoqu", + "easy_spell": "ddq", + "city_id": "62" + }, + { + "district_id": "627", + "district_name": "梨树区", + "spell": "lishuqu", + "easy_spell": "lsq", + "city_id": "62" + }, + { + "district_id": "628", + "district_name": "城子河区", + "spell": "chengzihequ", + "easy_spell": "czhq", + "city_id": "62" + }, + { + "district_id": "629", + "district_name": "麻山区", + "spell": "mashanqu", + "easy_spell": "msq", + "city_id": "62" + }, + { + "district_id": "630", + "district_name": "鸡东县", + "spell": "jidongxian", + "easy_spell": "jdx", + "city_id": "62" + }, + { + "district_id": "631", + "district_name": "虎林市", + "spell": "hulinshi", + "easy_spell": "hls", + "city_id": "62" + }, + { + "district_id": "632", + "district_name": "密山市", + "spell": "mishanshi", + "easy_spell": "mss", + "city_id": "62" + }, + { + "district_id": "633", + "district_name": "向阳区", + "spell": "xiangyangqu", + "easy_spell": "xyq", + "city_id": "63" + }, + { + "district_id": "634", + "district_name": "工农区", + "spell": "gongnongqu", + "easy_spell": "gnq", + "city_id": "63" + }, + { + "district_id": "635", + "district_name": "南山区", + "spell": "nanshanqu", + "easy_spell": "nsq", + "city_id": "63" + }, + { + "district_id": "636", + "district_name": "兴安区", + "spell": "xinganqu", + "easy_spell": "xaq", + "city_id": "63" + }, + { + "district_id": "637", + "district_name": "东山区", + "spell": "dongshanqu", + "easy_spell": "dsq", + "city_id": "63" + }, + { + "district_id": "638", + "district_name": "兴山区", + "spell": "xingshanqu", + "easy_spell": "xsq", + "city_id": "63" + }, + { + "district_id": "639", + "district_name": "萝北县", + "spell": "luobeixian", + "easy_spell": "lbx", + "city_id": "63" + }, + { + "district_id": "640", + "district_name": "绥滨县", + "spell": "suibinxian", + "easy_spell": "sbx", + "city_id": "63" + }, + { + "district_id": "641", + "district_name": "尖山区", + "spell": "jianshanqu", + "easy_spell": "jsq", + "city_id": "64" + }, + { + "district_id": "642", + "district_name": "岭东区", + "spell": "lingdongqu", + "easy_spell": "ldq", + "city_id": "64" + }, + { + "district_id": "643", + "district_name": "四方台区", + "spell": "sifangtaiqu", + "easy_spell": "sftq", + "city_id": "64" + }, + { + "district_id": "644", + "district_name": "宝山区", + "spell": "baoshanqu", + "easy_spell": "bsq", + "city_id": "64" + }, + { + "district_id": "645", + "district_name": "集贤县", + "spell": "jixianxian", + "easy_spell": "jxx", + "city_id": "64" + }, + { + "district_id": "646", + "district_name": "友谊县", + "spell": "youyixian", + "easy_spell": "yyx", + "city_id": "64" + }, + { + "district_id": "647", + "district_name": "宝清县", + "spell": "baoqingxian", + "easy_spell": "bqx", + "city_id": "64" + }, + { + "district_id": "648", + "district_name": "饶河县", + "spell": "raohexian", + "easy_spell": "rhx", + "city_id": "64" + }, + { + "district_id": "649", + "district_name": "萨尔图区", + "spell": "saertuqu", + "easy_spell": "setq", + "city_id": "65" + }, + { + "district_id": "650", + "district_name": "龙凤区", + "spell": "longfengqu", + "easy_spell": "lfq", + "city_id": "65" + }, + { + "district_id": "651", + "district_name": "让胡路区", + "spell": "ranghuluqu", + "easy_spell": "rhlq", + "city_id": "65" + }, + { + "district_id": "652", + "district_name": "红岗区", + "spell": "honggangqu", + "easy_spell": "hgq", + "city_id": "65" + }, + { + "district_id": "653", + "district_name": "大同区", + "spell": "datongqu", + "easy_spell": "dtq", + "city_id": "65" + }, + { + "district_id": "654", + "district_name": "肇州县", + "spell": "zhaozhouxian", + "easy_spell": "zzx", + "city_id": "65" + }, + { + "district_id": "655", + "district_name": "肇源县", + "spell": "zhaoyuanxian", + "easy_spell": "zyx", + "city_id": "65" + }, + { + "district_id": "656", + "district_name": "林甸县", + "spell": "lindianxian", + "easy_spell": "ldx", + "city_id": "65" + }, + { + "district_id": "657", + "district_name": "杜尔伯特蒙古族自治县", + "spell": "duerbotemengguzuzizhixian", + "easy_spell": "debtmgzzzx", + "city_id": "65" + }, + { + "district_id": "658", + "district_name": "伊春区", + "spell": "yichunqu", + "easy_spell": "ycq", + "city_id": "66" + }, + { + "district_id": "659", + "district_name": "南岔区", + "spell": "nanchaqu", + "easy_spell": "ncq", + "city_id": "66" + }, + { + "district_id": "660", + "district_name": "友好区", + "spell": "youhaoqu", + "easy_spell": "yhq", + "city_id": "66" + }, + { + "district_id": "661", + "district_name": "西林区", + "spell": "xilinqu", + "easy_spell": "xlq", + "city_id": "66" + }, + { + "district_id": "662", + "district_name": "翠峦区", + "spell": "cuiluanqu", + "easy_spell": "clq", + "city_id": "66" + }, + { + "district_id": "663", + "district_name": "新青区", + "spell": "xinqingqu", + "easy_spell": "xqq", + "city_id": "66" + }, + { + "district_id": "664", + "district_name": "美溪区", + "spell": "meixiqu", + "easy_spell": "mxq", + "city_id": "66" + }, + { + "district_id": "665", + "district_name": "金山屯区", + "spell": "jinshantunqu", + "easy_spell": "jstq", + "city_id": "66" + }, + { + "district_id": "666", + "district_name": "五营区", + "spell": "wuyingqu", + "easy_spell": "wyq", + "city_id": "66" + }, + { + "district_id": "667", + "district_name": "乌马河区", + "spell": "wumahequ", + "easy_spell": "wmhq", + "city_id": "66" + }, + { + "district_id": "668", + "district_name": "汤旺河区", + "spell": "tangwanghequ", + "easy_spell": "twhq", + "city_id": "66" + }, + { + "district_id": "669", + "district_name": "带岭区", + "spell": "dailingqu", + "easy_spell": "dlq", + "city_id": "66" + }, + { + "district_id": "670", + "district_name": "乌伊岭区", + "spell": "wuyilingqu", + "easy_spell": "wylq", + "city_id": "66" + }, + { + "district_id": "671", + "district_name": "红星区", + "spell": "hongxingqu", + "easy_spell": "hxq", + "city_id": "66" + }, + { + "district_id": "672", + "district_name": "上甘岭区", + "spell": "shangganlingqu", + "easy_spell": "sglq", + "city_id": "66" + }, + { + "district_id": "673", + "district_name": "嘉荫县", + "spell": "jiayinxian", + "easy_spell": "jyx", + "city_id": "66" + }, + { + "district_id": "674", + "district_name": "铁力市", + "spell": "tielishi", + "easy_spell": "tls", + "city_id": "66" + }, + { + "district_id": "675", + "district_name": "永红区", + "spell": "yonghongqu", + "easy_spell": "yhq", + "city_id": "67" + }, + { + "district_id": "676", + "district_name": "向阳区", + "spell": "xiangyangqu", + "easy_spell": "xyq", + "city_id": "67" + }, + { + "district_id": "677", + "district_name": "前进区", + "spell": "qianjinqu", + "easy_spell": "qjq", + "city_id": "67" + }, + { + "district_id": "678", + "district_name": "东风区", + "spell": "dongfengqu", + "easy_spell": "dfq", + "city_id": "67" + }, + { + "district_id": "679", + "district_name": "郊区", + "spell": "jiaoqu", + "easy_spell": "jq", + "city_id": "67" + }, + { + "district_id": "680", + "district_name": "桦南县", + "spell": "zuonanxian", + "easy_spell": "znx", + "city_id": "67" + }, + { + "district_id": "681", + "district_name": "桦川县", + "spell": "zuochuanxian", + "easy_spell": "zcx", + "city_id": "67" + }, + { + "district_id": "682", + "district_name": "汤原县", + "spell": "tangyuanxian", + "easy_spell": "tyx", + "city_id": "67" + }, + { + "district_id": "683", + "district_name": "抚远县", + "spell": "fuyuanxian", + "easy_spell": "fyx", + "city_id": "67" + }, + { + "district_id": "684", + "district_name": "同江市", + "spell": "tongjiangshi", + "easy_spell": "tjs", + "city_id": "67" + }, + { + "district_id": "685", + "district_name": "富锦市", + "spell": "fujinshi", + "easy_spell": "fjs", + "city_id": "67" + }, + { + "district_id": "686", + "district_name": "新兴区", + "spell": "xinxingqu", + "easy_spell": "xxq", + "city_id": "68" + }, + { + "district_id": "687", + "district_name": "桃山区", + "spell": "taoshanqu", + "easy_spell": "tsq", + "city_id": "68" + }, + { + "district_id": "688", + "district_name": "茄子河区", + "spell": "qiezihequ", + "easy_spell": "qzhq", + "city_id": "68" + }, + { + "district_id": "689", + "district_name": "勃利县", + "spell": "bolixian", + "easy_spell": "blx", + "city_id": "68" + }, + { + "district_id": "690", + "district_name": "东安区", + "spell": "donganqu", + "easy_spell": "daq", + "city_id": "69" + }, + { + "district_id": "691", + "district_name": "阳明区", + "spell": "yangmingqu", + "easy_spell": "ymq", + "city_id": "69" + }, + { + "district_id": "692", + "district_name": "爱民区", + "spell": "aiminqu", + "easy_spell": "amq", + "city_id": "69" + }, + { + "district_id": "693", + "district_name": "西安区", + "spell": "xianqu", + "easy_spell": "xaq", + "city_id": "69" + }, + { + "district_id": "694", + "district_name": "东宁县", + "spell": "dongningxian", + "easy_spell": "dnx", + "city_id": "69" + }, + { + "district_id": "695", + "district_name": "林口县", + "spell": "linkouxian", + "easy_spell": "lkx", + "city_id": "69" + }, + { + "district_id": "696", + "district_name": "绥芬河市", + "spell": "suifenheshi", + "easy_spell": "sfhs", + "city_id": "69" + }, + { + "district_id": "697", + "district_name": "海林市", + "spell": "hailinshi", + "easy_spell": "hls", + "city_id": "69" + }, + { + "district_id": "698", + "district_name": "宁安市", + "spell": "ninganshi", + "easy_spell": "nas", + "city_id": "69" + }, + { + "district_id": "699", + "district_name": "穆棱市", + "spell": "mulengshi", + "easy_spell": "mls", + "city_id": "69" + }, + { + "district_id": "700", + "district_name": "爱辉区", + "spell": "aihuiqu", + "easy_spell": "ahq", + "city_id": "70" + }, + { + "district_id": "701", + "district_name": "嫩江县", + "spell": "nenjiangxian", + "easy_spell": "njx", + "city_id": "70" + }, + { + "district_id": "702", + "district_name": "逊克县", + "spell": "xunkexian", + "easy_spell": "xkx", + "city_id": "70" + }, + { + "district_id": "703", + "district_name": "孙吴县", + "spell": "sunwuxian", + "easy_spell": "swx", + "city_id": "70" + }, + { + "district_id": "704", + "district_name": "北安市", + "spell": "beianshi", + "easy_spell": "bas", + "city_id": "70" + }, + { + "district_id": "705", + "district_name": "五大连池市", + "spell": "wudalianchishi", + "easy_spell": "wdlcs", + "city_id": "70" + }, + { + "district_id": "706", + "district_name": "北林区", + "spell": "beilinqu", + "easy_spell": "blq", + "city_id": "71" + }, + { + "district_id": "707", + "district_name": "望奎县", + "spell": "wangkuixian", + "easy_spell": "wkx", + "city_id": "71" + }, + { + "district_id": "708", + "district_name": "兰西县", + "spell": "lanxixian", + "easy_spell": "lxx", + "city_id": "71" + }, + { + "district_id": "709", + "district_name": "青冈县", + "spell": "qinggangxian", + "easy_spell": "qgx", + "city_id": "71" + }, + { + "district_id": "710", + "district_name": "庆安县", + "spell": "qinganxian", + "easy_spell": "qax", + "city_id": "71" + }, + { + "district_id": "711", + "district_name": "明水县", + "spell": "mingshuixian", + "easy_spell": "msx", + "city_id": "71" + }, + { + "district_id": "712", + "district_name": "绥棱县", + "spell": "suilengxian", + "easy_spell": "slx", + "city_id": "71" + }, + { + "district_id": "713", + "district_name": "安达市", + "spell": "andashi", + "easy_spell": "ads", + "city_id": "71" + }, + { + "district_id": "714", + "district_name": "肇东市", + "spell": "zhaodongshi", + "easy_spell": "zds", + "city_id": "71" + }, + { + "district_id": "715", + "district_name": "海伦市", + "spell": "hailunshi", + "easy_spell": "hls", + "city_id": "71" + }, + { + "district_id": "716", + "district_name": "呼玛县", + "spell": "humaxian", + "easy_spell": "hmx", + "city_id": "72" + }, + { + "district_id": "717", + "district_name": "塔河县", + "spell": "tahexian", + "easy_spell": "thx", + "city_id": "72" + }, + { + "district_id": "718", + "district_name": "漠河县", + "spell": "mohexian", + "easy_spell": "mhx", + "city_id": "72" + }, + { + "district_id": "719", + "district_name": "黄浦区", + "spell": "huangpuqu", + "easy_spell": "hpq", + "city_id": "73" + }, + { + "district_id": "720", + "district_name": "卢湾区", + "spell": "luwanqu", + "easy_spell": "lwq", + "city_id": "73" + }, + { + "district_id": "721", + "district_name": "徐汇区", + "spell": "xuhuiqu", + "easy_spell": "xhq", + "city_id": "73" + }, + { + "district_id": "722", + "district_name": "长宁区", + "spell": "changningqu", + "easy_spell": "cnq", + "city_id": "73" + }, + { + "district_id": "723", + "district_name": "静安区", + "spell": "jinganqu", + "easy_spell": "jaq", + "city_id": "73" + }, + { + "district_id": "724", + "district_name": "普陀区", + "spell": "putuoqu", + "easy_spell": "ptq", + "city_id": "73" + }, + { + "district_id": "725", + "district_name": "闸北区", + "spell": "zhabeiqu", + "easy_spell": "zbq", + "city_id": "73" + }, + { + "district_id": "726", + "district_name": "虹口区", + "spell": "hongkouqu", + "easy_spell": "hkq", + "city_id": "73" + }, + { + "district_id": "727", + "district_name": "杨浦区", + "spell": "yangpuqu", + "easy_spell": "ypq", + "city_id": "73" + }, + { + "district_id": "728", + "district_name": "闵行区", + "spell": "zuoxingqu", + "easy_spell": "zxq", + "city_id": "73" + }, + { + "district_id": "729", + "district_name": "宝山区", + "spell": "baoshanqu", + "easy_spell": "bsq", + "city_id": "73" + }, + { + "district_id": "730", + "district_name": "嘉定区", + "spell": "jiadingqu", + "easy_spell": "jdq", + "city_id": "73" + }, + { + "district_id": "731", + "district_name": "浦东新区", + "spell": "pudongxinqu", + "easy_spell": "pdxq", + "city_id": "73" + }, + { + "district_id": "732", + "district_name": "金山区", + "spell": "jinshanqu", + "easy_spell": "jsq", + "city_id": "73" + }, + { + "district_id": "733", + "district_name": "松江区", + "spell": "songjiangqu", + "easy_spell": "sjq", + "city_id": "73" + }, + { + "district_id": "734", + "district_name": "青浦区", + "spell": "qingpuqu", + "easy_spell": "qpq", + "city_id": "73" + }, + { + "district_id": "735", + "district_name": "南汇区", + "spell": "nanhuiqu", + "easy_spell": "nhq", + "city_id": "73" + }, + { + "district_id": "736", + "district_name": "奉贤区", + "spell": "fengxianqu", + "easy_spell": "fxq", + "city_id": "73" + }, + { + "district_id": "737", + "district_name": "崇明县", + "spell": "chongmingxian", + "easy_spell": "cmx", + "city_id": "73" + }, + { + "district_id": "738", + "district_name": "玄武区", + "spell": "xuanwuqu", + "easy_spell": "xwq", + "city_id": "74" + }, + { + "district_id": "739", + "district_name": "白下区", + "spell": "baixiaqu", + "easy_spell": "bxq", + "city_id": "74" + }, + { + "district_id": "740", + "district_name": "秦淮区", + "spell": "qinhuaiqu", + "easy_spell": "qhq", + "city_id": "74" + }, + { + "district_id": "741", + "district_name": "建邺区", + "spell": "jianzuoqu", + "easy_spell": "jzq", + "city_id": "74" + }, + { + "district_id": "742", + "district_name": "鼓楼区", + "spell": "gulouqu", + "easy_spell": "glq", + "city_id": "74" + }, + { + "district_id": "743", + "district_name": "下关区", + "spell": "xiaguanqu", + "easy_spell": "xgq", + "city_id": "74" + }, + { + "district_id": "744", + "district_name": "浦口区", + "spell": "pukouqu", + "easy_spell": "pkq", + "city_id": "74" + }, + { + "district_id": "745", + "district_name": "栖霞区", + "spell": "qixiaqu", + "easy_spell": "qxq", + "city_id": "74" + }, + { + "district_id": "746", + "district_name": "雨花台区", + "spell": "yuhuataiqu", + "easy_spell": "yhtq", + "city_id": "74" + }, + { + "district_id": "747", + "district_name": "江宁区", + "spell": "jiangningqu", + "easy_spell": "jnq", + "city_id": "74" + }, + { + "district_id": "748", + "district_name": "六合区", + "spell": "liuhequ", + "easy_spell": "lhq", + "city_id": "74" + }, + { + "district_id": "749", + "district_name": "溧水县", + "spell": "zuoshuixian", + "easy_spell": "zsx", + "city_id": "74" + }, + { + "district_id": "750", + "district_name": "高淳县", + "spell": "gaochunxian", + "easy_spell": "gcx", + "city_id": "74" + }, + { + "district_id": "751", + "district_name": "崇安区", + "spell": "chonganqu", + "easy_spell": "caq", + "city_id": "75" + }, + { + "district_id": "752", + "district_name": "南长区", + "spell": "nanchangqu", + "easy_spell": "ncq", + "city_id": "75" + }, + { + "district_id": "753", + "district_name": "北塘区", + "spell": "beitangqu", + "easy_spell": "btq", + "city_id": "75" + }, + { + "district_id": "754", + "district_name": "锡山区", + "spell": "xishanqu", + "easy_spell": "xsq", + "city_id": "75" + }, + { + "district_id": "755", + "district_name": "惠山区", + "spell": "huishanqu", + "easy_spell": "hsq", + "city_id": "75" + }, + { + "district_id": "756", + "district_name": "滨湖区", + "spell": "binhuqu", + "easy_spell": "bhq", + "city_id": "75" + }, + { + "district_id": "757", + "district_name": "江阴市", + "spell": "jiangyinshi", + "easy_spell": "jys", + "city_id": "75" + }, + { + "district_id": "758", + "district_name": "宜兴市", + "spell": "yixingshi", + "easy_spell": "yxs", + "city_id": "75" + }, + { + "district_id": "759", + "district_name": "鼓楼区", + "spell": "gulouqu", + "easy_spell": "glq", + "city_id": "76" + }, + { + "district_id": "760", + "district_name": "云龙区", + "spell": "yunlongqu", + "easy_spell": "ylq", + "city_id": "76" + }, + { + "district_id": "761", + "district_name": "九里区", + "spell": "jiuliqu", + "easy_spell": "jlq", + "city_id": "76" + }, + { + "district_id": "762", + "district_name": "贾汪区", + "spell": "jiawangqu", + "easy_spell": "jwq", + "city_id": "76" + }, + { + "district_id": "763", + "district_name": "泉山区", + "spell": "quanshanqu", + "easy_spell": "qsq", + "city_id": "76" + }, + { + "district_id": "764", + "district_name": "丰县", + "spell": "fengxian", + "easy_spell": "fx", + "city_id": "76" + }, + { + "district_id": "765", + "district_name": "沛县", + "spell": "peixian", + "easy_spell": "px", + "city_id": "76" + }, + { + "district_id": "766", + "district_name": "铜山县", + "spell": "tongshanxian", + "easy_spell": "tsx", + "city_id": "76" + }, + { + "district_id": "767", + "district_name": "睢宁县", + "spell": "zuoningxian", + "easy_spell": "znx", + "city_id": "76" + }, + { + "district_id": "768", + "district_name": "新沂市", + "spell": "xinyishi", + "easy_spell": "xys", + "city_id": "76" + }, + { + "district_id": "769", + "district_name": "邳州市", + "spell": "zuozhoushi", + "easy_spell": "zzs", + "city_id": "76" + }, + { + "district_id": "770", + "district_name": "天宁区", + "spell": "tianningqu", + "easy_spell": "tnq", + "city_id": "77" + }, + { + "district_id": "771", + "district_name": "钟楼区", + "spell": "zhonglouqu", + "easy_spell": "zlq", + "city_id": "77" + }, + { + "district_id": "772", + "district_name": "戚墅堰区", + "spell": "qishuyanqu", + "easy_spell": "qsyq", + "city_id": "77" + }, + { + "district_id": "773", + "district_name": "新北区", + "spell": "xinbeiqu", + "easy_spell": "xbq", + "city_id": "77" + }, + { + "district_id": "774", + "district_name": "武进区", + "spell": "wujinqu", + "easy_spell": "wjq", + "city_id": "77" + }, + { + "district_id": "775", + "district_name": "溧阳市", + "spell": "zuoyangshi", + "easy_spell": "zys", + "city_id": "77" + }, + { + "district_id": "776", + "district_name": "金坛市", + "spell": "jintanshi", + "easy_spell": "jts", + "city_id": "77" + }, + { + "district_id": "777", + "district_name": "沧浪区", + "spell": "canglangqu", + "easy_spell": "clq", + "city_id": "78" + }, + { + "district_id": "778", + "district_name": "平江区", + "spell": "pingjiangqu", + "easy_spell": "pjq", + "city_id": "78" + }, + { + "district_id": "779", + "district_name": "金阊区", + "spell": "jinzuoqu", + "easy_spell": "jzq", + "city_id": "78" + }, + { + "district_id": "780", + "district_name": "虎丘区", + "spell": "huqiuqu", + "easy_spell": "hqq", + "city_id": "78" + }, + { + "district_id": "781", + "district_name": "吴中区", + "spell": "wuzhongqu", + "easy_spell": "wzq", + "city_id": "78" + }, + { + "district_id": "782", + "district_name": "相城区", + "spell": "xiangchengqu", + "easy_spell": "xcq", + "city_id": "78" + }, + { + "district_id": "783", + "district_name": "常熟市", + "spell": "changshushi", + "easy_spell": "css", + "city_id": "78" + }, + { + "district_id": "784", + "district_name": "张家港市", + "spell": "zhangjiagangshi", + "easy_spell": "zjgs", + "city_id": "78" + }, + { + "district_id": "785", + "district_name": "昆山市", + "spell": "kunshanshi", + "easy_spell": "kss", + "city_id": "78" + }, + { + "district_id": "786", + "district_name": "吴江市", + "spell": "wujiangshi", + "easy_spell": "wjs", + "city_id": "78" + }, + { + "district_id": "787", + "district_name": "太仓市", + "spell": "taicangshi", + "easy_spell": "tcs", + "city_id": "78" + }, + { + "district_id": "788", + "district_name": "崇川区", + "spell": "chongchuanqu", + "easy_spell": "ccq", + "city_id": "79" + }, + { + "district_id": "789", + "district_name": "港闸区", + "spell": "gangzhaqu", + "easy_spell": "gzq", + "city_id": "79" + }, + { + "district_id": "790", + "district_name": "海安县", + "spell": "haianxian", + "easy_spell": "hax", + "city_id": "79" + }, + { + "district_id": "791", + "district_name": "如东县", + "spell": "rudongxian", + "easy_spell": "rdx", + "city_id": "79" + }, + { + "district_id": "792", + "district_name": "启东市", + "spell": "qidongshi", + "easy_spell": "qds", + "city_id": "79" + }, + { + "district_id": "793", + "district_name": "如皋市", + "spell": "rugaoshi", + "easy_spell": "rgs", + "city_id": "79" + }, + { + "district_id": "794", + "district_name": "通州市", + "spell": "tongzhoushi", + "easy_spell": "tzs", + "city_id": "79" + }, + { + "district_id": "795", + "district_name": "海门市", + "spell": "haimenshi", + "easy_spell": "hms", + "city_id": "79" + }, + { + "district_id": "796", + "district_name": "连云区", + "spell": "lianyunqu", + "easy_spell": "lyq", + "city_id": "80" + }, + { + "district_id": "797", + "district_name": "新浦区", + "spell": "xinpuqu", + "easy_spell": "xpq", + "city_id": "80" + }, + { + "district_id": "798", + "district_name": "海州区", + "spell": "haizhouqu", + "easy_spell": "hzq", + "city_id": "80" + }, + { + "district_id": "799", + "district_name": "赣榆县", + "spell": "ganyuxian", + "easy_spell": "gyx", + "city_id": "80" + }, + { + "district_id": "800", + "district_name": "东海县", + "spell": "donghaixian", + "easy_spell": "dhx", + "city_id": "80" + }, + { + "district_id": "801", + "district_name": "灌云县", + "spell": "guanyunxian", + "easy_spell": "gyx", + "city_id": "80" + }, + { + "district_id": "802", + "district_name": "灌南县", + "spell": "guannanxian", + "easy_spell": "gnx", + "city_id": "80" + }, + { + "district_id": "803", + "district_name": "清河区", + "spell": "qinghequ", + "easy_spell": "qhq", + "city_id": "81" + }, + { + "district_id": "804", + "district_name": "楚州区", + "spell": "chuzhouqu", + "easy_spell": "czq", + "city_id": "81" + }, + { + "district_id": "805", + "district_name": "淮阴区", + "spell": "huaiyinqu", + "easy_spell": "hyq", + "city_id": "81" + }, + { + "district_id": "806", + "district_name": "清浦区", + "spell": "qingpuqu", + "easy_spell": "qpq", + "city_id": "81" + }, + { + "district_id": "807", + "district_name": "涟水县", + "spell": "lianshuixian", + "easy_spell": "lsx", + "city_id": "81" + }, + { + "district_id": "808", + "district_name": "洪泽县", + "spell": "hongzexian", + "easy_spell": "hzx", + "city_id": "81" + }, + { + "district_id": "809", + "district_name": "盱眙县", + "spell": "zuozuoxian", + "easy_spell": "zzx", + "city_id": "81" + }, + { + "district_id": "810", + "district_name": "金湖县", + "spell": "jinhuxian", + "easy_spell": "jhx", + "city_id": "81" + }, + { + "district_id": "811", + "district_name": "亭湖区", + "spell": "tinghuqu", + "easy_spell": "thq", + "city_id": "82" + }, + { + "district_id": "812", + "district_name": "盐都区", + "spell": "yanduqu", + "easy_spell": "ydq", + "city_id": "82" + }, + { + "district_id": "813", + "district_name": "响水县", + "spell": "xiangshuixian", + "easy_spell": "xsx", + "city_id": "82" + }, + { + "district_id": "814", + "district_name": "滨海县", + "spell": "binhaixian", + "easy_spell": "bhx", + "city_id": "82" + }, + { + "district_id": "815", + "district_name": "阜宁县", + "spell": "funingxian", + "easy_spell": "fnx", + "city_id": "82" + }, + { + "district_id": "816", + "district_name": "射阳县", + "spell": "sheyangxian", + "easy_spell": "syx", + "city_id": "82" + }, + { + "district_id": "817", + "district_name": "建湖县", + "spell": "jianhuxian", + "easy_spell": "jhx", + "city_id": "82" + }, + { + "district_id": "818", + "district_name": "东台市", + "spell": "dongtaishi", + "easy_spell": "dts", + "city_id": "82" + }, + { + "district_id": "819", + "district_name": "大丰市", + "spell": "dafengshi", + "easy_spell": "dfs", + "city_id": "82" + }, + { + "district_id": "820", + "district_name": "广陵区", + "spell": "guanglingqu", + "easy_spell": "glq", + "city_id": "83" + }, + { + "district_id": "821", + "district_name": "邗江区", + "spell": "zuojiangqu", + "easy_spell": "zjq", + "city_id": "83" + }, + { + "district_id": "822", + "district_name": "维扬区", + "spell": "weiyangqu", + "easy_spell": "wyq", + "city_id": "83" + }, + { + "district_id": "823", + "district_name": "宝应县", + "spell": "baoyingxian", + "easy_spell": "byx", + "city_id": "83" + }, + { + "district_id": "824", + "district_name": "仪征市", + "spell": "yizhengshi", + "easy_spell": "yzs", + "city_id": "83" + }, + { + "district_id": "825", + "district_name": "高邮市", + "spell": "gaoyoushi", + "easy_spell": "gys", + "city_id": "83" + }, + { + "district_id": "826", + "district_name": "江都市", + "spell": "jiangdushi", + "easy_spell": "jds", + "city_id": "83" + }, + { + "district_id": "827", + "district_name": "京口区", + "spell": "jingkouqu", + "easy_spell": "jkq", + "city_id": "84" + }, + { + "district_id": "828", + "district_name": "润州区", + "spell": "runzhouqu", + "easy_spell": "rzq", + "city_id": "84" + }, + { + "district_id": "829", + "district_name": "丹徒区", + "spell": "dantuqu", + "easy_spell": "dtq", + "city_id": "84" + }, + { + "district_id": "830", + "district_name": "丹阳市", + "spell": "danyangshi", + "easy_spell": "dys", + "city_id": "84" + }, + { + "district_id": "831", + "district_name": "扬中市", + "spell": "yangzhongshi", + "easy_spell": "yzs", + "city_id": "84" + }, + { + "district_id": "832", + "district_name": "句容市", + "spell": "jurongshi", + "easy_spell": "jrs", + "city_id": "84" + }, + { + "district_id": "833", + "district_name": "海陵区", + "spell": "hailingqu", + "easy_spell": "hlq", + "city_id": "85" + }, + { + "district_id": "834", + "district_name": "高港区", + "spell": "gaogangqu", + "easy_spell": "ggq", + "city_id": "85" + }, + { + "district_id": "835", + "district_name": "兴化市", + "spell": "xinghuashi", + "easy_spell": "xhs", + "city_id": "85" + }, + { + "district_id": "836", + "district_name": "靖江市", + "spell": "jingjiangshi", + "easy_spell": "jjs", + "city_id": "85" + }, + { + "district_id": "837", + "district_name": "泰兴市", + "spell": "taixingshi", + "easy_spell": "txs", + "city_id": "85" + }, + { + "district_id": "838", + "district_name": "姜堰市", + "spell": "jiangyanshi", + "easy_spell": "jys", + "city_id": "85" + }, + { + "district_id": "839", + "district_name": "宿城区", + "spell": "suchengqu", + "easy_spell": "scq", + "city_id": "86" + }, + { + "district_id": "840", + "district_name": "宿豫区", + "spell": "suyuqu", + "easy_spell": "syq", + "city_id": "86" + }, + { + "district_id": "841", + "district_name": "沭阳县", + "spell": "zuoyangxian", + "easy_spell": "zyx", + "city_id": "86" + }, + { + "district_id": "842", + "district_name": "泗阳县", + "spell": "zuoyangxian", + "easy_spell": "zyx", + "city_id": "86" + }, + { + "district_id": "843", + "district_name": "泗洪县", + "spell": "zuohongxian", + "easy_spell": "zhx", + "city_id": "86" + }, + { + "district_id": "844", + "district_name": "上城区", + "spell": "shangchengqu", + "easy_spell": "scq", + "city_id": "87" + }, + { + "district_id": "845", + "district_name": "下城区", + "spell": "xiachengqu", + "easy_spell": "xcq", + "city_id": "87" + }, + { + "district_id": "846", + "district_name": "江干区", + "spell": "jiangganqu", + "easy_spell": "jgq", + "city_id": "87" + }, + { + "district_id": "847", + "district_name": "拱墅区", + "spell": "gongshuqu", + "easy_spell": "gsq", + "city_id": "87" + }, + { + "district_id": "848", + "district_name": "西湖区", + "spell": "xihuqu", + "easy_spell": "xhq", + "city_id": "87" + }, + { + "district_id": "849", + "district_name": "滨江区", + "spell": "binjiangqu", + "easy_spell": "bjq", + "city_id": "87" + }, + { + "district_id": "850", + "district_name": "萧山区", + "spell": "xiaoshanqu", + "easy_spell": "xsq", + "city_id": "87" + }, + { + "district_id": "851", + "district_name": "余杭区", + "spell": "yuhangqu", + "easy_spell": "yhq", + "city_id": "87" + }, + { + "district_id": "852", + "district_name": "桐庐县", + "spell": "tongluxian", + "easy_spell": "tlx", + "city_id": "87" + }, + { + "district_id": "853", + "district_name": "淳安县", + "spell": "chunanxian", + "easy_spell": "cax", + "city_id": "87" + }, + { + "district_id": "854", + "district_name": "建德市", + "spell": "jiandeshi", + "easy_spell": "jds", + "city_id": "87" + }, + { + "district_id": "855", + "district_name": "富阳市", + "spell": "fuyangshi", + "easy_spell": "fys", + "city_id": "87" + }, + { + "district_id": "856", + "district_name": "临安市", + "spell": "linanshi", + "easy_spell": "las", + "city_id": "87" + }, + { + "district_id": "857", + "district_name": "海曙区", + "spell": "haishuqu", + "easy_spell": "hsq", + "city_id": "88" + }, + { + "district_id": "858", + "district_name": "江东区", + "spell": "jiangdongqu", + "easy_spell": "jdq", + "city_id": "88" + }, + { + "district_id": "859", + "district_name": "江北区", + "spell": "jiangbeiqu", + "easy_spell": "jbq", + "city_id": "88" + }, + { + "district_id": "860", + "district_name": "北仑区", + "spell": "beilunqu", + "easy_spell": "blq", + "city_id": "88" + }, + { + "district_id": "861", + "district_name": "镇海区", + "spell": "zhenhaiqu", + "easy_spell": "zhq", + "city_id": "88" + }, + { + "district_id": "862", + "district_name": "鄞州区", + "spell": "zuozhouqu", + "easy_spell": "zzq", + "city_id": "88" + }, + { + "district_id": "863", + "district_name": "象山县", + "spell": "xiangshanxian", + "easy_spell": "xsx", + "city_id": "88" + }, + { + "district_id": "864", + "district_name": "宁海县", + "spell": "ninghaixian", + "easy_spell": "nhx", + "city_id": "88" + }, + { + "district_id": "865", + "district_name": "余姚市", + "spell": "yuyaoshi", + "easy_spell": "yys", + "city_id": "88" + }, + { + "district_id": "866", + "district_name": "慈溪市", + "spell": "cixishi", + "easy_spell": "cxs", + "city_id": "88" + }, + { + "district_id": "867", + "district_name": "奉化市", + "spell": "fenghuashi", + "easy_spell": "fhs", + "city_id": "88" + }, + { + "district_id": "868", + "district_name": "鹿城区", + "spell": "luchengqu", + "easy_spell": "lcq", + "city_id": "89" + }, + { + "district_id": "869", + "district_name": "龙湾区", + "spell": "longwanqu", + "easy_spell": "lwq", + "city_id": "89" + }, + { + "district_id": "870", + "district_name": "瓯海区", + "spell": "zuohaiqu", + "easy_spell": "zhq", + "city_id": "89" + }, + { + "district_id": "871", + "district_name": "洞头县", + "spell": "dongtouxian", + "easy_spell": "dtx", + "city_id": "89" + }, + { + "district_id": "872", + "district_name": "永嘉县", + "spell": "yongjiaxian", + "easy_spell": "yjx", + "city_id": "89" + }, + { + "district_id": "873", + "district_name": "平阳县", + "spell": "pingyangxian", + "easy_spell": "pyx", + "city_id": "89" + }, + { + "district_id": "874", + "district_name": "苍南县", + "spell": "cangnanxian", + "easy_spell": "cnx", + "city_id": "89" + }, + { + "district_id": "875", + "district_name": "文成县", + "spell": "wenchengxian", + "easy_spell": "wcx", + "city_id": "89" + }, + { + "district_id": "876", + "district_name": "泰顺县", + "spell": "taishunxian", + "easy_spell": "tsx", + "city_id": "89" + }, + { + "district_id": "877", + "district_name": "瑞安市", + "spell": "ruianshi", + "easy_spell": "ras", + "city_id": "89" + }, + { + "district_id": "878", + "district_name": "乐清市", + "spell": "leqingshi", + "easy_spell": "lqs", + "city_id": "89" + }, + { + "district_id": "879", + "district_name": "秀城区", + "spell": "xiuchengqu", + "easy_spell": "xcq", + "city_id": "90" + }, + { + "district_id": "880", + "district_name": "秀洲区", + "spell": "xiuzhouqu", + "easy_spell": "xzq", + "city_id": "90" + }, + { + "district_id": "881", + "district_name": "嘉善县", + "spell": "jiashanxian", + "easy_spell": "jsx", + "city_id": "90" + }, + { + "district_id": "882", + "district_name": "海盐县", + "spell": "haiyanxian", + "easy_spell": "hyx", + "city_id": "90" + }, + { + "district_id": "883", + "district_name": "海宁市", + "spell": "hainingshi", + "easy_spell": "hns", + "city_id": "90" + }, + { + "district_id": "884", + "district_name": "平湖市", + "spell": "pinghushi", + "easy_spell": "phs", + "city_id": "90" + }, + { + "district_id": "885", + "district_name": "桐乡市", + "spell": "tongxiangshi", + "easy_spell": "txs", + "city_id": "90" + }, + { + "district_id": "886", + "district_name": "吴兴区", + "spell": "wuxingqu", + "easy_spell": "wxq", + "city_id": "91" + }, + { + "district_id": "887", + "district_name": "南浔区", + "spell": "nanzuoqu", + "easy_spell": "nzq", + "city_id": "91" + }, + { + "district_id": "888", + "district_name": "德清县", + "spell": "deqingxian", + "easy_spell": "dqx", + "city_id": "91" + }, + { + "district_id": "889", + "district_name": "长兴县", + "spell": "changxingxian", + "easy_spell": "cxx", + "city_id": "91" + }, + { + "district_id": "890", + "district_name": "安吉县", + "spell": "anjixian", + "easy_spell": "ajx", + "city_id": "91" + }, + { + "district_id": "891", + "district_name": "越城区", + "spell": "yuechengqu", + "easy_spell": "ycq", + "city_id": "92" + }, + { + "district_id": "892", + "district_name": "绍兴县", + "spell": "shaoxingxian", + "easy_spell": "sxx", + "city_id": "92" + }, + { + "district_id": "893", + "district_name": "新昌县", + "spell": "xinchangxian", + "easy_spell": "xcx", + "city_id": "92" + }, + { + "district_id": "894", + "district_name": "诸暨市", + "spell": "zhuzuoshi", + "easy_spell": "zzs", + "city_id": "92" + }, + { + "district_id": "895", + "district_name": "上虞市", + "spell": "shangyushi", + "easy_spell": "sys", + "city_id": "92" + }, + { + "district_id": "896", + "district_name": "嵊州市", + "spell": "zuozhoushi", + "easy_spell": "zzs", + "city_id": "92" + }, + { + "district_id": "897", + "district_name": "婺城区", + "spell": "zuochengqu", + "easy_spell": "zcq", + "city_id": "93" + }, + { + "district_id": "898", + "district_name": "金东区", + "spell": "jindongqu", + "easy_spell": "jdq", + "city_id": "93" + }, + { + "district_id": "899", + "district_name": "武义县", + "spell": "wuyixian", + "easy_spell": "wyx", + "city_id": "93" + }, + { + "district_id": "900", + "district_name": "浦江县", + "spell": "pujiangxian", + "easy_spell": "pjx", + "city_id": "93" + }, + { + "district_id": "901", + "district_name": "磐安县", + "spell": "pananxian", + "easy_spell": "pax", + "city_id": "93" + }, + { + "district_id": "902", + "district_name": "兰溪市", + "spell": "lanxishi", + "easy_spell": "lxs", + "city_id": "93" + }, + { + "district_id": "903", + "district_name": "义乌市", + "spell": "yiwushi", + "easy_spell": "yws", + "city_id": "93" + }, + { + "district_id": "904", + "district_name": "东阳市", + "spell": "dongyangshi", + "easy_spell": "dys", + "city_id": "93" + }, + { + "district_id": "905", + "district_name": "永康市", + "spell": "yongkangshi", + "easy_spell": "yks", + "city_id": "93" + }, + { + "district_id": "906", + "district_name": "柯城区", + "spell": "kechengqu", + "easy_spell": "kcq", + "city_id": "94" + }, + { + "district_id": "907", + "district_name": "衢江区", + "spell": "zuojiangqu", + "easy_spell": "zjq", + "city_id": "94" + }, + { + "district_id": "908", + "district_name": "常山县", + "spell": "changshanxian", + "easy_spell": "csx", + "city_id": "94" + }, + { + "district_id": "909", + "district_name": "开化县", + "spell": "kaihuaxian", + "easy_spell": "khx", + "city_id": "94" + }, + { + "district_id": "910", + "district_name": "龙游县", + "spell": "longyouxian", + "easy_spell": "lyx", + "city_id": "94" + }, + { + "district_id": "911", + "district_name": "江山市", + "spell": "jiangshanshi", + "easy_spell": "jss", + "city_id": "94" + }, + { + "district_id": "912", + "district_name": "定海区", + "spell": "dinghaiqu", + "easy_spell": "dhq", + "city_id": "95" + }, + { + "district_id": "913", + "district_name": "普陀区", + "spell": "putuoqu", + "easy_spell": "ptq", + "city_id": "95" + }, + { + "district_id": "914", + "district_name": "岱山县", + "spell": "zuoshanxian", + "easy_spell": "zsx", + "city_id": "95" + }, + { + "district_id": "915", + "district_name": "嵊泗县", + "spell": "zuozuoxian", + "easy_spell": "zzx", + "city_id": "95" + }, + { + "district_id": "916", + "district_name": "椒江区", + "spell": "jiaojiangqu", + "easy_spell": "jjq", + "city_id": "96" + }, + { + "district_id": "917", + "district_name": "黄岩区", + "spell": "huangyanqu", + "easy_spell": "hyq", + "city_id": "96" + }, + { + "district_id": "918", + "district_name": "路桥区", + "spell": "luqiaoqu", + "easy_spell": "lqq", + "city_id": "96" + }, + { + "district_id": "919", + "district_name": "玉环县", + "spell": "yuhuanxian", + "easy_spell": "yhx", + "city_id": "96" + }, + { + "district_id": "920", + "district_name": "三门县", + "spell": "sanmenxian", + "easy_spell": "smx", + "city_id": "96" + }, + { + "district_id": "921", + "district_name": "天台县", + "spell": "tiantaixian", + "easy_spell": "ttx", + "city_id": "96" + }, + { + "district_id": "922", + "district_name": "仙居县", + "spell": "xianjuxian", + "easy_spell": "xjx", + "city_id": "96" + }, + { + "district_id": "923", + "district_name": "温岭市", + "spell": "wenlingshi", + "easy_spell": "wls", + "city_id": "96" + }, + { + "district_id": "924", + "district_name": "临海市", + "spell": "linhaishi", + "easy_spell": "lhs", + "city_id": "96" + }, + { + "district_id": "925", + "district_name": "莲都区", + "spell": "lianduqu", + "easy_spell": "ldq", + "city_id": "97" + }, + { + "district_id": "926", + "district_name": "青田县", + "spell": "qingtianxian", + "easy_spell": "qtx", + "city_id": "97" + }, + { + "district_id": "927", + "district_name": "缙云县", + "spell": "zuoyunxian", + "easy_spell": "zyx", + "city_id": "97" + }, + { + "district_id": "928", + "district_name": "遂昌县", + "spell": "suichangxian", + "easy_spell": "scx", + "city_id": "97" + }, + { + "district_id": "929", + "district_name": "松阳县", + "spell": "songyangxian", + "easy_spell": "syx", + "city_id": "97" + }, + { + "district_id": "930", + "district_name": "云和县", + "spell": "yunhexian", + "easy_spell": "yhx", + "city_id": "97" + }, + { + "district_id": "931", + "district_name": "庆元县", + "spell": "qingyuanxian", + "easy_spell": "qyx", + "city_id": "97" + }, + { + "district_id": "932", + "district_name": "景宁畲族自治县", + "spell": "jingningzuozuzizhixian", + "easy_spell": "jnzzzzx", + "city_id": "97" + }, + { + "district_id": "933", + "district_name": "龙泉市", + "spell": "longquanshi", + "easy_spell": "lqs", + "city_id": "97" + }, + { + "district_id": "934", + "district_name": "瑶海区", + "spell": "yaohaiqu", + "easy_spell": "yhq", + "city_id": "98" + }, + { + "district_id": "935", + "district_name": "庐阳区", + "spell": "luyangqu", + "easy_spell": "lyq", + "city_id": "98" + }, + { + "district_id": "936", + "district_name": "蜀山区", + "spell": "shushanqu", + "easy_spell": "ssq", + "city_id": "98" + }, + { + "district_id": "937", + "district_name": "包河区", + "spell": "baohequ", + "easy_spell": "bhq", + "city_id": "98" + }, + { + "district_id": "938", + "district_name": "长丰县", + "spell": "changfengxian", + "easy_spell": "cfx", + "city_id": "98" + }, + { + "district_id": "939", + "district_name": "肥东县", + "spell": "feidongxian", + "easy_spell": "fdx", + "city_id": "98" + }, + { + "district_id": "940", + "district_name": "肥西县", + "spell": "feixixian", + "easy_spell": "fxx", + "city_id": "98" + }, + { + "district_id": "941", + "district_name": "镜湖区", + "spell": "jinghuqu", + "easy_spell": "jhq", + "city_id": "99" + }, + { + "district_id": "942", + "district_name": "马塘区", + "spell": "matangqu", + "easy_spell": "mtq", + "city_id": "99" + }, + { + "district_id": "943", + "district_name": "新芜区", + "spell": "xinwuqu", + "easy_spell": "xwq", + "city_id": "99" + }, + { + "district_id": "944", + "district_name": "鸠江区", + "spell": "zuojiangqu", + "easy_spell": "zjq", + "city_id": "99" + }, + { + "district_id": "945", + "district_name": "芜湖县", + "spell": "wuhuxian", + "easy_spell": "whx", + "city_id": "99" + }, + { + "district_id": "946", + "district_name": "繁昌县", + "spell": "fanchangxian", + "easy_spell": "fcx", + "city_id": "99" + }, + { + "district_id": "947", + "district_name": "南陵县", + "spell": "nanlingxian", + "easy_spell": "nlx", + "city_id": "99" + }, + { + "district_id": "948", + "district_name": "龙子湖区", + "spell": "longzihuqu", + "easy_spell": "lzhq", + "city_id": "100" + }, + { + "district_id": "949", + "district_name": "蚌山区", + "spell": "bangshanqu", + "easy_spell": "bsq", + "city_id": "100" + }, + { + "district_id": "950", + "district_name": "禹会区", + "spell": "yuhuiqu", + "easy_spell": "yhq", + "city_id": "100" + }, + { + "district_id": "951", + "district_name": "淮上区", + "spell": "huaishangqu", + "easy_spell": "hsq", + "city_id": "100" + }, + { + "district_id": "952", + "district_name": "怀远县", + "spell": "huaiyuanxian", + "easy_spell": "hyx", + "city_id": "100" + }, + { + "district_id": "953", + "district_name": "五河县", + "spell": "wuhexian", + "easy_spell": "whx", + "city_id": "100" + }, + { + "district_id": "954", + "district_name": "固镇县", + "spell": "guzhenxian", + "easy_spell": "gzx", + "city_id": "100" + }, + { + "district_id": "955", + "district_name": "大通区", + "spell": "datongqu", + "easy_spell": "dtq", + "city_id": "101" + }, + { + "district_id": "956", + "district_name": "田家庵区", + "spell": "tianjiazuoqu", + "easy_spell": "tjzq", + "city_id": "101" + }, + { + "district_id": "957", + "district_name": "谢家集区", + "spell": "xiejiajiqu", + "easy_spell": "xjjq", + "city_id": "101" + }, + { + "district_id": "958", + "district_name": "八公山区", + "spell": "bagongshanqu", + "easy_spell": "bgsq", + "city_id": "101" + }, + { + "district_id": "959", + "district_name": "潘集区", + "spell": "panjiqu", + "easy_spell": "pjq", + "city_id": "101" + }, + { + "district_id": "960", + "district_name": "凤台县", + "spell": "fengtaixian", + "easy_spell": "ftx", + "city_id": "101" + }, + { + "district_id": "961", + "district_name": "金家庄区", + "spell": "jinjiazhuangqu", + "easy_spell": "jjzq", + "city_id": "102" + }, + { + "district_id": "962", + "district_name": "花山区", + "spell": "huashanqu", + "easy_spell": "hsq", + "city_id": "102" + }, + { + "district_id": "963", + "district_name": "雨山区", + "spell": "yushanqu", + "easy_spell": "ysq", + "city_id": "102" + }, + { + "district_id": "964", + "district_name": "当涂县", + "spell": "dangtuxian", + "easy_spell": "dtx", + "city_id": "102" + }, + { + "district_id": "965", + "district_name": "杜集区", + "spell": "dujiqu", + "easy_spell": "djq", + "city_id": "103" + }, + { + "district_id": "966", + "district_name": "相山区", + "spell": "xiangshanqu", + "easy_spell": "xsq", + "city_id": "103" + }, + { + "district_id": "967", + "district_name": "烈山区", + "spell": "lieshanqu", + "easy_spell": "lsq", + "city_id": "103" + }, + { + "district_id": "968", + "district_name": "濉溪县", + "spell": "zuoxixian", + "easy_spell": "zxx", + "city_id": "103" + }, + { + "district_id": "969", + "district_name": "铜官山区", + "spell": "tongguanshanqu", + "easy_spell": "tgsq", + "city_id": "104" + }, + { + "district_id": "970", + "district_name": "狮子山区", + "spell": "shizishanqu", + "easy_spell": "szsq", + "city_id": "104" + }, + { + "district_id": "971", + "district_name": "郊区", + "spell": "jiaoqu", + "easy_spell": "jq", + "city_id": "104" + }, + { + "district_id": "972", + "district_name": "铜陵县", + "spell": "tonglingxian", + "easy_spell": "tlx", + "city_id": "104" + }, + { + "district_id": "973", + "district_name": "迎江区", + "spell": "yingjiangqu", + "easy_spell": "yjq", + "city_id": "105" + }, + { + "district_id": "974", + "district_name": "大观区", + "spell": "daguanqu", + "easy_spell": "dgq", + "city_id": "105" + }, + { + "district_id": "975", + "district_name": "郊区", + "spell": "jiaoqu", + "easy_spell": "jq", + "city_id": "105" + }, + { + "district_id": "976", + "district_name": "怀宁县", + "spell": "huainingxian", + "easy_spell": "hnx", + "city_id": "105" + }, + { + "district_id": "977", + "district_name": "枞阳县", + "spell": "zuoyangxian", + "easy_spell": "zyx", + "city_id": "105" + }, + { + "district_id": "978", + "district_name": "潜山县", + "spell": "qianshanxian", + "easy_spell": "qsx", + "city_id": "105" + }, + { + "district_id": "979", + "district_name": "太湖县", + "spell": "taihuxian", + "easy_spell": "thx", + "city_id": "105" + }, + { + "district_id": "980", + "district_name": "宿松县", + "spell": "susongxian", + "easy_spell": "ssx", + "city_id": "105" + }, + { + "district_id": "981", + "district_name": "望江县", + "spell": "wangjiangxian", + "easy_spell": "wjx", + "city_id": "105" + }, + { + "district_id": "982", + "district_name": "岳西县", + "spell": "yuexixian", + "easy_spell": "yxx", + "city_id": "105" + }, + { + "district_id": "983", + "district_name": "桐城市", + "spell": "tongchengshi", + "easy_spell": "tcs", + "city_id": "105" + }, + { + "district_id": "984", + "district_name": "屯溪区", + "spell": "tunxiqu", + "easy_spell": "txq", + "city_id": "106" + }, + { + "district_id": "985", + "district_name": "黄山区", + "spell": "huangshanqu", + "easy_spell": "hsq", + "city_id": "106" + }, + { + "district_id": "986", + "district_name": "徽州区", + "spell": "huizhouqu", + "easy_spell": "hzq", + "city_id": "106" + }, + { + "district_id": "987", + "district_name": "歙县", + "spell": "zuoxian", + "easy_spell": "zx", + "city_id": "106" + }, + { + "district_id": "988", + "district_name": "休宁县", + "spell": "xiuningxian", + "easy_spell": "xnx", + "city_id": "106" + }, + { + "district_id": "989", + "district_name": "黟县", + "spell": "zuoxian", + "easy_spell": "zx", + "city_id": "106" + }, + { + "district_id": "990", + "district_name": "祁门县", + "spell": "qimenxian", + "easy_spell": "qmx", + "city_id": "106" + }, + { + "district_id": "991", + "district_name": "琅琊区", + "spell": "langzuoqu", + "easy_spell": "lzq", + "city_id": "107" + }, + { + "district_id": "992", + "district_name": "南谯区", + "spell": "nanzuoqu", + "easy_spell": "nzq", + "city_id": "107" + }, + { + "district_id": "993", + "district_name": "来安县", + "spell": "laianxian", + "easy_spell": "lax", + "city_id": "107" + }, + { + "district_id": "994", + "district_name": "全椒县", + "spell": "quanjiaoxian", + "easy_spell": "qjx", + "city_id": "107" + }, + { + "district_id": "995", + "district_name": "定远县", + "spell": "dingyuanxian", + "easy_spell": "dyx", + "city_id": "107" + }, + { + "district_id": "996", + "district_name": "凤阳县", + "spell": "fengyangxian", + "easy_spell": "fyx", + "city_id": "107" + }, + { + "district_id": "997", + "district_name": "天长市", + "spell": "tianchangshi", + "easy_spell": "tcs", + "city_id": "107" + }, + { + "district_id": "998", + "district_name": "明光市", + "spell": "mingguangshi", + "easy_spell": "mgs", + "city_id": "107" + }, + { + "district_id": "999", + "district_name": "颍州区", + "spell": "zuozhouqu", + "easy_spell": "zzq", + "city_id": "108" + }, + { + "district_id": "1000", + "district_name": "颍东区", + "spell": "zuodongqu", + "easy_spell": "zdq", + "city_id": "108" + }, + { + "district_id": "1001", + "district_name": "颍泉区", + "spell": "zuoquanqu", + "easy_spell": "zqq", + "city_id": "108" + }, + { + "district_id": "1002", + "district_name": "临泉县", + "spell": "linquanxian", + "easy_spell": "lqx", + "city_id": "108" + }, + { + "district_id": "1003", + "district_name": "太和县", + "spell": "taihexian", + "easy_spell": "thx", + "city_id": "108" + }, + { + "district_id": "1004", + "district_name": "阜南县", + "spell": "funanxian", + "easy_spell": "fnx", + "city_id": "108" + }, + { + "district_id": "1005", + "district_name": "颍上县", + "spell": "zuoshangxian", + "easy_spell": "zsx", + "city_id": "108" + }, + { + "district_id": "1006", + "district_name": "界首市", + "spell": "jieshoushi", + "easy_spell": "jss", + "city_id": "108" + }, + { + "district_id": "1007", + "district_name": "埇桥区", + "spell": "qiaoqu", + "easy_spell": "埇qq", + "city_id": "109" + }, + { + "district_id": "1008", + "district_name": "砀山县", + "spell": "zuoshanxian", + "easy_spell": "zsx", + "city_id": "109" + }, + { + "district_id": "1009", + "district_name": "萧县", + "spell": "xiaoxian", + "easy_spell": "xx", + "city_id": "109" + }, + { + "district_id": "1010", + "district_name": "灵璧县", + "spell": "lingzuoxian", + "easy_spell": "lzx", + "city_id": "109" + }, + { + "district_id": "1011", + "district_name": "泗县", + "spell": "zuoxian", + "easy_spell": "zx", + "city_id": "109" + }, + { + "district_id": "1012", + "district_name": "居巢区", + "spell": "juchaoqu", + "easy_spell": "jcq", + "city_id": "110" + }, + { + "district_id": "1013", + "district_name": "庐江县", + "spell": "lujiangxian", + "easy_spell": "ljx", + "city_id": "110" + }, + { + "district_id": "1014", + "district_name": "无为县", + "spell": "wuweixian", + "easy_spell": "wwx", + "city_id": "110" + }, + { + "district_id": "1015", + "district_name": "含山县", + "spell": "hanshanxian", + "easy_spell": "hsx", + "city_id": "110" + }, + { + "district_id": "1016", + "district_name": "和县", + "spell": "hexian", + "easy_spell": "hx", + "city_id": "110" + }, + { + "district_id": "1017", + "district_name": "金安区", + "spell": "jinanqu", + "easy_spell": "jaq", + "city_id": "111" + }, + { + "district_id": "1018", + "district_name": "裕安区", + "spell": "yuanqu", + "easy_spell": "yaq", + "city_id": "111" + }, + { + "district_id": "1019", + "district_name": "寿县", + "spell": "shouxian", + "easy_spell": "sx", + "city_id": "111" + }, + { + "district_id": "1020", + "district_name": "霍邱县", + "spell": "huoqiuxian", + "easy_spell": "hqx", + "city_id": "111" + }, + { + "district_id": "1021", + "district_name": "舒城县", + "spell": "shuchengxian", + "easy_spell": "scx", + "city_id": "111" + }, + { + "district_id": "1022", + "district_name": "金寨县", + "spell": "jinzhaixian", + "easy_spell": "jzx", + "city_id": "111" + }, + { + "district_id": "1023", + "district_name": "霍山县", + "spell": "huoshanxian", + "easy_spell": "hsx", + "city_id": "111" + }, + { + "district_id": "1024", + "district_name": "谯城区", + "spell": "zuochengqu", + "easy_spell": "zcq", + "city_id": "112" + }, + { + "district_id": "1025", + "district_name": "涡阳县", + "spell": "woyangxian", + "easy_spell": "wyx", + "city_id": "112" + }, + { + "district_id": "1026", + "district_name": "蒙城县", + "spell": "mengchengxian", + "easy_spell": "mcx", + "city_id": "112" + }, + { + "district_id": "1027", + "district_name": "利辛县", + "spell": "lixinxian", + "easy_spell": "lxx", + "city_id": "112" + }, + { + "district_id": "1028", + "district_name": "贵池区", + "spell": "guichiqu", + "easy_spell": "gcq", + "city_id": "113" + }, + { + "district_id": "1029", + "district_name": "东至县", + "spell": "dongzhixian", + "easy_spell": "dzx", + "city_id": "113" + }, + { + "district_id": "1030", + "district_name": "石台县", + "spell": "shitaixian", + "easy_spell": "stx", + "city_id": "113" + }, + { + "district_id": "1031", + "district_name": "青阳县", + "spell": "qingyangxian", + "easy_spell": "qyx", + "city_id": "113" + }, + { + "district_id": "1032", + "district_name": "宣州区", + "spell": "xuanzhouqu", + "easy_spell": "xzq", + "city_id": "114" + }, + { + "district_id": "1033", + "district_name": "郎溪县", + "spell": "langxixian", + "easy_spell": "lxx", + "city_id": "114" + }, + { + "district_id": "1034", + "district_name": "广德县", + "spell": "guangdexian", + "easy_spell": "gdx", + "city_id": "114" + }, + { + "district_id": "1035", + "district_name": "泾县", + "spell": "zuoxian", + "easy_spell": "zx", + "city_id": "114" + }, + { + "district_id": "1036", + "district_name": "绩溪县", + "spell": "jixixian", + "easy_spell": "jxx", + "city_id": "114" + }, + { + "district_id": "1037", + "district_name": "旌德县", + "spell": "zuodexian", + "easy_spell": "zdx", + "city_id": "114" + }, + { + "district_id": "1038", + "district_name": "宁国市", + "spell": "ningguoshi", + "easy_spell": "ngs", + "city_id": "114" + }, + { + "district_id": "1039", + "district_name": "鼓楼区", + "spell": "gulouqu", + "easy_spell": "glq", + "city_id": "115" + }, + { + "district_id": "1040", + "district_name": "台江区", + "spell": "taijiangqu", + "easy_spell": "tjq", + "city_id": "115" + }, + { + "district_id": "1041", + "district_name": "仓山区", + "spell": "cangshanqu", + "easy_spell": "csq", + "city_id": "115" + }, + { + "district_id": "1042", + "district_name": "马尾区", + "spell": "maweiqu", + "easy_spell": "mwq", + "city_id": "115" + }, + { + "district_id": "1043", + "district_name": "晋安区", + "spell": "jinanqu", + "easy_spell": "jaq", + "city_id": "115" + }, + { + "district_id": "1044", + "district_name": "闽侯县", + "spell": "minhouxian", + "easy_spell": "mhx", + "city_id": "115" + }, + { + "district_id": "1045", + "district_name": "连江县", + "spell": "lianjiangxian", + "easy_spell": "ljx", + "city_id": "115" + }, + { + "district_id": "1046", + "district_name": "罗源县", + "spell": "luoyuanxian", + "easy_spell": "lyx", + "city_id": "115" + }, + { + "district_id": "1047", + "district_name": "闽清县", + "spell": "minqingxian", + "easy_spell": "mqx", + "city_id": "115" + }, + { + "district_id": "1048", + "district_name": "永泰县", + "spell": "yongtaixian", + "easy_spell": "ytx", + "city_id": "115" + }, + { + "district_id": "1049", + "district_name": "平潭县", + "spell": "pingtanxian", + "easy_spell": "ptx", + "city_id": "115" + }, + { + "district_id": "1050", + "district_name": "福清市", + "spell": "fuqingshi", + "easy_spell": "fqs", + "city_id": "115" + }, + { + "district_id": "1051", + "district_name": "长乐市", + "spell": "changleshi", + "easy_spell": "cls", + "city_id": "115" + }, + { + "district_id": "1052", + "district_name": "思明区", + "spell": "simingqu", + "easy_spell": "smq", + "city_id": "116" + }, + { + "district_id": "1053", + "district_name": "海沧区", + "spell": "haicangqu", + "easy_spell": "hcq", + "city_id": "116" + }, + { + "district_id": "1054", + "district_name": "湖里区", + "spell": "huliqu", + "easy_spell": "hlq", + "city_id": "116" + }, + { + "district_id": "1055", + "district_name": "集美区", + "spell": "jimeiqu", + "easy_spell": "jmq", + "city_id": "116" + }, + { + "district_id": "1056", + "district_name": "同安区", + "spell": "tonganqu", + "easy_spell": "taq", + "city_id": "116" + }, + { + "district_id": "1057", + "district_name": "翔安区", + "spell": "xianganqu", + "easy_spell": "xaq", + "city_id": "116" + }, + { + "district_id": "1058", + "district_name": "城厢区", + "spell": "chengxiangqu", + "easy_spell": "cxq", + "city_id": "117" + }, + { + "district_id": "1059", + "district_name": "涵江区", + "spell": "hanjiangqu", + "easy_spell": "hjq", + "city_id": "117" + }, + { + "district_id": "1060", + "district_name": "荔城区", + "spell": "lichengqu", + "easy_spell": "lcq", + "city_id": "117" + }, + { + "district_id": "1061", + "district_name": "秀屿区", + "spell": "xiuyuqu", + "easy_spell": "xyq", + "city_id": "117" + }, + { + "district_id": "1062", + "district_name": "仙游县", + "spell": "xianyouxian", + "easy_spell": "xyx", + "city_id": "117" + }, + { + "district_id": "1063", + "district_name": "梅列区", + "spell": "meiliequ", + "easy_spell": "mlq", + "city_id": "118" + }, + { + "district_id": "1064", + "district_name": "三元区", + "spell": "sanyuanqu", + "easy_spell": "syq", + "city_id": "118" + }, + { + "district_id": "1065", + "district_name": "明溪县", + "spell": "mingxixian", + "easy_spell": "mxx", + "city_id": "118" + }, + { + "district_id": "1066", + "district_name": "清流县", + "spell": "qingliuxian", + "easy_spell": "qlx", + "city_id": "118" + }, + { + "district_id": "1067", + "district_name": "宁化县", + "spell": "ninghuaxian", + "easy_spell": "nhx", + "city_id": "118" + }, + { + "district_id": "1068", + "district_name": "大田县", + "spell": "datianxian", + "easy_spell": "dtx", + "city_id": "118" + }, + { + "district_id": "1069", + "district_name": "尤溪县", + "spell": "youxixian", + "easy_spell": "yxx", + "city_id": "118" + }, + { + "district_id": "1070", + "district_name": "沙县", + "spell": "shaxian", + "easy_spell": "sx", + "city_id": "118" + }, + { + "district_id": "1071", + "district_name": "将乐县", + "spell": "jianglexian", + "easy_spell": "jlx", + "city_id": "118" + }, + { + "district_id": "1072", + "district_name": "泰宁县", + "spell": "tainingxian", + "easy_spell": "tnx", + "city_id": "118" + }, + { + "district_id": "1073", + "district_name": "建宁县", + "spell": "jianningxian", + "easy_spell": "jnx", + "city_id": "118" + }, + { + "district_id": "1074", + "district_name": "永安市", + "spell": "yonganshi", + "easy_spell": "yas", + "city_id": "118" + }, + { + "district_id": "1075", + "district_name": "鲤城区", + "spell": "lichengqu", + "easy_spell": "lcq", + "city_id": "119" + }, + { + "district_id": "1076", + "district_name": "丰泽区", + "spell": "fengzequ", + "easy_spell": "fzq", + "city_id": "119" + }, + { + "district_id": "1077", + "district_name": "洛江区", + "spell": "luojiangqu", + "easy_spell": "ljq", + "city_id": "119" + }, + { + "district_id": "1078", + "district_name": "泉港区", + "spell": "quangangqu", + "easy_spell": "qgq", + "city_id": "119" + }, + { + "district_id": "1079", + "district_name": "惠安县", + "spell": "huianxian", + "easy_spell": "hax", + "city_id": "119" + }, + { + "district_id": "1080", + "district_name": "安溪县", + "spell": "anxixian", + "easy_spell": "axx", + "city_id": "119" + }, + { + "district_id": "1081", + "district_name": "永春县", + "spell": "yongchunxian", + "easy_spell": "ycx", + "city_id": "119" + }, + { + "district_id": "1082", + "district_name": "德化县", + "spell": "dehuaxian", + "easy_spell": "dhx", + "city_id": "119" + }, + { + "district_id": "1083", + "district_name": "金门县", + "spell": "jinmenxian", + "easy_spell": "jmx", + "city_id": "119" + }, + { + "district_id": "1084", + "district_name": "石狮市", + "spell": "shishishi", + "easy_spell": "sss", + "city_id": "119" + }, + { + "district_id": "1085", + "district_name": "晋江市", + "spell": "jinjiangshi", + "easy_spell": "jjs", + "city_id": "119" + }, + { + "district_id": "1086", + "district_name": "南安市", + "spell": "nananshi", + "easy_spell": "nas", + "city_id": "119" + }, + { + "district_id": "1087", + "district_name": "芗城区", + "spell": "zuochengqu", + "easy_spell": "zcq", + "city_id": "120" + }, + { + "district_id": "1088", + "district_name": "龙文区", + "spell": "longwenqu", + "easy_spell": "lwq", + "city_id": "120" + }, + { + "district_id": "1089", + "district_name": "云霄县", + "spell": "yunxiaoxian", + "easy_spell": "yxx", + "city_id": "120" + }, + { + "district_id": "1090", + "district_name": "漳浦县", + "spell": "zhangpuxian", + "easy_spell": "zpx", + "city_id": "120" + }, + { + "district_id": "1091", + "district_name": "诏安县", + "spell": "zuoanxian", + "easy_spell": "zax", + "city_id": "120" + }, + { + "district_id": "1092", + "district_name": "长泰县", + "spell": "changtaixian", + "easy_spell": "ctx", + "city_id": "120" + }, + { + "district_id": "1093", + "district_name": "东山县", + "spell": "dongshanxian", + "easy_spell": "dsx", + "city_id": "120" + }, + { + "district_id": "1094", + "district_name": "南靖县", + "spell": "nanjingxian", + "easy_spell": "njx", + "city_id": "120" + }, + { + "district_id": "1095", + "district_name": "平和县", + "spell": "pinghexian", + "easy_spell": "phx", + "city_id": "120" + }, + { + "district_id": "1096", + "district_name": "华安县", + "spell": "huaanxian", + "easy_spell": "hax", + "city_id": "120" + }, + { + "district_id": "1097", + "district_name": "龙海市", + "spell": "longhaishi", + "easy_spell": "lhs", + "city_id": "120" + }, + { + "district_id": "1098", + "district_name": "延平区", + "spell": "yanpingqu", + "easy_spell": "ypq", + "city_id": "121" + }, + { + "district_id": "1099", + "district_name": "顺昌县", + "spell": "shunchangxian", + "easy_spell": "scx", + "city_id": "121" + }, + { + "district_id": "1100", + "district_name": "浦城县", + "spell": "puchengxian", + "easy_spell": "pcx", + "city_id": "121" + }, + { + "district_id": "1101", + "district_name": "光泽县", + "spell": "guangzexian", + "easy_spell": "gzx", + "city_id": "121" + }, + { + "district_id": "1102", + "district_name": "松溪县", + "spell": "songxixian", + "easy_spell": "sxx", + "city_id": "121" + }, + { + "district_id": "1103", + "district_name": "政和县", + "spell": "zhenghexian", + "easy_spell": "zhx", + "city_id": "121" + }, + { + "district_id": "1104", + "district_name": "邵武市", + "spell": "shaowushi", + "easy_spell": "sws", + "city_id": "121" + }, + { + "district_id": "1105", + "district_name": "武夷山市", + "spell": "wuyishanshi", + "easy_spell": "wyss", + "city_id": "121" + }, + { + "district_id": "1106", + "district_name": "建瓯市", + "spell": "jianzuoshi", + "easy_spell": "jzs", + "city_id": "121" + }, + { + "district_id": "1107", + "district_name": "建阳市", + "spell": "jianyangshi", + "easy_spell": "jys", + "city_id": "121" + }, + { + "district_id": "1108", + "district_name": "新罗区", + "spell": "xinluoqu", + "easy_spell": "xlq", + "city_id": "122" + }, + { + "district_id": "1109", + "district_name": "长汀县", + "spell": "changtingxian", + "easy_spell": "ctx", + "city_id": "122" + }, + { + "district_id": "1110", + "district_name": "永定县", + "spell": "yongdingxian", + "easy_spell": "ydx", + "city_id": "122" + }, + { + "district_id": "1111", + "district_name": "上杭县", + "spell": "shanghangxian", + "easy_spell": "shx", + "city_id": "122" + }, + { + "district_id": "1112", + "district_name": "武平县", + "spell": "wupingxian", + "easy_spell": "wpx", + "city_id": "122" + }, + { + "district_id": "1113", + "district_name": "连城县", + "spell": "lianchengxian", + "easy_spell": "lcx", + "city_id": "122" + }, + { + "district_id": "1114", + "district_name": "漳平市", + "spell": "zhangpingshi", + "easy_spell": "zps", + "city_id": "122" + }, + { + "district_id": "1115", + "district_name": "蕉城区", + "spell": "jiaochengqu", + "easy_spell": "jcq", + "city_id": "123" + }, + { + "district_id": "1116", + "district_name": "霞浦县", + "spell": "xiapuxian", + "easy_spell": "xpx", + "city_id": "123" + }, + { + "district_id": "1117", + "district_name": "古田县", + "spell": "gutianxian", + "easy_spell": "gtx", + "city_id": "123" + }, + { + "district_id": "1118", + "district_name": "屏南县", + "spell": "pingnanxian", + "easy_spell": "pnx", + "city_id": "123" + }, + { + "district_id": "1119", + "district_name": "寿宁县", + "spell": "shouningxian", + "easy_spell": "snx", + "city_id": "123" + }, + { + "district_id": "1120", + "district_name": "周宁县", + "spell": "zhouningxian", + "easy_spell": "znx", + "city_id": "123" + }, + { + "district_id": "1121", + "district_name": "柘荣县", + "spell": "zuorongxian", + "easy_spell": "zrx", + "city_id": "123" + }, + { + "district_id": "1122", + "district_name": "福安市", + "spell": "fuanshi", + "easy_spell": "fas", + "city_id": "123" + }, + { + "district_id": "1123", + "district_name": "福鼎市", + "spell": "fudingshi", + "easy_spell": "fds", + "city_id": "123" + }, + { + "district_id": "1124", + "district_name": "东湖区", + "spell": "donghuqu", + "easy_spell": "dhq", + "city_id": "124" + }, + { + "district_id": "1125", + "district_name": "西湖区", + "spell": "xihuqu", + "easy_spell": "xhq", + "city_id": "124" + }, + { + "district_id": "1126", + "district_name": "青云谱区", + "spell": "qingyunpuqu", + "easy_spell": "qypq", + "city_id": "124" + }, + { + "district_id": "1127", + "district_name": "湾里区", + "spell": "wanliqu", + "easy_spell": "wlq", + "city_id": "124" + }, + { + "district_id": "1128", + "district_name": "青山湖区", + "spell": "qingshanhuqu", + "easy_spell": "qshq", + "city_id": "124" + }, + { + "district_id": "1129", + "district_name": "南昌县", + "spell": "nanchangxian", + "easy_spell": "ncx", + "city_id": "124" + }, + { + "district_id": "1130", + "district_name": "新建县", + "spell": "xinjianxian", + "easy_spell": "xjx", + "city_id": "124" + }, + { + "district_id": "1131", + "district_name": "安义县", + "spell": "anyixian", + "easy_spell": "ayx", + "city_id": "124" + }, + { + "district_id": "1132", + "district_name": "进贤县", + "spell": "jinxianxian", + "easy_spell": "jxx", + "city_id": "124" + }, + { + "district_id": "1133", + "district_name": "昌江区", + "spell": "changjiangqu", + "easy_spell": "cjq", + "city_id": "125" + }, + { + "district_id": "1134", + "district_name": "珠山区", + "spell": "zhushanqu", + "easy_spell": "zsq", + "city_id": "125" + }, + { + "district_id": "1135", + "district_name": "浮梁县", + "spell": "fuliangxian", + "easy_spell": "flx", + "city_id": "125" + }, + { + "district_id": "1136", + "district_name": "乐平市", + "spell": "lepingshi", + "easy_spell": "lps", + "city_id": "125" + }, + { + "district_id": "1137", + "district_name": "安源区", + "spell": "anyuanqu", + "easy_spell": "ayq", + "city_id": "126" + }, + { + "district_id": "1138", + "district_name": "湘东区", + "spell": "xiangdongqu", + "easy_spell": "xdq", + "city_id": "126" + }, + { + "district_id": "1139", + "district_name": "莲花县", + "spell": "lianhuaxian", + "easy_spell": "lhx", + "city_id": "126" + }, + { + "district_id": "1140", + "district_name": "上栗县", + "spell": "shanglixian", + "easy_spell": "slx", + "city_id": "126" + }, + { + "district_id": "1141", + "district_name": "芦溪县", + "spell": "luxixian", + "easy_spell": "lxx", + "city_id": "126" + }, + { + "district_id": "1142", + "district_name": "庐山区", + "spell": "lushanqu", + "easy_spell": "lsq", + "city_id": "127" + }, + { + "district_id": "1143", + "district_name": "浔阳区", + "spell": "zuoyangqu", + "easy_spell": "zyq", + "city_id": "127" + }, + { + "district_id": "1144", + "district_name": "九江县", + "spell": "jiujiangxian", + "easy_spell": "jjx", + "city_id": "127" + }, + { + "district_id": "1145", + "district_name": "武宁县", + "spell": "wuningxian", + "easy_spell": "wnx", + "city_id": "127" + }, + { + "district_id": "1146", + "district_name": "修水县", + "spell": "xiushuixian", + "easy_spell": "xsx", + "city_id": "127" + }, + { + "district_id": "1147", + "district_name": "永修县", + "spell": "yongxiuxian", + "easy_spell": "yxx", + "city_id": "127" + }, + { + "district_id": "1148", + "district_name": "德安县", + "spell": "deanxian", + "easy_spell": "dax", + "city_id": "127" + }, + { + "district_id": "1149", + "district_name": "星子县", + "spell": "xingzixian", + "easy_spell": "xzx", + "city_id": "127" + }, + { + "district_id": "1150", + "district_name": "都昌县", + "spell": "duchangxian", + "easy_spell": "dcx", + "city_id": "127" + }, + { + "district_id": "1151", + "district_name": "湖口县", + "spell": "hukouxian", + "easy_spell": "hkx", + "city_id": "127" + }, + { + "district_id": "1152", + "district_name": "彭泽县", + "spell": "pengzexian", + "easy_spell": "pzx", + "city_id": "127" + }, + { + "district_id": "1153", + "district_name": "瑞昌市", + "spell": "ruichangshi", + "easy_spell": "rcs", + "city_id": "127" + }, + { + "district_id": "1154", + "district_name": "渝水区", + "spell": "yushuiqu", + "easy_spell": "ysq", + "city_id": "128" + }, + { + "district_id": "1155", + "district_name": "分宜县", + "spell": "fenyixian", + "easy_spell": "fyx", + "city_id": "128" + }, + { + "district_id": "1156", + "district_name": "月湖区", + "spell": "yuehuqu", + "easy_spell": "yhq", + "city_id": "129" + }, + { + "district_id": "1157", + "district_name": "余江县", + "spell": "yujiangxian", + "easy_spell": "yjx", + "city_id": "129" + }, + { + "district_id": "1158", + "district_name": "贵溪市", + "spell": "guixishi", + "easy_spell": "gxs", + "city_id": "129" + }, + { + "district_id": "1159", + "district_name": "章贡区", + "spell": "zhanggongqu", + "easy_spell": "zgq", + "city_id": "130" + }, + { + "district_id": "1160", + "district_name": "赣县", + "spell": "ganxian", + "easy_spell": "gx", + "city_id": "130" + }, + { + "district_id": "1161", + "district_name": "信丰县", + "spell": "xinfengxian", + "easy_spell": "xfx", + "city_id": "130" + }, + { + "district_id": "1162", + "district_name": "大余县", + "spell": "dayuxian", + "easy_spell": "dyx", + "city_id": "130" + }, + { + "district_id": "1163", + "district_name": "上犹县", + "spell": "shangyouxian", + "easy_spell": "syx", + "city_id": "130" + }, + { + "district_id": "1164", + "district_name": "崇义县", + "spell": "chongyixian", + "easy_spell": "cyx", + "city_id": "130" + }, + { + "district_id": "1165", + "district_name": "安远县", + "spell": "anyuanxian", + "easy_spell": "ayx", + "city_id": "130" + }, + { + "district_id": "1166", + "district_name": "龙南县", + "spell": "longnanxian", + "easy_spell": "lnx", + "city_id": "130" + }, + { + "district_id": "1167", + "district_name": "定南县", + "spell": "dingnanxian", + "easy_spell": "dnx", + "city_id": "130" + }, + { + "district_id": "1168", + "district_name": "全南县", + "spell": "quannanxian", + "easy_spell": "qnx", + "city_id": "130" + }, + { + "district_id": "1169", + "district_name": "宁都县", + "spell": "ningduxian", + "easy_spell": "ndx", + "city_id": "130" + }, + { + "district_id": "1170", + "district_name": "于都县", + "spell": "yuduxian", + "easy_spell": "ydx", + "city_id": "130" + }, + { + "district_id": "1171", + "district_name": "兴国县", + "spell": "xingguoxian", + "easy_spell": "xgx", + "city_id": "130" + }, + { + "district_id": "1172", + "district_name": "会昌县", + "spell": "huichangxian", + "easy_spell": "hcx", + "city_id": "130" + }, + { + "district_id": "1173", + "district_name": "寻乌县", + "spell": "xunwuxian", + "easy_spell": "xwx", + "city_id": "130" + }, + { + "district_id": "1174", + "district_name": "石城县", + "spell": "shichengxian", + "easy_spell": "scx", + "city_id": "130" + }, + { + "district_id": "1175", + "district_name": "瑞金市", + "spell": "ruijinshi", + "easy_spell": "rjs", + "city_id": "130" + }, + { + "district_id": "1176", + "district_name": "南康市", + "spell": "nankangshi", + "easy_spell": "nks", + "city_id": "130" + }, + { + "district_id": "1177", + "district_name": "吉州区", + "spell": "jizhouqu", + "easy_spell": "jzq", + "city_id": "131" + }, + { + "district_id": "1178", + "district_name": "青原区", + "spell": "qingyuanqu", + "easy_spell": "qyq", + "city_id": "131" + }, + { + "district_id": "1179", + "district_name": "吉安县", + "spell": "jianxian", + "easy_spell": "jax", + "city_id": "131" + }, + { + "district_id": "1180", + "district_name": "吉水县", + "spell": "jishuixian", + "easy_spell": "jsx", + "city_id": "131" + }, + { + "district_id": "1181", + "district_name": "峡江县", + "spell": "xiajiangxian", + "easy_spell": "xjx", + "city_id": "131" + }, + { + "district_id": "1182", + "district_name": "新干县", + "spell": "xinganxian", + "easy_spell": "xgx", + "city_id": "131" + }, + { + "district_id": "1183", + "district_name": "永丰县", + "spell": "yongfengxian", + "easy_spell": "yfx", + "city_id": "131" + }, + { + "district_id": "1184", + "district_name": "泰和县", + "spell": "taihexian", + "easy_spell": "thx", + "city_id": "131" + }, + { + "district_id": "1185", + "district_name": "遂川县", + "spell": "suichuanxian", + "easy_spell": "scx", + "city_id": "131" + }, + { + "district_id": "1186", + "district_name": "万安县", + "spell": "wananxian", + "easy_spell": "wax", + "city_id": "131" + }, + { + "district_id": "1187", + "district_name": "安福县", + "spell": "anfuxian", + "easy_spell": "afx", + "city_id": "131" + }, + { + "district_id": "1188", + "district_name": "永新县", + "spell": "yongxinxian", + "easy_spell": "yxx", + "city_id": "131" + }, + { + "district_id": "1189", + "district_name": "井冈山市", + "spell": "jinggangshanshi", + "easy_spell": "jgss", + "city_id": "131" + }, + { + "district_id": "1190", + "district_name": "袁州区", + "spell": "yuanzhouqu", + "easy_spell": "yzq", + "city_id": "132" + }, + { + "district_id": "1191", + "district_name": "奉新县", + "spell": "fengxinxian", + "easy_spell": "fxx", + "city_id": "132" + }, + { + "district_id": "1192", + "district_name": "万载县", + "spell": "wanzaixian", + "easy_spell": "wzx", + "city_id": "132" + }, + { + "district_id": "1193", + "district_name": "上高县", + "spell": "shanggaoxian", + "easy_spell": "sgx", + "city_id": "132" + }, + { + "district_id": "1194", + "district_name": "宜丰县", + "spell": "yifengxian", + "easy_spell": "yfx", + "city_id": "132" + }, + { + "district_id": "1195", + "district_name": "靖安县", + "spell": "jinganxian", + "easy_spell": "jax", + "city_id": "132" + }, + { + "district_id": "1196", + "district_name": "铜鼓县", + "spell": "tongguxian", + "easy_spell": "tgx", + "city_id": "132" + }, + { + "district_id": "1197", + "district_name": "丰城市", + "spell": "fengchengshi", + "easy_spell": "fcs", + "city_id": "132" + }, + { + "district_id": "1198", + "district_name": "樟树市", + "spell": "zhangshushi", + "easy_spell": "zss", + "city_id": "132" + }, + { + "district_id": "1199", + "district_name": "高安市", + "spell": "gaoanshi", + "easy_spell": "gas", + "city_id": "132" + }, + { + "district_id": "1200", + "district_name": "临川区", + "spell": "linchuanqu", + "easy_spell": "lcq", + "city_id": "133" + }, + { + "district_id": "1201", + "district_name": "南城县", + "spell": "nanchengxian", + "easy_spell": "ncx", + "city_id": "133" + }, + { + "district_id": "1202", + "district_name": "黎川县", + "spell": "lichuanxian", + "easy_spell": "lcx", + "city_id": "133" + }, + { + "district_id": "1203", + "district_name": "南丰县", + "spell": "nanfengxian", + "easy_spell": "nfx", + "city_id": "133" + }, + { + "district_id": "1204", + "district_name": "崇仁县", + "spell": "chongrenxian", + "easy_spell": "crx", + "city_id": "133" + }, + { + "district_id": "1205", + "district_name": "乐安县", + "spell": "leanxian", + "easy_spell": "lax", + "city_id": "133" + }, + { + "district_id": "1206", + "district_name": "宜黄县", + "spell": "yihuangxian", + "easy_spell": "yhx", + "city_id": "133" + }, + { + "district_id": "1207", + "district_name": "金溪县", + "spell": "jinxixian", + "easy_spell": "jxx", + "city_id": "133" + }, + { + "district_id": "1208", + "district_name": "资溪县", + "spell": "zixixian", + "easy_spell": "zxx", + "city_id": "133" + }, + { + "district_id": "1209", + "district_name": "东乡县", + "spell": "dongxiangxian", + "easy_spell": "dxx", + "city_id": "133" + }, + { + "district_id": "1210", + "district_name": "广昌县", + "spell": "guangchangxian", + "easy_spell": "gcx", + "city_id": "133" + }, + { + "district_id": "1211", + "district_name": "信州区", + "spell": "xinzhouqu", + "easy_spell": "xzq", + "city_id": "134" + }, + { + "district_id": "1212", + "district_name": "上饶县", + "spell": "shangraoxian", + "easy_spell": "srx", + "city_id": "134" + }, + { + "district_id": "1213", + "district_name": "广丰县", + "spell": "guangfengxian", + "easy_spell": "gfx", + "city_id": "134" + }, + { + "district_id": "1214", + "district_name": "玉山县", + "spell": "yushanxian", + "easy_spell": "ysx", + "city_id": "134" + }, + { + "district_id": "1215", + "district_name": "铅山县", + "spell": "qianshanxian", + "easy_spell": "qsx", + "city_id": "134" + }, + { + "district_id": "1216", + "district_name": "横峰县", + "spell": "hengfengxian", + "easy_spell": "hfx", + "city_id": "134" + }, + { + "district_id": "1217", + "district_name": "弋阳县", + "spell": "zuoyangxian", + "easy_spell": "zyx", + "city_id": "134" + }, + { + "district_id": "1218", + "district_name": "余干县", + "spell": "yuganxian", + "easy_spell": "ygx", + "city_id": "134" + }, + { + "district_id": "1219", + "district_name": "鄱阳县", + "spell": "zuoyangxian", + "easy_spell": "zyx", + "city_id": "134" + }, + { + "district_id": "1220", + "district_name": "万年县", + "spell": "wannianxian", + "easy_spell": "wnx", + "city_id": "134" + }, + { + "district_id": "1221", + "district_name": "婺源县", + "spell": "zuoyuanxian", + "easy_spell": "zyx", + "city_id": "134" + }, + { + "district_id": "1222", + "district_name": "德兴市", + "spell": "dexingshi", + "easy_spell": "dxs", + "city_id": "134" + }, + { + "district_id": "1223", + "district_name": "历下区", + "spell": "lixiaqu", + "easy_spell": "lxq", + "city_id": "135" + }, + { + "district_id": "1224", + "district_name": "市中区", + "spell": "shizhongqu", + "easy_spell": "szq", + "city_id": "135" + }, + { + "district_id": "1225", + "district_name": "槐荫区", + "spell": "huaiyinqu", + "easy_spell": "hyq", + "city_id": "135" + }, + { + "district_id": "1226", + "district_name": "天桥区", + "spell": "tianqiaoqu", + "easy_spell": "tqq", + "city_id": "135" + }, + { + "district_id": "1227", + "district_name": "历城区", + "spell": "lichengqu", + "easy_spell": "lcq", + "city_id": "135" + }, + { + "district_id": "1228", + "district_name": "长清区", + "spell": "changqingqu", + "easy_spell": "cqq", + "city_id": "135" + }, + { + "district_id": "1229", + "district_name": "平阴县", + "spell": "pingyinxian", + "easy_spell": "pyx", + "city_id": "135" + }, + { + "district_id": "1230", + "district_name": "济阳县", + "spell": "jiyangxian", + "easy_spell": "jyx", + "city_id": "135" + }, + { + "district_id": "1231", + "district_name": "商河县", + "spell": "shanghexian", + "easy_spell": "shx", + "city_id": "135" + }, + { + "district_id": "1232", + "district_name": "章丘市", + "spell": "zhangqiushi", + "easy_spell": "zqs", + "city_id": "135" + }, + { + "district_id": "1233", + "district_name": "市南区", + "spell": "shinanqu", + "easy_spell": "snq", + "city_id": "136" + }, + { + "district_id": "1234", + "district_name": "市北区", + "spell": "shibeiqu", + "easy_spell": "sbq", + "city_id": "136" + }, + { + "district_id": "1235", + "district_name": "四方区", + "spell": "sifangqu", + "easy_spell": "sfq", + "city_id": "136" + }, + { + "district_id": "1236", + "district_name": "黄岛区", + "spell": "huangdaoqu", + "easy_spell": "hdq", + "city_id": "136" + }, + { + "district_id": "1237", + "district_name": "崂山区", + "spell": "zuoshanqu", + "easy_spell": "zsq", + "city_id": "136" + }, + { + "district_id": "1238", + "district_name": "李沧区", + "spell": "licangqu", + "easy_spell": "lcq", + "city_id": "136" + }, + { + "district_id": "1239", + "district_name": "城阳区", + "spell": "chengyangqu", + "easy_spell": "cyq", + "city_id": "136" + }, + { + "district_id": "1240", + "district_name": "胶州市", + "spell": "jiaozhoushi", + "easy_spell": "jzs", + "city_id": "136" + }, + { + "district_id": "1241", + "district_name": "即墨市", + "spell": "jimoshi", + "easy_spell": "jms", + "city_id": "136" + }, + { + "district_id": "1242", + "district_name": "平度市", + "spell": "pingdushi", + "easy_spell": "pds", + "city_id": "136" + }, + { + "district_id": "1243", + "district_name": "胶南市", + "spell": "jiaonanshi", + "easy_spell": "jns", + "city_id": "136" + }, + { + "district_id": "1244", + "district_name": "莱西市", + "spell": "laixishi", + "easy_spell": "lxs", + "city_id": "136" + }, + { + "district_id": "1245", + "district_name": "淄川区", + "spell": "zichuanqu", + "easy_spell": "zcq", + "city_id": "137" + }, + { + "district_id": "1246", + "district_name": "张店区", + "spell": "zhangdianqu", + "easy_spell": "zdq", + "city_id": "137" + }, + { + "district_id": "1247", + "district_name": "博山区", + "spell": "boshanqu", + "easy_spell": "bsq", + "city_id": "137" + }, + { + "district_id": "1248", + "district_name": "临淄区", + "spell": "linziqu", + "easy_spell": "lzq", + "city_id": "137" + }, + { + "district_id": "1249", + "district_name": "周村区", + "spell": "zhoucunqu", + "easy_spell": "zcq", + "city_id": "137" + }, + { + "district_id": "1250", + "district_name": "桓台县", + "spell": "huantaixian", + "easy_spell": "htx", + "city_id": "137" + }, + { + "district_id": "1251", + "district_name": "高青县", + "spell": "gaoqingxian", + "easy_spell": "gqx", + "city_id": "137" + }, + { + "district_id": "1252", + "district_name": "沂源县", + "spell": "yiyuanxian", + "easy_spell": "yyx", + "city_id": "137" + }, + { + "district_id": "1253", + "district_name": "市中区", + "spell": "shizhongqu", + "easy_spell": "szq", + "city_id": "138" + }, + { + "district_id": "1254", + "district_name": "薛城区", + "spell": "xuechengqu", + "easy_spell": "xcq", + "city_id": "138" + }, + { + "district_id": "1255", + "district_name": "峄城区", + "spell": "zuochengqu", + "easy_spell": "zcq", + "city_id": "138" + }, + { + "district_id": "1256", + "district_name": "台儿庄区", + "spell": "taierzhuangqu", + "easy_spell": "tezq", + "city_id": "138" + }, + { + "district_id": "1257", + "district_name": "山亭区", + "spell": "shantingqu", + "easy_spell": "stq", + "city_id": "138" + }, + { + "district_id": "1258", + "district_name": "滕州市", + "spell": "zuozhoushi", + "easy_spell": "zzs", + "city_id": "138" + }, + { + "district_id": "1259", + "district_name": "东营区", + "spell": "dongyingqu", + "easy_spell": "dyq", + "city_id": "139" + }, + { + "district_id": "1260", + "district_name": "河口区", + "spell": "hekouqu", + "easy_spell": "hkq", + "city_id": "139" + }, + { + "district_id": "1261", + "district_name": "垦利县", + "spell": "kenlixian", + "easy_spell": "klx", + "city_id": "139" + }, + { + "district_id": "1262", + "district_name": "利津县", + "spell": "lijinxian", + "easy_spell": "ljx", + "city_id": "139" + }, + { + "district_id": "1263", + "district_name": "广饶县", + "spell": "guangraoxian", + "easy_spell": "grx", + "city_id": "139" + }, + { + "district_id": "1264", + "district_name": "芝罘区", + "spell": "zhizuoqu", + "easy_spell": "zzq", + "city_id": "140" + }, + { + "district_id": "1265", + "district_name": "福山区", + "spell": "fushanqu", + "easy_spell": "fsq", + "city_id": "140" + }, + { + "district_id": "1266", + "district_name": "牟平区", + "spell": "moupingqu", + "easy_spell": "mpq", + "city_id": "140" + }, + { + "district_id": "1267", + "district_name": "莱山区", + "spell": "laishanqu", + "easy_spell": "lsq", + "city_id": "140" + }, + { + "district_id": "1268", + "district_name": "长岛县", + "spell": "changdaoxian", + "easy_spell": "cdx", + "city_id": "140" + }, + { + "district_id": "1269", + "district_name": "龙口市", + "spell": "longkoushi", + "easy_spell": "lks", + "city_id": "140" + }, + { + "district_id": "1270", + "district_name": "莱阳市", + "spell": "laiyangshi", + "easy_spell": "lys", + "city_id": "140" + }, + { + "district_id": "1271", + "district_name": "莱州市", + "spell": "laizhoushi", + "easy_spell": "lzs", + "city_id": "140" + }, + { + "district_id": "1272", + "district_name": "蓬莱市", + "spell": "penglaishi", + "easy_spell": "pls", + "city_id": "140" + }, + { + "district_id": "1273", + "district_name": "招远市", + "spell": "zhaoyuanshi", + "easy_spell": "zys", + "city_id": "140" + }, + { + "district_id": "1274", + "district_name": "栖霞市", + "spell": "qixiashi", + "easy_spell": "qxs", + "city_id": "140" + }, + { + "district_id": "1275", + "district_name": "海阳市", + "spell": "haiyangshi", + "easy_spell": "hys", + "city_id": "140" + }, + { + "district_id": "1276", + "district_name": "潍城区", + "spell": "weichengqu", + "easy_spell": "wcq", + "city_id": "141" + }, + { + "district_id": "1277", + "district_name": "寒亭区", + "spell": "hantingqu", + "easy_spell": "htq", + "city_id": "141" + }, + { + "district_id": "1278", + "district_name": "坊子区", + "spell": "fangziqu", + "easy_spell": "fzq", + "city_id": "141" + }, + { + "district_id": "1279", + "district_name": "奎文区", + "spell": "kuiwenqu", + "easy_spell": "kwq", + "city_id": "141" + }, + { + "district_id": "1280", + "district_name": "临朐县", + "spell": "linzuoxian", + "easy_spell": "lzx", + "city_id": "141" + }, + { + "district_id": "1281", + "district_name": "昌乐县", + "spell": "changlexian", + "easy_spell": "clx", + "city_id": "141" + }, + { + "district_id": "1282", + "district_name": "青州市", + "spell": "qingzhoushi", + "easy_spell": "qzs", + "city_id": "141" + }, + { + "district_id": "1283", + "district_name": "诸城市", + "spell": "zhuchengshi", + "easy_spell": "zcs", + "city_id": "141" + }, + { + "district_id": "1284", + "district_name": "寿光市", + "spell": "shouguangshi", + "easy_spell": "sgs", + "city_id": "141" + }, + { + "district_id": "1285", + "district_name": "安丘市", + "spell": "anqiushi", + "easy_spell": "aqs", + "city_id": "141" + }, + { + "district_id": "1286", + "district_name": "高密市", + "spell": "gaomishi", + "easy_spell": "gms", + "city_id": "141" + }, + { + "district_id": "1287", + "district_name": "昌邑市", + "spell": "changyishi", + "easy_spell": "cys", + "city_id": "141" + }, + { + "district_id": "1288", + "district_name": "市中区", + "spell": "shizhongqu", + "easy_spell": "szq", + "city_id": "142" + }, + { + "district_id": "1289", + "district_name": "任城区", + "spell": "renchengqu", + "easy_spell": "rcq", + "city_id": "142" + }, + { + "district_id": "1290", + "district_name": "微山县", + "spell": "weishanxian", + "easy_spell": "wsx", + "city_id": "142" + }, + { + "district_id": "1291", + "district_name": "鱼台县", + "spell": "yutaixian", + "easy_spell": "ytx", + "city_id": "142" + }, + { + "district_id": "1292", + "district_name": "金乡县", + "spell": "jinxiangxian", + "easy_spell": "jxx", + "city_id": "142" + }, + { + "district_id": "1293", + "district_name": "嘉祥县", + "spell": "jiaxiangxian", + "easy_spell": "jxx", + "city_id": "142" + }, + { + "district_id": "1294", + "district_name": "汶上县", + "spell": "zuoshangxian", + "easy_spell": "zsx", + "city_id": "142" + }, + { + "district_id": "1295", + "district_name": "泗水县", + "spell": "zuoshuixian", + "easy_spell": "zsx", + "city_id": "142" + }, + { + "district_id": "1296", + "district_name": "梁山县", + "spell": "liangshanxian", + "easy_spell": "lsx", + "city_id": "142" + }, + { + "district_id": "1297", + "district_name": "曲阜市", + "spell": "qufushi", + "easy_spell": "qfs", + "city_id": "142" + }, + { + "district_id": "1298", + "district_name": "兖州市", + "spell": "zuozhoushi", + "easy_spell": "zzs", + "city_id": "142" + }, + { + "district_id": "1299", + "district_name": "邹城市", + "spell": "zouchengshi", + "easy_spell": "zcs", + "city_id": "142" + }, + { + "district_id": "1300", + "district_name": "泰山区", + "spell": "taishanqu", + "easy_spell": "tsq", + "city_id": "143" + }, + { + "district_id": "1301", + "district_name": "岱岳区", + "spell": "zuoyuequ", + "easy_spell": "zyq", + "city_id": "143" + }, + { + "district_id": "1302", + "district_name": "宁阳县", + "spell": "ningyangxian", + "easy_spell": "nyx", + "city_id": "143" + }, + { + "district_id": "1303", + "district_name": "东平县", + "spell": "dongpingxian", + "easy_spell": "dpx", + "city_id": "143" + }, + { + "district_id": "1304", + "district_name": "新泰市", + "spell": "xintaishi", + "easy_spell": "xts", + "city_id": "143" + }, + { + "district_id": "1305", + "district_name": "肥城市", + "spell": "feichengshi", + "easy_spell": "fcs", + "city_id": "143" + }, + { + "district_id": "1306", + "district_name": "环翠区", + "spell": "huancuiqu", + "easy_spell": "hcq", + "city_id": "144" + }, + { + "district_id": "1307", + "district_name": "文登市", + "spell": "wendengshi", + "easy_spell": "wds", + "city_id": "144" + }, + { + "district_id": "1308", + "district_name": "荣成市", + "spell": "rongchengshi", + "easy_spell": "rcs", + "city_id": "144" + }, + { + "district_id": "1309", + "district_name": "乳山市", + "spell": "rushanshi", + "easy_spell": "rss", + "city_id": "144" + }, + { + "district_id": "1310", + "district_name": "东港区", + "spell": "donggangqu", + "easy_spell": "dgq", + "city_id": "145" + }, + { + "district_id": "1311", + "district_name": "岚山区", + "spell": "zuoshanqu", + "easy_spell": "zsq", + "city_id": "145" + }, + { + "district_id": "1312", + "district_name": "五莲县", + "spell": "wulianxian", + "easy_spell": "wlx", + "city_id": "145" + }, + { + "district_id": "1313", + "district_name": "莒县", + "spell": "zuoxian", + "easy_spell": "zx", + "city_id": "145" + }, + { + "district_id": "1314", + "district_name": "莱城区", + "spell": "laichengqu", + "easy_spell": "lcq", + "city_id": "146" + }, + { + "district_id": "1315", + "district_name": "钢城区", + "spell": "gangchengqu", + "easy_spell": "gcq", + "city_id": "146" + }, + { + "district_id": "1316", + "district_name": "兰山区", + "spell": "lanshanqu", + "easy_spell": "lsq", + "city_id": "147" + }, + { + "district_id": "1317", + "district_name": "罗庄区", + "spell": "luozhuangqu", + "easy_spell": "lzq", + "city_id": "147" + }, + { + "district_id": "1318", + "district_name": "河东区", + "spell": "hedongqu", + "easy_spell": "hdq", + "city_id": "147" + }, + { + "district_id": "1319", + "district_name": "沂南县", + "spell": "yinanxian", + "easy_spell": "ynx", + "city_id": "147" + }, + { + "district_id": "1320", + "district_name": "郯城县", + "spell": "zuochengxian", + "easy_spell": "zcx", + "city_id": "147" + }, + { + "district_id": "1321", + "district_name": "沂水县", + "spell": "yishuixian", + "easy_spell": "ysx", + "city_id": "147" + }, + { + "district_id": "1322", + "district_name": "苍山县", + "spell": "cangshanxian", + "easy_spell": "csx", + "city_id": "147" + }, + { + "district_id": "1323", + "district_name": "费县", + "spell": "feixian", + "easy_spell": "fx", + "city_id": "147" + }, + { + "district_id": "1324", + "district_name": "平邑县", + "spell": "pingyixian", + "easy_spell": "pyx", + "city_id": "147" + }, + { + "district_id": "1325", + "district_name": "莒南县", + "spell": "zuonanxian", + "easy_spell": "znx", + "city_id": "147" + }, + { + "district_id": "1326", + "district_name": "蒙阴县", + "spell": "mengyinxian", + "easy_spell": "myx", + "city_id": "147" + }, + { + "district_id": "1327", + "district_name": "临沭县", + "spell": "linzuoxian", + "easy_spell": "lzx", + "city_id": "147" + }, + { + "district_id": "1328", + "district_name": "德城区", + "spell": "dechengqu", + "easy_spell": "dcq", + "city_id": "148" + }, + { + "district_id": "1329", + "district_name": "陵县", + "spell": "lingxian", + "easy_spell": "lx", + "city_id": "148" + }, + { + "district_id": "1330", + "district_name": "宁津县", + "spell": "ningjinxian", + "easy_spell": "njx", + "city_id": "148" + }, + { + "district_id": "1331", + "district_name": "庆云县", + "spell": "qingyunxian", + "easy_spell": "qyx", + "city_id": "148" + }, + { + "district_id": "1332", + "district_name": "临邑县", + "spell": "linyixian", + "easy_spell": "lyx", + "city_id": "148" + }, + { + "district_id": "1333", + "district_name": "齐河县", + "spell": "qihexian", + "easy_spell": "qhx", + "city_id": "148" + }, + { + "district_id": "1334", + "district_name": "平原县", + "spell": "pingyuanxian", + "easy_spell": "pyx", + "city_id": "148" + }, + { + "district_id": "1335", + "district_name": "夏津县", + "spell": "xiajinxian", + "easy_spell": "xjx", + "city_id": "148" + }, + { + "district_id": "1336", + "district_name": "武城县", + "spell": "wuchengxian", + "easy_spell": "wcx", + "city_id": "148" + }, + { + "district_id": "1337", + "district_name": "乐陵市", + "spell": "lelingshi", + "easy_spell": "lls", + "city_id": "148" + }, + { + "district_id": "1338", + "district_name": "禹城市", + "spell": "yuchengshi", + "easy_spell": "ycs", + "city_id": "148" + }, + { + "district_id": "1339", + "district_name": "东昌府区", + "spell": "dongchangfuqu", + "easy_spell": "dcfq", + "city_id": "149" + }, + { + "district_id": "1340", + "district_name": "阳谷县", + "spell": "yangguxian", + "easy_spell": "ygx", + "city_id": "149" + }, + { + "district_id": "1341", + "district_name": "莘县", + "spell": "zuoxian", + "easy_spell": "zx", + "city_id": "149" + }, + { + "district_id": "1342", + "district_name": "茌平县", + "spell": "zuopingxian", + "easy_spell": "zpx", + "city_id": "149" + }, + { + "district_id": "1343", + "district_name": "东阿县", + "spell": "dongaxian", + "easy_spell": "dax", + "city_id": "149" + }, + { + "district_id": "1344", + "district_name": "冠县", + "spell": "guanxian", + "easy_spell": "gx", + "city_id": "149" + }, + { + "district_id": "1345", + "district_name": "高唐县", + "spell": "gaotangxian", + "easy_spell": "gtx", + "city_id": "149" + }, + { + "district_id": "1346", + "district_name": "临清市", + "spell": "linqingshi", + "easy_spell": "lqs", + "city_id": "149" + }, + { + "district_id": "1347", + "district_name": "滨城区", + "spell": "binchengqu", + "easy_spell": "bcq", + "city_id": "150" + }, + { + "district_id": "1348", + "district_name": "惠民县", + "spell": "huiminxian", + "easy_spell": "hmx", + "city_id": "150" + }, + { + "district_id": "1349", + "district_name": "阳信县", + "spell": "yangxinxian", + "easy_spell": "yxx", + "city_id": "150" + }, + { + "district_id": "1350", + "district_name": "无棣县", + "spell": "wuzuoxian", + "easy_spell": "wzx", + "city_id": "150" + }, + { + "district_id": "1351", + "district_name": "沾化县", + "spell": "zhanhuaxian", + "easy_spell": "zhx", + "city_id": "150" + }, + { + "district_id": "1352", + "district_name": "博兴县", + "spell": "boxingxian", + "easy_spell": "bxx", + "city_id": "150" + }, + { + "district_id": "1353", + "district_name": "邹平县", + "spell": "zoupingxian", + "easy_spell": "zpx", + "city_id": "150" + }, + { + "district_id": "1354", + "district_name": "牡丹区", + "spell": "mudanqu", + "easy_spell": "mdq", + "city_id": "151" + }, + { + "district_id": "1355", + "district_name": "曹县", + "spell": "caoxian", + "easy_spell": "cx", + "city_id": "151" + }, + { + "district_id": "1356", + "district_name": "单县", + "spell": "danxian", + "easy_spell": "dx", + "city_id": "151" + }, + { + "district_id": "1357", + "district_name": "成武县", + "spell": "chengwuxian", + "easy_spell": "cwx", + "city_id": "151" + }, + { + "district_id": "1358", + "district_name": "巨野县", + "spell": "juyexian", + "easy_spell": "jyx", + "city_id": "151" + }, + { + "district_id": "1359", + "district_name": "郓城县", + "spell": "zuochengxian", + "easy_spell": "zcx", + "city_id": "151" + }, + { + "district_id": "1360", + "district_name": "鄄城县", + "spell": "zuochengxian", + "easy_spell": "zcx", + "city_id": "151" + }, + { + "district_id": "1361", + "district_name": "定陶县", + "spell": "dingtaoxian", + "easy_spell": "dtx", + "city_id": "151" + }, + { + "district_id": "1362", + "district_name": "东明县", + "spell": "dongmingxian", + "easy_spell": "dmx", + "city_id": "151" + }, + { + "district_id": "1363", + "district_name": "中原区", + "spell": "zhongyuanqu", + "easy_spell": "zyq", + "city_id": "152" + }, + { + "district_id": "1364", + "district_name": "二七区", + "spell": "erqiqu", + "easy_spell": "eqq", + "city_id": "152" + }, + { + "district_id": "1365", + "district_name": "管城回族区", + "spell": "guanchenghuizuqu", + "easy_spell": "gchzq", + "city_id": "152" + }, + { + "district_id": "1366", + "district_name": "金水区", + "spell": "jinshuiqu", + "easy_spell": "jsq", + "city_id": "152" + }, + { + "district_id": "1367", + "district_name": "上街区", + "spell": "shangjiequ", + "easy_spell": "sjq", + "city_id": "152" + }, + { + "district_id": "1368", + "district_name": "惠济区", + "spell": "huijiqu", + "easy_spell": "hjq", + "city_id": "152" + }, + { + "district_id": "1369", + "district_name": "中牟县", + "spell": "zhongmouxian", + "easy_spell": "zmx", + "city_id": "152" + }, + { + "district_id": "1370", + "district_name": "巩义市", + "spell": "gongyishi", + "easy_spell": "gys", + "city_id": "152" + }, + { + "district_id": "1371", + "district_name": "荥阳市", + "spell": "zuoyangshi", + "easy_spell": "zys", + "city_id": "152" + }, + { + "district_id": "1372", + "district_name": "新密市", + "spell": "xinmishi", + "easy_spell": "xms", + "city_id": "152" + }, + { + "district_id": "1373", + "district_name": "新郑市", + "spell": "xinzhengshi", + "easy_spell": "xzs", + "city_id": "152" + }, + { + "district_id": "1374", + "district_name": "登封市", + "spell": "dengfengshi", + "easy_spell": "dfs", + "city_id": "152" + }, + { + "district_id": "1375", + "district_name": "龙亭区", + "spell": "longtingqu", + "easy_spell": "ltq", + "city_id": "153" + }, + { + "district_id": "1376", + "district_name": "顺河回族区", + "spell": "shunhehuizuqu", + "easy_spell": "shhzq", + "city_id": "153" + }, + { + "district_id": "1377", + "district_name": "鼓楼区", + "spell": "gulouqu", + "easy_spell": "glq", + "city_id": "153" + }, + { + "district_id": "1378", + "district_name": "南关区", + "spell": "nanguanqu", + "easy_spell": "ngq", + "city_id": "153" + }, + { + "district_id": "1379", + "district_name": "郊区", + "spell": "jiaoqu", + "easy_spell": "jq", + "city_id": "153" + }, + { + "district_id": "1380", + "district_name": "杞县", + "spell": "zuoxian", + "easy_spell": "zx", + "city_id": "153" + }, + { + "district_id": "1381", + "district_name": "通许县", + "spell": "tongxuxian", + "easy_spell": "txx", + "city_id": "153" + }, + { + "district_id": "1382", + "district_name": "尉氏县", + "spell": "weishixian", + "easy_spell": "wsx", + "city_id": "153" + }, + { + "district_id": "1383", + "district_name": "开封县", + "spell": "kaifengxian", + "easy_spell": "kfx", + "city_id": "153" + }, + { + "district_id": "1384", + "district_name": "兰考县", + "spell": "lankaoxian", + "easy_spell": "lkx", + "city_id": "153" + }, + { + "district_id": "1385", + "district_name": "老城区", + "spell": "laochengqu", + "easy_spell": "lcq", + "city_id": "154" + }, + { + "district_id": "1386", + "district_name": "西工区", + "spell": "xigongqu", + "easy_spell": "xgq", + "city_id": "154" + }, + { + "district_id": "1387", + "district_name": "廛河回族区", + "spell": "zuohehuizuqu", + "easy_spell": "zhhzq", + "city_id": "154" + }, + { + "district_id": "1388", + "district_name": "涧西区", + "spell": "jianxiqu", + "easy_spell": "jxq", + "city_id": "154" + }, + { + "district_id": "1389", + "district_name": "吉利区", + "spell": "jiliqu", + "easy_spell": "jlq", + "city_id": "154" + }, + { + "district_id": "1390", + "district_name": "洛龙区", + "spell": "luolongqu", + "easy_spell": "llq", + "city_id": "154" + }, + { + "district_id": "1391", + "district_name": "孟津县", + "spell": "mengjinxian", + "easy_spell": "mjx", + "city_id": "154" + }, + { + "district_id": "1392", + "district_name": "新安县", + "spell": "xinanxian", + "easy_spell": "xax", + "city_id": "154" + }, + { + "district_id": "1393", + "district_name": "栾川县", + "spell": "zuochuanxian", + "easy_spell": "zcx", + "city_id": "154" + }, + { + "district_id": "1394", + "district_name": "嵩县", + "spell": "zuoxian", + "easy_spell": "zx", + "city_id": "154" + }, + { + "district_id": "1395", + "district_name": "汝阳县", + "spell": "ruyangxian", + "easy_spell": "ryx", + "city_id": "154" + }, + { + "district_id": "1396", + "district_name": "宜阳县", + "spell": "yiyangxian", + "easy_spell": "yyx", + "city_id": "154" + }, + { + "district_id": "1397", + "district_name": "洛宁县", + "spell": "luoningxian", + "easy_spell": "lnx", + "city_id": "154" + }, + { + "district_id": "1398", + "district_name": "伊川县", + "spell": "yichuanxian", + "easy_spell": "ycx", + "city_id": "154" + }, + { + "district_id": "1399", + "district_name": "偃师市", + "spell": "zuoshishi", + "easy_spell": "zss", + "city_id": "154" + }, + { + "district_id": "1400", + "district_name": "新华区", + "spell": "xinhuaqu", + "easy_spell": "xhq", + "city_id": "155" + }, + { + "district_id": "1401", + "district_name": "卫东区", + "spell": "weidongqu", + "easy_spell": "wdq", + "city_id": "155" + }, + { + "district_id": "1402", + "district_name": "石龙区", + "spell": "shilongqu", + "easy_spell": "slq", + "city_id": "155" + }, + { + "district_id": "1403", + "district_name": "湛河区", + "spell": "zhanhequ", + "easy_spell": "zhq", + "city_id": "155" + }, + { + "district_id": "1404", + "district_name": "宝丰县", + "spell": "baofengxian", + "easy_spell": "bfx", + "city_id": "155" + }, + { + "district_id": "1405", + "district_name": "叶县", + "spell": "yexian", + "easy_spell": "yx", + "city_id": "155" + }, + { + "district_id": "1406", + "district_name": "鲁山县", + "spell": "lushanxian", + "easy_spell": "lsx", + "city_id": "155" + }, + { + "district_id": "1407", + "district_name": "郏县", + "spell": "zuoxian", + "easy_spell": "zx", + "city_id": "155" + }, + { + "district_id": "1408", + "district_name": "舞钢市", + "spell": "wugangshi", + "easy_spell": "wgs", + "city_id": "155" + }, + { + "district_id": "1409", + "district_name": "汝州市", + "spell": "ruzhoushi", + "easy_spell": "rzs", + "city_id": "155" + }, + { + "district_id": "1410", + "district_name": "文峰区", + "spell": "wenfengqu", + "easy_spell": "wfq", + "city_id": "156" + }, + { + "district_id": "1411", + "district_name": "北关区", + "spell": "beiguanqu", + "easy_spell": "bgq", + "city_id": "156" + }, + { + "district_id": "1412", + "district_name": "殷都区", + "spell": "yinduqu", + "easy_spell": "ydq", + "city_id": "156" + }, + { + "district_id": "1413", + "district_name": "龙安区", + "spell": "longanqu", + "easy_spell": "laq", + "city_id": "156" + }, + { + "district_id": "1414", + "district_name": "安阳县", + "spell": "anyangxian", + "easy_spell": "ayx", + "city_id": "156" + }, + { + "district_id": "1415", + "district_name": "汤阴县", + "spell": "tangyinxian", + "easy_spell": "tyx", + "city_id": "156" + }, + { + "district_id": "1416", + "district_name": "滑县", + "spell": "huaxian", + "easy_spell": "hx", + "city_id": "156" + }, + { + "district_id": "1417", + "district_name": "内黄县", + "spell": "neihuangxian", + "easy_spell": "nhx", + "city_id": "156" + }, + { + "district_id": "1418", + "district_name": "林州市", + "spell": "linzhoushi", + "easy_spell": "lzs", + "city_id": "156" + }, + { + "district_id": "1419", + "district_name": "鹤山区", + "spell": "heshanqu", + "easy_spell": "hsq", + "city_id": "157" + }, + { + "district_id": "1420", + "district_name": "山城区", + "spell": "shanchengqu", + "easy_spell": "scq", + "city_id": "157" + }, + { + "district_id": "1421", + "district_name": "淇滨区", + "spell": "zuobinqu", + "easy_spell": "zbq", + "city_id": "157" + }, + { + "district_id": "1422", + "district_name": "浚县", + "spell": "junxian", + "easy_spell": "jx", + "city_id": "157" + }, + { + "district_id": "1423", + "district_name": "淇县", + "spell": "zuoxian", + "easy_spell": "zx", + "city_id": "157" + }, + { + "district_id": "1424", + "district_name": "红旗区", + "spell": "hongqiqu", + "easy_spell": "hqq", + "city_id": "158" + }, + { + "district_id": "1425", + "district_name": "卫滨区", + "spell": "weibinqu", + "easy_spell": "wbq", + "city_id": "158" + }, + { + "district_id": "1426", + "district_name": "凤泉区", + "spell": "fengquanqu", + "easy_spell": "fqq", + "city_id": "158" + }, + { + "district_id": "1427", + "district_name": "牧野区", + "spell": "muyequ", + "easy_spell": "myq", + "city_id": "158" + }, + { + "district_id": "1428", + "district_name": "新乡县", + "spell": "xinxiangxian", + "easy_spell": "xxx", + "city_id": "158" + }, + { + "district_id": "1429", + "district_name": "获嘉县", + "spell": "huojiaxian", + "easy_spell": "hjx", + "city_id": "158" + }, + { + "district_id": "1430", + "district_name": "原阳县", + "spell": "yuanyangxian", + "easy_spell": "yyx", + "city_id": "158" + }, + { + "district_id": "1431", + "district_name": "延津县", + "spell": "yanjinxian", + "easy_spell": "yjx", + "city_id": "158" + }, + { + "district_id": "1432", + "district_name": "封丘县", + "spell": "fengqiuxian", + "easy_spell": "fqx", + "city_id": "158" + }, + { + "district_id": "1433", + "district_name": "长垣县", + "spell": "changyuanxian", + "easy_spell": "cyx", + "city_id": "158" + }, + { + "district_id": "1434", + "district_name": "卫辉市", + "spell": "weihuishi", + "easy_spell": "whs", + "city_id": "158" + }, + { + "district_id": "1435", + "district_name": "辉县市", + "spell": "huixianshi", + "easy_spell": "hxs", + "city_id": "158" + }, + { + "district_id": "1436", + "district_name": "解放区", + "spell": "jiefangqu", + "easy_spell": "jfq", + "city_id": "159" + }, + { + "district_id": "1437", + "district_name": "中站区", + "spell": "zhongzhanqu", + "easy_spell": "zzq", + "city_id": "159" + }, + { + "district_id": "1438", + "district_name": "马村区", + "spell": "macunqu", + "easy_spell": "mcq", + "city_id": "159" + }, + { + "district_id": "1439", + "district_name": "山阳区", + "spell": "shanyangqu", + "easy_spell": "syq", + "city_id": "159" + }, + { + "district_id": "1440", + "district_name": "修武县", + "spell": "xiuwuxian", + "easy_spell": "xwx", + "city_id": "159" + }, + { + "district_id": "1441", + "district_name": "博爱县", + "spell": "boaixian", + "easy_spell": "bax", + "city_id": "159" + }, + { + "district_id": "1442", + "district_name": "武陟县", + "spell": "wuzuoxian", + "easy_spell": "wzx", + "city_id": "159" + }, + { + "district_id": "1443", + "district_name": "温县", + "spell": "wenxian", + "easy_spell": "wx", + "city_id": "159" + }, + { + "district_id": "1444", + "district_name": "济源市", + "spell": "jiyuanshi", + "easy_spell": "jys", + "city_id": "159" + }, + { + "district_id": "1445", + "district_name": "沁阳市", + "spell": "qinyangshi", + "easy_spell": "qys", + "city_id": "159" + }, + { + "district_id": "1446", + "district_name": "孟州市", + "spell": "mengzhoushi", + "easy_spell": "mzs", + "city_id": "159" + }, + { + "district_id": "1447", + "district_name": "华龙区", + "spell": "hualongqu", + "easy_spell": "hlq", + "city_id": "160" + }, + { + "district_id": "1448", + "district_name": "清丰县", + "spell": "qingfengxian", + "easy_spell": "qfx", + "city_id": "160" + }, + { + "district_id": "1449", + "district_name": "南乐县", + "spell": "nanlexian", + "easy_spell": "nlx", + "city_id": "160" + }, + { + "district_id": "1450", + "district_name": "范县", + "spell": "fanxian", + "easy_spell": "fx", + "city_id": "160" + }, + { + "district_id": "1451", + "district_name": "台前县", + "spell": "taiqianxian", + "easy_spell": "tqx", + "city_id": "160" + }, + { + "district_id": "1452", + "district_name": "濮阳县", + "spell": "zuoyangxian", + "easy_spell": "zyx", + "city_id": "160" + }, + { + "district_id": "1453", + "district_name": "魏都区", + "spell": "weiduqu", + "easy_spell": "wdq", + "city_id": "161" + }, + { + "district_id": "1454", + "district_name": "许昌县", + "spell": "xuchangxian", + "easy_spell": "xcx", + "city_id": "161" + }, + { + "district_id": "1455", + "district_name": "鄢陵县", + "spell": "zuolingxian", + "easy_spell": "zlx", + "city_id": "161" + }, + { + "district_id": "1456", + "district_name": "襄城县", + "spell": "xiangchengxian", + "easy_spell": "xcx", + "city_id": "161" + }, + { + "district_id": "1457", + "district_name": "禹州市", + "spell": "yuzhoushi", + "easy_spell": "yzs", + "city_id": "161" + }, + { + "district_id": "1458", + "district_name": "长葛市", + "spell": "changgeshi", + "easy_spell": "cgs", + "city_id": "161" + }, + { + "district_id": "1459", + "district_name": "源汇区", + "spell": "yuanhuiqu", + "easy_spell": "yhq", + "city_id": "162" + }, + { + "district_id": "1460", + "district_name": "郾城区", + "spell": "zuochengqu", + "easy_spell": "zcq", + "city_id": "162" + }, + { + "district_id": "1461", + "district_name": "召陵区", + "spell": "zhaolingqu", + "easy_spell": "zlq", + "city_id": "162" + }, + { + "district_id": "1462", + "district_name": "舞阳县", + "spell": "wuyangxian", + "easy_spell": "wyx", + "city_id": "162" + }, + { + "district_id": "1463", + "district_name": "临颍县", + "spell": "linzuoxian", + "easy_spell": "lzx", + "city_id": "162" + }, + { + "district_id": "1464", + "district_name": "市辖区", + "spell": "shixiaqu", + "easy_spell": "sxq", + "city_id": "163" + }, + { + "district_id": "1465", + "district_name": "湖滨区", + "spell": "hubinqu", + "easy_spell": "hbq", + "city_id": "163" + }, + { + "district_id": "1466", + "district_name": "渑池县", + "spell": "zuochixian", + "easy_spell": "zcx", + "city_id": "163" + }, + { + "district_id": "1467", + "district_name": "陕县", + "spell": "shanxian", + "easy_spell": "sx", + "city_id": "163" + }, + { + "district_id": "1468", + "district_name": "卢氏县", + "spell": "lushixian", + "easy_spell": "lsx", + "city_id": "163" + }, + { + "district_id": "1469", + "district_name": "义马市", + "spell": "yimashi", + "easy_spell": "yms", + "city_id": "163" + }, + { + "district_id": "1470", + "district_name": "灵宝市", + "spell": "lingbaoshi", + "easy_spell": "lbs", + "city_id": "163" + }, + { + "district_id": "1471", + "district_name": "宛城区", + "spell": "wanchengqu", + "easy_spell": "wcq", + "city_id": "164" + }, + { + "district_id": "1472", + "district_name": "卧龙区", + "spell": "wolongqu", + "easy_spell": "wlq", + "city_id": "164" + }, + { + "district_id": "1473", + "district_name": "南召县", + "spell": "nanzhaoxian", + "easy_spell": "nzx", + "city_id": "164" + }, + { + "district_id": "1474", + "district_name": "方城县", + "spell": "fangchengxian", + "easy_spell": "fcx", + "city_id": "164" + }, + { + "district_id": "1475", + "district_name": "西峡县", + "spell": "xixiaxian", + "easy_spell": "xxx", + "city_id": "164" + }, + { + "district_id": "1476", + "district_name": "镇平县", + "spell": "zhenpingxian", + "easy_spell": "zpx", + "city_id": "164" + }, + { + "district_id": "1477", + "district_name": "内乡县", + "spell": "neixiangxian", + "easy_spell": "nxx", + "city_id": "164" + }, + { + "district_id": "1478", + "district_name": "淅川县", + "spell": "zuochuanxian", + "easy_spell": "zcx", + "city_id": "164" + }, + { + "district_id": "1479", + "district_name": "社旗县", + "spell": "sheqixian", + "easy_spell": "sqx", + "city_id": "164" + }, + { + "district_id": "1480", + "district_name": "唐河县", + "spell": "tanghexian", + "easy_spell": "thx", + "city_id": "164" + }, + { + "district_id": "1481", + "district_name": "新野县", + "spell": "xinyexian", + "easy_spell": "xyx", + "city_id": "164" + }, + { + "district_id": "1482", + "district_name": "桐柏县", + "spell": "tongbaixian", + "easy_spell": "tbx", + "city_id": "164" + }, + { + "district_id": "1483", + "district_name": "邓州市", + "spell": "dengzhoushi", + "easy_spell": "dzs", + "city_id": "164" + }, + { + "district_id": "1484", + "district_name": "梁园区", + "spell": "liangyuanqu", + "easy_spell": "lyq", + "city_id": "165" + }, + { + "district_id": "1485", + "district_name": "睢阳区", + "spell": "zuoyangqu", + "easy_spell": "zyq", + "city_id": "165" + }, + { + "district_id": "1486", + "district_name": "民权县", + "spell": "minquanxian", + "easy_spell": "mqx", + "city_id": "165" + }, + { + "district_id": "1487", + "district_name": "睢县", + "spell": "zuoxian", + "easy_spell": "zx", + "city_id": "165" + }, + { + "district_id": "1488", + "district_name": "宁陵县", + "spell": "ninglingxian", + "easy_spell": "nlx", + "city_id": "165" + }, + { + "district_id": "1489", + "district_name": "柘城县", + "spell": "zuochengxian", + "easy_spell": "zcx", + "city_id": "165" + }, + { + "district_id": "1490", + "district_name": "虞城县", + "spell": "yuchengxian", + "easy_spell": "ycx", + "city_id": "165" + }, + { + "district_id": "1491", + "district_name": "夏邑县", + "spell": "xiayixian", + "easy_spell": "xyx", + "city_id": "165" + }, + { + "district_id": "1492", + "district_name": "永城市", + "spell": "yongchengshi", + "easy_spell": "ycs", + "city_id": "165" + }, + { + "district_id": "1493", + "district_name": "浉河区", + "spell": "hequ", + "easy_spell": "浉hq", + "city_id": "166" + }, + { + "district_id": "1494", + "district_name": "平桥区", + "spell": "pingqiaoqu", + "easy_spell": "pqq", + "city_id": "166" + }, + { + "district_id": "1495", + "district_name": "罗山县", + "spell": "luoshanxian", + "easy_spell": "lsx", + "city_id": "166" + }, + { + "district_id": "1496", + "district_name": "光山县", + "spell": "guangshanxian", + "easy_spell": "gsx", + "city_id": "166" + }, + { + "district_id": "1497", + "district_name": "新县", + "spell": "xinxian", + "easy_spell": "xx", + "city_id": "166" + }, + { + "district_id": "1498", + "district_name": "商城县", + "spell": "shangchengxian", + "easy_spell": "scx", + "city_id": "166" + }, + { + "district_id": "1499", + "district_name": "固始县", + "spell": "gushixian", + "easy_spell": "gsx", + "city_id": "166" + }, + { + "district_id": "1500", + "district_name": "潢川县", + "spell": "zuochuanxian", + "easy_spell": "zcx", + "city_id": "166" + }, + { + "district_id": "1501", + "district_name": "淮滨县", + "spell": "huaibinxian", + "easy_spell": "hbx", + "city_id": "166" + }, + { + "district_id": "1502", + "district_name": "息县", + "spell": "xixian", + "easy_spell": "xx", + "city_id": "166" + }, + { + "district_id": "1503", + "district_name": "川汇区", + "spell": "chuanhuiqu", + "easy_spell": "chq", + "city_id": "167" + }, + { + "district_id": "1504", + "district_name": "扶沟县", + "spell": "fugouxian", + "easy_spell": "fgx", + "city_id": "167" + }, + { + "district_id": "1505", + "district_name": "西华县", + "spell": "xihuaxian", + "easy_spell": "xhx", + "city_id": "167" + }, + { + "district_id": "1506", + "district_name": "商水县", + "spell": "shangshuixian", + "easy_spell": "ssx", + "city_id": "167" + }, + { + "district_id": "1507", + "district_name": "沈丘县", + "spell": "shenqiuxian", + "easy_spell": "sqx", + "city_id": "167" + }, + { + "district_id": "1508", + "district_name": "郸城县", + "spell": "danchengxian", + "easy_spell": "dcx", + "city_id": "167" + }, + { + "district_id": "1509", + "district_name": "淮阳县", + "spell": "huaiyangxian", + "easy_spell": "hyx", + "city_id": "167" + }, + { + "district_id": "1510", + "district_name": "太康县", + "spell": "taikangxian", + "easy_spell": "tkx", + "city_id": "167" + }, + { + "district_id": "1511", + "district_name": "鹿邑县", + "spell": "luyixian", + "easy_spell": "lyx", + "city_id": "167" + }, + { + "district_id": "1512", + "district_name": "项城市", + "spell": "xiangchengshi", + "easy_spell": "xcs", + "city_id": "167" + }, + { + "district_id": "1513", + "district_name": "驿城区", + "spell": "zuochengqu", + "easy_spell": "zcq", + "city_id": "168" + }, + { + "district_id": "1514", + "district_name": "西平县", + "spell": "xipingxian", + "easy_spell": "xpx", + "city_id": "168" + }, + { + "district_id": "1515", + "district_name": "上蔡县", + "spell": "shangcaixian", + "easy_spell": "scx", + "city_id": "168" + }, + { + "district_id": "1516", + "district_name": "平舆县", + "spell": "pingyuxian", + "easy_spell": "pyx", + "city_id": "168" + }, + { + "district_id": "1517", + "district_name": "正阳县", + "spell": "zhengyangxian", + "easy_spell": "zyx", + "city_id": "168" + }, + { + "district_id": "1518", + "district_name": "确山县", + "spell": "queshanxian", + "easy_spell": "qsx", + "city_id": "168" + }, + { + "district_id": "1519", + "district_name": "泌阳县", + "spell": "miyangxian", + "easy_spell": "myx", + "city_id": "168" + }, + { + "district_id": "1520", + "district_name": "汝南县", + "spell": "runanxian", + "easy_spell": "rnx", + "city_id": "168" + }, + { + "district_id": "1521", + "district_name": "遂平县", + "spell": "suipingxian", + "easy_spell": "spx", + "city_id": "168" + }, + { + "district_id": "1522", + "district_name": "新蔡县", + "spell": "xincaixian", + "easy_spell": "xcx", + "city_id": "168" + }, + { + "district_id": "1523", + "district_name": "江岸区", + "spell": "jianganqu", + "easy_spell": "jaq", + "city_id": "169" + }, + { + "district_id": "1524", + "district_name": "江汉区", + "spell": "jianghanqu", + "easy_spell": "jhq", + "city_id": "169" + }, + { + "district_id": "1525", + "district_name": "硚口区", + "spell": "changkouqu", + "easy_spell": "ckq", + "city_id": "169" + }, + { + "district_id": "1526", + "district_name": "汉阳区", + "spell": "hanyangqu", + "easy_spell": "hyq", + "city_id": "169" + }, + { + "district_id": "1527", + "district_name": "武昌区", + "spell": "wuchangqu", + "easy_spell": "wcq", + "city_id": "169" + }, + { + "district_id": "1528", + "district_name": "青山区", + "spell": "qingshanqu", + "easy_spell": "qsq", + "city_id": "169" + }, + { + "district_id": "1529", + "district_name": "洪山区", + "spell": "hongshanqu", + "easy_spell": "hsq", + "city_id": "169" + }, + { + "district_id": "1530", + "district_name": "东西湖区", + "spell": "dongxihuqu", + "easy_spell": "dxhq", + "city_id": "169" + }, + { + "district_id": "1531", + "district_name": "汉南区", + "spell": "hannanqu", + "easy_spell": "hnq", + "city_id": "169" + }, + { + "district_id": "1532", + "district_name": "蔡甸区", + "spell": "caidianqu", + "easy_spell": "cdq", + "city_id": "169" + }, + { + "district_id": "1533", + "district_name": "江夏区", + "spell": "jiangxiaqu", + "easy_spell": "jxq", + "city_id": "169" + }, + { + "district_id": "1534", + "district_name": "黄陂区", + "spell": "huangzuoqu", + "easy_spell": "hzq", + "city_id": "169" + }, + { + "district_id": "1535", + "district_name": "新洲区", + "spell": "xinzhouqu", + "easy_spell": "xzq", + "city_id": "169" + }, + { + "district_id": "1536", + "district_name": "黄石港区", + "spell": "huangshigangqu", + "easy_spell": "hsgq", + "city_id": "170" + }, + { + "district_id": "1537", + "district_name": "西塞山区", + "spell": "xisaishanqu", + "easy_spell": "xssq", + "city_id": "170" + }, + { + "district_id": "1538", + "district_name": "下陆区", + "spell": "xialuqu", + "easy_spell": "xlq", + "city_id": "170" + }, + { + "district_id": "1539", + "district_name": "铁山区", + "spell": "tieshanqu", + "easy_spell": "tsq", + "city_id": "170" + }, + { + "district_id": "1540", + "district_name": "阳新县", + "spell": "yangxinxian", + "easy_spell": "yxx", + "city_id": "170" + }, + { + "district_id": "1541", + "district_name": "大冶市", + "spell": "dayeshi", + "easy_spell": "dys", + "city_id": "170" + }, + { + "district_id": "1542", + "district_name": "茅箭区", + "spell": "maojianqu", + "easy_spell": "mjq", + "city_id": "171" + }, + { + "district_id": "1543", + "district_name": "张湾区", + "spell": "zhangwanqu", + "easy_spell": "zwq", + "city_id": "171" + }, + { + "district_id": "1544", + "district_name": "郧县", + "spell": "yunxian", + "easy_spell": "yx", + "city_id": "171" + }, + { + "district_id": "1545", + "district_name": "郧西县", + "spell": "yunxixian", + "easy_spell": "yxx", + "city_id": "171" + }, + { + "district_id": "1546", + "district_name": "竹山县", + "spell": "zhushanxian", + "easy_spell": "zsx", + "city_id": "171" + }, + { + "district_id": "1547", + "district_name": "竹溪县", + "spell": "zhuxixian", + "easy_spell": "zxx", + "city_id": "171" + }, + { + "district_id": "1548", + "district_name": "房县", + "spell": "fangxian", + "easy_spell": "fx", + "city_id": "171" + }, + { + "district_id": "1549", + "district_name": "丹江口市", + "spell": "danjiangkoushi", + "easy_spell": "djks", + "city_id": "171" + }, + { + "district_id": "1550", + "district_name": "西陵区", + "spell": "xilingqu", + "easy_spell": "xlq", + "city_id": "172" + }, + { + "district_id": "1551", + "district_name": "伍家岗区", + "spell": "wujiagangqu", + "easy_spell": "wjgq", + "city_id": "172" + }, + { + "district_id": "1552", + "district_name": "点军区", + "spell": "dianjunqu", + "easy_spell": "djq", + "city_id": "172" + }, + { + "district_id": "1553", + "district_name": "猇亭区", + "spell": "tingqu", + "easy_spell": "猇tq", + "city_id": "172" + }, + { + "district_id": "1554", + "district_name": "夷陵区", + "spell": "yilingqu", + "easy_spell": "ylq", + "city_id": "172" + }, + { + "district_id": "1555", + "district_name": "远安县", + "spell": "yuananxian", + "easy_spell": "yax", + "city_id": "172" + }, + { + "district_id": "1556", + "district_name": "兴山县", + "spell": "xingshanxian", + "easy_spell": "xsx", + "city_id": "172" + }, + { + "district_id": "1557", + "district_name": "秭归县", + "spell": "zuoguixian", + "easy_spell": "zgx", + "city_id": "172" + }, + { + "district_id": "1558", + "district_name": "长阳土家族自治县", + "spell": "changyangtujiazuzizhixian", + "easy_spell": "cytjzzzx", + "city_id": "172" + }, + { + "district_id": "1559", + "district_name": "五峰土家族自治县", + "spell": "wufengtujiazuzizhixian", + "easy_spell": "wftjzzzx", + "city_id": "172" + }, + { + "district_id": "1560", + "district_name": "宜都市", + "spell": "yidushi", + "easy_spell": "yds", + "city_id": "172" + }, + { + "district_id": "1561", + "district_name": "当阳市", + "spell": "dangyangshi", + "easy_spell": "dys", + "city_id": "172" + }, + { + "district_id": "1562", + "district_name": "枝江市", + "spell": "zhijiangshi", + "easy_spell": "zjs", + "city_id": "172" + }, + { + "district_id": "1563", + "district_name": "襄城区", + "spell": "xiangchengqu", + "easy_spell": "xcq", + "city_id": "173" + }, + { + "district_id": "1564", + "district_name": "樊城区", + "spell": "fanchengqu", + "easy_spell": "fcq", + "city_id": "173" + }, + { + "district_id": "1565", + "district_name": "襄阳区", + "spell": "xiangyangqu", + "easy_spell": "xyq", + "city_id": "173" + }, + { + "district_id": "1566", + "district_name": "南漳县", + "spell": "nanzhangxian", + "easy_spell": "nzx", + "city_id": "173" + }, + { + "district_id": "1567", + "district_name": "谷城县", + "spell": "guchengxian", + "easy_spell": "gcx", + "city_id": "173" + }, + { + "district_id": "1568", + "district_name": "保康县", + "spell": "baokangxian", + "easy_spell": "bkx", + "city_id": "173" + }, + { + "district_id": "1569", + "district_name": "老河口市", + "spell": "laohekoushi", + "easy_spell": "lhks", + "city_id": "173" + }, + { + "district_id": "1570", + "district_name": "枣阳市", + "spell": "zaoyangshi", + "easy_spell": "zys", + "city_id": "173" + }, + { + "district_id": "1571", + "district_name": "宜城市", + "spell": "yichengshi", + "easy_spell": "ycs", + "city_id": "173" + }, + { + "district_id": "1572", + "district_name": "梁子湖区", + "spell": "liangzihuqu", + "easy_spell": "lzhq", + "city_id": "174" + }, + { + "district_id": "1573", + "district_name": "华容区", + "spell": "huarongqu", + "easy_spell": "hrq", + "city_id": "174" + }, + { + "district_id": "1574", + "district_name": "鄂城区", + "spell": "echengqu", + "easy_spell": "ecq", + "city_id": "174" + }, + { + "district_id": "1575", + "district_name": "东宝区", + "spell": "dongbaoqu", + "easy_spell": "dbq", + "city_id": "175" + }, + { + "district_id": "1576", + "district_name": "掇刀区", + "spell": "duodaoqu", + "easy_spell": "ddq", + "city_id": "175" + }, + { + "district_id": "1577", + "district_name": "京山县", + "spell": "jingshanxian", + "easy_spell": "jsx", + "city_id": "175" + }, + { + "district_id": "1578", + "district_name": "沙洋县", + "spell": "shayangxian", + "easy_spell": "syx", + "city_id": "175" + }, + { + "district_id": "1579", + "district_name": "钟祥市", + "spell": "zhongxiangshi", + "easy_spell": "zxs", + "city_id": "175" + }, + { + "district_id": "1580", + "district_name": "孝南区", + "spell": "xiaonanqu", + "easy_spell": "xnq", + "city_id": "176" + }, + { + "district_id": "1581", + "district_name": "孝昌县", + "spell": "xiaochangxian", + "easy_spell": "xcx", + "city_id": "176" + }, + { + "district_id": "1582", + "district_name": "大悟县", + "spell": "dawuxian", + "easy_spell": "dwx", + "city_id": "176" + }, + { + "district_id": "1583", + "district_name": "云梦县", + "spell": "yunmengxian", + "easy_spell": "ymx", + "city_id": "176" + }, + { + "district_id": "1584", + "district_name": "应城市", + "spell": "yingchengshi", + "easy_spell": "ycs", + "city_id": "176" + }, + { + "district_id": "1585", + "district_name": "安陆市", + "spell": "anlushi", + "easy_spell": "als", + "city_id": "176" + }, + { + "district_id": "1586", + "district_name": "汉川市", + "spell": "hanchuanshi", + "easy_spell": "hcs", + "city_id": "176" + }, + { + "district_id": "1587", + "district_name": "沙市区", + "spell": "shashiqu", + "easy_spell": "ssq", + "city_id": "177" + }, + { + "district_id": "1588", + "district_name": "荆州区", + "spell": "jingzhouqu", + "easy_spell": "jzq", + "city_id": "177" + }, + { + "district_id": "1589", + "district_name": "公安县", + "spell": "gonganxian", + "easy_spell": "gax", + "city_id": "177" + }, + { + "district_id": "1590", + "district_name": "监利县", + "spell": "jianlixian", + "easy_spell": "jlx", + "city_id": "177" + }, + { + "district_id": "1591", + "district_name": "江陵县", + "spell": "jianglingxian", + "easy_spell": "jlx", + "city_id": "177" + }, + { + "district_id": "1592", + "district_name": "石首市", + "spell": "shishoushi", + "easy_spell": "sss", + "city_id": "177" + }, + { + "district_id": "1593", + "district_name": "洪湖市", + "spell": "honghushi", + "easy_spell": "hhs", + "city_id": "177" + }, + { + "district_id": "1594", + "district_name": "松滋市", + "spell": "songzishi", + "easy_spell": "szs", + "city_id": "177" + }, + { + "district_id": "1595", + "district_name": "黄州区", + "spell": "huangzhouqu", + "easy_spell": "hzq", + "city_id": "178" + }, + { + "district_id": "1596", + "district_name": "团风县", + "spell": "tuanfengxian", + "easy_spell": "tfx", + "city_id": "178" + }, + { + "district_id": "1597", + "district_name": "红安县", + "spell": "honganxian", + "easy_spell": "hax", + "city_id": "178" + }, + { + "district_id": "1598", + "district_name": "罗田县", + "spell": "luotianxian", + "easy_spell": "ltx", + "city_id": "178" + }, + { + "district_id": "1599", + "district_name": "英山县", + "spell": "yingshanxian", + "easy_spell": "ysx", + "city_id": "178" + }, + { + "district_id": "1600", + "district_name": "浠水县", + "spell": "zuoshuixian", + "easy_spell": "zsx", + "city_id": "178" + }, + { + "district_id": "1601", + "district_name": "蕲春县", + "spell": "zuochunxian", + "easy_spell": "zcx", + "city_id": "178" + }, + { + "district_id": "1602", + "district_name": "黄梅县", + "spell": "huangmeixian", + "easy_spell": "hmx", + "city_id": "178" + }, + { + "district_id": "1603", + "district_name": "麻城市", + "spell": "machengshi", + "easy_spell": "mcs", + "city_id": "178" + }, + { + "district_id": "1604", + "district_name": "武穴市", + "spell": "wuxueshi", + "easy_spell": "wxs", + "city_id": "178" + }, + { + "district_id": "1605", + "district_name": "咸安区", + "spell": "xiananqu", + "easy_spell": "xaq", + "city_id": "179" + }, + { + "district_id": "1606", + "district_name": "嘉鱼县", + "spell": "jiayuxian", + "easy_spell": "jyx", + "city_id": "179" + }, + { + "district_id": "1607", + "district_name": "通城县", + "spell": "tongchengxian", + "easy_spell": "tcx", + "city_id": "179" + }, + { + "district_id": "1608", + "district_name": "崇阳县", + "spell": "chongyangxian", + "easy_spell": "cyx", + "city_id": "179" + }, + { + "district_id": "1609", + "district_name": "通山县", + "spell": "tongshanxian", + "easy_spell": "tsx", + "city_id": "179" + }, + { + "district_id": "1610", + "district_name": "赤壁市", + "spell": "chibishi", + "easy_spell": "cbs", + "city_id": "179" + }, + { + "district_id": "1611", + "district_name": "曾都区", + "spell": "zengduqu", + "easy_spell": "zdq", + "city_id": "180" + }, + { + "district_id": "1612", + "district_name": "广水市", + "spell": "guangshuishi", + "easy_spell": "gss", + "city_id": "180" + }, + { + "district_id": "1613", + "district_name": "恩施市", + "spell": "enshishi", + "easy_spell": "ess", + "city_id": "181" + }, + { + "district_id": "1614", + "district_name": "利川市", + "spell": "lichuanshi", + "easy_spell": "lcs", + "city_id": "181" + }, + { + "district_id": "1615", + "district_name": "建始县", + "spell": "jianshixian", + "easy_spell": "jsx", + "city_id": "181" + }, + { + "district_id": "1616", + "district_name": "巴东县", + "spell": "badongxian", + "easy_spell": "bdx", + "city_id": "181" + }, + { + "district_id": "1617", + "district_name": "宣恩县", + "spell": "xuanenxian", + "easy_spell": "xex", + "city_id": "181" + }, + { + "district_id": "1618", + "district_name": "咸丰县", + "spell": "xianfengxian", + "easy_spell": "xfx", + "city_id": "181" + }, + { + "district_id": "1619", + "district_name": "来凤县", + "spell": "laifengxian", + "easy_spell": "lfx", + "city_id": "181" + }, + { + "district_id": "1620", + "district_name": "鹤峰县", + "spell": "hefengxian", + "easy_spell": "hfx", + "city_id": "181" + }, + { + "district_id": "1621", + "district_name": "仙桃市", + "spell": "xiantaoshi", + "easy_spell": "xts", + "city_id": "182" + }, + { + "district_id": "1622", + "district_name": "潜江市", + "spell": "qianjiangshi", + "easy_spell": "qjs", + "city_id": "182" + }, + { + "district_id": "1623", + "district_name": "天门市", + "spell": "tianmenshi", + "easy_spell": "tms", + "city_id": "182" + }, + { + "district_id": "1624", + "district_name": "神农架林区", + "spell": "shennongjialinqu", + "easy_spell": "snjlq", + "city_id": "182" + }, + { + "district_id": "1625", + "district_name": "芙蓉区", + "spell": "zuorongqu", + "easy_spell": "zrq", + "city_id": "183" + }, + { + "district_id": "1626", + "district_name": "天心区", + "spell": "tianxinqu", + "easy_spell": "txq", + "city_id": "183" + }, + { + "district_id": "1627", + "district_name": "岳麓区", + "spell": "yueluqu", + "easy_spell": "ylq", + "city_id": "183" + }, + { + "district_id": "1628", + "district_name": "开福区", + "spell": "kaifuqu", + "easy_spell": "kfq", + "city_id": "183" + }, + { + "district_id": "1629", + "district_name": "雨花区", + "spell": "yuhuaqu", + "easy_spell": "yhq", + "city_id": "183" + }, + { + "district_id": "1630", + "district_name": "长沙县", + "spell": "changshaxian", + "easy_spell": "csx", + "city_id": "183" + }, + { + "district_id": "1631", + "district_name": "望城县", + "spell": "wangchengxian", + "easy_spell": "wcx", + "city_id": "183" + }, + { + "district_id": "1632", + "district_name": "宁乡县", + "spell": "ningxiangxian", + "easy_spell": "nxx", + "city_id": "183" + }, + { + "district_id": "1633", + "district_name": "浏阳市", + "spell": "zuoyangshi", + "easy_spell": "zys", + "city_id": "183" + }, + { + "district_id": "1634", + "district_name": "荷塘区", + "spell": "hetangqu", + "easy_spell": "htq", + "city_id": "184" + }, + { + "district_id": "1635", + "district_name": "芦淞区", + "spell": "luzuoqu", + "easy_spell": "lzq", + "city_id": "184" + }, + { + "district_id": "1636", + "district_name": "石峰区", + "spell": "shifengqu", + "easy_spell": "sfq", + "city_id": "184" + }, + { + "district_id": "1637", + "district_name": "天元区", + "spell": "tianyuanqu", + "easy_spell": "tyq", + "city_id": "184" + }, + { + "district_id": "1638", + "district_name": "株洲县", + "spell": "zhuzhouxian", + "easy_spell": "zzx", + "city_id": "184" + }, + { + "district_id": "1639", + "district_name": "攸县", + "spell": "zuoxian", + "easy_spell": "zx", + "city_id": "184" + }, + { + "district_id": "1640", + "district_name": "茶陵县", + "spell": "chalingxian", + "easy_spell": "clx", + "city_id": "184" + }, + { + "district_id": "1641", + "district_name": "炎陵县", + "spell": "yanlingxian", + "easy_spell": "ylx", + "city_id": "184" + }, + { + "district_id": "1642", + "district_name": "醴陵市", + "spell": "zuolingshi", + "easy_spell": "zls", + "city_id": "184" + }, + { + "district_id": "1643", + "district_name": "雨湖区", + "spell": "yuhuqu", + "easy_spell": "yhq", + "city_id": "185" + }, + { + "district_id": "1644", + "district_name": "岳塘区", + "spell": "yuetangqu", + "easy_spell": "ytq", + "city_id": "185" + }, + { + "district_id": "1645", + "district_name": "湘潭县", + "spell": "xiangtanxian", + "easy_spell": "xtx", + "city_id": "185" + }, + { + "district_id": "1646", + "district_name": "湘乡市", + "spell": "xiangxiangshi", + "easy_spell": "xxs", + "city_id": "185" + }, + { + "district_id": "1647", + "district_name": "韶山市", + "spell": "shaoshanshi", + "easy_spell": "sss", + "city_id": "185" + }, + { + "district_id": "1648", + "district_name": "珠晖区", + "spell": "zhuzuoqu", + "easy_spell": "zzq", + "city_id": "186" + }, + { + "district_id": "1649", + "district_name": "雁峰区", + "spell": "yanfengqu", + "easy_spell": "yfq", + "city_id": "186" + }, + { + "district_id": "1650", + "district_name": "石鼓区", + "spell": "shiguqu", + "easy_spell": "sgq", + "city_id": "186" + }, + { + "district_id": "1651", + "district_name": "蒸湘区", + "spell": "zhengxiangqu", + "easy_spell": "zxq", + "city_id": "186" + }, + { + "district_id": "1652", + "district_name": "南岳区", + "spell": "nanyuequ", + "easy_spell": "nyq", + "city_id": "186" + }, + { + "district_id": "1653", + "district_name": "衡阳县", + "spell": "hengyangxian", + "easy_spell": "hyx", + "city_id": "186" + }, + { + "district_id": "1654", + "district_name": "衡南县", + "spell": "hengnanxian", + "easy_spell": "hnx", + "city_id": "186" + }, + { + "district_id": "1655", + "district_name": "衡山县", + "spell": "hengshanxian", + "easy_spell": "hsx", + "city_id": "186" + }, + { + "district_id": "1656", + "district_name": "衡东县", + "spell": "hengdongxian", + "easy_spell": "hdx", + "city_id": "186" + }, + { + "district_id": "1657", + "district_name": "祁东县", + "spell": "qidongxian", + "easy_spell": "qdx", + "city_id": "186" + }, + { + "district_id": "1658", + "district_name": "耒阳市", + "spell": "zuoyangshi", + "easy_spell": "zys", + "city_id": "186" + }, + { + "district_id": "1659", + "district_name": "常宁市", + "spell": "changningshi", + "easy_spell": "cns", + "city_id": "186" + }, + { + "district_id": "1660", + "district_name": "双清区", + "spell": "shuangqingqu", + "easy_spell": "sqq", + "city_id": "187" + }, + { + "district_id": "1661", + "district_name": "大祥区", + "spell": "daxiangqu", + "easy_spell": "dxq", + "city_id": "187" + }, + { + "district_id": "1662", + "district_name": "北塔区", + "spell": "beitaqu", + "easy_spell": "btq", + "city_id": "187" + }, + { + "district_id": "1663", + "district_name": "邵东县", + "spell": "shaodongxian", + "easy_spell": "sdx", + "city_id": "187" + }, + { + "district_id": "1664", + "district_name": "新邵县", + "spell": "xinshaoxian", + "easy_spell": "xsx", + "city_id": "187" + }, + { + "district_id": "1665", + "district_name": "邵阳县", + "spell": "shaoyangxian", + "easy_spell": "syx", + "city_id": "187" + }, + { + "district_id": "1666", + "district_name": "隆回县", + "spell": "longhuixian", + "easy_spell": "lhx", + "city_id": "187" + }, + { + "district_id": "1667", + "district_name": "洞口县", + "spell": "dongkouxian", + "easy_spell": "dkx", + "city_id": "187" + }, + { + "district_id": "1668", + "district_name": "绥宁县", + "spell": "suiningxian", + "easy_spell": "snx", + "city_id": "187" + }, + { + "district_id": "1669", + "district_name": "新宁县", + "spell": "xinningxian", + "easy_spell": "xnx", + "city_id": "187" + }, + { + "district_id": "1670", + "district_name": "城步苗族自治县", + "spell": "chengbumiaozuzizhixian", + "easy_spell": "cbmzzzx", + "city_id": "187" + }, + { + "district_id": "1671", + "district_name": "武冈市", + "spell": "wugangshi", + "easy_spell": "wgs", + "city_id": "187" + }, + { + "district_id": "1672", + "district_name": "岳阳楼区", + "spell": "yueyanglouqu", + "easy_spell": "yylq", + "city_id": "188" + }, + { + "district_id": "1673", + "district_name": "云溪区", + "spell": "yunxiqu", + "easy_spell": "yxq", + "city_id": "188" + }, + { + "district_id": "1674", + "district_name": "君山区", + "spell": "junshanqu", + "easy_spell": "jsq", + "city_id": "188" + }, + { + "district_id": "1675", + "district_name": "岳阳县", + "spell": "yueyangxian", + "easy_spell": "yyx", + "city_id": "188" + }, + { + "district_id": "1676", + "district_name": "华容县", + "spell": "huarongxian", + "easy_spell": "hrx", + "city_id": "188" + }, + { + "district_id": "1677", + "district_name": "湘阴县", + "spell": "xiangyinxian", + "easy_spell": "xyx", + "city_id": "188" + }, + { + "district_id": "1678", + "district_name": "平江县", + "spell": "pingjiangxian", + "easy_spell": "pjx", + "city_id": "188" + }, + { + "district_id": "1679", + "district_name": "汨罗市", + "spell": "zuoluoshi", + "easy_spell": "zls", + "city_id": "188" + }, + { + "district_id": "1680", + "district_name": "临湘市", + "spell": "linxiangshi", + "easy_spell": "lxs", + "city_id": "188" + }, + { + "district_id": "1681", + "district_name": "武陵区", + "spell": "wulingqu", + "easy_spell": "wlq", + "city_id": "189" + }, + { + "district_id": "1682", + "district_name": "鼎城区", + "spell": "dingchengqu", + "easy_spell": "dcq", + "city_id": "189" + }, + { + "district_id": "1683", + "district_name": "安乡县", + "spell": "anxiangxian", + "easy_spell": "axx", + "city_id": "189" + }, + { + "district_id": "1684", + "district_name": "汉寿县", + "spell": "hanshouxian", + "easy_spell": "hsx", + "city_id": "189" + }, + { + "district_id": "1685", + "district_name": "澧县", + "spell": "zuoxian", + "easy_spell": "zx", + "city_id": "189" + }, + { + "district_id": "1686", + "district_name": "临澧县", + "spell": "linzuoxian", + "easy_spell": "lzx", + "city_id": "189" + }, + { + "district_id": "1687", + "district_name": "桃源县", + "spell": "taoyuanxian", + "easy_spell": "tyx", + "city_id": "189" + }, + { + "district_id": "1688", + "district_name": "石门县", + "spell": "shimenxian", + "easy_spell": "smx", + "city_id": "189" + }, + { + "district_id": "1689", + "district_name": "津市市", + "spell": "jinshishi", + "easy_spell": "jss", + "city_id": "189" + }, + { + "district_id": "1690", + "district_name": "永定区", + "spell": "yongdingqu", + "easy_spell": "ydq", + "city_id": "190" + }, + { + "district_id": "1691", + "district_name": "武陵源区", + "spell": "wulingyuanqu", + "easy_spell": "wlyq", + "city_id": "190" + }, + { + "district_id": "1692", + "district_name": "慈利县", + "spell": "cilixian", + "easy_spell": "clx", + "city_id": "190" + }, + { + "district_id": "1693", + "district_name": "桑植县", + "spell": "sangzhixian", + "easy_spell": "szx", + "city_id": "190" + }, + { + "district_id": "1694", + "district_name": "资阳区", + "spell": "ziyangqu", + "easy_spell": "zyq", + "city_id": "191" + }, + { + "district_id": "1695", + "district_name": "赫山区", + "spell": "heshanqu", + "easy_spell": "hsq", + "city_id": "191" + }, + { + "district_id": "1696", + "district_name": "南县", + "spell": "nanxian", + "easy_spell": "nx", + "city_id": "191" + }, + { + "district_id": "1697", + "district_name": "桃江县", + "spell": "taojiangxian", + "easy_spell": "tjx", + "city_id": "191" + }, + { + "district_id": "1698", + "district_name": "安化县", + "spell": "anhuaxian", + "easy_spell": "ahx", + "city_id": "191" + }, + { + "district_id": "1699", + "district_name": "沅江市", + "spell": "zuojiangshi", + "easy_spell": "zjs", + "city_id": "191" + }, + { + "district_id": "1700", + "district_name": "北湖区", + "spell": "beihuqu", + "easy_spell": "bhq", + "city_id": "192" + }, + { + "district_id": "1701", + "district_name": "苏仙区", + "spell": "suxianqu", + "easy_spell": "sxq", + "city_id": "192" + }, + { + "district_id": "1702", + "district_name": "桂阳县", + "spell": "guiyangxian", + "easy_spell": "gyx", + "city_id": "192" + }, + { + "district_id": "1703", + "district_name": "宜章县", + "spell": "yizhangxian", + "easy_spell": "yzx", + "city_id": "192" + }, + { + "district_id": "1704", + "district_name": "永兴县", + "spell": "yongxingxian", + "easy_spell": "yxx", + "city_id": "192" + }, + { + "district_id": "1705", + "district_name": "嘉禾县", + "spell": "jiahexian", + "easy_spell": "jhx", + "city_id": "192" + }, + { + "district_id": "1706", + "district_name": "临武县", + "spell": "linwuxian", + "easy_spell": "lwx", + "city_id": "192" + }, + { + "district_id": "1707", + "district_name": "汝城县", + "spell": "ruchengxian", + "easy_spell": "rcx", + "city_id": "192" + }, + { + "district_id": "1708", + "district_name": "桂东县", + "spell": "guidongxian", + "easy_spell": "gdx", + "city_id": "192" + }, + { + "district_id": "1709", + "district_name": "安仁县", + "spell": "anrenxian", + "easy_spell": "arx", + "city_id": "192" + }, + { + "district_id": "1710", + "district_name": "资兴市", + "spell": "zixingshi", + "easy_spell": "zxs", + "city_id": "192" + }, + { + "district_id": "1711", + "district_name": "芝山区", + "spell": "zhishanqu", + "easy_spell": "zsq", + "city_id": "193" + }, + { + "district_id": "1712", + "district_name": "冷水滩区", + "spell": "lengshuitanqu", + "easy_spell": "lstq", + "city_id": "193" + }, + { + "district_id": "1713", + "district_name": "祁阳县", + "spell": "qiyangxian", + "easy_spell": "qyx", + "city_id": "193" + }, + { + "district_id": "1714", + "district_name": "东安县", + "spell": "donganxian", + "easy_spell": "dax", + "city_id": "193" + }, + { + "district_id": "1715", + "district_name": "双牌县", + "spell": "shuangpaixian", + "easy_spell": "spx", + "city_id": "193" + }, + { + "district_id": "1716", + "district_name": "道县", + "spell": "daoxian", + "easy_spell": "dx", + "city_id": "193" + }, + { + "district_id": "1717", + "district_name": "江永县", + "spell": "jiangyongxian", + "easy_spell": "jyx", + "city_id": "193" + }, + { + "district_id": "1718", + "district_name": "宁远县", + "spell": "ningyuanxian", + "easy_spell": "nyx", + "city_id": "193" + }, + { + "district_id": "1719", + "district_name": "蓝山县", + "spell": "lanshanxian", + "easy_spell": "lsx", + "city_id": "193" + }, + { + "district_id": "1720", + "district_name": "新田县", + "spell": "xintianxian", + "easy_spell": "xtx", + "city_id": "193" + }, + { + "district_id": "1721", + "district_name": "江华瑶族自治县", + "spell": "jianghuayaozuzizhixian", + "easy_spell": "jhyzzzx", + "city_id": "193" + }, + { + "district_id": "1722", + "district_name": "鹤城区", + "spell": "hechengqu", + "easy_spell": "hcq", + "city_id": "194" + }, + { + "district_id": "1723", + "district_name": "中方县", + "spell": "zhongfangxian", + "easy_spell": "zfx", + "city_id": "194" + }, + { + "district_id": "1724", + "district_name": "沅陵县", + "spell": "zuolingxian", + "easy_spell": "zlx", + "city_id": "194" + }, + { + "district_id": "1725", + "district_name": "辰溪县", + "spell": "chenxixian", + "easy_spell": "cxx", + "city_id": "194" + }, + { + "district_id": "1726", + "district_name": "溆浦县", + "spell": "zuopuxian", + "easy_spell": "zpx", + "city_id": "194" + }, + { + "district_id": "1727", + "district_name": "会同县", + "spell": "huitongxian", + "easy_spell": "htx", + "city_id": "194" + }, + { + "district_id": "1728", + "district_name": "麻阳苗族自治县", + "spell": "mayangmiaozuzizhixian", + "easy_spell": "mymzzzx", + "city_id": "194" + }, + { + "district_id": "1729", + "district_name": "新晃侗族自治县", + "spell": "xinhuangdongzuzizhixian", + "easy_spell": "xhdzzzx", + "city_id": "194" + }, + { + "district_id": "1730", + "district_name": "芷江侗族自治县", + "spell": "zuojiangdongzuzizhixian", + "easy_spell": "zjdzzzx", + "city_id": "194" + }, + { + "district_id": "1731", + "district_name": "靖州苗族侗族自治县", + "spell": "jingzhoumiaozudongzuzizhixian", + "easy_spell": "jzmzdzzzx", + "city_id": "194" + }, + { + "district_id": "1732", + "district_name": "通道侗族自治县", + "spell": "tongdaodongzuzizhixian", + "easy_spell": "tddzzzx", + "city_id": "194" + }, + { + "district_id": "1733", + "district_name": "洪江市", + "spell": "hongjiangshi", + "easy_spell": "hjs", + "city_id": "194" + }, + { + "district_id": "1734", + "district_name": "娄星区", + "spell": "louxingqu", + "easy_spell": "lxq", + "city_id": "195" + }, + { + "district_id": "1735", + "district_name": "双峰县", + "spell": "shuangfengxian", + "easy_spell": "sfx", + "city_id": "195" + }, + { + "district_id": "1736", + "district_name": "新化县", + "spell": "xinhuaxian", + "easy_spell": "xhx", + "city_id": "195" + }, + { + "district_id": "1737", + "district_name": "冷水江市", + "spell": "lengshuijiangshi", + "easy_spell": "lsjs", + "city_id": "195" + }, + { + "district_id": "1738", + "district_name": "涟源市", + "spell": "lianyuanshi", + "easy_spell": "lys", + "city_id": "195" + }, + { + "district_id": "1739", + "district_name": "吉首市", + "spell": "jishoushi", + "easy_spell": "jss", + "city_id": "196" + }, + { + "district_id": "1740", + "district_name": "泸溪县", + "spell": "zuoxixian", + "easy_spell": "zxx", + "city_id": "196" + }, + { + "district_id": "1741", + "district_name": "凤凰县", + "spell": "fenghuangxian", + "easy_spell": "fhx", + "city_id": "196" + }, + { + "district_id": "1742", + "district_name": "花垣县", + "spell": "huayuanxian", + "easy_spell": "hyx", + "city_id": "196" + }, + { + "district_id": "1743", + "district_name": "保靖县", + "spell": "baojingxian", + "easy_spell": "bjx", + "city_id": "196" + }, + { + "district_id": "1744", + "district_name": "古丈县", + "spell": "guzhangxian", + "easy_spell": "gzx", + "city_id": "196" + }, + { + "district_id": "1745", + "district_name": "永顺县", + "spell": "yongshunxian", + "easy_spell": "ysx", + "city_id": "196" + }, + { + "district_id": "1746", + "district_name": "龙山县", + "spell": "longshanxian", + "easy_spell": "lsx", + "city_id": "196" + }, + { + "district_id": "1747", + "district_name": "东山区", + "spell": "dongshanqu", + "easy_spell": "dsq", + "city_id": "197" + }, + { + "district_id": "1748", + "district_name": "荔湾区", + "spell": "liwanqu", + "easy_spell": "lwq", + "city_id": "197" + }, + { + "district_id": "1749", + "district_name": "越秀区", + "spell": "yuexiuqu", + "easy_spell": "yxq", + "city_id": "197" + }, + { + "district_id": "1750", + "district_name": "海珠区", + "spell": "haizhuqu", + "easy_spell": "hzq", + "city_id": "197" + }, + { + "district_id": "1751", + "district_name": "天河区", + "spell": "tianhequ", + "easy_spell": "thq", + "city_id": "197" + }, + { + "district_id": "1752", + "district_name": "芳村区", + "spell": "fangcunqu", + "easy_spell": "fcq", + "city_id": "197" + }, + { + "district_id": "1753", + "district_name": "白云区", + "spell": "baiyunqu", + "easy_spell": "byq", + "city_id": "197" + }, + { + "district_id": "1754", + "district_name": "黄埔区", + "spell": "huangpuqu", + "easy_spell": "hpq", + "city_id": "197" + }, + { + "district_id": "1755", + "district_name": "番禺区", + "spell": "fanzuoqu", + "easy_spell": "fzq", + "city_id": "197" + }, + { + "district_id": "1756", + "district_name": "花都区", + "spell": "huaduqu", + "easy_spell": "hdq", + "city_id": "197" + }, + { + "district_id": "1757", + "district_name": "增城市", + "spell": "zengchengshi", + "easy_spell": "zcs", + "city_id": "197" + }, + { + "district_id": "1758", + "district_name": "从化市", + "spell": "conghuashi", + "easy_spell": "chs", + "city_id": "197" + }, + { + "district_id": "1759", + "district_name": "武江区", + "spell": "wujiangqu", + "easy_spell": "wjq", + "city_id": "198" + }, + { + "district_id": "1760", + "district_name": "浈江区", + "spell": "zuojiangqu", + "easy_spell": "zjq", + "city_id": "198" + }, + { + "district_id": "1761", + "district_name": "曲江区", + "spell": "qujiangqu", + "easy_spell": "qjq", + "city_id": "198" + }, + { + "district_id": "1762", + "district_name": "始兴县", + "spell": "shixingxian", + "easy_spell": "sxx", + "city_id": "198" + }, + { + "district_id": "1763", + "district_name": "仁化县", + "spell": "renhuaxian", + "easy_spell": "rhx", + "city_id": "198" + }, + { + "district_id": "1764", + "district_name": "翁源县", + "spell": "wengyuanxian", + "easy_spell": "wyx", + "city_id": "198" + }, + { + "district_id": "1765", + "district_name": "乳源瑶族自治县", + "spell": "ruyuanyaozuzizhixian", + "easy_spell": "ryyzzzx", + "city_id": "198" + }, + { + "district_id": "1766", + "district_name": "新丰县", + "spell": "xinfengxian", + "easy_spell": "xfx", + "city_id": "198" + }, + { + "district_id": "1767", + "district_name": "乐昌市", + "spell": "lechangshi", + "easy_spell": "lcs", + "city_id": "198" + }, + { + "district_id": "1768", + "district_name": "南雄市", + "spell": "nanxiongshi", + "easy_spell": "nxs", + "city_id": "198" + }, + { + "district_id": "1769", + "district_name": "罗湖区", + "spell": "luohuqu", + "easy_spell": "lhq", + "city_id": "199" + }, + { + "district_id": "1770", + "district_name": "福田区", + "spell": "futianqu", + "easy_spell": "ftq", + "city_id": "199" + }, + { + "district_id": "1771", + "district_name": "南山区", + "spell": "nanshanqu", + "easy_spell": "nsq", + "city_id": "199" + }, + { + "district_id": "1772", + "district_name": "宝安区", + "spell": "baoanqu", + "easy_spell": "baq", + "city_id": "199" + }, + { + "district_id": "1773", + "district_name": "龙岗区", + "spell": "longgangqu", + "easy_spell": "lgq", + "city_id": "199" + }, + { + "district_id": "1774", + "district_name": "盐田区", + "spell": "yantianqu", + "easy_spell": "ytq", + "city_id": "199" + }, + { + "district_id": "1775", + "district_name": "香洲区", + "spell": "xiangzhouqu", + "easy_spell": "xzq", + "city_id": "200" + }, + { + "district_id": "1776", + "district_name": "斗门区", + "spell": "doumenqu", + "easy_spell": "dmq", + "city_id": "200" + }, + { + "district_id": "1777", + "district_name": "金湾区", + "spell": "jinwanqu", + "easy_spell": "jwq", + "city_id": "200" + }, + { + "district_id": "1778", + "district_name": "龙湖区", + "spell": "longhuqu", + "easy_spell": "lhq", + "city_id": "201" + }, + { + "district_id": "1779", + "district_name": "金平区", + "spell": "jinpingqu", + "easy_spell": "jpq", + "city_id": "201" + }, + { + "district_id": "1780", + "district_name": "濠江区", + "spell": "zuojiangqu", + "easy_spell": "zjq", + "city_id": "201" + }, + { + "district_id": "1781", + "district_name": "潮阳区", + "spell": "chaoyangqu", + "easy_spell": "cyq", + "city_id": "201" + }, + { + "district_id": "1782", + "district_name": "潮南区", + "spell": "chaonanqu", + "easy_spell": "cnq", + "city_id": "201" + }, + { + "district_id": "1783", + "district_name": "澄海区", + "spell": "chenghaiqu", + "easy_spell": "chq", + "city_id": "201" + }, + { + "district_id": "1784", + "district_name": "南澳县", + "spell": "nanaoxian", + "easy_spell": "nax", + "city_id": "201" + }, + { + "district_id": "1785", + "district_name": "禅城区", + "spell": "zuochengqu", + "easy_spell": "zcq", + "city_id": "202" + }, + { + "district_id": "1786", + "district_name": "南海区", + "spell": "nanhaiqu", + "easy_spell": "nhq", + "city_id": "202" + }, + { + "district_id": "1787", + "district_name": "顺德区", + "spell": "shundequ", + "easy_spell": "sdq", + "city_id": "202" + }, + { + "district_id": "1788", + "district_name": "三水区", + "spell": "sanshuiqu", + "easy_spell": "ssq", + "city_id": "202" + }, + { + "district_id": "1789", + "district_name": "高明区", + "spell": "gaomingqu", + "easy_spell": "gmq", + "city_id": "202" + }, + { + "district_id": "1790", + "district_name": "蓬江区", + "spell": "pengjiangqu", + "easy_spell": "pjq", + "city_id": "203" + }, + { + "district_id": "1791", + "district_name": "江海区", + "spell": "jianghaiqu", + "easy_spell": "jhq", + "city_id": "203" + }, + { + "district_id": "1792", + "district_name": "新会区", + "spell": "xinhuiqu", + "easy_spell": "xhq", + "city_id": "203" + }, + { + "district_id": "1793", + "district_name": "台山市", + "spell": "taishanshi", + "easy_spell": "tss", + "city_id": "203" + }, + { + "district_id": "1794", + "district_name": "开平市", + "spell": "kaipingshi", + "easy_spell": "kps", + "city_id": "203" + }, + { + "district_id": "1795", + "district_name": "鹤山市", + "spell": "heshanshi", + "easy_spell": "hss", + "city_id": "203" + }, + { + "district_id": "1796", + "district_name": "恩平市", + "spell": "enpingshi", + "easy_spell": "eps", + "city_id": "203" + }, + { + "district_id": "1797", + "district_name": "赤坎区", + "spell": "chikanqu", + "easy_spell": "ckq", + "city_id": "204" + }, + { + "district_id": "1798", + "district_name": "霞山区", + "spell": "xiashanqu", + "easy_spell": "xsq", + "city_id": "204" + }, + { + "district_id": "1799", + "district_name": "坡头区", + "spell": "potouqu", + "easy_spell": "ptq", + "city_id": "204" + }, + { + "district_id": "1800", + "district_name": "麻章区", + "spell": "mazhangqu", + "easy_spell": "mzq", + "city_id": "204" + }, + { + "district_id": "1801", + "district_name": "遂溪县", + "spell": "suixixian", + "easy_spell": "sxx", + "city_id": "204" + }, + { + "district_id": "1802", + "district_name": "徐闻县", + "spell": "xuwenxian", + "easy_spell": "xwx", + "city_id": "204" + }, + { + "district_id": "1803", + "district_name": "廉江市", + "spell": "lianjiangshi", + "easy_spell": "ljs", + "city_id": "204" + }, + { + "district_id": "1804", + "district_name": "雷州市", + "spell": "leizhoushi", + "easy_spell": "lzs", + "city_id": "204" + }, + { + "district_id": "1805", + "district_name": "吴川市", + "spell": "wuchuanshi", + "easy_spell": "wcs", + "city_id": "204" + }, + { + "district_id": "1806", + "district_name": "茂南区", + "spell": "maonanqu", + "easy_spell": "mnq", + "city_id": "205" + }, + { + "district_id": "1807", + "district_name": "茂港区", + "spell": "maogangqu", + "easy_spell": "mgq", + "city_id": "205" + }, + { + "district_id": "1808", + "district_name": "电白县", + "spell": "dianbaixian", + "easy_spell": "dbx", + "city_id": "205" + }, + { + "district_id": "1809", + "district_name": "高州市", + "spell": "gaozhoushi", + "easy_spell": "gzs", + "city_id": "205" + }, + { + "district_id": "1810", + "district_name": "化州市", + "spell": "huazhoushi", + "easy_spell": "hzs", + "city_id": "205" + }, + { + "district_id": "1811", + "district_name": "信宜市", + "spell": "xinyishi", + "easy_spell": "xys", + "city_id": "205" + }, + { + "district_id": "1812", + "district_name": "端州区", + "spell": "duanzhouqu", + "easy_spell": "dzq", + "city_id": "206" + }, + { + "district_id": "1813", + "district_name": "鼎湖区", + "spell": "dinghuqu", + "easy_spell": "dhq", + "city_id": "206" + }, + { + "district_id": "1814", + "district_name": "广宁县", + "spell": "guangningxian", + "easy_spell": "gnx", + "city_id": "206" + }, + { + "district_id": "1815", + "district_name": "怀集县", + "spell": "huaijixian", + "easy_spell": "hjx", + "city_id": "206" + }, + { + "district_id": "1816", + "district_name": "封开县", + "spell": "fengkaixian", + "easy_spell": "fkx", + "city_id": "206" + }, + { + "district_id": "1817", + "district_name": "德庆县", + "spell": "deqingxian", + "easy_spell": "dqx", + "city_id": "206" + }, + { + "district_id": "1818", + "district_name": "高要市", + "spell": "gaoyaoshi", + "easy_spell": "gys", + "city_id": "206" + }, + { + "district_id": "1819", + "district_name": "四会市", + "spell": "sihuishi", + "easy_spell": "shs", + "city_id": "206" + }, + { + "district_id": "1820", + "district_name": "惠城区", + "spell": "huichengqu", + "easy_spell": "hcq", + "city_id": "207" + }, + { + "district_id": "1821", + "district_name": "惠阳区", + "spell": "huiyangqu", + "easy_spell": "hyq", + "city_id": "207" + }, + { + "district_id": "1822", + "district_name": "博罗县", + "spell": "boluoxian", + "easy_spell": "blx", + "city_id": "207" + }, + { + "district_id": "1823", + "district_name": "惠东县", + "spell": "huidongxian", + "easy_spell": "hdx", + "city_id": "207" + }, + { + "district_id": "1824", + "district_name": "龙门县", + "spell": "longmenxian", + "easy_spell": "lmx", + "city_id": "207" + }, + { + "district_id": "1825", + "district_name": "梅江区", + "spell": "meijiangqu", + "easy_spell": "mjq", + "city_id": "208" + }, + { + "district_id": "1826", + "district_name": "梅县", + "spell": "meixian", + "easy_spell": "mx", + "city_id": "208" + }, + { + "district_id": "1827", + "district_name": "大埔县", + "spell": "dapuxian", + "easy_spell": "dpx", + "city_id": "208" + }, + { + "district_id": "1828", + "district_name": "丰顺县", + "spell": "fengshunxian", + "easy_spell": "fsx", + "city_id": "208" + }, + { + "district_id": "1829", + "district_name": "五华县", + "spell": "wuhuaxian", + "easy_spell": "whx", + "city_id": "208" + }, + { + "district_id": "1830", + "district_name": "平远县", + "spell": "pingyuanxian", + "easy_spell": "pyx", + "city_id": "208" + }, + { + "district_id": "1831", + "district_name": "蕉岭县", + "spell": "jiaolingxian", + "easy_spell": "jlx", + "city_id": "208" + }, + { + "district_id": "1832", + "district_name": "兴宁市", + "spell": "xingningshi", + "easy_spell": "xns", + "city_id": "208" + }, + { + "district_id": "1833", + "district_name": "城区", + "spell": "chengqu", + "easy_spell": "cq", + "city_id": "209" + }, + { + "district_id": "1834", + "district_name": "海丰县", + "spell": "haifengxian", + "easy_spell": "hfx", + "city_id": "209" + }, + { + "district_id": "1835", + "district_name": "陆河县", + "spell": "luhexian", + "easy_spell": "lhx", + "city_id": "209" + }, + { + "district_id": "1836", + "district_name": "陆丰市", + "spell": "lufengshi", + "easy_spell": "lfs", + "city_id": "209" + }, + { + "district_id": "1837", + "district_name": "源城区", + "spell": "yuanchengqu", + "easy_spell": "ycq", + "city_id": "210" + }, + { + "district_id": "1838", + "district_name": "紫金县", + "spell": "zijinxian", + "easy_spell": "zjx", + "city_id": "210" + }, + { + "district_id": "1839", + "district_name": "龙川县", + "spell": "longchuanxian", + "easy_spell": "lcx", + "city_id": "210" + }, + { + "district_id": "1840", + "district_name": "连平县", + "spell": "lianpingxian", + "easy_spell": "lpx", + "city_id": "210" + }, + { + "district_id": "1841", + "district_name": "和平县", + "spell": "hepingxian", + "easy_spell": "hpx", + "city_id": "210" + }, + { + "district_id": "1842", + "district_name": "东源县", + "spell": "dongyuanxian", + "easy_spell": "dyx", + "city_id": "210" + }, + { + "district_id": "1843", + "district_name": "江城区", + "spell": "jiangchengqu", + "easy_spell": "jcq", + "city_id": "211" + }, + { + "district_id": "1844", + "district_name": "阳西县", + "spell": "yangxixian", + "easy_spell": "yxx", + "city_id": "211" + }, + { + "district_id": "1845", + "district_name": "阳东县", + "spell": "yangdongxian", + "easy_spell": "ydx", + "city_id": "211" + }, + { + "district_id": "1846", + "district_name": "阳春市", + "spell": "yangchunshi", + "easy_spell": "ycs", + "city_id": "211" + }, + { + "district_id": "1847", + "district_name": "清城区", + "spell": "qingchengqu", + "easy_spell": "qcq", + "city_id": "212" + }, + { + "district_id": "1848", + "district_name": "佛冈县", + "spell": "fogangxian", + "easy_spell": "fgx", + "city_id": "212" + }, + { + "district_id": "1849", + "district_name": "阳山县", + "spell": "yangshanxian", + "easy_spell": "ysx", + "city_id": "212" + }, + { + "district_id": "1850", + "district_name": "连山壮族瑶族自治县", + "spell": "lianshanzhuangzuyaozuzizhixian", + "easy_spell": "lszzyzzzx", + "city_id": "212" + }, + { + "district_id": "1851", + "district_name": "连南瑶族自治县", + "spell": "liannanyaozuzizhixian", + "easy_spell": "lnyzzzx", + "city_id": "212" + }, + { + "district_id": "1852", + "district_name": "清新县", + "spell": "qingxinxian", + "easy_spell": "qxx", + "city_id": "212" + }, + { + "district_id": "1853", + "district_name": "英德市", + "spell": "yingdeshi", + "easy_spell": "yds", + "city_id": "212" + }, + { + "district_id": "1854", + "district_name": "连州市", + "spell": "lianzhoushi", + "easy_spell": "lzs", + "city_id": "212" + }, + { + "district_id": "1855", + "district_name": "湘桥区", + "spell": "xiangqiaoqu", + "easy_spell": "xqq", + "city_id": "215" + }, + { + "district_id": "1856", + "district_name": "潮安县", + "spell": "chaoanxian", + "easy_spell": "cax", + "city_id": "215" + }, + { + "district_id": "1857", + "district_name": "饶平县", + "spell": "raopingxian", + "easy_spell": "rpx", + "city_id": "215" + }, + { + "district_id": "1858", + "district_name": "榕城区", + "spell": "zuochengqu", + "easy_spell": "zcq", + "city_id": "216" + }, + { + "district_id": "1859", + "district_name": "揭东县", + "spell": "jiedongxian", + "easy_spell": "jdx", + "city_id": "216" + }, + { + "district_id": "1860", + "district_name": "揭西县", + "spell": "jiexixian", + "easy_spell": "jxx", + "city_id": "216" + }, + { + "district_id": "1861", + "district_name": "惠来县", + "spell": "huilaixian", + "easy_spell": "hlx", + "city_id": "216" + }, + { + "district_id": "1862", + "district_name": "普宁市", + "spell": "puningshi", + "easy_spell": "pns", + "city_id": "216" + }, + { + "district_id": "1863", + "district_name": "云城区", + "spell": "yunchengqu", + "easy_spell": "ycq", + "city_id": "217" + }, + { + "district_id": "1864", + "district_name": "新兴县", + "spell": "xinxingxian", + "easy_spell": "xxx", + "city_id": "217" + }, + { + "district_id": "1865", + "district_name": "郁南县", + "spell": "yunanxian", + "easy_spell": "ynx", + "city_id": "217" + }, + { + "district_id": "1866", + "district_name": "云安县", + "spell": "yunanxian", + "easy_spell": "yax", + "city_id": "217" + }, + { + "district_id": "1867", + "district_name": "罗定市", + "spell": "luodingshi", + "easy_spell": "lds", + "city_id": "217" + }, + { + "district_id": "1868", + "district_name": "兴宁区", + "spell": "xingningqu", + "easy_spell": "xnq", + "city_id": "218" + }, + { + "district_id": "1869", + "district_name": "青秀区", + "spell": "qingxiuqu", + "easy_spell": "qxq", + "city_id": "218" + }, + { + "district_id": "1870", + "district_name": "江南区", + "spell": "jiangnanqu", + "easy_spell": "jnq", + "city_id": "218" + }, + { + "district_id": "1871", + "district_name": "西乡塘区", + "spell": "xixiangtangqu", + "easy_spell": "xxtq", + "city_id": "218" + }, + { + "district_id": "1872", + "district_name": "良庆区", + "spell": "liangqingqu", + "easy_spell": "lqq", + "city_id": "218" + }, + { + "district_id": "1873", + "district_name": "邕宁区", + "spell": "zuoningqu", + "easy_spell": "znq", + "city_id": "218" + }, + { + "district_id": "1874", + "district_name": "武鸣县", + "spell": "wumingxian", + "easy_spell": "wmx", + "city_id": "218" + }, + { + "district_id": "1875", + "district_name": "隆安县", + "spell": "longanxian", + "easy_spell": "lax", + "city_id": "218" + }, + { + "district_id": "1876", + "district_name": "马山县", + "spell": "mashanxian", + "easy_spell": "msx", + "city_id": "218" + }, + { + "district_id": "1877", + "district_name": "上林县", + "spell": "shanglinxian", + "easy_spell": "slx", + "city_id": "218" + }, + { + "district_id": "1878", + "district_name": "宾阳县", + "spell": "binyangxian", + "easy_spell": "byx", + "city_id": "218" + }, + { + "district_id": "1879", + "district_name": "横县", + "spell": "hengxian", + "easy_spell": "hx", + "city_id": "218" + }, + { + "district_id": "1880", + "district_name": "城中区", + "spell": "chengzhongqu", + "easy_spell": "czq", + "city_id": "219" + }, + { + "district_id": "1881", + "district_name": "鱼峰区", + "spell": "yufengqu", + "easy_spell": "yfq", + "city_id": "219" + }, + { + "district_id": "1882", + "district_name": "柳南区", + "spell": "liunanqu", + "easy_spell": "lnq", + "city_id": "219" + }, + { + "district_id": "1883", + "district_name": "柳北区", + "spell": "liubeiqu", + "easy_spell": "lbq", + "city_id": "219" + }, + { + "district_id": "1884", + "district_name": "柳江县", + "spell": "liujiangxian", + "easy_spell": "ljx", + "city_id": "219" + }, + { + "district_id": "1885", + "district_name": "柳城县", + "spell": "liuchengxian", + "easy_spell": "lcx", + "city_id": "219" + }, + { + "district_id": "1886", + "district_name": "鹿寨县", + "spell": "luzhaixian", + "easy_spell": "lzx", + "city_id": "219" + }, + { + "district_id": "1887", + "district_name": "融安县", + "spell": "ronganxian", + "easy_spell": "rax", + "city_id": "219" + }, + { + "district_id": "1888", + "district_name": "融水苗族自治县", + "spell": "rongshuimiaozuzizhixian", + "easy_spell": "rsmzzzx", + "city_id": "219" + }, + { + "district_id": "1889", + "district_name": "三江侗族自治县", + "spell": "sanjiangdongzuzizhixian", + "easy_spell": "sjdzzzx", + "city_id": "219" + }, + { + "district_id": "1890", + "district_name": "秀峰区", + "spell": "xiufengqu", + "easy_spell": "xfq", + "city_id": "220" + }, + { + "district_id": "1891", + "district_name": "叠彩区", + "spell": "diecaiqu", + "easy_spell": "dcq", + "city_id": "220" + }, + { + "district_id": "1892", + "district_name": "象山区", + "spell": "xiangshanqu", + "easy_spell": "xsq", + "city_id": "220" + }, + { + "district_id": "1893", + "district_name": "七星区", + "spell": "qixingqu", + "easy_spell": "qxq", + "city_id": "220" + }, + { + "district_id": "1894", + "district_name": "雁山区", + "spell": "yanshanqu", + "easy_spell": "ysq", + "city_id": "220" + }, + { + "district_id": "1895", + "district_name": "阳朔县", + "spell": "yangshuoxian", + "easy_spell": "ysx", + "city_id": "220" + }, + { + "district_id": "1896", + "district_name": "临桂县", + "spell": "linguixian", + "easy_spell": "lgx", + "city_id": "220" + }, + { + "district_id": "1897", + "district_name": "灵川县", + "spell": "lingchuanxian", + "easy_spell": "lcx", + "city_id": "220" + }, + { + "district_id": "1898", + "district_name": "全州县", + "spell": "quanzhouxian", + "easy_spell": "qzx", + "city_id": "220" + }, + { + "district_id": "1899", + "district_name": "兴安县", + "spell": "xinganxian", + "easy_spell": "xax", + "city_id": "220" + }, + { + "district_id": "1900", + "district_name": "永福县", + "spell": "yongfuxian", + "easy_spell": "yfx", + "city_id": "220" + }, + { + "district_id": "1901", + "district_name": "灌阳县", + "spell": "guanyangxian", + "easy_spell": "gyx", + "city_id": "220" + }, + { + "district_id": "1902", + "district_name": "龙胜各族自治县", + "spell": "longshenggezuzizhixian", + "easy_spell": "lsgzzzx", + "city_id": "220" + }, + { + "district_id": "1903", + "district_name": "资源县", + "spell": "ziyuanxian", + "easy_spell": "zyx", + "city_id": "220" + }, + { + "district_id": "1904", + "district_name": "平乐县", + "spell": "pinglexian", + "easy_spell": "plx", + "city_id": "220" + }, + { + "district_id": "1905", + "district_name": "荔蒲县", + "spell": "lipuxian", + "easy_spell": "lpx", + "city_id": "220" + }, + { + "district_id": "1906", + "district_name": "恭城瑶族自治县", + "spell": "gongchengyaozuzizhixian", + "easy_spell": "gcyzzzx", + "city_id": "220" + }, + { + "district_id": "1907", + "district_name": "万秀区", + "spell": "wanxiuqu", + "easy_spell": "wxq", + "city_id": "221" + }, + { + "district_id": "1908", + "district_name": "蝶山区", + "spell": "dieshanqu", + "easy_spell": "dsq", + "city_id": "221" + }, + { + "district_id": "1909", + "district_name": "长洲区", + "spell": "changzhouqu", + "easy_spell": "czq", + "city_id": "221" + }, + { + "district_id": "1910", + "district_name": "苍梧县", + "spell": "cangwuxian", + "easy_spell": "cwx", + "city_id": "221" + }, + { + "district_id": "1911", + "district_name": "藤县", + "spell": "tengxian", + "easy_spell": "tx", + "city_id": "221" + }, + { + "district_id": "1912", + "district_name": "蒙山县", + "spell": "mengshanxian", + "easy_spell": "msx", + "city_id": "221" + }, + { + "district_id": "1913", + "district_name": "岑溪市", + "spell": "zuoxishi", + "easy_spell": "zxs", + "city_id": "221" + }, + { + "district_id": "1914", + "district_name": "海城区", + "spell": "haichengqu", + "easy_spell": "hcq", + "city_id": "222" + }, + { + "district_id": "1915", + "district_name": "银海区", + "spell": "yinhaiqu", + "easy_spell": "yhq", + "city_id": "222" + }, + { + "district_id": "1916", + "district_name": "铁山港区", + "spell": "tieshangangqu", + "easy_spell": "tsgq", + "city_id": "222" + }, + { + "district_id": "1917", + "district_name": "合浦县", + "spell": "hepuxian", + "easy_spell": "hpx", + "city_id": "222" + }, + { + "district_id": "1918", + "district_name": "港口区", + "spell": "gangkouqu", + "easy_spell": "gkq", + "city_id": "223" + }, + { + "district_id": "1919", + "district_name": "防城区", + "spell": "fangchengqu", + "easy_spell": "fcq", + "city_id": "223" + }, + { + "district_id": "1920", + "district_name": "上思县", + "spell": "shangsixian", + "easy_spell": "ssx", + "city_id": "223" + }, + { + "district_id": "1921", + "district_name": "东兴市", + "spell": "dongxingshi", + "easy_spell": "dxs", + "city_id": "223" + }, + { + "district_id": "1922", + "district_name": "钦南区", + "spell": "qinnanqu", + "easy_spell": "qnq", + "city_id": "224" + }, + { + "district_id": "1923", + "district_name": "钦北区", + "spell": "qinbeiqu", + "easy_spell": "qbq", + "city_id": "224" + }, + { + "district_id": "1924", + "district_name": "灵山县", + "spell": "lingshanxian", + "easy_spell": "lsx", + "city_id": "224" + }, + { + "district_id": "1925", + "district_name": "浦北县", + "spell": "pubeixian", + "easy_spell": "pbx", + "city_id": "224" + }, + { + "district_id": "1926", + "district_name": "港北区", + "spell": "gangbeiqu", + "easy_spell": "gbq", + "city_id": "225" + }, + { + "district_id": "1927", + "district_name": "港南区", + "spell": "gangnanqu", + "easy_spell": "gnq", + "city_id": "225" + }, + { + "district_id": "1928", + "district_name": "覃塘区", + "spell": "zuotangqu", + "easy_spell": "ztq", + "city_id": "225" + }, + { + "district_id": "1929", + "district_name": "平南县", + "spell": "pingnanxian", + "easy_spell": "pnx", + "city_id": "225" + }, + { + "district_id": "1930", + "district_name": "桂平市", + "spell": "guipingshi", + "easy_spell": "gps", + "city_id": "225" + }, + { + "district_id": "1931", + "district_name": "玉州区", + "spell": "yuzhouqu", + "easy_spell": "yzq", + "city_id": "226" + }, + { + "district_id": "1932", + "district_name": "容县", + "spell": "rongxian", + "easy_spell": "rx", + "city_id": "226" + }, + { + "district_id": "1933", + "district_name": "陆川县", + "spell": "luchuanxian", + "easy_spell": "lcx", + "city_id": "226" + }, + { + "district_id": "1934", + "district_name": "博白县", + "spell": "bobaixian", + "easy_spell": "bbx", + "city_id": "226" + }, + { + "district_id": "1935", + "district_name": "兴业县", + "spell": "xingyexian", + "easy_spell": "xyx", + "city_id": "226" + }, + { + "district_id": "1936", + "district_name": "北流市", + "spell": "beiliushi", + "easy_spell": "bls", + "city_id": "226" + }, + { + "district_id": "1937", + "district_name": "右江区", + "spell": "youjiangqu", + "easy_spell": "yjq", + "city_id": "227" + }, + { + "district_id": "1938", + "district_name": "田阳县", + "spell": "tianyangxian", + "easy_spell": "tyx", + "city_id": "227" + }, + { + "district_id": "1939", + "district_name": "田东县", + "spell": "tiandongxian", + "easy_spell": "tdx", + "city_id": "227" + }, + { + "district_id": "1940", + "district_name": "平果县", + "spell": "pingguoxian", + "easy_spell": "pgx", + "city_id": "227" + }, + { + "district_id": "1941", + "district_name": "德保县", + "spell": "debaoxian", + "easy_spell": "dbx", + "city_id": "227" + }, + { + "district_id": "1942", + "district_name": "靖西县", + "spell": "jingxixian", + "easy_spell": "jxx", + "city_id": "227" + }, + { + "district_id": "1943", + "district_name": "那坡县", + "spell": "napoxian", + "easy_spell": "npx", + "city_id": "227" + }, + { + "district_id": "1944", + "district_name": "凌云县", + "spell": "lingyunxian", + "easy_spell": "lyx", + "city_id": "227" + }, + { + "district_id": "1945", + "district_name": "乐业县", + "spell": "leyexian", + "easy_spell": "lyx", + "city_id": "227" + }, + { + "district_id": "1946", + "district_name": "田林县", + "spell": "tianlinxian", + "easy_spell": "tlx", + "city_id": "227" + }, + { + "district_id": "1947", + "district_name": "西林县", + "spell": "xilinxian", + "easy_spell": "xlx", + "city_id": "227" + }, + { + "district_id": "1948", + "district_name": "隆林各族自治县", + "spell": "longlingezuzizhixian", + "easy_spell": "llgzzzx", + "city_id": "227" + }, + { + "district_id": "1949", + "district_name": "八步区", + "spell": "babuqu", + "easy_spell": "bbq", + "city_id": "228" + }, + { + "district_id": "1950", + "district_name": "昭平县", + "spell": "zhaopingxian", + "easy_spell": "zpx", + "city_id": "228" + }, + { + "district_id": "1951", + "district_name": "钟山县", + "spell": "zhongshanxian", + "easy_spell": "zsx", + "city_id": "228" + }, + { + "district_id": "1952", + "district_name": "富川瑶族自治县", + "spell": "fuchuanyaozuzizhixian", + "easy_spell": "fcyzzzx", + "city_id": "228" + }, + { + "district_id": "1953", + "district_name": "金城江区", + "spell": "jinchengjiangqu", + "easy_spell": "jcjq", + "city_id": "229" + }, + { + "district_id": "1954", + "district_name": "南丹县", + "spell": "nandanxian", + "easy_spell": "ndx", + "city_id": "229" + }, + { + "district_id": "1955", + "district_name": "天峨县", + "spell": "tianexian", + "easy_spell": "tex", + "city_id": "229" + }, + { + "district_id": "1956", + "district_name": "凤山县", + "spell": "fengshanxian", + "easy_spell": "fsx", + "city_id": "229" + }, + { + "district_id": "1957", + "district_name": "东兰县", + "spell": "donglanxian", + "easy_spell": "dlx", + "city_id": "229" + }, + { + "district_id": "1958", + "district_name": "罗城仫佬族自治县", + "spell": "luochengzuolaozuzizhixian", + "easy_spell": "lczlzzzx", + "city_id": "229" + }, + { + "district_id": "1959", + "district_name": "环江毛南族自治县", + "spell": "huanjiangmaonanzuzizhixian", + "easy_spell": "hjmnzzzx", + "city_id": "229" + }, + { + "district_id": "1960", + "district_name": "巴马瑶族自治县", + "spell": "bamayaozuzizhixian", + "easy_spell": "bmyzzzx", + "city_id": "229" + }, + { + "district_id": "1961", + "district_name": "都安瑶族自治县", + "spell": "duanyaozuzizhixian", + "easy_spell": "dayzzzx", + "city_id": "229" + }, + { + "district_id": "1962", + "district_name": "大化瑶族自治县", + "spell": "dahuayaozuzizhixian", + "easy_spell": "dhyzzzx", + "city_id": "229" + }, + { + "district_id": "1963", + "district_name": "宜州市", + "spell": "yizhoushi", + "easy_spell": "yzs", + "city_id": "229" + }, + { + "district_id": "1964", + "district_name": "兴宾区", + "spell": "xingbinqu", + "easy_spell": "xbq", + "city_id": "230" + }, + { + "district_id": "1965", + "district_name": "忻城县", + "spell": "xinchengxian", + "easy_spell": "xcx", + "city_id": "230" + }, + { + "district_id": "1966", + "district_name": "象州县", + "spell": "xiangzhouxian", + "easy_spell": "xzx", + "city_id": "230" + }, + { + "district_id": "1967", + "district_name": "武宣县", + "spell": "wuxuanxian", + "easy_spell": "wxx", + "city_id": "230" + }, + { + "district_id": "1968", + "district_name": "金秀瑶族自治县", + "spell": "jinxiuyaozuzizhixian", + "easy_spell": "jxyzzzx", + "city_id": "230" + }, + { + "district_id": "1969", + "district_name": "合山市", + "spell": "heshanshi", + "easy_spell": "hss", + "city_id": "230" + }, + { + "district_id": "1970", + "district_name": "江洲区", + "spell": "jiangzhouqu", + "easy_spell": "jzq", + "city_id": "231" + }, + { + "district_id": "1971", + "district_name": "扶绥县", + "spell": "fusuixian", + "easy_spell": "fsx", + "city_id": "231" + }, + { + "district_id": "1972", + "district_name": "宁明县", + "spell": "ningmingxian", + "easy_spell": "nmx", + "city_id": "231" + }, + { + "district_id": "1973", + "district_name": "龙州县", + "spell": "longzhouxian", + "easy_spell": "lzx", + "city_id": "231" + }, + { + "district_id": "1974", + "district_name": "大新县", + "spell": "daxinxian", + "easy_spell": "dxx", + "city_id": "231" + }, + { + "district_id": "1975", + "district_name": "天等县", + "spell": "tiandengxian", + "easy_spell": "tdx", + "city_id": "231" + }, + { + "district_id": "1976", + "district_name": "凭祥市", + "spell": "pingxiangshi", + "easy_spell": "pxs", + "city_id": "231" + }, + { + "district_id": "1977", + "district_name": "秀英区", + "spell": "xiuyingqu", + "easy_spell": "xyq", + "city_id": "232" + }, + { + "district_id": "1978", + "district_name": "龙华区", + "spell": "longhuaqu", + "easy_spell": "lhq", + "city_id": "232" + }, + { + "district_id": "1979", + "district_name": "琼山区", + "spell": "qiongshanqu", + "easy_spell": "qsq", + "city_id": "232" + }, + { + "district_id": "1980", + "district_name": "美兰区", + "spell": "meilanqu", + "easy_spell": "mlq", + "city_id": "232" + }, + { + "district_id": "1981", + "district_name": "五指山市", + "spell": "wuzhishanshi", + "easy_spell": "wzss", + "city_id": "233" + }, + { + "district_id": "1982", + "district_name": "琼海市", + "spell": "qionghaishi", + "easy_spell": "qhs", + "city_id": "233" + }, + { + "district_id": "1983", + "district_name": "儋州市", + "spell": "zuozhoushi", + "easy_spell": "zzs", + "city_id": "233" + }, + { + "district_id": "1984", + "district_name": "文昌市", + "spell": "wenchangshi", + "easy_spell": "wcs", + "city_id": "233" + }, + { + "district_id": "1985", + "district_name": "万宁市", + "spell": "wanningshi", + "easy_spell": "wns", + "city_id": "233" + }, + { + "district_id": "1986", + "district_name": "东方市", + "spell": "dongfangshi", + "easy_spell": "dfs", + "city_id": "233" + }, + { + "district_id": "1987", + "district_name": "定安县", + "spell": "dinganxian", + "easy_spell": "dax", + "city_id": "233" + }, + { + "district_id": "1988", + "district_name": "屯昌县", + "spell": "tunchangxian", + "easy_spell": "tcx", + "city_id": "233" + }, + { + "district_id": "1989", + "district_name": "澄迈县", + "spell": "chengmaixian", + "easy_spell": "cmx", + "city_id": "233" + }, + { + "district_id": "1990", + "district_name": "临高县", + "spell": "lingaoxian", + "easy_spell": "lgx", + "city_id": "233" + }, + { + "district_id": "1991", + "district_name": "白沙黎族自治县", + "spell": "baishalizuzizhixian", + "easy_spell": "bslzzzx", + "city_id": "233" + }, + { + "district_id": "1992", + "district_name": "昌江黎族自治县", + "spell": "changjianglizuzizhixian", + "easy_spell": "cjlzzzx", + "city_id": "233" + }, + { + "district_id": "1993", + "district_name": "乐东黎族自治县", + "spell": "ledonglizuzizhixian", + "easy_spell": "ldlzzzx", + "city_id": "233" + }, + { + "district_id": "1994", + "district_name": "陵水黎族自治县", + "spell": "lingshuilizuzizhixian", + "easy_spell": "lslzzzx", + "city_id": "233" + }, + { + "district_id": "1995", + "district_name": "保亭黎族苗族自治县", + "spell": "baotinglizumiaozuzizhixian", + "easy_spell": "btlzmzzzx", + "city_id": "233" + }, + { + "district_id": "1996", + "district_name": "琼中黎族苗族自治县", + "spell": "qiongzhonglizumiaozuzizhixian", + "easy_spell": "qzlzmzzzx", + "city_id": "233" + }, + { + "district_id": "1997", + "district_name": "西沙群岛", + "spell": "xishaqundao", + "easy_spell": "xsqd", + "city_id": "233" + }, + { + "district_id": "1998", + "district_name": "南沙群岛", + "spell": "nanshaqundao", + "easy_spell": "nsqd", + "city_id": "233" + }, + { + "district_id": "1999", + "district_name": "中沙群岛的岛礁及其海域", + "spell": "zhongshaqundaodedaojiaojiqihaiyu", + "easy_spell": "zsqdddjjqhy", + "city_id": "233" + }, + { + "district_id": "2000", + "district_name": "万州区", + "spell": "wanzhouqu", + "easy_spell": "wzq", + "city_id": "234" + }, + { + "district_id": "2001", + "district_name": "涪陵区", + "spell": "fulingqu", + "easy_spell": "flq", + "city_id": "234" + }, + { + "district_id": "2002", + "district_name": "渝中区", + "spell": "yuzhongqu", + "easy_spell": "yzq", + "city_id": "234" + }, + { + "district_id": "2003", + "district_name": "大渡口区", + "spell": "dadukouqu", + "easy_spell": "ddkq", + "city_id": "234" + }, + { + "district_id": "2004", + "district_name": "江北区", + "spell": "jiangbeiqu", + "easy_spell": "jbq", + "city_id": "234" + }, + { + "district_id": "2005", + "district_name": "沙坪坝区", + "spell": "shapingbaqu", + "easy_spell": "spbq", + "city_id": "234" + }, + { + "district_id": "2006", + "district_name": "九龙坡区", + "spell": "jiulongpoqu", + "easy_spell": "jlpq", + "city_id": "234" + }, + { + "district_id": "2007", + "district_name": "南岸区", + "spell": "nananqu", + "easy_spell": "naq", + "city_id": "234" + }, + { + "district_id": "2008", + "district_name": "北碚区", + "spell": "beizuoqu", + "easy_spell": "bzq", + "city_id": "234" + }, + { + "district_id": "2009", + "district_name": "万盛区", + "spell": "wanshengqu", + "easy_spell": "wsq", + "city_id": "234" + }, + { + "district_id": "2010", + "district_name": "双桥区", + "spell": "shuangqiaoqu", + "easy_spell": "sqq", + "city_id": "234" + }, + { + "district_id": "2011", + "district_name": "渝北区", + "spell": "yubeiqu", + "easy_spell": "ybq", + "city_id": "234" + }, + { + "district_id": "2012", + "district_name": "巴南区", + "spell": "bananqu", + "easy_spell": "bnq", + "city_id": "234" + }, + { + "district_id": "2013", + "district_name": "黔江区", + "spell": "qianjiangqu", + "easy_spell": "qjq", + "city_id": "234" + }, + { + "district_id": "2014", + "district_name": "长寿区", + "spell": "changshouqu", + "easy_spell": "csq", + "city_id": "234" + }, + { + "district_id": "2015", + "district_name": "綦江县", + "spell": "zuojiangxian", + "easy_spell": "zjx", + "city_id": "234" + }, + { + "district_id": "2016", + "district_name": "潼南县", + "spell": "zuonanxian", + "easy_spell": "znx", + "city_id": "234" + }, + { + "district_id": "2017", + "district_name": "铜梁县", + "spell": "tongliangxian", + "easy_spell": "tlx", + "city_id": "234" + }, + { + "district_id": "2018", + "district_name": "大足县", + "spell": "dazuxian", + "easy_spell": "dzx", + "city_id": "234" + }, + { + "district_id": "2019", + "district_name": "荣昌县", + "spell": "rongchangxian", + "easy_spell": "rcx", + "city_id": "234" + }, + { + "district_id": "2020", + "district_name": "璧山县", + "spell": "zuoshanxian", + "easy_spell": "zsx", + "city_id": "234" + }, + { + "district_id": "2021", + "district_name": "梁平县", + "spell": "liangpingxian", + "easy_spell": "lpx", + "city_id": "234" + }, + { + "district_id": "2022", + "district_name": "城口县", + "spell": "chengkouxian", + "easy_spell": "ckx", + "city_id": "234" + }, + { + "district_id": "2023", + "district_name": "丰都县", + "spell": "fengduxian", + "easy_spell": "fdx", + "city_id": "234" + }, + { + "district_id": "2024", + "district_name": "垫江县", + "spell": "dianjiangxian", + "easy_spell": "djx", + "city_id": "234" + }, + { + "district_id": "2025", + "district_name": "武隆县", + "spell": "wulongxian", + "easy_spell": "wlx", + "city_id": "234" + }, + { + "district_id": "2026", + "district_name": "忠县", + "spell": "zhongxian", + "easy_spell": "zx", + "city_id": "234" + }, + { + "district_id": "2027", + "district_name": "开县", + "spell": "kaixian", + "easy_spell": "kx", + "city_id": "234" + }, + { + "district_id": "2028", + "district_name": "云阳县", + "spell": "yunyangxian", + "easy_spell": "yyx", + "city_id": "234" + }, + { + "district_id": "2029", + "district_name": "奉节县", + "spell": "fengjiexian", + "easy_spell": "fjx", + "city_id": "234" + }, + { + "district_id": "2030", + "district_name": "巫山县", + "spell": "wushanxian", + "easy_spell": "wsx", + "city_id": "234" + }, + { + "district_id": "2031", + "district_name": "巫溪县", + "spell": "wuxixian", + "easy_spell": "wxx", + "city_id": "234" + }, + { + "district_id": "2032", + "district_name": "石柱土家族自治县", + "spell": "shizhutujiazuzizhixian", + "easy_spell": "sztjzzzx", + "city_id": "234" + }, + { + "district_id": "2033", + "district_name": "秀山土家族苗族自治县", + "spell": "xiushantujiazumiaozuzizhixian", + "easy_spell": "xstjzmzzzx", + "city_id": "234" + }, + { + "district_id": "2034", + "district_name": "酉阳土家族苗族自治县", + "spell": "youyangtujiazumiaozuzizhixian", + "easy_spell": "yytjzmzzzx", + "city_id": "234" + }, + { + "district_id": "2035", + "district_name": "彭水苗族土家族自治县", + "spell": "pengshuimiaozutujiazuzizhixian", + "easy_spell": "psmztjzzzx", + "city_id": "234" + }, + { + "district_id": "2036", + "district_name": "江津市", + "spell": "jiangjinshi", + "easy_spell": "jjs", + "city_id": "234" + }, + { + "district_id": "2037", + "district_name": "合川市", + "spell": "hechuanshi", + "easy_spell": "hcs", + "city_id": "234" + }, + { + "district_id": "2038", + "district_name": "永川市", + "spell": "yongchuanshi", + "easy_spell": "ycs", + "city_id": "234" + }, + { + "district_id": "2039", + "district_name": "南川市", + "spell": "nanchuanshi", + "easy_spell": "ncs", + "city_id": "234" + }, + { + "district_id": "2040", + "district_name": "锦江区", + "spell": "jinjiangqu", + "easy_spell": "jjq", + "city_id": "235" + }, + { + "district_id": "2041", + "district_name": "青羊区", + "spell": "qingyangqu", + "easy_spell": "qyq", + "city_id": "235" + }, + { + "district_id": "2042", + "district_name": "金牛区", + "spell": "jinniuqu", + "easy_spell": "jnq", + "city_id": "235" + }, + { + "district_id": "2043", + "district_name": "武侯区", + "spell": "wuhouqu", + "easy_spell": "whq", + "city_id": "235" + }, + { + "district_id": "2044", + "district_name": "成华区", + "spell": "chenghuaqu", + "easy_spell": "chq", + "city_id": "235" + }, + { + "district_id": "2045", + "district_name": "龙泉驿区", + "spell": "longquanzuoqu", + "easy_spell": "lqzq", + "city_id": "235" + }, + { + "district_id": "2046", + "district_name": "青白江区", + "spell": "qingbaijiangqu", + "easy_spell": "qbjq", + "city_id": "235" + }, + { + "district_id": "2047", + "district_name": "新都区", + "spell": "xinduqu", + "easy_spell": "xdq", + "city_id": "235" + }, + { + "district_id": "2048", + "district_name": "温江区", + "spell": "wenjiangqu", + "easy_spell": "wjq", + "city_id": "235" + }, + { + "district_id": "2049", + "district_name": "金堂县", + "spell": "jintangxian", + "easy_spell": "jtx", + "city_id": "235" + }, + { + "district_id": "2050", + "district_name": "双流县", + "spell": "shuangliuxian", + "easy_spell": "slx", + "city_id": "235" + }, + { + "district_id": "2051", + "district_name": "郫县", + "spell": "zuoxian", + "easy_spell": "zx", + "city_id": "235" + }, + { + "district_id": "2052", + "district_name": "大邑县", + "spell": "dayixian", + "easy_spell": "dyx", + "city_id": "235" + }, + { + "district_id": "2053", + "district_name": "蒲江县", + "spell": "pujiangxian", + "easy_spell": "pjx", + "city_id": "235" + }, + { + "district_id": "2054", + "district_name": "新津县", + "spell": "xinjinxian", + "easy_spell": "xjx", + "city_id": "235" + }, + { + "district_id": "2055", + "district_name": "都江堰市", + "spell": "dujiangyanshi", + "easy_spell": "djys", + "city_id": "235" + }, + { + "district_id": "2056", + "district_name": "彭州市", + "spell": "pengzhoushi", + "easy_spell": "pzs", + "city_id": "235" + }, + { + "district_id": "2057", + "district_name": "邛崃市", + "spell": "zuozuoshi", + "easy_spell": "zzs", + "city_id": "235" + }, + { + "district_id": "2058", + "district_name": "崇州市", + "spell": "chongzhoushi", + "easy_spell": "czs", + "city_id": "235" + }, + { + "district_id": "2059", + "district_name": "自流井区", + "spell": "ziliujingqu", + "easy_spell": "zljq", + "city_id": "236" + }, + { + "district_id": "2060", + "district_name": "贡井区", + "spell": "gongjingqu", + "easy_spell": "gjq", + "city_id": "236" + }, + { + "district_id": "2061", + "district_name": "大安区", + "spell": "daanqu", + "easy_spell": "daq", + "city_id": "236" + }, + { + "district_id": "2062", + "district_name": "沿滩区", + "spell": "yantanqu", + "easy_spell": "ytq", + "city_id": "236" + }, + { + "district_id": "2063", + "district_name": "荣县", + "spell": "rongxian", + "easy_spell": "rx", + "city_id": "236" + }, + { + "district_id": "2064", + "district_name": "富顺县", + "spell": "fushunxian", + "easy_spell": "fsx", + "city_id": "236" + }, + { + "district_id": "2065", + "district_name": "东区", + "spell": "dongqu", + "easy_spell": "dq", + "city_id": "237" + }, + { + "district_id": "2066", + "district_name": "西区", + "spell": "xiqu", + "easy_spell": "xq", + "city_id": "237" + }, + { + "district_id": "2067", + "district_name": "仁和区", + "spell": "renhequ", + "easy_spell": "rhq", + "city_id": "237" + }, + { + "district_id": "2068", + "district_name": "米易县", + "spell": "miyixian", + "easy_spell": "myx", + "city_id": "237" + }, + { + "district_id": "2069", + "district_name": "盐边县", + "spell": "yanbianxian", + "easy_spell": "ybx", + "city_id": "237" + }, + { + "district_id": "2070", + "district_name": "江阳区", + "spell": "jiangyangqu", + "easy_spell": "jyq", + "city_id": "238" + }, + { + "district_id": "2071", + "district_name": "纳溪区", + "spell": "naxiqu", + "easy_spell": "nxq", + "city_id": "238" + }, + { + "district_id": "2072", + "district_name": "龙马潭区", + "spell": "longmatanqu", + "easy_spell": "lmtq", + "city_id": "238" + }, + { + "district_id": "2073", + "district_name": "泸县", + "spell": "zuoxian", + "easy_spell": "zx", + "city_id": "238" + }, + { + "district_id": "2074", + "district_name": "合江县", + "spell": "hejiangxian", + "easy_spell": "hjx", + "city_id": "238" + }, + { + "district_id": "2075", + "district_name": "叙永县", + "spell": "xuyongxian", + "easy_spell": "xyx", + "city_id": "238" + }, + { + "district_id": "2076", + "district_name": "古蔺县", + "spell": "guzuoxian", + "easy_spell": "gzx", + "city_id": "238" + }, + { + "district_id": "2077", + "district_name": "旌阳区", + "spell": "zuoyangqu", + "easy_spell": "zyq", + "city_id": "239" + }, + { + "district_id": "2078", + "district_name": "中江县", + "spell": "zhongjiangxian", + "easy_spell": "zjx", + "city_id": "239" + }, + { + "district_id": "2079", + "district_name": "罗江县", + "spell": "luojiangxian", + "easy_spell": "ljx", + "city_id": "239" + }, + { + "district_id": "2080", + "district_name": "广汉市", + "spell": "guanghanshi", + "easy_spell": "ghs", + "city_id": "239" + }, + { + "district_id": "2081", + "district_name": "什邡市", + "spell": "shizuoshi", + "easy_spell": "szs", + "city_id": "239" + }, + { + "district_id": "2082", + "district_name": "绵竹市", + "spell": "mianzhushi", + "easy_spell": "mzs", + "city_id": "239" + }, + { + "district_id": "2083", + "district_name": "涪城区", + "spell": "fuchengqu", + "easy_spell": "fcq", + "city_id": "240" + }, + { + "district_id": "2084", + "district_name": "游仙区", + "spell": "youxianqu", + "easy_spell": "yxq", + "city_id": "240" + }, + { + "district_id": "2085", + "district_name": "三台县", + "spell": "santaixian", + "easy_spell": "stx", + "city_id": "240" + }, + { + "district_id": "2086", + "district_name": "盐亭县", + "spell": "yantingxian", + "easy_spell": "ytx", + "city_id": "240" + }, + { + "district_id": "2087", + "district_name": "安县", + "spell": "anxian", + "easy_spell": "ax", + "city_id": "240" + }, + { + "district_id": "2088", + "district_name": "梓潼县", + "spell": "zuozuoxian", + "easy_spell": "zzx", + "city_id": "240" + }, + { + "district_id": "2089", + "district_name": "北川羌族自治县", + "spell": "beichuanqiangzuzizhixian", + "easy_spell": "bcqzzzx", + "city_id": "240" + }, + { + "district_id": "2090", + "district_name": "平武县", + "spell": "pingwuxian", + "easy_spell": "pwx", + "city_id": "240" + }, + { + "district_id": "2091", + "district_name": "江油市", + "spell": "jiangyoushi", + "easy_spell": "jys", + "city_id": "240" + }, + { + "district_id": "2092", + "district_name": "市中区", + "spell": "shizhongqu", + "easy_spell": "szq", + "city_id": "241" + }, + { + "district_id": "2093", + "district_name": "元坝区", + "spell": "yuanbaqu", + "easy_spell": "ybq", + "city_id": "241" + }, + { + "district_id": "2094", + "district_name": "朝天区", + "spell": "chaotianqu", + "easy_spell": "ctq", + "city_id": "241" + }, + { + "district_id": "2095", + "district_name": "旺苍县", + "spell": "wangcangxian", + "easy_spell": "wcx", + "city_id": "241" + }, + { + "district_id": "2096", + "district_name": "青川县", + "spell": "qingchuanxian", + "easy_spell": "qcx", + "city_id": "241" + }, + { + "district_id": "2097", + "district_name": "剑阁县", + "spell": "jiangexian", + "easy_spell": "jgx", + "city_id": "241" + }, + { + "district_id": "2098", + "district_name": "苍溪县", + "spell": "cangxixian", + "easy_spell": "cxx", + "city_id": "241" + }, + { + "district_id": "2099", + "district_name": "船山区", + "spell": "chuanshanqu", + "easy_spell": "csq", + "city_id": "242" + }, + { + "district_id": "2100", + "district_name": "安居区", + "spell": "anjuqu", + "easy_spell": "ajq", + "city_id": "242" + }, + { + "district_id": "2101", + "district_name": "蓬溪县", + "spell": "pengxixian", + "easy_spell": "pxx", + "city_id": "242" + }, + { + "district_id": "2102", + "district_name": "射洪县", + "spell": "shehongxian", + "easy_spell": "shx", + "city_id": "242" + }, + { + "district_id": "2103", + "district_name": "大英县", + "spell": "dayingxian", + "easy_spell": "dyx", + "city_id": "242" + }, + { + "district_id": "2104", + "district_name": "市中区", + "spell": "shizhongqu", + "easy_spell": "szq", + "city_id": "243" + }, + { + "district_id": "2105", + "district_name": "东兴区", + "spell": "dongxingqu", + "easy_spell": "dxq", + "city_id": "243" + }, + { + "district_id": "2106", + "district_name": "威远县", + "spell": "weiyuanxian", + "easy_spell": "wyx", + "city_id": "243" + }, + { + "district_id": "2107", + "district_name": "资中县", + "spell": "zizhongxian", + "easy_spell": "zzx", + "city_id": "243" + }, + { + "district_id": "2108", + "district_name": "隆昌县", + "spell": "longchangxian", + "easy_spell": "lcx", + "city_id": "243" + }, + { + "district_id": "2109", + "district_name": "市中区", + "spell": "shizhongqu", + "easy_spell": "szq", + "city_id": "244" + }, + { + "district_id": "2110", + "district_name": "沙湾区", + "spell": "shawanqu", + "easy_spell": "swq", + "city_id": "244" + }, + { + "district_id": "2111", + "district_name": "五通桥区", + "spell": "wutongqiaoqu", + "easy_spell": "wtqq", + "city_id": "244" + }, + { + "district_id": "2112", + "district_name": "金口河区", + "spell": "jinkouhequ", + "easy_spell": "jkhq", + "city_id": "244" + }, + { + "district_id": "2113", + "district_name": "犍为县", + "spell": "zuoweixian", + "easy_spell": "zwx", + "city_id": "244" + }, + { + "district_id": "2114", + "district_name": "井研县", + "spell": "jingyanxian", + "easy_spell": "jyx", + "city_id": "244" + }, + { + "district_id": "2115", + "district_name": "夹江县", + "spell": "jiajiangxian", + "easy_spell": "jjx", + "city_id": "244" + }, + { + "district_id": "2116", + "district_name": "沐川县", + "spell": "zuochuanxian", + "easy_spell": "zcx", + "city_id": "244" + }, + { + "district_id": "2117", + "district_name": "峨边彝族自治县", + "spell": "ebianyizuzizhixian", + "easy_spell": "ebyzzzx", + "city_id": "244" + }, + { + "district_id": "2118", + "district_name": "马边彝族自治县", + "spell": "mabianyizuzizhixian", + "easy_spell": "mbyzzzx", + "city_id": "244" + }, + { + "district_id": "2119", + "district_name": "峨眉山市", + "spell": "emeishanshi", + "easy_spell": "emss", + "city_id": "244" + }, + { + "district_id": "2120", + "district_name": "顺庆区", + "spell": "shunqingqu", + "easy_spell": "sqq", + "city_id": "245" + }, + { + "district_id": "2121", + "district_name": "高坪区", + "spell": "gaopingqu", + "easy_spell": "gpq", + "city_id": "245" + }, + { + "district_id": "2122", + "district_name": "嘉陵区", + "spell": "jialingqu", + "easy_spell": "jlq", + "city_id": "245" + }, + { + "district_id": "2123", + "district_name": "南部县", + "spell": "nanbuxian", + "easy_spell": "nbx", + "city_id": "245" + }, + { + "district_id": "2124", + "district_name": "营山县", + "spell": "yingshanxian", + "easy_spell": "ysx", + "city_id": "245" + }, + { + "district_id": "2125", + "district_name": "蓬安县", + "spell": "penganxian", + "easy_spell": "pax", + "city_id": "245" + }, + { + "district_id": "2126", + "district_name": "仪陇县", + "spell": "yilongxian", + "easy_spell": "ylx", + "city_id": "245" + }, + { + "district_id": "2127", + "district_name": "西充县", + "spell": "xichongxian", + "easy_spell": "xcx", + "city_id": "245" + }, + { + "district_id": "2128", + "district_name": "阆中市", + "spell": "zuozhongshi", + "easy_spell": "zzs", + "city_id": "245" + }, + { + "district_id": "2129", + "district_name": "东坡区", + "spell": "dongpoqu", + "easy_spell": "dpq", + "city_id": "246" + }, + { + "district_id": "2130", + "district_name": "仁寿县", + "spell": "renshouxian", + "easy_spell": "rsx", + "city_id": "246" + }, + { + "district_id": "2131", + "district_name": "彭山县", + "spell": "pengshanxian", + "easy_spell": "psx", + "city_id": "246" + }, + { + "district_id": "2132", + "district_name": "洪雅县", + "spell": "hongyaxian", + "easy_spell": "hyx", + "city_id": "246" + }, + { + "district_id": "2133", + "district_name": "丹棱县", + "spell": "danlengxian", + "easy_spell": "dlx", + "city_id": "246" + }, + { + "district_id": "2134", + "district_name": "青神县", + "spell": "qingshenxian", + "easy_spell": "qsx", + "city_id": "246" + }, + { + "district_id": "2135", + "district_name": "翠屏区", + "spell": "cuipingqu", + "easy_spell": "cpq", + "city_id": "247" + }, + { + "district_id": "2136", + "district_name": "宜宾县", + "spell": "yibinxian", + "easy_spell": "ybx", + "city_id": "247" + }, + { + "district_id": "2137", + "district_name": "南溪县", + "spell": "nanxixian", + "easy_spell": "nxx", + "city_id": "247" + }, + { + "district_id": "2138", + "district_name": "江安县", + "spell": "jianganxian", + "easy_spell": "jax", + "city_id": "247" + }, + { + "district_id": "2139", + "district_name": "长宁县", + "spell": "changningxian", + "easy_spell": "cnx", + "city_id": "247" + }, + { + "district_id": "2140", + "district_name": "高县", + "spell": "gaoxian", + "easy_spell": "gx", + "city_id": "247" + }, + { + "district_id": "2141", + "district_name": "珙县", + "spell": "zuoxian", + "easy_spell": "zx", + "city_id": "247" + }, + { + "district_id": "2142", + "district_name": "筠连县", + "spell": "zuolianxian", + "easy_spell": "zlx", + "city_id": "247" + }, + { + "district_id": "2143", + "district_name": "兴文县", + "spell": "xingwenxian", + "easy_spell": "xwx", + "city_id": "247" + }, + { + "district_id": "2144", + "district_name": "屏山县", + "spell": "pingshanxian", + "easy_spell": "psx", + "city_id": "247" + }, + { + "district_id": "2145", + "district_name": "广安区", + "spell": "guanganqu", + "easy_spell": "gaq", + "city_id": "248" + }, + { + "district_id": "2146", + "district_name": "岳池县", + "spell": "yuechixian", + "easy_spell": "ycx", + "city_id": "248" + }, + { + "district_id": "2147", + "district_name": "武胜县", + "spell": "wushengxian", + "easy_spell": "wsx", + "city_id": "248" + }, + { + "district_id": "2148", + "district_name": "邻水县", + "spell": "linshuixian", + "easy_spell": "lsx", + "city_id": "248" + }, + { + "district_id": "2149", + "district_name": "华蓥市", + "spell": "huazuoshi", + "easy_spell": "hzs", + "city_id": "248" + }, + { + "district_id": "2150", + "district_name": "通川区", + "spell": "tongchuanqu", + "easy_spell": "tcq", + "city_id": "249" + }, + { + "district_id": "2151", + "district_name": "达县", + "spell": "daxian", + "easy_spell": "dx", + "city_id": "249" + }, + { + "district_id": "2152", + "district_name": "宣汉县", + "spell": "xuanhanxian", + "easy_spell": "xhx", + "city_id": "249" + }, + { + "district_id": "2153", + "district_name": "开江县", + "spell": "kaijiangxian", + "easy_spell": "kjx", + "city_id": "249" + }, + { + "district_id": "2154", + "district_name": "大竹县", + "spell": "dazhuxian", + "easy_spell": "dzx", + "city_id": "249" + }, + { + "district_id": "2155", + "district_name": "渠县", + "spell": "quxian", + "easy_spell": "qx", + "city_id": "249" + }, + { + "district_id": "2156", + "district_name": "万源市", + "spell": "wanyuanshi", + "easy_spell": "wys", + "city_id": "249" + }, + { + "district_id": "2157", + "district_name": "雨城区", + "spell": "yuchengqu", + "easy_spell": "ycq", + "city_id": "250" + }, + { + "district_id": "2158", + "district_name": "名山县", + "spell": "mingshanxian", + "easy_spell": "msx", + "city_id": "250" + }, + { + "district_id": "2159", + "district_name": "荥经县", + "spell": "zuojingxian", + "easy_spell": "zjx", + "city_id": "250" + }, + { + "district_id": "2160", + "district_name": "汉源县", + "spell": "hanyuanxian", + "easy_spell": "hyx", + "city_id": "250" + }, + { + "district_id": "2161", + "district_name": "石棉县", + "spell": "shimianxian", + "easy_spell": "smx", + "city_id": "250" + }, + { + "district_id": "2162", + "district_name": "天全县", + "spell": "tianquanxian", + "easy_spell": "tqx", + "city_id": "250" + }, + { + "district_id": "2163", + "district_name": "芦山县", + "spell": "lushanxian", + "easy_spell": "lsx", + "city_id": "250" + }, + { + "district_id": "2164", + "district_name": "宝兴县", + "spell": "baoxingxian", + "easy_spell": "bxx", + "city_id": "250" + }, + { + "district_id": "2165", + "district_name": "巴州区", + "spell": "bazhouqu", + "easy_spell": "bzq", + "city_id": "251" + }, + { + "district_id": "2166", + "district_name": "通江县", + "spell": "tongjiangxian", + "easy_spell": "tjx", + "city_id": "251" + }, + { + "district_id": "2167", + "district_name": "南江县", + "spell": "nanjiangxian", + "easy_spell": "njx", + "city_id": "251" + }, + { + "district_id": "2168", + "district_name": "平昌县", + "spell": "pingchangxian", + "easy_spell": "pcx", + "city_id": "251" + }, + { + "district_id": "2169", + "district_name": "雁江区", + "spell": "yanjiangqu", + "easy_spell": "yjq", + "city_id": "252" + }, + { + "district_id": "2170", + "district_name": "安岳县", + "spell": "anyuexian", + "easy_spell": "ayx", + "city_id": "252" + }, + { + "district_id": "2171", + "district_name": "乐至县", + "spell": "lezhixian", + "easy_spell": "lzx", + "city_id": "252" + }, + { + "district_id": "2172", + "district_name": "简阳市", + "spell": "jianyangshi", + "easy_spell": "jys", + "city_id": "252" + }, + { + "district_id": "2173", + "district_name": "汶川县", + "spell": "zuochuanxian", + "easy_spell": "zcx", + "city_id": "253" + }, + { + "district_id": "2174", + "district_name": "理县", + "spell": "lixian", + "easy_spell": "lx", + "city_id": "253" + }, + { + "district_id": "2175", + "district_name": "茂县", + "spell": "maoxian", + "easy_spell": "mx", + "city_id": "253" + }, + { + "district_id": "2176", + "district_name": "松潘县", + "spell": "songpanxian", + "easy_spell": "spx", + "city_id": "253" + }, + { + "district_id": "2177", + "district_name": "九寨沟县", + "spell": "jiuzhaigouxian", + "easy_spell": "jzgx", + "city_id": "253" + }, + { + "district_id": "2178", + "district_name": "金川县", + "spell": "jinchuanxian", + "easy_spell": "jcx", + "city_id": "253" + }, + { + "district_id": "2179", + "district_name": "小金县", + "spell": "xiaojinxian", + "easy_spell": "xjx", + "city_id": "253" + }, + { + "district_id": "2180", + "district_name": "黑水县", + "spell": "heishuixian", + "easy_spell": "hsx", + "city_id": "253" + }, + { + "district_id": "2181", + "district_name": "马尔康县", + "spell": "maerkangxian", + "easy_spell": "mekx", + "city_id": "253" + }, + { + "district_id": "2182", + "district_name": "壤塘县", + "spell": "rangtangxian", + "easy_spell": "rtx", + "city_id": "253" + }, + { + "district_id": "2183", + "district_name": "阿坝县", + "spell": "abaxian", + "easy_spell": "abx", + "city_id": "253" + }, + { + "district_id": "2184", + "district_name": "若尔盖县", + "spell": "ruoergaixian", + "easy_spell": "regx", + "city_id": "253" + }, + { + "district_id": "2185", + "district_name": "红原县", + "spell": "hongyuanxian", + "easy_spell": "hyx", + "city_id": "253" + }, + { + "district_id": "2186", + "district_name": "康定县", + "spell": "kangdingxian", + "easy_spell": "kdx", + "city_id": "254" + }, + { + "district_id": "2187", + "district_name": "泸定县", + "spell": "zuodingxian", + "easy_spell": "zdx", + "city_id": "254" + }, + { + "district_id": "2188", + "district_name": "丹巴县", + "spell": "danbaxian", + "easy_spell": "dbx", + "city_id": "254" + }, + { + "district_id": "2189", + "district_name": "九龙县", + "spell": "jiulongxian", + "easy_spell": "jlx", + "city_id": "254" + }, + { + "district_id": "2190", + "district_name": "雅江县", + "spell": "yajiangxian", + "easy_spell": "yjx", + "city_id": "254" + }, + { + "district_id": "2191", + "district_name": "道孚县", + "spell": "daozuoxian", + "easy_spell": "dzx", + "city_id": "254" + }, + { + "district_id": "2192", + "district_name": "炉霍县", + "spell": "luhuoxian", + "easy_spell": "lhx", + "city_id": "254" + }, + { + "district_id": "2193", + "district_name": "甘孜县", + "spell": "ganzixian", + "easy_spell": "gzx", + "city_id": "254" + }, + { + "district_id": "2194", + "district_name": "新龙县", + "spell": "xinlongxian", + "easy_spell": "xlx", + "city_id": "254" + }, + { + "district_id": "2195", + "district_name": "德格县", + "spell": "degexian", + "easy_spell": "dgx", + "city_id": "254" + }, + { + "district_id": "2196", + "district_name": "白玉县", + "spell": "baiyuxian", + "easy_spell": "byx", + "city_id": "254" + }, + { + "district_id": "2197", + "district_name": "石渠县", + "spell": "shiquxian", + "easy_spell": "sqx", + "city_id": "254" + }, + { + "district_id": "2198", + "district_name": "色达县", + "spell": "sedaxian", + "easy_spell": "sdx", + "city_id": "254" + }, + { + "district_id": "2199", + "district_name": "理塘县", + "spell": "litangxian", + "easy_spell": "ltx", + "city_id": "254" + }, + { + "district_id": "2200", + "district_name": "巴塘县", + "spell": "batangxian", + "easy_spell": "btx", + "city_id": "254" + }, + { + "district_id": "2201", + "district_name": "乡城县", + "spell": "xiangchengxian", + "easy_spell": "xcx", + "city_id": "254" + }, + { + "district_id": "2202", + "district_name": "稻城县", + "spell": "daochengxian", + "easy_spell": "dcx", + "city_id": "254" + }, + { + "district_id": "2203", + "district_name": "得荣县", + "spell": "derongxian", + "easy_spell": "drx", + "city_id": "254" + }, + { + "district_id": "2204", + "district_name": "西昌市", + "spell": "xichangshi", + "easy_spell": "xcs", + "city_id": "255" + }, + { + "district_id": "2205", + "district_name": "木里藏族自治县", + "spell": "mulicangzuzizhixian", + "easy_spell": "mlczzzx", + "city_id": "255" + }, + { + "district_id": "2206", + "district_name": "盐源县", + "spell": "yanyuanxian", + "easy_spell": "yyx", + "city_id": "255" + }, + { + "district_id": "2207", + "district_name": "德昌县", + "spell": "dechangxian", + "easy_spell": "dcx", + "city_id": "255" + }, + { + "district_id": "2208", + "district_name": "会理县", + "spell": "huilixian", + "easy_spell": "hlx", + "city_id": "255" + }, + { + "district_id": "2209", + "district_name": "会东县", + "spell": "huidongxian", + "easy_spell": "hdx", + "city_id": "255" + }, + { + "district_id": "2210", + "district_name": "宁南县", + "spell": "ningnanxian", + "easy_spell": "nnx", + "city_id": "255" + }, + { + "district_id": "2211", + "district_name": "普格县", + "spell": "pugexian", + "easy_spell": "pgx", + "city_id": "255" + }, + { + "district_id": "2212", + "district_name": "布拖县", + "spell": "butuoxian", + "easy_spell": "btx", + "city_id": "255" + }, + { + "district_id": "2213", + "district_name": "金阳县", + "spell": "jinyangxian", + "easy_spell": "jyx", + "city_id": "255" + }, + { + "district_id": "2214", + "district_name": "昭觉县", + "spell": "zhaojuexian", + "easy_spell": "zjx", + "city_id": "255" + }, + { + "district_id": "2215", + "district_name": "喜德县", + "spell": "xidexian", + "easy_spell": "xdx", + "city_id": "255" + }, + { + "district_id": "2216", + "district_name": "冕宁县", + "spell": "mianningxian", + "easy_spell": "mnx", + "city_id": "255" + }, + { + "district_id": "2217", + "district_name": "越西县", + "spell": "yuexixian", + "easy_spell": "yxx", + "city_id": "255" + }, + { + "district_id": "2218", + "district_name": "甘洛县", + "spell": "ganluoxian", + "easy_spell": "glx", + "city_id": "255" + }, + { + "district_id": "2219", + "district_name": "美姑县", + "spell": "meiguxian", + "easy_spell": "mgx", + "city_id": "255" + }, + { + "district_id": "2220", + "district_name": "雷波县", + "spell": "leiboxian", + "easy_spell": "lbx", + "city_id": "255" + }, + { + "district_id": "2221", + "district_name": "南明区", + "spell": "nanmingqu", + "easy_spell": "nmq", + "city_id": "256" + }, + { + "district_id": "2222", + "district_name": "云岩区", + "spell": "yunyanqu", + "easy_spell": "yyq", + "city_id": "256" + }, + { + "district_id": "2223", + "district_name": "花溪区", + "spell": "huaxiqu", + "easy_spell": "hxq", + "city_id": "256" + }, + { + "district_id": "2224", + "district_name": "乌当区", + "spell": "wudangqu", + "easy_spell": "wdq", + "city_id": "256" + }, + { + "district_id": "2225", + "district_name": "白云区", + "spell": "baiyunqu", + "easy_spell": "byq", + "city_id": "256" + }, + { + "district_id": "2226", + "district_name": "小河区", + "spell": "xiaohequ", + "easy_spell": "xhq", + "city_id": "256" + }, + { + "district_id": "2227", + "district_name": "开阳县", + "spell": "kaiyangxian", + "easy_spell": "kyx", + "city_id": "256" + }, + { + "district_id": "2228", + "district_name": "息烽县", + "spell": "xifengxian", + "easy_spell": "xfx", + "city_id": "256" + }, + { + "district_id": "2229", + "district_name": "修文县", + "spell": "xiuwenxian", + "easy_spell": "xwx", + "city_id": "256" + }, + { + "district_id": "2230", + "district_name": "清镇市", + "spell": "qingzhenshi", + "easy_spell": "qzs", + "city_id": "256" + }, + { + "district_id": "2231", + "district_name": "钟山区", + "spell": "zhongshanqu", + "easy_spell": "zsq", + "city_id": "257" + }, + { + "district_id": "2232", + "district_name": "六枝特区", + "spell": "liuzhitequ", + "easy_spell": "lztq", + "city_id": "257" + }, + { + "district_id": "2233", + "district_name": "水城县", + "spell": "shuichengxian", + "easy_spell": "scx", + "city_id": "257" + }, + { + "district_id": "2234", + "district_name": "盘县", + "spell": "panxian", + "easy_spell": "px", + "city_id": "257" + }, + { + "district_id": "2235", + "district_name": "红花岗区", + "spell": "honghuagangqu", + "easy_spell": "hhgq", + "city_id": "258" + }, + { + "district_id": "2236", + "district_name": "汇川区", + "spell": "huichuanqu", + "easy_spell": "hcq", + "city_id": "258" + }, + { + "district_id": "2237", + "district_name": "遵义县", + "spell": "zunyixian", + "easy_spell": "zyx", + "city_id": "258" + }, + { + "district_id": "2238", + "district_name": "桐梓县", + "spell": "tongzuoxian", + "easy_spell": "tzx", + "city_id": "258" + }, + { + "district_id": "2239", + "district_name": "绥阳县", + "spell": "suiyangxian", + "easy_spell": "syx", + "city_id": "258" + }, + { + "district_id": "2240", + "district_name": "正安县", + "spell": "zhenganxian", + "easy_spell": "zax", + "city_id": "258" + }, + { + "district_id": "2241", + "district_name": "道真仡佬族苗族自治县", + "spell": "daozhenzuolaozumiaozuzizhixian", + "easy_spell": "dzzlzmzzzx", + "city_id": "258" + }, + { + "district_id": "2242", + "district_name": "务川仡佬族苗族自治县", + "spell": "wuchuanzuolaozumiaozuzizhixian", + "easy_spell": "wczlzmzzzx", + "city_id": "258" + }, + { + "district_id": "2243", + "district_name": "凤冈县", + "spell": "fenggangxian", + "easy_spell": "fgx", + "city_id": "258" + }, + { + "district_id": "2244", + "district_name": "湄潭县", + "spell": "zuotanxian", + "easy_spell": "ztx", + "city_id": "258" + }, + { + "district_id": "2245", + "district_name": "余庆县", + "spell": "yuqingxian", + "easy_spell": "yqx", + "city_id": "258" + }, + { + "district_id": "2246", + "district_name": "习水县", + "spell": "xishuixian", + "easy_spell": "xsx", + "city_id": "258" + }, + { + "district_id": "2247", + "district_name": "赤水市", + "spell": "chishuishi", + "easy_spell": "css", + "city_id": "258" + }, + { + "district_id": "2248", + "district_name": "仁怀市", + "spell": "renhuaishi", + "easy_spell": "rhs", + "city_id": "258" + }, + { + "district_id": "2249", + "district_name": "西秀区", + "spell": "xixiuqu", + "easy_spell": "xxq", + "city_id": "259" + }, + { + "district_id": "2250", + "district_name": "平坝县", + "spell": "pingbaxian", + "easy_spell": "pbx", + "city_id": "259" + }, + { + "district_id": "2251", + "district_name": "普定县", + "spell": "pudingxian", + "easy_spell": "pdx", + "city_id": "259" + }, + { + "district_id": "2252", + "district_name": "镇宁布依族苗族自治县", + "spell": "zhenningbuyizumiaozuzizhixian", + "easy_spell": "znbyzmzzzx", + "city_id": "259" + }, + { + "district_id": "2253", + "district_name": "关岭布依族苗族自治县", + "spell": "guanlingbuyizumiaozuzizhixian", + "easy_spell": "glbyzmzzzx", + "city_id": "259" + }, + { + "district_id": "2254", + "district_name": "紫云苗族布依族自治县", + "spell": "ziyunmiaozubuyizuzizhixian", + "easy_spell": "zymzbyzzzx", + "city_id": "259" + }, + { + "district_id": "2255", + "district_name": "铜仁市", + "spell": "tongrenshi", + "easy_spell": "trs", + "city_id": "260" + }, + { + "district_id": "2256", + "district_name": "江口县", + "spell": "jiangkouxian", + "easy_spell": "jkx", + "city_id": "260" + }, + { + "district_id": "2257", + "district_name": "玉屏侗族自治县", + "spell": "yupingdongzuzizhixian", + "easy_spell": "ypdzzzx", + "city_id": "260" + }, + { + "district_id": "2258", + "district_name": "石阡县", + "spell": "shizuoxian", + "easy_spell": "szx", + "city_id": "260" + }, + { + "district_id": "2259", + "district_name": "思南县", + "spell": "sinanxian", + "easy_spell": "snx", + "city_id": "260" + }, + { + "district_id": "2260", + "district_name": "印江土家族苗族自治县", + "spell": "yinjiangtujiazumiaozuzizhixian", + "easy_spell": "yjtjzmzzzx", + "city_id": "260" + }, + { + "district_id": "2261", + "district_name": "德江县", + "spell": "dejiangxian", + "easy_spell": "djx", + "city_id": "260" + }, + { + "district_id": "2262", + "district_name": "沿河土家族自治县", + "spell": "yanhetujiazuzizhixian", + "easy_spell": "yhtjzzzx", + "city_id": "260" + }, + { + "district_id": "2263", + "district_name": "松桃苗族自治县", + "spell": "songtaomiaozuzizhixian", + "easy_spell": "stmzzzx", + "city_id": "260" + }, + { + "district_id": "2264", + "district_name": "万山特区", + "spell": "wanshantequ", + "easy_spell": "wstq", + "city_id": "260" + }, + { + "district_id": "2265", + "district_name": "兴义市", + "spell": "xingyishi", + "easy_spell": "xys", + "city_id": "261" + }, + { + "district_id": "2266", + "district_name": "兴仁县", + "spell": "xingrenxian", + "easy_spell": "xrx", + "city_id": "261" + }, + { + "district_id": "2267", + "district_name": "普安县", + "spell": "puanxian", + "easy_spell": "pax", + "city_id": "261" + }, + { + "district_id": "2268", + "district_name": "晴隆县", + "spell": "qinglongxian", + "easy_spell": "qlx", + "city_id": "261" + }, + { + "district_id": "2269", + "district_name": "贞丰县", + "spell": "zhenfengxian", + "easy_spell": "zfx", + "city_id": "261" + }, + { + "district_id": "2270", + "district_name": "望谟县", + "spell": "wangzuoxian", + "easy_spell": "wzx", + "city_id": "261" + }, + { + "district_id": "2271", + "district_name": "册亨县", + "spell": "cehengxian", + "easy_spell": "chx", + "city_id": "261" + }, + { + "district_id": "2272", + "district_name": "安龙县", + "spell": "anlongxian", + "easy_spell": "alx", + "city_id": "261" + }, + { + "district_id": "2273", + "district_name": "毕节市", + "spell": "bijieshi", + "easy_spell": "bjs", + "city_id": "262" + }, + { + "district_id": "2274", + "district_name": "大方县", + "spell": "dafangxian", + "easy_spell": "dfx", + "city_id": "262" + }, + { + "district_id": "2275", + "district_name": "黔西县", + "spell": "qianxixian", + "easy_spell": "qxx", + "city_id": "262" + }, + { + "district_id": "2276", + "district_name": "金沙县", + "spell": "jinshaxian", + "easy_spell": "jsx", + "city_id": "262" + }, + { + "district_id": "2277", + "district_name": "织金县", + "spell": "zhijinxian", + "easy_spell": "zjx", + "city_id": "262" + }, + { + "district_id": "2278", + "district_name": "纳雍县", + "spell": "nayongxian", + "easy_spell": "nyx", + "city_id": "262" + }, + { + "district_id": "2279", + "district_name": "威宁彝族回族苗族自治县", + "spell": "weiningyizuhuizumiaozuzizhixian", + "easy_spell": "wnyzhzmzzzx", + "city_id": "262" + }, + { + "district_id": "2280", + "district_name": "赫章县", + "spell": "hezhangxian", + "easy_spell": "hzx", + "city_id": "262" + }, + { + "district_id": "2281", + "district_name": "凯里市", + "spell": "kailishi", + "easy_spell": "kls", + "city_id": "263" + }, + { + "district_id": "2282", + "district_name": "黄平县", + "spell": "huangpingxian", + "easy_spell": "hpx", + "city_id": "263" + }, + { + "district_id": "2283", + "district_name": "施秉县", + "spell": "shibingxian", + "easy_spell": "sbx", + "city_id": "263" + }, + { + "district_id": "2284", + "district_name": "三穗县", + "spell": "sansuixian", + "easy_spell": "ssx", + "city_id": "263" + }, + { + "district_id": "2285", + "district_name": "镇远县", + "spell": "zhenyuanxian", + "easy_spell": "zyx", + "city_id": "263" + }, + { + "district_id": "2286", + "district_name": "岑巩县", + "spell": "zuogongxian", + "easy_spell": "zgx", + "city_id": "263" + }, + { + "district_id": "2287", + "district_name": "天柱县", + "spell": "tianzhuxian", + "easy_spell": "tzx", + "city_id": "263" + }, + { + "district_id": "2288", + "district_name": "锦屏县", + "spell": "jinpingxian", + "easy_spell": "jpx", + "city_id": "263" + }, + { + "district_id": "2289", + "district_name": "剑河县", + "spell": "jianhexian", + "easy_spell": "jhx", + "city_id": "263" + }, + { + "district_id": "2290", + "district_name": "台江县", + "spell": "taijiangxian", + "easy_spell": "tjx", + "city_id": "263" + }, + { + "district_id": "2291", + "district_name": "黎平县", + "spell": "lipingxian", + "easy_spell": "lpx", + "city_id": "263" + }, + { + "district_id": "2292", + "district_name": "榕江县", + "spell": "zuojiangxian", + "easy_spell": "zjx", + "city_id": "263" + }, + { + "district_id": "2293", + "district_name": "从江县", + "spell": "congjiangxian", + "easy_spell": "cjx", + "city_id": "263" + }, + { + "district_id": "2294", + "district_name": "雷山县", + "spell": "leishanxian", + "easy_spell": "lsx", + "city_id": "263" + }, + { + "district_id": "2295", + "district_name": "麻江县", + "spell": "majiangxian", + "easy_spell": "mjx", + "city_id": "263" + }, + { + "district_id": "2296", + "district_name": "丹寨县", + "spell": "danzhaixian", + "easy_spell": "dzx", + "city_id": "263" + }, + { + "district_id": "2297", + "district_name": "都匀市", + "spell": "duyunshi", + "easy_spell": "dys", + "city_id": "264" + }, + { + "district_id": "2298", + "district_name": "福泉市", + "spell": "fuquanshi", + "easy_spell": "fqs", + "city_id": "264" + }, + { + "district_id": "2299", + "district_name": "荔波县", + "spell": "liboxian", + "easy_spell": "lbx", + "city_id": "264" + }, + { + "district_id": "2300", + "district_name": "贵定县", + "spell": "guidingxian", + "easy_spell": "gdx", + "city_id": "264" + }, + { + "district_id": "2301", + "district_name": "瓮安县", + "spell": "wenganxian", + "easy_spell": "wax", + "city_id": "264" + }, + { + "district_id": "2302", + "district_name": "独山县", + "spell": "dushanxian", + "easy_spell": "dsx", + "city_id": "264" + }, + { + "district_id": "2303", + "district_name": "平塘县", + "spell": "pingtangxian", + "easy_spell": "ptx", + "city_id": "264" + }, + { + "district_id": "2304", + "district_name": "罗甸县", + "spell": "luodianxian", + "easy_spell": "ldx", + "city_id": "264" + }, + { + "district_id": "2305", + "district_name": "长顺县", + "spell": "changshunxian", + "easy_spell": "csx", + "city_id": "264" + }, + { + "district_id": "2306", + "district_name": "龙里县", + "spell": "longlixian", + "easy_spell": "llx", + "city_id": "264" + }, + { + "district_id": "2307", + "district_name": "惠水县", + "spell": "huishuixian", + "easy_spell": "hsx", + "city_id": "264" + }, + { + "district_id": "2308", + "district_name": "三都水族自治县", + "spell": "sandushuizuzizhixian", + "easy_spell": "sdszzzx", + "city_id": "264" + }, + { + "district_id": "2309", + "district_name": "五华区", + "spell": "wuhuaqu", + "easy_spell": "whq", + "city_id": "265" + }, + { + "district_id": "2310", + "district_name": "盘龙区", + "spell": "panlongqu", + "easy_spell": "plq", + "city_id": "265" + }, + { + "district_id": "2311", + "district_name": "官渡区", + "spell": "guanduqu", + "easy_spell": "gdq", + "city_id": "265" + }, + { + "district_id": "2312", + "district_name": "西山区", + "spell": "xishanqu", + "easy_spell": "xsq", + "city_id": "265" + }, + { + "district_id": "2313", + "district_name": "东川区", + "spell": "dongchuanqu", + "easy_spell": "dcq", + "city_id": "265" + }, + { + "district_id": "2314", + "district_name": "呈贡县", + "spell": "chenggongxian", + "easy_spell": "cgx", + "city_id": "265" + }, + { + "district_id": "2315", + "district_name": "晋宁县", + "spell": "jinningxian", + "easy_spell": "jnx", + "city_id": "265" + }, + { + "district_id": "2316", + "district_name": "富民县", + "spell": "fuminxian", + "easy_spell": "fmx", + "city_id": "265" + }, + { + "district_id": "2317", + "district_name": "宜良县", + "spell": "yiliangxian", + "easy_spell": "ylx", + "city_id": "265" + }, + { + "district_id": "2318", + "district_name": "石林彝族自治县", + "spell": "shilinyizuzizhixian", + "easy_spell": "slyzzzx", + "city_id": "265" + }, + { + "district_id": "2319", + "district_name": "嵩明县", + "spell": "zuomingxian", + "easy_spell": "zmx", + "city_id": "265" + }, + { + "district_id": "2320", + "district_name": "禄劝彝族苗族自治县", + "spell": "luquanyizumiaozuzizhixian", + "easy_spell": "lqyzmzzzx", + "city_id": "265" + }, + { + "district_id": "2321", + "district_name": "寻甸回族彝族自治县", + "spell": "xundianhuizuyizuzizhixian", + "easy_spell": "xdhzyzzzx", + "city_id": "265" + }, + { + "district_id": "2322", + "district_name": "安宁市", + "spell": "anningshi", + "easy_spell": "ans", + "city_id": "265" + }, + { + "district_id": "2323", + "district_name": "麒麟区", + "spell": "zuozuoqu", + "easy_spell": "zzq", + "city_id": "266" + }, + { + "district_id": "2324", + "district_name": "马龙县", + "spell": "malongxian", + "easy_spell": "mlx", + "city_id": "266" + }, + { + "district_id": "2325", + "district_name": "陆良县", + "spell": "luliangxian", + "easy_spell": "llx", + "city_id": "266" + }, + { + "district_id": "2326", + "district_name": "师宗县", + "spell": "shizongxian", + "easy_spell": "szx", + "city_id": "266" + }, + { + "district_id": "2327", + "district_name": "罗平县", + "spell": "luopingxian", + "easy_spell": "lpx", + "city_id": "266" + }, + { + "district_id": "2328", + "district_name": "富源县", + "spell": "fuyuanxian", + "easy_spell": "fyx", + "city_id": "266" + }, + { + "district_id": "2329", + "district_name": "会泽县", + "spell": "huizexian", + "easy_spell": "hzx", + "city_id": "266" + }, + { + "district_id": "2330", + "district_name": "沾益县", + "spell": "zhanyixian", + "easy_spell": "zyx", + "city_id": "266" + }, + { + "district_id": "2331", + "district_name": "宣威市", + "spell": "xuanweishi", + "easy_spell": "xws", + "city_id": "266" + }, + { + "district_id": "2332", + "district_name": "红塔区", + "spell": "hongtaqu", + "easy_spell": "htq", + "city_id": "267" + }, + { + "district_id": "2333", + "district_name": "江川县", + "spell": "jiangchuanxian", + "easy_spell": "jcx", + "city_id": "267" + }, + { + "district_id": "2334", + "district_name": "澄江县", + "spell": "chengjiangxian", + "easy_spell": "cjx", + "city_id": "267" + }, + { + "district_id": "2335", + "district_name": "通海县", + "spell": "tonghaixian", + "easy_spell": "thx", + "city_id": "267" + }, + { + "district_id": "2336", + "district_name": "华宁县", + "spell": "huaningxian", + "easy_spell": "hnx", + "city_id": "267" + }, + { + "district_id": "2337", + "district_name": "易门县", + "spell": "yimenxian", + "easy_spell": "ymx", + "city_id": "267" + }, + { + "district_id": "2338", + "district_name": "峨山彝族自治县", + "spell": "eshanyizuzizhixian", + "easy_spell": "esyzzzx", + "city_id": "267" + }, + { + "district_id": "2339", + "district_name": "新平彝族傣族自治县", + "spell": "xinpingyizudaizuzizhixian", + "easy_spell": "xpyzdzzzx", + "city_id": "267" + }, + { + "district_id": "2340", + "district_name": "元江哈尼族彝族傣族自治县", + "spell": "yuanjianghanizuyizudaizuzizhixian", + "easy_spell": "yjhnzyzdzzzx", + "city_id": "267" + }, + { + "district_id": "2341", + "district_name": "隆阳区", + "spell": "longyangqu", + "easy_spell": "lyq", + "city_id": "268" + }, + { + "district_id": "2342", + "district_name": "施甸县", + "spell": "shidianxian", + "easy_spell": "sdx", + "city_id": "268" + }, + { + "district_id": "2343", + "district_name": "腾冲县", + "spell": "tengchongxian", + "easy_spell": "tcx", + "city_id": "268" + }, + { + "district_id": "2344", + "district_name": "龙陵县", + "spell": "longlingxian", + "easy_spell": "llx", + "city_id": "268" + }, + { + "district_id": "2345", + "district_name": "昌宁县", + "spell": "changningxian", + "easy_spell": "cnx", + "city_id": "268" + }, + { + "district_id": "2346", + "district_name": "昭阳区", + "spell": "zhaoyangqu", + "easy_spell": "zyq", + "city_id": "269" + }, + { + "district_id": "2347", + "district_name": "鲁甸县", + "spell": "ludianxian", + "easy_spell": "ldx", + "city_id": "269" + }, + { + "district_id": "2348", + "district_name": "巧家县", + "spell": "qiaojiaxian", + "easy_spell": "qjx", + "city_id": "269" + }, + { + "district_id": "2349", + "district_name": "盐津县", + "spell": "yanjinxian", + "easy_spell": "yjx", + "city_id": "269" + }, + { + "district_id": "2350", + "district_name": "大关县", + "spell": "daguanxian", + "easy_spell": "dgx", + "city_id": "269" + }, + { + "district_id": "2351", + "district_name": "永善县", + "spell": "yongshanxian", + "easy_spell": "ysx", + "city_id": "269" + }, + { + "district_id": "2352", + "district_name": "绥江县", + "spell": "suijiangxian", + "easy_spell": "sjx", + "city_id": "269" + }, + { + "district_id": "2353", + "district_name": "镇雄县", + "spell": "zhenxiongxian", + "easy_spell": "zxx", + "city_id": "269" + }, + { + "district_id": "2354", + "district_name": "彝良县", + "spell": "yiliangxian", + "easy_spell": "ylx", + "city_id": "269" + }, + { + "district_id": "2355", + "district_name": "威信县", + "spell": "weixinxian", + "easy_spell": "wxx", + "city_id": "269" + }, + { + "district_id": "2356", + "district_name": "水富县", + "spell": "shuifuxian", + "easy_spell": "sfx", + "city_id": "269" + }, + { + "district_id": "2357", + "district_name": "古城区", + "spell": "guchengqu", + "easy_spell": "gcq", + "city_id": "270" + }, + { + "district_id": "2358", + "district_name": "玉龙纳西族自治县", + "spell": "yulongnaxizuzizhixian", + "easy_spell": "ylnxzzzx", + "city_id": "270" + }, + { + "district_id": "2359", + "district_name": "永胜县", + "spell": "yongshengxian", + "easy_spell": "ysx", + "city_id": "270" + }, + { + "district_id": "2360", + "district_name": "华坪县", + "spell": "huapingxian", + "easy_spell": "hpx", + "city_id": "270" + }, + { + "district_id": "2361", + "district_name": "宁蒗彝族自治县", + "spell": "ningzuoyizuzizhixian", + "easy_spell": "nzyzzzx", + "city_id": "270" + }, + { + "district_id": "2362", + "district_name": "翠云区", + "spell": "cuiyunqu", + "easy_spell": "cyq", + "city_id": "271" + }, + { + "district_id": "2363", + "district_name": "普洱哈尼族彝族自治县", + "spell": "puerhanizuyizuzizhixian", + "easy_spell": "pehnzyzzzx", + "city_id": "271" + }, + { + "district_id": "2364", + "district_name": "墨江哈尼族自治县", + "spell": "mojianghanizuzizhixian", + "easy_spell": "mjhnzzzx", + "city_id": "271" + }, + { + "district_id": "2365", + "district_name": "景东彝族自治县", + "spell": "jingdongyizuzizhixian", + "easy_spell": "jdyzzzx", + "city_id": "271" + }, + { + "district_id": "2366", + "district_name": "景谷傣族彝族自治县", + "spell": "jinggudaizuyizuzizhixian", + "easy_spell": "jgdzyzzzx", + "city_id": "271" + }, + { + "district_id": "2367", + "district_name": "镇沅彝族哈尼族拉祜族自治县", + "spell": "zhenzuoyizuhanizulazuozuzizhixian", + "easy_spell": "zzyzhnzlzzzzx", + "city_id": "271" + }, + { + "district_id": "2368", + "district_name": "江城哈尼族彝族自治县", + "spell": "jiangchenghanizuyizuzizhixian", + "easy_spell": "jchnzyzzzx", + "city_id": "271" + }, + { + "district_id": "2369", + "district_name": "孟连傣族拉祜族佤族自治县", + "spell": "mengliandaizulazuozuzuozuzizhixian", + "easy_spell": "mldzlzzzzzzx", + "city_id": "271" + }, + { + "district_id": "2370", + "district_name": "澜沧拉祜族自治县", + "spell": "lancanglazuozuzizhixian", + "easy_spell": "lclzzzzx", + "city_id": "271" + }, + { + "district_id": "2371", + "district_name": "西盟佤族自治县", + "spell": "ximengzuozuzizhixian", + "easy_spell": "xmzzzzx", + "city_id": "271" + }, + { + "district_id": "2372", + "district_name": "临翔区", + "spell": "linxiangqu", + "easy_spell": "lxq", + "city_id": "272" + }, + { + "district_id": "2373", + "district_name": "凤庆县", + "spell": "fengqingxian", + "easy_spell": "fqx", + "city_id": "272" + }, + { + "district_id": "2374", + "district_name": "云县", + "spell": "yunxian", + "easy_spell": "yx", + "city_id": "272" + }, + { + "district_id": "2375", + "district_name": "永德县", + "spell": "yongdexian", + "easy_spell": "ydx", + "city_id": "272" + }, + { + "district_id": "2376", + "district_name": "镇康县", + "spell": "zhenkangxian", + "easy_spell": "zkx", + "city_id": "272" + }, + { + "district_id": "2377", + "district_name": "双江拉祜族佤族布朗族傣族自治县", + "spell": "shuangjianglazuozuzuozubulangzudaizuzizhixian", + "easy_spell": "sjlzzzzblzdzzzx", + "city_id": "272" + }, + { + "district_id": "2378", + "district_name": "耿马傣族佤族自治县", + "spell": "gengmadaizuzuozuzizhixian", + "easy_spell": "gmdzzzzzx", + "city_id": "272" + }, + { + "district_id": "2379", + "district_name": "沧源佤族自治县", + "spell": "cangyuanzuozuzizhixian", + "easy_spell": "cyzzzzx", + "city_id": "272" + }, + { + "district_id": "2380", + "district_name": "楚雄市", + "spell": "chuxiongshi", + "easy_spell": "cxs", + "city_id": "273" + }, + { + "district_id": "2381", + "district_name": "双柏县", + "spell": "shuangbaixian", + "easy_spell": "sbx", + "city_id": "273" + }, + { + "district_id": "2382", + "district_name": "牟定县", + "spell": "moudingxian", + "easy_spell": "mdx", + "city_id": "273" + }, + { + "district_id": "2383", + "district_name": "南华县", + "spell": "nanhuaxian", + "easy_spell": "nhx", + "city_id": "273" + }, + { + "district_id": "2384", + "district_name": "姚安县", + "spell": "yaoanxian", + "easy_spell": "yax", + "city_id": "273" + }, + { + "district_id": "2385", + "district_name": "大姚县", + "spell": "dayaoxian", + "easy_spell": "dyx", + "city_id": "273" + }, + { + "district_id": "2386", + "district_name": "永仁县", + "spell": "yongrenxian", + "easy_spell": "yrx", + "city_id": "273" + }, + { + "district_id": "2387", + "district_name": "元谋县", + "spell": "yuanmouxian", + "easy_spell": "ymx", + "city_id": "273" + }, + { + "district_id": "2388", + "district_name": "武定县", + "spell": "wudingxian", + "easy_spell": "wdx", + "city_id": "273" + }, + { + "district_id": "2389", + "district_name": "禄丰县", + "spell": "lufengxian", + "easy_spell": "lfx", + "city_id": "273" + }, + { + "district_id": "2390", + "district_name": "个旧市", + "spell": "gejiushi", + "easy_spell": "gjs", + "city_id": "274" + }, + { + "district_id": "2391", + "district_name": "开远市", + "spell": "kaiyuanshi", + "easy_spell": "kys", + "city_id": "274" + }, + { + "district_id": "2392", + "district_name": "蒙自县", + "spell": "mengzixian", + "easy_spell": "mzx", + "city_id": "274" + }, + { + "district_id": "2393", + "district_name": "屏边苗族自治县", + "spell": "pingbianmiaozuzizhixian", + "easy_spell": "pbmzzzx", + "city_id": "274" + }, + { + "district_id": "2394", + "district_name": "建水县", + "spell": "jianshuixian", + "easy_spell": "jsx", + "city_id": "274" + }, + { + "district_id": "2395", + "district_name": "石屏县", + "spell": "shipingxian", + "easy_spell": "spx", + "city_id": "274" + }, + { + "district_id": "2396", + "district_name": "弥勒县", + "spell": "milexian", + "easy_spell": "mlx", + "city_id": "274" + }, + { + "district_id": "2397", + "district_name": "泸西县", + "spell": "zuoxixian", + "easy_spell": "zxx", + "city_id": "274" + }, + { + "district_id": "2398", + "district_name": "元阳县", + "spell": "yuanyangxian", + "easy_spell": "yyx", + "city_id": "274" + }, + { + "district_id": "2399", + "district_name": "红河县", + "spell": "honghexian", + "easy_spell": "hhx", + "city_id": "274" + }, + { + "district_id": "2400", + "district_name": "金平苗族瑶族傣族自治县", + "spell": "jinpingmiaozuyaozudaizuzizhixian", + "easy_spell": "jpmzyzdzzzx", + "city_id": "274" + }, + { + "district_id": "2401", + "district_name": "绿春县", + "spell": "lvchunxian", + "easy_spell": "lcx", + "city_id": "274" + }, + { + "district_id": "2402", + "district_name": "河口瑶族自治县", + "spell": "hekouyaozuzizhixian", + "easy_spell": "hkyzzzx", + "city_id": "274" + }, + { + "district_id": "2403", + "district_name": "文山县", + "spell": "wenshanxian", + "easy_spell": "wsx", + "city_id": "275" + }, + { + "district_id": "2404", + "district_name": "砚山县", + "spell": "yanshanxian", + "easy_spell": "ysx", + "city_id": "275" + }, + { + "district_id": "2405", + "district_name": "西畴县", + "spell": "xichouxian", + "easy_spell": "xcx", + "city_id": "275" + }, + { + "district_id": "2406", + "district_name": "麻栗坡县", + "spell": "malipoxian", + "easy_spell": "mlpx", + "city_id": "275" + }, + { + "district_id": "2407", + "district_name": "马关县", + "spell": "maguanxian", + "easy_spell": "mgx", + "city_id": "275" + }, + { + "district_id": "2408", + "district_name": "丘北县", + "spell": "qiubeixian", + "easy_spell": "qbx", + "city_id": "275" + }, + { + "district_id": "2409", + "district_name": "广南县", + "spell": "guangnanxian", + "easy_spell": "gnx", + "city_id": "275" + }, + { + "district_id": "2410", + "district_name": "富宁县", + "spell": "funingxian", + "easy_spell": "fnx", + "city_id": "275" + }, + { + "district_id": "2411", + "district_name": "景洪市", + "spell": "jinghongshi", + "easy_spell": "jhs", + "city_id": "276" + }, + { + "district_id": "2412", + "district_name": "勐海县", + "spell": "zuohaixian", + "easy_spell": "zhx", + "city_id": "276" + }, + { + "district_id": "2413", + "district_name": "勐腊县", + "spell": "zuolaxian", + "easy_spell": "zlx", + "city_id": "276" + }, + { + "district_id": "2414", + "district_name": "大理市", + "spell": "dalishi", + "easy_spell": "dls", + "city_id": "277" + }, + { + "district_id": "2415", + "district_name": "漾濞彝族自治县", + "spell": "yangzuoyizuzizhixian", + "easy_spell": "yzyzzzx", + "city_id": "277" + }, + { + "district_id": "2416", + "district_name": "祥云县", + "spell": "xiangyunxian", + "easy_spell": "xyx", + "city_id": "277" + }, + { + "district_id": "2417", + "district_name": "宾川县", + "spell": "binchuanxian", + "easy_spell": "bcx", + "city_id": "277" + }, + { + "district_id": "2418", + "district_name": "弥渡县", + "spell": "miduxian", + "easy_spell": "mdx", + "city_id": "277" + }, + { + "district_id": "2419", + "district_name": "南涧彝族自治县", + "spell": "nanjianyizuzizhixian", + "easy_spell": "njyzzzx", + "city_id": "277" + }, + { + "district_id": "2420", + "district_name": "巍山彝族回族自治县", + "spell": "weishanyizuhuizuzizhixian", + "easy_spell": "wsyzhzzzx", + "city_id": "277" + }, + { + "district_id": "2421", + "district_name": "永平县", + "spell": "yongpingxian", + "easy_spell": "ypx", + "city_id": "277" + }, + { + "district_id": "2422", + "district_name": "云龙县", + "spell": "yunlongxian", + "easy_spell": "ylx", + "city_id": "277" + }, + { + "district_id": "2423", + "district_name": "洱源县", + "spell": "eryuanxian", + "easy_spell": "eyx", + "city_id": "277" + }, + { + "district_id": "2424", + "district_name": "剑川县", + "spell": "jianchuanxian", + "easy_spell": "jcx", + "city_id": "277" + }, + { + "district_id": "2425", + "district_name": "鹤庆县", + "spell": "heqingxian", + "easy_spell": "hqx", + "city_id": "277" + }, + { + "district_id": "2426", + "district_name": "瑞丽市", + "spell": "ruilishi", + "easy_spell": "rls", + "city_id": "278" + }, + { + "district_id": "2427", + "district_name": "潞西市", + "spell": "luxishi", + "easy_spell": "lxs", + "city_id": "278" + }, + { + "district_id": "2428", + "district_name": "梁河县", + "spell": "lianghexian", + "easy_spell": "lhx", + "city_id": "278" + }, + { + "district_id": "2429", + "district_name": "盈江县", + "spell": "yingjiangxian", + "easy_spell": "yjx", + "city_id": "278" + }, + { + "district_id": "2430", + "district_name": "陇川县", + "spell": "longchuanxian", + "easy_spell": "lcx", + "city_id": "278" + }, + { + "district_id": "2431", + "district_name": "泸水县", + "spell": "zuoshuixian", + "easy_spell": "zsx", + "city_id": "279" + }, + { + "district_id": "2432", + "district_name": "福贡县", + "spell": "fugongxian", + "easy_spell": "fgx", + "city_id": "279" + }, + { + "district_id": "2433", + "district_name": "贡山独龙族怒族自治县", + "spell": "gongshandulongzunuzuzizhixian", + "easy_spell": "gsdlznzzzx", + "city_id": "279" + }, + { + "district_id": "2434", + "district_name": "兰坪白族普米族自治县", + "spell": "lanpingbaizupumizuzizhixian", + "easy_spell": "lpbzpmzzzx", + "city_id": "279" + }, + { + "district_id": "2435", + "district_name": "香格里拉县", + "spell": "xianggelilaxian", + "easy_spell": "xgllx", + "city_id": "280" + }, + { + "district_id": "2436", + "district_name": "德钦县", + "spell": "deqinxian", + "easy_spell": "dqx", + "city_id": "280" + }, + { + "district_id": "2437", + "district_name": "维西傈僳族自治县", + "spell": "weixilisuzuzizhixian", + "easy_spell": "wxlszzzx", + "city_id": "280" + }, + { + "district_id": "2438", + "district_name": "城关区", + "spell": "chengguanqu", + "easy_spell": "cgq", + "city_id": "281" + }, + { + "district_id": "2439", + "district_name": "林周县", + "spell": "linzhouxian", + "easy_spell": "lzx", + "city_id": "281" + }, + { + "district_id": "2440", + "district_name": "当雄县", + "spell": "dangxiongxian", + "easy_spell": "dxx", + "city_id": "281" + }, + { + "district_id": "2441", + "district_name": "尼木县", + "spell": "nimuxian", + "easy_spell": "nmx", + "city_id": "281" + }, + { + "district_id": "2442", + "district_name": "曲水县", + "spell": "qushuixian", + "easy_spell": "qsx", + "city_id": "281" + }, + { + "district_id": "2443", + "district_name": "堆龙德庆县", + "spell": "duilongdeqingxian", + "easy_spell": "dldqx", + "city_id": "281" + }, + { + "district_id": "2444", + "district_name": "达孜县", + "spell": "dazixian", + "easy_spell": "dzx", + "city_id": "281" + }, + { + "district_id": "2445", + "district_name": "墨竹工卡县", + "spell": "mozhugongkaxian", + "easy_spell": "mzgkx", + "city_id": "281" + }, + { + "district_id": "2446", + "district_name": "昌都县", + "spell": "changduxian", + "easy_spell": "cdx", + "city_id": "282" + }, + { + "district_id": "2447", + "district_name": "江达县", + "spell": "jiangdaxian", + "easy_spell": "jdx", + "city_id": "282" + }, + { + "district_id": "2448", + "district_name": "贡觉县", + "spell": "gongjuexian", + "easy_spell": "gjx", + "city_id": "282" + }, + { + "district_id": "2449", + "district_name": "类乌齐县", + "spell": "leiwuqixian", + "easy_spell": "lwqx", + "city_id": "282" + }, + { + "district_id": "2450", + "district_name": "丁青县", + "spell": "dingqingxian", + "easy_spell": "dqx", + "city_id": "282" + }, + { + "district_id": "2451", + "district_name": "察雅县", + "spell": "chayaxian", + "easy_spell": "cyx", + "city_id": "282" + }, + { + "district_id": "2452", + "district_name": "八宿县", + "spell": "basuxian", + "easy_spell": "bsx", + "city_id": "282" + }, + { + "district_id": "2453", + "district_name": "左贡县", + "spell": "zuogongxian", + "easy_spell": "zgx", + "city_id": "282" + }, + { + "district_id": "2454", + "district_name": "芒康县", + "spell": "mangkangxian", + "easy_spell": "mkx", + "city_id": "282" + }, + { + "district_id": "2455", + "district_name": "洛隆县", + "spell": "luolongxian", + "easy_spell": "llx", + "city_id": "282" + }, + { + "district_id": "2456", + "district_name": "边坝县", + "spell": "bianbaxian", + "easy_spell": "bbx", + "city_id": "282" + }, + { + "district_id": "2457", + "district_name": "乃东县", + "spell": "naidongxian", + "easy_spell": "ndx", + "city_id": "283" + }, + { + "district_id": "2458", + "district_name": "扎囊县", + "spell": "zhanangxian", + "easy_spell": "znx", + "city_id": "283" + }, + { + "district_id": "2459", + "district_name": "贡嘎县", + "spell": "gonggaxian", + "easy_spell": "ggx", + "city_id": "283" + }, + { + "district_id": "2460", + "district_name": "桑日县", + "spell": "sangrixian", + "easy_spell": "srx", + "city_id": "283" + }, + { + "district_id": "2461", + "district_name": "琼结县", + "spell": "qiongjiexian", + "easy_spell": "qjx", + "city_id": "283" + }, + { + "district_id": "2462", + "district_name": "曲松县", + "spell": "qusongxian", + "easy_spell": "qsx", + "city_id": "283" + }, + { + "district_id": "2463", + "district_name": "措美县", + "spell": "cuomeixian", + "easy_spell": "cmx", + "city_id": "283" + }, + { + "district_id": "2464", + "district_name": "洛扎县", + "spell": "luozhaxian", + "easy_spell": "lzx", + "city_id": "283" + }, + { + "district_id": "2465", + "district_name": "加查县", + "spell": "jiachaxian", + "easy_spell": "jcx", + "city_id": "283" + }, + { + "district_id": "2466", + "district_name": "隆子县", + "spell": "longzixian", + "easy_spell": "lzx", + "city_id": "283" + }, + { + "district_id": "2467", + "district_name": "错那县", + "spell": "cuonaxian", + "easy_spell": "cnx", + "city_id": "283" + }, + { + "district_id": "2468", + "district_name": "浪卡子县", + "spell": "langkazixian", + "easy_spell": "lkzx", + "city_id": "283" + }, + { + "district_id": "2469", + "district_name": "日喀则市", + "spell": "rikazeshi", + "easy_spell": "rkzs", + "city_id": "284" + }, + { + "district_id": "2470", + "district_name": "南木林县", + "spell": "nanmulinxian", + "easy_spell": "nmlx", + "city_id": "284" + }, + { + "district_id": "2471", + "district_name": "江孜县", + "spell": "jiangzixian", + "easy_spell": "jzx", + "city_id": "284" + }, + { + "district_id": "2472", + "district_name": "定日县", + "spell": "dingrixian", + "easy_spell": "drx", + "city_id": "284" + }, + { + "district_id": "2473", + "district_name": "萨迦县", + "spell": "sazuoxian", + "easy_spell": "szx", + "city_id": "284" + }, + { + "district_id": "2474", + "district_name": "拉孜县", + "spell": "lazixian", + "easy_spell": "lzx", + "city_id": "284" + }, + { + "district_id": "2475", + "district_name": "昂仁县", + "spell": "angrenxian", + "easy_spell": "arx", + "city_id": "284" + }, + { + "district_id": "2476", + "district_name": "谢通门县", + "spell": "xietongmenxian", + "easy_spell": "xtmx", + "city_id": "284" + }, + { + "district_id": "2477", + "district_name": "白朗县", + "spell": "bailangxian", + "easy_spell": "blx", + "city_id": "284" + }, + { + "district_id": "2478", + "district_name": "仁布县", + "spell": "renbuxian", + "easy_spell": "rbx", + "city_id": "284" + }, + { + "district_id": "2479", + "district_name": "康马县", + "spell": "kangmaxian", + "easy_spell": "kmx", + "city_id": "284" + }, + { + "district_id": "2480", + "district_name": "定结县", + "spell": "dingjiexian", + "easy_spell": "djx", + "city_id": "284" + }, + { + "district_id": "2481", + "district_name": "仲巴县", + "spell": "zhongbaxian", + "easy_spell": "zbx", + "city_id": "284" + }, + { + "district_id": "2482", + "district_name": "亚东县", + "spell": "yadongxian", + "easy_spell": "ydx", + "city_id": "284" + }, + { + "district_id": "2483", + "district_name": "吉隆县", + "spell": "jilongxian", + "easy_spell": "jlx", + "city_id": "284" + }, + { + "district_id": "2484", + "district_name": "聂拉木县", + "spell": "nielamuxian", + "easy_spell": "nlmx", + "city_id": "284" + }, + { + "district_id": "2485", + "district_name": "萨嘎县", + "spell": "sagaxian", + "easy_spell": "sgx", + "city_id": "284" + }, + { + "district_id": "2486", + "district_name": "岗巴县", + "spell": "gangbaxian", + "easy_spell": "gbx", + "city_id": "284" + }, + { + "district_id": "2487", + "district_name": "那曲县", + "spell": "naquxian", + "easy_spell": "nqx", + "city_id": "285" + }, + { + "district_id": "2488", + "district_name": "嘉黎县", + "spell": "jialixian", + "easy_spell": "jlx", + "city_id": "285" + }, + { + "district_id": "2489", + "district_name": "比如县", + "spell": "biruxian", + "easy_spell": "brx", + "city_id": "285" + }, + { + "district_id": "2490", + "district_name": "聂荣县", + "spell": "nierongxian", + "easy_spell": "nrx", + "city_id": "285" + }, + { + "district_id": "2491", + "district_name": "安多县", + "spell": "anduoxian", + "easy_spell": "adx", + "city_id": "285" + }, + { + "district_id": "2492", + "district_name": "申扎县", + "spell": "shenzhaxian", + "easy_spell": "szx", + "city_id": "285" + }, + { + "district_id": "2493", + "district_name": "索县", + "spell": "suoxian", + "easy_spell": "sx", + "city_id": "285" + }, + { + "district_id": "2494", + "district_name": "班戈县", + "spell": "bangexian", + "easy_spell": "bgx", + "city_id": "285" + }, + { + "district_id": "2495", + "district_name": "巴青县", + "spell": "baqingxian", + "easy_spell": "bqx", + "city_id": "285" + }, + { + "district_id": "2496", + "district_name": "尼玛县", + "spell": "nimaxian", + "easy_spell": "nmx", + "city_id": "285" + }, + { + "district_id": "2497", + "district_name": "普兰县", + "spell": "pulanxian", + "easy_spell": "plx", + "city_id": "286" + }, + { + "district_id": "2498", + "district_name": "札达县", + "spell": "zhadaxian", + "easy_spell": "zdx", + "city_id": "286" + }, + { + "district_id": "2499", + "district_name": "噶尔县", + "spell": "gaerxian", + "easy_spell": "gex", + "city_id": "286" + }, + { + "district_id": "2500", + "district_name": "日土县", + "spell": "rituxian", + "easy_spell": "rtx", + "city_id": "286" + }, + { + "district_id": "2501", + "district_name": "革吉县", + "spell": "gejixian", + "easy_spell": "gjx", + "city_id": "286" + }, + { + "district_id": "2502", + "district_name": "改则县", + "spell": "gaizexian", + "easy_spell": "gzx", + "city_id": "286" + }, + { + "district_id": "2503", + "district_name": "措勤县", + "spell": "cuoqinxian", + "easy_spell": "cqx", + "city_id": "286" + }, + { + "district_id": "2504", + "district_name": "林芝县", + "spell": "linzhixian", + "easy_spell": "lzx", + "city_id": "287" + }, + { + "district_id": "2505", + "district_name": "工布江达县", + "spell": "gongbujiangdaxian", + "easy_spell": "gbjdx", + "city_id": "287" + }, + { + "district_id": "2506", + "district_name": "米林县", + "spell": "milinxian", + "easy_spell": "mlx", + "city_id": "287" + }, + { + "district_id": "2507", + "district_name": "墨脱县", + "spell": "motuoxian", + "easy_spell": "mtx", + "city_id": "287" + }, + { + "district_id": "2508", + "district_name": "波密县", + "spell": "bomixian", + "easy_spell": "bmx", + "city_id": "287" + }, + { + "district_id": "2509", + "district_name": "察隅县", + "spell": "chayuxian", + "easy_spell": "cyx", + "city_id": "287" + }, + { + "district_id": "2510", + "district_name": "朗县", + "spell": "langxian", + "easy_spell": "lx", + "city_id": "287" + }, + { + "district_id": "2511", + "district_name": "新城区", + "spell": "xinchengqu", + "easy_spell": "xcq", + "city_id": "288" + }, + { + "district_id": "2512", + "district_name": "碑林区", + "spell": "beilinqu", + "easy_spell": "blq", + "city_id": "288" + }, + { + "district_id": "2513", + "district_name": "莲湖区", + "spell": "lianhuqu", + "easy_spell": "lhq", + "city_id": "288" + }, + { + "district_id": "2514", + "district_name": "灞桥区", + "spell": "zuoqiaoqu", + "easy_spell": "zqq", + "city_id": "288" + }, + { + "district_id": "2515", + "district_name": "未央区", + "spell": "weiyangqu", + "easy_spell": "wyq", + "city_id": "288" + }, + { + "district_id": "2516", + "district_name": "雁塔区", + "spell": "yantaqu", + "easy_spell": "ytq", + "city_id": "288" + }, + { + "district_id": "2517", + "district_name": "阎良区", + "spell": "yanliangqu", + "easy_spell": "ylq", + "city_id": "288" + }, + { + "district_id": "2518", + "district_name": "临潼区", + "spell": "linzuoqu", + "easy_spell": "lzq", + "city_id": "288" + }, + { + "district_id": "2519", + "district_name": "长安区", + "spell": "changanqu", + "easy_spell": "caq", + "city_id": "288" + }, + { + "district_id": "2520", + "district_name": "蓝田县", + "spell": "lantianxian", + "easy_spell": "ltx", + "city_id": "288" + }, + { + "district_id": "2521", + "district_name": "周至县", + "spell": "zhouzhixian", + "easy_spell": "zzx", + "city_id": "288" + }, + { + "district_id": "2522", + "district_name": "户县", + "spell": "huxian", + "easy_spell": "hx", + "city_id": "288" + }, + { + "district_id": "2523", + "district_name": "高陵县", + "spell": "gaolingxian", + "easy_spell": "glx", + "city_id": "288" + }, + { + "district_id": "2524", + "district_name": "王益区", + "spell": "wangyiqu", + "easy_spell": "wyq", + "city_id": "289" + }, + { + "district_id": "2525", + "district_name": "印台区", + "spell": "yintaiqu", + "easy_spell": "ytq", + "city_id": "289" + }, + { + "district_id": "2526", + "district_name": "耀州区", + "spell": "yaozhouqu", + "easy_spell": "yzq", + "city_id": "289" + }, + { + "district_id": "2527", + "district_name": "宜君县", + "spell": "yijunxian", + "easy_spell": "yjx", + "city_id": "289" + }, + { + "district_id": "2528", + "district_name": "渭滨区", + "spell": "weibinqu", + "easy_spell": "wbq", + "city_id": "290" + }, + { + "district_id": "2529", + "district_name": "金台区", + "spell": "jintaiqu", + "easy_spell": "jtq", + "city_id": "290" + }, + { + "district_id": "2530", + "district_name": "陈仓区", + "spell": "chencangqu", + "easy_spell": "ccq", + "city_id": "290" + }, + { + "district_id": "2531", + "district_name": "凤翔县", + "spell": "fengxiangxian", + "easy_spell": "fxx", + "city_id": "290" + }, + { + "district_id": "2532", + "district_name": "岐山县", + "spell": "zuoshanxian", + "easy_spell": "zsx", + "city_id": "290" + }, + { + "district_id": "2533", + "district_name": "扶风县", + "spell": "fufengxian", + "easy_spell": "ffx", + "city_id": "290" + }, + { + "district_id": "2534", + "district_name": "眉县", + "spell": "meixian", + "easy_spell": "mx", + "city_id": "290" + }, + { + "district_id": "2535", + "district_name": "陇县", + "spell": "longxian", + "easy_spell": "lx", + "city_id": "290" + }, + { + "district_id": "2536", + "district_name": "千阳县", + "spell": "qianyangxian", + "easy_spell": "qyx", + "city_id": "290" + }, + { + "district_id": "2537", + "district_name": "麟游县", + "spell": "zuoyouxian", + "easy_spell": "zyx", + "city_id": "290" + }, + { + "district_id": "2538", + "district_name": "凤县", + "spell": "fengxian", + "easy_spell": "fx", + "city_id": "290" + }, + { + "district_id": "2539", + "district_name": "太白县", + "spell": "taibaixian", + "easy_spell": "tbx", + "city_id": "290" + }, + { + "district_id": "2540", + "district_name": "秦都区", + "spell": "qinduqu", + "easy_spell": "qdq", + "city_id": "291" + }, + { + "district_id": "2541", + "district_name": "杨凌区", + "spell": "yanglingqu", + "easy_spell": "ylq", + "city_id": "291" + }, + { + "district_id": "2542", + "district_name": "渭城区", + "spell": "weichengqu", + "easy_spell": "wcq", + "city_id": "291" + }, + { + "district_id": "2543", + "district_name": "三原县", + "spell": "sanyuanxian", + "easy_spell": "syx", + "city_id": "291" + }, + { + "district_id": "2544", + "district_name": "泾阳县", + "spell": "zuoyangxian", + "easy_spell": "zyx", + "city_id": "291" + }, + { + "district_id": "2545", + "district_name": "乾县", + "spell": "qianxian", + "easy_spell": "qx", + "city_id": "291" + }, + { + "district_id": "2546", + "district_name": "礼泉县", + "spell": "liquanxian", + "easy_spell": "lqx", + "city_id": "291" + }, + { + "district_id": "2547", + "district_name": "永寿县", + "spell": "yongshouxian", + "easy_spell": "ysx", + "city_id": "291" + }, + { + "district_id": "2548", + "district_name": "彬县", + "spell": "binxian", + "easy_spell": "bx", + "city_id": "291" + }, + { + "district_id": "2549", + "district_name": "长武县", + "spell": "changwuxian", + "easy_spell": "cwx", + "city_id": "291" + }, + { + "district_id": "2550", + "district_name": "旬邑县", + "spell": "xunyixian", + "easy_spell": "xyx", + "city_id": "291" + }, + { + "district_id": "2551", + "district_name": "淳化县", + "spell": "chunhuaxian", + "easy_spell": "chx", + "city_id": "291" + }, + { + "district_id": "2552", + "district_name": "武功县", + "spell": "wugongxian", + "easy_spell": "wgx", + "city_id": "291" + }, + { + "district_id": "2553", + "district_name": "兴平市", + "spell": "xingpingshi", + "easy_spell": "xps", + "city_id": "291" + }, + { + "district_id": "2554", + "district_name": "临渭区", + "spell": "linweiqu", + "easy_spell": "lwq", + "city_id": "292" + }, + { + "district_id": "2555", + "district_name": "华县", + "spell": "huaxian", + "easy_spell": "hx", + "city_id": "292" + }, + { + "district_id": "2556", + "district_name": "潼关县", + "spell": "zuoguanxian", + "easy_spell": "zgx", + "city_id": "292" + }, + { + "district_id": "2557", + "district_name": "大荔县", + "spell": "dalixian", + "easy_spell": "dlx", + "city_id": "292" + }, + { + "district_id": "2558", + "district_name": "合阳县", + "spell": "heyangxian", + "easy_spell": "hyx", + "city_id": "292" + }, + { + "district_id": "2559", + "district_name": "澄城县", + "spell": "chengchengxian", + "easy_spell": "ccx", + "city_id": "292" + }, + { + "district_id": "2560", + "district_name": "蒲城县", + "spell": "puchengxian", + "easy_spell": "pcx", + "city_id": "292" + }, + { + "district_id": "2561", + "district_name": "白水县", + "spell": "baishuixian", + "easy_spell": "bsx", + "city_id": "292" + }, + { + "district_id": "2562", + "district_name": "富平县", + "spell": "fupingxian", + "easy_spell": "fpx", + "city_id": "292" + }, + { + "district_id": "2563", + "district_name": "韩城市", + "spell": "hanchengshi", + "easy_spell": "hcs", + "city_id": "292" + }, + { + "district_id": "2564", + "district_name": "华阴市", + "spell": "huayinshi", + "easy_spell": "hys", + "city_id": "292" + }, + { + "district_id": "2565", + "district_name": "宝塔区", + "spell": "baotaqu", + "easy_spell": "btq", + "city_id": "293" + }, + { + "district_id": "2566", + "district_name": "延长县", + "spell": "yanchangxian", + "easy_spell": "ycx", + "city_id": "293" + }, + { + "district_id": "2567", + "district_name": "延川县", + "spell": "yanchuanxian", + "easy_spell": "ycx", + "city_id": "293" + }, + { + "district_id": "2568", + "district_name": "子长县", + "spell": "zichangxian", + "easy_spell": "zcx", + "city_id": "293" + }, + { + "district_id": "2569", + "district_name": "安塞县", + "spell": "ansaixian", + "easy_spell": "asx", + "city_id": "293" + }, + { + "district_id": "2570", + "district_name": "志丹县", + "spell": "zhidanxian", + "easy_spell": "zdx", + "city_id": "293" + }, + { + "district_id": "2571", + "district_name": "吴旗县", + "spell": "wuqixian", + "easy_spell": "wqx", + "city_id": "293" + }, + { + "district_id": "2572", + "district_name": "甘泉县", + "spell": "ganquanxian", + "easy_spell": "gqx", + "city_id": "293" + }, + { + "district_id": "2573", + "district_name": "富县", + "spell": "fuxian", + "easy_spell": "fx", + "city_id": "293" + }, + { + "district_id": "2574", + "district_name": "洛川县", + "spell": "luochuanxian", + "easy_spell": "lcx", + "city_id": "293" + }, + { + "district_id": "2575", + "district_name": "宜川县", + "spell": "yichuanxian", + "easy_spell": "ycx", + "city_id": "293" + }, + { + "district_id": "2576", + "district_name": "黄龙县", + "spell": "huanglongxian", + "easy_spell": "hlx", + "city_id": "293" + }, + { + "district_id": "2577", + "district_name": "黄陵县", + "spell": "huanglingxian", + "easy_spell": "hlx", + "city_id": "293" + }, + { + "district_id": "2578", + "district_name": "汉台区", + "spell": "hantaiqu", + "easy_spell": "htq", + "city_id": "294" + }, + { + "district_id": "2579", + "district_name": "南郑县", + "spell": "nanzhengxian", + "easy_spell": "nzx", + "city_id": "294" + }, + { + "district_id": "2580", + "district_name": "城固县", + "spell": "chengguxian", + "easy_spell": "cgx", + "city_id": "294" + }, + { + "district_id": "2581", + "district_name": "洋县", + "spell": "yangxian", + "easy_spell": "yx", + "city_id": "294" + }, + { + "district_id": "2582", + "district_name": "西乡县", + "spell": "xixiangxian", + "easy_spell": "xxx", + "city_id": "294" + }, + { + "district_id": "2583", + "district_name": "勉县", + "spell": "mianxian", + "easy_spell": "mx", + "city_id": "294" + }, + { + "district_id": "2584", + "district_name": "宁强县", + "spell": "ningqiangxian", + "easy_spell": "nqx", + "city_id": "294" + }, + { + "district_id": "2585", + "district_name": "略阳县", + "spell": "lueyangxian", + "easy_spell": "lyx", + "city_id": "294" + }, + { + "district_id": "2586", + "district_name": "镇巴县", + "spell": "zhenbaxian", + "easy_spell": "zbx", + "city_id": "294" + }, + { + "district_id": "2587", + "district_name": "留坝县", + "spell": "liubaxian", + "easy_spell": "lbx", + "city_id": "294" + }, + { + "district_id": "2588", + "district_name": "佛坪县", + "spell": "fopingxian", + "easy_spell": "fpx", + "city_id": "294" + }, + { + "district_id": "2589", + "district_name": "榆阳区", + "spell": "yuyangqu", + "easy_spell": "yyq", + "city_id": "295" + }, + { + "district_id": "2590", + "district_name": "神木县", + "spell": "shenmuxian", + "easy_spell": "smx", + "city_id": "295" + }, + { + "district_id": "2591", + "district_name": "府谷县", + "spell": "fuguxian", + "easy_spell": "fgx", + "city_id": "295" + }, + { + "district_id": "2592", + "district_name": "横山县", + "spell": "hengshanxian", + "easy_spell": "hsx", + "city_id": "295" + }, + { + "district_id": "2593", + "district_name": "靖边县", + "spell": "jingbianxian", + "easy_spell": "jbx", + "city_id": "295" + }, + { + "district_id": "2594", + "district_name": "定边县", + "spell": "dingbianxian", + "easy_spell": "dbx", + "city_id": "295" + }, + { + "district_id": "2595", + "district_name": "绥德县", + "spell": "suidexian", + "easy_spell": "sdx", + "city_id": "295" + }, + { + "district_id": "2596", + "district_name": "米脂县", + "spell": "mizhixian", + "easy_spell": "mzx", + "city_id": "295" + }, + { + "district_id": "2597", + "district_name": "佳县", + "spell": "jiaxian", + "easy_spell": "jx", + "city_id": "295" + }, + { + "district_id": "2598", + "district_name": "吴堡县", + "spell": "wubaoxian", + "easy_spell": "wbx", + "city_id": "295" + }, + { + "district_id": "2599", + "district_name": "清涧县", + "spell": "qingjianxian", + "easy_spell": "qjx", + "city_id": "295" + }, + { + "district_id": "2600", + "district_name": "子洲县", + "spell": "zizhouxian", + "easy_spell": "zzx", + "city_id": "295" + }, + { + "district_id": "2601", + "district_name": "汉滨区", + "spell": "hanbinqu", + "easy_spell": "hbq", + "city_id": "296" + }, + { + "district_id": "2602", + "district_name": "汉阴县", + "spell": "hanyinxian", + "easy_spell": "hyx", + "city_id": "296" + }, + { + "district_id": "2603", + "district_name": "石泉县", + "spell": "shiquanxian", + "easy_spell": "sqx", + "city_id": "296" + }, + { + "district_id": "2604", + "district_name": "宁陕县", + "spell": "ningshanxian", + "easy_spell": "nsx", + "city_id": "296" + }, + { + "district_id": "2605", + "district_name": "紫阳县", + "spell": "ziyangxian", + "easy_spell": "zyx", + "city_id": "296" + }, + { + "district_id": "2606", + "district_name": "岚皋县", + "spell": "zuogaoxian", + "easy_spell": "zgx", + "city_id": "296" + }, + { + "district_id": "2607", + "district_name": "平利县", + "spell": "pinglixian", + "easy_spell": "plx", + "city_id": "296" + }, + { + "district_id": "2608", + "district_name": "镇坪县", + "spell": "zhenpingxian", + "easy_spell": "zpx", + "city_id": "296" + }, + { + "district_id": "2609", + "district_name": "旬阳县", + "spell": "xunyangxian", + "easy_spell": "xyx", + "city_id": "296" + }, + { + "district_id": "2610", + "district_name": "白河县", + "spell": "baihexian", + "easy_spell": "bhx", + "city_id": "296" + }, + { + "district_id": "2611", + "district_name": "商州区", + "spell": "shangzhouqu", + "easy_spell": "szq", + "city_id": "297" + }, + { + "district_id": "2612", + "district_name": "洛南县", + "spell": "luonanxian", + "easy_spell": "lnx", + "city_id": "297" + }, + { + "district_id": "2613", + "district_name": "丹凤县", + "spell": "danfengxian", + "easy_spell": "dfx", + "city_id": "297" + }, + { + "district_id": "2614", + "district_name": "商南县", + "spell": "shangnanxian", + "easy_spell": "snx", + "city_id": "297" + }, + { + "district_id": "2615", + "district_name": "山阳县", + "spell": "shanyangxian", + "easy_spell": "syx", + "city_id": "297" + }, + { + "district_id": "2616", + "district_name": "镇安县", + "spell": "zhenanxian", + "easy_spell": "zax", + "city_id": "297" + }, + { + "district_id": "2617", + "district_name": "柞水县", + "spell": "zuoshuixian", + "easy_spell": "zsx", + "city_id": "297" + }, + { + "district_id": "2618", + "district_name": "城关区", + "spell": "chengguanqu", + "easy_spell": "cgq", + "city_id": "298" + }, + { + "district_id": "2619", + "district_name": "七里河区", + "spell": "qilihequ", + "easy_spell": "qlhq", + "city_id": "298" + }, + { + "district_id": "2620", + "district_name": "西固区", + "spell": "xiguqu", + "easy_spell": "xgq", + "city_id": "298" + }, + { + "district_id": "2621", + "district_name": "安宁区", + "spell": "anningqu", + "easy_spell": "anq", + "city_id": "298" + }, + { + "district_id": "2622", + "district_name": "红古区", + "spell": "hongguqu", + "easy_spell": "hgq", + "city_id": "298" + }, + { + "district_id": "2623", + "district_name": "永登县", + "spell": "yongdengxian", + "easy_spell": "ydx", + "city_id": "298" + }, + { + "district_id": "2624", + "district_name": "皋兰县", + "spell": "gaolanxian", + "easy_spell": "glx", + "city_id": "298" + }, + { + "district_id": "2625", + "district_name": "榆中县", + "spell": "yuzhongxian", + "easy_spell": "yzx", + "city_id": "298" + }, + { + "district_id": "2626", + "district_name": "金川区", + "spell": "jinchuanqu", + "easy_spell": "jcq", + "city_id": "300" + }, + { + "district_id": "2627", + "district_name": "永昌县", + "spell": "yongchangxian", + "easy_spell": "ycx", + "city_id": "300" + }, + { + "district_id": "2628", + "district_name": "白银区", + "spell": "baiyinqu", + "easy_spell": "byq", + "city_id": "301" + }, + { + "district_id": "2629", + "district_name": "平川区", + "spell": "pingchuanqu", + "easy_spell": "pcq", + "city_id": "301" + }, + { + "district_id": "2630", + "district_name": "靖远县", + "spell": "jingyuanxian", + "easy_spell": "jyx", + "city_id": "301" + }, + { + "district_id": "2631", + "district_name": "会宁县", + "spell": "huiningxian", + "easy_spell": "hnx", + "city_id": "301" + }, + { + "district_id": "2632", + "district_name": "景泰县", + "spell": "jingtaixian", + "easy_spell": "jtx", + "city_id": "301" + }, + { + "district_id": "2633", + "district_name": "秦城区", + "spell": "qinchengqu", + "easy_spell": "qcq", + "city_id": "302" + }, + { + "district_id": "2634", + "district_name": "北道区", + "spell": "beidaoqu", + "easy_spell": "bdq", + "city_id": "302" + }, + { + "district_id": "2635", + "district_name": "清水县", + "spell": "qingshuixian", + "easy_spell": "qsx", + "city_id": "302" + }, + { + "district_id": "2636", + "district_name": "秦安县", + "spell": "qinanxian", + "easy_spell": "qax", + "city_id": "302" + }, + { + "district_id": "2637", + "district_name": "甘谷县", + "spell": "ganguxian", + "easy_spell": "ggx", + "city_id": "302" + }, + { + "district_id": "2638", + "district_name": "武山县", + "spell": "wushanxian", + "easy_spell": "wsx", + "city_id": "302" + }, + { + "district_id": "2639", + "district_name": "张家川回族自治县", + "spell": "zhangjiachuanhuizuzizhixian", + "easy_spell": "zjchzzzx", + "city_id": "302" + }, + { + "district_id": "2640", + "district_name": "凉州区", + "spell": "liangzhouqu", + "easy_spell": "lzq", + "city_id": "303" + }, + { + "district_id": "2641", + "district_name": "民勤县", + "spell": "minqinxian", + "easy_spell": "mqx", + "city_id": "303" + }, + { + "district_id": "2642", + "district_name": "古浪县", + "spell": "gulangxian", + "easy_spell": "glx", + "city_id": "303" + }, + { + "district_id": "2643", + "district_name": "天祝藏族自治县", + "spell": "tianzhucangzuzizhixian", + "easy_spell": "tzczzzx", + "city_id": "303" + }, + { + "district_id": "2644", + "district_name": "甘州区", + "spell": "ganzhouqu", + "easy_spell": "gzq", + "city_id": "304" + }, + { + "district_id": "2645", + "district_name": "肃南裕固族自治县", + "spell": "sunanyuguzuzizhixian", + "easy_spell": "snygzzzx", + "city_id": "304" + }, + { + "district_id": "2646", + "district_name": "民乐县", + "spell": "minlexian", + "easy_spell": "mlx", + "city_id": "304" + }, + { + "district_id": "2647", + "district_name": "临泽县", + "spell": "linzexian", + "easy_spell": "lzx", + "city_id": "304" + }, + { + "district_id": "2648", + "district_name": "高台县", + "spell": "gaotaixian", + "easy_spell": "gtx", + "city_id": "304" + }, + { + "district_id": "2649", + "district_name": "山丹县", + "spell": "shandanxian", + "easy_spell": "sdx", + "city_id": "304" + }, + { + "district_id": "2650", + "district_name": "崆峒区", + "spell": "zuozuoqu", + "easy_spell": "zzq", + "city_id": "305" + }, + { + "district_id": "2651", + "district_name": "泾川县", + "spell": "zuochuanxian", + "easy_spell": "zcx", + "city_id": "305" + }, + { + "district_id": "2652", + "district_name": "灵台县", + "spell": "lingtaixian", + "easy_spell": "ltx", + "city_id": "305" + }, + { + "district_id": "2653", + "district_name": "崇信县", + "spell": "chongxinxian", + "easy_spell": "cxx", + "city_id": "305" + }, + { + "district_id": "2654", + "district_name": "华亭县", + "spell": "huatingxian", + "easy_spell": "htx", + "city_id": "305" + }, + { + "district_id": "2655", + "district_name": "庄浪县", + "spell": "zhuanglangxian", + "easy_spell": "zlx", + "city_id": "305" + }, + { + "district_id": "2656", + "district_name": "静宁县", + "spell": "jingningxian", + "easy_spell": "jnx", + "city_id": "305" + }, + { + "district_id": "2657", + "district_name": "肃州区", + "spell": "suzhouqu", + "easy_spell": "szq", + "city_id": "306" + }, + { + "district_id": "2658", + "district_name": "金塔县", + "spell": "jintaxian", + "easy_spell": "jtx", + "city_id": "306" + }, + { + "district_id": "2659", + "district_name": "安西县", + "spell": "anxixian", + "easy_spell": "axx", + "city_id": "306" + }, + { + "district_id": "2660", + "district_name": "肃北蒙古族自治县", + "spell": "subeimengguzuzizhixian", + "easy_spell": "sbmgzzzx", + "city_id": "306" + }, + { + "district_id": "2661", + "district_name": "阿克塞哈萨克族自治县", + "spell": "akesaihasakezuzizhixian", + "easy_spell": "akshskzzzx", + "city_id": "306" + }, + { + "district_id": "2662", + "district_name": "玉门市", + "spell": "yumenshi", + "easy_spell": "yms", + "city_id": "306" + }, + { + "district_id": "2663", + "district_name": "敦煌市", + "spell": "dunhuangshi", + "easy_spell": "dhs", + "city_id": "306" + }, + { + "district_id": "2664", + "district_name": "西峰区", + "spell": "xifengqu", + "easy_spell": "xfq", + "city_id": "307" + }, + { + "district_id": "2665", + "district_name": "庆城县", + "spell": "qingchengxian", + "easy_spell": "qcx", + "city_id": "307" + }, + { + "district_id": "2666", + "district_name": "环县", + "spell": "huanxian", + "easy_spell": "hx", + "city_id": "307" + }, + { + "district_id": "2667", + "district_name": "华池县", + "spell": "huachixian", + "easy_spell": "hcx", + "city_id": "307" + }, + { + "district_id": "2668", + "district_name": "合水县", + "spell": "heshuixian", + "easy_spell": "hsx", + "city_id": "307" + }, + { + "district_id": "2669", + "district_name": "正宁县", + "spell": "zhengningxian", + "easy_spell": "znx", + "city_id": "307" + }, + { + "district_id": "2670", + "district_name": "宁县", + "spell": "ningxian", + "easy_spell": "nx", + "city_id": "307" + }, + { + "district_id": "2671", + "district_name": "镇原县", + "spell": "zhenyuanxian", + "easy_spell": "zyx", + "city_id": "307" + }, + { + "district_id": "2672", + "district_name": "安定区", + "spell": "andingqu", + "easy_spell": "adq", + "city_id": "308" + }, + { + "district_id": "2673", + "district_name": "通渭县", + "spell": "tongweixian", + "easy_spell": "twx", + "city_id": "308" + }, + { + "district_id": "2674", + "district_name": "陇西县", + "spell": "longxixian", + "easy_spell": "lxx", + "city_id": "308" + }, + { + "district_id": "2675", + "district_name": "渭源县", + "spell": "weiyuanxian", + "easy_spell": "wyx", + "city_id": "308" + }, + { + "district_id": "2676", + "district_name": "临洮县", + "spell": "linzuoxian", + "easy_spell": "lzx", + "city_id": "308" + }, + { + "district_id": "2677", + "district_name": "漳县", + "spell": "zhangxian", + "easy_spell": "zx", + "city_id": "308" + }, + { + "district_id": "2678", + "district_name": "岷县", + "spell": "zuoxian", + "easy_spell": "zx", + "city_id": "308" + }, + { + "district_id": "2679", + "district_name": "武都区", + "spell": "wuduqu", + "easy_spell": "wdq", + "city_id": "309" + }, + { + "district_id": "2680", + "district_name": "成县", + "spell": "chengxian", + "easy_spell": "cx", + "city_id": "309" + }, + { + "district_id": "2681", + "district_name": "文县", + "spell": "wenxian", + "easy_spell": "wx", + "city_id": "309" + }, + { + "district_id": "2682", + "district_name": "宕昌县", + "spell": "zuochangxian", + "easy_spell": "zcx", + "city_id": "309" + }, + { + "district_id": "2683", + "district_name": "康县", + "spell": "kangxian", + "easy_spell": "kx", + "city_id": "309" + }, + { + "district_id": "2684", + "district_name": "西和县", + "spell": "xihexian", + "easy_spell": "xhx", + "city_id": "309" + }, + { + "district_id": "2685", + "district_name": "礼县", + "spell": "lixian", + "easy_spell": "lx", + "city_id": "309" + }, + { + "district_id": "2686", + "district_name": "徽县", + "spell": "huixian", + "easy_spell": "hx", + "city_id": "309" + }, + { + "district_id": "2687", + "district_name": "两当县", + "spell": "liangdangxian", + "easy_spell": "ldx", + "city_id": "309" + }, + { + "district_id": "2688", + "district_name": "临夏市", + "spell": "linxiashi", + "easy_spell": "lxs", + "city_id": "310" + }, + { + "district_id": "2689", + "district_name": "临夏县", + "spell": "linxiaxian", + "easy_spell": "lxx", + "city_id": "310" + }, + { + "district_id": "2690", + "district_name": "康乐县", + "spell": "kanglexian", + "easy_spell": "klx", + "city_id": "310" + }, + { + "district_id": "2691", + "district_name": "永靖县", + "spell": "yongjingxian", + "easy_spell": "yjx", + "city_id": "310" + }, + { + "district_id": "2692", + "district_name": "广河县", + "spell": "guanghexian", + "easy_spell": "ghx", + "city_id": "310" + }, + { + "district_id": "2693", + "district_name": "和政县", + "spell": "hezhengxian", + "easy_spell": "hzx", + "city_id": "310" + }, + { + "district_id": "2694", + "district_name": "东乡族自治县", + "spell": "dongxiangzuzizhixian", + "easy_spell": "dxzzzx", + "city_id": "310" + }, + { + "district_id": "2695", + "district_name": "积石山保安族东乡族撒拉族自治县", + "spell": "jishishanbaoanzudongxiangzusalazuzizhixian", + "easy_spell": "jssbazdxzslzzzx", + "city_id": "310" + }, + { + "district_id": "2696", + "district_name": "合作市", + "spell": "hezuoshi", + "easy_spell": "hzs", + "city_id": "311" + }, + { + "district_id": "2697", + "district_name": "临潭县", + "spell": "lintanxian", + "easy_spell": "ltx", + "city_id": "311" + }, + { + "district_id": "2698", + "district_name": "卓尼县", + "spell": "zhuonixian", + "easy_spell": "znx", + "city_id": "311" + }, + { + "district_id": "2699", + "district_name": "舟曲县", + "spell": "zhouquxian", + "easy_spell": "zqx", + "city_id": "311" + }, + { + "district_id": "2700", + "district_name": "迭部县", + "spell": "diebuxian", + "easy_spell": "dbx", + "city_id": "311" + }, + { + "district_id": "2701", + "district_name": "玛曲县", + "spell": "maquxian", + "easy_spell": "mqx", + "city_id": "311" + }, + { + "district_id": "2702", + "district_name": "碌曲县", + "spell": "luquxian", + "easy_spell": "lqx", + "city_id": "311" + }, + { + "district_id": "2703", + "district_name": "夏河县", + "spell": "xiahexian", + "easy_spell": "xhx", + "city_id": "311" + }, + { + "district_id": "2704", + "district_name": "城东区", + "spell": "chengdongqu", + "easy_spell": "cdq", + "city_id": "312" + }, + { + "district_id": "2705", + "district_name": "城中区", + "spell": "chengzhongqu", + "easy_spell": "czq", + "city_id": "312" + }, + { + "district_id": "2706", + "district_name": "城西区", + "spell": "chengxiqu", + "easy_spell": "cxq", + "city_id": "312" + }, + { + "district_id": "2707", + "district_name": "城北区", + "spell": "chengbeiqu", + "easy_spell": "cbq", + "city_id": "312" + }, + { + "district_id": "2708", + "district_name": "大通回族土族自治县", + "spell": "datonghuizutuzuzizhixian", + "easy_spell": "dthztzzzx", + "city_id": "312" + }, + { + "district_id": "2709", + "district_name": "湟中县", + "spell": "zuozhongxian", + "easy_spell": "zzx", + "city_id": "312" + }, + { + "district_id": "2710", + "district_name": "湟源县", + "spell": "zuoyuanxian", + "easy_spell": "zyx", + "city_id": "312" + }, + { + "district_id": "2711", + "district_name": "平安县", + "spell": "pinganxian", + "easy_spell": "pax", + "city_id": "313" + }, + { + "district_id": "2712", + "district_name": "民和回族土族自治县", + "spell": "minhehuizutuzuzizhixian", + "easy_spell": "mhhztzzzx", + "city_id": "313" + }, + { + "district_id": "2713", + "district_name": "乐都县", + "spell": "leduxian", + "easy_spell": "ldx", + "city_id": "313" + }, + { + "district_id": "2714", + "district_name": "互助土族自治县", + "spell": "huzhutuzuzizhixian", + "easy_spell": "hztzzzx", + "city_id": "313" + }, + { + "district_id": "2715", + "district_name": "化隆回族自治县", + "spell": "hualonghuizuzizhixian", + "easy_spell": "hlhzzzx", + "city_id": "313" + }, + { + "district_id": "2716", + "district_name": "循化撒拉族自治县", + "spell": "xunhuasalazuzizhixian", + "easy_spell": "xhslzzzx", + "city_id": "313" + }, + { + "district_id": "2717", + "district_name": "门源回族自治县", + "spell": "menyuanhuizuzizhixian", + "easy_spell": "myhzzzx", + "city_id": "314" + }, + { + "district_id": "2718", + "district_name": "祁连县", + "spell": "qilianxian", + "easy_spell": "qlx", + "city_id": "314" + }, + { + "district_id": "2719", + "district_name": "海晏县", + "spell": "haizuoxian", + "easy_spell": "hzx", + "city_id": "314" + }, + { + "district_id": "2720", + "district_name": "刚察县", + "spell": "gangchaxian", + "easy_spell": "gcx", + "city_id": "314" + }, + { + "district_id": "2721", + "district_name": "同仁县", + "spell": "tongrenxian", + "easy_spell": "trx", + "city_id": "315" + }, + { + "district_id": "2722", + "district_name": "尖扎县", + "spell": "jianzhaxian", + "easy_spell": "jzx", + "city_id": "315" + }, + { + "district_id": "2723", + "district_name": "泽库县", + "spell": "zekuxian", + "easy_spell": "zkx", + "city_id": "315" + }, + { + "district_id": "2724", + "district_name": "河南蒙古族自治县", + "spell": "henanmengguzuzizhixian", + "easy_spell": "hnmgzzzx", + "city_id": "315" + }, + { + "district_id": "2725", + "district_name": "共和县", + "spell": "gonghexian", + "easy_spell": "ghx", + "city_id": "316" + }, + { + "district_id": "2726", + "district_name": "同德县", + "spell": "tongdexian", + "easy_spell": "tdx", + "city_id": "316" + }, + { + "district_id": "2727", + "district_name": "贵德县", + "spell": "guidexian", + "easy_spell": "gdx", + "city_id": "316" + }, + { + "district_id": "2728", + "district_name": "兴海县", + "spell": "xinghaixian", + "easy_spell": "xhx", + "city_id": "316" + }, + { + "district_id": "2729", + "district_name": "贵南县", + "spell": "guinanxian", + "easy_spell": "gnx", + "city_id": "316" + }, + { + "district_id": "2730", + "district_name": "玛沁县", + "spell": "maqinxian", + "easy_spell": "mqx", + "city_id": "317" + }, + { + "district_id": "2731", + "district_name": "班玛县", + "spell": "banmaxian", + "easy_spell": "bmx", + "city_id": "317" + }, + { + "district_id": "2732", + "district_name": "甘德县", + "spell": "gandexian", + "easy_spell": "gdx", + "city_id": "317" + }, + { + "district_id": "2733", + "district_name": "达日县", + "spell": "darixian", + "easy_spell": "drx", + "city_id": "317" + }, + { + "district_id": "2734", + "district_name": "久治县", + "spell": "jiuzhixian", + "easy_spell": "jzx", + "city_id": "317" + }, + { + "district_id": "2735", + "district_name": "玛多县", + "spell": "maduoxian", + "easy_spell": "mdx", + "city_id": "317" + }, + { + "district_id": "2736", + "district_name": "玉树县", + "spell": "yushuxian", + "easy_spell": "ysx", + "city_id": "318" + }, + { + "district_id": "2737", + "district_name": "杂多县", + "spell": "zaduoxian", + "easy_spell": "zdx", + "city_id": "318" + }, + { + "district_id": "2738", + "district_name": "称多县", + "spell": "chengduoxian", + "easy_spell": "cdx", + "city_id": "318" + }, + { + "district_id": "2739", + "district_name": "治多县", + "spell": "zhiduoxian", + "easy_spell": "zdx", + "city_id": "318" + }, + { + "district_id": "2740", + "district_name": "囊谦县", + "spell": "nangqianxian", + "easy_spell": "nqx", + "city_id": "318" + }, + { + "district_id": "2741", + "district_name": "曲麻莱县", + "spell": "qumalaixian", + "easy_spell": "qmlx", + "city_id": "318" + }, + { + "district_id": "2742", + "district_name": "格尔木市", + "spell": "geermushi", + "easy_spell": "gems", + "city_id": "319" + }, + { + "district_id": "2743", + "district_name": "德令哈市", + "spell": "delinghashi", + "easy_spell": "dlhs", + "city_id": "319" + }, + { + "district_id": "2744", + "district_name": "乌兰县", + "spell": "wulanxian", + "easy_spell": "wlx", + "city_id": "319" + }, + { + "district_id": "2745", + "district_name": "都兰县", + "spell": "dulanxian", + "easy_spell": "dlx", + "city_id": "319" + }, + { + "district_id": "2746", + "district_name": "天峻县", + "spell": "tianjunxian", + "easy_spell": "tjx", + "city_id": "319" + }, + { + "district_id": "2747", + "district_name": "兴庆区", + "spell": "xingqingqu", + "easy_spell": "xqq", + "city_id": "320" + }, + { + "district_id": "2748", + "district_name": "西夏区", + "spell": "xixiaqu", + "easy_spell": "xxq", + "city_id": "320" + }, + { + "district_id": "2749", + "district_name": "金凤区", + "spell": "jinfengqu", + "easy_spell": "jfq", + "city_id": "320" + }, + { + "district_id": "2750", + "district_name": "永宁县", + "spell": "yongningxian", + "easy_spell": "ynx", + "city_id": "320" + }, + { + "district_id": "2751", + "district_name": "贺兰县", + "spell": "helanxian", + "easy_spell": "hlx", + "city_id": "320" + }, + { + "district_id": "2752", + "district_name": "灵武市", + "spell": "lingwushi", + "easy_spell": "lws", + "city_id": "320" + }, + { + "district_id": "2753", + "district_name": "大武口区", + "spell": "dawukouqu", + "easy_spell": "dwkq", + "city_id": "321" + }, + { + "district_id": "2754", + "district_name": "惠农区", + "spell": "huinongqu", + "easy_spell": "hnq", + "city_id": "321" + }, + { + "district_id": "2755", + "district_name": "平罗县", + "spell": "pingluoxian", + "easy_spell": "plx", + "city_id": "321" + }, + { + "district_id": "2756", + "district_name": "利通区", + "spell": "litongqu", + "easy_spell": "ltq", + "city_id": "322" + }, + { + "district_id": "2757", + "district_name": "盐池县", + "spell": "yanchixian", + "easy_spell": "ycx", + "city_id": "322" + }, + { + "district_id": "2758", + "district_name": "同心县", + "spell": "tongxinxian", + "easy_spell": "txx", + "city_id": "322" + }, + { + "district_id": "2759", + "district_name": "青铜峡市", + "spell": "qingtongxiashi", + "easy_spell": "qtxs", + "city_id": "322" + }, + { + "district_id": "2760", + "district_name": "原州区", + "spell": "yuanzhouqu", + "easy_spell": "yzq", + "city_id": "323" + }, + { + "district_id": "2761", + "district_name": "西吉县", + "spell": "xijixian", + "easy_spell": "xjx", + "city_id": "323" + }, + { + "district_id": "2762", + "district_name": "隆德县", + "spell": "longdexian", + "easy_spell": "ldx", + "city_id": "323" + }, + { + "district_id": "2763", + "district_name": "泾源县", + "spell": "zuoyuanxian", + "easy_spell": "zyx", + "city_id": "323" + }, + { + "district_id": "2764", + "district_name": "彭阳县", + "spell": "pengyangxian", + "easy_spell": "pyx", + "city_id": "323" + }, + { + "district_id": "2765", + "district_name": "沙坡头区", + "spell": "shapotouqu", + "easy_spell": "sptq", + "city_id": "324" + }, + { + "district_id": "2766", + "district_name": "中宁县", + "spell": "zhongningxian", + "easy_spell": "znx", + "city_id": "324" + }, + { + "district_id": "2767", + "district_name": "海原县", + "spell": "haiyuanxian", + "easy_spell": "hyx", + "city_id": "324" + }, + { + "district_id": "2768", + "district_name": "天山区", + "spell": "tianshanqu", + "easy_spell": "tsq", + "city_id": "325" + }, + { + "district_id": "2769", + "district_name": "沙依巴克区", + "spell": "shayibakequ", + "easy_spell": "sybkq", + "city_id": "325" + }, + { + "district_id": "2770", + "district_name": "新市区", + "spell": "xinshiqu", + "easy_spell": "xsq", + "city_id": "325" + }, + { + "district_id": "2771", + "district_name": "水磨沟区", + "spell": "shuimogouqu", + "easy_spell": "smgq", + "city_id": "325" + }, + { + "district_id": "2772", + "district_name": "头屯河区", + "spell": "toutunhequ", + "easy_spell": "tthq", + "city_id": "325" + }, + { + "district_id": "2773", + "district_name": "达坂城区", + "spell": "dazuochengqu", + "easy_spell": "dzcq", + "city_id": "325" + }, + { + "district_id": "2774", + "district_name": "东山区", + "spell": "dongshanqu", + "easy_spell": "dsq", + "city_id": "325" + }, + { + "district_id": "2775", + "district_name": "乌鲁木齐县", + "spell": "wulumuqixian", + "easy_spell": "wlmqx", + "city_id": "325" + }, + { + "district_id": "2776", + "district_name": "独山子区", + "spell": "dushanziqu", + "easy_spell": "dszq", + "city_id": "326" + }, + { + "district_id": "2777", + "district_name": "克拉玛依区", + "spell": "kelamayiqu", + "easy_spell": "klmyq", + "city_id": "326" + }, + { + "district_id": "2778", + "district_name": "白碱滩区", + "spell": "baijiantanqu", + "easy_spell": "bjtq", + "city_id": "326" + }, + { + "district_id": "2779", + "district_name": "乌尔禾区", + "spell": "wuerhequ", + "easy_spell": "wehq", + "city_id": "326" + }, + { + "district_id": "2780", + "district_name": "吐鲁番市", + "spell": "tulufanshi", + "easy_spell": "tlfs", + "city_id": "327" + }, + { + "district_id": "2781", + "district_name": "鄯善县", + "spell": "zuoshanxian", + "easy_spell": "zsx", + "city_id": "327" + }, + { + "district_id": "2782", + "district_name": "托克逊县", + "spell": "tuokexunxian", + "easy_spell": "tkxx", + "city_id": "327" + }, + { + "district_id": "2783", + "district_name": "哈密市", + "spell": "hamishi", + "easy_spell": "hms", + "city_id": "328" + }, + { + "district_id": "2784", + "district_name": "巴里坤哈萨克自治县", + "spell": "balikunhasakezizhixian", + "easy_spell": "blkhskzzx", + "city_id": "328" + }, + { + "district_id": "2785", + "district_name": "伊吾县", + "spell": "yiwuxian", + "easy_spell": "ywx", + "city_id": "328" + }, + { + "district_id": "2786", + "district_name": "昌吉市", + "spell": "changjishi", + "easy_spell": "cjs", + "city_id": "329" + }, + { + "district_id": "2787", + "district_name": "阜康市", + "spell": "fukangshi", + "easy_spell": "fks", + "city_id": "329" + }, + { + "district_id": "2788", + "district_name": "米泉市", + "spell": "miquanshi", + "easy_spell": "mqs", + "city_id": "329" + }, + { + "district_id": "2789", + "district_name": "呼图壁县", + "spell": "hutubixian", + "easy_spell": "htbx", + "city_id": "329" + }, + { + "district_id": "2790", + "district_name": "玛纳斯县", + "spell": "manasixian", + "easy_spell": "mnsx", + "city_id": "329" + }, + { + "district_id": "2791", + "district_name": "奇台县", + "spell": "qitaixian", + "easy_spell": "qtx", + "city_id": "329" + }, + { + "district_id": "2792", + "district_name": "吉木萨尔县", + "spell": "jimusaerxian", + "easy_spell": "jmsex", + "city_id": "329" + }, + { + "district_id": "2793", + "district_name": "木垒哈萨克自治县", + "spell": "muleihasakezizhixian", + "easy_spell": "mlhskzzx", + "city_id": "329" + }, + { + "district_id": "2794", + "district_name": "博乐市", + "spell": "boleshi", + "easy_spell": "bls", + "city_id": "330" + }, + { + "district_id": "2795", + "district_name": "精河县", + "spell": "jinghexian", + "easy_spell": "jhx", + "city_id": "330" + }, + { + "district_id": "2796", + "district_name": "温泉县", + "spell": "wenquanxian", + "easy_spell": "wqx", + "city_id": "330" + }, + { + "district_id": "2797", + "district_name": "库尔勒市", + "spell": "kuerleshi", + "easy_spell": "kels", + "city_id": "331" + }, + { + "district_id": "2798", + "district_name": "轮台县", + "spell": "luntaixian", + "easy_spell": "ltx", + "city_id": "331" + }, + { + "district_id": "2799", + "district_name": "尉犁县", + "spell": "weilixian", + "easy_spell": "wlx", + "city_id": "331" + }, + { + "district_id": "2800", + "district_name": "若羌县", + "spell": "ruoqiangxian", + "easy_spell": "rqx", + "city_id": "331" + }, + { + "district_id": "2801", + "district_name": "且末县", + "spell": "qiemoxian", + "easy_spell": "qmx", + "city_id": "331" + }, + { + "district_id": "2802", + "district_name": "焉耆回族自治县", + "spell": "yanzuohuizuzizhixian", + "easy_spell": "yzhzzzx", + "city_id": "331" + }, + { + "district_id": "2803", + "district_name": "和静县", + "spell": "hejingxian", + "easy_spell": "hjx", + "city_id": "331" + }, + { + "district_id": "2804", + "district_name": "和硕县", + "spell": "heshuoxian", + "easy_spell": "hsx", + "city_id": "331" + }, + { + "district_id": "2805", + "district_name": "博湖县", + "spell": "bohuxian", + "easy_spell": "bhx", + "city_id": "331" + }, + { + "district_id": "2806", + "district_name": "阿克苏市", + "spell": "akesushi", + "easy_spell": "akss", + "city_id": "332" + }, + { + "district_id": "2807", + "district_name": "温宿县", + "spell": "wensuxian", + "easy_spell": "wsx", + "city_id": "332" + }, + { + "district_id": "2808", + "district_name": "库车县", + "spell": "kuchexian", + "easy_spell": "kcx", + "city_id": "332" + }, + { + "district_id": "2809", + "district_name": "沙雅县", + "spell": "shayaxian", + "easy_spell": "syx", + "city_id": "332" + }, + { + "district_id": "2810", + "district_name": "新和县", + "spell": "xinhexian", + "easy_spell": "xhx", + "city_id": "332" + }, + { + "district_id": "2811", + "district_name": "拜城县", + "spell": "baichengxian", + "easy_spell": "bcx", + "city_id": "332" + }, + { + "district_id": "2812", + "district_name": "乌什县", + "spell": "wushixian", + "easy_spell": "wsx", + "city_id": "332" + }, + { + "district_id": "2813", + "district_name": "阿瓦提县", + "spell": "awatixian", + "easy_spell": "awtx", + "city_id": "332" + }, + { + "district_id": "2814", + "district_name": "柯坪县", + "spell": "kepingxian", + "easy_spell": "kpx", + "city_id": "332" + }, + { + "district_id": "2815", + "district_name": "阿图什市", + "spell": "atushishi", + "easy_spell": "atss", + "city_id": "333" + }, + { + "district_id": "2816", + "district_name": "阿克陶县", + "spell": "aketaoxian", + "easy_spell": "aktx", + "city_id": "333" + }, + { + "district_id": "2817", + "district_name": "阿合奇县", + "spell": "aheqixian", + "easy_spell": "ahqx", + "city_id": "333" + }, + { + "district_id": "2818", + "district_name": "乌恰县", + "spell": "wuqiaxian", + "easy_spell": "wqx", + "city_id": "333" + }, + { + "district_id": "2819", + "district_name": "喀什市", + "spell": "kashishi", + "easy_spell": "kss", + "city_id": "334" + }, + { + "district_id": "2820", + "district_name": "疏附县", + "spell": "shufuxian", + "easy_spell": "sfx", + "city_id": "334" + }, + { + "district_id": "2821", + "district_name": "疏勒县", + "spell": "shulexian", + "easy_spell": "slx", + "city_id": "334" + }, + { + "district_id": "2822", + "district_name": "英吉沙县", + "spell": "yingjishaxian", + "easy_spell": "yjsx", + "city_id": "334" + }, + { + "district_id": "2823", + "district_name": "泽普县", + "spell": "zepuxian", + "easy_spell": "zpx", + "city_id": "334" + }, + { + "district_id": "2824", + "district_name": "莎车县", + "spell": "shachexian", + "easy_spell": "scx", + "city_id": "334" + }, + { + "district_id": "2825", + "district_name": "叶城县", + "spell": "yechengxian", + "easy_spell": "ycx", + "city_id": "334" + }, + { + "district_id": "2826", + "district_name": "麦盖提县", + "spell": "maigaitixian", + "easy_spell": "mgtx", + "city_id": "334" + }, + { + "district_id": "2827", + "district_name": "岳普湖县", + "spell": "yuepuhuxian", + "easy_spell": "yphx", + "city_id": "334" + }, + { + "district_id": "2828", + "district_name": "伽师县", + "spell": "zuoshixian", + "easy_spell": "zsx", + "city_id": "334" + }, + { + "district_id": "2829", + "district_name": "巴楚县", + "spell": "bachuxian", + "easy_spell": "bcx", + "city_id": "334" + }, + { + "district_id": "2830", + "district_name": "塔什库尔干塔吉克自治县", + "spell": "tashikuergantajikezizhixian", + "easy_spell": "tskegtjkzzx", + "city_id": "334" + }, + { + "district_id": "2831", + "district_name": "和田市", + "spell": "hetianshi", + "easy_spell": "hts", + "city_id": "335" + }, + { + "district_id": "2832", + "district_name": "和田县", + "spell": "hetianxian", + "easy_spell": "htx", + "city_id": "335" + }, + { + "district_id": "2833", + "district_name": "墨玉县", + "spell": "moyuxian", + "easy_spell": "myx", + "city_id": "335" + }, + { + "district_id": "2834", + "district_name": "皮山县", + "spell": "pishanxian", + "easy_spell": "psx", + "city_id": "335" + }, + { + "district_id": "2835", + "district_name": "洛浦县", + "spell": "luopuxian", + "easy_spell": "lpx", + "city_id": "335" + }, + { + "district_id": "2836", + "district_name": "策勒县", + "spell": "celexian", + "easy_spell": "clx", + "city_id": "335" + }, + { + "district_id": "2837", + "district_name": "于田县", + "spell": "yutianxian", + "easy_spell": "ytx", + "city_id": "335" + }, + { + "district_id": "2838", + "district_name": "民丰县", + "spell": "minfengxian", + "easy_spell": "mfx", + "city_id": "335" + }, + { + "district_id": "2839", + "district_name": "伊宁市", + "spell": "yiningshi", + "easy_spell": "yns", + "city_id": "336" + }, + { + "district_id": "2840", + "district_name": "奎屯市", + "spell": "kuitunshi", + "easy_spell": "kts", + "city_id": "336" + }, + { + "district_id": "2841", + "district_name": "伊宁县", + "spell": "yiningxian", + "easy_spell": "ynx", + "city_id": "336" + }, + { + "district_id": "2842", + "district_name": "察布查尔锡伯自治县", + "spell": "chabuchaerxibozizhixian", + "easy_spell": "cbcexbzzx", + "city_id": "336" + }, + { + "district_id": "2843", + "district_name": "霍城县", + "spell": "huochengxian", + "easy_spell": "hcx", + "city_id": "336" + }, + { + "district_id": "2844", + "district_name": "巩留县", + "spell": "gongliuxian", + "easy_spell": "glx", + "city_id": "336" + }, + { + "district_id": "2845", + "district_name": "新源县", + "spell": "xinyuanxian", + "easy_spell": "xyx", + "city_id": "336" + }, + { + "district_id": "2846", + "district_name": "昭苏县", + "spell": "zhaosuxian", + "easy_spell": "zsx", + "city_id": "336" + }, + { + "district_id": "2847", + "district_name": "特克斯县", + "spell": "tekesixian", + "easy_spell": "tksx", + "city_id": "336" + }, + { + "district_id": "2848", + "district_name": "尼勒克县", + "spell": "nilekexian", + "easy_spell": "nlkx", + "city_id": "336" + }, + { + "district_id": "2849", + "district_name": "塔城市", + "spell": "tachengshi", + "easy_spell": "tcs", + "city_id": "337" + }, + { + "district_id": "2850", + "district_name": "乌苏市", + "spell": "wusushi", + "easy_spell": "wss", + "city_id": "337" + }, + { + "district_id": "2851", + "district_name": "额敏县", + "spell": "eminxian", + "easy_spell": "emx", + "city_id": "337" + }, + { + "district_id": "2852", + "district_name": "沙湾县", + "spell": "shawanxian", + "easy_spell": "swx", + "city_id": "337" + }, + { + "district_id": "2853", + "district_name": "托里县", + "spell": "tuolixian", + "easy_spell": "tlx", + "city_id": "337" + }, + { + "district_id": "2854", + "district_name": "裕民县", + "spell": "yuminxian", + "easy_spell": "ymx", + "city_id": "337" + }, + { + "district_id": "2855", + "district_name": "和布克赛尔蒙古自治县", + "spell": "hebukesaiermengguzizhixian", + "easy_spell": "hbksemgzzx", + "city_id": "337" + }, + { + "district_id": "2856", + "district_name": "阿勒泰市", + "spell": "aletaishi", + "easy_spell": "alts", + "city_id": "338" + }, + { + "district_id": "2857", + "district_name": "布尔津县", + "spell": "buerjinxian", + "easy_spell": "bejx", + "city_id": "338" + }, + { + "district_id": "2858", + "district_name": "富蕴县", + "spell": "fuyunxian", + "easy_spell": "fyx", + "city_id": "338" + }, + { + "district_id": "2859", + "district_name": "福海县", + "spell": "fuhaixian", + "easy_spell": "fhx", + "city_id": "338" + }, + { + "district_id": "2860", + "district_name": "哈巴河县", + "spell": "habahexian", + "easy_spell": "hbhx", + "city_id": "338" + }, + { + "district_id": "2861", + "district_name": "青河县", + "spell": "qinghexian", + "easy_spell": "qhx", + "city_id": "338" + }, + { + "district_id": "2862", + "district_name": "吉木乃县", + "spell": "jimunaixian", + "easy_spell": "jmnx", + "city_id": "338" + }, + { + "district_id": "2863", + "district_name": "嘉峪关市", + "spell": "JIAYUGUANSHI", + "easy_spell": "JYGS", + "city_id": "299" + }, + { + "district_id": "2864", + "district_name": "石河子市", + "spell": "SHIHEZISHI", + "easy_spell": "SHZS", + "city_id": "339" + }, + { + "district_id": "2865", + "district_name": "阿拉尔市", + "spell": "ALAERSHI", + "easy_spell": "ALES", + "city_id": "340" + } +] +module.exports = data; diff --git a/json/area_province.js b/json/area_province.js new file mode 100755 index 00000000..df11e0da --- /dev/null +++ b/json/area_province.js @@ -0,0 +1,207 @@ +let data = [ + { + "province_id": "1", + "province_name": "北京市", + "spell": "beijingshi", + "easy_spell": "bjs" + }, + { + "province_id": "2", + "province_name": "天津市", + "spell": "tianjinshi", + "easy_spell": "tjs" + }, + { + "province_id": "3", + "province_name": "河北省", + "spell": "hebeisheng", + "easy_spell": "hbs" + }, + { + "province_id": "4", + "province_name": "山西省", + "spell": "shanxisheng", + "easy_spell": "sxs" + }, + { + "province_id": "5", + "province_name": "内蒙古自治区", + "spell": "neimengguzizhiqu", + "easy_spell": "nmgzzq" + }, + { + "province_id": "6", + "province_name": "辽宁省", + "spell": "liaoningsheng", + "easy_spell": "lns" + }, + { + "province_id": "7", + "province_name": "吉林省", + "spell": "jilinsheng", + "easy_spell": "jls" + }, + { + "province_id": "8", + "province_name": "黑龙江省", + "spell": "heilongjiangsheng", + "easy_spell": "hljs" + }, + { + "province_id": "9", + "province_name": "上海市", + "spell": "shanghaishi", + "easy_spell": "shs" + }, + { + "province_id": "10", + "province_name": "江苏省", + "spell": "jiangsusheng", + "easy_spell": "jss" + }, + { + "province_id": "11", + "province_name": "浙江省", + "spell": "zhejiangsheng", + "easy_spell": "zjs" + }, + { + "province_id": "12", + "province_name": "安徽省", + "spell": "anhuisheng", + "easy_spell": "ahs" + }, + { + "province_id": "13", + "province_name": "福建省", + "spell": "fujiansheng", + "easy_spell": "fjs" + }, + { + "province_id": "14", + "province_name": "江西省", + "spell": "jiangxisheng", + "easy_spell": "jxs" + }, + { + "province_id": "15", + "province_name": "山东省", + "spell": "shandongsheng", + "easy_spell": "sds" + }, + { + "province_id": "16", + "province_name": "河南省", + "spell": "henansheng", + "easy_spell": "hns" + }, + { + "province_id": "17", + "province_name": "湖北省", + "spell": "hubeisheng", + "easy_spell": "hbs" + }, + { + "province_id": "18", + "province_name": "湖南省", + "spell": "hunansheng", + "easy_spell": "hns" + }, + { + "province_id": "19", + "province_name": "广东省", + "spell": "guangdongsheng", + "easy_spell": "gds" + }, + { + "province_id": "20", + "province_name": "广西壮族自治区", + "spell": "guangxizhuangzuzizhiqu", + "easy_spell": "gxzzzzq" + }, + { + "province_id": "21", + "province_name": "海南省", + "spell": "hainansheng", + "easy_spell": "hns" + }, + { + "province_id": "22", + "province_name": "重庆市", + "spell": "zhongqingshi", + "easy_spell": "zqs" + }, + { + "province_id": "23", + "province_name": "四川省", + "spell": "sichuansheng", + "easy_spell": "scs" + }, + { + "province_id": "24", + "province_name": "贵州省", + "spell": "guizhousheng", + "easy_spell": "gzs" + }, + { + "province_id": "25", + "province_name": "云南省", + "spell": "yunnansheng", + "easy_spell": "yns" + }, + { + "province_id": "26", + "province_name": "西藏自治区", + "spell": "xicangzizhiqu", + "easy_spell": "xczzq" + }, + { + "province_id": "27", + "province_name": "陕西省", + "spell": "shanxisheng", + "easy_spell": "sxs" + }, + { + "province_id": "28", + "province_name": "甘肃省", + "spell": "gansusheng", + "easy_spell": "gss" + }, + { + "province_id": "29", + "province_name": "青海省", + "spell": "qinghaisheng", + "easy_spell": "qhs" + }, + { + "province_id": "30", + "province_name": "宁夏回族自治区", + "spell": "ningxiahuizuzizhiqu", + "easy_spell": "nxhzzzq" + }, + { + "province_id": "31", + "province_name": "新疆维吾尔自治区", + "spell": "xinjiangweiwuerzizhiqu", + "easy_spell": "xjwwezzq" + }, + { + "province_id": "32", + "province_name": "香港特别行政区", + "spell": "xianggangtebiexingzhengqu", + "easy_spell": "xgtbxzq" + }, + { + "province_id": "33", + "province_name": "澳门特别行政区", + "spell": "aomentebiexingzhengqu", + "easy_spell": "amtbxzq" + }, + { + "province_id": "34", + "province_name": "台湾省", + "spell": "taiwansheng", + "easy_spell": "tws" + } +] +module.exports = data; \ No newline at end of file diff --git a/lib/request/adapters/index.js b/lib/request/adapters/index.js new file mode 100644 index 00000000..c44ae79a --- /dev/null +++ b/lib/request/adapters/index.js @@ -0,0 +1,83 @@ +import buildURL from '../helpers/buildURL' +import buildFullPath from '../core/buildFullPath' +import settle from '../core/settle' + +/** + * 返回可选值存在的配置 + * @param {Array} keys - 可选值数组 + * @param {Object} config2 - 配置 + * @return {{}} - 存在的配置项 + */ +const mergeKeys = (keys, config2) => { + let config = {} + keys.forEach(prop => { + if (typeof config2[prop] !== 'undefined') { + config[prop] = config2[prop] + } + }) + return config +} +export default (config) => { + return new Promise((resolve, reject) => { + const _config = { + url: buildURL(buildFullPath(config.baseURL, config.url), config.params), + header: config.header, + complete: (response) => { + response.config = config + try { + // 对可能字符串不是json 的情况容错 + if (typeof response.data === 'string') { + response.data = JSON.parse(response.data) + } + // eslint-disable-next-line no-empty + } catch (e) { + } + settle(resolve, reject, response) + } + } + let requestTask + if (config.method === 'UPLOAD') { + let otherConfig = { + // #ifdef MP-ALIPAY + fileType: config.fileType, + // #endif + filePath: config.filePath, + name: config.name + } + const optionalKeys = [ + // #ifdef APP-PLUS || H5 + 'files', + // #endif + // #ifdef H5 + 'file', + // #endif + 'formData' + ] + requestTask = uni.uploadFile({..._config, ...otherConfig, ...mergeKeys(optionalKeys, config)}) + } else if (config.method === 'DOWNLOAD') { + requestTask = uni.downloadFile(_config) + } else { + const optionalKeys = [ + 'data', + 'method', + // #ifdef MP-ALIPAY || MP-WEIXIN + 'timeout', + // #endif + 'dataType', + // #ifndef MP-ALIPAY || APP-PLUS + 'responseType', + // #endif + // #ifdef APP-PLUS + 'sslVerify', + // #endif + // #ifdef H5 + 'withCredentials' + // #endif + ] + requestTask = uni.request({..._config,...mergeKeys(optionalKeys, config)}) + } + if (config.getTask) { + config.getTask(requestTask, config) + } + }) +} diff --git a/lib/request/core/InterceptorManager.js b/lib/request/core/InterceptorManager.js new file mode 100644 index 00000000..3ea0d5e8 --- /dev/null +++ b/lib/request/core/InterceptorManager.js @@ -0,0 +1,51 @@ +'use strict' + + +function InterceptorManager() { + this.handlers = [] +} + +/** + * Add a new interceptor to the stack + * + * @param {Function} fulfilled The function to handle `then` for a `Promise` + * @param {Function} rejected The function to handle `reject` for a `Promise` + * + * @return {Number} An ID used to remove interceptor later + */ +InterceptorManager.prototype.use = function use(fulfilled, rejected) { + this.handlers.push({ + fulfilled: fulfilled, + rejected: rejected + }) + return this.handlers.length - 1 +} + +/** + * Remove an interceptor from the stack + * + * @param {Number} id The ID that was returned by `use` + */ +InterceptorManager.prototype.eject = function eject(id) { + if (this.handlers[id]) { + this.handlers[id] = null + } +} + +/** + * Iterate over all the registered interceptors + * + * This method is particularly useful for skipping over any + * interceptors that may have become `null` calling `eject`. + * + * @param {Function} fn The function to call for each interceptor + */ +InterceptorManager.prototype.forEach = function forEach(fn) { + this.handlers.forEach(h => { + if (h !== null) { + fn(h) + } + }) +} + +export default InterceptorManager diff --git a/lib/request/core/Request.js b/lib/request/core/Request.js new file mode 100644 index 00000000..9b7debef --- /dev/null +++ b/lib/request/core/Request.js @@ -0,0 +1,198 @@ +/** + * @Class Request + * @description luch-request http请求插件 + * @version 3.0.2 + * @Author lu-ch + * @Date 2020-06-04 + * @Email webwork.s@qq.com + * 文档: https://quanzhan.co/luch-request/ + * github: https://github.com/lei-mu/luch-request + * DCloud: http://ext.dcloud.net.cn/plugin?id=392 + * HBuilderX: 2.7.9 + */ + + +import dispatchRequest from './dispatchRequest' +import InterceptorManager from './InterceptorManager' +import mergeConfig from './mergeConfig' +import defaults from './defaults' +import { isPlainObject } from '../utils' + +export default class Request { + /** + * @param {Object} arg - 全局配置 + * @param {String} arg.baseURL - 全局根路径 + * @param {Object} arg.header - 全局header + * @param {String} arg.method = [GET|POST|PUT|DELETE|CONNECT|HEAD|OPTIONS|TRACE] - 全局默认请求方式 + * @param {String} arg.dataType = [json] - 全局默认的dataType + * @param {String} arg.responseType = [text|arraybuffer] - 全局默认的responseType。App和支付宝小程序不支持 + * @param {Object} arg.custom - 全局默认的自定义参数 + * @param {Number} arg.timeout - 全局默认的超时时间,单位 ms。默认30000。仅微信小程序(2.10.0)、支付宝小程序支持 + * @param {Boolean} arg.sslVerify - 全局默认的是否验证 ssl 证书。默认true.仅App安卓端支持(HBuilderX 2.3.3+) + * @param {Boolean} arg.withCredentials - 全局默认的跨域请求时是否携带凭证(cookies)。默认false。仅H5支持(HBuilderX 2.6.15+) + * @param {Function(statusCode):Boolean} arg.validateStatus - 全局默认的自定义验证器。默认statusCode >= 200 && statusCode < 300 + */ + constructor(arg = {}) { + if (!isPlainObject(arg)) { + arg = {} + //console.warn('设置全局参数必须接收一个Object') + } + this.config = {...defaults, ...arg} + this.interceptors = { + request: new InterceptorManager(), + response: new InterceptorManager() + } + } + + /** + * @Function + * @param {Request~setConfigCallback} f - 设置全局默认配置 + */ + setConfig(f) { + this.config = f(this.config) + } + + _middleware(config) { + config = mergeConfig(this.config, config) + let chain = [dispatchRequest, undefined] + let promise = Promise.resolve(config) + + this.interceptors.request.forEach(function unshiftRequestInterceptors(interceptor) { + chain.unshift(interceptor.fulfilled, interceptor.rejected) + }) + + this.interceptors.response.forEach(function pushResponseInterceptors(interceptor) { + chain.push(interceptor.fulfilled, interceptor.rejected) + }) + + while (chain.length) { + promise = promise.then(chain.shift(), chain.shift()) + } + + return promise + } + + /** + * @Function + * @param {Object} config - 请求配置项 + * @prop {String} options.url - 请求路径 + * @prop {Object} options.data - 请求参数 + * @prop {Object} [options.responseType = config.responseType] [text|arraybuffer] - 响应的数据类型 + * @prop {Object} [options.dataType = config.dataType] - 如果设为 json,会尝试对返回的数据做一次 JSON.parse + * @prop {Object} [options.header = config.header] - 请求header + * @prop {Object} [options.method = config.method] - 请求方法 + * @returns {Promise} + */ + request(config = {}) { + return this._middleware(config) + } + + get(url, options = {}) { + return this.request({ + url, + method: 'GET', + ...options + }) + } + + post(url, data, options = {}) { + return this.request({ + url, + data, + method: 'POST', + ...options + }) + } + + // #ifndef MP-ALIPAY + put(url, data, options = {}) { + return this.request({ + url, + data, + method: 'PUT', + ...options + }) + } + + // #endif + + // #ifdef APP-PLUS || H5 || MP-WEIXIN || MP-BAIDU + delete(url, data, options = {}) { + return this.request({ + url, + data, + method: 'DELETE', + ...options + }) + } + + // #endif + + // #ifdef APP-PLUS || H5 || MP-WEIXIN + connect(url, data, options = {}) { + return this.request({ + url, + data, + method: 'CONNECT', + ...options + }) + } + + // #endif + + // #ifdef APP-PLUS || H5 || MP-WEIXIN || MP-BAIDU + head(url, data, options = {}) { + return this.request({ + url, + data, + method: 'HEAD', + ...options + }) + } + + // #endif + + // #ifdef APP-PLUS || H5 || MP-WEIXIN || MP-BAIDU + options(url, data, options = {}) { + return this.request({ + url, + data, + method: 'OPTIONS', + ...options + }) + } + + // #endif + + // #ifdef APP-PLUS || H5 || MP-WEIXIN + trace(url, data, options = {}) { + return this.request({ + url, + data, + method: 'TRACE', + ...options + }) + } + + // #endif + + upload(url, config = {}) { + config.url = url + config.method = 'UPLOAD' + return this._middleware(config) + } + + download(url, config = {}) { + config.url = url + config.method = 'DOWNLOAD' + return this._middleware(config) + } +} + + +/** + * setConfig回调 + * @return {Object} - 返回操作后的config + * @callback Request~setConfigCallback + * @param {Object} config - 全局默认config + */ diff --git a/lib/request/core/buildFullPath.js b/lib/request/core/buildFullPath.js new file mode 100644 index 00000000..f2852f46 --- /dev/null +++ b/lib/request/core/buildFullPath.js @@ -0,0 +1,20 @@ +'use strict' + +import isAbsoluteURL from '../helpers/isAbsoluteURL' +import combineURLs from '../helpers/combineURLs' + +/** + * Creates a new URL by combining the baseURL with the requestedURL, + * only when the requestedURL is not already an absolute URL. + * If the requestURL is absolute, this function returns the requestedURL untouched. + * + * @param {string} baseURL The base URL + * @param {string} requestedURL Absolute or relative URL to combine + * @returns {string} The combined full path + */ +export default function buildFullPath(baseURL, requestedURL) { + if (baseURL && !isAbsoluteURL(requestedURL)) { + return combineURLs(baseURL, requestedURL) + } + return requestedURL +} diff --git a/lib/request/core/defaults.js b/lib/request/core/defaults.js new file mode 100644 index 00000000..64ef7f00 --- /dev/null +++ b/lib/request/core/defaults.js @@ -0,0 +1,27 @@ +/** + * 默认的全局配置 + */ + + +export default { + baseURL: '', + header: {}, + method: 'GET', + dataType: 'json', + // #ifndef MP-ALIPAY || APP-PLUS + responseType: 'text', + // #endif + custom: {}, + // #ifdef MP-ALIPAY || MP-WEIXIN + timeout: 30000, + // #endif + // #ifdef APP-PLUS + sslVerify: true, + // #endif + // #ifdef H5 + withCredentials: false, + // #endif + validateStatus: function validateStatus(status) { + return status >= 200 && status < 300 + } +} diff --git a/lib/request/core/dispatchRequest.js b/lib/request/core/dispatchRequest.js new file mode 100644 index 00000000..2adf9b99 --- /dev/null +++ b/lib/request/core/dispatchRequest.js @@ -0,0 +1,7 @@ +import adapter from '../adapters/index' + + +export default (config) => { + config.header = config.header || {} + return adapter(config) +} diff --git a/lib/request/core/mergeConfig.js b/lib/request/core/mergeConfig.js new file mode 100644 index 00000000..8d9c9acb --- /dev/null +++ b/lib/request/core/mergeConfig.js @@ -0,0 +1,97 @@ +import {deepMerge, isObject} from '../utils' + +/** + * 合并局部配置优先的配置,如果局部有该配置项则用局部,如果全局有该配置项则用全局 + * @param {Array} keys - 配置项 + * @param {Object} globalsConfig - 当前的全局配置 + * @param {Object} config2 - 局部配置 + * @return {{}} + */ +const mergeKeys = (keys, globalsConfig, config2) => { + let config = {} + keys.forEach(prop => { + if (typeof config2[prop] !== 'undefined') { + config[prop] = config2[prop] + } else if (typeof globalsConfig[prop] !== 'undefined') { + config[prop] = globalsConfig[prop] + } + }) + return config +} +/** + * + * @param globalsConfig - 当前实例的全局配置 + * @param config2 - 当前的局部配置 + * @return - 合并后的配置 + */ +export default (globalsConfig, config2 = {}) => { + const method = config2.method || globalsConfig.method || 'GET' + let config = { + baseURL: globalsConfig.baseURL || '', + method: method, + url: config2.url || '' + } + const mergeDeepPropertiesKeys = ['header', 'params', 'custom'] + const defaultToConfig2Keys = ['getTask', 'validateStatus'] + mergeDeepPropertiesKeys.forEach(prop => { + if (isObject(config2[prop])) { + config[prop] = deepMerge(globalsConfig[prop], config2[prop]) + } else if (typeof config2[prop] !== 'undefined') { + config[prop] = config2[prop] + } else if (isObject(globalsConfig[prop])) { + config[prop] = deepMerge(globalsConfig[prop]) + } else if (typeof globalsConfig[prop] !== 'undefined') { + config[prop] = globalsConfig[prop] + } + }) + config = {...config, ...mergeKeys(defaultToConfig2Keys, globalsConfig, config2)} + + // eslint-disable-next-line no-empty + if (method === 'DOWNLOAD') { + + } else if (method === 'UPLOAD') { + if (isObject(config.header)) { + delete config.header['content-type'] + delete config.header['Content-Type'] + } + const uploadKeys = [ + // #ifdef APP-PLUS || H5 + 'files', + // #endif + // #ifdef MP-ALIPAY + 'fileType', + // #endif + // #ifdef H5 + 'file', + // #endif + 'filePath', + 'name', + 'formData', + ] + uploadKeys.forEach(prop => { + if (typeof config2[prop] !== 'undefined') { + config[prop] = config2[prop] + } + }) + } else { + const defaultsKeys = [ + 'data', + // #ifdef MP-ALIPAY || MP-WEIXIN + 'timeout', + // #endif + 'dataType', + // #ifndef MP-ALIPAY || APP-PLUS + 'responseType', + // #endif + // #ifdef APP-PLUS + 'sslVerify', + // #endif + // #ifdef H5 + 'withCredentials' + // #endif + ] + config = {...config, ...mergeKeys(defaultsKeys, globalsConfig, config2)} + } + + return config +} diff --git a/lib/request/core/settle.js b/lib/request/core/settle.js new file mode 100644 index 00000000..b2f16592 --- /dev/null +++ b/lib/request/core/settle.js @@ -0,0 +1,16 @@ +/** + * Resolve or reject a Promise based on response status. + * + * @param {Function} resolve A function that resolves the promise. + * @param {Function} reject A function that rejects the promise. + * @param {object} response The response. + */ +export default function settle(resolve, reject, response) { + const validateStatus = response.config.validateStatus + const status = response.statusCode + if (status && (!validateStatus || validateStatus(status))) { + resolve(response) + } else { + reject(response) + } +} diff --git a/lib/request/helpers/buildURL.js b/lib/request/helpers/buildURL.js new file mode 100644 index 00000000..d26dc30f --- /dev/null +++ b/lib/request/helpers/buildURL.js @@ -0,0 +1,69 @@ +'use strict' + +import * as utils from './../utils' + +function encode(val) { + return encodeURIComponent(val). + replace(/%40/gi, '@'). + replace(/%3A/gi, ':'). + replace(/%24/g, '$'). + replace(/%2C/gi, ','). + replace(/%20/g, '+'). + replace(/%5B/gi, '['). + replace(/%5D/gi, ']') +} + +/** + * Build a URL by appending params to the end + * + * @param {string} url The base of the url (e.g., http://www.google.com) + * @param {object} [params] The params to be appended + * @returns {string} The formatted url + */ +export default function buildURL(url, params) { + /*eslint no-param-reassign:0*/ + if (!params) { + return url + } + + var serializedParams + if (utils.isURLSearchParams(params)) { + serializedParams = params.toString() + } else { + var parts = [] + + utils.forEach(params, function serialize(val, key) { + if (val === null || typeof val === 'undefined') { + return + } + + if (utils.isArray(val)) { + key = key + '[]' + } else { + val = [val] + } + + utils.forEach(val, function parseValue(v) { + if (utils.isDate(v)) { + v = v.toISOString() + } else if (utils.isObject(v)) { + v = JSON.stringify(v) + } + parts.push(encode(key) + '=' + encode(v)) + }) + }) + + serializedParams = parts.join('&') + } + + if (serializedParams) { + var hashmarkIndex = url.indexOf('#') + if (hashmarkIndex !== -1) { + url = url.slice(0, hashmarkIndex) + } + + url += (url.indexOf('?') === -1 ? '?' : '&') + serializedParams + } + + return url +} diff --git a/lib/request/helpers/combineURLs.js b/lib/request/helpers/combineURLs.js new file mode 100644 index 00000000..7b9d1efd --- /dev/null +++ b/lib/request/helpers/combineURLs.js @@ -0,0 +1,14 @@ +'use strict' + +/** + * Creates a new URL by combining the specified URLs + * + * @param {string} baseURL The base URL + * @param {string} relativeURL The relative URL + * @returns {string} The combined URL + */ +export default function combineURLs(baseURL, relativeURL) { + return relativeURL + ? baseURL.replace(/\/+$/, '') + '/' + relativeURL.replace(/^\/+/, '') + : baseURL +} diff --git a/lib/request/helpers/isAbsoluteURL.js b/lib/request/helpers/isAbsoluteURL.js new file mode 100644 index 00000000..2a82517d --- /dev/null +++ b/lib/request/helpers/isAbsoluteURL.js @@ -0,0 +1,14 @@ +'use strict' + +/** + * Determines whether the specified URL is absolute + * + * @param {string} url The URL to test + * @returns {boolean} True if the specified URL is absolute, otherwise false + */ +export default function isAbsoluteURL(url) { + // A URL is considered absolute if it begins with "://" or "//" (protocol-relative URL). + // RFC 3986 defines scheme name as a sequence of characters beginning with a letter and followed + // by any combination of letters, digits, plus, period, or hyphen. + return /^([a-z][a-z\d+\-.]*:)?\/\//i.test(url) +} diff --git a/lib/request/index.js b/lib/request/index.js new file mode 100644 index 00000000..d8fe348f --- /dev/null +++ b/lib/request/index.js @@ -0,0 +1,2 @@ +import Request from './core/Request' +export default Request diff --git a/lib/request/utils.js b/lib/request/utils.js new file mode 100644 index 00000000..b1b18ce4 --- /dev/null +++ b/lib/request/utils.js @@ -0,0 +1,131 @@ +'use strict' + +// utils is a library of generic helper functions non-specific to axios + +var toString = Object.prototype.toString + +/** + * Determine if a value is an Array + * + * @param {Object} val The value to test + * @returns {boolean} True if value is an Array, otherwise false + */ +export function isArray (val) { + return toString.call(val) === '[object Array]' +} + + +/** + * Determine if a value is an Object + * + * @param {Object} val The value to test + * @returns {boolean} True if value is an Object, otherwise false + */ +export function isObject (val) { + return val !== null && typeof val === 'object' +} + +/** + * Determine if a value is a Date + * + * @param {Object} val The value to test + * @returns {boolean} True if value is a Date, otherwise false + */ +export function isDate (val) { + return toString.call(val) === '[object Date]' +} + +/** + * Determine if a value is a URLSearchParams object + * + * @param {Object} val The value to test + * @returns {boolean} True if value is a URLSearchParams object, otherwise false + */ +export function isURLSearchParams (val) { + return typeof URLSearchParams !== 'undefined' && val instanceof URLSearchParams +} + + +/** + * Iterate over an Array or an Object invoking a function for each item. + * + * If `obj` is an Array callback will be called passing + * the value, index, and complete array for each item. + * + * If 'obj' is an Object callback will be called passing + * the value, key, and complete object for each property. + * + * @param {Object|Array} obj The object to iterate + * @param {Function} fn The callback to invoke for each item + */ +export function forEach (obj, fn) { + // Don't bother if no value provided + if (obj === null || typeof obj === 'undefined') { + return + } + + // Force an array if not already something iterable + if (typeof obj !== 'object') { + /*eslint no-param-reassign:0*/ + obj = [obj] + } + + if (isArray(obj)) { + // Iterate over array values + for (var i = 0, l = obj.length; i < l; i++) { + fn.call(null, obj[i], i, obj) + } + } else { + // Iterate over object keys + for (var key in obj) { + if (Object.prototype.hasOwnProperty.call(obj, key)) { + fn.call(null, obj[key], key, obj) + } + } + } +} + +/** + * 是否为boolean 值 + * @param val + * @returns {boolean} + */ +export function isBoolean(val) { + return typeof val === 'boolean' +} + +/** + * 是否为真正的对象{} new Object + * @param {any} obj - 检测的对象 + * @returns {boolean} + */ +export function isPlainObject(obj) { + return Object.prototype.toString.call(obj) === '[object Object]' +} + + + +/** + * Function equal to merge with the difference being that no reference + * to original objects is kept. + * + * @see merge + * @param {Object} obj1 Object to merge + * @returns {Object} Result of all merge properties + */ +export function deepMerge(/* obj1, obj2, obj3, ... */) { + let result = {} + function assignValue(val, key) { + if (typeof result[key] === 'object' && typeof val === 'object') { + result[key] = deepMerge(result[key], val) + } else if (typeof val === 'object') { + result[key] = deepMerge({}, val) + } else { + result[key] = val + } + } + for (let i = 0, l = arguments.length; i < l; i++) { + forEach(arguments[i], assignValue) + } + return result +} diff --git a/main.js b/main.js new file mode 100644 index 00000000..e02f7740 --- /dev/null +++ b/main.js @@ -0,0 +1,53 @@ +import Vue from "vue"; +import App from "./App"; +import * as filters from "./utils/filters.js"; // global filter +import uView from "uview-ui"; +import store from "./store"; + + +/** + * 仅在h5中显示唤醒app功能 + * 在h5页面手动挂载 + * + */ +// #ifdef H5 +import airBtn from "@/components/m-airbtn/index.vue"; +let btn = Vue.component("airBtn", airBtn); //全局注册 +document.body.appendChild(new btn().$mount().$el); +// #endif + + +/** + * 全局filters + */ + +Object.keys(filters).forEach((key) => { + Vue.filter(key, filters[key]); +}); + +// 引入Vuex +Vue.prototype.$store = store; +Vue.use(uView); +Vue.config.productionTip = false; + + +/** + * 注意! + * 此处将常用的颜色嵌入到原型链上面 + * 颜色使用驼峰命名对应 uni.scss中全局颜色变量名 + * 如需更换主题请修改此处以及uni.scss中的全局颜色 + */ +// 主题色 +Vue.prototype.$mainColor = "#ff3c2a"; +// 高亮主题色 +Vue.prototype.$lightColor = "#ff6b35"; +// 辅助高亮颜色 +Vue.prototype.$aiderLightColor = "#ff9f28"; + + +App.mpType = "app"; + +const app = new Vue({ + ...App, +}); +app.$mount(); diff --git a/manifest.json b/manifest.json new file mode 100644 index 00000000..b971fe81 --- /dev/null +++ b/manifest.json @@ -0,0 +1,232 @@ +{ + "name" : "wzj4", + "appid" : "__UNI__6DB512D", + "description" : "", + "versionName" : "4.0.0", + "versionCode" : 4000049, + "transformPx" : false, + "app-plus" : { + "compatible" : { + "ignoreVersion" : true //true表示忽略版本检查提示框,HBuilderX1.9.0及以上版本支持 + }, + /* 5+App特有相关 */ + "usingComponents" : true, + "splashscreen" : { + "alwaysShowBeforeRender" : true, + "waiting" : true, + "autoclose" : true, + "delay" : 0 + }, + "modules" : { + "Payment" : {}, + "Share" : {}, + "Fingerprint" : {}, + "FaceID" : {}, + "Geolocation" : {}, + "Maps" : {}, + "OAuth" : {}, + "Camera" : {}, + "Barcode" : {}, + "VideoPlayer" : {} + }, + "error" : { + /* 404错误页面*/ + "url" : "hybrid/html/error.html" + }, + /* 模块配置 */ + "distribute" : { + /* 应用发布信息 */ + "android" : { + /* android打包配置 */ + "permissions" : [ + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "" + ], + "abiFilters" : [ "armeabi-v7a", "arm64-v8a", "x86" ], + "schemes" : "lilishop", + "minSdkVersion" : 21 + }, + "ios" : { + "idfa" : false, + "privacyDescription" : { + "NSPhotoLibraryUsageDescription" : "需要用与评论上传,头像上传功能", + "NSPhotoLibraryAddUsageDescription" : "保存商品图片到本地", + "NSFaceIDUsageDescription" : "使用面部识别进行登录", + "NSCameraUsageDescription" : "需要用与扫描二维码和商品评论图片拍摄", + "NSLocationAlwaysAndWhenInUseUsageDescription" : "位置信息将用于高德地图的效果展示", + "NSMicrophoneUsageDescription" : "用户上传视频时需使用音频信息" + }, + "urltypes" : "lilishop", + "dSYMs" : false + }, + /* ios打包配置 */ + "sdkConfigs" : { + "payment" : { + "weixin" : { + "__platform__" : [ "ios", "android" ], + "appid" : "wx32788b91bdb614c0", + "UniversalLinks" : "https://m-b2b2c.pickmall.cn/app/" + }, + "alipay" : { + "__platform__" : [ "ios", "android" ] + } + }, + "ad" : {}, + "share" : { + "weixin" : { + "appid" : "wx32788b91bdb614c0", + "UniversalLinks" : "https://m-b2b2c.pickmall.cn/app/" + } + }, + "oauth" : { + "weixin" : { + "appid" : "wx32788b91bdb614c0", + "appsecret" : "230233cef7520ee935bbecad372a370e", + "UniversalLinks" : "https://m-b2b2c.pickmall.cn/app/" + }, + "apple" : {}, + "qq" : { + "appid" : "101918503" + } + }, + "geolocation" : { + "amap" : { + "__platform__" : [ "ios", "android" ], + "appkey_ios" : "f463d3350efe63f8be5d9a62f24d0aab", + "appkey_android" : "fb3f1ccb34616c70f068aa950f3e27df" + } + }, + "maps" : { + "amap" : { + "appkey_ios" : "f463d3350efe63f8be5d9a62f24d0aab", + "appkey_android" : "fb3f1ccb34616c70f068aa950f3e27df" + } + }, + "push" : {} + }, + "icons" : { + "android" : { + "hdpi" : "unpackage/res/icons/72x72.png", + "xhdpi" : "unpackage/res/icons/96x96.png", + "xxhdpi" : "unpackage/res/icons/144x144.png", + "xxxhdpi" : "unpackage/res/icons/192x192.png" + }, + "ios" : { + "appstore" : "unpackage/res/icons/1024x1024.png", + "ipad" : { + "app" : "unpackage/res/icons/76x76.png", + "app@2x" : "unpackage/res/icons/152x152.png", + "notification" : "unpackage/res/icons/20x20.png", + "notification@2x" : "unpackage/res/icons/40x40.png", + "proapp@2x" : "unpackage/res/icons/167x167.png", + "settings" : "unpackage/res/icons/29x29.png", + "settings@2x" : "unpackage/res/icons/58x58.png", + "spotlight" : "unpackage/res/icons/40x40.png", + "spotlight@2x" : "unpackage/res/icons/80x80.png" + }, + "iphone" : { + "app@2x" : "unpackage/res/icons/120x120.png", + "app@3x" : "unpackage/res/icons/180x180.png", + "notification@2x" : "unpackage/res/icons/40x40.png", + "notification@3x" : "unpackage/res/icons/60x60.png", + "settings@2x" : "unpackage/res/icons/58x58.png", + "settings@3x" : "unpackage/res/icons/87x87.png", + "spotlight@2x" : "unpackage/res/icons/80x80.png", + "spotlight@3x" : "unpackage/res/icons/120x120.png" + } + } + }, + "splashscreen" : { + "iosStyle" : "common", + "ios" : { + "storyboard" : "CustomStoryboard.zip" + }, + "androidStyle" : "default", + "android" : { + "hdpi" : "CustomStartPage/start-page.9.png", + "xhdpi" : "CustomStartPage/start-page.9.png", + "xxhdpi" : "CustomStartPage/start-page.9.png" + } + } + } + }, + "permission" : { + "scope.userLocation" : { + "desc" : "你的位置信息将用于高德地图的效果展示" + } + }, + /* SDK配置 */ + "quickapp" : {}, + /* 快应用特有相关 */ + "mp-weixin" : { + /* 小程序特有相关 */ + "usingComponents" : true, + "appid" : "wx6f10f29075dc1b0b", + "optimization" : { + "subPackages" : true + }, + "setting" : { + "urlCheck" : false, + "minified" : true, + "postcss" : false, + "es6" : true + }, + "permission" : { + "scope.userLocation" : { + "desc" : "位置信息将用于高德地图的效果展示" + } + }, + "plugins" : { + "myPlugin" : { + "version" : "1.1.0", + "provider" : "wx738958e0f4c894f9" + }, + "live-player-plugin" : { + "version" : "1.3.0", + "provider" : "wx2b03c6e691cd7370" + } + } + }, + "h5" : { + "devServer" : { + "disableHostCheck" : true + }, + "router" : { + "mode" : "history", + "base" : "" + }, + "sdkConfigs" : { + "maps" : {} + }, + "optimization" : { + "treeShaking" : { + "enable" : true + } + }, + "title" : "lilishop", + "template" : "" + } +} diff --git a/pages.json b/pages.json new file mode 100644 index 00000000..87816702 --- /dev/null +++ b/pages.json @@ -0,0 +1,787 @@ +{ + + "easycom": { + "^u-(.*)": "@/uview-ui/components/u-$1/u-$1.vue" + }, + "pages": [ + { + "path" : "pages/tabbar/vlog/index", + "style" : { + "app-plus" : { + "titleNView" : false //禁用原生导航栏 + }, + "enablePullDownRefresh" : false //开启后ios会导致滑动整个页面,手势不准 + + } + }, + + { + "path": "pages/tabbar/home/index", + "style": { + "navigationBarTitleText": "商城", + "navigationStyle": "custom", // 隐藏系统导航栏 + "navigationBarTextStyle": "black", + "enablePullDownRefresh":true + } + }, + + { + "path" : "pages/tabbar/im/index", + "style" : { + "navigationBarTitleText" : "消息", + "navigationBarBackgroundColor" : "#181b27" + } + }, + + { + "path": "pages/tabbar/cart/cartList", + "style": { + "navigationBarTitleText": "购物车", + "navigationBarBackgroundColor": "#fff", + "enablePullDownRefresh":true //实现下拉刷新样式 + + } + }, { + "path": "pages/tabbar/category/category", + "style": { + "navigationBarTitleText": "分类", + "navigationStyle": "custom", // 隐藏系统导航栏 + "navigationBarTextStyle": "black", + "disableScroll": true, + "bounce": "none", + "scrollIndicator": "none" + + + } + }, + + { + "path": "pages/navigation/search/searchPage", + "style": { + "navigationBarTitleText": "搜索", + "navigationStyle": "custom", + + "app-plus": { + //app页面不显示滚动条 + "scrollIndicator": "none", + "bottom": "0", + "contentAdjust": "false", + "bounce": "none", + "safearea": { + "bottom": "none" + } + } + } + }, { + "path": "pages/tabbar/user/my", + "style": { + "navigationBarTextStyle": "white", + "enablePullDownRefresh": true, + "navigationStyle": "custom" + } + }, + + { + "path": "pages/tabbar/home/web-view", + "style": { + + } + } + + ], + "subPackages": [ + + { + "root": "pages/mine", + "pages": [ + + { + "path": "signIn", + "style": { + "navigationBarTitleText": "签到" + } + }, { + "path": "myTracks", + "style": { + "navigationBarTitleText": "我的足迹", + "enablePullDownRefresh": true, + "navigationStyle": "custom" + } + }, { + "path": "myCollect", + "style": { + "navigationBarTitleText": "收藏", + "enablePullDownRefresh": true, //下拉刷新 + "navigationStyle": "custom", + "app-plus": { + "scrollIndicator": "none" + } + } + }, + { + "path": "distribution/list", + "style": { + "navigationBarTitleText": "推广分佣", + "app-plus": { + //app页面不显示滚动条 + "scrollIndicator": "none" + } + } + }, + { + "path": "distribution/withdrawal", + "style": { + "navigationBarTitleText": "提现", + "app-plus": { + //app页面不显示滚动条 + "scrollIndicator": "none" + } + } + }, + { + "path": "distribution/join", + "style": { + "navigationBarTitleText": "推广资格申请", + "navigationBarTextStyle": "black", + "app-plus": { + //app页面不显示滚动条 + "scrollIndicator": "none" + } + } + }, + { + "path": "distribution/history", + "style": { + "navigationBarTitleText": "提现历史" + + } + }, + { + "path": "distribution/auth", + "style": { + "navigationBarTitleText": "会员实名认证" + + } + }, + { + "path": "distribution/achievement", + "style": { + "navigationBarTitleText": "我的分销业绩" + + } + }, + { + "path": "distribution/home", + "style": { + "navigationBarTitleText": "推广分佣" + + } + }, + { + "path": "deposit/index", + "style": { + "navigationStyle": "custom" + + } + }, + { + "path": "deposit/operation", + "style": { + "navigationStyle": "custom" + + } + }, + { + "path": "deposit/recharge", + "style": { + "navigationBarTitleText": "充值金额" + + } + }, + { + "path": "deposit/withdrawal", + "style": { + "navigationBarTitleText": "提现金额" + + } + }, + + { + "path": "deposit/info", + "style": { + "navigationBarTitleText": "预存款详情" + + } + }, + { + "path": "address/address", + "style": { + "enablePullDownRefresh": true, + "navigationBarTitleText": "地址管理" + } + }, + { + "path": "address/add", + "style": { + "navigationBarTitleText": "收货人" + } + }, + { + "path": "address/addressManage", + "style": { + "navigationBarTitleText": "地址管理" + } + }, + { + "path": "set/versionFunctionList", + "style": { + "navigationBarTitleText": "功能介绍" + } + }, + + { + "path": "set/securityCenter/fingerLogin", + "style": { + "navigationBarTitleText": "指纹登录" + } + }, + { + "path": "set/securityCenter/faceLogin", + "style": { + "navigationBarTitleText": "面容登录" + } + }, + { + "path": "set/securityCenter/editPassword", + "style": { + "navigationBarTitleText": "修改密码", + "app-plus": { + + } + } + }, + + + { + "path": "set/feedBack", + "style": { + "navigationBarTitleText": "意见反馈" + } + }, + { + "path": "set/securityCenter/securityCenter", + "style": { + "navigationBarTitleText": "安全中心" + } + }, + + { + "path": "set/editionIntro", + "style": { + "navigationBarTitleText": "关于我们" + } + }, + { + "path": "set/setUp", + "style": { + "navigationBarTitleText": "设置" + } + }, + { + "path": "set/personMsg", + "style": { + "navigationBarTitleText": "个人信息", + "app-plus": { + "titleNView": { + "padding-right": "12", + "buttons": [{ + "text": "保存", + "fontSize": "16", + "width": "auto", + "color": "#FFFFFF" + }] + } + } + } + }, { + "path": "help/tips", + "style": { + "navigationBarTitleText": "" + } + }, { + "path": "point/myPoint", + "style": { + "navigationBarTitleText": "我的积分" + } + }, + { + "path": "msgTips/main", + "style": { + "navigationBarTitleText": "消息中心" + } + }, + { + "path": "msgTips/sysMsg/index", + "style": { + "navigationBarTitleText": "系统消息" + } + }, + { + "path": "msgTips/serviceMsg/index", + "style": { + "navigationBarTitleText": "客服记录" + } + }, + { + "path": "msgTips/packageMsg/index", + "style": { + "navigationBarTitleText": "物流消息" + } + }, + { + "path": "msgTips/packageMsg/logisticsDetail", + "style": { + "navigationBarTitleText": "订单跟踪" + } + } + + ] + + }, + + + { + "root": "pages/product", + "pages": [{ + "path": "shopPage", + "style": { + "navigationBarTitleText": "", + "navigationStyle": "custom" + } + },{ + "path": "shopList", + "style": { + "navigationBarTitleText": "", + "navigationStyle": "custom" + } + },{ + "path": "licencePhoto", + "style": { + "navigationBarTitleText": "营业执照" + } + },{ + "path": "shopPageGoods", + "style": { + "navigationBarTitleText": "", + "navigationStyle": "custom" + } + }, + { + "path": "goods", + "style": { + "backgroundColor": "#fff", + "navigationStyle": "custom", + "app-plus": { + // 将回弹属性关掉 + "bounce": "none", + // 禁止页面滚动 + "scrollIndicator": "none", + "safearea": { + "bottom": { + "offset": "none" + } + } + } + } + }, + { + "path": "askList", + "style": { + "navigationBarTitleText": "问答专区" + } + }, + { //商品评价 + "path": "comment", + "navigationStyle": "custom", + "style": { + "navigationBarTitleText": "商品评价", + //app页面不显示滚动条 + "scrollIndicator": "none" + } + }, + { // 客服 + "path": "customerservice/index", + "style": { + "navigationBarTitleText": "客服", + "usingComponents": { + // #ifdef MP-WEIXIN + "chat": "plugin://myPlugin/chat" + // #endif + } + } + } + ] + + }, + { + "root": "pages/floor", + "pages": [{ + "path": "empty" + }] + + }, + { + "root": "pages/passport", + "pages": [{ + "path": "login", + "style": { + "navigationBarTitleText": "", + "navigationStyle": "custom", + "app-plus": { + "titleNView": false, + "animationType": "slide-in-bottom", + "scrollIndicator": "none", + "safearea": { + "bottom": { + "offset": "none" + } + } + } + } + }, + { + "path": "article", + "style": { + "navigationBarTitleText": "文章" + } + }, + { + "path": "wechatMPLogin", + "style": { + "navigationBarTitleText": "小程序登录", + "navigationStyle": "custom", + "navigationBarTextStyle": "black" + } + } + ] + + }, + + { + "root": "pages/promotion", + "pages": [ { + "path": "seckill", + "style": { + "navigationBarTitleText": "限时抢购", + "app-plus": { + "titleNView": { + "homeButton":true + } + } + } + }, + + { + "path": "joinGroup", + "style": { + "navigationBarTitleText": "拼团活动", + "navigationStyle": "custom", // 隐藏系统导航栏 + "app-plus": { + // 将回弹属性关掉 + "bounce": "none" + } + } + },{ + "path": "lives", + "style": { + "navigationStyle": "custom", + "navigationBarTextStyle": "black" + + } + },{ + "path": "bargain/list", + "style": { + "navigationStyle": "custom", + "navigationBarTextStyle": "white" + + } + },{ + "path": "bargain/detail", + "style": { + "navigationStyle": "custom", + "navigationBarTextStyle": "white" + + } + },{ + "path": "bargain/log", + "style": { + "navigationBarTitleText": "砍价记录" + } + },{ + "path": "point/detail", + "style": { + "navigationStyle": "custom", + "navigationBarTextStyle": "white" + + } + },{ + "path": "point/pointList", + "style": { + "navigationBarTitleText": "积分商城" + + + } + } + + ] + + }, + { + "root": "pages/cart", + "pages": [{ + "path": "coupon/myCoupon", + "style": { + "navigationBarTitleText": "我的优惠券", + "app-plus": { + "bounce": "coupon/none" + + } + } + }, + { + "path": "coupon/couponDetail", + "style": { + "navigationBarTitleText": "优惠券详情" + } + }, + { + "path": "coupon/index", + "style": { + "navigationBarTitleText": "优惠券" + } + }, + + { + "path": "coupon/couponCenter", + "style": { + "navigationBarTitleText": "领券中心", + "enablePullDownRefresh": true + + } + }, + { + "path": "payment/payOrder", + "style": { + "navigationBarTitleText": "支付订单", + "app-plus": { + "popGesture": "none" //禁止侧滑退出 + + } + } + }, + { + "path": "payment/success", + "style": { + "navigationBarTitleText": "支付成功", + "navigationStyle": "custom", // 隐藏系统导航栏 + "navigationBarTextStyle": "white", + "app-plus": { + "popGesture": "none", //禁止侧滑退出 + "titleNView": false + } + } + }, + { + "path": "payment/shareOrderGoods", + "style": { + "navigationBarTitleText": "", + "app-plus": { + + } + } + } + + ] + + }, + { + "root": "pages/order", + "pages": [{ + "path": "complain/complain", + "style": { + "navigationBarTitleText": "订单商品投诉" + } + }, + { + "path": "complain/complainInfo", + "style": { + "navigationBarTitleText": "投诉详情" + } + }, + { + "path": "complain/complainList", + "style": { + "navigationBarTitleText": "投诉列表" + } + }, + { + "path": "myOrder", + "style": { + "navigationBarTitleText": "我的订单", + "enablePullDownRefresh": true, + "app-plus": { + "bounce": "none" + + } + } + }, + { + "path": "invoice/invoiceDetail", + "style": { + "navigationBarTitleText": "发票详情" + } + }, + { + "path": "orderDetail", + "style": { + "navigationBarTitleText": "订单详情" + } + }, + { + "path": "evaluate/evaluateDetail", + "style": { + "navigationBarTitleText": "评价详情" + } + }, + + { + "path": "evaluate/releaseEvaluate", + "style": { + "navigationBarTitleText": "发布评价" + } + }, + { + "path": "evaluate/myEvaluate", + "style": { + "navigationBarTitleText": "我的评价" + } + }, + + { + "path": "afterSales/applyProgress", + "style": { + "navigationBarTitleText": "售后服务" + } + }, + { + "path": "afterSales/applyDetail", + "style": { + "navigationBarTitleText": "售后服务" + } + }, + { + "path": "afterSales/applySuccess", + "style": { + "navigationBarTitleText": "提交成功", + "app-plus": { + "bounce": "none", + "titleNView": { + "titleColor": "#FFFFFF", + "buttons": [{ + "text": "完成", + "fontSize": "14", + "color": "#FFFFFF", + "width": "36px" + // "background": "rgba(0,0,0,0)" + }] + } + } + } + }, + { + "path": "afterSales/afterSalesDetailExpress" + }, + { + "path": "afterSales/afterSalesSelect", + "style": { + "navigationBarTitleText": "申请售后" + } + }, + { + "path": "afterSales/afterSalesDetail", + "style": { + "navigationBarTitleText": "申请售后" + } + }, + { + "path": "afterSales/afterSales", + "style": { + "navigationBarTitleText": "售后管理", + "enablePullDownRefresh": true + } + }, + { + "path": "fillorder", + "style": { + "navigationBarTitleText": "填写订单" + } + } + ] + } + ], + "globalStyle": { + "navigationBarTextStyle": "black", + "navigationBarTitleText": "Lili商城", + "titleColor": "#303133", + "navigationBarBackgroundColor": "#fff", + "backgroundColor": "#fff", + "color": "#FFFFFF", + "app-plus": { + // 全局关闭回弹功能 + "bounce": "none" + + } + }, + "tabBar": { + "color" : "#999696", + "selectedColor" : "#FFFFFF", + "borderStyle" : "#1c1b1b", + "backgroundColor" : "#0e0d0d", + "fontSize" : "16px", + "list": [ + { + "pagePath" : "pages/tabbar/vlog/index", + "text" : "首页" + }, + { + "pagePath": "pages/tabbar/home/index", + "text": "商城" + }, + { + "pagePath": "pages/tabbar/im/index", + "text": "消息" + }, + { + "pagePath": "pages/tabbar/user/my", + "text": "我的" + } + ], + "midButton" : { + "height" : "40px", + "iconWidth" : "40px", + "iconPath" : "static/img/douyin.png" + } + }, + // #todo 为什么要注释condition下代码? + // IOS plus.runtime.arguments 添加 condition节点后, 框架会修改 runtime.arguments + // 会影响什么功能? + // -在h5中唤醒app会一直返回默认值 {"name":"","path":"","query":"","id":0} + "condition": { //模式配置,仅开发期间生效 + // "current": 0, //当前激活的模式(list 的索引项) + // "list": [{ + // "name": "", //模式名称 + // "path":"", //启动页面,必选 + // "query": "" //启动参数,在页面的onLoad函数里面得到 + // }] + } +} diff --git a/pages/cart/coupon/couponCenter.vue b/pages/cart/coupon/couponCenter.vue new file mode 100644 index 00000000..0a48d22a --- /dev/null +++ b/pages/cart/coupon/couponCenter.vue @@ -0,0 +1,299 @@ + + + + + diff --git a/pages/cart/coupon/couponDetail.vue b/pages/cart/coupon/couponDetail.vue new file mode 100644 index 00000000..2f2a39f4 --- /dev/null +++ b/pages/cart/coupon/couponDetail.vue @@ -0,0 +1,126 @@ + + + + + diff --git a/pages/cart/coupon/index.vue b/pages/cart/coupon/index.vue new file mode 100644 index 00000000..8d218ca8 --- /dev/null +++ b/pages/cart/coupon/index.vue @@ -0,0 +1,292 @@ + + + diff --git a/pages/cart/coupon/myCoupon.vue b/pages/cart/coupon/myCoupon.vue new file mode 100644 index 00000000..41b562c4 --- /dev/null +++ b/pages/cart/coupon/myCoupon.vue @@ -0,0 +1,421 @@ + + + + + diff --git a/pages/cart/payment/error.vue b/pages/cart/payment/error.vue new file mode 100644 index 00000000..e69de29b diff --git a/pages/cart/payment/payOrder.vue b/pages/cart/payment/payOrder.vue new file mode 100644 index 00000000..0f8da5e5 --- /dev/null +++ b/pages/cart/payment/payOrder.vue @@ -0,0 +1,504 @@ + + + diff --git a/pages/cart/payment/shareOrderGoods.vue b/pages/cart/payment/shareOrderGoods.vue new file mode 100644 index 00000000..79c4312c --- /dev/null +++ b/pages/cart/payment/shareOrderGoods.vue @@ -0,0 +1,327 @@ + + + + + diff --git a/pages/cart/payment/success.vue b/pages/cart/payment/success.vue new file mode 100644 index 00000000..aa2892ae --- /dev/null +++ b/pages/cart/payment/success.vue @@ -0,0 +1,172 @@ + + + diff --git a/pages/cart/static/pay.png b/pages/cart/static/pay.png new file mode 100644 index 00000000..135e215a Binary files /dev/null and b/pages/cart/static/pay.png differ diff --git a/pages/floor/empty.vue b/pages/floor/empty.vue new file mode 100644 index 00000000..5eb2617b --- /dev/null +++ b/pages/floor/empty.vue @@ -0,0 +1,24 @@ + + + + + diff --git a/pages/mine/address/add.vue b/pages/mine/address/add.vue new file mode 100644 index 00000000..f4f3f51d --- /dev/null +++ b/pages/mine/address/add.vue @@ -0,0 +1,353 @@ + + + diff --git a/pages/mine/address/address.scss b/pages/mine/address/address.scss new file mode 100644 index 00000000..78687094 --- /dev/null +++ b/pages/mine/address/address.scss @@ -0,0 +1,132 @@ +.empty { + margin-top: 200rpx !important; + } + .alifont { + display: inline-block; + } + + .region { + span { + margin: 0 4rpx !important; + } + } + .address { + .default { + border: 1px solid #ff6262; + color: #ff6262; + font-size: 22rpx; + border-radius: 6rpx; + align-self: center; + padding: 2rpx 20rpx; + } + .list { + .item:hover { + background: #ededed; + } + + .item { + margin-top: 20rpx; + font-size: $font-base; + color: #666; + + .basic { + padding: 30rpx; + line-height: 1.5em; + border-bottom: 1px solid $border-color-light; + + :nth-child(2) { + margin: 0 20rpx; + } + + :nth-child(4) { + color: $font-color-light; + font-size: $font-sm; + + margin-top: 10rpx; + + text:nth-child(2) { + margin: 0; + } + + view { + font-size: 28rpx; + } + } + } + + .edit { + display: flex; + justify-content: space-between; + align-items: center; + vertical-align: middle; + height: 80rpx; + font-size: $font-sm; + color: $font-color-light; + padding: 0 30rpx; + + .unchecked { + width: 28rpx; + height: 28rpx; + border-radius: 50%; + border: 1px solid #e0e0e0; + display: inline-block; + vertical-align: middle; + margin-right: 8rpx; + position: relative; + top: -2rpx; + left: 0; + } + + view:nth-child(1) { + view:nth-child(1) { + font-size: $font-base; + color: $main-color; + margin-right: 8rpx; + vertical-align: middle; + } + } + + view:nth-child(2) { + text { + margin-left: 5rpx; + } + + .alifont { + font-size: 32rpx; + } + + .icon-bianji-copy { + font-size: 28rpx; + position: relative; + top: 2rpx; + left: 0; + } + + .icon-lajitong { + position: relative; + top: 4rpx; + } + } + + .mr-40 { + margin-right: 40rpx; + } + } + } + } + + .btn { + background: $light-color; + position: fixed; + width: 690rpx; + bottom: 60rpx; + height: 80rpx; + left: 30rpx; + font-size: 30rpx; + line-height: 80rpx; + + .u-icon { + margin-right: 10rpx; + } + } + } \ No newline at end of file diff --git a/pages/mine/address/address.vue b/pages/mine/address/address.vue new file mode 100644 index 00000000..e025746e --- /dev/null +++ b/pages/mine/address/address.vue @@ -0,0 +1,169 @@ + + + + + diff --git a/pages/mine/address/addressManage.vue b/pages/mine/address/addressManage.vue new file mode 100644 index 00000000..2934f436 --- /dev/null +++ b/pages/mine/address/addressManage.vue @@ -0,0 +1,174 @@ + + + + + diff --git a/pages/mine/address/uniMap.vue b/pages/mine/address/uniMap.vue new file mode 100644 index 00000000..c6dd4550 --- /dev/null +++ b/pages/mine/address/uniMap.vue @@ -0,0 +1,110 @@ + + + \ No newline at end of file diff --git a/pages/mine/deposit/index.vue b/pages/mine/deposit/index.vue new file mode 100644 index 00000000..85287eee --- /dev/null +++ b/pages/mine/deposit/index.vue @@ -0,0 +1,226 @@ + + + + + diff --git a/pages/mine/deposit/info.vue b/pages/mine/deposit/info.vue new file mode 100644 index 00000000..1d2df190 --- /dev/null +++ b/pages/mine/deposit/info.vue @@ -0,0 +1,22 @@ + + + + + diff --git a/pages/mine/deposit/operation.vue b/pages/mine/deposit/operation.vue new file mode 100644 index 00000000..e9c8dffb --- /dev/null +++ b/pages/mine/deposit/operation.vue @@ -0,0 +1,120 @@ + + + + + \ No newline at end of file diff --git a/pages/mine/deposit/recharge.vue b/pages/mine/deposit/recharge.vue new file mode 100644 index 00000000..37c9b518 --- /dev/null +++ b/pages/mine/deposit/recharge.vue @@ -0,0 +1,50 @@ + + + \ No newline at end of file diff --git a/pages/mine/deposit/style.scss b/pages/mine/deposit/style.scss new file mode 100644 index 00000000..a1932436 --- /dev/null +++ b/pages/mine/deposit/style.scss @@ -0,0 +1,46 @@ +/deep/ .u-input__input, +.u-input { + font-size: 80rpx !important; + height: 102rpx !important; +} +/deep/ .u-input__input { + height: 100%; + font-size: 80rpx; +} +.content { + display: flex; + > .price { + width: 60%; + margin: 20rpx 0; + font-size: 80rpx; + display: flex; + } + > .all { + justify-content: center; + width: 40%; + display: flex; + flex-direction: column; + align-items: flex-end; + } +} +.-list { + margin: 20rpx 0; + background: #fff; + padding: 16rpx 32rpx; +} +.title { + font-size: 35rpx; +} +.light { + opacity: 0.6; +} +.submit { + margin: 80rpx auto; + width: 94%; + background: $light-color; + height: 90rpx; + color: #fff; + border-radius: 10rpx; + text-align: center; + line-height: 90rpx; +} \ No newline at end of file diff --git a/pages/mine/deposit/withdrawal.vue b/pages/mine/deposit/withdrawal.vue new file mode 100644 index 00000000..b6e45b5d --- /dev/null +++ b/pages/mine/deposit/withdrawal.vue @@ -0,0 +1,78 @@ + + + \ No newline at end of file diff --git a/pages/mine/distribution/achievement.vue b/pages/mine/distribution/achievement.vue new file mode 100644 index 00000000..813f8c24 --- /dev/null +++ b/pages/mine/distribution/achievement.vue @@ -0,0 +1,11 @@ + + + \ No newline at end of file diff --git a/pages/mine/distribution/auth.vue b/pages/mine/distribution/auth.vue new file mode 100644 index 00000000..4c70762f --- /dev/null +++ b/pages/mine/distribution/auth.vue @@ -0,0 +1,188 @@ + + + \ No newline at end of file diff --git a/pages/mine/distribution/history.vue b/pages/mine/distribution/history.vue new file mode 100644 index 00000000..875893f8 --- /dev/null +++ b/pages/mine/distribution/history.vue @@ -0,0 +1,173 @@ + + + diff --git a/pages/mine/distribution/home.vue b/pages/mine/distribution/home.vue new file mode 100644 index 00000000..7dda6262 --- /dev/null +++ b/pages/mine/distribution/home.vue @@ -0,0 +1,131 @@ + + + + + diff --git a/pages/mine/distribution/join.vue b/pages/mine/distribution/join.vue new file mode 100644 index 00000000..307163da --- /dev/null +++ b/pages/mine/distribution/join.vue @@ -0,0 +1,103 @@ + + + diff --git a/pages/mine/distribution/list.vue b/pages/mine/distribution/list.vue new file mode 100644 index 00000000..989daf3d --- /dev/null +++ b/pages/mine/distribution/list.vue @@ -0,0 +1,467 @@ + + + \ No newline at end of file diff --git a/pages/mine/distribution/withdrawal.vue b/pages/mine/distribution/withdrawal.vue new file mode 100644 index 00000000..865957ec --- /dev/null +++ b/pages/mine/distribution/withdrawal.vue @@ -0,0 +1,129 @@ + + + \ No newline at end of file diff --git a/pages/mine/help/tips.vue b/pages/mine/help/tips.vue new file mode 100644 index 00000000..5401e699 --- /dev/null +++ b/pages/mine/help/tips.vue @@ -0,0 +1,56 @@ + + + \ No newline at end of file diff --git a/pages/mine/msgTips/main.vue b/pages/mine/msgTips/main.vue new file mode 100644 index 00000000..eb383da0 --- /dev/null +++ b/pages/mine/msgTips/main.vue @@ -0,0 +1,183 @@ + + + + + diff --git a/pages/mine/msgTips/packageMsg/index.vue b/pages/mine/msgTips/packageMsg/index.vue new file mode 100644 index 00000000..619cf4ea --- /dev/null +++ b/pages/mine/msgTips/packageMsg/index.vue @@ -0,0 +1,128 @@ + + + + + \ No newline at end of file diff --git a/pages/mine/msgTips/packageMsg/logisticsDetail.vue b/pages/mine/msgTips/packageMsg/logisticsDetail.vue new file mode 100644 index 00000000..d6a98ad4 --- /dev/null +++ b/pages/mine/msgTips/packageMsg/logisticsDetail.vue @@ -0,0 +1,97 @@ + + + + + diff --git a/pages/mine/msgTips/serviceMsg/index.vue b/pages/mine/msgTips/serviceMsg/index.vue new file mode 100644 index 00000000..2ccbbec2 --- /dev/null +++ b/pages/mine/msgTips/serviceMsg/index.vue @@ -0,0 +1,140 @@ + + + + + \ No newline at end of file diff --git a/pages/mine/msgTips/sysMsg/index.vue b/pages/mine/msgTips/sysMsg/index.vue new file mode 100644 index 00000000..4799470d --- /dev/null +++ b/pages/mine/msgTips/sysMsg/index.vue @@ -0,0 +1,102 @@ + + + + + \ No newline at end of file diff --git a/pages/mine/myCollect.vue b/pages/mine/myCollect.vue new file mode 100644 index 00000000..18ee619e --- /dev/null +++ b/pages/mine/myCollect.vue @@ -0,0 +1,440 @@ + + + + + diff --git a/pages/mine/myTracks.vue b/pages/mine/myTracks.vue new file mode 100644 index 00000000..a0fa2cd6 --- /dev/null +++ b/pages/mine/myTracks.vue @@ -0,0 +1,340 @@ + + + + + diff --git a/pages/mine/point/myPoint.vue b/pages/mine/point/myPoint.vue new file mode 100644 index 00000000..f6df627b --- /dev/null +++ b/pages/mine/point/myPoint.vue @@ -0,0 +1,216 @@ + + + + + diff --git a/pages/mine/set/editionIntro.vue b/pages/mine/set/editionIntro.vue new file mode 100644 index 00000000..81092068 --- /dev/null +++ b/pages/mine/set/editionIntro.vue @@ -0,0 +1,160 @@ + + + + + + diff --git a/pages/mine/set/feedBack.vue b/pages/mine/set/feedBack.vue new file mode 100644 index 00000000..a12ad6df --- /dev/null +++ b/pages/mine/set/feedBack.vue @@ -0,0 +1,167 @@ + + + + + diff --git a/pages/mine/set/personMsg.vue b/pages/mine/set/personMsg.vue new file mode 100644 index 00000000..dbd4436c --- /dev/null +++ b/pages/mine/set/personMsg.vue @@ -0,0 +1,277 @@ + + + + \ No newline at end of file diff --git a/pages/mine/set/securityCenter/editPassword.vue b/pages/mine/set/securityCenter/editPassword.vue new file mode 100644 index 00000000..7be7247c --- /dev/null +++ b/pages/mine/set/securityCenter/editPassword.vue @@ -0,0 +1,251 @@ + + + + \ No newline at end of file diff --git a/pages/mine/set/securityCenter/faceLogin.vue b/pages/mine/set/securityCenter/faceLogin.vue new file mode 100644 index 00000000..ee923e56 --- /dev/null +++ b/pages/mine/set/securityCenter/faceLogin.vue @@ -0,0 +1,86 @@ +// TODO 第一版本暂无此功能 后续优化以及更新 + + + + + diff --git a/pages/mine/set/securityCenter/fingerLogin.vue b/pages/mine/set/securityCenter/fingerLogin.vue new file mode 100644 index 00000000..f37fc704 --- /dev/null +++ b/pages/mine/set/securityCenter/fingerLogin.vue @@ -0,0 +1,70 @@ +// TODO 第一版本暂无此功能 后续优化以及更新 + + + + + diff --git a/pages/mine/set/securityCenter/securityCenter.vue b/pages/mine/set/securityCenter/securityCenter.vue new file mode 100644 index 00000000..64c07f4e --- /dev/null +++ b/pages/mine/set/securityCenter/securityCenter.vue @@ -0,0 +1,33 @@ + + + + + diff --git a/pages/mine/set/setUp.vue b/pages/mine/set/setUp.vue new file mode 100644 index 00000000..eee6ce21 --- /dev/null +++ b/pages/mine/set/setUp.vue @@ -0,0 +1,231 @@ + + + + + diff --git a/pages/mine/set/versionFunctionList.vue b/pages/mine/set/versionFunctionList.vue new file mode 100644 index 00000000..eb550b1a --- /dev/null +++ b/pages/mine/set/versionFunctionList.vue @@ -0,0 +1,58 @@ + + + + + \ No newline at end of file diff --git a/pages/mine/signIn.vue b/pages/mine/signIn.vue new file mode 100644 index 00000000..32556bd1 --- /dev/null +++ b/pages/mine/signIn.vue @@ -0,0 +1,533 @@ + + + + + diff --git a/pages/navigation/search/search.scss b/pages/navigation/search/search.scss new file mode 100644 index 00000000..a3efed1a --- /dev/null +++ b/pages/navigation/search/search.scss @@ -0,0 +1,628 @@ +.sort-active { + border: 1px solid $light-color; + color: $light-color; + background: $price-light-color !important; +} + +.oldKeyList { + display: flex; + flex-wrap: wrap; + padding: 20rpx 3%; + > .oldKeyItem { + padding: 4rpx 24rpx; + background: #f0f2f5; + margin-right: 20rpx; + max-width: 200rpx; + border-radius: 100px; + font-size: 24rpx; + overflow: hidden; + text-overflow: ellipsis; + white-space: nowrap; + margin-bottom: 20rpx; + } +} + +.promotion { + margin-top: 4rpx; + display: flex; + div { + span { + font-size: 24rpx; + color: $light-color; + margin-right: 10rpx; + padding: 0 4rpx; + border-radius: 2rpx; + } + } +} +.status_bar { + height: var(--status-bar-height); + background: #fff !important; + width: 100%; +} +page { + background-color: #fff !important; +} +.sort-box { + width: 100%; + height: 100%; + position: relative; + background: #f7f7f7; + .sort-list { + margin: 20rpx 0; + background: #fff; + border-radius: 20rpx; + padding: 30rpx; + > .sort-item { + > .sort-title { + margin: 20rpx 0; + font-size: 26rpx; + font-weight: bold; + } + } + } +} +.null-view { + height: 140rpx; +} + +.sort-btn { + display: flex; + position: fixed; + bottom: 0; + border-top: 1px solid #f7f7f7; + height: 100rpx; + left: 0; + width: 100%; + background: #fff; + align-items: center; + > view { + width: 50%; + height: 80rpx; + line-height: 80rpx; + text-align: center; + margin: 0 20rpx; + border-radius: 1000px; + } + > .sort-btn-repick { + border: 1px solid #ededed; + } + > .sort-btn-confim { + color: #fff; + background-image: linear-gradient(90deg, #ff6b35, #ff9f28, #ffcc03); + } +} +.uinput { + width: 50% !important; + > .sort-radius { + height: 70rpx; + line-height: 70rpx; + font-size: 24rpx; + } + /deep/ .uni-input-input { + font-size: 24rpx; + } +} +.sort-radius { + margin: 0 12rpx; + background: #f7f7f7; + height: 65rpx; + display: flex; + flex-direction: column; + align-items: center; + justify-content: center; + border-radius: 1000px; + font-size: 24rpx; +} +.flex { + + flex-wrap: wrap; + align-items: center; + > .sort-brand-item { + width: 33%; + text-align: center; + margin-bottom: 20rpx; + } +} +.scoll-page { + overflow: auto; +} +.content { + background-color: $bg-color; + height: 100vh; + overflow: hidden; +} + +.index-nav-arrow:last-child { + margin-top: -22rpx; +} +.line1-store-name{ + font-size: 24rpx; + color: #999; +} +.to-store{ + font-size: 24rpx; + color: #333; + margin-left: 10rpx; +} +.img { + width: 26rpx; + height: 26rpx; +} +.goods-row { + background: #fff; + padding: 16rpx; + + >.goods-col{ + display: flex; + >.goods-img{ + flex: 4; + } + >.goods-detail{ + flex: 7; + } + } +} + +.add1 { + background: #fff; + padding: 30rpx 0; +} + +.oldKeyRow { + background: #fff; + padding: 34rpx 3%; + border-bottom: 1px solid #eeeeee; +} + + +.clamp3 { + margin-bottom: 10rpx; + font-size: 28rpx; + color: #333333; + font-weight: 400; + display: -webkit-box; + height: 80rpx; + -webkit-box-orient: vertical; + + -webkit-line-clamp: 2 !important; + + overflow: hidden; + > span { + line-height: 1.5; + } +} + + +view { + display: block; +} + +.store-seller-name { + color: #666; + overflow: hidden; + + > div { + float: left; + } + + > span { + float: right; + } +} + +.count-config { + padding: 10rpx 0; + color: #666; + display: flex; + font-size: 24rpx; + justify-content: space-between; +} + +.search-box { + z-index: 99; + width: 100%; + background: $light-color; + padding: 20rpx 2.5%; + display: flex; + justify-content: space-between; + position: sticky; + top: 0; +} + +.search-box .mSearch-input-box { + width: 100%; +} + +.search-box .input-box { + width: 85%; + flex-shrink: 1; + display: flex; + justify-content: center; + align-items: center; +} + +.search-box .search-btn { + width: 15%; + margin: 0 0 0 2%; + display: flex; + justify-content: center; + align-items: center; + flex-shrink: 0; + font-size: 28rpx; + color: #fff; + background: linear-gradient(to right, #ff9801, #ff570a); + border-radius: 60rpx; +} + +.search-box .input-box > input { + width: 100%; + height: 60rpx; + font-size: 32rpx; + border: 0; + border-radius: 60rpx; + -webkit-appearance: none; + -moz-appearance: none; + appearance: none; + padding: 0 3%; + margin: 0; + background-color: #ffffff; +} + +.uni-scroll-view-content { + background: #ededed !important; +} + +.placeholder-class { + color: #9e9e9e; +} + +.search-keyword { + width: 100%; + background-color: #ededed; +} + +.keyword-list-box { + height: calc(100vh - 110rpx); + padding-top: 10rpx; + border-radius: 20rpx 20rpx 0 0; + background-color: #fff; +} + +.keyword-entry-tap { + background-color: #eee; +} + +.keyword-entry { + width: 94%; + height: 80rpx; + margin: 0 3%; + font-size: 30rpx; + color: #333; + display: flex; + justify-content: space-between; + align-items: center; + border-bottom: solid 1rpx #e7e7e7; +} + +.keyword-entry image { + width: 60rpx; + height: 60rpx; +} + +.keyword-entry .keyword-text, +.keyword-entry .keyword-img { + height: 80rpx; + display: flex; + align-items: center; +} + +.keyword-entry .keyword-text { + width: 90%; +} + +.keyword-entry .keyword-img { + width: 10%; + justify-content: center; +} + +.keyword-box { + background-color: #fff; +} + +.keyword-box .keyword-block { + padding: 10rpx 0; +} + +.keyword-box .keyword-block .keyword-list-header { + width: 100%; + padding: 20rpx 3%; + font-size: 27rpx; + color: #333; + display: flex; + justify-content: space-between; +} + +.keyword-box .keyword-block .keyword-list-header image { + width: 40rpx; + height: 40rpx; +} + +.keyword-box .keyword-block .keyword > view { + width: 50%; + line-height: 1.75; + overflow: hidden; + padding: 0 3% 0 3% !important; +} + +.u-tips { + font-size: 30rpx; + font-weight: 700; + color: #333; +} + +.keyword { + display: flex; + flex-wrap: wrap; +} + +.keyword-box { + position: relative; +} + +.clear { + color: #666666; + position: fixed; + bottom: 0; + width: 100%; + text-align: center; + height: 100rpx; + line-height: 100rpx; + font-size: 28rpx; + background: #f7f7f7; +} + +.keyword-box .keyword-block .hide-hot-tis { + display: flex; + justify-content: center; + font-size: 28rpx; + color: #6b6b6b; +} + +.navbar { + display: flex; + width: 100%; + height: 80rpx; + background: #fff; + box-shadow: 0 2rpx 10rpx rgba(0, 0, 0, 0.06); + z-index: 10; + // position: fixed; + // left: 0; + // top: var(--status-bar-height); + .nav-item { + flex: 1; + display: flex; + justify-content: center; + align-items: center; + height: 100%; + font-size: 30rpx; + color: $font-color-dark; + position: relative; + } + .current { + color: $light-color; + position: relative; + &:after { + content: ""; + position: absolute; + left: 50%; + bottom: 0; + transform: translateX(-50%); + width: 40rpx; + height: 0; + border-bottom: 4rpx solid $light-color; + } + } + .p-box { + display: flex; + flex-direction: column; + + .yticon { + display: flex; + align-items: center; + justify-content: center; + width: 30rpx; + height: 14rpx; + line-height: 1; + margin-left: 4rpx; + font-size: 26rpx; + color: #888; + + + } + + .xia { + transform: scaleY(-1); + } + } + + .cate-item { + display: flex; + justify-content: center; + align-items: center; + height: 100%; + width: 80rpx; + position: relative; + font-size: 44rpx; + + &:after { + content: ""; + position: absolute; + left: 0; + top: 50%; + transform: translateY(-50%); + border-left: 1px solid #ddd; + width: 0; + height: 36rpx; + } + } +} + +/* 分类 */ +.cate-mask { + position: fixed; + left: 0; + top: var(--window-top); + bottom: 0; + width: 100%; + background: rgba(0, 0, 0, 0); + z-index: 95; + transition: 0.3s; + + .cate-content { + width: 630rpx; + height: 100%; + background: #fff; + float: right; + transform: translateX(100%); + transition: 0.3s; + } + + &.none { + display: none; + } + + &.show { + background: rgba(0, 0, 0, 0.4); + + .cate-content { + transform: translateX(0); + } + } +} + +.cate-list { + display: flex; + flex-direction: column; + height: 100%; + + .cate-item { + display: flex; + align-items: center; + height: 90rpx; + padding-left: 30rpx; + font-size: 28rpx; + color: #555; + position: relative; + } + + .two { + height: 64rpx; + color: #303133; + font-size: 30rpx; + background: #f8f8f8; + } +} +.price-box { + margin-top: 10rpx; + display: flex; + align-items: center; + justify-content: space-between; + padding-right: 10rpx; + font-size: 24rpx; + color: $font-color-light; +} + +.price { + font-size: 26rpx; + line-height: 1; + color: $main-color; + font-weight: bold; + /deep/ span:nth-of-type(1) { + font-size: 38rpx; + } +} +/* 商品列表 */ +.goods-list { + display: flex; + flex-wrap: wrap; + margin: 10rpx 20rpx 284rpx; + + + // background: #fff; + width: 100%; + .goods-item { + background-color: #ffffff; + display: flex; + border-radius: 16rpx; + flex-direction: column; + width: calc(50% - 30rpx); + margin-bottom: 20rpx; + padding-bottom: 20rpx; + + &:nth-child(2n + 1) { + margin-right: 20rpx; + } + + .goods-detail { + margin: 0 20rpx; + } + } + + .image-wrapper { + width: 100%; + height: 330rpx; + border-radius: 16rpx 16rpx 0 0; + overflow: hidden; + padding: 0; + image { + width: 100%; + height: 100%; + opacity: 1; + border-radius: 16rpx 16rpx 0 0; + } + } + + .title { + font-size: $font-base; + color: $font-color-dark; + line-height: 1.5; + height: 84rpx; + padding: 10rpx 0 0; + display: -webkit-box; + + -webkit-box-orient: vertical; + + -webkit-line-clamp: 2; + + overflow: hidden; + } + + .count-config, + .store-seller-name { + font-size: $font-sm; + } + + .text-hidden { + + overflow: hidden; + text-overflow: ellipsis; + white-space: nowrap; + } +} + +.status_bar { + height: var(--status-bar-height); + width: 100%; + background: $light-color; +} + +.empty { + padding-top: 300rpx; + color: #999999; + text-align: center; + /deep/ .u-image { + width: 346rpx; + height: 304rpx; + } +} diff --git a/pages/navigation/search/searchPage.vue b/pages/navigation/search/searchPage.vue new file mode 100644 index 00000000..d0da9583 --- /dev/null +++ b/pages/navigation/search/searchPage.vue @@ -0,0 +1,828 @@ + + + + diff --git a/pages/order/afterSales/afterSales.vue b/pages/order/afterSales/afterSales.vue new file mode 100644 index 00000000..0334375d --- /dev/null +++ b/pages/order/afterSales/afterSales.vue @@ -0,0 +1,479 @@ + + + + + diff --git a/pages/order/afterSales/afterSalesDetail.vue b/pages/order/afterSales/afterSalesDetail.vue new file mode 100644 index 00000000..5f127466 --- /dev/null +++ b/pages/order/afterSales/afterSalesDetail.vue @@ -0,0 +1,499 @@ + + + + + diff --git a/pages/order/afterSales/afterSalesDetailExpress.vue b/pages/order/afterSales/afterSalesDetailExpress.vue new file mode 100644 index 00000000..9f755f7c --- /dev/null +++ b/pages/order/afterSales/afterSalesDetailExpress.vue @@ -0,0 +1,258 @@ + + + + + diff --git a/pages/order/afterSales/afterSalesSelect.vue b/pages/order/afterSales/afterSalesSelect.vue new file mode 100644 index 00000000..d2981518 --- /dev/null +++ b/pages/order/afterSales/afterSalesSelect.vue @@ -0,0 +1,202 @@ + + + + + diff --git a/pages/order/afterSales/applyDetail.vue b/pages/order/afterSales/applyDetail.vue new file mode 100644 index 00000000..c8564d9e --- /dev/null +++ b/pages/order/afterSales/applyDetail.vue @@ -0,0 +1,568 @@ + + + + + diff --git a/pages/order/afterSales/applyProgress.vue b/pages/order/afterSales/applyProgress.vue new file mode 100644 index 00000000..11c03aea --- /dev/null +++ b/pages/order/afterSales/applyProgress.vue @@ -0,0 +1,132 @@ + + + + + diff --git a/pages/order/afterSales/applySuccess.vue b/pages/order/afterSales/applySuccess.vue new file mode 100644 index 00000000..190d8877 --- /dev/null +++ b/pages/order/afterSales/applySuccess.vue @@ -0,0 +1,88 @@ + + + + + diff --git a/pages/order/complain/complain.vue b/pages/order/complain/complain.vue new file mode 100644 index 00000000..be821f7a --- /dev/null +++ b/pages/order/complain/complain.vue @@ -0,0 +1,229 @@ + + + + + diff --git a/pages/order/complain/complainInfo.vue b/pages/order/complain/complainInfo.vue new file mode 100644 index 00000000..51b7027a --- /dev/null +++ b/pages/order/complain/complainInfo.vue @@ -0,0 +1,127 @@ + + + + diff --git a/pages/order/complain/complainList.vue b/pages/order/complain/complainList.vue new file mode 100644 index 00000000..ccdec077 --- /dev/null +++ b/pages/order/complain/complainList.vue @@ -0,0 +1,181 @@ + + + + + diff --git a/pages/order/evaluate/evaluateDetail.vue b/pages/order/evaluate/evaluateDetail.vue new file mode 100644 index 00000000..0dba8406 --- /dev/null +++ b/pages/order/evaluate/evaluateDetail.vue @@ -0,0 +1,183 @@ + + + + + diff --git a/pages/order/evaluate/myEvaluate.vue b/pages/order/evaluate/myEvaluate.vue new file mode 100644 index 00000000..35dc2445 --- /dev/null +++ b/pages/order/evaluate/myEvaluate.vue @@ -0,0 +1,408 @@ + + + + diff --git a/pages/order/evaluate/releaseEvaluate.vue b/pages/order/evaluate/releaseEvaluate.vue new file mode 100644 index 00000000..72bb81ac --- /dev/null +++ b/pages/order/evaluate/releaseEvaluate.vue @@ -0,0 +1,328 @@ + + + + + diff --git a/pages/order/fillorder.vue b/pages/order/fillorder.vue new file mode 100644 index 00000000..d66a6406 --- /dev/null +++ b/pages/order/fillorder.vue @@ -0,0 +1,990 @@ + + + + diff --git a/pages/order/goods.scss b/pages/order/goods.scss new file mode 100644 index 00000000..417e0166 --- /dev/null +++ b/pages/order/goods.scss @@ -0,0 +1,107 @@ +.goods-item-view { + display: flex; + flex-direction: row; + justify-content: space-between; + align-items: center; + padding: 10rpx 30rpx; + + .goods-img {flex: 1;} + + .goods-info { + padding-left: 30rpx; + flex: 3; + + .goods-title { + margin-bottom: 10rpx; + color: $font-color-dark; + } + + .goods-specs { + font-size: 24rpx; + margin-bottom: 10rpx; + color: #cccccc; + } + + .goods-price { + font-size: 28rpx; + margin-bottom: 10rpx; + color: #ff5a10; + } + } + + .goods-num { + >.good-complaint{ + margin-top:10rpx; + } + text-align: center; + flex: 1; + width: 60rpx; + color: $main-color; + } + } + + + + .seller-view { + background-color: #fff; + margin: 20rpx 0rpx; + + .seller-info { + height: 70rpx; + padding: 0 20rpx; + + .seller-name { + font-size: 33rpx; + font-weight: 600; + display: flex; + width: 100%; + flex-direction: row; + align-items: center; + height: 90rpx; + // justify-content: space-between; + + image { + width: 32rpx; + height: 30rpx; + } + + .name { + margin-left: 15rpx; + margin-top: -2rpx; + font-size: 28rpx; + flex: 1; + } + + .status { + + font-size: 26rpx; + color: #ff6262; + } + } + + .order-sn { + color: #ff0000; + } + } + + + + .btn-view { + // padding: 25rpx 30rpx; + margin-bottom: 60rpx; + margin-right: 30rpx; + + .description { + color: #909399; + size: 25rpx; + + .price { + color: #ff0000; + } + } + + .right-btn { + float: right; + } + } + } \ No newline at end of file diff --git a/pages/order/imgs/line.png b/pages/order/imgs/line.png new file mode 100644 index 00000000..e13c9933 Binary files /dev/null and b/pages/order/imgs/line.png differ diff --git a/pages/order/invoice/invoiceDetail.vue b/pages/order/invoice/invoiceDetail.vue new file mode 100644 index 00000000..441d5d49 --- /dev/null +++ b/pages/order/invoice/invoiceDetail.vue @@ -0,0 +1,213 @@ + + + + + diff --git a/pages/order/invoice/setInvoice.vue b/pages/order/invoice/setInvoice.vue new file mode 100644 index 00000000..648b6c64 --- /dev/null +++ b/pages/order/invoice/setInvoice.vue @@ -0,0 +1,255 @@ + + + diff --git a/pages/order/myOrder.vue b/pages/order/myOrder.vue new file mode 100644 index 00000000..0f996f14 --- /dev/null +++ b/pages/order/myOrder.vue @@ -0,0 +1,694 @@ + + + + + diff --git a/pages/order/orderDetail.vue b/pages/order/orderDetail.vue new file mode 100644 index 00000000..4014a7e5 --- /dev/null +++ b/pages/order/orderDetail.vue @@ -0,0 +1,721 @@ + + + + + diff --git a/pages/passport/article.vue b/pages/passport/article.vue new file mode 100644 index 00000000..e66fd219 --- /dev/null +++ b/pages/passport/article.vue @@ -0,0 +1,49 @@ + + + + \ No newline at end of file diff --git a/pages/passport/login.scss b/pages/passport/login.scss new file mode 100644 index 00000000..0218e01e --- /dev/null +++ b/pages/passport/login.scss @@ -0,0 +1,68 @@ +.sub-title { + font-size: 24rpx; + color: #999; +} +.cell { + margin: 40rpx 0; +} +.login-ball { + border-bottom-left-radius: 300rpx; + height: 400rpx; + position: relative; +} + +/deep/ .u-form-item--right__content__slot { + width: 100%; + display: block; +} + +.title { + font-size: 48rpx; + color: #000; + text-align: center; +} +.privacy { + font-size: 24upx; + color: #999; + text-align: center; + margin-top: 360rpx; + width: 100%; + display: flex; + justify-content: center; +} +span { + color: $aider-light-color; +} +.form { + padding: 0 72rpx; +} +.divider { + margin: 30rpx 0 !important; +} +.submit { + height: 80rpx; + line-height: 80rpx; + color: #fff; + text-align: center; + font-size: 30rpx; + border-radius: 100px; +} +.logo { + margin-top: 20rpx; + width: 200rpx; + height: 200rpx; + text-align: center; +} +.logo-cell { + text-align: center; +} +.text-tips { + text-align: center; +} +.tips { + position: absolute; + bottom: 10rpx; + width: 100%; + + text-align: center; +} diff --git a/pages/passport/login.vue b/pages/passport/login.vue new file mode 100644 index 00000000..b9c9fc70 --- /dev/null +++ b/pages/passport/login.vue @@ -0,0 +1,702 @@ + + + + + \ No newline at end of file diff --git a/pages/passport/static/logo-title.png b/pages/passport/static/logo-title.png new file mode 100644 index 00000000..dd6f7165 Binary files /dev/null and b/pages/passport/static/logo-title.png differ diff --git a/pages/passport/wechatH5Login.vue b/pages/passport/wechatH5Login.vue new file mode 100644 index 00000000..707d4932 --- /dev/null +++ b/pages/passport/wechatH5Login.vue @@ -0,0 +1,151 @@ + + + + + diff --git a/pages/passport/wechatMPLogin.vue b/pages/passport/wechatMPLogin.vue new file mode 100644 index 00000000..0d263467 --- /dev/null +++ b/pages/passport/wechatMPLogin.vue @@ -0,0 +1,277 @@ + + + + diff --git a/pages/product/askList.vue b/pages/product/askList.vue new file mode 100644 index 00000000..35cbf790 --- /dev/null +++ b/pages/product/askList.vue @@ -0,0 +1,133 @@ + + + diff --git a/pages/product/comment.vue b/pages/product/comment.vue new file mode 100644 index 00000000..57e3486f --- /dev/null +++ b/pages/product/comment.vue @@ -0,0 +1,374 @@ + + + + + diff --git a/pages/product/customerservice/index.vue b/pages/product/customerservice/index.vue new file mode 100644 index 00000000..1d4793b5 --- /dev/null +++ b/pages/product/customerservice/index.vue @@ -0,0 +1,79 @@ + + \ No newline at end of file diff --git a/pages/product/goods.vue b/pages/product/goods.vue new file mode 100644 index 00000000..b512e57b --- /dev/null +++ b/pages/product/goods.vue @@ -0,0 +1,1073 @@ + + + + + diff --git a/pages/product/licencePhoto.vue b/pages/product/licencePhoto.vue new file mode 100644 index 00000000..72efc3a5 --- /dev/null +++ b/pages/product/licencePhoto.vue @@ -0,0 +1,56 @@ + + + + + \ No newline at end of file diff --git a/pages/product/product/evaluation/-evaluation.vue b/pages/product/product/evaluation/-evaluation.vue new file mode 100644 index 00000000..27ad2fdc --- /dev/null +++ b/pages/product/product/evaluation/-evaluation.vue @@ -0,0 +1,235 @@ + + + + + diff --git a/pages/product/product/goods/-goods-desc.vue b/pages/product/product/goods/-goods-desc.vue new file mode 100644 index 00000000..69c03cf8 --- /dev/null +++ b/pages/product/product/goods/-goods-desc.vue @@ -0,0 +1,13 @@ + + + + + \ No newline at end of file diff --git a/pages/product/product/goods/-goods-intro.vue b/pages/product/product/goods/-goods-intro.vue new file mode 100644 index 00000000..586d979c --- /dev/null +++ b/pages/product/product/goods/-goods-intro.vue @@ -0,0 +1,162 @@ + + + + + diff --git a/pages/product/product/goods/-goods-recommend.vue b/pages/product/product/goods/-goods-recommend.vue new file mode 100644 index 00000000..c05de1e7 --- /dev/null +++ b/pages/product/product/goods/-goods-recommend.vue @@ -0,0 +1,169 @@ + + + + + diff --git a/pages/product/product/goods/-goods-swiper.vue b/pages/product/product/goods/-goods-swiper.vue new file mode 100644 index 00000000..13e6d435 --- /dev/null +++ b/pages/product/product/goods/-goods-swiper.vue @@ -0,0 +1,85 @@ + + + \ No newline at end of file diff --git a/pages/product/product/mp-goods.scss b/pages/product/product/mp-goods.scss new file mode 100644 index 00000000..ec0b9fee --- /dev/null +++ b/pages/product/product/mp-goods.scss @@ -0,0 +1,6 @@ + +.showBack { + + margin-top: calc( var(--status-bar-height) + 20px ) !important; + +} \ No newline at end of file diff --git a/pages/product/product/popup/address.vue b/pages/product/product/popup/address.vue new file mode 100644 index 00000000..50ce0b94 --- /dev/null +++ b/pages/product/product/popup/address.vue @@ -0,0 +1,177 @@ + + + \ No newline at end of file diff --git a/pages/product/product/popup/popup.js b/pages/product/product/popup/popup.js new file mode 100644 index 00000000..1227cd34 --- /dev/null +++ b/pages/product/product/popup/popup.js @@ -0,0 +1,8 @@ + + +export default { + height:"1000rpx", //弹出层高度 + mode:"bottom", //弹出层位置 + radius:"32", //圆角 rpx, + close:true //能否点击遮罩退出 +} \ No newline at end of file diff --git a/pages/product/product/product.scss b/pages/product/product/product.scss new file mode 100644 index 00000000..6dcbb8bd --- /dev/null +++ b/pages/product/product/product.scss @@ -0,0 +1,64 @@ +.recommend-box, +.detail-box, +.store-recommend, +.store-info, +.evaluate-box, +.card-box, +.group-list { + border-radius: 32rpx; + padding: 0rpx 32rpx 0 32rpx; + background: #fff; + overflow: hidden; + margin: 20rpx 0; +} +.goods-recommend-title, +.store-recommend-title, +.evaluate-title, +.group-name { + color: #262626; + font-size: 30rpx; + font-weight: 700; + height: 90rpx; + line-height: 90rpx; + padding-left: 14rpx; + position: relative; + &::before { + background-image: linear-gradient(180deg, $price-color, $price-light-color); + content: ""; + position: absolute; + left: 0; + top: 50%; + -webkit-transform: translateY(-50%); + transform: translateY(-50%); + width: 3px; + height: 15px; + } +} +.scroll_mask { + height: 868rpx; + // padding-bottom: 100rpx; + overflow-y: auto; +} + +.mask { + height: 600px; +} +.card-box { + padding-top: 0 !important; +} +.card-content { + padding: 0 40rpx; + flex: 8; +} +.card-flex { + display: flex; + align-items: center; + font-size: 26rpx; + padding: 36rpx 0; + border-bottom: 2rpx solid #f9f9f9; +} +.card-title { + flex: 1; + color: #262626; + font-weight: 700; +} diff --git a/pages/product/product/promotion/-promotion-assemble-list.vue b/pages/product/product/promotion/-promotion-assemble-list.vue new file mode 100644 index 00000000..b32123b6 --- /dev/null +++ b/pages/product/product/promotion/-promotion-assemble-list.vue @@ -0,0 +1,108 @@ + + + + + diff --git a/pages/product/product/promotion/-promotion-assemble-promotions.vue b/pages/product/product/promotion/-promotion-assemble-promotions.vue new file mode 100644 index 00000000..625cc6e6 --- /dev/null +++ b/pages/product/product/promotion/-promotion-assemble-promotions.vue @@ -0,0 +1,172 @@ + + + + + diff --git a/pages/product/product/promotion/-promotion-coupon.vue b/pages/product/product/promotion/-promotion-coupon.vue new file mode 100644 index 00000000..4b1efae4 --- /dev/null +++ b/pages/product/product/promotion/-promotion-coupon.vue @@ -0,0 +1,184 @@ + + + + + diff --git a/pages/product/product/promotion/-promotion-details.vue b/pages/product/product/promotion/-promotion-details.vue new file mode 100644 index 00000000..4ff0e084 --- /dev/null +++ b/pages/product/product/promotion/-promotion-details.vue @@ -0,0 +1,111 @@ + + + diff --git a/pages/product/product/promotion/-promotion.vue b/pages/product/product/promotion/-promotion.vue new file mode 100644 index 00000000..6444563a --- /dev/null +++ b/pages/product/product/promotion/-promotion.vue @@ -0,0 +1,143 @@ + + + + + diff --git a/pages/product/product/promotion/README.md b/pages/product/product/promotion/README.md new file mode 100644 index 00000000..ac353dc7 --- /dev/null +++ b/pages/product/product/promotion/README.md @@ -0,0 +1,6 @@ +### promotion 促销显示 +### promotion-details 促销详情 +### promotion-assemble-promotions 限时抢购,团购活动条 +### promotion-assemble-group 拼团活动条 +### promotion-assemble-list 拼团活动用户列表 +### promotion-coupon 优惠券组件 \ No newline at end of file diff --git a/pages/product/product/promotion/group.scss b/pages/product/product/promotion/group.scss new file mode 100644 index 00000000..bcb2945c --- /dev/null +++ b/pages/product/product/promotion/group.scss @@ -0,0 +1,80 @@ +.group-wrapper { + background: url("/static/exchange.png"); + background-size: cover; +} +.u-group-row { + width: 100%; + padding: 0 32rpx; + display: flex; + height: 100rpx; + align-items: center; + justify-content: space-between; +} +.showBox_L { + // background: #ff6262; + height: 100%; + color: #fff; + flex: 2; +} +.flex-price { + color: #fff; + font-size: 48rpx; +} +.u-group-flex-left { + display: flex; + flex-direction: column; +} +.u-group-flex-left-span { + line-height: 1.2; + font-size: 32rpx; +} +.showBox_R { + flex: 1; + height: 100%; + padding: 4rpx 0 !important; + background: #ffe7e6 !important; + text-align: center !important; +} +/deep/ .u-mode-light-error { + border: none; +} + +.u-group-flex { + height: 100%; + align-items: center; + justify-content: space-between; +} +.u-group-flex, +.u-group-flex-right { + display: flex; +} + +.u-group-flex-right { + height: 100%; + align-items: flex-end; + display: flex; + flex-direction: column; + justify-content: center; +} +.old-price { + color: #fff; + text-decoration: line-through; + font-size: 22rpx; + opacity: 0.8; +} +.u-group-flex-left { + height: 100%; +} +.group-bag { + font-size: 20rpx; + padding: 4rpx 20rpx; + border-radius: 6rpx; + margin-right: 20rpx; +} +.promotion { + font-size: 22rpx; + border: 2rpx solid $price-light-color; + padding: 2rpx 6rpx; + margin-left: 10rpx; + line-height: 1; +} diff --git a/pages/product/product/promotion/promotion_type.js b/pages/product/product/promotion/promotion_type.js new file mode 100644 index 00000000..1607e006 --- /dev/null +++ b/pages/product/product/promotion/promotion_type.js @@ -0,0 +1,49 @@ +const promotion = [ + { + title: "积分活动", + value: "POINT", + }, + { + title: "单品立减", + value: "MINUS", + }, + { + title: "团购", + value: "GROUPBUY", + }, + { + title: "积分换购", + value: "EXCHANGE", + }, + { + title: "第二件半价", + value: "HALF_PRICE", + }, + { + title: "满减优惠", + value: "FULL_DISCOUNT", + }, + { + title: "限时抢购", + value: "SECKILL", + }, + { + title: "拼团", + value: "PINTUAN", + }, + { + title: "优惠券", + value: "COUPON", + }, +]; +export default promotion +/**格式化 */ +export function formatType(val){ + if(val != undefined){ + promotion.forEach(item=>{ + if(val == item.value){ + return item.title + } + }) + } +} \ No newline at end of file diff --git a/pages/product/product/shop/-shop.vue b/pages/product/product/shop/-shop.vue new file mode 100644 index 00000000..3220628d --- /dev/null +++ b/pages/product/product/shop/-shop.vue @@ -0,0 +1,245 @@ + + + + + diff --git a/pages/product/product/style.scss b/pages/product/product/style.scss new file mode 100644 index 00000000..efedaa9c --- /dev/null +++ b/pages/product/product/style.scss @@ -0,0 +1,387 @@ +.red { + color: $price-color; +} +page { + background: #fff; +} +.num-icon { + position: absolute; + right: 5rpx; + top: 5rpx; + padding: 2rpx 6rpx; + border-top: 4rpx; + border: 2rpx solid $price-color; + color: $price-color; + font-size: 22rpx; + border-radius: 200px; + line-height: 18rpx; +} +.header-title{ + font-weight: bold; + color: #333; + text-align: center; + height: 90rpx; + line-height: 90rpx; + font-size: 34rpx; +} + +.cuxiao-title{ + color: #999; + font-size: 24rpx; +} +.cuxiao{ + padding:16rpx 32rpx; +} +.detail-btn { + display: flex; + align-items: center; + > .to-buy { + background-image: linear-gradient(135deg, #ffba0d, #ffc30d 69%, #ffcf0d); + } + > .to-store-car { + background-image: linear-gradient(135deg, #f2140c, #f2270c 70%, #f24d0c); + } + > .to-store-btn { + flex: 1; + width: 100%; + margin: 0 5rpx; + height: 80rpx; + + text-align: center; + line-height: 80rpx; + color: #fff; + font-size: 26rpx; + border-radius: 214px; + padding: 0; + } + > .pt-buy { + line-height: 1.2; + display: flex; + align-items: center; + flex-direction: column; + justify-content: center; + font-size: 22rpx; + } +} +.desc-bold { + flex: 8; + font-weight: 700; + color: #262626; + line-height: 42rpx; + font-size: 32rpx; +} +.-goods-desc { + padding: 36rpx 0 0 0; + margin-bottom: 24rpx; + font-size: 24rpx; + color: #666; + display: -webkit-box; + + -webkit-box-orient: vertical; + + -webkit-line-clamp: 2; + + overflow: hidden; +} +.-goods-flex { + display: flex; + justify-content: space-between; + align-items: center; +} +.icons,.favorite { + flex: 1; + font-size: 22rpx; + color: #262626; + display: flex; + flex-direction: column; + align-items: center; +} +.-goods-price { + flex: 7; + color: $price-color; + font-size: 32rpx; + line-height: 1; + /deep/ .price { + font-size: 60rpx; + } +} +.-goods-name { + margin-top: 24rpx; +} + +.top-radius-0 { + margin-top: 0 !important; + border-top-left-radius: 0 !important; + border-top-right-radius: 0 !important; +} +.-goods-msg { + min-height: 120rpx; + margin-top: 24rpx; +} +.recommend-item { + // padding: 0 !important; + margin: 20rpx 0rpx; + overflow: hidden; + border-radius: 12rpx; + + /deep/ .u-image__image { + // width: 228rpx; + height: 228rpx; + border-radius: 12rpx !important; + } +} + +.detail_padding { + padding: 12px 20rpx 0 20rpx; + + > .tips { + color: #000; + font-size: 30rpx; + font-weight: 400; + margin-bottom: 28rpx; + } +} + +.headerRow { + height: 44px; //默认uni navbar就是44px + display: flex; + align-items: center; + width: 100%; + // background: #fff !important; + + > .headerList { + flex: 8; + } + // > div:nth-child(2) { + // flex: 1; + // .headerList{ + // display: flex; + // div{ + // flex: 1; + // } + // } + // } + // > div:nth-child(3) { + // width: 100rpx; + // } + + justify-content: space-between; +} + +.scroll-hide { + opacity: 0; + transition: all 0.5s; +} +.cur { + color: $main-color; +} +.cur::after { + content: ""; + height: 6rpx; + + background: $main-color; + width: 100%; + position: absolute; + bottom: 0; + left: 0; +} + +.header-only-back { + background: transparent; +} +.header, +.header-only-back { + padding-left: 10rpx; + position: fixed; + top: var(--status-bar-height); + width: 100%; + z-index: 8; + height: 90rpx; + font-size: 30rpx; + transition: all 0.5s; +} +/deep/ .u-navbar { + padding-left: 10rpx; +} +.nav-item { + flex: 2; + position: relative; + justify-content: center; + height: 100%; + display: flex; + align-items: center; +} +.header { + color: #666666; + background-color: #fff; + .tab-bar { + width: 100%; + color: #666; + font-weight: 400; + view { + padding: 0 3px; + } + } + &.bg-none { + background: transparent; + } +} + +.page-bottom { + position: fixed; + bottom: 0; + left: 0; + z-index: 9; + background: #fff; + height: 100rpx; + width: 100%; + display: flex; + border-top: 2rpx solid #f2f2f2; + box-sizing: border-box; + > .icon-btn { + display: flex; + align-items: center; + + flex: 1; + > .icon-btn-item { + flex: 1; + position: relative; + text-align: center; + font-size: 22rpx; + color: #262626; + display: flex; + flex-direction: column; + width: 100%; + height: 100%; + align-items: center; + justify-content: center; + > .icon-btn-name { + margin: 4rpx 0; + } + } + } + > .detail-btn { + flex: 1.5; + } +} + +.main-page { + height: calc(100% - var(--status-bar-height)); + overflow: hidden; +} +.icon-back { + padding-right: 10rpx; +} +.icon-list { + border-left: 2rpx solid rgb(194, 194, 194); + padding-left: 10rpx; +} +.backs, +.bg-back { + width: 150rpx; + border: 2rpx solid #e8e8e8; + border-radius: 100px; + display: flex; + align-items: center; + justify-content: center; + padding: 8rpx 0; +} +.bg-back { + background: rgba($color: #fff, $alpha: 0.8); +} +.backs { + text-align: center; + font-size: 42rpx; +} + +.headerImg { + width: 50rpx; + height: 50rpx; + vertical-align: middle; +} + +.shareImg { + width: 36rpx; + height: 36rpx; + vertical-align: middle; +} + +.item-spec-value { + box-sizing: border-box; + margin: 10rpx; + padding: 10rpx 20rpx; + float: left; +} + +.item-spec-value { + background: #ededed; +} + +page { + background: #f0f0f0; + height: 100%; +} + +.product-container { + .header-line { + height: 1px; + background: #f2f2f2; + position: fixed; + top: 90rpx; + left: 0; + right: 0; + z-index: 999; + transition: all 0.5s; + + &.scroll-hide { + background: none; + } + } + + .scroll-page { + width: 100%; + height: 100%; + } +} + +.u-mode-light-error { + border: none; +} + +.showBack { + height: 60rpx; + line-height: 60rpx; + position: fixed; + margin-top: calc(10px); + z-index: 8; + width: 100%; + + /deep/ .u-row { + width: 100%; + } +} + +.showBox { + width: 100%; + height: 90rpx; + background: #ff6262; + color: #fff; + padding: 0 20rpx; + + /deep/ .price { + font-size: 36rpx; + font-weight: 400; + text-align: left; + letter-spacing: 1px; + color: #ffffff; + line-height: 90rpx; + overflow: hidden; + text-overflow: ellipsis; + white-space: nowrap; + } +} + +.status_bar { + background: #fff; + height: var(--status-bar-height); +} diff --git a/pages/product/shopList.vue b/pages/product/shopList.vue new file mode 100644 index 00000000..c91daa8c --- /dev/null +++ b/pages/product/shopList.vue @@ -0,0 +1,163 @@ + + + + + \ No newline at end of file diff --git a/pages/product/shopPage.vue b/pages/product/shopPage.vue new file mode 100644 index 00000000..07f050cc --- /dev/null +++ b/pages/product/shopPage.vue @@ -0,0 +1,550 @@ + + + + + \ No newline at end of file diff --git a/pages/product/shopPageGoods.vue b/pages/product/shopPageGoods.vue new file mode 100644 index 00000000..91ec53b5 --- /dev/null +++ b/pages/product/shopPageGoods.vue @@ -0,0 +1,127 @@ + + + + + \ No newline at end of file diff --git a/pages/promotion/bargain/detail.vue b/pages/promotion/bargain/detail.vue new file mode 100644 index 00000000..52cf0dc6 --- /dev/null +++ b/pages/promotion/bargain/detail.vue @@ -0,0 +1,557 @@ + + + + + \ No newline at end of file diff --git a/pages/promotion/bargain/list.vue b/pages/promotion/bargain/list.vue new file mode 100644 index 00000000..f86c4167 --- /dev/null +++ b/pages/promotion/bargain/list.vue @@ -0,0 +1,145 @@ + + + + + \ No newline at end of file diff --git a/pages/promotion/bargain/log.vue b/pages/promotion/bargain/log.vue new file mode 100644 index 00000000..9a811bde --- /dev/null +++ b/pages/promotion/bargain/log.vue @@ -0,0 +1,141 @@ + + + + + \ No newline at end of file diff --git a/pages/promotion/joinGroup.vue b/pages/promotion/joinGroup.vue new file mode 100644 index 00000000..7b953d43 --- /dev/null +++ b/pages/promotion/joinGroup.vue @@ -0,0 +1,155 @@ + + + + + diff --git a/pages/promotion/lives.vue b/pages/promotion/lives.vue new file mode 100644 index 00000000..bda1fa31 --- /dev/null +++ b/pages/promotion/lives.vue @@ -0,0 +1,379 @@ + + + + + \ No newline at end of file diff --git a/pages/promotion/point/detail.vue b/pages/promotion/point/detail.vue new file mode 100644 index 00000000..a7f0cec0 --- /dev/null +++ b/pages/promotion/point/detail.vue @@ -0,0 +1,217 @@ + + + + + \ No newline at end of file diff --git a/pages/promotion/point/pointList.vue b/pages/promotion/point/pointList.vue new file mode 100644 index 00000000..59187b11 --- /dev/null +++ b/pages/promotion/point/pointList.vue @@ -0,0 +1,355 @@ + + + + diff --git a/pages/promotion/point/user.vue b/pages/promotion/point/user.vue new file mode 100644 index 00000000..6dca8c63 --- /dev/null +++ b/pages/promotion/point/user.vue @@ -0,0 +1,60 @@ + + + \ No newline at end of file diff --git a/pages/promotion/seckill.vue b/pages/promotion/seckill.vue new file mode 100644 index 00000000..0dc1c105 --- /dev/null +++ b/pages/promotion/seckill.vue @@ -0,0 +1,387 @@ + + + + + diff --git a/pages/promotion/static/head-sample.png b/pages/promotion/static/head-sample.png new file mode 100644 index 00000000..7b097a9c Binary files /dev/null and b/pages/promotion/static/head-sample.png differ diff --git a/pages/promotion/static/help-bargain.png b/pages/promotion/static/help-bargain.png new file mode 100644 index 00000000..9ff0450d Binary files /dev/null and b/pages/promotion/static/help-bargain.png differ diff --git a/pages/promotion/static/live.gif b/pages/promotion/static/live.gif new file mode 100644 index 00000000..3f868b53 Binary files /dev/null and b/pages/promotion/static/live.gif differ diff --git a/pages/promotion/static/live.png b/pages/promotion/static/live.png new file mode 100644 index 00000000..d07cdaee Binary files /dev/null and b/pages/promotion/static/live.png differ diff --git a/pages/promotion/static/zan.gif b/pages/promotion/static/zan.gif new file mode 100644 index 00000000..043c7218 Binary files /dev/null and b/pages/promotion/static/zan.gif differ diff --git a/pages/promotion/style.scss b/pages/promotion/style.scss new file mode 100644 index 00000000..aef52885 --- /dev/null +++ b/pages/promotion/style.scss @@ -0,0 +1,131 @@ +.view-item { + background: #fff; + border-radius: 0.4em; + margin: 20rpx 30rpx; + padding: 20rpx 0; +} + +.nodata { + text-align: center; + margin: 40rpx 0 20rpx 0; +} + +.container-wrap { + width: 100%; +} +.white_class { + color: #fff; + font-size: 28rpx; +} + +.popupTips { + font-size: 22rpx; + font-family: PingFang SC, PingFang SC-Regular; + font-weight: 400; + text-align: left; + color: #999999; + margin: 0 20rpx; + + /deep/ view { + line-height: 1.75; + } +} + +.search { + margin: 30rpx 20rpx !important; +} + +.view-left, +.view-content, +.view-right, +.view-item { + display: flex; +} + +.wrapper { + width: 100%; + overflow: hidden; +} +.view-left { + width: 226rpx; + height: 100%; + overflow: hidden; + display: flex; + justify-content: center; +} +.view-content { + width: calc((100% - 240rpx)); + padding-left: 20rpx; + flex-direction: column; + justify-content: center; + + text-align: center; +} +.buy-content { + font-size: 22rpx; + font-family: PingFang SC, PingFang SC-Regular; + font-weight: 400; + margin-top: 15rpx; + text-align: center; + color: #999999; +} +.view-content-bottom { + width: 100%; + display: flex; + justify-content: space-between; + align-items: center; +} + +.group-wrapper { + padding: 16rpx 32rpx; +} +.view-content-name { + font-family: PingFang SC, PingFang SC-Regular; + font-weight: 400; + text-align: left; + color: #333333; + font-size: 28rpx; + display: -webkit-box; + -webkit-box-orient: vertical; + -webkit-line-clamp: 2; + overflow: hidden; +} +.view-content-price { + margin: 10rpx 0; + letter-spacing: 0px; + overflow: hidden; + font-size: 28rpx; + font-family: PingFang SC, PingFang SC-Regular; + font-weight: 400; + text-align: left; + color: #ff5a10; + text-overflow: ellipsis; + white-space: nowrap; +} +.view-content-original_price { + font-size: 22rpx; + font-family: PingFang SC, PingFang SC-Regular; + font-weight: 400; + text-decoration: line-through; + text-align: left; + color: #999999; +} + +.btn-group { + background: $aider-light-color; + border-radius: 10rpx; + font-size: 24rpx; + font-family: PingFang SC, PingFang SC-Regular; + font-weight: 400; + color: #fff; + text-align: center; + padding: 6rpx 16rpx; +} +/deep/ .empty { + position: relative; + padding-top: 20%; + > .empty-content { + position: relative; + padding-top: 20%; + } +} diff --git a/pages/tabbar/cart/cart.scss b/pages/tabbar/cart/cart.scss new file mode 100644 index 00000000..e69de29b diff --git a/pages/tabbar/cart/cartList.vue b/pages/tabbar/cart/cartList.vue new file mode 100644 index 00000000..22333602 --- /dev/null +++ b/pages/tabbar/cart/cartList.vue @@ -0,0 +1,898 @@ + + + + + diff --git a/pages/tabbar/cart/mp-carui.scss b/pages/tabbar/cart/mp-carui.scss new file mode 100644 index 00000000..c33d12a6 --- /dev/null +++ b/pages/tabbar/cart/mp-carui.scss @@ -0,0 +1,8 @@ +.box2 { + padding: 0 16rpx 0; + margin: 0 16rpx 20rpx; + +} +.uNumber{ + display: flex; +} \ No newline at end of file diff --git a/pages/tabbar/category/category.vue b/pages/tabbar/category/category.vue new file mode 100644 index 00000000..4c7feeb9 --- /dev/null +++ b/pages/tabbar/category/category.vue @@ -0,0 +1,219 @@ + + + + + diff --git a/pages/tabbar/home/index.vue b/pages/tabbar/home/index.vue new file mode 100644 index 00000000..cbeebf5d --- /dev/null +++ b/pages/tabbar/home/index.vue @@ -0,0 +1,30 @@ + + + + diff --git a/pages/tabbar/home/template/advertising.scss b/pages/tabbar/home/template/advertising.scss new file mode 100644 index 00000000..be5228c9 --- /dev/null +++ b/pages/tabbar/home/template/advertising.scss @@ -0,0 +1,57 @@ +.position-box{ + position: absolute; + right: 0; + bottom: 0; +} +.join-box { + display: flex; + } + .item-price { + > span { + font-size: 15px; + font-weight: 500; + color: #e1212b; + } + } + .join-item { + flex: 1; + } + .item-img { + width: 75px; + height: 75px; + margin: 0 auto; + display: block; + } + .item-img-box { + position: relative; + } + .item-line-through { + > span { + font-size: 10px; + font-weight: 400; + text-decoration: line-through; + color: #999; + } + } + .item-position-tips { + position: absolute; + right: 0; + color: #fff; + font-size: 12px; + bottom: 0; + } + .join-title { + display: flex; + justify-content: space-between; + align-items: center; + background: #fff; + height: 50px; + > div:nth-of-type(1) { + font-size: 16px; + font-weight: bold; + } + > div:nth-of-type(2) { + font-size: 12px; + color: #999; + } + } \ No newline at end of file diff --git a/pages/tabbar/home/template/tpl.js b/pages/tabbar/home/template/tpl.js new file mode 100644 index 00000000..8b74eb0e --- /dev/null +++ b/pages/tabbar/home/template/tpl.js @@ -0,0 +1,109 @@ +/** 配置楼层模块的跳转 */ +export function modelNavigateTo(item) { + let val = item.url; + + switch (val.___type) { + case "goods": + uni.navigateTo({ + url: "/pages/product/goods?id=" + val.id + "&goodsId=" + val.goodsId, + }); + break; + case "category": + if (val.id) { + uni.navigateTo({ + url: `/pages/navigation/search/searchPage?category=${val.id}`, + }); + } else { + uni.navigateTo({ + url: `/pages/navigation/search/searchPage`, + }); + } + break; + case "shops": + uni.navigateTo({ + url: `/pages/product/shopPage?id=${val.id}`, + }); + break; + // 活动 + case "marketing": + uni.navigateTo({ + url: "/pages/product/goods?id=" + val.skuId + "goodsId=" + val.goodsId, + }); + break; + case "pages": + uni.navigateTo({ + url: val.___path + "?id=" + val.id + "&title=" + val.title, + }); + break; + case "other": + switch (val.title) { + case "首页": + uni.switchTab({ + url: `/pages/tabbar/home/index`, + }); + break; + case "购物车": + uni.switchTab({ + url: `/pages/tabbar/cart/cartList`, + }); + return; + case "个人中心": + uni.switchTab({ + url: `/pages/tabbar/user/my`, + }); + break; + case "收藏商品": + uni.navigateTo({ + url: `/pages/mine/myCollect`, + }); + break; + case "我的订单": + uni.navigateTo({ + url: `/pages/order/myOrder?status=0`, + }); + break; + case "领券中心": + uni.navigateTo({ + url: `/pages/cart/coupon/couponCenter`, + }); + break; + case "签到": + uni.navigateTo({ + url: `/pages/mine/signIn`, + }); + break; + case "秒杀频道": + uni.navigateTo({ + url: `/pages/promotion/seckill`, + }); + break; + case "拼团频道": + uni.navigateTo({ + url: `/pages/promotion/joinGroup`, + }); + break; + case "小程序直播": + uni.navigateTo({ + url: `/pages/promotion/lives`, + }); + break; + case "砍价": + uni.navigateTo({ + url: `/pages/promotion/bargain/list`, + }); + break; + case "积分商城": + uni.navigateTo({ + url: `/pages/promotion/point/pointList`, + }); + break; + case "店铺列表": + uni.navigateTo({ + url: `/pages/product/shopList`, + }); + break; + } + + break; + } +} diff --git a/pages/tabbar/home/template/tpl.scss b/pages/tabbar/home/template/tpl.scss new file mode 100644 index 00000000..a9702fbf --- /dev/null +++ b/pages/tabbar/home/template/tpl.scss @@ -0,0 +1,32 @@ +.image-mode { + width: 100%; + height: 100%; + display: block; + padding: 2rpx; +} +.layout { + padding: 16rpx; + margin: 8rpx 0; + background: #fff; +} +.layout, +.view-height-75, +.view-height-150 { + overflow: hidden; +} +.view-width-100 { + width: 100%; +} +.view-height-75 { + // height: 150rpx; +} +.view-height-150 { + // height: 300rpx; + flex: 1; +} + +.view-height-85 { + height: 170rpx; + flex: 1; +} + diff --git a/pages/tabbar/home/template/tpl_banner.vue b/pages/tabbar/home/template/tpl_banner.vue new file mode 100644 index 00000000..d1bd2f8e --- /dev/null +++ b/pages/tabbar/home/template/tpl_banner.vue @@ -0,0 +1,37 @@ + + + + diff --git a/pages/tabbar/home/template/tpl_flex_five.vue b/pages/tabbar/home/template/tpl_flex_five.vue new file mode 100644 index 00000000..b5b0415d --- /dev/null +++ b/pages/tabbar/home/template/tpl_flex_five.vue @@ -0,0 +1,31 @@ + + + + + \ No newline at end of file diff --git a/pages/tabbar/home/template/tpl_flex_four.vue b/pages/tabbar/home/template/tpl_flex_four.vue new file mode 100644 index 00000000..e701622e --- /dev/null +++ b/pages/tabbar/home/template/tpl_flex_four.vue @@ -0,0 +1,35 @@ + + + + + \ No newline at end of file diff --git a/pages/tabbar/home/template/tpl_flex_one.vue b/pages/tabbar/home/template/tpl_flex_one.vue new file mode 100644 index 00000000..9af2c5cd --- /dev/null +++ b/pages/tabbar/home/template/tpl_flex_one.vue @@ -0,0 +1,32 @@ + + + \ No newline at end of file diff --git a/pages/tabbar/home/template/tpl_flex_three.vue b/pages/tabbar/home/template/tpl_flex_three.vue new file mode 100644 index 00000000..749c7009 --- /dev/null +++ b/pages/tabbar/home/template/tpl_flex_three.vue @@ -0,0 +1,39 @@ + + + + + \ No newline at end of file diff --git a/pages/tabbar/home/template/tpl_flex_two.vue b/pages/tabbar/home/template/tpl_flex_two.vue new file mode 100644 index 00000000..05c052e0 --- /dev/null +++ b/pages/tabbar/home/template/tpl_flex_two.vue @@ -0,0 +1,49 @@ + + + \ No newline at end of file diff --git a/pages/tabbar/home/template/tpl_goods.vue b/pages/tabbar/home/template/tpl_goods.vue new file mode 100644 index 00000000..c511558b --- /dev/null +++ b/pages/tabbar/home/template/tpl_goods.vue @@ -0,0 +1,175 @@ + + + + diff --git a/pages/tabbar/home/template/tpl_group.vue b/pages/tabbar/home/template/tpl_group.vue new file mode 100644 index 00000000..b234a80c --- /dev/null +++ b/pages/tabbar/home/template/tpl_group.vue @@ -0,0 +1,40 @@ + + + \ No newline at end of file diff --git a/pages/tabbar/home/template/tpl_integral.vue b/pages/tabbar/home/template/tpl_integral.vue new file mode 100644 index 00000000..8f73a782 --- /dev/null +++ b/pages/tabbar/home/template/tpl_integral.vue @@ -0,0 +1,85 @@ + + + \ No newline at end of file diff --git a/pages/tabbar/home/template/tpl_join_group.vue b/pages/tabbar/home/template/tpl_join_group.vue new file mode 100644 index 00000000..93093318 --- /dev/null +++ b/pages/tabbar/home/template/tpl_join_group.vue @@ -0,0 +1,90 @@ + + + \ No newline at end of file diff --git a/pages/tabbar/home/template/tpl_left_one_right_two.vue b/pages/tabbar/home/template/tpl_left_one_right_two.vue new file mode 100644 index 00000000..af8e6daa --- /dev/null +++ b/pages/tabbar/home/template/tpl_left_one_right_two.vue @@ -0,0 +1,46 @@ + + + + \ No newline at end of file diff --git a/pages/tabbar/home/template/tpl_left_two_right_one.vue b/pages/tabbar/home/template/tpl_left_two_right_one.vue new file mode 100644 index 00000000..a683c633 --- /dev/null +++ b/pages/tabbar/home/template/tpl_left_two_right_one.vue @@ -0,0 +1,44 @@ + + + + + \ No newline at end of file diff --git a/pages/tabbar/home/template/tpl_menu.vue b/pages/tabbar/home/template/tpl_menu.vue new file mode 100644 index 00000000..29f6b6ef --- /dev/null +++ b/pages/tabbar/home/template/tpl_menu.vue @@ -0,0 +1,55 @@ + + + \ No newline at end of file diff --git a/pages/tabbar/home/template/tpl_search.vue b/pages/tabbar/home/template/tpl_search.vue new file mode 100644 index 00000000..2bbc598d --- /dev/null +++ b/pages/tabbar/home/template/tpl_search.vue @@ -0,0 +1,38 @@ + + + diff --git a/pages/tabbar/home/template/tpl_spike.vue b/pages/tabbar/home/template/tpl_spike.vue new file mode 100644 index 00000000..c77a51b4 --- /dev/null +++ b/pages/tabbar/home/template/tpl_spike.vue @@ -0,0 +1,38 @@ + + + \ No newline at end of file diff --git a/pages/tabbar/home/template/tpl_text_picture.vue b/pages/tabbar/home/template/tpl_text_picture.vue new file mode 100644 index 00000000..eab52013 --- /dev/null +++ b/pages/tabbar/home/template/tpl_text_picture.vue @@ -0,0 +1,101 @@ + + + + + \ No newline at end of file diff --git a/pages/tabbar/home/template/tpl_title.vue b/pages/tabbar/home/template/tpl_title.vue new file mode 100644 index 00000000..62860749 --- /dev/null +++ b/pages/tabbar/home/template/tpl_title.vue @@ -0,0 +1,47 @@ + + + + diff --git a/pages/tabbar/home/template/tpl_top_one_bottom_two.vue b/pages/tabbar/home/template/tpl_top_one_bottom_two.vue new file mode 100644 index 00000000..22aaacca --- /dev/null +++ b/pages/tabbar/home/template/tpl_top_one_bottom_two.vue @@ -0,0 +1,72 @@ + + + + + \ No newline at end of file diff --git a/pages/tabbar/home/template/tpl_top_two_bottom_one.vue b/pages/tabbar/home/template/tpl_top_two_bottom_one.vue new file mode 100644 index 00000000..bbed4bae --- /dev/null +++ b/pages/tabbar/home/template/tpl_top_two_bottom_one.vue @@ -0,0 +1,79 @@ + + + + diff --git a/pages/tabbar/home/views.vue b/pages/tabbar/home/views.vue new file mode 100644 index 00000000..9fb57392 --- /dev/null +++ b/pages/tabbar/home/views.vue @@ -0,0 +1,219 @@ + + + + + diff --git a/pages/tabbar/home/web-view.vue b/pages/tabbar/home/web-view.vue new file mode 100644 index 00000000..4fef3f11 --- /dev/null +++ b/pages/tabbar/home/web-view.vue @@ -0,0 +1,32 @@ + + + + + \ No newline at end of file diff --git a/pages/tabbar/im/index.nvue b/pages/tabbar/im/index.nvue new file mode 100644 index 00000000..0060a113 --- /dev/null +++ b/pages/tabbar/im/index.nvue @@ -0,0 +1,15 @@ + + + + + \ No newline at end of file diff --git a/pages/tabbar/user/my.vue b/pages/tabbar/user/my.vue new file mode 100644 index 00000000..ce2cb3f8 --- /dev/null +++ b/pages/tabbar/user/my.vue @@ -0,0 +1,296 @@ + + + + diff --git a/pages/tabbar/user/similarGoods.vue b/pages/tabbar/user/similarGoods.vue new file mode 100644 index 00000000..b1824756 --- /dev/null +++ b/pages/tabbar/user/similarGoods.vue @@ -0,0 +1,187 @@ + + + + + diff --git a/pages/tabbar/user/utils/tool.vue b/pages/tabbar/user/utils/tool.vue new file mode 100644 index 00000000..1e93b1b5 --- /dev/null +++ b/pages/tabbar/user/utils/tool.vue @@ -0,0 +1,157 @@ + + + + + diff --git a/pages/tabbar/vlog/index.nvue b/pages/tabbar/vlog/index.nvue new file mode 100644 index 00000000..8d54ee26 --- /dev/null +++ b/pages/tabbar/vlog/index.nvue @@ -0,0 +1,341 @@ + + + + \ No newline at end of file diff --git a/plugins/APPUpdate/APPUpdate.md b/plugins/APPUpdate/APPUpdate.md new file mode 100644 index 00000000..45cf6e57 --- /dev/null +++ b/plugins/APPUpdate/APPUpdate.md @@ -0,0 +1,119 @@ +# APP版本更新、强制更新、漂亮的更新界面、IOS更新(跳转IOS store)、wgt更新 + +### QQ交流群(学习干货多多) 607391225 +![QQ交流群](http://qn.kemean.cn//upload/202004/14/15868301778472k7oubi6.png) + +# [点击跳转-插件示例](https://ext.dcloud.net.cn/plugin?id=2009) +# [点击跳转-5年的web前端开源的uni-app快速开发模板-下载看文档](https://ext.dcloud.net.cn/plugin?id=2009) + +### 常见问题 +1.安卓apk下载完成后没有更新APP? + +答:问题是因为没有添加APP安装应用的权限,解决方法在`manifest.json`文件里面`APP模块权限配置`的`Android打包权限配置`勾选以下权限 +``` + + +``` +若还有问题请看[安装apk无法执行的解决方案](https://ask.dcloud.net.cn/article/35703 "安装apk无法执行的解决方案") + +2.APP更新后版本号没变,还是之前的版本号? + +答:可能是更新的安装包没有升级版本号,`manifest.json`文件里面基本设置`应用版本号`和`应用版本名称`需要升高 + +3.APP更新后没有覆盖之前的APP? + +答:可能是更新的安装包`包名`和APP的`包名`不一样 + +### 第一步配置APP更新接口 +在`APPUpdate.js`里面`getServerNo`函数方法配置更新接口 +``` +let httpData = { + version:version +}; +if (platform == "android") { + httpData.type = 1101; +} else { + httpData.type = 1102; +} +/* 接口入参说明 + * version: 应用当前版本号(已自动获取) + * type:平台(1101是安卓,1102是IOS) + */ +// 可以用自己项目的请求方法 +$http.get("api/kemean/aid/app_version", httpData).then(res => { + /*接口出参说明 (res数据说明) + * | 参数名称 | 一定返回 | 类型 | 描述 + * | -------------|--------- | --------- | ------------- | + * | versionCode | y | int | 版本号 | + * | versionName | y | String | 版本名称 | + * | versionInfo | y | String | 版本信息 \n 换行(例如:1.修改了bug1 \n 2.修改了bug2 \n 3.修改了bug3) | + * | forceUpdate | y | boolean | 是否强制更新 | + * | downloadUrl | y | String | 版本下载链接 `IOS安装包更新请放跳转store应用商店链接,安卓apk和wgt文件放文件下载链接` | + */ + // 只要callback上面的数据就ok(返回数据就表示接口允许更新) + // 示例返回数据 + callback && callback({ + versionCode: 101, + versionName: "1.0.1", + versionInfo: "1.修改了bug1 \n 2.修改了bug2 \n 3.修改了bug3", + forceUpdate: false, + downloadUrl: "http://www.xxx.com/download/123", + }); +}); +``` + +### 第二步 使用方法 +``` +// App.vue页面 + +// #ifdef APP-PLUS +import APPUpdate from "@/plugins/APPUpdate"; +// #endif + +onLaunch: function(e) { + // #ifdef APP-PLUS + APPUpdate(); + // #endif +} +``` + +### 第三步 添加APP安装应用的权限 +在`manifest.json`文件里面`APP模块权限配置`的`Android打包权限配置`勾选以下权限 +``` + + +``` + +### 修改弹窗的主题色或弹窗图标 +在`APPUpdate.js`里面上面`$mainColor`常量中定义主题颜色,`$iconUrl`常量中定义图标地址 + +### 检查APP是否有新版本(一般在设置页面使用) +``` +// #ifdef APP-PLUS +import APPUpdate, { getCurrentNo } from "@/plugins/APPUpdate"; +// #endif +export default { + data() { + return { + version: "" // 版本号 + }; + }, + //第一次加载 + onLoad(e) { + // #ifdef APP-PLUS + getCurrentNo(res => { + // 进页面获取当前APP版本号(用于页面显示) + this.version = res.version; + }); + // #endif + }, + //方法 + methods: { + // 检查APP是否有新版本 + onAPPUpdate() { + // true 没有新版本的时候有提示,默认:false + APPUpdate(true); + } + } +} +``` \ No newline at end of file diff --git a/plugins/APPUpdate/index.js b/plugins/APPUpdate/index.js new file mode 100644 index 00000000..7a15aa48 --- /dev/null +++ b/plugins/APPUpdate/index.js @@ -0,0 +1,900 @@ +// #ifdef APP-PLUS +/**** 此文件说明请看注释 *****/ +// 可以用自己项目的请求方法 +// 请求配置说明:https://ext.dcloud.net.cn/plugin?id=822 +import { getAppVersion } from "@/api/message.js"; + +const platform = uni.getSystemInfoSync().platform; +// 主颜色 +const $mainColor = "#1ABC9C"; +// 弹窗图标url +const $iconUrl = + "https://lilishop-oss.oss-cn-beijing.aliyuncs.com/app/upgrade.png"; + +// 获取当前应用的版本号 +export const getCurrentNo = function (callback) { + // 获取本地应用资源版本号 + plus.runtime.getProperty(plus.runtime.appid, function (inf) { + callback && + callback({ + versionCode: inf.version.replace(/\./g, ""), + version: inf.version, + }); + }); +}; +// 发起ajax请求获取服务端版本号 +export const getServerNo = function (callback) { + let type; + + platform == "android" ? (type = "ANDROID") : (type = "IOS"); + + getAppVersion(type).then((res) => { + if (res.data.success && res.data.result.downloadUrl) { + let response = res.data.result; + let result = {}; + result.versionCode = response.version; + result.versionName = response.versionName; + result.versionInfo = response.content || "暂无"; + result.forceUpdate = response.forceUpdate; + result.downloadUrl = response.downloadUrl; + callback && callback(result); + } + }); +}; +// 从服务器下载应用资源包(wgt文件) +export const getDownload = function (data) { + let popupData = { + progress: true, + buttonNum: 2, + }; + if (data.forceUpdate) { + popupData.buttonNum = 0; + popupData.forceUpdate = data.forceUpdate; + } + let dtask; + let lastProgressValue = 0; + downloadPopup( + popupData, + function (res) { + dtask = plus.downloader.createDownload( + data.downloadUrl, + { + filename: "_doc/update/", + }, + function (download, status) { + if (status == 200) { + res.change({ + progressValue: 100, + progressTip: "正在安装文件...", + progress: true, + buttonNum: 0, + }); + plus.runtime.install( + download.filename, + {}, + function () { + res.change({ + contentText: "应用资源更新完成!", + buttonNum: 1, + progress: false, + }); + }, + function (e) { + res.cancel(); + plus.nativeUI.alert( + "安装文件失败[" + e.code + "]:" + e.message + ); + } + ); + } else { + res.change({ + contentText: "文件下载失败...", + buttonNum: 1, + progress: false, + }); + } + } + ); + dtask.start(); + dtask.addEventListener("statechanged", function (task, status) { + switch (task.state) { + case 1: // 开始 + res.change({ + progressValue: 0, + progressTip: "准备下载...", + progress: true, + }); + break; + case 2: // 已连接到服务器 + res.change({ + progressValue: 0, + progressTip: "开始下载...", + progress: true, + }); + break; + case 3: + const progress = parseInt( + (task.downloadedSize / task.totalSize) * 100 + ); + if (progress - lastProgressValue >= 2) { + lastProgressValue = progress; + res.change({ + progressValue: progress, + progressTip: "已下载" + progress + "%", + progress: true, + }); + } + break; + } + }); + }, + function () { + // 取消下载 + dtask && dtask.abort(); + uni.showToast({ + title: "已取消下载", + icon: "none", + }); + }, + function () { + // 重启APP + plus.runtime.restart(); + } + ); +}; +// 文字换行 +function drawtext(text, maxWidth) { + let textArr = text.split(""); + let len = textArr.length; + + // 上个节点 + let previousNode = 0; + // 记录节点宽度 + let nodeWidth = 0; + // 文本换行数组 + let rowText = []; + + // 如果是字母,侧保存长度 + let letterWidth = 0; + // 汉字宽度 + let chineseWidth = 14; + // otherFont宽度 + let otherWidth = 7; + for (let i = 0; i < len; i++) { + if (/[\u4e00-\u9fa5]|[\uFE30-\uFFA0]/g.test(textArr[i])) { + if (letterWidth > 0) { + if (nodeWidth + chineseWidth + letterWidth * otherWidth > maxWidth) { + rowText.push({ + type: "text", + content: text.substring(previousNode, i), + }); + previousNode = i; + nodeWidth = chineseWidth; + letterWidth = 0; + } else { + nodeWidth += chineseWidth + letterWidth * otherWidth; + letterWidth = 0; + } + } else { + if (nodeWidth + chineseWidth > maxWidth) { + rowText.push({ + type: "text", + content: text.substring(previousNode, i), + }); + previousNode = i; + nodeWidth = chineseWidth; + } else { + nodeWidth += chineseWidth; + } + } + } else { + if (/\n/g.test(textArr[i])) { + rowText.push({ + type: "break", + content: text.substring(previousNode, i), + }); + previousNode = i + 1; + nodeWidth = 0; + letterWidth = 0; + } else if (textArr[i] == "\\" && textArr[i + 1] == "n") { + rowText.push({ + type: "break", + content: text.substring(previousNode, i), + }); + previousNode = i + 2; + nodeWidth = 0; + letterWidth = 0; + } else if (/[a-zA-Z0-9]/g.test(textArr[i])) { + letterWidth += 1; + if (nodeWidth + letterWidth * otherWidth > maxWidth) { + rowText.push({ + type: "text", + content: text.substring(previousNode, i + 1 - letterWidth), + }); + previousNode = i + 1 - letterWidth; + nodeWidth = letterWidth * otherWidth; + letterWidth = 0; + } + } else { + if (nodeWidth + otherWidth > maxWidth) { + rowText.push({ + type: "text", + content: text.substring(previousNode, i), + }); + previousNode = i; + nodeWidth = otherWidth; + } else { + nodeWidth += otherWidth; + } + } + } + } + if (previousNode < len) { + rowText.push({ + type: "text", + content: text.substring(previousNode, len), + }); + } + + return rowText; +} +// 是否更新弹窗 +function updatePopup(data, callback) { + // 弹窗遮罩层 + let maskLayer = new plus.nativeObj.View("maskLayer", { + //先创建遮罩层 + top: "0px", + left: "0px", + height: "100%", + width: "100%", + backgroundColor: "rgba(0,0,0,0.5)", + }); + let downloadUrl = data.downloadUrl; + // 以下为计算菜单的nview绘制布局,为固定算法,使用者无关关心 + const screenWidth = plus.screen.resolutionWidth; + const screenHeight = plus.screen.resolutionHeight; + //弹窗容器宽度 + const popupViewWidth = screenWidth * 0.8; + // 弹窗容器的Padding + const viewContentPadding = 20; + // 弹窗容器的宽度 + const viewContentWidth = parseInt(popupViewWidth - viewContentPadding * 5); + // 描述的列表 + const descriptionList = drawtext(data.versionInfo, viewContentWidth); + + // 弹窗容器高度 + let popupViewHeight = 400; + let popupViewContentList = [ + { + src: $iconUrl, + id: "logo", + tag: "img", + }, + { + tag: "font", + id: "title", + text: "V" + data.versionCode, + textStyles: { + size: "26px", + color: "#fff", + weight: "700", + }, + position: { + top: "60px", + left: "64px", + height: "20px", + }, + }, + { + tag: "font", + id: "welcome", + text: "欢迎体验", + textStyles: { + size: "16px", + color: "#fff", + weight: "400", + }, + position: { + top: "85px", + left: "64px", + height: "20px", + }, + }, + ]; + const textHeight = 18; + let contentTop = popupViewHeight / 2 + 16; + + popupViewContentList.push({ + tag: "font", + id: "content-title", + text: "新版本特性:", + textStyles: { + size: "20px", + lineSpacing: "50%", + align: "left", + }, + position: { + top: popupViewHeight / 2 - 24 + "px", + left: viewContentPadding + "px", + width: viewContentWidth + "px", + height: textHeight + "px", + }, + }); + descriptionList.forEach((item, index) => { + if (index > 0) { + popupViewHeight += textHeight; + contentTop += textHeight; + } + popupViewContentList.push({ + tag: "font", + id: "content" + index + 1, + text: item.content, + + textStyles: { + size: "14px", + color: "#666", + lineSpacing: "50%", + align: "left", + }, + + position: { + top: contentTop + "px", + left: viewContentPadding + "px", + width: viewContentWidth + "px", + height: textHeight + "px", + }, + }); + if (item.type == "break") { + contentTop += 10; + popupViewHeight += 10; + } + }); + // 弹窗内容 + let popupView = new plus.nativeObj.View("popupView", { + //创建底部图标菜单 + tag: "rect", + top: (screenHeight - popupViewHeight) / 2 + "px", + left: "10%", + height: popupViewHeight + "px", + width: "80%", + }); + // 绘制白色背景 + popupView.drawRect( + { + color: "#FFFFFF", + radius: "8px", + }, + { + top: "40px", + height: popupViewHeight - 40 + "px", + } + ); + // 绘制底边按钮 + popupView.drawRect( + { + radius: "3px", + borderColor: "#f1f1f1", + borderWidth: "1px", + }, + { + bottom: viewContentPadding + "px", + left: viewContentPadding + "px", + width: (viewContentWidth - viewContentPadding) / 2 + "px", + height: "30px", + } + ); + // 绘制底边按钮 + popupView.drawRect( + { + radius: "3px", + color: $mainColor, + borderColor: $mainColor, + }, + { + bottom: viewContentPadding + "px", + left: + (viewContentWidth - viewContentPadding) / 2 + + viewContentPadding * 2 + + "px", + width: (viewContentWidth - viewContentPadding) / 2 + "px", + height: "30px", + } + ); + popupViewContentList.push({ + tag: "rect", + id: "confimBtn", + rectStyles: { + color: $mainColor, + radius: "3px", + }, + position: { + bottom: viewContentPadding + "px", + left: (viewContentWidth - viewContentPadding) / 3 + "px", + width: viewContentWidth - viewContentPadding + "px", + height: "40px", + }, + }); + popupViewContentList.push({ + tag: "font", + id: "confirmText", + text: "立即更新", + textStyles: { + size: "18px", + color: "#fff", + lineSpacing: "0%", + whiteSpace: "normal", + }, + position: { + bottom: viewContentPadding + "px", + left: (viewContentWidth - viewContentPadding) / 3 + "px", + width: viewContentWidth - viewContentPadding + "px", + height: "40px", + }, + }); + popupView.draw(popupViewContentList); + popupView.addEventListener("click", function (e) { + let maxTop = popupViewHeight - viewContentPadding; + let maxLeft = popupViewWidth - viewContentPadding; + let buttonWidth = (viewContentWidth - viewContentPadding) / 2; + if (e.clientY > maxTop - 30 && e.clientY < maxTop) { + // 暂不升级 + if ( + e.clientX > viewContentPadding && + e.clientX < maxLeft - buttonWidth - viewContentPadding + ) { + // 立即升级 + if (platform == "android") { + maskLayer.hide(); + popupView.hide(); + callback && callback(); + } else { + if (!data.forceUpdate) { + maskLayer.hide(); + popupView.hide(); + } + plus.runtime.openURL(downloadUrl); + } + } else if (e.clientX > maxLeft - buttonWidth && e.clientX < maxLeft) { + // 立即升级 + if (platform == "android") { + maskLayer.hide(); + popupView.hide(); + callback && callback(); + } else { + if (!data.forceUpdate) { + maskLayer.hide(); + popupView.hide(); + } + plus.runtime.openURL(downloadUrl); + } + } + } + }); + // 点击遮罩层 + maskLayer.addEventListener("click", function () { + //处理遮罩层点击 + if (!data.forceUpdate) { + maskLayer.hide(); + popupView.hide(); + } + }); + // 显示弹窗 + maskLayer.show(); + popupView.show(); +} +// 文件下载的弹窗绘图 +function downloadPopupDrawing(data) { + // 以下为计算菜单的nview绘制布局,为固定算法,使用者无关关心 + const screenWidth = plus.screen.resolutionWidth; + const screenHeight = plus.screen.resolutionHeight; + //弹窗容器宽度 + const popupViewWidth = screenWidth * 0.7; + // 弹窗容器的Padding + const viewContentPadding = 20; + // 弹窗容器的宽度 + const viewContentWidth = popupViewWidth - viewContentPadding * 2; + // 弹窗容器高度 + let popupViewHeight = viewContentPadding * 3 + 60; + let progressTip = data.progressTip || "准备下载..."; + let contentText = data.contentText || "正在为您更新,请耐心等待"; + let elementList = [ + { + tag: "rect", //背景色 + color: "#FFFFFF", + rectStyles: { + radius: "8px", + }, + }, + { + tag: "font", + id: "title", + text: "升级APP", + textStyles: { + size: "16px", + color: "#333", + weight: "bold", + verticalAlign: "middle", + whiteSpace: "normal", + }, + position: { + top: viewContentPadding + "px", + height: "30px", + }, + }, + { + tag: "font", + id: "content", + text: contentText, + textStyles: { + size: "14px", + color: "#333", + verticalAlign: "middle", + whiteSpace: "normal", + }, + position: { + top: viewContentPadding * 2 + 30 + "px", + height: "20px", + }, + }, + ]; + // 是否有进度条 + if (data.progress) { + popupViewHeight += viewContentPadding + 40; + elementList = elementList.concat([ + { + tag: "font", + id: "progressValue", + text: progressTip, + textStyles: { + size: "14px", + color: $mainColor, + whiteSpace: "normal", + }, + position: { + top: viewContentPadding * 4 + 20 + "px", + height: "30px", + }, + }, + { + tag: "rect", //绘制进度条背景 + id: "progressBg", + rectStyles: { + radius: "4px", + borderColor: "#f1f1f1", + borderWidth: "1px", + }, + position: { + top: viewContentPadding * 4 + 60 + "px", + left: viewContentPadding + "px", + width: viewContentWidth + "px", + height: "8px", + }, + }, + ]); + } + if (data.buttonNum == 2) { + popupViewHeight += viewContentPadding + 30; + // elementList = elementList.concat([{ + // tag: 'rect', //绘制底边按钮 + // rectStyles: { + // radius: "3px", + // borderColor: "#f1f1f1", + // borderWidth: "1px", + // }, + // position: { + // bottom: viewContentPadding + 'px', + // left: viewContentPadding + "px", + // width: (viewContentWidth - viewContentPadding) / 2 + "px", + // height: "30px" + // } + // }, + // { + // tag: 'rect', //绘制底边按钮 + // rectStyles: { + // radius: "3px", + // color: $mainColor + // }, + // position: { + // bottom: viewContentPadding + 'px', + // left: ((viewContentWidth - viewContentPadding) / 2 + viewContentPadding * 2) + "px", + // width: (viewContentWidth - viewContentPadding) / 2 + "px", + // height: "30px" + // } + // }, + // { + // tag: 'font', + // id: 'cancelText', + // text: "取消下载", + // textStyles: { + // size: '14px', + // color: "#666", + // lineSpacing: "0%", + // whiteSpace: "normal" + // }, + // position: { + // bottom: viewContentPadding + 'px', + // left: viewContentPadding + "px", + // width: (viewContentWidth - viewContentPadding) / 2 + "px", + // height: "30px", + // } + // }, + // { + // tag: 'font', + // id: 'confirmText', + // text: "后台下载", + // textStyles: { + // size: '14px', + // color: "#FFF", + // lineSpacing: "0%", + // whiteSpace: "normal" + // }, + // position: { + // bottom: viewContentPadding + 'px', + // left: ((viewContentWidth - viewContentPadding) / 2 + viewContentPadding * 2) + "px", + // width: (viewContentWidth - viewContentPadding) / 2 + "px", + // height: "30px", + // } + // } + // ]); + } + if (data.buttonNum == 1) { + popupViewHeight += viewContentPadding + 40; + elementList = elementList.concat([ + { + tag: "rect", //绘制底边按钮 + rectStyles: { + radius: "6px", + color: $mainColor, + }, + position: { + bottom: viewContentPadding + "px", + left: viewContentPadding + "px", + width: viewContentWidth + "px", + height: "40px", + }, + }, + { + tag: "font", + id: "confirmText", + text: "关闭", + textStyles: { + size: "14px", + color: "#FFF", + lineSpacing: "0%", + }, + position: { + bottom: viewContentPadding + "px", + left: viewContentPadding + "px", + width: viewContentWidth + "px", + height: "40px", + }, + }, + ]); + } + return { + popupViewHeight: popupViewHeight, + popupViewWidth: popupViewWidth, + screenHeight: screenHeight, + viewContentWidth: viewContentWidth, + viewContentPadding: viewContentPadding, + elementList: elementList, + }; +} +// 文件下载的弹窗 +function downloadPopup(data, callback, cancelCallback, rebootCallback) { + // 弹窗遮罩层 + let maskLayer = new plus.nativeObj.View("maskLayer", { + //先创建遮罩层 + top: "0px", + left: "0px", + height: "100%", + width: "100%", + backgroundColor: "rgba(0,0,0,0.5)", + }); + let popupViewData = downloadPopupDrawing(data); + // 弹窗内容 + let popupView = new plus.nativeObj.View("popupView", { + //创建底部图标菜单 + tag: "rect", + top: + (popupViewData.screenHeight - popupViewData.popupViewHeight) / 2 + "px", + left: "15%", + height: popupViewData.popupViewHeight + "px", + width: "70%", + }); + let progressValue = 0; + let progressTip = 0; + let contentText = 0; + let buttonNum = 2; + let forceUpdate = data.forceUpdate; + if (data.buttonNum >= 0) { + buttonNum = data.buttonNum; + } + popupView.draw(popupViewData.elementList); + popupView.addEventListener("click", function (e) { + let maxTop = + popupViewData.popupViewHeight - popupViewData.viewContentPadding; + let maxLeft = + popupViewData.popupViewWidth - popupViewData.viewContentPadding; + if (e.clientY > maxTop - 40 && e.clientY < maxTop) { + if (buttonNum == 1) { + // 单按钮 + if ( + e.clientX > popupViewData.viewContentPadding && + e.clientX < maxLeft + ) { + maskLayer.hide(); + popupView.hide(); + } + } else if (buttonNum == 2) { + // 双按钮 + let buttonWidth = + (popupViewData.viewContentWidth - popupViewData.viewContentPadding) / + 2; + if ( + e.clientX > popupViewData.viewContentPadding && + e.clientX < maxLeft - buttonWidth - popupViewData.viewContentPadding + ) { + maskLayer.hide(); + popupView.hide(); + //cancelCallback && cancelCallback(); + } else if (e.clientX > maxLeft - buttonWidth && e.clientX < maxLeft) { + maskLayer.hide(); + popupView.hide(); + } + } + } + }); + // 显示弹窗 + maskLayer.show(); + popupView.show(); + // 改变进度条 + callback({ + change: function (res) { + let progressElement = []; + if (res.progressValue) { + progressValue = res.progressValue; + // 绘制进度条 + progressElement.push({ + tag: "rect", //绘制进度条背景 + id: "progressValueBg", + rectStyles: { + radius: "4px", + color: $mainColor, + }, + position: { + top: popupViewData.viewContentPadding * 4 + 60 + "px", + left: popupViewData.viewContentPadding + "px", + width: + popupViewData.viewContentWidth * (res.progressValue / 100) + "px", + height: "8px", + }, + }); + } + if (res.progressTip) { + progressTip = res.progressTip; + progressElement.push({ + tag: "font", + id: "progressValue", + text: res.progressTip, + textStyles: { + size: "14px", + color: $mainColor, + whiteSpace: "normal", + }, + position: { + top: popupViewData.viewContentPadding * 4 + 20 + "px", + height: "30px", + }, + }); + } + if (res.contentText) { + contentText = res.contentText; + progressElement.push({ + tag: "font", + id: "content", + text: res.contentText, + textStyles: { + size: "16px", + color: "#333", + whiteSpace: "normal", + }, + position: { + top: popupViewData.viewContentPadding * 2 + 30 + "px", + height: "30px", + }, + }); + } + if (res.buttonNum >= 0 && buttonNum != res.buttonNum) { + buttonNum = res.buttonNum; + popupView.reset(); + popupViewData = downloadPopupDrawing( + Object.assign( + { + progressValue: progressValue, + progressTip: progressTip, + contentText: contentText, + }, + res + ) + ); + let newElement = []; + popupViewData.elementList.map((item, index) => { + let have = false; + progressElement.forEach((childItem, childIndex) => { + if (item.id == childItem.id) { + have = true; + } + }); + if (!have) { + newElement.push(item); + } + }); + progressElement = newElement.concat(progressElement); + popupView.setStyle({ + tag: "rect", + top: + (popupViewData.screenHeight - popupViewData.popupViewHeight) / 2 + + "px", + left: "15%", + height: popupViewData.popupViewHeight + "px", + width: "70%", + }); + popupView.draw(progressElement); + } else { + popupView.draw(progressElement); + } + }, + cancel: function () { + maskLayer.hide(); + popupView.hide(); + }, + }); +} +export default function (isPrompt = false) { + getCurrentNo((version) => { + getServerNo((res) => { + if (res.versionCode.replace(/\./g, "") <= version.versionCode) { + return false; + } + + if (res.forceUpdate) { + if (/\.wgt$/i.test(res.downloadUrl)) { + getDownload(res); + } else if (/\.html$/i.test(res.downloadUrl)) { + plus.runtime.openURL(res.downloadUrl); + } else { + if (platform == "android") { + getDownload(res); + } else { + updatePopup(res, function () { + plus.runtime.openURL(res.downloadUrl); + }); + // uni.showLoading({ + // title: "升级中......", + // mask: true + // }); + // plus.runtime.openURL(res.downloadUrl); + // plus.runtime.restart(); + } + } + } else { + updatePopup(res, function () { + if (/\.wgt$/i.test(res.downloadUrl)) { + getDownload(res); + } else if (/\.html$/i.test(res.downloadUrl)) { + plus.runtime.openURL(res.downloadUrl); + } else { + getDownload(res); + // if (platform == "android") { + // getDownload(res); + // } else { + // plus.runtime.openURL(res.downloadUrl); + // } + } + }); + } + }); + }); +} +// #endif diff --git a/pushGithub.sh b/pushGithub.sh new file mode 100644 index 00000000..79f5a6c3 --- /dev/null +++ b/pushGithub.sh @@ -0,0 +1,18 @@ +echo '开始推送github' +echo '切换git地址' +git remote rm origin + +git remote add origin git@github.com:hongyehuicheng/lilishop-uniapp.git +echo '设置上传代码分支,推送github' +git push --set-upstream origin master --force +echo '推送github完成' +git remote rm origin + +git remote add origin git@gitee.com:beijing_hongye_huicheng/lilishop-uniapp.git + +git pull origin master + +echo '切回gitee资源' +git branch --set-upstream-to=origin/master master +echo '设置git跟踪资源' + diff --git a/static/appleidButton@2x.png b/static/appleidButton@2x.png new file mode 100644 index 00000000..8e0c1a4f Binary files /dev/null and b/static/appleidButton@2x.png differ diff --git a/static/emptyCart.png b/static/emptyCart.png new file mode 100644 index 00000000..45e392ba Binary files /dev/null and b/static/emptyCart.png differ diff --git a/static/exchange.png b/static/exchange.png new file mode 100644 index 00000000..bcb1f2e0 Binary files /dev/null and b/static/exchange.png differ diff --git a/static/images/bg-qrcode.png b/static/images/bg-qrcode.png new file mode 100755 index 00000000..44e83b52 Binary files /dev/null and b/static/images/bg-qrcode.png differ diff --git a/static/images/bg-qrcode2.png b/static/images/bg-qrcode2.png new file mode 100755 index 00000000..416f3df6 Binary files /dev/null and b/static/images/bg-qrcode2.png differ diff --git a/static/images/bg.png b/static/images/bg.png new file mode 100755 index 00000000..a9e02ef7 Binary files /dev/null and b/static/images/bg.png differ diff --git a/static/images/btn-play.png b/static/images/btn-play.png new file mode 100755 index 00000000..49354ea0 Binary files /dev/null and b/static/images/btn-play.png differ diff --git a/static/images/cd-play-1.gif b/static/images/cd-play-1.gif new file mode 100755 index 00000000..77e2362e Binary files /dev/null and b/static/images/cd-play-1.gif differ diff --git a/static/images/cd-play-2.gif b/static/images/cd-play-2.gif new file mode 100755 index 00000000..02d37fb5 Binary files /dev/null and b/static/images/cd-play-2.gif differ diff --git a/static/images/cd-play-3.gif b/static/images/cd-play-3.gif new file mode 100755 index 00000000..1543c248 Binary files /dev/null and b/static/images/cd-play-3.gif differ diff --git a/static/images/cd-play-4.gif b/static/images/cd-play-4.gif new file mode 100755 index 00000000..48ccd903 Binary files /dev/null and b/static/images/cd-play-4.gif differ diff --git a/static/images/cd-play-5.gif b/static/images/cd-play-5.gif new file mode 100755 index 00000000..48ccd903 Binary files /dev/null and b/static/images/cd-play-5.gif differ diff --git a/static/images/defaultBgImg.png b/static/images/defaultBgImg.png new file mode 100755 index 00000000..587a4628 Binary files /dev/null and b/static/images/defaultBgImg.png differ diff --git a/static/images/douyin.png b/static/images/douyin.png new file mode 100755 index 00000000..5662b819 Binary files /dev/null and b/static/images/douyin.png differ diff --git a/static/images/icon-back.png b/static/images/icon-back.png new file mode 100755 index 00000000..57eafff2 Binary files /dev/null and b/static/images/icon-back.png differ diff --git a/static/images/icon-back2.png b/static/images/icon-back2.png new file mode 100755 index 00000000..b922b4f4 Binary files /dev/null and b/static/images/icon-back2.png differ diff --git a/static/images/icon-cd.png b/static/images/icon-cd.png new file mode 100755 index 00000000..561c798e Binary files /dev/null and b/static/images/icon-cd.png differ diff --git a/static/images/icon-close-black.png b/static/images/icon-close-black.png new file mode 100755 index 00000000..1bf72620 Binary files /dev/null and b/static/images/icon-close-black.png differ diff --git a/static/images/icon-close.png b/static/images/icon-close.png new file mode 100755 index 00000000..576baf17 Binary files /dev/null and b/static/images/icon-close.png differ diff --git a/static/images/icon-comment-like.png b/static/images/icon-comment-like.png new file mode 100755 index 00000000..4b098adc Binary files /dev/null and b/static/images/icon-comment-like.png differ diff --git a/static/images/icon-comment-unlike.png b/static/images/icon-comment-unlike.png new file mode 100755 index 00000000..4996eae8 Binary files /dev/null and b/static/images/icon-comment-unlike.png differ diff --git a/static/images/icon-comment.png b/static/images/icon-comment.png new file mode 100755 index 00000000..082bb1e8 Binary files /dev/null and b/static/images/icon-comment.png differ diff --git a/static/images/icon-comments.png b/static/images/icon-comments.png new file mode 100755 index 00000000..b22e63e2 Binary files /dev/null and b/static/images/icon-comments.png differ diff --git a/static/images/icon-copy.png b/static/images/icon-copy.png new file mode 100755 index 00000000..36c0b94b Binary files /dev/null and b/static/images/icon-copy.png differ diff --git a/static/images/icon-datepicker.png b/static/images/icon-datepicker.png new file mode 100755 index 00000000..423d3877 Binary files /dev/null and b/static/images/icon-datepicker.png differ diff --git a/static/images/icon-delete.png b/static/images/icon-delete.png new file mode 100755 index 00000000..8c1768ab Binary files /dev/null and b/static/images/icon-delete.png differ diff --git a/static/images/icon-download.png b/static/images/icon-download.png new file mode 100755 index 00000000..1513f2f3 Binary files /dev/null and b/static/images/icon-download.png differ diff --git a/static/images/icon-fire.png b/static/images/icon-fire.png new file mode 100755 index 00000000..fce85a69 Binary files /dev/null and b/static/images/icon-fire.png differ diff --git a/static/images/icon-follow.png b/static/images/icon-follow.png new file mode 100755 index 00000000..78bc7f60 Binary files /dev/null and b/static/images/icon-follow.png differ diff --git a/static/images/icon-like.png b/static/images/icon-like.png new file mode 100755 index 00000000..06c03c0c Binary files /dev/null and b/static/images/icon-like.png differ diff --git a/static/images/icon-private.png b/static/images/icon-private.png new file mode 100755 index 00000000..a1f82e22 Binary files /dev/null and b/static/images/icon-private.png differ diff --git a/static/images/icon-qrcode.png b/static/images/icon-qrcode.png new file mode 100755 index 00000000..c24034bf Binary files /dev/null and b/static/images/icon-qrcode.png differ diff --git a/static/images/icon-right-arrow.png b/static/images/icon-right-arrow.png new file mode 100755 index 00000000..55e97c1a Binary files /dev/null and b/static/images/icon-right-arrow.png differ diff --git a/static/images/icon-right-arrow2.png b/static/images/icon-right-arrow2.png new file mode 100755 index 00000000..b4eb124a Binary files /dev/null and b/static/images/icon-right-arrow2.png differ diff --git a/static/images/icon-right-arrow3.png b/static/images/icon-right-arrow3.png new file mode 100755 index 00000000..797dbe0b Binary files /dev/null and b/static/images/icon-right-arrow3.png differ diff --git a/static/images/icon-right.png b/static/images/icon-right.png new file mode 100755 index 00000000..557a5684 Binary files /dev/null and b/static/images/icon-right.png differ diff --git a/static/images/icon-scan-qrcode.png b/static/images/icon-scan-qrcode.png new file mode 100755 index 00000000..a8a0236a Binary files /dev/null and b/static/images/icon-scan-qrcode.png differ diff --git a/static/images/icon-search.png b/static/images/icon-search.png new file mode 100755 index 00000000..79a186b9 Binary files /dev/null and b/static/images/icon-search.png differ diff --git a/static/images/icon-settings.png b/static/images/icon-settings.png new file mode 100755 index 00000000..654e7874 Binary files /dev/null and b/static/images/icon-settings.png differ diff --git a/static/images/icon-sex-boy.png b/static/images/icon-sex-boy.png new file mode 100755 index 00000000..dbf405f3 Binary files /dev/null and b/static/images/icon-sex-boy.png differ diff --git a/static/images/icon-sex-girl.png b/static/images/icon-sex-girl.png new file mode 100755 index 00000000..1733aa72 Binary files /dev/null and b/static/images/icon-sex-girl.png differ diff --git a/static/images/icon-sex-secret.png b/static/images/icon-sex-secret.png new file mode 100755 index 00000000..fdd711fc Binary files /dev/null and b/static/images/icon-sex-secret.png differ diff --git a/static/images/icon-share.png b/static/images/icon-share.png new file mode 100755 index 00000000..22c5d25a Binary files /dev/null and b/static/images/icon-share.png differ diff --git a/static/images/icon-time.png b/static/images/icon-time.png new file mode 100755 index 00000000..93a60065 Binary files /dev/null and b/static/images/icon-time.png differ diff --git a/static/images/icon-unlike.png b/static/images/icon-unlike.png new file mode 100755 index 00000000..2901fee6 Binary files /dev/null and b/static/images/icon-unlike.png differ diff --git a/static/images/loading-1.gif b/static/images/loading-1.gif new file mode 100755 index 00000000..6ef87303 Binary files /dev/null and b/static/images/loading-1.gif differ diff --git a/static/images/loading-2.gif b/static/images/loading-2.gif new file mode 100755 index 00000000..d7a89018 Binary files /dev/null and b/static/images/loading-2.gif differ diff --git a/static/images/loading-3.gif b/static/images/loading-3.gif new file mode 100755 index 00000000..bdee7918 Binary files /dev/null and b/static/images/loading-3.gif differ diff --git a/static/images/loading-4.gif b/static/images/loading-4.gif new file mode 100755 index 00000000..3d816380 Binary files /dev/null and b/static/images/loading-4.gif differ diff --git a/static/images/loading.gif b/static/images/loading.gif new file mode 100755 index 00000000..8c8da0ff Binary files /dev/null and b/static/images/loading.gif differ diff --git a/static/images/music.jpeg b/static/images/music.jpeg new file mode 100755 index 00000000..0ff788f5 Binary files /dev/null and b/static/images/music.jpeg differ diff --git a/static/images/publish.png b/static/images/publish.png new file mode 100755 index 00000000..c99e31dd Binary files /dev/null and b/static/images/publish.png differ diff --git a/static/images/static-cd.png b/static/images/static-cd.png new file mode 100755 index 00000000..561c798e Binary files /dev/null and b/static/images/static-cd.png differ diff --git a/static/img/douyin.png b/static/img/douyin.png new file mode 100755 index 00000000..5662b819 Binary files /dev/null and b/static/img/douyin.png differ diff --git a/static/img/main-bg.png b/static/img/main-bg.png new file mode 100644 index 00000000..6496ae44 Binary files /dev/null and b/static/img/main-bg.png differ diff --git a/static/img/overdue.png b/static/img/overdue.png new file mode 100644 index 00000000..cfa55a56 Binary files /dev/null and b/static/img/overdue.png differ diff --git a/static/img/sort0.png b/static/img/sort0.png new file mode 100644 index 00000000..8c27dbbf Binary files /dev/null and b/static/img/sort0.png differ diff --git a/static/img/sort1.png b/static/img/sort1.png new file mode 100644 index 00000000..cbe49bf9 Binary files /dev/null and b/static/img/sort1.png differ diff --git a/static/img/sort2.png b/static/img/sort2.png new file mode 100644 index 00000000..0629e870 Binary files /dev/null and b/static/img/sort2.png differ diff --git a/static/img/used.png b/static/img/used.png new file mode 100644 index 00000000..de3354cc Binary files /dev/null and b/static/img/used.png differ diff --git a/static/index/arrow-down-1.png b/static/index/arrow-down-1.png new file mode 100644 index 00000000..c8211088 Binary files /dev/null and b/static/index/arrow-down-1.png differ diff --git a/static/index/arrow-down.png b/static/index/arrow-down.png new file mode 100644 index 00000000..2eb82d84 Binary files /dev/null and b/static/index/arrow-down.png differ diff --git a/static/index/arrow-up-1.png b/static/index/arrow-up-1.png new file mode 100644 index 00000000..12d1f640 Binary files /dev/null and b/static/index/arrow-up-1.png differ diff --git a/static/index/arrow-up.png b/static/index/arrow-up.png new file mode 100644 index 00000000..6a3ebd57 Binary files /dev/null and b/static/index/arrow-up.png differ diff --git a/static/logo.png b/static/logo.png new file mode 100755 index 00000000..c1780186 Binary files /dev/null and b/static/logo.png differ diff --git a/static/mine/Feedback.png b/static/mine/Feedback.png new file mode 100644 index 00000000..007d9c4c Binary files /dev/null and b/static/mine/Feedback.png differ diff --git a/static/mine/couponcenter.png b/static/mine/couponcenter.png new file mode 100644 index 00000000..72c416ac Binary files /dev/null and b/static/mine/couponcenter.png differ diff --git a/static/mine/distribution.png b/static/mine/distribution.png new file mode 100644 index 00000000..d5c4de96 Binary files /dev/null and b/static/mine/distribution.png differ diff --git a/static/mine/im.png b/static/mine/im.png new file mode 100644 index 00000000..009d3e27 Binary files /dev/null and b/static/mine/im.png differ diff --git a/static/mine/kanjia.png b/static/mine/kanjia.png new file mode 100644 index 00000000..9e4531e2 Binary files /dev/null and b/static/mine/kanjia.png differ diff --git a/static/mine/logistics.png b/static/mine/logistics.png new file mode 100644 index 00000000..4ae5b456 Binary files /dev/null and b/static/mine/logistics.png differ diff --git a/static/mine/myaddress.png b/static/mine/myaddress.png new file mode 100644 index 00000000..a98bcff3 Binary files /dev/null and b/static/mine/myaddress.png differ diff --git a/static/mine/mycommit.png b/static/mine/mycommit.png new file mode 100644 index 00000000..d44d5d53 Binary files /dev/null and b/static/mine/mycommit.png differ diff --git a/static/mine/mycoupon.png b/static/mine/mycoupon.png new file mode 100644 index 00000000..9b4113a6 Binary files /dev/null and b/static/mine/mycoupon.png differ diff --git a/static/mine/myfavorite.png b/static/mine/myfavorite.png new file mode 100644 index 00000000..ff652489 Binary files /dev/null and b/static/mine/myfavorite.png differ diff --git a/static/mine/myhistory.png b/static/mine/myhistory.png new file mode 100644 index 00000000..610356ce Binary files /dev/null and b/static/mine/myhistory.png differ diff --git a/static/mine/mypoint.png b/static/mine/mypoint.png new file mode 100644 index 00000000..0dca8543 Binary files /dev/null and b/static/mine/mypoint.png differ diff --git a/static/mine/pointgift.png b/static/mine/pointgift.png new file mode 100644 index 00000000..6904db49 Binary files /dev/null and b/static/mine/pointgift.png differ diff --git a/static/mine/setting.png b/static/mine/setting.png new file mode 100644 index 00000000..bfd49789 Binary files /dev/null and b/static/mine/setting.png differ diff --git a/static/mine/shensu.png b/static/mine/shensu.png new file mode 100644 index 00000000..4eb18f77 Binary files /dev/null and b/static/mine/shensu.png differ diff --git a/static/mine/sign.png b/static/mine/sign.png new file mode 100644 index 00000000..8b50b33e Binary files /dev/null and b/static/mine/sign.png differ diff --git a/static/missing-face.png b/static/missing-face.png new file mode 100644 index 00000000..df1f5092 Binary files /dev/null and b/static/missing-face.png differ diff --git a/static/nodata.png b/static/nodata.png new file mode 100644 index 00000000..58ab5b48 Binary files /dev/null and b/static/nodata.png differ diff --git a/static/order/t1.png b/static/order/t1.png new file mode 100644 index 00000000..7a7c413c Binary files /dev/null and b/static/order/t1.png differ diff --git a/static/order/t3.png b/static/order/t3.png new file mode 100644 index 00000000..e35247aa Binary files /dev/null and b/static/order/t3.png differ diff --git a/static/point-bg.png b/static/point-bg.png new file mode 100644 index 00000000..bc8522ed Binary files /dev/null and b/static/point-bg.png differ diff --git a/static/pointTrade/point_bg_1.png b/static/pointTrade/point_bg_1.png new file mode 100644 index 00000000..0781889e Binary files /dev/null and b/static/pointTrade/point_bg_1.png differ diff --git a/static/pointTrade/tradehall.png b/static/pointTrade/tradehall.png new file mode 100644 index 00000000..73b7b562 Binary files /dev/null and b/static/pointTrade/tradehall.png differ diff --git a/static/seckill/active.png b/static/seckill/active.png new file mode 100644 index 00000000..f5293e08 Binary files /dev/null and b/static/seckill/active.png differ diff --git a/static/star.png b/static/star.png new file mode 100644 index 00000000..1323461b Binary files /dev/null and b/static/star.png differ diff --git a/static/tabbar/cart-s.png b/static/tabbar/cart-s.png new file mode 100644 index 00000000..70052fd9 Binary files /dev/null and b/static/tabbar/cart-s.png differ diff --git a/static/tabbar/cart.png b/static/tabbar/cart.png new file mode 100644 index 00000000..df374d6c Binary files /dev/null and b/static/tabbar/cart.png differ diff --git a/static/tabbar/category-s.png b/static/tabbar/category-s.png new file mode 100644 index 00000000..2718e4f3 Binary files /dev/null and b/static/tabbar/category-s.png differ diff --git a/static/tabbar/category.png b/static/tabbar/category.png new file mode 100644 index 00000000..77e73a7e Binary files /dev/null and b/static/tabbar/category.png differ diff --git a/static/tabbar/home-s.png b/static/tabbar/home-s.png new file mode 100644 index 00000000..2dc53227 Binary files /dev/null and b/static/tabbar/home-s.png differ diff --git a/static/tabbar/home.png b/static/tabbar/home.png new file mode 100644 index 00000000..c33705c5 Binary files /dev/null and b/static/tabbar/home.png differ diff --git a/static/tabbar/mine-s.png b/static/tabbar/mine-s.png new file mode 100644 index 00000000..10df9125 Binary files /dev/null and b/static/tabbar/mine-s.png differ diff --git a/static/tabbar/mine.png b/static/tabbar/mine.png new file mode 100644 index 00000000..0d5ca017 Binary files /dev/null and b/static/tabbar/mine.png differ diff --git a/static/tabbar/point-mall-s.png b/static/tabbar/point-mall-s.png new file mode 100644 index 00000000..774e5b64 Binary files /dev/null and b/static/tabbar/point-mall-s.png differ diff --git a/static/tabbar/point-mall.png b/static/tabbar/point-mall.png new file mode 100644 index 00000000..f8dc47cf Binary files /dev/null and b/static/tabbar/point-mall.png differ diff --git a/static/title.png b/static/title.png new file mode 100644 index 00000000..601d4460 Binary files /dev/null and b/static/title.png differ diff --git a/store/index.js b/store/index.js new file mode 100644 index 00000000..c6e5d4b3 --- /dev/null +++ b/store/index.js @@ -0,0 +1,31 @@ +import Vue from "vue"; +import Vuex from "vuex"; +import storage from "@/utils/storage"; + +Vue.use(Vuex); + +const store = new Vuex.Store({ + state: { + verificationKey: "", //获取key表示验证通过 + distributionId:"", //分销员Id 如果当前账户从未登录过时记录 + hasLogin: storage.getHasLogin(), + userInfo: storage.getUserInfo(), + uuid: storage.getUuid(), + token: "", + }, + mutations: { + login(state, userInfo) { + state.userInfo = userInfo || {}; + state.userName = + userInfo.Name || userInfo.Nickname || userInfo.Username || "匿名用户"; + state.hasLogin = true; + }, + logout(state) { + state.userName = ""; + state.hasLogin = false; + }, + }, + actions: {}, +}); + +export default store; diff --git a/uni.scss b/uni.scss new file mode 100644 index 00000000..7fe2f118 --- /dev/null +++ b/uni.scss @@ -0,0 +1,171 @@ +/* 页面左右间距 */ +$page-color-base: #f8f8f8; +@import "uview-ui/theme.scss"; + +/* 文字尺寸 */ +$font-sm: 24rpx; +$font-base: 28rpx; +$font-lg: 32rpx; +$font-sl: 36rpx; +/*文字颜色*/ +$font-color-dark: #303133; +$font-color-white: #ffffff; +$font-color-base: #606266; +$font-color-light: #909399; +$font-color-disabled: #c0c4cc; +/* 边框颜色 */ +$border-color-dark: #dcdfe6; +$border-color-base: #e4e7ed; +$border-color-light: #ebeef5; +/* 图片加载中颜色 */ +$image-bg-color: #eee; +/* 行为相关颜色 */ +$uni-color-primary: #fa436a; +$uni-color-success: #4cd964; +$uni-color-warning: #f0ad4e; +$uni-color-error: #dd524d; + +/*主题颜色 具体参考 https://ant.design/docs/spec/colors-cn */ +/**微信登录按钮颜色 */ +$weChat-color:#00a327; +/**主颜色*/ +$main-color: #ff3c2a; +/*用于金钱等颜色 */ +$price-color: #ff3c2a; +/*主题高亮颜色*/ +$light-color: #ff6b35; +/*辅助高亮颜色*/ +$aider-light-color: #ff9f28; + +/*主题高亮背景颜色*/ +$main-light-color: #edfcf7; +/*价格红高亮背景颜色*/ +$price-light-color: #fcedeb; + +/*辅助色*/ +$aider-color-red: #ff6262; +$aider-color-yellow: #ffc71c; +$aider-color-green: #28d094; +$aider-color-blue: #1e9ff2; +// 中性色 +$neutral-color: #333333; +//背景色 +$bg-color: #f9f9f9; + +// 字体 +$font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, "Noto Sans", sans-serif, + "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji"; +$font-weight-b: 500; +$font-weight: 400; +.light-color { + color: $light-color; +} +.main-color { + color: $main-color !important; +} +.bg-light-color { + background-color: $light-color !important; + /deep/ * { + background-color: $light-color !important; + } +} +.bg-main-color { + background-color: $main-color !important; +} + +// 渐变主题颜色 +.bg-linear-gradient { + background-image: linear-gradient(25deg, #fa123b, #ff6b35, #ff9f28, #ffcc03); +} +.uni-tabbar .uni-tabbar__icon { + width: 20px; + height: 18px; +} + +.flex { + display: flex; +} + +.btn { + background-color: $light-color; + color: #ffffff; + border-width: 0px; + border: none; + border-radius: 44px; + height: 44px; + box-shadow: none; + font-weight: 400; + font-style: normal; + line-height: 44px; + text-align: center; + &::after { + border: none; + } +} +.button-hover { + opacity: 0.7; +} + +.margin { + margin: 10px; +} + +.tag { + background-color: rgba(242, 242, 242, 1); + color: #333333; + height: 28px; + border-radius: 28px; + box-shadow: none; + font-family: "PingFangSC-Regular", "PingFang SC", sans-serif; + font-weight: 400; + font-style: normal; + line-height: 28px; + text-align: center; + width: 90px; +} + +.c-content { + background-color: #ffffff; + // margin-top: 30rpx; + border-top: 1px solid $border-color-light; + border-bottom: 1px solid $border-color-light; +} +.mt-30 { + margin-top: 30rpx; +} +.border-top { + border-top: 1px solid $border-color-light; +} +.describe { + color: $font-color-light; + font-size: $font-sm; + padding: 30rpx; +} +.flex-center { + display: flex; + align-items: center; + justify-content: center; + flex-direction: column; +} +.flex-a-c{ + align-items: center; +} +.relative { + position: relative; +} + +.wes { + /* 多出部分用省略号表示 , 用于一行 */ + overflow: hidden; + word-wrap: normal; + white-space: nowrap; + text-overflow: ellipsis; +} + +.wes-2 { + /* 适用于webkit内核和移动端 */ + display: -webkit-box; + -webkit-box-orient: vertical; + -webkit-line-clamp: 2; + overflow: hidden; +} diff --git a/utils/Foundation.js b/utils/Foundation.js new file mode 100644 index 00000000..51c33184 --- /dev/null +++ b/utils/Foundation.js @@ -0,0 +1,259 @@ +/** + * 一些常用的基础方法 + * whetherNavigate 登录后跳转判断 + * unixToDate 将unix时间戳转换为指定格式 + * dateToUnix 将时间转unix时间戳 + * deepClone 对一个对象进行深拷贝 + * formatPrice 货币格式化 + * secrecyMobile 手机号隐私保护 + * randomString 随机生成指定长度的字符串 + */ + +/** + * 验证银行卡号 + */ +export function checkBankno(bankno) { + var lastNum = bankno.substr(bankno.length - 1, 1); //取出最后一位(与luhm进行比较) + var first15Num = bankno.substr(0, bankno.length - 1); //前15或18位 + var newArr = []; + + for (var i = first15Num.length - 1; i > -1; i--) { + //前15或18位倒序存进数组 + newArr.push(first15Num.substr(i, 1)); + } + + var arrJiShu = []; //奇数位*2的积 <9 + var arrJiShu2 = []; //奇数位*2的积 >9 + var arrOuShu = []; //偶数位数组 + for (var j = 0; j < newArr.length; j++) { + if ((j + 1) % 2 == 1) { + //奇数位 + if (parseInt(newArr[j]) * 2 < 9) arrJiShu.push(parseInt(newArr[j]) * 2); + else arrJiShu2.push(parseInt(newArr[j]) * 2); + } //偶数位 + else arrOuShu.push(newArr[j]); + } + + var jishu_child1 = []; //奇数位*2 >9 的分割之后的数组个位数 + var jishu_child2 = []; //奇数位*2 >9 的分割之后的数组十位数 + for (var h = 0; h < arrJiShu2.length; h++) { + jishu_child1.push(parseInt(arrJiShu2[h]) % 10); + jishu_child2.push(parseInt(arrJiShu2[h]) / 10); + } + + var sumJiShu = 0; //奇数位*2 < 9 的数组之和 + var sumOuShu = 0; //偶数位数组之和 + var sumJiShuChild1 = 0; //奇数位*2 >9 的分割之后的数组个位数之和 + var sumJiShuChild2 = 0; //奇数位*2 >9 的分割之后的数组十位数之和 + var sumTotal = 0; + for (var m = 0; m < arrJiShu.length; m++) { + sumJiShu = sumJiShu + parseInt(arrJiShu[m]); + } + for (var n = 0; n < arrOuShu.length; n++) { + sumOuShu = sumOuShu + parseInt(arrOuShu[n]); + } + for (var p = 0; p < jishu_child1.length; p++) { + sumJiShuChild1 = sumJiShuChild1 + parseInt(jishu_child1[p]); + sumJiShuChild2 = sumJiShuChild2 + parseInt(jishu_child2[p]); + } + //计算总和 + sumTotal = + parseInt(sumJiShu) + + parseInt(sumOuShu) + + parseInt(sumJiShuChild1) + + parseInt(sumJiShuChild2); + //计算Luhm值 + var k = parseInt(sumTotal) % 10 == 0 ? 10 : parseInt(sumTotal) % 10; + var luhm = 10 - k; + if (lastNum == luhm) { + return true; + } else { + return false; + } +} + +/** + * 登录后跳转判断 + * 计算出当前router路径 + * 1.如果跳转的链接为登录页面或跳转的链接为空页面。则会重新跳转到首页 + * 2.都不满足返回跳转页面 + * @param type 'default' || 'wx' //返回地址会做判断默认为default + */ + +export function whetherNavigate(type = "default") { + let navigation = getCurrentPages()[getCurrentPages().length - (getCurrentPages().length ) ]; + if (getCurrentPages().length > 1) { + console.log(navigation, getCurrentPages()); + if (navigation.route == "pages/passport/login") { + navigationToBack(type); + } else { + if (!navigation.route || navigation.route == "undefined") { + navigationToBack(type); + } else { + uni.navigateBack({ + delta: getCurrentPages().length, + }); + } + } + } else { + uni.switchTab({ + url: "/pages/tabbar/home/index", + }); + } +} + +/** + * 将unix时间戳转换为指定格式 + * @param unix 时间戳【秒】 + * @param format 转换格式 + * @returns {*|string} + */ +export function unixToDate(unix, format) { + if (!unix) return unix; + let _format = format || "yyyy-MM-dd hh:mm:ss"; + const d = new Date(unix); + const o = { + "M+": d.getMonth() + 1, + "d+": d.getDate(), + "h+": d.getHours(), + "m+": d.getMinutes(), + "s+": d.getSeconds(), + "q+": Math.floor((d.getMonth() + 3) / 3), + S: d.getMilliseconds(), + }; + if (/(y+)/.test(_format)) + _format = _format.replace( + RegExp.$1, + (d.getFullYear() + "").substr(4 - RegExp.$1.length) + ); + for (const k in o) + if (new RegExp("(" + k + ")").test(_format)) + _format = _format.replace( + RegExp.$1, + RegExp.$1.length === 1 ? o[k] : ("00" + o[k]).substr(("" + o[k]).length) + ); + return _format; +} + +/** + * 将时间转unix时间戳 + * @param date + * @returns {number} 【秒】 + */ +export function dateToUnix(date) { + let newStr = date.replace(/:/g, "-"); + newStr = newStr.replace(/ /g, "-"); + const arr = newStr.split("-"); + const datum = new Date( + Date.UTC( + arr[0], + arr[1] - 1, + arr[2], + arr[3] - 8 || -8, + arr[4] || 0, + arr[5] || 0 + ) + ); + return parseInt(datum.getTime() / 1000); +} + +/** + * 货币格式化 + * @param price + * @returns {string} + */ +export function formatPrice(price) { + if (typeof price !== "number") return price; + return String(Number(price).toFixed(2)).replace(/\B(?=(\d{3})+(?!\d))/g, ","); +} + +/** + * 手机号隐私保护 + * 隐藏中间四位数字 + * @param mobile + * @returns {*} + */ +export function secrecyMobile(mobile) { + mobile = String(mobile); + if (!/\d{11}/.test(mobile)) { + return mobile; + } + return mobile.replace(/(\d{3})(\d{4})(\d{4})/, "$1****$3"); +} + +/** + * 随机生成指定长度的字符串 + * @param length + * @returns {string} + */ +export function randomString(length = 32) { + const chars = + "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789"; + const maxPos = chars.length; + let _string = ""; + for (let i = 0; i < length; i++) { + _string += chars.charAt(Math.floor(Math.random() * maxPos)); + } + return _string; +} + +/** + * 计算传秒数的倒计时【天、时、分、秒】 + * @param seconds + * @returns {{day : *, hours : *, minutes : *, seconds : *}} + */ + +export function countTimeDown(seconds) { + const leftTime = (time) => { + if (time < 10) time = "0" + time; + return time + ""; + }; + return { + day: leftTime(parseInt(seconds / 60 / 60 / 24, 10)), + hours: leftTime(parseInt((seconds / 60 / 60) % 24, 10)), + minutes: leftTime(parseInt((seconds / 60) % 60, 10)), + seconds: leftTime(parseInt(seconds % 60, 10)), + }; +} + +function navigationToBack(type) { + if (type == "wx") { + // console.log(getCurrentPages().length - 3) + uni.navigateBack({ + delta: getCurrentPages().length, + }); + } else { + uni.switchTab({ + url: "/pages/tabbar/home/index", + }); + } +} + +/** + * 计算当前时间到第二天0点的倒计时[秒] + * @returns {number} + */ +export function theNextDayTime() { + const nowDate = new Date(); + const time = + new Date( + nowDate.getFullYear(), + nowDate.getMonth(), + nowDate.getDate() + 1, + 0, + 0, + 0 + ).getTime() - nowDate.getTime(); + return parseInt(time / 1000); +} +module.exports = { + unixToDate, + dateToUnix, + formatPrice, + secrecyMobile, + randomString, + countTimeDown, + theNextDayTime, + whetherNavigate, + checkBankno, +}; diff --git a/utils/RegExp.js b/utils/RegExp.js new file mode 100644 index 00000000..3afaced2 --- /dev/null +++ b/utils/RegExp.js @@ -0,0 +1,47 @@ +/** + * 各种正则表达式 + * mobile 手机号 + * email 电子邮箱 + * password 密码【6-20位】 + * integer 正整数【不包含0】 + * money 金钱 + * TINumber 纳税识别号 + * IDCard 身份证 + * userName 账户名称【汉字、字母、数字、“-”、“_”的组合】 + * URL URL + * TEL 固定电话 + */ + +// 手机号 +export const mobile = /^0?(13[0-9]|14[0-9]|15[0-9]|16[0-9]|17[0-9]|18[0-9]|19[0-9])[0-9]{8}$/ + +// 电子邮箱 +export const email = /^\w+([-+.]\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*$/ + +// 密码【6-20位】 +export const password = /^[@A-Za-z0-9!#$%^&*.~,]{6,20}$/ + +// 正整数【不包含0】 +export const integer = /^[1-9]\d*$/ + +// 正整数【包含0】 +export const Integer = /^[0-9]\d*$/ + +// 金钱 +export const money = /(^[1-9]([0-9]+)?(\.[0-9]{1,2})?$)|(^(0){1}$)|(^[0-9]\.[0-9]([0-9])?$)/ + +// 纳税识别号 +export const TINumber = /^((\d{6}[0-9A-Z]{9})|([0-9A-Za-z]{2}\d{6}[0-9A-Za-z]{10,12}))$/ + +// 身份证 +export const IDCard = /(^\d{15}$)|(^\d{18}$)|(^\d{17}(\d|X|x)$)/ + +// 账户名称【汉字、字母、数字、“-”、“_”的组合】 +export const userName = /[A-Za-z0-9_\-\u4e00-\u9fa5]$/ + +// URL +export const URL = + /^(https?|ftp):\/\/([a-zA-Z0-9.-]+(:[a-zA-Z0-9.&%$-]+)*@)*((25[0-5]|2[0-4][0-9]|1[0-9]{2}|[1-9][0-9]?)(\.(25[0-5]|2[0-4][0-9]|1[0-9]{2}|[1-9]?[0-9])){3}|([a-zA-Z0-9-]+\.)*[a-zA-Z0-9-]+\.(com|edu|gov|int|mil|net|org|biz|arpa|info|name|pro|aero|coop|museum|[a-zA-Z]{2}))(:[0-9]+)*(\/($|[a-zA-Z0-9.,?'\\+&%$#=~_-]+))*$/ + +// 固话 +export const TEL = /0\d{2,3}-\d{7,8}/ diff --git a/utils/filters.js b/utils/filters.js new file mode 100644 index 00000000..312ae57d --- /dev/null +++ b/utils/filters.js @@ -0,0 +1,203 @@ +import Foundation from "./Foundation.js"; +import storage from "@/utils/storage.js"; +/** + * 金钱单位置换 2999 --> 2,999.00 + * @param val + * @param unit + * @param location + * @returns {*} + */ +export function unitPrice(val, unit, location) { + if (!val) val = 0; + let price = Foundation.formatPrice(val); + if (location === "before") { + return price.substr(0, price.length - 3); + } + if (location === "after") { + return price.substr(-2); + } + return (unit || "") + price; +} + +/** + * 脱敏姓名 + */ + +export function noPassByName(str) { + if (null != str && str != undefined) { + if (str.length <= 3) { + return "*" + str.substring(1, str.length); + } else if (str.length > 3 && str.length <= 6) { + return "**" + str.substring(2, str.length); + } else if (str.length > 6) { + return str.substring(0, 2) + "****" + str.substring(6, str.length); + } + } else { + return ""; + } +} + +/** + * 处理unix时间戳,转换为可阅读时间格式 + * @param unix + * @param format + * @returns {*|string} + */ +export function unixToDate(unix, format) { + let _format = format || "yyyy-MM-dd hh:mm:ss"; + const d = new Date(unix * 1000); + const o = { + "M+": d.getMonth() + 1, + "d+": d.getDate(), + "h+": d.getHours(), + "m+": d.getMinutes(), + "s+": d.getSeconds(), + "q+": Math.floor((d.getMonth() + 3) / 3), + S: d.getMilliseconds(), + }; + if (/(y+)/.test(_format)) + _format = _format.replace( + RegExp.$1, + (d.getFullYear() + "").substr(4 - RegExp.$1.length) + ); + for (const k in o) + if (new RegExp("(" + k + ")").test(_format)) + _format = _format.replace( + RegExp.$1, + RegExp.$1.length === 1 ? o[k] : ("00" + o[k]).substr(("" + o[k]).length) + ); + return _format; +} + +/** + * 13888888888 -> 138****8888 + * @param mobile + * @returns {*} + */ +export function secrecyMobile(mobile) { + mobile = String(mobile); + if (!/\d{11}/.test(mobile)) { + return mobile; + } + return mobile.replace(/(\d{3})(\d{4})(\d{4})/, "$1****$3"); +} + +/** + * 清除逗号 + * + */ +export function clearStrComma(str) { + str = str.replace(/,/g, ""); //取消字符串中出现的所有逗号 + return str; +} + +/** + * 判断用户是否登录 + * @param val 如果为auth则判断是否登录 + * 如果传入 auth 则为判断是否登录 + */ +export function isLogin(val) { + let userInfo = storage.getUserInfo(); + if (val == "auth") { + return userInfo.id ? true : false; + } else { + return storage.getUserInfo(); + } +} + +/** + * 验证是否登录如果没登录则去登录 + * @param {*} val + * @returns + */ + +export function forceLogin() { + let userInfo = storage.getUserInfo(); + if (!userInfo.id) { + // #ifdef MP-WEIXIN + + uni.navigateTo({ + url: "/pages/passport/wechatMPLogin", + }); + + // #endif + + // #ifndef MP-WEIXIN + + uni.navigateTo({ + url: "/pages/passport/login", + }); + + // #endif + } +} + +/** + * 获取当前加载的页面对象 + * @param val + */ +export function getPages(val) { + const pages = getCurrentPages(); //获取加载的页面 + const currentPage = pages[pages.length - 1]; //获取当前页面的对象 + const url = currentPage.route; //当前页面url + + return val ? currentPage : url; +} + +/** + * 跳转到登录页面 + */ +export function navigateToLogin(type = "navigateTo") { + /** + * 此处进行条件编译判断 + * 微信小程序跳转到微信小程序登录页面 + * H5/App跳转到普通登录页面 + */ + // #ifdef MP-WEIXIN + uni[type]({ + url: "/pages/passport/wechatMPLogin", + }); + // #endif + // #ifndef MP-WEIXIN + uni[type]({ + url: "/pages/passport/login", + }); + // #endif +} + +/** + * 服务状态列表 + */ +export function serviceStatusList(val) { + let statusList = { + APPLY: "申请售后", + PASS: "通过售后", + REFUSE: "拒绝售后", + BUYER_RETURN: "买家退货,待卖家收货", + SELLER_RE_DELIVERY: "商家换货/补发", + SELLER_CONFIRM: "卖家确认收货", + SELLER_TERMINATION: "卖家终止售后", + BUYER_CONFIRM: "买家确认收货", + BUYER_CANCEL: "买家取消售后", + WAIT_REFUND: "等待平台退款", + COMPLETE: "完成售后", + }; + return statusList[val]; +} + +/** + * 订单状态列表 + */ +export function orderStatusList(val) { + let orderStatusList = { + UNDELIVERED: "待发货", + UNPAID: "未付款", + PAID: "已付款", + DELIVERED: "已发货", + CANCELLED: "已取消", + COMPLETED: "已完成", + COMPLETE: "已完成", + TAKE: "待核验", + }; + return orderStatusList[val]; +} diff --git a/utils/md5.js b/utils/md5.js new file mode 100644 index 00000000..87bc7fb8 --- /dev/null +++ b/utils/md5.js @@ -0,0 +1,223 @@ +/* + * A JavaScript implementation of the RSA Data Security, Inc. MD5 Message + * Digest Algorithm, as defined in RFC 1321. + * Version 1.1 Copyright (C) Paul Johnston 1999 - 2002. + * Code also contributed by Greg Holt + * See http://pajhome.org.uk/site/legal.html for details. + */ + +/* + * Add integers, wrapping at 2^32. This uses 16-bit operations internally + * to work around bugs in some JS interpreters. + */ +function safe_add(x, y) { + var lsw = (x & 0xFFFF) + (y & 0xFFFF) + var msw = (x >> 16) + (y >> 16) + (lsw >> 16) + return (msw << 16) | (lsw & 0xFFFF) +} + +/* + * Bitwise rotate a 32-bit number to the left. + */ +function rol(num, cnt) { + return (num << cnt) | (num >>> (32 - cnt)) +} + +/* + * These functions implement the four basic operations the algorithm uses. + */ +function cmn(q, a, b, x, s, t) { + return safe_add(rol(safe_add(safe_add(a, q), safe_add(x, t)), s), b) +} + +function ff(a, b, c, d, x, s, t) { + return cmn((b & c) | ((~b) & d), a, b, x, s, t) +} + +function gg(a, b, c, d, x, s, t) { + return cmn((b & d) | (c & (~d)), a, b, x, s, t) +} + +function hh(a, b, c, d, x, s, t) { + return cmn(b ^ c ^ d, a, b, x, s, t) +} + +function ii(a, b, c, d, x, s, t) { + return cmn(c ^ (b | (~d)), a, b, x, s, t) +} + +/* + * Calculate the MD5 of an array of little-endian words, producing an array + * of little-endian words. + */ +function coreMD5(x) { + var a = 1732584193 + var b = -271733879 + var c = -1732584194 + var d = 271733878 + + for (var i = 0; i < x.length; i += 16) { + var olda = a + var oldb = b + var oldc = c + var oldd = d + + a = ff(a, b, c, d, x[i + 0], 7, -680876936) + d = ff(d, a, b, c, x[i + 1], 12, -389564586) + c = ff(c, d, a, b, x[i + 2], 17, 606105819) + b = ff(b, c, d, a, x[i + 3], 22, -1044525330) + a = ff(a, b, c, d, x[i + 4], 7, -176418897) + d = ff(d, a, b, c, x[i + 5], 12, 1200080426) + c = ff(c, d, a, b, x[i + 6], 17, -1473231341) + b = ff(b, c, d, a, x[i + 7], 22, -45705983) + a = ff(a, b, c, d, x[i + 8], 7, 1770035416) + d = ff(d, a, b, c, x[i + 9], 12, -1958414417) + c = ff(c, d, a, b, x[i + 10], 17, -42063) + b = ff(b, c, d, a, x[i + 11], 22, -1990404162) + a = ff(a, b, c, d, x[i + 12], 7, 1804603682) + d = ff(d, a, b, c, x[i + 13], 12, -40341101) + c = ff(c, d, a, b, x[i + 14], 17, -1502002290) + b = ff(b, c, d, a, x[i + 15], 22, 1236535329) + + a = gg(a, b, c, d, x[i + 1], 5, -165796510) + d = gg(d, a, b, c, x[i + 6], 9, -1069501632) + c = gg(c, d, a, b, x[i + 11], 14, 643717713) + b = gg(b, c, d, a, x[i + 0], 20, -373897302) + a = gg(a, b, c, d, x[i + 5], 5, -701558691) + d = gg(d, a, b, c, x[i + 10], 9, 38016083) + c = gg(c, d, a, b, x[i + 15], 14, -660478335) + b = gg(b, c, d, a, x[i + 4], 20, -405537848) + a = gg(a, b, c, d, x[i + 9], 5, 568446438) + d = gg(d, a, b, c, x[i + 14], 9, -1019803690) + c = gg(c, d, a, b, x[i + 3], 14, -187363961) + b = gg(b, c, d, a, x[i + 8], 20, 1163531501) + a = gg(a, b, c, d, x[i + 13], 5, -1444681467) + d = gg(d, a, b, c, x[i + 2], 9, -51403784) + c = gg(c, d, a, b, x[i + 7], 14, 1735328473) + b = gg(b, c, d, a, x[i + 12], 20, -1926607734) + + a = hh(a, b, c, d, x[i + 5], 4, -378558) + d = hh(d, a, b, c, x[i + 8], 11, -2022574463) + c = hh(c, d, a, b, x[i + 11], 16, 1839030562) + b = hh(b, c, d, a, x[i + 14], 23, -35309556) + a = hh(a, b, c, d, x[i + 1], 4, -1530992060) + d = hh(d, a, b, c, x[i + 4], 11, 1272893353) + c = hh(c, d, a, b, x[i + 7], 16, -155497632) + b = hh(b, c, d, a, x[i + 10], 23, -1094730640) + a = hh(a, b, c, d, x[i + 13], 4, 681279174) + d = hh(d, a, b, c, x[i + 0], 11, -358537222) + c = hh(c, d, a, b, x[i + 3], 16, -722521979) + b = hh(b, c, d, a, x[i + 6], 23, 76029189) + a = hh(a, b, c, d, x[i + 9], 4, -640364487) + d = hh(d, a, b, c, x[i + 12], 11, -421815835) + c = hh(c, d, a, b, x[i + 15], 16, 530742520) + b = hh(b, c, d, a, x[i + 2], 23, -995338651) + + a = ii(a, b, c, d, x[i + 0], 6, -198630844) + d = ii(d, a, b, c, x[i + 7], 10, 1126891415) + c = ii(c, d, a, b, x[i + 14], 15, -1416354905) + b = ii(b, c, d, a, x[i + 5], 21, -57434055) + a = ii(a, b, c, d, x[i + 12], 6, 1700485571) + d = ii(d, a, b, c, x[i + 3], 10, -1894986606) + c = ii(c, d, a, b, x[i + 10], 15, -1051523) + b = ii(b, c, d, a, x[i + 1], 21, -2054922799) + a = ii(a, b, c, d, x[i + 8], 6, 1873313359) + d = ii(d, a, b, c, x[i + 15], 10, -30611744) + c = ii(c, d, a, b, x[i + 6], 15, -1560198380) + b = ii(b, c, d, a, x[i + 13], 21, 1309151649) + a = ii(a, b, c, d, x[i + 4], 6, -145523070) + d = ii(d, a, b, c, x[i + 11], 10, -1120210379) + c = ii(c, d, a, b, x[i + 2], 15, 718787259) + b = ii(b, c, d, a, x[i + 9], 21, -343485551) + + a = safe_add(a, olda) + b = safe_add(b, oldb) + c = safe_add(c, oldc) + d = safe_add(d, oldd) + } + return [a, b, c, d] +} + +/* + * Convert an array of little-endian words to a hex string. + */ +function binl2hex(binarray) { + var hex_tab = "0123456789abcdef" + var str = "" + for (var i = 0; i < binarray.length * 4; i++) { + str += hex_tab.charAt((binarray[i >> 2] >> ((i % 4) * 8 + 4)) & 0xF) + + hex_tab.charAt((binarray[i >> 2] >> ((i % 4) * 8)) & 0xF) + } + return str +} + +/* + * Convert an array of little-endian words to a base64 encoded string. + */ +function binl2b64(binarray) { + var tab = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/" + var str = "" + for (var i = 0; i < binarray.length * 32; i += 6) { + str += tab.charAt(((binarray[i >> 5] << (i % 32)) & 0x3F) | + ((binarray[i >> 5 + 1] >> (32 - i % 32)) & 0x3F)) + } + return str +} + +/* + * Convert an 8-bit character string to a sequence of 16-word blocks, stored + * as an array, and append appropriate padding for MD4/5 calculation. + * If any of the characters are >255, the high byte is silently ignored. + */ +function str2binl(str) { + var nblk = ((str.length + 8) >> 6) + 1 // number of 16-word blocks + var blks = new Array(nblk * 16) + for (var i = 0; i < nblk * 16; i++) blks[i] = 0 + for (var i = 0; i < str.length; i++) + blks[i >> 2] |= (str.charCodeAt(i) & 0xFF) << ((i % 4) * 8) + blks[i >> 2] |= 0x80 << ((i % 4) * 8) + blks[nblk * 16 - 2] = str.length * 8 + return blks +} + +/* + * Convert a wide-character string to a sequence of 16-word blocks, stored as + * an array, and append appropriate padding for MD4/5 calculation. + */ +function strw2binl(str) { + var nblk = ((str.length + 4) >> 5) + 1 // number of 16-word blocks + var blks = new Array(nblk * 16) + for (var i = 0; i < nblk * 16; i++) blks[i] = 0 + for (var i = 0; i < str.length; i++) + blks[i >> 1] |= str.charCodeAt(i) << ((i % 2) * 16) + blks[i >> 1] |= 0x80 << ((i % 2) * 16) + blks[nblk * 16 - 2] = str.length * 16 + return blks +} + +/* + * External interface + */ +function hexMD5(str) { + return binl2hex(coreMD5(str2binl(str))) +} + +function hexMD5w(str) { + return binl2hex(coreMD5(strw2binl(str))) +} + +function b64MD5(str) { + return binl2b64(coreMD5(str2binl(str))) +} + +function b64MD5w(str) { + return binl2b64(coreMD5(strw2binl(str))) +} +/* Backward compatibility */ +function calcMD5(str) { + return binl2hex(coreMD5(str2binl(str))) +} + +module.exports = { + md5: hexMD5 +} diff --git a/utils/request.js b/utils/request.js new file mode 100644 index 00000000..51649e07 --- /dev/null +++ b/utils/request.js @@ -0,0 +1,213 @@ +import Request from "@/lib/request/index.js"; +import { + refreshTokenFn +} from "@/api/login.js"; +import storage from "@/utils/storage.js"; +import { + md5 +} from "@/utils/md5.js"; +import Foundation from "@/utils/Foundation.js"; +import api from "@/config/api.js"; + +import uuid from "@/utils/uuid.modified.js"; + +function cleanStorage() { + uni.showToast({ + title: "你的登录状态已过期,请重新登录", + icon: "none", + duration: 1500, + }); + if (uni.showLoading()) { + uni.hideLoading(); + } + + storage.setHasLogin(false); + storage.setAccessToken(""); + storage.setRefreshToken(""); + console.log("清空token"); + storage.setUuid(""); + storage.setUserInfo({}); + // 清理vlog信息 + storage.setVlogToken("") + storage.setVlogUserInfo({}) + + + + // 防抖处理跳转 + // #ifdef MP-WEIXIN + + uni.navigateTo({ + url: "/pages/passport/wechatMPLogin", + }); + + // #endif + + // #ifndef MP-WEIXIN + + uni.navigateTo({ + url: "/pages/passport/login", + }); + + // #endif +} + +let http = new Request(); + + +http.setConfig((config) => { + // 没有uuid创建 + if (!storage.getUuid()) { + storage.setUuid(uuid.v1()); + } + + /* 设置全局配置 */ + config.baseURL = api.buyer; + config.header = { + ...config.header, + }; + config.validateStatus = (statusCode) => { + // 不论什么状态,统一在正确中处理 + return true; + }; + return config; +}); + +http.interceptors.request.use( + (config) => { + /* 请求之前拦截器。可以使用async await 做异步操作 */ + let accessToken = storage.getAccessToken(); + + if (accessToken) { + const nonce = Foundation.randomString(6); + const timestamp = parseInt(new Date().getTime() / 1000); + const sign = md5(nonce + timestamp + accessToken); + const _params = { + nonce, + timestamp, + sign, + }; + let params = config.params || {}; + params = { + ...params, + ..._params + }; + + config.params = params; + config.header.accessToken = accessToken; + + } + // 配置vlog所需参数 + let vlogToken = storage.getVlogToken(); + let vlogId = storage.getVlogUserInfo(); + console.log(vlogId) + console.log(vlogToken) + if(vlogToken){ + config.header.headerUserToken = vlogToken; + config.header.headerUserId = vlogId.id; + } + config.header = { + ...config.header, + uuid: storage.getUuid() || uuid.v1(), + }; + console.log(config) + return config; + }, + (config) => { + return Promise.reject(config); + } +); + + +// 是否正在刷新的标记 +let isRefreshing = false; +//重试队列 +let requests = []; +// 必须使用异步函数,注意 +http.interceptors.response.use( + async (response) => { + console.log(response) + /* 请求之后拦截器。可以使用async await 做异步操作 */ + // token存在并且token过期 + if (isRefreshing && response.statusCode === 403) { + cleanStorage(); + isRefreshing = false; + } + + let token = storage.getAccessToken(); + if ( + (token && response.statusCode === 403) || + response.data.status === 403 + ) { + if (!isRefreshing) { + isRefreshing = true; + //调用刷新token的接口 + return refreshTokenFn(storage.getRefreshToken()) + .then((res) => { + let { + accessToken, + refreshToken + } = res.data.result; + storage.setAccessToken(accessToken); + storage.setRefreshToken(refreshToken); + + response.header.accessToken = `${accessToken}`; + // token 刷新后将数组的方法重新执行 + requests.forEach((cb) => cb(accessToken)); + requests = []; // 重新请求完清空 + return http.request(response.config); + }) + .catch((err) => { + cleanStorage(); + return Promise.reject(err); + }) + .finally(() => { + isRefreshing = false; + }); + } else { + // 返回未执行 resolve 的 Promise + return new Promise((resolve) => { + // 用函数形式将 resolve 存入,等待刷新后再执行 + requests.push((token) => { + response.header.accessToken = `${token}`; + resolve(http.request(response.config)); + }); + }); + } + + // 如果当前返回没登录 + } else if ( + (!token && response.statusCode === 403) || + response.data.code === 403 + ) { + cleanStorage(); + + // 如果当前状态码为正常但是success为不正常时 + } else if ( + (response.statusCode == 200 && !response.data.success) || + response.statusCode == 400 + ) { + if (response.data.message) { + uni.showToast({ + title: response.data.message, + icon: "none", + duration: 1500, + }); + } + } + return response; + }, + (error) => { + return error; + } +); + +export { + http +}; + +export const Method = { + GET: "GET", + POST: "POST", + PUT: "PUT", + DELETE: "DELETE", +}; \ No newline at end of file diff --git a/utils/storage.js b/utils/storage.js new file mode 100644 index 00000000..6eb29859 --- /dev/null +++ b/utils/storage.js @@ -0,0 +1,134 @@ +let isDev = process.env.NODE_ENV === "development"; +const UUID = isDev ? "uuid_key_dev" : "uuid_key"; +const HAS_LOGIN = isDev ? "has_login_key_dev" : "has_login_key"; +const ACCESS_TOKEN = isDev ? "access_token_key_dev" : "access_token_key"; +const VLOG_TOKEN = isDev ? "vlog_token_key_dev" : "vlog_token_key"; +const REFRESH_TOKEN = isDev ? "refresh_token_key_dev" : "refresh_token_key"; +const USER_INFO = isDev ? "user_info_obj_dev" : "user_info_obj"; +const VLOG_USER_INFO = isDev ? "vlog_user_info_obj_dev" : "vlog_user_info_obj"; +const FACE_LOGIN = isDev ? "face_login_dev" : "face_login"; +const FINGER_LOGIN = isDev ? "finger_login_dev" : "finger_login"; +const CART_BACKBTN = isDev ? "cart_backbtn_dev" : "cart_backbtn"; +const AFTERSALE_DATA = isDev ? "aftersale_data_dev" : "aftersale_data"; +export default { + + /** + * 获取Vlogtoken + */ + getVlogToken() { + return uni.getStorageSync(VLOG_TOKEN); + }, + /** + * 写入Vlogtoken + */ + setVlogToken(val) { + return uni.setStorageSync(VLOG_TOKEN, val); + }, + /** + * 写入VlogUserInfo + */ + setVlogUserInfo(val) { + return uni.setStorageSync(VLOG_USER_INFO, val); + }, + /** + * 获取VlogUserInfo + */ + getVlogUserInfo(val) { + return uni.getStorageSync(VLOG_USER_INFO); + }, + + // 写入热门搜索时间戳 + setHotWords(val) { + uni.setStorageSync("hotWords", val); + }, + // 获取热门搜索时间戳 + getHotWords() { + return uni.getStorageSync(`hotWords`); + }, + + // 获取face id登录 + getFaceLogin() { + return uni.getStorageSync(FACE_LOGIN); + }, + // 写入face id + setFaceLogin(val) { + uni.setStorageSync(FACE_LOGIN, val); + }, + // 获取指纹登录 + getFingerLogin() { + return uni.getStorageSync(FINGER_LOGIN); + }, + // 写入指纹登录 + setFingerLogin(val) { + uni.setStorageSync(FINGER_LOGIN, val); + }, + // 写入用户信息 + setUserInfo(val) { + uni.setStorageSync(USER_INFO, val); + }, + // 获取用户信息 + getUserInfo() { + return uni.getStorageSync(USER_INFO); + }, + // 写入uuid + setUuid(val) { + uni.setStorageSync(UUID, val); + }, + // 获取uuid + getUuid() { + return uni.getStorageSync(UUID); + }, + // 写入登录 + setHasLogin(val) { + uni.setStorageSync(HAS_LOGIN, val); + }, + // 获取是否登录 + getHasLogin() { + return uni.getStorageSync(HAS_LOGIN); + }, + // 删除uuid + removeUuid() { + uni.removeStorageSync(UUID); + }, + // 写入accessToken + setAccessToken(val) { + uni.setStorageSync(ACCESS_TOKEN, val); + }, + // 获取accessToken + getAccessToken() { + return uni.getStorageSync(ACCESS_TOKEN); + }, + // 后退购物车 + setCartBackbtn(val) { + uni.setStorageSync(CART_BACKBTN, val); + }, + + // 删除token + removeAccessToken() { + uni.removeStorageSync(ACCESS_TOKEN); + }, + // 写入刷新token + setRefreshToken(val) { + uni.setStorageSync(REFRESH_TOKEN, val); + }, + // 获取刷新token + getRefreshToken() { + return uni.getStorageSync(REFRESH_TOKEN); + }, + // 删除token + removeRefreshToken() { + uni.removeStorageSync(REFRESH_TOKEN); + }, + // 写入刷新token + setAfterSaleData(val) { + uni.setStorageSync(AFTERSALE_DATA, val); + }, + // 获取刷新token + getAfterSaleData() { + return uni.getStorageSync(AFTERSALE_DATA); + }, + // 删除token + removeAfterSaleData() { + uni.removeStorageSync(AFTERSALE_DATA); + }, +}; \ No newline at end of file diff --git a/utils/tools.js b/utils/tools.js new file mode 100644 index 00000000..6ca72f84 --- /dev/null +++ b/utils/tools.js @@ -0,0 +1,163 @@ +/** + * 解析url参数 + * @example ?id=12345&a=b + * @return Object {id:12345,a:b} + */ +function urlParse(url) { + let obj = {}; + let reg = /[?&][^?&]+=[^?&]+/g; + let arr = url.match(reg); + if (arr) { + arr.forEach((item) => { + let tempArr = item.substring(1).split("="); + let key = decodeURIComponent(tempArr[0]); + let val = decodeURIComponent(tempArr.splice(1).join("=")); + obj[key] = val; + }); + } + return obj; +} + +const getNetworkType = () => { + uni.getNetworkType({ + success: (res) => { + if (res.networkType === "none") { + uni.showToast({ + title: "网络好像有点问题,请检查后重试!", + duration: 2000, + icon: "none", + }); + let pages = getCurrentPages(); + if (pages.length) { + let route = pages[pages.length - 1].route; + if (route !== "pages/empty/empty") { + uni.navigateTo({ + url: `/pages/empty/empty?type=wifi`, + }); + } + } else { + uni.navigateTo({ + url: `/pages/empty/empty?type=wifi`, + }); + } + } + }, + }); +}; + +const throttle = (fn, that, gapTime) => { + // export function throttle(fn, gapTime) { + if (gapTime == null || gapTime == undefined) { + gapTime = 1800; + } + let _lastTime = that.lastTime; + let _nowTime = +new Date(); + if (_nowTime - _lastTime > gapTime || !_lastTime) { + fn.apply(that, arguments); //将this和参数传给原函数 + that.lastTime = _nowTime; + } +}; + +/** + * 计算传秒数的倒计时【天、时、分、秒】 + * @param seconds + * @returns {{day : *, hours : *, minutes : *, seconds : *}} + */ +const countTimeDown = (seconds) => { + const leftTime = (time) => { + if (time < 10) time = "0" + time; + return time + ""; + }; + return { + day: leftTime(parseInt(seconds / 60 / 60 / 24, 10)), + hours: leftTime(parseInt((seconds / 60 / 60) % 24, 10)), + minutes: leftTime(parseInt((seconds / 60) % 60, 10)), + seconds: leftTime(parseInt(seconds % 60, 10)), + }; +}; + +/** + * 计算当前时间到第二天0点的倒计时[秒] + * @returns {number} + */ +const theNextDayTime = () => { + const nowDate = new Date(); + const time = + new Date( + nowDate.getFullYear(), + nowDate.getMonth(), + nowDate.getDate() + 1, + 0, + 0, + 0 + ).getTime() - nowDate.getTime(); + return parseInt(time / 1000); +}; + +const graceNumber = (number) => { + if (number == 0) { + return "0"; + } else if (number > 999 && number <= 9999) { + return (number / 1000).toFixed(1) + "k"; + } else if (number > 9999 && number <= 99999) { + return (number / 10000).toFixed(1) + "w"; + } else if (number > 99999) { + return "10w+"; + } + return number; +} + +// 时间格式化时间为: 多少分钟前、多少天前 +// time 2020-09-10 20:20:20 +const getDateBeforeNow = (stringTime) => { + stringTime = new Date(stringTime.replace(/-/g, "/")); + let minute = 1000 * 60; + let hour = minute * 60; + let day = hour * 24; + let week = day * 7; + let month = day * 30; + let time1 = new Date().getTime(); //当前的时间戳 + let time2 = Date.parse(new Date(stringTime)); //指定时间的时间戳 + let time = time1 - time2; + let result = null; + if (time < 0) { + result = stringTime; + } else if (time / month >= 1) { + result = parseInt(time / month) + "月前"; + } else if (time / week >= 1) { + result = parseInt(time / week) + "周前"; + } else if (time / day >= 1) { + result = parseInt(time / day) + "天前"; + } else if (time / hour >= 1) { + result = parseInt(time / hour) + "小时前"; + } else if (time / minute >= 1) { + result = parseInt(time / minute) + "分钟前"; + } else { + result = "刚刚"; + } + return result; +} +// 判断是否为空 +const isStrEmpty = (str) => { + if ( + str == null || + str == undefined || + (typeof str == "object" && str == {}) || + (typeof str == "string" && str.trim() == "") + ) { + return true; + } else { + return false; + } +} + + +export { + getNetworkType, + throttle, + countTimeDown, + theNextDayTime, + graceNumber, + getDateBeforeNow, + isStrEmpty +}; \ No newline at end of file diff --git a/utils/uuid.modified.js b/utils/uuid.modified.js new file mode 100644 index 00000000..5dc59cff --- /dev/null +++ b/utils/uuid.modified.js @@ -0,0 +1,262 @@ +// uuid.js +// +// Copyright (c) 2010-2012 Robert Kieffer +// MIT License - http://opensource.org/licenses/mit-license.php + +/*global window, require, define */ +(function(_window) { + 'use strict'; + + + + // Unique ID creation requires a high quality random # generator. We feature + // detect to determine the best RNG source, normalizing to a function that + // returns 128-bits of randomness, since that's what's usually required + var _rng, _mathRNG, _nodeRNG, _whatwgRNG, _previousRoot; + + function setupBrowser() { + // Allow for MSIE11 msCrypto + //var _crypto = _window.crypto || _window.msCrypto; + var crypto = {} + var _crypto = crypto || _window.crypto || _window.msCrypto; + + if (!_rng && _crypto && _crypto.getRandomValues) { + // WHATWG crypto-based RNG - http://wiki.whatwg.org/wiki/Crypto + // + // Moderately fast, high quality + try { + var _rnds8 = new Uint8Array(16); + _whatwgRNG = _rng = function whatwgRNG() { + _crypto.getRandomValues(_rnds8); + return _rnds8; + }; + + _rng(); + } catch (e) {} + } + + if (!_rng) { + // Math.random()-based (RNG) + // + // If all else fails, use Math.random(). It's fast, but is of unspecified + // quality. + var _rnds = new Array(16); + _mathRNG = _rng = function() { + for (var i = 0, r; i < 16; i++) { + if ((i & 0x03) === 0) { r = Math.random() * 0x100000000; } + _rnds[i] = r >>> ((i & 0x03) << 3) & 0xff; + } + + return _rnds; + }; + if ('undefined' !== typeof console && console.warn) { + // console.warn("[SECURITY] node-uuid: crypto not usable, falling back to insecure Math.random()"); + } + } + } + + setupBrowser(); + + // Buffer class to use + var BufferClass = ('function' === typeof Buffer) ? Buffer : Array; + + // Maps for number <-> hex string conversion + var _byteToHex = []; + var _hexToByte = {}; + for (var i = 0; i < 256; i++) { + _byteToHex[i] = (i + 0x100).toString(16).substr(1); + _hexToByte[_byteToHex[i]] = i; + } + + // **`parse()` - Parse a UUID into it's component bytes** + function parse(s, buf, offset) { + var i = (buf && offset) || 0, + ii = 0; + + buf = buf || []; + s.toLowerCase().replace(/[0-9a-f]{2}/g, function(oct) { + if (ii < 16) { // Don't overflow! + buf[i + ii++] = _hexToByte[oct]; + } + }); + + // Zero out remaining bytes if string was short + while (ii < 16) { + buf[i + ii++] = 0; + } + + return buf; + } + + // **`unparse()` - Convert UUID byte array (ala parse()) into a string** + function unparse(buf, offset) { + var i = offset || 0, + bth = _byteToHex; + return bth[buf[i++]] + bth[buf[i++]] + + bth[buf[i++]] + bth[buf[i++]] + '-' + + bth[buf[i++]] + bth[buf[i++]] + '-' + + bth[buf[i++]] + bth[buf[i++]] + '-' + + bth[buf[i++]] + bth[buf[i++]] + '-' + + bth[buf[i++]] + bth[buf[i++]] + + bth[buf[i++]] + bth[buf[i++]] + + bth[buf[i++]] + bth[buf[i++]]; + } + + // **`v1()` - Generate time-based UUID** + // + // Inspired by https://github.com/LiosK/UUID.js + // and http://docs.python.org/library/uuid.html + + // random #'s we need to init node and clockseq + var _seedBytes = _rng(); + + // Per 4.5, create and 48-bit node id, (47 random bits + multicast bit = 1) + var _nodeId = [ + _seedBytes[0] | 0x01, + _seedBytes[1], _seedBytes[2], _seedBytes[3], _seedBytes[4], _seedBytes[5] + ]; + + // Per 4.2.2, randomize (14 bit) clockseq + var _clockseq = (_seedBytes[6] << 8 | _seedBytes[7]) & 0x3fff; + + // Previous uuid creation time + var _lastMSecs = 0, + _lastNSecs = 0; + + // See https://github.com/broofa/node-uuid for API details + function v1(options, buf, offset) { + var i = buf && offset || 0; + var b = buf || []; + + options = options || {}; + + var clockseq = (options.clockseq != null) ? options.clockseq : _clockseq; + + // UUID timestamps are 100 nano-second units since the Gregorian epoch, + // (1582-10-15 00:00). JSNumbers aren't precise enough for this, so + // time is handled internally as 'msecs' (integer milliseconds) and 'nsecs' + // (100-nanoseconds offset from msecs) since unix epoch, 1970-01-01 00:00. + var msecs = (options.msecs != null) ? options.msecs : new Date().getTime(); + + // Per 4.2.1.2, use count of uuid's generated during the current clock + // cycle to simulate higher resolution clock + var nsecs = (options.nsecs != null) ? options.nsecs : _lastNSecs + 1; + + // Time since last uuid creation (in msecs) + var dt = (msecs - _lastMSecs) + (nsecs - _lastNSecs) / 10000; + + // Per 4.2.1.2, Bump clockseq on clock regression + if (dt < 0 && options.clockseq == null) { + clockseq = clockseq + 1 & 0x3fff; + } + + // Reset nsecs if clock regresses (new clockseq) or we've moved onto a new + // time interval + if ((dt < 0 || msecs > _lastMSecs) && options.nsecs == null) { + nsecs = 0; + } + + // Per 4.2.1.2 Throw error if too many uuids are requested + if (nsecs >= 10000) { + throw new Error('uuid.v1(): Can\'t create more than 10M uuids/sec'); + } + + _lastMSecs = msecs; + _lastNSecs = nsecs; + _clockseq = clockseq; + + // Per 4.1.4 - Convert from unix epoch to Gregorian epoch + msecs += 12219292800000; + + // `time_low` + var tl = ((msecs & 0xfffffff) * 10000 + nsecs) % 0x100000000; + b[i++] = tl >>> 24 & 0xff; + b[i++] = tl >>> 16 & 0xff; + b[i++] = tl >>> 8 & 0xff; + b[i++] = tl & 0xff; + + // `time_mid` + var tmh = (msecs / 0x100000000 * 10000) & 0xfffffff; + b[i++] = tmh >>> 8 & 0xff; + b[i++] = tmh & 0xff; + + // `time_high_and_version` + b[i++] = tmh >>> 24 & 0xf | 0x10; // include version + b[i++] = tmh >>> 16 & 0xff; + + // `clock_seq_hi_and_reserved` (Per 4.2.2 - include variant) + b[i++] = clockseq >>> 8 | 0x80; + + // `clock_seq_low` + b[i++] = clockseq & 0xff; + + // `node` + var node = options.node || _nodeId; + for (var n = 0; n < 6; n++) { + b[i + n] = node[n]; + } + + return buf ? buf : unparse(b); + } + + // **`v4()` - Generate random UUID** + + // See https://github.com/broofa/node-uuid for API details + function v4(options, buf, offset) { + // Deprecated - 'format' argument, as supported in v1.2 + var i = buf && offset || 0; + + if (typeof(options) === 'string') { + buf = (options === 'binary') ? new BufferClass(16) : null; + options = null; + } + options = options || {}; + + var rnds = options.random || (options.rng || _rng)(); + + // Per 4.4, set bits for version and `clock_seq_hi_and_reserved` + rnds[6] = (rnds[6] & 0x0f) | 0x40; + rnds[8] = (rnds[8] & 0x3f) | 0x80; + + // Copy bytes to buffer, if provided + if (buf) { + for (var ii = 0; ii < 16; ii++) { + buf[i + ii] = rnds[ii]; + } + } + + return buf || unparse(rnds); + } + + // Export public API + var uuid = v4; + uuid.v1 = v1; + uuid.v4 = v4; + uuid.parse = parse; + uuid.unparse = unparse; + uuid.BufferClass = BufferClass; + uuid._rng = _rng; + uuid._mathRNG = _mathRNG; + uuid._nodeRNG = _nodeRNG; + uuid._whatwgRNG = _whatwgRNG; + + + if (('undefined' !== typeof module) && module.exports) { + // Publish as node.js module + module.exports = uuid; + } else if (typeof define === 'function' && define.amd) { + // Publish as AMD module + define(function() { return uuid; }); + } else { + // Publish as global (in browsers) + _previousRoot = _window.uuid; + + // **`noConflict()` - (browser only) to reset global 'uuid' var** + uuid.noConflict = function() { + _window.uuid = _previousRoot; + return uuid; + }; + + _window.uuid = uuid; + } +})('undefined' !== typeof window ? window : null); \ No newline at end of file diff --git a/uview-ui/LICENSE b/uview-ui/LICENSE new file mode 100644 index 00000000..74569598 --- /dev/null +++ b/uview-ui/LICENSE @@ -0,0 +1,21 @@ +MIT License + +Copyright (c) 2020 www.uviewui.com + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. \ No newline at end of file diff --git a/uview-ui/components/u-action-sheet/u-action-sheet.vue b/uview-ui/components/u-action-sheet/u-action-sheet.vue new file mode 100644 index 00000000..8a463690 --- /dev/null +++ b/uview-ui/components/u-action-sheet/u-action-sheet.vue @@ -0,0 +1,182 @@ + + + + + diff --git a/uview-ui/components/u-alert-tips/u-alert-tips.vue b/uview-ui/components/u-alert-tips/u-alert-tips.vue new file mode 100644 index 00000000..18f32f9b --- /dev/null +++ b/uview-ui/components/u-alert-tips/u-alert-tips.vue @@ -0,0 +1,256 @@ + + + + + diff --git a/uview-ui/components/u-avatar-cropper/u-avatar-cropper.vue b/uview-ui/components/u-avatar-cropper/u-avatar-cropper.vue new file mode 100644 index 00000000..439c6265 --- /dev/null +++ b/uview-ui/components/u-avatar-cropper/u-avatar-cropper.vue @@ -0,0 +1,290 @@ + + + + + diff --git a/uview-ui/components/u-avatar-cropper/weCropper.js b/uview-ui/components/u-avatar-cropper/weCropper.js new file mode 100644 index 00000000..7402f8d4 --- /dev/null +++ b/uview-ui/components/u-avatar-cropper/weCropper.js @@ -0,0 +1,1265 @@ +/** + * we-cropper v1.3.9 + * (c) 2020 dlhandsome + * @license MIT + */ +(function(global, factory) { + typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory() : + typeof define === 'function' && define.amd ? define(factory) : + (global.WeCropper = factory()); +}(this, (function() { + 'use strict'; + + var device = void 0; + var TOUCH_STATE = ['touchstarted', 'touchmoved', 'touchended']; + + function firstLetterUpper(str) { + return str.charAt(0).toUpperCase() + str.slice(1) + } + + function setTouchState(instance) { + var arg = [], + len = arguments.length - 1; + while (len-- > 0) arg[len] = arguments[len + 1]; + + TOUCH_STATE.forEach(function(key, i) { + if (arg[i] !== undefined) { + instance[key] = arg[i]; + } + }); + } + + function validator(instance, o) { + Object.defineProperties(instance, o); + } + + function getDevice() { + if (!device) { + device = uni.getSystemInfoSync(); + } + return device + } + + var tmp = {}; + + var ref = getDevice(); + var pixelRatio = ref.pixelRatio; + + var DEFAULT = { + id: { + default: 'cropper', + get: function get() { + return tmp.id + }, + set: function set(value) { + if (typeof(value) !== 'string') { + console.error(("id:" + value + " is invalid")); + } + tmp.id = value; + } + }, + width: { + default: 750, + get: function get() { + return tmp.width + }, + set: function set(value) { + if (typeof(value) !== 'number') { + console.error(("width:" + value + " is invalid")); + } + tmp.width = value; + } + }, + height: { + default: 750, + get: function get() { + return tmp.height + }, + set: function set(value) { + if (typeof(value) !== 'number') { + console.error(("height:" + value + " is invalid")); + } + tmp.height = value; + } + }, + pixelRatio: { + default: pixelRatio, + get: function get() { + return tmp.pixelRatio + }, + set: function set(value) { + if (typeof(value) !== 'number') { + console.error(("pixelRatio:" + value + " is invalid")); + } + tmp.pixelRatio = value; + } + }, + scale: { + default: 2.5, + get: function get() { + return tmp.scale + }, + set: function set(value) { + if (typeof(value) !== 'number') { + console.error(("scale:" + value + " is invalid")); + } + tmp.scale = value; + } + }, + zoom: { + default: 5, + get: function get() { + return tmp.zoom + }, + set: function set(value) { + if (typeof(value) !== 'number') { + console.error(("zoom:" + value + " is invalid")); + } else if (value < 0 || value > 10) { + console.error("zoom should be ranged in 0 ~ 10"); + } + tmp.zoom = value; + } + }, + src: { + default: '', + get: function get() { + return tmp.src + }, + set: function set(value) { + if (typeof(value) !== 'string') { + console.error(("src:" + value + " is invalid")); + } + tmp.src = value; + } + }, + cut: { + default: {}, + get: function get() { + return tmp.cut + }, + set: function set(value) { + if (typeof(value) !== 'object') { + console.error(("cut:" + value + " is invalid")); + } + tmp.cut = value; + } + }, + boundStyle: { + default: {}, + get: function get() { + return tmp.boundStyle + }, + set: function set(value) { + if (typeof(value) !== 'object') { + console.error(("boundStyle:" + value + " is invalid")); + } + tmp.boundStyle = value; + } + }, + onReady: { + default: null, + get: function get() { + return tmp.ready + }, + set: function set(value) { + tmp.ready = value; + } + }, + onBeforeImageLoad: { + default: null, + get: function get() { + return tmp.beforeImageLoad + }, + set: function set(value) { + tmp.beforeImageLoad = value; + } + }, + onImageLoad: { + default: null, + get: function get() { + return tmp.imageLoad + }, + set: function set(value) { + tmp.imageLoad = value; + } + }, + onBeforeDraw: { + default: null, + get: function get() { + return tmp.beforeDraw + }, + set: function set(value) { + tmp.beforeDraw = value; + } + } + }; + + var ref$1 = getDevice(); + var windowWidth = ref$1.windowWidth; + + function prepare() { + var self = this; + + // v1.4.0 版本中将不再自动绑定we-cropper实例 + self.attachPage = function() { + var pages = getCurrentPages(); + // 获取到当前page上下文 + var pageContext = pages[pages.length - 1]; + // 把this依附在Page上下文的wecropper属性上,便于在page钩子函数中访问 + Object.defineProperty(pageContext, 'wecropper', { + get: function get() { + console.warn( + 'Instance will not be automatically bound to the page after v1.4.0\n\n' + + 'Please use a custom instance name instead\n\n' + + 'Example: \n' + + 'this.mycropper = new WeCropper(options)\n\n' + + '// ...\n' + + 'this.mycropper.getCropperImage()' + ); + return self + }, + configurable: true + }); + }; + + self.createCtx = function() { + var id = self.id; + var targetId = self.targetId; + + if (id) { + self.ctx = self.ctx || uni.createCanvasContext(id); + self.targetCtx = self.targetCtx || uni.createCanvasContext(targetId); + } else { + console.error("constructor: create canvas context failed, 'id' must be valuable"); + } + }; + + self.deviceRadio = windowWidth / 750; + } + + var commonjsGlobal = typeof window !== 'undefined' ? window : typeof global !== 'undefined' ? global : typeof self !== + 'undefined' ? self : {}; + + + + + + function createCommonjsModule(fn, module) { + return module = { + exports: {} + }, fn(module, module.exports), module.exports; + } + + var tools = createCommonjsModule(function(module, exports) { + /** + * String type check + */ + exports.isStr = function(v) { + return typeof v === 'string'; + }; + /** + * Number type check + */ + exports.isNum = function(v) { + return typeof v === 'number'; + }; + /** + * Array type check + */ + exports.isArr = Array.isArray; + /** + * undefined type check + */ + exports.isUndef = function(v) { + return v === undefined; + }; + + exports.isTrue = function(v) { + return v === true; + }; + + exports.isFalse = function(v) { + return v === false; + }; + /** + * Function type check + */ + exports.isFunc = function(v) { + return typeof v === 'function'; + }; + /** + * Quick object check - this is primarily used to tell + * Objects from primitive values when we know the value + * is a JSON-compliant type. + */ + exports.isObj = exports.isObject = function(obj) { + return obj !== null && typeof obj === 'object' + }; + + /** + * Strict object type check. Only returns true + * for plain JavaScript objects. + */ + var _toString = Object.prototype.toString; + exports.isPlainObject = function(obj) { + return _toString.call(obj) === '[object Object]' + }; + + /** + * Check whether the object has the property. + */ + var hasOwnProperty = Object.prototype.hasOwnProperty; + exports.hasOwn = function(obj, key) { + return hasOwnProperty.call(obj, key) + }; + + /** + * Perform no operation. + * Stubbing args to make Flow happy without leaving useless transpiled code + * with ...rest (https://flow.org/blog/2017/05/07/Strict-Function-Call-Arity/) + */ + exports.noop = function(a, b, c) {}; + + /** + * Check if val is a valid array index. + */ + exports.isValidArrayIndex = function(val) { + var n = parseFloat(String(val)); + return n >= 0 && Math.floor(n) === n && isFinite(val) + }; + }); + + var tools_7 = tools.isFunc; + var tools_10 = tools.isPlainObject; + + var EVENT_TYPE = ['ready', 'beforeImageLoad', 'beforeDraw', 'imageLoad']; + + function observer() { + var self = this; + + self.on = function(event, fn) { + if (EVENT_TYPE.indexOf(event) > -1) { + if (tools_7(fn)) { + event === 'ready' ? + fn(self) : + self[("on" + (firstLetterUpper(event)))] = fn; + } + } else { + console.error(("event: " + event + " is invalid")); + } + return self + }; + } + + function wxPromise(fn) { + return function(obj) { + var args = [], + len = arguments.length - 1; + while (len-- > 0) args[len] = arguments[len + 1]; + + if (obj === void 0) obj = {}; + return new Promise(function(resolve, reject) { + obj.success = function(res) { + resolve(res); + }; + obj.fail = function(err) { + reject(err); + }; + fn.apply(void 0, [obj].concat(args)); + }) + } + } + + function draw(ctx, reserve) { + if (reserve === void 0) reserve = false; + + return new Promise(function(resolve) { + ctx.draw(reserve, resolve); + }) + } + + var getImageInfo = wxPromise(uni.getImageInfo); + + var canvasToTempFilePath = wxPromise(uni.canvasToTempFilePath); + + var base64 = createCommonjsModule(function(module, exports) { + /*! http://mths.be/base64 v0.1.0 by @mathias | MIT license */ + (function(root) { + + // Detect free variables `exports`. + var freeExports = 'object' == 'object' && exports; + + // Detect free variable `module`. + var freeModule = 'object' == 'object' && module && + module.exports == freeExports && module; + + // Detect free variable `global`, from Node.js or Browserified code, and use + // it as `root`. + var freeGlobal = typeof commonjsGlobal == 'object' && commonjsGlobal; + if (freeGlobal.global === freeGlobal || freeGlobal.window === freeGlobal) { + root = freeGlobal; + } + + /*--------------------------------------------------------------------------*/ + + var InvalidCharacterError = function(message) { + this.message = message; + }; + InvalidCharacterError.prototype = new Error; + InvalidCharacterError.prototype.name = 'InvalidCharacterError'; + + var error = function(message) { + // Note: the error messages used throughout this file match those used by + // the native `atob`/`btoa` implementation in Chromium. + throw new InvalidCharacterError(message); + }; + + var TABLE = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/'; + // http://whatwg.org/html/common-microsyntaxes.html#space-character + var REGEX_SPACE_CHARACTERS = /[\t\n\f\r ]/g; + + // `decode` is designed to be fully compatible with `atob` as described in the + // HTML Standard. http://whatwg.org/html/webappapis.html#dom-windowbase64-atob + // The optimized base64-decoding algorithm used is based on @atk’s excellent + // implementation. https://gist.github.com/atk/1020396 + var decode = function(input) { + input = String(input) + .replace(REGEX_SPACE_CHARACTERS, ''); + var length = input.length; + if (length % 4 == 0) { + input = input.replace(/==?$/, ''); + length = input.length; + } + if ( + length % 4 == 1 || + // http://whatwg.org/C#alphanumeric-ascii-characters + /[^+a-zA-Z0-9/]/.test(input) + ) { + error( + 'Invalid character: the string to be decoded is not correctly encoded.' + ); + } + var bitCounter = 0; + var bitStorage; + var buffer; + var output = ''; + var position = -1; + while (++position < length) { + buffer = TABLE.indexOf(input.charAt(position)); + bitStorage = bitCounter % 4 ? bitStorage * 64 + buffer : buffer; + // Unless this is the first of a group of 4 characters… + if (bitCounter++ % 4) { + // …convert the first 8 bits to a single ASCII character. + output += String.fromCharCode( + 0xFF & bitStorage >> (-2 * bitCounter & 6) + ); + } + } + return output; + }; + + // `encode` is designed to be fully compatible with `btoa` as described in the + // HTML Standard: http://whatwg.org/html/webappapis.html#dom-windowbase64-btoa + var encode = function(input) { + input = String(input); + if (/[^\0-\xFF]/.test(input)) { + // Note: no need to special-case astral symbols here, as surrogates are + // matched, and the input is supposed to only contain ASCII anyway. + error( + 'The string to be encoded contains characters outside of the ' + + 'Latin1 range.' + ); + } + var padding = input.length % 3; + var output = ''; + var position = -1; + var a; + var b; + var c; + var buffer; + // Make sure any padding is handled outside of the loop. + var length = input.length - padding; + + while (++position < length) { + // Read three bytes, i.e. 24 bits. + a = input.charCodeAt(position) << 16; + b = input.charCodeAt(++position) << 8; + c = input.charCodeAt(++position); + buffer = a + b + c; + // Turn the 24 bits into four chunks of 6 bits each, and append the + // matching character for each of them to the output. + output += ( + TABLE.charAt(buffer >> 18 & 0x3F) + + TABLE.charAt(buffer >> 12 & 0x3F) + + TABLE.charAt(buffer >> 6 & 0x3F) + + TABLE.charAt(buffer & 0x3F) + ); + } + + if (padding == 2) { + a = input.charCodeAt(position) << 8; + b = input.charCodeAt(++position); + buffer = a + b; + output += ( + TABLE.charAt(buffer >> 10) + + TABLE.charAt((buffer >> 4) & 0x3F) + + TABLE.charAt((buffer << 2) & 0x3F) + + '=' + ); + } else if (padding == 1) { + buffer = input.charCodeAt(position); + output += ( + TABLE.charAt(buffer >> 2) + + TABLE.charAt((buffer << 4) & 0x3F) + + '==' + ); + } + + return output; + }; + + var base64 = { + 'encode': encode, + 'decode': decode, + 'version': '0.1.0' + }; + + // Some AMD build optimizers, like r.js, check for specific condition patterns + // like the following: + if ( + typeof undefined == 'function' && + typeof undefined.amd == 'object' && + undefined.amd + ) { + undefined(function() { + return base64; + }); + } else if (freeExports && !freeExports.nodeType) { + if (freeModule) { // in Node.js or RingoJS v0.8.0+ + freeModule.exports = base64; + } else { // in Narwhal or RingoJS v0.7.0- + for (var key in base64) { + base64.hasOwnProperty(key) && (freeExports[key] = base64[key]); + } + } + } else { // in Rhino or a web browser + root.base64 = base64; + } + + }(commonjsGlobal)); + }); + + function makeURI(strData, type) { + return 'data:' + type + ';base64,' + strData + } + + function fixType(type) { + type = type.toLowerCase().replace(/jpg/i, 'jpeg'); + var r = type.match(/png|jpeg|bmp|gif/)[0]; + return 'image/' + r + } + + function encodeData(data) { + var str = ''; + if (typeof data === 'string') { + str = data; + } else { + for (var i = 0; i < data.length; i++) { + str += String.fromCharCode(data[i]); + } + } + return base64.encode(str) + } + + /** + * 获取图像区域隐含的像素数据 + * @param canvasId canvas标识 + * @param x 将要被提取的图像数据矩形区域的左上角 x 坐标 + * @param y 将要被提取的图像数据矩形区域的左上角 y 坐标 + * @param width 将要被提取的图像数据矩形区域的宽度 + * @param height 将要被提取的图像数据矩形区域的高度 + * @param done 完成回调 + */ + function getImageData(canvasId, x, y, width, height, done) { + uni.canvasGetImageData({ + canvasId: canvasId, + x: x, + y: y, + width: width, + height: height, + success: function success(res) { + done(res, null); + }, + fail: function fail(res) { + done(null, res); + } + }); + } + + /** + * 生成bmp格式图片 + * 按照规则生成图片响应头和响应体 + * @param oData 用来描述 canvas 区域隐含的像素数据 { data, width, height } = oData + * @returns {*} base64字符串 + */ + function genBitmapImage(oData) { + // + // BITMAPFILEHEADER: http://msdn.microsoft.com/en-us/library/windows/desktop/dd183374(v=vs.85).aspx + // BITMAPINFOHEADER: http://msdn.microsoft.com/en-us/library/dd183376.aspx + // + var biWidth = oData.width; + var biHeight = oData.height; + var biSizeImage = biWidth * biHeight * 3; + var bfSize = biSizeImage + 54; // total header size = 54 bytes + + // + // typedef struct tagBITMAPFILEHEADER { + // WORD bfType; + // DWORD bfSize; + // WORD bfReserved1; + // WORD bfReserved2; + // DWORD bfOffBits; + // } BITMAPFILEHEADER; + // + var BITMAPFILEHEADER = [ + // WORD bfType -- The file type signature; must be "BM" + 0x42, 0x4D, + // DWORD bfSize -- The size, in bytes, of the bitmap file + bfSize & 0xff, bfSize >> 8 & 0xff, bfSize >> 16 & 0xff, bfSize >> 24 & 0xff, + // WORD bfReserved1 -- Reserved; must be zero + 0, 0, + // WORD bfReserved2 -- Reserved; must be zero + 0, 0, + // DWORD bfOffBits -- The offset, in bytes, from the beginning of the BITMAPFILEHEADER structure to the bitmap bits. + 54, 0, 0, 0 + ]; + + // + // typedef struct tagBITMAPINFOHEADER { + // DWORD biSize; + // LONG biWidth; + // LONG biHeight; + // WORD biPlanes; + // WORD biBitCount; + // DWORD biCompression; + // DWORD biSizeImage; + // LONG biXPelsPerMeter; + // LONG biYPelsPerMeter; + // DWORD biClrUsed; + // DWORD biClrImportant; + // } BITMAPINFOHEADER, *PBITMAPINFOHEADER; + // + var BITMAPINFOHEADER = [ + // DWORD biSize -- The number of bytes required by the structure + 40, 0, 0, 0, + // LONG biWidth -- The width of the bitmap, in pixels + biWidth & 0xff, biWidth >> 8 & 0xff, biWidth >> 16 & 0xff, biWidth >> 24 & 0xff, + // LONG biHeight -- The height of the bitmap, in pixels + biHeight & 0xff, biHeight >> 8 & 0xff, biHeight >> 16 & 0xff, biHeight >> 24 & 0xff, + // WORD biPlanes -- The number of planes for the target device. This value must be set to 1 + 1, 0, + // WORD biBitCount -- The number of bits-per-pixel, 24 bits-per-pixel -- the bitmap + // has a maximum of 2^24 colors (16777216, Truecolor) + 24, 0, + // DWORD biCompression -- The type of compression, BI_RGB (code 0) -- uncompressed + 0, 0, 0, 0, + // DWORD biSizeImage -- The size, in bytes, of the image. This may be set to zero for BI_RGB bitmaps + biSizeImage & 0xff, biSizeImage >> 8 & 0xff, biSizeImage >> 16 & 0xff, biSizeImage >> 24 & 0xff, + // LONG biXPelsPerMeter, unused + 0, 0, 0, 0, + // LONG biYPelsPerMeter, unused + 0, 0, 0, 0, + // DWORD biClrUsed, the number of color indexes of palette, unused + 0, 0, 0, 0, + // DWORD biClrImportant, unused + 0, 0, 0, 0 + ]; + + var iPadding = (4 - ((biWidth * 3) % 4)) % 4; + + var aImgData = oData.data; + + var strPixelData = ''; + var biWidth4 = biWidth << 2; + var y = biHeight; + var fromCharCode = String.fromCharCode; + + do { + var iOffsetY = biWidth4 * (y - 1); + var strPixelRow = ''; + for (var x = 0; x < biWidth; x++) { + var iOffsetX = x << 2; + strPixelRow += fromCharCode(aImgData[iOffsetY + iOffsetX + 2]) + + fromCharCode(aImgData[iOffsetY + iOffsetX + 1]) + + fromCharCode(aImgData[iOffsetY + iOffsetX]); + } + + for (var c = 0; c < iPadding; c++) { + strPixelRow += String.fromCharCode(0); + } + + strPixelData += strPixelRow; + } while (--y) + + var strEncoded = encodeData(BITMAPFILEHEADER.concat(BITMAPINFOHEADER)) + encodeData(strPixelData); + + return strEncoded + } + + /** + * 转换为图片base64 + * @param canvasId canvas标识 + * @param x 将要被提取的图像数据矩形区域的左上角 x 坐标 + * @param y 将要被提取的图像数据矩形区域的左上角 y 坐标 + * @param width 将要被提取的图像数据矩形区域的宽度 + * @param height 将要被提取的图像数据矩形区域的高度 + * @param type 转换图片类型 + * @param done 完成回调 + */ + function convertToImage(canvasId, x, y, width, height, type, done) { + if (done === void 0) done = function() {}; + + if (type === undefined) { + type = 'png'; + } + type = fixType(type); + if (/bmp/.test(type)) { + getImageData(canvasId, x, y, width, height, function(data, err) { + var strData = genBitmapImage(data); + tools_7(done) && done(makeURI(strData, 'image/' + type), err); + }); + } else { + console.error('暂不支持生成\'' + type + '\'类型的base64图片'); + } + } + + var CanvasToBase64 = { + convertToImage: convertToImage, + // convertToPNG: function (width, height, done) { + // return convertToImage(width, height, 'png', done) + // }, + // convertToJPEG: function (width, height, done) { + // return convertToImage(width, height, 'jpeg', done) + // }, + // convertToGIF: function (width, height, done) { + // return convertToImage(width, height, 'gif', done) + // }, + convertToBMP: function(ref, done) { + if (ref === void 0) ref = {}; + var canvasId = ref.canvasId; + var x = ref.x; + var y = ref.y; + var width = ref.width; + var height = ref.height; + if (done === void 0) done = function() {}; + + return convertToImage(canvasId, x, y, width, height, 'bmp', done) + } + }; + + function methods() { + var self = this; + + var boundWidth = self.width; // 裁剪框默认宽度,即整个画布宽度 + var boundHeight = self.height; // 裁剪框默认高度,即整个画布高度 + + var id = self.id; + var targetId = self.targetId; + var pixelRatio = self.pixelRatio; + + var ref = self.cut; + var x = ref.x; + if (x === void 0) x = 0; + var y = ref.y; + if (y === void 0) y = 0; + var width = ref.width; + if (width === void 0) width = boundWidth; + var height = ref.height; + if (height === void 0) height = boundHeight; + + self.updateCanvas = function(done) { + if (self.croperTarget) { + // 画布绘制图片 + self.ctx.drawImage( + self.croperTarget, + self.imgLeft, + self.imgTop, + self.scaleWidth, + self.scaleHeight + ); + } + tools_7(self.onBeforeDraw) && self.onBeforeDraw(self.ctx, self); + + self.setBoundStyle(self.boundStyle); // 设置边界样式 + + self.ctx.draw(false, done); + return self + }; + + self.pushOrigin = self.pushOrign = function(src) { + self.src = src; + + tools_7(self.onBeforeImageLoad) && self.onBeforeImageLoad(self.ctx, self); + + return getImageInfo({ + src: src + }) + .then(function(res) { + var innerAspectRadio = res.width / res.height; + var customAspectRadio = width / height; + + self.croperTarget = res.path; + + if (innerAspectRadio < customAspectRadio) { + self.rectX = x; + self.baseWidth = width; + self.baseHeight = width / innerAspectRadio; + self.rectY = y - Math.abs((height - self.baseHeight) / 2); + } else { + self.rectY = y; + self.baseWidth = height * innerAspectRadio; + self.baseHeight = height; + self.rectX = x - Math.abs((width - self.baseWidth) / 2); + } + + self.imgLeft = self.rectX; + self.imgTop = self.rectY; + self.scaleWidth = self.baseWidth; + self.scaleHeight = self.baseHeight; + + self.update(); + + return new Promise(function(resolve) { + self.updateCanvas(resolve); + }) + }) + .then(function() { + tools_7(self.onImageLoad) && self.onImageLoad(self.ctx, self); + }) + }; + + self.removeImage = function() { + self.src = ''; + self.croperTarget = ''; + return draw(self.ctx) + }; + + self.getCropperBase64 = function(done) { + if (done === void 0) done = function() {}; + + CanvasToBase64.convertToBMP({ + canvasId: id, + x: x, + y: y, + width: width, + height: height + }, done); + }; + + self.getCropperImage = function(opt, fn) { + var customOptions = opt; + + var canvasOptions = { + canvasId: id, + x: x, + y: y, + width: width, + height: height + }; + + var task = function() { + return Promise.resolve(); + }; + + if ( + tools_10(customOptions) && + customOptions.original + ) { + // original mode + task = function() { + self.targetCtx.drawImage( + self.croperTarget, + self.imgLeft * pixelRatio, + self.imgTop * pixelRatio, + self.scaleWidth * pixelRatio, + self.scaleHeight * pixelRatio + ); + + canvasOptions = { + canvasId: targetId, + x: x * pixelRatio, + y: y * pixelRatio, + width: width * pixelRatio, + height: height * pixelRatio + }; + + return draw(self.targetCtx) + }; + } + + return task() + .then(function() { + if (tools_10(customOptions)) { + canvasOptions = Object.assign({}, canvasOptions, customOptions); + } + + if (tools_7(customOptions)) { + fn = customOptions; + } + + var arg = canvasOptions.componentContext ? + [canvasOptions, canvasOptions.componentContext] : + [canvasOptions]; + + return canvasToTempFilePath.apply(null, arg) + }) + .then(function(res) { + var tempFilePath = res.tempFilePath; + + return tools_7(fn) ? + fn.call(self, tempFilePath, null) : + tempFilePath + }) + .catch(function(err) { + if (tools_7(fn)) { + fn.call(self, null, err); + } else { + throw err + } + }) + }; + } + + /** + * 获取最新缩放值 + * @param oldScale 上一次触摸结束后的缩放值 + * @param oldDistance 上一次触摸结束后的双指距离 + * @param zoom 缩放系数 + * @param touch0 第一指touch对象 + * @param touch1 第二指touch对象 + * @returns {*} + */ + var getNewScale = function(oldScale, oldDistance, zoom, touch0, touch1) { + var xMove, yMove, newDistance; + // 计算二指最新距离 + xMove = Math.round(touch1.x - touch0.x); + yMove = Math.round(touch1.y - touch0.y); + newDistance = Math.round(Math.sqrt(xMove * xMove + yMove * yMove)); + + return oldScale + 0.001 * zoom * (newDistance - oldDistance) + }; + + function update() { + var self = this; + + if (!self.src) { + return + } + + self.__oneTouchStart = function(touch) { + self.touchX0 = Math.round(touch.x); + self.touchY0 = Math.round(touch.y); + }; + + self.__oneTouchMove = function(touch) { + var xMove, yMove; + // 计算单指移动的距离 + if (self.touchended) { + return self.updateCanvas() + } + xMove = Math.round(touch.x - self.touchX0); + yMove = Math.round(touch.y - self.touchY0); + + var imgLeft = Math.round(self.rectX + xMove); + var imgTop = Math.round(self.rectY + yMove); + + self.outsideBound(imgLeft, imgTop); + + self.updateCanvas(); + }; + + self.__twoTouchStart = function(touch0, touch1) { + var xMove, yMove, oldDistance; + + self.touchX1 = Math.round(self.rectX + self.scaleWidth / 2); + self.touchY1 = Math.round(self.rectY + self.scaleHeight / 2); + + // 计算两指距离 + xMove = Math.round(touch1.x - touch0.x); + yMove = Math.round(touch1.y - touch0.y); + oldDistance = Math.round(Math.sqrt(xMove * xMove + yMove * yMove)); + + self.oldDistance = oldDistance; + }; + + self.__twoTouchMove = function(touch0, touch1) { + var oldScale = self.oldScale; + var oldDistance = self.oldDistance; + var scale = self.scale; + var zoom = self.zoom; + + self.newScale = getNewScale(oldScale, oldDistance, zoom, touch0, touch1); + + // 设定缩放范围 + self.newScale <= 1 && (self.newScale = 1); + self.newScale >= scale && (self.newScale = scale); + + self.scaleWidth = Math.round(self.newScale * self.baseWidth); + self.scaleHeight = Math.round(self.newScale * self.baseHeight); + var imgLeft = Math.round(self.touchX1 - self.scaleWidth / 2); + var imgTop = Math.round(self.touchY1 - self.scaleHeight / 2); + + self.outsideBound(imgLeft, imgTop); + + self.updateCanvas(); + }; + + self.__xtouchEnd = function() { + self.oldScale = self.newScale; + self.rectX = self.imgLeft; + self.rectY = self.imgTop; + }; + } + + var handle = { + // 图片手势初始监测 + touchStart: function touchStart(e) { + var self = this; + var ref = e.touches; + var touch0 = ref[0]; + var touch1 = ref[1]; + + if (!self.src) { + return + } + + setTouchState(self, true, null, null); + + // 计算第一个触摸点的位置,并参照改点进行缩放 + self.__oneTouchStart(touch0); + + // 两指手势触发 + if (e.touches.length >= 2) { + self.__twoTouchStart(touch0, touch1); + } + }, + + // 图片手势动态缩放 + touchMove: function touchMove(e) { + var self = this; + var ref = e.touches; + var touch0 = ref[0]; + var touch1 = ref[1]; + + if (!self.src) { + return + } + + setTouchState(self, null, true); + + // 单指手势时触发 + if (e.touches.length === 1) { + self.__oneTouchMove(touch0); + } + // 两指手势触发 + if (e.touches.length >= 2) { + self.__twoTouchMove(touch0, touch1); + } + }, + + touchEnd: function touchEnd(e) { + var self = this; + + if (!self.src) { + return + } + + setTouchState(self, false, false, true); + self.__xtouchEnd(); + } + }; + + function cut() { + var self = this; + var boundWidth = self.width; // 裁剪框默认宽度,即整个画布宽度 + var boundHeight = self.height; + // 裁剪框默认高度,即整个画布高度 + var ref = self.cut; + var x = ref.x; + if (x === void 0) x = 0; + var y = ref.y; + if (y === void 0) y = 0; + var width = ref.width; + if (width === void 0) width = boundWidth; + var height = ref.height; + if (height === void 0) height = boundHeight; + + /** + * 设置边界 + * @param imgLeft 图片左上角横坐标值 + * @param imgTop 图片左上角纵坐标值 + */ + self.outsideBound = function(imgLeft, imgTop) { + self.imgLeft = imgLeft >= x ? + x : + self.scaleWidth + imgLeft - x <= width ? + x + width - self.scaleWidth : + imgLeft; + + self.imgTop = imgTop >= y ? + y : + self.scaleHeight + imgTop - y <= height ? + y + height - self.scaleHeight : + imgTop; + }; + + /** + * 设置边界样式 + * @param color 边界颜色 + */ + self.setBoundStyle = function(ref) { + if (ref === void 0) ref = {}; + var color = ref.color; + if (color === void 0) color = '#04b00f'; + var mask = ref.mask; + if (mask === void 0) mask = 'rgba(0, 0, 0, 0.3)'; + var lineWidth = ref.lineWidth; + if (lineWidth === void 0) lineWidth = 1; + + var half = lineWidth / 2; + var boundOption = [{ + start: { + x: x - half, + y: y + 10 - half + }, + step1: { + x: x - half, + y: y - half + }, + step2: { + x: x + 10 - half, + y: y - half + } + }, + { + start: { + x: x - half, + y: y + height - 10 + half + }, + step1: { + x: x - half, + y: y + height + half + }, + step2: { + x: x + 10 - half, + y: y + height + half + } + }, + { + start: { + x: x + width - 10 + half, + y: y - half + }, + step1: { + x: x + width + half, + y: y - half + }, + step2: { + x: x + width + half, + y: y + 10 - half + } + }, + { + start: { + x: x + width + half, + y: y + height - 10 + half + }, + step1: { + x: x + width + half, + y: y + height + half + }, + step2: { + x: x + width - 10 + half, + y: y + height + half + } + } + ]; + + // 绘制半透明层 + self.ctx.beginPath(); + self.ctx.setFillStyle(mask); + self.ctx.fillRect(0, 0, x, boundHeight); + self.ctx.fillRect(x, 0, width, y); + self.ctx.fillRect(x, y + height, width, boundHeight - y - height); + self.ctx.fillRect(x + width, 0, boundWidth - x - width, boundHeight); + self.ctx.fill(); + + boundOption.forEach(function(op) { + self.ctx.beginPath(); + self.ctx.setStrokeStyle(color); + self.ctx.setLineWidth(lineWidth); + self.ctx.moveTo(op.start.x, op.start.y); + self.ctx.lineTo(op.step1.x, op.step1.y); + self.ctx.lineTo(op.step2.x, op.step2.y); + self.ctx.stroke(); + }); + }; + } + + var version = "1.3.9"; + + var WeCropper = function WeCropper(params) { + var self = this; + var _default = {}; + + validator(self, DEFAULT); + + Object.keys(DEFAULT).forEach(function(key) { + _default[key] = DEFAULT[key].default; + }); + Object.assign(self, _default, params); + + self.prepare(); + self.attachPage(); + self.createCtx(); + self.observer(); + self.cutt(); + self.methods(); + self.init(); + self.update(); + + return self + }; + + WeCropper.prototype.init = function init() { + var self = this; + var src = self.src; + + self.version = version; + + typeof self.onReady === 'function' && self.onReady(self.ctx, self); + + if (src) { + self.pushOrign(src); + } else { + self.updateCanvas(); + } + setTouchState(self, false, false, false); + + self.oldScale = 1; + self.newScale = 1; + + return self + }; + + Object.assign(WeCropper.prototype, handle); + + WeCropper.prototype.prepare = prepare; + WeCropper.prototype.observer = observer; + WeCropper.prototype.methods = methods; + WeCropper.prototype.cutt = cut; + WeCropper.prototype.update = update; + + return WeCropper; + +}))); diff --git a/uview-ui/components/u-avatar/u-avatar.vue b/uview-ui/components/u-avatar/u-avatar.vue new file mode 100644 index 00000000..bad24310 --- /dev/null +++ b/uview-ui/components/u-avatar/u-avatar.vue @@ -0,0 +1,241 @@ + + + + + diff --git a/uview-ui/components/u-back-top/u-back-top.vue b/uview-ui/components/u-back-top/u-back-top.vue new file mode 100644 index 00000000..6ac2ae5c --- /dev/null +++ b/uview-ui/components/u-back-top/u-back-top.vue @@ -0,0 +1,153 @@ + + + + + diff --git a/uview-ui/components/u-badge/u-badge.vue b/uview-ui/components/u-badge/u-badge.vue new file mode 100644 index 00000000..e1458318 --- /dev/null +++ b/uview-ui/components/u-badge/u-badge.vue @@ -0,0 +1,213 @@ + + + + + \ No newline at end of file diff --git a/uview-ui/components/u-button/u-button.vue b/uview-ui/components/u-button/u-button.vue new file mode 100644 index 00000000..2584fff1 --- /dev/null +++ b/uview-ui/components/u-button/u-button.vue @@ -0,0 +1,576 @@ + + + + + diff --git a/uview-ui/components/u-calendar/u-calendar.vue b/uview-ui/components/u-calendar/u-calendar.vue new file mode 100644 index 00000000..7582cae5 --- /dev/null +++ b/uview-ui/components/u-calendar/u-calendar.vue @@ -0,0 +1,641 @@ + + + + \ No newline at end of file diff --git a/uview-ui/components/u-car-keyboard/u-car-keyboard.vue b/uview-ui/components/u-car-keyboard/u-car-keyboard.vue new file mode 100644 index 00000000..12d47123 --- /dev/null +++ b/uview-ui/components/u-car-keyboard/u-car-keyboard.vue @@ -0,0 +1,254 @@ + + + + + diff --git a/uview-ui/components/u-card/u-card.vue b/uview-ui/components/u-card/u-card.vue new file mode 100644 index 00000000..47a6672d --- /dev/null +++ b/uview-ui/components/u-card/u-card.vue @@ -0,0 +1,291 @@ + + + + + diff --git a/uview-ui/components/u-cell-group/u-cell-group.vue b/uview-ui/components/u-cell-group/u-cell-group.vue new file mode 100644 index 00000000..0d40b523 --- /dev/null +++ b/uview-ui/components/u-cell-group/u-cell-group.vue @@ -0,0 +1,69 @@ + + + + + diff --git a/uview-ui/components/u-cell-item/u-cell-item.vue b/uview-ui/components/u-cell-item/u-cell-item.vue new file mode 100644 index 00000000..1231ff75 --- /dev/null +++ b/uview-ui/components/u-cell-item/u-cell-item.vue @@ -0,0 +1,300 @@ + + + + + diff --git a/uview-ui/components/u-checkbox-group/u-checkbox-group.vue b/uview-ui/components/u-checkbox-group/u-checkbox-group.vue new file mode 100644 index 00000000..e1631249 --- /dev/null +++ b/uview-ui/components/u-checkbox-group/u-checkbox-group.vue @@ -0,0 +1,122 @@ + + + + + diff --git a/uview-ui/components/u-checkbox/u-checkbox.vue b/uview-ui/components/u-checkbox/u-checkbox.vue new file mode 100644 index 00000000..214d03f1 --- /dev/null +++ b/uview-ui/components/u-checkbox/u-checkbox.vue @@ -0,0 +1,275 @@ + + + + + diff --git a/uview-ui/components/u-circle-progress/u-circle-progress.vue b/uview-ui/components/u-circle-progress/u-circle-progress.vue new file mode 100644 index 00000000..4534bc80 --- /dev/null +++ b/uview-ui/components/u-circle-progress/u-circle-progress.vue @@ -0,0 +1,218 @@ + + + + + diff --git a/uview-ui/components/u-col/u-col.vue b/uview-ui/components/u-col/u-col.vue new file mode 100644 index 00000000..96fb2941 --- /dev/null +++ b/uview-ui/components/u-col/u-col.vue @@ -0,0 +1,135 @@ + + + + + diff --git a/uview-ui/components/u-collapse-item/u-collapse-item.vue b/uview-ui/components/u-collapse-item/u-collapse-item.vue new file mode 100644 index 00000000..a83f2053 --- /dev/null +++ b/uview-ui/components/u-collapse-item/u-collapse-item.vue @@ -0,0 +1,206 @@ + + + + + diff --git a/uview-ui/components/u-collapse/u-collapse.vue b/uview-ui/components/u-collapse/u-collapse.vue new file mode 100644 index 00000000..1d86c853 --- /dev/null +++ b/uview-ui/components/u-collapse/u-collapse.vue @@ -0,0 +1,104 @@ + + + + + diff --git a/uview-ui/components/u-column-notice/u-column-notice.vue b/uview-ui/components/u-column-notice/u-column-notice.vue new file mode 100644 index 00000000..953d7728 --- /dev/null +++ b/uview-ui/components/u-column-notice/u-column-notice.vue @@ -0,0 +1,233 @@ + + + + + diff --git a/uview-ui/components/u-count-down/u-count-down.vue b/uview-ui/components/u-count-down/u-count-down.vue new file mode 100644 index 00000000..37ca28b5 --- /dev/null +++ b/uview-ui/components/u-count-down/u-count-down.vue @@ -0,0 +1,307 @@ + + + + + diff --git a/uview-ui/components/u-count-to/u-count-to.vue b/uview-ui/components/u-count-to/u-count-to.vue new file mode 100644 index 00000000..f4655ddd --- /dev/null +++ b/uview-ui/components/u-count-to/u-count-to.vue @@ -0,0 +1,239 @@ + + + + + diff --git a/uview-ui/components/u-divider/u-divider.vue b/uview-ui/components/u-divider/u-divider.vue new file mode 100644 index 00000000..d877c065 --- /dev/null +++ b/uview-ui/components/u-divider/u-divider.vue @@ -0,0 +1,151 @@ + + + + + diff --git a/uview-ui/components/u-dropdown-list/u-dropdown-list.vue b/uview-ui/components/u-dropdown-list/u-dropdown-list.vue new file mode 100644 index 00000000..1128940f --- /dev/null +++ b/uview-ui/components/u-dropdown-list/u-dropdown-list.vue @@ -0,0 +1,242 @@ + + + + + diff --git a/uview-ui/components/u-empty/u-empty.vue b/uview-ui/components/u-empty/u-empty.vue new file mode 100644 index 00000000..2c421506 --- /dev/null +++ b/uview-ui/components/u-empty/u-empty.vue @@ -0,0 +1,193 @@ + + + + + diff --git a/uview-ui/components/u-field/u-field.vue b/uview-ui/components/u-field/u-field.vue new file mode 100644 index 00000000..4c44c103 --- /dev/null +++ b/uview-ui/components/u-field/u-field.vue @@ -0,0 +1,378 @@ +