diff --git a/.gitignore b/.gitignore index b6e4761..51bf6dc 100644 --- a/.gitignore +++ b/.gitignore @@ -1,129 +1,15 @@ -# Byte-compiled / optimized / DLL files -__pycache__/ -*.py[cod] -*$py.class -# C extensions -*.so - -# Distribution / packaging -.Python -build/ -develop-eggs/ -dist/ -downloads/ -eggs/ -.eggs/ -lib/ -lib64/ -parts/ -sdist/ -var/ -wheels/ -pip-wheel-metadata/ -share/python-wheels/ -*.egg-info/ -.installed.cfg -*.egg -MANIFEST - -# PyInstaller -# Usually these files are written by a python script from a template -# before PyInstaller builds the exe, so as to inject date/other infos into it. -*.manifest -*.spec - -# Installer logs -pip-log.txt -pip-delete-this-directory.txt - -# Unit test / coverage reports -htmlcov/ -.tox/ -.nox/ -.coverage -.coverage.* +# demo +script/ +.gitee/ +node_modules .cache -nosetests.xml -coverage.xml -*.cover -*.py,cover -.hypothesis/ -.pytest_cache/ - -# Translations -*.mo -*.pot - -# Django stuff: -*.log -local_settings.py -db.sqlite3 -db.sqlite3-journal - -# Flask stuff: -instance/ -.webassets-cache - -# Scrapy stuff: -.scrapy - -# Sphinx documentation -docs/_build/ - -# PyBuilder -target/ - -# Jupyter Notebook -.ipynb_checkpoints - -# IPython -profile_default/ -ipython_config.py - -# pyenv -.python-version - -# pipenv -# According to pypa/pipenv#598, it is recommended to include Pipfile.lock in version control. -# However, in case of collaboration, if having platform-specific dependencies or dependencies -# having no cross-platform support, pipenv may install dependencies that don't work, or not -# install all needed dependencies. -#Pipfile.lock - -# PEP 582; used by e.g. github.com/David-OConnor/pyflow -__pypackages__/ - -# Celery stuff -celerybeat-schedule -celerybeat.pid - -# SageMath parsed files -*.sage.py - -# Environments -.env -.venv -env/ +.temp venv/ -ENV/ -env.bak/ -venv.bak/ - -# Spyder project settings -.spyderproject -.spyproject - -# Rope project settings -.ropeproject - -# mkdocs documentation -/site +build/ +dist/ +*.egg-info +.idea/ -# mypy -.mypy_cache/ -.dmypy.json -dmypy.json -# Pyre type checker -.pyre/ +__pycache__ diff --git "a/10\343\200\201\347\224\250Python\347\224\273\344\270\200\344\270\252\346\234\210\351\245\274/main.py" "b/10\343\200\201\347\224\250Python\347\224\273\344\270\200\344\270\252\346\234\210\351\245\274/main.py" new file mode 100644 index 0000000..7fc1015 --- /dev/null +++ "b/10\343\200\201\347\224\250Python\347\224\273\344\270\200\344\270\252\346\234\210\351\245\274/main.py" @@ -0,0 +1,64 @@ +""" +如果报错:ModuleNotFoundError: No module named 'tkinter' +请按照视频说明进行操作:https://www.bilibili.com/video/BV18g411h7jJ +""" + +import turtle + + +def goto(x, y): # 定义提笔的位置 + turtle.penup() # 将笔提起,移动时无图 + turtle.goto(x, y) + turtle.pendown() # 将笔放下,移动时绘图。 + + +def yuebing_wai(): + turtle.pensize(20) # 画笔调粗点 + turtle.color("#F8CD32", "#FBA92D") # 填充颜色,F8CD32是圆圈的边缘颜色,FBA92D是圆圈的填充颜色 + goto(0, -200) # 画笔起点位于(0,0)点的下方200向量处 + turtle.begin_fill() # 准备开始填充 + turtle.circle(200) # 定义半径 + turtle.end_fill() # 填充结束 + + +def yuebing_zhong(): + goto(0, 0) # 画笔起点位于(0,0)处 + turtle.color("#F0BE7C") + for _ in range(20): # _是占位符,表示临时变量,仅用一次,后面无需再用到 + turtle.right(18) # 顺时针移动18度 + turtle.begin_fill() + turtle.forward(220) # 向前移动的距离 + turtle.circle(40, 180) # 上一条向前移动220之后,开始画半径40的半圆 + turtle.goto(0, 0) # 画完半圆之后回到(0,0) + turtle.right(360) # 顺时针转个360度 + turtle.end_fill() + + +def yuebing_nei(): # 逻辑同上 + turtle.right(360) + turtle.color('#F5E16F') # 内层颜色 + goto(0, -180) + for _ in range(12): + turtle.begin_fill() + turtle.circle(60, 120) + turtle.left(180) + turtle.circle(60, 120) + turtle.end_fill() + + +def fu(): # + turtle.right(50) + goto(-70, -80) # 更高坐标尽量使字靠中间 + turtle.color("Gold") # 颜色 + turtle.write("福", font=("华文隶书", 120, "bold")) + turtle.done() + + +if __name__ == '__main__': + turtle.speed(90) + yuebing_zhong() + yuebing_wai() + yuebing_nei() + fu() + +turtle.done() diff --git "a/11\343\200\201python\345\210\244\346\226\255\345\237\272\351\207\221\350\203\275\344\271\260\345\220\227\357\274\237/readme.md" "b/11\343\200\201python\345\210\244\346\226\255\345\237\272\351\207\221\350\203\275\344\271\260\345\220\227\357\274\237/readme.md" new file mode 100644 index 0000000..f1d9eea --- /dev/null +++ "b/11\343\200\201python\345\210\244\346\226\255\345\237\272\351\207\221\350\203\275\344\271\260\345\220\227\357\274\237/readme.md" @@ -0,0 +1 @@ +源码链接,点我直达:[你绿了吗?用Python判断基金是否值得购买,网友:早知道就好了!](https://mp.weixin.qq.com/s/5ThRmiXpiueRg14bCH6vZQ) \ No newline at end of file diff --git "a/13\343\200\201python\346\212\242\350\214\205\345\217\260/LICENSE" "b/13\343\200\201python\346\212\242\350\214\205\345\217\260/LICENSE" new file mode 100644 index 0000000..f288702 --- /dev/null +++ "b/13\343\200\201python\346\212\242\350\214\205\345\217\260/LICENSE" @@ -0,0 +1,674 @@ + GNU GENERAL PUBLIC LICENSE + Version 3, 29 June 2007 + + Copyright (C) 2007 Free Software Foundation, Inc. + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + + Preamble + + The GNU General Public License is a free, copyleft license for +software and other kinds of works. + + The licenses for most software and other practical works are designed +to take away your freedom to share and change the works. By contrast, +the GNU General Public License is intended to guarantee your freedom to +share and change all versions of a program--to make sure it remains free +software for all its users. We, the Free Software Foundation, use the +GNU General Public License for most of our software; it applies also to +any other work released this way by its authors. You can apply it to +your programs, too. + + When we speak of free software, we are referring to freedom, not +price. Our General Public Licenses are designed to make sure that you +have the freedom to distribute copies of free software (and charge for +them if you wish), that you receive source code or can get it if you +want it, that you can change the software or use pieces of it in new +free programs, and that you know you can do these things. + + To protect your rights, we need to prevent others from denying you +these rights or asking you to surrender the rights. Therefore, you have +certain responsibilities if you distribute copies of the software, or if +you modify it: responsibilities to respect the freedom of others. + + For example, if you distribute copies of such a program, whether +gratis or for a fee, you must pass on to the recipients the same +freedoms that you received. You must make sure that they, too, receive +or can get the source code. And you must show them these terms so they +know their rights. + + Developers that use the GNU GPL protect your rights with two steps: +(1) assert copyright on the software, and (2) offer you this License +giving you legal permission to copy, distribute and/or modify it. + + For the developers' and authors' protection, the GPL clearly explains +that there is no warranty for this free software. For both users' and +authors' sake, the GPL requires that modified versions be marked as +changed, so that their problems will not be attributed erroneously to +authors of previous versions. + + Some devices are designed to deny users access to install or run +modified versions of the software inside them, although the manufacturer +can do so. This is fundamentally incompatible with the aim of +protecting users' freedom to change the software. The systematic +pattern of such abuse occurs in the area of products for individuals to +use, which is precisely where it is most unacceptable. Therefore, we +have designed this version of the GPL to prohibit the practice for those +products. If such problems arise substantially in other domains, we +stand ready to extend this provision to those domains in future versions +of the GPL, as needed to protect the freedom of users. + + Finally, every program is threatened constantly by software patents. +States should not allow patents to restrict development and use of +software on general-purpose computers, but in those that do, we wish to +avoid the special danger that patents applied to a free program could +make it effectively proprietary. To prevent this, the GPL assures that +patents cannot be used to render the program non-free. + + The precise terms and conditions for copying, distribution and +modification follow. + + TERMS AND CONDITIONS + + 0. Definitions. + + "This License" refers to version 3 of the GNU General Public License. + + "Copyright" also means copyright-like laws that apply to other kinds of +works, such as semiconductor masks. + + "The Program" refers to any copyrightable work licensed under this +License. Each licensee is addressed as "you". "Licensees" and +"recipients" may be individuals or organizations. + + To "modify" a work means to copy from or adapt all or part of the work +in a fashion requiring copyright permission, other than the making of an +exact copy. The resulting work is called a "modified version" of the +earlier work or a work "based on" the earlier work. + + A "covered work" means either the unmodified Program or a work based +on the Program. + + To "propagate" a work means to do anything with it that, without +permission, would make you directly or secondarily liable for +infringement under applicable copyright law, except executing it on a +computer or modifying a private copy. Propagation includes copying, +distribution (with or without modification), making available to the +public, and in some countries other activities as well. + + To "convey" a work means any kind of propagation that enables other +parties to make or receive copies. Mere interaction with a user through +a computer network, with no transfer of a copy, is not conveying. + + An interactive user interface displays "Appropriate Legal Notices" +to the extent that it includes a convenient and prominently visible +feature that (1) displays an appropriate copyright notice, and (2) +tells the user that there is no warranty for the work (except to the +extent that warranties are provided), that licensees may convey the +work under this License, and how to view a copy of this License. If +the interface presents a list of user commands or options, such as a +menu, a prominent item in the list meets this criterion. + + 1. Source Code. + + The "source code" for a work means the preferred form of the work +for making modifications to it. "Object code" means any non-source +form of a work. + + A "Standard Interface" means an interface that either is an official +standard defined by a recognized standards body, or, in the case of +interfaces specified for a particular programming language, one that +is widely used among developers working in that language. + + The "System Libraries" of an executable work include anything, other +than the work as a whole, that (a) is included in the normal form of +packaging a Major Component, but which is not part of that Major +Component, and (b) serves only to enable use of the work with that +Major Component, or to implement a Standard Interface for which an +implementation is available to the public in source code form. A +"Major Component", in this context, means a major essential component +(kernel, window system, and so on) of the specific operating system +(if any) on which the executable work runs, or a compiler used to +produce the work, or an object code interpreter used to run it. + + The "Corresponding Source" for a work in object code form means all +the source code needed to generate, install, and (for an executable +work) run the object code and to modify the work, including scripts to +control those activities. However, it does not include the work's +System Libraries, or general-purpose tools or generally available free +programs which are used unmodified in performing those activities but +which are not part of the work. For example, Corresponding Source +includes interface definition files associated with source files for +the work, and the source code for shared libraries and dynamically +linked subprograms that the work is specifically designed to require, +such as by intimate data communication or control flow between those +subprograms and other parts of the work. + + The Corresponding Source need not include anything that users +can regenerate automatically from other parts of the Corresponding +Source. + + The Corresponding Source for a work in source code form is that +same work. + + 2. Basic Permissions. + + All rights granted under this License are granted for the term of +copyright on the Program, and are irrevocable provided the stated +conditions are met. This License explicitly affirms your unlimited +permission to run the unmodified Program. The output from running a +covered work is covered by this License only if the output, given its +content, constitutes a covered work. This License acknowledges your +rights of fair use or other equivalent, as provided by copyright law. + + You may make, run and propagate covered works that you do not +convey, without conditions so long as your license otherwise remains +in force. You may convey covered works to others for the sole purpose +of having them make modifications exclusively for you, or provide you +with facilities for running those works, provided that you comply with +the terms of this License in conveying all material for which you do +not control copyright. Those thus making or running the covered works +for you must do so exclusively on your behalf, under your direction +and control, on terms that prohibit them from making any copies of +your copyrighted material outside their relationship with you. + + Conveying under any other circumstances is permitted solely under +the conditions stated below. Sublicensing is not allowed; section 10 +makes it unnecessary. + + 3. Protecting Users' Legal Rights From Anti-Circumvention Law. + + No covered work shall be deemed part of an effective technological +measure under any applicable law fulfilling obligations under article +11 of the WIPO copyright treaty adopted on 20 December 1996, or +similar laws prohibiting or restricting circumvention of such +measures. + + When you convey a covered work, you waive any legal power to forbid +circumvention of technological measures to the extent such circumvention +is effected by exercising rights under this License with respect to +the covered work, and you disclaim any intention to limit operation or +modification of the work as a means of enforcing, against the work's +users, your or third parties' legal rights to forbid circumvention of +technological measures. + + 4. Conveying Verbatim Copies. + + You may convey verbatim copies of the Program's source code as you +receive it, in any medium, provided that you conspicuously and +appropriately publish on each copy an appropriate copyright notice; +keep intact all notices stating that this License and any +non-permissive terms added in accord with section 7 apply to the code; +keep intact all notices of the absence of any warranty; and give all +recipients a copy of this License along with the Program. + + You may charge any price or no price for each copy that you convey, +and you may offer support or warranty protection for a fee. + + 5. Conveying Modified Source Versions. + + You may convey a work based on the Program, or the modifications to +produce it from the Program, in the form of source code under the +terms of section 4, provided that you also meet all of these conditions: + + a) The work must carry prominent notices stating that you modified + it, and giving a relevant date. + + b) The work must carry prominent notices stating that it is + released under this License and any conditions added under section + 7. This requirement modifies the requirement in section 4 to + "keep intact all notices". + + c) You must license the entire work, as a whole, under this + License to anyone who comes into possession of a copy. This + License will therefore apply, along with any applicable section 7 + additional terms, to the whole of the work, and all its parts, + regardless of how they are packaged. This License gives no + permission to license the work in any other way, but it does not + invalidate such permission if you have separately received it. + + d) If the work has interactive user interfaces, each must display + Appropriate Legal Notices; however, if the Program has interactive + interfaces that do not display Appropriate Legal Notices, your + work need not make them do so. + + A compilation of a covered work with other separate and independent +works, which are not by their nature extensions of the covered work, +and which are not combined with it such as to form a larger program, +in or on a volume of a storage or distribution medium, is called an +"aggregate" if the compilation and its resulting copyright are not +used to limit the access or legal rights of the compilation's users +beyond what the individual works permit. Inclusion of a covered work +in an aggregate does not cause this License to apply to the other +parts of the aggregate. + + 6. Conveying Non-Source Forms. + + You may convey a covered work in object code form under the terms +of sections 4 and 5, provided that you also convey the +machine-readable Corresponding Source under the terms of this License, +in one of these ways: + + a) Convey the object code in, or embodied in, a physical product + (including a physical distribution medium), accompanied by the + Corresponding Source fixed on a durable physical medium + customarily used for software interchange. + + b) Convey the object code in, or embodied in, a physical product + (including a physical distribution medium), accompanied by a + written offer, valid for at least three years and valid for as + long as you offer spare parts or customer support for that product + model, to give anyone who possesses the object code either (1) a + copy of the Corresponding Source for all the software in the + product that is covered by this License, on a durable physical + medium customarily used for software interchange, for a price no + more than your reasonable cost of physically performing this + conveying of source, or (2) access to copy the + Corresponding Source from a network server at no charge. + + c) Convey individual copies of the object code with a copy of the + written offer to provide the Corresponding Source. This + alternative is allowed only occasionally and noncommercially, and + only if you received the object code with such an offer, in accord + with subsection 6b. + + d) Convey the object code by offering access from a designated + place (gratis or for a charge), and offer equivalent access to the + Corresponding Source in the same way through the same place at no + further charge. You need not require recipients to copy the + Corresponding Source along with the object code. If the place to + copy the object code is a network server, the Corresponding Source + may be on a different server (operated by you or a third party) + that supports equivalent copying facilities, provided you maintain + clear directions next to the object code saying where to find the + Corresponding Source. Regardless of what server hosts the + Corresponding Source, you remain obligated to ensure that it is + available for as long as needed to satisfy these requirements. + + e) Convey the object code using peer-to-peer transmission, provided + you inform other peers where the object code and Corresponding + Source of the work are being offered to the general public at no + charge under subsection 6d. + + A separable portion of the object code, whose source code is excluded +from the Corresponding Source as a System Library, need not be +included in conveying the object code work. + + A "User Product" is either (1) a "consumer product", which means any +tangible personal property which is normally used for personal, family, +or household purposes, or (2) anything designed or sold for incorporation +into a dwelling. In determining whether a product is a consumer product, +doubtful cases shall be resolved in favor of coverage. For a particular +product received by a particular user, "normally used" refers to a +typical or common use of that class of product, regardless of the status +of the particular user or of the way in which the particular user +actually uses, or expects or is expected to use, the product. A product +is a consumer product regardless of whether the product has substantial +commercial, industrial or non-consumer uses, unless such uses represent +the only significant mode of use of the product. + + "Installation Information" for a User Product means any methods, +procedures, authorization keys, or other information required to install +and execute modified versions of a covered work in that User Product from +a modified version of its Corresponding Source. The information must +suffice to ensure that the continued functioning of the modified object +code is in no case prevented or interfered with solely because +modification has been made. + + If you convey an object code work under this section in, or with, or +specifically for use in, a User Product, and the conveying occurs as +part of a transaction in which the right of possession and use of the +User Product is transferred to the recipient in perpetuity or for a +fixed term (regardless of how the transaction is characterized), the +Corresponding Source conveyed under this section must be accompanied +by the Installation Information. But this requirement does not apply +if neither you nor any third party retains the ability to install +modified object code on the User Product (for example, the work has +been installed in ROM). + + The requirement to provide Installation Information does not include a +requirement to continue to provide support service, warranty, or updates +for a work that has been modified or installed by the recipient, or for +the User Product in which it has been modified or installed. Access to a +network may be denied when the modification itself materially and +adversely affects the operation of the network or violates the rules and +protocols for communication across the network. + + Corresponding Source conveyed, and Installation Information provided, +in accord with this section must be in a format that is publicly +documented (and with an implementation available to the public in +source code form), and must require no special password or key for +unpacking, reading or copying. + + 7. Additional Terms. + + "Additional permissions" are terms that supplement the terms of this +License by making exceptions from one or more of its conditions. +Additional permissions that are applicable to the entire Program shall +be treated as though they were included in this License, to the extent +that they are valid under applicable law. If additional permissions +apply only to part of the Program, that part may be used separately +under those permissions, but the entire Program remains governed by +this License without regard to the additional permissions. + + When you convey a copy of a covered work, you may at your option +remove any additional permissions from that copy, or from any part of +it. (Additional permissions may be written to require their own +removal in certain cases when you modify the work.) You may place +additional permissions on material, added by you to a covered work, +for which you have or can give appropriate copyright permission. + + Notwithstanding any other provision of this License, for material you +add to a covered work, you may (if authorized by the copyright holders of +that material) supplement the terms of this License with terms: + + a) Disclaiming warranty or limiting liability differently from the + terms of sections 15 and 16 of this License; or + + b) Requiring preservation of specified reasonable legal notices or + author attributions in that material or in the Appropriate Legal + Notices displayed by works containing it; or + + c) Prohibiting misrepresentation of the origin of that material, or + requiring that modified versions of such material be marked in + reasonable ways as different from the original version; or + + d) Limiting the use for publicity purposes of names of licensors or + authors of the material; or + + e) Declining to grant rights under trademark law for use of some + trade names, trademarks, or service marks; or + + f) Requiring indemnification of licensors and authors of that + material by anyone who conveys the material (or modified versions of + it) with contractual assumptions of liability to the recipient, for + any liability that these contractual assumptions directly impose on + those licensors and authors. + + All other non-permissive additional terms are considered "further +restrictions" within the meaning of section 10. If the Program as you +received it, or any part of it, contains a notice stating that it is +governed by this License along with a term that is a further +restriction, you may remove that term. If a license document contains +a further restriction but permits relicensing or conveying under this +License, you may add to a covered work material governed by the terms +of that license document, provided that the further restriction does +not survive such relicensing or conveying. + + If you add terms to a covered work in accord with this section, you +must place, in the relevant source files, a statement of the +additional terms that apply to those files, or a notice indicating +where to find the applicable terms. + + Additional terms, permissive or non-permissive, may be stated in the +form of a separately written license, or stated as exceptions; +the above requirements apply either way. + + 8. Termination. + + You may not propagate or modify a covered work except as expressly +provided under this License. Any attempt otherwise to propagate or +modify it is void, and will automatically terminate your rights under +this License (including any patent licenses granted under the third +paragraph of section 11). + + However, if you cease all violation of this License, then your +license from a particular copyright holder is reinstated (a) +provisionally, unless and until the copyright holder explicitly and +finally terminates your license, and (b) permanently, if the copyright +holder fails to notify you of the violation by some reasonable means +prior to 60 days after the cessation. + + Moreover, your license from a particular copyright holder is +reinstated permanently if the copyright holder notifies you of the +violation by some reasonable means, this is the first time you have +received notice of violation of this License (for any work) from that +copyright holder, and you cure the violation prior to 30 days after +your receipt of the notice. + + Termination of your rights under this section does not terminate the +licenses of parties who have received copies or rights from you under +this License. If your rights have been terminated and not permanently +reinstated, you do not qualify to receive new licenses for the same +material under section 10. + + 9. Acceptance Not Required for Having Copies. + + You are not required to accept this License in order to receive or +run a copy of the Program. Ancillary propagation of a covered work +occurring solely as a consequence of using peer-to-peer transmission +to receive a copy likewise does not require acceptance. However, +nothing other than this License grants you permission to propagate or +modify any covered work. These actions infringe copyright if you do +not accept this License. Therefore, by modifying or propagating a +covered work, you indicate your acceptance of this License to do so. + + 10. Automatic Licensing of Downstream Recipients. + + Each time you convey a covered work, the recipient automatically +receives a license from the original licensors, to run, modify and +propagate that work, subject to this License. You are not responsible +for enforcing compliance by third parties with this License. + + An "entity transaction" is a transaction transferring control of an +organization, or substantially all assets of one, or subdividing an +organization, or merging organizations. If propagation of a covered +work results from an entity transaction, each party to that +transaction who receives a copy of the work also receives whatever +licenses to the work the party's predecessor in interest had or could +give under the previous paragraph, plus a right to possession of the +Corresponding Source of the work from the predecessor in interest, if +the predecessor has it or can get it with reasonable efforts. + + You may not impose any further restrictions on the exercise of the +rights granted or affirmed under this License. For example, you may +not impose a license fee, royalty, or other charge for exercise of +rights granted under this License, and you may not initiate litigation +(including a cross-claim or counterclaim in a lawsuit) alleging that +any patent claim is infringed by making, using, selling, offering for +sale, or importing the Program or any portion of it. + + 11. Patents. + + A "contributor" is a copyright holder who authorizes use under this +License of the Program or a work on which the Program is based. The +work thus licensed is called the contributor's "contributor version". + + A contributor's "essential patent claims" are all patent claims +owned or controlled by the contributor, whether already acquired or +hereafter acquired, that would be infringed by some manner, permitted +by this License, of making, using, or selling its contributor version, +but do not include claims that would be infringed only as a +consequence of further modification of the contributor version. For +purposes of this definition, "control" includes the right to grant +patent sublicenses in a manner consistent with the requirements of +this License. + + Each contributor grants you a non-exclusive, worldwide, royalty-free +patent license under the contributor's essential patent claims, to +make, use, sell, offer for sale, import and otherwise run, modify and +propagate the contents of its contributor version. + + In the following three paragraphs, a "patent license" is any express +agreement or commitment, however denominated, not to enforce a patent +(such as an express permission to practice a patent or covenant not to +sue for patent infringement). To "grant" such a patent license to a +party means to make such an agreement or commitment not to enforce a +patent against the party. + + If you convey a covered work, knowingly relying on a patent license, +and the Corresponding Source of the work is not available for anyone +to copy, free of charge and under the terms of this License, through a +publicly available network server or other readily accessible means, +then you must either (1) cause the Corresponding Source to be so +available, or (2) arrange to deprive yourself of the benefit of the +patent license for this particular work, or (3) arrange, in a manner +consistent with the requirements of this License, to extend the patent +license to downstream recipients. "Knowingly relying" means you have +actual knowledge that, but for the patent license, your conveying the +covered work in a country, or your recipient's use of the covered work +in a country, would infringe one or more identifiable patents in that +country that you have reason to believe are valid. + + If, pursuant to or in connection with a single transaction or +arrangement, you convey, or propagate by procuring conveyance of, a +covered work, and grant a patent license to some of the parties +receiving the covered work authorizing them to use, propagate, modify +or convey a specific copy of the covered work, then the patent license +you grant is automatically extended to all recipients of the covered +work and works based on it. + + A patent license is "discriminatory" if it does not include within +the scope of its coverage, prohibits the exercise of, or is +conditioned on the non-exercise of one or more of the rights that are +specifically granted under this License. You may not convey a covered +work if you are a party to an arrangement with a third party that is +in the business of distributing software, under which you make payment +to the third party based on the extent of your activity of conveying +the work, and under which the third party grants, to any of the +parties who would receive the covered work from you, a discriminatory +patent license (a) in connection with copies of the covered work +conveyed by you (or copies made from those copies), or (b) primarily +for and in connection with specific products or compilations that +contain the covered work, unless you entered into that arrangement, +or that patent license was granted, prior to 28 March 2007. + + Nothing in this License shall be construed as excluding or limiting +any implied license or other defenses to infringement that may +otherwise be available to you under applicable patent law. + + 12. No Surrender of Others' Freedom. + + If conditions are imposed on you (whether by court order, agreement or +otherwise) that contradict the conditions of this License, they do not +excuse you from the conditions of this License. If you cannot convey a +covered work so as to satisfy simultaneously your obligations under this +License and any other pertinent obligations, then as a consequence you may +not convey it at all. For example, if you agree to terms that obligate you +to collect a royalty for further conveying from those to whom you convey +the Program, the only way you could satisfy both those terms and this +License would be to refrain entirely from conveying the Program. + + 13. Use with the GNU Affero General Public License. + + Notwithstanding any other provision of this License, you have +permission to link or combine any covered work with a work licensed +under version 3 of the GNU Affero General Public License into a single +combined work, and to convey the resulting work. The terms of this +License will continue to apply to the part which is the covered work, +but the special requirements of the GNU Affero General Public License, +section 13, concerning interaction through a network will apply to the +combination as such. + + 14. Revised Versions of this License. + + The Free Software Foundation may publish revised and/or new versions of +the GNU General Public License from time to time. Such new versions will +be similar in spirit to the present version, but may differ in detail to +address new problems or concerns. + + Each version is given a distinguishing version number. If the +Program specifies that a certain numbered version of the GNU General +Public License "or any later version" applies to it, you have the +option of following the terms and conditions either of that numbered +version or of any later version published by the Free Software +Foundation. If the Program does not specify a version number of the +GNU General Public License, you may choose any version ever published +by the Free Software Foundation. + + If the Program specifies that a proxy can decide which future +versions of the GNU General Public License can be used, that proxy's +public statement of acceptance of a version permanently authorizes you +to choose that version for the Program. + + Later license versions may give you additional or different +permissions. However, no additional obligations are imposed on any +author or copyright holder as a result of your choosing to follow a +later version. + + 15. Disclaimer of Warranty. + + THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY +APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT +HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY +OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, +THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM +IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF +ALL NECESSARY SERVICING, REPAIR OR CORRECTION. + + 16. Limitation of Liability. + + IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING +WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS +THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY +GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE +USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF +DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD +PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), +EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF +SUCH DAMAGES. + + 17. Interpretation of Sections 15 and 16. + + If the disclaimer of warranty and limitation of liability provided +above cannot be given local legal effect according to their terms, +reviewing courts shall apply local law that most closely approximates +an absolute waiver of all civil liability in connection with the +Program, unless a warranty or assumption of liability accompanies a +copy of the Program in return for a fee. + + END OF TERMS AND CONDITIONS + + How to Apply These Terms to Your New Programs + + If you develop a new program, and you want it to be of the greatest +possible use to the public, the best way to achieve this is to make it +free software which everyone can redistribute and change under these terms. + + To do so, attach the following notices to the program. It is safest +to attach them to the start of each source file to most effectively +state the exclusion of warranty; and each file should have at least +the "copyright" line and a pointer to where the full notice is found. + + + Copyright (C) + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . + +Also add information on how to contact you by electronic and paper mail. + + If the program does terminal interaction, make it output a short +notice like this when it starts in an interactive mode: + + Copyright (C) + This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'. + This is free software, and you are welcome to redistribute it + under certain conditions; type `show c' for details. + +The hypothetical commands `show w' and `show c' should show the appropriate +parts of the General Public License. Of course, your program's commands +might be different; for a GUI interface, you would use an "about box". + + You should also get your employer (if you work as a programmer) or school, +if any, to sign a "copyright disclaimer" for the program, if necessary. +For more information on this, and how to apply and follow the GNU GPL, see +. + + The GNU General Public License does not permit incorporating your program +into proprietary programs. If your program is a subroutine library, you +may consider it more useful to permit linking proprietary applications with +the library. If this is what you want to do, use the GNU Lesser General +Public License instead of this License. But first, please read +. diff --git "a/13\343\200\201python\346\212\242\350\214\205\345\217\260/README.md" "b/13\343\200\201python\346\212\242\350\214\205\345\217\260/README.md" new file mode 100644 index 0000000..a81cf7a --- /dev/null +++ "b/13\343\200\201python\346\212\242\350\214\205\345\217\260/README.md" @@ -0,0 +1,15 @@ +# Tmall_Tickets +天猫超市茅台抢票功能 + +# 抢票方法 +1.为了方便和简化抢票业务逻辑,提高代码的效率,本抢票软件只负责提交抢票和发起付款请求。
+2.通过手机端将天猫超市端的茅台加入购物车,然后执行下面的操作
+ + +# 打开页面 +https://cart.tmall.com/cart.htm + +# Chrome浏览器加载插件运行 +插件自动运行后,时间到了后,看看是否订单里面有付款项,有的话就说抢票成功,没有则是没中。 + + diff --git "a/13\343\200\201python\346\212\242\350\214\205\345\217\260/icon.png" "b/13\343\200\201python\346\212\242\350\214\205\345\217\260/icon.png" new file mode 100644 index 0000000..dc43651 Binary files /dev/null and "b/13\343\200\201python\346\212\242\350\214\205\345\217\260/icon.png" differ diff --git "a/13\343\200\201python\346\212\242\350\214\205\345\217\260/manifest.json" "b/13\343\200\201python\346\212\242\350\214\205\345\217\260/manifest.json" new file mode 100644 index 0000000..2726367 --- /dev/null +++ "b/13\343\200\201python\346\212\242\350\214\205\345\217\260/manifest.json" @@ -0,0 +1,16 @@ +{ + "manifest_version": 2, + "name": "Tmall-tickets", + "version": "1.0", + "description": "天猫超市抢购茅台", + "browser_action": { + "default_icon": "icon.png" + }, + "content_scripts": [ + { + "matches": ["https://chaoshi.detail.tmall.com/*","https://cart.tmall.com/*","https://buy.tmall.com/*"], + "js": ["maotai.js"], + "run_at": "document_idle" + } + ] +} \ No newline at end of file diff --git "a/13\343\200\201python\346\212\242\350\214\205\345\217\260/maotai.js" "b/13\343\200\201python\346\212\242\350\214\205\345\217\260/maotai.js" new file mode 100644 index 0000000..e70db8e --- /dev/null +++ "b/13\343\200\201python\346\212\242\350\214\205\345\217\260/maotai.js" @@ -0,0 +1,137 @@ + +//定时器 +var timer = null; + +//检测状态 +function checkElementState(path,callback){ + var ele = document.querySelector(path); + if(ele){ + callback && callback(); + }else{ + console.log('异步加载元素中....' + path ); + setTimeout( function(){checkElementState(path,callback);},200); + } +} + + + +//点击购买按钮 +function clickBuy(){ + + console.log('买!'); + + //票的数量 如果还不可以购买,这个地方获取会失败 + var amount = document.getElementsByClassName('mui-amount-increase')[0]; + amount && amount.click(); //+1 + + var btnBuy = document.querySelector(''); + +} + + +//结算 +function checkOut(){ + + + console.log('结算开始....'); + var btn = document.getElementById('J_Go'); + + if(btn){ + btn.click(); + }else{ + console.log('结算按钮没找到'); + } + +} + +function checkOutAsync(){ + checkElementState('#J_Go',checkOut); +} + +//提交订单 +function submitOrder(){ + + console.log('提交订单开始....'); + + + + checkElementState('.go-btn',function(){ + var btn = document.querySelector(".go-btn"); + + if(btn){ + btn.click(); + }else{ + console.log('提交订单按钮没找到'); + } + + }); +} + + + +//目标时间 + var dDate = new Date(); //10点和20点开抢 + if( dDate.getHours() < 10 ){ + dDate.setHours(9,59,59.2); + }else{ + dDate.setHours(19,59,59.2); + } + + //dDate.setSeconds( dDate.getSeconds() + 10 ); + +//进入时间判断循环 +function enterTimeCheckLoop(callback){ + var date = new Date(); + + + + + var diff = Date.parse(dDate) - Date.parse(date) ; + + console.log(diff); + + if(diff < - 900 ){ + + console.log('时间过了!'); + + }else if(diff < 500 ) { + + callback && callback(); + + console.log('时间到了!!!'); + + }else{ + setTimeout(function(){ enterTimeCheckLoop(callback);},400); + + //console.log('--'); + } + + + +} + + +//主要函数 +function main(){ + console.log('############################开始抢购茅台############################'); + + //debugger; + + var href = window.location.href; + if(href.indexOf('cart.tmall.com') > -1 ){ + //结算页面 + + //进入时间判断 + enterTimeCheckLoop( checkOutAsync ); + + + }else if(href.indexOf('buy.tmall.com') > -1 ){ + //提交订单页面 + + submitOrder(); + } + +} + + +main(); \ No newline at end of file diff --git "a/14\343\200\201\345\276\256\345\215\232\347\210\254\350\231\253/LICENSE" "b/14\343\200\201\345\276\256\345\215\232\347\210\254\350\231\253/LICENSE" new file mode 100644 index 0000000..edc4d40 --- /dev/null +++ "b/14\343\200\201\345\276\256\345\215\232\347\210\254\350\231\253/LICENSE" @@ -0,0 +1,21 @@ +MIT License + +Copyright (c) 2019 HuYong + +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/14\343\200\201\345\276\256\345\215\232\347\210\254\350\231\253/README.md" "b/14\343\200\201\345\276\256\345\215\232\347\210\254\350\231\253/README.md" new file mode 100644 index 0000000..a9312dd --- /dev/null +++ "b/14\343\200\201\345\276\256\345\215\232\347\210\254\350\231\253/README.md" @@ -0,0 +1,342 @@ +

+
+ +
+

+

+ + Codacy Badge + + + Coverity Scan Build Status + + + GitHub stars + + + GitHub issues + + + GitHub forks + + + + + + GitHub license + +

+ +

+

持续维护的新浪微博采集工具🚀🚀🚀

+

+ + +## 项目特色 + +- 基于weibo.com的新版API构建,拥有最丰富的字段信息 +- 多种采集模式,包含微博用户,推文,粉丝,关注,转发,评论,关键词搜索 +- 核心代码仅100行,代码可读性高,可快速按需进行定制化改造 + +## 快速开始 + +### 拉取&&安装 + +```bash +git clone git@github.com:nghuyong/WeiboSpider.git --depth 1 --no-single-branch +cd WeiboSpider +pip install -r requirements.txt +``` + +### 替换Cookie + +访问[https://weibo.com/](https://weibo.com/), 登陆账号,打开浏览器的开发者模式,再次刷新 + +![](.github/cookie.png) + +复制`weibo.com`数据包,network中的cookie值。编辑`weibospider/cookie.txt`并替换成刚刚复制的Cookie + +### 添加代理IP(可选) + +重写[fetch_proxy](./weibospider/middlewares.py#6L) +方法,该方法需要返回一个代理ip,具体参考[这里](https://github.com/nghuyong/WeiboSpider/issues/124#issuecomment-654335439) + +## 运行程序 + +根据自己实际需要重写`./weibospider/spiders/*`中的`start_requests`函数 + +采集的数据存在`output`文件中,命名为`{spider.name}_{datetime}.jsonl` + +### 用户信息采集 + +```bash +cd weibospider +python run_spider.py user +``` + +```json +{ + "crawl_time": 1666863485, + "_id": "1749127163", + "avatar_hd": "https://tvax4.sinaimg.cn/crop.0.0.1080.1080.1024/001Un9Srly8h3fpj11yjyj60u00u0q7f02.jpg?KID=imgbed,tva&Expires=1666874283&ssig=a%2FMfgFzvRo", + "nick_name": "雷军", + "verified": true, + "description": "小米董事长,金山软件董事长。业余爱好是天使投资。", + "followers_count": 22756103, + "friends_count": 1373, + "statuses_count": 14923, + "gender": "m", + "location": "北京 海淀区", + "mbrank": 7, + "mbtype": 12, + "verified_type": 0, + "verified_reason": "小米创办人,董事长兼CEO;金山软件董事长;天使投资人。", + "birthday": "", + "created_at": "2010-05-31 23:07:59", + "desc_text": "小米创办人,董事长兼CEO;金山软件董事长;天使投资人。", + "ip_location": "IP属地:北京", + "sunshine_credit": "信用极好", + "label_desc": [ + "V指数 财经 75.30分", + "热门财经博主 数据飙升", + "昨日发博3,阅读数100万+,互动数1.9万", + "视频累计播放量9819.3万", + "群友 3132" + ], + "company": "金山软件", + "education": { + "school": "武汉大学" + } +} +``` + +### 用户粉丝列表采集 + +```bash +python run_spider.py fan +``` + +```json +{ + "crawl_time": 1666863563, + "_id": "1087770692_5968044974", + "follower_id": "1087770692", + "fan_info": { + "_id": "5968044974", + "avatar_hd": "https://tvax1.sinaimg.cn/default/images/default_avatar_male_180.gif?KID=imgbed,tva&Expires=1666874363&ssig=UuzaeK437R", + "nick_name": "用户5968044974", + "verified": false, + "description": "", + "followers_count": 0, + "friends_count": 195, + "statuses_count": 9, + "gender": "m", + "location": "其他", + "mbrank": 0, + "mbtype": 0, + "credit_score": 80, + "created_at": "2016-06-25 22:30:13" + } +} +... +``` + +### 用户关注列表采集 + +```bash +python run_spider.py follow +``` + +```json +{ + "crawl_time": 1666863679, + "_id": "1087770692_7083568088", + "fan_id": "1087770692", + "follower_info": { + "_id": "7083568088", + "avatar_hd": "https://tvax4.sinaimg.cn/crop.0.0.1080.1080.1024/007JnVEcly8gyqd9jadjlj30u00u0gpn.jpg?KID=imgbed,tva&Expires=1666874479&ssig=9zhfeMPLzr", + "nick_name": "蒋昀霖", + "verified": true, + "description": "工作请联系:lijialun@kpictures.cn", + "followers_count": 329216, + "friends_count": 58, + "statuses_count": 342, + "gender": "m", + "location": "北京", + "mbrank": 6, + "mbtype": 12, + "credit_score": 80, + "created_at": "2019-04-17 16:25:43", + "verified_type": 0, + "verified_reason": "东申未来 演员" + } +} +... +``` + +### 用户的微博采集 + +```bash +python run_spider.py tweet +``` + +```json +{ + "crawl_time": 1666864583, + "_id": "4762810834227120", + "mblogid": "LqlZNhJFm", + "created_at": "2022-04-27 10:20:54", + "geo": null, + "ip_location": null, + "reposts_count": 1907, + "comments_count": 1924, + "attitudes_count": 12169, + "source": "三星Galaxy S22 Ultra", + "content": "生于乱世纵横四海,义之所在不计生死,孤勇者陈恭一生当如是。#风起陇西今日开播# #风起陇西# 今晚,恭候你!", + "pic_urls": [], + "pic_num": 0, + "video": "http://f.video.weibocdn.com/o0/CmQEWK1ylx07VAm0nrxe01041200YDIc0E010.mp4?label=mp4_720p&template=1280x720.25.0&ori=0&ps=1CwnkDw1GXwCQx&Expires=1666868183&ssig=RlIeOt286i&KID=unistore,video", + "url": "https://weibo.com/1087770692/LqlZNhJFm" +} +... +``` + +### 微博评论采集 + +```bash +python run_spider.py comment +``` + +```json +{ + "crawl_time": 1666863805, + "_id": 4826279188108038, + "created_at": "2022-10-19 13:41:29", + "like_counts": 1, + "ip_location": "来自河南", + "content": "五周年快乐呀,请坤哥哥继续保持这份热爱,奔赴下一场山海", + "comment_user": { + "_id": "2380967841", + "avatar_hd": "https://tvax4.sinaimg.cn/crop.0.0.888.888.1024/002B8iv7ly8gv647ipgxvj60oo0oojtk02.jpg?KID=imgbed,tva&Expires=1666874604&ssig=%2FdGaaIRkhf", + "nick_name": "流年执念的二瓜娇", + "verified": false, + "description": "蓝桉已遇释怀鸟,不爱万物唯爱你。", + "followers_count": 238, + "friends_count": 1655, + "statuses_count": 12546, + "gender": "f", + "location": "河南", + "mbrank": 6, + "mbtype": 11 + } +} +... +``` + +### 微博转发采集 + +```bash +python run_spider.py repost +``` + +```json +{ + "_id": "4826312651310475", + "mblogid": "Mb2vL5uUH", + "created_at": "2022-10-19 15:54:27", + "geo": null, + "ip_location": "发布于 德国", + "reposts_count": 0, + "comments_count": 0, + "attitudes_count": 0, + "source": "iPhone客户端", + "content": "共享[鼓掌][太开心][鼓掌]五周年快乐!//@陈坤:#山下学堂五周年# 五年, 感谢同行。", + "pic_urls": [], + "pic_num": 0, + "user": { + "_id": "2717869081", + "avatar_hd": "https://tvax1.sinaimg.cn/crop.0.0.160.160.1024/a1ff6419ly8gz1xoq9oolj204g04g745.jpg?KID=imgbed,tva&Expires=1666876939&ssig=Cl93CLjdB%2F", + "nick_name": "YuFeeC", + "verified": false, + "mbrank": 0, + "mbtype": 0 + }, + "url": "https://weibo.com/2717869081/Mb2vL5uUH", + "crawl_time": 1666866139 +} +... +``` + +### 基于关键词的微博检索 + +```bash +python run_spider.py search +``` + +```json +{ + "crawl_time": 1666869049, + "keyword": "丽江", + "_id": "4829255386537989", + "mblogid": "Mch46rqPr", + "created_at": "2022-10-27 18:47:50", + "geo": { + "type": "Point", + "coordinates": [ + 26.962427, + 100.248299 + ], + "detail": { + "poiid": "B2094251D06FAAF44299", + "title": "山野文创旅拍圣地", + "type": "checkin", + "spot_type": "0" + } + }, + "ip_location": "发布于 云南", + "reposts_count": 0, + "comments_count": 0, + "attitudes_count": 1, + "source": "iPhone1314iPhone客户端", + "content": "丽江小漾日出\n推出户外移动餐桌\n接受私人定制\n让美食融入美景心情自然美丽了!\n#小众宝藏旅行地##超出片的艺术街区# ", + "pic_urls": [ + "https://wx1.sinaimg.cn/orj960/4b138405gy1h7k1a56c4oj234022onph", + "https://wx1.sinaimg.cn/orj960/4b138405gy1h7k19eb2kxj22ts1vvb2a", + "https://wx1.sinaimg.cn/orj960/4b138405gy1h7k1a0wzglj22ua1w7hdw", + "https://wx1.sinaimg.cn/orj960/4b138405gy1h7k19wsafnj231x21a7wj", + "https://wx1.sinaimg.cn/orj960/4b138405gy1h7k19jd1xkj22oh1sbkjo", + "https://wx1.sinaimg.cn/orj960/4b138405gy1h7k19mma74j22ru1ukx6q", + "https://wx1.sinaimg.cn/orj960/4b138405gy1h7k19tf1bfj234022oe85", + "https://wx1.sinaimg.cn/orj960/4b138405gy1h7k19pk37pj234022okjm", + "https://wx1.sinaimg.cn/orj960/4b138405gy1h7k19g6nzfj20wi0lo7my" + ], + "pic_num": 9, + "user": { + "_id": "1259570181", + "avatar_hd": "https://tvax1.sinaimg.cn/crop.0.0.1080.1080.1024/4b138405ly8gzfkfikyqvj20u00u0ag1.jpg?KID=imgbed,tva&Expires=1666879848&ssig=6PUDG5RonQ", + "nick_name": "飞鸟与鱼", + "verified": true, + "mbrank": 7, + "mbtype": 12, + "verified_type": 0 + }, + "url": "https://weibo.com/1259570181/Mch46rqPr" +} +... +``` + +## 更新日志 + +- 2022.10: 添加IP归属地信息的采集,包括用户数据,微博数据和微博评论数据 +- 2022.10: 基于weibo.com站点对项目进行重构 + +## 合作联系 + +- 已构建超大规模数据集WeiboCOV,可免费申请,包含2千万微博活跃用户以及6千万推文数据,参见[这里](https://github.com/nghuyong/weibo-public-opinion-datasets) +- 已构建一站式科研数据平台,涵盖Twitter,微博等诸多站点,点点鼠标即可进行数据采集与分析,参见[这里](https://yisukeyan.com/) diff --git "a/14\343\200\201\345\276\256\345\215\232\347\210\254\350\231\253/output/search_spider_20221029204111.jsonl" "b/14\343\200\201\345\276\256\345\215\232\347\210\254\350\231\253/output/search_spider_20221029204111.jsonl" new file mode 100644 index 0000000..0d39f52 --- /dev/null +++ "b/14\343\200\201\345\276\256\345\215\232\347\210\254\350\231\253/output/search_spider_20221029204111.jsonl" @@ -0,0 +1,5 @@ +{"_id": "4217503187934849", "mblogid": "G7lkWxidr", "created_at": "2018-03-14 16:03:00", "geo": null, "ip_location": null, "reposts_count": 0, "comments_count": 8, "attitudes_count": 9, "source": "前置双摄vivo X9s", "content": "#晚枫歌孟子坤烈火如歌#\n相煎何太急[微笑][微笑][微笑]\n别逼大家要找程序员来查ip地址。 ", "pic_urls": [], "pic_num": 0, "user": {"_id": "6378928531", "avatar_hd": "https://tvax3.sinaimg.cn/crop.0.0.996.996.1024/006XHkI3ly8gv6ppldahwj60ro0rojsj02.jpg?KID=imgbed,tva&Expires=1667058071&ssig=E7QYCEhr69", "nick_name": "罗兰_不爱麦架也爱你", "verified": true, "mbrank": 7, "mbtype": 12, "verified_type": 0}, "url": "https://weibo.com/6378928531/G7lkWxidr", "keyword": "程序员晚枫", "crawl_time": 1667047271} +{"_id": "4759749130718510", "mblogid": "Lp4lz30US", "created_at": "2022-04-18 23:34:47", "geo": null, "ip_location": null, "reposts_count": 1, "comments_count": 7, "attitudes_count": 3, "source": "程序员超话", "content": "#程序员[超话]# 晚枫老师,我在看您的视频学习python,其中关于Excel读取这一节,我按照您的代码写完之后,运行的时候总是出现这个问题,麻烦帮看一下怎么回事?谢谢@程序员晚枫 ", "pic_urls": ["https://wx1.sinaimg.cn/orj960/005SyqpGly1h1eap6j5uzj31hc0u0gw4"], "pic_num": 1, "user": {"_id": "5386790992", "avatar_hd": "https://tvax1.sinaimg.cn/crop.0.0.750.750.1024/005SyqpGly8goo7wa0iywj30ku0kuwfv.jpg?KID=imgbed,tva&Expires=1667058072&ssig=smmWkSKeih", "nick_name": "全时段体育", "verified": true, "mbrank": 4, "mbtype": 2, "verified_type": 0}, "url": "https://weibo.com/5386790992/Lp4lz30US", "keyword": "程序员晚枫", "crawl_time": 1667047272} +{"_id": "4760034112702900", "mblogid": "LpbLdbl9a", "created_at": "2022-04-19 18:27:12", "geo": null, "ip_location": null, "reposts_count": 0, "comments_count": 4, "attitudes_count": 0, "source": "iPhone客户端", "content": "用示例中代码做微信机器人,请问@程序员晚枫 大佬,为什么扫码登陆的时候提示下面的报错呢?\n视频看了两遍也没有看到代码报错或者权限报错的现状是什么样子?只能来这里发问了\n\nGetting uuid of QR code.\nDownloading QR code.\nPlease scan the QR code to log in.\nPlease press confirm on your phone ", "pic_urls": ["https://wx1.sinaimg.cn/orj960/56819c94ly1h1f792tjrcj21hc0u0gq4"], "pic_num": 1, "user": {"_id": "1451334804", "avatar_hd": "https://tvax2.sinaimg.cn/crop.0.0.1242.1242.1024/56819c94ly8fqlug3kdgxj20yi0yin15.jpg?KID=imgbed,tva&Expires=1667058073&ssig=sgRW3u1FBw", "nick_name": "圣瑞思大马修", "verified": false, "mbrank": 0, "mbtype": 0}, "url": "https://weibo.com/1451334804/LpbLdbl9a", "keyword": "程序员晚枫", "crawl_time": 1667047273} +{"_id": "4766165916713902", "mblogid": "LrLhdsaAK", "created_at": "2022-05-06 16:32:47", "geo": null, "ip_location": "发布于 江苏", "reposts_count": 0, "comments_count": 1, "attitudes_count": 0, "source": "新版微博 weibo.com", "content": "运行时报缺少这个,从哪里能添加到? @程序员晚枫 ", "pic_urls": ["https://wx1.sinaimg.cn/orj960/71b76a37gy1h1yroo1cgqj20oe03ggnz"], "pic_num": 1, "user": {"_id": "1907845687", "avatar_hd": "https://tva3.sinaimg.cn/crop.0.0.180.180.1024/71b76a37jw1e8qgp5bmzyj2050050aa8.jpg?KID=imgbed,tva&Expires=1667058075&ssig=oGsbWuIoSW", "nick_name": "南通瞿标", "verified": false, "mbrank": 0, "mbtype": 0}, "url": "https://weibo.com/1907845687/LrLhdsaAK", "keyword": "程序员晚枫", "crawl_time": 1667047275} +{"_id": "4801674139666097", "mblogid": "M0HydEyAN", "created_at": "2022-08-12 16:09:48", "geo": null, "ip_location": "发布于 广东", "reposts_count": 0, "comments_count": 0, "attitudes_count": 1, "source": "HUAWEI Mate 30", "content": "“着眼长远的职业生涯,你初入职场的这3年,更重要的在给公司创造价值的前提下,在公司里获得多少技术成长、提升行业认知、认识同行朋友,而不是挣多少钱。\n\n人在每个阶段都有不同的任务,有的人能一眼就看透事物的本质,而有的人一辈子也看不透,这两种人有着不同的命运。”\n\n出自创业选手@程序员晚枫 ", "pic_urls": [], "pic_num": 0, "user": {"_id": "5110333487", "avatar_hd": "https://tvax1.sinaimg.cn/crop.0.0.664.664.1024/005zQrbFly8g4sc3x22q8j30ig0ig0v1.jpg?KID=imgbed,tva&Expires=1667058076&ssig=FWmtPCpzDu", "nick_name": "万轻舟的微博", "verified": true, "mbrank": 2, "mbtype": 2, "verified_type": 0}, "url": "https://weibo.com/5110333487/M0HydEyAN", "keyword": "程序员晚枫", "crawl_time": 1667047276} diff --git "a/14\343\200\201\345\276\256\345\215\232\347\210\254\350\231\253/output/search_spider_20221029205945.jsonl" "b/14\343\200\201\345\276\256\345\215\232\347\210\254\350\231\253/output/search_spider_20221029205945.jsonl" new file mode 100644 index 0000000..3bea047 --- /dev/null +++ "b/14\343\200\201\345\276\256\345\215\232\347\210\254\350\231\253/output/search_spider_20221029205945.jsonl" @@ -0,0 +1,5 @@ +{"_id": "4217503187934849", "mblogid": "G7lkWxidr", "created_at": "2018-03-14 16:03:00", "geo": null, "ip_location": null, "reposts_count": 0, "comments_count": 8, "attitudes_count": 9, "source": "前置双摄vivo X9s", "content": "#晚枫歌孟子坤烈火如歌#\n相煎何太急[微笑][微笑][微笑]\n别逼大家要找程序员来查ip地址。 ", "pic_urls": [], "pic_num": 0, "user": {"_id": "6378928531", "avatar_hd": "https://tvax3.sinaimg.cn/crop.0.0.996.996.1024/006XHkI3ly8gv6ppldahwj60ro0rojsj02.jpg?KID=imgbed,tva&Expires=1667059185&ssig=quHciEQStV", "nick_name": "罗兰_不爱麦架也爱你", "verified": true, "mbrank": 7, "mbtype": 12, "verified_type": 0}, "url": "https://weibo.com/6378928531/G7lkWxidr", "keyword": "程序员晚枫", "crawl_time": 1667048385} +{"_id": "4759749130718510", "mblogid": "Lp4lz30US", "created_at": "2022-04-18 23:34:47", "geo": null, "ip_location": null, "reposts_count": 1, "comments_count": 7, "attitudes_count": 3, "source": "程序员超话", "content": "#程序员[超话]# 晚枫老师,我在看您的视频学习python,其中关于Excel读取这一节,我按照您的代码写完之后,运行的时候总是出现这个问题,麻烦帮看一下怎么回事?谢谢@程序员晚枫 ", "pic_urls": ["https://wx1.sinaimg.cn/orj960/005SyqpGly1h1eap6j5uzj31hc0u0gw4"], "pic_num": 1, "user": {"_id": "5386790992", "avatar_hd": "https://tvax1.sinaimg.cn/crop.0.0.750.750.1024/005SyqpGly8goo7wa0iywj30ku0kuwfv.jpg?KID=imgbed,tva&Expires=1667059186&ssig=HB2KWdPSEg", "nick_name": "全时段体育", "verified": true, "mbrank": 4, "mbtype": 2, "verified_type": 0}, "url": "https://weibo.com/5386790992/Lp4lz30US", "keyword": "程序员晚枫", "crawl_time": 1667048386} +{"_id": "4760034112702900", "mblogid": "LpbLdbl9a", "created_at": "2022-04-19 18:27:12", "geo": null, "ip_location": null, "reposts_count": 0, "comments_count": 4, "attitudes_count": 0, "source": "iPhone客户端", "content": "用示例中代码做微信机器人,请问@程序员晚枫 大佬,为什么扫码登陆的时候提示下面的报错呢?\n视频看了两遍也没有看到代码报错或者权限报错的现状是什么样子?只能来这里发问了\n\nGetting uuid of QR code.\nDownloading QR code.\nPlease scan the QR code to log in.\nPlease press confirm on your phone ", "pic_urls": ["https://wx1.sinaimg.cn/orj960/56819c94ly1h1f792tjrcj21hc0u0gq4"], "pic_num": 1, "user": {"_id": "1451334804", "avatar_hd": "https://tvax2.sinaimg.cn/crop.0.0.1242.1242.1024/56819c94ly8fqlug3kdgxj20yi0yin15.jpg?KID=imgbed,tva&Expires=1667059187&ssig=O56OoVYAYs", "nick_name": "圣瑞思大马修", "verified": false, "mbrank": 0, "mbtype": 0}, "url": "https://weibo.com/1451334804/LpbLdbl9a", "keyword": "程序员晚枫", "crawl_time": 1667048387} +{"_id": "4766165916713902", "mblogid": "LrLhdsaAK", "created_at": "2022-05-06 16:32:47", "geo": null, "ip_location": "发布于 江苏", "reposts_count": 0, "comments_count": 1, "attitudes_count": 0, "source": "新版微博 weibo.com", "content": "运行时报缺少这个,从哪里能添加到? @程序员晚枫 ", "pic_urls": ["https://wx1.sinaimg.cn/orj960/71b76a37gy1h1yroo1cgqj20oe03ggnz"], "pic_num": 1, "user": {"_id": "1907845687", "avatar_hd": "https://tva3.sinaimg.cn/crop.0.0.180.180.1024/71b76a37jw1e8qgp5bmzyj2050050aa8.jpg?KID=imgbed,tva&Expires=1667059188&ssig=A3yS3FaOPW", "nick_name": "南通瞿标", "verified": false, "mbrank": 0, "mbtype": 0}, "url": "https://weibo.com/1907845687/LrLhdsaAK", "keyword": "程序员晚枫", "crawl_time": 1667048388} +{"_id": "4801674139666097", "mblogid": "M0HydEyAN", "created_at": "2022-08-12 16:09:48", "geo": null, "ip_location": "发布于 广东", "reposts_count": 0, "comments_count": 0, "attitudes_count": 1, "source": "HUAWEI Mate 30", "content": "“着眼长远的职业生涯,你初入职场的这3年,更重要的在给公司创造价值的前提下,在公司里获得多少技术成长、提升行业认知、认识同行朋友,而不是挣多少钱。\n\n人在每个阶段都有不同的任务,有的人能一眼就看透事物的本质,而有的人一辈子也看不透,这两种人有着不同的命运。”\n\n出自创业选手@程序员晚枫 ", "pic_urls": [], "pic_num": 0, "user": {"_id": "5110333487", "avatar_hd": "https://tvax1.sinaimg.cn/crop.0.0.664.664.1024/005zQrbFly8g4sc3x22q8j30ig0ig0v1.jpg?KID=imgbed,tva&Expires=1667059190&ssig=lEy2YK13FG", "nick_name": "万轻舟的微博", "verified": true, "mbrank": 2, "mbtype": 2, "verified_type": 0}, "url": "https://weibo.com/5110333487/M0HydEyAN", "keyword": "程序员晚枫", "crawl_time": 1667048390} diff --git "a/14\343\200\201\345\276\256\345\215\232\347\210\254\350\231\253/output/user_spider_20221029203525.jsonl" "b/14\343\200\201\345\276\256\345\215\232\347\210\254\350\231\253/output/user_spider_20221029203525.jsonl" new file mode 100644 index 0000000..3d9c608 --- /dev/null +++ "b/14\343\200\201\345\276\256\345\215\232\347\210\254\350\231\253/output/user_spider_20221029203525.jsonl" @@ -0,0 +1 @@ +{"_id": "7726957925", "avatar_hd": "https://tvax1.sinaimg.cn/crop.0.0.600.600.1024/008qVwJDly8h2abcnv801j30go0gotbb.jpg?KID=imgbed,tva&Expires=1667057724&ssig=9ZXQZmHKrh", "nick_name": "程序员晚枫", "verified": false, "description": "法学院毕业的Python程序员,在重庆。", "followers_count": 170, "friends_count": 19, "statuses_count": 125, "gender": "m", "location": "重庆 渝中区", "mbrank": 0, "mbtype": 0, "birthday": "1995-08-17", "created_at": "2021-12-04 02:21:10", "desc_text": "", "ip_location": "IP属地:重庆", "sunshine_credit": "信用一般", "label_desc": ["视频累计播放量1.9万"], "education": {"school": "华南理工大学"}, "crawl_time": 1667046925} diff --git "a/14\343\200\201\345\276\256\345\215\232\347\210\254\350\231\253/requirements.txt" "b/14\343\200\201\345\276\256\345\215\232\347\210\254\350\231\253/requirements.txt" new file mode 100644 index 0000000..142c380 --- /dev/null +++ "b/14\343\200\201\345\276\256\345\215\232\347\210\254\350\231\253/requirements.txt" @@ -0,0 +1,2 @@ +Scrapy +python_dateutil \ No newline at end of file diff --git "a/14\343\200\201\345\276\256\345\215\232\347\210\254\350\231\253/weibospider/cookie.txt" "b/14\343\200\201\345\276\256\345\215\232\347\210\254\350\231\253/weibospider/cookie.txt" new file mode 100644 index 0000000..63573ba --- /dev/null +++ "b/14\343\200\201\345\276\256\345\215\232\347\210\254\350\231\253/weibospider/cookie.txt" @@ -0,0 +1 @@ +SINAGLOBAL=6523076323654.351.1650469799845; UOR=,,www.cuba.edu.cn; SUBP=0033WrSXqPxfM725Ws9jqgMF55529P9D9WF8Yo_iE16HE9YvhIg6bX3A5JpX5KMhUgL.FoMNeoq4SKM4eo-2dJLoIEXLxKMLBKnL12zLxK-LB.2L12qLxK-L1K2L1KnLxKqL1K.L1-2LxKqL1--LB-zt; ULV=1667033555436:27:2:1:401979337155.11615.1667033555427:1666277183696; PC_TOKEN=00fcdec311; ALF=1698582421; SSOLoginState=1667046421; SCF=Ai46ajJHnMeCXyYLxUYg45dieMLnFK2EzRdspykP7lGrQ7_eb6V1XuQhtEdvmsRDhbVggqvZGV8z18jeRCJpiac.; SUB=_2A25OWWxGDeRhGeFJ6VQY9SnFyTmIHXVtL9qOrDV8PUNbmtAKLUalkW9NfEEEWWujgSWU-sbABnYlYbBl1FXqljG-; XSRF-TOKEN=C-dgymp22o-Spn8PoyB6EflV; WBPSESS=jHKxeYP8s9YopP7Ymn-kut4uuV-3GEHovaQ17tbsnNjlXrsov0jiNl7NLsW49Zwztp3fSr9w-_lrdWcsHH3kxQHp3kLAxmUZipdgjVPotofgvIqNTSgObeNPGrFhczsmRVLZgb4jqaeUGaVNazaDgA== \ No newline at end of file diff --git "a/14\343\200\201\345\276\256\345\215\232\347\210\254\350\231\253/weibospider/middlewares.py" "b/14\343\200\201\345\276\256\345\215\232\347\210\254\350\231\253/weibospider/middlewares.py" new file mode 100644 index 0000000..79d6815 --- /dev/null +++ "b/14\343\200\201\345\276\256\345\215\232\347\210\254\350\231\253/weibospider/middlewares.py" @@ -0,0 +1,26 @@ +# encoding: utf-8 + + +class IPProxyMiddleware(object): + """ + 代理IP中间件 + """ + + @staticmethod + def fetch_proxy(): + """ + 获取一个代理IP + """ + # You need to rewrite this function if you want to add proxy pool + # the function should return an ip in the format of "ip:port" like "12.34.1.4:9090" + return None + + def process_request(self, request, spider): + """ + 将代理IP添加到request请求中 + """ + proxy_data = self.fetch_proxy() + if proxy_data: + current_proxy = f'http://{proxy_data}' + spider.logger.debug(f"current proxy:{current_proxy}") + request.meta['proxy'] = current_proxy diff --git "a/14\343\200\201\345\276\256\345\215\232\347\210\254\350\231\253/weibospider/pipelines.py" "b/14\343\200\201\345\276\256\345\215\232\347\210\254\350\231\253/weibospider/pipelines.py" new file mode 100644 index 0000000..d4a0803 --- /dev/null +++ "b/14\343\200\201\345\276\256\345\215\232\347\210\254\350\231\253/weibospider/pipelines.py" @@ -0,0 +1,30 @@ +# -*- coding: utf-8 -*- +import datetime +import json +import os.path +import time + + +class JsonWriterPipeline(object): + """ + 写入json文件的pipline + """ + + def __init__(self): + self.file = None + if not os.path.exists('../output'): + os.mkdir('../output') + + def process_item(self, item, spider): + """ + 处理item + """ + if not self.file: + now = datetime.datetime.now() + file_name = spider.name + "_" + now.strftime("%Y%m%d%H%M%S") + '.jsonl' + self.file = open(f'../output/{file_name}', 'wt', encoding='utf-8') + item['crawl_time'] = int(time.time()) + line = json.dumps(dict(item), ensure_ascii=False) + "\n" + self.file.write(line) + self.file.flush() + return item diff --git "a/14\343\200\201\345\276\256\345\215\232\347\210\254\350\231\253/weibospider/run_spider.py" "b/14\343\200\201\345\276\256\345\215\232\347\210\254\350\231\253/weibospider/run_spider.py" new file mode 100644 index 0000000..ddb5567 --- /dev/null +++ "b/14\343\200\201\345\276\256\345\215\232\347\210\254\350\231\253/weibospider/run_spider.py" @@ -0,0 +1,36 @@ +#!/usr/bin/env python +# encoding: utf-8 +""" +Author: nghuyong +Mail: nghuyong@163.com +Created Time: 2019-12-07 21:27 +""" +import os +import sys +from scrapy.crawler import CrawlerProcess +from scrapy.utils.project import get_project_settings +from spiders.tweet import TweetSpider +from spiders.comment import CommentSpider +from spiders.follower import FollowerSpider +from spiders.user import UserSpider +from spiders.fan import FanSpider +from spiders.repost import RepostSpider +from spiders.search import SearchSpider + +if __name__ == '__main__': + mode = sys.argv[1] + os.environ['SCRAPY_SETTINGS_MODULE'] = 'settings' + settings = get_project_settings() + process = CrawlerProcess(settings) + mode_to_spider = { + 'comment': CommentSpider, + 'fan': FanSpider, + 'follow': FollowerSpider, + 'tweet': TweetSpider, + 'user': UserSpider, + 'repost': RepostSpider, + 'search': SearchSpider + } + process.crawl(mode_to_spider[mode]) + # the script will block here until the crawling is finished + process.start() diff --git "a/14\343\200\201\345\276\256\345\215\232\347\210\254\350\231\253/weibospider/settings.py" "b/14\343\200\201\345\276\256\345\215\232\347\210\254\350\231\253/weibospider/settings.py" new file mode 100644 index 0000000..2cb257a --- /dev/null +++ "b/14\343\200\201\345\276\256\345\215\232\347\210\254\350\231\253/weibospider/settings.py" @@ -0,0 +1,30 @@ +# -*- coding: utf-8 -*- + +BOT_NAME = 'spider' + +SPIDER_MODULES = ['spiders'] +NEWSPIDER_MODULE = 'spiders' + +ROBOTSTXT_OBEY = False + +with open('cookie.txt', 'rt', encoding='utf-8') as f: + cookie = f.read().strip() +DEFAULT_REQUEST_HEADERS = { + 'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10.13; rv:61.0) Gecko/20100101 Firefox/61.0', + 'Cookie': cookie +} + +CONCURRENT_REQUESTS = 16 + +DOWNLOAD_DELAY = 1 + +DOWNLOADER_MIDDLEWARES = { + 'scrapy.downloadermiddlewares.cookies.CookiesMiddleware': None, + 'scrapy.downloadermiddlewares.redirect.RedirectMiddleware': None, + 'middlewares.IPProxyMiddleware': 100, + 'scrapy.downloadermiddlewares.httpproxy.HttpProxyMiddleware': 101, +} + +ITEM_PIPELINES = { + 'pipelines.JsonWriterPipeline': 300, +} diff --git "a/14\343\200\201\345\276\256\345\215\232\347\210\254\350\231\253/weibospider/spiders/__init__.py" "b/14\343\200\201\345\276\256\345\215\232\347\210\254\350\231\253/weibospider/spiders/__init__.py" new file mode 100644 index 0000000..ebd689a --- /dev/null +++ "b/14\343\200\201\345\276\256\345\215\232\347\210\254\350\231\253/weibospider/spiders/__init__.py" @@ -0,0 +1,4 @@ +# This package will contain the spiders of your Scrapy project +# +# Please refer to the documentation for information on how to create and manage +# your spiders. diff --git "a/14\343\200\201\345\276\256\345\215\232\347\210\254\350\231\253/weibospider/spiders/comment.py" "b/14\343\200\201\345\276\256\345\215\232\347\210\254\350\231\253/weibospider/spiders/comment.py" new file mode 100644 index 0000000..4080946 --- /dev/null +++ "b/14\343\200\201\345\276\256\345\215\232\347\210\254\350\231\253/weibospider/spiders/comment.py" @@ -0,0 +1,56 @@ +#!/usr/bin/env python +# encoding: utf-8 +""" +Author: nghuyong +Mail: nghuyong@163.com +Created Time: 2020/4/14 +""" +import json +from scrapy import Spider +from scrapy.http import Request +from spiders.common import parse_user_info, parse_time, url_to_mid + + +class CommentSpider(Spider): + """ + 微博评论数据采集 + """ + name = "comment" + + def start_requests(self): + """ + 爬虫入口 + """ + # 这里tweet_ids可替换成实际待采集的数据 + tweet_ids = ['Mb15BDYR0'] + for tweet_id in tweet_ids: + mid = url_to_mid(tweet_id) + url = f"https://weibo.com/ajax/statuses/buildComments?" \ + f"is_reload=1&id={mid}&is_show_bulletin=2&is_mix=0&count=20" + yield Request(url, callback=self.parse, meta={'source_url': url}) + + def parse(self, response, **kwargs): + """ + 网页解析 + """ + data = json.loads(response.text) + for comment_info in data['data']: + item = self.parse_comment(comment_info) + yield item + if data.get('max_id', 0) != 0: + url = response.meta['source_url'] + '&max_id=' + str(data['max_id']) + yield Request(url, callback=self.parse, meta=response.meta) + + @staticmethod + def parse_comment(data): + """ + 解析comment + """ + item = dict() + item['created_at'] = parse_time(data['created_at']) + item['_id'] = data['id'] + item['like_counts'] = data['like_counts'] + item['ip_location'] = data['source'] + item['content'] = data['text_raw'] + item['comment_user'] = parse_user_info(data['user']) + return item diff --git "a/14\343\200\201\345\276\256\345\215\232\347\210\254\350\231\253/weibospider/spiders/common.py" "b/14\343\200\201\345\276\256\345\215\232\347\210\254\350\231\253/weibospider/spiders/common.py" new file mode 100644 index 0000000..9c5ab8e --- /dev/null +++ "b/14\343\200\201\345\276\256\345\215\232\347\210\254\350\231\253/weibospider/spiders/common.py" @@ -0,0 +1,105 @@ +#!/usr/bin/env python +# encoding: utf-8 +""" +Author: rightyonghu +Created Time: 2022/10/24 +""" +import dateutil.parser + + +def base62_decode(string): + """ + base + """ + alphabet = "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ" + string = str(string) + num = 0 + idx = 0 + for char in string: + power = (len(string) - (idx + 1)) + num += alphabet.index(char) * (len(alphabet) ** power) + idx += 1 + + return num + + +def reverse_cut_to_length(content, code_func, cut_num=4, fill_num=7): + """ + url to mid + """ + content = str(content) + cut_list = [content[i - cut_num if i >= cut_num else 0:i] for i in range(len(content), 0, (-1 * cut_num))] + cut_list.reverse() + result = [] + for i, item in enumerate(cut_list): + s = str(code_func(item)) + if i > 0 and len(s) < fill_num: + s = (fill_num - len(s)) * '0' + s + result.append(s) + return ''.join(result) + + +def url_to_mid(url: str): + """>>> url_to_mid('z0JH2lOMb') + 3501756485200075 + """ + result = reverse_cut_to_length(url, base62_decode) + return int(result) + + +def parse_time(s): + """ + Wed Oct 19 23:44:36 +0800 2022 => 2022-10-19 23:44:36 + """ + return dateutil.parser.parse(s).strftime('%Y-%m-%d %H:%M:%S') + + +def parse_user_info(data): + """ + 解析用户信息 + """ + # 基础信息 + user = { + "_id": str(data['id']), + "avatar_hd": data['avatar_hd'], + "nick_name": data['screen_name'], + "verified": data['verified'], + } + # 额外的信息 + keys = ['description', 'followers_count', 'friends_count', 'statuses_count', + 'gender', 'location', 'mbrank', 'mbtype', 'credit_score'] + for key in keys: + if key in data: + user[key] = data[key] + if 'created_at' in data: + user['created_at'] = parse_time(data.get('created_at')) + if user['verified']: + user['verified_type'] = data['verified_type'] + if 'verified_reason' in data: + user['verified_reason'] = data['verified_reason'] + return user + + +def parse_tweet_info(data): + """ + 解析推文数据 + """ + tweet = { + "_id": str(data['mid']), + "mblogid": data['mblogid'], + "created_at": parse_time(data['created_at']), + "geo": data['geo'], + "ip_location": data.get('region_name', None), + "reposts_count": data['reposts_count'], + "comments_count": data['comments_count'], + "attitudes_count": data['attitudes_count'], + "source": data['source'], + "content": data['text_raw'].replace('\u200b', ''), + "pic_urls": ["https://wx1.sinaimg.cn/orj960/" + pic_id for pic_id in data.get('pic_ids', [])], + "pic_num": data['pic_num'], + "user": parse_user_info(data['user']), + } + if 'page_info' in data and data['page_info'].get('object_type', '') == 'video': + tweet['video'] = data['page_info']['media_info']['mp4_720p_mp4'] + tweet['url'] = f"https://weibo.com/{tweet['user']['_id']}/{tweet['mblogid']}" + return tweet diff --git "a/14\343\200\201\345\276\256\345\215\232\347\210\254\350\231\253/weibospider/spiders/fan.py" "b/14\343\200\201\345\276\256\345\215\232\347\210\254\350\231\253/weibospider/spiders/fan.py" new file mode 100644 index 0000000..5a69ba8 --- /dev/null +++ "b/14\343\200\201\345\276\256\345\215\232\347\210\254\350\231\253/weibospider/spiders/fan.py" @@ -0,0 +1,45 @@ +#!/usr/bin/env python +# encoding: utf-8 +""" +Author: nghuyong +Mail: nghuyong@163.com +Created Time: 2020/4/14 +""" +import json +from scrapy import Spider +from scrapy.http import Request +from spiders.comment import parse_user_info + + +class FanSpider(Spider): + """ + 微博粉丝数据采集 + """ + name = "fan" + base_url = 'https://weibo.com/ajax/friendships/friends' + + def start_requests(self): + """ + 爬虫入口 + """ + # 这里user_ids可替换成实际待采集的数据 + user_ids = ['7726957925'] + for user_id in user_ids: + url = self.base_url + f"?relate=fans&page=1&uid={user_id}&type=fans" + yield Request(url, callback=self.parse, meta={'user': user_id, 'page_num': 1}) + + def parse(self, response, **kwargs): + """ + 网页解析 + """ + data = json.loads(response.text) + for user in data['users']: + item = dict() + item['follower_id'] = response.meta['user'] + item['fan_info'] = parse_user_info(user) + item['_id'] = response.meta['user'] + '_' + item['fan_info']['_id'] + yield item + if data['users']: + response.meta['page_num'] += 1 + url = self.base_url + f"?relate=fans&page={response.meta['page_num']}&uid={response.meta['user']}&type=fans" + yield Request(url, callback=self.parse, meta=response.meta) diff --git "a/14\343\200\201\345\276\256\345\215\232\347\210\254\350\231\253/weibospider/spiders/follower.py" "b/14\343\200\201\345\276\256\345\215\232\347\210\254\350\231\253/weibospider/spiders/follower.py" new file mode 100644 index 0000000..920c440 --- /dev/null +++ "b/14\343\200\201\345\276\256\345\215\232\347\210\254\350\231\253/weibospider/spiders/follower.py" @@ -0,0 +1,45 @@ +#!/usr/bin/env python +# encoding: utf-8 +""" +Author: nghuyong +Mail: nghuyong@163.com +Created Time: 2020/4/14 +""" +import json +from scrapy import Spider +from scrapy.http import Request +from spiders.comment import parse_user_info + + +class FollowerSpider(Spider): + """ + 微博关注数据采集 + """ + name = "follower" + base_url = 'https://weibo.com/ajax/friendships/friends' + + def start_requests(self): + """ + 爬虫入口 + """ + # 这里user_ids可替换成实际待采集的数据 + user_ids = ['7726957925'] + for user_id in user_ids: + url = self.base_url + f"?page=1&uid={user_id}" + yield Request(url, callback=self.parse, meta={'user': user_id, 'page_num': 1}) + + def parse(self, response, **kwargs): + """ + 网页解析 + """ + data = json.loads(response.text) + for user in data['users']: + item = dict() + item['fan_id'] = response.meta['user'] + item['follower_info'] = parse_user_info(user) + item['_id'] = response.meta['user'] + '_' + item['follower_info']['_id'] + yield item + if data['users']: + response.meta['page_num'] += 1 + url = self.base_url + f"?page={response.meta['page_num']}&uid={response.meta['user']}" + yield Request(url, callback=self.parse, meta=response.meta) diff --git "a/14\343\200\201\345\276\256\345\215\232\347\210\254\350\231\253/weibospider/spiders/repost.py" "b/14\343\200\201\345\276\256\345\215\232\347\210\254\350\231\253/weibospider/spiders/repost.py" new file mode 100644 index 0000000..99b1ff4 --- /dev/null +++ "b/14\343\200\201\345\276\256\345\215\232\347\210\254\350\231\253/weibospider/spiders/repost.py" @@ -0,0 +1,43 @@ +#!/usr/bin/env python +# encoding: utf-8 +""" +Author: nghuyong +Mail: nghuyong@163.com +Created Time: 2020/4/14 +""" +import json +from scrapy import Spider +from scrapy.http import Request +from spiders.common import parse_tweet_info, url_to_mid + + +class RepostSpider(Spider): + """ + 微博转发数据采集 + """ + name = "repost" + + def start_requests(self): + """ + 爬虫入口 + """ + # 这里tweet_ids可替换成实际待采集的数据 + tweet_ids = ['7726957925'] + for tweet_id in tweet_ids: + mid = url_to_mid(tweet_id) + url = f"https://weibo.com/ajax/statuses/repostTimeline?id={mid}&page=1&moduleID=feed&count=10" + yield Request(url, callback=self.parse, meta={'page_num': 1, 'mid': mid}) + + def parse(self, response, **kwargs): + """ + 网页解析 + """ + data = json.loads(response.text) + for tweet in data['data']: + item = parse_tweet_info(tweet) + yield item + if data['data']: + mid, page_num = response.meta['mid'], response.meta['page_num'] + page_num += 1 + url = f"https://weibo.com/ajax/statuses/repostTimeline?id={mid}&page={page_num}&moduleID=feed&count=10" + yield Request(url, callback=self.parse, meta={'page_num': page_num, 'mid': mid}) diff --git "a/14\343\200\201\345\276\256\345\215\232\347\210\254\350\231\253/weibospider/spiders/search.py" "b/14\343\200\201\345\276\256\345\215\232\347\210\254\350\231\253/weibospider/spiders/search.py" new file mode 100644 index 0000000..7683286 --- /dev/null +++ "b/14\343\200\201\345\276\256\345\215\232\347\210\254\350\231\253/weibospider/spiders/search.py" @@ -0,0 +1,52 @@ +#!/usr/bin/env python +# encoding: utf-8 +""" +Author: rightyonghu +Created Time: 2022/10/22 +""" +import json +import re +from scrapy import Spider, Request +from spiders.common import parse_tweet_info + + +class SearchSpider(Spider): + """ + 关键词搜索采集 + """ + name = "search_spider" + base_url = "https://s.weibo.com/" + + def start_requests(self): + """ + 爬虫入口 + """ + # 这里keywords可替换成实际待采集的数据 + keywords = ['程序员晚枫'] + for keyword in keywords: + url = f"https://s.weibo.com/weibo?q={keyword}&page=1" + yield Request(url, callback=self.parse, meta={'keyword': keyword}) + + def parse(self, response, **kwargs): + """ + 网页解析 + """ + html = response.text + tweet_ids = re.findall(r'\d+/(.*?)\?refer_flag=1001030103_\'\)">复制微博地址', html) + for tweet_id in tweet_ids: + url = f"https://weibo.com/ajax/statuses/show?id={tweet_id}" + yield Request(url, callback=self.parse_tweet, meta=response.meta) + next_page = re.search('', html) + if next_page: + url = "https://s.weibo.com" + next_page.group(1) + yield Request(url, callback=self.parse, meta=response.meta) + + @staticmethod + def parse_tweet(response): + """ + 解析推文 + """ + data = json.loads(response.text) + item = parse_tweet_info(data) + item['keyword'] = response.meta['keyword'] + yield item diff --git "a/14\343\200\201\345\276\256\345\215\232\347\210\254\350\231\253/weibospider/spiders/tweet.py" "b/14\343\200\201\345\276\256\345\215\232\347\210\254\350\231\253/weibospider/spiders/tweet.py" new file mode 100644 index 0000000..5b6080c --- /dev/null +++ "b/14\343\200\201\345\276\256\345\215\232\347\210\254\350\231\253/weibospider/spiders/tweet.py" @@ -0,0 +1,45 @@ +#!/usr/bin/env python +# encoding: utf-8 +""" +Author: nghuyong +Mail: nghuyong@163.com +Created Time: 2020/4/14 +""" +import json +from scrapy import Spider +from scrapy.http import Request +from spiders.common import parse_tweet_info + + +class TweetSpider(Spider): + """ + 用户推文数据采集 + """ + name = "tweet_spider" + base_url = "https://weibo.cn" + + def start_requests(self): + """ + 爬虫入口 + """ + # 这里user_ids可替换成实际待采集的数据 + user_ids = ['7726957925'] + for user_id in user_ids: + url = f"https://weibo.com/ajax/statuses/mymblog?uid={user_id}&page=1" + yield Request(url, callback=self.parse, meta={'user_id': user_id, 'page_num': 1}) + + def parse(self, response, **kwargs): + """ + 网页解析 + """ + data = json.loads(response.text) + tweets = data['data']['list'] + for tweet in tweets: + item = parse_tweet_info(tweet) + del item['user'] + yield item + if tweets: + user_id, page_num = response.meta['user_id'], response.meta['page_num'] + page_num += 1 + url = f"https://weibo.com/ajax/statuses/mymblog?uid={user_id}&page={page_num}" + yield Request(url, callback=self.parse, meta={'user_id': user_id, 'page_num': page_num}) diff --git "a/14\343\200\201\345\276\256\345\215\232\347\210\254\350\231\253/weibospider/spiders/user.py" "b/14\343\200\201\345\276\256\345\215\232\347\210\254\350\231\253/weibospider/spiders/user.py" new file mode 100644 index 0000000..f31610c --- /dev/null +++ "b/14\343\200\201\345\276\256\345\215\232\347\210\254\350\231\253/weibospider/spiders/user.py" @@ -0,0 +1,58 @@ +#!/usr/bin/env python +# encoding: utf-8 +""" +Author: nghuyong +Mail: nghuyong@163.com +Created Time: 2020/4/14 +""" +import json +from scrapy import Spider +from scrapy.http import Request +from spiders.common import parse_user_info + + +class UserSpider(Spider): + """ + 微博用户信息爬虫 + """ + name = "user_spider" + base_url = "https://weibo.cn" + + def start_requests(self): + """ + 爬虫入口 + """ + # 这里user_ids可替换成实际待采集的数据 + user_ids = ['7726957925'] + urls = [f'https://weibo.com/ajax/profile/info?uid={user_id}' for user_id in user_ids] + for url in urls: + yield Request(url, callback=self.parse) + + def parse(self, response, **kwargs): + """ + 网页解析 + """ + data = json.loads(response.text) + item = parse_user_info(data['data']['user']) + url = f"https://weibo.com/ajax/profile/detail?uid={item['_id']}" + yield Request(url, callback=self.parse_detail, meta={'item': item}) + + @staticmethod + def parse_detail(response): + """ + 解析详细数据 + """ + item = response.meta['item'] + data = json.loads(response.text)['data'] + item['birthday'] = data.get('birthday', '') + if 'created_at' not in item: + item['created_at'] = data.get('created_at', '') + item['desc_text'] = data.get('desc_text', '') + item['ip_location'] = data.get('ip_location', '') + item['sunshine_credit'] = data.get('sunshine_credit', {}).get('level', '') + item['label_desc'] = [label['name'] for label in data.get('label_desc', [])] + if 'company' in data: + item['company'] = data['company'] + if 'education' in data: + item['education'] = data['education'] + yield item diff --git "a/15\343\200\201PyQT5\345\206\231\344\272\206\344\270\252\345\217\257\350\247\206\345\214\226\345\244\251\346\260\224\346\237\245\350\257\242\350\275\257\344\273\266/Weather.py" "b/15\343\200\201PyQT5\345\206\231\344\272\206\344\270\252\345\217\257\350\247\206\345\214\226\345\244\251\346\260\224\346\237\245\350\257\242\350\275\257\344\273\266/Weather.py" new file mode 100644 index 0000000..a1b8110 --- /dev/null +++ "b/15\343\200\201PyQT5\345\206\231\344\272\206\344\270\252\345\217\257\350\247\206\345\214\226\345\244\251\346\260\224\346\237\245\350\257\242\350\275\257\344\273\266/Weather.py" @@ -0,0 +1,83 @@ +# 公众号:程序员晚枫 +# 60套Python视频教程:https://mp.weixin.qq.com/s/sO6hbVqORy7JpN-5TlaKvQ + +from PyQt5 import QtCore, QtGui, QtWidgets + +class Ui_Dialog(object): + + def setupUi(self, Dialog): + + Dialog.setObjectName("Dialog") + + Dialog.resize(600, 600) + + self.groupBox = QtWidgets.QGroupBox(Dialog) + + self.groupBox.setGeometry(QtCore.QRect(30, 20, 551, 511)) + + self.groupBox.setObjectName("groupBox") + + self.label_2 = QtWidgets.QLabel(self.groupBox) + + self.label_2.setGeometry(QtCore.QRect(20, 30, 31, 16)) + + self.label_2.setObjectName("label_2") + + self.comboBox = QtWidgets.QComboBox(self.groupBox) + + self.comboBox.setGeometry(QtCore.QRect(70, 30, 87, 22)) + + self.comboBox.setObjectName("comboBox") + + self.comboBox.addItem("") + + self.comboBox.addItem("") + + self.comboBox.addItem("") + + self.textEdit = QtWidgets.QTextEdit(self.groupBox) + + self.textEdit.setGeometry(QtCore.QRect(20, 70, 491, 411)) + + self.textEdit.setObjectName("textEdit") + + self.queryBtn = QtWidgets.QPushButton(Dialog) + + self.queryBtn.setGeometry(QtCore.QRect(490, 560, 93, 28)) + + self.queryBtn.setObjectName("queryBtn") + + self.clearBtn = QtWidgets.QPushButton(Dialog) + + self.clearBtn.setGeometry(QtCore.QRect(30, 560, 93, 28)) + + self.clearBtn.setObjectName("clearBtn") + + self.retranslateUi(Dialog) + + self.clearBtn.clicked.connect(Dialog.clearText) + + self.queryBtn.clicked.connect(Dialog.queryWeather) + + QtCore.QMetaObject.connectSlotsByName(Dialog) + + def retranslateUi(self, Dialog): + + _translate = QtCore.QCoreApplication.translate + + Dialog.setWindowTitle(_translate("Dialog", "Dialog")) + + self.groupBox.setTitle(_translate("Dialog", "城市天气预报")) + + self.label_2.setText(_translate("Dialog", "城市")) + + self.comboBox.setItemText(0, _translate("Dialog", "北京")) + + self.comboBox.setItemText(1, _translate("Dialog", "苏州")) + + self.comboBox.setItemText(2, _translate("Dialog", "上海")) + + self.queryBtn.setText(_translate("Dialog", "查询")) + + self.clearBtn.setText(_translate("Dialog", "清空")) + diff --git "a/15\343\200\201PyQT5\345\206\231\344\272\206\344\270\252\345\217\257\350\247\206\345\214\226\345\244\251\346\260\224\346\237\245\350\257\242\350\275\257\344\273\266/main.py" "b/15\343\200\201PyQT5\345\206\231\344\272\206\344\270\252\345\217\257\350\247\206\345\214\226\345\244\251\346\260\224\346\237\245\350\257\242\350\275\257\344\273\266/main.py" new file mode 100644 index 0000000..cdfc0da --- /dev/null +++ "b/15\343\200\201PyQT5\345\206\231\344\272\206\344\270\252\345\217\257\350\247\206\345\214\226\345\244\251\346\260\224\346\237\245\350\257\242\350\275\257\344\273\266/main.py" @@ -0,0 +1,84 @@ +# 公众号:程序员晚枫 +# 60套Python视频教程:https://mp.weixin.qq.com/s/sO6hbVqORy7JpN-5TlaKvQ + +import sys + +import Weather + +from PyQt5.QtWidgets import QApplication, QDialog + +import requests + +class MainDialog(QDialog): + + def __init__(self, parent=None): + + super(QDialog, self).__init__(parent) + + self.ui = Weather.Ui_Dialog() + + self.ui.setupUi(self) + + def queryWeather(self): + + cityName = self.ui.comboBox.currentText() + + cityCode = self.getCode(cityName) + + r = requests.get( + + "https://restapi.amap.com/v3/weather/weatherInfo?key=f4fd5b287b6d7d51a3c60fee24e42002&city={}".format( + + cityCode)) + + if r.status_code == 200: + + data = r.json()['lives'][0] + + weatherMsg = '城市:{}\n天气:{}\n温度:{}\n风向:{}\n风力:{}\n湿度:{}\n发布时间:{}\n'.format( + + data['city'], + + data['weather'], + + data['temperature'], + + data['winddirection'], + + data['windpower'], + + data['humidity'], + + data['reporttime'], + + ) + + else: + + weatherMsg = '天气查询失败,请稍后再试!' + + self.ui.textEdit.setText(weatherMsg) + + def getCode(self, cityName): + + cityDict = {"北京": "110000", + + "苏州": "320500", + + "上海": "310000"} + + return cityDict.get(cityName, '101010100') + + def clearText(self): + + self.ui.textEdit.clear() + +if __name__ == '__main__': + + myapp = QApplication(sys.argv) + + myDlg = MainDialog() + + myDlg.show() + + sys.exit(myapp.exec_()) \ No newline at end of file diff --git "a/16\343\200\201\347\224\250Python\345\206\231\344\272\206\344\270\252\344\272\224\345\255\220\346\243\213\346\270\270\346\210\217/PythonGomoku/.gitignore" "b/16\343\200\201\347\224\250Python\345\206\231\344\272\206\344\270\252\344\272\224\345\255\220\346\243\213\346\270\270\346\210\217/PythonGomoku/.gitignore" new file mode 100644 index 0000000..7c51ec9 --- /dev/null +++ "b/16\343\200\201\347\224\250Python\345\206\231\344\272\206\344\270\252\344\272\224\345\255\220\346\243\213\346\270\270\346\210\217/PythonGomoku/.gitignore" @@ -0,0 +1,4 @@ +__pycache__/ +.idea/ +*.exe +*.pyd diff --git "a/16\343\200\201\347\224\250Python\345\206\231\344\272\206\344\270\252\344\272\224\345\255\220\346\243\213\346\270\270\346\210\217/PythonGomoku/GomokuAi/GomokuAi.pro" "b/16\343\200\201\347\224\250Python\345\206\231\344\272\206\344\270\252\344\272\224\345\255\220\346\243\213\346\270\270\346\210\217/PythonGomoku/GomokuAi/GomokuAi.pro" new file mode 100644 index 0000000..104cdd4 --- /dev/null +++ "b/16\343\200\201\347\224\250Python\345\206\231\344\272\206\344\270\252\344\272\224\345\255\220\346\243\213\346\270\270\346\210\217/PythonGomoku/GomokuAi/GomokuAi.pro" @@ -0,0 +1,36 @@ +#------------------------------------------------- +# +# Project created by QtCreator 2019-11-06T01:16:46 +# +#------------------------------------------------- + +QT -= core gui + +TARGET = GomokuAi +TEMPLATE = lib + +DEFINES += GOMOKUAI_LIBRARY + +# The following define makes your compiler emit warnings if you use +# any feature of Qt which has been marked as deprecated (the exact warnings +# depend on your compiler). Please consult the documentation of the +# deprecated API in order to know how to port your code away from it. +DEFINES += QT_DEPRECATED_WARNINGS + +# You can also make your code fail to compile if you use deprecated APIs. +# In order to do so, uncomment the following line. +# You can also select to disable deprecated APIs only up to a certain version of Qt. +#DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0x060000 # disables all the APIs deprecated before Qt 6.0.0 + +SOURCES += \ + gomokuai.cpp \ + ai.cpp \ + constants.cpp + +INCLUDEPATH += D:\ProgramPackage\Python\Python36\include + +LIBS += -LD:\ProgramPackage\Python\Python36\libs -lpython36 + +HEADERS += \ + ai.h \ + constants.h diff --git "a/16\343\200\201\347\224\250Python\345\206\231\344\272\206\344\270\252\344\272\224\345\255\220\346\243\213\346\270\270\346\210\217/PythonGomoku/GomokuAi/GomokuAi.pro.user" "b/16\343\200\201\347\224\250Python\345\206\231\344\272\206\344\270\252\344\272\224\345\255\220\346\243\213\346\270\270\346\210\217/PythonGomoku/GomokuAi/GomokuAi.pro.user" new file mode 100644 index 0000000..81cfbb3 --- /dev/null +++ "b/16\343\200\201\347\224\250Python\345\206\231\344\272\206\344\270\252\344\272\224\345\255\220\346\243\213\346\270\270\346\210\217/PythonGomoku/GomokuAi/GomokuAi.pro.user" @@ -0,0 +1,321 @@ + + + + + + EnvironmentId + {d0ce7087-c8e4-4e24-81b7-01aa2d9eb69a} + + + ProjectExplorer.Project.ActiveTarget + 0 + + + ProjectExplorer.Project.EditorSettings + + true + false + true + + Cpp + + CppGlobal + + + + QmlJS + + QmlJSGlobal + + + 2 + UTF-8 + false + 4 + false + 80 + true + true + 1 + true + false + 0 + true + true + 0 + 8 + true + 1 + true + true + true + false + + + + ProjectExplorer.Project.PluginSettings + + + -fno-delayed-template-parsing + + true + + + + ProjectExplorer.Project.Target.0 + + Visual C++ Compiler 14.0 + Visual C++ Compiler 14.0 + {fab33e44-ba52-4ea3-b5ce-7ac6227fb857} + 1 + 0 + 0 + + D:/Documents/PythonPrograms/PythonGomoku-master/build-GomokuAi-Visual_C_Compiler_14_0-Debug + + + true + qmake + + QtProjectManager.QMakeBuildStep + true + + false + false + false + + + true + Make + + Qt4ProjectManager.MakeStep + + false + + + + 2 + Build + + ProjectExplorer.BuildSteps.Build + + + + true + Make + + Qt4ProjectManager.MakeStep + + true + clean + + + 1 + Clean + + ProjectExplorer.BuildSteps.Clean + + 2 + false + + Debug + Debug + Qt4ProjectManager.Qt4BuildConfiguration + 2 + true + + + D:/Documents/PythonPrograms/PythonGomoku-master/build-GomokuAi-Visual_C_Compiler_14_0-Release + + + true + qmake + + QtProjectManager.QMakeBuildStep + false + + false + false + true + + + true + Make + + Qt4ProjectManager.MakeStep + + false + + + + 2 + Build + + ProjectExplorer.BuildSteps.Build + + + + true + Make + + Qt4ProjectManager.MakeStep + + true + clean + + + 1 + Clean + + ProjectExplorer.BuildSteps.Clean + + 2 + false + + Release + Release + Qt4ProjectManager.Qt4BuildConfiguration + 0 + true + + + D:/Documents/PythonPrograms/PythonGomoku-master/build-GomokuAi-Visual_C_Compiler_14_0-Profile + + + true + qmake + + QtProjectManager.QMakeBuildStep + true + + false + true + true + + + true + Make + + Qt4ProjectManager.MakeStep + + false + + + + 2 + Build + + ProjectExplorer.BuildSteps.Build + + + + true + Make + + Qt4ProjectManager.MakeStep + + true + clean + + + 1 + Clean + + ProjectExplorer.BuildSteps.Clean + + 2 + false + + Profile + Profile + Qt4ProjectManager.Qt4BuildConfiguration + 0 + true + + 3 + + + 0 + 部署 + + ProjectExplorer.BuildSteps.Deploy + + 1 + Deploy Configuration + + ProjectExplorer.DefaultDeployConfiguration + + 1 + + + false + false + 1000 + + true + + false + false + false + false + true + 0.01 + 10 + true + 1 + 25 + + 1 + true + false + true + valgrind + + 0 + 1 + 2 + 3 + 4 + 5 + 6 + 7 + 8 + 9 + 10 + 11 + 12 + 13 + 14 + + 2 + + + + + + Custom Executable + + ProjectExplorer.CustomExecutableRunConfiguration + 3768 + false + true + false + false + true + + 1 + + + + ProjectExplorer.Project.TargetCount + 1 + + + ProjectExplorer.Project.Updater.FileVersion + 18 + + + Version + 18 + + diff --git "a/16\343\200\201\347\224\250Python\345\206\231\344\272\206\344\270\252\344\272\224\345\255\220\346\243\213\346\270\270\346\210\217/PythonGomoku/GomokuAi/ai.cpp" "b/16\343\200\201\347\224\250Python\345\206\231\344\272\206\344\270\252\344\272\224\345\255\220\346\243\213\346\270\270\346\210\217/PythonGomoku/GomokuAi/ai.cpp" new file mode 100644 index 0000000..02a00ac --- /dev/null +++ "b/16\343\200\201\347\224\250Python\345\206\231\344\272\206\344\270\252\344\272\224\345\255\220\346\243\213\346\270\270\346\210\217/PythonGomoku/GomokuAi/ai.cpp" @@ -0,0 +1,522 @@ +#include +#include +#include "ai.h" + + +int Node::JudgeRes() +{ + // 1 判断是否有横向的连续五子 + for(int x = 0; x <= 10; x++){ + for (int y = 0; y <= 14; y++){ + if (GameMap[x][y] == 1 && GameMap[x + 1][y] == 1 && GameMap[x + 2][y] == 1 && GameMap[x + 3][y] == 1 && GameMap[x + 4][y] == 1) + return 1; + if (GameMap[x][y] == 2 && GameMap[x + 1][y] == 2 && GameMap[x + 2][y] == 2 && GameMap[x + 3][y] == 2 && GameMap[x + 4][y] == 2) + return 2; + } + } + // 2 判断是否有纵向的连续五子 + for (int x = 0; x <= 14; x++){ + for (int y = 0; y <= 10; y++){ + if (GameMap[x][y] == 1 && GameMap[x][y + 1] == 1 && GameMap[x][y + 2] == 1 && GameMap[x][y + 3] == 1 && GameMap[x][y + 4] == 1) + return 1; + if (GameMap[x][y] == 2 && GameMap[x][y + 1] == 2 && GameMap[x][y + 2] == 2 && GameMap[x][y + 3] == 2 && GameMap[x][y + 4] == 2) + return 2; + } + } + // 3 判断是否有斜向的连续五子 + for (int x = 0; x <= 10; x++){ + for (int y = 0; y <= 10; y++){ + if (GameMap[x][y] == 1 && GameMap[x + 1][y + 1] == 1 && GameMap[x + 2][y + 2] == 1 && GameMap[x + 3][y + 3] == 1 && GameMap[x + 4][y + 4] == 1) + return 1; + if (GameMap[x][y] == 2 && GameMap[x + 1][y + 1] == 2 && GameMap[x + 2][y + 2] == 2 && GameMap[x + 3][y + 3] == 2 && GameMap[x + 4][y + 4] == 2) + return 2; + } + } + for (int x = 0; x <= 10; x++){ + for (int y = 0; y <= 10; y++){ + if (GameMap[x + 4][y] == 1 && GameMap[x + 3][y + 1] == 1 && GameMap[x + 2][y + 2] == 1 && GameMap[x + 1][y + 3] == 1 && GameMap[x][y + 4] == 1) + return 1; + if (GameMap[x + 4][y] == 2 && GameMap[x + 3][y + 1] == 2 && GameMap[x + 2][y + 2] == 2 && GameMap[x + 1][y + 3] == 2 && GameMap[x][y + 4] == 2) + return 1; + } + } + return 0; +} + +void Node::Judge4(uint32_t& ai_4_num, uint32_t& player_4_num){ + player_4_num = 0; + ai_4_num = 0; + int player_cnt, ai_cnt; + // 1 是否有横向四子 + for(int x = 0; x <= 10; x++){ + for (int y = 0; y <= 14; y++){ + player_cnt = (GameMap[x][y] == 1) + (GameMap[x + 1][y] == 1) + (GameMap[x + 2][y] == 1) + (GameMap[x + 3][y] == 1) + (GameMap[x + 4][y] == 1); + ai_cnt = (GameMap[x][y] == 2) + (GameMap[x + 1][y] == 2) + (GameMap[x + 2][y] == 2) + (GameMap[x + 3][y] == 2) + (GameMap[x + 4][y] == 2); + if ((player_cnt == 4) && (ai_cnt == 0)) + player_4_num += 1; + if ((player_cnt == 0) && (ai_cnt == 4)) + ai_4_num += 1; + } + } + // 2 是否有纵向四子 + for (int x = 0; x <= 14; x++){ + for (int y = 0; y <= 10; y++){ + player_cnt = (GameMap[x][y] == 1) + (GameMap[x][y + 1] == 1) + (GameMap[x][y + 2] == 1) + (GameMap[x][y + 3] == 1) + (GameMap[x][y + 4] == 1); + ai_cnt = (GameMap[x][y] == 2) + (GameMap[x][y + 1] == 2) + (GameMap[x][y + 2] == 2) + (GameMap[x][y + 3] == 2) + (GameMap[x][y + 4] == 2); + if ((player_cnt == 4) && (ai_cnt == 0)) + player_4_num += 1; + if ((player_cnt == 0) && (ai_cnt == 4)) + ai_4_num += 1; + } + } + // 3 是否有斜向四子 + for (int x = 0; x <= 10; x++){ + for (int y = 0; y <= 10; y++){ + player_cnt = (GameMap[x][y] == 1) + (GameMap[x + 1][y + 1] == 1) + (GameMap[x + 2][y + 2] == 1) + (GameMap[x + 3][y + 3] == 1) + (GameMap[x + 4][y + 4] == 1); + ai_cnt = (GameMap[x][y] == 2) + (GameMap[x + 1][y + 1] == 2) + (GameMap[x + 2][y + 2] == 2) + (GameMap[x + 3][y + 3] == 2) + (GameMap[x + 4][y + 4] == 2); + if ((player_cnt == 4) && (ai_cnt == 0)) + player_4_num += 1; + if ((player_cnt == 0) && (ai_cnt == 4)) + ai_4_num += 1; + } + } + for (int x = 0; x <= 10; x++){ + for (int y = 0; y <= 10; y++){ + player_cnt = (GameMap[x + 4][y] == 1) + (GameMap[x + 3][y + 1] == 1) + (GameMap[x + 2][y + 2] == 1) + (GameMap[x + 1][y + 3] == 1) + (GameMap[x][y + 4] == 1); + ai_cnt = (GameMap[x + 4][y] == 2) + (GameMap[x + 3][y + 1] == 2) + (GameMap[x + 2][y + 2] == 2) + (GameMap[x + 1][y + 3] == 2) + (GameMap[x][y + 4] == 2); + if ((player_cnt == 4) && (ai_cnt == 0)) + player_4_num += 1; + if ((player_cnt == 0) && (ai_cnt == 4)) + ai_4_num += 1; + } + } +} + +void Node::Judge3D(uint32_t& ai_3d_num, uint32_t& player_3d_num){ + player_3d_num = 0; + ai_3d_num = 0; + // 1 xooox的形式 + // 1.1 横向xooox的形式 + for (int x = 0; x <= 10; x++){ + for (int y = 0; y <= 14; y++){ + if (GameMap[x][y] == 0 && GameMap[x + 1][y] == 1 && GameMap[x + 2][y] == 1 && GameMap[x + 3][y] == 1 && GameMap[x + 4][y] == 0) + player_3d_num += 1; + if (GameMap[x][y] == 0 && GameMap[x + 1][y] == 2 && GameMap[x + 2][y] == 2 && GameMap[x + 3][y] == 2 && GameMap[x + 4][y] == 0) + ai_3d_num += 1; + } + } + // 1.2 纵向xooox的形式 + for (int x = 0; x <= 14; x++){ + for (int y = 0; y <= 10; y++){ + if (GameMap[x][y] == 0 && GameMap[x][y + 1] == 1 && GameMap[x][y + 2] == 1 && GameMap[x][y + 3] == 1 && GameMap[x][y + 4] == 0) + player_3d_num += 1; + if (GameMap[x][y] == 0 && GameMap[x][y + 1] == 2 && GameMap[x][y + 2] == 2 && GameMap[x][y + 3] == 2 && GameMap[x][y + 4] == 0) + ai_3d_num += 1; + } + } + // 1.3 斜向xooox的形式 + for (int x = 0; x <= 10; x++){ + for (int y = 0; y <= 10; y++){ + if (GameMap[x][y] == 0 && GameMap[x + 1][y + 1] == 1 && GameMap[x + 2][y + 2] == 1 && GameMap[x + 3][y + 3] == 1 && GameMap[x + 4][y + 4] == 0) + player_3d_num += 1; + if (GameMap[x][y] == 0 && GameMap[x + 1][y + 1] == 2 && GameMap[x + 2][y + 2] == 2 && GameMap[x + 3][y + 3] == 2 && GameMap[x + 4][y + 4] == 0) + ai_3d_num += 1; + } + } + for (int x = 0; x <= 10; x++){ + for (int y = 0; y <= 10; y++){ + if (GameMap[x + 4][y] == 0 && GameMap[x + 3][y + 1] == 1 && GameMap[x + 2][y + 2] == 1 && GameMap[x + 1][y + 3] == 1 && GameMap[x][y + 4] == 0) + player_3d_num += 1; + if (GameMap[x + 4][y] == 0 && GameMap[x + 3][y + 1] == 2 && GameMap[x + 2][y + 2] == 2 && GameMap[x + 1][y + 3] == 2 && GameMap[x][y + 4] == 0) + ai_3d_num += 1; + } + } + + // 2 xoxoox或xooxox的形式 + // 2.1 横向xoxoox或横向xooxox的形式 + for (int x = 0; x <= 9; x++){ + for (int y = 0; y <= 14; y++){ + if (GameMap[x][y] == 0 && GameMap[x + 1][y] == 1 && ((GameMap[x + 2][y] == 1) ^ (GameMap[x + 3][y] == 1)) && GameMap[x + 4][y] == 1 && GameMap[x + 5][y] == 0) + player_3d_num += 1; + if (GameMap[x][y] == 0 && GameMap[x + 1][y] == 2 && ((GameMap[x + 2][y] == 2) ^ (GameMap[x + 3][y] == 2)) && GameMap[x + 4][y] == 2 && GameMap[x + 5][y] == 0) + ai_3d_num += 1; + } + } + // 2.2 纵向xoxoox或纵向xooxox的形式 + for (int x = 0; x <= 14; x++){ + for (int y = 0; y <= 9; y++){ + if (GameMap[x][y] == 0 && GameMap[x][y + 1] == 1 && ((GameMap[x][y + 2] == 1) ^ (GameMap[x][y + 3] == 1)) && GameMap[x][y + 4] == 1 && GameMap[x][y + 5] == 0) + player_3d_num += 1; + if (GameMap[x][y] == 0 && GameMap[x][y + 1] == 2 && ((GameMap[x][y + 2] == 2) ^ (GameMap[x][y + 3] == 2)) && GameMap[x][y + 4] == 2 && GameMap[x][y + 5] == 0) + ai_3d_num += 1; + } + } + // 2.3 斜向xoxoox或斜向xooxox的形式 + for (int x = 0; x <= 9; x++){ + for (int y = 0; y <= 9; y++){ + if (GameMap[x][y] == 0 && GameMap[x + 1][y + 1] == 1 && ((GameMap[x + 2][y + 2] == 1) ^ (GameMap[x + 3][y + 3] == 1)) && GameMap[x + 4][y + 4] == 1 && GameMap[x + 5][y + 5] == 0) + player_3d_num += 1; + if (GameMap[x][y] == 0 && GameMap[x + 1][y + 1] == 2 && ((GameMap[x + 2][y + 2] == 2) ^ (GameMap[x + 3][y + 3] == 2)) && GameMap[x + 4][y + 4] == 2 && GameMap[x + 5][y + 5] == 0) + ai_3d_num += 1; + } + } + for (int x = 0; x <= 9; x++){ + for (int y = 0; y <= 9; y++){ + if (GameMap[x + 5][y] == 0 && GameMap[x + 4][y + 1] == 1 && ((GameMap[x + 3][y + 2] == 1) ^ (GameMap[x + 2][y + 3] == 1)) && GameMap[x + 1][y + 4] == 1 && GameMap[x][y + 5] == 0) + player_3d_num += 1; + if (GameMap[x + 5][y] == 0 && GameMap[x + 4][y + 1] == 2 && ((GameMap[x + 3][y + 2] == 2) ^ (GameMap[x + 2][y + 3] == 2)) && GameMap[x + 1][y + 4] == 2 && GameMap[x][y + 5] == 0) + ai_3d_num += 1; + } + } +} + +int Node::CalcScore(){ + // 1.如果能够连成五子,则记为100分 + const int res = JudgeRes(); + if (res == 2) + return 100; + else if (res == 1) + return -100; + + // 2.判断玩家和电脑的四子的数目(需要保证:不是已经被堵死的四子) + uint32_t ai_4_num; + uint32_t player_4_num; + Judge4(ai_4_num, player_4_num); + + // 3.如果能够连成活四,或连成双四,则记为90分 + if (PlayerFirst){ + if (Depth % 2 == 0){ //该轮到玩家出了 + if (player_4_num >= 2) + return -90; + else if (ai_4_num >= 2 && player_4_num == 0) + return 90; + }else{ + if (ai_4_num >= 2) + return 90; + else if (player_4_num >= 2 && ai_4_num == 0) + return -90; + } + }else{ + if (Depth % 2 == 0){ //该轮到玩家出了 + if (ai_4_num >= 2) + return 90; + else if (player_4_num >= 2 && ai_4_num == 0) + return -90; + }else{ + if (player_4_num >= 2) + return -90; + else if (ai_4_num >= 2 && player_4_num == 0) + return 90; + } + } + + // 4.从这里开始,对于force_score为False的情况,分数记为±inf + if (ForceScore == false){ + if (PlayerFirst){ + if (Depth % 2 == 0) //该轮到玩家出了 + return INF; + else //该轮到电脑出了 + return -INF; + }else{ + if (Depth % 2 == 0) //该轮到电脑出了 + return -INF; + else //该轮到玩家出了 + return INF; + } + } + + // 5.判断玩家和电脑的活三的数目 + uint32_t ai_3d_num; + uint32_t player_3d_num; + Judge3D(ai_3d_num, player_3d_num); + + // 6.如果能够连成四三,则记为80分 + if (PlayerFirst){ + if (Depth % 2 == 0){ //该轮到玩家出了 + if (player_4_num && player_3d_num) + return -80; + if (ai_4_num && ai_3d_num) + return 80; + }else{ //该轮到电脑出了 + if (ai_4_num && ai_3d_num) + return 80; + if (player_4_num && player_3d_num) + return -80; + } + }else{ + if (Depth % 2 == 0){ //该轮到电脑出了 + if (ai_4_num && ai_3d_num) + return 80; + if (player_4_num && player_3d_num) + return -80; + }else{ //该轮到玩家出了 + if (ai_4_num && ai_3d_num) + return 80; + if (player_4_num && player_3d_num) + return -80; + } + } + + // 7.如果能够连成四子,则记为70分 + if (PlayerFirst){ + if (Depth % 2 == 0){ //该轮到玩家出了 + if (player_4_num) + return -70; + if (ai_4_num) + return 70; + }else{ //该轮到电脑出了 + if (ai_4_num) + return 70; + if (player_4_num) + return -70; + } + }else{ + if (Depth % 2 == 0){ //该轮到电脑出了 + if (ai_4_num) + return 70; + if (player_4_num) + return -70; + }else{ //该轮到玩家出了 + if (ai_4_num) + return 70; + if (player_4_num) + return -70; + } + } + + // 8.如果能够连成双三,则记为60分 + if (PlayerFirst){ + if (Depth % 2 == 0){ //该轮到玩家出了 + if (player_3d_num >= 2) + return -60; + if (ai_3d_num >= 2) + return 60; + }else{ //该轮到电脑出了 + if (ai_3d_num >= 2) + return 60; + if (player_3d_num >= 2) + return -60; + } + }else{ + if (Depth % 2 == 0){ //该轮到电脑出了 + if (ai_3d_num >= 2) + return 60; + if (player_3d_num >= 2) + return -60; + }else{ //该轮到玩家出了 + if (ai_3d_num >= 2) + return 60; + if (player_3d_num >= 2) + return -60; + } + } + + // 9. 如果能够连成单活三,则记为50分 + if (PlayerFirst){ + if (Depth % 2 == 0){ //该轮到玩家出了 + if (player_3d_num) + return -50; + if (ai_3d_num) + return 50; + }else{ //该轮到电脑出了 + if (ai_3d_num) + return 50; + if (player_3d_num) + return -50; + } + }else{ + if (Depth % 2 == 0){ //该轮到电脑出了 + if (ai_3d_num) + return 50; + if (player_3d_num) + return -50; + }else{ //该轮到玩家出了 + if (ai_3d_num) + return 50; + if (player_3d_num) + return -50; + } + } + // 10. 其他情况。按照棋子的分布来计分(根据这个棋子距离棋盘中心的距离,以及这个棋子周围8格棋子的个数来评分) + int player_score_num = 0; //玩家和电脑所有棋子的得分总和 + int ai_score_num = 0; + int player_piece_cnt = 0; //玩家和电脑的棋子数量 + int ai_piece_cnt = 0; + for (int x = 0; x <= 14; x++){ + for (int y = 0; y <= 14; y++){ + if (GameMap[x][y] == 1){ + int around_cnt = 0; + for (int x0 = x - 1; x0 <= x + 1; x0++){ + for (int y0 = y - 1; y0 <= y + 1; y0++){ + if (x0 >= 0 && x0 <= 14 && y0 >= 0 && y0 <= 14 && GameMap[x0][y0] != 0) + around_cnt += 1; + } + } + player_score_num += ScoreByNumArount[around_cnt] - abs(x - 7) - abs(y - 7); + player_piece_cnt += 1; + } + if (GameMap[x][y] == 2){ + int around_cnt = 0; + for (int x0 = x - 1; x0 <= x + 1; x0++){ + for (int y0 = y - 1; y0 <= y + 1; y0++){ + if (x0 >= 0 && x0 <= 14 && y0 >= 0 && y0 <= 14 && GameMap[x0][y0] != 0) + around_cnt += 1; + } + } + ai_score_num += ScoreByNumArount[around_cnt] - abs(x - 7) - abs(y - 7); + ai_piece_cnt += 1; + } + } + } + if (ai_piece_cnt == 0 || player_piece_cnt == 0) + return 0; + return ai_score_num / ai_piece_cnt - player_score_num / player_piece_cnt; +} + + + +set Node::GetOpeList() +{ + // 1 找到所有可以落子的点 + set ope_list = set(); + for (int x = 0; x <= 14; x++){ + for (int y = 0; y <= 14; y++){ + if (GameMap[x][y] != 0){ + for (int x0 = x - 1; x0 <= x + 1; x0++){ + for (int y0 = y - 1; y0 <= y + 1; y0++){ + Point temp_point(x0, y0); + if (x0 >= 0 && x0 <= 14 && y0 >= 0 && y0 <= 14 && ope_list.find(temp_point) == ope_list.end() && GameMap[x0][y0] == 0) + ope_list.insert(temp_point); + } + } + } + } + } + return ope_list; +} + +void AI1Step::Search(const uint32_t cur_node_dx, const uint32_t max_depth){ + // 1.首先确认什么地方可以落子。落子的条件是:这个格子必须为空,周围8格内必须有至少一个棋子 + set ope_list = MethodTree[cur_node_dx].GetOpeList(); + // 2. 然后对每一个可以落子的格子进行搜索 + for (set::iterator cell_it = ope_list.begin(); cell_it != ope_list.end(); cell_it++) + { + // 2.1 创建一个子节点,并计算这个子节点的分数 + int i_map[15][15]; + memcpy(i_map, MethodTree[cur_node_dx].GameMap, sizeof(int) * 15 * 15); + if (PlayerFirst){ + if (MethodTree[cur_node_dx].Depth % 2 == 0) //轮到玩家出 + i_map[cell_it->X][cell_it->Y] = 1; + else //轮到电脑出 + i_map[cell_it->X][cell_it->Y] = 2; + }else{ + //这里和Python的code不一致 + if (MethodTree[cur_node_dx].Depth % 2 == 0) //轮到电脑出 + i_map[cell_it->X][cell_it->Y] = 2; + else //轮到玩家出 + i_map[cell_it->X][cell_it->Y] = 1; + } + + if (max_depth >= 2 && ope_list.size() >= 2) //对于非最终层的节点,不急于立即算出分数 + { + Node node_new(i_map, *cell_it, MethodTree[cur_node_dx].Depth + 1, MethodTree[cur_node_dx].Alpha, MethodTree[cur_node_dx].Beta, false, PlayerFirst); + node_new.Score = node_new.CalcScore(); + MethodTree.push_back(node_new); + }else{ + Node node_new(i_map, *cell_it, MethodTree[cur_node_dx].Depth + 1, MethodTree[cur_node_dx].Alpha, MethodTree[cur_node_dx].Beta, true, PlayerFirst); + node_new.Score = node_new.CalcScore(); + MethodTree.push_back(node_new); + } + unsigned long node_new_dx; + node_new_dx = MethodTree.size() - 1; + NextNodeList.push_back(-1); //记录每个节点下一步的动作 + if (MethodTree.size() >= MaxNodeNum) + { + printf("Method Tree is too big.\n"); + abort(); + } + + // 2.2 根据子节点的情况,进行父节点的后续操作 + if (MethodTree[node_new_dx].Score > -INF && MethodTree[node_new_dx].Score < INF){ + // 子节点有具体分数的情况下,就不用再进行更深层的迭代了 + if (PlayerFirst){ + if (MethodTree[cur_node_dx].Depth % 2 == 0){ //这一步是假想中玩家走的,因此需要让分数尽量小,且应该修改beta值 + if (MethodTree[node_new_dx].Score < MethodTree[cur_node_dx].Score){ + MethodTree[cur_node_dx].Score = MethodTree[node_new_dx].Score; + MethodTree[cur_node_dx].Beta = MethodTree[node_new_dx].Score; + NextNodeList[cur_node_dx] = static_cast(node_new_dx); + } + }else{ //这一步是假想中电脑走的,因此需要让分数尽量大,且应该修改alpha值 + if (MethodTree[node_new_dx].Score > MethodTree[cur_node_dx].Score){ + MethodTree[cur_node_dx].Score = MethodTree[node_new_dx].Score; + MethodTree[cur_node_dx].Alpha = MethodTree[node_new_dx].Score; + NextNodeList[cur_node_dx] = static_cast(node_new_dx); + } + } + }else{ + if (MethodTree[cur_node_dx].Depth % 2 == 0){ //这一步是假想中电脑走的,因此需要让分数尽量大,且应该修改alpha值 + if (MethodTree[node_new_dx].Score > MethodTree[cur_node_dx].Score){ + MethodTree[cur_node_dx].Score = MethodTree[node_new_dx].Score; + MethodTree[cur_node_dx].Alpha = MethodTree[node_new_dx].Score; + NextNodeList[cur_node_dx] = static_cast(node_new_dx); + } + }else{ //这一步是假想中玩家走的,因此需要让分数尽量小,且应该修改beta值 + if (MethodTree[cur_node_dx].Depth % 2 == 0){ //这一步是假想中玩家走的,因此需要让分数尽量小,且应该修改beta值 + if (MethodTree[node_new_dx].Score < MethodTree[cur_node_dx].Score){ + MethodTree[cur_node_dx].Score = MethodTree[node_new_dx].Score; + MethodTree[cur_node_dx].Beta = MethodTree[node_new_dx].Score; + NextNodeList[cur_node_dx] = static_cast(node_new_dx); + } + } + } + } + }else{ + //子节点还没有具体分数的情况下,应该以这个子节点为下一层的根节点,进行递归,之后再进行计算 + if (max_depth >= 2) + Search(static_cast(node_new_dx), max_depth - 1); + //根据递归后计算的结果,计算这个节点的分数 + if (PlayerFirst){ + if (MethodTree[cur_node_dx].Depth % 2 == 0){ //这一步是假想中玩家走的,因此需要让分数尽量小,且应该修改beta值 + if (MethodTree[node_new_dx].Score < MethodTree[cur_node_dx].Score){ + MethodTree[cur_node_dx].Score = MethodTree[node_new_dx].Score; + MethodTree[cur_node_dx].Beta = MethodTree[node_new_dx].Score; + NextNodeList[cur_node_dx] = static_cast(node_new_dx); + } + }else{ //这一步是假想中电脑走的,因此需要让分数尽量大,且应该修改alpha值 + if (MethodTree[node_new_dx].Score > MethodTree[cur_node_dx].Score){ + MethodTree[cur_node_dx].Score = MethodTree[node_new_dx].Score; + MethodTree[cur_node_dx].Alpha = MethodTree[node_new_dx].Score; + NextNodeList[cur_node_dx] = static_cast(node_new_dx); + } + } + }else{ + if (MethodTree[cur_node_dx].Depth % 2 == 0){ //这一步是假想中电脑走的,因此需要让分数尽量大,且应该修改alpha值 + if (MethodTree[node_new_dx].Score > MethodTree[cur_node_dx].Score){ + MethodTree[cur_node_dx].Score = MethodTree[node_new_dx].Score; + MethodTree[cur_node_dx].Alpha = MethodTree[node_new_dx].Score; + NextNodeList[cur_node_dx] = static_cast(node_new_dx); + } + }else{ //这一步是假想中玩家走的,因此需要让分数尽量小,且应该修改beta值 + if (MethodTree[node_new_dx].Score < MethodTree[cur_node_dx].Score){ + MethodTree[cur_node_dx].Score = MethodTree[node_new_dx].Score; + MethodTree[cur_node_dx].Beta = MethodTree[node_new_dx].Score; + NextNodeList[cur_node_dx] = static_cast(node_new_dx); + } + } + } + //alpha-beta剪枝 + if (MethodTree[cur_node_dx].Alpha > MethodTree[cur_node_dx].Beta) + return; + if (MethodTree.size() >= MaxNodeNum / 2) + return; + } + } +} + +Point AI1Step::GetFinalRes(){ + if (NextNodeList[0] == -1){ + printf("NextNodeList[0] = -1.\n"); +// abort(); + } + return MethodTree[NextNodeList[0]].Ope; +} diff --git "a/16\343\200\201\347\224\250Python\345\206\231\344\272\206\344\270\252\344\272\224\345\255\220\346\243\213\346\270\270\346\210\217/PythonGomoku/GomokuAi/ai.h" "b/16\343\200\201\347\224\250Python\345\206\231\344\272\206\344\270\252\344\272\224\345\255\220\346\243\213\346\270\270\346\210\217/PythonGomoku/GomokuAi/ai.h" new file mode 100644 index 0000000..5866617 --- /dev/null +++ "b/16\343\200\201\347\224\250Python\345\206\231\344\272\206\344\270\252\344\272\224\345\255\220\346\243\213\346\270\270\346\210\217/PythonGomoku/GomokuAi/ai.h" @@ -0,0 +1,68 @@ +#include +#include +#include +#include "constants.h" + +using namespace std; + +struct Point +{ + int X; + int Y; + Point(const int& x, const int& y): X(x), Y(y){} + bool operator < (const Point& p) const { + if (this->Y * 15 + this->X < p.Y * 15 + p.X) + return true; + return false; + } + bool operator == (const Point& p) const { + if (this->X == p.X && this->Y == p.Y) + return true; + return false; + } +}; + +class Node +{ +public: + Node(int g_map[15][15], const Point& ope, const int& depth, const int& alpha, const int& beta, const bool& force_score, const bool& player_first): Depth(depth), Alpha(alpha), Beta(beta), Ope(ope), ForceScore(force_score), PlayerFirst(player_first){ + memcpy(GameMap, g_map, sizeof(int) * 15 * 15); + } + + int CalcScore(); //计算这个节点的分数。对AI越有利则分数越高,反之分数越低 + set GetOpeList(); //获取可以操作的点的列表 + int Score; + + int GameMap[15][15]; //游戏内容。 + int Depth; + int Alpha; + int Beta; + Point Ope; + +private: + int ForceScore; + int PlayerFirst; + int JudgeRes(); //判断游戏胜负 + void Judge4(uint32_t& ai_4_num, uint32_t& player_4_num); //判断玩家和电脑的四子的数目 + void Judge3D(uint32_t& ai_3d_num, uint32_t& player_3d_num); //判断玩家和电脑的活三的数目 +}; + + +class AI1Step +{ +public: + AI1Step(int init_map[15][15], int init_depth, bool player_first): PlayerFirst(player_first){ + Node node_init = Node(init_map, Point(-1, -1), init_depth, -INF, INF, false, PlayerFirst); + MethodTree = {node_init}; // 策略树 + NextNodeList = {-1}; //每个节点的下一步节点列表。-1表示这个节点为最终节点 + } + + void Search(const uint32_t cur_node_dx, const uint32_t max_depth); + Point GetFinalRes(); + + uint32_t res; + vector MethodTree; +private: + const int PlayerFirst; + vector NextNodeList; +}; diff --git "a/16\343\200\201\347\224\250Python\345\206\231\344\272\206\344\270\252\344\272\224\345\255\220\346\243\213\346\270\270\346\210\217/PythonGomoku/GomokuAi/constants.cpp" "b/16\343\200\201\347\224\250Python\345\206\231\344\272\206\344\270\252\344\272\224\345\255\220\346\243\213\346\270\270\346\210\217/PythonGomoku/GomokuAi/constants.cpp" new file mode 100644 index 0000000..81ab8f2 --- /dev/null +++ "b/16\343\200\201\347\224\250Python\345\206\231\344\272\206\344\270\252\344\272\224\345\255\220\346\243\213\346\270\270\346\210\217/PythonGomoku/GomokuAi/constants.cpp" @@ -0,0 +1,4 @@ +#include "constants.h" + +int ScoreByNumArount[9] = {0, 1, 20, 30, 26, 24, 22, 20, 18}; +const uint32_t MaxNodeNum = 1000000; diff --git "a/16\343\200\201\347\224\250Python\345\206\231\344\272\206\344\270\252\344\272\224\345\255\220\346\243\213\346\270\270\346\210\217/PythonGomoku/GomokuAi/constants.h" "b/16\343\200\201\347\224\250Python\345\206\231\344\272\206\344\270\252\344\272\224\345\255\220\346\243\213\346\270\270\346\210\217/PythonGomoku/GomokuAi/constants.h" new file mode 100644 index 0000000..c402c48 --- /dev/null +++ "b/16\343\200\201\347\224\250Python\345\206\231\344\272\206\344\270\252\344\272\224\345\255\220\346\243\213\346\270\270\346\210\217/PythonGomoku/GomokuAi/constants.h" @@ -0,0 +1,7 @@ +#include + +#define INF 100000 +#define AI_DEBUG false + +extern int ScoreByNumArount[9]; +extern const uint32_t MaxNodeNum; //最大允许的节点数量(避免内存占用过多) diff --git "a/16\343\200\201\347\224\250Python\345\206\231\344\272\206\344\270\252\344\272\224\345\255\220\346\243\213\346\270\270\346\210\217/PythonGomoku/GomokuAi/gomokuai.cpp" "b/16\343\200\201\347\224\250Python\345\206\231\344\272\206\344\270\252\344\272\224\345\255\220\346\243\213\346\270\270\346\210\217/PythonGomoku/GomokuAi/gomokuai.cpp" new file mode 100644 index 0000000..7e035d1 --- /dev/null +++ "b/16\343\200\201\347\224\250Python\345\206\231\344\272\206\344\270\252\344\272\224\345\255\220\346\243\213\346\270\270\346\210\217/PythonGomoku/GomokuAi/gomokuai.cpp" @@ -0,0 +1,88 @@ +#include +#include +#include +#include "ai.h" + +Point ai_1step(int p_init_map[225], int init_depth, bool player_first, uint32_t max_depth, int& tree_size) +{ + // 1 转换参数 + int init_map[15][15]; + for (int t = 0; t <= 224; t++){ + init_map[t / 15][t % 15] = p_init_map[t]; + } + //max_depth = static_cast(atoi(p_max_depth)); + + char g[550]; + sprintf(g, "%d %d %d.\n", init_depth, player_first, max_depth); + + // 2 进行运算 + AI1Step* pai = new AI1Step(init_map, init_depth, player_first); + pai->Search(0, max_depth); + + // 3 输出游戏结果 + Point FinalRes = pai->GetFinalRes(); + tree_size = pai->MethodTree.size(); + return FinalRes; + //printf("%d\n%d\n%d\n", pai->MethodTree.size(), FinalRes.X, FinalRes.Y); +} + +PyObject* wrap_ai_1step(PyObject* self, PyObject* args) +{ + PyObject* init_map_origin; + int init_depth_origin; + int player_first_origin; + int max_depth_origin; + + int init_map[225]; + int init_depth; + bool player_first; + uint32_t max_depth; + + if (!PyArg_ParseTuple(args, "iiiO", &init_depth_origin, &player_first_origin, &max_depth_origin, &init_map_origin)) + { + printf("Parse Tuple失败\n"); + return NULL; + } + + for (int t = 0; t <= 224; t++){ + PyObject *item = PyList_GetItem(init_map_origin, t); + if (!PyLong_Check(item)) + { + printf("Index %d 不能转化成整数.\n", t); + return NULL; + }else + init_map[t] = PyLong_AsLong(item); + } + init_depth = init_depth_origin; + player_first = static_cast(player_first_origin); + max_depth = static_cast(max_depth_origin); + int tree_size; + Point res = ai_1step(init_map, init_depth, player_first, max_depth, tree_size); + return Py_BuildValue("iii", tree_size, res.X, res.Y); +} + +static PyMethodDef exampleMethods[] = +{ + {"ai_1step", wrap_ai_1step, METH_VARARGS, "f(a, b) = a + b - 1"}, + {NULL, NULL, 0, NULL} +}; + +// void initexample() +// { +// PyObject* m; +// m = Py_InitModule("example", exampleMethods); +// } + +static struct PyModuleDef example = +{ + PyModuleDef_HEAD_INIT, + "example", /* name of module */ + "No documentation", /* module documentation, may be NULL */ + -1, /* size of per-interpreter state of the module, or -1 if the module keeps state in global variables. */ + exampleMethods +}; + +PyMODINIT_FUNC PyInit_example(void) +{ + return PyModule_Create(&example); +} diff --git "a/16\343\200\201\347\224\250Python\345\206\231\344\272\206\344\270\252\344\272\224\345\255\220\346\243\213\346\270\270\346\210\217/PythonGomoku/GomokuCode/ai.py" "b/16\343\200\201\347\224\250Python\345\206\231\344\272\206\344\270\252\344\272\224\345\255\220\346\243\213\346\270\270\346\210\217/PythonGomoku/GomokuCode/ai.py" new file mode 100644 index 0000000..a6a481a --- /dev/null +++ "b/16\343\200\201\347\224\250Python\345\206\231\344\272\206\344\270\252\344\272\224\345\255\220\346\243\213\346\270\270\346\210\217/PythonGomoku/GomokuCode/ai.py" @@ -0,0 +1,416 @@ +import numpy as np +import copy +import time + + +class Node: + """AI搜索时的一个节点""" + + def __init__(self, game, ope, depth, alpha, beta, force_score, player_first): + """ + 创建一个minimax的节点 + :param game: 游戏内容。是Game类的一个对象 + :param ope: 这一步的操作是什么 + :param depth: 当前节点的深度 + :param alpha: 这个节点初始的alpha值 + :param beta: 这个节点初始的beta值 + :param force_score: 是否必须算出一个分数 + :param player_first: 是否玩家先出 + """ + self.game = game + self.ope = ope + self.depth = depth + self.alpha = alpha + self.beta = beta + self.force_score = force_score + self.player_first = player_first + st = time.time() + self.score = self.calc_score() + ed = time.time() + self.t = ed - st + + def calc_score(self): + """计算这个节点的分数。对AI越有利则分数越高,反之分数越低""" + + # 1. 如果能够连成五子,则记为100分 + res = self.game.game_result() + if res == 2: + return 100 + elif res == 1: + return -100 + + # 2. 判断玩家和电脑的四子的数目(需要保证:不是已经被堵死的四子) + ai_4_num = 0 + player_4_num = 0 + for x in range(11): + for y in range(15): + player_cnt = sum([self.game.g_map[x][y] == 1, self.game.g_map[x + 1][y] == 1, self.game.g_map[x + 2][y] == 1, self.game.g_map[x + 3][y] == 1, self.game.g_map[x + 4][y] == 1]) + ai_cnt = sum([self.game.g_map[x][y] == 2, self.game.g_map[x + 1][y] == 2, self.game.g_map[x + 2][y] == 2, self.game.g_map[x + 3][y] == 2, self.game.g_map[x + 4][y] == 2]) + if player_cnt == 4 and ai_cnt == 0: + player_4_num += 1 + if ai_cnt == 4 and player_cnt == 0: + ai_4_num += 1 + for x in range(15): + for y in range(11): + player_cnt = sum([self.game.g_map[x][y] == 1, self.game.g_map[x][y + 1] == 1, self.game.g_map[x][y + 2] == 1, self.game.g_map[x][y + 3] == 1, self.game.g_map[x][y + 4] == 1]) + ai_cnt = sum([self.game.g_map[x][y] == 2, self.game.g_map[x][y + 1] == 2, self.game.g_map[x][y + 2] == 2, self.game.g_map[x][y + 3] == 2, self.game.g_map[x][y + 4] == 2]) + if player_cnt == 4 and ai_cnt == 0: + player_4_num += 1 + if ai_cnt == 4 and player_cnt == 0: + ai_4_num += 1 + for x in range(11): + for y in range(11): + player_cnt = sum([self.game.g_map[x][y] == 1, self.game.g_map[x + 1][y + 1] == 1, self.game.g_map[x + 2][y + 2] == 1, self.game.g_map[x + 3][y + 3] == 1, self.game.g_map[x + 4][y + 4] == 1]) + ai_cnt = sum([self.game.g_map[x][y] == 2, self.game.g_map[x + 1][y + 1] == 2, self.game.g_map[x + 2][y + 2] == 2, self.game.g_map[x + 3][y + 3] == 2, self.game.g_map[x + 4][y + 4] == 2]) + if player_cnt == 4 and ai_cnt == 0: + player_4_num += 1 + if ai_cnt == 4 and player_cnt == 0: + ai_4_num += 1 + for x in range(11): + for y in range(11): + player_cnt = sum([self.game.g_map[x + 4][y] == 1, self.game.g_map[x + 3][y + 1] == 1, self.game.g_map[x + 2][y + 2] == 1, self.game.g_map[x + 1][y + 3] == 1, self.game.g_map[x][y + 4] == 1]) + ai_cnt = sum([self.game.g_map[x + 4][y] == 2, self.game.g_map[x + 3][y + 1] == 2, self.game.g_map[x + 2][y + 2] == 2, self.game.g_map[x + 1][y + 3] == 2, self.game.g_map[x][y + 4] == 2]) + if player_cnt == 4 and ai_cnt == 0: + player_4_num += 1 + if ai_cnt == 4 and player_cnt == 0: + ai_4_num += 1 + + # 3. 如果能够连成活四,或连成双四,则记为90分 + if self.player_first: + if self.depth % 2 == 0: # 该轮到玩家出了 + if player_4_num >= 2: + return -90 + elif ai_4_num >= 2 and player_4_num == 0: + return 90 + else: # 该轮到电脑出了 + if ai_4_num >= 2: + return 90 + elif player_4_num >= 2 and ai_4_num == 0: + return -90 + else: + if self.depth % 2 == 0: # 该轮到电脑出了 + if ai_4_num >= 2: + return 90 + elif player_4_num >= 2 and ai_4_num == 0: + return -90 + else: # 该轮到玩家出了 + if player_4_num >= 2: + return -90 + elif ai_4_num >= 2 and player_4_num == 0: + return 90 + + # 4.从这里开始,对于force_score为False的情况,分数记为±inf + if self.force_score is False: + if self.player_first: + if self.depth % 2 == 0: # 该轮到玩家出了 + return np.inf + else: # 该轮到电脑出了 + return -np.inf + else: + if self.depth % 2 == 0: # 该轮到玩家出了 + return -np.inf + else: # 该轮到电脑出了 + return np.inf + + # 4. 判断玩家和电脑的活三的数目 + player_3d_num = 0 + ai_3d_num = 0 + # 4.1. xooox的形式 + for x in range(11): + for y in range(15): + if self.game.g_map[x][y] == 0 and self.game.g_map[x + 1][y] == 1 and self.game.g_map[x + 2][y] == 1 and self.game.g_map[x + 3][y] == 1 and self.game.g_map[x + 4][y] == 0: + player_3d_num += 1 + if self.game.g_map[x][y] == 0 and self.game.g_map[x + 1][y] == 2 and self.game.g_map[x + 2][y] == 2 and self.game.g_map[x + 3][y] == 2 and self.game.g_map[x + 4][y] == 0: + ai_3d_num += 1 + for x in range(15): + for y in range(11): + if self.game.g_map[x][y] == 0 and self.game.g_map[x][y + 1] == 1 and self.game.g_map[x][y + 2] == 1 and self.game.g_map[x][y + 3] == 1 and self.game.g_map[x][y + 4] == 0: + player_3d_num += 1 + if self.game.g_map[x][y] == 0 and self.game.g_map[x][y + 1] == 2 and self.game.g_map[x][y + 2] == 2 and self.game.g_map[x][y + 3] == 2 and self.game.g_map[x][y + 4] == 0: + ai_3d_num += 1 + for x in range(11): + for y in range(11): + if self.game.g_map[x][y] == 0 and self.game.g_map[x + 1][y + 1] == 1 and self.game.g_map[x + 2][y + 2] == 1 and self.game.g_map[x + 3][y + 3] == 1 and self.game.g_map[x + 4][y + 4] == 0: + player_3d_num += 1 + if self.game.g_map[x][y] == 0 and self.game.g_map[x + 1][y + 1] == 2 and self.game.g_map[x + 2][y + 2] == 2 and self.game.g_map[x + 3][y + 3] == 2 and self.game.g_map[x + 4][y + 4] == 0: + ai_3d_num += 1 + for x in range(11): + for y in range(11): + if self.game.g_map[x + 4][y] == 0 and self.game.g_map[x + 3][y + 1] == 1 and self.game.g_map[x + 2][y + 2] == 1 and self.game.g_map[x + 1][y + 3] == 1 and self.game.g_map[x][y + 4] == 0: + player_3d_num += 1 + if self.game.g_map[x + 4][y] == 0 and self.game.g_map[x + 3][y + 1] == 2 and self.game.g_map[x + 2][y + 2] == 2 and self.game.g_map[x + 1][y + 3] == 2 and self.game.g_map[x][y + 4] == 0: + ai_3d_num += 1 + # 4.2. xoxoox或xooxox的形式 + for x in range(10): + for y in range(15): + if self.game.g_map[x][y] == 0 and self.game.g_map[x + 1][y] == 1 and ((self.game.g_map[x + 2][y] == 1) ^ (self.game.g_map[x + 3][y] == 1)) and self.game.g_map[x + 4][y] == 1 and self.game.g_map[x + 5][y] == 0: + player_3d_num += 1 + if self.game.g_map[x][y] == 0 and self.game.g_map[x + 1][y] == 2 and ((self.game.g_map[x + 2][y] == 2) ^ (self.game.g_map[x + 3][y] == 2)) and self.game.g_map[x + 4][y] == 2 and self.game.g_map[x + 5][y] == 0: + ai_3d_num += 1 + for x in range(15): + for y in range(10): + if self.game.g_map[x][y] == 0 and self.game.g_map[x][y + 1] == 1 and ((self.game.g_map[x][y + 2] == 1) ^ (self.game.g_map[x][y + 3] == 1)) and self.game.g_map[x][y + 4] == 1 and self.game.g_map[x][y + 5] == 0: + player_3d_num += 1 + if self.game.g_map[x][y] == 0 and self.game.g_map[x][y + 1] == 2 and ((self.game.g_map[x][y + 2] == 2) ^ (self.game.g_map[x][y + 3] == 2)) and self.game.g_map[x][y + 4] == 2 and self.game.g_map[x][y + 5] == 0: + ai_3d_num += 1 + for x in range(10): + for y in range(10): + if self.game.g_map[x][y] == 0 and self.game.g_map[x + 1][y + 1] == 1 and ((self.game.g_map[x + 2][y + 2] == 1) ^ (self.game.g_map[x + 3][y + 3] == 1)) and self.game.g_map[x + 4][y + 4] == 1 and self.game.g_map[x + 5][y + 5] == 0: + player_3d_num += 1 + if self.game.g_map[x][y] == 0 and self.game.g_map[x + 1][y + 1] == 2 and ((self.game.g_map[x + 2][y + 2] == 2) ^ (self.game.g_map[x + 3][y + 3] == 2)) and self.game.g_map[x + 4][y + 4] == 2 and self.game.g_map[x + 5][y + 5] == 0: + ai_3d_num += 1 + for x in range(10): + for y in range(10): + if self.game.g_map[x + 5][y] == 0 and self.game.g_map[x + 4][y + 1] == 1 and ((self.game.g_map[x + 3][y + 2] == 1) ^ (self.game.g_map[x + 2][y + 3] == 1)) and self.game.g_map[x + 1][y + 4] == 1 and self.game.g_map[x][y + 5] == 0: + player_3d_num += 1 + if self.game.g_map[x + 5][y] == 0 and self.game.g_map[x + 4][y + 1] == 2 and ((self.game.g_map[x + 3][y + 2] == 2) ^ (self.game.g_map[x + 2][y + 3] == 2)) and self.game.g_map[x + 1][y + 4] == 2 and self.game.g_map[x][y + 5] == 0: + ai_3d_num += 1 + + # 6. 如果能够连成四三,则记为80分 + if self.player_first: + if self.depth % 2 == 0: # 该轮到玩家出了 + if player_4_num and player_3d_num >= 1: + return -80 + elif ai_4_num and ai_3d_num >= 1: + return 80 + else: # 该轮到电脑出了 + if ai_4_num and ai_3d_num >= 1: + return 80 + elif player_4_num and player_3d_num >= 1: + return -80 + else: + if self.depth % 2 == 0: # 该轮到电脑出了 + if ai_4_num and ai_3d_num >= 1: + return 80 + elif player_4_num and player_3d_num >= 1: + return -80 + else: # 该轮到玩家出了 + if player_4_num and player_3d_num >= 1: + return -80 + elif ai_4_num and ai_3d_num >= 1: + return 80 + + # 7. 如果能够连成四子,则记为70分 + if self.player_first: + if self.depth % 2 == 0: # 该轮到玩家出了 + if player_4_num: + return -70 + elif ai_4_num: + return 70 + else: # 该轮到电脑出了 + if ai_4_num: + return 70 + elif player_4_num: + return -70 + else: + if self.depth % 2 == 0: # 该轮到电脑出了 + if ai_4_num: + return 70 + elif player_4_num: + return -70 + else: # 该轮到玩家出了 + if player_4_num: + return -70 + elif ai_4_num: + return 70 + + # 8. 如果能够连成双三,则记为60分 + if self.player_first: + if self.depth % 2 == 0: # 该轮到玩家出了 + if player_3d_num >= 2: + return -60 + elif ai_3d_num >= 2: + return 60 + else: # 该轮到电脑出了 + if ai_3d_num >= 2: + return 60 + elif player_3d_num >= 2: + return -60 + else: + if self.depth % 2 == 0: # 该轮到电脑出了 + if ai_3d_num >= 2: + return 60 + elif player_3d_num >= 2: + return -60 + else: # 该轮到玩家出了 + if player_3d_num >= 2: + return -60 + elif ai_3d_num >= 2: + return 60 + + # 9. 如果能够连成单活三,则记为50分 + if self.player_first: + if self.depth % 2 == 0: # 该轮到玩家出了 + if player_3d_num: + return -50 + elif ai_3d_num: + return 50 + else: # 该轮到电脑出了 + if ai_3d_num: + return 50 + elif player_3d_num: + return -50 + else: + if self.depth % 2 == 0: # 该轮到电脑出了 + if ai_3d_num: + return 50 + elif player_3d_num: + return -50 + else: # 该轮到玩家出了 + if player_3d_num: + return -50 + elif ai_3d_num: + return 50 + + # 10. 其他情况。按照棋子的分布来计分(根据这个棋子距离棋盘中心的距离,以及这个棋子周围8格棋子的个数来评分) + score_by_num_around = [0, 1, 20, 30, 26, 24, 22, 20, 18, 16, 15] + player_score_num = 0 + ai_score_num = 0 + player_cnt = 0 + ai_cnt = 0 + for x in range(15): + for y in range(15): + if self.game.g_map[x][y] == 1: + around_cnt = 0 + for x0 in range(x - 1, x + 2): + for y0 in range(y - 1, y + 2): + if 0 <= x0 <= 14 and 0 <= y0 <= 14 and self.game.g_map[x0][y0] != 0: + around_cnt += 1 + player_score_num += score_by_num_around[around_cnt] - abs(x - 7) - abs(y - 7) + player_cnt += 1 + if self.game.g_map[x][y] == 2: + around_cnt = 0 + for x0 in range(x - 1, x + 2): + for y0 in range(y - 1, y + 2): + if 0 <= x0 <= 14 and 0 <= y0 <= 14 and self.game.g_map[x0][y0] != 0: + around_cnt += 1 + ai_score_num += score_by_num_around[around_cnt] - abs(x - 7) - abs(y - 7) + ai_cnt += 1 + if ai_cnt == 0 or player_cnt == 0: + return 0 + score = ai_score_num / ai_cnt - player_score_num / player_cnt + return score + + +class AI1Step: + + max_node_num = 100000 # 最大允许的节点数量(避免内存占用过多) + + def __init__(self, init_game, init_depth, player_first): + """ + 决定AI这一步走什么地方 + :param init_game: 初始的游戏地图 + :param init_depth: 初始的深度 + :param player_first: 玩家是否先出 + """ + node_init = Node(copy.deepcopy(init_game), None, init_depth, -np.inf, np.inf, False, player_first) # 根节点 + node_init.score = -np.inf + self.player_first = player_first + self.method_tree = [node_init] # 策略数 + self.next_node_dx_list = [-1] # 每个节点的下一步节点列表。-1表示这个节点为最终节点 + self.child_node_dx_list = [[]] # 每个节点的子节点列表 + self.ope_hist_list = [] # 纪录此前遍历过的操作列表 + self.t = 0 + + def search(self, cur_node_dx, ope_hist, max_depth): + """ + 按照minimax和alpha-beta剪枝的方法搜索一个根节点下的最优结果。 + :param cur_node_dx: 当前节点的索引值 + :param ope_hist: 假象的历史状态列表 + :param max_depth: 最大允许的深度 + """ + # 1.首先确认什么地方可以落子。落子的条件是:这个格子必须为空,周围8格内必须有至少一个棋子 + ope_list = set() + for x in range(15): + for y in range(15): + if self.method_tree[cur_node_dx].game.g_map[x][y] != 0: + for x0 in range(x - 1, x + 2): + for y0 in range(y - 1, y + 2): + if 0 <= x0 <= 14 and 0 <= y0 <= 14 and (x0, y0) not in ope_list: + if self.method_tree[cur_node_dx].game.g_map[x0][y0] == 0: + ope_list.add((x0, y0)) + # 2. 然后对每一个可以落子的格子进行搜索 + for cell in ope_list: + # 2.1 创建一个子节点,并计算这个子节点的分数 + i_game = copy.deepcopy(self.method_tree[cur_node_dx].game) + if self.player_first: + if self.method_tree[cur_node_dx].depth % 2 == 0: # 轮到玩家出 + i_game.g_map[cell[0]][cell[1]] = 1 + else: # 轮到电脑出 + i_game.g_map[cell[0]][cell[1]] = 2 + else: + if self.method_tree[cur_node_dx].depth % 2 == 0: # 轮到电脑出 + i_game.g_map[cell[0]][cell[1]] = 1 + else: # 轮到玩家出 + i_game.g_map[cell[0]][cell[1]] = 2 + if max_depth >= 2 and len(ope_list) >= 2: # 对于非最终层的节点,不急于立即算出分数 + node_new = Node(i_game, cell, self.method_tree[cur_node_dx].depth + 1, self.method_tree[cur_node_dx].alpha, self.method_tree[cur_node_dx].beta, False, self.player_first) + else: + node_new = Node(i_game, cell, self.method_tree[cur_node_dx].depth + 1, self.method_tree[cur_node_dx].alpha, self.method_tree[cur_node_dx].beta, True, self.player_first) + self.t += node_new.t + self.method_tree.append(node_new) # 把这个节点插入到搜索树中 + node_new_dx = len(self.method_tree) - 1 + self.child_node_dx_list.append([]) + self.child_node_dx_list[cur_node_dx].append(node_new_dx) # 将这个新节点记录为当前节点的子节点 + self.next_node_dx_list.append(-1) # 记录每个节点下一步的动作 + # ope_hist_new = copy.deepcopy(ope_hist) # 记录假象的历史状态列表 + # ope_hist_new[0].add(cell[0]) + # ope_hist_new[1].add(cell[1]) + # self.ope_hist_list.append(ope_hist_new) + if len(self.method_tree) >= self.max_node_num: # 为保护内存,搜索树的节点数目不能太多 + raise ValueError('Method Tree太大了') + + # 2.2. 根据子节点的情况,进行父节点的后续操作 + if -np.inf < self.method_tree[node_new_dx].score < np.inf: + # 子节点有具体分数的情况下,就不用再进行更深层的迭代了 + if self.player_first: + if self.method_tree[cur_node_dx].depth % 2 == 0: # 这一步是假想中玩家走的,因此需要让分数尽量小,且应该修改beta值 + if self.method_tree[node_new_dx].score < self.method_tree[cur_node_dx].score: + self.method_tree[cur_node_dx].score = self.method_tree[node_new_dx].score + self.method_tree[cur_node_dx].beta = self.method_tree[node_new_dx].score + self.next_node_dx_list[cur_node_dx] = node_new_dx + else: # 这一步是假想中电脑走的,因此需要让分数尽量大,且应该修改alpha值 + if self.method_tree[node_new_dx].score > self.method_tree[cur_node_dx].score: + self.method_tree[cur_node_dx].score = self.method_tree[node_new_dx].score + self.method_tree[cur_node_dx].alpha = self.method_tree[node_new_dx].score + self.next_node_dx_list[cur_node_dx] = node_new_dx + else: + if self.method_tree[cur_node_dx].depth % 2 == 0: # 这一步是假想中电脑走的,因此需要让分数尽量大,且应该修改alpha值 + if self.method_tree[node_new_dx].score > self.method_tree[cur_node_dx].score: + self.method_tree[cur_node_dx].score = self.method_tree[node_new_dx].score + self.method_tree[cur_node_dx].alpha = self.method_tree[node_new_dx].score + self.next_node_dx_list[cur_node_dx] = node_new_dx + else: # 这一步是假想中玩家走的,因此需要让分数尽量小,且应该修改beta值 + if self.method_tree[node_new_dx].score < self.method_tree[cur_node_dx].score: + self.method_tree[cur_node_dx].score = self.method_tree[node_new_dx].score + self.method_tree[cur_node_dx].beta = self.method_tree[node_new_dx].score + self.next_node_dx_list[cur_node_dx] = node_new_dx + else: + # 子节点还没有具体分数的情况下,应该以这个子节点为下一层的根节点,进行递归,之后再进行计算 + if max_depth >= 2: + self.search(node_new_dx, ope_hist, max_depth - 1) + # 根据递归后计算的结果,计算这个节点的分数 + if self.player_first: + if self.method_tree[cur_node_dx].depth % 2 == 0: # 这一步是假想中玩家走的,因此需要让分数尽量小,且应该修改beta值 + if self.method_tree[node_new_dx].score < self.method_tree[cur_node_dx].score: + self.method_tree[cur_node_dx].score = self.method_tree[node_new_dx].score + self.method_tree[cur_node_dx].beta = self.method_tree[node_new_dx].score + self.next_node_dx_list[cur_node_dx] = node_new_dx + else: # 这一步是假想中电脑走的,因此需要让分数尽量大,且应该修改alpha值 + if self.method_tree[node_new_dx].score > self.method_tree[cur_node_dx].score: + self.method_tree[cur_node_dx].score = self.method_tree[node_new_dx].score + self.method_tree[cur_node_dx].alpha = self.method_tree[node_new_dx].score + self.next_node_dx_list[cur_node_dx] = node_new_dx + else: + if self.method_tree[cur_node_dx].depth % 2 == 0: # 这一步是假想中电脑走的,因此需要让分数尽量大,且应该修改alpha值 + if self.method_tree[node_new_dx].score > self.method_tree[cur_node_dx].score: + self.method_tree[cur_node_dx].score = self.method_tree[node_new_dx].score + self.method_tree[cur_node_dx].alpha = self.method_tree[node_new_dx].score + self.next_node_dx_list[cur_node_dx] = node_new_dx + else: # 这一步是假想中玩家走的,因此需要让分数尽量小,且应该修改beta值 + if self.method_tree[node_new_dx].score < self.method_tree[cur_node_dx].score: + self.method_tree[cur_node_dx].score = self.method_tree[node_new_dx].score + self.method_tree[cur_node_dx].beta = self.method_tree[node_new_dx].score + self.next_node_dx_list[cur_node_dx] = node_new_dx + if self.method_tree[cur_node_dx].alpha > self.method_tree[cur_node_dx].beta: # alpha-beta剪枝 + return diff --git "a/16\343\200\201\347\224\250Python\345\206\231\344\272\206\344\270\252\344\272\224\345\255\220\346\243\213\346\270\270\346\210\217/PythonGomoku/GomokuCode/corner_widget.py" "b/16\343\200\201\347\224\250Python\345\206\231\344\272\206\344\270\252\344\272\224\345\255\220\346\243\213\346\270\270\346\210\217/PythonGomoku/GomokuCode/corner_widget.py" new file mode 100644 index 0000000..ca2ca18 --- /dev/null +++ "b/16\343\200\201\347\224\250Python\345\206\231\344\272\206\344\270\252\344\272\224\345\255\220\346\243\213\346\270\270\346\210\217/PythonGomoku/GomokuCode/corner_widget.py" @@ -0,0 +1,24 @@ +from PyQt5.QtGui import QPainter, QPen +from PyQt5.QtWidgets import QWidget +from PyQt5.QtCore import Qt + + +class CornerWidget(QWidget): + + def __init__(self, parent): + super().__init__(parent=parent) + self.setFixedSize(30, 30) + + def paintEvent(self, e): + qp = QPainter() + qp.begin(self) + pen = QPen(Qt.red, 3, Qt.SolidLine) + qp.setPen(pen) + qp.drawLine(0, 8, 0, 0) + qp.drawLine(0, 0, 8, 0) + qp.drawLine(22, 0, 28, 0) + qp.drawLine(28, 0, 28, 8) + qp.drawLine(28, 22, 28, 28) + qp.drawLine(28, 28, 20, 28) + qp.drawLine(8, 28, 0, 28) + qp.drawLine(0, 28, 0, 22) diff --git "a/16\343\200\201\347\224\250Python\345\206\231\344\272\206\344\270\252\344\272\224\345\255\220\346\243\213\346\270\270\346\210\217/PythonGomoku/GomokuCode/game.py" "b/16\343\200\201\347\224\250Python\345\206\231\344\272\206\344\270\252\344\272\224\345\255\220\346\243\213\346\270\270\346\210\217/PythonGomoku/GomokuCode/game.py" new file mode 100644 index 0000000..794f600 --- /dev/null +++ "b/16\343\200\201\347\224\250Python\345\206\231\344\272\206\344\270\252\344\272\224\345\255\220\346\243\213\346\270\270\346\210\217/PythonGomoku/GomokuCode/game.py" @@ -0,0 +1,201 @@ +import os +import time + +AI_USE_CPP = False + +if not AI_USE_CPP: # 是否用C++版的AI脚本 + from ai import AI1Step +else: + import example + + +class Gomoku: + + def __init__(self): + self.g_map = [[0 for y in range(15)] for x in range(15)] # 当前的棋盘 + self.cur_step = 0 # 步数 + self.max_search_steps = 3 # 最远搜索2回合之后 + + def move_1step(self, input_by_window=False, pos_x=None, pos_y=None): + """ + 玩家落子 + :param input_by_window: 是否从图形界面输入 + :param pos_x: 从图形界面输入时,输入的x坐标为多少 + :param pos_y: 从图形界面输入时,输入的y坐标为多少 + """ + while True: + try: + if not input_by_window: + pos_x = int(input('x: ')) # 接受玩家的输入人 + pos_y = int(input('y: ')) + if 0 <= pos_x <= 14 and 0 <= pos_y <= 14: # 判断这个格子能否落子 + if self.g_map[pos_x][pos_y] == 0: + self.g_map[pos_x][pos_y] = 1 + self.cur_step += 1 + return + except ValueError: # 玩家输入不正确的情况(例如输入了‘A’) + continue + + def game_result(self, show=False): + """判断游戏的结局。0为游戏进行中,1为玩家获胜,2为电脑获胜,3为平局""" + # 1. 判断是否横向连续五子 + for x in range(11): + for y in range(15): + if self.g_map[x][y] == 1 and self.g_map[x + 1][y] == 1 and self.g_map[x + 2][y] == 1 and self.g_map[x + 3][y] == 1 and self.g_map[x + 4][y] == 1: + if show: + return 1, [(x0, y) for x0 in range(x, x + 5)] + else: + return 1 + if self.g_map[x][y] == 2 and self.g_map[x + 1][y] == 2 and self.g_map[x + 2][y] == 2 and self.g_map[x + 3][y] == 2 and self.g_map[x + 4][y] == 2: + if show: + return 2, [(x0, y) for x0 in range(x, x + 5)] + else: + return 2 + + # 2. 判断是否纵向连续五子 + for x in range(15): + for y in range(11): + if self.g_map[x][y] == 1 and self.g_map[x][y + 1] == 1 and self.g_map[x][y + 2] == 1 and self.g_map[x][y + 3] == 1 and self.g_map[x][y + 4] == 1: + if show: + return 1, [(x, y0) for y0 in range(y, y + 5)] + else: + return 1 + if self.g_map[x][y] == 2 and self.g_map[x][y + 1] == 2 and self.g_map[x][y + 2] == 2 and self.g_map[x][y + 3] == 2 and self.g_map[x][y + 4] == 2: + if show: + return 2, [(x, y0) for y0 in range(y, y + 5)] + else: + return 2 + + # 3. 判断是否有左上-右下的连续五子 + for x in range(11): + for y in range(11): + if self.g_map[x][y] == 1 and self.g_map[x + 1][y + 1] == 1 and self.g_map[x + 2][y + 2] == 1 and self.g_map[x + 3][y + 3] == 1 and self.g_map[x + 4][y + 4] == 1: + if show: + return 1, [(x + t, y + t) for t in range(5)] + else: + return 1 + if self.g_map[x][y] == 2 and self.g_map[x + 1][y + 1] == 2 and self.g_map[x + 2][y + 2] == 2 and self.g_map[x + 3][y + 3] == 2 and self.g_map[x + 4][y + 4] == 2: + if show: + return 2, [(x + t, y + t) for t in range(5)] + else: + return 2 + + # 4. 判断是否有右上-左下的连续五子 + for x in range(11): + for y in range(11): + if self.g_map[x + 4][y] == 1 and self.g_map[x + 3][y + 1] == 1 and self.g_map[x + 2][y + 2] == 1 and self.g_map[x + 1][y + 3] == 1 and self.g_map[x][y + 4] == 1: + if show: + return 1, [(x + t, y + 4 - t) for t in range(5)] + else: + return 1 + if self.g_map[x + 4][y] == 2 and self.g_map[x + 3][y + 1] == 2 and self.g_map[x + 2][y + 2] == 2 and self.g_map[x + 1][y + 3] == 2 and self.g_map[x][y + 4] == 2: + if show: + return 2, [(x + t, y + 4 - t) for t in range(5)] + else: + return 2 + + # 5. 判断是否为平局 + for x in range(15): + for y in range(15): + if self.g_map[x][y] == 0: # 棋盘中还有剩余的格子,不能判断为平局 + if show: + return 0, [(-1, -1)] + else: + return 0 + + if show: + return 3, [(-1, -1)] + else: + return 3 + + def ai_move_1step(self): + """电脑落子""" + for x in range(15): + for y in range(15): + if self.g_map[x][y] == 0: + self.g_map[x][y] = 2 + self.cur_step += 1 + return + + def ai_play_1step_by_cpp(self): + # ai = AI1Step(self, self.cur_step, True) # AI判断下一步执行什么操作 + st = time.time() + mapstring = list() + for x in range(15): + mapstring.extend(self.g_map[x]) + try: + node_len, ai_ope_x, ai_poe_y = example.ai_1step(self.cur_step, int(True), self.max_search_steps, mapstring) + ai_ope = [ai_ope_x, ai_poe_y] + except ValueError: + raise ValueError('AI程序计算出来的数值不正确') + ed = time.time() + print('生成了%d个节点,用时%.4f' % (node_len, ed - st)) + self.g_map[ai_ope[0]][ai_ope[1]] = 2 + self.cur_step += 1 + + def ai_play_1step_py_python(self): + ai = AI1Step(self, self.cur_step, True) # AI判断下一步执行什么操作 + st = time.time() + ai.search(0, [set(), set()], self.max_search_steps) # 最远看2回合之后 + ed = time.time() + print('生成了%d个节点,用时%.4f,评价用时%.4f' % (len(ai.method_tree), ed - st, ai.t)) + if ai.next_node_dx_list[0] == -1: + raise ValueError('ai.next_node_dx_list[0] == -1') + ai_ope = ai.method_tree[ai.next_node_dx_list[0]].ope + if self.g_map[ai_ope[0]][ai_ope[1]] != 0: + raise ValueError('self.game_map[ai_ope[0]][ai_ope[1]] = %d' % self.g_map[ai_ope[0]][ai_ope[1]]) + self.g_map[ai_ope[0]][ai_ope[1]] = 2 + self.cur_step += 1 + + def ai_play_1step(self): + if AI_USE_CPP: + self.max_search_steps = 3 + self.ai_play_1step_by_cpp() + else: + self.max_search_steps = 2 + self.ai_play_1step_py_python() + + def show(self, res): + """显示游戏内容""" + for y in range(15): + for x in range(15): + if self.g_map[x][y] == 0: + print(' ', end='') + elif self.g_map[x][y] == 1: + print('〇', end='') + elif self.g_map[x][y] == 2: + print('×', end='') + + if x != 14: + print('-', end='') + print('\n', end='') + for x in range(15): + print('| ', end='') + print('\n', end='') + + if res == 1: + print('玩家获胜!') + elif res == 2: + print('电脑获胜!') + elif res == 3: + print('平局!') + + def play(self): + while True: + self.move_1step() # 玩家下一步 + res = self.game_result() # 判断游戏结果 + if res != 0: # 如果游戏结果为“已经结束”,则显示游戏内容,并退出主循环 + self.show(res) + return + self.ai_move_1step() # 电脑下一步 + res = self.game_result() + if res != 0: + self.show(res) + return + self.show(0) # 在游戏还没有结束的情况下,显示游戏内容,并继续下一轮循环 + + def map2string(self): + mapstring = list() + for x in range(15): + mapstring.extend(list(map(lambda x0: x0 + 48, self.g_map[x]))) + return bytearray(mapstring).decode('utf8') diff --git "a/16\343\200\201\347\224\250Python\345\206\231\344\272\206\344\270\252\344\272\224\345\255\220\346\243\213\346\270\270\346\210\217/PythonGomoku/GomokuCode/imgs/muzm.jpg" "b/16\343\200\201\347\224\250Python\345\206\231\344\272\206\344\270\252\344\272\224\345\255\220\346\243\213\346\270\270\346\210\217/PythonGomoku/GomokuCode/imgs/muzm.jpg" new file mode 100644 index 0000000..f78199b Binary files /dev/null and "b/16\343\200\201\347\224\250Python\345\206\231\344\272\206\344\270\252\344\272\224\345\255\220\346\243\213\346\270\270\346\210\217/PythonGomoku/GomokuCode/imgs/muzm.jpg" differ diff --git "a/16\343\200\201\347\224\250Python\345\206\231\344\272\206\344\270\252\344\272\224\345\255\220\346\243\213\346\270\270\346\210\217/PythonGomoku/GomokuCode/main.py" "b/16\343\200\201\347\224\250Python\345\206\231\344\272\206\344\270\252\344\272\224\345\255\220\346\243\213\346\270\270\346\210\217/PythonGomoku/GomokuCode/main.py" new file mode 100644 index 0000000..3a99c1b --- /dev/null +++ "b/16\343\200\201\347\224\250Python\345\206\231\344\272\206\344\270\252\344\272\224\345\255\220\346\243\213\346\270\270\346\210\217/PythonGomoku/GomokuCode/main.py" @@ -0,0 +1,16 @@ +from PyQt5.QtWidgets import QApplication +from window import GomokuWindow +from game import Gomoku +import sys + + +def main(): + # g = Gomoku() + # g.play() + app = QApplication(sys.argv) + ex = GomokuWindow() + sys.exit(app.exec_()) + + +if __name__ == '__main__': + main() diff --git "a/16\343\200\201\347\224\250Python\345\206\231\344\272\206\344\270\252\344\272\224\345\255\220\346\243\213\346\270\270\346\210\217/PythonGomoku/GomokuCode/window.py" "b/16\343\200\201\347\224\250Python\345\206\231\344\272\206\344\270\252\344\272\224\345\255\220\346\243\213\346\270\270\346\210\217/PythonGomoku/GomokuCode/window.py" new file mode 100644 index 0000000..ec7a60a --- /dev/null +++ "b/16\343\200\201\347\224\250Python\345\206\231\344\272\206\344\270\252\344\272\224\345\255\220\346\243\213\346\270\270\346\210\217/PythonGomoku/GomokuCode/window.py" @@ -0,0 +1,200 @@ +from PyQt5.QtWidgets import QMainWindow, QMessageBox +from PyQt5.QtGui import QPainter, QPen, QColor, QPalette, QBrush, QPixmap, QRadialGradient +from PyQt5.QtCore import Qt, QPoint, QTimer +import traceback +from game import Gomoku +from corner_widget import CornerWidget + + +def run_with_exc(f): + """游戏运行出现错误时,用messagebox把错误信息显示出来""" + + def call(window, *args, **kwargs): + try: + return f(window, *args, **kwargs) + except Exception: + exc_info = traceback.format_exc() + QMessageBox.about(window, '错误信息', exc_info) + return call + + +class GomokuWindow(QMainWindow): + + def __init__(self): + super().__init__() + self.init_ui() # 初始化游戏界面 + self.g = Gomoku() # 初始化游戏内容 + + self.last_pos = (-1, -1) + self.res = 0 # 记录那边获得了胜利 + self.operate_status = 0 # 游戏操作状态。0为游戏中(可操作),1为游戏结束闪烁过程中(不可操作) + + def init_ui(self): + """初始化游戏界面""" + # 1. 确定游戏界面的标题,大小和背景颜色 + self.setObjectName('MainWindow') + self.setWindowTitle('五子棋') + self.setFixedSize(650, 650) + # self.setStyleSheet('#MainWindow{background-color: green}') + palette = QPalette() + palette.setBrush(QPalette.Window, QBrush(QPixmap('imgs/muzm.jpg'))) + self.setPalette(palette) + # 2. 开启鼠标位置的追踪。并在鼠标位置移动时,使用特殊符号标记当前的位置 + self.setMouseTracking(True) + # 3. 鼠标位置移动时,对鼠标位置的特殊标记 + self.corner_widget = CornerWidget(self) + self.corner_widget.repaint() + self.corner_widget.hide() + # 4. 游戏结束时闪烁的定时器 + self.end_timer = QTimer(self) + self.end_timer.timeout.connect(self.end_flash) + self.flash_cnt = 0 # 游戏结束之前闪烁了多少次 + self.flash_pieces = ((-1, -1), ) # 哪些棋子需要闪烁 + # 5. 显示初始化的游戏界面 + self.show() + + @run_with_exc + def paintEvent(self, e): + """绘制游戏内容""" + + def draw_map(): + """绘制棋盘""" + qp.setPen(QPen(QColor(0, 0, 0), 2, Qt.SolidLine)) # 棋盘的颜色为黑色 + # 绘制横线 + for x in range(15): + qp.drawLine(40 * (x + 1), 40, 40 * (x + 1), 600) + # 绘制竖线 + for y in range(15): + qp.drawLine(40, 40 * (y + 1), 600, 40 * (y + 1)) + # 绘制棋盘中的黑点 + qp.setBrush(QColor(0, 0, 0)) + key_points = [(4, 4), (12, 4), (4, 12), (12, 12), (8, 8)] + for t in key_points: + qp.drawEllipse(QPoint(40 * t[0], 40 * t[1]), 5, 5) + + def draw_pieces(): + """绘制棋子""" + # 绘制黑棋子 + qp.setPen(QPen(QColor(0, 0, 0), 1, Qt.SolidLine)) + # qp.setBrush(QColor(0, 0, 0)) + for x in range(15): + for y in range(15): + if self.g.g_map[x][y] == 1: + if self.flash_cnt % 2 == 1 and (x, y) in self.flash_pieces: + continue + radial = QRadialGradient(40 * (x + 1), 40 * (y + 1), 15, 40 * x + 35, 40 * y + 35) # 棋子的渐变效果 + radial.setColorAt(0, QColor(96, 96, 96)) + radial.setColorAt(1, QColor(0, 0, 0)) + qp.setBrush(QBrush(radial)) + qp.drawEllipse(QPoint(40 * (x + 1), 40 * (y + 1)), 15, 15) + # 绘制白棋子 + qp.setPen(QPen(QColor(160, 160, 160), 1, Qt.SolidLine)) + # qp.setBrush(QColor(255, 255, 255)) + for x in range(15): + for y in range(15): + if self.g.g_map[x][y] == 2: + if self.flash_cnt % 2 == 1 and (x, y) in self.flash_pieces: + continue + radial = QRadialGradient(40 * (x + 1), 40 * (y + 1), 15, 40 * x + 35, 40 * y + 35) # 棋子的渐变效果 + radial.setColorAt(0, QColor(255, 255, 255)) + radial.setColorAt(1, QColor(160, 160, 160)) + qp.setBrush(QBrush(radial)) + qp.drawEllipse(QPoint(40 * (x + 1), 40 * (y + 1)), 15, 15) + + if hasattr(self, 'g'): # 游戏还没开始的话,就不用画了 + qp = QPainter() + qp.begin(self) + draw_map() # 绘制棋盘 + draw_pieces() # 绘制棋子 + qp.end() + + @run_with_exc + def mouseMoveEvent(self, e): + # 1. 首先判断鼠标位置对应棋盘中的哪一个格子 + mouse_x = e.windowPos().x() + mouse_y = e.windowPos().y() + if 25 <= mouse_x <= 615 and 25 <= mouse_y <= 615 and (mouse_x % 40 <= 15 or mouse_x % 40 >= 25) and (mouse_y % 40 <= 15 or mouse_y % 40 >= 25): + game_x = int((mouse_x + 15) // 40) - 1 + game_y = int((mouse_y + 15) // 40) - 1 + else: # 鼠标当前的位置不对应任何一个游戏格子,将其标记为(01, 01 + game_x = -1 + game_y = -1 + + # 2. 然后判断鼠标位置较前一时刻是否发生了变化 + pos_change = False # 标记鼠标位置是否发生了变化 + if game_x != self.last_pos[0] or game_y != self.last_pos[1]: + pos_change = True + self.last_pos = (game_x, game_y) + # 3. 最后根据鼠标位置的变化,绘制特殊标记 + if pos_change and game_x != -1: + self.setCursor(Qt.PointingHandCursor) + if pos_change and game_x == -1: + self.setCursor(Qt.ArrowCursor) + if pos_change and game_x != -1: + self.corner_widget.move(25 + game_x * 40, 25 + game_y * 40) + self.corner_widget.show() + if pos_change and game_x == -1: + self.corner_widget.hide() + + @run_with_exc + def mousePressEvent(self, e): + """根据鼠标的动作,确定落子位置""" + if not (hasattr(self, 'operate_status') and self.operate_status == 0): + return + if e.button() == Qt.LeftButton: + # 1. 首先判断按下了哪个格子 + mouse_x = e.windowPos().x() + mouse_y = e.windowPos().y() + if (mouse_x % 40 <= 15 or mouse_x % 40 >= 25) and (mouse_y % 40 <= 15 or mouse_y % 40 >= 25): + game_x = int((mouse_x + 15) // 40) - 1 + game_y = int((mouse_y + 15) // 40) - 1 + else: # 鼠标点击的位置不正确 + return + self.g.move_1step(True, game_x, game_y) + + # 2. 根据操作结果进行一轮游戏循环 + res, self.flash_pieces = self.g.game_result(show=True) # 判断游戏结果 + if res != 0: # 如果游戏结果为“已经结束”,则显示游戏内容,并退出主循环 + self.repaint(0, 0, 650, 650) + self.game_restart(res) + return + # self.g.ai_move_1step() # 电脑下一步 + self.g.ai_play_1step() # 电脑下一步 + res, self.flash_pieces = self.g.game_result(show=True) + if res != 0: + self.repaint(0, 0, 650, 650) + self.game_restart(res) + return + self.repaint(0, 0, 650, 650) # 在游戏还没有结束的情况下,显示游戏内容,并继续下一轮循环 + + @run_with_exc + def end_flash(self): + # 游戏结束时的闪烁操作 + if self.flash_cnt <= 5: + # 执行闪烁 + self.flash_cnt += 1 + self.repaint() + else: + # 闪烁完毕,执行重新开始的操作 + self.end_timer.stop() + # 1. 显示游戏结束的信息 + if self.res == 1: + QMessageBox.about(self, '游戏结束', '玩家获胜!') + elif self.res == 2: + QMessageBox.about(self, '游戏结束', '电脑获胜!') + elif self.res == 3: + QMessageBox.about(self, '游戏结束', '平局!') + else: + raise ValueError('当前游戏结束的标志位为' + self.res + '. 而游戏结束的标志位必须为1, 2 或 3') + # 2. 游戏重新开始的操作 + self.res = 0 + self.operate_status = 0 + self.flash_cnt = 0 + self.g = Gomoku() # 重新初始化游戏内容 + self.repaint(0, 0, 650, 650) # 重新绘制游戏界面 + + def game_restart(self, res): + """游戏出现开始""" + self.res = res # 标记谁获胜了 + self.operate_status = 1 # 游戏结束时的闪烁过程中,不可操作 + self.end_timer.start(300) # 开始结束时闪烁的计时器 diff --git "a/16\343\200\201\347\224\250Python\345\206\231\344\272\206\344\270\252\344\272\224\345\255\220\346\243\213\346\270\270\346\210\217/PythonGomoku/GomokuCode_NoAI/corner_widget.py" "b/16\343\200\201\347\224\250Python\345\206\231\344\272\206\344\270\252\344\272\224\345\255\220\346\243\213\346\270\270\346\210\217/PythonGomoku/GomokuCode_NoAI/corner_widget.py" new file mode 100644 index 0000000..ca2ca18 --- /dev/null +++ "b/16\343\200\201\347\224\250Python\345\206\231\344\272\206\344\270\252\344\272\224\345\255\220\346\243\213\346\270\270\346\210\217/PythonGomoku/GomokuCode_NoAI/corner_widget.py" @@ -0,0 +1,24 @@ +from PyQt5.QtGui import QPainter, QPen +from PyQt5.QtWidgets import QWidget +from PyQt5.QtCore import Qt + + +class CornerWidget(QWidget): + + def __init__(self, parent): + super().__init__(parent=parent) + self.setFixedSize(30, 30) + + def paintEvent(self, e): + qp = QPainter() + qp.begin(self) + pen = QPen(Qt.red, 3, Qt.SolidLine) + qp.setPen(pen) + qp.drawLine(0, 8, 0, 0) + qp.drawLine(0, 0, 8, 0) + qp.drawLine(22, 0, 28, 0) + qp.drawLine(28, 0, 28, 8) + qp.drawLine(28, 22, 28, 28) + qp.drawLine(28, 28, 20, 28) + qp.drawLine(8, 28, 0, 28) + qp.drawLine(0, 28, 0, 22) diff --git "a/16\343\200\201\347\224\250Python\345\206\231\344\272\206\344\270\252\344\272\224\345\255\220\346\243\213\346\270\270\346\210\217/PythonGomoku/GomokuCode_NoAI/game.py" "b/16\343\200\201\347\224\250Python\345\206\231\344\272\206\344\270\252\344\272\224\345\255\220\346\243\213\346\270\270\346\210\217/PythonGomoku/GomokuCode_NoAI/game.py" new file mode 100644 index 0000000..060b869 --- /dev/null +++ "b/16\343\200\201\347\224\250Python\345\206\231\344\272\206\344\270\252\344\272\224\345\255\220\346\243\213\346\270\270\346\210\217/PythonGomoku/GomokuCode_NoAI/game.py" @@ -0,0 +1,145 @@ +class Gomoku: + + def __init__(self): + self.g_map = [[0 for y in range(15)] for x in range(15)] # 当前的棋盘 + self.cur_step = 0 # 步数 + + def move_1step(self, input_by_window=False, pos_x=None, pos_y=None): + """ + 玩家落子 + :param input_by_window: 是否从图形界面输入 + :param pos_x: 从图形界面输入时,输入的x坐标为多少 + :param pos_y: 从图形界面输入时,输入的y坐标为多少 + """ + while True: + try: + if not input_by_window: + pos_x = int(input('x: ')) # 接受玩家的输入人 + pos_y = int(input('y: ')) + if 0 <= pos_x <= 14 and 0 <= pos_y <= 14: # 判断这个格子能否落子 + if self.g_map[pos_x][pos_y] == 0: + self.g_map[pos_x][pos_y] = 1 + self.cur_step += 1 + return + except ValueError: # 玩家输入不正确的情况(例如输入了‘A’) + continue + + def game_result(self, show=False): + """判断游戏的结局。0为游戏进行中,1为玩家获胜,2为电脑获胜,3为平局""" + # 1. 判断是否横向连续五子 + for x in range(11): + for y in range(15): + if self.g_map[x][y] == 1 and self.g_map[x + 1][y] == 1 and self.g_map[x + 2][y] == 1 and self.g_map[x + 3][y] == 1 and self.g_map[x + 4][y] == 1: + if show: + return 1, [(x0, y) for x0 in range(x, x + 5)] + else: + return 1 + if self.g_map[x][y] == 2 and self.g_map[x + 1][y] == 2 and self.g_map[x + 2][y] == 2 and self.g_map[x + 3][y] == 2 and self.g_map[x + 4][y] == 2: + if show: + return 2, [(x0, y) for x0 in range(x, x + 5)] + else: + return 2 + + # 2. 判断是否纵向连续五子 + for x in range(15): + for y in range(11): + if self.g_map[x][y] == 1 and self.g_map[x][y + 1] == 1 and self.g_map[x][y + 2] == 1 and self.g_map[x][y + 3] == 1 and self.g_map[x][y + 4] == 1: + if show: + return 1, [(x, y0) for y0 in range(y, y + 5)] + else: + return 1 + if self.g_map[x][y] == 2 and self.g_map[x][y + 1] == 2 and self.g_map[x][y + 2] == 2 and self.g_map[x][y + 3] == 2 and self.g_map[x][y + 4] == 2: + if show: + return 2, [(x, y0) for y0 in range(y, y + 5)] + else: + return 2 + + # 3. 判断是否有左上-右下的连续五子 + for x in range(11): + for y in range(11): + if self.g_map[x][y] == 1 and self.g_map[x + 1][y + 1] == 1 and self.g_map[x + 2][y + 2] == 1 and self.g_map[x + 3][y + 3] == 1 and self.g_map[x + 4][y + 4] == 1: + if show: + return 1, [(x + t, y + t) for t in range(5)] + else: + return 1 + if self.g_map[x][y] == 2 and self.g_map[x + 1][y + 1] == 2 and self.g_map[x + 2][y + 2] == 2 and self.g_map[x + 3][y + 3] == 2 and self.g_map[x + 4][y + 4] == 2: + if show: + return 2, [(x + t, y + t) for t in range(5)] + else: + return 2 + + # 4. 判断是否有右上-左下的连续五子 + for x in range(11): + for y in range(11): + if self.g_map[x + 4][y] == 1 and self.g_map[x + 3][y + 1] == 1 and self.g_map[x + 2][y + 2] == 1 and self.g_map[x + 1][y + 3] == 1 and self.g_map[x][y + 4] == 1: + if show: + return 1, [(x + t, y + 4 - t) for t in range(5)] + else: + return 1 + if self.g_map[x + 4][y] == 2 and self.g_map[x + 3][y + 1] == 2 and self.g_map[x + 2][y + 2] == 2 and self.g_map[x + 1][y + 3] == 2 and self.g_map[x][y + 4] == 2: + if show: + return 2, [(x + t, y + 4 - t) for t in range(5)] + else: + return 2 + + # 5. 判断是否为平局 + for x in range(15): + for y in range(15): + if self.g_map[x][y] == 0: # 棋盘中还有剩余的格子,不能判断为平局 + if show: + return 0, [(-1, -1)] + else: + return 0 + + if show: + return 3, [(-1, -1)] + else: + return 3 + + def ai_move_1step(self): + """电脑落子""" + for x in range(15): + for y in range(15): + if self.g_map[x][y] == 0: + self.g_map[x][y] = 2 + self.cur_step += 1 + return + + def show(self, res): + """显示游戏内容""" + for y in range(15): + for x in range(15): + if self.g_map[x][y] == 0: + print(' ', end='') + elif self.g_map[x][y] == 1: + print('〇', end='') + elif self.g_map[x][y] == 2: + print('×', end='') + + if x != 14: + print('-', end='') + print('\n', end='') + for x in range(15): + print('| ', end='') + print('\n', end='') + + if res == 1: + print('玩家获胜!') + elif res == 2: + print('电脑获胜!') + elif res == 3: + print('平局!') + + def play(self): + while True: + self.move_1step() # 玩家下一步 + res = self.game_result() # 判断游戏结果 + if res != 0: # 如果游戏结果为“已经结束”,则显示游戏内容,并退出主循环 + self.show(res) + return + self.ai_move_1step() # 电脑下一步 + res = self.game_result() + if res != 0: + self.show(res) + return + self.show(0) # 在游戏还没有结束的情况下,显示游戏内容,并继续下一轮循环 diff --git "a/16\343\200\201\347\224\250Python\345\206\231\344\272\206\344\270\252\344\272\224\345\255\220\346\243\213\346\270\270\346\210\217/PythonGomoku/GomokuCode_NoAI/imgs/muzm.jpg" "b/16\343\200\201\347\224\250Python\345\206\231\344\272\206\344\270\252\344\272\224\345\255\220\346\243\213\346\270\270\346\210\217/PythonGomoku/GomokuCode_NoAI/imgs/muzm.jpg" new file mode 100644 index 0000000..d81dbef Binary files /dev/null and "b/16\343\200\201\347\224\250Python\345\206\231\344\272\206\344\270\252\344\272\224\345\255\220\346\243\213\346\270\270\346\210\217/PythonGomoku/GomokuCode_NoAI/imgs/muzm.jpg" differ diff --git "a/16\343\200\201\347\224\250Python\345\206\231\344\272\206\344\270\252\344\272\224\345\255\220\346\243\213\346\270\270\346\210\217/PythonGomoku/GomokuCode_NoAI/main.py" "b/16\343\200\201\347\224\250Python\345\206\231\344\272\206\344\270\252\344\272\224\345\255\220\346\243\213\346\270\270\346\210\217/PythonGomoku/GomokuCode_NoAI/main.py" new file mode 100644 index 0000000..3a99c1b --- /dev/null +++ "b/16\343\200\201\347\224\250Python\345\206\231\344\272\206\344\270\252\344\272\224\345\255\220\346\243\213\346\270\270\346\210\217/PythonGomoku/GomokuCode_NoAI/main.py" @@ -0,0 +1,16 @@ +from PyQt5.QtWidgets import QApplication +from window import GomokuWindow +from game import Gomoku +import sys + + +def main(): + # g = Gomoku() + # g.play() + app = QApplication(sys.argv) + ex = GomokuWindow() + sys.exit(app.exec_()) + + +if __name__ == '__main__': + main() diff --git "a/16\343\200\201\347\224\250Python\345\206\231\344\272\206\344\270\252\344\272\224\345\255\220\346\243\213\346\270\270\346\210\217/PythonGomoku/GomokuCode_NoAI/window.py" "b/16\343\200\201\347\224\250Python\345\206\231\344\272\206\344\270\252\344\272\224\345\255\220\346\243\213\346\270\270\346\210\217/PythonGomoku/GomokuCode_NoAI/window.py" new file mode 100644 index 0000000..6e380b7 --- /dev/null +++ "b/16\343\200\201\347\224\250Python\345\206\231\344\272\206\344\270\252\344\272\224\345\255\220\346\243\213\346\270\270\346\210\217/PythonGomoku/GomokuCode_NoAI/window.py" @@ -0,0 +1,199 @@ +from PyQt5.QtWidgets import QMainWindow, QMessageBox +from PyQt5.QtGui import QPainter, QPen, QColor, QPalette, QBrush, QPixmap, QRadialGradient +from PyQt5.QtCore import Qt, QPoint, QTimer +import traceback +from game import Gomoku +from corner_widget import CornerWidget + + +def run_with_exc(f): + """游戏运行出现错误时,用messagebox把错误信息显示出来""" + + def call(window, *args, **kwargs): + try: + return f(window, *args, **kwargs) + except Exception: + exc_info = traceback.format_exc() + QMessageBox.about(window, '错误信息', exc_info) + return call + + +class GomokuWindow(QMainWindow): + + def __init__(self): + super().__init__() + self.init_ui() # 初始化游戏界面 + self.g = Gomoku() # 初始化游戏内容 + + self.last_pos = (-1, -1) + self.res = 0 # 记录那边获得了胜利 + self.operate_status = 0 # 游戏操作状态。0为游戏中(可操作),1为游戏结束闪烁过程中(不可操作) + + def init_ui(self): + """初始化游戏界面""" + # 1. 确定游戏界面的标题,大小和背景颜色 + self.setObjectName('MainWindow') + self.setWindowTitle('五子棋') + self.setFixedSize(650, 650) + # self.setStyleSheet('#MainWindow{background-color: green}') + palette = QPalette() + palette.setBrush(QPalette.Window, QBrush(QPixmap('imgs/muzm.jpg'))) + self.setPalette(palette) + # 2. 开启鼠标位置的追踪。并在鼠标位置移动时,使用特殊符号标记当前的位置 + self.setMouseTracking(True) + # 3. 鼠标位置移动时,对鼠标位置的特殊标记 + self.corner_widget = CornerWidget(self) + self.corner_widget.repaint() + self.corner_widget.hide() + # 4. 游戏结束时闪烁的定时器 + self.end_timer = QTimer(self) + self.end_timer.timeout.connect(self.end_flash) + self.flash_cnt = 0 # 游戏结束之前闪烁了多少次 + self.flash_pieces = ((-1, -1), ) # 哪些棋子需要闪烁 + # 5. 显示初始化的游戏界面 + self.show() + + @run_with_exc + def paintEvent(self, e): + """绘制游戏内容""" + + def draw_map(): + """绘制棋盘""" + qp.setPen(QPen(QColor(0, 0, 0), 2, Qt.SolidLine)) # 棋盘的颜色为黑色 + # 绘制横线 + for x in range(15): + qp.drawLine(40 * (x + 1), 40, 40 * (x + 1), 600) + # 绘制竖线 + for y in range(15): + qp.drawLine(40, 40 * (y + 1), 600, 40 * (y + 1)) + # 绘制棋盘中的黑点 + qp.setBrush(QColor(0, 0, 0)) + key_points = [(4, 4), (12, 4), (4, 12), (12, 12), (8, 8)] + for t in key_points: + qp.drawEllipse(QPoint(40 * t[0], 40 * t[1]), 5, 5) + + def draw_pieces(): + """绘制棋子""" + # 绘制黑棋子 + qp.setPen(QPen(QColor(0, 0, 0), 1, Qt.SolidLine)) + # qp.setBrush(QColor(0, 0, 0)) + for x in range(15): + for y in range(15): + if self.g.g_map[x][y] == 1: + if self.flash_cnt % 2 == 1 and (x, y) in self.flash_pieces: + continue + radial = QRadialGradient(40 * (x + 1), 40 * (y + 1), 15, 40 * x + 35, 40 * y + 35) # 棋子的渐变效果 + radial.setColorAt(0, QColor(96, 96, 96)) + radial.setColorAt(1, QColor(0, 0, 0)) + qp.setBrush(QBrush(radial)) + qp.drawEllipse(QPoint(40 * (x + 1), 40 * (y + 1)), 15, 15) + # 绘制白棋子 + qp.setPen(QPen(QColor(160, 160, 160), 1, Qt.SolidLine)) + # qp.setBrush(QColor(255, 255, 255)) + for x in range(15): + for y in range(15): + if self.g.g_map[x][y] == 2: + if self.flash_cnt % 2 == 1 and (x, y) in self.flash_pieces: + continue + radial = QRadialGradient(40 * (x + 1), 40 * (y + 1), 15, 40 * x + 35, 40 * y + 35) # 棋子的渐变效果 + radial.setColorAt(0, QColor(255, 255, 255)) + radial.setColorAt(1, QColor(160, 160, 160)) + qp.setBrush(QBrush(radial)) + qp.drawEllipse(QPoint(40 * (x + 1), 40 * (y + 1)), 15, 15) + + if hasattr(self, 'g'): # 游戏还没开始的话,就不用画了 + qp = QPainter() + qp.begin(self) + draw_map() # 绘制棋盘 + draw_pieces() # 绘制棋子 + qp.end() + + @run_with_exc + def mouseMoveEvent(self, e): + # 1. 首先判断鼠标位置对应棋盘中的哪一个格子 + mouse_x = e.windowPos().x() + mouse_y = e.windowPos().y() + if 25 <= mouse_x <= 615 and 25 <= mouse_y <= 615 and (mouse_x % 40 <= 15 or mouse_x % 40 >= 25) and (mouse_y % 40 <= 15 or mouse_y % 40 >= 25): + game_x = int((mouse_x + 15) // 40) - 1 + game_y = int((mouse_y + 15) // 40) - 1 + else: # 鼠标当前的位置不对应任何一个游戏格子,将其标记为(01, 01 + game_x = -1 + game_y = -1 + + # 2. 然后判断鼠标位置较前一时刻是否发生了变化 + pos_change = False # 标记鼠标位置是否发生了变化 + if game_x != self.last_pos[0] or game_y != self.last_pos[1]: + pos_change = True + self.last_pos = (game_x, game_y) + # 3. 最后根据鼠标位置的变化,绘制特殊标记 + if pos_change and game_x != -1: + self.setCursor(Qt.PointingHandCursor) + if pos_change and game_x == -1: + self.setCursor(Qt.ArrowCursor) + if pos_change and game_x != -1: + self.corner_widget.move(25 + game_x * 40, 25 + game_y * 40) + self.corner_widget.show() + if pos_change and game_x == -1: + self.corner_widget.hide() + + @run_with_exc + def mousePressEvent(self, e): + """根据鼠标的动作,确定落子位置""" + if not (hasattr(self, 'operate_status') and self.operate_status == 0): + return + if e.button() == Qt.LeftButton: + # 1. 首先判断按下了哪个格子 + mouse_x = e.windowPos().x() + mouse_y = e.windowPos().y() + if (mouse_x % 40 <= 15 or mouse_x % 40 >= 25) and (mouse_y % 40 <= 15 or mouse_y % 40 >= 25): + game_x = int((mouse_x + 15) // 40) - 1 + game_y = int((mouse_y + 15) // 40) - 1 + else: # 鼠标点击的位置不正确 + return + self.g.move_1step(True, game_x, game_y) + + # 2. 根据操作结果进行一轮游戏循环 + res, self.flash_pieces = self.g.game_result(show=True) # 判断游戏结果 + if res != 0: # 如果游戏结果为“已经结束”,则显示游戏内容,并退出主循环 + self.repaint(0, 0, 650, 650) + self.game_restart(res) + return + self.g.ai_move_1step() # 电脑下一步 + res, self.flash_pieces = self.g.game_result(show=True) + if res != 0: + self.repaint(0, 0, 650, 650) + self.game_restart(res) + return + self.repaint(0, 0, 650, 650) # 在游戏还没有结束的情况下,显示游戏内容,并继续下一轮循环 + + @run_with_exc + def end_flash(self): + # 游戏结束时的闪烁操作 + if self.flash_cnt <= 5: + # 执行闪烁 + self.flash_cnt += 1 + self.repaint() + else: + # 闪烁完毕,执行重新开始的操作 + self.end_timer.stop() + # 1. 显示游戏结束的信息 + if self.res == 1: + QMessageBox.about(self, '游戏结束', '玩家获胜!') + elif self.res == 2: + QMessageBox.about(self, '游戏结束', '电脑获胜!') + elif self.res == 3: + QMessageBox.about(self, '游戏结束', '平局!') + else: + raise ValueError('当前游戏结束的标志位为' + self.res + '. 而游戏结束的标志位必须为1, 2 或 3') + # 2. 游戏重新开始的操作 + self.res = 0 + self.operate_status = 0 + self.flash_cnt = 0 + self.g = Gomoku() # 重新初始化游戏内容 + self.repaint(0, 0, 650, 650) # 重新绘制游戏界面 + + def game_restart(self, res): + """游戏出现开始""" + self.res = res # 标记谁获胜了 + self.operate_status = 1 # 游戏结束时的闪烁过程中,不可操作 + self.end_timer.start(300) # 开始结束时闪烁的计时器 diff --git "a/16\343\200\201\347\224\250Python\345\206\231\344\272\206\344\270\252\344\272\224\345\255\220\346\243\213\346\270\270\346\210\217/PythonGomoku/readme.md" "b/16\343\200\201\347\224\250Python\345\206\231\344\272\206\344\270\252\344\272\224\345\255\220\346\243\213\346\270\270\346\210\217/PythonGomoku/readme.md" new file mode 100644 index 0000000..8ce8dbf --- /dev/null +++ "b/16\343\200\201\347\224\250Python\345\206\231\344\272\206\344\270\252\344\272\224\345\255\220\346\243\213\346\270\270\346\210\217/PythonGomoku/readme.md" @@ -0,0 +1,21 @@ +用Python制作的五子棋程序(人机对抗) + +## 目录结构及其说明 + +- GomokuAi + - 基于C++的五子棋AI算法 +- GomokuCode_NoAI + - 基于Python的五子棋游戏 +- GomokuCode + - Python + C++的完整游戏 + +## 运行说明 + +```commandline +cd GomokuCode +python main.py +``` + +## GitHub地址 + +https://github.com/HaloOrangeWang/PythonGomoku \ No newline at end of file diff --git "a/16\343\200\201\347\224\250Python\345\206\231\344\272\206\344\270\252\344\272\224\345\255\220\346\243\213\346\270\270\346\210\217/wuziqi.jpg" "b/16\343\200\201\347\224\250Python\345\206\231\344\272\206\344\270\252\344\272\224\345\255\220\346\243\213\346\270\270\346\210\217/wuziqi.jpg" new file mode 100644 index 0000000..6ba9257 Binary files /dev/null and "b/16\343\200\201\347\224\250Python\345\206\231\344\272\206\344\270\252\344\272\224\345\255\220\346\243\213\346\270\270\346\210\217/wuziqi.jpg" differ diff --git "a/17\343\200\201\343\200\212\347\202\271\347\207\203\344\275\240\357\274\214\346\270\251\346\232\226\346\210\221\343\200\213\347\210\261\345\277\203\344\273\243\347\240\201/heart.jpg" "b/17\343\200\201\343\200\212\347\202\271\347\207\203\344\275\240\357\274\214\346\270\251\346\232\226\346\210\221\343\200\213\347\210\261\345\277\203\344\273\243\347\240\201/heart.jpg" new file mode 100644 index 0000000..1d965f1 Binary files /dev/null and "b/17\343\200\201\343\200\212\347\202\271\347\207\203\344\275\240\357\274\214\346\270\251\346\232\226\346\210\221\343\200\213\347\210\261\345\277\203\344\273\243\347\240\201/heart.jpg" differ diff --git "a/17\343\200\201\343\200\212\347\202\271\347\207\203\344\275\240\357\274\214\346\270\251\346\232\226\346\210\221\343\200\213\347\210\261\345\277\203\344\273\243\347\240\201/main.py" "b/17\343\200\201\343\200\212\347\202\271\347\207\203\344\275\240\357\274\214\346\270\251\346\232\226\346\210\221\343\200\213\347\210\261\345\277\203\344\273\243\347\240\201/main.py" new file mode 100644 index 0000000..8d6be26 --- /dev/null +++ "b/17\343\200\201\343\200\212\347\202\271\347\207\203\344\275\240\357\274\214\346\270\251\346\232\226\346\210\221\343\200\213\347\210\261\345\277\203\344\273\243\347\240\201/main.py" @@ -0,0 +1,52 @@ +# -*- coding: UTF-8 -*- +''' +@Author :程序员晚枫,B站/抖音/微博/小红书/公众号 +@WeChat :CoderWanFeng +@Blog :www.python-office.com +@Date :2022/12/28 21:03 +@Description : +''' +""" +如果报错:ModuleNotFoundError: No module named 'tkinter' +请按照视频说明进行操作:https://www.bilibili.com/video/BV18g411h7jJ +""" + +import turtle + + +# 画心形圆弧 +def hart_arc(): + for i in range(200): + turtle.right(1) + turtle.forward(2) + + +def move_pen_position(x, y): + turtle.hideturtle() # 隐藏画笔(先) + turtle.up() # 提笔 + turtle.goto(x, y) # 移动画笔到指定起始坐标(窗口中心为0,0) + turtle.down() # 下笔 + turtle.showturtle() # 显示画笔 + + +# 初始化 +turtle.setup(width=800, height=500) # 窗口(画布)大小 +turtle.color('red', 'pink') # 画笔颜色 +turtle.pensize(3) # 画笔粗细 +turtle.speed(1) # 描绘速度 +# 初始化画笔起始坐标 +move_pen_position(x=0, y=-180) # 移动画笔位置 +turtle.left(140) # 向左旋转140度 +turtle.begin_fill() # 标记背景填充位置 +# 画心形直线( 左下方 ) +turtle.forward(224) # 向前移动画笔,长度为224 +# 画爱心圆弧 +hart_arc() # 左侧圆弧 +turtle.left(120) # 调整画笔角度 +hart_arc() # 右侧圆弧 +# 画心形直线( 右下方 ) +turtle.forward(224) +turtle.end_fill() # 标记背景填充结束位置 +# 点击窗口关闭程序 +window = turtle.Screen() +window.exitonclick() diff --git "a/18\343\200\201\344\270\226\347\225\214\346\235\257\345\256\232\346\227\266\346\217\220\351\206\222/icon.jpg" "b/18\343\200\201\344\270\226\347\225\214\346\235\257\345\256\232\346\227\266\346\217\220\351\206\222/icon.jpg" new file mode 100644 index 0000000..21a93cf Binary files /dev/null and "b/18\343\200\201\344\270\226\347\225\214\346\235\257\345\256\232\346\227\266\346\217\220\351\206\222/icon.jpg" differ diff --git "a/18\343\200\201\344\270\226\347\225\214\346\235\257\345\256\232\346\227\266\346\217\220\351\206\222/song.mp3" "b/18\343\200\201\344\270\226\347\225\214\346\235\257\345\256\232\346\227\266\346\217\220\351\206\222/song.mp3" new file mode 100644 index 0000000..e238897 Binary files /dev/null and "b/18\343\200\201\344\270\226\347\225\214\346\235\257\345\256\232\346\227\266\346\217\220\351\206\222/song.mp3" differ diff --git "a/18\343\200\201\344\270\226\347\225\214\346\235\257\345\256\232\346\227\266\346\217\220\351\206\222/video.mp4" "b/18\343\200\201\344\270\226\347\225\214\346\235\257\345\256\232\346\227\266\346\217\220\351\206\222/video.mp4" new file mode 100644 index 0000000..e7e76a4 Binary files /dev/null and "b/18\343\200\201\344\270\226\347\225\214\346\235\257\345\256\232\346\227\266\346\217\220\351\206\222/video.mp4" differ diff --git "a/18\343\200\201\344\270\226\347\225\214\346\235\257\345\256\232\346\227\266\346\217\220\351\206\222/worldcup.py" "b/18\343\200\201\344\270\226\347\225\214\346\235\257\345\256\232\346\227\266\346\217\220\351\206\222/worldcup.py" new file mode 100644 index 0000000..a334133 --- /dev/null +++ "b/18\343\200\201\344\270\226\347\225\214\346\235\257\345\256\232\346\227\266\346\217\220\351\206\222/worldcup.py" @@ -0,0 +1,52 @@ +""" +获取源码,关注公众号:程序员晚枫,后台回复:世界杯 +24小时自动获取~ +""" + +import webbrowser +from win10toast import * +import office +import time +import pygame + +import schedule + + +def play_song(song): + file_name = song + pygame.mixer.init() # 只初始化音频部分 + # 载入的音乐不会全部放到内容中,而是以流的形式播放的,即在播放的时候才会一点点从文件中读取。 + track = pygame.mixer.music.load(file_name) + # 播放载入的音乐。该函数立即返回,音乐播放在后台进行。 + pygame.mixer.music.play() + time.sleep(50) + pygame.mixer.music.stop() + + +def notice(url): + office.video.video2mp3(path='./video.mp4', mp3_name='song.mp3') + + toaster = ToastNotifier() + webbrowser.open_new_tab(url) # 打开浏览器 + + # while True: + # Add a URL of JavaTpoint to open it in a browser + # Open the URL using open() function of module + toaster.show_toast( + title='世界杯开始', + msg='大兄弟,看球了!', + icon_path=r'./icon.jpg', + ) + # break + + play_song('./song.mp3') # 播放语音提示 + + +def sche_notice(notice_time, url='https://www.baidu.com/s?ie=UTF-8&wd=%E4%B8%96%E7%95%8C%E6%9D%AF'): + schedule.every().day.at(notice_time).do(notice, url) + while True: + schedule.run_pending() + + +if __name__ == '__main__': + sche_notice(notice_time='13:10:00',url='www.python-office.com') diff --git "a/1\343\200\201\345\220\210\345\220\214\347\263\273\347\273\237/contract-accounting-system-master/LICENSE" "b/1\343\200\201\345\220\210\345\220\214\347\263\273\347\273\237/contract-accounting-system-master/LICENSE" new file mode 100644 index 0000000..261eeb9 --- /dev/null +++ "b/1\343\200\201\345\220\210\345\220\214\347\263\273\347\273\237/contract-accounting-system-master/LICENSE" @@ -0,0 +1,201 @@ + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright [yyyy] [name of copyright owner] + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. diff --git "a/1\343\200\201\345\220\210\345\220\214\347\263\273\347\273\237/contract-accounting-system-master/dump-zw-202103101414--init.sql" "b/1\343\200\201\345\220\210\345\220\214\347\263\273\347\273\237/contract-accounting-system-master/dump-zw-202103101414--init.sql" new file mode 100644 index 0000000..bdb2861 --- /dev/null +++ "b/1\343\200\201\345\220\210\345\220\214\347\263\273\347\273\237/contract-accounting-system-master/dump-zw-202103101414--init.sql" @@ -0,0 +1,551 @@ +-- MySQL dump 10.13 Distrib 8.0.11, for Win64 (x86_64) +-- +-- Host: 192.168.1.88 Database: zw +-- ------------------------------------------------------ +-- Server version 8.0.21 + +/*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */; +/*!40101 SET @OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS */; +/*!40101 SET @OLD_COLLATION_CONNECTION=@@COLLATION_CONNECTION */; + SET NAMES utf8mb4 ; +/*!40103 SET @OLD_TIME_ZONE=@@TIME_ZONE */; +/*!40103 SET TIME_ZONE='+00:00' */; +/*!40014 SET @OLD_UNIQUE_CHECKS=@@UNIQUE_CHECKS, UNIQUE_CHECKS=0 */; +/*!40014 SET @OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0 */; +/*!40101 SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='NO_AUTO_VALUE_ON_ZERO' */; +/*!40111 SET @OLD_SQL_NOTES=@@SQL_NOTES, SQL_NOTES=0 */; + +-- +-- Temporary view structure for view `account_view` +-- + +DROP TABLE IF EXISTS `account_view`; +/*!50001 DROP VIEW IF EXISTS `account_view`*/; +SET @saved_cs_client = @@character_set_client; +SET character_set_client = utf8mb4; +/*!50001 CREATE VIEW `account_view` AS SELECT + 1 AS `sysid`, + 1 AS `type`, + 1 AS `tableid`, + 1 AS `project_name_id`, + 1 AS `cause`, + 1 AS `money`, + 1 AS `account_date`, + 1 AS `finish_flag`, + 1 AS `expense_name_id`*/; +SET character_set_client = @saved_cs_client; + +-- +-- Table structure for table `api_account_normal` +-- + +DROP TABLE IF EXISTS `api_account_normal`; +/*!40101 SET @saved_cs_client = @@character_set_client */; + SET character_set_client = utf8mb4 ; +CREATE TABLE `api_account_normal` ( + `id` int NOT NULL AUTO_INCREMENT, + `date` date NOT NULL, + `account_date` datetime(6) DEFAULT NULL, + `money` decimal(10,2) NOT NULL, + `cause` varchar(64) NOT NULL, + `finish_flag` varchar(64) NOT NULL, + `expense_name_id` int NOT NULL, + `project_name_id` int DEFAULT NULL, + `approve_id` int DEFAULT NULL, + `approvetime` datetime(6) DEFAULT NULL, + PRIMARY KEY (`id`), + KEY `api_account_normal_expense_name_id_49705d34_fk_api_userinfo_id` (`expense_name_id`), + KEY `api_account_normal_project_name_id_5751ba35_fk_api_proje` (`project_name_id`), + KEY `api_account_normal_approve_id_26aec184_fk_api_userinfo_id` (`approve_id`), + CONSTRAINT `api_account_normal_approve_id_26aec184_fk_api_userinfo_id` FOREIGN KEY (`approve_id`) REFERENCES `api_userinfo` (`id`), + CONSTRAINT `api_account_normal_expense_name_id_49705d34_fk_api_userinfo_id` FOREIGN KEY (`expense_name_id`) REFERENCES `api_userinfo` (`id`), + CONSTRAINT `api_account_normal_project_name_id_5751ba35_fk_api_proje` FOREIGN KEY (`project_name_id`) REFERENCES `api_project_info` (`id`) +) ENGINE=InnoDB AUTO_INCREMENT=34 DEFAULT CHARSET=utf8; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Table structure for table `api_account_project` +-- + +DROP TABLE IF EXISTS `api_account_project`; +/*!40101 SET @saved_cs_client = @@character_set_client */; + SET character_set_client = utf8mb4 ; +CREATE TABLE `api_account_project` ( + `id` int NOT NULL AUTO_INCREMENT, + `zhushu` decimal(10,2) NOT NULL, + `money_traffic` decimal(10,2) NOT NULL, + `sumDate` int NOT NULL, + `sumButie` decimal(10,2) NOT NULL, + `start_date` date DEFAULT NULL, + `end_date` date DEFAULT NULL, + `account_date` datetime(6) DEFAULT NULL, + `explain` varchar(64) NOT NULL, + `finish_flag` varchar(64) NOT NULL, + `Type_traffic_id` int NOT NULL, + `expense_name_id` int NOT NULL, + `project_name_id` int DEFAULT NULL, + `approve_id` int DEFAULT NULL, + `approvetime` datetime(6) DEFAULT NULL, + `end_addr` varchar(64) NOT NULL, + `start_addr` varchar(64) NOT NULL, + PRIMARY KEY (`id`), + KEY `api_account_project_Type_traffic_id_eb115fe7_fk_api_traff` (`Type_traffic_id`), + KEY `api_account_project_expense_name_id_4713ca03_fk_api_userinfo_id` (`expense_name_id`), + KEY `api_account_project_project_name_id_239ae86a_fk_api_proje` (`project_name_id`), + KEY `api_account_project_approve_id_bcc8c683_fk_api_userinfo_id` (`approve_id`), + CONSTRAINT `api_account_project_approve_id_bcc8c683_fk_api_userinfo_id` FOREIGN KEY (`approve_id`) REFERENCES `api_userinfo` (`id`), + CONSTRAINT `api_account_project_expense_name_id_4713ca03_fk_api_userinfo_id` FOREIGN KEY (`expense_name_id`) REFERENCES `api_userinfo` (`id`), + CONSTRAINT `api_account_project_project_name_id_239ae86a_fk_api_proje` FOREIGN KEY (`project_name_id`) REFERENCES `api_project_info` (`id`), + CONSTRAINT `api_account_project_Type_traffic_id_eb115fe7_fk_api_traff` FOREIGN KEY (`Type_traffic_id`) REFERENCES `api_traffic_type` (`id`) +) ENGINE=InnoDB AUTO_INCREMENT=36 DEFAULT CHARSET=utf8; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Table structure for table `api_attachment` +-- + +DROP TABLE IF EXISTS `api_attachment`; +/*!40101 SET @saved_cs_client = @@character_set_client */; + SET character_set_client = utf8mb4 ; +CREATE TABLE `api_attachment` ( + `id` int NOT NULL AUTO_INCREMENT, + `file` varchar(100) NOT NULL, + `hetong_id` int NOT NULL, + PRIMARY KEY (`id`), + KEY `api_attachment_hetong_id_21fedf9b_fk_api_contract_info_id` (`hetong_id`), + CONSTRAINT `api_attachment_hetong_id_21fedf9b_fk_api_contract_info_id` FOREIGN KEY (`hetong_id`) REFERENCES `api_contract_info` (`id`) +) ENGINE=InnoDB AUTO_INCREMENT=68 DEFAULT CHARSET=utf8; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Table structure for table `api_contract_info` +-- + +DROP TABLE IF EXISTS `api_contract_info`; +/*!40101 SET @saved_cs_client = @@character_set_client */; + SET character_set_client = utf8mb4 ; +CREATE TABLE `api_contract_info` ( + `id` int NOT NULL AUTO_INCREMENT, + `contract_name` varchar(64) NOT NULL, + `contract_type` varchar(64) NOT NULL, + `amount` decimal(10,2) NOT NULL, + `Date_start` date NOT NULL, + `Date_end` date DEFAULT NULL, + `taxes` decimal(10,2) DEFAULT NULL, + `explain` varchar(64) DEFAULT NULL, + `body_id` int NOT NULL, + `project_id` int NOT NULL, + `target_id` int NOT NULL, + PRIMARY KEY (`id`), + KEY `api_contract_info_body_id_c55d999f_fk_api_entity_info_id` (`body_id`), + KEY `api_contract_info_project_id_639fe0b2_fk_api_project_info_id` (`project_id`), + KEY `api_contract_info_target_id_161f2f75_fk_api_entity_info_id` (`target_id`), + CONSTRAINT `api_contract_info_body_id_c55d999f_fk_api_entity_info_id` FOREIGN KEY (`body_id`) REFERENCES `api_entity_info` (`id`), + CONSTRAINT `api_contract_info_project_id_639fe0b2_fk_api_project_info_id` FOREIGN KEY (`project_id`) REFERENCES `api_project_info` (`id`), + CONSTRAINT `api_contract_info_target_id_161f2f75_fk_api_entity_info_id` FOREIGN KEY (`target_id`) REFERENCES `api_entity_info` (`id`) +) ENGINE=InnoDB AUTO_INCREMENT=35 DEFAULT CHARSET=utf8; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Table structure for table `api_contract_info_attachment` +-- + +DROP TABLE IF EXISTS `api_contract_info_attachment`; +/*!40101 SET @saved_cs_client = @@character_set_client */; + SET character_set_client = utf8mb4 ; +CREATE TABLE `api_contract_info_attachment` ( + `id` int NOT NULL AUTO_INCREMENT, + `contract_info_id` int NOT NULL, + `attachment_id` int NOT NULL, + PRIMARY KEY (`id`), + UNIQUE KEY `api_contract_info_attach_contract_info_id_attachm_c80da761_uniq` (`contract_info_id`,`attachment_id`), + KEY `api_contract_info_at_attachment_id_649c1829_fk_api_attac` (`attachment_id`), + CONSTRAINT `api_contract_info_at_attachment_id_649c1829_fk_api_attac` FOREIGN KEY (`attachment_id`) REFERENCES `api_attachment` (`id`), + CONSTRAINT `api_contract_info_at_contract_info_id_58ff24d9_fk_api_contr` FOREIGN KEY (`contract_info_id`) REFERENCES `api_contract_info` (`id`) +) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=utf8; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Table structure for table `api_contract_plan` +-- + +DROP TABLE IF EXISTS `api_contract_plan`; +/*!40101 SET @saved_cs_client = @@character_set_client */; + SET character_set_client = utf8mb4 ; +CREATE TABLE `api_contract_plan` ( + `id` int NOT NULL AUTO_INCREMENT, + `date_plan` date NOT NULL, + `money_plan` decimal(10,2) NOT NULL, + `contractinfo_id` int NOT NULL, + `contract_type` varchar(64) NOT NULL, + `finish_type` varchar(64) NOT NULL, + PRIMARY KEY (`id`), + KEY `api_contract_plan_contractinfo_id_b5a147be_fk_api_contr` (`contractinfo_id`), + CONSTRAINT `api_contract_plan_contractinfo_id_b5a147be_fk_api_contr` FOREIGN KEY (`contractinfo_id`) REFERENCES `api_contract_info` (`id`) +) ENGINE=InnoDB AUTO_INCREMENT=67 DEFAULT CHARSET=utf8; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Table structure for table `api_department` +-- + +DROP TABLE IF EXISTS `api_department`; +/*!40101 SET @saved_cs_client = @@character_set_client */; + SET character_set_client = utf8mb4 ; +CREATE TABLE `api_department` ( + `id` int NOT NULL AUTO_INCREMENT, + `dept_name` varchar(64) NOT NULL, + `dept_manager_id` int DEFAULT NULL, + PRIMARY KEY (`id`), + UNIQUE KEY `dept_name` (`dept_name`), + KEY `api_department_dept_manager_id_5200f69a_fk_api_userinfo_id` (`dept_manager_id`), + CONSTRAINT `api_department_dept_manager_id_5200f69a_fk_api_userinfo_id` FOREIGN KEY (`dept_manager_id`) REFERENCES `api_userinfo` (`id`) +) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=utf8; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Table structure for table `api_entity_info` +-- + +DROP TABLE IF EXISTS `api_entity_info`; +/*!40101 SET @saved_cs_client = @@character_set_client */; + SET character_set_client = utf8mb4 ; +CREATE TABLE `api_entity_info` ( + `id` int NOT NULL AUTO_INCREMENT, + `entity_name` varchar(128) NOT NULL, + `entity_addr` varchar(128) DEFAULT NULL, + `phone` varchar(32) DEFAULT NULL, + `bank_addr` varchar(64) DEFAULT NULL, + `bank_number` varchar(64) DEFAULT NULL, + `shuiHao` varchar(64) DEFAULT NULL, + `explain` varchar(64) DEFAULT NULL, + PRIMARY KEY (`id`), + UNIQUE KEY `entity_name` (`entity_name`) +) ENGINE=InnoDB AUTO_INCREMENT=15 DEFAULT CHARSET=utf8; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Table structure for table `api_project_info` +-- + +DROP TABLE IF EXISTS `api_project_info`; +/*!40101 SET @saved_cs_client = @@character_set_client */; + SET character_set_client = utf8mb4 ; +CREATE TABLE `api_project_info` ( + `id` int NOT NULL AUTO_INCREMENT, + `project_name` varchar(64) NOT NULL, + `customer_id` int NOT NULL, + `owner_id` int NOT NULL, + PRIMARY KEY (`id`), + UNIQUE KEY `project_name` (`project_name`), + KEY `api_project_info_customer_id_25507cdf_fk_api_entity_info_id` (`customer_id`), + KEY `api_project_info_owner_id_a66e32d6_fk_api_entity_info_id` (`owner_id`), + CONSTRAINT `api_project_info_customer_id_25507cdf_fk_api_entity_info_id` FOREIGN KEY (`customer_id`) REFERENCES `api_entity_info` (`id`), + CONSTRAINT `api_project_info_owner_id_a66e32d6_fk_api_entity_info_id` FOREIGN KEY (`owner_id`) REFERENCES `api_entity_info` (`id`) +) ENGINE=InnoDB AUTO_INCREMENT=14 DEFAULT CHARSET=utf8; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Table structure for table `api_subsidize_info` +-- + +DROP TABLE IF EXISTS `api_subsidize_info`; +/*!40101 SET @saved_cs_client = @@character_set_client */; + SET character_set_client = utf8mb4 ; +CREATE TABLE `api_subsidize_info` ( + `id` int NOT NULL AUTO_INCREMENT, + `money` decimal(5,2) NOT NULL, + `Department_id` int DEFAULT NULL, + PRIMARY KEY (`id`), + KEY `api_subsidize_info_Department_id_649bb846_fk_api_department_id` (`Department_id`), + CONSTRAINT `api_subsidize_info_Department_id_649bb846_fk_api_department_id` FOREIGN KEY (`Department_id`) REFERENCES `api_department` (`id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Table structure for table `api_test` +-- + +DROP TABLE IF EXISTS `api_test`; +/*!40101 SET @saved_cs_client = @@character_set_client */; + SET character_set_client = utf8mb4 ; +CREATE TABLE `api_test` ( + `id` int NOT NULL AUTO_INCREMENT, + `name` varchar(20) NOT NULL, + PRIMARY KEY (`id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Table structure for table `api_traffic_type` +-- + +DROP TABLE IF EXISTS `api_traffic_type`; +/*!40101 SET @saved_cs_client = @@character_set_client */; + SET character_set_client = utf8mb4 ; +CREATE TABLE `api_traffic_type` ( + `id` int NOT NULL AUTO_INCREMENT, + `project_name` varchar(64) NOT NULL, + PRIMARY KEY (`id`), + UNIQUE KEY `project_name` (`project_name`) +) ENGINE=InnoDB AUTO_INCREMENT=5 DEFAULT CHARSET=utf8; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Table structure for table `api_userinfo` +-- + +DROP TABLE IF EXISTS `api_userinfo`; +/*!40101 SET @saved_cs_client = @@character_set_client */; + SET character_set_client = utf8mb4 ; +CREATE TABLE `api_userinfo` ( + `id` int NOT NULL AUTO_INCREMENT, + `user_type` int NOT NULL, + `username` varchar(32) NOT NULL, + `password` varchar(64) NOT NULL, + `name` varchar(32) NOT NULL, + `status` tinyint(1) NOT NULL, + `department_id` int DEFAULT NULL, + PRIMARY KEY (`id`), + UNIQUE KEY `username` (`username`), + UNIQUE KEY `name` (`name`), + KEY `api_userinfo_department_id_8f2ce9d9_fk_api_department_id` (`department_id`), + CONSTRAINT `api_userinfo_department_id_8f2ce9d9_fk_api_department_id` FOREIGN KEY (`department_id`) REFERENCES `api_department` (`id`) +) ENGINE=InnoDB AUTO_INCREMENT=9 DEFAULT CHARSET=utf8; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Table structure for table `api_usertoken` +-- + +DROP TABLE IF EXISTS `api_usertoken`; +/*!40101 SET @saved_cs_client = @@character_set_client */; + SET character_set_client = utf8mb4 ; +CREATE TABLE `api_usertoken` ( + `id` int NOT NULL AUTO_INCREMENT, + `token` varchar(64) NOT NULL, + `user_id` int NOT NULL, + PRIMARY KEY (`id`), + UNIQUE KEY `user_id` (`user_id`), + CONSTRAINT `api_usertoken_user_id_5984b1b0_fk_api_userinfo_id` FOREIGN KEY (`user_id`) REFERENCES `api_userinfo` (`id`) +) ENGINE=InnoDB AUTO_INCREMENT=8 DEFAULT CHARSET=utf8; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Table structure for table `auth_group` +-- + +DROP TABLE IF EXISTS `auth_group`; +/*!40101 SET @saved_cs_client = @@character_set_client */; + SET character_set_client = utf8mb4 ; +CREATE TABLE `auth_group` ( + `id` int NOT NULL AUTO_INCREMENT, + `name` varchar(150) NOT NULL, + PRIMARY KEY (`id`), + UNIQUE KEY `name` (`name`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Table structure for table `auth_group_permissions` +-- + +DROP TABLE IF EXISTS `auth_group_permissions`; +/*!40101 SET @saved_cs_client = @@character_set_client */; + SET character_set_client = utf8mb4 ; +CREATE TABLE `auth_group_permissions` ( + `id` int NOT NULL AUTO_INCREMENT, + `group_id` int NOT NULL, + `permission_id` int NOT NULL, + PRIMARY KEY (`id`), + UNIQUE KEY `auth_group_permissions_group_id_permission_id_0cd325b0_uniq` (`group_id`,`permission_id`), + KEY `auth_group_permissio_permission_id_84c5c92e_fk_auth_perm` (`permission_id`), + CONSTRAINT `auth_group_permissio_permission_id_84c5c92e_fk_auth_perm` FOREIGN KEY (`permission_id`) REFERENCES `auth_permission` (`id`), + CONSTRAINT `auth_group_permissions_group_id_b120cbf9_fk_auth_group_id` FOREIGN KEY (`group_id`) REFERENCES `auth_group` (`id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Table structure for table `auth_permission` +-- + +DROP TABLE IF EXISTS `auth_permission`; +/*!40101 SET @saved_cs_client = @@character_set_client */; + SET character_set_client = utf8mb4 ; +CREATE TABLE `auth_permission` ( + `id` int NOT NULL AUTO_INCREMENT, + `name` varchar(255) NOT NULL, + `content_type_id` int NOT NULL, + `codename` varchar(100) NOT NULL, + PRIMARY KEY (`id`), + UNIQUE KEY `auth_permission_content_type_id_codename_01ab375a_uniq` (`content_type_id`,`codename`), + CONSTRAINT `auth_permission_content_type_id_2f476e4b_fk_django_co` FOREIGN KEY (`content_type_id`) REFERENCES `django_content_type` (`id`) +) ENGINE=InnoDB AUTO_INCREMENT=81 DEFAULT CHARSET=utf8; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Table structure for table `auth_user` +-- + +DROP TABLE IF EXISTS `auth_user`; +/*!40101 SET @saved_cs_client = @@character_set_client */; + SET character_set_client = utf8mb4 ; +CREATE TABLE `auth_user` ( + `id` int NOT NULL AUTO_INCREMENT, + `password` varchar(128) NOT NULL, + `last_login` datetime(6) DEFAULT NULL, + `is_superuser` tinyint(1) NOT NULL, + `username` varchar(150) NOT NULL, + `first_name` varchar(150) NOT NULL, + `last_name` varchar(150) NOT NULL, + `email` varchar(254) NOT NULL, + `is_staff` tinyint(1) NOT NULL, + `is_active` tinyint(1) NOT NULL, + `date_joined` datetime(6) NOT NULL, + PRIMARY KEY (`id`), + UNIQUE KEY `username` (`username`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Table structure for table `auth_user_groups` +-- + +DROP TABLE IF EXISTS `auth_user_groups`; +/*!40101 SET @saved_cs_client = @@character_set_client */; + SET character_set_client = utf8mb4 ; +CREATE TABLE `auth_user_groups` ( + `id` int NOT NULL AUTO_INCREMENT, + `user_id` int NOT NULL, + `group_id` int NOT NULL, + PRIMARY KEY (`id`), + UNIQUE KEY `auth_user_groups_user_id_group_id_94350c0c_uniq` (`user_id`,`group_id`), + KEY `auth_user_groups_group_id_97559544_fk_auth_group_id` (`group_id`), + CONSTRAINT `auth_user_groups_group_id_97559544_fk_auth_group_id` FOREIGN KEY (`group_id`) REFERENCES `auth_group` (`id`), + CONSTRAINT `auth_user_groups_user_id_6a12ed8b_fk_auth_user_id` FOREIGN KEY (`user_id`) REFERENCES `auth_user` (`id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Table structure for table `auth_user_user_permissions` +-- + +DROP TABLE IF EXISTS `auth_user_user_permissions`; +/*!40101 SET @saved_cs_client = @@character_set_client */; + SET character_set_client = utf8mb4 ; +CREATE TABLE `auth_user_user_permissions` ( + `id` int NOT NULL AUTO_INCREMENT, + `user_id` int NOT NULL, + `permission_id` int NOT NULL, + PRIMARY KEY (`id`), + UNIQUE KEY `auth_user_user_permissions_user_id_permission_id_14a6b632_uniq` (`user_id`,`permission_id`), + KEY `auth_user_user_permi_permission_id_1fbb5f2c_fk_auth_perm` (`permission_id`), + CONSTRAINT `auth_user_user_permi_permission_id_1fbb5f2c_fk_auth_perm` FOREIGN KEY (`permission_id`) REFERENCES `auth_permission` (`id`), + CONSTRAINT `auth_user_user_permissions_user_id_a95ead1b_fk_auth_user_id` FOREIGN KEY (`user_id`) REFERENCES `auth_user` (`id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Table structure for table `django_admin_log` +-- + +DROP TABLE IF EXISTS `django_admin_log`; +/*!40101 SET @saved_cs_client = @@character_set_client */; + SET character_set_client = utf8mb4 ; +CREATE TABLE `django_admin_log` ( + `id` int NOT NULL AUTO_INCREMENT, + `action_time` datetime(6) NOT NULL, + `object_id` longtext, + `object_repr` varchar(200) NOT NULL, + `action_flag` smallint unsigned NOT NULL, + `change_message` longtext NOT NULL, + `content_type_id` int DEFAULT NULL, + `user_id` int NOT NULL, + PRIMARY KEY (`id`), + KEY `django_admin_log_content_type_id_c4bce8eb_fk_django_co` (`content_type_id`), + KEY `django_admin_log_user_id_c564eba6_fk_auth_user_id` (`user_id`), + CONSTRAINT `django_admin_log_content_type_id_c4bce8eb_fk_django_co` FOREIGN KEY (`content_type_id`) REFERENCES `django_content_type` (`id`), + CONSTRAINT `django_admin_log_user_id_c564eba6_fk_auth_user_id` FOREIGN KEY (`user_id`) REFERENCES `auth_user` (`id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Table structure for table `django_content_type` +-- + +DROP TABLE IF EXISTS `django_content_type`; +/*!40101 SET @saved_cs_client = @@character_set_client */; + SET character_set_client = utf8mb4 ; +CREATE TABLE `django_content_type` ( + `id` int NOT NULL AUTO_INCREMENT, + `app_label` varchar(100) NOT NULL, + `model` varchar(100) NOT NULL, + PRIMARY KEY (`id`), + UNIQUE KEY `django_content_type_app_label_model_76bd3d3b_uniq` (`app_label`,`model`) +) ENGINE=InnoDB AUTO_INCREMENT=21 DEFAULT CHARSET=utf8; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Table structure for table `django_migrations` +-- + +DROP TABLE IF EXISTS `django_migrations`; +/*!40101 SET @saved_cs_client = @@character_set_client */; + SET character_set_client = utf8mb4 ; +CREATE TABLE `django_migrations` ( + `id` int NOT NULL AUTO_INCREMENT, + `app` varchar(255) NOT NULL, + `name` varchar(255) NOT NULL, + `applied` datetime(6) NOT NULL, + PRIMARY KEY (`id`) +) ENGINE=InnoDB AUTO_INCREMENT=30 DEFAULT CHARSET=utf8; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Table structure for table `django_session` +-- + +DROP TABLE IF EXISTS `django_session`; +/*!40101 SET @saved_cs_client = @@character_set_client */; + SET character_set_client = utf8mb4 ; +CREATE TABLE `django_session` ( + `session_key` varchar(40) NOT NULL, + `session_data` longtext NOT NULL, + `expire_date` datetime(6) NOT NULL, + PRIMARY KEY (`session_key`), + KEY `django_session_expire_date_a5c62663` (`expire_date`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Dumping routines for database 'zw' +-- + +-- +-- Final view structure for view `account_view` +-- + +/*!50001 DROP VIEW IF EXISTS `account_view`*/; +/*!50001 SET @saved_cs_client = @@character_set_client */; +/*!50001 SET @saved_cs_results = @@character_set_results */; +/*!50001 SET @saved_col_connection = @@collation_connection */; +/*!50001 SET character_set_client = utf8 */; +/*!50001 SET character_set_results = utf8 */; +/*!50001 SET collation_connection = utf8_general_ci */; +/*!50001 CREATE ALGORITHM=UNDEFINED */ +/*!50013 DEFINER=`zw`@`%` SQL SECURITY DEFINER */ +/*!50001 VIEW `account_view` AS select concat('a',`api_account_project`.`id`) AS `sysid`,'a' AS `type`,`api_account_project`.`id` AS `tableid`,`api_account_project`.`project_name_id` AS `project_name_id`,`api_account_project`.`explain` AS `cause`,((`api_account_project`.`sumButie` + `api_account_project`.`zhushu`) + `api_account_project`.`money_traffic`) AS `money`,`api_account_project`.`account_date` AS `account_date`,`api_account_project`.`finish_flag` AS `finish_flag`,`api_account_project`.`expense_name_id` AS `expense_name_id` from `api_account_project` union all select concat('b',`api_account_normal`.`id`) AS `sysid`,'b' AS `b`,`api_account_normal`.`id` AS `tableid`,`api_account_normal`.`project_name_id` AS `project_name_id`,`api_account_normal`.`cause` AS `cause`,`api_account_normal`.`money` AS `money`,`api_account_normal`.`account_date` AS `account_date`,`api_account_normal`.`finish_flag` AS `finish_flag`,`api_account_normal`.`expense_name_id` AS `expense_name_id` from `api_account_normal` */; +/*!50001 SET character_set_client = @saved_cs_client */; +/*!50001 SET character_set_results = @saved_cs_results */; +/*!50001 SET collation_connection = @saved_col_connection */; +/*!40103 SET TIME_ZONE=@OLD_TIME_ZONE */; + +/*!40101 SET SQL_MODE=@OLD_SQL_MODE */; +/*!40014 SET FOREIGN_KEY_CHECKS=@OLD_FOREIGN_KEY_CHECKS */; +/*!40014 SET UNIQUE_CHECKS=@OLD_UNIQUE_CHECKS */; +/*!40101 SET CHARACTER_SET_CLIENT=@OLD_CHARACTER_SET_CLIENT */; +/*!40101 SET CHARACTER_SET_RESULTS=@OLD_CHARACTER_SET_RESULTS */; +/*!40101 SET COLLATION_CONNECTION=@OLD_COLLATION_CONNECTION */; +/*!40111 SET SQL_NOTES=@OLD_SQL_NOTES */; + +-- Dump completed on 2021-03-10 14:14:39 diff --git "a/1\343\200\201\345\220\210\345\220\214\347\263\273\347\273\237/contract-accounting-system-master/web\345\211\215\347\253\257/.editorconfig" "b/1\343\200\201\345\220\210\345\220\214\347\263\273\347\273\237/contract-accounting-system-master/web\345\211\215\347\253\257/.editorconfig" new file mode 100644 index 0000000..7053c49 --- /dev/null +++ "b/1\343\200\201\345\220\210\345\220\214\347\263\273\347\273\237/contract-accounting-system-master/web\345\211\215\347\253\257/.editorconfig" @@ -0,0 +1,5 @@ +[*.{js,jsx,ts,tsx,vue}] +indent_style = space +indent_size = 2 +trim_trailing_whitespace = true +insert_final_newline = true diff --git "a/1\343\200\201\345\220\210\345\220\214\347\263\273\347\273\237/contract-accounting-system-master/web\345\211\215\347\253\257/.gitignore" "b/1\343\200\201\345\220\210\345\220\214\347\263\273\347\273\237/contract-accounting-system-master/web\345\211\215\347\253\257/.gitignore" new file mode 100644 index 0000000..a0dddc6 --- /dev/null +++ "b/1\343\200\201\345\220\210\345\220\214\347\263\273\347\273\237/contract-accounting-system-master/web\345\211\215\347\253\257/.gitignore" @@ -0,0 +1,21 @@ +.DS_Store +node_modules +/dist + +# local env files +.env.local +.env.*.local + +# Log files +npm-debug.log* +yarn-debug.log* +yarn-error.log* + +# Editor directories and files +.idea +.vscode +*.suo +*.ntvs* +*.njsproj +*.sln +*.sw? diff --git a/celery/task.py "b/1\343\200\201\345\220\210\345\220\214\347\263\273\347\273\237/contract-accounting-system-master/web\345\211\215\347\253\257/.keep" similarity index 100% rename from celery/task.py rename to "1\343\200\201\345\220\210\345\220\214\347\263\273\347\273\237/contract-accounting-system-master/web\345\211\215\347\253\257/.keep" diff --git "a/1\343\200\201\345\220\210\345\220\214\347\263\273\347\273\237/contract-accounting-system-master/web\345\211\215\347\253\257/README.en.md" "b/1\343\200\201\345\220\210\345\220\214\347\263\273\347\273\237/contract-accounting-system-master/web\345\211\215\347\253\257/README.en.md" new file mode 100644 index 0000000..86a7152 --- /dev/null +++ "b/1\343\200\201\345\220\210\345\220\214\347\263\273\347\273\237/contract-accounting-system-master/web\345\211\215\347\253\257/README.en.md" @@ -0,0 +1,36 @@ +# web2020 + +#### Description +{**When you're done, you can delete the content in this README and update the file with details for others getting started with your repository**} + +#### Software Architecture +Software architecture description + +#### Installation + +1. xxxx +2. xxxx +3. xxxx + +#### Instructions + +1. xxxx +2. xxxx +3. xxxx + +#### Contribution + +1. Fork the repository +2. Create Feat_xxx branch +3. Commit your code +4. Create Pull Request + + +#### Gitee Feature + +1. You can use Readme\_XXX.md to support different languages, such as Readme\_en.md, Readme\_zh.md +2. Gitee blog [blog.gitee.com](https://blog.gitee.com) +3. Explore open source project [https://gitee.com/explore](https://gitee.com/explore) +4. The most valuable open source project [GVP](https://gitee.com/gvp) +5. The manual of Gitee [https://gitee.com/help](https://gitee.com/help) +6. The most popular members [https://gitee.com/gitee-stars/](https://gitee.com/gitee-stars/) diff --git "a/1\343\200\201\345\220\210\345\220\214\347\263\273\347\273\237/contract-accounting-system-master/web\345\211\215\347\253\257/README.md" "b/1\343\200\201\345\220\210\345\220\214\347\263\273\347\273\237/contract-accounting-system-master/web\345\211\215\347\253\257/README.md" new file mode 100644 index 0000000..9274203 --- /dev/null +++ "b/1\343\200\201\345\220\210\345\220\214\347\263\273\347\273\237/contract-accounting-system-master/web\345\211\215\347\253\257/README.md" @@ -0,0 +1,66 @@ +<<<<<<< HEAD +# myweb + +## Project setup +``` +npm install +``` + +### Compiles and hot-reloads for development +``` +npm run serve +``` + +### Compiles and minifies for production +``` +npm run build +``` + +### Lints and fixes files +``` +npm run lint +``` + +### Customize configuration +See [Configuration Reference](https://cli.vuejs.org/config/). +======= +# web2020 + +#### 介绍 +{**以下是码云平台说明,您可以替换此简介** +码云是 OSCHINA 推出的基于 Git 的代码托管平台(同时支持 SVN)。专为开发者提供稳定、高效、安全的云端软件开发协作平台 +无论是个人、团队、或是企业,都能够用码云实现代码托管、项目管理、协作开发。企业项目请看 [https://gitee.com/enterprises](https://gitee.com/enterprises)} + +#### 软件架构 +软件架构说明 + + +#### 安装教程 + +1. xxxx +2. xxxx +3. xxxx + +#### 使用说明 + +1. xxxx +2. xxxx +3. xxxx + +#### 参与贡献 + +1. Fork 本仓库 +2. 新建 Feat_xxx 分支 +3. 提交代码 +4. 新建 Pull Request + + +#### 码云特技 + +1. 使用 Readme\_XXX.md 来支持不同的语言,例如 Readme\_en.md, Readme\_zh.md +2. 码云官方博客 [blog.gitee.com](https://blog.gitee.com) +3. 你可以 [https://gitee.com/explore](https://gitee.com/explore) 这个地址来了解码云上的优秀开源项目 +4. [GVP](https://gitee.com/gvp) 全称是码云最有价值开源项目,是码云综合评定出的优秀开源项目 +5. 码云官方提供的使用手册 [https://gitee.com/help](https://gitee.com/help) +6. 码云封面人物是一档用来展示码云会员风采的栏目 [https://gitee.com/gitee-stars/](https://gitee.com/gitee-stars/) +>>>>>>> de041930f41e32ee33bb225278800a830e972b52 diff --git "a/1\343\200\201\345\220\210\345\220\214\347\263\273\347\273\237/contract-accounting-system-master/web\345\211\215\347\253\257/babel.config.js" "b/1\343\200\201\345\220\210\345\220\214\347\263\273\347\273\237/contract-accounting-system-master/web\345\211\215\347\253\257/babel.config.js" new file mode 100644 index 0000000..e955840 --- /dev/null +++ "b/1\343\200\201\345\220\210\345\220\214\347\263\273\347\273\237/contract-accounting-system-master/web\345\211\215\347\253\257/babel.config.js" @@ -0,0 +1,5 @@ +module.exports = { + presets: [ + '@vue/cli-plugin-babel/preset' + ] +} diff --git "a/1\343\200\201\345\220\210\345\220\214\347\263\273\347\273\237/contract-accounting-system-master/web\345\211\215\347\253\257/node_modules.zip" "b/1\343\200\201\345\220\210\345\220\214\347\263\273\347\273\237/contract-accounting-system-master/web\345\211\215\347\253\257/node_modules.zip" new file mode 100644 index 0000000..520a44d Binary files /dev/null and "b/1\343\200\201\345\220\210\345\220\214\347\263\273\347\273\237/contract-accounting-system-master/web\345\211\215\347\253\257/node_modules.zip" differ diff --git "a/1\343\200\201\345\220\210\345\220\214\347\263\273\347\273\237/contract-accounting-system-master/web\345\211\215\347\253\257/package-lock.json" "b/1\343\200\201\345\220\210\345\220\214\347\263\273\347\273\237/contract-accounting-system-master/web\345\211\215\347\253\257/package-lock.json" new file mode 100644 index 0000000..148685b --- /dev/null +++ "b/1\343\200\201\345\220\210\345\220\214\347\263\273\347\273\237/contract-accounting-system-master/web\345\211\215\347\253\257/package-lock.json" @@ -0,0 +1,15280 @@ +{ + "name": "myweb", + "version": "0.1.0", + "lockfileVersion": 1, + "requires": true, + "dependencies": { + "@babel/code-frame": { + "version": "7.8.3", + "resolved": "https://registry.npm.taobao.org/@babel/code-frame/download/@babel/code-frame-7.8.3.tgz", + "integrity": "sha1-M+JZA9dIEYFTThLsCiXxa2/PQZ4=", + "dev": true, + "requires": { + "@babel/highlight": "^7.8.3" + } + }, + "@babel/compat-data": { + "version": "7.9.0", + "resolved": "https://registry.npm.taobao.org/@babel/compat-data/download/@babel/compat-data-7.9.0.tgz", + "integrity": "sha1-BIFVVvyQsMF0q9LAwbuWb6oDamw=", + "dev": true, + "requires": { + "browserslist": "^4.9.1", + "invariant": "^2.2.4", + "semver": "^5.5.0" + } + }, + "@babel/core": { + "version": "7.9.0", + "resolved": "https://registry.npm.taobao.org/@babel/core/download/@babel/core-7.9.0.tgz?cache=0&sync_timestamp=1584718830004&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2F%40babel%2Fcore%2Fdownload%2F%40babel%2Fcore-7.9.0.tgz", + "integrity": "sha1-rJd7U4t34TL/cG87ik260JwDxW4=", + "dev": true, + "requires": { + "@babel/code-frame": "^7.8.3", + "@babel/generator": "^7.9.0", + "@babel/helper-module-transforms": "^7.9.0", + "@babel/helpers": "^7.9.0", + "@babel/parser": "^7.9.0", + "@babel/template": "^7.8.6", + "@babel/traverse": "^7.9.0", + "@babel/types": "^7.9.0", + "convert-source-map": "^1.7.0", + "debug": "^4.1.0", + "gensync": "^1.0.0-beta.1", + "json5": "^2.1.2", + "lodash": "^4.17.13", + "resolve": "^1.3.2", + "semver": "^5.4.1", + "source-map": "^0.5.0" + } + }, + "@babel/generator": { + "version": "7.9.4", + "resolved": "https://registry.npm.taobao.org/@babel/generator/download/@babel/generator-7.9.4.tgz?cache=0&sync_timestamp=1585038807794&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2F%40babel%2Fgenerator%2Fdownload%2F%40babel%2Fgenerator-7.9.4.tgz", + "integrity": "sha1-EkQekMOzxBWc3s8xIHW/Gozi284=", + "dev": true, + "requires": { + "@babel/types": "^7.9.0", + "jsesc": "^2.5.1", + "lodash": "^4.17.13", + "source-map": "^0.5.0" + } + }, + "@babel/helper-annotate-as-pure": { + "version": "7.8.3", + "resolved": "https://registry.npm.taobao.org/@babel/helper-annotate-as-pure/download/@babel/helper-annotate-as-pure-7.8.3.tgz", + "integrity": "sha1-YLwLxlf2Ogkk/5pLSgskoTz03u4=", + "dev": true, + "requires": { + "@babel/types": "^7.8.3" + } + }, + "@babel/helper-builder-binary-assignment-operator-visitor": { + "version": "7.8.3", + "resolved": "https://registry.npm.taobao.org/@babel/helper-builder-binary-assignment-operator-visitor/download/@babel/helper-builder-binary-assignment-operator-visitor-7.8.3.tgz?cache=0&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2F%40babel%2Fhelper-builder-binary-assignment-operator-visitor%2Fdownload%2F%40babel%2Fhelper-builder-binary-assignment-operator-visitor-7.8.3.tgz", + "integrity": "sha1-yECXpCegYaxWocMOv1S3si0kFQM=", + "dev": true, + "requires": { + "@babel/helper-explode-assignable-expression": "^7.8.3", + "@babel/types": "^7.8.3" + } + }, + "@babel/helper-compilation-targets": { + "version": "7.8.7", + "resolved": "https://registry.npm.taobao.org/@babel/helper-compilation-targets/download/@babel/helper-compilation-targets-7.8.7.tgz", + "integrity": "sha1-2sHuoVnA5L1G4wm1obBKZrU8Hd4=", + "dev": true, + "requires": { + "@babel/compat-data": "^7.8.6", + "browserslist": "^4.9.1", + "invariant": "^2.2.4", + "levenary": "^1.1.1", + "semver": "^5.5.0" + } + }, + "@babel/helper-create-class-features-plugin": { + "version": "7.8.6", + "resolved": "https://registry.npm.taobao.org/@babel/helper-create-class-features-plugin/download/@babel/helper-create-class-features-plugin-7.8.6.tgz?cache=0&sync_timestamp=1582806122669&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2F%40babel%2Fhelper-create-class-features-plugin%2Fdownload%2F%40babel%2Fhelper-create-class-features-plugin-7.8.6.tgz", + "integrity": "sha1-JDpbRuL48PZ03BOHYx62souFHeA=", + "dev": true, + "requires": { + "@babel/helper-function-name": "^7.8.3", + "@babel/helper-member-expression-to-functions": "^7.8.3", + "@babel/helper-optimise-call-expression": "^7.8.3", + "@babel/helper-plugin-utils": "^7.8.3", + "@babel/helper-replace-supers": "^7.8.6", + "@babel/helper-split-export-declaration": "^7.8.3" + } + }, + "@babel/helper-create-regexp-features-plugin": { + "version": "7.8.8", + "resolved": "https://registry.npm.taobao.org/@babel/helper-create-regexp-features-plugin/download/@babel/helper-create-regexp-features-plugin-7.8.8.tgz", + "integrity": "sha1-XYQYC1iPVgt4ZO+u6okkPlgxIIc=", + "dev": true, + "requires": { + "@babel/helper-annotate-as-pure": "^7.8.3", + "@babel/helper-regex": "^7.8.3", + "regexpu-core": "^4.7.0" + } + }, + "@babel/helper-define-map": { + "version": "7.8.3", + "resolved": "https://registry.npm.taobao.org/@babel/helper-define-map/download/@babel/helper-define-map-7.8.3.tgz?cache=0&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2F%40babel%2Fhelper-define-map%2Fdownload%2F%40babel%2Fhelper-define-map-7.8.3.tgz", + "integrity": "sha1-oGVcrVRRw3YLcm66h18c2PqgLBU=", + "dev": true, + "requires": { + "@babel/helper-function-name": "^7.8.3", + "@babel/types": "^7.8.3", + "lodash": "^4.17.13" + } + }, + "@babel/helper-explode-assignable-expression": { + "version": "7.8.3", + "resolved": "https://registry.npm.taobao.org/@babel/helper-explode-assignable-expression/download/@babel/helper-explode-assignable-expression-7.8.3.tgz?cache=0&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2F%40babel%2Fhelper-explode-assignable-expression%2Fdownload%2F%40babel%2Fhelper-explode-assignable-expression-7.8.3.tgz", + "integrity": "sha1-pyjcW06J4w/C38fQT6KKkwZT+YI=", + "dev": true, + "requires": { + "@babel/traverse": "^7.8.3", + "@babel/types": "^7.8.3" + } + }, + "@babel/helper-function-name": { + "version": "7.8.3", + "resolved": "https://registry.npm.taobao.org/@babel/helper-function-name/download/@babel/helper-function-name-7.8.3.tgz", + "integrity": "sha1-7utmWgGx8RBo6fuGrVahyxqCTMo=", + "dev": true, + "requires": { + "@babel/helper-get-function-arity": "^7.8.3", + "@babel/template": "^7.8.3", + "@babel/types": "^7.8.3" + } + }, + "@babel/helper-get-function-arity": { + "version": "7.8.3", + "resolved": "https://registry.npm.taobao.org/@babel/helper-get-function-arity/download/@babel/helper-get-function-arity-7.8.3.tgz", + "integrity": "sha1-uJS5R70AQ4HOY+odufCFR+kgq9U=", + "dev": true, + "requires": { + "@babel/types": "^7.8.3" + } + }, + "@babel/helper-hoist-variables": { + "version": "7.8.3", + "resolved": "https://registry.npm.taobao.org/@babel/helper-hoist-variables/download/@babel/helper-hoist-variables-7.8.3.tgz", + "integrity": "sha1-Hb6ba1XXjJtBg/yM3G4wzrg7cTQ=", + "dev": true, + "requires": { + "@babel/types": "^7.8.3" + } + }, + "@babel/helper-member-expression-to-functions": { + "version": "7.8.3", + "resolved": "https://registry.npm.taobao.org/@babel/helper-member-expression-to-functions/download/@babel/helper-member-expression-to-functions-7.8.3.tgz", + "integrity": "sha1-ZZtxBJjqbB2ZB+DHPyBu7n2twkw=", + "dev": true, + "requires": { + "@babel/types": "^7.8.3" + } + }, + "@babel/helper-module-imports": { + "version": "7.8.3", + "resolved": "https://registry.npm.taobao.org/@babel/helper-module-imports/download/@babel/helper-module-imports-7.8.3.tgz", + "integrity": "sha1-f+OVibOcAWMxtrjD9EHo8LFBlJg=", + "dev": true, + "requires": { + "@babel/types": "^7.8.3" + } + }, + "@babel/helper-module-transforms": { + "version": "7.9.0", + "resolved": "https://registry.npm.taobao.org/@babel/helper-module-transforms/download/@babel/helper-module-transforms-7.9.0.tgz", + "integrity": "sha1-Q7NN/hWWGRhwfSRzJ0MTiOn+luU=", + "dev": true, + "requires": { + "@babel/helper-module-imports": "^7.8.3", + "@babel/helper-replace-supers": "^7.8.6", + "@babel/helper-simple-access": "^7.8.3", + "@babel/helper-split-export-declaration": "^7.8.3", + "@babel/template": "^7.8.6", + "@babel/types": "^7.9.0", + "lodash": "^4.17.13" + } + }, + "@babel/helper-optimise-call-expression": { + "version": "7.8.3", + "resolved": "https://registry.npm.taobao.org/@babel/helper-optimise-call-expression/download/@babel/helper-optimise-call-expression-7.8.3.tgz", + "integrity": "sha1-ftBxgT0Jx1KY708giVYAa2ER7Lk=", + "dev": true, + "requires": { + "@babel/types": "^7.8.3" + } + }, + "@babel/helper-plugin-utils": { + "version": "7.8.3", + "resolved": "https://registry.npm.taobao.org/@babel/helper-plugin-utils/download/@babel/helper-plugin-utils-7.8.3.tgz?cache=0&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2F%40babel%2Fhelper-plugin-utils%2Fdownload%2F%40babel%2Fhelper-plugin-utils-7.8.3.tgz", + "integrity": "sha1-nqKTvhm6vA9S/4yoizTDYRsghnA=", + "dev": true + }, + "@babel/helper-regex": { + "version": "7.8.3", + "resolved": "https://registry.npm.taobao.org/@babel/helper-regex/download/@babel/helper-regex-7.8.3.tgz?cache=0&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2F%40babel%2Fhelper-regex%2Fdownload%2F%40babel%2Fhelper-regex-7.8.3.tgz", + "integrity": "sha1-E5dyYH1RuT8j7/5yEFsxnSpMaWU=", + "dev": true, + "requires": { + "lodash": "^4.17.13" + } + }, + "@babel/helper-remap-async-to-generator": { + "version": "7.8.3", + "resolved": "https://registry.npm.taobao.org/@babel/helper-remap-async-to-generator/download/@babel/helper-remap-async-to-generator-7.8.3.tgz", + "integrity": "sha1-JzxgDYub9QBhQsHjWIfVVcEu3YY=", + "dev": true, + "requires": { + "@babel/helper-annotate-as-pure": "^7.8.3", + "@babel/helper-wrap-function": "^7.8.3", + "@babel/template": "^7.8.3", + "@babel/traverse": "^7.8.3", + "@babel/types": "^7.8.3" + } + }, + "@babel/helper-replace-supers": { + "version": "7.8.6", + "resolved": "https://registry.npm.taobao.org/@babel/helper-replace-supers/download/@babel/helper-replace-supers-7.8.6.tgz", + "integrity": "sha1-Wtp0T9WtcyA78dZ0WaJ9y6Z+/8g=", + "dev": true, + "requires": { + "@babel/helper-member-expression-to-functions": "^7.8.3", + "@babel/helper-optimise-call-expression": "^7.8.3", + "@babel/traverse": "^7.8.6", + "@babel/types": "^7.8.6" + } + }, + "@babel/helper-simple-access": { + "version": "7.8.3", + "resolved": "https://registry.npm.taobao.org/@babel/helper-simple-access/download/@babel/helper-simple-access-7.8.3.tgz", + "integrity": "sha1-f4EJkotNq0ZUB2mGr1dSMd62Oa4=", + "dev": true, + "requires": { + "@babel/template": "^7.8.3", + "@babel/types": "^7.8.3" + } + }, + "@babel/helper-split-export-declaration": { + "version": "7.8.3", + "resolved": "https://registry.npm.taobao.org/@babel/helper-split-export-declaration/download/@babel/helper-split-export-declaration-7.8.3.tgz", + "integrity": "sha1-ManzAHD5E2inGCzwX4MXgQZfx6k=", + "dev": true, + "requires": { + "@babel/types": "^7.8.3" + } + }, + "@babel/helper-validator-identifier": { + "version": "7.9.0", + "resolved": "https://registry.npm.taobao.org/@babel/helper-validator-identifier/download/@babel/helper-validator-identifier-7.9.0.tgz", + "integrity": "sha1-rVNWKn/Cmzuakbv30QOX/RRjRu0=", + "dev": true + }, + "@babel/helper-wrap-function": { + "version": "7.8.3", + "resolved": "https://registry.npm.taobao.org/@babel/helper-wrap-function/download/@babel/helper-wrap-function-7.8.3.tgz?cache=0&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2F%40babel%2Fhelper-wrap-function%2Fdownload%2F%40babel%2Fhelper-wrap-function-7.8.3.tgz", + "integrity": "sha1-nb2yu1XvFKqgH+jJm2Kb1TUthhA=", + "dev": true, + "requires": { + "@babel/helper-function-name": "^7.8.3", + "@babel/template": "^7.8.3", + "@babel/traverse": "^7.8.3", + "@babel/types": "^7.8.3" + } + }, + "@babel/helpers": { + "version": "7.9.2", + "resolved": "https://registry.npm.taobao.org/@babel/helpers/download/@babel/helpers-7.9.2.tgz?cache=0&sync_timestamp=1584800150419&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2F%40babel%2Fhelpers%2Fdownload%2F%40babel%2Fhelpers-7.9.2.tgz", + "integrity": "sha1-tCqBqBHx5zE7iMuorcZrPZrmwJ8=", + "dev": true, + "requires": { + "@babel/template": "^7.8.3", + "@babel/traverse": "^7.9.0", + "@babel/types": "^7.9.0" + } + }, + "@babel/highlight": { + "version": "7.9.0", + "resolved": "https://registry.npm.taobao.org/@babel/highlight/download/@babel/highlight-7.9.0.tgz", + "integrity": "sha1-TptFzLgreWBycbKXmtgse2gWMHk=", + "dev": true, + "requires": { + "@babel/helper-validator-identifier": "^7.9.0", + "chalk": "^2.0.0", + "js-tokens": "^4.0.0" + } + }, + "@babel/parser": { + "version": "7.9.4", + "resolved": "https://registry.npm.taobao.org/@babel/parser/download/@babel/parser-7.9.4.tgz?cache=0&sync_timestamp=1585038810017&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2F%40babel%2Fparser%2Fdownload%2F%40babel%2Fparser-7.9.4.tgz", + "integrity": "sha1-aKNeawMZu8AURlvkOCgwARPy8ug=", + "dev": true + }, + "@babel/plugin-proposal-async-generator-functions": { + "version": "7.8.3", + "resolved": "https://registry.npm.taobao.org/@babel/plugin-proposal-async-generator-functions/download/@babel/plugin-proposal-async-generator-functions-7.8.3.tgz?cache=0&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2F%40babel%2Fplugin-proposal-async-generator-functions%2Fdownload%2F%40babel%2Fplugin-proposal-async-generator-functions-7.8.3.tgz", + "integrity": "sha1-utMpxnCzgliXIbJ1QMfSiGAcbm8=", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.8.3", + "@babel/helper-remap-async-to-generator": "^7.8.3", + "@babel/plugin-syntax-async-generators": "^7.8.0" + } + }, + "@babel/plugin-proposal-class-properties": { + "version": "7.8.3", + "resolved": "https://registry.npm.taobao.org/@babel/plugin-proposal-class-properties/download/@babel/plugin-proposal-class-properties-7.8.3.tgz?cache=0&sync_timestamp=1578951896490&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2F%40babel%2Fplugin-proposal-class-properties%2Fdownload%2F%40babel%2Fplugin-proposal-class-properties-7.8.3.tgz", + "integrity": "sha1-XgZlSvXNBLYIkVqtqbKmeIAERk4=", + "dev": true, + "requires": { + "@babel/helper-create-class-features-plugin": "^7.8.3", + "@babel/helper-plugin-utils": "^7.8.3" + } + }, + "@babel/plugin-proposal-decorators": { + "version": "7.8.3", + "resolved": "https://registry.npm.taobao.org/@babel/plugin-proposal-decorators/download/@babel/plugin-proposal-decorators-7.8.3.tgz?cache=0&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2F%40babel%2Fplugin-proposal-decorators%2Fdownload%2F%40babel%2Fplugin-proposal-decorators-7.8.3.tgz", + "integrity": "sha1-IVaGCrZcWr8GjD9nBCGEBBBmVD4=", + "dev": true, + "requires": { + "@babel/helper-create-class-features-plugin": "^7.8.3", + "@babel/helper-plugin-utils": "^7.8.3", + "@babel/plugin-syntax-decorators": "^7.8.3" + } + }, + "@babel/plugin-proposal-dynamic-import": { + "version": "7.8.3", + "resolved": "https://registry.npm.taobao.org/@babel/plugin-proposal-dynamic-import/download/@babel/plugin-proposal-dynamic-import-7.8.3.tgz", + "integrity": "sha1-OMT+VVdEgm6X4q6TCw+0zAfmYFQ=", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.8.3", + "@babel/plugin-syntax-dynamic-import": "^7.8.0" + } + }, + "@babel/plugin-proposal-json-strings": { + "version": "7.8.3", + "resolved": "https://registry.npm.taobao.org/@babel/plugin-proposal-json-strings/download/@babel/plugin-proposal-json-strings-7.8.3.tgz?cache=0&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2F%40babel%2Fplugin-proposal-json-strings%2Fdownload%2F%40babel%2Fplugin-proposal-json-strings-7.8.3.tgz", + "integrity": "sha1-2lIWsjipi1ih4F1oUhBLEPmnDWs=", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.8.3", + "@babel/plugin-syntax-json-strings": "^7.8.0" + } + }, + "@babel/plugin-proposal-nullish-coalescing-operator": { + "version": "7.8.3", + "resolved": "https://registry.npm.taobao.org/@babel/plugin-proposal-nullish-coalescing-operator/download/@babel/plugin-proposal-nullish-coalescing-operator-7.8.3.tgz?cache=0&sync_timestamp=1578952594995&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2F%40babel%2Fplugin-proposal-nullish-coalescing-operator%2Fdownload%2F%40babel%2Fplugin-proposal-nullish-coalescing-operator-7.8.3.tgz", + "integrity": "sha1-5FciU/3u1lzd7s/as/kor+sv1dI=", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.8.3", + "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.0" + } + }, + "@babel/plugin-proposal-numeric-separator": { + "version": "7.8.3", + "resolved": "https://registry.npm.taobao.org/@babel/plugin-proposal-numeric-separator/download/@babel/plugin-proposal-numeric-separator-7.8.3.tgz", + "integrity": "sha1-XWdpQJaZ7Js7aGhM2BFs7f+Tutg=", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.8.3", + "@babel/plugin-syntax-numeric-separator": "^7.8.3" + } + }, + "@babel/plugin-proposal-object-rest-spread": { + "version": "7.9.0", + "resolved": "https://registry.npm.taobao.org/@babel/plugin-proposal-object-rest-spread/download/@babel/plugin-proposal-object-rest-spread-7.9.0.tgz?cache=0&sync_timestamp=1584746117277&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2F%40babel%2Fplugin-proposal-object-rest-spread%2Fdownload%2F%40babel%2Fplugin-proposal-object-rest-spread-7.9.0.tgz", + "integrity": "sha1-oomTaZ/BPfFlmVNiaTliumsGHW8=", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.8.3", + "@babel/plugin-syntax-object-rest-spread": "^7.8.0" + } + }, + "@babel/plugin-proposal-optional-catch-binding": { + "version": "7.8.3", + "resolved": "https://registry.npm.taobao.org/@babel/plugin-proposal-optional-catch-binding/download/@babel/plugin-proposal-optional-catch-binding-7.8.3.tgz?cache=0&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2F%40babel%2Fplugin-proposal-optional-catch-binding%2Fdownload%2F%40babel%2Fplugin-proposal-optional-catch-binding-7.8.3.tgz", + "integrity": "sha1-ne6WqxZQ7tiGRq6XNMoWesSpxck=", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.8.3", + "@babel/plugin-syntax-optional-catch-binding": "^7.8.0" + } + }, + "@babel/plugin-proposal-optional-chaining": { + "version": "7.9.0", + "resolved": "https://registry.npm.taobao.org/@babel/plugin-proposal-optional-chaining/download/@babel/plugin-proposal-optional-chaining-7.9.0.tgz", + "integrity": "sha1-MdsWsVTDnWuKZFKSRyuYOUwpKlg=", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.8.3", + "@babel/plugin-syntax-optional-chaining": "^7.8.0" + } + }, + "@babel/plugin-proposal-unicode-property-regex": { + "version": "7.8.8", + "resolved": "https://registry.npm.taobao.org/@babel/plugin-proposal-unicode-property-regex/download/@babel/plugin-proposal-unicode-property-regex-7.8.8.tgz?cache=0&sync_timestamp=1584039006999&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2F%40babel%2Fplugin-proposal-unicode-property-regex%2Fdownload%2F%40babel%2Fplugin-proposal-unicode-property-regex-7.8.8.tgz", + "integrity": "sha1-7jqV6QzcBP6M2S7DJ5+gF9aKDR0=", + "dev": true, + "requires": { + "@babel/helper-create-regexp-features-plugin": "^7.8.8", + "@babel/helper-plugin-utils": "^7.8.3" + } + }, + "@babel/plugin-syntax-async-generators": { + "version": "7.8.4", + "resolved": "https://registry.npm.taobao.org/@babel/plugin-syntax-async-generators/download/@babel/plugin-syntax-async-generators-7.8.4.tgz", + "integrity": "sha1-qYP7Gusuw/btBCohD2QOkOeG/g0=", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.8.0" + } + }, + "@babel/plugin-syntax-decorators": { + "version": "7.8.3", + "resolved": "https://registry.npm.taobao.org/@babel/plugin-syntax-decorators/download/@babel/plugin-syntax-decorators-7.8.3.tgz?cache=0&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2F%40babel%2Fplugin-syntax-decorators%2Fdownload%2F%40babel%2Fplugin-syntax-decorators-7.8.3.tgz", + "integrity": "sha1-jSwVqfGvYksAJflhaCqdU9MAG9o=", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.8.3" + } + }, + "@babel/plugin-syntax-dynamic-import": { + "version": "7.8.3", + "resolved": "https://registry.npm.taobao.org/@babel/plugin-syntax-dynamic-import/download/@babel/plugin-syntax-dynamic-import-7.8.3.tgz", + "integrity": "sha1-Yr+Ysto80h1iYVT8lu5bPLaOrLM=", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.8.0" + } + }, + "@babel/plugin-syntax-json-strings": { + "version": "7.8.3", + "resolved": "https://registry.npm.taobao.org/@babel/plugin-syntax-json-strings/download/@babel/plugin-syntax-json-strings-7.8.3.tgz", + "integrity": "sha1-AcohtmjNghjJ5kDLbdiMVBKyyWo=", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.8.0" + } + }, + "@babel/plugin-syntax-jsx": { + "version": "7.8.3", + "resolved": "https://registry.npm.taobao.org/@babel/plugin-syntax-jsx/download/@babel/plugin-syntax-jsx-7.8.3.tgz?cache=0&sync_timestamp=1578952595130&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2F%40babel%2Fplugin-syntax-jsx%2Fdownload%2F%40babel%2Fplugin-syntax-jsx-7.8.3.tgz", + "integrity": "sha1-UhsGyDxASA8eWLT9M7kuzrHW6pQ=", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.8.3" + } + }, + "@babel/plugin-syntax-nullish-coalescing-operator": { + "version": "7.8.3", + "resolved": "https://registry.npm.taobao.org/@babel/plugin-syntax-nullish-coalescing-operator/download/@babel/plugin-syntax-nullish-coalescing-operator-7.8.3.tgz?cache=0&sync_timestamp=1578952518069&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2F%40babel%2Fplugin-syntax-nullish-coalescing-operator%2Fdownload%2F%40babel%2Fplugin-syntax-nullish-coalescing-operator-7.8.3.tgz", + "integrity": "sha1-Fn7XA2iIYIH3S1w2xlqIwDtm0ak=", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.8.0" + } + }, + "@babel/plugin-syntax-numeric-separator": { + "version": "7.8.3", + "resolved": "https://registry.npm.taobao.org/@babel/plugin-syntax-numeric-separator/download/@babel/plugin-syntax-numeric-separator-7.8.3.tgz", + "integrity": "sha1-Dj+2Pgm+obEelkZyccgwgAfnxB8=", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.8.3" + } + }, + "@babel/plugin-syntax-object-rest-spread": { + "version": "7.8.3", + "resolved": "https://registry.npm.taobao.org/@babel/plugin-syntax-object-rest-spread/download/@babel/plugin-syntax-object-rest-spread-7.8.3.tgz?cache=0&sync_timestamp=1578950070697&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2F%40babel%2Fplugin-syntax-object-rest-spread%2Fdownload%2F%40babel%2Fplugin-syntax-object-rest-spread-7.8.3.tgz", + "integrity": "sha1-YOIl7cvZimQDMqLnLdPmbxr1WHE=", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.8.0" + } + }, + "@babel/plugin-syntax-optional-catch-binding": { + "version": "7.8.3", + "resolved": "https://registry.npm.taobao.org/@babel/plugin-syntax-optional-catch-binding/download/@babel/plugin-syntax-optional-catch-binding-7.8.3.tgz", + "integrity": "sha1-YRGiZbz7Ag6579D9/X0mQCue1sE=", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.8.0" + } + }, + "@babel/plugin-syntax-optional-chaining": { + "version": "7.8.3", + "resolved": "https://registry.npm.taobao.org/@babel/plugin-syntax-optional-chaining/download/@babel/plugin-syntax-optional-chaining-7.8.3.tgz?cache=0&sync_timestamp=1578952519472&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2F%40babel%2Fplugin-syntax-optional-chaining%2Fdownload%2F%40babel%2Fplugin-syntax-optional-chaining-7.8.3.tgz", + "integrity": "sha1-T2nCq5UWfgGAzVM2YT+MV4j31Io=", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.8.0" + } + }, + "@babel/plugin-syntax-top-level-await": { + "version": "7.8.3", + "resolved": "https://registry.npm.taobao.org/@babel/plugin-syntax-top-level-await/download/@babel/plugin-syntax-top-level-await-7.8.3.tgz?cache=0&sync_timestamp=1578952595485&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2F%40babel%2Fplugin-syntax-top-level-await%2Fdownload%2F%40babel%2Fplugin-syntax-top-level-await-7.8.3.tgz", + "integrity": "sha1-Os3s5pXmsTqvV/wpHRqACVDHE5E=", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.8.3" + } + }, + "@babel/plugin-transform-arrow-functions": { + "version": "7.8.3", + "resolved": "https://registry.npm.taobao.org/@babel/plugin-transform-arrow-functions/download/@babel/plugin-transform-arrow-functions-7.8.3.tgz", + "integrity": "sha1-gndsLtDNnhpJlW2uuJYCTJRzuLY=", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.8.3" + } + }, + "@babel/plugin-transform-async-to-generator": { + "version": "7.8.3", + "resolved": "https://registry.npm.taobao.org/@babel/plugin-transform-async-to-generator/download/@babel/plugin-transform-async-to-generator-7.8.3.tgz", + "integrity": "sha1-Qwj60NlAnXHq+5sabuNfnWS2QIY=", + "dev": true, + "requires": { + "@babel/helper-module-imports": "^7.8.3", + "@babel/helper-plugin-utils": "^7.8.3", + "@babel/helper-remap-async-to-generator": "^7.8.3" + } + }, + "@babel/plugin-transform-block-scoped-functions": { + "version": "7.8.3", + "resolved": "https://registry.npm.taobao.org/@babel/plugin-transform-block-scoped-functions/download/@babel/plugin-transform-block-scoped-functions-7.8.3.tgz", + "integrity": "sha1-Q37sW3mbWFIHIISzrl72boNJ6KM=", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.8.3" + } + }, + "@babel/plugin-transform-block-scoping": { + "version": "7.8.3", + "resolved": "https://registry.npm.taobao.org/@babel/plugin-transform-block-scoping/download/@babel/plugin-transform-block-scoping-7.8.3.tgz", + "integrity": "sha1-l9Ndq2aFekN8FmNYuR0JBQyGjzo=", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.8.3", + "lodash": "^4.17.13" + } + }, + "@babel/plugin-transform-classes": { + "version": "7.9.2", + "resolved": "https://registry.npm.taobao.org/@babel/plugin-transform-classes/download/@babel/plugin-transform-classes-7.9.2.tgz?cache=0&sync_timestamp=1584800373996&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2F%40babel%2Fplugin-transform-classes%2Fdownload%2F%40babel%2Fplugin-transform-classes-7.9.2.tgz", + "integrity": "sha1-hgP8PMRJ4x/b28JX9ncXU2oRr40=", + "dev": true, + "requires": { + "@babel/helper-annotate-as-pure": "^7.8.3", + "@babel/helper-define-map": "^7.8.3", + "@babel/helper-function-name": "^7.8.3", + "@babel/helper-optimise-call-expression": "^7.8.3", + "@babel/helper-plugin-utils": "^7.8.3", + "@babel/helper-replace-supers": "^7.8.6", + "@babel/helper-split-export-declaration": "^7.8.3", + "globals": "^11.1.0" + } + }, + "@babel/plugin-transform-computed-properties": { + "version": "7.8.3", + "resolved": "https://registry.npm.taobao.org/@babel/plugin-transform-computed-properties/download/@babel/plugin-transform-computed-properties-7.8.3.tgz", + "integrity": "sha1-ltDSi3985OtbEguy4OlDNDyG+Bs=", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.8.3" + } + }, + "@babel/plugin-transform-destructuring": { + "version": "7.8.8", + "resolved": "https://registry.npm.taobao.org/@babel/plugin-transform-destructuring/download/@babel/plugin-transform-destructuring-7.8.8.tgz", + "integrity": "sha1-+tsryOkMyvVljeb41NIv9icqL0s=", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.8.3" + } + }, + "@babel/plugin-transform-dotall-regex": { + "version": "7.8.3", + "resolved": "https://registry.npm.taobao.org/@babel/plugin-transform-dotall-regex/download/@babel/plugin-transform-dotall-regex-7.8.3.tgz", + "integrity": "sha1-w8bsXuYSXGmTxcvKINyGIanqem4=", + "dev": true, + "requires": { + "@babel/helper-create-regexp-features-plugin": "^7.8.3", + "@babel/helper-plugin-utils": "^7.8.3" + } + }, + "@babel/plugin-transform-duplicate-keys": { + "version": "7.8.3", + "resolved": "https://registry.npm.taobao.org/@babel/plugin-transform-duplicate-keys/download/@babel/plugin-transform-duplicate-keys-7.8.3.tgz", + "integrity": "sha1-jRLfMJqlN/JyiZxWXqF2jihuIfE=", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.8.3" + } + }, + "@babel/plugin-transform-exponentiation-operator": { + "version": "7.8.3", + "resolved": "https://registry.npm.taobao.org/@babel/plugin-transform-exponentiation-operator/download/@babel/plugin-transform-exponentiation-operator-7.8.3.tgz", + "integrity": "sha1-WBptf1aXDga/UVYM1k9elHtw17c=", + "dev": true, + "requires": { + "@babel/helper-builder-binary-assignment-operator-visitor": "^7.8.3", + "@babel/helper-plugin-utils": "^7.8.3" + } + }, + "@babel/plugin-transform-for-of": { + "version": "7.9.0", + "resolved": "https://registry.npm.taobao.org/@babel/plugin-transform-for-of/download/@babel/plugin-transform-for-of-7.9.0.tgz", + "integrity": "sha1-DyYOJ9PinNG7MSjaXnbHYapsEI4=", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.8.3" + } + }, + "@babel/plugin-transform-function-name": { + "version": "7.8.3", + "resolved": "https://registry.npm.taobao.org/@babel/plugin-transform-function-name/download/@babel/plugin-transform-function-name-7.8.3.tgz", + "integrity": "sha1-J5NzyycyKqrWfCaD53bfxHGW7Ys=", + "dev": true, + "requires": { + "@babel/helper-function-name": "^7.8.3", + "@babel/helper-plugin-utils": "^7.8.3" + } + }, + "@babel/plugin-transform-literals": { + "version": "7.8.3", + "resolved": "https://registry.npm.taobao.org/@babel/plugin-transform-literals/download/@babel/plugin-transform-literals-7.8.3.tgz", + "integrity": "sha1-rvI5gj2RmU7Hto5VGTUl1229XcE=", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.8.3" + } + }, + "@babel/plugin-transform-member-expression-literals": { + "version": "7.8.3", + "resolved": "https://registry.npm.taobao.org/@babel/plugin-transform-member-expression-literals/download/@babel/plugin-transform-member-expression-literals-7.8.3.tgz", + "integrity": "sha1-lj/tS2IKx8v2Apx1VCQCn6OkBBA=", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.8.3" + } + }, + "@babel/plugin-transform-modules-amd": { + "version": "7.9.0", + "resolved": "https://registry.npm.taobao.org/@babel/plugin-transform-modules-amd/download/@babel/plugin-transform-modules-amd-7.9.0.tgz?cache=0&sync_timestamp=1584718863960&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2F%40babel%2Fplugin-transform-modules-amd%2Fdownload%2F%40babel%2Fplugin-transform-modules-amd-7.9.0.tgz", + "integrity": "sha1-GXVe5yGRLPW7BMB9UCgK80hO/vQ=", + "dev": true, + "requires": { + "@babel/helper-module-transforms": "^7.9.0", + "@babel/helper-plugin-utils": "^7.8.3", + "babel-plugin-dynamic-import-node": "^2.3.0" + } + }, + "@babel/plugin-transform-modules-commonjs": { + "version": "7.9.0", + "resolved": "https://registry.npm.taobao.org/@babel/plugin-transform-modules-commonjs/download/@babel/plugin-transform-modules-commonjs-7.9.0.tgz?cache=0&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2F%40babel%2Fplugin-transform-modules-commonjs%2Fdownload%2F%40babel%2Fplugin-transform-modules-commonjs-7.9.0.tgz", + "integrity": "sha1-4+cvTLybSiYOML4OpZvfWjl0iUA=", + "dev": true, + "requires": { + "@babel/helper-module-transforms": "^7.9.0", + "@babel/helper-plugin-utils": "^7.8.3", + "@babel/helper-simple-access": "^7.8.3", + "babel-plugin-dynamic-import-node": "^2.3.0" + } + }, + "@babel/plugin-transform-modules-systemjs": { + "version": "7.9.0", + "resolved": "https://registry.npm.taobao.org/@babel/plugin-transform-modules-systemjs/download/@babel/plugin-transform-modules-systemjs-7.9.0.tgz?cache=0&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2F%40babel%2Fplugin-transform-modules-systemjs%2Fdownload%2F%40babel%2Fplugin-transform-modules-systemjs-7.9.0.tgz", + "integrity": "sha1-6f1Gopb8keAJtk4H3aqG1vDt65A=", + "dev": true, + "requires": { + "@babel/helper-hoist-variables": "^7.8.3", + "@babel/helper-module-transforms": "^7.9.0", + "@babel/helper-plugin-utils": "^7.8.3", + "babel-plugin-dynamic-import-node": "^2.3.0" + } + }, + "@babel/plugin-transform-modules-umd": { + "version": "7.9.0", + "resolved": "https://registry.npm.taobao.org/@babel/plugin-transform-modules-umd/download/@babel/plugin-transform-modules-umd-7.9.0.tgz?cache=0&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2F%40babel%2Fplugin-transform-modules-umd%2Fdownload%2F%40babel%2Fplugin-transform-modules-umd-7.9.0.tgz", + "integrity": "sha1-6Qmsridv7CgPm4IaXzjh8ItIBpc=", + "dev": true, + "requires": { + "@babel/helper-module-transforms": "^7.9.0", + "@babel/helper-plugin-utils": "^7.8.3" + } + }, + "@babel/plugin-transform-named-capturing-groups-regex": { + "version": "7.8.3", + "resolved": "https://registry.npm.taobao.org/@babel/plugin-transform-named-capturing-groups-regex/download/@babel/plugin-transform-named-capturing-groups-regex-7.8.3.tgz", + "integrity": "sha1-oqcr/6ICrA4tBQav0JOcXsvEjGw=", + "dev": true, + "requires": { + "@babel/helper-create-regexp-features-plugin": "^7.8.3" + } + }, + "@babel/plugin-transform-new-target": { + "version": "7.8.3", + "resolved": "https://registry.npm.taobao.org/@babel/plugin-transform-new-target/download/@babel/plugin-transform-new-target-7.8.3.tgz", + "integrity": "sha1-YMwq5m2FyVq1QOs0urtkNNTHDEM=", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.8.3" + } + }, + "@babel/plugin-transform-object-super": { + "version": "7.8.3", + "resolved": "https://registry.npm.taobao.org/@babel/plugin-transform-object-super/download/@babel/plugin-transform-object-super-7.8.3.tgz", + "integrity": "sha1-67ah56hv+paFi9asAQLWWUQmFyU=", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.8.3", + "@babel/helper-replace-supers": "^7.8.3" + } + }, + "@babel/plugin-transform-parameters": { + "version": "7.9.3", + "resolved": "https://registry.npm.taobao.org/@babel/plugin-transform-parameters/download/@babel/plugin-transform-parameters-7.9.3.tgz", + "integrity": "sha1-MCjQzCDdxzMWbG6chTRVnO4J9Uo=", + "dev": true, + "requires": { + "@babel/helper-get-function-arity": "^7.8.3", + "@babel/helper-plugin-utils": "^7.8.3" + } + }, + "@babel/plugin-transform-property-literals": { + "version": "7.8.3", + "resolved": "https://registry.npm.taobao.org/@babel/plugin-transform-property-literals/download/@babel/plugin-transform-property-literals-7.8.3.tgz", + "integrity": "sha1-MxlDANhTnB7SjGKtUIe6OAe5gmM=", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.8.3" + } + }, + "@babel/plugin-transform-regenerator": { + "version": "7.8.7", + "resolved": "https://registry.npm.taobao.org/@babel/plugin-transform-regenerator/download/@babel/plugin-transform-regenerator-7.8.7.tgz?cache=0&sync_timestamp=1583373435237&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2F%40babel%2Fplugin-transform-regenerator%2Fdownload%2F%40babel%2Fplugin-transform-regenerator-7.8.7.tgz", + "integrity": "sha1-Xkag3KK+4a2ChesFJ+arycN2cvg=", + "dev": true, + "requires": { + "regenerator-transform": "^0.14.2" + } + }, + "@babel/plugin-transform-reserved-words": { + "version": "7.8.3", + "resolved": "https://registry.npm.taobao.org/@babel/plugin-transform-reserved-words/download/@babel/plugin-transform-reserved-words-7.8.3.tgz", + "integrity": "sha1-mgY1rE5mXSmxYoN908xQdF398fU=", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.8.3" + } + }, + "@babel/plugin-transform-runtime": { + "version": "7.9.0", + "resolved": "https://registry.npm.taobao.org/@babel/plugin-transform-runtime/download/@babel/plugin-transform-runtime-7.9.0.tgz", + "integrity": "sha1-RUaMCudMwTIE4dOx9M5u6DJYrws=", + "dev": true, + "requires": { + "@babel/helper-module-imports": "^7.8.3", + "@babel/helper-plugin-utils": "^7.8.3", + "resolve": "^1.8.1", + "semver": "^5.5.1" + } + }, + "@babel/plugin-transform-shorthand-properties": { + "version": "7.8.3", + "resolved": "https://registry.npm.taobao.org/@babel/plugin-transform-shorthand-properties/download/@babel/plugin-transform-shorthand-properties-7.8.3.tgz", + "integrity": "sha1-KFRSFuAjqDLU06EYXtSSvP6sCMg=", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.8.3" + } + }, + "@babel/plugin-transform-spread": { + "version": "7.8.3", + "resolved": "https://registry.npm.taobao.org/@babel/plugin-transform-spread/download/@babel/plugin-transform-spread-7.8.3.tgz", + "integrity": "sha1-nI/+gXD9+4ixFOy5ILgvtulf5eg=", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.8.3" + } + }, + "@babel/plugin-transform-sticky-regex": { + "version": "7.8.3", + "resolved": "https://registry.npm.taobao.org/@babel/plugin-transform-sticky-regex/download/@babel/plugin-transform-sticky-regex-7.8.3.tgz", + "integrity": "sha1-vnoSkPgdrnZ0dUUhmeH3bWF1sQA=", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.8.3", + "@babel/helper-regex": "^7.8.3" + } + }, + "@babel/plugin-transform-template-literals": { + "version": "7.8.3", + "resolved": "https://registry.npm.taobao.org/@babel/plugin-transform-template-literals/download/@babel/plugin-transform-template-literals-7.8.3.tgz", + "integrity": "sha1-e/pHMrRV6mpDEwrcC6dn7A5AKoA=", + "dev": true, + "requires": { + "@babel/helper-annotate-as-pure": "^7.8.3", + "@babel/helper-plugin-utils": "^7.8.3" + } + }, + "@babel/plugin-transform-typeof-symbol": { + "version": "7.8.4", + "resolved": "https://registry.npm.taobao.org/@babel/plugin-transform-typeof-symbol/download/@babel/plugin-transform-typeof-symbol-7.8.4.tgz?cache=0&sync_timestamp=1580387785094&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2F%40babel%2Fplugin-transform-typeof-symbol%2Fdownload%2F%40babel%2Fplugin-transform-typeof-symbol-7.8.4.tgz", + "integrity": "sha1-7eQGIxXOCq+KZXqSCFjxovNfxBI=", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.8.3" + } + }, + "@babel/plugin-transform-unicode-regex": { + "version": "7.8.3", + "resolved": "https://registry.npm.taobao.org/@babel/plugin-transform-unicode-regex/download/@babel/plugin-transform-unicode-regex-7.8.3.tgz", + "integrity": "sha1-DO8247pz5cVyc+/7GC9GuRoeyq0=", + "dev": true, + "requires": { + "@babel/helper-create-regexp-features-plugin": "^7.8.3", + "@babel/helper-plugin-utils": "^7.8.3" + } + }, + "@babel/preset-env": { + "version": "7.9.0", + "resolved": "https://registry.npm.taobao.org/@babel/preset-env/download/@babel/preset-env-7.9.0.tgz", + "integrity": "sha1-pfxCSA6VCuj12fjyu8A/UnIt86g=", + "dev": true, + "requires": { + "@babel/compat-data": "^7.9.0", + "@babel/helper-compilation-targets": "^7.8.7", + "@babel/helper-module-imports": "^7.8.3", + "@babel/helper-plugin-utils": "^7.8.3", + "@babel/plugin-proposal-async-generator-functions": "^7.8.3", + "@babel/plugin-proposal-dynamic-import": "^7.8.3", + "@babel/plugin-proposal-json-strings": "^7.8.3", + "@babel/plugin-proposal-nullish-coalescing-operator": "^7.8.3", + "@babel/plugin-proposal-numeric-separator": "^7.8.3", + "@babel/plugin-proposal-object-rest-spread": "^7.9.0", + "@babel/plugin-proposal-optional-catch-binding": "^7.8.3", + "@babel/plugin-proposal-optional-chaining": "^7.9.0", + "@babel/plugin-proposal-unicode-property-regex": "^7.8.3", + "@babel/plugin-syntax-async-generators": "^7.8.0", + "@babel/plugin-syntax-dynamic-import": "^7.8.0", + "@babel/plugin-syntax-json-strings": "^7.8.0", + "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.0", + "@babel/plugin-syntax-numeric-separator": "^7.8.0", + "@babel/plugin-syntax-object-rest-spread": "^7.8.0", + "@babel/plugin-syntax-optional-catch-binding": "^7.8.0", + "@babel/plugin-syntax-optional-chaining": "^7.8.0", + "@babel/plugin-syntax-top-level-await": "^7.8.3", + "@babel/plugin-transform-arrow-functions": "^7.8.3", + "@babel/plugin-transform-async-to-generator": "^7.8.3", + "@babel/plugin-transform-block-scoped-functions": "^7.8.3", + "@babel/plugin-transform-block-scoping": "^7.8.3", + "@babel/plugin-transform-classes": "^7.9.0", + "@babel/plugin-transform-computed-properties": "^7.8.3", + "@babel/plugin-transform-destructuring": "^7.8.3", + "@babel/plugin-transform-dotall-regex": "^7.8.3", + "@babel/plugin-transform-duplicate-keys": "^7.8.3", + "@babel/plugin-transform-exponentiation-operator": "^7.8.3", + "@babel/plugin-transform-for-of": "^7.9.0", + "@babel/plugin-transform-function-name": "^7.8.3", + "@babel/plugin-transform-literals": "^7.8.3", + "@babel/plugin-transform-member-expression-literals": "^7.8.3", + "@babel/plugin-transform-modules-amd": "^7.9.0", + "@babel/plugin-transform-modules-commonjs": "^7.9.0", + "@babel/plugin-transform-modules-systemjs": "^7.9.0", + "@babel/plugin-transform-modules-umd": "^7.9.0", + "@babel/plugin-transform-named-capturing-groups-regex": "^7.8.3", + "@babel/plugin-transform-new-target": "^7.8.3", + "@babel/plugin-transform-object-super": "^7.8.3", + "@babel/plugin-transform-parameters": "^7.8.7", + "@babel/plugin-transform-property-literals": "^7.8.3", + "@babel/plugin-transform-regenerator": "^7.8.7", + "@babel/plugin-transform-reserved-words": "^7.8.3", + "@babel/plugin-transform-shorthand-properties": "^7.8.3", + "@babel/plugin-transform-spread": "^7.8.3", + "@babel/plugin-transform-sticky-regex": "^7.8.3", + "@babel/plugin-transform-template-literals": "^7.8.3", + "@babel/plugin-transform-typeof-symbol": "^7.8.4", + "@babel/plugin-transform-unicode-regex": "^7.8.3", + "@babel/preset-modules": "^0.1.3", + "@babel/types": "^7.9.0", + "browserslist": "^4.9.1", + "core-js-compat": "^3.6.2", + "invariant": "^2.2.2", + "levenary": "^1.1.1", + "semver": "^5.5.0" + } + }, + "@babel/preset-modules": { + "version": "0.1.3", + "resolved": "https://registry.npm.taobao.org/@babel/preset-modules/download/@babel/preset-modules-0.1.3.tgz", + "integrity": "sha1-EyQrU7XvjIg8PPfd3VWzbOgPvHI=", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.0.0", + "@babel/plugin-proposal-unicode-property-regex": "^7.4.4", + "@babel/plugin-transform-dotall-regex": "^7.4.4", + "@babel/types": "^7.4.4", + "esutils": "^2.0.2" + } + }, + "@babel/runtime": { + "version": "7.9.2", + "resolved": "https://registry.npm.taobao.org/@babel/runtime/download/@babel/runtime-7.9.2.tgz?cache=0&sync_timestamp=1584800310568&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2F%40babel%2Fruntime%2Fdownload%2F%40babel%2Fruntime-7.9.2.tgz", + "integrity": "sha1-2Q3wWDo6JS8JqqYZZlNnuuUY2wY=", + "dev": true, + "requires": { + "regenerator-runtime": "^0.13.4" + } + }, + "@babel/template": { + "version": "7.8.6", + "resolved": "https://registry.npm.taobao.org/@babel/template/download/@babel/template-7.8.6.tgz", + "integrity": "sha1-hrIq8V+CjfsIZHT5ZNzD45xDzis=", + "dev": true, + "requires": { + "@babel/code-frame": "^7.8.3", + "@babel/parser": "^7.8.6", + "@babel/types": "^7.8.6" + } + }, + "@babel/traverse": { + "version": "7.9.0", + "resolved": "https://registry.npm.taobao.org/@babel/traverse/download/@babel/traverse-7.9.0.tgz?cache=0&sync_timestamp=1584720333049&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2F%40babel%2Ftraverse%2Fdownload%2F%40babel%2Ftraverse-7.9.0.tgz", + "integrity": "sha1-04gsKDDlE/T+TOyf526hzHh0eJI=", + "dev": true, + "requires": { + "@babel/code-frame": "^7.8.3", + "@babel/generator": "^7.9.0", + "@babel/helper-function-name": "^7.8.3", + "@babel/helper-split-export-declaration": "^7.8.3", + "@babel/parser": "^7.9.0", + "@babel/types": "^7.9.0", + "debug": "^4.1.0", + "globals": "^11.1.0", + "lodash": "^4.17.13" + } + }, + "@babel/types": { + "version": "7.9.0", + "resolved": "https://registry.npm.taobao.org/@babel/types/download/@babel/types-7.9.0.tgz?cache=0&sync_timestamp=1584746126419&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2F%40babel%2Ftypes%2Fdownload%2F%40babel%2Ftypes-7.9.0.tgz", + "integrity": "sha1-ALBkw9+DrTKy2/X/BzErFcfx77U=", + "dev": true, + "requires": { + "@babel/helper-validator-identifier": "^7.9.0", + "lodash": "^4.17.13", + "to-fast-properties": "^2.0.0" + } + }, + "@hapi/address": { + "version": "2.1.4", + "resolved": "https://registry.npm.taobao.org/@hapi/address/download/@hapi/address-2.1.4.tgz?cache=0&sync_timestamp=1584171913757&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2F%40hapi%2Faddress%2Fdownload%2F%40hapi%2Faddress-2.1.4.tgz", + "integrity": "sha1-XWftQ/P9QaadS5/3tW58DR0KgeU=", + "dev": true + }, + "@hapi/bourne": { + "version": "1.3.2", + "resolved": "https://registry.npm.taobao.org/@hapi/bourne/download/@hapi/bourne-1.3.2.tgz", + "integrity": "sha1-CnCVreoGckPOMoPhtWuKj0U7JCo=", + "dev": true + }, + "@hapi/hoek": { + "version": "8.5.1", + "resolved": "https://registry.npm.taobao.org/@hapi/hoek/download/@hapi/hoek-8.5.1.tgz", + "integrity": "sha1-/elgZMpEbeyMVajC8TCVewcMbgY=", + "dev": true + }, + "@hapi/joi": { + "version": "15.1.1", + "resolved": "https://registry.npm.taobao.org/@hapi/joi/download/@hapi/joi-15.1.1.tgz?cache=0&sync_timestamp=1584171913948&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2F%40hapi%2Fjoi%2Fdownload%2F%40hapi%2Fjoi-15.1.1.tgz", + "integrity": "sha1-xnW4pxKW8Cgz+NbSQ7NMV7jOGdc=", + "dev": true, + "requires": { + "@hapi/address": "2.x.x", + "@hapi/bourne": "1.x.x", + "@hapi/hoek": "8.x.x", + "@hapi/topo": "3.x.x" + } + }, + "@hapi/topo": { + "version": "3.1.6", + "resolved": "https://registry.npm.taobao.org/@hapi/topo/download/@hapi/topo-3.1.6.tgz", + "integrity": "sha1-aNk1+j6uf91asNf5U/MgXYsr/Ck=", + "dev": true, + "requires": { + "@hapi/hoek": "^8.3.0" + } + }, + "@intervolga/optimize-cssnano-plugin": { + "version": "1.0.6", + "resolved": "https://registry.npm.taobao.org/@intervolga/optimize-cssnano-plugin/download/@intervolga/optimize-cssnano-plugin-1.0.6.tgz", + "integrity": "sha1-vnx4RhKLiPapsdEmGgrQbrXA/fg=", + "dev": true, + "requires": { + "cssnano": "^4.0.0", + "cssnano-preset-default": "^4.0.0", + "postcss": "^7.0.0" + } + }, + "@mrmlnc/readdir-enhanced": { + "version": "2.2.1", + "resolved": "https://registry.npm.taobao.org/@mrmlnc/readdir-enhanced/download/@mrmlnc/readdir-enhanced-2.2.1.tgz", + "integrity": "sha1-UkryQNGjYFJ7cwR17PoTRKpUDd4=", + "dev": true, + "requires": { + "call-me-maybe": "^1.0.1", + "glob-to-regexp": "^0.3.0" + } + }, + "@nodelib/fs.stat": { + "version": "1.1.3", + "resolved": "https://registry.npm.taobao.org/@nodelib/fs.stat/download/@nodelib/fs.stat-1.1.3.tgz", + "integrity": "sha1-K1o6s/kYzKSKjHVMCBaOPwPrphs=", + "dev": true + }, + "@soda/friendly-errors-webpack-plugin": { + "version": "1.7.1", + "resolved": "https://registry.npm.taobao.org/@soda/friendly-errors-webpack-plugin/download/@soda/friendly-errors-webpack-plugin-1.7.1.tgz", + "integrity": "sha1-cG9kvLSouWQrSK46zkRMcDNNYV0=", + "dev": true, + "requires": { + "chalk": "^1.1.3", + "error-stack-parser": "^2.0.0", + "string-width": "^2.0.0" + }, + "dependencies": { + "ansi-regex": { + "version": "2.1.1", + "resolved": "https://registry.npm.taobao.org/ansi-regex/download/ansi-regex-2.1.1.tgz", + "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", + "dev": true + }, + "ansi-styles": { + "version": "2.2.1", + "resolved": "https://registry.npm.taobao.org/ansi-styles/download/ansi-styles-2.2.1.tgz", + "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=", + "dev": true + }, + "chalk": { + "version": "1.1.3", + "resolved": "https://registry.npm.taobao.org/chalk/download/chalk-1.1.3.tgz", + "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", + "dev": true, + "requires": { + "ansi-styles": "^2.2.1", + "escape-string-regexp": "^1.0.2", + "has-ansi": "^2.0.0", + "strip-ansi": "^3.0.0", + "supports-color": "^2.0.0" + } + }, + "strip-ansi": { + "version": "3.0.1", + "resolved": "https://registry.npm.taobao.org/strip-ansi/download/strip-ansi-3.0.1.tgz", + "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", + "dev": true, + "requires": { + "ansi-regex": "^2.0.0" + } + }, + "supports-color": { + "version": "2.0.0", + "resolved": "https://registry.npm.taobao.org/supports-color/download/supports-color-2.0.0.tgz?cache=0&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fsupports-color%2Fdownload%2Fsupports-color-2.0.0.tgz", + "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=", + "dev": true + } + } + }, + "@types/color-name": { + "version": "1.1.1", + "resolved": "https://registry.npm.taobao.org/@types/color-name/download/@types/color-name-1.1.1.tgz", + "integrity": "sha1-HBJhu+qhCoBVu8XYq4S3sq/IRqA=", + "dev": true + }, + "@types/events": { + "version": "3.0.0", + "resolved": "https://registry.npm.taobao.org/@types/events/download/@types/events-3.0.0.tgz", + "integrity": "sha1-KGLz9Yqaf3w+eNefEw3U1xwlwqc=", + "dev": true + }, + "@types/glob": { + "version": "7.1.1", + "resolved": "https://registry.npm.taobao.org/@types/glob/download/@types/glob-7.1.1.tgz", + "integrity": "sha1-qlmhxuP7xCHgfM0xqUTDDrpSFXU=", + "dev": true, + "requires": { + "@types/events": "*", + "@types/minimatch": "*", + "@types/node": "*" + } + }, + "@types/minimatch": { + "version": "3.0.3", + "resolved": "https://registry.npm.taobao.org/@types/minimatch/download/@types/minimatch-3.0.3.tgz", + "integrity": "sha1-PcoOPzOyAPx9ETnAzZbBJoyt/Z0=", + "dev": true + }, + "@types/node": { + "version": "13.9.3", + "resolved": "https://registry.npm.taobao.org/@types/node/download/@types/node-13.9.3.tgz?cache=0&sync_timestamp=1584882808468&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2F%40types%2Fnode%2Fdownload%2F%40types%2Fnode-13.9.3.tgz", + "integrity": "sha1-Y1bfJkfenqxWn5pS7aNID6nnC00=", + "dev": true + }, + "@types/normalize-package-data": { + "version": "2.4.0", + "resolved": "https://registry.npm.taobao.org/@types/normalize-package-data/download/@types/normalize-package-data-2.4.0.tgz", + "integrity": "sha1-5IbQ2XOW15vu3QpuM/RTT/a0lz4=", + "dev": true + }, + "@types/q": { + "version": "1.5.2", + "resolved": "https://registry.npm.taobao.org/@types/q/download/@types/q-1.5.2.tgz", + "integrity": "sha1-aQoUdbhPKohP0HzXl8APXzE1bqg=", + "dev": true + }, + "@vue/babel-helper-vue-jsx-merge-props": { + "version": "1.0.0", + "resolved": "https://registry.npm.taobao.org/@vue/babel-helper-vue-jsx-merge-props/download/@vue/babel-helper-vue-jsx-merge-props-1.0.0.tgz", + "integrity": "sha1-BI/leZWNpAj7eosqPsBQtQpmEEA=", + "dev": true + }, + "@vue/babel-plugin-transform-vue-jsx": { + "version": "1.1.2", + "resolved": "https://registry.npm.taobao.org/@vue/babel-plugin-transform-vue-jsx/download/@vue/babel-plugin-transform-vue-jsx-1.1.2.tgz", + "integrity": "sha1-wKPm78Ai515CR7RIqPxrhvA+kcA=", + "dev": true, + "requires": { + "@babel/helper-module-imports": "^7.0.0", + "@babel/plugin-syntax-jsx": "^7.2.0", + "@vue/babel-helper-vue-jsx-merge-props": "^1.0.0", + "html-tags": "^2.0.0", + "lodash.kebabcase": "^4.1.1", + "svg-tags": "^1.0.0" + } + }, + "@vue/babel-preset-app": { + "version": "4.2.3", + "resolved": "https://registry.npm.taobao.org/@vue/babel-preset-app/download/@vue/babel-preset-app-4.2.3.tgz", + "integrity": "sha1-YIssn3ymd+eTgzZi/HJ/+RN6mjU=", + "dev": true, + "requires": { + "@babel/core": "^7.8.4", + "@babel/helper-compilation-targets": "^7.8.4", + "@babel/helper-module-imports": "^7.8.3", + "@babel/plugin-proposal-class-properties": "^7.8.3", + "@babel/plugin-proposal-decorators": "^7.8.3", + "@babel/plugin-syntax-dynamic-import": "^7.8.3", + "@babel/plugin-syntax-jsx": "^7.8.3", + "@babel/plugin-transform-runtime": "^7.8.3", + "@babel/preset-env": "^7.8.4", + "@babel/runtime": "^7.8.4", + "@vue/babel-preset-jsx": "^1.1.2", + "babel-plugin-dynamic-import-node": "^2.3.0", + "core-js": "^3.6.4", + "core-js-compat": "^3.6.4" + } + }, + "@vue/babel-preset-jsx": { + "version": "1.1.2", + "resolved": "https://registry.npm.taobao.org/@vue/babel-preset-jsx/download/@vue/babel-preset-jsx-1.1.2.tgz", + "integrity": "sha1-LhaetMIE6jfKZsLqhaiAv8mdTyA=", + "dev": true, + "requires": { + "@vue/babel-helper-vue-jsx-merge-props": "^1.0.0", + "@vue/babel-plugin-transform-vue-jsx": "^1.1.2", + "@vue/babel-sugar-functional-vue": "^1.1.2", + "@vue/babel-sugar-inject-h": "^1.1.2", + "@vue/babel-sugar-v-model": "^1.1.2", + "@vue/babel-sugar-v-on": "^1.1.2" + } + }, + "@vue/babel-sugar-functional-vue": { + "version": "1.1.2", + "resolved": "https://registry.npm.taobao.org/@vue/babel-sugar-functional-vue/download/@vue/babel-sugar-functional-vue-1.1.2.tgz", + "integrity": "sha1-9+JPugnm8e5wEEVgqICAV1VfGpo=", + "dev": true, + "requires": { + "@babel/plugin-syntax-jsx": "^7.2.0" + } + }, + "@vue/babel-sugar-inject-h": { + "version": "1.1.2", + "resolved": "https://registry.npm.taobao.org/@vue/babel-sugar-inject-h/download/@vue/babel-sugar-inject-h-1.1.2.tgz", + "integrity": "sha1-ilJ2ttji7Rb/yAeKrZQjYnTm7fA=", + "dev": true, + "requires": { + "@babel/plugin-syntax-jsx": "^7.2.0" + } + }, + "@vue/babel-sugar-v-model": { + "version": "1.1.2", + "resolved": "https://registry.npm.taobao.org/@vue/babel-sugar-v-model/download/@vue/babel-sugar-v-model-1.1.2.tgz", + "integrity": "sha1-H/b9G4ACI/ycsehNzrXlLXN6gZI=", + "dev": true, + "requires": { + "@babel/plugin-syntax-jsx": "^7.2.0", + "@vue/babel-helper-vue-jsx-merge-props": "^1.0.0", + "@vue/babel-plugin-transform-vue-jsx": "^1.1.2", + "camelcase": "^5.0.0", + "html-tags": "^2.0.0", + "svg-tags": "^1.0.0" + } + }, + "@vue/babel-sugar-v-on": { + "version": "1.1.2", + "resolved": "https://registry.npm.taobao.org/@vue/babel-sugar-v-on/download/@vue/babel-sugar-v-on-1.1.2.tgz", + "integrity": "sha1-su+ZuPL6sJ++rSWq1w70Lhz1sTs=", + "dev": true, + "requires": { + "@babel/plugin-syntax-jsx": "^7.2.0", + "@vue/babel-plugin-transform-vue-jsx": "^1.1.2", + "camelcase": "^5.0.0" + } + }, + "@vue/cli-overlay": { + "version": "4.2.3", + "resolved": "https://registry.npm.taobao.org/@vue/cli-overlay/download/@vue/cli-overlay-4.2.3.tgz", + "integrity": "sha1-/CbS1I/hieSNGFkQ/5JDNQl4lRU=", + "dev": true + }, + "@vue/cli-plugin-babel": { + "version": "4.2.3", + "resolved": "https://registry.npm.taobao.org/@vue/cli-plugin-babel/download/@vue/cli-plugin-babel-4.2.3.tgz", + "integrity": "sha1-hjN5USb014xRe/+aJTkinJ4MjbQ=", + "dev": true, + "requires": { + "@babel/core": "^7.8.4", + "@vue/babel-preset-app": "^4.2.3", + "@vue/cli-shared-utils": "^4.2.3", + "babel-loader": "^8.0.6", + "cache-loader": "^4.1.0", + "thread-loader": "^2.1.3", + "webpack": "^4.0.0" + } + }, + "@vue/cli-plugin-eslint": { + "version": "4.2.3", + "resolved": "https://registry.npm.taobao.org/@vue/cli-plugin-eslint/download/@vue/cli-plugin-eslint-4.2.3.tgz", + "integrity": "sha1-KnDfmaqmBpehOJPpQDShOG8xw+4=", + "dev": true, + "requires": { + "@vue/cli-shared-utils": "^4.2.3", + "eslint-loader": "^2.1.2", + "globby": "^9.2.0", + "inquirer": "^6.3.1", + "webpack": "^4.0.0", + "yorkie": "^2.0.0" + } + }, + "@vue/cli-plugin-router": { + "version": "4.2.3", + "resolved": "https://registry.npm.taobao.org/@vue/cli-plugin-router/download/@vue/cli-plugin-router-4.2.3.tgz", + "integrity": "sha1-xkWU5+fiC6dscSYvKDthmfWv1GM=", + "dev": true, + "requires": { + "@vue/cli-shared-utils": "^4.2.3" + } + }, + "@vue/cli-plugin-vuex": { + "version": "4.2.3", + "resolved": "https://registry.npm.taobao.org/@vue/cli-plugin-vuex/download/@vue/cli-plugin-vuex-4.2.3.tgz", + "integrity": "sha1-qh2Ogk3YK4cYwMQOOQbDTM11JRY=", + "dev": true + }, + "@vue/cli-service": { + "version": "4.2.3", + "resolved": "https://registry.npm.taobao.org/@vue/cli-service/download/@vue/cli-service-4.2.3.tgz", + "integrity": "sha1-qruO3+pdu1nfW0JGT4dhWLQ90GU=", + "dev": true, + "requires": { + "@intervolga/optimize-cssnano-plugin": "^1.0.5", + "@soda/friendly-errors-webpack-plugin": "^1.7.1", + "@vue/cli-overlay": "^4.2.3", + "@vue/cli-plugin-router": "^4.2.3", + "@vue/cli-plugin-vuex": "^4.2.3", + "@vue/cli-shared-utils": "^4.2.3", + "@vue/component-compiler-utils": "^3.0.2", + "@vue/preload-webpack-plugin": "^1.1.0", + "@vue/web-component-wrapper": "^1.2.0", + "acorn": "^7.1.0", + "acorn-walk": "^7.0.0", + "address": "^1.1.2", + "autoprefixer": "^9.7.4", + "browserslist": "^4.8.6", + "cache-loader": "^4.1.0", + "case-sensitive-paths-webpack-plugin": "^2.3.0", + "cli-highlight": "^2.1.4", + "clipboardy": "^2.1.0", + "cliui": "^6.0.0", + "copy-webpack-plugin": "^5.1.1", + "css-loader": "^3.4.2", + "cssnano": "^4.1.10", + "current-script-polyfill": "^1.0.0", + "debug": "^4.1.1", + "default-gateway": "^5.0.5", + "dotenv": "^8.2.0", + "dotenv-expand": "^5.1.0", + "file-loader": "^4.2.0", + "fs-extra": "^7.0.1", + "globby": "^9.2.0", + "hash-sum": "^2.0.0", + "html-webpack-plugin": "^3.2.0", + "launch-editor-middleware": "^2.2.1", + "lodash.defaultsdeep": "^4.6.1", + "lodash.mapvalues": "^4.6.0", + "lodash.transform": "^4.6.0", + "mini-css-extract-plugin": "^0.9.0", + "minimist": "^1.2.0", + "pnp-webpack-plugin": "^1.6.0", + "portfinder": "^1.0.25", + "postcss-loader": "^3.0.0", + "ssri": "^7.1.0", + "terser-webpack-plugin": "^2.3.4", + "thread-loader": "^2.1.3", + "url-loader": "^2.2.0", + "vue-loader": "^15.8.3", + "vue-style-loader": "^4.1.2", + "webpack": "^4.0.0", + "webpack-bundle-analyzer": "^3.6.0", + "webpack-chain": "^6.3.1", + "webpack-dev-server": "^3.10.2", + "webpack-merge": "^4.2.2" + }, + "dependencies": { + "acorn": { + "version": "7.1.1", + "resolved": "https://registry.npm.taobao.org/acorn/download/acorn-7.1.1.tgz?cache=0&sync_timestamp=1583796606796&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Facorn%2Fdownload%2Facorn-7.1.1.tgz", + "integrity": "sha1-41Zo3gtALzWd5RXFSCoaufiaab8=", + "dev": true + }, + "cacache": { + "version": "13.0.1", + "resolved": "https://registry.npm.taobao.org/cacache/download/cacache-13.0.1.tgz?cache=0&sync_timestamp=1585009516561&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fcacache%2Fdownload%2Fcacache-13.0.1.tgz", + "integrity": "sha1-qAAMIWlwiQgvhSh6GuxuOCAkpxw=", + "dev": true, + "requires": { + "chownr": "^1.1.2", + "figgy-pudding": "^3.5.1", + "fs-minipass": "^2.0.0", + "glob": "^7.1.4", + "graceful-fs": "^4.2.2", + "infer-owner": "^1.0.4", + "lru-cache": "^5.1.1", + "minipass": "^3.0.0", + "minipass-collect": "^1.0.2", + "minipass-flush": "^1.0.5", + "minipass-pipeline": "^1.2.2", + "mkdirp": "^0.5.1", + "move-concurrently": "^1.0.1", + "p-map": "^3.0.0", + "promise-inflight": "^1.0.1", + "rimraf": "^2.7.1", + "ssri": "^7.0.0", + "unique-filename": "^1.1.1" + } + }, + "find-cache-dir": { + "version": "3.3.1", + "resolved": "https://registry.npm.taobao.org/find-cache-dir/download/find-cache-dir-3.3.1.tgz?cache=0&sync_timestamp=1583734806517&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Ffind-cache-dir%2Fdownload%2Ffind-cache-dir-3.3.1.tgz", + "integrity": "sha1-ibM/rUpGcNqpT4Vff74x1thP6IA=", + "dev": true, + "requires": { + "commondir": "^1.0.1", + "make-dir": "^3.0.2", + "pkg-dir": "^4.1.0" + } + }, + "find-up": { + "version": "4.1.0", + "resolved": "https://registry.npm.taobao.org/find-up/download/find-up-4.1.0.tgz", + "integrity": "sha1-l6/n1s3AvFkoWEt8jXsW6KmqXRk=", + "dev": true, + "requires": { + "locate-path": "^5.0.0", + "path-exists": "^4.0.0" + } + }, + "locate-path": { + "version": "5.0.0", + "resolved": "https://registry.npm.taobao.org/locate-path/download/locate-path-5.0.0.tgz", + "integrity": "sha1-Gvujlq/WdqbUJQTQpno6frn2KqA=", + "dev": true, + "requires": { + "p-locate": "^4.1.0" + } + }, + "make-dir": { + "version": "3.0.2", + "resolved": "https://registry.npm.taobao.org/make-dir/download/make-dir-3.0.2.tgz", + "integrity": "sha1-BKGsvyIiHh1u9DVZ9D4FqQ27Q5I=", + "dev": true, + "requires": { + "semver": "^6.0.0" + } + }, + "p-locate": { + "version": "4.1.0", + "resolved": "https://registry.npm.taobao.org/p-locate/download/p-locate-4.1.0.tgz", + "integrity": "sha1-o0KLtwiLOmApL2aRkni3wpetTwc=", + "dev": true, + "requires": { + "p-limit": "^2.2.0" + } + }, + "path-exists": { + "version": "4.0.0", + "resolved": "https://registry.npm.taobao.org/path-exists/download/path-exists-4.0.0.tgz", + "integrity": "sha1-UTvb4tO5XXdi6METfvoZXGxhtbM=", + "dev": true + }, + "pkg-dir": { + "version": "4.2.0", + "resolved": "https://registry.npm.taobao.org/pkg-dir/download/pkg-dir-4.2.0.tgz", + "integrity": "sha1-8JkTPfft5CLoHR2ESCcO6z5CYfM=", + "dev": true, + "requires": { + "find-up": "^4.0.0" + } + }, + "semver": { + "version": "6.3.0", + "resolved": "https://registry.npm.taobao.org/semver/download/semver-6.3.0.tgz", + "integrity": "sha1-7gpkyK9ejO6mdoexM3YeG+y9HT0=", + "dev": true + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npm.taobao.org/source-map/download/source-map-0.6.1.tgz", + "integrity": "sha1-dHIq8y6WFOnCh6jQu95IteLxomM=", + "dev": true + }, + "ssri": { + "version": "7.1.0", + "resolved": "https://registry.npm.taobao.org/ssri/download/ssri-7.1.0.tgz", + "integrity": "sha1-ksJBv23oI2W1x/tL126XVSLhKU0=", + "dev": true, + "requires": { + "figgy-pudding": "^3.5.1", + "minipass": "^3.1.1" + } + }, + "terser-webpack-plugin": { + "version": "2.3.5", + "resolved": "https://registry.npm.taobao.org/terser-webpack-plugin/download/terser-webpack-plugin-2.3.5.tgz", + "integrity": "sha1-WtlxrM5cUXRAuoc+pPCWh94vSoE=", + "dev": true, + "requires": { + "cacache": "^13.0.1", + "find-cache-dir": "^3.2.0", + "jest-worker": "^25.1.0", + "p-limit": "^2.2.2", + "schema-utils": "^2.6.4", + "serialize-javascript": "^2.1.2", + "source-map": "^0.6.1", + "terser": "^4.4.3", + "webpack-sources": "^1.4.3" + } + } + } + }, + "@vue/cli-shared-utils": { + "version": "4.2.3", + "resolved": "https://registry.npm.taobao.org/@vue/cli-shared-utils/download/@vue/cli-shared-utils-4.2.3.tgz", + "integrity": "sha1-E2RkUswlsKtopXy1LKwnmDzuOaQ=", + "dev": true, + "requires": { + "@hapi/joi": "^15.0.1", + "chalk": "^2.4.2", + "execa": "^1.0.0", + "launch-editor": "^2.2.1", + "lru-cache": "^5.1.1", + "node-ipc": "^9.1.1", + "open": "^6.3.0", + "ora": "^3.4.0", + "read-pkg": "^5.1.1", + "request": "^2.87.0", + "request-promise-native": "^1.0.8", + "semver": "^6.1.0", + "strip-ansi": "^6.0.0" + }, + "dependencies": { + "semver": { + "version": "6.3.0", + "resolved": "https://registry.npm.taobao.org/semver/download/semver-6.3.0.tgz", + "integrity": "sha1-7gpkyK9ejO6mdoexM3YeG+y9HT0=", + "dev": true + } + } + }, + "@vue/component-compiler-utils": { + "version": "3.1.1", + "resolved": "https://registry.npm.taobao.org/@vue/component-compiler-utils/download/@vue/component-compiler-utils-3.1.1.tgz", + "integrity": "sha1-1O+PgCkmdARK1iEeM2owLk0qZXU=", + "dev": true, + "requires": { + "consolidate": "^0.15.1", + "hash-sum": "^1.0.2", + "lru-cache": "^4.1.2", + "merge-source-map": "^1.1.0", + "postcss": "^7.0.14", + "postcss-selector-parser": "^6.0.2", + "prettier": "^1.18.2", + "source-map": "~0.6.1", + "vue-template-es2015-compiler": "^1.9.0" + }, + "dependencies": { + "hash-sum": { + "version": "1.0.2", + "resolved": "https://registry.npm.taobao.org/hash-sum/download/hash-sum-1.0.2.tgz", + "integrity": "sha1-M7QHd3VMZDJXPBIMw4CLvRDUfwQ=", + "dev": true + }, + "lru-cache": { + "version": "4.1.5", + "resolved": "https://registry.npm.taobao.org/lru-cache/download/lru-cache-4.1.5.tgz", + "integrity": "sha1-i75Q6oW+1ZvJ4z3KuCNe6bz0Q80=", + "dev": true, + "requires": { + "pseudomap": "^1.0.2", + "yallist": "^2.1.2" + } + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npm.taobao.org/source-map/download/source-map-0.6.1.tgz", + "integrity": "sha1-dHIq8y6WFOnCh6jQu95IteLxomM=", + "dev": true + }, + "yallist": { + "version": "2.1.2", + "resolved": "https://registry.npm.taobao.org/yallist/download/yallist-2.1.2.tgz", + "integrity": "sha1-HBH5IY8HYImkfdUS+TxmmaaoHVI=", + "dev": true + } + } + }, + "@vue/preload-webpack-plugin": { + "version": "1.1.1", + "resolved": "https://registry.npm.taobao.org/@vue/preload-webpack-plugin/download/@vue/preload-webpack-plugin-1.1.1.tgz", + "integrity": "sha1-GHI1MNME9EMCHaIpLW7JUCgmEEo=", + "dev": true + }, + "@vue/web-component-wrapper": { + "version": "1.2.0", + "resolved": "https://registry.npm.taobao.org/@vue/web-component-wrapper/download/@vue/web-component-wrapper-1.2.0.tgz", + "integrity": "sha1-uw5G8VhafiibTuYGfcxaauYvHdE=", + "dev": true + }, + "@webassemblyjs/ast": { + "version": "1.9.0", + "resolved": "https://registry.npm.taobao.org/@webassemblyjs/ast/download/@webassemblyjs/ast-1.9.0.tgz?cache=0&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2F%40webassemblyjs%2Fast%2Fdownload%2F%40webassemblyjs%2Fast-1.9.0.tgz", + "integrity": "sha1-vYUGBLQEJFmlpBzX0zjL7Wle2WQ=", + "dev": true, + "requires": { + "@webassemblyjs/helper-module-context": "1.9.0", + "@webassemblyjs/helper-wasm-bytecode": "1.9.0", + "@webassemblyjs/wast-parser": "1.9.0" + } + }, + "@webassemblyjs/floating-point-hex-parser": { + "version": "1.9.0", + "resolved": "https://registry.npm.taobao.org/@webassemblyjs/floating-point-hex-parser/download/@webassemblyjs/floating-point-hex-parser-1.9.0.tgz?cache=0&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2F%40webassemblyjs%2Ffloating-point-hex-parser%2Fdownload%2F%40webassemblyjs%2Ffloating-point-hex-parser-1.9.0.tgz", + "integrity": "sha1-PD07Jxvd/ITesA9xNEQ4MR1S/7Q=", + "dev": true + }, + "@webassemblyjs/helper-api-error": { + "version": "1.9.0", + "resolved": "https://registry.npm.taobao.org/@webassemblyjs/helper-api-error/download/@webassemblyjs/helper-api-error-1.9.0.tgz?cache=0&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2F%40webassemblyjs%2Fhelper-api-error%2Fdownload%2F%40webassemblyjs%2Fhelper-api-error-1.9.0.tgz", + "integrity": "sha1-ID9nbjM7lsnaLuqzzO8zxFkotqI=", + "dev": true + }, + "@webassemblyjs/helper-buffer": { + "version": "1.9.0", + "resolved": "https://registry.npm.taobao.org/@webassemblyjs/helper-buffer/download/@webassemblyjs/helper-buffer-1.9.0.tgz?cache=0&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2F%40webassemblyjs%2Fhelper-buffer%2Fdownload%2F%40webassemblyjs%2Fhelper-buffer-1.9.0.tgz", + "integrity": "sha1-oUQtJpxf6yP8vJ73WdrDVH8p3gA=", + "dev": true + }, + "@webassemblyjs/helper-code-frame": { + "version": "1.9.0", + "resolved": "https://registry.npm.taobao.org/@webassemblyjs/helper-code-frame/download/@webassemblyjs/helper-code-frame-1.9.0.tgz?cache=0&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2F%40webassemblyjs%2Fhelper-code-frame%2Fdownload%2F%40webassemblyjs%2Fhelper-code-frame-1.9.0.tgz", + "integrity": "sha1-ZH+Iks0gQ6gqwMjF51w28dkVnyc=", + "dev": true, + "requires": { + "@webassemblyjs/wast-printer": "1.9.0" + } + }, + "@webassemblyjs/helper-fsm": { + "version": "1.9.0", + "resolved": "https://registry.npm.taobao.org/@webassemblyjs/helper-fsm/download/@webassemblyjs/helper-fsm-1.9.0.tgz?cache=0&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2F%40webassemblyjs%2Fhelper-fsm%2Fdownload%2F%40webassemblyjs%2Fhelper-fsm-1.9.0.tgz", + "integrity": "sha1-wFJWtxJEIUZx9LCOwQitY7cO3bg=", + "dev": true + }, + "@webassemblyjs/helper-module-context": { + "version": "1.9.0", + "resolved": "https://registry.npm.taobao.org/@webassemblyjs/helper-module-context/download/@webassemblyjs/helper-module-context-1.9.0.tgz?cache=0&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2F%40webassemblyjs%2Fhelper-module-context%2Fdownload%2F%40webassemblyjs%2Fhelper-module-context-1.9.0.tgz", + "integrity": "sha1-JdiIS3aDmHGgimxvgGw5ee9xLwc=", + "dev": true, + "requires": { + "@webassemblyjs/ast": "1.9.0" + } + }, + "@webassemblyjs/helper-wasm-bytecode": { + "version": "1.9.0", + "resolved": "https://registry.npm.taobao.org/@webassemblyjs/helper-wasm-bytecode/download/@webassemblyjs/helper-wasm-bytecode-1.9.0.tgz?cache=0&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2F%40webassemblyjs%2Fhelper-wasm-bytecode%2Fdownload%2F%40webassemblyjs%2Fhelper-wasm-bytecode-1.9.0.tgz", + "integrity": "sha1-T+2L6sm4wU+MWLcNEk1UndH+V5A=", + "dev": true + }, + "@webassemblyjs/helper-wasm-section": { + "version": "1.9.0", + "resolved": "https://registry.npm.taobao.org/@webassemblyjs/helper-wasm-section/download/@webassemblyjs/helper-wasm-section-1.9.0.tgz?cache=0&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2F%40webassemblyjs%2Fhelper-wasm-section%2Fdownload%2F%40webassemblyjs%2Fhelper-wasm-section-1.9.0.tgz", + "integrity": "sha1-WkE41aYpK6GLBMWuSXF+QWeWU0Y=", + "dev": true, + "requires": { + "@webassemblyjs/ast": "1.9.0", + "@webassemblyjs/helper-buffer": "1.9.0", + "@webassemblyjs/helper-wasm-bytecode": "1.9.0", + "@webassemblyjs/wasm-gen": "1.9.0" + } + }, + "@webassemblyjs/ieee754": { + "version": "1.9.0", + "resolved": "https://registry.npm.taobao.org/@webassemblyjs/ieee754/download/@webassemblyjs/ieee754-1.9.0.tgz?cache=0&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2F%40webassemblyjs%2Fieee754%2Fdownload%2F%40webassemblyjs%2Fieee754-1.9.0.tgz", + "integrity": "sha1-Fceg+6roP7JhQ7us9tbfFwKtOeQ=", + "dev": true, + "requires": { + "@xtuc/ieee754": "^1.2.0" + } + }, + "@webassemblyjs/leb128": { + "version": "1.9.0", + "resolved": "https://registry.npm.taobao.org/@webassemblyjs/leb128/download/@webassemblyjs/leb128-1.9.0.tgz?cache=0&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2F%40webassemblyjs%2Fleb128%2Fdownload%2F%40webassemblyjs%2Fleb128-1.9.0.tgz", + "integrity": "sha1-8Zygt2ptxVYjoJz/p2noOPoeHJU=", + "dev": true, + "requires": { + "@xtuc/long": "4.2.2" + } + }, + "@webassemblyjs/utf8": { + "version": "1.9.0", + "resolved": "https://registry.npm.taobao.org/@webassemblyjs/utf8/download/@webassemblyjs/utf8-1.9.0.tgz?cache=0&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2F%40webassemblyjs%2Futf8%2Fdownload%2F%40webassemblyjs%2Futf8-1.9.0.tgz", + "integrity": "sha1-BNM7Y2945qaBMifoJAL3Y3tiKas=", + "dev": true + }, + "@webassemblyjs/wasm-edit": { + "version": "1.9.0", + "resolved": "https://registry.npm.taobao.org/@webassemblyjs/wasm-edit/download/@webassemblyjs/wasm-edit-1.9.0.tgz?cache=0&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2F%40webassemblyjs%2Fwasm-edit%2Fdownload%2F%40webassemblyjs%2Fwasm-edit-1.9.0.tgz", + "integrity": "sha1-P+bXnT8PkiGDqoYALELdJWz+6c8=", + "dev": true, + "requires": { + "@webassemblyjs/ast": "1.9.0", + "@webassemblyjs/helper-buffer": "1.9.0", + "@webassemblyjs/helper-wasm-bytecode": "1.9.0", + "@webassemblyjs/helper-wasm-section": "1.9.0", + "@webassemblyjs/wasm-gen": "1.9.0", + "@webassemblyjs/wasm-opt": "1.9.0", + "@webassemblyjs/wasm-parser": "1.9.0", + "@webassemblyjs/wast-printer": "1.9.0" + } + }, + "@webassemblyjs/wasm-gen": { + "version": "1.9.0", + "resolved": "https://registry.npm.taobao.org/@webassemblyjs/wasm-gen/download/@webassemblyjs/wasm-gen-1.9.0.tgz?cache=0&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2F%40webassemblyjs%2Fwasm-gen%2Fdownload%2F%40webassemblyjs%2Fwasm-gen-1.9.0.tgz", + "integrity": "sha1-ULxw7Gje2OJ2OwGhQYv0NJGnpJw=", + "dev": true, + "requires": { + "@webassemblyjs/ast": "1.9.0", + "@webassemblyjs/helper-wasm-bytecode": "1.9.0", + "@webassemblyjs/ieee754": "1.9.0", + "@webassemblyjs/leb128": "1.9.0", + "@webassemblyjs/utf8": "1.9.0" + } + }, + "@webassemblyjs/wasm-opt": { + "version": "1.9.0", + "resolved": "https://registry.npm.taobao.org/@webassemblyjs/wasm-opt/download/@webassemblyjs/wasm-opt-1.9.0.tgz?cache=0&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2F%40webassemblyjs%2Fwasm-opt%2Fdownload%2F%40webassemblyjs%2Fwasm-opt-1.9.0.tgz", + "integrity": "sha1-IhEYHlsxMmRDzIES658LkChyGmE=", + "dev": true, + "requires": { + "@webassemblyjs/ast": "1.9.0", + "@webassemblyjs/helper-buffer": "1.9.0", + "@webassemblyjs/wasm-gen": "1.9.0", + "@webassemblyjs/wasm-parser": "1.9.0" + } + }, + "@webassemblyjs/wasm-parser": { + "version": "1.9.0", + "resolved": "https://registry.npm.taobao.org/@webassemblyjs/wasm-parser/download/@webassemblyjs/wasm-parser-1.9.0.tgz?cache=0&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2F%40webassemblyjs%2Fwasm-parser%2Fdownload%2F%40webassemblyjs%2Fwasm-parser-1.9.0.tgz", + "integrity": "sha1-nUjkSCbfSmWYKUqmyHRp1kL/9l4=", + "dev": true, + "requires": { + "@webassemblyjs/ast": "1.9.0", + "@webassemblyjs/helper-api-error": "1.9.0", + "@webassemblyjs/helper-wasm-bytecode": "1.9.0", + "@webassemblyjs/ieee754": "1.9.0", + "@webassemblyjs/leb128": "1.9.0", + "@webassemblyjs/utf8": "1.9.0" + } + }, + "@webassemblyjs/wast-parser": { + "version": "1.9.0", + "resolved": "https://registry.npm.taobao.org/@webassemblyjs/wast-parser/download/@webassemblyjs/wast-parser-1.9.0.tgz?cache=0&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2F%40webassemblyjs%2Fwast-parser%2Fdownload%2F%40webassemblyjs%2Fwast-parser-1.9.0.tgz", + "integrity": "sha1-MDERXXmsW9JhVWzsw/qQo+9FGRQ=", + "dev": true, + "requires": { + "@webassemblyjs/ast": "1.9.0", + "@webassemblyjs/floating-point-hex-parser": "1.9.0", + "@webassemblyjs/helper-api-error": "1.9.0", + "@webassemblyjs/helper-code-frame": "1.9.0", + "@webassemblyjs/helper-fsm": "1.9.0", + "@xtuc/long": "4.2.2" + } + }, + "@webassemblyjs/wast-printer": { + "version": "1.9.0", + "resolved": "https://registry.npm.taobao.org/@webassemblyjs/wast-printer/download/@webassemblyjs/wast-printer-1.9.0.tgz?cache=0&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2F%40webassemblyjs%2Fwast-printer%2Fdownload%2F%40webassemblyjs%2Fwast-printer-1.9.0.tgz", + "integrity": "sha1-STXVTIX+9jewDOn1I3dFHQDUeJk=", + "dev": true, + "requires": { + "@webassemblyjs/ast": "1.9.0", + "@webassemblyjs/wast-parser": "1.9.0", + "@xtuc/long": "4.2.2" + } + }, + "@xtuc/ieee754": { + "version": "1.2.0", + "resolved": "https://registry.npm.taobao.org/@xtuc/ieee754/download/@xtuc/ieee754-1.2.0.tgz", + "integrity": "sha1-7vAUoxRa5Hehy8AM0eVSM23Ot5A=", + "dev": true + }, + "@xtuc/long": { + "version": "4.2.2", + "resolved": "https://registry.npm.taobao.org/@xtuc/long/download/@xtuc/long-4.2.2.tgz", + "integrity": "sha1-0pHGpOl5ibXGHZrPOWrk/hM6cY0=", + "dev": true + }, + "accepts": { + "version": "1.3.7", + "resolved": "https://registry.npm.taobao.org/accepts/download/accepts-1.3.7.tgz", + "integrity": "sha1-UxvHJlF6OytB+FACHGzBXqq1B80=", + "dev": true, + "requires": { + "mime-types": "~2.1.24", + "negotiator": "0.6.2" + } + }, + "acorn": { + "version": "6.4.1", + "resolved": "https://registry.npm.taobao.org/acorn/download/acorn-6.4.1.tgz?cache=0&sync_timestamp=1583796606796&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Facorn%2Fdownload%2Facorn-6.4.1.tgz", + "integrity": "sha1-Ux5Yuj9RudrLmmZGyk3r9bFMpHQ=", + "dev": true + }, + "acorn-jsx": { + "version": "5.2.0", + "resolved": "https://registry.npm.taobao.org/acorn-jsx/download/acorn-jsx-5.2.0.tgz", + "integrity": "sha1-TGYGkXPW/daO2FI5/CViJhgrLr4=", + "dev": true + }, + "acorn-walk": { + "version": "7.1.1", + "resolved": "https://registry.npm.taobao.org/acorn-walk/download/acorn-walk-7.1.1.tgz", + "integrity": "sha1-NF8N/61cc15zc9L+yaECPmpEuD4=", + "dev": true + }, + "address": { + "version": "1.1.2", + "resolved": "https://registry.npm.taobao.org/address/download/address-1.1.2.tgz", + "integrity": "sha1-vxEWycdYxRt6kz0pa3LCIe2UKLY=", + "dev": true + }, + "adler-32": { + "version": "1.2.0", + "resolved": "https://registry.npm.taobao.org/adler-32/download/adler-32-1.2.0.tgz", + "integrity": "sha1-aj5r8KY5ALoVZSgIyxXGgT0aXyU=", + "requires": { + "exit-on-epipe": "~1.0.1", + "printj": "~1.1.0" + } + }, + "aggregate-error": { + "version": "3.0.1", + "resolved": "https://registry.npm.taobao.org/aggregate-error/download/aggregate-error-3.0.1.tgz?cache=0&sync_timestamp=1570167911603&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Faggregate-error%2Fdownload%2Faggregate-error-3.0.1.tgz", + "integrity": "sha1-2y/nJG5Tb0DZtUQqOeEX191qJOA=", + "dev": true, + "requires": { + "clean-stack": "^2.0.0", + "indent-string": "^4.0.0" + } + }, + "ajv": { + "version": "6.12.0", + "resolved": "https://registry.npm.taobao.org/ajv/download/ajv-6.12.0.tgz?cache=0&sync_timestamp=1582379790931&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fajv%2Fdownload%2Fajv-6.12.0.tgz", + "integrity": "sha1-BtYLlth7hFSlrauobnhU2mKdtLc=", + "dev": true, + "requires": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + } + }, + "ajv-errors": { + "version": "1.0.1", + "resolved": "https://registry.npm.taobao.org/ajv-errors/download/ajv-errors-1.0.1.tgz", + "integrity": "sha1-81mGrOuRr63sQQL72FAUlQzvpk0=", + "dev": true + }, + "ajv-keywords": { + "version": "3.4.1", + "resolved": "https://registry.npm.taobao.org/ajv-keywords/download/ajv-keywords-3.4.1.tgz", + "integrity": "sha1-75FuJxxkrBIXH9g4TqrmsjRYVNo=", + "dev": true + }, + "alphanum-sort": { + "version": "1.0.2", + "resolved": "https://registry.npm.taobao.org/alphanum-sort/download/alphanum-sort-1.0.2.tgz", + "integrity": "sha1-l6ERlkmyEa0zaR2fn0hqjsn74KM=", + "dev": true + }, + "ansi-colors": { + "version": "3.2.4", + "resolved": "https://registry.npm.taobao.org/ansi-colors/download/ansi-colors-3.2.4.tgz", + "integrity": "sha1-46PaS/uubIapwoViXeEkojQCb78=", + "dev": true + }, + "ansi-escapes": { + "version": "3.2.0", + "resolved": "https://registry.npm.taobao.org/ansi-escapes/download/ansi-escapes-3.2.0.tgz?cache=0&sync_timestamp=1583072845985&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fansi-escapes%2Fdownload%2Fansi-escapes-3.2.0.tgz", + "integrity": "sha1-h4C5j/nb9WOBUtHx/lwde0RCl2s=", + "dev": true + }, + "ansi-html": { + "version": "0.0.7", + "resolved": "https://registry.npm.taobao.org/ansi-html/download/ansi-html-0.0.7.tgz", + "integrity": "sha1-gTWEAhliqenm/QOflA0S9WynhZ4=", + "dev": true + }, + "ansi-regex": { + "version": "4.1.0", + "resolved": "https://registry.npm.taobao.org/ansi-regex/download/ansi-regex-4.1.0.tgz", + "integrity": "sha1-i5+PCM8ay4Q3Vqg5yox+MWjFGZc=", + "dev": true + }, + "ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npm.taobao.org/ansi-styles/download/ansi-styles-3.2.1.tgz", + "integrity": "sha1-QfuyAkPlCxK+DwS43tvwdSDOhB0=", + "dev": true, + "requires": { + "color-convert": "^1.9.0" + } + }, + "any-promise": { + "version": "1.3.0", + "resolved": "https://registry.npm.taobao.org/any-promise/download/any-promise-1.3.0.tgz", + "integrity": "sha1-q8av7tzqUugJzcA3au0845Y10X8=", + "dev": true + }, + "anymatch": { + "version": "2.0.0", + "resolved": "https://registry.npm.taobao.org/anymatch/download/anymatch-2.0.0.tgz", + "integrity": "sha1-vLJLTzeTTZqnrBe0ra+J58du8us=", + "dev": true, + "requires": { + "micromatch": "^3.1.4", + "normalize-path": "^2.1.1" + }, + "dependencies": { + "normalize-path": { + "version": "2.1.1", + "resolved": "https://registry.npm.taobao.org/normalize-path/download/normalize-path-2.1.1.tgz", + "integrity": "sha1-GrKLVW4Zg2Oowab35vogE3/mrtk=", + "dev": true, + "requires": { + "remove-trailing-separator": "^1.0.1" + } + } + } + }, + "aproba": { + "version": "1.2.0", + "resolved": "https://registry.npm.taobao.org/aproba/download/aproba-1.2.0.tgz", + "integrity": "sha1-aALmJk79GMeQobDVF/DyYnvyyUo=", + "dev": true + }, + "arch": { + "version": "2.1.1", + "resolved": "https://registry.npm.taobao.org/arch/download/arch-2.1.1.tgz", + "integrity": "sha1-j1wnMao1owkpIhuwZA7tZRdeyE4=", + "dev": true + }, + "argparse": { + "version": "1.0.10", + "resolved": "https://registry.npm.taobao.org/argparse/download/argparse-1.0.10.tgz", + "integrity": "sha1-vNZ5HqWuCXJeF+WtmIE0zUCz2RE=", + "dev": true, + "requires": { + "sprintf-js": "~1.0.2" + } + }, + "arr-diff": { + "version": "4.0.0", + "resolved": "https://registry.npm.taobao.org/arr-diff/download/arr-diff-4.0.0.tgz", + "integrity": "sha1-1kYQdP6/7HHn4VI1dhoyml3HxSA=", + "dev": true + }, + "arr-flatten": { + "version": "1.1.0", + "resolved": "https://registry.npm.taobao.org/arr-flatten/download/arr-flatten-1.1.0.tgz", + "integrity": "sha1-NgSLv/TntH4TZkQxbJlmnqWukfE=", + "dev": true + }, + "arr-union": { + "version": "3.1.0", + "resolved": "https://registry.npm.taobao.org/arr-union/download/arr-union-3.1.0.tgz", + "integrity": "sha1-45sJrqne+Gao8gbiiK9jkZuuOcQ=", + "dev": true + }, + "array-flatten": { + "version": "1.1.1", + "resolved": "https://registry.npm.taobao.org/array-flatten/download/array-flatten-1.1.1.tgz?cache=0&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Farray-flatten%2Fdownload%2Farray-flatten-1.1.1.tgz", + "integrity": "sha1-ml9pkFGx5wczKPKgCJaLZOopVdI=", + "dev": true + }, + "array-union": { + "version": "1.0.2", + "resolved": "https://registry.npm.taobao.org/array-union/download/array-union-1.0.2.tgz", + "integrity": "sha1-mjRBDk9OPaI96jdb5b5w8kd47Dk=", + "dev": true, + "requires": { + "array-uniq": "^1.0.1" + } + }, + "array-uniq": { + "version": "1.0.3", + "resolved": "https://registry.npm.taobao.org/array-uniq/download/array-uniq-1.0.3.tgz", + "integrity": "sha1-r2rId6Jcx/dOBYiUdThY39sk/bY=", + "dev": true + }, + "array-unique": { + "version": "0.3.2", + "resolved": "https://registry.npm.taobao.org/array-unique/download/array-unique-0.3.2.tgz", + "integrity": "sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg=", + "dev": true + }, + "asap": { + "version": "2.0.6", + "resolved": "https://registry.npm.taobao.org/asap/download/asap-2.0.6.tgz", + "integrity": "sha1-5QNHYR1+aQlDIIu9r+vLwvuGbUY=", + "dev": true, + "optional": true + }, + "asn1": { + "version": "0.2.4", + "resolved": "https://registry.npm.taobao.org/asn1/download/asn1-0.2.4.tgz", + "integrity": "sha1-jSR136tVO7M+d7VOWeiAu4ziMTY=", + "dev": true, + "requires": { + "safer-buffer": "~2.1.0" + } + }, + "asn1.js": { + "version": "4.10.1", + "resolved": "https://registry.npm.taobao.org/asn1.js/download/asn1.js-4.10.1.tgz", + "integrity": "sha1-ucK/WAXx5kqt7tbfOiv6+1pz9aA=", + "dev": true, + "requires": { + "bn.js": "^4.0.0", + "inherits": "^2.0.1", + "minimalistic-assert": "^1.0.0" + } + }, + "assert": { + "version": "1.5.0", + "resolved": "https://registry.npm.taobao.org/assert/download/assert-1.5.0.tgz", + "integrity": "sha1-VcEJqvbgrv2z3EtxJAxwv1dLGOs=", + "dev": true, + "requires": { + "object-assign": "^4.1.1", + "util": "0.10.3" + }, + "dependencies": { + "inherits": { + "version": "2.0.1", + "resolved": "https://registry.npm.taobao.org/inherits/download/inherits-2.0.1.tgz", + "integrity": "sha1-sX0I0ya0Qj5Wjv9xn5GwscvfafE=", + "dev": true + }, + "util": { + "version": "0.10.3", + "resolved": "https://registry.npm.taobao.org/util/download/util-0.10.3.tgz?cache=0&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Futil%2Fdownload%2Futil-0.10.3.tgz", + "integrity": "sha1-evsa/lCAUkZInj23/g7TeTNqwPk=", + "dev": true, + "requires": { + "inherits": "2.0.1" + } + } + } + }, + "assert-plus": { + "version": "1.0.0", + "resolved": "https://registry.npm.taobao.org/assert-plus/download/assert-plus-1.0.0.tgz", + "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=", + "dev": true + }, + "assign-symbols": { + "version": "1.0.0", + "resolved": "https://registry.npm.taobao.org/assign-symbols/download/assign-symbols-1.0.0.tgz", + "integrity": "sha1-WWZ/QfrdTyDMvCu5a41Pf3jsA2c=", + "dev": true + }, + "astral-regex": { + "version": "1.0.0", + "resolved": "https://registry.npm.taobao.org/astral-regex/download/astral-regex-1.0.0.tgz", + "integrity": "sha1-bIw/uCfdQ+45GPJ7gngqt2WKb9k=", + "dev": true + }, + "async": { + "version": "2.6.3", + "resolved": "https://registry.npm.taobao.org/async/download/async-2.6.3.tgz?cache=0&sync_timestamp=1582540512270&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fasync%2Fdownload%2Fasync-2.6.3.tgz", + "integrity": "sha1-1yYl4jRKNlbjo61Pp0n6gymdgv8=", + "dev": true, + "requires": { + "lodash": "^4.17.14" + } + }, + "async-each": { + "version": "1.0.3", + "resolved": "https://registry.npm.taobao.org/async-each/download/async-each-1.0.3.tgz", + "integrity": "sha1-tyfb+H12UWAvBvTUrDh/R9kbDL8=", + "dev": true + }, + "async-limiter": { + "version": "1.0.1", + "resolved": "https://registry.npm.taobao.org/async-limiter/download/async-limiter-1.0.1.tgz?cache=0&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fasync-limiter%2Fdownload%2Fasync-limiter-1.0.1.tgz", + "integrity": "sha1-3TeelPDbgxCwgpH51kwyCXZmF/0=", + "dev": true + }, + "async-validator": { + "version": "1.8.5", + "resolved": "https://registry.npm.taobao.org/async-validator/download/async-validator-1.8.5.tgz", + "integrity": "sha1-3D4I7B/Q3dtn5ghC8CwM0c7G1/A=", + "requires": { + "babel-runtime": "6.x" + } + }, + "asynckit": { + "version": "0.4.0", + "resolved": "https://registry.npm.taobao.org/asynckit/download/asynckit-0.4.0.tgz", + "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k=", + "dev": true + }, + "atob": { + "version": "2.1.2", + "resolved": "https://registry.npm.taobao.org/atob/download/atob-2.1.2.tgz", + "integrity": "sha1-bZUX654DDSQ2ZmZR6GvZ9vE1M8k=", + "dev": true + }, + "autoprefixer": { + "version": "9.7.5", + "resolved": "https://registry.npm.taobao.org/autoprefixer/download/autoprefixer-9.7.5.tgz?cache=0&sync_timestamp=1585011328609&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fautoprefixer%2Fdownload%2Fautoprefixer-9.7.5.tgz", + "integrity": "sha1-jfELn/m1gUqNQRpc+6uceTw5I3Y=", + "dev": true, + "requires": { + "browserslist": "^4.11.0", + "caniuse-lite": "^1.0.30001036", + "chalk": "^2.4.2", + "normalize-range": "^0.1.2", + "num2fraction": "^1.2.2", + "postcss": "^7.0.27", + "postcss-value-parser": "^4.0.3" + } + }, + "aws-sign2": { + "version": "0.7.0", + "resolved": "https://registry.npm.taobao.org/aws-sign2/download/aws-sign2-0.7.0.tgz", + "integrity": "sha1-tG6JCTSpWR8tL2+G1+ap8bP+dqg=", + "dev": true + }, + "aws4": { + "version": "1.9.1", + "resolved": "https://registry.npm.taobao.org/aws4/download/aws4-1.9.1.tgz?cache=0&sync_timestamp=1578959055063&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Faws4%2Fdownload%2Faws4-1.9.1.tgz", + "integrity": "sha1-fjPY99RJs/ZzzXLeuavcVS2+Uo4=", + "dev": true + }, + "axios": { + "version": "0.19.2", + "resolved": "https://registry.npm.taobao.org/axios/download/axios-0.19.2.tgz", + "integrity": "sha1-PqNsXYgY0NX4qKl6bTa4bNwAyyc=", + "dev": true, + "requires": { + "follow-redirects": "1.5.10" + }, + "dependencies": { + "debug": { + "version": "3.1.0", + "resolved": "https://registry.npm.taobao.org/debug/download/debug-3.1.0.tgz", + "integrity": "sha1-W7WgZyYotkFJVmuhaBnmFRjGcmE=", + "dev": true, + "requires": { + "ms": "2.0.0" + } + }, + "follow-redirects": { + "version": "1.5.10", + "resolved": "https://registry.npm.taobao.org/follow-redirects/download/follow-redirects-1.5.10.tgz", + "integrity": "sha1-e3qfmuov3/NnhqlP9kPtB/T/Xio=", + "dev": true, + "requires": { + "debug": "=3.1.0" + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npm.taobao.org/ms/download/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "dev": true + } + } + }, + "babel-eslint": { + "version": "10.1.0", + "resolved": "https://registry.npm.taobao.org/babel-eslint/download/babel-eslint-10.1.0.tgz?cache=0&sync_timestamp=1582679727935&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fbabel-eslint%2Fdownload%2Fbabel-eslint-10.1.0.tgz", + "integrity": "sha1-aWjlaKkQt4+zd5zdi2rC9HmUMjI=", + "dev": true, + "requires": { + "@babel/code-frame": "^7.0.0", + "@babel/parser": "^7.7.0", + "@babel/traverse": "^7.7.0", + "@babel/types": "^7.7.0", + "eslint-visitor-keys": "^1.0.0", + "resolve": "^1.12.0" + } + }, + "babel-helper-vue-jsx-merge-props": { + "version": "2.0.3", + "resolved": "https://registry.npm.taobao.org/babel-helper-vue-jsx-merge-props/download/babel-helper-vue-jsx-merge-props-2.0.3.tgz", + "integrity": "sha1-Iq69OzOQIyjlEyk6jkmSs4T58bY=" + }, + "babel-loader": { + "version": "8.1.0", + "resolved": "https://registry.npm.taobao.org/babel-loader/download/babel-loader-8.1.0.tgz", + "integrity": "sha1-xhHVESvVIJq+i5+oTD5NolJ18cM=", + "dev": true, + "requires": { + "find-cache-dir": "^2.1.0", + "loader-utils": "^1.4.0", + "mkdirp": "^0.5.3", + "pify": "^4.0.1", + "schema-utils": "^2.6.5" + } + }, + "babel-plugin-dynamic-import-node": { + "version": "2.3.0", + "resolved": "https://registry.npm.taobao.org/babel-plugin-dynamic-import-node/download/babel-plugin-dynamic-import-node-2.3.0.tgz", + "integrity": "sha1-8A9Qe9qjw+P/bn5emNkKesq5b38=", + "dev": true, + "requires": { + "object.assign": "^4.1.0" + } + }, + "babel-runtime": { + "version": "6.26.0", + "resolved": "https://registry.npm.taobao.org/babel-runtime/download/babel-runtime-6.26.0.tgz", + "integrity": "sha1-llxwWGaOgrVde/4E/yM3vItWR/4=", + "requires": { + "core-js": "^2.4.0", + "regenerator-runtime": "^0.11.0" + }, + "dependencies": { + "core-js": { + "version": "2.6.11", + "resolved": "https://registry.npm.taobao.org/core-js/download/core-js-2.6.11.tgz", + "integrity": "sha1-OIMUafmSK97Y7iHJ3EaYXgOZMIw=" + }, + "regenerator-runtime": { + "version": "0.11.1", + "resolved": "https://registry.npm.taobao.org/regenerator-runtime/download/regenerator-runtime-0.11.1.tgz?cache=0&sync_timestamp=1584052597708&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fregenerator-runtime%2Fdownload%2Fregenerator-runtime-0.11.1.tgz", + "integrity": "sha1-vgWtf5v30i4Fb5cmzuUBf78Z4uk=" + } + } + }, + "balanced-match": { + "version": "1.0.0", + "resolved": "https://registry.npm.taobao.org/balanced-match/download/balanced-match-1.0.0.tgz", + "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=", + "dev": true + }, + "base": { + "version": "0.11.2", + "resolved": "https://registry.npm.taobao.org/base/download/base-0.11.2.tgz", + "integrity": "sha1-e95c7RRbbVUakNuH+DxVi060io8=", + "dev": true, + "requires": { + "cache-base": "^1.0.1", + "class-utils": "^0.3.5", + "component-emitter": "^1.2.1", + "define-property": "^1.0.0", + "isobject": "^3.0.1", + "mixin-deep": "^1.2.0", + "pascalcase": "^0.1.1" + }, + "dependencies": { + "define-property": { + "version": "1.0.0", + "resolved": "https://registry.npm.taobao.org/define-property/download/define-property-1.0.0.tgz", + "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", + "dev": true, + "requires": { + "is-descriptor": "^1.0.0" + } + }, + "is-accessor-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npm.taobao.org/is-accessor-descriptor/download/is-accessor-descriptor-1.0.0.tgz", + "integrity": "sha1-FpwvbT3x+ZJhgHI2XJsOofaHhlY=", + "dev": true, + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-data-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npm.taobao.org/is-data-descriptor/download/is-data-descriptor-1.0.0.tgz", + "integrity": "sha1-2Eh2Mh0Oet0DmQQGq7u9NrqSaMc=", + "dev": true, + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-descriptor": { + "version": "1.0.2", + "resolved": "https://registry.npm.taobao.org/is-descriptor/download/is-descriptor-1.0.2.tgz", + "integrity": "sha1-OxWXRqZmBLBPjIFSS6NlxfFNhuw=", + "dev": true, + "requires": { + "is-accessor-descriptor": "^1.0.0", + "is-data-descriptor": "^1.0.0", + "kind-of": "^6.0.2" + } + } + } + }, + "base64-js": { + "version": "1.3.1", + "resolved": "https://registry.npm.taobao.org/base64-js/download/base64-js-1.3.1.tgz", + "integrity": "sha1-WOzoy3XdB+ce0IxzarxfrE2/jfE=", + "dev": true + }, + "batch": { + "version": "0.6.1", + "resolved": "https://registry.npm.taobao.org/batch/download/batch-0.6.1.tgz", + "integrity": "sha1-3DQxT05nkxgJP8dgJyUl+UvyXBY=", + "dev": true + }, + "bcrypt-pbkdf": { + "version": "1.0.2", + "resolved": "https://registry.npm.taobao.org/bcrypt-pbkdf/download/bcrypt-pbkdf-1.0.2.tgz", + "integrity": "sha1-pDAdOJtqQ/m2f/PKEaP2Y342Dp4=", + "dev": true, + "requires": { + "tweetnacl": "^0.14.3" + } + }, + "bfj": { + "version": "6.1.2", + "resolved": "https://registry.npm.taobao.org/bfj/download/bfj-6.1.2.tgz?cache=0&sync_timestamp=1577112700192&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fbfj%2Fdownload%2Fbfj-6.1.2.tgz", + "integrity": "sha1-MlyGGoIryzWKQceKM7jm4ght3n8=", + "dev": true, + "requires": { + "bluebird": "^3.5.5", + "check-types": "^8.0.3", + "hoopy": "^0.1.4", + "tryer": "^1.0.1" + } + }, + "big.js": { + "version": "5.2.2", + "resolved": "https://registry.npm.taobao.org/big.js/download/big.js-5.2.2.tgz", + "integrity": "sha1-ZfCvOC9Xi83HQr2cKB6cstd2gyg=", + "dev": true + }, + "binary-extensions": { + "version": "1.13.1", + "resolved": "https://registry.npm.taobao.org/binary-extensions/download/binary-extensions-1.13.1.tgz", + "integrity": "sha1-WYr+VHVbKGilMw0q/51Ou1Mgm2U=", + "dev": true + }, + "bindings": { + "version": "1.5.0", + "resolved": "https://registry.npm.taobao.org/bindings/download/bindings-1.5.0.tgz", + "integrity": "sha1-EDU8npRTNLwFEabZCzj7x8nFBN8=", + "dev": true, + "optional": true, + "requires": { + "file-uri-to-path": "1.0.0" + } + }, + "bluebird": { + "version": "3.7.2", + "resolved": "https://registry.npm.taobao.org/bluebird/download/bluebird-3.7.2.tgz", + "integrity": "sha1-nyKcFb4nJFT/qXOs4NvueaGww28=", + "dev": true + }, + "bn.js": { + "version": "4.11.8", + "resolved": "https://registry.npm.taobao.org/bn.js/download/bn.js-4.11.8.tgz", + "integrity": "sha1-LN4J617jQfSEdGuwMJsyU7GxRC8=", + "dev": true + }, + "body-parser": { + "version": "1.19.0", + "resolved": "https://registry.npm.taobao.org/body-parser/download/body-parser-1.19.0.tgz", + "integrity": "sha1-lrJwnlfJxOCab9Zqj9l5hE9p8Io=", + "dev": true, + "requires": { + "bytes": "3.1.0", + "content-type": "~1.0.4", + "debug": "2.6.9", + "depd": "~1.1.2", + "http-errors": "1.7.2", + "iconv-lite": "0.4.24", + "on-finished": "~2.3.0", + "qs": "6.7.0", + "raw-body": "2.4.0", + "type-is": "~1.6.17" + }, + "dependencies": { + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npm.taobao.org/debug/download/debug-2.6.9.tgz", + "integrity": "sha1-XRKFFd8TT/Mn6QpMk/Tgd6U2NB8=", + "dev": true, + "requires": { + "ms": "2.0.0" + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npm.taobao.org/ms/download/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "dev": true + }, + "qs": { + "version": "6.7.0", + "resolved": "https://registry.npm.taobao.org/qs/download/qs-6.7.0.tgz?cache=0&sync_timestamp=1585063550190&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fqs%2Fdownload%2Fqs-6.7.0.tgz", + "integrity": "sha1-QdwaAV49WB8WIXdr4xr7KHapsbw=", + "dev": true + } + } + }, + "bonjour": { + "version": "3.5.0", + "resolved": "https://registry.npm.taobao.org/bonjour/download/bonjour-3.5.0.tgz", + "integrity": "sha1-jokKGD2O6aI5OzhExpGkK897yfU=", + "dev": true, + "requires": { + "array-flatten": "^2.1.0", + "deep-equal": "^1.0.1", + "dns-equal": "^1.0.0", + "dns-txt": "^2.0.2", + "multicast-dns": "^6.0.1", + "multicast-dns-service-types": "^1.1.0" + }, + "dependencies": { + "array-flatten": { + "version": "2.1.2", + "resolved": "https://registry.npm.taobao.org/array-flatten/download/array-flatten-2.1.2.tgz?cache=0&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Farray-flatten%2Fdownload%2Farray-flatten-2.1.2.tgz", + "integrity": "sha1-JO+AoowaiTYX4hSbDG0NeIKTsJk=", + "dev": true + } + } + }, + "boolbase": { + "version": "1.0.0", + "resolved": "https://registry.npm.taobao.org/boolbase/download/boolbase-1.0.0.tgz", + "integrity": "sha1-aN/1++YMUes3cl6p4+0xDcwed24=", + "dev": true + }, + "brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npm.taobao.org/brace-expansion/download/brace-expansion-1.1.11.tgz", + "integrity": "sha1-PH/L9SnYcibz0vUrlm/1Jx60Qd0=", + "dev": true, + "requires": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "braces": { + "version": "2.3.2", + "resolved": "https://registry.npm.taobao.org/braces/download/braces-2.3.2.tgz", + "integrity": "sha1-WXn9PxTNUxVl5fot8av/8d+u5yk=", + "dev": true, + "requires": { + "arr-flatten": "^1.1.0", + "array-unique": "^0.3.2", + "extend-shallow": "^2.0.1", + "fill-range": "^4.0.0", + "isobject": "^3.0.1", + "repeat-element": "^1.1.2", + "snapdragon": "^0.8.1", + "snapdragon-node": "^2.0.1", + "split-string": "^3.0.2", + "to-regex": "^3.0.1" + }, + "dependencies": { + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npm.taobao.org/extend-shallow/download/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "^0.1.0" + } + } + } + }, + "brorand": { + "version": "1.1.0", + "resolved": "https://registry.npm.taobao.org/brorand/download/brorand-1.1.0.tgz", + "integrity": "sha1-EsJe/kCkXjwyPrhnWgoM5XsiNx8=", + "dev": true + }, + "browserify-aes": { + "version": "1.2.0", + "resolved": "https://registry.npm.taobao.org/browserify-aes/download/browserify-aes-1.2.0.tgz", + "integrity": "sha1-Mmc0ZC9APavDADIJhTu3CtQo70g=", + "dev": true, + "requires": { + "buffer-xor": "^1.0.3", + "cipher-base": "^1.0.0", + "create-hash": "^1.1.0", + "evp_bytestokey": "^1.0.3", + "inherits": "^2.0.1", + "safe-buffer": "^5.0.1" + } + }, + "browserify-cipher": { + "version": "1.0.1", + "resolved": "https://registry.npm.taobao.org/browserify-cipher/download/browserify-cipher-1.0.1.tgz", + "integrity": "sha1-jWR0wbhwv9q807z8wZNKEOlPFfA=", + "dev": true, + "requires": { + "browserify-aes": "^1.0.4", + "browserify-des": "^1.0.0", + "evp_bytestokey": "^1.0.0" + } + }, + "browserify-des": { + "version": "1.0.2", + "resolved": "https://registry.npm.taobao.org/browserify-des/download/browserify-des-1.0.2.tgz", + "integrity": "sha1-OvTx9Zg5QDVy8cZiBDdfen9wPpw=", + "dev": true, + "requires": { + "cipher-base": "^1.0.1", + "des.js": "^1.0.0", + "inherits": "^2.0.1", + "safe-buffer": "^5.1.2" + } + }, + "browserify-rsa": { + "version": "4.0.1", + "resolved": "https://registry.npm.taobao.org/browserify-rsa/download/browserify-rsa-4.0.1.tgz", + "integrity": "sha1-IeCr+vbyApzy+vsTNWenAdQTVSQ=", + "dev": true, + "requires": { + "bn.js": "^4.1.0", + "randombytes": "^2.0.1" + } + }, + "browserify-sign": { + "version": "4.0.4", + "resolved": "https://registry.npm.taobao.org/browserify-sign/download/browserify-sign-4.0.4.tgz", + "integrity": "sha1-qk62jl17ZYuqa/alfmMMvXqT0pg=", + "dev": true, + "requires": { + "bn.js": "^4.1.1", + "browserify-rsa": "^4.0.0", + "create-hash": "^1.1.0", + "create-hmac": "^1.1.2", + "elliptic": "^6.0.0", + "inherits": "^2.0.1", + "parse-asn1": "^5.0.0" + } + }, + "browserify-zlib": { + "version": "0.2.0", + "resolved": "https://registry.npm.taobao.org/browserify-zlib/download/browserify-zlib-0.2.0.tgz", + "integrity": "sha1-KGlFnZqjviRf6P4sofRuLn9U1z8=", + "dev": true, + "requires": { + "pako": "~1.0.5" + } + }, + "browserslist": { + "version": "4.11.0", + "resolved": "https://registry.npm.taobao.org/browserslist/download/browserslist-4.11.0.tgz?cache=0&sync_timestamp=1584920750400&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fbrowserslist%2Fdownload%2Fbrowserslist-4.11.0.tgz", + "integrity": "sha1-rvQ1exCoq9oA+XqsfNWHsggroa0=", + "dev": true, + "requires": { + "caniuse-lite": "^1.0.30001035", + "electron-to-chromium": "^1.3.380", + "node-releases": "^1.1.52", + "pkg-up": "^3.1.0" + } + }, + "buffer": { + "version": "4.9.2", + "resolved": "https://registry.npm.taobao.org/buffer/download/buffer-4.9.2.tgz", + "integrity": "sha1-Iw6tNEACmIZEhBqwJEr4xEu+Pvg=", + "dev": true, + "requires": { + "base64-js": "^1.0.2", + "ieee754": "^1.1.4", + "isarray": "^1.0.0" + } + }, + "buffer-from": { + "version": "1.1.1", + "resolved": "https://registry.npm.taobao.org/buffer-from/download/buffer-from-1.1.1.tgz", + "integrity": "sha1-MnE7wCj3XAL9txDXx7zsHyxgcO8=", + "dev": true + }, + "buffer-indexof": { + "version": "1.1.1", + "resolved": "https://registry.npm.taobao.org/buffer-indexof/download/buffer-indexof-1.1.1.tgz", + "integrity": "sha1-Uvq8xqYG0aADAoAmSO9o9jnaJow=", + "dev": true + }, + "buffer-json": { + "version": "2.0.0", + "resolved": "https://registry.npm.taobao.org/buffer-json/download/buffer-json-2.0.0.tgz", + "integrity": "sha1-9z4TseQvGW/i/WfQAcfXEH7dfCM=", + "dev": true + }, + "buffer-xor": { + "version": "1.0.3", + "resolved": "https://registry.npm.taobao.org/buffer-xor/download/buffer-xor-1.0.3.tgz", + "integrity": "sha1-JuYe0UIvtw3ULm42cp7VHYVf6Nk=", + "dev": true + }, + "builtin-status-codes": { + "version": "3.0.0", + "resolved": "https://registry.npm.taobao.org/builtin-status-codes/download/builtin-status-codes-3.0.0.tgz", + "integrity": "sha1-hZgoeOIbmOHGZCXgPQF0eI9Wnug=", + "dev": true + }, + "bytes": { + "version": "3.1.0", + "resolved": "https://registry.npm.taobao.org/bytes/download/bytes-3.1.0.tgz", + "integrity": "sha1-9s95M6Ng4FiPqf3oVlHNx/gF0fY=", + "dev": true + }, + "cacache": { + "version": "12.0.4", + "resolved": "https://registry.npm.taobao.org/cacache/download/cacache-12.0.4.tgz?cache=0&sync_timestamp=1585009516561&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fcacache%2Fdownload%2Fcacache-12.0.4.tgz", + "integrity": "sha1-ZovL0QWutfHZL+JVcOyVJcj6pAw=", + "dev": true, + "requires": { + "bluebird": "^3.5.5", + "chownr": "^1.1.1", + "figgy-pudding": "^3.5.1", + "glob": "^7.1.4", + "graceful-fs": "^4.1.15", + "infer-owner": "^1.0.3", + "lru-cache": "^5.1.1", + "mississippi": "^3.0.0", + "mkdirp": "^0.5.1", + "move-concurrently": "^1.0.1", + "promise-inflight": "^1.0.1", + "rimraf": "^2.6.3", + "ssri": "^6.0.1", + "unique-filename": "^1.1.1", + "y18n": "^4.0.0" + } + }, + "cache-base": { + "version": "1.0.1", + "resolved": "https://registry.npm.taobao.org/cache-base/download/cache-base-1.0.1.tgz", + "integrity": "sha1-Cn9GQWgxyLZi7jb+TnxZ129marI=", + "dev": true, + "requires": { + "collection-visit": "^1.0.0", + "component-emitter": "^1.2.1", + "get-value": "^2.0.6", + "has-value": "^1.0.0", + "isobject": "^3.0.1", + "set-value": "^2.0.0", + "to-object-path": "^0.3.0", + "union-value": "^1.0.0", + "unset-value": "^1.0.0" + } + }, + "cache-loader": { + "version": "4.1.0", + "resolved": "https://registry.npm.taobao.org/cache-loader/download/cache-loader-4.1.0.tgz", + "integrity": "sha1-mUjK41OuwKH8ser9ojAIFuyFOH4=", + "dev": true, + "requires": { + "buffer-json": "^2.0.0", + "find-cache-dir": "^3.0.0", + "loader-utils": "^1.2.3", + "mkdirp": "^0.5.1", + "neo-async": "^2.6.1", + "schema-utils": "^2.0.0" + }, + "dependencies": { + "find-cache-dir": { + "version": "3.3.1", + "resolved": "https://registry.npm.taobao.org/find-cache-dir/download/find-cache-dir-3.3.1.tgz?cache=0&sync_timestamp=1583734806517&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Ffind-cache-dir%2Fdownload%2Ffind-cache-dir-3.3.1.tgz", + "integrity": "sha1-ibM/rUpGcNqpT4Vff74x1thP6IA=", + "dev": true, + "requires": { + "commondir": "^1.0.1", + "make-dir": "^3.0.2", + "pkg-dir": "^4.1.0" + } + }, + "find-up": { + "version": "4.1.0", + "resolved": "https://registry.npm.taobao.org/find-up/download/find-up-4.1.0.tgz", + "integrity": "sha1-l6/n1s3AvFkoWEt8jXsW6KmqXRk=", + "dev": true, + "requires": { + "locate-path": "^5.0.0", + "path-exists": "^4.0.0" + } + }, + "locate-path": { + "version": "5.0.0", + "resolved": "https://registry.npm.taobao.org/locate-path/download/locate-path-5.0.0.tgz", + "integrity": "sha1-Gvujlq/WdqbUJQTQpno6frn2KqA=", + "dev": true, + "requires": { + "p-locate": "^4.1.0" + } + }, + "make-dir": { + "version": "3.0.2", + "resolved": "https://registry.npm.taobao.org/make-dir/download/make-dir-3.0.2.tgz", + "integrity": "sha1-BKGsvyIiHh1u9DVZ9D4FqQ27Q5I=", + "dev": true, + "requires": { + "semver": "^6.0.0" + } + }, + "p-locate": { + "version": "4.1.0", + "resolved": "https://registry.npm.taobao.org/p-locate/download/p-locate-4.1.0.tgz", + "integrity": "sha1-o0KLtwiLOmApL2aRkni3wpetTwc=", + "dev": true, + "requires": { + "p-limit": "^2.2.0" + } + }, + "path-exists": { + "version": "4.0.0", + "resolved": "https://registry.npm.taobao.org/path-exists/download/path-exists-4.0.0.tgz", + "integrity": "sha1-UTvb4tO5XXdi6METfvoZXGxhtbM=", + "dev": true + }, + "pkg-dir": { + "version": "4.2.0", + "resolved": "https://registry.npm.taobao.org/pkg-dir/download/pkg-dir-4.2.0.tgz", + "integrity": "sha1-8JkTPfft5CLoHR2ESCcO6z5CYfM=", + "dev": true, + "requires": { + "find-up": "^4.0.0" + } + }, + "semver": { + "version": "6.3.0", + "resolved": "https://registry.npm.taobao.org/semver/download/semver-6.3.0.tgz", + "integrity": "sha1-7gpkyK9ejO6mdoexM3YeG+y9HT0=", + "dev": true + } + } + }, + "call-me-maybe": { + "version": "1.0.1", + "resolved": "https://registry.npm.taobao.org/call-me-maybe/download/call-me-maybe-1.0.1.tgz", + "integrity": "sha1-JtII6onje1y95gJQoV8DHBak1ms=", + "dev": true + }, + "caller-callsite": { + "version": "2.0.0", + "resolved": "https://registry.npm.taobao.org/caller-callsite/download/caller-callsite-2.0.0.tgz", + "integrity": "sha1-hH4PzgoiN1CpoCfFSzNzGtMVQTQ=", + "dev": true, + "requires": { + "callsites": "^2.0.0" + } + }, + "caller-path": { + "version": "2.0.0", + "resolved": "https://registry.npm.taobao.org/caller-path/download/caller-path-2.0.0.tgz?cache=0&sync_timestamp=1574395933637&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fcaller-path%2Fdownload%2Fcaller-path-2.0.0.tgz", + "integrity": "sha1-Ro+DBE42mrIBD6xfBs7uFbsssfQ=", + "dev": true, + "requires": { + "caller-callsite": "^2.0.0" + } + }, + "callsites": { + "version": "2.0.0", + "resolved": "https://registry.npm.taobao.org/callsites/download/callsites-2.0.0.tgz", + "integrity": "sha1-BuuE8A7qQT2oav/vrL/7Ngk7PFA=", + "dev": true + }, + "camel-case": { + "version": "3.0.0", + "resolved": "https://registry.npm.taobao.org/camel-case/download/camel-case-3.0.0.tgz", + "integrity": "sha1-yjw2iKTpzzpM2nd9xNy8cTJJz3M=", + "dev": true, + "requires": { + "no-case": "^2.2.0", + "upper-case": "^1.1.1" + } + }, + "camelcase": { + "version": "5.3.1", + "resolved": "https://registry.npm.taobao.org/camelcase/download/camelcase-5.3.1.tgz", + "integrity": "sha1-48mzFWnhBoEd8kL3FXJaH0xJQyA=", + "dev": true + }, + "caniuse-api": { + "version": "3.0.0", + "resolved": "https://registry.npm.taobao.org/caniuse-api/download/caniuse-api-3.0.0.tgz", + "integrity": "sha1-Xk2Q4idJYdRikZl99Znj7QCO5MA=", + "dev": true, + "requires": { + "browserslist": "^4.0.0", + "caniuse-lite": "^1.0.0", + "lodash.memoize": "^4.1.2", + "lodash.uniq": "^4.5.0" + } + }, + "caniuse-lite": { + "version": "1.0.30001036", + "resolved": "https://registry.npm.taobao.org/caniuse-lite/download/caniuse-lite-1.0.30001036.tgz", + "integrity": "sha1-kw6lJyAQ2L8ZDYWRWddXwLOYyvA=", + "dev": true + }, + "case-sensitive-paths-webpack-plugin": { + "version": "2.3.0", + "resolved": "https://registry.npm.taobao.org/case-sensitive-paths-webpack-plugin/download/case-sensitive-paths-webpack-plugin-2.3.0.tgz", + "integrity": "sha1-I6xhPMmoVuT4j/i7c7u16YmCXPc=", + "dev": true + }, + "caseless": { + "version": "0.12.0", + "resolved": "https://registry.npm.taobao.org/caseless/download/caseless-0.12.0.tgz", + "integrity": "sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw=", + "dev": true + }, + "cfb": { + "version": "1.2.0", + "resolved": "https://registry.npm.taobao.org/cfb/download/cfb-1.2.0.tgz", + "integrity": "sha1-ak0IcrUl7WA0nh71H7Swv3Psqag=", + "requires": { + "adler-32": "~1.2.0", + "crc-32": "~1.2.0", + "printj": "~1.1.2" + } + }, + "chalk": { + "version": "2.4.2", + "resolved": "https://registry.npm.taobao.org/chalk/download/chalk-2.4.2.tgz", + "integrity": "sha1-zUJUFnelQzPPVBpJEIwUMrRMlCQ=", + "dev": true, + "requires": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + } + }, + "chardet": { + "version": "0.7.0", + "resolved": "https://registry.npm.taobao.org/chardet/download/chardet-0.7.0.tgz", + "integrity": "sha1-kAlISfCTfy7twkJdDSip5fDLrZ4=", + "dev": true + }, + "check-types": { + "version": "8.0.3", + "resolved": "https://registry.npm.taobao.org/check-types/download/check-types-8.0.3.tgz", + "integrity": "sha1-M1bMoZyIlUTy16le1JzlCKDs9VI=", + "dev": true + }, + "chokidar": { + "version": "2.1.8", + "resolved": "https://registry.npm.taobao.org/chokidar/download/chokidar-2.1.8.tgz?cache=0&sync_timestamp=1584609518131&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fchokidar%2Fdownload%2Fchokidar-2.1.8.tgz", + "integrity": "sha1-gEs6e2qZNYw8XGHnHYco8EHP+Rc=", + "dev": true, + "requires": { + "anymatch": "^2.0.0", + "async-each": "^1.0.1", + "braces": "^2.3.2", + "fsevents": "^1.2.7", + "glob-parent": "^3.1.0", + "inherits": "^2.0.3", + "is-binary-path": "^1.0.0", + "is-glob": "^4.0.0", + "normalize-path": "^3.0.0", + "path-is-absolute": "^1.0.0", + "readdirp": "^2.2.1", + "upath": "^1.1.1" + } + }, + "chownr": { + "version": "1.1.4", + "resolved": "https://registry.npm.taobao.org/chownr/download/chownr-1.1.4.tgz", + "integrity": "sha1-b8nXtC0ypYNZYzdmbn0ICE2izGs=", + "dev": true + }, + "chrome-trace-event": { + "version": "1.0.2", + "resolved": "https://registry.npm.taobao.org/chrome-trace-event/download/chrome-trace-event-1.0.2.tgz", + "integrity": "sha1-I0CQ7pfH1K0aLEvq4nUF3v/GCKQ=", + "dev": true, + "requires": { + "tslib": "^1.9.0" + } + }, + "ci-info": { + "version": "1.6.0", + "resolved": "https://registry.npm.taobao.org/ci-info/download/ci-info-1.6.0.tgz", + "integrity": "sha1-LKINu5zrMtRSSmgzAzE/AwSx5Jc=", + "dev": true + }, + "cipher-base": { + "version": "1.0.4", + "resolved": "https://registry.npm.taobao.org/cipher-base/download/cipher-base-1.0.4.tgz", + "integrity": "sha1-h2Dk7MJy9MNjUy+SbYdKriwTl94=", + "dev": true, + "requires": { + "inherits": "^2.0.1", + "safe-buffer": "^5.0.1" + } + }, + "class-utils": { + "version": "0.3.6", + "resolved": "https://registry.npm.taobao.org/class-utils/download/class-utils-0.3.6.tgz", + "integrity": "sha1-+TNprouafOAv1B+q0MqDAzGQxGM=", + "dev": true, + "requires": { + "arr-union": "^3.1.0", + "define-property": "^0.2.5", + "isobject": "^3.0.0", + "static-extend": "^0.1.1" + }, + "dependencies": { + "define-property": { + "version": "0.2.5", + "resolved": "https://registry.npm.taobao.org/define-property/download/define-property-0.2.5.tgz", + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "dev": true, + "requires": { + "is-descriptor": "^0.1.0" + } + } + } + }, + "clean-css": { + "version": "4.2.3", + "resolved": "https://registry.npm.taobao.org/clean-css/download/clean-css-4.2.3.tgz", + "integrity": "sha1-UHtd59l7SO5T2ErbAWD/YhY4D3g=", + "dev": true, + "requires": { + "source-map": "~0.6.0" + }, + "dependencies": { + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npm.taobao.org/source-map/download/source-map-0.6.1.tgz", + "integrity": "sha1-dHIq8y6WFOnCh6jQu95IteLxomM=", + "dev": true + } + } + }, + "clean-stack": { + "version": "2.2.0", + "resolved": "https://registry.npm.taobao.org/clean-stack/download/clean-stack-2.2.0.tgz?cache=0&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fclean-stack%2Fdownload%2Fclean-stack-2.2.0.tgz", + "integrity": "sha1-7oRy27Ep5yezHooQpCfe6d/kAIs=", + "dev": true + }, + "cli-cursor": { + "version": "2.1.0", + "resolved": "https://registry.npm.taobao.org/cli-cursor/download/cli-cursor-2.1.0.tgz", + "integrity": "sha1-s12sN2R5+sw+lHR9QdDQ9SOP/LU=", + "dev": true, + "requires": { + "restore-cursor": "^2.0.0" + } + }, + "cli-highlight": { + "version": "2.1.4", + "resolved": "https://registry.npm.taobao.org/cli-highlight/download/cli-highlight-2.1.4.tgz?cache=0&sync_timestamp=1573949240542&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fcli-highlight%2Fdownload%2Fcli-highlight-2.1.4.tgz", + "integrity": "sha1-CYy2Qs8X9CrcHBFF4H+WDsTXUis=", + "dev": true, + "requires": { + "chalk": "^3.0.0", + "highlight.js": "^9.6.0", + "mz": "^2.4.0", + "parse5": "^5.1.1", + "parse5-htmlparser2-tree-adapter": "^5.1.1", + "yargs": "^15.0.0" + }, + "dependencies": { + "ansi-styles": { + "version": "4.2.1", + "resolved": "https://registry.npm.taobao.org/ansi-styles/download/ansi-styles-4.2.1.tgz", + "integrity": "sha1-kK51xCTQCNJiTFvynq0xd+v881k=", + "dev": true, + "requires": { + "@types/color-name": "^1.1.1", + "color-convert": "^2.0.1" + } + }, + "chalk": { + "version": "3.0.0", + "resolved": "https://registry.npm.taobao.org/chalk/download/chalk-3.0.0.tgz", + "integrity": "sha1-P3PCv1JlkfV0zEksUeJFY0n4ROQ=", + "dev": true, + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npm.taobao.org/color-convert/download/color-convert-2.0.1.tgz", + "integrity": "sha1-ctOmjVmMm9s68q0ehPIdiWq9TeM=", + "dev": true, + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npm.taobao.org/color-name/download/color-name-1.1.4.tgz", + "integrity": "sha1-wqCah6y95pVD3m9j+jmVyCbFNqI=", + "dev": true + }, + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npm.taobao.org/has-flag/download/has-flag-4.0.0.tgz", + "integrity": "sha1-lEdx/ZyByBJlxNaUGGDaBrtZR5s=", + "dev": true + }, + "supports-color": { + "version": "7.1.0", + "resolved": "https://registry.npm.taobao.org/supports-color/download/supports-color-7.1.0.tgz?cache=0&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fsupports-color%2Fdownload%2Fsupports-color-7.1.0.tgz", + "integrity": "sha1-aOMlkd9z4lrRxLSRCKLsUHliv9E=", + "dev": true, + "requires": { + "has-flag": "^4.0.0" + } + } + } + }, + "cli-spinners": { + "version": "2.2.0", + "resolved": "https://registry.npm.taobao.org/cli-spinners/download/cli-spinners-2.2.0.tgz", + "integrity": "sha1-6LmI2SBsaSMC2O6DTnqFwBRNj3c=", + "dev": true + }, + "cli-width": { + "version": "2.2.0", + "resolved": "https://registry.npm.taobao.org/cli-width/download/cli-width-2.2.0.tgz", + "integrity": "sha1-/xnt6Kml5XkyQUewwR8PvLq+1jk=", + "dev": true + }, + "clipboardy": { + "version": "2.3.0", + "resolved": "https://registry.npm.taobao.org/clipboardy/download/clipboardy-2.3.0.tgz?cache=0&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fclipboardy%2Fdownload%2Fclipboardy-2.3.0.tgz", + "integrity": "sha1-PCkDZQxo5GqRs4iYW8J3QofbopA=", + "dev": true, + "requires": { + "arch": "^2.1.1", + "execa": "^1.0.0", + "is-wsl": "^2.1.1" + }, + "dependencies": { + "is-wsl": { + "version": "2.1.1", + "resolved": "https://registry.npm.taobao.org/is-wsl/download/is-wsl-2.1.1.tgz", + "integrity": "sha1-ShwVLUKd89RBZpSY4khtNZbrrx0=", + "dev": true + } + } + }, + "cliui": { + "version": "6.0.0", + "resolved": "https://registry.npm.taobao.org/cliui/download/cliui-6.0.0.tgz?cache=0&sync_timestamp=1573942320052&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fcliui%2Fdownload%2Fcliui-6.0.0.tgz", + "integrity": "sha1-UR1wLAxOQcoVbX0OlgIfI+EyJbE=", + "dev": true, + "requires": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.0", + "wrap-ansi": "^6.2.0" + }, + "dependencies": { + "is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npm.taobao.org/is-fullwidth-code-point/download/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha1-8Rb4Bk/pCz94RKOJl8C3UFEmnx0=", + "dev": true + }, + "string-width": { + "version": "4.2.0", + "resolved": "https://registry.npm.taobao.org/string-width/download/string-width-4.2.0.tgz", + "integrity": "sha1-lSGCxGzHssMT0VluYjmSvRY7crU=", + "dev": true, + "requires": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.0" + } + } + } + }, + "clone": { + "version": "1.0.4", + "resolved": "https://registry.npm.taobao.org/clone/download/clone-1.0.4.tgz", + "integrity": "sha1-2jCcwmPfFZlMaIypAheco8fNfH4=", + "dev": true + }, + "coa": { + "version": "2.0.2", + "resolved": "https://registry.npm.taobao.org/coa/download/coa-2.0.2.tgz", + "integrity": "sha1-Q/bCEVG07yv1cYfbDXPeIp4+fsM=", + "dev": true, + "requires": { + "@types/q": "^1.5.1", + "chalk": "^2.4.1", + "q": "^1.1.2" + } + }, + "code-point-at": { + "version": "1.1.0", + "resolved": "https://registry.npm.taobao.org/code-point-at/download/code-point-at-1.1.0.tgz", + "integrity": "sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c=", + "dev": true + }, + "codepage": { + "version": "1.14.0", + "resolved": "https://registry.npm.taobao.org/codepage/download/codepage-1.14.0.tgz", + "integrity": "sha1-jL4lSBMjVZ19MHVxsP/5HnodL5k=", + "requires": { + "commander": "~2.14.1", + "exit-on-epipe": "~1.0.1" + }, + "dependencies": { + "commander": { + "version": "2.14.1", + "resolved": "https://registry.npm.taobao.org/commander/download/commander-2.14.1.tgz?cache=0&sync_timestamp=1605992767704&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fcommander%2Fdownload%2Fcommander-2.14.1.tgz", + "integrity": "sha1-IjUSPjevjKPGXfRbAm29NXsBuao=" + } + } + }, + "collection-visit": { + "version": "1.0.0", + "resolved": "https://registry.npm.taobao.org/collection-visit/download/collection-visit-1.0.0.tgz", + "integrity": "sha1-S8A3PBZLwykbTTaMgpzxqApZ3KA=", + "dev": true, + "requires": { + "map-visit": "^1.0.0", + "object-visit": "^1.0.0" + } + }, + "color": { + "version": "3.1.2", + "resolved": "https://registry.npm.taobao.org/color/download/color-3.1.2.tgz", + "integrity": "sha1-aBSOf4XUGtdknF+oyBBvCY0inhA=", + "dev": true, + "requires": { + "color-convert": "^1.9.1", + "color-string": "^1.5.2" + } + }, + "color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npm.taobao.org/color-convert/download/color-convert-1.9.3.tgz", + "integrity": "sha1-u3GFBpDh8TZWfeYp0tVHHe2kweg=", + "dev": true, + "requires": { + "color-name": "1.1.3" + } + }, + "color-name": { + "version": "1.1.3", + "resolved": "https://registry.npm.taobao.org/color-name/download/color-name-1.1.3.tgz", + "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=", + "dev": true + }, + "color-string": { + "version": "1.5.3", + "resolved": "https://registry.npm.taobao.org/color-string/download/color-string-1.5.3.tgz", + "integrity": "sha1-ybvF8BtYtUkvPWhXRZy2WQziBMw=", + "dev": true, + "requires": { + "color-name": "^1.0.0", + "simple-swizzle": "^0.2.2" + } + }, + "combined-stream": { + "version": "1.0.8", + "resolved": "https://registry.npm.taobao.org/combined-stream/download/combined-stream-1.0.8.tgz", + "integrity": "sha1-w9RaizT9cwYxoRCoolIGgrMdWn8=", + "dev": true, + "requires": { + "delayed-stream": "~1.0.0" + } + }, + "commander": { + "version": "2.20.3", + "resolved": "https://registry.npm.taobao.org/commander/download/commander-2.20.3.tgz", + "integrity": "sha1-/UhehMA+tIgcIHIrpIA16FMa6zM=", + "dev": true + }, + "commondir": { + "version": "1.0.1", + "resolved": "https://registry.npm.taobao.org/commondir/download/commondir-1.0.1.tgz", + "integrity": "sha1-3dgA2gxmEnOTzKWVDqloo6rxJTs=", + "dev": true + }, + "component-emitter": { + "version": "1.3.0", + "resolved": "https://registry.npm.taobao.org/component-emitter/download/component-emitter-1.3.0.tgz", + "integrity": "sha1-FuQHD7qK4ptnnyIVhT7hgasuq8A=", + "dev": true + }, + "compressible": { + "version": "2.0.18", + "resolved": "https://registry.npm.taobao.org/compressible/download/compressible-2.0.18.tgz", + "integrity": "sha1-r1PMprBw1MPAdQ+9dyhqbXzEb7o=", + "dev": true, + "requires": { + "mime-db": ">= 1.43.0 < 2" + } + }, + "compression": { + "version": "1.7.4", + "resolved": "https://registry.npm.taobao.org/compression/download/compression-1.7.4.tgz", + "integrity": "sha1-lVI+/xcMpXwpoMpB5v4TH0Hlu48=", + "dev": true, + "requires": { + "accepts": "~1.3.5", + "bytes": "3.0.0", + "compressible": "~2.0.16", + "debug": "2.6.9", + "on-headers": "~1.0.2", + "safe-buffer": "5.1.2", + "vary": "~1.1.2" + }, + "dependencies": { + "bytes": { + "version": "3.0.0", + "resolved": "https://registry.npm.taobao.org/bytes/download/bytes-3.0.0.tgz", + "integrity": "sha1-0ygVQE1olpn4Wk6k+odV3ROpYEg=", + "dev": true + }, + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npm.taobao.org/debug/download/debug-2.6.9.tgz", + "integrity": "sha1-XRKFFd8TT/Mn6QpMk/Tgd6U2NB8=", + "dev": true, + "requires": { + "ms": "2.0.0" + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npm.taobao.org/ms/download/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "dev": true + } + } + }, + "concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npm.taobao.org/concat-map/download/concat-map-0.0.1.tgz", + "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=", + "dev": true + }, + "concat-stream": { + "version": "1.6.2", + "resolved": "https://registry.npm.taobao.org/concat-stream/download/concat-stream-1.6.2.tgz", + "integrity": "sha1-kEvfGUzTEi/Gdcd/xKw9T/D9GjQ=", + "dev": true, + "requires": { + "buffer-from": "^1.0.0", + "inherits": "^2.0.3", + "readable-stream": "^2.2.2", + "typedarray": "^0.0.6" + } + }, + "connect-history-api-fallback": { + "version": "1.6.0", + "resolved": "https://registry.npm.taobao.org/connect-history-api-fallback/download/connect-history-api-fallback-1.6.0.tgz", + "integrity": "sha1-izIIk1kwjRERFdgcrT/Oq4iPl7w=", + "dev": true + }, + "console-browserify": { + "version": "1.2.0", + "resolved": "https://registry.npm.taobao.org/console-browserify/download/console-browserify-1.2.0.tgz", + "integrity": "sha1-ZwY871fOts9Jk6KrOlWECujEkzY=", + "dev": true + }, + "consolidate": { + "version": "0.15.1", + "resolved": "https://registry.npm.taobao.org/consolidate/download/consolidate-0.15.1.tgz", + "integrity": "sha1-IasEMjXHGgfUXZqtmFk7DbpWurc=", + "dev": true, + "requires": { + "bluebird": "^3.1.1" + } + }, + "constants-browserify": { + "version": "1.0.0", + "resolved": "https://registry.npm.taobao.org/constants-browserify/download/constants-browserify-1.0.0.tgz", + "integrity": "sha1-wguW2MYXdIqvHBYCF2DNJ/y4y3U=", + "dev": true + }, + "content-disposition": { + "version": "0.5.3", + "resolved": "https://registry.npm.taobao.org/content-disposition/download/content-disposition-0.5.3.tgz", + "integrity": "sha1-4TDK9+cnkIfFYWwgB9BIVpiYT70=", + "dev": true, + "requires": { + "safe-buffer": "5.1.2" + } + }, + "content-type": { + "version": "1.0.4", + "resolved": "https://registry.npm.taobao.org/content-type/download/content-type-1.0.4.tgz", + "integrity": "sha1-4TjMdeBAxyexlm/l5fjJruJW/js=", + "dev": true + }, + "convert-source-map": { + "version": "1.7.0", + "resolved": "https://registry.npm.taobao.org/convert-source-map/download/convert-source-map-1.7.0.tgz", + "integrity": "sha1-F6LLiC1/d9NJBYXizmxSRCSjpEI=", + "dev": true, + "requires": { + "safe-buffer": "~5.1.1" + } + }, + "cookie": { + "version": "0.4.0", + "resolved": "https://registry.npm.taobao.org/cookie/download/cookie-0.4.0.tgz", + "integrity": "sha1-vrQ35wIrO21JAZ0IhmUwPr6cFLo=", + "dev": true + }, + "cookie-signature": { + "version": "1.0.6", + "resolved": "https://registry.npm.taobao.org/cookie-signature/download/cookie-signature-1.0.6.tgz", + "integrity": "sha1-4wOogrNCzD7oylE6eZmXNNqzriw=", + "dev": true + }, + "copy-concurrently": { + "version": "1.0.5", + "resolved": "https://registry.npm.taobao.org/copy-concurrently/download/copy-concurrently-1.0.5.tgz", + "integrity": "sha1-kilzmMrjSTf8r9bsgTnBgFHwteA=", + "dev": true, + "requires": { + "aproba": "^1.1.1", + "fs-write-stream-atomic": "^1.0.8", + "iferr": "^0.1.5", + "mkdirp": "^0.5.1", + "rimraf": "^2.5.4", + "run-queue": "^1.0.0" + } + }, + "copy-descriptor": { + "version": "0.1.1", + "resolved": "https://registry.npm.taobao.org/copy-descriptor/download/copy-descriptor-0.1.1.tgz", + "integrity": "sha1-Z29us8OZl8LuGsOpJP1hJHSPV40=", + "dev": true + }, + "copy-webpack-plugin": { + "version": "5.1.1", + "resolved": "https://registry.npm.taobao.org/copy-webpack-plugin/download/copy-webpack-plugin-5.1.1.tgz", + "integrity": "sha1-VIGgPeoRI9iKmIxv+LeCRyFPC4g=", + "dev": true, + "requires": { + "cacache": "^12.0.3", + "find-cache-dir": "^2.1.0", + "glob-parent": "^3.1.0", + "globby": "^7.1.1", + "is-glob": "^4.0.1", + "loader-utils": "^1.2.3", + "minimatch": "^3.0.4", + "normalize-path": "^3.0.0", + "p-limit": "^2.2.1", + "schema-utils": "^1.0.0", + "serialize-javascript": "^2.1.2", + "webpack-log": "^2.0.0" + }, + "dependencies": { + "globby": { + "version": "7.1.1", + "resolved": "https://registry.npm.taobao.org/globby/download/globby-7.1.1.tgz?cache=0&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fglobby%2Fdownload%2Fglobby-7.1.1.tgz", + "integrity": "sha1-+yzP+UAfhgCUXfral0QMypcrhoA=", + "dev": true, + "requires": { + "array-union": "^1.0.1", + "dir-glob": "^2.0.0", + "glob": "^7.1.2", + "ignore": "^3.3.5", + "pify": "^3.0.0", + "slash": "^1.0.0" + } + }, + "ignore": { + "version": "3.3.10", + "resolved": "https://registry.npm.taobao.org/ignore/download/ignore-3.3.10.tgz", + "integrity": "sha1-Cpf7h2mG6AgcYxFg+PnziRV/AEM=", + "dev": true + }, + "pify": { + "version": "3.0.0", + "resolved": "https://registry.npm.taobao.org/pify/download/pify-3.0.0.tgz?cache=0&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fpify%2Fdownload%2Fpify-3.0.0.tgz", + "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=", + "dev": true + }, + "schema-utils": { + "version": "1.0.0", + "resolved": "https://registry.npm.taobao.org/schema-utils/download/schema-utils-1.0.0.tgz", + "integrity": "sha1-C3mpMgTXtgDUsoUNH2bCo0lRx3A=", + "dev": true, + "requires": { + "ajv": "^6.1.0", + "ajv-errors": "^1.0.0", + "ajv-keywords": "^3.1.0" + } + }, + "slash": { + "version": "1.0.0", + "resolved": "https://registry.npm.taobao.org/slash/download/slash-1.0.0.tgz", + "integrity": "sha1-xB8vbDn8FtHNF61LXYlhFK5HDVU=", + "dev": true + } + } + }, + "core-js": { + "version": "3.6.4", + "resolved": "https://registry.npm.taobao.org/core-js/download/core-js-3.6.4.tgz", + "integrity": "sha1-RAqDU2tFgRS5yyrBWAujd9xHBkc=" + }, + "core-js-compat": { + "version": "3.6.4", + "resolved": "https://registry.npm.taobao.org/core-js-compat/download/core-js-compat-3.6.4.tgz", + "integrity": "sha1-k4R2Vp67bNqA0zm88Zn65PFv/xc=", + "dev": true, + "requires": { + "browserslist": "^4.8.3", + "semver": "7.0.0" + }, + "dependencies": { + "semver": { + "version": "7.0.0", + "resolved": "https://registry.npm.taobao.org/semver/download/semver-7.0.0.tgz", + "integrity": "sha1-XzyjV2HkfgWyBsba/yz4FPAxa44=", + "dev": true + } + } + }, + "core-util-is": { + "version": "1.0.2", + "resolved": "https://registry.npm.taobao.org/core-util-is/download/core-util-is-1.0.2.tgz", + "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=", + "dev": true + }, + "cosmiconfig": { + "version": "5.2.1", + "resolved": "https://registry.npm.taobao.org/cosmiconfig/download/cosmiconfig-5.2.1.tgz", + "integrity": "sha1-BA9yaAnFked6F8CjYmykW08Wixo=", + "dev": true, + "requires": { + "import-fresh": "^2.0.0", + "is-directory": "^0.3.1", + "js-yaml": "^3.13.1", + "parse-json": "^4.0.0" + }, + "dependencies": { + "parse-json": { + "version": "4.0.0", + "resolved": "https://registry.npm.taobao.org/parse-json/download/parse-json-4.0.0.tgz", + "integrity": "sha1-vjX1Qlvh9/bHRxhPmKeIy5lHfuA=", + "dev": true, + "requires": { + "error-ex": "^1.3.1", + "json-parse-better-errors": "^1.0.1" + } + } + } + }, + "crc-32": { + "version": "1.2.0", + "resolved": "https://registry.npm.taobao.org/crc-32/download/crc-32-1.2.0.tgz", + "integrity": "sha1-yy224puIUI4y2d0OwWk+e0Ghggg=", + "requires": { + "exit-on-epipe": "~1.0.1", + "printj": "~1.1.0" + } + }, + "create-ecdh": { + "version": "4.0.3", + "resolved": "https://registry.npm.taobao.org/create-ecdh/download/create-ecdh-4.0.3.tgz", + "integrity": "sha1-yREbbzMEXEaX8UR4f5JUzcd8Rf8=", + "dev": true, + "requires": { + "bn.js": "^4.1.0", + "elliptic": "^6.0.0" + } + }, + "create-hash": { + "version": "1.2.0", + "resolved": "https://registry.npm.taobao.org/create-hash/download/create-hash-1.2.0.tgz", + "integrity": "sha1-iJB4rxGmN1a8+1m9IhmWvjqe8ZY=", + "dev": true, + "requires": { + "cipher-base": "^1.0.1", + "inherits": "^2.0.1", + "md5.js": "^1.3.4", + "ripemd160": "^2.0.1", + "sha.js": "^2.4.0" + } + }, + "create-hmac": { + "version": "1.1.7", + "resolved": "https://registry.npm.taobao.org/create-hmac/download/create-hmac-1.1.7.tgz", + "integrity": "sha1-aRcMeLOrlXFHsriwRXLkfq0iQ/8=", + "dev": true, + "requires": { + "cipher-base": "^1.0.3", + "create-hash": "^1.1.0", + "inherits": "^2.0.1", + "ripemd160": "^2.0.0", + "safe-buffer": "^5.0.1", + "sha.js": "^2.4.8" + } + }, + "cross-spawn": { + "version": "6.0.5", + "resolved": "https://registry.npm.taobao.org/cross-spawn/download/cross-spawn-6.0.5.tgz", + "integrity": "sha1-Sl7Hxk364iw6FBJNus3uhG2Ay8Q=", + "dev": true, + "requires": { + "nice-try": "^1.0.4", + "path-key": "^2.0.1", + "semver": "^5.5.0", + "shebang-command": "^1.2.0", + "which": "^1.2.9" + } + }, + "crypto-browserify": { + "version": "3.12.0", + "resolved": "https://registry.npm.taobao.org/crypto-browserify/download/crypto-browserify-3.12.0.tgz", + "integrity": "sha1-OWz58xN/A+S45TLFj2mCVOAPgOw=", + "dev": true, + "requires": { + "browserify-cipher": "^1.0.0", + "browserify-sign": "^4.0.0", + "create-ecdh": "^4.0.0", + "create-hash": "^1.1.0", + "create-hmac": "^1.1.0", + "diffie-hellman": "^5.0.0", + "inherits": "^2.0.1", + "pbkdf2": "^3.0.3", + "public-encrypt": "^4.0.0", + "randombytes": "^2.0.0", + "randomfill": "^1.0.3" + } + }, + "css-color-names": { + "version": "0.0.4", + "resolved": "https://registry.npm.taobao.org/css-color-names/download/css-color-names-0.0.4.tgz", + "integrity": "sha1-gIrcLnnPhHOAabZGyyDsJ762KeA=", + "dev": true + }, + "css-declaration-sorter": { + "version": "4.0.1", + "resolved": "https://registry.npm.taobao.org/css-declaration-sorter/download/css-declaration-sorter-4.0.1.tgz", + "integrity": "sha1-wZiUD2OnbX42wecQGLABchBUyyI=", + "dev": true, + "requires": { + "postcss": "^7.0.1", + "timsort": "^0.3.0" + } + }, + "css-loader": { + "version": "3.4.2", + "resolved": "https://registry.npm.taobao.org/css-loader/download/css-loader-3.4.2.tgz", + "integrity": "sha1-0/2zNYtD8jO3hQHF7XscbaYTMgI=", + "dev": true, + "requires": { + "camelcase": "^5.3.1", + "cssesc": "^3.0.0", + "icss-utils": "^4.1.1", + "loader-utils": "^1.2.3", + "normalize-path": "^3.0.0", + "postcss": "^7.0.23", + "postcss-modules-extract-imports": "^2.0.0", + "postcss-modules-local-by-default": "^3.0.2", + "postcss-modules-scope": "^2.1.1", + "postcss-modules-values": "^3.0.0", + "postcss-value-parser": "^4.0.2", + "schema-utils": "^2.6.0" + } + }, + "css-select": { + "version": "2.1.0", + "resolved": "https://registry.npm.taobao.org/css-select/download/css-select-2.1.0.tgz?cache=0&sync_timestamp=1573342118933&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fcss-select%2Fdownload%2Fcss-select-2.1.0.tgz", + "integrity": "sha1-ajRlM1ZjWTSoG6ymjQJVQyEF2+8=", + "dev": true, + "requires": { + "boolbase": "^1.0.0", + "css-what": "^3.2.1", + "domutils": "^1.7.0", + "nth-check": "^1.0.2" + } + }, + "css-select-base-adapter": { + "version": "0.1.1", + "resolved": "https://registry.npm.taobao.org/css-select-base-adapter/download/css-select-base-adapter-0.1.1.tgz", + "integrity": "sha1-Oy/0lyzDYquIVhUHqVQIoUMhNdc=", + "dev": true + }, + "css-tree": { + "version": "1.0.0-alpha.37", + "resolved": "https://registry.npm.taobao.org/css-tree/download/css-tree-1.0.0-alpha.37.tgz", + "integrity": "sha1-mL69YsTB2flg7DQM+fdSLjBwmiI=", + "dev": true, + "requires": { + "mdn-data": "2.0.4", + "source-map": "^0.6.1" + }, + "dependencies": { + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npm.taobao.org/source-map/download/source-map-0.6.1.tgz", + "integrity": "sha1-dHIq8y6WFOnCh6jQu95IteLxomM=", + "dev": true + } + } + }, + "css-what": { + "version": "3.2.1", + "resolved": "https://registry.npm.taobao.org/css-what/download/css-what-3.2.1.tgz", + "integrity": "sha1-9KjxJCEGRiG0VnVeNKA6LCLfXaE=", + "dev": true + }, + "cssesc": { + "version": "3.0.0", + "resolved": "https://registry.npm.taobao.org/cssesc/download/cssesc-3.0.0.tgz", + "integrity": "sha1-N3QZGZA7hoVl4cCep0dEXNGJg+4=", + "dev": true + }, + "cssnano": { + "version": "4.1.10", + "resolved": "https://registry.npm.taobao.org/cssnano/download/cssnano-4.1.10.tgz", + "integrity": "sha1-CsQfCxPRPUZUh+ERt3jULaYxuLI=", + "dev": true, + "requires": { + "cosmiconfig": "^5.0.0", + "cssnano-preset-default": "^4.0.7", + "is-resolvable": "^1.0.0", + "postcss": "^7.0.0" + } + }, + "cssnano-preset-default": { + "version": "4.0.7", + "resolved": "https://registry.npm.taobao.org/cssnano-preset-default/download/cssnano-preset-default-4.0.7.tgz", + "integrity": "sha1-UexmLM/KD4izltzZZ5zbkxvhf3Y=", + "dev": true, + "requires": { + "css-declaration-sorter": "^4.0.1", + "cssnano-util-raw-cache": "^4.0.1", + "postcss": "^7.0.0", + "postcss-calc": "^7.0.1", + "postcss-colormin": "^4.0.3", + "postcss-convert-values": "^4.0.1", + "postcss-discard-comments": "^4.0.2", + "postcss-discard-duplicates": "^4.0.2", + "postcss-discard-empty": "^4.0.1", + "postcss-discard-overridden": "^4.0.1", + "postcss-merge-longhand": "^4.0.11", + "postcss-merge-rules": "^4.0.3", + "postcss-minify-font-values": "^4.0.2", + "postcss-minify-gradients": "^4.0.2", + "postcss-minify-params": "^4.0.2", + "postcss-minify-selectors": "^4.0.2", + "postcss-normalize-charset": "^4.0.1", + "postcss-normalize-display-values": "^4.0.2", + "postcss-normalize-positions": "^4.0.2", + "postcss-normalize-repeat-style": "^4.0.2", + "postcss-normalize-string": "^4.0.2", + "postcss-normalize-timing-functions": "^4.0.2", + "postcss-normalize-unicode": "^4.0.1", + "postcss-normalize-url": "^4.0.1", + "postcss-normalize-whitespace": "^4.0.2", + "postcss-ordered-values": "^4.1.2", + "postcss-reduce-initial": "^4.0.3", + "postcss-reduce-transforms": "^4.0.2", + "postcss-svgo": "^4.0.2", + "postcss-unique-selectors": "^4.0.1" + } + }, + "cssnano-util-get-arguments": { + "version": "4.0.0", + "resolved": "https://registry.npm.taobao.org/cssnano-util-get-arguments/download/cssnano-util-get-arguments-4.0.0.tgz", + "integrity": "sha1-7ToIKZ8h11dBsg87gfGU7UnMFQ8=", + "dev": true + }, + "cssnano-util-get-match": { + "version": "4.0.0", + "resolved": "https://registry.npm.taobao.org/cssnano-util-get-match/download/cssnano-util-get-match-4.0.0.tgz", + "integrity": "sha1-wOTKB/U4a7F+xeUiULT1lhNlFW0=", + "dev": true + }, + "cssnano-util-raw-cache": { + "version": "4.0.1", + "resolved": "https://registry.npm.taobao.org/cssnano-util-raw-cache/download/cssnano-util-raw-cache-4.0.1.tgz", + "integrity": "sha1-sm1f1fcqEd/np4RvtMZyYPlr8oI=", + "dev": true, + "requires": { + "postcss": "^7.0.0" + } + }, + "cssnano-util-same-parent": { + "version": "4.0.1", + "resolved": "https://registry.npm.taobao.org/cssnano-util-same-parent/download/cssnano-util-same-parent-4.0.1.tgz", + "integrity": "sha1-V0CC+yhZ0ttDOFWDXZqEVuoYu/M=", + "dev": true + }, + "csso": { + "version": "4.0.3", + "resolved": "https://registry.npm.taobao.org/csso/download/csso-4.0.3.tgz?cache=0&sync_timestamp=1585052282901&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fcsso%2Fdownload%2Fcsso-4.0.3.tgz", + "integrity": "sha1-DZmF3IUsfMKyys+74QeQFNGo6QM=", + "dev": true, + "requires": { + "css-tree": "1.0.0-alpha.39" + }, + "dependencies": { + "css-tree": { + "version": "1.0.0-alpha.39", + "resolved": "https://registry.npm.taobao.org/css-tree/download/css-tree-1.0.0-alpha.39.tgz", + "integrity": "sha1-K/8//huz93bPfu/ZHuXLp3oUnus=", + "dev": true, + "requires": { + "mdn-data": "2.0.6", + "source-map": "^0.6.1" + } + }, + "mdn-data": { + "version": "2.0.6", + "resolved": "https://registry.npm.taobao.org/mdn-data/download/mdn-data-2.0.6.tgz?cache=0&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fmdn-data%2Fdownload%2Fmdn-data-2.0.6.tgz", + "integrity": "sha1-hS3GD8ql2qLoz2yRicRA7T4EKXg=", + "dev": true + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npm.taobao.org/source-map/download/source-map-0.6.1.tgz", + "integrity": "sha1-dHIq8y6WFOnCh6jQu95IteLxomM=", + "dev": true + } + } + }, + "current-script-polyfill": { + "version": "1.0.0", + "resolved": "https://registry.npm.taobao.org/current-script-polyfill/download/current-script-polyfill-1.0.0.tgz", + "integrity": "sha1-8xz35PPiGLBybnOMqSoC00iO9hU=", + "dev": true + }, + "cyclist": { + "version": "1.0.1", + "resolved": "https://registry.npm.taobao.org/cyclist/download/cyclist-1.0.1.tgz", + "integrity": "sha1-WW6WmP0MgOEgOMK4LW6xs1tiJNk=", + "dev": true + }, + "dashdash": { + "version": "1.14.1", + "resolved": "https://registry.npm.taobao.org/dashdash/download/dashdash-1.14.1.tgz", + "integrity": "sha1-hTz6D3y+L+1d4gMmuN1YEDX24vA=", + "dev": true, + "requires": { + "assert-plus": "^1.0.0" + } + }, + "de-indent": { + "version": "1.0.2", + "resolved": "https://registry.npm.taobao.org/de-indent/download/de-indent-1.0.2.tgz", + "integrity": "sha1-sgOOhG3DO6pXlhKNCAS0VbjB4h0=", + "dev": true + }, + "debug": { + "version": "4.1.1", + "resolved": "https://registry.npm.taobao.org/debug/download/debug-4.1.1.tgz", + "integrity": "sha1-O3ImAlUQnGtYnO4FDx1RYTlmR5E=", + "dev": true, + "requires": { + "ms": "^2.1.1" + } + }, + "decamelize": { + "version": "1.2.0", + "resolved": "https://registry.npm.taobao.org/decamelize/download/decamelize-1.2.0.tgz?cache=0&sync_timestamp=1580010393599&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fdecamelize%2Fdownload%2Fdecamelize-1.2.0.tgz", + "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=", + "dev": true + }, + "decode-uri-component": { + "version": "0.2.0", + "resolved": "https://registry.npm.taobao.org/decode-uri-component/download/decode-uri-component-0.2.0.tgz", + "integrity": "sha1-6zkTMzRYd1y4TNGh+uBiEGu4dUU=", + "dev": true + }, + "deep-equal": { + "version": "1.1.1", + "resolved": "https://registry.npm.taobao.org/deep-equal/download/deep-equal-1.1.1.tgz", + "integrity": "sha1-tcmMlCzv+vfLBR4k4UNKJaLmB2o=", + "dev": true, + "requires": { + "is-arguments": "^1.0.4", + "is-date-object": "^1.0.1", + "is-regex": "^1.0.4", + "object-is": "^1.0.1", + "object-keys": "^1.1.1", + "regexp.prototype.flags": "^1.2.0" + } + }, + "deep-is": { + "version": "0.1.3", + "resolved": "https://registry.npm.taobao.org/deep-is/download/deep-is-0.1.3.tgz", + "integrity": "sha1-s2nW+128E+7PUk+RsHD+7cNXzzQ=", + "dev": true + }, + "deepmerge": { + "version": "1.5.2", + "resolved": "https://registry.npm.taobao.org/deepmerge/download/deepmerge-1.5.2.tgz?cache=0&sync_timestamp=1572279720382&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fdeepmerge%2Fdownload%2Fdeepmerge-1.5.2.tgz", + "integrity": "sha1-EEmdhohEza1P7ghC34x/bwyVp1M=" + }, + "default-gateway": { + "version": "5.0.5", + "resolved": "https://registry.npm.taobao.org/default-gateway/download/default-gateway-5.0.5.tgz", + "integrity": "sha1-T9a9XShV05s0zFpZUFSG6ar8mxA=", + "dev": true, + "requires": { + "execa": "^3.3.0" + }, + "dependencies": { + "cross-spawn": { + "version": "7.0.1", + "resolved": "https://registry.npm.taobao.org/cross-spawn/download/cross-spawn-7.0.1.tgz", + "integrity": "sha1-CrVihuD3wk4VPQTMKqAn5DqaXRQ=", + "dev": true, + "requires": { + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" + } + }, + "execa": { + "version": "3.4.0", + "resolved": "https://registry.npm.taobao.org/execa/download/execa-3.4.0.tgz?cache=0&sync_timestamp=1576749001049&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fexeca%2Fdownload%2Fexeca-3.4.0.tgz", + "integrity": "sha1-wI7UVQ72XYWPrCaf/IVyRG8364k=", + "dev": true, + "requires": { + "cross-spawn": "^7.0.0", + "get-stream": "^5.0.0", + "human-signals": "^1.1.1", + "is-stream": "^2.0.0", + "merge-stream": "^2.0.0", + "npm-run-path": "^4.0.0", + "onetime": "^5.1.0", + "p-finally": "^2.0.0", + "signal-exit": "^3.0.2", + "strip-final-newline": "^2.0.0" + } + }, + "get-stream": { + "version": "5.1.0", + "resolved": "https://registry.npm.taobao.org/get-stream/download/get-stream-5.1.0.tgz", + "integrity": "sha1-ASA83JJZf5uQkGfD5lbMH008Tck=", + "dev": true, + "requires": { + "pump": "^3.0.0" + } + }, + "is-stream": { + "version": "2.0.0", + "resolved": "https://registry.npm.taobao.org/is-stream/download/is-stream-2.0.0.tgz", + "integrity": "sha1-venDJoDW+uBBKdasnZIc54FfeOM=", + "dev": true + }, + "mimic-fn": { + "version": "2.1.0", + "resolved": "https://registry.npm.taobao.org/mimic-fn/download/mimic-fn-2.1.0.tgz", + "integrity": "sha1-ftLCzMyvhNP/y3pptXcR/CCDQBs=", + "dev": true + }, + "npm-run-path": { + "version": "4.0.1", + "resolved": "https://registry.npm.taobao.org/npm-run-path/download/npm-run-path-4.0.1.tgz", + "integrity": "sha1-t+zR5e1T2o43pV4cImnguX7XSOo=", + "dev": true, + "requires": { + "path-key": "^3.0.0" + } + }, + "onetime": { + "version": "5.1.0", + "resolved": "https://registry.npm.taobao.org/onetime/download/onetime-5.1.0.tgz", + "integrity": "sha1-//DzyRYX/mK7UBiWNumayKbfe+U=", + "dev": true, + "requires": { + "mimic-fn": "^2.1.0" + } + }, + "p-finally": { + "version": "2.0.1", + "resolved": "https://registry.npm.taobao.org/p-finally/download/p-finally-2.0.1.tgz", + "integrity": "sha1-vW/KqcVZoJa2gIBvTWV7Pw8kBWE=", + "dev": true + }, + "path-key": { + "version": "3.1.1", + "resolved": "https://registry.npm.taobao.org/path-key/download/path-key-3.1.1.tgz", + "integrity": "sha1-WB9q3mWMu6ZaDTOA3ndTKVBU83U=", + "dev": true + }, + "shebang-command": { + "version": "2.0.0", + "resolved": "https://registry.npm.taobao.org/shebang-command/download/shebang-command-2.0.0.tgz", + "integrity": "sha1-zNCvT4g1+9wmW4JGGq8MNmY/NOo=", + "dev": true, + "requires": { + "shebang-regex": "^3.0.0" + } + }, + "shebang-regex": { + "version": "3.0.0", + "resolved": "https://registry.npm.taobao.org/shebang-regex/download/shebang-regex-3.0.0.tgz", + "integrity": "sha1-rhbxZE2HPsrYQ7AwexQzYtTEIXI=", + "dev": true + }, + "which": { + "version": "2.0.2", + "resolved": "https://registry.npm.taobao.org/which/download/which-2.0.2.tgz?cache=0&sync_timestamp=1574116262707&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fwhich%2Fdownload%2Fwhich-2.0.2.tgz", + "integrity": "sha1-fGqN0KY2oDJ+ELWckobu6T8/UbE=", + "dev": true, + "requires": { + "isexe": "^2.0.0" + } + } + } + }, + "defaults": { + "version": "1.0.3", + "resolved": "https://registry.npm.taobao.org/defaults/download/defaults-1.0.3.tgz", + "integrity": "sha1-xlYFHpgX2f8I7YgUd/P+QBnz730=", + "dev": true, + "requires": { + "clone": "^1.0.2" + } + }, + "define-properties": { + "version": "1.1.3", + "resolved": "https://registry.npm.taobao.org/define-properties/download/define-properties-1.1.3.tgz", + "integrity": "sha1-z4jabL7ib+bbcJT2HYcMvYTO6fE=", + "dev": true, + "requires": { + "object-keys": "^1.0.12" + } + }, + "define-property": { + "version": "2.0.2", + "resolved": "https://registry.npm.taobao.org/define-property/download/define-property-2.0.2.tgz", + "integrity": "sha1-1Flono1lS6d+AqgX+HENcCyxbp0=", + "dev": true, + "requires": { + "is-descriptor": "^1.0.2", + "isobject": "^3.0.1" + }, + "dependencies": { + "is-accessor-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npm.taobao.org/is-accessor-descriptor/download/is-accessor-descriptor-1.0.0.tgz", + "integrity": "sha1-FpwvbT3x+ZJhgHI2XJsOofaHhlY=", + "dev": true, + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-data-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npm.taobao.org/is-data-descriptor/download/is-data-descriptor-1.0.0.tgz", + "integrity": "sha1-2Eh2Mh0Oet0DmQQGq7u9NrqSaMc=", + "dev": true, + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-descriptor": { + "version": "1.0.2", + "resolved": "https://registry.npm.taobao.org/is-descriptor/download/is-descriptor-1.0.2.tgz", + "integrity": "sha1-OxWXRqZmBLBPjIFSS6NlxfFNhuw=", + "dev": true, + "requires": { + "is-accessor-descriptor": "^1.0.0", + "is-data-descriptor": "^1.0.0", + "kind-of": "^6.0.2" + } + } + } + }, + "del": { + "version": "4.1.1", + "resolved": "https://registry.npm.taobao.org/del/download/del-4.1.1.tgz", + "integrity": "sha1-no8RciLqRKMf86FWwEm5kFKp8LQ=", + "dev": true, + "requires": { + "@types/glob": "^7.1.1", + "globby": "^6.1.0", + "is-path-cwd": "^2.0.0", + "is-path-in-cwd": "^2.0.0", + "p-map": "^2.0.0", + "pify": "^4.0.1", + "rimraf": "^2.6.3" + }, + "dependencies": { + "globby": { + "version": "6.1.0", + "resolved": "https://registry.npm.taobao.org/globby/download/globby-6.1.0.tgz?cache=0&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fglobby%2Fdownload%2Fglobby-6.1.0.tgz", + "integrity": "sha1-9abXDoOV4hyFj7BInWTfAkJNUGw=", + "dev": true, + "requires": { + "array-union": "^1.0.1", + "glob": "^7.0.3", + "object-assign": "^4.0.1", + "pify": "^2.0.0", + "pinkie-promise": "^2.0.0" + }, + "dependencies": { + "pify": { + "version": "2.3.0", + "resolved": "https://registry.npm.taobao.org/pify/download/pify-2.3.0.tgz?cache=0&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fpify%2Fdownload%2Fpify-2.3.0.tgz", + "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=", + "dev": true + } + } + }, + "p-map": { + "version": "2.1.0", + "resolved": "https://registry.npm.taobao.org/p-map/download/p-map-2.1.0.tgz", + "integrity": "sha1-MQko/u+cnsxltosXaTAYpmXOoXU=", + "dev": true + } + } + }, + "delayed-stream": { + "version": "1.0.0", + "resolved": "https://registry.npm.taobao.org/delayed-stream/download/delayed-stream-1.0.0.tgz", + "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk=", + "dev": true + }, + "depd": { + "version": "1.1.2", + "resolved": "https://registry.npm.taobao.org/depd/download/depd-1.1.2.tgz", + "integrity": "sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak=", + "dev": true + }, + "des.js": { + "version": "1.0.1", + "resolved": "https://registry.npm.taobao.org/des.js/download/des.js-1.0.1.tgz", + "integrity": "sha1-U4IULhvcU/hdhtU+X0qn3rkeCEM=", + "dev": true, + "requires": { + "inherits": "^2.0.1", + "minimalistic-assert": "^1.0.0" + } + }, + "destroy": { + "version": "1.0.4", + "resolved": "https://registry.npm.taobao.org/destroy/download/destroy-1.0.4.tgz", + "integrity": "sha1-l4hXRCxEdJ5CBmE+N5RiBYJqvYA=", + "dev": true + }, + "detect-node": { + "version": "2.0.4", + "resolved": "https://registry.npm.taobao.org/detect-node/download/detect-node-2.0.4.tgz", + "integrity": "sha1-AU7o+PZpxcWAI9pkuBecCDooxGw=", + "dev": true + }, + "diffie-hellman": { + "version": "5.0.3", + "resolved": "https://registry.npm.taobao.org/diffie-hellman/download/diffie-hellman-5.0.3.tgz", + "integrity": "sha1-QOjumPVaIUlgcUaSHGPhrl89KHU=", + "dev": true, + "requires": { + "bn.js": "^4.1.0", + "miller-rabin": "^4.0.0", + "randombytes": "^2.0.0" + } + }, + "dir-glob": { + "version": "2.2.2", + "resolved": "https://registry.npm.taobao.org/dir-glob/download/dir-glob-2.2.2.tgz", + "integrity": "sha1-+gnwaUFTyJGLGLoN6vrpR2n8UMQ=", + "dev": true, + "requires": { + "path-type": "^3.0.0" + } + }, + "dns-equal": { + "version": "1.0.0", + "resolved": "https://registry.npm.taobao.org/dns-equal/download/dns-equal-1.0.0.tgz", + "integrity": "sha1-s55/HabrCnW6nBcySzR1PEfgZU0=", + "dev": true + }, + "dns-packet": { + "version": "1.3.1", + "resolved": "https://registry.npm.taobao.org/dns-packet/download/dns-packet-1.3.1.tgz", + "integrity": "sha1-EqpCaYEHW+UAuRDu3NC0fdfe2lo=", + "dev": true, + "requires": { + "ip": "^1.1.0", + "safe-buffer": "^5.0.1" + } + }, + "dns-txt": { + "version": "2.0.2", + "resolved": "https://registry.npm.taobao.org/dns-txt/download/dns-txt-2.0.2.tgz", + "integrity": "sha1-uR2Ab10nGI5Ks+fRB9iBocxGQrY=", + "dev": true, + "requires": { + "buffer-indexof": "^1.0.0" + } + }, + "doctrine": { + "version": "3.0.0", + "resolved": "https://registry.npm.taobao.org/doctrine/download/doctrine-3.0.0.tgz", + "integrity": "sha1-rd6+rXKmV023g2OdyHoSF3OXOWE=", + "dev": true, + "requires": { + "esutils": "^2.0.2" + } + }, + "dom-converter": { + "version": "0.2.0", + "resolved": "https://registry.npm.taobao.org/dom-converter/download/dom-converter-0.2.0.tgz", + "integrity": "sha1-ZyGp2u4uKTaClVtq/kFncWJ7t2g=", + "dev": true, + "requires": { + "utila": "~0.4" + } + }, + "dom-serializer": { + "version": "0.2.2", + "resolved": "https://registry.npm.taobao.org/dom-serializer/download/dom-serializer-0.2.2.tgz", + "integrity": "sha1-GvuB9TNxcXXUeGVd68XjMtn5u1E=", + "dev": true, + "requires": { + "domelementtype": "^2.0.1", + "entities": "^2.0.0" + }, + "dependencies": { + "domelementtype": { + "version": "2.0.1", + "resolved": "https://registry.npm.taobao.org/domelementtype/download/domelementtype-2.0.1.tgz", + "integrity": "sha1-H4vf6R9aeAYydOgDtL3O326U+U0=", + "dev": true + } + } + }, + "domain-browser": { + "version": "1.2.0", + "resolved": "https://registry.npm.taobao.org/domain-browser/download/domain-browser-1.2.0.tgz", + "integrity": "sha1-PTH1AZGmdJ3RN1p/Ui6CPULlTto=", + "dev": true + }, + "domelementtype": { + "version": "1.3.1", + "resolved": "https://registry.npm.taobao.org/domelementtype/download/domelementtype-1.3.1.tgz", + "integrity": "sha1-0EjESzew0Qp/Kj1f7j9DM9eQSB8=", + "dev": true + }, + "domhandler": { + "version": "2.4.2", + "resolved": "https://registry.npm.taobao.org/domhandler/download/domhandler-2.4.2.tgz", + "integrity": "sha1-iAUJfpM9ZehVRvcm1g9euItE+AM=", + "dev": true, + "requires": { + "domelementtype": "1" + } + }, + "domutils": { + "version": "1.7.0", + "resolved": "https://registry.npm.taobao.org/domutils/download/domutils-1.7.0.tgz", + "integrity": "sha1-Vuo0HoNOBuZ0ivehyyXaZ+qfjCo=", + "dev": true, + "requires": { + "dom-serializer": "0", + "domelementtype": "1" + } + }, + "dot-prop": { + "version": "5.2.0", + "resolved": "https://registry.npm.taobao.org/dot-prop/download/dot-prop-5.2.0.tgz?cache=0&sync_timestamp=1572620767955&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fdot-prop%2Fdownload%2Fdot-prop-5.2.0.tgz", + "integrity": "sha1-w07MKVVtxF8fTCJpe29JBODMT8s=", + "dev": true, + "requires": { + "is-obj": "^2.0.0" + } + }, + "dotenv": { + "version": "8.2.0", + "resolved": "https://registry.npm.taobao.org/dotenv/download/dotenv-8.2.0.tgz?cache=0&sync_timestamp=1571190782798&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fdotenv%2Fdownload%2Fdotenv-8.2.0.tgz", + "integrity": "sha1-l+YZJZradQ7qPk6j4mvO6lQksWo=", + "dev": true + }, + "dotenv-expand": { + "version": "5.1.0", + "resolved": "https://registry.npm.taobao.org/dotenv-expand/download/dotenv-expand-5.1.0.tgz", + "integrity": "sha1-P7rwIL/XlIhAcuomsel5HUWmKfA=", + "dev": true + }, + "duplexer": { + "version": "0.1.1", + "resolved": "https://registry.npm.taobao.org/duplexer/download/duplexer-0.1.1.tgz", + "integrity": "sha1-rOb/gIwc5mtX0ev5eXessCM0z8E=", + "dev": true + }, + "duplexify": { + "version": "3.7.1", + "resolved": "https://registry.npm.taobao.org/duplexify/download/duplexify-3.7.1.tgz", + "integrity": "sha1-Kk31MX9sz9kfhtb9JdjYoQO4gwk=", + "dev": true, + "requires": { + "end-of-stream": "^1.0.0", + "inherits": "^2.0.1", + "readable-stream": "^2.0.0", + "stream-shift": "^1.0.0" + } + }, + "easy-stack": { + "version": "1.0.0", + "resolved": "https://registry.npm.taobao.org/easy-stack/download/easy-stack-1.0.0.tgz", + "integrity": "sha1-EskbMIWjfwuqM26UhurEv5Tj54g=", + "dev": true + }, + "ecc-jsbn": { + "version": "0.1.2", + "resolved": "https://registry.npm.taobao.org/ecc-jsbn/download/ecc-jsbn-0.1.2.tgz", + "integrity": "sha1-OoOpBOVDUyh4dMVkt1SThoSamMk=", + "dev": true, + "requires": { + "jsbn": "~0.1.0", + "safer-buffer": "^2.1.0" + } + }, + "echarts": { + "version": "4.9.0", + "resolved": "https://registry.npm.taobao.org/echarts/download/echarts-4.9.0.tgz", + "integrity": "sha1-qbm6oD8Doqcx5jQMVb77V6nhNH0=", + "requires": { + "zrender": "4.3.2" + } + }, + "ee-first": { + "version": "1.1.1", + "resolved": "https://registry.npm.taobao.org/ee-first/download/ee-first-1.1.1.tgz", + "integrity": "sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0=", + "dev": true + }, + "ejs": { + "version": "2.7.4", + "resolved": "https://registry.npm.taobao.org/ejs/download/ejs-2.7.4.tgz?cache=0&sync_timestamp=1574560231725&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fejs%2Fdownload%2Fejs-2.7.4.tgz", + "integrity": "sha1-SGYSh1c9zFPjZsehrlLDoSDuybo=", + "dev": true + }, + "electron-to-chromium": { + "version": "1.3.384", + "resolved": "https://registry.npm.taobao.org/electron-to-chromium/download/electron-to-chromium-1.3.384.tgz?cache=0&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Felectron-to-chromium%2Fdownload%2Felectron-to-chromium-1.3.384.tgz", + "integrity": "sha1-yh1XEKTFMWhDHxy+85yKlxtka/g=", + "dev": true + }, + "element-ui": { + "version": "2.13.0", + "resolved": "https://registry.npm.taobao.org/element-ui/download/element-ui-2.13.0.tgz", + "integrity": "sha1-9rsE5bCnbqX2JGYES3dEB7pOvS0=", + "requires": { + "async-validator": "~1.8.1", + "babel-helper-vue-jsx-merge-props": "^2.0.0", + "deepmerge": "^1.2.0", + "normalize-wheel": "^1.0.1", + "resize-observer-polyfill": "^1.5.0", + "throttle-debounce": "^1.0.1" + } + }, + "elliptic": { + "version": "6.5.2", + "resolved": "https://registry.npm.taobao.org/elliptic/download/elliptic-6.5.2.tgz", + "integrity": "sha1-BcVnjXFzwEnYykM1UiJKSV0ON2I=", + "dev": true, + "requires": { + "bn.js": "^4.4.0", + "brorand": "^1.0.1", + "hash.js": "^1.0.0", + "hmac-drbg": "^1.0.0", + "inherits": "^2.0.1", + "minimalistic-assert": "^1.0.0", + "minimalistic-crypto-utils": "^1.0.0" + } + }, + "emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npm.taobao.org/emoji-regex/download/emoji-regex-8.0.0.tgz", + "integrity": "sha1-6Bj9ac5cz8tARZT4QpY79TFkzDc=", + "dev": true + }, + "emojis-list": { + "version": "3.0.0", + "resolved": "https://registry.npm.taobao.org/emojis-list/download/emojis-list-3.0.0.tgz", + "integrity": "sha1-VXBmIEatKeLpFucariYKvf9Pang=", + "dev": true + }, + "encodeurl": { + "version": "1.0.2", + "resolved": "https://registry.npm.taobao.org/encodeurl/download/encodeurl-1.0.2.tgz", + "integrity": "sha1-rT/0yG7C0CkyL1oCw6mmBslbP1k=", + "dev": true + }, + "end-of-stream": { + "version": "1.4.4", + "resolved": "https://registry.npm.taobao.org/end-of-stream/download/end-of-stream-1.4.4.tgz", + "integrity": "sha1-WuZKX0UFe682JuwU2gyl5LJDHrA=", + "dev": true, + "requires": { + "once": "^1.4.0" + } + }, + "enhanced-resolve": { + "version": "4.1.1", + "resolved": "https://registry.npm.taobao.org/enhanced-resolve/download/enhanced-resolve-4.1.1.tgz?cache=0&sync_timestamp=1572991764265&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fenhanced-resolve%2Fdownload%2Fenhanced-resolve-4.1.1.tgz", + "integrity": "sha1-KTfiuAZs0P584JkKmPDXGjUYn2Y=", + "dev": true, + "requires": { + "graceful-fs": "^4.1.2", + "memory-fs": "^0.5.0", + "tapable": "^1.0.0" + }, + "dependencies": { + "memory-fs": { + "version": "0.5.0", + "resolved": "https://registry.npm.taobao.org/memory-fs/download/memory-fs-0.5.0.tgz", + "integrity": "sha1-MkwBKIuIZSlm0WHbd4OHIIRajjw=", + "dev": true, + "requires": { + "errno": "^0.1.3", + "readable-stream": "^2.0.1" + } + } + } + }, + "entities": { + "version": "2.0.0", + "resolved": "https://registry.npm.taobao.org/entities/download/entities-2.0.0.tgz?cache=0&sync_timestamp=1563403318326&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fentities%2Fdownload%2Fentities-2.0.0.tgz", + "integrity": "sha1-aNYITKsbB5dnVA2A5Wo5tCPkq/Q=", + "dev": true + }, + "errno": { + "version": "0.1.7", + "resolved": "https://registry.npm.taobao.org/errno/download/errno-0.1.7.tgz", + "integrity": "sha1-RoTXF3mtOa8Xfj8AeZb3xnyFJhg=", + "dev": true, + "requires": { + "prr": "~1.0.1" + } + }, + "error-ex": { + "version": "1.3.2", + "resolved": "https://registry.npm.taobao.org/error-ex/download/error-ex-1.3.2.tgz", + "integrity": "sha1-tKxAZIEH/c3PriQvQovqihTU8b8=", + "dev": true, + "requires": { + "is-arrayish": "^0.2.1" + } + }, + "error-stack-parser": { + "version": "2.0.6", + "resolved": "https://registry.npm.taobao.org/error-stack-parser/download/error-stack-parser-2.0.6.tgz", + "integrity": "sha1-WpmnB716TFinl5AtSNgoA+3mqtg=", + "dev": true, + "requires": { + "stackframe": "^1.1.1" + } + }, + "es-abstract": { + "version": "1.17.5", + "resolved": "https://registry.npm.taobao.org/es-abstract/download/es-abstract-1.17.5.tgz", + "integrity": "sha1-2MnR1myJgfuSAOIlHXme7pJ3Suk=", + "dev": true, + "requires": { + "es-to-primitive": "^1.2.1", + "function-bind": "^1.1.1", + "has": "^1.0.3", + "has-symbols": "^1.0.1", + "is-callable": "^1.1.5", + "is-regex": "^1.0.5", + "object-inspect": "^1.7.0", + "object-keys": "^1.1.1", + "object.assign": "^4.1.0", + "string.prototype.trimleft": "^2.1.1", + "string.prototype.trimright": "^2.1.1" + } + }, + "es-to-primitive": { + "version": "1.2.1", + "resolved": "https://registry.npm.taobao.org/es-to-primitive/download/es-to-primitive-1.2.1.tgz", + "integrity": "sha1-5VzUyc3BiLzvsDs2bHNjI/xciYo=", + "dev": true, + "requires": { + "is-callable": "^1.1.4", + "is-date-object": "^1.0.1", + "is-symbol": "^1.0.2" + } + }, + "escape-html": { + "version": "1.0.3", + "resolved": "https://registry.npm.taobao.org/escape-html/download/escape-html-1.0.3.tgz", + "integrity": "sha1-Aljq5NPQwJdN4cFpGI7wBR0dGYg=", + "dev": true + }, + "escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npm.taobao.org/escape-string-regexp/download/escape-string-regexp-1.0.5.tgz", + "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=", + "dev": true + }, + "eslint": { + "version": "6.8.0", + "resolved": "https://registry.npm.taobao.org/eslint/download/eslint-6.8.0.tgz", + "integrity": "sha1-YiYtZylzn5J1cjgkMC+yJ8jJP/s=", + "dev": true, + "requires": { + "@babel/code-frame": "^7.0.0", + "ajv": "^6.10.0", + "chalk": "^2.1.0", + "cross-spawn": "^6.0.5", + "debug": "^4.0.1", + "doctrine": "^3.0.0", + "eslint-scope": "^5.0.0", + "eslint-utils": "^1.4.3", + "eslint-visitor-keys": "^1.1.0", + "espree": "^6.1.2", + "esquery": "^1.0.1", + "esutils": "^2.0.2", + "file-entry-cache": "^5.0.1", + "functional-red-black-tree": "^1.0.1", + "glob-parent": "^5.0.0", + "globals": "^12.1.0", + "ignore": "^4.0.6", + "import-fresh": "^3.0.0", + "imurmurhash": "^0.1.4", + "inquirer": "^7.0.0", + "is-glob": "^4.0.0", + "js-yaml": "^3.13.1", + "json-stable-stringify-without-jsonify": "^1.0.1", + "levn": "^0.3.0", + "lodash": "^4.17.14", + "minimatch": "^3.0.4", + "mkdirp": "^0.5.1", + "natural-compare": "^1.4.0", + "optionator": "^0.8.3", + "progress": "^2.0.0", + "regexpp": "^2.0.1", + "semver": "^6.1.2", + "strip-ansi": "^5.2.0", + "strip-json-comments": "^3.0.1", + "table": "^5.2.3", + "text-table": "^0.2.0", + "v8-compile-cache": "^2.0.3" + }, + "dependencies": { + "ansi-escapes": { + "version": "4.3.1", + "resolved": "https://registry.npm.taobao.org/ansi-escapes/download/ansi-escapes-4.3.1.tgz?cache=0&sync_timestamp=1583072845985&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fansi-escapes%2Fdownload%2Fansi-escapes-4.3.1.tgz", + "integrity": "sha1-pcR8xDGB8fOP/XB2g3cA05VSKmE=", + "dev": true, + "requires": { + "type-fest": "^0.11.0" + }, + "dependencies": { + "type-fest": { + "version": "0.11.0", + "resolved": "https://registry.npm.taobao.org/type-fest/download/type-fest-0.11.0.tgz", + "integrity": "sha1-l6vwhyMQ/tiKXEZrJWgVdhReM/E=", + "dev": true + } + } + }, + "ansi-regex": { + "version": "5.0.0", + "resolved": "https://registry.npm.taobao.org/ansi-regex/download/ansi-regex-5.0.0.tgz", + "integrity": "sha1-OIU59VF5vzkznIGvMKZU1p+Hy3U=", + "dev": true + }, + "ansi-styles": { + "version": "4.2.1", + "resolved": "https://registry.npm.taobao.org/ansi-styles/download/ansi-styles-4.2.1.tgz", + "integrity": "sha1-kK51xCTQCNJiTFvynq0xd+v881k=", + "dev": true, + "requires": { + "@types/color-name": "^1.1.1", + "color-convert": "^2.0.1" + } + }, + "cli-cursor": { + "version": "3.1.0", + "resolved": "https://registry.npm.taobao.org/cli-cursor/download/cli-cursor-3.1.0.tgz", + "integrity": "sha1-JkMFp65JDR0Dvwybp8kl0XU68wc=", + "dev": true, + "requires": { + "restore-cursor": "^3.1.0" + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npm.taobao.org/color-convert/download/color-convert-2.0.1.tgz", + "integrity": "sha1-ctOmjVmMm9s68q0ehPIdiWq9TeM=", + "dev": true, + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npm.taobao.org/color-name/download/color-name-1.1.4.tgz", + "integrity": "sha1-wqCah6y95pVD3m9j+jmVyCbFNqI=", + "dev": true + }, + "eslint-scope": { + "version": "5.0.0", + "resolved": "https://registry.npm.taobao.org/eslint-scope/download/eslint-scope-5.0.0.tgz", + "integrity": "sha1-6HyIh8c+jR7ITxylkWRcNYv8j7k=", + "dev": true, + "requires": { + "esrecurse": "^4.1.0", + "estraverse": "^4.1.1" + } + }, + "figures": { + "version": "3.2.0", + "resolved": "https://registry.npm.taobao.org/figures/download/figures-3.2.0.tgz", + "integrity": "sha1-YlwYvSk8YE3EqN2y/r8MiDQXRq8=", + "dev": true, + "requires": { + "escape-string-regexp": "^1.0.5" + } + }, + "glob-parent": { + "version": "5.1.1", + "resolved": "https://registry.npm.taobao.org/glob-parent/download/glob-parent-5.1.1.tgz", + "integrity": "sha1-tsHvQXxOVmPqSY8cRa+saRa7wik=", + "dev": true, + "requires": { + "is-glob": "^4.0.1" + } + }, + "globals": { + "version": "12.4.0", + "resolved": "https://registry.npm.taobao.org/globals/download/globals-12.4.0.tgz", + "integrity": "sha1-oYgTV2pBsAokqX5/gVkYwuGZJfg=", + "dev": true, + "requires": { + "type-fest": "^0.8.1" + } + }, + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npm.taobao.org/has-flag/download/has-flag-4.0.0.tgz", + "integrity": "sha1-lEdx/ZyByBJlxNaUGGDaBrtZR5s=", + "dev": true + }, + "import-fresh": { + "version": "3.2.1", + "resolved": "https://registry.npm.taobao.org/import-fresh/download/import-fresh-3.2.1.tgz", + "integrity": "sha1-Yz/2GFBueTr1rJG/SLcmd+FcvmY=", + "dev": true, + "requires": { + "parent-module": "^1.0.0", + "resolve-from": "^4.0.0" + } + }, + "inquirer": { + "version": "7.1.0", + "resolved": "https://registry.npm.taobao.org/inquirer/download/inquirer-7.1.0.tgz?cache=0&sync_timestamp=1583819732252&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Finquirer%2Fdownload%2Finquirer-7.1.0.tgz", + "integrity": "sha1-EpigGFmIPhfHJkuChwrhA0+S3Sk=", + "dev": true, + "requires": { + "ansi-escapes": "^4.2.1", + "chalk": "^3.0.0", + "cli-cursor": "^3.1.0", + "cli-width": "^2.0.0", + "external-editor": "^3.0.3", + "figures": "^3.0.0", + "lodash": "^4.17.15", + "mute-stream": "0.0.8", + "run-async": "^2.4.0", + "rxjs": "^6.5.3", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0", + "through": "^2.3.6" + }, + "dependencies": { + "chalk": { + "version": "3.0.0", + "resolved": "https://registry.npm.taobao.org/chalk/download/chalk-3.0.0.tgz", + "integrity": "sha1-P3PCv1JlkfV0zEksUeJFY0n4ROQ=", + "dev": true, + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "strip-ansi": { + "version": "6.0.0", + "resolved": "https://registry.npm.taobao.org/strip-ansi/download/strip-ansi-6.0.0.tgz", + "integrity": "sha1-CxVx3XZpzNTz4G4U7x7tJiJa5TI=", + "dev": true, + "requires": { + "ansi-regex": "^5.0.0" + } + } + } + }, + "is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npm.taobao.org/is-fullwidth-code-point/download/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha1-8Rb4Bk/pCz94RKOJl8C3UFEmnx0=", + "dev": true + }, + "mimic-fn": { + "version": "2.1.0", + "resolved": "https://registry.npm.taobao.org/mimic-fn/download/mimic-fn-2.1.0.tgz", + "integrity": "sha1-ftLCzMyvhNP/y3pptXcR/CCDQBs=", + "dev": true + }, + "mute-stream": { + "version": "0.0.8", + "resolved": "https://registry.npm.taobao.org/mute-stream/download/mute-stream-0.0.8.tgz", + "integrity": "sha1-FjDEKyJR/4HiooPelqVJfqkuXg0=", + "dev": true + }, + "onetime": { + "version": "5.1.0", + "resolved": "https://registry.npm.taobao.org/onetime/download/onetime-5.1.0.tgz", + "integrity": "sha1-//DzyRYX/mK7UBiWNumayKbfe+U=", + "dev": true, + "requires": { + "mimic-fn": "^2.1.0" + } + }, + "resolve-from": { + "version": "4.0.0", + "resolved": "https://registry.npm.taobao.org/resolve-from/download/resolve-from-4.0.0.tgz", + "integrity": "sha1-SrzYUq0y3Xuqv+m0DgCjbbXzkuY=", + "dev": true + }, + "restore-cursor": { + "version": "3.1.0", + "resolved": "https://registry.npm.taobao.org/restore-cursor/download/restore-cursor-3.1.0.tgz", + "integrity": "sha1-OfZ8VLOnpYzqUjbZXPADQjljH34=", + "dev": true, + "requires": { + "onetime": "^5.1.0", + "signal-exit": "^3.0.2" + } + }, + "semver": { + "version": "6.3.0", + "resolved": "https://registry.npm.taobao.org/semver/download/semver-6.3.0.tgz", + "integrity": "sha1-7gpkyK9ejO6mdoexM3YeG+y9HT0=", + "dev": true + }, + "string-width": { + "version": "4.2.0", + "resolved": "https://registry.npm.taobao.org/string-width/download/string-width-4.2.0.tgz", + "integrity": "sha1-lSGCxGzHssMT0VluYjmSvRY7crU=", + "dev": true, + "requires": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.0" + }, + "dependencies": { + "strip-ansi": { + "version": "6.0.0", + "resolved": "https://registry.npm.taobao.org/strip-ansi/download/strip-ansi-6.0.0.tgz", + "integrity": "sha1-CxVx3XZpzNTz4G4U7x7tJiJa5TI=", + "dev": true, + "requires": { + "ansi-regex": "^5.0.0" + } + } + } + }, + "strip-ansi": { + "version": "5.2.0", + "resolved": "https://registry.npm.taobao.org/strip-ansi/download/strip-ansi-5.2.0.tgz", + "integrity": "sha1-jJpTb+tq/JYr36WxBKUJHBrZwK4=", + "dev": true, + "requires": { + "ansi-regex": "^4.1.0" + }, + "dependencies": { + "ansi-regex": { + "version": "4.1.0", + "resolved": "https://registry.npm.taobao.org/ansi-regex/download/ansi-regex-4.1.0.tgz", + "integrity": "sha1-i5+PCM8ay4Q3Vqg5yox+MWjFGZc=", + "dev": true + } + } + }, + "supports-color": { + "version": "7.1.0", + "resolved": "https://registry.npm.taobao.org/supports-color/download/supports-color-7.1.0.tgz?cache=0&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fsupports-color%2Fdownload%2Fsupports-color-7.1.0.tgz", + "integrity": "sha1-aOMlkd9z4lrRxLSRCKLsUHliv9E=", + "dev": true, + "requires": { + "has-flag": "^4.0.0" + } + }, + "type-fest": { + "version": "0.8.1", + "resolved": "https://registry.npm.taobao.org/type-fest/download/type-fest-0.8.1.tgz", + "integrity": "sha1-CeJJ696FHTseSNJ8EFREZn8XuD0=", + "dev": true + } + } + }, + "eslint-loader": { + "version": "2.2.1", + "resolved": "https://registry.npm.taobao.org/eslint-loader/download/eslint-loader-2.2.1.tgz", + "integrity": "sha1-KLnBLaVAV68IReKmEScBova/gzc=", + "dev": true, + "requires": { + "loader-fs-cache": "^1.0.0", + "loader-utils": "^1.0.2", + "object-assign": "^4.0.1", + "object-hash": "^1.1.4", + "rimraf": "^2.6.1" + } + }, + "eslint-plugin-vue": { + "version": "6.2.2", + "resolved": "https://registry.npm.taobao.org/eslint-plugin-vue/download/eslint-plugin-vue-6.2.2.tgz?cache=0&sync_timestamp=1584178049037&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Feslint-plugin-vue%2Fdownload%2Feslint-plugin-vue-6.2.2.tgz", + "integrity": "sha1-J/7NmjokeJsPER7N1UCp5WGY4P4=", + "dev": true, + "requires": { + "natural-compare": "^1.4.0", + "semver": "^5.6.0", + "vue-eslint-parser": "^7.0.0" + } + }, + "eslint-scope": { + "version": "4.0.3", + "resolved": "https://registry.npm.taobao.org/eslint-scope/download/eslint-scope-4.0.3.tgz", + "integrity": "sha1-ygODMxD2iJoyZHgaqC5j65z+eEg=", + "dev": true, + "requires": { + "esrecurse": "^4.1.0", + "estraverse": "^4.1.1" + } + }, + "eslint-utils": { + "version": "1.4.3", + "resolved": "https://registry.npm.taobao.org/eslint-utils/download/eslint-utils-1.4.3.tgz", + "integrity": "sha1-dP7HxU0Hdrb2fgJRBAtYBlZOmB8=", + "dev": true, + "requires": { + "eslint-visitor-keys": "^1.1.0" + } + }, + "eslint-visitor-keys": { + "version": "1.1.0", + "resolved": "https://registry.npm.taobao.org/eslint-visitor-keys/download/eslint-visitor-keys-1.1.0.tgz?cache=0&sync_timestamp=1565705511122&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Feslint-visitor-keys%2Fdownload%2Feslint-visitor-keys-1.1.0.tgz", + "integrity": "sha1-4qgs6oT/JGrW+1f5veW0ZiFFnsI=", + "dev": true + }, + "espree": { + "version": "6.2.1", + "resolved": "https://registry.npm.taobao.org/espree/download/espree-6.2.1.tgz", + "integrity": "sha1-d/xy4f10SiBSwg84pbV1gy6Cc0o=", + "dev": true, + "requires": { + "acorn": "^7.1.1", + "acorn-jsx": "^5.2.0", + "eslint-visitor-keys": "^1.1.0" + }, + "dependencies": { + "acorn": { + "version": "7.1.1", + "resolved": "https://registry.npm.taobao.org/acorn/download/acorn-7.1.1.tgz?cache=0&sync_timestamp=1583796606796&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Facorn%2Fdownload%2Facorn-7.1.1.tgz", + "integrity": "sha1-41Zo3gtALzWd5RXFSCoaufiaab8=", + "dev": true + } + } + }, + "esprima": { + "version": "4.0.1", + "resolved": "https://registry.npm.taobao.org/esprima/download/esprima-4.0.1.tgz", + "integrity": "sha1-E7BM2z5sXRnfkatph6hpVhmwqnE=", + "dev": true + }, + "esquery": { + "version": "1.2.0", + "resolved": "https://registry.npm.taobao.org/esquery/download/esquery-1.2.0.tgz", + "integrity": "sha1-oBClGcAojyUws0BBJL+18C6Xl/4=", + "dev": true, + "requires": { + "estraverse": "^5.0.0" + }, + "dependencies": { + "estraverse": { + "version": "5.0.0", + "resolved": "https://registry.npm.taobao.org/estraverse/download/estraverse-5.0.0.tgz?cache=0&sync_timestamp=1584934763568&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Festraverse%2Fdownload%2Festraverse-5.0.0.tgz", + "integrity": "sha1-rIF1C0gsEcyibksH6D7Y91+83CI=", + "dev": true + } + } + }, + "esrecurse": { + "version": "4.2.1", + "resolved": "https://registry.npm.taobao.org/esrecurse/download/esrecurse-4.2.1.tgz", + "integrity": "sha1-AHo7n9vCs7uH5IeeoZyS/b05Qs8=", + "dev": true, + "requires": { + "estraverse": "^4.1.0" + } + }, + "estraverse": { + "version": "4.3.0", + "resolved": "https://registry.npm.taobao.org/estraverse/download/estraverse-4.3.0.tgz?cache=0&sync_timestamp=1584934763568&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Festraverse%2Fdownload%2Festraverse-4.3.0.tgz", + "integrity": "sha1-OYrT88WiSUi+dyXoPRGn3ijNvR0=", + "dev": true + }, + "esutils": { + "version": "2.0.3", + "resolved": "https://registry.npm.taobao.org/esutils/download/esutils-2.0.3.tgz", + "integrity": "sha1-dNLrTeC42hKTcRkQ1Qd1ubcQ72Q=", + "dev": true + }, + "etag": { + "version": "1.8.1", + "resolved": "https://registry.npm.taobao.org/etag/download/etag-1.8.1.tgz", + "integrity": "sha1-Qa4u62XvpiJorr/qg6x9eSmbCIc=", + "dev": true + }, + "event-pubsub": { + "version": "4.3.0", + "resolved": "https://registry.npm.taobao.org/event-pubsub/download/event-pubsub-4.3.0.tgz", + "integrity": "sha1-9o2Ba8KfHsAsU53FjI3UDOcss24=", + "dev": true + }, + "eventemitter3": { + "version": "4.0.0", + "resolved": "https://registry.npm.taobao.org/eventemitter3/download/eventemitter3-4.0.0.tgz", + "integrity": "sha1-1lF2FjiH7lnzhtZMgmELaWpKdOs=", + "dev": true + }, + "events": { + "version": "3.1.0", + "resolved": "https://registry.npm.taobao.org/events/download/events-3.1.0.tgz", + "integrity": "sha1-hCea8bNMt1qoi/X/KR9tC9mzGlk=", + "dev": true + }, + "eventsource": { + "version": "1.0.7", + "resolved": "https://registry.npm.taobao.org/eventsource/download/eventsource-1.0.7.tgz", + "integrity": "sha1-j7xyyT/NNAiAkLwKTmT0tc7m2NA=", + "dev": true, + "requires": { + "original": "^1.0.0" + } + }, + "evp_bytestokey": { + "version": "1.0.3", + "resolved": "https://registry.npm.taobao.org/evp_bytestokey/download/evp_bytestokey-1.0.3.tgz", + "integrity": "sha1-f8vbGY3HGVlDLv4ThCaE4FJaywI=", + "dev": true, + "requires": { + "md5.js": "^1.3.4", + "safe-buffer": "^5.1.1" + } + }, + "execa": { + "version": "1.0.0", + "resolved": "https://registry.npm.taobao.org/execa/download/execa-1.0.0.tgz?cache=0&sync_timestamp=1576749001049&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fexeca%2Fdownload%2Fexeca-1.0.0.tgz", + "integrity": "sha1-xiNqW7TfbW8V6I5/AXeYIWdJ3dg=", + "dev": true, + "requires": { + "cross-spawn": "^6.0.0", + "get-stream": "^4.0.0", + "is-stream": "^1.1.0", + "npm-run-path": "^2.0.0", + "p-finally": "^1.0.0", + "signal-exit": "^3.0.0", + "strip-eof": "^1.0.0" + } + }, + "exit-on-epipe": { + "version": "1.0.1", + "resolved": "https://registry.npm.taobao.org/exit-on-epipe/download/exit-on-epipe-1.0.1.tgz", + "integrity": "sha1-C92S6H1ShdJn2qgXHQ6wYVlolpI=" + }, + "expand-brackets": { + "version": "2.1.4", + "resolved": "https://registry.npm.taobao.org/expand-brackets/download/expand-brackets-2.1.4.tgz", + "integrity": "sha1-t3c14xXOMPa27/D4OwQVGiJEliI=", + "dev": true, + "requires": { + "debug": "^2.3.3", + "define-property": "^0.2.5", + "extend-shallow": "^2.0.1", + "posix-character-classes": "^0.1.0", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.1" + }, + "dependencies": { + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npm.taobao.org/debug/download/debug-2.6.9.tgz", + "integrity": "sha1-XRKFFd8TT/Mn6QpMk/Tgd6U2NB8=", + "dev": true, + "requires": { + "ms": "2.0.0" + } + }, + "define-property": { + "version": "0.2.5", + "resolved": "https://registry.npm.taobao.org/define-property/download/define-property-0.2.5.tgz", + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "dev": true, + "requires": { + "is-descriptor": "^0.1.0" + } + }, + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npm.taobao.org/extend-shallow/download/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "^0.1.0" + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npm.taobao.org/ms/download/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "dev": true + } + } + }, + "express": { + "version": "4.17.1", + "resolved": "https://registry.npm.taobao.org/express/download/express-4.17.1.tgz", + "integrity": "sha1-RJH8OGBc9R+GKdOcK10Cb5ikwTQ=", + "dev": true, + "requires": { + "accepts": "~1.3.7", + "array-flatten": "1.1.1", + "body-parser": "1.19.0", + "content-disposition": "0.5.3", + "content-type": "~1.0.4", + "cookie": "0.4.0", + "cookie-signature": "1.0.6", + "debug": "2.6.9", + "depd": "~1.1.2", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "etag": "~1.8.1", + "finalhandler": "~1.1.2", + "fresh": "0.5.2", + "merge-descriptors": "1.0.1", + "methods": "~1.1.2", + "on-finished": "~2.3.0", + "parseurl": "~1.3.3", + "path-to-regexp": "0.1.7", + "proxy-addr": "~2.0.5", + "qs": "6.7.0", + "range-parser": "~1.2.1", + "safe-buffer": "5.1.2", + "send": "0.17.1", + "serve-static": "1.14.1", + "setprototypeof": "1.1.1", + "statuses": "~1.5.0", + "type-is": "~1.6.18", + "utils-merge": "1.0.1", + "vary": "~1.1.2" + }, + "dependencies": { + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npm.taobao.org/debug/download/debug-2.6.9.tgz", + "integrity": "sha1-XRKFFd8TT/Mn6QpMk/Tgd6U2NB8=", + "dev": true, + "requires": { + "ms": "2.0.0" + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npm.taobao.org/ms/download/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "dev": true + }, + "qs": { + "version": "6.7.0", + "resolved": "https://registry.npm.taobao.org/qs/download/qs-6.7.0.tgz?cache=0&sync_timestamp=1585063550190&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fqs%2Fdownload%2Fqs-6.7.0.tgz", + "integrity": "sha1-QdwaAV49WB8WIXdr4xr7KHapsbw=", + "dev": true + } + } + }, + "extend": { + "version": "3.0.2", + "resolved": "https://registry.npm.taobao.org/extend/download/extend-3.0.2.tgz", + "integrity": "sha1-+LETa0Bx+9jrFAr/hYsQGewpFfo=", + "dev": true + }, + "extend-shallow": { + "version": "3.0.2", + "resolved": "https://registry.npm.taobao.org/extend-shallow/download/extend-shallow-3.0.2.tgz", + "integrity": "sha1-Jqcarwc7OfshJxcnRhMcJwQCjbg=", + "dev": true, + "requires": { + "assign-symbols": "^1.0.0", + "is-extendable": "^1.0.1" + }, + "dependencies": { + "is-extendable": { + "version": "1.0.1", + "resolved": "https://registry.npm.taobao.org/is-extendable/download/is-extendable-1.0.1.tgz", + "integrity": "sha1-p0cPnkJnM9gb2B4RVSZOOjUHyrQ=", + "dev": true, + "requires": { + "is-plain-object": "^2.0.4" + } + } + } + }, + "external-editor": { + "version": "3.1.0", + "resolved": "https://registry.npm.taobao.org/external-editor/download/external-editor-3.1.0.tgz", + "integrity": "sha1-ywP3QL764D6k0oPK7SdBqD8zVJU=", + "dev": true, + "requires": { + "chardet": "^0.7.0", + "iconv-lite": "^0.4.24", + "tmp": "^0.0.33" + } + }, + "extglob": { + "version": "2.0.4", + "resolved": "https://registry.npm.taobao.org/extglob/download/extglob-2.0.4.tgz", + "integrity": "sha1-rQD+TcYSqSMuhxhxHcXLWrAoVUM=", + "dev": true, + "requires": { + "array-unique": "^0.3.2", + "define-property": "^1.0.0", + "expand-brackets": "^2.1.4", + "extend-shallow": "^2.0.1", + "fragment-cache": "^0.2.1", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.1" + }, + "dependencies": { + "define-property": { + "version": "1.0.0", + "resolved": "https://registry.npm.taobao.org/define-property/download/define-property-1.0.0.tgz", + "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", + "dev": true, + "requires": { + "is-descriptor": "^1.0.0" + } + }, + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npm.taobao.org/extend-shallow/download/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "^0.1.0" + } + }, + "is-accessor-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npm.taobao.org/is-accessor-descriptor/download/is-accessor-descriptor-1.0.0.tgz", + "integrity": "sha1-FpwvbT3x+ZJhgHI2XJsOofaHhlY=", + "dev": true, + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-data-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npm.taobao.org/is-data-descriptor/download/is-data-descriptor-1.0.0.tgz", + "integrity": "sha1-2Eh2Mh0Oet0DmQQGq7u9NrqSaMc=", + "dev": true, + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-descriptor": { + "version": "1.0.2", + "resolved": "https://registry.npm.taobao.org/is-descriptor/download/is-descriptor-1.0.2.tgz", + "integrity": "sha1-OxWXRqZmBLBPjIFSS6NlxfFNhuw=", + "dev": true, + "requires": { + "is-accessor-descriptor": "^1.0.0", + "is-data-descriptor": "^1.0.0", + "kind-of": "^6.0.2" + } + } + } + }, + "extsprintf": { + "version": "1.3.0", + "resolved": "https://registry.npm.taobao.org/extsprintf/download/extsprintf-1.3.0.tgz", + "integrity": "sha1-lpGEQOMEGnpBT4xS48V06zw+HgU=", + "dev": true + }, + "fast-deep-equal": { + "version": "3.1.1", + "resolved": "https://registry.npm.taobao.org/fast-deep-equal/download/fast-deep-equal-3.1.1.tgz?cache=0&sync_timestamp=1575383522243&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Ffast-deep-equal%2Fdownload%2Ffast-deep-equal-3.1.1.tgz", + "integrity": "sha1-VFFFB3xQFJHjOxXsQIwpQ3bpSuQ=", + "dev": true + }, + "fast-glob": { + "version": "2.2.7", + "resolved": "https://registry.npm.taobao.org/fast-glob/download/fast-glob-2.2.7.tgz?cache=0&sync_timestamp=1582330235334&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Ffast-glob%2Fdownload%2Ffast-glob-2.2.7.tgz", + "integrity": "sha1-aVOFfDr6R1//ku5gFdUtpwpM050=", + "dev": true, + "requires": { + "@mrmlnc/readdir-enhanced": "^2.2.1", + "@nodelib/fs.stat": "^1.1.2", + "glob-parent": "^3.1.0", + "is-glob": "^4.0.0", + "merge2": "^1.2.3", + "micromatch": "^3.1.10" + } + }, + "fast-json-stable-stringify": { + "version": "2.1.0", + "resolved": "https://registry.npm.taobao.org/fast-json-stable-stringify/download/fast-json-stable-stringify-2.1.0.tgz?cache=0&sync_timestamp=1576340291001&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Ffast-json-stable-stringify%2Fdownload%2Ffast-json-stable-stringify-2.1.0.tgz", + "integrity": "sha1-h0v2nG9ATCtdmcSBNBOZ/VWJJjM=", + "dev": true + }, + "fast-levenshtein": { + "version": "2.0.6", + "resolved": "https://registry.npm.taobao.org/fast-levenshtein/download/fast-levenshtein-2.0.6.tgz", + "integrity": "sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc=", + "dev": true + }, + "faye-websocket": { + "version": "0.10.0", + "resolved": "https://registry.npm.taobao.org/faye-websocket/download/faye-websocket-0.10.0.tgz", + "integrity": "sha1-TkkvjQTftviQA1B/btvy1QHnxvQ=", + "dev": true, + "requires": { + "websocket-driver": ">=0.5.1" + } + }, + "fflate": { + "version": "0.3.10", + "resolved": "https://registry.npm.taobao.org/fflate/download/fflate-0.3.10.tgz", + "integrity": "sha1-DlgYOaUyA9LurH5hzjZS2FXiTc0=" + }, + "figgy-pudding": { + "version": "3.5.2", + "resolved": "https://registry.npm.taobao.org/figgy-pudding/download/figgy-pudding-3.5.2.tgz", + "integrity": "sha1-tO7oFIq7Adzx0aw0Nn1Z4S+mHW4=", + "dev": true + }, + "figures": { + "version": "2.0.0", + "resolved": "https://registry.npm.taobao.org/figures/download/figures-2.0.0.tgz", + "integrity": "sha1-OrGi0qYsi/tDGgyUy3l6L84nyWI=", + "dev": true, + "requires": { + "escape-string-regexp": "^1.0.5" + } + }, + "file-entry-cache": { + "version": "5.0.1", + "resolved": "https://registry.npm.taobao.org/file-entry-cache/download/file-entry-cache-5.0.1.tgz", + "integrity": "sha1-yg9u+m3T1WEzP7FFFQZcL6/fQ5w=", + "dev": true, + "requires": { + "flat-cache": "^2.0.1" + } + }, + "file-loader": { + "version": "4.3.0", + "resolved": "https://registry.npm.taobao.org/file-loader/download/file-loader-4.3.0.tgz", + "integrity": "sha1-eA8ED3KbPRgBnyBgX3I+hEuKWK8=", + "dev": true, + "requires": { + "loader-utils": "^1.2.3", + "schema-utils": "^2.5.0" + } + }, + "file-saver": { + "version": "2.0.5", + "resolved": "https://registry.npm.taobao.org/file-saver/download/file-saver-2.0.5.tgz?cache=0&sync_timestamp=1605790845476&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Ffile-saver%2Fdownload%2Ffile-saver-2.0.5.tgz", + "integrity": "sha1-1hz+LOBZ9BTYmendbUEH7iVnDDg=" + }, + "file-uri-to-path": { + "version": "1.0.0", + "resolved": "https://registry.npm.taobao.org/file-uri-to-path/download/file-uri-to-path-1.0.0.tgz", + "integrity": "sha1-VTp7hEb/b2hDWcRF8eN6BdrMM90=", + "dev": true, + "optional": true + }, + "filesize": { + "version": "3.6.1", + "resolved": "https://registry.npm.taobao.org/filesize/download/filesize-3.6.1.tgz", + "integrity": "sha1-CQuz7gG2+AGoqL6Z0xcQs0Irsxc=", + "dev": true + }, + "fill-range": { + "version": "4.0.0", + "resolved": "https://registry.npm.taobao.org/fill-range/download/fill-range-4.0.0.tgz", + "integrity": "sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc=", + "dev": true, + "requires": { + "extend-shallow": "^2.0.1", + "is-number": "^3.0.0", + "repeat-string": "^1.6.1", + "to-regex-range": "^2.1.0" + }, + "dependencies": { + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npm.taobao.org/extend-shallow/download/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "^0.1.0" + } + } + } + }, + "finalhandler": { + "version": "1.1.2", + "resolved": "https://registry.npm.taobao.org/finalhandler/download/finalhandler-1.1.2.tgz", + "integrity": "sha1-t+fQAP/RGTjQ/bBTUG9uur6fWH0=", + "dev": true, + "requires": { + "debug": "2.6.9", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "on-finished": "~2.3.0", + "parseurl": "~1.3.3", + "statuses": "~1.5.0", + "unpipe": "~1.0.0" + }, + "dependencies": { + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npm.taobao.org/debug/download/debug-2.6.9.tgz", + "integrity": "sha1-XRKFFd8TT/Mn6QpMk/Tgd6U2NB8=", + "dev": true, + "requires": { + "ms": "2.0.0" + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npm.taobao.org/ms/download/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "dev": true + } + } + }, + "find-cache-dir": { + "version": "2.1.0", + "resolved": "https://registry.npm.taobao.org/find-cache-dir/download/find-cache-dir-2.1.0.tgz?cache=0&sync_timestamp=1583734806517&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Ffind-cache-dir%2Fdownload%2Ffind-cache-dir-2.1.0.tgz", + "integrity": "sha1-jQ+UzRP+Q8bHwmGg2GEVypGMBfc=", + "dev": true, + "requires": { + "commondir": "^1.0.1", + "make-dir": "^2.0.0", + "pkg-dir": "^3.0.0" + } + }, + "find-up": { + "version": "3.0.0", + "resolved": "https://registry.npm.taobao.org/find-up/download/find-up-3.0.0.tgz", + "integrity": "sha1-SRafHXmTQwZG2mHsxa41XCHJe3M=", + "dev": true, + "requires": { + "locate-path": "^3.0.0" + } + }, + "flat-cache": { + "version": "2.0.1", + "resolved": "https://registry.npm.taobao.org/flat-cache/download/flat-cache-2.0.1.tgz", + "integrity": "sha1-XSltbwS9pEpGMKMBQTvbwuwIXsA=", + "dev": true, + "requires": { + "flatted": "^2.0.0", + "rimraf": "2.6.3", + "write": "1.0.3" + }, + "dependencies": { + "rimraf": { + "version": "2.6.3", + "resolved": "https://registry.npm.taobao.org/rimraf/download/rimraf-2.6.3.tgz", + "integrity": "sha1-stEE/g2Psnz54KHNqCYt04M8bKs=", + "dev": true, + "requires": { + "glob": "^7.1.3" + } + } + } + }, + "flatted": { + "version": "2.0.1", + "resolved": "https://registry.npm.taobao.org/flatted/download/flatted-2.0.1.tgz?cache=0&sync_timestamp=1561466276595&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fflatted%2Fdownload%2Fflatted-2.0.1.tgz", + "integrity": "sha1-aeV8qo8OrLwoHS4stFjUb9tEngg=", + "dev": true + }, + "flush-write-stream": { + "version": "1.1.1", + "resolved": "https://registry.npm.taobao.org/flush-write-stream/download/flush-write-stream-1.1.1.tgz", + "integrity": "sha1-jdfYc6G6vCB9lOrQwuDkQnbr8ug=", + "dev": true, + "requires": { + "inherits": "^2.0.3", + "readable-stream": "^2.3.6" + } + }, + "follow-redirects": { + "version": "1.10.0", + "resolved": "https://registry.npm.taobao.org/follow-redirects/download/follow-redirects-1.10.0.tgz", + "integrity": "sha1-AfUmOu6SHGpU+5Fmfwj0FVzhaes=", + "dev": true, + "requires": { + "debug": "^3.0.0" + }, + "dependencies": { + "debug": { + "version": "3.2.6", + "resolved": "https://registry.npm.taobao.org/debug/download/debug-3.2.6.tgz", + "integrity": "sha1-6D0X3hbYp++3cX7b5fsQE17uYps=", + "dev": true, + "requires": { + "ms": "^2.1.1" + } + } + } + }, + "for-in": { + "version": "1.0.2", + "resolved": "https://registry.npm.taobao.org/for-in/download/for-in-1.0.2.tgz", + "integrity": "sha1-gQaNKVqBQuwKxybG4iAMMPttXoA=", + "dev": true + }, + "forever-agent": { + "version": "0.6.1", + "resolved": "https://registry.npm.taobao.org/forever-agent/download/forever-agent-0.6.1.tgz", + "integrity": "sha1-+8cfDEGt6zf5bFd60e1C2P2sypE=", + "dev": true + }, + "form-data": { + "version": "2.3.3", + "resolved": "https://registry.npm.taobao.org/form-data/download/form-data-2.3.3.tgz", + "integrity": "sha1-3M5SwF9kTymManq5Nr1yTO/786Y=", + "dev": true, + "requires": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.6", + "mime-types": "^2.1.12" + } + }, + "forwarded": { + "version": "0.1.2", + "resolved": "https://registry.npm.taobao.org/forwarded/download/forwarded-0.1.2.tgz", + "integrity": "sha1-mMI9qxF1ZXuMBXPozszZGw/xjIQ=", + "dev": true + }, + "frac": { + "version": "1.1.2", + "resolved": "https://registry.npm.taobao.org/frac/download/frac-1.1.2.tgz", + "integrity": "sha1-PXT39keMiKG1AgMG10fcYxPHTQs=" + }, + "fragment-cache": { + "version": "0.2.1", + "resolved": "https://registry.npm.taobao.org/fragment-cache/download/fragment-cache-0.2.1.tgz", + "integrity": "sha1-QpD60n8T6Jvn8zeZxrxaCr//DRk=", + "dev": true, + "requires": { + "map-cache": "^0.2.2" + } + }, + "fresh": { + "version": "0.5.2", + "resolved": "https://registry.npm.taobao.org/fresh/download/fresh-0.5.2.tgz", + "integrity": "sha1-PYyt2Q2XZWn6g1qx+OSyOhBWBac=", + "dev": true + }, + "from2": { + "version": "2.3.0", + "resolved": "https://registry.npm.taobao.org/from2/download/from2-2.3.0.tgz", + "integrity": "sha1-i/tVAr3kpNNs/e6gB/zKIdfjgq8=", + "dev": true, + "requires": { + "inherits": "^2.0.1", + "readable-stream": "^2.0.0" + } + }, + "fs-extra": { + "version": "7.0.1", + "resolved": "https://registry.npm.taobao.org/fs-extra/download/fs-extra-7.0.1.tgz", + "integrity": "sha1-TxicRKoSO4lfcigE9V6iPq3DSOk=", + "dev": true, + "requires": { + "graceful-fs": "^4.1.2", + "jsonfile": "^4.0.0", + "universalify": "^0.1.0" + } + }, + "fs-minipass": { + "version": "2.1.0", + "resolved": "https://registry.npm.taobao.org/fs-minipass/download/fs-minipass-2.1.0.tgz?cache=0&sync_timestamp=1579628584498&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Ffs-minipass%2Fdownload%2Ffs-minipass-2.1.0.tgz", + "integrity": "sha1-f1A2/b8SxjwWkZDL5BmchSJx+fs=", + "dev": true, + "requires": { + "minipass": "^3.0.0" + } + }, + "fs-write-stream-atomic": { + "version": "1.0.10", + "resolved": "https://registry.npm.taobao.org/fs-write-stream-atomic/download/fs-write-stream-atomic-1.0.10.tgz", + "integrity": "sha1-tH31NJPvkR33VzHnCp3tAYnbQMk=", + "dev": true, + "requires": { + "graceful-fs": "^4.1.2", + "iferr": "^0.1.5", + "imurmurhash": "^0.1.4", + "readable-stream": "1 || 2" + } + }, + "fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npm.taobao.org/fs.realpath/download/fs.realpath-1.0.0.tgz", + "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=", + "dev": true + }, + "fsevents": { + "version": "1.2.12", + "resolved": "https://registry.npm.taobao.org/fsevents/download/fsevents-1.2.12.tgz", + "integrity": "sha1-234NjsOwtFck/U2D1DVUqPHw3lw=", + "dev": true, + "optional": true, + "requires": { + "bindings": "^1.5.0", + "nan": "^2.12.1", + "node-pre-gyp": "*" + }, + "dependencies": { + "abbrev": { + "version": "1.1.1", + "bundled": true, + "dev": true, + "optional": true + }, + "ansi-regex": { + "version": "2.1.1", + "bundled": true, + "dev": true, + "optional": true + }, + "aproba": { + "version": "1.2.0", + "bundled": true, + "dev": true, + "optional": true + }, + "are-we-there-yet": { + "version": "1.1.5", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "delegates": "^1.0.0", + "readable-stream": "^2.0.6" + } + }, + "balanced-match": { + "version": "1.0.0", + "bundled": true, + "dev": true, + "optional": true + }, + "brace-expansion": { + "version": "1.1.11", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "chownr": { + "version": "1.1.4", + "bundled": true, + "dev": true, + "optional": true + }, + "code-point-at": { + "version": "1.1.0", + "bundled": true, + "dev": true, + "optional": true + }, + "concat-map": { + "version": "0.0.1", + "bundled": true, + "dev": true, + "optional": true + }, + "console-control-strings": { + "version": "1.1.0", + "bundled": true, + "dev": true, + "optional": true + }, + "core-util-is": { + "version": "1.0.2", + "bundled": true, + "dev": true, + "optional": true + }, + "debug": { + "version": "3.2.6", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "ms": "^2.1.1" + } + }, + "deep-extend": { + "version": "0.6.0", + "bundled": true, + "dev": true, + "optional": true + }, + "delegates": { + "version": "1.0.0", + "bundled": true, + "dev": true, + "optional": true + }, + "detect-libc": { + "version": "1.0.3", + "bundled": true, + "dev": true, + "optional": true + }, + "fs-minipass": { + "version": "1.2.7", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "minipass": "^2.6.0" + } + }, + "fs.realpath": { + "version": "1.0.0", + "bundled": true, + "dev": true, + "optional": true + }, + "gauge": { + "version": "2.7.4", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "aproba": "^1.0.3", + "console-control-strings": "^1.0.0", + "has-unicode": "^2.0.0", + "object-assign": "^4.1.0", + "signal-exit": "^3.0.0", + "string-width": "^1.0.1", + "strip-ansi": "^3.0.1", + "wide-align": "^1.1.0" + } + }, + "glob": { + "version": "7.1.6", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.0.4", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + } + }, + "has-unicode": { + "version": "2.0.1", + "bundled": true, + "dev": true, + "optional": true + }, + "iconv-lite": { + "version": "0.4.24", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "safer-buffer": ">= 2.1.2 < 3" + } + }, + "ignore-walk": { + "version": "3.0.3", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "minimatch": "^3.0.4" + } + }, + "inflight": { + "version": "1.0.6", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "inherits": { + "version": "2.0.4", + "bundled": true, + "dev": true, + "optional": true + }, + "ini": { + "version": "1.3.5", + "bundled": true, + "dev": true, + "optional": true + }, + "is-fullwidth-code-point": { + "version": "1.0.0", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "number-is-nan": "^1.0.0" + } + }, + "isarray": { + "version": "1.0.0", + "bundled": true, + "dev": true, + "optional": true + }, + "minimatch": { + "version": "3.0.4", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "brace-expansion": "^1.1.7" + } + }, + "minimist": { + "version": "1.2.5", + "bundled": true, + "dev": true, + "optional": true + }, + "minipass": { + "version": "2.9.0", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "safe-buffer": "^5.1.2", + "yallist": "^3.0.0" + } + }, + "minizlib": { + "version": "1.3.3", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "minipass": "^2.9.0" + } + }, + "mkdirp": { + "version": "0.5.3", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "minimist": "^1.2.5" + } + }, + "ms": { + "version": "2.1.2", + "bundled": true, + "dev": true, + "optional": true + }, + "needle": { + "version": "2.3.3", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "debug": "^3.2.6", + "iconv-lite": "^0.4.4", + "sax": "^1.2.4" + } + }, + "node-pre-gyp": { + "version": "0.14.0", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "detect-libc": "^1.0.2", + "mkdirp": "^0.5.1", + "needle": "^2.2.1", + "nopt": "^4.0.1", + "npm-packlist": "^1.1.6", + "npmlog": "^4.0.2", + "rc": "^1.2.7", + "rimraf": "^2.6.1", + "semver": "^5.3.0", + "tar": "^4.4.2" + } + }, + "nopt": { + "version": "4.0.3", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "abbrev": "1", + "osenv": "^0.1.4" + } + }, + "npm-bundled": { + "version": "1.1.1", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "npm-normalize-package-bin": "^1.0.1" + } + }, + "npm-normalize-package-bin": { + "version": "1.0.1", + "bundled": true, + "dev": true, + "optional": true + }, + "npm-packlist": { + "version": "1.4.8", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "ignore-walk": "^3.0.1", + "npm-bundled": "^1.0.1", + "npm-normalize-package-bin": "^1.0.1" + } + }, + "npmlog": { + "version": "4.1.2", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "are-we-there-yet": "~1.1.2", + "console-control-strings": "~1.1.0", + "gauge": "~2.7.3", + "set-blocking": "~2.0.0" + } + }, + "number-is-nan": { + "version": "1.0.1", + "bundled": true, + "dev": true, + "optional": true + }, + "object-assign": { + "version": "4.1.1", + "bundled": true, + "dev": true, + "optional": true + }, + "once": { + "version": "1.4.0", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "wrappy": "1" + } + }, + "os-homedir": { + "version": "1.0.2", + "bundled": true, + "dev": true, + "optional": true + }, + "os-tmpdir": { + "version": "1.0.2", + "bundled": true, + "dev": true, + "optional": true + }, + "osenv": { + "version": "0.1.5", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "os-homedir": "^1.0.0", + "os-tmpdir": "^1.0.0" + } + }, + "path-is-absolute": { + "version": "1.0.1", + "bundled": true, + "dev": true, + "optional": true + }, + "process-nextick-args": { + "version": "2.0.1", + "bundled": true, + "dev": true, + "optional": true + }, + "rc": { + "version": "1.2.8", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "deep-extend": "^0.6.0", + "ini": "~1.3.0", + "minimist": "^1.2.0", + "strip-json-comments": "~2.0.1" + } + }, + "readable-stream": { + "version": "2.3.7", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "rimraf": { + "version": "2.7.1", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "glob": "^7.1.3" + } + }, + "safe-buffer": { + "version": "5.1.2", + "bundled": true, + "dev": true, + "optional": true + }, + "safer-buffer": { + "version": "2.1.2", + "bundled": true, + "dev": true, + "optional": true + }, + "sax": { + "version": "1.2.4", + "bundled": true, + "dev": true, + "optional": true + }, + "semver": { + "version": "5.7.1", + "bundled": true, + "dev": true, + "optional": true + }, + "set-blocking": { + "version": "2.0.0", + "bundled": true, + "dev": true, + "optional": true + }, + "signal-exit": { + "version": "3.0.2", + "bundled": true, + "dev": true, + "optional": true + }, + "string-width": { + "version": "1.0.2", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "code-point-at": "^1.0.0", + "is-fullwidth-code-point": "^1.0.0", + "strip-ansi": "^3.0.0" + } + }, + "string_decoder": { + "version": "1.1.1", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "safe-buffer": "~5.1.0" + } + }, + "strip-ansi": { + "version": "3.0.1", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "ansi-regex": "^2.0.0" + } + }, + "strip-json-comments": { + "version": "2.0.1", + "bundled": true, + "dev": true, + "optional": true + }, + "tar": { + "version": "4.4.13", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "chownr": "^1.1.1", + "fs-minipass": "^1.2.5", + "minipass": "^2.8.6", + "minizlib": "^1.2.1", + "mkdirp": "^0.5.0", + "safe-buffer": "^5.1.2", + "yallist": "^3.0.3" + } + }, + "util-deprecate": { + "version": "1.0.2", + "bundled": true, + "dev": true, + "optional": true + }, + "wide-align": { + "version": "1.1.3", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "string-width": "^1.0.2 || 2" + } + }, + "wrappy": { + "version": "1.0.2", + "bundled": true, + "dev": true, + "optional": true + }, + "yallist": { + "version": "3.1.1", + "bundled": true, + "dev": true, + "optional": true + } + } + }, + "function-bind": { + "version": "1.1.1", + "resolved": "https://registry.npm.taobao.org/function-bind/download/function-bind-1.1.1.tgz", + "integrity": "sha1-pWiZ0+o8m6uHS7l3O3xe3pL0iV0=", + "dev": true + }, + "functional-red-black-tree": { + "version": "1.0.1", + "resolved": "https://registry.npm.taobao.org/functional-red-black-tree/download/functional-red-black-tree-1.0.1.tgz", + "integrity": "sha1-GwqzvVU7Kg1jmdKcDj6gslIHgyc=", + "dev": true + }, + "gensync": { + "version": "1.0.0-beta.1", + "resolved": "https://registry.npm.taobao.org/gensync/download/gensync-1.0.0-beta.1.tgz?cache=0&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fgensync%2Fdownload%2Fgensync-1.0.0-beta.1.tgz", + "integrity": "sha1-WPQ2H/mH5f9uHnohCCeqNx6qwmk=", + "dev": true + }, + "get-caller-file": { + "version": "2.0.5", + "resolved": "https://registry.npm.taobao.org/get-caller-file/download/get-caller-file-2.0.5.tgz", + "integrity": "sha1-T5RBKoLbMvNuOwuXQfipf+sDH34=", + "dev": true + }, + "get-stream": { + "version": "4.1.0", + "resolved": "https://registry.npm.taobao.org/get-stream/download/get-stream-4.1.0.tgz", + "integrity": "sha1-wbJVV189wh1Zv8ec09K0axw6VLU=", + "dev": true, + "requires": { + "pump": "^3.0.0" + } + }, + "get-value": { + "version": "2.0.6", + "resolved": "https://registry.npm.taobao.org/get-value/download/get-value-2.0.6.tgz", + "integrity": "sha1-3BXKHGcjh8p2vTesCjlbogQqLCg=", + "dev": true + }, + "getpass": { + "version": "0.1.7", + "resolved": "https://registry.npm.taobao.org/getpass/download/getpass-0.1.7.tgz", + "integrity": "sha1-Xv+OPmhNVprkyysSgmBOi6YhSfo=", + "dev": true, + "requires": { + "assert-plus": "^1.0.0" + } + }, + "glob": { + "version": "7.1.6", + "resolved": "https://registry.npm.taobao.org/glob/download/glob-7.1.6.tgz", + "integrity": "sha1-FB8zuBp8JJLhJVlDB0gMRmeSeKY=", + "dev": true, + "requires": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.0.4", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + } + }, + "glob-parent": { + "version": "3.1.0", + "resolved": "https://registry.npm.taobao.org/glob-parent/download/glob-parent-3.1.0.tgz", + "integrity": "sha1-nmr2KZ2NO9K9QEMIMr0RPfkGxa4=", + "dev": true, + "requires": { + "is-glob": "^3.1.0", + "path-dirname": "^1.0.0" + }, + "dependencies": { + "is-glob": { + "version": "3.1.0", + "resolved": "https://registry.npm.taobao.org/is-glob/download/is-glob-3.1.0.tgz", + "integrity": "sha1-e6WuJCF4BKxwcHuWkiVnSGzD6Eo=", + "dev": true, + "requires": { + "is-extglob": "^2.1.0" + } + } + } + }, + "glob-to-regexp": { + "version": "0.3.0", + "resolved": "https://registry.npm.taobao.org/glob-to-regexp/download/glob-to-regexp-0.3.0.tgz", + "integrity": "sha1-jFoUlNIGbFcMw7/kSWF1rMTVAqs=", + "dev": true + }, + "globals": { + "version": "11.12.0", + "resolved": "https://registry.npm.taobao.org/globals/download/globals-11.12.0.tgz", + "integrity": "sha1-q4eVM4hooLq9hSV1gBjCp+uVxC4=", + "dev": true + }, + "globby": { + "version": "9.2.0", + "resolved": "https://registry.npm.taobao.org/globby/download/globby-9.2.0.tgz?cache=0&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fglobby%2Fdownload%2Fglobby-9.2.0.tgz", + "integrity": "sha1-/QKacGxwPSm90XD0tts6P3p8tj0=", + "dev": true, + "requires": { + "@types/glob": "^7.1.1", + "array-union": "^1.0.2", + "dir-glob": "^2.2.2", + "fast-glob": "^2.2.6", + "glob": "^7.1.3", + "ignore": "^4.0.3", + "pify": "^4.0.1", + "slash": "^2.0.0" + } + }, + "graceful-fs": { + "version": "4.2.3", + "resolved": "https://registry.npm.taobao.org/graceful-fs/download/graceful-fs-4.2.3.tgz", + "integrity": "sha1-ShL/G2A3bvCYYsIJPt2Qgyi+hCM=", + "dev": true + }, + "gzip-size": { + "version": "5.1.1", + "resolved": "https://registry.npm.taobao.org/gzip-size/download/gzip-size-5.1.1.tgz", + "integrity": "sha1-y5vuaS+HwGErIyhAqHOQTkwTUnQ=", + "dev": true, + "requires": { + "duplexer": "^0.1.1", + "pify": "^4.0.1" + } + }, + "handle-thing": { + "version": "2.0.0", + "resolved": "https://registry.npm.taobao.org/handle-thing/download/handle-thing-2.0.0.tgz", + "integrity": "sha1-DgOWlf9QyT/CiFV9aW88HcZ3Z1Q=", + "dev": true + }, + "har-schema": { + "version": "2.0.0", + "resolved": "https://registry.npm.taobao.org/har-schema/download/har-schema-2.0.0.tgz", + "integrity": "sha1-qUwiJOvKwEeCoNkDVSHyRzW37JI=", + "dev": true + }, + "har-validator": { + "version": "5.1.3", + "resolved": "https://registry.npm.taobao.org/har-validator/download/har-validator-5.1.3.tgz", + "integrity": "sha1-HvievT5JllV2de7ZiTEQ3DUPoIA=", + "dev": true, + "requires": { + "ajv": "^6.5.5", + "har-schema": "^2.0.0" + } + }, + "has": { + "version": "1.0.3", + "resolved": "https://registry.npm.taobao.org/has/download/has-1.0.3.tgz", + "integrity": "sha1-ci18v8H2qoJB8W3YFOAR4fQeh5Y=", + "dev": true, + "requires": { + "function-bind": "^1.1.1" + } + }, + "has-ansi": { + "version": "2.0.0", + "resolved": "https://registry.npm.taobao.org/has-ansi/download/has-ansi-2.0.0.tgz", + "integrity": "sha1-NPUEnOHs3ysGSa8+8k5F7TVBbZE=", + "dev": true, + "requires": { + "ansi-regex": "^2.0.0" + }, + "dependencies": { + "ansi-regex": { + "version": "2.1.1", + "resolved": "https://registry.npm.taobao.org/ansi-regex/download/ansi-regex-2.1.1.tgz", + "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", + "dev": true + } + } + }, + "has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npm.taobao.org/has-flag/download/has-flag-3.0.0.tgz", + "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", + "dev": true + }, + "has-symbols": { + "version": "1.0.1", + "resolved": "https://registry.npm.taobao.org/has-symbols/download/has-symbols-1.0.1.tgz?cache=0&sync_timestamp=1573950719586&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fhas-symbols%2Fdownload%2Fhas-symbols-1.0.1.tgz", + "integrity": "sha1-n1IUdYpEGWxAbZvXbOv4HsLdMeg=", + "dev": true + }, + "has-value": { + "version": "1.0.0", + "resolved": "https://registry.npm.taobao.org/has-value/download/has-value-1.0.0.tgz", + "integrity": "sha1-GLKB2lhbHFxR3vJMkw7SmgvmsXc=", + "dev": true, + "requires": { + "get-value": "^2.0.6", + "has-values": "^1.0.0", + "isobject": "^3.0.0" + } + }, + "has-values": { + "version": "1.0.0", + "resolved": "https://registry.npm.taobao.org/has-values/download/has-values-1.0.0.tgz", + "integrity": "sha1-lbC2P+whRmGab+V/51Yo1aOe/k8=", + "dev": true, + "requires": { + "is-number": "^3.0.0", + "kind-of": "^4.0.0" + }, + "dependencies": { + "kind-of": { + "version": "4.0.0", + "resolved": "https://registry.npm.taobao.org/kind-of/download/kind-of-4.0.0.tgz", + "integrity": "sha1-IIE989cSkosgc3hpGkUGb65y3Vc=", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "hash-base": { + "version": "3.0.4", + "resolved": "https://registry.npm.taobao.org/hash-base/download/hash-base-3.0.4.tgz", + "integrity": "sha1-X8hoaEfs1zSZQDMZprCj8/auSRg=", + "dev": true, + "requires": { + "inherits": "^2.0.1", + "safe-buffer": "^5.0.1" + } + }, + "hash-sum": { + "version": "2.0.0", + "resolved": "https://registry.npm.taobao.org/hash-sum/download/hash-sum-2.0.0.tgz", + "integrity": "sha1-gdAbtd6OpKIUrV1urRtSNGCwtFo=", + "dev": true + }, + "hash.js": { + "version": "1.1.7", + "resolved": "https://registry.npm.taobao.org/hash.js/download/hash.js-1.1.7.tgz", + "integrity": "sha1-C6vKU46NTuSg+JiNaIZlN6ADz0I=", + "dev": true, + "requires": { + "inherits": "^2.0.3", + "minimalistic-assert": "^1.0.1" + } + }, + "he": { + "version": "1.2.0", + "resolved": "https://registry.npm.taobao.org/he/download/he-1.2.0.tgz", + "integrity": "sha1-hK5l+n6vsWX922FWauFLrwVmTw8=", + "dev": true + }, + "hex-color-regex": { + "version": "1.1.0", + "resolved": "https://registry.npm.taobao.org/hex-color-regex/download/hex-color-regex-1.1.0.tgz", + "integrity": "sha1-TAb8y0YC/iYCs8k9+C1+fb8aio4=", + "dev": true + }, + "highlight.js": { + "version": "9.18.1", + "resolved": "https://registry.npm.taobao.org/highlight.js/download/highlight.js-9.18.1.tgz", + "integrity": "sha1-7SGqAB/mJSuxCj121HVzxlOf4Tw=", + "dev": true + }, + "hmac-drbg": { + "version": "1.0.1", + "resolved": "https://registry.npm.taobao.org/hmac-drbg/download/hmac-drbg-1.0.1.tgz", + "integrity": "sha1-0nRXAQJabHdabFRXk+1QL8DGSaE=", + "dev": true, + "requires": { + "hash.js": "^1.0.3", + "minimalistic-assert": "^1.0.0", + "minimalistic-crypto-utils": "^1.0.1" + } + }, + "hoopy": { + "version": "0.1.4", + "resolved": "https://registry.npm.taobao.org/hoopy/download/hoopy-0.1.4.tgz", + "integrity": "sha1-YJIH1mEQADOpqUAq096mdzgcGx0=", + "dev": true + }, + "hosted-git-info": { + "version": "2.8.8", + "resolved": "https://registry.npm.taobao.org/hosted-git-info/download/hosted-git-info-2.8.8.tgz?cache=0&sync_timestamp=1583017392137&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fhosted-git-info%2Fdownload%2Fhosted-git-info-2.8.8.tgz", + "integrity": "sha1-dTm9S8Hg4KiVgVouAmJCCxKFhIg=", + "dev": true + }, + "hpack.js": { + "version": "2.1.6", + "resolved": "https://registry.npm.taobao.org/hpack.js/download/hpack.js-2.1.6.tgz", + "integrity": "sha1-h3dMCUnlE/QuhFdbPEVoH63ioLI=", + "dev": true, + "requires": { + "inherits": "^2.0.1", + "obuf": "^1.0.0", + "readable-stream": "^2.0.1", + "wbuf": "^1.1.0" + } + }, + "hsl-regex": { + "version": "1.0.0", + "resolved": "https://registry.npm.taobao.org/hsl-regex/download/hsl-regex-1.0.0.tgz", + "integrity": "sha1-1JMwx4ntgZ4nakwNJy3/owsY/m4=", + "dev": true + }, + "hsla-regex": { + "version": "1.0.0", + "resolved": "https://registry.npm.taobao.org/hsla-regex/download/hsla-regex-1.0.0.tgz", + "integrity": "sha1-wc56MWjIxmFAM6S194d/OyJfnDg=", + "dev": true + }, + "html-comment-regex": { + "version": "1.1.2", + "resolved": "https://registry.npm.taobao.org/html-comment-regex/download/html-comment-regex-1.1.2.tgz", + "integrity": "sha1-l9RoiutcgYhqNk+qDK0d2hTUM6c=", + "dev": true + }, + "html-entities": { + "version": "1.2.1", + "resolved": "https://registry.npm.taobao.org/html-entities/download/html-entities-1.2.1.tgz", + "integrity": "sha1-DfKTUfByEWNRXfueVUPl9u7VFi8=", + "dev": true + }, + "html-minifier": { + "version": "3.5.21", + "resolved": "https://registry.npm.taobao.org/html-minifier/download/html-minifier-3.5.21.tgz", + "integrity": "sha1-0AQOBUcw41TbAIRjWTGUAVIS0gw=", + "dev": true, + "requires": { + "camel-case": "3.0.x", + "clean-css": "4.2.x", + "commander": "2.17.x", + "he": "1.2.x", + "param-case": "2.1.x", + "relateurl": "0.2.x", + "uglify-js": "3.4.x" + }, + "dependencies": { + "commander": { + "version": "2.17.1", + "resolved": "https://registry.npm.taobao.org/commander/download/commander-2.17.1.tgz", + "integrity": "sha1-vXerfebelCBc6sxy8XFtKfIKd78=", + "dev": true + } + } + }, + "html-tags": { + "version": "2.0.0", + "resolved": "https://registry.npm.taobao.org/html-tags/download/html-tags-2.0.0.tgz?cache=0&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fhtml-tags%2Fdownload%2Fhtml-tags-2.0.0.tgz", + "integrity": "sha1-ELMKOGCF9Dzt41PMj6fLDe7qZos=", + "dev": true + }, + "html-webpack-plugin": { + "version": "3.2.0", + "resolved": "https://registry.npm.taobao.org/html-webpack-plugin/download/html-webpack-plugin-3.2.0.tgz", + "integrity": "sha1-sBq71yOsqqeze2r0SS69oD2d03s=", + "dev": true, + "requires": { + "html-minifier": "^3.2.3", + "loader-utils": "^0.2.16", + "lodash": "^4.17.3", + "pretty-error": "^2.0.2", + "tapable": "^1.0.0", + "toposort": "^1.0.0", + "util.promisify": "1.0.0" + }, + "dependencies": { + "big.js": { + "version": "3.2.0", + "resolved": "https://registry.npm.taobao.org/big.js/download/big.js-3.2.0.tgz", + "integrity": "sha1-pfwpi4G54Nyi5FiCR4S2XFK6WI4=", + "dev": true + }, + "emojis-list": { + "version": "2.1.0", + "resolved": "https://registry.npm.taobao.org/emojis-list/download/emojis-list-2.1.0.tgz", + "integrity": "sha1-TapNnbAPmBmIDHn6RXrlsJof04k=", + "dev": true + }, + "json5": { + "version": "0.5.1", + "resolved": "https://registry.npm.taobao.org/json5/download/json5-0.5.1.tgz", + "integrity": "sha1-Hq3nrMASA0rYTiOWdn6tn6VJWCE=", + "dev": true + }, + "loader-utils": { + "version": "0.2.17", + "resolved": "https://registry.npm.taobao.org/loader-utils/download/loader-utils-0.2.17.tgz?cache=0&sync_timestamp=1584472515006&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Floader-utils%2Fdownload%2Floader-utils-0.2.17.tgz", + "integrity": "sha1-+G5jdNQyBabmxg6RlvF8Apm/s0g=", + "dev": true, + "requires": { + "big.js": "^3.1.3", + "emojis-list": "^2.0.0", + "json5": "^0.5.0", + "object-assign": "^4.0.1" + } + }, + "util.promisify": { + "version": "1.0.0", + "resolved": "https://registry.npm.taobao.org/util.promisify/download/util.promisify-1.0.0.tgz?cache=0&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Futil.promisify%2Fdownload%2Futil.promisify-1.0.0.tgz", + "integrity": "sha1-RA9xZaRZyaFtwUXrjnLzVocJcDA=", + "dev": true, + "requires": { + "define-properties": "^1.1.2", + "object.getownpropertydescriptors": "^2.0.3" + } + } + } + }, + "htmlparser2": { + "version": "3.10.1", + "resolved": "https://registry.npm.taobao.org/htmlparser2/download/htmlparser2-3.10.1.tgz", + "integrity": "sha1-vWedw/WYl7ajS7EHSchVu1OpOS8=", + "dev": true, + "requires": { + "domelementtype": "^1.3.1", + "domhandler": "^2.3.0", + "domutils": "^1.5.1", + "entities": "^1.1.1", + "inherits": "^2.0.1", + "readable-stream": "^3.1.1" + }, + "dependencies": { + "entities": { + "version": "1.1.2", + "resolved": "https://registry.npm.taobao.org/entities/download/entities-1.1.2.tgz?cache=0&sync_timestamp=1563403318326&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fentities%2Fdownload%2Fentities-1.1.2.tgz", + "integrity": "sha1-vfpzUplmTfr9NFKe1PhSKidf6lY=", + "dev": true + }, + "readable-stream": { + "version": "3.6.0", + "resolved": "https://registry.npm.taobao.org/readable-stream/download/readable-stream-3.6.0.tgz", + "integrity": "sha1-M3u9o63AcGvT4CRCaihtS0sskZg=", + "dev": true, + "requires": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + } + } + } + }, + "http-deceiver": { + "version": "1.2.7", + "resolved": "https://registry.npm.taobao.org/http-deceiver/download/http-deceiver-1.2.7.tgz", + "integrity": "sha1-+nFolEq5pRnTN8sL7HKE3D5yPYc=", + "dev": true + }, + "http-errors": { + "version": "1.7.2", + "resolved": "https://registry.npm.taobao.org/http-errors/download/http-errors-1.7.2.tgz", + "integrity": "sha1-T1ApzxMjnzEDblsuVSkrz7zIXI8=", + "dev": true, + "requires": { + "depd": "~1.1.2", + "inherits": "2.0.3", + "setprototypeof": "1.1.1", + "statuses": ">= 1.5.0 < 2", + "toidentifier": "1.0.0" + }, + "dependencies": { + "inherits": { + "version": "2.0.3", + "resolved": "https://registry.npm.taobao.org/inherits/download/inherits-2.0.3.tgz", + "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=", + "dev": true + } + } + }, + "http-parser-js": { + "version": "0.4.10", + "resolved": "https://registry.npm.taobao.org/http-parser-js/download/http-parser-js-0.4.10.tgz", + "integrity": "sha1-ksnBN0w1CF912zWexWzCV8u5P6Q=", + "dev": true + }, + "http-proxy": { + "version": "1.18.0", + "resolved": "https://registry.npm.taobao.org/http-proxy/download/http-proxy-1.18.0.tgz", + "integrity": "sha1-2+VfY+daNH2389mZdPJpKjFKajo=", + "dev": true, + "requires": { + "eventemitter3": "^4.0.0", + "follow-redirects": "^1.0.0", + "requires-port": "^1.0.0" + } + }, + "http-proxy-middleware": { + "version": "0.19.1", + "resolved": "https://registry.npm.taobao.org/http-proxy-middleware/download/http-proxy-middleware-0.19.1.tgz", + "integrity": "sha1-GDx9xKoUeRUDBkmMIQza+WCApDo=", + "dev": true, + "requires": { + "http-proxy": "^1.17.0", + "is-glob": "^4.0.0", + "lodash": "^4.17.11", + "micromatch": "^3.1.10" + } + }, + "http-signature": { + "version": "1.2.0", + "resolved": "https://registry.npm.taobao.org/http-signature/download/http-signature-1.2.0.tgz?cache=0&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fhttp-signature%2Fdownload%2Fhttp-signature-1.2.0.tgz", + "integrity": "sha1-muzZJRFHcvPZW2WmCruPfBj7rOE=", + "dev": true, + "requires": { + "assert-plus": "^1.0.0", + "jsprim": "^1.2.2", + "sshpk": "^1.7.0" + } + }, + "https-browserify": { + "version": "1.0.0", + "resolved": "https://registry.npm.taobao.org/https-browserify/download/https-browserify-1.0.0.tgz", + "integrity": "sha1-7AbBDgo0wPL68Zn3/X/Hj//QPHM=", + "dev": true + }, + "human-signals": { + "version": "1.1.1", + "resolved": "https://registry.npm.taobao.org/human-signals/download/human-signals-1.1.1.tgz?cache=0&sync_timestamp=1584198806810&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fhuman-signals%2Fdownload%2Fhuman-signals-1.1.1.tgz", + "integrity": "sha1-xbHNFPUK6uCatsWf5jujOV/k36M=", + "dev": true + }, + "iconv-lite": { + "version": "0.4.24", + "resolved": "https://registry.npm.taobao.org/iconv-lite/download/iconv-lite-0.4.24.tgz?cache=0&sync_timestamp=1579333981154&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Ficonv-lite%2Fdownload%2Ficonv-lite-0.4.24.tgz", + "integrity": "sha1-ICK0sl+93CHS9SSXSkdKr+czkIs=", + "dev": true, + "requires": { + "safer-buffer": ">= 2.1.2 < 3" + } + }, + "icss-utils": { + "version": "4.1.1", + "resolved": "https://registry.npm.taobao.org/icss-utils/download/icss-utils-4.1.1.tgz", + "integrity": "sha1-IRcLU3ie4nRHwvR91oMIFAP5pGc=", + "dev": true, + "requires": { + "postcss": "^7.0.14" + } + }, + "ieee754": { + "version": "1.1.13", + "resolved": "https://registry.npm.taobao.org/ieee754/download/ieee754-1.1.13.tgz", + "integrity": "sha1-7BaFWOlaoYH9h9N/VcMrvLZwi4Q=", + "dev": true + }, + "iferr": { + "version": "0.1.5", + "resolved": "https://registry.npm.taobao.org/iferr/download/iferr-0.1.5.tgz", + "integrity": "sha1-xg7taebY/bazEEofy8ocGS3FtQE=", + "dev": true + }, + "ignore": { + "version": "4.0.6", + "resolved": "https://registry.npm.taobao.org/ignore/download/ignore-4.0.6.tgz", + "integrity": "sha1-dQ49tYYgh7RzfrrIIH/9HvJ7Jfw=", + "dev": true + }, + "image-size": { + "version": "0.5.5", + "resolved": "https://registry.npm.taobao.org/image-size/download/image-size-0.5.5.tgz", + "integrity": "sha1-Cd/Uq50g4p6xw+gLiZA3jfnjy5w=", + "dev": true, + "optional": true + }, + "import-cwd": { + "version": "2.1.0", + "resolved": "https://registry.npm.taobao.org/import-cwd/download/import-cwd-2.1.0.tgz", + "integrity": "sha1-qmzzbnInYShcs3HsZRn1PiQ1sKk=", + "dev": true, + "requires": { + "import-from": "^2.1.0" + } + }, + "import-fresh": { + "version": "2.0.0", + "resolved": "https://registry.npm.taobao.org/import-fresh/download/import-fresh-2.0.0.tgz", + "integrity": "sha1-2BNVwVYS04bGH53dOSLUMEgipUY=", + "dev": true, + "requires": { + "caller-path": "^2.0.0", + "resolve-from": "^3.0.0" + } + }, + "import-from": { + "version": "2.1.0", + "resolved": "https://registry.npm.taobao.org/import-from/download/import-from-2.1.0.tgz", + "integrity": "sha1-M1238qev/VOqpHHUuAId7ja387E=", + "dev": true, + "requires": { + "resolve-from": "^3.0.0" + } + }, + "import-local": { + "version": "2.0.0", + "resolved": "https://registry.npm.taobao.org/import-local/download/import-local-2.0.0.tgz", + "integrity": "sha1-VQcL44pZk88Y72236WH1vuXFoJ0=", + "dev": true, + "requires": { + "pkg-dir": "^3.0.0", + "resolve-cwd": "^2.0.0" + } + }, + "imurmurhash": { + "version": "0.1.4", + "resolved": "https://registry.npm.taobao.org/imurmurhash/download/imurmurhash-0.1.4.tgz", + "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=", + "dev": true + }, + "indent-string": { + "version": "4.0.0", + "resolved": "https://registry.npm.taobao.org/indent-string/download/indent-string-4.0.0.tgz", + "integrity": "sha1-Yk+PRJfWGbLZdoUx1Y9BIoVNclE=", + "dev": true + }, + "indexes-of": { + "version": "1.0.1", + "resolved": "https://registry.npm.taobao.org/indexes-of/download/indexes-of-1.0.1.tgz", + "integrity": "sha1-8w9xbI4r00bHtn0985FVZqfAVgc=", + "dev": true + }, + "infer-owner": { + "version": "1.0.4", + "resolved": "https://registry.npm.taobao.org/infer-owner/download/infer-owner-1.0.4.tgz", + "integrity": "sha1-xM78qo5RBRwqQLos6KPScpWvlGc=", + "dev": true + }, + "inflight": { + "version": "1.0.6", + "resolved": "https://registry.npm.taobao.org/inflight/download/inflight-1.0.6.tgz", + "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", + "dev": true, + "requires": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "inherits": { + "version": "2.0.4", + "resolved": "https://registry.npm.taobao.org/inherits/download/inherits-2.0.4.tgz", + "integrity": "sha1-D6LGT5MpF8NDOg3tVTY6rjdBa3w=", + "dev": true + }, + "inquirer": { + "version": "6.5.2", + "resolved": "https://registry.npm.taobao.org/inquirer/download/inquirer-6.5.2.tgz?cache=0&sync_timestamp=1583819732252&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Finquirer%2Fdownload%2Finquirer-6.5.2.tgz", + "integrity": "sha1-rVCUI3XQNtMn/1KMCL1fqwiZKMo=", + "dev": true, + "requires": { + "ansi-escapes": "^3.2.0", + "chalk": "^2.4.2", + "cli-cursor": "^2.1.0", + "cli-width": "^2.0.0", + "external-editor": "^3.0.3", + "figures": "^2.0.0", + "lodash": "^4.17.12", + "mute-stream": "0.0.7", + "run-async": "^2.2.0", + "rxjs": "^6.4.0", + "string-width": "^2.1.0", + "strip-ansi": "^5.1.0", + "through": "^2.3.6" + }, + "dependencies": { + "strip-ansi": { + "version": "5.2.0", + "resolved": "https://registry.npm.taobao.org/strip-ansi/download/strip-ansi-5.2.0.tgz", + "integrity": "sha1-jJpTb+tq/JYr36WxBKUJHBrZwK4=", + "dev": true, + "requires": { + "ansi-regex": "^4.1.0" + } + } + } + }, + "install": { + "version": "0.13.0", + "resolved": "https://registry.npm.taobao.org/install/download/install-0.13.0.tgz", + "integrity": "sha1-avbp2p3QmH3iq0IPeOYNnBcmB3Y=" + }, + "internal-ip": { + "version": "4.3.0", + "resolved": "https://registry.npm.taobao.org/internal-ip/download/internal-ip-4.3.0.tgz?cache=0&sync_timestamp=1584010513586&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Finternal-ip%2Fdownload%2Finternal-ip-4.3.0.tgz", + "integrity": "sha1-hFRSuq2dLKO2nGNaE3rLmg2tCQc=", + "dev": true, + "requires": { + "default-gateway": "^4.2.0", + "ipaddr.js": "^1.9.0" + }, + "dependencies": { + "default-gateway": { + "version": "4.2.0", + "resolved": "https://registry.npm.taobao.org/default-gateway/download/default-gateway-4.2.0.tgz", + "integrity": "sha1-FnEEx1AMIRX23WmwpTa7jtcgVSs=", + "dev": true, + "requires": { + "execa": "^1.0.0", + "ip-regex": "^2.1.0" + } + } + } + }, + "invariant": { + "version": "2.2.4", + "resolved": "https://registry.npm.taobao.org/invariant/download/invariant-2.2.4.tgz", + "integrity": "sha1-YQ88ksk1nOHbYW5TgAjSP/NRWOY=", + "dev": true, + "requires": { + "loose-envify": "^1.0.0" + } + }, + "invert-kv": { + "version": "2.0.0", + "resolved": "https://registry.npm.taobao.org/invert-kv/download/invert-kv-2.0.0.tgz", + "integrity": "sha1-c5P1r6Weyf9fZ6J2INEcIm4+7AI=", + "dev": true + }, + "ip": { + "version": "1.1.5", + "resolved": "https://registry.npm.taobao.org/ip/download/ip-1.1.5.tgz", + "integrity": "sha1-vd7XARQpCCjAoDnnLvJfWq7ENUo=", + "dev": true + }, + "ip-regex": { + "version": "2.1.0", + "resolved": "https://registry.npm.taobao.org/ip-regex/download/ip-regex-2.1.0.tgz", + "integrity": "sha1-+ni/XS5pE8kRzp+BnuUUa7bYROk=", + "dev": true + }, + "ipaddr.js": { + "version": "1.9.1", + "resolved": "https://registry.npm.taobao.org/ipaddr.js/download/ipaddr.js-1.9.1.tgz", + "integrity": "sha1-v/OFQ+64mEglB5/zoqjmy9RngbM=", + "dev": true + }, + "is-absolute-url": { + "version": "2.1.0", + "resolved": "https://registry.npm.taobao.org/is-absolute-url/download/is-absolute-url-2.1.0.tgz", + "integrity": "sha1-UFMN+4T8yap9vnhS6Do3uTufKqY=", + "dev": true + }, + "is-accessor-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npm.taobao.org/is-accessor-descriptor/download/is-accessor-descriptor-0.1.6.tgz", + "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=", + "dev": true, + "requires": { + "kind-of": "^3.0.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npm.taobao.org/kind-of/download/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "is-arguments": { + "version": "1.0.4", + "resolved": "https://registry.npm.taobao.org/is-arguments/download/is-arguments-1.0.4.tgz", + "integrity": "sha1-P6+WbHy6D/Q3+zH2JQCC/PBEjPM=", + "dev": true + }, + "is-arrayish": { + "version": "0.2.1", + "resolved": "https://registry.npm.taobao.org/is-arrayish/download/is-arrayish-0.2.1.tgz", + "integrity": "sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0=", + "dev": true + }, + "is-binary-path": { + "version": "1.0.1", + "resolved": "https://registry.npm.taobao.org/is-binary-path/download/is-binary-path-1.0.1.tgz", + "integrity": "sha1-dfFmQrSA8YenEcgUFh/TpKdlWJg=", + "dev": true, + "requires": { + "binary-extensions": "^1.0.0" + } + }, + "is-buffer": { + "version": "1.1.6", + "resolved": "https://registry.npm.taobao.org/is-buffer/download/is-buffer-1.1.6.tgz?cache=0&sync_timestamp=1569905599495&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fis-buffer%2Fdownload%2Fis-buffer-1.1.6.tgz", + "integrity": "sha1-76ouqdqg16suoTqXsritUf776L4=", + "dev": true + }, + "is-callable": { + "version": "1.1.5", + "resolved": "https://registry.npm.taobao.org/is-callable/download/is-callable-1.1.5.tgz", + "integrity": "sha1-9+RrWWiQRW23Tn9ul2yzJz0G+qs=", + "dev": true + }, + "is-ci": { + "version": "1.2.1", + "resolved": "https://registry.npm.taobao.org/is-ci/download/is-ci-1.2.1.tgz", + "integrity": "sha1-43ecjuF/zPQoSI9uKBGH8uYyhBw=", + "dev": true, + "requires": { + "ci-info": "^1.5.0" + } + }, + "is-color-stop": { + "version": "1.1.0", + "resolved": "https://registry.npm.taobao.org/is-color-stop/download/is-color-stop-1.1.0.tgz", + "integrity": "sha1-z/9HGu5N1cnhWFmPvhKWe1za00U=", + "dev": true, + "requires": { + "css-color-names": "^0.0.4", + "hex-color-regex": "^1.1.0", + "hsl-regex": "^1.0.0", + "hsla-regex": "^1.0.0", + "rgb-regex": "^1.0.1", + "rgba-regex": "^1.0.0" + } + }, + "is-data-descriptor": { + "version": "0.1.4", + "resolved": "https://registry.npm.taobao.org/is-data-descriptor/download/is-data-descriptor-0.1.4.tgz", + "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=", + "dev": true, + "requires": { + "kind-of": "^3.0.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npm.taobao.org/kind-of/download/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "is-date-object": { + "version": "1.0.2", + "resolved": "https://registry.npm.taobao.org/is-date-object/download/is-date-object-1.0.2.tgz?cache=0&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fis-date-object%2Fdownload%2Fis-date-object-1.0.2.tgz", + "integrity": "sha1-vac28s2P0G0yhE53Q7+nSUw7/X4=", + "dev": true + }, + "is-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npm.taobao.org/is-descriptor/download/is-descriptor-0.1.6.tgz", + "integrity": "sha1-Nm2CQN3kh8pRgjsaufB6EKeCUco=", + "dev": true, + "requires": { + "is-accessor-descriptor": "^0.1.6", + "is-data-descriptor": "^0.1.4", + "kind-of": "^5.0.0" + }, + "dependencies": { + "kind-of": { + "version": "5.1.0", + "resolved": "https://registry.npm.taobao.org/kind-of/download/kind-of-5.1.0.tgz", + "integrity": "sha1-cpyR4thXt6QZofmqZWhcTDP1hF0=", + "dev": true + } + } + }, + "is-directory": { + "version": "0.3.1", + "resolved": "https://registry.npm.taobao.org/is-directory/download/is-directory-0.3.1.tgz", + "integrity": "sha1-YTObbyR1/Hcv2cnYP1yFddwVSuE=", + "dev": true + }, + "is-extendable": { + "version": "0.1.1", + "resolved": "https://registry.npm.taobao.org/is-extendable/download/is-extendable-0.1.1.tgz", + "integrity": "sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik=", + "dev": true + }, + "is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npm.taobao.org/is-extglob/download/is-extglob-2.1.1.tgz", + "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=", + "dev": true + }, + "is-fullwidth-code-point": { + "version": "2.0.0", + "resolved": "https://registry.npm.taobao.org/is-fullwidth-code-point/download/is-fullwidth-code-point-2.0.0.tgz", + "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=", + "dev": true + }, + "is-glob": { + "version": "4.0.1", + "resolved": "https://registry.npm.taobao.org/is-glob/download/is-glob-4.0.1.tgz", + "integrity": "sha1-dWfb6fL14kZ7x3q4PEopSCQHpdw=", + "dev": true, + "requires": { + "is-extglob": "^2.1.1" + } + }, + "is-number": { + "version": "3.0.0", + "resolved": "https://registry.npm.taobao.org/is-number/download/is-number-3.0.0.tgz", + "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", + "dev": true, + "requires": { + "kind-of": "^3.0.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npm.taobao.org/kind-of/download/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "is-obj": { + "version": "2.0.0", + "resolved": "https://registry.npm.taobao.org/is-obj/download/is-obj-2.0.0.tgz", + "integrity": "sha1-Rz+wXZc3BeP9liBUUBjKjiLvSYI=", + "dev": true + }, + "is-path-cwd": { + "version": "2.2.0", + "resolved": "https://registry.npm.taobao.org/is-path-cwd/download/is-path-cwd-2.2.0.tgz?cache=0&sync_timestamp=1562347283002&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fis-path-cwd%2Fdownload%2Fis-path-cwd-2.2.0.tgz", + "integrity": "sha1-Z9Q7gmZKe1GR/ZEZEn6zAASKn9s=", + "dev": true + }, + "is-path-in-cwd": { + "version": "2.1.0", + "resolved": "https://registry.npm.taobao.org/is-path-in-cwd/download/is-path-in-cwd-2.1.0.tgz", + "integrity": "sha1-v+Lcomxp85cmWkAJljYCk1oFOss=", + "dev": true, + "requires": { + "is-path-inside": "^2.1.0" + } + }, + "is-path-inside": { + "version": "2.1.0", + "resolved": "https://registry.npm.taobao.org/is-path-inside/download/is-path-inside-2.1.0.tgz?cache=0&sync_timestamp=1569836695493&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fis-path-inside%2Fdownload%2Fis-path-inside-2.1.0.tgz", + "integrity": "sha1-fJgQWH1lmkDSe8201WFuqwWUlLI=", + "dev": true, + "requires": { + "path-is-inside": "^1.0.2" + } + }, + "is-plain-obj": { + "version": "1.1.0", + "resolved": "https://registry.npm.taobao.org/is-plain-obj/download/is-plain-obj-1.1.0.tgz?cache=0&sync_timestamp=1579603262724&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fis-plain-obj%2Fdownload%2Fis-plain-obj-1.1.0.tgz", + "integrity": "sha1-caUMhCnfync8kqOQpKA7OfzVHT4=", + "dev": true + }, + "is-plain-object": { + "version": "2.0.4", + "resolved": "https://registry.npm.taobao.org/is-plain-object/download/is-plain-object-2.0.4.tgz", + "integrity": "sha1-LBY7P6+xtgbZ0Xko8FwqHDjgdnc=", + "dev": true, + "requires": { + "isobject": "^3.0.1" + } + }, + "is-promise": { + "version": "2.1.0", + "resolved": "https://registry.npm.taobao.org/is-promise/download/is-promise-2.1.0.tgz", + "integrity": "sha1-eaKp7OfwlugPNtKy87wWwf9L8/o=", + "dev": true + }, + "is-regex": { + "version": "1.0.5", + "resolved": "https://registry.npm.taobao.org/is-regex/download/is-regex-1.0.5.tgz?cache=0&sync_timestamp=1576454688491&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fis-regex%2Fdownload%2Fis-regex-1.0.5.tgz", + "integrity": "sha1-OdWJo1i/GJZ/cmlnEguPwa7XTq4=", + "dev": true, + "requires": { + "has": "^1.0.3" + } + }, + "is-resolvable": { + "version": "1.1.0", + "resolved": "https://registry.npm.taobao.org/is-resolvable/download/is-resolvable-1.1.0.tgz", + "integrity": "sha1-+xj4fOH+uSUWnJpAfBkxijIG7Yg=", + "dev": true + }, + "is-stream": { + "version": "1.1.0", + "resolved": "https://registry.npm.taobao.org/is-stream/download/is-stream-1.1.0.tgz", + "integrity": "sha1-EtSj3U5o4Lec6428hBc66A2RykQ=", + "dev": true + }, + "is-svg": { + "version": "3.0.0", + "resolved": "https://registry.npm.taobao.org/is-svg/download/is-svg-3.0.0.tgz?cache=0&sync_timestamp=1579236224749&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fis-svg%2Fdownload%2Fis-svg-3.0.0.tgz", + "integrity": "sha1-kyHb0pwhLlypnE+peUxxS8r6L3U=", + "dev": true, + "requires": { + "html-comment-regex": "^1.1.0" + } + }, + "is-symbol": { + "version": "1.0.3", + "resolved": "https://registry.npm.taobao.org/is-symbol/download/is-symbol-1.0.3.tgz?cache=0&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fis-symbol%2Fdownload%2Fis-symbol-1.0.3.tgz", + "integrity": "sha1-OOEBS55jKb4N6dJKQU/XRB7GGTc=", + "dev": true, + "requires": { + "has-symbols": "^1.0.1" + } + }, + "is-typedarray": { + "version": "1.0.0", + "resolved": "https://registry.npm.taobao.org/is-typedarray/download/is-typedarray-1.0.0.tgz", + "integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=", + "dev": true + }, + "is-windows": { + "version": "1.0.2", + "resolved": "https://registry.npm.taobao.org/is-windows/download/is-windows-1.0.2.tgz", + "integrity": "sha1-0YUOuXkezRjmGCzhKjDzlmNLsZ0=", + "dev": true + }, + "is-wsl": { + "version": "1.1.0", + "resolved": "https://registry.npm.taobao.org/is-wsl/download/is-wsl-1.1.0.tgz", + "integrity": "sha1-HxbkqiKwTRM2tmGIpmrzxgDDpm0=", + "dev": true + }, + "isarray": { + "version": "1.0.0", + "resolved": "https://registry.npm.taobao.org/isarray/download/isarray-1.0.0.tgz", + "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", + "dev": true + }, + "isexe": { + "version": "2.0.0", + "resolved": "https://registry.npm.taobao.org/isexe/download/isexe-2.0.0.tgz", + "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=", + "dev": true + }, + "isobject": { + "version": "3.0.1", + "resolved": "https://registry.npm.taobao.org/isobject/download/isobject-3.0.1.tgz", + "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", + "dev": true + }, + "isstream": { + "version": "0.1.2", + "resolved": "https://registry.npm.taobao.org/isstream/download/isstream-0.1.2.tgz", + "integrity": "sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo=", + "dev": true + }, + "javascript-stringify": { + "version": "2.0.1", + "resolved": "https://registry.npm.taobao.org/javascript-stringify/download/javascript-stringify-2.0.1.tgz?cache=0&sync_timestamp=1572948916758&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fjavascript-stringify%2Fdownload%2Fjavascript-stringify-2.0.1.tgz", + "integrity": "sha1-bvNYA1MQ411mfGde1j0+t8GqGeU=", + "dev": true + }, + "jest-worker": { + "version": "25.1.0", + "resolved": "https://registry.npm.taobao.org/jest-worker/download/jest-worker-25.1.0.tgz?cache=0&sync_timestamp=1579654984575&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fjest-worker%2Fdownload%2Fjest-worker-25.1.0.tgz", + "integrity": "sha1-ddA4utb99Y66DS7Bg1hWxJfjkHo=", + "dev": true, + "requires": { + "merge-stream": "^2.0.0", + "supports-color": "^7.0.0" + }, + "dependencies": { + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npm.taobao.org/has-flag/download/has-flag-4.0.0.tgz", + "integrity": "sha1-lEdx/ZyByBJlxNaUGGDaBrtZR5s=", + "dev": true + }, + "supports-color": { + "version": "7.1.0", + "resolved": "https://registry.npm.taobao.org/supports-color/download/supports-color-7.1.0.tgz?cache=0&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fsupports-color%2Fdownload%2Fsupports-color-7.1.0.tgz", + "integrity": "sha1-aOMlkd9z4lrRxLSRCKLsUHliv9E=", + "dev": true, + "requires": { + "has-flag": "^4.0.0" + } + } + } + }, + "js-message": { + "version": "1.0.5", + "resolved": "https://registry.npm.taobao.org/js-message/download/js-message-1.0.5.tgz?cache=0&sync_timestamp=1575284593568&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fjs-message%2Fdownload%2Fjs-message-1.0.5.tgz", + "integrity": "sha1-IwDSSxrwjondCVvBpMnJz8uJLRU=", + "dev": true + }, + "js-queue": { + "version": "2.0.0", + "resolved": "https://registry.npm.taobao.org/js-queue/download/js-queue-2.0.0.tgz", + "integrity": "sha1-NiITz4YPRo8BJfxslqvBdCUx+Ug=", + "dev": true, + "requires": { + "easy-stack": "^1.0.0" + } + }, + "js-tokens": { + "version": "4.0.0", + "resolved": "https://registry.npm.taobao.org/js-tokens/download/js-tokens-4.0.0.tgz", + "integrity": "sha1-GSA/tZmR35jjoocFDUZHzerzJJk=", + "dev": true + }, + "js-yaml": { + "version": "3.13.1", + "resolved": "https://registry.npm.taobao.org/js-yaml/download/js-yaml-3.13.1.tgz?cache=0&sync_timestamp=1577784804062&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fjs-yaml%2Fdownload%2Fjs-yaml-3.13.1.tgz", + "integrity": "sha1-r/FRswv9+o5J4F2iLnQV6d+jeEc=", + "dev": true, + "requires": { + "argparse": "^1.0.7", + "esprima": "^4.0.0" + } + }, + "jsbn": { + "version": "0.1.1", + "resolved": "https://registry.npm.taobao.org/jsbn/download/jsbn-0.1.1.tgz", + "integrity": "sha1-peZUwuWi3rXyAdls77yoDA7y9RM=", + "dev": true + }, + "jsesc": { + "version": "2.5.2", + "resolved": "https://registry.npm.taobao.org/jsesc/download/jsesc-2.5.2.tgz", + "integrity": "sha1-gFZNLkg9rPbo7yCWUKZ98/DCg6Q=", + "dev": true + }, + "json-parse-better-errors": { + "version": "1.0.2", + "resolved": "https://registry.npm.taobao.org/json-parse-better-errors/download/json-parse-better-errors-1.0.2.tgz", + "integrity": "sha1-u4Z8+zRQ5pEHwTHRxRS6s9yLyqk=", + "dev": true + }, + "json-schema": { + "version": "0.2.3", + "resolved": "https://registry.npm.taobao.org/json-schema/download/json-schema-0.2.3.tgz", + "integrity": "sha1-tIDIkuWaLwWVTOcnvT8qTogvnhM=", + "dev": true + }, + "json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npm.taobao.org/json-schema-traverse/download/json-schema-traverse-0.4.1.tgz", + "integrity": "sha1-afaofZUTq4u4/mO9sJecRI5oRmA=", + "dev": true + }, + "json-stable-stringify-without-jsonify": { + "version": "1.0.1", + "resolved": "https://registry.npm.taobao.org/json-stable-stringify-without-jsonify/download/json-stable-stringify-without-jsonify-1.0.1.tgz", + "integrity": "sha1-nbe1lJatPzz+8wp1FC0tkwrXJlE=", + "dev": true + }, + "json-stringify-safe": { + "version": "5.0.1", + "resolved": "https://registry.npm.taobao.org/json-stringify-safe/download/json-stringify-safe-5.0.1.tgz", + "integrity": "sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus=", + "dev": true + }, + "json3": { + "version": "3.3.3", + "resolved": "https://registry.npm.taobao.org/json3/download/json3-3.3.3.tgz", + "integrity": "sha1-f8EON1/FrkLEcFpcwKpvYr4wW4E=", + "dev": true + }, + "json5": { + "version": "2.1.2", + "resolved": "https://registry.npm.taobao.org/json5/download/json5-2.1.2.tgz", + "integrity": "sha1-Q+8fCvmDXdYkdRprf6SIdPstYI4=", + "dev": true, + "requires": { + "minimist": "^1.2.5" + } + }, + "jsonfile": { + "version": "4.0.0", + "resolved": "https://registry.npm.taobao.org/jsonfile/download/jsonfile-4.0.0.tgz", + "integrity": "sha1-h3Gq4HmbZAdrdmQPygWPnBDjPss=", + "dev": true, + "requires": { + "graceful-fs": "^4.1.6" + } + }, + "jsprim": { + "version": "1.4.1", + "resolved": "https://registry.npm.taobao.org/jsprim/download/jsprim-1.4.1.tgz", + "integrity": "sha1-MT5mvB5cwG5Di8G3SZwuXFastqI=", + "dev": true, + "requires": { + "assert-plus": "1.0.0", + "extsprintf": "1.3.0", + "json-schema": "0.2.3", + "verror": "1.10.0" + } + }, + "killable": { + "version": "1.0.1", + "resolved": "https://registry.npm.taobao.org/killable/download/killable-1.0.1.tgz", + "integrity": "sha1-TIzkQRh6Bhx0dPuHygjipjgZSJI=", + "dev": true + }, + "kind-of": { + "version": "6.0.3", + "resolved": "https://registry.npm.taobao.org/kind-of/download/kind-of-6.0.3.tgz", + "integrity": "sha1-B8BQNKbDSfoG4k+jWqdttFgM5N0=", + "dev": true + }, + "launch-editor": { + "version": "2.2.1", + "resolved": "https://registry.npm.taobao.org/launch-editor/download/launch-editor-2.2.1.tgz", + "integrity": "sha1-hxtaPuOdZoD8wm03kwtu7aidsMo=", + "dev": true, + "requires": { + "chalk": "^2.3.0", + "shell-quote": "^1.6.1" + } + }, + "launch-editor-middleware": { + "version": "2.2.1", + "resolved": "https://registry.npm.taobao.org/launch-editor-middleware/download/launch-editor-middleware-2.2.1.tgz", + "integrity": "sha1-4UsH5scVSwpLhqD9NFeE5FgEwVc=", + "dev": true, + "requires": { + "launch-editor": "^2.2.1" + } + }, + "lcid": { + "version": "2.0.0", + "resolved": "https://registry.npm.taobao.org/lcid/download/lcid-2.0.0.tgz", + "integrity": "sha1-bvXS32DlL4LrIopMNz6NHzlyU88=", + "dev": true, + "requires": { + "invert-kv": "^2.0.0" + } + }, + "less": { + "version": "3.11.1", + "resolved": "https://registry.npmjs.org/less/-/less-3.11.1.tgz", + "integrity": "sha512-tlWX341RECuTOvoDIvtFqXsKj072hm3+9ymRBe76/mD6O5ZZecnlAOVDlWAleF2+aohFrxNidXhv2773f6kY7g==", + "dev": true, + "requires": { + "clone": "^2.1.2", + "errno": "^0.1.1", + "graceful-fs": "^4.1.2", + "image-size": "~0.5.0", + "mime": "^1.4.1", + "mkdirp": "^0.5.0", + "promise": "^7.1.1", + "request": "^2.83.0", + "source-map": "~0.6.0", + "tslib": "^1.10.0" + }, + "dependencies": { + "clone": { + "version": "2.1.2", + "resolved": "https://registry.npm.taobao.org/clone/download/clone-2.1.2.tgz", + "integrity": "sha1-G39Ln1kfHo+DZwQBYANFoCiHQ18=", + "dev": true + }, + "mime": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", + "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==", + "dev": true, + "optional": true + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true, + "optional": true + } + } + }, + "less-loader": { + "version": "5.0.0", + "resolved": "https://registry.npm.taobao.org/less-loader/download/less-loader-5.0.0.tgz", + "integrity": "sha1-SY3eOmxsT4h0WO6e0/CGoSrRtGY=", + "dev": true, + "requires": { + "clone": "^2.1.1", + "loader-utils": "^1.1.0", + "pify": "^4.0.1" + }, + "dependencies": { + "clone": { + "version": "2.1.2", + "resolved": "https://registry.npm.taobao.org/clone/download/clone-2.1.2.tgz", + "integrity": "sha1-G39Ln1kfHo+DZwQBYANFoCiHQ18=", + "dev": true + } + } + }, + "leven": { + "version": "3.1.0", + "resolved": "https://registry.npm.taobao.org/leven/download/leven-3.1.0.tgz", + "integrity": "sha1-d4kd6DQGTMy6gq54QrtrFKE+1/I=", + "dev": true + }, + "levenary": { + "version": "1.1.1", + "resolved": "https://registry.npm.taobao.org/levenary/download/levenary-1.1.1.tgz?cache=0&sync_timestamp=1580182411097&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Flevenary%2Fdownload%2Flevenary-1.1.1.tgz", + "integrity": "sha1-hCqe6Y0gdap/ru2+MmeekgX0b3c=", + "dev": true, + "requires": { + "leven": "^3.1.0" + } + }, + "levn": { + "version": "0.3.0", + "resolved": "https://registry.npm.taobao.org/levn/download/levn-0.3.0.tgz", + "integrity": "sha1-OwmSTt+fCDwEkP3UwLxEIeBHZO4=", + "dev": true, + "requires": { + "prelude-ls": "~1.1.2", + "type-check": "~0.3.2" + } + }, + "lines-and-columns": { + "version": "1.1.6", + "resolved": "https://registry.npm.taobao.org/lines-and-columns/download/lines-and-columns-1.1.6.tgz", + "integrity": "sha1-HADHQ7QzzQpOgHWPe2SldEDZ/wA=", + "dev": true + }, + "loader-fs-cache": { + "version": "1.0.3", + "resolved": "https://registry.npm.taobao.org/loader-fs-cache/download/loader-fs-cache-1.0.3.tgz", + "integrity": "sha1-8IZXZG1gcHi+LwoDL4vWndbyd9k=", + "dev": true, + "requires": { + "find-cache-dir": "^0.1.1", + "mkdirp": "^0.5.1" + }, + "dependencies": { + "find-cache-dir": { + "version": "0.1.1", + "resolved": "https://registry.npm.taobao.org/find-cache-dir/download/find-cache-dir-0.1.1.tgz?cache=0&sync_timestamp=1583734806517&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Ffind-cache-dir%2Fdownload%2Ffind-cache-dir-0.1.1.tgz", + "integrity": "sha1-yN765XyKUqinhPnjHFfHQumToLk=", + "dev": true, + "requires": { + "commondir": "^1.0.1", + "mkdirp": "^0.5.1", + "pkg-dir": "^1.0.0" + } + }, + "find-up": { + "version": "1.1.2", + "resolved": "https://registry.npm.taobao.org/find-up/download/find-up-1.1.2.tgz", + "integrity": "sha1-ay6YIrGizgpgq2TWEOzK1TyyTQ8=", + "dev": true, + "requires": { + "path-exists": "^2.0.0", + "pinkie-promise": "^2.0.0" + } + }, + "path-exists": { + "version": "2.1.0", + "resolved": "https://registry.npm.taobao.org/path-exists/download/path-exists-2.1.0.tgz", + "integrity": "sha1-D+tsZPD8UY2adU3V77YscCJ2H0s=", + "dev": true, + "requires": { + "pinkie-promise": "^2.0.0" + } + }, + "pkg-dir": { + "version": "1.0.0", + "resolved": "https://registry.npm.taobao.org/pkg-dir/download/pkg-dir-1.0.0.tgz", + "integrity": "sha1-ektQio1bstYp1EcFb/TpyTFM89Q=", + "dev": true, + "requires": { + "find-up": "^1.0.0" + } + } + } + }, + "loader-runner": { + "version": "2.4.0", + "resolved": "https://registry.npm.taobao.org/loader-runner/download/loader-runner-2.4.0.tgz", + "integrity": "sha1-7UcGa/5TTX6ExMe5mYwqdWB9k1c=", + "dev": true + }, + "loader-utils": { + "version": "1.4.0", + "resolved": "https://registry.npm.taobao.org/loader-utils/download/loader-utils-1.4.0.tgz?cache=0&sync_timestamp=1584472515006&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Floader-utils%2Fdownload%2Floader-utils-1.4.0.tgz", + "integrity": "sha1-xXm140yzSxp07cbB+za/o3HVphM=", + "dev": true, + "requires": { + "big.js": "^5.2.2", + "emojis-list": "^3.0.0", + "json5": "^1.0.1" + }, + "dependencies": { + "json5": { + "version": "1.0.1", + "resolved": "https://registry.npm.taobao.org/json5/download/json5-1.0.1.tgz", + "integrity": "sha1-d5+wAYYE+oVOrL9iUhgNg1Q+Pb4=", + "dev": true, + "requires": { + "minimist": "^1.2.0" + } + } + } + }, + "locate-path": { + "version": "3.0.0", + "resolved": "https://registry.npm.taobao.org/locate-path/download/locate-path-3.0.0.tgz", + "integrity": "sha1-2+w7OrdZdYBxtY/ln8QYca8hQA4=", + "dev": true, + "requires": { + "p-locate": "^3.0.0", + "path-exists": "^3.0.0" + } + }, + "lodash": { + "version": "4.17.15", + "resolved": "https://registry.npm.taobao.org/lodash/download/lodash-4.17.15.tgz", + "integrity": "sha1-tEf2ZwoEVbv+7dETku/zMOoJdUg=", + "dev": true + }, + "lodash.defaultsdeep": { + "version": "4.6.1", + "resolved": "https://registry.npm.taobao.org/lodash.defaultsdeep/download/lodash.defaultsdeep-4.6.1.tgz", + "integrity": "sha1-US6b1yHSctlOPTpjZT+hdRZ0HKY=", + "dev": true + }, + "lodash.kebabcase": { + "version": "4.1.1", + "resolved": "https://registry.npm.taobao.org/lodash.kebabcase/download/lodash.kebabcase-4.1.1.tgz", + "integrity": "sha1-hImxyw0p/4gZXM7KRI/21swpXDY=", + "dev": true + }, + "lodash.mapvalues": { + "version": "4.6.0", + "resolved": "https://registry.npm.taobao.org/lodash.mapvalues/download/lodash.mapvalues-4.6.0.tgz", + "integrity": "sha1-G6+lAF3p3W9PJmaMMMo3IwzJaJw=", + "dev": true + }, + "lodash.memoize": { + "version": "4.1.2", + "resolved": "https://registry.npm.taobao.org/lodash.memoize/download/lodash.memoize-4.1.2.tgz", + "integrity": "sha1-vMbEmkKihA7Zl/Mj6tpezRguC/4=", + "dev": true + }, + "lodash.transform": { + "version": "4.6.0", + "resolved": "https://registry.npm.taobao.org/lodash.transform/download/lodash.transform-4.6.0.tgz", + "integrity": "sha1-EjBkIvYzJK7YSD0/ODMrX2cFR6A=", + "dev": true + }, + "lodash.uniq": { + "version": "4.5.0", + "resolved": "https://registry.npm.taobao.org/lodash.uniq/download/lodash.uniq-4.5.0.tgz", + "integrity": "sha1-0CJTc662Uq3BvILklFM5qEJ1R3M=", + "dev": true + }, + "log-symbols": { + "version": "2.2.0", + "resolved": "https://registry.npm.taobao.org/log-symbols/download/log-symbols-2.2.0.tgz", + "integrity": "sha1-V0Dhxdbw39pK2TI7UzIQfva0xAo=", + "dev": true, + "requires": { + "chalk": "^2.0.1" + } + }, + "loglevel": { + "version": "1.6.7", + "resolved": "https://registry.npm.taobao.org/loglevel/download/loglevel-1.6.7.tgz", + "integrity": "sha1-s+A0IzGIxouIn1uGJBUwb1ZeLFY=", + "dev": true + }, + "loose-envify": { + "version": "1.4.0", + "resolved": "https://registry.npm.taobao.org/loose-envify/download/loose-envify-1.4.0.tgz", + "integrity": "sha1-ce5R+nvkyuwaY4OffmgtgTLTDK8=", + "dev": true, + "requires": { + "js-tokens": "^3.0.0 || ^4.0.0" + } + }, + "lower-case": { + "version": "1.1.4", + "resolved": "https://registry.npm.taobao.org/lower-case/download/lower-case-1.1.4.tgz", + "integrity": "sha1-miyr0bno4K6ZOkv31YdcOcQujqw=", + "dev": true + }, + "lru-cache": { + "version": "5.1.1", + "resolved": "https://registry.npm.taobao.org/lru-cache/download/lru-cache-5.1.1.tgz", + "integrity": "sha1-HaJ+ZxAnGUdpXa9oSOhH8B2EuSA=", + "dev": true, + "requires": { + "yallist": "^3.0.2" + } + }, + "make-dir": { + "version": "2.1.0", + "resolved": "https://registry.npm.taobao.org/make-dir/download/make-dir-2.1.0.tgz", + "integrity": "sha1-XwMQ4YuL6JjMBwCSlaMK5B6R5vU=", + "dev": true, + "requires": { + "pify": "^4.0.1", + "semver": "^5.6.0" + } + }, + "map-age-cleaner": { + "version": "0.1.3", + "resolved": "https://registry.npm.taobao.org/map-age-cleaner/download/map-age-cleaner-0.1.3.tgz", + "integrity": "sha1-fVg6cwZDTAVf5HSw9FB45uG0uSo=", + "dev": true, + "requires": { + "p-defer": "^1.0.0" + } + }, + "map-cache": { + "version": "0.2.2", + "resolved": "https://registry.npm.taobao.org/map-cache/download/map-cache-0.2.2.tgz", + "integrity": "sha1-wyq9C9ZSXZsFFkW7TyasXcmKDb8=", + "dev": true + }, + "map-visit": { + "version": "1.0.0", + "resolved": "https://registry.npm.taobao.org/map-visit/download/map-visit-1.0.0.tgz", + "integrity": "sha1-7Nyo8TFE5mDxtb1B8S80edmN+48=", + "dev": true, + "requires": { + "object-visit": "^1.0.0" + } + }, + "md5.js": { + "version": "1.3.5", + "resolved": "https://registry.npm.taobao.org/md5.js/download/md5.js-1.3.5.tgz", + "integrity": "sha1-tdB7jjIW4+J81yjXL3DR5qNCAF8=", + "dev": true, + "requires": { + "hash-base": "^3.0.0", + "inherits": "^2.0.1", + "safe-buffer": "^5.1.2" + } + }, + "mdn-data": { + "version": "2.0.4", + "resolved": "https://registry.npm.taobao.org/mdn-data/download/mdn-data-2.0.4.tgz?cache=0&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fmdn-data%2Fdownload%2Fmdn-data-2.0.4.tgz", + "integrity": "sha1-aZs8OKxvHXKAkaZGULZdOIUC/Vs=", + "dev": true + }, + "media-typer": { + "version": "0.3.0", + "resolved": "https://registry.npm.taobao.org/media-typer/download/media-typer-0.3.0.tgz", + "integrity": "sha1-hxDXrwqmJvj/+hzgAWhUUmMlV0g=", + "dev": true + }, + "mem": { + "version": "4.3.0", + "resolved": "https://registry.npm.taobao.org/mem/download/mem-4.3.0.tgz", + "integrity": "sha1-Rhr0l7xK4JYIzbLmDu+2m/90QXg=", + "dev": true, + "requires": { + "map-age-cleaner": "^0.1.1", + "mimic-fn": "^2.0.0", + "p-is-promise": "^2.0.0" + }, + "dependencies": { + "mimic-fn": { + "version": "2.1.0", + "resolved": "https://registry.npm.taobao.org/mimic-fn/download/mimic-fn-2.1.0.tgz", + "integrity": "sha1-ftLCzMyvhNP/y3pptXcR/CCDQBs=", + "dev": true + } + } + }, + "memory-fs": { + "version": "0.4.1", + "resolved": "https://registry.npm.taobao.org/memory-fs/download/memory-fs-0.4.1.tgz", + "integrity": "sha1-OpoguEYlI+RHz7x+i7gO1me/xVI=", + "dev": true, + "requires": { + "errno": "^0.1.3", + "readable-stream": "^2.0.1" + } + }, + "merge-descriptors": { + "version": "1.0.1", + "resolved": "https://registry.npm.taobao.org/merge-descriptors/download/merge-descriptors-1.0.1.tgz", + "integrity": "sha1-sAqqVW3YtEVoFQ7J0blT8/kMu2E=", + "dev": true + }, + "merge-source-map": { + "version": "1.1.0", + "resolved": "https://registry.npm.taobao.org/merge-source-map/download/merge-source-map-1.1.0.tgz", + "integrity": "sha1-L93n5gIJOfcJBqaPLXrmheTIxkY=", + "dev": true, + "requires": { + "source-map": "^0.6.1" + }, + "dependencies": { + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npm.taobao.org/source-map/download/source-map-0.6.1.tgz", + "integrity": "sha1-dHIq8y6WFOnCh6jQu95IteLxomM=", + "dev": true + } + } + }, + "merge-stream": { + "version": "2.0.0", + "resolved": "https://registry.npm.taobao.org/merge-stream/download/merge-stream-2.0.0.tgz", + "integrity": "sha1-UoI2KaFN0AyXcPtq1H3GMQ8sH2A=", + "dev": true + }, + "merge2": { + "version": "1.3.0", + "resolved": "https://registry.npm.taobao.org/merge2/download/merge2-1.3.0.tgz", + "integrity": "sha1-WzZu6DsvFYLEj4fkfPGpNSEDyoE=", + "dev": true + }, + "methods": { + "version": "1.1.2", + "resolved": "https://registry.npm.taobao.org/methods/download/methods-1.1.2.tgz", + "integrity": "sha1-VSmk1nZUE07cxSZmVoNbD4Ua/O4=", + "dev": true + }, + "micromatch": { + "version": "3.1.10", + "resolved": "https://registry.npm.taobao.org/micromatch/download/micromatch-3.1.10.tgz", + "integrity": "sha1-cIWbyVyYQJUvNZoGij/En57PrCM=", + "dev": true, + "requires": { + "arr-diff": "^4.0.0", + "array-unique": "^0.3.2", + "braces": "^2.3.1", + "define-property": "^2.0.2", + "extend-shallow": "^3.0.2", + "extglob": "^2.0.4", + "fragment-cache": "^0.2.1", + "kind-of": "^6.0.2", + "nanomatch": "^1.2.9", + "object.pick": "^1.3.0", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.2" + } + }, + "miller-rabin": { + "version": "4.0.1", + "resolved": "https://registry.npm.taobao.org/miller-rabin/download/miller-rabin-4.0.1.tgz", + "integrity": "sha1-8IA1HIZbDcViqEYpZtqlNUPHik0=", + "dev": true, + "requires": { + "bn.js": "^4.0.0", + "brorand": "^1.0.1" + } + }, + "mime": { + "version": "2.4.4", + "resolved": "https://registry.npm.taobao.org/mime/download/mime-2.4.4.tgz", + "integrity": "sha1-vXuRE1/GsBzePpuuM9ZZtj2IV+U=", + "dev": true + }, + "mime-db": { + "version": "1.43.0", + "resolved": "https://registry.npm.taobao.org/mime-db/download/mime-db-1.43.0.tgz?cache=0&sync_timestamp=1578281173535&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fmime-db%2Fdownload%2Fmime-db-1.43.0.tgz", + "integrity": "sha1-ChLgUCZQ5HPXNVNQUOfI9OtPrlg=", + "dev": true + }, + "mime-types": { + "version": "2.1.26", + "resolved": "https://registry.npm.taobao.org/mime-types/download/mime-types-2.1.26.tgz?cache=0&sync_timestamp=1578282559977&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fmime-types%2Fdownload%2Fmime-types-2.1.26.tgz", + "integrity": "sha1-nJIfwJt+FJpl39wNpNIJlyALCgY=", + "dev": true, + "requires": { + "mime-db": "1.43.0" + } + }, + "mimic-fn": { + "version": "1.2.0", + "resolved": "https://registry.npm.taobao.org/mimic-fn/download/mimic-fn-1.2.0.tgz", + "integrity": "sha1-ggyGo5M0ZA6ZUWkovQP8qIBX0CI=", + "dev": true + }, + "mini-css-extract-plugin": { + "version": "0.9.0", + "resolved": "https://registry.npm.taobao.org/mini-css-extract-plugin/download/mini-css-extract-plugin-0.9.0.tgz?cache=0&sync_timestamp=1576856580721&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fmini-css-extract-plugin%2Fdownload%2Fmini-css-extract-plugin-0.9.0.tgz", + "integrity": "sha1-R/LPB6oWWrNXM7H8l9TEbAVkM54=", + "dev": true, + "requires": { + "loader-utils": "^1.1.0", + "normalize-url": "1.9.1", + "schema-utils": "^1.0.0", + "webpack-sources": "^1.1.0" + }, + "dependencies": { + "normalize-url": { + "version": "1.9.1", + "resolved": "https://registry.npm.taobao.org/normalize-url/download/normalize-url-1.9.1.tgz", + "integrity": "sha1-LMDWazHqIwNkWENuNiDYWVTGbDw=", + "dev": true, + "requires": { + "object-assign": "^4.0.1", + "prepend-http": "^1.0.0", + "query-string": "^4.1.0", + "sort-keys": "^1.0.0" + } + }, + "schema-utils": { + "version": "1.0.0", + "resolved": "https://registry.npm.taobao.org/schema-utils/download/schema-utils-1.0.0.tgz", + "integrity": "sha1-C3mpMgTXtgDUsoUNH2bCo0lRx3A=", + "dev": true, + "requires": { + "ajv": "^6.1.0", + "ajv-errors": "^1.0.0", + "ajv-keywords": "^3.1.0" + } + } + } + }, + "minimalistic-assert": { + "version": "1.0.1", + "resolved": "https://registry.npm.taobao.org/minimalistic-assert/download/minimalistic-assert-1.0.1.tgz", + "integrity": "sha1-LhlN4ERibUoQ5/f7wAznPoPk1cc=", + "dev": true + }, + "minimalistic-crypto-utils": { + "version": "1.0.1", + "resolved": "https://registry.npm.taobao.org/minimalistic-crypto-utils/download/minimalistic-crypto-utils-1.0.1.tgz", + "integrity": "sha1-9sAMHAsIIkblxNmd+4x8CDsrWCo=", + "dev": true + }, + "minimatch": { + "version": "3.0.4", + "resolved": "https://registry.npm.taobao.org/minimatch/download/minimatch-3.0.4.tgz", + "integrity": "sha1-UWbihkV/AzBgZL5Ul+jbsMPTIIM=", + "dev": true, + "requires": { + "brace-expansion": "^1.1.7" + } + }, + "minimist": { + "version": "1.2.5", + "resolved": "https://registry.npm.taobao.org/minimist/download/minimist-1.2.5.tgz", + "integrity": "sha1-Z9ZgFLZqaoqqDAg8X9WN9OTpdgI=", + "dev": true + }, + "minipass": { + "version": "3.1.1", + "resolved": "https://registry.npm.taobao.org/minipass/download/minipass-3.1.1.tgz", + "integrity": "sha1-dgfOd4RyoYWtbYkIKqIHD3nO3NU=", + "dev": true, + "requires": { + "yallist": "^4.0.0" + }, + "dependencies": { + "yallist": { + "version": "4.0.0", + "resolved": "https://registry.npm.taobao.org/yallist/download/yallist-4.0.0.tgz", + "integrity": "sha1-m7knkNnA7/7GO+c1GeEaNQGaOnI=", + "dev": true + } + } + }, + "minipass-collect": { + "version": "1.0.2", + "resolved": "https://registry.npm.taobao.org/minipass-collect/download/minipass-collect-1.0.2.tgz", + "integrity": "sha1-IrgTv3Rdxu26JXa5QAIq1u3Ixhc=", + "dev": true, + "requires": { + "minipass": "^3.0.0" + } + }, + "minipass-flush": { + "version": "1.0.5", + "resolved": "https://registry.npm.taobao.org/minipass-flush/download/minipass-flush-1.0.5.tgz", + "integrity": "sha1-gucTXX6JpQ/+ZGEKeHlTxMTLs3M=", + "dev": true, + "requires": { + "minipass": "^3.0.0" + } + }, + "minipass-pipeline": { + "version": "1.2.2", + "resolved": "https://registry.npm.taobao.org/minipass-pipeline/download/minipass-pipeline-1.2.2.tgz", + "integrity": "sha1-PctrtKVG4ylpx61xDyx5qGq7qTo=", + "dev": true, + "requires": { + "minipass": "^3.0.0" + } + }, + "mississippi": { + "version": "3.0.0", + "resolved": "https://registry.npm.taobao.org/mississippi/download/mississippi-3.0.0.tgz", + "integrity": "sha1-6goykfl+C16HdrNj1fChLZTGcCI=", + "dev": true, + "requires": { + "concat-stream": "^1.5.0", + "duplexify": "^3.4.2", + "end-of-stream": "^1.1.0", + "flush-write-stream": "^1.0.0", + "from2": "^2.1.0", + "parallel-transform": "^1.1.0", + "pump": "^3.0.0", + "pumpify": "^1.3.3", + "stream-each": "^1.1.0", + "through2": "^2.0.0" + } + }, + "mixin-deep": { + "version": "1.3.2", + "resolved": "https://registry.npm.taobao.org/mixin-deep/download/mixin-deep-1.3.2.tgz", + "integrity": "sha1-ESC0PcNZp4Xc5ltVuC4lfM9HlWY=", + "dev": true, + "requires": { + "for-in": "^1.0.2", + "is-extendable": "^1.0.1" + }, + "dependencies": { + "is-extendable": { + "version": "1.0.1", + "resolved": "https://registry.npm.taobao.org/is-extendable/download/is-extendable-1.0.1.tgz", + "integrity": "sha1-p0cPnkJnM9gb2B4RVSZOOjUHyrQ=", + "dev": true, + "requires": { + "is-plain-object": "^2.0.4" + } + } + } + }, + "mkdirp": { + "version": "0.5.4", + "resolved": "https://registry.npm.taobao.org/mkdirp/download/mkdirp-0.5.4.tgz", + "integrity": "sha1-/QFQSmeX7Fyb6B/0PSBJYe1kpRI=", + "dev": true, + "requires": { + "minimist": "^1.2.5" + } + }, + "move-concurrently": { + "version": "1.0.1", + "resolved": "https://registry.npm.taobao.org/move-concurrently/download/move-concurrently-1.0.1.tgz", + "integrity": "sha1-viwAX9oy4LKa8fBdfEszIUxwH5I=", + "dev": true, + "requires": { + "aproba": "^1.1.1", + "copy-concurrently": "^1.0.0", + "fs-write-stream-atomic": "^1.0.8", + "mkdirp": "^0.5.1", + "rimraf": "^2.5.4", + "run-queue": "^1.0.3" + } + }, + "ms": { + "version": "2.1.2", + "resolved": "https://registry.npm.taobao.org/ms/download/ms-2.1.2.tgz", + "integrity": "sha1-0J0fNXtEP0kzgqjrPM0YOHKuYAk=", + "dev": true + }, + "multicast-dns": { + "version": "6.2.3", + "resolved": "https://registry.npm.taobao.org/multicast-dns/download/multicast-dns-6.2.3.tgz?cache=0&sync_timestamp=1581683236954&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fmulticast-dns%2Fdownload%2Fmulticast-dns-6.2.3.tgz", + "integrity": "sha1-oOx72QVcQoL3kMPIL04o2zsxsik=", + "dev": true, + "requires": { + "dns-packet": "^1.3.1", + "thunky": "^1.0.2" + } + }, + "multicast-dns-service-types": { + "version": "1.1.0", + "resolved": "https://registry.npm.taobao.org/multicast-dns-service-types/download/multicast-dns-service-types-1.1.0.tgz", + "integrity": "sha1-iZ8R2WhuXgXLkbNdXw5jt3PPyQE=", + "dev": true + }, + "mute-stream": { + "version": "0.0.7", + "resolved": "https://registry.npm.taobao.org/mute-stream/download/mute-stream-0.0.7.tgz", + "integrity": "sha1-MHXOk7whuPq0PhvE2n6BFe0ee6s=", + "dev": true + }, + "mz": { + "version": "2.7.0", + "resolved": "https://registry.npm.taobao.org/mz/download/mz-2.7.0.tgz", + "integrity": "sha1-lQCAV6Vsr63CvGPd5/n/aVWUjjI=", + "dev": true, + "requires": { + "any-promise": "^1.0.0", + "object-assign": "^4.0.1", + "thenify-all": "^1.0.0" + } + }, + "nan": { + "version": "2.14.0", + "resolved": "https://registry.npm.taobao.org/nan/download/nan-2.14.0.tgz", + "integrity": "sha1-eBj3IgJ7JFmobwKV1DTR/CM2xSw=", + "dev": true, + "optional": true + }, + "nanomatch": { + "version": "1.2.13", + "resolved": "https://registry.npm.taobao.org/nanomatch/download/nanomatch-1.2.13.tgz", + "integrity": "sha1-uHqKpPwN6P5r6IiVs4mD/yZb0Rk=", + "dev": true, + "requires": { + "arr-diff": "^4.0.0", + "array-unique": "^0.3.2", + "define-property": "^2.0.2", + "extend-shallow": "^3.0.2", + "fragment-cache": "^0.2.1", + "is-windows": "^1.0.2", + "kind-of": "^6.0.2", + "object.pick": "^1.3.0", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.1" + } + }, + "natural-compare": { + "version": "1.4.0", + "resolved": "https://registry.npm.taobao.org/natural-compare/download/natural-compare-1.4.0.tgz", + "integrity": "sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc=", + "dev": true + }, + "negotiator": { + "version": "0.6.2", + "resolved": "https://registry.npm.taobao.org/negotiator/download/negotiator-0.6.2.tgz", + "integrity": "sha1-/qz3zPUlp3rpY0Q2pkiD/+yjRvs=", + "dev": true + }, + "neo-async": { + "version": "2.6.1", + "resolved": "https://registry.npm.taobao.org/neo-async/download/neo-async-2.6.1.tgz", + "integrity": "sha1-rCetpmFn+ohJpq3dg39rGJrSCBw=", + "dev": true + }, + "nice-try": { + "version": "1.0.5", + "resolved": "https://registry.npm.taobao.org/nice-try/download/nice-try-1.0.5.tgz?cache=0&sync_timestamp=1584699756095&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fnice-try%2Fdownload%2Fnice-try-1.0.5.tgz", + "integrity": "sha1-ozeKdpbOfSI+iPybdkvX7xCJ42Y=", + "dev": true + }, + "no-case": { + "version": "2.3.2", + "resolved": "https://registry.npm.taobao.org/no-case/download/no-case-2.3.2.tgz?cache=0&sync_timestamp=1576721505371&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fno-case%2Fdownload%2Fno-case-2.3.2.tgz", + "integrity": "sha1-YLgTOWvjmz8SiKTB7V0efSi0ZKw=", + "dev": true, + "requires": { + "lower-case": "^1.1.1" + } + }, + "node-forge": { + "version": "0.9.0", + "resolved": "https://registry.npm.taobao.org/node-forge/download/node-forge-0.9.0.tgz?cache=0&sync_timestamp=1569524669712&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fnode-forge%2Fdownload%2Fnode-forge-0.9.0.tgz", + "integrity": "sha1-1iQFDtu0SHStyhK7mlLsY8t4JXk=", + "dev": true + }, + "node-ipc": { + "version": "9.1.1", + "resolved": "https://registry.npm.taobao.org/node-ipc/download/node-ipc-9.1.1.tgz", + "integrity": "sha1-TiRe1pOOZRAOWV68XcNLFujdXWk=", + "dev": true, + "requires": { + "event-pubsub": "4.3.0", + "js-message": "1.0.5", + "js-queue": "2.0.0" + } + }, + "node-libs-browser": { + "version": "2.2.1", + "resolved": "https://registry.npm.taobao.org/node-libs-browser/download/node-libs-browser-2.2.1.tgz", + "integrity": "sha1-tk9RPRgzhiX5A0bSew0jXmMfZCU=", + "dev": true, + "requires": { + "assert": "^1.1.1", + "browserify-zlib": "^0.2.0", + "buffer": "^4.3.0", + "console-browserify": "^1.1.0", + "constants-browserify": "^1.0.0", + "crypto-browserify": "^3.11.0", + "domain-browser": "^1.1.1", + "events": "^3.0.0", + "https-browserify": "^1.0.0", + "os-browserify": "^0.3.0", + "path-browserify": "0.0.1", + "process": "^0.11.10", + "punycode": "^1.2.4", + "querystring-es3": "^0.2.0", + "readable-stream": "^2.3.3", + "stream-browserify": "^2.0.1", + "stream-http": "^2.7.2", + "string_decoder": "^1.0.0", + "timers-browserify": "^2.0.4", + "tty-browserify": "0.0.0", + "url": "^0.11.0", + "util": "^0.11.0", + "vm-browserify": "^1.0.1" + }, + "dependencies": { + "punycode": { + "version": "1.4.1", + "resolved": "https://registry.npm.taobao.org/punycode/download/punycode-1.4.1.tgz", + "integrity": "sha1-wNWmOycYgArY4esPpSachN1BhF4=", + "dev": true + } + } + }, + "node-releases": { + "version": "1.1.52", + "resolved": "https://registry.npm.taobao.org/node-releases/download/node-releases-1.1.52.tgz?cache=0&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fnode-releases%2Fdownload%2Fnode-releases-1.1.52.tgz", + "integrity": "sha1-vP/uPgp1jpLkTs+uzQpHVUsLy6k=", + "dev": true, + "requires": { + "semver": "^6.3.0" + }, + "dependencies": { + "semver": { + "version": "6.3.0", + "resolved": "https://registry.npm.taobao.org/semver/download/semver-6.3.0.tgz", + "integrity": "sha1-7gpkyK9ejO6mdoexM3YeG+y9HT0=", + "dev": true + } + } + }, + "normalize-package-data": { + "version": "2.5.0", + "resolved": "https://registry.npm.taobao.org/normalize-package-data/download/normalize-package-data-2.5.0.tgz", + "integrity": "sha1-5m2xg4sgDB38IzIl0SyzZSDiNKg=", + "dev": true, + "requires": { + "hosted-git-info": "^2.1.4", + "resolve": "^1.10.0", + "semver": "2 || 3 || 4 || 5", + "validate-npm-package-license": "^3.0.1" + } + }, + "normalize-path": { + "version": "3.0.0", + "resolved": "https://registry.npm.taobao.org/normalize-path/download/normalize-path-3.0.0.tgz", + "integrity": "sha1-Dc1p/yOhybEf0JeDFmRKA4ghamU=", + "dev": true + }, + "normalize-range": { + "version": "0.1.2", + "resolved": "https://registry.npm.taobao.org/normalize-range/download/normalize-range-0.1.2.tgz", + "integrity": "sha1-LRDAa9/TEuqXd2laTShDlFa3WUI=", + "dev": true + }, + "normalize-url": { + "version": "3.3.0", + "resolved": "https://registry.npm.taobao.org/normalize-url/download/normalize-url-3.3.0.tgz", + "integrity": "sha1-suHE3E98bVd0PfczpPWXjRhlBVk=", + "dev": true + }, + "normalize-wheel": { + "version": "1.0.1", + "resolved": "https://registry.npm.taobao.org/normalize-wheel/download/normalize-wheel-1.0.1.tgz", + "integrity": "sha1-rsiGr/2wRQcNhWRH32Ls+GFG7EU=" + }, + "npm": { + "version": "6.14.4", + "resolved": "https://registry.npmjs.org/npm/-/npm-6.14.4.tgz", + "integrity": "sha512-B8UDDbWvdkW6RgXFn8/h2cHJP/u/FPa4HWeGzW23aNEBARN3QPrRaHqPIZW2NSN3fW649gtgUDNZpaRs0zTMPw==", + "requires": { + "JSONStream": "^1.3.5", + "abbrev": "~1.1.1", + "ansicolors": "~0.3.2", + "ansistyles": "~0.1.3", + "aproba": "^2.0.0", + "archy": "~1.0.0", + "bin-links": "^1.1.7", + "bluebird": "^3.5.5", + "byte-size": "^5.0.1", + "cacache": "^12.0.3", + "call-limit": "^1.1.1", + "chownr": "^1.1.4", + "ci-info": "^2.0.0", + "cli-columns": "^3.1.2", + "cli-table3": "^0.5.1", + "cmd-shim": "^3.0.3", + "columnify": "~1.5.4", + "config-chain": "^1.1.12", + "debuglog": "*", + "detect-indent": "~5.0.0", + "detect-newline": "^2.1.0", + "dezalgo": "~1.0.3", + "editor": "~1.0.0", + "figgy-pudding": "^3.5.1", + "find-npm-prefix": "^1.0.2", + "fs-vacuum": "~1.2.10", + "fs-write-stream-atomic": "~1.0.10", + "gentle-fs": "^2.3.0", + "glob": "^7.1.6", + "graceful-fs": "^4.2.3", + "has-unicode": "~2.0.1", + "hosted-git-info": "^2.8.8", + "iferr": "^1.0.2", + "imurmurhash": "*", + "infer-owner": "^1.0.4", + "inflight": "~1.0.6", + "inherits": "^2.0.4", + "ini": "^1.3.5", + "init-package-json": "^1.10.3", + "is-cidr": "^3.0.0", + "json-parse-better-errors": "^1.0.2", + "lazy-property": "~1.0.0", + "libcipm": "^4.0.7", + "libnpm": "^3.0.1", + "libnpmaccess": "^3.0.2", + "libnpmhook": "^5.0.3", + "libnpmorg": "^1.0.1", + "libnpmsearch": "^2.0.2", + "libnpmteam": "^1.0.2", + "libnpx": "^10.2.2", + "lock-verify": "^2.1.0", + "lockfile": "^1.0.4", + "lodash._baseindexof": "*", + "lodash._baseuniq": "~4.6.0", + "lodash._bindcallback": "*", + "lodash._cacheindexof": "*", + "lodash._createcache": "*", + "lodash._getnative": "*", + "lodash.clonedeep": "~4.5.0", + "lodash.restparam": "*", + "lodash.union": "~4.6.0", + "lodash.uniq": "~4.5.0", + "lodash.without": "~4.4.0", + "lru-cache": "^5.1.1", + "meant": "~1.0.1", + "mississippi": "^3.0.0", + "mkdirp": "^0.5.4", + "move-concurrently": "^1.0.1", + "node-gyp": "^5.1.0", + "nopt": "~4.0.1", + "normalize-package-data": "^2.5.0", + "npm-audit-report": "^1.3.2", + "npm-cache-filename": "~1.0.2", + "npm-install-checks": "^3.0.2", + "npm-lifecycle": "^3.1.4", + "npm-package-arg": "^6.1.1", + "npm-packlist": "^1.4.8", + "npm-pick-manifest": "^3.0.2", + "npm-profile": "^4.0.4", + "npm-registry-fetch": "^4.0.3", + "npm-user-validate": "~1.0.0", + "npmlog": "~4.1.2", + "once": "~1.4.0", + "opener": "^1.5.1", + "osenv": "^0.1.5", + "pacote": "^9.5.12", + "path-is-inside": "~1.0.2", + "promise-inflight": "~1.0.1", + "qrcode-terminal": "^0.12.0", + "query-string": "^6.8.2", + "qw": "~1.0.1", + "read": "~1.0.7", + "read-cmd-shim": "^1.0.5", + "read-installed": "~4.0.3", + "read-package-json": "^2.1.1", + "read-package-tree": "^5.3.1", + "readable-stream": "^3.6.0", + "readdir-scoped-modules": "^1.1.0", + "request": "^2.88.0", + "retry": "^0.12.0", + "rimraf": "^2.7.1", + "safe-buffer": "^5.1.2", + "semver": "^5.7.1", + "sha": "^3.0.0", + "slide": "~1.1.6", + "sorted-object": "~2.0.1", + "sorted-union-stream": "~2.1.3", + "ssri": "^6.0.1", + "stringify-package": "^1.0.1", + "tar": "^4.4.13", + "text-table": "~0.2.0", + "tiny-relative-date": "^1.3.0", + "uid-number": "0.0.6", + "umask": "~1.1.0", + "unique-filename": "^1.1.1", + "unpipe": "~1.0.0", + "update-notifier": "^2.5.0", + "uuid": "^3.3.3", + "validate-npm-package-license": "^3.0.4", + "validate-npm-package-name": "~3.0.0", + "which": "^1.3.1", + "worker-farm": "^1.7.0", + "write-file-atomic": "^2.4.3" + }, + "dependencies": { + "JSONStream": { + "version": "1.3.5", + "bundled": true, + "requires": { + "jsonparse": "^1.2.0", + "through": ">=2.2.7 <3" + } + }, + "abbrev": { + "version": "1.1.1", + "bundled": true + }, + "agent-base": { + "version": "4.3.0", + "bundled": true, + "requires": { + "es6-promisify": "^5.0.0" + } + }, + "agentkeepalive": { + "version": "3.5.2", + "bundled": true, + "requires": { + "humanize-ms": "^1.2.1" + } + }, + "ajv": { + "version": "5.5.2", + "bundled": true, + "requires": { + "co": "^4.6.0", + "fast-deep-equal": "^1.0.0", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.3.0" + } + }, + "ansi-align": { + "version": "2.0.0", + "bundled": true, + "requires": { + "string-width": "^2.0.0" + } + }, + "ansi-regex": { + "version": "2.1.1", + "bundled": true + }, + "ansi-styles": { + "version": "3.2.1", + "bundled": true, + "requires": { + "color-convert": "^1.9.0" + } + }, + "ansicolors": { + "version": "0.3.2", + "bundled": true + }, + "ansistyles": { + "version": "0.1.3", + "bundled": true + }, + "aproba": { + "version": "2.0.0", + "bundled": true + }, + "archy": { + "version": "1.0.0", + "bundled": true + }, + "are-we-there-yet": { + "version": "1.1.4", + "bundled": true, + "requires": { + "delegates": "^1.0.0", + "readable-stream": "^2.0.6" + }, + "dependencies": { + "readable-stream": { + "version": "2.3.6", + "bundled": true, + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "string_decoder": { + "version": "1.1.1", + "bundled": true, + "requires": { + "safe-buffer": "~5.1.0" + } + } + } + }, + "asap": { + "version": "2.0.6", + "bundled": true + }, + "asn1": { + "version": "0.2.4", + "bundled": true, + "requires": { + "safer-buffer": "~2.1.0" + } + }, + "assert-plus": { + "version": "1.0.0", + "bundled": true + }, + "asynckit": { + "version": "0.4.0", + "bundled": true + }, + "aws-sign2": { + "version": "0.7.0", + "bundled": true + }, + "aws4": { + "version": "1.8.0", + "bundled": true + }, + "balanced-match": { + "version": "1.0.0", + "bundled": true + }, + "bcrypt-pbkdf": { + "version": "1.0.2", + "bundled": true, + "optional": true, + "requires": { + "tweetnacl": "^0.14.3" + } + }, + "bin-links": { + "version": "1.1.7", + "bundled": true, + "requires": { + "bluebird": "^3.5.3", + "cmd-shim": "^3.0.0", + "gentle-fs": "^2.3.0", + "graceful-fs": "^4.1.15", + "npm-normalize-package-bin": "^1.0.0", + "write-file-atomic": "^2.3.0" + } + }, + "bluebird": { + "version": "3.5.5", + "bundled": true + }, + "boxen": { + "version": "1.3.0", + "bundled": true, + "requires": { + "ansi-align": "^2.0.0", + "camelcase": "^4.0.0", + "chalk": "^2.0.1", + "cli-boxes": "^1.0.0", + "string-width": "^2.0.0", + "term-size": "^1.2.0", + "widest-line": "^2.0.0" + } + }, + "brace-expansion": { + "version": "1.1.11", + "bundled": true, + "requires": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "buffer-from": { + "version": "1.0.0", + "bundled": true + }, + "builtins": { + "version": "1.0.3", + "bundled": true + }, + "byline": { + "version": "5.0.0", + "bundled": true + }, + "byte-size": { + "version": "5.0.1", + "bundled": true + }, + "cacache": { + "version": "12.0.3", + "bundled": true, + "requires": { + "bluebird": "^3.5.5", + "chownr": "^1.1.1", + "figgy-pudding": "^3.5.1", + "glob": "^7.1.4", + "graceful-fs": "^4.1.15", + "infer-owner": "^1.0.3", + "lru-cache": "^5.1.1", + "mississippi": "^3.0.0", + "mkdirp": "^0.5.1", + "move-concurrently": "^1.0.1", + "promise-inflight": "^1.0.1", + "rimraf": "^2.6.3", + "ssri": "^6.0.1", + "unique-filename": "^1.1.1", + "y18n": "^4.0.0" + } + }, + "call-limit": { + "version": "1.1.1", + "bundled": true + }, + "camelcase": { + "version": "4.1.0", + "bundled": true + }, + "capture-stack-trace": { + "version": "1.0.0", + "bundled": true + }, + "caseless": { + "version": "0.12.0", + "bundled": true + }, + "chalk": { + "version": "2.4.1", + "bundled": true, + "requires": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + } + }, + "chownr": { + "version": "1.1.4", + "bundled": true + }, + "ci-info": { + "version": "2.0.0", + "bundled": true + }, + "cidr-regex": { + "version": "2.0.10", + "bundled": true, + "requires": { + "ip-regex": "^2.1.0" + } + }, + "cli-boxes": { + "version": "1.0.0", + "bundled": true + }, + "cli-columns": { + "version": "3.1.2", + "bundled": true, + "requires": { + "string-width": "^2.0.0", + "strip-ansi": "^3.0.1" + } + }, + "cli-table3": { + "version": "0.5.1", + "bundled": true, + "requires": { + "colors": "^1.1.2", + "object-assign": "^4.1.0", + "string-width": "^2.1.1" + } + }, + "cliui": { + "version": "4.1.0", + "bundled": true, + "requires": { + "string-width": "^2.1.1", + "strip-ansi": "^4.0.0", + "wrap-ansi": "^2.0.0" + }, + "dependencies": { + "ansi-regex": { + "version": "3.0.0", + "bundled": true + }, + "strip-ansi": { + "version": "4.0.0", + "bundled": true, + "requires": { + "ansi-regex": "^3.0.0" + } + } + } + }, + "clone": { + "version": "1.0.4", + "bundled": true + }, + "cmd-shim": { + "version": "3.0.3", + "bundled": true, + "requires": { + "graceful-fs": "^4.1.2", + "mkdirp": "~0.5.0" + } + }, + "co": { + "version": "4.6.0", + "bundled": true + }, + "code-point-at": { + "version": "1.1.0", + "bundled": true + }, + "color-convert": { + "version": "1.9.1", + "bundled": true, + "requires": { + "color-name": "^1.1.1" + } + }, + "color-name": { + "version": "1.1.3", + "bundled": true + }, + "colors": { + "version": "1.3.3", + "bundled": true, + "optional": true + }, + "columnify": { + "version": "1.5.4", + "bundled": true, + "requires": { + "strip-ansi": "^3.0.0", + "wcwidth": "^1.0.0" + } + }, + "combined-stream": { + "version": "1.0.6", + "bundled": true, + "requires": { + "delayed-stream": "~1.0.0" + } + }, + "concat-map": { + "version": "0.0.1", + "bundled": true + }, + "concat-stream": { + "version": "1.6.2", + "bundled": true, + "requires": { + "buffer-from": "^1.0.0", + "inherits": "^2.0.3", + "readable-stream": "^2.2.2", + "typedarray": "^0.0.6" + }, + "dependencies": { + "readable-stream": { + "version": "2.3.6", + "bundled": true, + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "string_decoder": { + "version": "1.1.1", + "bundled": true, + "requires": { + "safe-buffer": "~5.1.0" + } + } + } + }, + "config-chain": { + "version": "1.1.12", + "bundled": true, + "requires": { + "ini": "^1.3.4", + "proto-list": "~1.2.1" + } + }, + "configstore": { + "version": "3.1.2", + "bundled": true, + "requires": { + "dot-prop": "^4.1.0", + "graceful-fs": "^4.1.2", + "make-dir": "^1.0.0", + "unique-string": "^1.0.0", + "write-file-atomic": "^2.0.0", + "xdg-basedir": "^3.0.0" + } + }, + "console-control-strings": { + "version": "1.1.0", + "bundled": true + }, + "copy-concurrently": { + "version": "1.0.5", + "bundled": true, + "requires": { + "aproba": "^1.1.1", + "fs-write-stream-atomic": "^1.0.8", + "iferr": "^0.1.5", + "mkdirp": "^0.5.1", + "rimraf": "^2.5.4", + "run-queue": "^1.0.0" + }, + "dependencies": { + "aproba": { + "version": "1.2.0", + "bundled": true + }, + "iferr": { + "version": "0.1.5", + "bundled": true + } + } + }, + "core-util-is": { + "version": "1.0.2", + "bundled": true + }, + "create-error-class": { + "version": "3.0.2", + "bundled": true, + "requires": { + "capture-stack-trace": "^1.0.0" + } + }, + "cross-spawn": { + "version": "5.1.0", + "bundled": true, + "requires": { + "lru-cache": "^4.0.1", + "shebang-command": "^1.2.0", + "which": "^1.2.9" + }, + "dependencies": { + "lru-cache": { + "version": "4.1.5", + "bundled": true, + "requires": { + "pseudomap": "^1.0.2", + "yallist": "^2.1.2" + } + }, + "yallist": { + "version": "2.1.2", + "bundled": true + } + } + }, + "crypto-random-string": { + "version": "1.0.0", + "bundled": true + }, + "cyclist": { + "version": "0.2.2", + "bundled": true + }, + "dashdash": { + "version": "1.14.1", + "bundled": true, + "requires": { + "assert-plus": "^1.0.0" + } + }, + "debug": { + "version": "3.1.0", + "bundled": true, + "requires": { + "ms": "2.0.0" + }, + "dependencies": { + "ms": { + "version": "2.0.0", + "bundled": true + } + } + }, + "debuglog": { + "version": "1.0.1", + "bundled": true + }, + "decamelize": { + "version": "1.2.0", + "bundled": true + }, + "decode-uri-component": { + "version": "0.2.0", + "bundled": true + }, + "deep-extend": { + "version": "0.6.0", + "bundled": true + }, + "defaults": { + "version": "1.0.3", + "bundled": true, + "requires": { + "clone": "^1.0.2" + } + }, + "define-properties": { + "version": "1.1.3", + "bundled": true, + "requires": { + "object-keys": "^1.0.12" + } + }, + "delayed-stream": { + "version": "1.0.0", + "bundled": true + }, + "delegates": { + "version": "1.0.0", + "bundled": true + }, + "detect-indent": { + "version": "5.0.0", + "bundled": true + }, + "detect-newline": { + "version": "2.1.0", + "bundled": true + }, + "dezalgo": { + "version": "1.0.3", + "bundled": true, + "requires": { + "asap": "^2.0.0", + "wrappy": "1" + } + }, + "dot-prop": { + "version": "4.2.0", + "bundled": true, + "requires": { + "is-obj": "^1.0.0" + } + }, + "dotenv": { + "version": "5.0.1", + "bundled": true + }, + "duplexer3": { + "version": "0.1.4", + "bundled": true + }, + "duplexify": { + "version": "3.6.0", + "bundled": true, + "requires": { + "end-of-stream": "^1.0.0", + "inherits": "^2.0.1", + "readable-stream": "^2.0.0", + "stream-shift": "^1.0.0" + }, + "dependencies": { + "readable-stream": { + "version": "2.3.6", + "bundled": true, + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "string_decoder": { + "version": "1.1.1", + "bundled": true, + "requires": { + "safe-buffer": "~5.1.0" + } + } + } + }, + "ecc-jsbn": { + "version": "0.1.2", + "bundled": true, + "optional": true, + "requires": { + "jsbn": "~0.1.0", + "safer-buffer": "^2.1.0" + } + }, + "editor": { + "version": "1.0.0", + "bundled": true + }, + "encoding": { + "version": "0.1.12", + "bundled": true, + "requires": { + "iconv-lite": "~0.4.13" + } + }, + "end-of-stream": { + "version": "1.4.1", + "bundled": true, + "requires": { + "once": "^1.4.0" + } + }, + "env-paths": { + "version": "2.2.0", + "bundled": true + }, + "err-code": { + "version": "1.1.2", + "bundled": true + }, + "errno": { + "version": "0.1.7", + "bundled": true, + "requires": { + "prr": "~1.0.1" + } + }, + "es-abstract": { + "version": "1.12.0", + "bundled": true, + "requires": { + "es-to-primitive": "^1.1.1", + "function-bind": "^1.1.1", + "has": "^1.0.1", + "is-callable": "^1.1.3", + "is-regex": "^1.0.4" + } + }, + "es-to-primitive": { + "version": "1.2.0", + "bundled": true, + "requires": { + "is-callable": "^1.1.4", + "is-date-object": "^1.0.1", + "is-symbol": "^1.0.2" + } + }, + "es6-promise": { + "version": "4.2.8", + "bundled": true + }, + "es6-promisify": { + "version": "5.0.0", + "bundled": true, + "requires": { + "es6-promise": "^4.0.3" + } + }, + "escape-string-regexp": { + "version": "1.0.5", + "bundled": true + }, + "execa": { + "version": "0.7.0", + "bundled": true, + "requires": { + "cross-spawn": "^5.0.1", + "get-stream": "^3.0.0", + "is-stream": "^1.1.0", + "npm-run-path": "^2.0.0", + "p-finally": "^1.0.0", + "signal-exit": "^3.0.0", + "strip-eof": "^1.0.0" + }, + "dependencies": { + "get-stream": { + "version": "3.0.0", + "bundled": true + } + } + }, + "extend": { + "version": "3.0.2", + "bundled": true + }, + "extsprintf": { + "version": "1.3.0", + "bundled": true + }, + "fast-deep-equal": { + "version": "1.1.0", + "bundled": true + }, + "fast-json-stable-stringify": { + "version": "2.0.0", + "bundled": true + }, + "figgy-pudding": { + "version": "3.5.1", + "bundled": true + }, + "find-npm-prefix": { + "version": "1.0.2", + "bundled": true + }, + "find-up": { + "version": "2.1.0", + "bundled": true, + "requires": { + "locate-path": "^2.0.0" + } + }, + "flush-write-stream": { + "version": "1.0.3", + "bundled": true, + "requires": { + "inherits": "^2.0.1", + "readable-stream": "^2.0.4" + }, + "dependencies": { + "readable-stream": { + "version": "2.3.6", + "bundled": true, + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "string_decoder": { + "version": "1.1.1", + "bundled": true, + "requires": { + "safe-buffer": "~5.1.0" + } + } + } + }, + "forever-agent": { + "version": "0.6.1", + "bundled": true + }, + "form-data": { + "version": "2.3.2", + "bundled": true, + "requires": { + "asynckit": "^0.4.0", + "combined-stream": "1.0.6", + "mime-types": "^2.1.12" + } + }, + "from2": { + "version": "2.3.0", + "bundled": true, + "requires": { + "inherits": "^2.0.1", + "readable-stream": "^2.0.0" + }, + "dependencies": { + "readable-stream": { + "version": "2.3.6", + "bundled": true, + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "string_decoder": { + "version": "1.1.1", + "bundled": true, + "requires": { + "safe-buffer": "~5.1.0" + } + } + } + }, + "fs-minipass": { + "version": "1.2.7", + "bundled": true, + "requires": { + "minipass": "^2.6.0" + }, + "dependencies": { + "minipass": { + "version": "2.9.0", + "bundled": true, + "requires": { + "safe-buffer": "^5.1.2", + "yallist": "^3.0.0" + } + } + } + }, + "fs-vacuum": { + "version": "1.2.10", + "bundled": true, + "requires": { + "graceful-fs": "^4.1.2", + "path-is-inside": "^1.0.1", + "rimraf": "^2.5.2" + } + }, + "fs-write-stream-atomic": { + "version": "1.0.10", + "bundled": true, + "requires": { + "graceful-fs": "^4.1.2", + "iferr": "^0.1.5", + "imurmurhash": "^0.1.4", + "readable-stream": "1 || 2" + }, + "dependencies": { + "iferr": { + "version": "0.1.5", + "bundled": true + }, + "readable-stream": { + "version": "2.3.6", + "bundled": true, + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "string_decoder": { + "version": "1.1.1", + "bundled": true, + "requires": { + "safe-buffer": "~5.1.0" + } + } + } + }, + "fs.realpath": { + "version": "1.0.0", + "bundled": true + }, + "function-bind": { + "version": "1.1.1", + "bundled": true + }, + "gauge": { + "version": "2.7.4", + "bundled": true, + "requires": { + "aproba": "^1.0.3", + "console-control-strings": "^1.0.0", + "has-unicode": "^2.0.0", + "object-assign": "^4.1.0", + "signal-exit": "^3.0.0", + "string-width": "^1.0.1", + "strip-ansi": "^3.0.1", + "wide-align": "^1.1.0" + }, + "dependencies": { + "aproba": { + "version": "1.2.0", + "bundled": true + }, + "string-width": { + "version": "1.0.2", + "bundled": true, + "requires": { + "code-point-at": "^1.0.0", + "is-fullwidth-code-point": "^1.0.0", + "strip-ansi": "^3.0.0" + } + } + } + }, + "genfun": { + "version": "5.0.0", + "bundled": true + }, + "gentle-fs": { + "version": "2.3.0", + "bundled": true, + "requires": { + "aproba": "^1.1.2", + "chownr": "^1.1.2", + "cmd-shim": "^3.0.3", + "fs-vacuum": "^1.2.10", + "graceful-fs": "^4.1.11", + "iferr": "^0.1.5", + "infer-owner": "^1.0.4", + "mkdirp": "^0.5.1", + "path-is-inside": "^1.0.2", + "read-cmd-shim": "^1.0.1", + "slide": "^1.1.6" + }, + "dependencies": { + "aproba": { + "version": "1.2.0", + "bundled": true + }, + "iferr": { + "version": "0.1.5", + "bundled": true + } + } + }, + "get-caller-file": { + "version": "1.0.3", + "bundled": true + }, + "get-stream": { + "version": "4.1.0", + "bundled": true, + "requires": { + "pump": "^3.0.0" + } + }, + "getpass": { + "version": "0.1.7", + "bundled": true, + "requires": { + "assert-plus": "^1.0.0" + } + }, + "glob": { + "version": "7.1.6", + "bundled": true, + "requires": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.0.4", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + } + }, + "global-dirs": { + "version": "0.1.1", + "bundled": true, + "requires": { + "ini": "^1.3.4" + } + }, + "got": { + "version": "6.7.1", + "bundled": true, + "requires": { + "create-error-class": "^3.0.0", + "duplexer3": "^0.1.4", + "get-stream": "^3.0.0", + "is-redirect": "^1.0.0", + "is-retry-allowed": "^1.0.0", + "is-stream": "^1.0.0", + "lowercase-keys": "^1.0.0", + "safe-buffer": "^5.0.1", + "timed-out": "^4.0.0", + "unzip-response": "^2.0.1", + "url-parse-lax": "^1.0.0" + }, + "dependencies": { + "get-stream": { + "version": "3.0.0", + "bundled": true + } + } + }, + "graceful-fs": { + "version": "4.2.3", + "bundled": true + }, + "har-schema": { + "version": "2.0.0", + "bundled": true + }, + "har-validator": { + "version": "5.1.0", + "bundled": true, + "requires": { + "ajv": "^5.3.0", + "har-schema": "^2.0.0" + } + }, + "has": { + "version": "1.0.3", + "bundled": true, + "requires": { + "function-bind": "^1.1.1" + } + }, + "has-flag": { + "version": "3.0.0", + "bundled": true + }, + "has-symbols": { + "version": "1.0.0", + "bundled": true + }, + "has-unicode": { + "version": "2.0.1", + "bundled": true + }, + "hosted-git-info": { + "version": "2.8.8", + "bundled": true + }, + "http-cache-semantics": { + "version": "3.8.1", + "bundled": true + }, + "http-proxy-agent": { + "version": "2.1.0", + "bundled": true, + "requires": { + "agent-base": "4", + "debug": "3.1.0" + } + }, + "http-signature": { + "version": "1.2.0", + "bundled": true, + "requires": { + "assert-plus": "^1.0.0", + "jsprim": "^1.2.2", + "sshpk": "^1.7.0" + } + }, + "https-proxy-agent": { + "version": "2.2.4", + "bundled": true, + "requires": { + "agent-base": "^4.3.0", + "debug": "^3.1.0" + } + }, + "humanize-ms": { + "version": "1.2.1", + "bundled": true, + "requires": { + "ms": "^2.0.0" + } + }, + "iconv-lite": { + "version": "0.4.23", + "bundled": true, + "requires": { + "safer-buffer": ">= 2.1.2 < 3" + } + }, + "iferr": { + "version": "1.0.2", + "bundled": true + }, + "ignore-walk": { + "version": "3.0.3", + "bundled": true, + "requires": { + "minimatch": "^3.0.4" + } + }, + "import-lazy": { + "version": "2.1.0", + "bundled": true + }, + "imurmurhash": { + "version": "0.1.4", + "bundled": true + }, + "infer-owner": { + "version": "1.0.4", + "bundled": true + }, + "inflight": { + "version": "1.0.6", + "bundled": true, + "requires": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "inherits": { + "version": "2.0.4", + "bundled": true + }, + "ini": { + "version": "1.3.5", + "bundled": true + }, + "init-package-json": { + "version": "1.10.3", + "bundled": true, + "requires": { + "glob": "^7.1.1", + "npm-package-arg": "^4.0.0 || ^5.0.0 || ^6.0.0", + "promzard": "^0.3.0", + "read": "~1.0.1", + "read-package-json": "1 || 2", + "semver": "2.x || 3.x || 4 || 5", + "validate-npm-package-license": "^3.0.1", + "validate-npm-package-name": "^3.0.0" + } + }, + "invert-kv": { + "version": "2.0.0", + "bundled": true + }, + "ip": { + "version": "1.1.5", + "bundled": true + }, + "ip-regex": { + "version": "2.1.0", + "bundled": true + }, + "is-callable": { + "version": "1.1.4", + "bundled": true + }, + "is-ci": { + "version": "1.2.1", + "bundled": true, + "requires": { + "ci-info": "^1.5.0" + }, + "dependencies": { + "ci-info": { + "version": "1.6.0", + "bundled": true + } + } + }, + "is-cidr": { + "version": "3.0.0", + "bundled": true, + "requires": { + "cidr-regex": "^2.0.10" + } + }, + "is-date-object": { + "version": "1.0.1", + "bundled": true + }, + "is-fullwidth-code-point": { + "version": "1.0.0", + "bundled": true, + "requires": { + "number-is-nan": "^1.0.0" + } + }, + "is-installed-globally": { + "version": "0.1.0", + "bundled": true, + "requires": { + "global-dirs": "^0.1.0", + "is-path-inside": "^1.0.0" + } + }, + "is-npm": { + "version": "1.0.0", + "bundled": true + }, + "is-obj": { + "version": "1.0.1", + "bundled": true + }, + "is-path-inside": { + "version": "1.0.1", + "bundled": true, + "requires": { + "path-is-inside": "^1.0.1" + } + }, + "is-redirect": { + "version": "1.0.0", + "bundled": true + }, + "is-regex": { + "version": "1.0.4", + "bundled": true, + "requires": { + "has": "^1.0.1" + } + }, + "is-retry-allowed": { + "version": "1.2.0", + "bundled": true + }, + "is-stream": { + "version": "1.1.0", + "bundled": true + }, + "is-symbol": { + "version": "1.0.2", + "bundled": true, + "requires": { + "has-symbols": "^1.0.0" + } + }, + "is-typedarray": { + "version": "1.0.0", + "bundled": true + }, + "isarray": { + "version": "1.0.0", + "bundled": true + }, + "isexe": { + "version": "2.0.0", + "bundled": true + }, + "isstream": { + "version": "0.1.2", + "bundled": true + }, + "jsbn": { + "version": "0.1.1", + "bundled": true, + "optional": true + }, + "json-parse-better-errors": { + "version": "1.0.2", + "bundled": true + }, + "json-schema": { + "version": "0.2.3", + "bundled": true + }, + "json-schema-traverse": { + "version": "0.3.1", + "bundled": true + }, + "json-stringify-safe": { + "version": "5.0.1", + "bundled": true + }, + "jsonparse": { + "version": "1.3.1", + "bundled": true + }, + "jsprim": { + "version": "1.4.1", + "bundled": true, + "requires": { + "assert-plus": "1.0.0", + "extsprintf": "1.3.0", + "json-schema": "0.2.3", + "verror": "1.10.0" + } + }, + "latest-version": { + "version": "3.1.0", + "bundled": true, + "requires": { + "package-json": "^4.0.0" + } + }, + "lazy-property": { + "version": "1.0.0", + "bundled": true + }, + "lcid": { + "version": "2.0.0", + "bundled": true, + "requires": { + "invert-kv": "^2.0.0" + } + }, + "libcipm": { + "version": "4.0.7", + "bundled": true, + "requires": { + "bin-links": "^1.1.2", + "bluebird": "^3.5.1", + "figgy-pudding": "^3.5.1", + "find-npm-prefix": "^1.0.2", + "graceful-fs": "^4.1.11", + "ini": "^1.3.5", + "lock-verify": "^2.0.2", + "mkdirp": "^0.5.1", + "npm-lifecycle": "^3.0.0", + "npm-logical-tree": "^1.2.1", + "npm-package-arg": "^6.1.0", + "pacote": "^9.1.0", + "read-package-json": "^2.0.13", + "rimraf": "^2.6.2", + "worker-farm": "^1.6.0" + } + }, + "libnpm": { + "version": "3.0.1", + "bundled": true, + "requires": { + "bin-links": "^1.1.2", + "bluebird": "^3.5.3", + "find-npm-prefix": "^1.0.2", + "libnpmaccess": "^3.0.2", + "libnpmconfig": "^1.2.1", + "libnpmhook": "^5.0.3", + "libnpmorg": "^1.0.1", + "libnpmpublish": "^1.1.2", + "libnpmsearch": "^2.0.2", + "libnpmteam": "^1.0.2", + "lock-verify": "^2.0.2", + "npm-lifecycle": "^3.0.0", + "npm-logical-tree": "^1.2.1", + "npm-package-arg": "^6.1.0", + "npm-profile": "^4.0.2", + "npm-registry-fetch": "^4.0.0", + "npmlog": "^4.1.2", + "pacote": "^9.5.3", + "read-package-json": "^2.0.13", + "stringify-package": "^1.0.0" + } + }, + "libnpmaccess": { + "version": "3.0.2", + "bundled": true, + "requires": { + "aproba": "^2.0.0", + "get-stream": "^4.0.0", + "npm-package-arg": "^6.1.0", + "npm-registry-fetch": "^4.0.0" + } + }, + "libnpmconfig": { + "version": "1.2.1", + "bundled": true, + "requires": { + "figgy-pudding": "^3.5.1", + "find-up": "^3.0.0", + "ini": "^1.3.5" + }, + "dependencies": { + "find-up": { + "version": "3.0.0", + "bundled": true, + "requires": { + "locate-path": "^3.0.0" + } + }, + "locate-path": { + "version": "3.0.0", + "bundled": true, + "requires": { + "p-locate": "^3.0.0", + "path-exists": "^3.0.0" + } + }, + "p-limit": { + "version": "2.2.0", + "bundled": true, + "requires": { + "p-try": "^2.0.0" + } + }, + "p-locate": { + "version": "3.0.0", + "bundled": true, + "requires": { + "p-limit": "^2.0.0" + } + }, + "p-try": { + "version": "2.2.0", + "bundled": true + } + } + }, + "libnpmhook": { + "version": "5.0.3", + "bundled": true, + "requires": { + "aproba": "^2.0.0", + "figgy-pudding": "^3.4.1", + "get-stream": "^4.0.0", + "npm-registry-fetch": "^4.0.0" + } + }, + "libnpmorg": { + "version": "1.0.1", + "bundled": true, + "requires": { + "aproba": "^2.0.0", + "figgy-pudding": "^3.4.1", + "get-stream": "^4.0.0", + "npm-registry-fetch": "^4.0.0" + } + }, + "libnpmpublish": { + "version": "1.1.2", + "bundled": true, + "requires": { + "aproba": "^2.0.0", + "figgy-pudding": "^3.5.1", + "get-stream": "^4.0.0", + "lodash.clonedeep": "^4.5.0", + "normalize-package-data": "^2.4.0", + "npm-package-arg": "^6.1.0", + "npm-registry-fetch": "^4.0.0", + "semver": "^5.5.1", + "ssri": "^6.0.1" + } + }, + "libnpmsearch": { + "version": "2.0.2", + "bundled": true, + "requires": { + "figgy-pudding": "^3.5.1", + "get-stream": "^4.0.0", + "npm-registry-fetch": "^4.0.0" + } + }, + "libnpmteam": { + "version": "1.0.2", + "bundled": true, + "requires": { + "aproba": "^2.0.0", + "figgy-pudding": "^3.4.1", + "get-stream": "^4.0.0", + "npm-registry-fetch": "^4.0.0" + } + }, + "libnpx": { + "version": "10.2.2", + "bundled": true, + "requires": { + "dotenv": "^5.0.1", + "npm-package-arg": "^6.0.0", + "rimraf": "^2.6.2", + "safe-buffer": "^5.1.0", + "update-notifier": "^2.3.0", + "which": "^1.3.0", + "y18n": "^4.0.0", + "yargs": "^11.0.0" + } + }, + "locate-path": { + "version": "2.0.0", + "bundled": true, + "requires": { + "p-locate": "^2.0.0", + "path-exists": "^3.0.0" + } + }, + "lock-verify": { + "version": "2.1.0", + "bundled": true, + "requires": { + "npm-package-arg": "^6.1.0", + "semver": "^5.4.1" + } + }, + "lockfile": { + "version": "1.0.4", + "bundled": true, + "requires": { + "signal-exit": "^3.0.2" + } + }, + "lodash._baseindexof": { + "version": "3.1.0", + "bundled": true + }, + "lodash._baseuniq": { + "version": "4.6.0", + "bundled": true, + "requires": { + "lodash._createset": "~4.0.0", + "lodash._root": "~3.0.0" + } + }, + "lodash._bindcallback": { + "version": "3.0.1", + "bundled": true + }, + "lodash._cacheindexof": { + "version": "3.0.2", + "bundled": true + }, + "lodash._createcache": { + "version": "3.1.2", + "bundled": true, + "requires": { + "lodash._getnative": "^3.0.0" + } + }, + "lodash._createset": { + "version": "4.0.3", + "bundled": true + }, + "lodash._getnative": { + "version": "3.9.1", + "bundled": true + }, + "lodash._root": { + "version": "3.0.1", + "bundled": true + }, + "lodash.clonedeep": { + "version": "4.5.0", + "bundled": true + }, + "lodash.restparam": { + "version": "3.6.1", + "bundled": true + }, + "lodash.union": { + "version": "4.6.0", + "bundled": true + }, + "lodash.uniq": { + "version": "4.5.0", + "bundled": true + }, + "lodash.without": { + "version": "4.4.0", + "bundled": true + }, + "lowercase-keys": { + "version": "1.0.1", + "bundled": true + }, + "lru-cache": { + "version": "5.1.1", + "bundled": true, + "requires": { + "yallist": "^3.0.2" + } + }, + "make-dir": { + "version": "1.3.0", + "bundled": true, + "requires": { + "pify": "^3.0.0" + } + }, + "make-fetch-happen": { + "version": "5.0.2", + "bundled": true, + "requires": { + "agentkeepalive": "^3.4.1", + "cacache": "^12.0.0", + "http-cache-semantics": "^3.8.1", + "http-proxy-agent": "^2.1.0", + "https-proxy-agent": "^2.2.3", + "lru-cache": "^5.1.1", + "mississippi": "^3.0.0", + "node-fetch-npm": "^2.0.2", + "promise-retry": "^1.1.1", + "socks-proxy-agent": "^4.0.0", + "ssri": "^6.0.0" + } + }, + "map-age-cleaner": { + "version": "0.1.3", + "bundled": true, + "requires": { + "p-defer": "^1.0.0" + } + }, + "meant": { + "version": "1.0.1", + "bundled": true + }, + "mem": { + "version": "4.3.0", + "bundled": true, + "requires": { + "map-age-cleaner": "^0.1.1", + "mimic-fn": "^2.0.0", + "p-is-promise": "^2.0.0" + }, + "dependencies": { + "mimic-fn": { + "version": "2.1.0", + "bundled": true + } + } + }, + "mime-db": { + "version": "1.35.0", + "bundled": true + }, + "mime-types": { + "version": "2.1.19", + "bundled": true, + "requires": { + "mime-db": "~1.35.0" + } + }, + "minimatch": { + "version": "3.0.4", + "bundled": true, + "requires": { + "brace-expansion": "^1.1.7" + } + }, + "minizlib": { + "version": "1.3.3", + "bundled": true, + "requires": { + "minipass": "^2.9.0" + }, + "dependencies": { + "minipass": { + "version": "2.9.0", + "bundled": true, + "requires": { + "safe-buffer": "^5.1.2", + "yallist": "^3.0.0" + } + } + } + }, + "mississippi": { + "version": "3.0.0", + "bundled": true, + "requires": { + "concat-stream": "^1.5.0", + "duplexify": "^3.4.2", + "end-of-stream": "^1.1.0", + "flush-write-stream": "^1.0.0", + "from2": "^2.1.0", + "parallel-transform": "^1.1.0", + "pump": "^3.0.0", + "pumpify": "^1.3.3", + "stream-each": "^1.1.0", + "through2": "^2.0.0" + } + }, + "mkdirp": { + "version": "0.5.4", + "bundled": true, + "requires": { + "minimist": "^1.2.5" + }, + "dependencies": { + "minimist": { + "version": "1.2.5", + "bundled": true + } + } + }, + "move-concurrently": { + "version": "1.0.1", + "bundled": true, + "requires": { + "aproba": "^1.1.1", + "copy-concurrently": "^1.0.0", + "fs-write-stream-atomic": "^1.0.8", + "mkdirp": "^0.5.1", + "rimraf": "^2.5.4", + "run-queue": "^1.0.3" + }, + "dependencies": { + "aproba": { + "version": "1.2.0", + "bundled": true + } + } + }, + "ms": { + "version": "2.1.1", + "bundled": true + }, + "mute-stream": { + "version": "0.0.7", + "bundled": true + }, + "nice-try": { + "version": "1.0.5", + "bundled": true + }, + "node-fetch-npm": { + "version": "2.0.2", + "bundled": true, + "requires": { + "encoding": "^0.1.11", + "json-parse-better-errors": "^1.0.0", + "safe-buffer": "^5.1.1" + } + }, + "node-gyp": { + "version": "5.1.0", + "bundled": true, + "requires": { + "env-paths": "^2.2.0", + "glob": "^7.1.4", + "graceful-fs": "^4.2.2", + "mkdirp": "^0.5.1", + "nopt": "^4.0.1", + "npmlog": "^4.1.2", + "request": "^2.88.0", + "rimraf": "^2.6.3", + "semver": "^5.7.1", + "tar": "^4.4.12", + "which": "^1.3.1" + } + }, + "nopt": { + "version": "4.0.1", + "bundled": true, + "requires": { + "abbrev": "1", + "osenv": "^0.1.4" + } + }, + "normalize-package-data": { + "version": "2.5.0", + "bundled": true, + "requires": { + "hosted-git-info": "^2.1.4", + "resolve": "^1.10.0", + "semver": "2 || 3 || 4 || 5", + "validate-npm-package-license": "^3.0.1" + }, + "dependencies": { + "resolve": { + "version": "1.10.0", + "bundled": true, + "requires": { + "path-parse": "^1.0.6" + } + } + } + }, + "npm-audit-report": { + "version": "1.3.2", + "bundled": true, + "requires": { + "cli-table3": "^0.5.0", + "console-control-strings": "^1.1.0" + } + }, + "npm-bundled": { + "version": "1.1.1", + "bundled": true, + "requires": { + "npm-normalize-package-bin": "^1.0.1" + } + }, + "npm-cache-filename": { + "version": "1.0.2", + "bundled": true + }, + "npm-install-checks": { + "version": "3.0.2", + "bundled": true, + "requires": { + "semver": "^2.3.0 || 3.x || 4 || 5" + } + }, + "npm-lifecycle": { + "version": "3.1.4", + "bundled": true, + "requires": { + "byline": "^5.0.0", + "graceful-fs": "^4.1.15", + "node-gyp": "^5.0.2", + "resolve-from": "^4.0.0", + "slide": "^1.1.6", + "uid-number": "0.0.6", + "umask": "^1.1.0", + "which": "^1.3.1" + } + }, + "npm-logical-tree": { + "version": "1.2.1", + "bundled": true + }, + "npm-normalize-package-bin": { + "version": "1.0.1", + "bundled": true + }, + "npm-package-arg": { + "version": "6.1.1", + "bundled": true, + "requires": { + "hosted-git-info": "^2.7.1", + "osenv": "^0.1.5", + "semver": "^5.6.0", + "validate-npm-package-name": "^3.0.0" + } + }, + "npm-packlist": { + "version": "1.4.8", + "bundled": true, + "requires": { + "ignore-walk": "^3.0.1", + "npm-bundled": "^1.0.1", + "npm-normalize-package-bin": "^1.0.1" + } + }, + "npm-pick-manifest": { + "version": "3.0.2", + "bundled": true, + "requires": { + "figgy-pudding": "^3.5.1", + "npm-package-arg": "^6.0.0", + "semver": "^5.4.1" + } + }, + "npm-profile": { + "version": "4.0.4", + "bundled": true, + "requires": { + "aproba": "^1.1.2 || 2", + "figgy-pudding": "^3.4.1", + "npm-registry-fetch": "^4.0.0" + } + }, + "npm-registry-fetch": { + "version": "4.0.3", + "bundled": true, + "requires": { + "JSONStream": "^1.3.4", + "bluebird": "^3.5.1", + "figgy-pudding": "^3.4.1", + "lru-cache": "^5.1.1", + "make-fetch-happen": "^5.0.0", + "npm-package-arg": "^6.1.0", + "safe-buffer": "^5.2.0" + }, + "dependencies": { + "safe-buffer": { + "version": "5.2.0", + "bundled": true + } + } + }, + "npm-run-path": { + "version": "2.0.2", + "bundled": true, + "requires": { + "path-key": "^2.0.0" + } + }, + "npm-user-validate": { + "version": "1.0.0", + "bundled": true + }, + "npmlog": { + "version": "4.1.2", + "bundled": true, + "requires": { + "are-we-there-yet": "~1.1.2", + "console-control-strings": "~1.1.0", + "gauge": "~2.7.3", + "set-blocking": "~2.0.0" + } + }, + "number-is-nan": { + "version": "1.0.1", + "bundled": true + }, + "oauth-sign": { + "version": "0.9.0", + "bundled": true + }, + "object-assign": { + "version": "4.1.1", + "bundled": true + }, + "object-keys": { + "version": "1.0.12", + "bundled": true + }, + "object.getownpropertydescriptors": { + "version": "2.0.3", + "bundled": true, + "requires": { + "define-properties": "^1.1.2", + "es-abstract": "^1.5.1" + } + }, + "once": { + "version": "1.4.0", + "bundled": true, + "requires": { + "wrappy": "1" + } + }, + "opener": { + "version": "1.5.1", + "bundled": true + }, + "os-homedir": { + "version": "1.0.2", + "bundled": true + }, + "os-locale": { + "version": "3.1.0", + "bundled": true, + "requires": { + "execa": "^1.0.0", + "lcid": "^2.0.0", + "mem": "^4.0.0" + }, + "dependencies": { + "cross-spawn": { + "version": "6.0.5", + "bundled": true, + "requires": { + "nice-try": "^1.0.4", + "path-key": "^2.0.1", + "semver": "^5.5.0", + "shebang-command": "^1.2.0", + "which": "^1.2.9" + } + }, + "execa": { + "version": "1.0.0", + "bundled": true, + "requires": { + "cross-spawn": "^6.0.0", + "get-stream": "^4.0.0", + "is-stream": "^1.1.0", + "npm-run-path": "^2.0.0", + "p-finally": "^1.0.0", + "signal-exit": "^3.0.0", + "strip-eof": "^1.0.0" + } + } + } + }, + "os-tmpdir": { + "version": "1.0.2", + "bundled": true + }, + "osenv": { + "version": "0.1.5", + "bundled": true, + "requires": { + "os-homedir": "^1.0.0", + "os-tmpdir": "^1.0.0" + } + }, + "p-defer": { + "version": "1.0.0", + "bundled": true + }, + "p-finally": { + "version": "1.0.0", + "bundled": true + }, + "p-is-promise": { + "version": "2.1.0", + "bundled": true + }, + "p-limit": { + "version": "1.2.0", + "bundled": true, + "requires": { + "p-try": "^1.0.0" + } + }, + "p-locate": { + "version": "2.0.0", + "bundled": true, + "requires": { + "p-limit": "^1.1.0" + } + }, + "p-try": { + "version": "1.0.0", + "bundled": true + }, + "package-json": { + "version": "4.0.1", + "bundled": true, + "requires": { + "got": "^6.7.1", + "registry-auth-token": "^3.0.1", + "registry-url": "^3.0.3", + "semver": "^5.1.0" + } + }, + "pacote": { + "version": "9.5.12", + "bundled": true, + "requires": { + "bluebird": "^3.5.3", + "cacache": "^12.0.2", + "chownr": "^1.1.2", + "figgy-pudding": "^3.5.1", + "get-stream": "^4.1.0", + "glob": "^7.1.3", + "infer-owner": "^1.0.4", + "lru-cache": "^5.1.1", + "make-fetch-happen": "^5.0.0", + "minimatch": "^3.0.4", + "minipass": "^2.3.5", + "mississippi": "^3.0.0", + "mkdirp": "^0.5.1", + "normalize-package-data": "^2.4.0", + "npm-normalize-package-bin": "^1.0.0", + "npm-package-arg": "^6.1.0", + "npm-packlist": "^1.1.12", + "npm-pick-manifest": "^3.0.0", + "npm-registry-fetch": "^4.0.0", + "osenv": "^0.1.5", + "promise-inflight": "^1.0.1", + "promise-retry": "^1.1.1", + "protoduck": "^5.0.1", + "rimraf": "^2.6.2", + "safe-buffer": "^5.1.2", + "semver": "^5.6.0", + "ssri": "^6.0.1", + "tar": "^4.4.10", + "unique-filename": "^1.1.1", + "which": "^1.3.1" + }, + "dependencies": { + "minipass": { + "version": "2.9.0", + "bundled": true, + "requires": { + "safe-buffer": "^5.1.2", + "yallist": "^3.0.0" + } + } + } + }, + "parallel-transform": { + "version": "1.1.0", + "bundled": true, + "requires": { + "cyclist": "~0.2.2", + "inherits": "^2.0.3", + "readable-stream": "^2.1.5" + }, + "dependencies": { + "readable-stream": { + "version": "2.3.6", + "bundled": true, + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "string_decoder": { + "version": "1.1.1", + "bundled": true, + "requires": { + "safe-buffer": "~5.1.0" + } + } + } + }, + "path-exists": { + "version": "3.0.0", + "bundled": true + }, + "path-is-absolute": { + "version": "1.0.1", + "bundled": true + }, + "path-is-inside": { + "version": "1.0.2", + "bundled": true + }, + "path-key": { + "version": "2.0.1", + "bundled": true + }, + "path-parse": { + "version": "1.0.6", + "bundled": true + }, + "performance-now": { + "version": "2.1.0", + "bundled": true + }, + "pify": { + "version": "3.0.0", + "bundled": true + }, + "prepend-http": { + "version": "1.0.4", + "bundled": true + }, + "process-nextick-args": { + "version": "2.0.0", + "bundled": true + }, + "promise-inflight": { + "version": "1.0.1", + "bundled": true + }, + "promise-retry": { + "version": "1.1.1", + "bundled": true, + "requires": { + "err-code": "^1.0.0", + "retry": "^0.10.0" + }, + "dependencies": { + "retry": { + "version": "0.10.1", + "bundled": true + } + } + }, + "promzard": { + "version": "0.3.0", + "bundled": true, + "requires": { + "read": "1" + } + }, + "proto-list": { + "version": "1.2.4", + "bundled": true + }, + "protoduck": { + "version": "5.0.1", + "bundled": true, + "requires": { + "genfun": "^5.0.0" + } + }, + "prr": { + "version": "1.0.1", + "bundled": true + }, + "pseudomap": { + "version": "1.0.2", + "bundled": true + }, + "psl": { + "version": "1.1.29", + "bundled": true + }, + "pump": { + "version": "3.0.0", + "bundled": true, + "requires": { + "end-of-stream": "^1.1.0", + "once": "^1.3.1" + } + }, + "pumpify": { + "version": "1.5.1", + "bundled": true, + "requires": { + "duplexify": "^3.6.0", + "inherits": "^2.0.3", + "pump": "^2.0.0" + }, + "dependencies": { + "pump": { + "version": "2.0.1", + "bundled": true, + "requires": { + "end-of-stream": "^1.1.0", + "once": "^1.3.1" + } + } + } + }, + "punycode": { + "version": "1.4.1", + "bundled": true + }, + "qrcode-terminal": { + "version": "0.12.0", + "bundled": true + }, + "qs": { + "version": "6.5.2", + "bundled": true + }, + "query-string": { + "version": "6.8.2", + "bundled": true, + "requires": { + "decode-uri-component": "^0.2.0", + "split-on-first": "^1.0.0", + "strict-uri-encode": "^2.0.0" + } + }, + "qw": { + "version": "1.0.1", + "bundled": true + }, + "rc": { + "version": "1.2.8", + "bundled": true, + "requires": { + "deep-extend": "^0.6.0", + "ini": "~1.3.0", + "minimist": "^1.2.0", + "strip-json-comments": "~2.0.1" + }, + "dependencies": { + "minimist": { + "version": "1.2.5", + "bundled": true + } + } + }, + "read": { + "version": "1.0.7", + "bundled": true, + "requires": { + "mute-stream": "~0.0.4" + } + }, + "read-cmd-shim": { + "version": "1.0.5", + "bundled": true, + "requires": { + "graceful-fs": "^4.1.2" + } + }, + "read-installed": { + "version": "4.0.3", + "bundled": true, + "requires": { + "debuglog": "^1.0.1", + "graceful-fs": "^4.1.2", + "read-package-json": "^2.0.0", + "readdir-scoped-modules": "^1.0.0", + "semver": "2 || 3 || 4 || 5", + "slide": "~1.1.3", + "util-extend": "^1.0.1" + } + }, + "read-package-json": { + "version": "2.1.1", + "bundled": true, + "requires": { + "glob": "^7.1.1", + "graceful-fs": "^4.1.2", + "json-parse-better-errors": "^1.0.1", + "normalize-package-data": "^2.0.0", + "npm-normalize-package-bin": "^1.0.0" + } + }, + "read-package-tree": { + "version": "5.3.1", + "bundled": true, + "requires": { + "read-package-json": "^2.0.0", + "readdir-scoped-modules": "^1.0.0", + "util-promisify": "^2.1.0" + } + }, + "readable-stream": { + "version": "3.6.0", + "bundled": true, + "requires": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + } + }, + "readdir-scoped-modules": { + "version": "1.1.0", + "bundled": true, + "requires": { + "debuglog": "^1.0.1", + "dezalgo": "^1.0.0", + "graceful-fs": "^4.1.2", + "once": "^1.3.0" + } + }, + "registry-auth-token": { + "version": "3.4.0", + "bundled": true, + "requires": { + "rc": "^1.1.6", + "safe-buffer": "^5.0.1" + } + }, + "registry-url": { + "version": "3.1.0", + "bundled": true, + "requires": { + "rc": "^1.0.1" + } + }, + "request": { + "version": "2.88.0", + "bundled": true, + "requires": { + "aws-sign2": "~0.7.0", + "aws4": "^1.8.0", + "caseless": "~0.12.0", + "combined-stream": "~1.0.6", + "extend": "~3.0.2", + "forever-agent": "~0.6.1", + "form-data": "~2.3.2", + "har-validator": "~5.1.0", + "http-signature": "~1.2.0", + "is-typedarray": "~1.0.0", + "isstream": "~0.1.2", + "json-stringify-safe": "~5.0.1", + "mime-types": "~2.1.19", + "oauth-sign": "~0.9.0", + "performance-now": "^2.1.0", + "qs": "~6.5.2", + "safe-buffer": "^5.1.2", + "tough-cookie": "~2.4.3", + "tunnel-agent": "^0.6.0", + "uuid": "^3.3.2" + } + }, + "require-directory": { + "version": "2.1.1", + "bundled": true + }, + "require-main-filename": { + "version": "1.0.1", + "bundled": true + }, + "resolve-from": { + "version": "4.0.0", + "bundled": true + }, + "retry": { + "version": "0.12.0", + "bundled": true + }, + "rimraf": { + "version": "2.7.1", + "bundled": true, + "requires": { + "glob": "^7.1.3" + } + }, + "run-queue": { + "version": "1.0.3", + "bundled": true, + "requires": { + "aproba": "^1.1.1" + }, + "dependencies": { + "aproba": { + "version": "1.2.0", + "bundled": true + } + } + }, + "safe-buffer": { + "version": "5.1.2", + "bundled": true + }, + "safer-buffer": { + "version": "2.1.2", + "bundled": true + }, + "semver": { + "version": "5.7.1", + "bundled": true + }, + "semver-diff": { + "version": "2.1.0", + "bundled": true, + "requires": { + "semver": "^5.0.3" + } + }, + "set-blocking": { + "version": "2.0.0", + "bundled": true + }, + "sha": { + "version": "3.0.0", + "bundled": true, + "requires": { + "graceful-fs": "^4.1.2" + } + }, + "shebang-command": { + "version": "1.2.0", + "bundled": true, + "requires": { + "shebang-regex": "^1.0.0" + } + }, + "shebang-regex": { + "version": "1.0.0", + "bundled": true + }, + "signal-exit": { + "version": "3.0.2", + "bundled": true + }, + "slide": { + "version": "1.1.6", + "bundled": true + }, + "smart-buffer": { + "version": "4.1.0", + "bundled": true + }, + "socks": { + "version": "2.3.3", + "bundled": true, + "requires": { + "ip": "1.1.5", + "smart-buffer": "^4.1.0" + } + }, + "socks-proxy-agent": { + "version": "4.0.2", + "bundled": true, + "requires": { + "agent-base": "~4.2.1", + "socks": "~2.3.2" + }, + "dependencies": { + "agent-base": { + "version": "4.2.1", + "bundled": true, + "requires": { + "es6-promisify": "^5.0.0" + } + } + } + }, + "sorted-object": { + "version": "2.0.1", + "bundled": true + }, + "sorted-union-stream": { + "version": "2.1.3", + "bundled": true, + "requires": { + "from2": "^1.3.0", + "stream-iterate": "^1.1.0" + }, + "dependencies": { + "from2": { + "version": "1.3.0", + "bundled": true, + "requires": { + "inherits": "~2.0.1", + "readable-stream": "~1.1.10" + } + }, + "isarray": { + "version": "0.0.1", + "bundled": true + }, + "readable-stream": { + "version": "1.1.14", + "bundled": true, + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.1", + "isarray": "0.0.1", + "string_decoder": "~0.10.x" + } + }, + "string_decoder": { + "version": "0.10.31", + "bundled": true + } + } + }, + "spdx-correct": { + "version": "3.0.0", + "bundled": true, + "requires": { + "spdx-expression-parse": "^3.0.0", + "spdx-license-ids": "^3.0.0" + } + }, + "spdx-exceptions": { + "version": "2.1.0", + "bundled": true + }, + "spdx-expression-parse": { + "version": "3.0.0", + "bundled": true, + "requires": { + "spdx-exceptions": "^2.1.0", + "spdx-license-ids": "^3.0.0" + } + }, + "spdx-license-ids": { + "version": "3.0.3", + "bundled": true + }, + "split-on-first": { + "version": "1.1.0", + "bundled": true + }, + "sshpk": { + "version": "1.14.2", + "bundled": true, + "requires": { + "asn1": "~0.2.3", + "assert-plus": "^1.0.0", + "bcrypt-pbkdf": "^1.0.0", + "dashdash": "^1.12.0", + "ecc-jsbn": "~0.1.1", + "getpass": "^0.1.1", + "jsbn": "~0.1.0", + "safer-buffer": "^2.0.2", + "tweetnacl": "~0.14.0" + } + }, + "ssri": { + "version": "6.0.1", + "bundled": true, + "requires": { + "figgy-pudding": "^3.5.1" + } + }, + "stream-each": { + "version": "1.2.2", + "bundled": true, + "requires": { + "end-of-stream": "^1.1.0", + "stream-shift": "^1.0.0" + } + }, + "stream-iterate": { + "version": "1.2.0", + "bundled": true, + "requires": { + "readable-stream": "^2.1.5", + "stream-shift": "^1.0.0" + }, + "dependencies": { + "readable-stream": { + "version": "2.3.6", + "bundled": true, + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "string_decoder": { + "version": "1.1.1", + "bundled": true, + "requires": { + "safe-buffer": "~5.1.0" + } + } + } + }, + "stream-shift": { + "version": "1.0.0", + "bundled": true + }, + "strict-uri-encode": { + "version": "2.0.0", + "bundled": true + }, + "string-width": { + "version": "2.1.1", + "bundled": true, + "requires": { + "is-fullwidth-code-point": "^2.0.0", + "strip-ansi": "^4.0.0" + }, + "dependencies": { + "ansi-regex": { + "version": "3.0.0", + "bundled": true + }, + "is-fullwidth-code-point": { + "version": "2.0.0", + "bundled": true + }, + "strip-ansi": { + "version": "4.0.0", + "bundled": true, + "requires": { + "ansi-regex": "^3.0.0" + } + } + } + }, + "string_decoder": { + "version": "1.3.0", + "bundled": true, + "requires": { + "safe-buffer": "~5.2.0" + }, + "dependencies": { + "safe-buffer": { + "version": "5.2.0", + "bundled": true + } + } + }, + "stringify-package": { + "version": "1.0.1", + "bundled": true + }, + "strip-ansi": { + "version": "3.0.1", + "bundled": true, + "requires": { + "ansi-regex": "^2.0.0" + } + }, + "strip-eof": { + "version": "1.0.0", + "bundled": true + }, + "strip-json-comments": { + "version": "2.0.1", + "bundled": true + }, + "supports-color": { + "version": "5.4.0", + "bundled": true, + "requires": { + "has-flag": "^3.0.0" + } + }, + "tar": { + "version": "4.4.13", + "bundled": true, + "requires": { + "chownr": "^1.1.1", + "fs-minipass": "^1.2.5", + "minipass": "^2.8.6", + "minizlib": "^1.2.1", + "mkdirp": "^0.5.0", + "safe-buffer": "^5.1.2", + "yallist": "^3.0.3" + }, + "dependencies": { + "minipass": { + "version": "2.9.0", + "bundled": true, + "requires": { + "safe-buffer": "^5.1.2", + "yallist": "^3.0.0" + } + } + } + }, + "term-size": { + "version": "1.2.0", + "bundled": true, + "requires": { + "execa": "^0.7.0" + } + }, + "text-table": { + "version": "0.2.0", + "bundled": true + }, + "through": { + "version": "2.3.8", + "bundled": true + }, + "through2": { + "version": "2.0.3", + "bundled": true, + "requires": { + "readable-stream": "^2.1.5", + "xtend": "~4.0.1" + }, + "dependencies": { + "readable-stream": { + "version": "2.3.6", + "bundled": true, + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "string_decoder": { + "version": "1.1.1", + "bundled": true, + "requires": { + "safe-buffer": "~5.1.0" + } + } + } + }, + "timed-out": { + "version": "4.0.1", + "bundled": true + }, + "tiny-relative-date": { + "version": "1.3.0", + "bundled": true + }, + "tough-cookie": { + "version": "2.4.3", + "bundled": true, + "requires": { + "psl": "^1.1.24", + "punycode": "^1.4.1" + } + }, + "tunnel-agent": { + "version": "0.6.0", + "bundled": true, + "requires": { + "safe-buffer": "^5.0.1" + } + }, + "tweetnacl": { + "version": "0.14.5", + "bundled": true, + "optional": true + }, + "typedarray": { + "version": "0.0.6", + "bundled": true + }, + "uid-number": { + "version": "0.0.6", + "bundled": true + }, + "umask": { + "version": "1.1.0", + "bundled": true + }, + "unique-filename": { + "version": "1.1.1", + "bundled": true, + "requires": { + "unique-slug": "^2.0.0" + } + }, + "unique-slug": { + "version": "2.0.0", + "bundled": true, + "requires": { + "imurmurhash": "^0.1.4" + } + }, + "unique-string": { + "version": "1.0.0", + "bundled": true, + "requires": { + "crypto-random-string": "^1.0.0" + } + }, + "unpipe": { + "version": "1.0.0", + "bundled": true + }, + "unzip-response": { + "version": "2.0.1", + "bundled": true + }, + "update-notifier": { + "version": "2.5.0", + "bundled": true, + "requires": { + "boxen": "^1.2.1", + "chalk": "^2.0.1", + "configstore": "^3.0.0", + "import-lazy": "^2.1.0", + "is-ci": "^1.0.10", + "is-installed-globally": "^0.1.0", + "is-npm": "^1.0.0", + "latest-version": "^3.0.0", + "semver-diff": "^2.0.0", + "xdg-basedir": "^3.0.0" + } + }, + "url-parse-lax": { + "version": "1.0.0", + "bundled": true, + "requires": { + "prepend-http": "^1.0.1" + } + }, + "util-deprecate": { + "version": "1.0.2", + "bundled": true + }, + "util-extend": { + "version": "1.0.3", + "bundled": true + }, + "util-promisify": { + "version": "2.1.0", + "bundled": true, + "requires": { + "object.getownpropertydescriptors": "^2.0.3" + } + }, + "uuid": { + "version": "3.3.3", + "bundled": true + }, + "validate-npm-package-license": { + "version": "3.0.4", + "bundled": true, + "requires": { + "spdx-correct": "^3.0.0", + "spdx-expression-parse": "^3.0.0" + } + }, + "validate-npm-package-name": { + "version": "3.0.0", + "bundled": true, + "requires": { + "builtins": "^1.0.3" + } + }, + "verror": { + "version": "1.10.0", + "bundled": true, + "requires": { + "assert-plus": "^1.0.0", + "core-util-is": "1.0.2", + "extsprintf": "^1.2.0" + } + }, + "wcwidth": { + "version": "1.0.1", + "bundled": true, + "requires": { + "defaults": "^1.0.3" + } + }, + "which": { + "version": "1.3.1", + "bundled": true, + "requires": { + "isexe": "^2.0.0" + } + }, + "which-module": { + "version": "2.0.0", + "bundled": true + }, + "wide-align": { + "version": "1.1.2", + "bundled": true, + "requires": { + "string-width": "^1.0.2" + }, + "dependencies": { + "string-width": { + "version": "1.0.2", + "bundled": true, + "requires": { + "code-point-at": "^1.0.0", + "is-fullwidth-code-point": "^1.0.0", + "strip-ansi": "^3.0.0" + } + } + } + }, + "widest-line": { + "version": "2.0.1", + "bundled": true, + "requires": { + "string-width": "^2.1.1" + } + }, + "worker-farm": { + "version": "1.7.0", + "bundled": true, + "requires": { + "errno": "~0.1.7" + } + }, + "wrap-ansi": { + "version": "2.1.0", + "bundled": true, + "requires": { + "string-width": "^1.0.1", + "strip-ansi": "^3.0.1" + }, + "dependencies": { + "string-width": { + "version": "1.0.2", + "bundled": true, + "requires": { + "code-point-at": "^1.0.0", + "is-fullwidth-code-point": "^1.0.0", + "strip-ansi": "^3.0.0" + } + } + } + }, + "wrappy": { + "version": "1.0.2", + "bundled": true + }, + "write-file-atomic": { + "version": "2.4.3", + "bundled": true, + "requires": { + "graceful-fs": "^4.1.11", + "imurmurhash": "^0.1.4", + "signal-exit": "^3.0.2" + } + }, + "xdg-basedir": { + "version": "3.0.0", + "bundled": true + }, + "xtend": { + "version": "4.0.1", + "bundled": true + }, + "y18n": { + "version": "4.0.0", + "bundled": true + }, + "yallist": { + "version": "3.0.3", + "bundled": true + }, + "yargs": { + "version": "11.1.1", + "bundled": true, + "requires": { + "cliui": "^4.0.0", + "decamelize": "^1.1.1", + "find-up": "^2.1.0", + "get-caller-file": "^1.0.1", + "os-locale": "^3.1.0", + "require-directory": "^2.1.1", + "require-main-filename": "^1.0.1", + "set-blocking": "^2.0.0", + "string-width": "^2.0.0", + "which-module": "^2.0.0", + "y18n": "^3.2.1", + "yargs-parser": "^9.0.2" + }, + "dependencies": { + "y18n": { + "version": "3.2.1", + "bundled": true + } + } + }, + "yargs-parser": { + "version": "9.0.2", + "bundled": true, + "requires": { + "camelcase": "^4.1.0" + } + } + } + }, + "npm-run-path": { + "version": "2.0.2", + "resolved": "https://registry.npm.taobao.org/npm-run-path/download/npm-run-path-2.0.2.tgz", + "integrity": "sha1-NakjLfo11wZ7TLLd8jV7GHFTbF8=", + "dev": true, + "requires": { + "path-key": "^2.0.0" + } + }, + "nth-check": { + "version": "1.0.2", + "resolved": "https://registry.npm.taobao.org/nth-check/download/nth-check-1.0.2.tgz", + "integrity": "sha1-sr0pXDfj3VijvwcAN2Zjuk2c8Fw=", + "dev": true, + "requires": { + "boolbase": "~1.0.0" + } + }, + "num2fraction": { + "version": "1.2.2", + "resolved": "https://registry.npm.taobao.org/num2fraction/download/num2fraction-1.2.2.tgz", + "integrity": "sha1-b2gragJ6Tp3fpFZM0lidHU5mnt4=", + "dev": true + }, + "number-is-nan": { + "version": "1.0.1", + "resolved": "https://registry.npm.taobao.org/number-is-nan/download/number-is-nan-1.0.1.tgz", + "integrity": "sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0=", + "dev": true + }, + "oauth-sign": { + "version": "0.9.0", + "resolved": "https://registry.npm.taobao.org/oauth-sign/download/oauth-sign-0.9.0.tgz", + "integrity": "sha1-R6ewFrqmi1+g7PPe4IqFxnmsZFU=", + "dev": true + }, + "object-assign": { + "version": "4.1.1", + "resolved": "https://registry.npm.taobao.org/object-assign/download/object-assign-4.1.1.tgz", + "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=", + "dev": true + }, + "object-copy": { + "version": "0.1.0", + "resolved": "https://registry.npm.taobao.org/object-copy/download/object-copy-0.1.0.tgz", + "integrity": "sha1-fn2Fi3gb18mRpBupde04EnVOmYw=", + "dev": true, + "requires": { + "copy-descriptor": "^0.1.0", + "define-property": "^0.2.5", + "kind-of": "^3.0.3" + }, + "dependencies": { + "define-property": { + "version": "0.2.5", + "resolved": "https://registry.npm.taobao.org/define-property/download/define-property-0.2.5.tgz", + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "dev": true, + "requires": { + "is-descriptor": "^0.1.0" + } + }, + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npm.taobao.org/kind-of/download/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "object-hash": { + "version": "1.3.1", + "resolved": "https://registry.npm.taobao.org/object-hash/download/object-hash-1.3.1.tgz", + "integrity": "sha1-/eRSCYqVHLFF8Dm7fUVUSd3BJt8=", + "dev": true + }, + "object-inspect": { + "version": "1.7.0", + "resolved": "https://registry.npm.taobao.org/object-inspect/download/object-inspect-1.7.0.tgz", + "integrity": "sha1-9Pa9GBrXfwBrXs5gvQtvOY/3Smc=", + "dev": true + }, + "object-is": { + "version": "1.0.2", + "resolved": "https://registry.npm.taobao.org/object-is/download/object-is-1.0.2.tgz?cache=0&sync_timestamp=1576479714417&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fobject-is%2Fdownload%2Fobject-is-1.0.2.tgz", + "integrity": "sha1-a4DrhP5FFJj2UAeYLwNaW0Re3sQ=", + "dev": true + }, + "object-keys": { + "version": "1.1.1", + "resolved": "https://registry.npm.taobao.org/object-keys/download/object-keys-1.1.1.tgz", + "integrity": "sha1-HEfyct8nfzsdrwYWd9nILiMixg4=", + "dev": true + }, + "object-visit": { + "version": "1.0.1", + "resolved": "https://registry.npm.taobao.org/object-visit/download/object-visit-1.0.1.tgz", + "integrity": "sha1-95xEk68MU3e1n+OdOV5BBC3QRbs=", + "dev": true, + "requires": { + "isobject": "^3.0.0" + } + }, + "object.assign": { + "version": "4.1.0", + "resolved": "https://registry.npm.taobao.org/object.assign/download/object.assign-4.1.0.tgz", + "integrity": "sha1-lovxEA15Vrs8oIbwBvhGs7xACNo=", + "dev": true, + "requires": { + "define-properties": "^1.1.2", + "function-bind": "^1.1.1", + "has-symbols": "^1.0.0", + "object-keys": "^1.0.11" + } + }, + "object.getownpropertydescriptors": { + "version": "2.1.0", + "resolved": "https://registry.npm.taobao.org/object.getownpropertydescriptors/download/object.getownpropertydescriptors-2.1.0.tgz?cache=0&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fobject.getownpropertydescriptors%2Fdownload%2Fobject.getownpropertydescriptors-2.1.0.tgz", + "integrity": "sha1-Npvx+VktiridcS3O1cuBx8U1Jkk=", + "dev": true, + "requires": { + "define-properties": "^1.1.3", + "es-abstract": "^1.17.0-next.1" + } + }, + "object.pick": { + "version": "1.3.0", + "resolved": "https://registry.npm.taobao.org/object.pick/download/object.pick-1.3.0.tgz", + "integrity": "sha1-h6EKxMFpS9Lhy/U1kaZhQftd10c=", + "dev": true, + "requires": { + "isobject": "^3.0.1" + } + }, + "object.values": { + "version": "1.1.1", + "resolved": "https://registry.npm.taobao.org/object.values/download/object.values-1.1.1.tgz", + "integrity": "sha1-aKmezeNWt+kpWjxeDOMdyMlT3l4=", + "dev": true, + "requires": { + "define-properties": "^1.1.3", + "es-abstract": "^1.17.0-next.1", + "function-bind": "^1.1.1", + "has": "^1.0.3" + } + }, + "obuf": { + "version": "1.1.2", + "resolved": "https://registry.npm.taobao.org/obuf/download/obuf-1.1.2.tgz", + "integrity": "sha1-Cb6jND1BhZ69RGKS0RydTbYZCE4=", + "dev": true + }, + "on-finished": { + "version": "2.3.0", + "resolved": "https://registry.npm.taobao.org/on-finished/download/on-finished-2.3.0.tgz", + "integrity": "sha1-IPEzZIGwg811M3mSoWlxqi2QaUc=", + "dev": true, + "requires": { + "ee-first": "1.1.1" + } + }, + "on-headers": { + "version": "1.0.2", + "resolved": "https://registry.npm.taobao.org/on-headers/download/on-headers-1.0.2.tgz", + "integrity": "sha1-dysK5qqlJcOZ5Imt+tkMQD6zwo8=", + "dev": true + }, + "once": { + "version": "1.4.0", + "resolved": "https://registry.npm.taobao.org/once/download/once-1.4.0.tgz", + "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", + "dev": true, + "requires": { + "wrappy": "1" + } + }, + "onetime": { + "version": "2.0.1", + "resolved": "https://registry.npm.taobao.org/onetime/download/onetime-2.0.1.tgz", + "integrity": "sha1-BnQoIw/WdEOyeUsiu6UotoZ5YtQ=", + "dev": true, + "requires": { + "mimic-fn": "^1.0.0" + } + }, + "open": { + "version": "6.4.0", + "resolved": "https://registry.npm.taobao.org/open/download/open-6.4.0.tgz?cache=0&sync_timestamp=1583734954683&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fopen%2Fdownload%2Fopen-6.4.0.tgz", + "integrity": "sha1-XBPpbQ3IlGhhZPGJZez+iJ7PyKk=", + "dev": true, + "requires": { + "is-wsl": "^1.1.0" + } + }, + "opener": { + "version": "1.5.1", + "resolved": "https://registry.npm.taobao.org/opener/download/opener-1.5.1.tgz", + "integrity": "sha1-bS8Od/GgrwAyrKcWwsH7uOfoq+0=", + "dev": true + }, + "opn": { + "version": "5.5.0", + "resolved": "https://registry.npm.taobao.org/opn/download/opn-5.5.0.tgz", + "integrity": "sha1-/HFk+rVtI1kExRw7J9pnWMo7m/w=", + "dev": true, + "requires": { + "is-wsl": "^1.1.0" + } + }, + "optionator": { + "version": "0.8.3", + "resolved": "https://registry.npm.taobao.org/optionator/download/optionator-0.8.3.tgz?cache=0&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Foptionator%2Fdownload%2Foptionator-0.8.3.tgz", + "integrity": "sha1-hPodA2/p08fiHZmIS2ARZ+yPtJU=", + "dev": true, + "requires": { + "deep-is": "~0.1.3", + "fast-levenshtein": "~2.0.6", + "levn": "~0.3.0", + "prelude-ls": "~1.1.2", + "type-check": "~0.3.2", + "word-wrap": "~1.2.3" + } + }, + "ora": { + "version": "3.4.0", + "resolved": "https://registry.npm.taobao.org/ora/download/ora-3.4.0.tgz?cache=0&sync_timestamp=1573640943103&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fora%2Fdownload%2Fora-3.4.0.tgz", + "integrity": "sha1-vwdSSRBZo+8+1MhQl1Md6f280xg=", + "dev": true, + "requires": { + "chalk": "^2.4.2", + "cli-cursor": "^2.1.0", + "cli-spinners": "^2.0.0", + "log-symbols": "^2.2.0", + "strip-ansi": "^5.2.0", + "wcwidth": "^1.0.1" + }, + "dependencies": { + "strip-ansi": { + "version": "5.2.0", + "resolved": "https://registry.npm.taobao.org/strip-ansi/download/strip-ansi-5.2.0.tgz", + "integrity": "sha1-jJpTb+tq/JYr36WxBKUJHBrZwK4=", + "dev": true, + "requires": { + "ansi-regex": "^4.1.0" + } + } + } + }, + "original": { + "version": "1.0.2", + "resolved": "https://registry.npm.taobao.org/original/download/original-1.0.2.tgz", + "integrity": "sha1-5EKmHP/hxf0gpl8yYcJmY7MD8l8=", + "dev": true, + "requires": { + "url-parse": "^1.4.3" + } + }, + "os-browserify": { + "version": "0.3.0", + "resolved": "https://registry.npm.taobao.org/os-browserify/download/os-browserify-0.3.0.tgz", + "integrity": "sha1-hUNzx/XCMVkU/Jv8a9gjj92h7Cc=", + "dev": true + }, + "os-locale": { + "version": "3.1.0", + "resolved": "https://registry.npm.taobao.org/os-locale/download/os-locale-3.1.0.tgz", + "integrity": "sha1-qAKm7hfyTBBIOrmTVxnO9O0Wvxo=", + "dev": true, + "requires": { + "execa": "^1.0.0", + "lcid": "^2.0.0", + "mem": "^4.0.0" + } + }, + "os-tmpdir": { + "version": "1.0.2", + "resolved": "https://registry.npm.taobao.org/os-tmpdir/download/os-tmpdir-1.0.2.tgz", + "integrity": "sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ=", + "dev": true + }, + "p-defer": { + "version": "1.0.0", + "resolved": "https://registry.npm.taobao.org/p-defer/download/p-defer-1.0.0.tgz", + "integrity": "sha1-n26xgvbJqozXQwBKfU+WsZaw+ww=", + "dev": true + }, + "p-finally": { + "version": "1.0.0", + "resolved": "https://registry.npm.taobao.org/p-finally/download/p-finally-1.0.0.tgz", + "integrity": "sha1-P7z7FbiZpEEjs0ttzBi3JDNqLK4=", + "dev": true + }, + "p-is-promise": { + "version": "2.1.0", + "resolved": "https://registry.npm.taobao.org/p-is-promise/download/p-is-promise-2.1.0.tgz", + "integrity": "sha1-kYzrrqJIpiz3/6uOO8qMX4gvxC4=", + "dev": true + }, + "p-limit": { + "version": "2.2.2", + "resolved": "https://registry.npm.taobao.org/p-limit/download/p-limit-2.2.2.tgz?cache=0&sync_timestamp=1577904218145&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fp-limit%2Fdownload%2Fp-limit-2.2.2.tgz", + "integrity": "sha1-YSebZ3IfUoeqHBOpp/u8SMkpGx4=", + "dev": true, + "requires": { + "p-try": "^2.0.0" + } + }, + "p-locate": { + "version": "3.0.0", + "resolved": "https://registry.npm.taobao.org/p-locate/download/p-locate-3.0.0.tgz", + "integrity": "sha1-Mi1poFwCZLJZl9n0DNiokasAZKQ=", + "dev": true, + "requires": { + "p-limit": "^2.0.0" + } + }, + "p-map": { + "version": "3.0.0", + "resolved": "https://registry.npm.taobao.org/p-map/download/p-map-3.0.0.tgz", + "integrity": "sha1-1wTZr4orpoTiYA2aIVmD1BQal50=", + "dev": true, + "requires": { + "aggregate-error": "^3.0.0" + } + }, + "p-retry": { + "version": "3.0.1", + "resolved": "https://registry.npm.taobao.org/p-retry/download/p-retry-3.0.1.tgz", + "integrity": "sha1-MWtMiJPiyNwc+okfQGxLQivr8yg=", + "dev": true, + "requires": { + "retry": "^0.12.0" + } + }, + "p-try": { + "version": "2.2.0", + "resolved": "https://registry.npm.taobao.org/p-try/download/p-try-2.2.0.tgz", + "integrity": "sha1-yyhoVA4xPWHeWPr741zpAE1VQOY=", + "dev": true + }, + "pako": { + "version": "1.0.11", + "resolved": "https://registry.npm.taobao.org/pako/download/pako-1.0.11.tgz?cache=0&sync_timestamp=1580284264887&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fpako%2Fdownload%2Fpako-1.0.11.tgz", + "integrity": "sha1-bJWZ00DVTf05RjgCUqNXBaa5kr8=", + "dev": true + }, + "parallel-transform": { + "version": "1.2.0", + "resolved": "https://registry.npm.taobao.org/parallel-transform/download/parallel-transform-1.2.0.tgz", + "integrity": "sha1-kEnKN9bLIYLDsdLHIL6U0UpYFPw=", + "dev": true, + "requires": { + "cyclist": "^1.0.1", + "inherits": "^2.0.3", + "readable-stream": "^2.1.5" + } + }, + "param-case": { + "version": "2.1.1", + "resolved": "https://registry.npm.taobao.org/param-case/download/param-case-2.1.1.tgz", + "integrity": "sha1-35T9jPZTHs915r75oIWPvHK+Ikc=", + "dev": true, + "requires": { + "no-case": "^2.2.0" + } + }, + "parent-module": { + "version": "1.0.1", + "resolved": "https://registry.npm.taobao.org/parent-module/download/parent-module-1.0.1.tgz", + "integrity": "sha1-aR0nCeeMefrjoVZiJFLQB2LKqqI=", + "dev": true, + "requires": { + "callsites": "^3.0.0" + }, + "dependencies": { + "callsites": { + "version": "3.1.0", + "resolved": "https://registry.npm.taobao.org/callsites/download/callsites-3.1.0.tgz", + "integrity": "sha1-s2MKvYlDQy9Us/BRkjjjPNffL3M=", + "dev": true + } + } + }, + "parse-asn1": { + "version": "5.1.5", + "resolved": "https://registry.npm.taobao.org/parse-asn1/download/parse-asn1-5.1.5.tgz", + "integrity": "sha1-ADJxND2ljclMrOSU+u89IUfs6g4=", + "dev": true, + "requires": { + "asn1.js": "^4.0.0", + "browserify-aes": "^1.0.0", + "create-hash": "^1.1.0", + "evp_bytestokey": "^1.0.0", + "pbkdf2": "^3.0.3", + "safe-buffer": "^5.1.1" + } + }, + "parse-json": { + "version": "5.0.0", + "resolved": "https://registry.npm.taobao.org/parse-json/download/parse-json-5.0.0.tgz", + "integrity": "sha1-c+URTJhtFD76NxLU6iTbmkJm9g8=", + "dev": true, + "requires": { + "@babel/code-frame": "^7.0.0", + "error-ex": "^1.3.1", + "json-parse-better-errors": "^1.0.1", + "lines-and-columns": "^1.1.6" + } + }, + "parse5": { + "version": "5.1.1", + "resolved": "https://registry.npm.taobao.org/parse5/download/parse5-5.1.1.tgz", + "integrity": "sha1-9o5OW6GFKsLK3AD0VV//bCq7YXg=", + "dev": true + }, + "parse5-htmlparser2-tree-adapter": { + "version": "5.1.1", + "resolved": "https://registry.npm.taobao.org/parse5-htmlparser2-tree-adapter/download/parse5-htmlparser2-tree-adapter-5.1.1.tgz", + "integrity": "sha1-6MdD1OkhlNUpPs3isIvjHmdGHLw=", + "dev": true, + "requires": { + "parse5": "^5.1.1" + } + }, + "parseurl": { + "version": "1.3.3", + "resolved": "https://registry.npm.taobao.org/parseurl/download/parseurl-1.3.3.tgz", + "integrity": "sha1-naGee+6NEt/wUT7Vt2lXeTvC6NQ=", + "dev": true + }, + "pascalcase": { + "version": "0.1.1", + "resolved": "https://registry.npm.taobao.org/pascalcase/download/pascalcase-0.1.1.tgz", + "integrity": "sha1-s2PlXoAGym/iF4TS2yK9FdeRfxQ=", + "dev": true + }, + "path-browserify": { + "version": "0.0.1", + "resolved": "https://registry.npm.taobao.org/path-browserify/download/path-browserify-0.0.1.tgz", + "integrity": "sha1-5sTd1+06onxoogzE5Q4aTug7vEo=", + "dev": true + }, + "path-dirname": { + "version": "1.0.2", + "resolved": "https://registry.npm.taobao.org/path-dirname/download/path-dirname-1.0.2.tgz", + "integrity": "sha1-zDPSTVJeCZpTiMAzbG4yuRYGCeA=", + "dev": true + }, + "path-exists": { + "version": "3.0.0", + "resolved": "https://registry.npm.taobao.org/path-exists/download/path-exists-3.0.0.tgz", + "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=", + "dev": true + }, + "path-is-absolute": { + "version": "1.0.1", + "resolved": "https://registry.npm.taobao.org/path-is-absolute/download/path-is-absolute-1.0.1.tgz", + "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=", + "dev": true + }, + "path-is-inside": { + "version": "1.0.2", + "resolved": "https://registry.npm.taobao.org/path-is-inside/download/path-is-inside-1.0.2.tgz", + "integrity": "sha1-NlQX3t5EQw0cEa9hAn+s8HS9/FM=", + "dev": true + }, + "path-key": { + "version": "2.0.1", + "resolved": "https://registry.npm.taobao.org/path-key/download/path-key-2.0.1.tgz", + "integrity": "sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A=", + "dev": true + }, + "path-parse": { + "version": "1.0.6", + "resolved": "https://registry.npm.taobao.org/path-parse/download/path-parse-1.0.6.tgz", + "integrity": "sha1-1i27VnlAXXLEc37FhgDp3c8G0kw=", + "dev": true + }, + "path-to-regexp": { + "version": "0.1.7", + "resolved": "https://registry.npm.taobao.org/path-to-regexp/download/path-to-regexp-0.1.7.tgz", + "integrity": "sha1-32BBeABfUi8V60SQ5yR6G/qmf4w=", + "dev": true + }, + "path-type": { + "version": "3.0.0", + "resolved": "https://registry.npm.taobao.org/path-type/download/path-type-3.0.0.tgz", + "integrity": "sha1-zvMdyOCho7sNEFwM2Xzzv0f0428=", + "dev": true, + "requires": { + "pify": "^3.0.0" + }, + "dependencies": { + "pify": { + "version": "3.0.0", + "resolved": "https://registry.npm.taobao.org/pify/download/pify-3.0.0.tgz?cache=0&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fpify%2Fdownload%2Fpify-3.0.0.tgz", + "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=", + "dev": true + } + } + }, + "pbkdf2": { + "version": "3.0.17", + "resolved": "https://registry.npm.taobao.org/pbkdf2/download/pbkdf2-3.0.17.tgz", + "integrity": "sha1-l2wgZTBhexTrsyEUI597CTNuk6Y=", + "dev": true, + "requires": { + "create-hash": "^1.1.2", + "create-hmac": "^1.1.4", + "ripemd160": "^2.0.1", + "safe-buffer": "^5.0.1", + "sha.js": "^2.4.8" + } + }, + "performance-now": { + "version": "2.1.0", + "resolved": "https://registry.npm.taobao.org/performance-now/download/performance-now-2.1.0.tgz", + "integrity": "sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns=", + "dev": true + }, + "pify": { + "version": "4.0.1", + "resolved": "https://registry.npm.taobao.org/pify/download/pify-4.0.1.tgz?cache=0&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fpify%2Fdownload%2Fpify-4.0.1.tgz", + "integrity": "sha1-SyzSXFDVmHNcUCkiJP2MbfQeMjE=", + "dev": true + }, + "pinkie": { + "version": "2.0.4", + "resolved": "https://registry.npm.taobao.org/pinkie/download/pinkie-2.0.4.tgz", + "integrity": "sha1-clVrgM+g1IqXToDnckjoDtT3+HA=", + "dev": true + }, + "pinkie-promise": { + "version": "2.0.1", + "resolved": "https://registry.npm.taobao.org/pinkie-promise/download/pinkie-promise-2.0.1.tgz", + "integrity": "sha1-ITXW36ejWMBprJsXh3YogihFD/o=", + "dev": true, + "requires": { + "pinkie": "^2.0.0" + } + }, + "pkg-dir": { + "version": "3.0.0", + "resolved": "https://registry.npm.taobao.org/pkg-dir/download/pkg-dir-3.0.0.tgz", + "integrity": "sha1-J0kCDyOe2ZCIGx9xIQ1R62UjvqM=", + "dev": true, + "requires": { + "find-up": "^3.0.0" + } + }, + "pkg-up": { + "version": "3.1.0", + "resolved": "https://registry.npm.taobao.org/pkg-up/download/pkg-up-3.1.0.tgz", + "integrity": "sha1-EA7CNcwVDk/UJRlBJZaihRKg3vU=", + "dev": true, + "requires": { + "find-up": "^3.0.0" + } + }, + "pnp-webpack-plugin": { + "version": "1.6.4", + "resolved": "https://registry.npm.taobao.org/pnp-webpack-plugin/download/pnp-webpack-plugin-1.6.4.tgz", + "integrity": "sha1-yXEaxNxIpoXauvyG+Lbdn434QUk=", + "dev": true, + "requires": { + "ts-pnp": "^1.1.6" + } + }, + "portfinder": { + "version": "1.0.25", + "resolved": "https://registry.npm.taobao.org/portfinder/download/portfinder-1.0.25.tgz", + "integrity": "sha1-JU/TN/+6hp9LnTftwpgFnLTTXso=", + "dev": true, + "requires": { + "async": "^2.6.2", + "debug": "^3.1.1", + "mkdirp": "^0.5.1" + }, + "dependencies": { + "debug": { + "version": "3.2.6", + "resolved": "https://registry.npm.taobao.org/debug/download/debug-3.2.6.tgz", + "integrity": "sha1-6D0X3hbYp++3cX7b5fsQE17uYps=", + "dev": true, + "requires": { + "ms": "^2.1.1" + } + } + } + }, + "posix-character-classes": { + "version": "0.1.1", + "resolved": "https://registry.npm.taobao.org/posix-character-classes/download/posix-character-classes-0.1.1.tgz", + "integrity": "sha1-AerA/jta9xoqbAL+q7jB/vfgDqs=", + "dev": true + }, + "postcss": { + "version": "7.0.27", + "resolved": "https://registry.npm.taobao.org/postcss/download/postcss-7.0.27.tgz?cache=0&sync_timestamp=1581994853208&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fpostcss%2Fdownload%2Fpostcss-7.0.27.tgz", + "integrity": "sha1-zGfNxrDao3UQW3xCSoVWc0X8VNk=", + "dev": true, + "requires": { + "chalk": "^2.4.2", + "source-map": "^0.6.1", + "supports-color": "^6.1.0" + }, + "dependencies": { + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npm.taobao.org/source-map/download/source-map-0.6.1.tgz", + "integrity": "sha1-dHIq8y6WFOnCh6jQu95IteLxomM=", + "dev": true + }, + "supports-color": { + "version": "6.1.0", + "resolved": "https://registry.npm.taobao.org/supports-color/download/supports-color-6.1.0.tgz?cache=0&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fsupports-color%2Fdownload%2Fsupports-color-6.1.0.tgz", + "integrity": "sha1-B2Srxpxj1ayELdSGfo0CXogN+PM=", + "dev": true, + "requires": { + "has-flag": "^3.0.0" + } + } + } + }, + "postcss-calc": { + "version": "7.0.2", + "resolved": "https://registry.npm.taobao.org/postcss-calc/download/postcss-calc-7.0.2.tgz?cache=0&sync_timestamp=1582014221563&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fpostcss-calc%2Fdownload%2Fpostcss-calc-7.0.2.tgz", + "integrity": "sha1-UE780AjKAnMSBWiweSsWzc3oqsE=", + "dev": true, + "requires": { + "postcss": "^7.0.27", + "postcss-selector-parser": "^6.0.2", + "postcss-value-parser": "^4.0.2" + } + }, + "postcss-colormin": { + "version": "4.0.3", + "resolved": "https://registry.npm.taobao.org/postcss-colormin/download/postcss-colormin-4.0.3.tgz", + "integrity": "sha1-rgYLzpPteUrHEmTwgTLVUJVr04E=", + "dev": true, + "requires": { + "browserslist": "^4.0.0", + "color": "^3.0.0", + "has": "^1.0.0", + "postcss": "^7.0.0", + "postcss-value-parser": "^3.0.0" + }, + "dependencies": { + "postcss-value-parser": { + "version": "3.3.1", + "resolved": "https://registry.npm.taobao.org/postcss-value-parser/download/postcss-value-parser-3.3.1.tgz?cache=0&sync_timestamp=1582038067636&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fpostcss-value-parser%2Fdownload%2Fpostcss-value-parser-3.3.1.tgz", + "integrity": "sha1-n/giVH4okyE88cMO+lGsX9G6goE=", + "dev": true + } + } + }, + "postcss-convert-values": { + "version": "4.0.1", + "resolved": "https://registry.npm.taobao.org/postcss-convert-values/download/postcss-convert-values-4.0.1.tgz", + "integrity": "sha1-yjgT7U2g+BL51DcDWE5Enr4Ymn8=", + "dev": true, + "requires": { + "postcss": "^7.0.0", + "postcss-value-parser": "^3.0.0" + }, + "dependencies": { + "postcss-value-parser": { + "version": "3.3.1", + "resolved": "https://registry.npm.taobao.org/postcss-value-parser/download/postcss-value-parser-3.3.1.tgz?cache=0&sync_timestamp=1582038067636&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fpostcss-value-parser%2Fdownload%2Fpostcss-value-parser-3.3.1.tgz", + "integrity": "sha1-n/giVH4okyE88cMO+lGsX9G6goE=", + "dev": true + } + } + }, + "postcss-discard-comments": { + "version": "4.0.2", + "resolved": "https://registry.npm.taobao.org/postcss-discard-comments/download/postcss-discard-comments-4.0.2.tgz", + "integrity": "sha1-H7q9LCRr/2qq15l7KwkY9NevQDM=", + "dev": true, + "requires": { + "postcss": "^7.0.0" + } + }, + "postcss-discard-duplicates": { + "version": "4.0.2", + "resolved": "https://registry.npm.taobao.org/postcss-discard-duplicates/download/postcss-discard-duplicates-4.0.2.tgz", + "integrity": "sha1-P+EzzTyCKC5VD8myORdqkge3hOs=", + "dev": true, + "requires": { + "postcss": "^7.0.0" + } + }, + "postcss-discard-empty": { + "version": "4.0.1", + "resolved": "https://registry.npm.taobao.org/postcss-discard-empty/download/postcss-discard-empty-4.0.1.tgz", + "integrity": "sha1-yMlR6fc+2UKAGUWERKAq2Qu592U=", + "dev": true, + "requires": { + "postcss": "^7.0.0" + } + }, + "postcss-discard-overridden": { + "version": "4.0.1", + "resolved": "https://registry.npm.taobao.org/postcss-discard-overridden/download/postcss-discard-overridden-4.0.1.tgz", + "integrity": "sha1-ZSrvipZybwKfXj4AFG7npOdV/1c=", + "dev": true, + "requires": { + "postcss": "^7.0.0" + } + }, + "postcss-load-config": { + "version": "2.1.0", + "resolved": "https://registry.npm.taobao.org/postcss-load-config/download/postcss-load-config-2.1.0.tgz", + "integrity": "sha1-yE1pK3u3tB3c7ZTuYuirMbQXsAM=", + "dev": true, + "requires": { + "cosmiconfig": "^5.0.0", + "import-cwd": "^2.0.0" + } + }, + "postcss-loader": { + "version": "3.0.0", + "resolved": "https://registry.npm.taobao.org/postcss-loader/download/postcss-loader-3.0.0.tgz", + "integrity": "sha1-a5eUPkfHLYRfqeA/Jzdz1OjdbC0=", + "dev": true, + "requires": { + "loader-utils": "^1.1.0", + "postcss": "^7.0.0", + "postcss-load-config": "^2.0.0", + "schema-utils": "^1.0.0" + }, + "dependencies": { + "schema-utils": { + "version": "1.0.0", + "resolved": "https://registry.npm.taobao.org/schema-utils/download/schema-utils-1.0.0.tgz", + "integrity": "sha1-C3mpMgTXtgDUsoUNH2bCo0lRx3A=", + "dev": true, + "requires": { + "ajv": "^6.1.0", + "ajv-errors": "^1.0.0", + "ajv-keywords": "^3.1.0" + } + } + } + }, + "postcss-merge-longhand": { + "version": "4.0.11", + "resolved": "https://registry.npm.taobao.org/postcss-merge-longhand/download/postcss-merge-longhand-4.0.11.tgz", + "integrity": "sha1-YvSaE+Sg7gTnuY9CuxYGLKJUniQ=", + "dev": true, + "requires": { + "css-color-names": "0.0.4", + "postcss": "^7.0.0", + "postcss-value-parser": "^3.0.0", + "stylehacks": "^4.0.0" + }, + "dependencies": { + "postcss-value-parser": { + "version": "3.3.1", + "resolved": "https://registry.npm.taobao.org/postcss-value-parser/download/postcss-value-parser-3.3.1.tgz?cache=0&sync_timestamp=1582038067636&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fpostcss-value-parser%2Fdownload%2Fpostcss-value-parser-3.3.1.tgz", + "integrity": "sha1-n/giVH4okyE88cMO+lGsX9G6goE=", + "dev": true + } + } + }, + "postcss-merge-rules": { + "version": "4.0.3", + "resolved": "https://registry.npm.taobao.org/postcss-merge-rules/download/postcss-merge-rules-4.0.3.tgz", + "integrity": "sha1-NivqT/Wh+Y5AdacTxsslrv75plA=", + "dev": true, + "requires": { + "browserslist": "^4.0.0", + "caniuse-api": "^3.0.0", + "cssnano-util-same-parent": "^4.0.0", + "postcss": "^7.0.0", + "postcss-selector-parser": "^3.0.0", + "vendors": "^1.0.0" + }, + "dependencies": { + "postcss-selector-parser": { + "version": "3.1.2", + "resolved": "https://registry.npm.taobao.org/postcss-selector-parser/download/postcss-selector-parser-3.1.2.tgz?cache=0&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fpostcss-selector-parser%2Fdownload%2Fpostcss-selector-parser-3.1.2.tgz", + "integrity": "sha1-sxD1xMD9r3b5SQK7qjDbaqhPUnA=", + "dev": true, + "requires": { + "dot-prop": "^5.2.0", + "indexes-of": "^1.0.1", + "uniq": "^1.0.1" + } + } + } + }, + "postcss-minify-font-values": { + "version": "4.0.2", + "resolved": "https://registry.npm.taobao.org/postcss-minify-font-values/download/postcss-minify-font-values-4.0.2.tgz", + "integrity": "sha1-zUw0TM5HQ0P6xdgiBqssvLiv1aY=", + "dev": true, + "requires": { + "postcss": "^7.0.0", + "postcss-value-parser": "^3.0.0" + }, + "dependencies": { + "postcss-value-parser": { + "version": "3.3.1", + "resolved": "https://registry.npm.taobao.org/postcss-value-parser/download/postcss-value-parser-3.3.1.tgz?cache=0&sync_timestamp=1582038067636&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fpostcss-value-parser%2Fdownload%2Fpostcss-value-parser-3.3.1.tgz", + "integrity": "sha1-n/giVH4okyE88cMO+lGsX9G6goE=", + "dev": true + } + } + }, + "postcss-minify-gradients": { + "version": "4.0.2", + "resolved": "https://registry.npm.taobao.org/postcss-minify-gradients/download/postcss-minify-gradients-4.0.2.tgz", + "integrity": "sha1-k7KcL/UJnFNe7NpWxKpuZlpmNHE=", + "dev": true, + "requires": { + "cssnano-util-get-arguments": "^4.0.0", + "is-color-stop": "^1.0.0", + "postcss": "^7.0.0", + "postcss-value-parser": "^3.0.0" + }, + "dependencies": { + "postcss-value-parser": { + "version": "3.3.1", + "resolved": "https://registry.npm.taobao.org/postcss-value-parser/download/postcss-value-parser-3.3.1.tgz?cache=0&sync_timestamp=1582038067636&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fpostcss-value-parser%2Fdownload%2Fpostcss-value-parser-3.3.1.tgz", + "integrity": "sha1-n/giVH4okyE88cMO+lGsX9G6goE=", + "dev": true + } + } + }, + "postcss-minify-params": { + "version": "4.0.2", + "resolved": "https://registry.npm.taobao.org/postcss-minify-params/download/postcss-minify-params-4.0.2.tgz", + "integrity": "sha1-a5zvAwwR41Jh+V9hjJADbWgNuHQ=", + "dev": true, + "requires": { + "alphanum-sort": "^1.0.0", + "browserslist": "^4.0.0", + "cssnano-util-get-arguments": "^4.0.0", + "postcss": "^7.0.0", + "postcss-value-parser": "^3.0.0", + "uniqs": "^2.0.0" + }, + "dependencies": { + "postcss-value-parser": { + "version": "3.3.1", + "resolved": "https://registry.npm.taobao.org/postcss-value-parser/download/postcss-value-parser-3.3.1.tgz?cache=0&sync_timestamp=1582038067636&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fpostcss-value-parser%2Fdownload%2Fpostcss-value-parser-3.3.1.tgz", + "integrity": "sha1-n/giVH4okyE88cMO+lGsX9G6goE=", + "dev": true + } + } + }, + "postcss-minify-selectors": { + "version": "4.0.2", + "resolved": "https://registry.npm.taobao.org/postcss-minify-selectors/download/postcss-minify-selectors-4.0.2.tgz", + "integrity": "sha1-4uXrQL/uUA0M2SQ1APX46kJi+9g=", + "dev": true, + "requires": { + "alphanum-sort": "^1.0.0", + "has": "^1.0.0", + "postcss": "^7.0.0", + "postcss-selector-parser": "^3.0.0" + }, + "dependencies": { + "postcss-selector-parser": { + "version": "3.1.2", + "resolved": "https://registry.npm.taobao.org/postcss-selector-parser/download/postcss-selector-parser-3.1.2.tgz?cache=0&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fpostcss-selector-parser%2Fdownload%2Fpostcss-selector-parser-3.1.2.tgz", + "integrity": "sha1-sxD1xMD9r3b5SQK7qjDbaqhPUnA=", + "dev": true, + "requires": { + "dot-prop": "^5.2.0", + "indexes-of": "^1.0.1", + "uniq": "^1.0.1" + } + } + } + }, + "postcss-modules-extract-imports": { + "version": "2.0.0", + "resolved": "https://registry.npm.taobao.org/postcss-modules-extract-imports/download/postcss-modules-extract-imports-2.0.0.tgz", + "integrity": "sha1-gYcZoa4doyX5gyRGsBE27rSTzX4=", + "dev": true, + "requires": { + "postcss": "^7.0.5" + } + }, + "postcss-modules-local-by-default": { + "version": "3.0.2", + "resolved": "https://registry.npm.taobao.org/postcss-modules-local-by-default/download/postcss-modules-local-by-default-3.0.2.tgz", + "integrity": "sha1-6KZWG+kUqvPAUodjd1JMqQ27eRU=", + "dev": true, + "requires": { + "icss-utils": "^4.1.1", + "postcss": "^7.0.16", + "postcss-selector-parser": "^6.0.2", + "postcss-value-parser": "^4.0.0" + } + }, + "postcss-modules-scope": { + "version": "2.2.0", + "resolved": "https://registry.npm.taobao.org/postcss-modules-scope/download/postcss-modules-scope-2.2.0.tgz", + "integrity": "sha1-OFyuATzHdD9afXYC0Qc6iequYu4=", + "dev": true, + "requires": { + "postcss": "^7.0.6", + "postcss-selector-parser": "^6.0.0" + } + }, + "postcss-modules-values": { + "version": "3.0.0", + "resolved": "https://registry.npm.taobao.org/postcss-modules-values/download/postcss-modules-values-3.0.0.tgz", + "integrity": "sha1-W1AA1uuuKbQlUwG0o6VFdEI+fxA=", + "dev": true, + "requires": { + "icss-utils": "^4.0.0", + "postcss": "^7.0.6" + } + }, + "postcss-normalize-charset": { + "version": "4.0.1", + "resolved": "https://registry.npm.taobao.org/postcss-normalize-charset/download/postcss-normalize-charset-4.0.1.tgz", + "integrity": "sha1-izWt067oOhNrBHHg1ZvlilAoXdQ=", + "dev": true, + "requires": { + "postcss": "^7.0.0" + } + }, + "postcss-normalize-display-values": { + "version": "4.0.2", + "resolved": "https://registry.npm.taobao.org/postcss-normalize-display-values/download/postcss-normalize-display-values-4.0.2.tgz", + "integrity": "sha1-Db4EpM6QY9RmftK+R2u4MMglk1o=", + "dev": true, + "requires": { + "cssnano-util-get-match": "^4.0.0", + "postcss": "^7.0.0", + "postcss-value-parser": "^3.0.0" + }, + "dependencies": { + "postcss-value-parser": { + "version": "3.3.1", + "resolved": "https://registry.npm.taobao.org/postcss-value-parser/download/postcss-value-parser-3.3.1.tgz?cache=0&sync_timestamp=1582038067636&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fpostcss-value-parser%2Fdownload%2Fpostcss-value-parser-3.3.1.tgz", + "integrity": "sha1-n/giVH4okyE88cMO+lGsX9G6goE=", + "dev": true + } + } + }, + "postcss-normalize-positions": { + "version": "4.0.2", + "resolved": "https://registry.npm.taobao.org/postcss-normalize-positions/download/postcss-normalize-positions-4.0.2.tgz", + "integrity": "sha1-BfdX+E8mBDc3g2ipH4ky1LECkX8=", + "dev": true, + "requires": { + "cssnano-util-get-arguments": "^4.0.0", + "has": "^1.0.0", + "postcss": "^7.0.0", + "postcss-value-parser": "^3.0.0" + }, + "dependencies": { + "postcss-value-parser": { + "version": "3.3.1", + "resolved": "https://registry.npm.taobao.org/postcss-value-parser/download/postcss-value-parser-3.3.1.tgz?cache=0&sync_timestamp=1582038067636&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fpostcss-value-parser%2Fdownload%2Fpostcss-value-parser-3.3.1.tgz", + "integrity": "sha1-n/giVH4okyE88cMO+lGsX9G6goE=", + "dev": true + } + } + }, + "postcss-normalize-repeat-style": { + "version": "4.0.2", + "resolved": "https://registry.npm.taobao.org/postcss-normalize-repeat-style/download/postcss-normalize-repeat-style-4.0.2.tgz", + "integrity": "sha1-xOu8KJ85kaAo1EdRy90RkYsXkQw=", + "dev": true, + "requires": { + "cssnano-util-get-arguments": "^4.0.0", + "cssnano-util-get-match": "^4.0.0", + "postcss": "^7.0.0", + "postcss-value-parser": "^3.0.0" + }, + "dependencies": { + "postcss-value-parser": { + "version": "3.3.1", + "resolved": "https://registry.npm.taobao.org/postcss-value-parser/download/postcss-value-parser-3.3.1.tgz?cache=0&sync_timestamp=1582038067636&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fpostcss-value-parser%2Fdownload%2Fpostcss-value-parser-3.3.1.tgz", + "integrity": "sha1-n/giVH4okyE88cMO+lGsX9G6goE=", + "dev": true + } + } + }, + "postcss-normalize-string": { + "version": "4.0.2", + "resolved": "https://registry.npm.taobao.org/postcss-normalize-string/download/postcss-normalize-string-4.0.2.tgz", + "integrity": "sha1-zUTECrB6DHo23F6Zqs4eyk7CaQw=", + "dev": true, + "requires": { + "has": "^1.0.0", + "postcss": "^7.0.0", + "postcss-value-parser": "^3.0.0" + }, + "dependencies": { + "postcss-value-parser": { + "version": "3.3.1", + "resolved": "https://registry.npm.taobao.org/postcss-value-parser/download/postcss-value-parser-3.3.1.tgz?cache=0&sync_timestamp=1582038067636&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fpostcss-value-parser%2Fdownload%2Fpostcss-value-parser-3.3.1.tgz", + "integrity": "sha1-n/giVH4okyE88cMO+lGsX9G6goE=", + "dev": true + } + } + }, + "postcss-normalize-timing-functions": { + "version": "4.0.2", + "resolved": "https://registry.npm.taobao.org/postcss-normalize-timing-functions/download/postcss-normalize-timing-functions-4.0.2.tgz", + "integrity": "sha1-jgCcoqOUnNr4rSPmtquZy159KNk=", + "dev": true, + "requires": { + "cssnano-util-get-match": "^4.0.0", + "postcss": "^7.0.0", + "postcss-value-parser": "^3.0.0" + }, + "dependencies": { + "postcss-value-parser": { + "version": "3.3.1", + "resolved": "https://registry.npm.taobao.org/postcss-value-parser/download/postcss-value-parser-3.3.1.tgz?cache=0&sync_timestamp=1582038067636&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fpostcss-value-parser%2Fdownload%2Fpostcss-value-parser-3.3.1.tgz", + "integrity": "sha1-n/giVH4okyE88cMO+lGsX9G6goE=", + "dev": true + } + } + }, + "postcss-normalize-unicode": { + "version": "4.0.1", + "resolved": "https://registry.npm.taobao.org/postcss-normalize-unicode/download/postcss-normalize-unicode-4.0.1.tgz", + "integrity": "sha1-hBvUj9zzAZrUuqdJOj02O1KuHPs=", + "dev": true, + "requires": { + "browserslist": "^4.0.0", + "postcss": "^7.0.0", + "postcss-value-parser": "^3.0.0" + }, + "dependencies": { + "postcss-value-parser": { + "version": "3.3.1", + "resolved": "https://registry.npm.taobao.org/postcss-value-parser/download/postcss-value-parser-3.3.1.tgz?cache=0&sync_timestamp=1582038067636&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fpostcss-value-parser%2Fdownload%2Fpostcss-value-parser-3.3.1.tgz", + "integrity": "sha1-n/giVH4okyE88cMO+lGsX9G6goE=", + "dev": true + } + } + }, + "postcss-normalize-url": { + "version": "4.0.1", + "resolved": "https://registry.npm.taobao.org/postcss-normalize-url/download/postcss-normalize-url-4.0.1.tgz", + "integrity": "sha1-EOQ3+GvHx+WPe5ZS7YeNqqlfquE=", + "dev": true, + "requires": { + "is-absolute-url": "^2.0.0", + "normalize-url": "^3.0.0", + "postcss": "^7.0.0", + "postcss-value-parser": "^3.0.0" + }, + "dependencies": { + "postcss-value-parser": { + "version": "3.3.1", + "resolved": "https://registry.npm.taobao.org/postcss-value-parser/download/postcss-value-parser-3.3.1.tgz?cache=0&sync_timestamp=1582038067636&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fpostcss-value-parser%2Fdownload%2Fpostcss-value-parser-3.3.1.tgz", + "integrity": "sha1-n/giVH4okyE88cMO+lGsX9G6goE=", + "dev": true + } + } + }, + "postcss-normalize-whitespace": { + "version": "4.0.2", + "resolved": "https://registry.npm.taobao.org/postcss-normalize-whitespace/download/postcss-normalize-whitespace-4.0.2.tgz", + "integrity": "sha1-vx1AcP5Pzqh9E0joJdjMDF+qfYI=", + "dev": true, + "requires": { + "postcss": "^7.0.0", + "postcss-value-parser": "^3.0.0" + }, + "dependencies": { + "postcss-value-parser": { + "version": "3.3.1", + "resolved": "https://registry.npm.taobao.org/postcss-value-parser/download/postcss-value-parser-3.3.1.tgz?cache=0&sync_timestamp=1582038067636&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fpostcss-value-parser%2Fdownload%2Fpostcss-value-parser-3.3.1.tgz", + "integrity": "sha1-n/giVH4okyE88cMO+lGsX9G6goE=", + "dev": true + } + } + }, + "postcss-ordered-values": { + "version": "4.1.2", + "resolved": "https://registry.npm.taobao.org/postcss-ordered-values/download/postcss-ordered-values-4.1.2.tgz", + "integrity": "sha1-DPdcgg7H1cTSgBiVWeC1ceusDu4=", + "dev": true, + "requires": { + "cssnano-util-get-arguments": "^4.0.0", + "postcss": "^7.0.0", + "postcss-value-parser": "^3.0.0" + }, + "dependencies": { + "postcss-value-parser": { + "version": "3.3.1", + "resolved": "https://registry.npm.taobao.org/postcss-value-parser/download/postcss-value-parser-3.3.1.tgz?cache=0&sync_timestamp=1582038067636&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fpostcss-value-parser%2Fdownload%2Fpostcss-value-parser-3.3.1.tgz", + "integrity": "sha1-n/giVH4okyE88cMO+lGsX9G6goE=", + "dev": true + } + } + }, + "postcss-reduce-initial": { + "version": "4.0.3", + "resolved": "https://registry.npm.taobao.org/postcss-reduce-initial/download/postcss-reduce-initial-4.0.3.tgz", + "integrity": "sha1-f9QuvqXpyBRgljniwuhK4nC6SN8=", + "dev": true, + "requires": { + "browserslist": "^4.0.0", + "caniuse-api": "^3.0.0", + "has": "^1.0.0", + "postcss": "^7.0.0" + } + }, + "postcss-reduce-transforms": { + "version": "4.0.2", + "resolved": "https://registry.npm.taobao.org/postcss-reduce-transforms/download/postcss-reduce-transforms-4.0.2.tgz", + "integrity": "sha1-F++kBerMbge+NBSlyi0QdGgdTik=", + "dev": true, + "requires": { + "cssnano-util-get-match": "^4.0.0", + "has": "^1.0.0", + "postcss": "^7.0.0", + "postcss-value-parser": "^3.0.0" + }, + "dependencies": { + "postcss-value-parser": { + "version": "3.3.1", + "resolved": "https://registry.npm.taobao.org/postcss-value-parser/download/postcss-value-parser-3.3.1.tgz?cache=0&sync_timestamp=1582038067636&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fpostcss-value-parser%2Fdownload%2Fpostcss-value-parser-3.3.1.tgz", + "integrity": "sha1-n/giVH4okyE88cMO+lGsX9G6goE=", + "dev": true + } + } + }, + "postcss-selector-parser": { + "version": "6.0.2", + "resolved": "https://registry.npm.taobao.org/postcss-selector-parser/download/postcss-selector-parser-6.0.2.tgz?cache=0&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fpostcss-selector-parser%2Fdownload%2Fpostcss-selector-parser-6.0.2.tgz", + "integrity": "sha1-k0z3mdAWyDQRhZ4J3Oyt4BKG7Fw=", + "dev": true, + "requires": { + "cssesc": "^3.0.0", + "indexes-of": "^1.0.1", + "uniq": "^1.0.1" + } + }, + "postcss-svgo": { + "version": "4.0.2", + "resolved": "https://registry.npm.taobao.org/postcss-svgo/download/postcss-svgo-4.0.2.tgz", + "integrity": "sha1-F7mXvHEbMzurFDqu07jT1uPTglg=", + "dev": true, + "requires": { + "is-svg": "^3.0.0", + "postcss": "^7.0.0", + "postcss-value-parser": "^3.0.0", + "svgo": "^1.0.0" + }, + "dependencies": { + "postcss-value-parser": { + "version": "3.3.1", + "resolved": "https://registry.npm.taobao.org/postcss-value-parser/download/postcss-value-parser-3.3.1.tgz?cache=0&sync_timestamp=1582038067636&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fpostcss-value-parser%2Fdownload%2Fpostcss-value-parser-3.3.1.tgz", + "integrity": "sha1-n/giVH4okyE88cMO+lGsX9G6goE=", + "dev": true + } + } + }, + "postcss-unique-selectors": { + "version": "4.0.1", + "resolved": "https://registry.npm.taobao.org/postcss-unique-selectors/download/postcss-unique-selectors-4.0.1.tgz", + "integrity": "sha1-lEaRHzKJv9ZMbWgPBzwDsfnuS6w=", + "dev": true, + "requires": { + "alphanum-sort": "^1.0.0", + "postcss": "^7.0.0", + "uniqs": "^2.0.0" + } + }, + "postcss-value-parser": { + "version": "4.0.3", + "resolved": "https://registry.npm.taobao.org/postcss-value-parser/download/postcss-value-parser-4.0.3.tgz?cache=0&sync_timestamp=1582038067636&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fpostcss-value-parser%2Fdownload%2Fpostcss-value-parser-4.0.3.tgz", + "integrity": "sha1-ZR/0WTqp7ajV0NZlk6JBeurrMl0=", + "dev": true + }, + "prelude-ls": { + "version": "1.1.2", + "resolved": "https://registry.npm.taobao.org/prelude-ls/download/prelude-ls-1.1.2.tgz", + "integrity": "sha1-IZMqVJ9eUv/ZqCf1cOBL5iqX2lQ=", + "dev": true + }, + "prepend-http": { + "version": "1.0.4", + "resolved": "https://registry.npm.taobao.org/prepend-http/download/prepend-http-1.0.4.tgz", + "integrity": "sha1-1PRWKwzjaW5BrFLQ4ALlemNdxtw=", + "dev": true + }, + "prettier": { + "version": "1.19.1", + "resolved": "https://registry.npm.taobao.org/prettier/download/prettier-1.19.1.tgz?cache=0&sync_timestamp=1585003590220&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fprettier%2Fdownload%2Fprettier-1.19.1.tgz", + "integrity": "sha1-99f1/4qc2HKnvkyhQglZVqYHl8s=", + "dev": true + }, + "pretty-error": { + "version": "2.1.1", + "resolved": "https://registry.npm.taobao.org/pretty-error/download/pretty-error-2.1.1.tgz", + "integrity": "sha1-X0+HyPkeWuPzuoerTPXgOxoX8aM=", + "dev": true, + "requires": { + "renderkid": "^2.0.1", + "utila": "~0.4" + } + }, + "printj": { + "version": "1.1.2", + "resolved": "https://registry.npm.taobao.org/printj/download/printj-1.1.2.tgz", + "integrity": "sha1-2Q3rKXWoufYA+zoclOP0xTx4oiI=" + }, + "private": { + "version": "0.1.8", + "resolved": "https://registry.npm.taobao.org/private/download/private-0.1.8.tgz", + "integrity": "sha1-I4Hts2ifelPWUxkAYPz4ItLzaP8=", + "dev": true + }, + "process": { + "version": "0.11.10", + "resolved": "https://registry.npm.taobao.org/process/download/process-0.11.10.tgz", + "integrity": "sha1-czIwDoQBYb2j5podHZGn1LwW8YI=", + "dev": true + }, + "process-nextick-args": { + "version": "2.0.1", + "resolved": "https://registry.npm.taobao.org/process-nextick-args/download/process-nextick-args-2.0.1.tgz", + "integrity": "sha1-eCDZsWEgzFXKmud5JoCufbptf+I=", + "dev": true + }, + "progress": { + "version": "2.0.3", + "resolved": "https://registry.npm.taobao.org/progress/download/progress-2.0.3.tgz", + "integrity": "sha1-foz42PW48jnBvGi+tOt4Vn1XLvg=", + "dev": true + }, + "promise": { + "version": "7.3.1", + "resolved": "https://registry.npmjs.org/promise/-/promise-7.3.1.tgz", + "integrity": "sha512-nolQXZ/4L+bP/UGlkfaIujX9BKxGwmQ9OT4mOt5yvy8iK1h3wqTEJCijzGANTCCl9nWjY41juyAn2K3Q1hLLTg==", + "dev": true, + "optional": true, + "requires": { + "asap": "~2.0.3" + } + }, + "promise-inflight": { + "version": "1.0.1", + "resolved": "https://registry.npm.taobao.org/promise-inflight/download/promise-inflight-1.0.1.tgz", + "integrity": "sha1-mEcocL8igTL8vdhoEputEsPAKeM=", + "dev": true + }, + "proxy-addr": { + "version": "2.0.6", + "resolved": "https://registry.npm.taobao.org/proxy-addr/download/proxy-addr-2.0.6.tgz", + "integrity": "sha1-/cIzZQVEfT8vLGOO0nLK9hS7sr8=", + "dev": true, + "requires": { + "forwarded": "~0.1.2", + "ipaddr.js": "1.9.1" + } + }, + "prr": { + "version": "1.0.1", + "resolved": "https://registry.npm.taobao.org/prr/download/prr-1.0.1.tgz", + "integrity": "sha1-0/wRS6BplaRexok/SEzrHXj19HY=", + "dev": true + }, + "pseudomap": { + "version": "1.0.2", + "resolved": "https://registry.npm.taobao.org/pseudomap/download/pseudomap-1.0.2.tgz", + "integrity": "sha1-8FKijacOYYkX7wqKw0wa5aaChrM=", + "dev": true + }, + "psl": { + "version": "1.7.0", + "resolved": "https://registry.npm.taobao.org/psl/download/psl-1.7.0.tgz?cache=0&sync_timestamp=1577538558975&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fpsl%2Fdownload%2Fpsl-1.7.0.tgz", + "integrity": "sha1-8cTEeo75cWfepda79IFtc26ISjw=", + "dev": true + }, + "public-encrypt": { + "version": "4.0.3", + "resolved": "https://registry.npm.taobao.org/public-encrypt/download/public-encrypt-4.0.3.tgz", + "integrity": "sha1-T8ydd6B+SLp1J+fL4N4z0HATMeA=", + "dev": true, + "requires": { + "bn.js": "^4.1.0", + "browserify-rsa": "^4.0.0", + "create-hash": "^1.1.0", + "parse-asn1": "^5.0.0", + "randombytes": "^2.0.1", + "safe-buffer": "^5.1.2" + } + }, + "pump": { + "version": "3.0.0", + "resolved": "https://registry.npm.taobao.org/pump/download/pump-3.0.0.tgz", + "integrity": "sha1-tKIRaBW94vTh6mAjVOjHVWUQemQ=", + "dev": true, + "requires": { + "end-of-stream": "^1.1.0", + "once": "^1.3.1" + } + }, + "pumpify": { + "version": "1.5.1", + "resolved": "https://registry.npm.taobao.org/pumpify/download/pumpify-1.5.1.tgz", + "integrity": "sha1-NlE74karJ1cLGjdKXOJ4v9dDcM4=", + "dev": true, + "requires": { + "duplexify": "^3.6.0", + "inherits": "^2.0.3", + "pump": "^2.0.0" + }, + "dependencies": { + "pump": { + "version": "2.0.1", + "resolved": "https://registry.npm.taobao.org/pump/download/pump-2.0.1.tgz", + "integrity": "sha1-Ejma3W5M91Jtlzy8i1zi4pCLOQk=", + "dev": true, + "requires": { + "end-of-stream": "^1.1.0", + "once": "^1.3.1" + } + } + } + }, + "punycode": { + "version": "2.1.1", + "resolved": "https://registry.npm.taobao.org/punycode/download/punycode-2.1.1.tgz", + "integrity": "sha1-tYsBCsQMIsVldhbI0sLALHv0eew=", + "dev": true + }, + "q": { + "version": "1.5.1", + "resolved": "https://registry.npm.taobao.org/q/download/q-1.5.1.tgz", + "integrity": "sha1-fjL3W0E4EpHQRhHxvxQQmsAGUdc=", + "dev": true + }, + "qrcodejs2": { + "version": "0.0.2", + "resolved": "https://registry.npm.taobao.org/qrcodejs2/download/qrcodejs2-0.0.2.tgz", + "integrity": "sha1-Rlr+Xjnxn6zsuTLBH3oYYQkUauE=" + }, + "qs": { + "version": "6.5.2", + "resolved": "https://registry.npm.taobao.org/qs/download/qs-6.5.2.tgz?cache=0&sync_timestamp=1585063550190&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fqs%2Fdownload%2Fqs-6.5.2.tgz", + "integrity": "sha1-yzroBuh0BERYTvFUzo7pjUA/PjY=", + "dev": true + }, + "query-string": { + "version": "4.3.4", + "resolved": "https://registry.npm.taobao.org/query-string/download/query-string-4.3.4.tgz?cache=0&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fquery-string%2Fdownload%2Fquery-string-4.3.4.tgz", + "integrity": "sha1-u7aTucqRXCMlFbIosaArYJBD2+s=", + "dev": true, + "requires": { + "object-assign": "^4.1.0", + "strict-uri-encode": "^1.0.0" + } + }, + "querystring": { + "version": "0.2.0", + "resolved": "https://registry.npm.taobao.org/querystring/download/querystring-0.2.0.tgz", + "integrity": "sha1-sgmEkgO7Jd+CDadW50cAWHhSFiA=", + "dev": true + }, + "querystring-es3": { + "version": "0.2.1", + "resolved": "https://registry.npm.taobao.org/querystring-es3/download/querystring-es3-0.2.1.tgz", + "integrity": "sha1-nsYfeQSYdXB9aUFFlv2Qek1xHnM=", + "dev": true + }, + "querystringify": { + "version": "2.1.1", + "resolved": "https://registry.npm.taobao.org/querystringify/download/querystringify-2.1.1.tgz", + "integrity": "sha1-YOWl/WSn+L+k0qsu1v30yFutFU4=", + "dev": true + }, + "randombytes": { + "version": "2.1.0", + "resolved": "https://registry.npm.taobao.org/randombytes/download/randombytes-2.1.0.tgz", + "integrity": "sha1-32+ENy8CcNxlzfYpE0mrekc9Tyo=", + "dev": true, + "requires": { + "safe-buffer": "^5.1.0" + } + }, + "randomfill": { + "version": "1.0.4", + "resolved": "https://registry.npm.taobao.org/randomfill/download/randomfill-1.0.4.tgz", + "integrity": "sha1-ySGW/IarQr6YPxvzF3giSTHWFFg=", + "dev": true, + "requires": { + "randombytes": "^2.0.5", + "safe-buffer": "^5.1.0" + } + }, + "range-parser": { + "version": "1.2.1", + "resolved": "https://registry.npm.taobao.org/range-parser/download/range-parser-1.2.1.tgz", + "integrity": "sha1-PPNwI9GZ4cJNGlW4SADC8+ZGgDE=", + "dev": true + }, + "raw-body": { + "version": "2.4.0", + "resolved": "https://registry.npm.taobao.org/raw-body/download/raw-body-2.4.0.tgz", + "integrity": "sha1-oc5vucm8NWylLoklarWQWeE9AzI=", + "dev": true, + "requires": { + "bytes": "3.1.0", + "http-errors": "1.7.2", + "iconv-lite": "0.4.24", + "unpipe": "1.0.0" + } + }, + "raw-loader": { + "version": "0.5.1", + "resolved": "https://registry.npm.taobao.org/raw-loader/download/raw-loader-0.5.1.tgz", + "integrity": "sha1-DD0L6u2KAclm2Xh793goElKpeao=" + }, + "read-pkg": { + "version": "5.2.0", + "resolved": "https://registry.npm.taobao.org/read-pkg/download/read-pkg-5.2.0.tgz", + "integrity": "sha1-e/KVQ4yloz5WzTDgU7NO5yUMk8w=", + "dev": true, + "requires": { + "@types/normalize-package-data": "^2.4.0", + "normalize-package-data": "^2.5.0", + "parse-json": "^5.0.0", + "type-fest": "^0.6.0" + } + }, + "readable-stream": { + "version": "2.3.7", + "resolved": "https://registry.npm.taobao.org/readable-stream/download/readable-stream-2.3.7.tgz", + "integrity": "sha1-Hsoc9xGu+BTAT2IlKjamL2yyO1c=", + "dev": true, + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "readdirp": { + "version": "2.2.1", + "resolved": "https://registry.npm.taobao.org/readdirp/download/readdirp-2.2.1.tgz?cache=0&sync_timestamp=1584985910691&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Freaddirp%2Fdownload%2Freaddirp-2.2.1.tgz", + "integrity": "sha1-DodiKjMlqjPokihcr4tOhGUppSU=", + "dev": true, + "requires": { + "graceful-fs": "^4.1.11", + "micromatch": "^3.1.10", + "readable-stream": "^2.0.2" + } + }, + "regenerate": { + "version": "1.4.0", + "resolved": "https://registry.npm.taobao.org/regenerate/download/regenerate-1.4.0.tgz", + "integrity": "sha1-SoVuxLVuQHfFV1icroXnpMiGmhE=", + "dev": true + }, + "regenerate-unicode-properties": { + "version": "8.2.0", + "resolved": "https://registry.npm.taobao.org/regenerate-unicode-properties/download/regenerate-unicode-properties-8.2.0.tgz?cache=0&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fregenerate-unicode-properties%2Fdownload%2Fregenerate-unicode-properties-8.2.0.tgz", + "integrity": "sha1-5d5xEdZV57pgwFfb6f83yH5lzew=", + "dev": true, + "requires": { + "regenerate": "^1.4.0" + } + }, + "regenerator-runtime": { + "version": "0.13.5", + "resolved": "https://registry.npm.taobao.org/regenerator-runtime/download/regenerator-runtime-0.13.5.tgz?cache=0&sync_timestamp=1584052597708&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fregenerator-runtime%2Fdownload%2Fregenerator-runtime-0.13.5.tgz", + "integrity": "sha1-2Hih0JS0MG0QuQlkhLM+vVXiZpc=", + "dev": true + }, + "regenerator-transform": { + "version": "0.14.4", + "resolved": "https://registry.npm.taobao.org/regenerator-transform/download/regenerator-transform-0.14.4.tgz?cache=0&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fregenerator-transform%2Fdownload%2Fregenerator-transform-0.14.4.tgz", + "integrity": "sha1-UmaFeJZRjRYWp4oEeTN6MOqXTMc=", + "dev": true, + "requires": { + "@babel/runtime": "^7.8.4", + "private": "^0.1.8" + } + }, + "regex-not": { + "version": "1.0.2", + "resolved": "https://registry.npm.taobao.org/regex-not/download/regex-not-1.0.2.tgz", + "integrity": "sha1-H07OJ+ALC2XgJHpoEOaoXYOldSw=", + "dev": true, + "requires": { + "extend-shallow": "^3.0.2", + "safe-regex": "^1.1.0" + } + }, + "regexp.prototype.flags": { + "version": "1.3.0", + "resolved": "https://registry.npm.taobao.org/regexp.prototype.flags/download/regexp.prototype.flags-1.3.0.tgz", + "integrity": "sha1-erqJs8E6ZFCdq888qNn7ub31y3U=", + "dev": true, + "requires": { + "define-properties": "^1.1.3", + "es-abstract": "^1.17.0-next.1" + } + }, + "regexpp": { + "version": "2.0.1", + "resolved": "https://registry.npm.taobao.org/regexpp/download/regexpp-2.0.1.tgz?cache=0&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fregexpp%2Fdownload%2Fregexpp-2.0.1.tgz", + "integrity": "sha1-jRnTHPYySCtYkEn4KB+T28uk0H8=", + "dev": true + }, + "regexpu-core": { + "version": "4.7.0", + "resolved": "https://registry.npm.taobao.org/regexpu-core/download/regexpu-core-4.7.0.tgz", + "integrity": "sha1-/L9FjFBDGwu3tF1pZ7gZLZHz2Tg=", + "dev": true, + "requires": { + "regenerate": "^1.4.0", + "regenerate-unicode-properties": "^8.2.0", + "regjsgen": "^0.5.1", + "regjsparser": "^0.6.4", + "unicode-match-property-ecmascript": "^1.0.4", + "unicode-match-property-value-ecmascript": "^1.2.0" + } + }, + "regjsgen": { + "version": "0.5.1", + "resolved": "https://registry.npm.taobao.org/regjsgen/download/regjsgen-0.5.1.tgz", + "integrity": "sha1-SPC/Gl6iBRlpKcDZeYtC0e2YRDw=", + "dev": true + }, + "regjsparser": { + "version": "0.6.4", + "resolved": "https://registry.npm.taobao.org/regjsparser/download/regjsparser-0.6.4.tgz", + "integrity": "sha1-p2n4aEMIQBpm6bUp0kNv9NBmYnI=", + "dev": true, + "requires": { + "jsesc": "~0.5.0" + }, + "dependencies": { + "jsesc": { + "version": "0.5.0", + "resolved": "https://registry.npm.taobao.org/jsesc/download/jsesc-0.5.0.tgz", + "integrity": "sha1-597mbjXW/Bb3EP6R1c9p9w8IkR0=", + "dev": true + } + } + }, + "relateurl": { + "version": "0.2.7", + "resolved": "https://registry.npm.taobao.org/relateurl/download/relateurl-0.2.7.tgz", + "integrity": "sha1-VNvzd+UUQKypCkzSdGANP/LYiKk=", + "dev": true + }, + "remove-trailing-separator": { + "version": "1.1.0", + "resolved": "https://registry.npm.taobao.org/remove-trailing-separator/download/remove-trailing-separator-1.1.0.tgz", + "integrity": "sha1-wkvOKig62tW8P1jg1IJJuSN52O8=", + "dev": true + }, + "renderkid": { + "version": "2.0.3", + "resolved": "https://registry.npm.taobao.org/renderkid/download/renderkid-2.0.3.tgz", + "integrity": "sha1-OAF5wv9a4TZcUivy/Pz/AcW3QUk=", + "dev": true, + "requires": { + "css-select": "^1.1.0", + "dom-converter": "^0.2", + "htmlparser2": "^3.3.0", + "strip-ansi": "^3.0.0", + "utila": "^0.4.0" + }, + "dependencies": { + "ansi-regex": { + "version": "2.1.1", + "resolved": "https://registry.npm.taobao.org/ansi-regex/download/ansi-regex-2.1.1.tgz", + "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", + "dev": true + }, + "css-select": { + "version": "1.2.0", + "resolved": "https://registry.npm.taobao.org/css-select/download/css-select-1.2.0.tgz?cache=0&sync_timestamp=1573342118933&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fcss-select%2Fdownload%2Fcss-select-1.2.0.tgz", + "integrity": "sha1-KzoRBTnFNV8c2NMUYj6HCxIeyFg=", + "dev": true, + "requires": { + "boolbase": "~1.0.0", + "css-what": "2.1", + "domutils": "1.5.1", + "nth-check": "~1.0.1" + } + }, + "css-what": { + "version": "2.1.3", + "resolved": "https://registry.npm.taobao.org/css-what/download/css-what-2.1.3.tgz", + "integrity": "sha1-ptdgRXM2X+dGhsPzEcVlE9iChfI=", + "dev": true + }, + "domutils": { + "version": "1.5.1", + "resolved": "https://registry.npm.taobao.org/domutils/download/domutils-1.5.1.tgz", + "integrity": "sha1-3NhIiib1Y9YQeeSMn3t+Mjc2gs8=", + "dev": true, + "requires": { + "dom-serializer": "0", + "domelementtype": "1" + } + }, + "strip-ansi": { + "version": "3.0.1", + "resolved": "https://registry.npm.taobao.org/strip-ansi/download/strip-ansi-3.0.1.tgz", + "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", + "dev": true, + "requires": { + "ansi-regex": "^2.0.0" + } + } + } + }, + "repeat-element": { + "version": "1.1.3", + "resolved": "https://registry.npm.taobao.org/repeat-element/download/repeat-element-1.1.3.tgz", + "integrity": "sha1-eC4NglwMWjuzlzH4Tv7mt0Lmsc4=", + "dev": true + }, + "repeat-string": { + "version": "1.6.1", + "resolved": "https://registry.npm.taobao.org/repeat-string/download/repeat-string-1.6.1.tgz", + "integrity": "sha1-jcrkcOHIirwtYA//Sndihtp15jc=", + "dev": true + }, + "request": { + "version": "2.88.2", + "resolved": "https://registry.npm.taobao.org/request/download/request-2.88.2.tgz?cache=0&sync_timestamp=1581439006948&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Frequest%2Fdownload%2Frequest-2.88.2.tgz", + "integrity": "sha1-1zyRhzHLWofaBH4gcjQUb2ZNErM=", + "dev": true, + "requires": { + "aws-sign2": "~0.7.0", + "aws4": "^1.8.0", + "caseless": "~0.12.0", + "combined-stream": "~1.0.6", + "extend": "~3.0.2", + "forever-agent": "~0.6.1", + "form-data": "~2.3.2", + "har-validator": "~5.1.3", + "http-signature": "~1.2.0", + "is-typedarray": "~1.0.0", + "isstream": "~0.1.2", + "json-stringify-safe": "~5.0.1", + "mime-types": "~2.1.19", + "oauth-sign": "~0.9.0", + "performance-now": "^2.1.0", + "qs": "~6.5.2", + "safe-buffer": "^5.1.2", + "tough-cookie": "~2.5.0", + "tunnel-agent": "^0.6.0", + "uuid": "^3.3.2" + } + }, + "request-promise-core": { + "version": "1.1.3", + "resolved": "https://registry.npm.taobao.org/request-promise-core/download/request-promise-core-1.1.3.tgz", + "integrity": "sha1-6aPAgbUTgN/qZ3M2Bh/qh5qCnuk=", + "dev": true, + "requires": { + "lodash": "^4.17.15" + } + }, + "request-promise-native": { + "version": "1.0.8", + "resolved": "https://registry.npm.taobao.org/request-promise-native/download/request-promise-native-1.0.8.tgz?cache=0&sync_timestamp=1572829683581&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Frequest-promise-native%2Fdownload%2Frequest-promise-native-1.0.8.tgz", + "integrity": "sha1-pFW5YLgm5E4r+Jma9k3/K/5YyzY=", + "dev": true, + "requires": { + "request-promise-core": "1.1.3", + "stealthy-require": "^1.1.1", + "tough-cookie": "^2.3.3" + } + }, + "require-directory": { + "version": "2.1.1", + "resolved": "https://registry.npm.taobao.org/require-directory/download/require-directory-2.1.1.tgz", + "integrity": "sha1-jGStX9MNqxyXbiNE/+f3kqam30I=", + "dev": true + }, + "require-main-filename": { + "version": "2.0.0", + "resolved": "https://registry.npm.taobao.org/require-main-filename/download/require-main-filename-2.0.0.tgz", + "integrity": "sha1-0LMp7MfMD2Fkn2IhW+aa9UqomJs=", + "dev": true + }, + "requires-port": { + "version": "1.0.0", + "resolved": "https://registry.npm.taobao.org/requires-port/download/requires-port-1.0.0.tgz", + "integrity": "sha1-kl0mAdOaxIXgkc8NpcbmlNw9yv8=", + "dev": true + }, + "resize-observer-polyfill": { + "version": "1.5.1", + "resolved": "https://registry.npm.taobao.org/resize-observer-polyfill/download/resize-observer-polyfill-1.5.1.tgz", + "integrity": "sha1-DpAg3T0hAkRY1OvSfiPkAmmBBGQ=" + }, + "resolve": { + "version": "1.15.1", + "resolved": "https://registry.npm.taobao.org/resolve/download/resolve-1.15.1.tgz", + "integrity": "sha1-J73N7/6vLWJEuVuw+fS0ZTRR8+g=", + "dev": true, + "requires": { + "path-parse": "^1.0.6" + } + }, + "resolve-cwd": { + "version": "2.0.0", + "resolved": "https://registry.npm.taobao.org/resolve-cwd/download/resolve-cwd-2.0.0.tgz", + "integrity": "sha1-AKn3OHVW4nA46uIyyqNypqWbZlo=", + "dev": true, + "requires": { + "resolve-from": "^3.0.0" + } + }, + "resolve-from": { + "version": "3.0.0", + "resolved": "https://registry.npm.taobao.org/resolve-from/download/resolve-from-3.0.0.tgz", + "integrity": "sha1-six699nWiBvItuZTM17rywoYh0g=", + "dev": true + }, + "resolve-url": { + "version": "0.2.1", + "resolved": "https://registry.npm.taobao.org/resolve-url/download/resolve-url-0.2.1.tgz", + "integrity": "sha1-LGN/53yJOv0qZj/iGqkIAGjiBSo=", + "dev": true + }, + "restore-cursor": { + "version": "2.0.0", + "resolved": "https://registry.npm.taobao.org/restore-cursor/download/restore-cursor-2.0.0.tgz", + "integrity": "sha1-n37ih/gv0ybU/RYpI9YhKe7g368=", + "dev": true, + "requires": { + "onetime": "^2.0.0", + "signal-exit": "^3.0.2" + } + }, + "ret": { + "version": "0.1.15", + "resolved": "https://registry.npm.taobao.org/ret/download/ret-0.1.15.tgz", + "integrity": "sha1-uKSCXVvbH8P29Twrwz+BOIaBx7w=", + "dev": true + }, + "retry": { + "version": "0.12.0", + "resolved": "https://registry.npm.taobao.org/retry/download/retry-0.12.0.tgz", + "integrity": "sha1-G0KmJmoh8HQh0bC1S33BZ7AcATs=", + "dev": true + }, + "rgb-regex": { + "version": "1.0.1", + "resolved": "https://registry.npm.taobao.org/rgb-regex/download/rgb-regex-1.0.1.tgz", + "integrity": "sha1-wODWiC3w4jviVKR16O3UGRX+rrE=", + "dev": true + }, + "rgba-regex": { + "version": "1.0.0", + "resolved": "https://registry.npm.taobao.org/rgba-regex/download/rgba-regex-1.0.0.tgz", + "integrity": "sha1-QzdOLiyglosO8VI0YLfXMP8i7rM=", + "dev": true + }, + "rimraf": { + "version": "2.7.1", + "resolved": "https://registry.npm.taobao.org/rimraf/download/rimraf-2.7.1.tgz", + "integrity": "sha1-NXl/E6f9rcVmFCwp1PB8ytSD4+w=", + "dev": true, + "requires": { + "glob": "^7.1.3" + } + }, + "ripemd160": { + "version": "2.0.2", + "resolved": "https://registry.npm.taobao.org/ripemd160/download/ripemd160-2.0.2.tgz", + "integrity": "sha1-ocGm9iR1FXe6XQeRTLyShQWFiQw=", + "dev": true, + "requires": { + "hash-base": "^3.0.0", + "inherits": "^2.0.1" + } + }, + "run-async": { + "version": "2.4.0", + "resolved": "https://registry.npm.taobao.org/run-async/download/run-async-2.4.0.tgz?cache=0&sync_timestamp=1582711649944&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Frun-async%2Fdownload%2Frun-async-2.4.0.tgz", + "integrity": "sha1-5ZBUpbhods+uB/Qx0Yy63cWU8eg=", + "dev": true, + "requires": { + "is-promise": "^2.1.0" + } + }, + "run-queue": { + "version": "1.0.3", + "resolved": "https://registry.npm.taobao.org/run-queue/download/run-queue-1.0.3.tgz", + "integrity": "sha1-6Eg5bwV9Ij8kOGkkYY4laUFh7Ec=", + "dev": true, + "requires": { + "aproba": "^1.1.1" + } + }, + "rxjs": { + "version": "6.5.4", + "resolved": "https://registry.npm.taobao.org/rxjs/download/rxjs-6.5.4.tgz", + "integrity": "sha1-4Hd/4NGEzseHLfFH8wNXLUFOIRw=", + "dev": true, + "requires": { + "tslib": "^1.9.0" + } + }, + "safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npm.taobao.org/safe-buffer/download/safe-buffer-5.1.2.tgz", + "integrity": "sha1-mR7GnSluAxN0fVm9/St0XDX4go0=", + "dev": true + }, + "safe-regex": { + "version": "1.1.0", + "resolved": "https://registry.npm.taobao.org/safe-regex/download/safe-regex-1.1.0.tgz?cache=0&sync_timestamp=1571687713993&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fsafe-regex%2Fdownload%2Fsafe-regex-1.1.0.tgz", + "integrity": "sha1-QKNmnzsHfR6UPURinhV91IAjvy4=", + "dev": true, + "requires": { + "ret": "~0.1.10" + } + }, + "safer-buffer": { + "version": "2.1.2", + "resolved": "https://registry.npm.taobao.org/safer-buffer/download/safer-buffer-2.1.2.tgz", + "integrity": "sha1-RPoWGwGHuVSd2Eu5GAL5vYOFzWo=", + "dev": true + }, + "sax": { + "version": "1.2.4", + "resolved": "https://registry.npm.taobao.org/sax/download/sax-1.2.4.tgz", + "integrity": "sha1-KBYjTiN4vdxOU1T6tcqold9xANk=", + "dev": true + }, + "schema-utils": { + "version": "2.6.5", + "resolved": "https://registry.npm.taobao.org/schema-utils/download/schema-utils-2.6.5.tgz", + "integrity": "sha1-x1jwp+YkJjBz05binNQKoQEVLYo=", + "dev": true, + "requires": { + "ajv": "^6.12.0", + "ajv-keywords": "^3.4.1" + } + }, + "script-loader": { + "version": "0.7.2", + "resolved": "https://registry.npm.taobao.org/script-loader/download/script-loader-0.7.2.tgz", + "integrity": "sha1-IBbbb4byX1z1baOJFdgzeLsWa6c=", + "requires": { + "raw-loader": "~0.5.1" + } + }, + "select-hose": { + "version": "2.0.0", + "resolved": "https://registry.npm.taobao.org/select-hose/download/select-hose-2.0.0.tgz", + "integrity": "sha1-Yl2GWPhlr0Psliv8N2o3NZpJlMo=", + "dev": true + }, + "selfsigned": { + "version": "1.10.7", + "resolved": "https://registry.npm.taobao.org/selfsigned/download/selfsigned-1.10.7.tgz", + "integrity": "sha1-2lgZ/QSdVXTyjoipvMbbxubzkGs=", + "dev": true, + "requires": { + "node-forge": "0.9.0" + } + }, + "semver": { + "version": "5.7.1", + "resolved": "https://registry.npm.taobao.org/semver/download/semver-5.7.1.tgz", + "integrity": "sha1-qVT5Ma66UI0we78Gnv8MAclhFvc=", + "dev": true + }, + "send": { + "version": "0.17.1", + "resolved": "https://registry.npm.taobao.org/send/download/send-0.17.1.tgz", + "integrity": "sha1-wdiwWfeQD3Rm3Uk4vcROEd2zdsg=", + "dev": true, + "requires": { + "debug": "2.6.9", + "depd": "~1.1.2", + "destroy": "~1.0.4", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "etag": "~1.8.1", + "fresh": "0.5.2", + "http-errors": "~1.7.2", + "mime": "1.6.0", + "ms": "2.1.1", + "on-finished": "~2.3.0", + "range-parser": "~1.2.1", + "statuses": "~1.5.0" + }, + "dependencies": { + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npm.taobao.org/debug/download/debug-2.6.9.tgz", + "integrity": "sha1-XRKFFd8TT/Mn6QpMk/Tgd6U2NB8=", + "dev": true, + "requires": { + "ms": "2.0.0" + }, + "dependencies": { + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npm.taobao.org/ms/download/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "dev": true + } + } + }, + "mime": { + "version": "1.6.0", + "resolved": "https://registry.npm.taobao.org/mime/download/mime-1.6.0.tgz", + "integrity": "sha1-Ms2eXGRVO9WNGaVor0Uqz/BJgbE=", + "dev": true + }, + "ms": { + "version": "2.1.1", + "resolved": "https://registry.npm.taobao.org/ms/download/ms-2.1.1.tgz", + "integrity": "sha1-MKWGTrPrsKZvLr5tcnrwagnYbgo=", + "dev": true + } + } + }, + "serialize-javascript": { + "version": "2.1.2", + "resolved": "https://registry.npm.taobao.org/serialize-javascript/download/serialize-javascript-2.1.2.tgz?cache=0&sync_timestamp=1581860503528&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fserialize-javascript%2Fdownload%2Fserialize-javascript-2.1.2.tgz", + "integrity": "sha1-7OxTsOAxe9yV73arcHS3OEeF+mE=", + "dev": true + }, + "serve-index": { + "version": "1.9.1", + "resolved": "https://registry.npm.taobao.org/serve-index/download/serve-index-1.9.1.tgz", + "integrity": "sha1-03aNabHn2C5c4FD/9bRTvqEqkjk=", + "dev": true, + "requires": { + "accepts": "~1.3.4", + "batch": "0.6.1", + "debug": "2.6.9", + "escape-html": "~1.0.3", + "http-errors": "~1.6.2", + "mime-types": "~2.1.17", + "parseurl": "~1.3.2" + }, + "dependencies": { + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npm.taobao.org/debug/download/debug-2.6.9.tgz", + "integrity": "sha1-XRKFFd8TT/Mn6QpMk/Tgd6U2NB8=", + "dev": true, + "requires": { + "ms": "2.0.0" + } + }, + "http-errors": { + "version": "1.6.3", + "resolved": "https://registry.npm.taobao.org/http-errors/download/http-errors-1.6.3.tgz", + "integrity": "sha1-i1VoC7S+KDoLW/TqLjhYC+HZMg0=", + "dev": true, + "requires": { + "depd": "~1.1.2", + "inherits": "2.0.3", + "setprototypeof": "1.1.0", + "statuses": ">= 1.4.0 < 2" + } + }, + "inherits": { + "version": "2.0.3", + "resolved": "https://registry.npm.taobao.org/inherits/download/inherits-2.0.3.tgz", + "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=", + "dev": true + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npm.taobao.org/ms/download/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "dev": true + }, + "setprototypeof": { + "version": "1.1.0", + "resolved": "https://registry.npm.taobao.org/setprototypeof/download/setprototypeof-1.1.0.tgz", + "integrity": "sha1-0L2FU2iHtv58DYGMuWLZ2RxU5lY=", + "dev": true + } + } + }, + "serve-static": { + "version": "1.14.1", + "resolved": "https://registry.npm.taobao.org/serve-static/download/serve-static-1.14.1.tgz", + "integrity": "sha1-Zm5jbcTwEPfvKZcKiKZ0MgiYsvk=", + "dev": true, + "requires": { + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "parseurl": "~1.3.3", + "send": "0.17.1" + } + }, + "set-blocking": { + "version": "2.0.0", + "resolved": "https://registry.npm.taobao.org/set-blocking/download/set-blocking-2.0.0.tgz", + "integrity": "sha1-BF+XgtARrppoA93TgrJDkrPYkPc=", + "dev": true + }, + "set-value": { + "version": "2.0.1", + "resolved": "https://registry.npm.taobao.org/set-value/download/set-value-2.0.1.tgz", + "integrity": "sha1-oY1AUw5vB95CKMfe/kInr4ytAFs=", + "dev": true, + "requires": { + "extend-shallow": "^2.0.1", + "is-extendable": "^0.1.1", + "is-plain-object": "^2.0.3", + "split-string": "^3.0.1" + }, + "dependencies": { + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npm.taobao.org/extend-shallow/download/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "^0.1.0" + } + } + } + }, + "setimmediate": { + "version": "1.0.5", + "resolved": "https://registry.npm.taobao.org/setimmediate/download/setimmediate-1.0.5.tgz", + "integrity": "sha1-KQy7Iy4waULX1+qbg3Mqt4VvgoU=", + "dev": true + }, + "setprototypeof": { + "version": "1.1.1", + "resolved": "https://registry.npm.taobao.org/setprototypeof/download/setprototypeof-1.1.1.tgz", + "integrity": "sha1-fpWsskqpL1iF4KvvW6ExMw1K5oM=", + "dev": true + }, + "sha.js": { + "version": "2.4.11", + "resolved": "https://registry.npm.taobao.org/sha.js/download/sha.js-2.4.11.tgz", + "integrity": "sha1-N6XPC4HsvGlD3hCbopYNGyZYSuc=", + "dev": true, + "requires": { + "inherits": "^2.0.1", + "safe-buffer": "^5.0.1" + } + }, + "shebang-command": { + "version": "1.2.0", + "resolved": "https://registry.npm.taobao.org/shebang-command/download/shebang-command-1.2.0.tgz", + "integrity": "sha1-RKrGW2lbAzmJaMOfNj/uXer98eo=", + "dev": true, + "requires": { + "shebang-regex": "^1.0.0" + } + }, + "shebang-regex": { + "version": "1.0.0", + "resolved": "https://registry.npm.taobao.org/shebang-regex/download/shebang-regex-1.0.0.tgz", + "integrity": "sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM=", + "dev": true + }, + "shell-quote": { + "version": "1.7.2", + "resolved": "https://registry.npm.taobao.org/shell-quote/download/shell-quote-1.7.2.tgz", + "integrity": "sha1-Z6fQLHbJ2iT5nSCAj8re0ODgS+I=", + "dev": true + }, + "signal-exit": { + "version": "3.0.2", + "resolved": "https://registry.npm.taobao.org/signal-exit/download/signal-exit-3.0.2.tgz", + "integrity": "sha1-tf3AjxKH6hF4Yo5BXiUTK3NkbG0=", + "dev": true + }, + "simple-swizzle": { + "version": "0.2.2", + "resolved": "https://registry.npm.taobao.org/simple-swizzle/download/simple-swizzle-0.2.2.tgz", + "integrity": "sha1-pNprY1/8zMoz9w0Xy5JZLeleVXo=", + "dev": true, + "requires": { + "is-arrayish": "^0.3.1" + }, + "dependencies": { + "is-arrayish": { + "version": "0.3.2", + "resolved": "https://registry.npm.taobao.org/is-arrayish/download/is-arrayish-0.3.2.tgz", + "integrity": "sha1-RXSirlb3qyBolvtDHq7tBm/fjwM=", + "dev": true + } + } + }, + "slash": { + "version": "2.0.0", + "resolved": "https://registry.npm.taobao.org/slash/download/slash-2.0.0.tgz", + "integrity": "sha1-3lUoUaF1nfOo8gZTVEL17E3eq0Q=", + "dev": true + }, + "slice-ansi": { + "version": "2.1.0", + "resolved": "https://registry.npm.taobao.org/slice-ansi/download/slice-ansi-2.1.0.tgz", + "integrity": "sha1-ys12k0YaY3pXiNkqfdT7oGjoFjY=", + "dev": true, + "requires": { + "ansi-styles": "^3.2.0", + "astral-regex": "^1.0.0", + "is-fullwidth-code-point": "^2.0.0" + } + }, + "snapdragon": { + "version": "0.8.2", + "resolved": "https://registry.npm.taobao.org/snapdragon/download/snapdragon-0.8.2.tgz", + "integrity": "sha1-ZJIufFZbDhQgS6GqfWlkJ40lGC0=", + "dev": true, + "requires": { + "base": "^0.11.1", + "debug": "^2.2.0", + "define-property": "^0.2.5", + "extend-shallow": "^2.0.1", + "map-cache": "^0.2.2", + "source-map": "^0.5.6", + "source-map-resolve": "^0.5.0", + "use": "^3.1.0" + }, + "dependencies": { + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npm.taobao.org/debug/download/debug-2.6.9.tgz", + "integrity": "sha1-XRKFFd8TT/Mn6QpMk/Tgd6U2NB8=", + "dev": true, + "requires": { + "ms": "2.0.0" + } + }, + "define-property": { + "version": "0.2.5", + "resolved": "https://registry.npm.taobao.org/define-property/download/define-property-0.2.5.tgz", + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "dev": true, + "requires": { + "is-descriptor": "^0.1.0" + } + }, + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npm.taobao.org/extend-shallow/download/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "^0.1.0" + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npm.taobao.org/ms/download/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "dev": true + } + } + }, + "snapdragon-node": { + "version": "2.1.1", + "resolved": "https://registry.npm.taobao.org/snapdragon-node/download/snapdragon-node-2.1.1.tgz", + "integrity": "sha1-bBdfhv8UvbByRWPo88GwIaKGhTs=", + "dev": true, + "requires": { + "define-property": "^1.0.0", + "isobject": "^3.0.0", + "snapdragon-util": "^3.0.1" + }, + "dependencies": { + "define-property": { + "version": "1.0.0", + "resolved": "https://registry.npm.taobao.org/define-property/download/define-property-1.0.0.tgz", + "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", + "dev": true, + "requires": { + "is-descriptor": "^1.0.0" + } + }, + "is-accessor-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npm.taobao.org/is-accessor-descriptor/download/is-accessor-descriptor-1.0.0.tgz", + "integrity": "sha1-FpwvbT3x+ZJhgHI2XJsOofaHhlY=", + "dev": true, + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-data-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npm.taobao.org/is-data-descriptor/download/is-data-descriptor-1.0.0.tgz", + "integrity": "sha1-2Eh2Mh0Oet0DmQQGq7u9NrqSaMc=", + "dev": true, + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-descriptor": { + "version": "1.0.2", + "resolved": "https://registry.npm.taobao.org/is-descriptor/download/is-descriptor-1.0.2.tgz", + "integrity": "sha1-OxWXRqZmBLBPjIFSS6NlxfFNhuw=", + "dev": true, + "requires": { + "is-accessor-descriptor": "^1.0.0", + "is-data-descriptor": "^1.0.0", + "kind-of": "^6.0.2" + } + } + } + }, + "snapdragon-util": { + "version": "3.0.1", + "resolved": "https://registry.npm.taobao.org/snapdragon-util/download/snapdragon-util-3.0.1.tgz", + "integrity": "sha1-+VZHlIbyrNeXAGk/b3uAXkWrVuI=", + "dev": true, + "requires": { + "kind-of": "^3.2.0" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npm.taobao.org/kind-of/download/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "sockjs": { + "version": "0.3.19", + "resolved": "https://registry.npm.taobao.org/sockjs/download/sockjs-0.3.19.tgz", + "integrity": "sha1-2Xa76ACve9IK4IWY1YI5NQiZPA0=", + "dev": true, + "requires": { + "faye-websocket": "^0.10.0", + "uuid": "^3.0.1" + } + }, + "sockjs-client": { + "version": "1.4.0", + "resolved": "https://registry.npm.taobao.org/sockjs-client/download/sockjs-client-1.4.0.tgz?cache=0&sync_timestamp=1566505930428&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fsockjs-client%2Fdownload%2Fsockjs-client-1.4.0.tgz", + "integrity": "sha1-yfJWjhnI/YFztJl+o0IOC7MGx9U=", + "dev": true, + "requires": { + "debug": "^3.2.5", + "eventsource": "^1.0.7", + "faye-websocket": "~0.11.1", + "inherits": "^2.0.3", + "json3": "^3.3.2", + "url-parse": "^1.4.3" + }, + "dependencies": { + "debug": { + "version": "3.2.6", + "resolved": "https://registry.npm.taobao.org/debug/download/debug-3.2.6.tgz", + "integrity": "sha1-6D0X3hbYp++3cX7b5fsQE17uYps=", + "dev": true, + "requires": { + "ms": "^2.1.1" + } + }, + "faye-websocket": { + "version": "0.11.3", + "resolved": "https://registry.npm.taobao.org/faye-websocket/download/faye-websocket-0.11.3.tgz", + "integrity": "sha1-XA6aiWjokSwoZjn96XeosgnyUI4=", + "dev": true, + "requires": { + "websocket-driver": ">=0.5.1" + } + } + } + }, + "sort-keys": { + "version": "1.1.2", + "resolved": "https://registry.npm.taobao.org/sort-keys/download/sort-keys-1.1.2.tgz", + "integrity": "sha1-RBttTTRnmPG05J6JIK37oOVD+a0=", + "dev": true, + "requires": { + "is-plain-obj": "^1.0.0" + } + }, + "source-list-map": { + "version": "2.0.1", + "resolved": "https://registry.npm.taobao.org/source-list-map/download/source-list-map-2.0.1.tgz", + "integrity": "sha1-OZO9hzv8SEecyp6jpUeDXHwVSzQ=", + "dev": true + }, + "source-map": { + "version": "0.5.7", + "resolved": "https://registry.npm.taobao.org/source-map/download/source-map-0.5.7.tgz", + "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", + "dev": true + }, + "source-map-resolve": { + "version": "0.5.3", + "resolved": "https://registry.npm.taobao.org/source-map-resolve/download/source-map-resolve-0.5.3.tgz?cache=0&sync_timestamp=1584829552965&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fsource-map-resolve%2Fdownload%2Fsource-map-resolve-0.5.3.tgz", + "integrity": "sha1-GQhmvs51U+H48mei7oLGBrVQmho=", + "dev": true, + "requires": { + "atob": "^2.1.2", + "decode-uri-component": "^0.2.0", + "resolve-url": "^0.2.1", + "source-map-url": "^0.4.0", + "urix": "^0.1.0" + } + }, + "source-map-support": { + "version": "0.5.16", + "resolved": "https://registry.npm.taobao.org/source-map-support/download/source-map-support-0.5.16.tgz?cache=0&sync_timestamp=1572390065703&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fsource-map-support%2Fdownload%2Fsource-map-support-0.5.16.tgz", + "integrity": "sha1-CuBp5/47p1OMZMmFFeNTOerFoEI=", + "dev": true, + "requires": { + "buffer-from": "^1.0.0", + "source-map": "^0.6.0" + }, + "dependencies": { + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npm.taobao.org/source-map/download/source-map-0.6.1.tgz", + "integrity": "sha1-dHIq8y6WFOnCh6jQu95IteLxomM=", + "dev": true + } + } + }, + "source-map-url": { + "version": "0.4.0", + "resolved": "https://registry.npm.taobao.org/source-map-url/download/source-map-url-0.4.0.tgz", + "integrity": "sha1-PpNdfd1zYxuXZZlW1VEo6HtQhKM=", + "dev": true + }, + "spdx-correct": { + "version": "3.1.0", + "resolved": "https://registry.npm.taobao.org/spdx-correct/download/spdx-correct-3.1.0.tgz", + "integrity": "sha1-+4PlBERSaPFUsHTiGMh8ADzTHfQ=", + "dev": true, + "requires": { + "spdx-expression-parse": "^3.0.0", + "spdx-license-ids": "^3.0.0" + } + }, + "spdx-exceptions": { + "version": "2.2.0", + "resolved": "https://registry.npm.taobao.org/spdx-exceptions/download/spdx-exceptions-2.2.0.tgz", + "integrity": "sha1-LqRQrudPKom/uUUZwH/Nb0EyKXc=", + "dev": true + }, + "spdx-expression-parse": { + "version": "3.0.0", + "resolved": "https://registry.npm.taobao.org/spdx-expression-parse/download/spdx-expression-parse-3.0.0.tgz", + "integrity": "sha1-meEZt6XaAOBUkcn6M4t5BII7QdA=", + "dev": true, + "requires": { + "spdx-exceptions": "^2.1.0", + "spdx-license-ids": "^3.0.0" + } + }, + "spdx-license-ids": { + "version": "3.0.5", + "resolved": "https://registry.npm.taobao.org/spdx-license-ids/download/spdx-license-ids-3.0.5.tgz", + "integrity": "sha1-NpS1gEVnpFjTyARYQqY1hjL2JlQ=", + "dev": true + }, + "spdy": { + "version": "4.0.1", + "resolved": "https://registry.npm.taobao.org/spdy/download/spdy-4.0.1.tgz", + "integrity": "sha1-bxLtHF236k8k67i4m6WMh8CCV/I=", + "dev": true, + "requires": { + "debug": "^4.1.0", + "handle-thing": "^2.0.0", + "http-deceiver": "^1.2.7", + "select-hose": "^2.0.0", + "spdy-transport": "^3.0.0" + } + }, + "spdy-transport": { + "version": "3.0.0", + "resolved": "https://registry.npm.taobao.org/spdy-transport/download/spdy-transport-3.0.0.tgz", + "integrity": "sha1-ANSGOmQArXXfkzYaFghgXl3NzzE=", + "dev": true, + "requires": { + "debug": "^4.1.0", + "detect-node": "^2.0.4", + "hpack.js": "^2.1.6", + "obuf": "^1.1.2", + "readable-stream": "^3.0.6", + "wbuf": "^1.7.3" + }, + "dependencies": { + "readable-stream": { + "version": "3.6.0", + "resolved": "https://registry.npm.taobao.org/readable-stream/download/readable-stream-3.6.0.tgz", + "integrity": "sha1-M3u9o63AcGvT4CRCaihtS0sskZg=", + "dev": true, + "requires": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + } + } + } + }, + "split-string": { + "version": "3.1.0", + "resolved": "https://registry.npm.taobao.org/split-string/download/split-string-3.1.0.tgz", + "integrity": "sha1-fLCd2jqGWFcFxks5pkZgOGguj+I=", + "dev": true, + "requires": { + "extend-shallow": "^3.0.0" + } + }, + "sprintf-js": { + "version": "1.0.3", + "resolved": "https://registry.npm.taobao.org/sprintf-js/download/sprintf-js-1.0.3.tgz", + "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=", + "dev": true + }, + "ssf": { + "version": "0.11.2", + "resolved": "https://registry.npm.taobao.org/ssf/download/ssf-0.11.2.tgz", + "integrity": "sha1-C5lpiyN1SNCI/EPN8rcMGnUSwGw=", + "requires": { + "frac": "~1.1.2" + } + }, + "sshpk": { + "version": "1.16.1", + "resolved": "https://registry.npm.taobao.org/sshpk/download/sshpk-1.16.1.tgz", + "integrity": "sha1-+2YcC+8ps520B2nuOfpwCT1vaHc=", + "dev": true, + "requires": { + "asn1": "~0.2.3", + "assert-plus": "^1.0.0", + "bcrypt-pbkdf": "^1.0.0", + "dashdash": "^1.12.0", + "ecc-jsbn": "~0.1.1", + "getpass": "^0.1.1", + "jsbn": "~0.1.0", + "safer-buffer": "^2.0.2", + "tweetnacl": "~0.14.0" + } + }, + "ssri": { + "version": "6.0.1", + "resolved": "https://registry.npm.taobao.org/ssri/download/ssri-6.0.1.tgz", + "integrity": "sha1-KjxBso3UW2K2Nnbst0ABJlrp7dg=", + "dev": true, + "requires": { + "figgy-pudding": "^3.5.1" + } + }, + "stable": { + "version": "0.1.8", + "resolved": "https://registry.npm.taobao.org/stable/download/stable-0.1.8.tgz", + "integrity": "sha1-g26zyDgv4pNv6vVEYxAXzn1Ho88=", + "dev": true + }, + "stackframe": { + "version": "1.1.1", + "resolved": "https://registry.npm.taobao.org/stackframe/download/stackframe-1.1.1.tgz?cache=0&sync_timestamp=1578261993899&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fstackframe%2Fdownload%2Fstackframe-1.1.1.tgz", + "integrity": "sha1-/+8KMxixtgw7WFZJiaylZgcp7HE=", + "dev": true + }, + "static-extend": { + "version": "0.1.2", + "resolved": "https://registry.npm.taobao.org/static-extend/download/static-extend-0.1.2.tgz", + "integrity": "sha1-YICcOcv/VTNyJv1eC1IPNB8ftcY=", + "dev": true, + "requires": { + "define-property": "^0.2.5", + "object-copy": "^0.1.0" + }, + "dependencies": { + "define-property": { + "version": "0.2.5", + "resolved": "https://registry.npm.taobao.org/define-property/download/define-property-0.2.5.tgz", + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "dev": true, + "requires": { + "is-descriptor": "^0.1.0" + } + } + } + }, + "statuses": { + "version": "1.5.0", + "resolved": "https://registry.npm.taobao.org/statuses/download/statuses-1.5.0.tgz", + "integrity": "sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow=", + "dev": true + }, + "stealthy-require": { + "version": "1.1.1", + "resolved": "https://registry.npm.taobao.org/stealthy-require/download/stealthy-require-1.1.1.tgz", + "integrity": "sha1-NbCYdbT/SfJqd35QmzCQoyJr8ks=", + "dev": true + }, + "stream-browserify": { + "version": "2.0.2", + "resolved": "https://registry.npm.taobao.org/stream-browserify/download/stream-browserify-2.0.2.tgz", + "integrity": "sha1-h1IdOKRKp+6RzhzSpH3wy0ndZgs=", + "dev": true, + "requires": { + "inherits": "~2.0.1", + "readable-stream": "^2.0.2" + } + }, + "stream-each": { + "version": "1.2.3", + "resolved": "https://registry.npm.taobao.org/stream-each/download/stream-each-1.2.3.tgz", + "integrity": "sha1-6+J6DDibBPvMIzZClS4Qcxr6m64=", + "dev": true, + "requires": { + "end-of-stream": "^1.1.0", + "stream-shift": "^1.0.0" + } + }, + "stream-http": { + "version": "2.8.3", + "resolved": "https://registry.npm.taobao.org/stream-http/download/stream-http-2.8.3.tgz", + "integrity": "sha1-stJCRpKIpaJ+xP6JM6z2I95lFPw=", + "dev": true, + "requires": { + "builtin-status-codes": "^3.0.0", + "inherits": "^2.0.1", + "readable-stream": "^2.3.6", + "to-arraybuffer": "^1.0.0", + "xtend": "^4.0.0" + } + }, + "stream-shift": { + "version": "1.0.1", + "resolved": "https://registry.npm.taobao.org/stream-shift/download/stream-shift-1.0.1.tgz?cache=0&sync_timestamp=1576147178936&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fstream-shift%2Fdownload%2Fstream-shift-1.0.1.tgz", + "integrity": "sha1-1wiCgVWasneEJCebCHfaPDktWj0=", + "dev": true + }, + "strict-uri-encode": { + "version": "1.1.0", + "resolved": "https://registry.npm.taobao.org/strict-uri-encode/download/strict-uri-encode-1.1.0.tgz", + "integrity": "sha1-J5siXfHVgrH1TmWt3UNS4Y+qBxM=", + "dev": true + }, + "string-width": { + "version": "2.1.1", + "resolved": "https://registry.npm.taobao.org/string-width/download/string-width-2.1.1.tgz", + "integrity": "sha1-q5Pyeo3BPSjKyBXEYhQ6bZASrp4=", + "dev": true, + "requires": { + "is-fullwidth-code-point": "^2.0.0", + "strip-ansi": "^4.0.0" + }, + "dependencies": { + "ansi-regex": { + "version": "3.0.0", + "resolved": "https://registry.npm.taobao.org/ansi-regex/download/ansi-regex-3.0.0.tgz", + "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=", + "dev": true + }, + "strip-ansi": { + "version": "4.0.0", + "resolved": "https://registry.npm.taobao.org/strip-ansi/download/strip-ansi-4.0.0.tgz", + "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", + "dev": true, + "requires": { + "ansi-regex": "^3.0.0" + } + } + } + }, + "string.prototype.trimleft": { + "version": "2.1.1", + "resolved": "https://registry.npm.taobao.org/string.prototype.trimleft/download/string.prototype.trimleft-2.1.1.tgz", + "integrity": "sha1-m9uKxqvW1gKxek7TIYcNL43O/HQ=", + "dev": true, + "requires": { + "define-properties": "^1.1.3", + "function-bind": "^1.1.1" + } + }, + "string.prototype.trimright": { + "version": "2.1.1", + "resolved": "https://registry.npm.taobao.org/string.prototype.trimright/download/string.prototype.trimright-2.1.1.tgz?cache=0&sync_timestamp=1576706898686&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fstring.prototype.trimright%2Fdownload%2Fstring.prototype.trimright-2.1.1.tgz", + "integrity": "sha1-RAMUsVmWyGbOigNBiU1FGGIAxdk=", + "dev": true, + "requires": { + "define-properties": "^1.1.3", + "function-bind": "^1.1.1" + } + }, + "string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npm.taobao.org/string_decoder/download/string_decoder-1.1.1.tgz", + "integrity": "sha1-nPFhG6YmhdcDCunkujQUnDrwP8g=", + "dev": true, + "requires": { + "safe-buffer": "~5.1.0" + } + }, + "strip-ansi": { + "version": "6.0.0", + "resolved": "https://registry.npm.taobao.org/strip-ansi/download/strip-ansi-6.0.0.tgz", + "integrity": "sha1-CxVx3XZpzNTz4G4U7x7tJiJa5TI=", + "dev": true, + "requires": { + "ansi-regex": "^5.0.0" + }, + "dependencies": { + "ansi-regex": { + "version": "5.0.0", + "resolved": "https://registry.npm.taobao.org/ansi-regex/download/ansi-regex-5.0.0.tgz", + "integrity": "sha1-OIU59VF5vzkznIGvMKZU1p+Hy3U=", + "dev": true + } + } + }, + "strip-eof": { + "version": "1.0.0", + "resolved": "https://registry.npm.taobao.org/strip-eof/download/strip-eof-1.0.0.tgz", + "integrity": "sha1-u0P/VZim6wXYm1n80SnJgzE2Br8=", + "dev": true + }, + "strip-final-newline": { + "version": "2.0.0", + "resolved": "https://registry.npm.taobao.org/strip-final-newline/download/strip-final-newline-2.0.0.tgz", + "integrity": "sha1-ibhS+y/L6Tb29LMYevsKEsGrWK0=", + "dev": true + }, + "strip-indent": { + "version": "2.0.0", + "resolved": "https://registry.npm.taobao.org/strip-indent/download/strip-indent-2.0.0.tgz", + "integrity": "sha1-XvjbKV0B5u1sv3qrlpmNeCJSe2g=", + "dev": true + }, + "strip-json-comments": { + "version": "3.0.1", + "resolved": "https://registry.npm.taobao.org/strip-json-comments/download/strip-json-comments-3.0.1.tgz", + "integrity": "sha1-hXE5dakfuHvxswXMp3OV5A0qZKc=", + "dev": true + }, + "stylehacks": { + "version": "4.0.3", + "resolved": "https://registry.npm.taobao.org/stylehacks/download/stylehacks-4.0.3.tgz", + "integrity": "sha1-Zxj8r00eB9ihMYaQiB6NlnJqcdU=", + "dev": true, + "requires": { + "browserslist": "^4.0.0", + "postcss": "^7.0.0", + "postcss-selector-parser": "^3.0.0" + }, + "dependencies": { + "postcss-selector-parser": { + "version": "3.1.2", + "resolved": "https://registry.npm.taobao.org/postcss-selector-parser/download/postcss-selector-parser-3.1.2.tgz?cache=0&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fpostcss-selector-parser%2Fdownload%2Fpostcss-selector-parser-3.1.2.tgz", + "integrity": "sha1-sxD1xMD9r3b5SQK7qjDbaqhPUnA=", + "dev": true, + "requires": { + "dot-prop": "^5.2.0", + "indexes-of": "^1.0.1", + "uniq": "^1.0.1" + } + } + } + }, + "supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npm.taobao.org/supports-color/download/supports-color-5.5.0.tgz?cache=0&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fsupports-color%2Fdownload%2Fsupports-color-5.5.0.tgz", + "integrity": "sha1-4uaaRKyHcveKHsCzW2id9lMO/I8=", + "dev": true, + "requires": { + "has-flag": "^3.0.0" + } + }, + "svg-tags": { + "version": "1.0.0", + "resolved": "https://registry.npm.taobao.org/svg-tags/download/svg-tags-1.0.0.tgz", + "integrity": "sha1-WPcc7jvVGbWdSyqEO2x95krAR2Q=", + "dev": true + }, + "svgo": { + "version": "1.3.2", + "resolved": "https://registry.npm.taobao.org/svgo/download/svgo-1.3.2.tgz?cache=0&sync_timestamp=1572433264480&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fsvgo%2Fdownload%2Fsvgo-1.3.2.tgz", + "integrity": "sha1-ttxRHAYzRsnkFbgeQ0ARRbltQWc=", + "dev": true, + "requires": { + "chalk": "^2.4.1", + "coa": "^2.0.2", + "css-select": "^2.0.0", + "css-select-base-adapter": "^0.1.1", + "css-tree": "1.0.0-alpha.37", + "csso": "^4.0.2", + "js-yaml": "^3.13.1", + "mkdirp": "~0.5.1", + "object.values": "^1.1.0", + "sax": "~1.2.4", + "stable": "^0.1.8", + "unquote": "~1.1.1", + "util.promisify": "~1.0.0" + } + }, + "table": { + "version": "5.4.6", + "resolved": "https://registry.npm.taobao.org/table/download/table-5.4.6.tgz", + "integrity": "sha1-EpLRlQDOP4YFOwXw6Ofko7shB54=", + "dev": true, + "requires": { + "ajv": "^6.10.2", + "lodash": "^4.17.14", + "slice-ansi": "^2.1.0", + "string-width": "^3.0.0" + }, + "dependencies": { + "emoji-regex": { + "version": "7.0.3", + "resolved": "https://registry.npm.taobao.org/emoji-regex/download/emoji-regex-7.0.3.tgz", + "integrity": "sha1-kzoEBShgyF6DwSJHnEdIqOTHIVY=", + "dev": true + }, + "string-width": { + "version": "3.1.0", + "resolved": "https://registry.npm.taobao.org/string-width/download/string-width-3.1.0.tgz", + "integrity": "sha1-InZ74htirxCBV0MG9prFG2IgOWE=", + "dev": true, + "requires": { + "emoji-regex": "^7.0.1", + "is-fullwidth-code-point": "^2.0.0", + "strip-ansi": "^5.1.0" + } + }, + "strip-ansi": { + "version": "5.2.0", + "resolved": "https://registry.npm.taobao.org/strip-ansi/download/strip-ansi-5.2.0.tgz", + "integrity": "sha1-jJpTb+tq/JYr36WxBKUJHBrZwK4=", + "dev": true, + "requires": { + "ansi-regex": "^4.1.0" + } + } + } + }, + "tapable": { + "version": "1.1.3", + "resolved": "https://registry.npm.taobao.org/tapable/download/tapable-1.1.3.tgz", + "integrity": "sha1-ofzMBrWNth/XpF2i2kT186Pme6I=", + "dev": true + }, + "terser": { + "version": "4.6.7", + "resolved": "https://registry.npm.taobao.org/terser/download/terser-4.6.7.tgz?cache=0&sync_timestamp=1584455407472&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fterser%2Fdownload%2Fterser-4.6.7.tgz", + "integrity": "sha1-R41/k5TsGQfw5IjF9qaporrVXnI=", + "dev": true, + "requires": { + "commander": "^2.20.0", + "source-map": "~0.6.1", + "source-map-support": "~0.5.12" + }, + "dependencies": { + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npm.taobao.org/source-map/download/source-map-0.6.1.tgz", + "integrity": "sha1-dHIq8y6WFOnCh6jQu95IteLxomM=", + "dev": true + } + } + }, + "terser-webpack-plugin": { + "version": "1.4.3", + "resolved": "https://registry.npm.taobao.org/terser-webpack-plugin/download/terser-webpack-plugin-1.4.3.tgz", + "integrity": "sha1-Xsry29xfuZdF/QZ5H0b8ndscmnw=", + "dev": true, + "requires": { + "cacache": "^12.0.2", + "find-cache-dir": "^2.1.0", + "is-wsl": "^1.1.0", + "schema-utils": "^1.0.0", + "serialize-javascript": "^2.1.2", + "source-map": "^0.6.1", + "terser": "^4.1.2", + "webpack-sources": "^1.4.0", + "worker-farm": "^1.7.0" + }, + "dependencies": { + "schema-utils": { + "version": "1.0.0", + "resolved": "https://registry.npm.taobao.org/schema-utils/download/schema-utils-1.0.0.tgz", + "integrity": "sha1-C3mpMgTXtgDUsoUNH2bCo0lRx3A=", + "dev": true, + "requires": { + "ajv": "^6.1.0", + "ajv-errors": "^1.0.0", + "ajv-keywords": "^3.1.0" + } + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npm.taobao.org/source-map/download/source-map-0.6.1.tgz", + "integrity": "sha1-dHIq8y6WFOnCh6jQu95IteLxomM=", + "dev": true + } + } + }, + "text-table": { + "version": "0.2.0", + "resolved": "https://registry.npm.taobao.org/text-table/download/text-table-0.2.0.tgz", + "integrity": "sha1-f17oI66AUgfACvLfSoTsP8+lcLQ=", + "dev": true + }, + "thenify": { + "version": "3.3.0", + "resolved": "https://registry.npm.taobao.org/thenify/download/thenify-3.3.0.tgz", + "integrity": "sha1-5p44obq+lpsBCCB5eLn2K4hgSDk=", + "dev": true, + "requires": { + "any-promise": "^1.0.0" + } + }, + "thenify-all": { + "version": "1.6.0", + "resolved": "https://registry.npm.taobao.org/thenify-all/download/thenify-all-1.6.0.tgz", + "integrity": "sha1-GhkY1ALY/D+Y+/I02wvMjMEOlyY=", + "dev": true, + "requires": { + "thenify": ">= 3.1.0 < 4" + } + }, + "thread-loader": { + "version": "2.1.3", + "resolved": "https://registry.npm.taobao.org/thread-loader/download/thread-loader-2.1.3.tgz", + "integrity": "sha1-y9LBOfwrLebp0o9iKGq3cMGsvdo=", + "dev": true, + "requires": { + "loader-runner": "^2.3.1", + "loader-utils": "^1.1.0", + "neo-async": "^2.6.0" + } + }, + "throttle-debounce": { + "version": "1.1.0", + "resolved": "https://registry.npm.taobao.org/throttle-debounce/download/throttle-debounce-1.1.0.tgz", + "integrity": "sha1-UYU9o3vmihVctugns1FKPEIuic0=" + }, + "through": { + "version": "2.3.8", + "resolved": "https://registry.npm.taobao.org/through/download/through-2.3.8.tgz", + "integrity": "sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU=", + "dev": true + }, + "through2": { + "version": "2.0.5", + "resolved": "https://registry.npm.taobao.org/through2/download/through2-2.0.5.tgz", + "integrity": "sha1-AcHjnrMdB8t9A6lqcIIyYLIxMs0=", + "dev": true, + "requires": { + "readable-stream": "~2.3.6", + "xtend": "~4.0.1" + } + }, + "thunky": { + "version": "1.1.0", + "resolved": "https://registry.npm.taobao.org/thunky/download/thunky-1.1.0.tgz", + "integrity": "sha1-Wrr3FKlAXbBQRzK7zNLO3Z75U30=", + "dev": true + }, + "timers-browserify": { + "version": "2.0.11", + "resolved": "https://registry.npm.taobao.org/timers-browserify/download/timers-browserify-2.0.11.tgz", + "integrity": "sha1-gAsfPu4nLlvFPuRloE0OgEwxIR8=", + "dev": true, + "requires": { + "setimmediate": "^1.0.4" + } + }, + "timsort": { + "version": "0.3.0", + "resolved": "https://registry.npm.taobao.org/timsort/download/timsort-0.3.0.tgz", + "integrity": "sha1-QFQRqOfmM5/mTbmiNN4R3DHgK9Q=", + "dev": true + }, + "tmp": { + "version": "0.0.33", + "resolved": "https://registry.npm.taobao.org/tmp/download/tmp-0.0.33.tgz", + "integrity": "sha1-bTQzWIl2jSGyvNoKonfO07G/rfk=", + "dev": true, + "requires": { + "os-tmpdir": "~1.0.2" + } + }, + "to-arraybuffer": { + "version": "1.0.1", + "resolved": "https://registry.npm.taobao.org/to-arraybuffer/download/to-arraybuffer-1.0.1.tgz", + "integrity": "sha1-fSKbH8xjfkZsoIEYCDanqr/4P0M=", + "dev": true + }, + "to-fast-properties": { + "version": "2.0.0", + "resolved": "https://registry.npm.taobao.org/to-fast-properties/download/to-fast-properties-2.0.0.tgz?cache=0&sync_timestamp=1580550347606&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fto-fast-properties%2Fdownload%2Fto-fast-properties-2.0.0.tgz", + "integrity": "sha1-3F5pjL0HkmW8c+A3doGk5Og/YW4=", + "dev": true + }, + "to-object-path": { + "version": "0.3.0", + "resolved": "https://registry.npm.taobao.org/to-object-path/download/to-object-path-0.3.0.tgz", + "integrity": "sha1-KXWIt7Dn4KwI4E5nL4XB9JmeF68=", + "dev": true, + "requires": { + "kind-of": "^3.0.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npm.taobao.org/kind-of/download/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "to-regex": { + "version": "3.0.2", + "resolved": "https://registry.npm.taobao.org/to-regex/download/to-regex-3.0.2.tgz", + "integrity": "sha1-E8/dmzNlUvMLUfM6iuG0Knp1mc4=", + "dev": true, + "requires": { + "define-property": "^2.0.2", + "extend-shallow": "^3.0.2", + "regex-not": "^1.0.2", + "safe-regex": "^1.1.0" + } + }, + "to-regex-range": { + "version": "2.1.1", + "resolved": "https://registry.npm.taobao.org/to-regex-range/download/to-regex-range-2.1.1.tgz", + "integrity": "sha1-fIDBe53+vlmeJzZ+DU3VWQFB2zg=", + "dev": true, + "requires": { + "is-number": "^3.0.0", + "repeat-string": "^1.6.1" + } + }, + "toidentifier": { + "version": "1.0.0", + "resolved": "https://registry.npm.taobao.org/toidentifier/download/toidentifier-1.0.0.tgz", + "integrity": "sha1-fhvjRw8ed5SLxD2Uo8j013UrpVM=", + "dev": true + }, + "toposort": { + "version": "1.0.7", + "resolved": "https://registry.npm.taobao.org/toposort/download/toposort-1.0.7.tgz", + "integrity": "sha1-LmhELZ9k7HILjMieZEOsbKqVACk=", + "dev": true + }, + "tough-cookie": { + "version": "2.5.0", + "resolved": "https://registry.npm.taobao.org/tough-cookie/download/tough-cookie-2.5.0.tgz?cache=0&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Ftough-cookie%2Fdownload%2Ftough-cookie-2.5.0.tgz", + "integrity": "sha1-zZ+yoKodWhK0c72fuW+j3P9lreI=", + "dev": true, + "requires": { + "psl": "^1.1.28", + "punycode": "^2.1.1" + } + }, + "tryer": { + "version": "1.0.1", + "resolved": "https://registry.npm.taobao.org/tryer/download/tryer-1.0.1.tgz", + "integrity": "sha1-8shUBoALmw90yfdGW4HqrSQSUvg=", + "dev": true + }, + "ts-pnp": { + "version": "1.1.6", + "resolved": "https://registry.npm.taobao.org/ts-pnp/download/ts-pnp-1.1.6.tgz", + "integrity": "sha1-OJokOW1CWg0xYultK0Y4kA/cKJo=", + "dev": true + }, + "tslib": { + "version": "1.11.1", + "resolved": "https://registry.npm.taobao.org/tslib/download/tslib-1.11.1.tgz", + "integrity": "sha1-6xXRKIJ/vuKEFUnhcfRe0zisfjU=", + "dev": true + }, + "tty-browserify": { + "version": "0.0.0", + "resolved": "https://registry.npm.taobao.org/tty-browserify/download/tty-browserify-0.0.0.tgz", + "integrity": "sha1-oVe6QC2iTpv5V/mqadUk7tQpAaY=", + "dev": true + }, + "tunnel-agent": { + "version": "0.6.0", + "resolved": "https://registry.npm.taobao.org/tunnel-agent/download/tunnel-agent-0.6.0.tgz", + "integrity": "sha1-J6XeoGs2sEoKmWZ3SykIaPD8QP0=", + "dev": true, + "requires": { + "safe-buffer": "^5.0.1" + } + }, + "tweetnacl": { + "version": "0.14.5", + "resolved": "https://registry.npm.taobao.org/tweetnacl/download/tweetnacl-0.14.5.tgz?cache=0&sync_timestamp=1581365004105&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Ftweetnacl%2Fdownload%2Ftweetnacl-0.14.5.tgz", + "integrity": "sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q=", + "dev": true + }, + "type-check": { + "version": "0.3.2", + "resolved": "https://registry.npm.taobao.org/type-check/download/type-check-0.3.2.tgz", + "integrity": "sha1-WITKtRLPHTVeP7eE8wgEsrUg23I=", + "dev": true, + "requires": { + "prelude-ls": "~1.1.2" + } + }, + "type-fest": { + "version": "0.6.0", + "resolved": "https://registry.npm.taobao.org/type-fest/download/type-fest-0.6.0.tgz", + "integrity": "sha1-jSojcNPfiG61yQraHFv2GIrPg4s=", + "dev": true + }, + "type-is": { + "version": "1.6.18", + "resolved": "https://registry.npm.taobao.org/type-is/download/type-is-1.6.18.tgz", + "integrity": "sha1-TlUs0F3wlGfcvE73Od6J8s83wTE=", + "dev": true, + "requires": { + "media-typer": "0.3.0", + "mime-types": "~2.1.24" + } + }, + "typedarray": { + "version": "0.0.6", + "resolved": "https://registry.npm.taobao.org/typedarray/download/typedarray-0.0.6.tgz", + "integrity": "sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c=", + "dev": true + }, + "uglify-js": { + "version": "3.4.10", + "resolved": "https://registry.npm.taobao.org/uglify-js/download/uglify-js-3.4.10.tgz", + "integrity": "sha1-mtlWPY6zrN+404WX0q8dgV9qdV8=", + "dev": true, + "requires": { + "commander": "~2.19.0", + "source-map": "~0.6.1" + }, + "dependencies": { + "commander": { + "version": "2.19.0", + "resolved": "https://registry.npm.taobao.org/commander/download/commander-2.19.0.tgz", + "integrity": "sha1-9hmKqE5bg8RgVLlN3tv+1e6f8So=", + "dev": true + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npm.taobao.org/source-map/download/source-map-0.6.1.tgz", + "integrity": "sha1-dHIq8y6WFOnCh6jQu95IteLxomM=", + "dev": true + } + } + }, + "unicode-canonical-property-names-ecmascript": { + "version": "1.0.4", + "resolved": "https://registry.npm.taobao.org/unicode-canonical-property-names-ecmascript/download/unicode-canonical-property-names-ecmascript-1.0.4.tgz", + "integrity": "sha1-JhmADEyCWADv3YNDr33Zkzy+KBg=", + "dev": true + }, + "unicode-match-property-ecmascript": { + "version": "1.0.4", + "resolved": "https://registry.npm.taobao.org/unicode-match-property-ecmascript/download/unicode-match-property-ecmascript-1.0.4.tgz", + "integrity": "sha1-jtKjJWmWG86SJ9Cc0/+7j+1fAgw=", + "dev": true, + "requires": { + "unicode-canonical-property-names-ecmascript": "^1.0.4", + "unicode-property-aliases-ecmascript": "^1.0.4" + } + }, + "unicode-match-property-value-ecmascript": { + "version": "1.2.0", + "resolved": "https://registry.npm.taobao.org/unicode-match-property-value-ecmascript/download/unicode-match-property-value-ecmascript-1.2.0.tgz?cache=0&sync_timestamp=1583949910462&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Funicode-match-property-value-ecmascript%2Fdownload%2Funicode-match-property-value-ecmascript-1.2.0.tgz", + "integrity": "sha1-DZH2AO7rMJaqlisdb8iIduZOpTE=", + "dev": true + }, + "unicode-property-aliases-ecmascript": { + "version": "1.1.0", + "resolved": "https://registry.npm.taobao.org/unicode-property-aliases-ecmascript/download/unicode-property-aliases-ecmascript-1.1.0.tgz", + "integrity": "sha1-3Vepn2IHvt/0Yoq++5TFDblByPQ=", + "dev": true + }, + "union-value": { + "version": "1.0.1", + "resolved": "https://registry.npm.taobao.org/union-value/download/union-value-1.0.1.tgz", + "integrity": "sha1-C2/nuDWuzaYcbqTU8CwUIh4QmEc=", + "dev": true, + "requires": { + "arr-union": "^3.1.0", + "get-value": "^2.0.6", + "is-extendable": "^0.1.1", + "set-value": "^2.0.1" + } + }, + "uniq": { + "version": "1.0.1", + "resolved": "https://registry.npm.taobao.org/uniq/download/uniq-1.0.1.tgz", + "integrity": "sha1-sxxa6CVIRKOoKBVBzisEuGWnNP8=", + "dev": true + }, + "uniqs": { + "version": "2.0.0", + "resolved": "https://registry.npm.taobao.org/uniqs/download/uniqs-2.0.0.tgz", + "integrity": "sha1-/+3ks2slKQaW5uFl1KWe25mOawI=", + "dev": true + }, + "unique-filename": { + "version": "1.1.1", + "resolved": "https://registry.npm.taobao.org/unique-filename/download/unique-filename-1.1.1.tgz", + "integrity": "sha1-HWl2k2mtoFgxA6HmrodoG1ZXMjA=", + "dev": true, + "requires": { + "unique-slug": "^2.0.0" + } + }, + "unique-slug": { + "version": "2.0.2", + "resolved": "https://registry.npm.taobao.org/unique-slug/download/unique-slug-2.0.2.tgz", + "integrity": "sha1-uqvOkQg/xk6UWw861hPiZPfNTmw=", + "dev": true, + "requires": { + "imurmurhash": "^0.1.4" + } + }, + "universalify": { + "version": "0.1.2", + "resolved": "https://registry.npm.taobao.org/universalify/download/universalify-0.1.2.tgz?cache=0&sync_timestamp=1583531006552&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Funiversalify%2Fdownload%2Funiversalify-0.1.2.tgz", + "integrity": "sha1-tkb2m+OULavOzJ1mOcgNwQXvqmY=", + "dev": true + }, + "unpipe": { + "version": "1.0.0", + "resolved": "https://registry.npm.taobao.org/unpipe/download/unpipe-1.0.0.tgz", + "integrity": "sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw=", + "dev": true + }, + "unquote": { + "version": "1.1.1", + "resolved": "https://registry.npm.taobao.org/unquote/download/unquote-1.1.1.tgz", + "integrity": "sha1-j97XMk7G6IoP+LkF58CYzcCG1UQ=", + "dev": true + }, + "unset-value": { + "version": "1.0.0", + "resolved": "https://registry.npm.taobao.org/unset-value/download/unset-value-1.0.0.tgz", + "integrity": "sha1-g3aHP30jNRef+x5vw6jtDfyKtVk=", + "dev": true, + "requires": { + "has-value": "^0.3.1", + "isobject": "^3.0.0" + }, + "dependencies": { + "has-value": { + "version": "0.3.1", + "resolved": "https://registry.npm.taobao.org/has-value/download/has-value-0.3.1.tgz", + "integrity": "sha1-ex9YutpiyoJ+wKIHgCVlSEWZXh8=", + "dev": true, + "requires": { + "get-value": "^2.0.3", + "has-values": "^0.1.4", + "isobject": "^2.0.0" + }, + "dependencies": { + "isobject": { + "version": "2.1.0", + "resolved": "https://registry.npm.taobao.org/isobject/download/isobject-2.1.0.tgz", + "integrity": "sha1-8GVWEJaj8dou9GJy+BXIQNh+DIk=", + "dev": true, + "requires": { + "isarray": "1.0.0" + } + } + } + }, + "has-values": { + "version": "0.1.4", + "resolved": "https://registry.npm.taobao.org/has-values/download/has-values-0.1.4.tgz", + "integrity": "sha1-bWHeldkd/Km5oCCJrThL/49it3E=", + "dev": true + } + } + }, + "upath": { + "version": "1.2.0", + "resolved": "https://registry.npm.taobao.org/upath/download/upath-1.2.0.tgz?cache=0&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fupath%2Fdownload%2Fupath-1.2.0.tgz", + "integrity": "sha1-j2bbzVWog6za5ECK+LA1pQRMGJQ=", + "dev": true + }, + "upper-case": { + "version": "1.1.3", + "resolved": "https://registry.npm.taobao.org/upper-case/download/upper-case-1.1.3.tgz?cache=0&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fupper-case%2Fdownload%2Fupper-case-1.1.3.tgz", + "integrity": "sha1-9rRQHC7EzdJrp4vnIilh3ndiFZg=", + "dev": true + }, + "uri-js": { + "version": "4.2.2", + "resolved": "https://registry.npm.taobao.org/uri-js/download/uri-js-4.2.2.tgz", + "integrity": "sha1-lMVA4f93KVbiKZUHwBCupsiDjrA=", + "dev": true, + "requires": { + "punycode": "^2.1.0" + } + }, + "urix": { + "version": "0.1.0", + "resolved": "https://registry.npm.taobao.org/urix/download/urix-0.1.0.tgz", + "integrity": "sha1-2pN/emLiH+wf0Y1Js1wpNQZ6bHI=", + "dev": true + }, + "url": { + "version": "0.11.0", + "resolved": "https://registry.npm.taobao.org/url/download/url-0.11.0.tgz", + "integrity": "sha1-ODjpfPxgUh63PFJajlW/3Z4uKPE=", + "dev": true, + "requires": { + "punycode": "1.3.2", + "querystring": "0.2.0" + }, + "dependencies": { + "punycode": { + "version": "1.3.2", + "resolved": "https://registry.npm.taobao.org/punycode/download/punycode-1.3.2.tgz", + "integrity": "sha1-llOgNvt8HuQjQvIyXM7v6jkmxI0=", + "dev": true + } + } + }, + "url-loader": { + "version": "2.3.0", + "resolved": "https://registry.npm.taobao.org/url-loader/download/url-loader-2.3.0.tgz?cache=0&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Furl-loader%2Fdownload%2Furl-loader-2.3.0.tgz", + "integrity": "sha1-4OLvZY8APvuMpBsPP/v3a6uIZYs=", + "dev": true, + "requires": { + "loader-utils": "^1.2.3", + "mime": "^2.4.4", + "schema-utils": "^2.5.0" + } + }, + "url-parse": { + "version": "1.4.7", + "resolved": "https://registry.npm.taobao.org/url-parse/download/url-parse-1.4.7.tgz", + "integrity": "sha1-qKg1NejACjFuQDpdtKwbm4U64ng=", + "dev": true, + "requires": { + "querystringify": "^2.1.1", + "requires-port": "^1.0.0" + } + }, + "use": { + "version": "3.1.1", + "resolved": "https://registry.npm.taobao.org/use/download/use-3.1.1.tgz", + "integrity": "sha1-1QyMrHmhn7wg8pEfVuuXP04QBw8=", + "dev": true + }, + "util": { + "version": "0.11.1", + "resolved": "https://registry.npm.taobao.org/util/download/util-0.11.1.tgz?cache=0&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Futil%2Fdownload%2Futil-0.11.1.tgz", + "integrity": "sha1-MjZzNyDsZLsn9uJvQhqqLhtYjWE=", + "dev": true, + "requires": { + "inherits": "2.0.3" + }, + "dependencies": { + "inherits": { + "version": "2.0.3", + "resolved": "https://registry.npm.taobao.org/inherits/download/inherits-2.0.3.tgz", + "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=", + "dev": true + } + } + }, + "util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npm.taobao.org/util-deprecate/download/util-deprecate-1.0.2.tgz", + "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=", + "dev": true + }, + "util.promisify": { + "version": "1.0.1", + "resolved": "https://registry.npm.taobao.org/util.promisify/download/util.promisify-1.0.1.tgz?cache=0&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Futil.promisify%2Fdownload%2Futil.promisify-1.0.1.tgz", + "integrity": "sha1-a693dLgO6w91INi4HQeYKlmruu4=", + "dev": true, + "requires": { + "define-properties": "^1.1.3", + "es-abstract": "^1.17.2", + "has-symbols": "^1.0.1", + "object.getownpropertydescriptors": "^2.1.0" + } + }, + "utila": { + "version": "0.4.0", + "resolved": "https://registry.npm.taobao.org/utila/download/utila-0.4.0.tgz", + "integrity": "sha1-ihagXURWV6Oupe7MWxKk+lN5dyw=", + "dev": true + }, + "utils-merge": { + "version": "1.0.1", + "resolved": "https://registry.npm.taobao.org/utils-merge/download/utils-merge-1.0.1.tgz", + "integrity": "sha1-n5VxD1CiZ5R7LMwSR0HBAoQn5xM=", + "dev": true + }, + "uuid": { + "version": "3.4.0", + "resolved": "https://registry.npm.taobao.org/uuid/download/uuid-3.4.0.tgz?cache=0&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fuuid%2Fdownload%2Fuuid-3.4.0.tgz", + "integrity": "sha1-sj5DWK+oogL+ehAK8fX4g/AgB+4=", + "dev": true + }, + "v8-compile-cache": { + "version": "2.1.0", + "resolved": "https://registry.npm.taobao.org/v8-compile-cache/download/v8-compile-cache-2.1.0.tgz?cache=0&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fv8-compile-cache%2Fdownload%2Fv8-compile-cache-2.1.0.tgz", + "integrity": "sha1-4U3jezGm0ZT1aQ1n78Tn9vxqsw4=", + "dev": true + }, + "validate-npm-package-license": { + "version": "3.0.4", + "resolved": "https://registry.npm.taobao.org/validate-npm-package-license/download/validate-npm-package-license-3.0.4.tgz", + "integrity": "sha1-/JH2uce6FchX9MssXe/uw51PQQo=", + "dev": true, + "requires": { + "spdx-correct": "^3.0.0", + "spdx-expression-parse": "^3.0.0" + } + }, + "vary": { + "version": "1.1.2", + "resolved": "https://registry.npm.taobao.org/vary/download/vary-1.1.2.tgz", + "integrity": "sha1-IpnwLG3tMNSllhsLn3RSShj2NPw=", + "dev": true + }, + "vendors": { + "version": "1.0.4", + "resolved": "https://registry.npm.taobao.org/vendors/download/vendors-1.0.4.tgz?cache=0&sync_timestamp=1579858298446&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fvendors%2Fdownload%2Fvendors-1.0.4.tgz", + "integrity": "sha1-4rgApT56Kbk1BsPPQRANFsTErY4=", + "dev": true + }, + "verror": { + "version": "1.10.0", + "resolved": "https://registry.npm.taobao.org/verror/download/verror-1.10.0.tgz", + "integrity": "sha1-OhBcoXBTr1XW4nDB+CiGguGNpAA=", + "dev": true, + "requires": { + "assert-plus": "^1.0.0", + "core-util-is": "1.0.2", + "extsprintf": "^1.2.0" + } + }, + "vm-browserify": { + "version": "1.1.2", + "resolved": "https://registry.npm.taobao.org/vm-browserify/download/vm-browserify-1.1.2.tgz?cache=0&sync_timestamp=1572870772154&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fvm-browserify%2Fdownload%2Fvm-browserify-1.1.2.tgz", + "integrity": "sha1-eGQcSIuObKkadfUR56OzKobl3aA=", + "dev": true + }, + "vue": { + "version": "2.6.11", + "resolved": "https://registry.npm.taobao.org/vue/download/vue-2.6.11.tgz?cache=0&sync_timestamp=1585089754204&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fvue%2Fdownload%2Fvue-2.6.11.tgz", + "integrity": "sha1-dllNh31LEiNEBuhONSdcbVFBJcU=" + }, + "vue-cli-plugin-element": { + "version": "1.0.1", + "resolved": "https://registry.npm.taobao.org/vue-cli-plugin-element/download/vue-cli-plugin-element-1.0.1.tgz", + "integrity": "sha1-NOWPtls2z1mvrxT1AyiOXleLFVQ=", + "dev": true + }, + "vue-eslint-parser": { + "version": "7.0.0", + "resolved": "https://registry.npm.taobao.org/vue-eslint-parser/download/vue-eslint-parser-7.0.0.tgz?cache=0&sync_timestamp=1573306368916&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fvue-eslint-parser%2Fdownload%2Fvue-eslint-parser-7.0.0.tgz", + "integrity": "sha1-pO0mafhxed7dBq/dhzasuzo4ZNY=", + "dev": true, + "requires": { + "debug": "^4.1.1", + "eslint-scope": "^5.0.0", + "eslint-visitor-keys": "^1.1.0", + "espree": "^6.1.2", + "esquery": "^1.0.1", + "lodash": "^4.17.15" + }, + "dependencies": { + "eslint-scope": { + "version": "5.0.0", + "resolved": "https://registry.npm.taobao.org/eslint-scope/download/eslint-scope-5.0.0.tgz", + "integrity": "sha1-6HyIh8c+jR7ITxylkWRcNYv8j7k=", + "dev": true, + "requires": { + "esrecurse": "^4.1.0", + "estraverse": "^4.1.1" + } + } + } + }, + "vue-hot-reload-api": { + "version": "2.3.4", + "resolved": "https://registry.npm.taobao.org/vue-hot-reload-api/download/vue-hot-reload-api-2.3.4.tgz", + "integrity": "sha1-UylVzB6yCKPZkLOp+acFdGV+CPI=", + "dev": true + }, + "vue-loader": { + "version": "15.9.1", + "resolved": "https://registry.npm.taobao.org/vue-loader/download/vue-loader-15.9.1.tgz?cache=0&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fvue-loader%2Fdownload%2Fvue-loader-15.9.1.tgz", + "integrity": "sha1-vSq489KB5R17gdFTkKWEJNFCJD4=", + "dev": true, + "requires": { + "@vue/component-compiler-utils": "^3.1.0", + "hash-sum": "^1.0.2", + "loader-utils": "^1.1.0", + "vue-hot-reload-api": "^2.3.0", + "vue-style-loader": "^4.1.0" + }, + "dependencies": { + "hash-sum": { + "version": "1.0.2", + "resolved": "https://registry.npm.taobao.org/hash-sum/download/hash-sum-1.0.2.tgz", + "integrity": "sha1-M7QHd3VMZDJXPBIMw4CLvRDUfwQ=", + "dev": true + } + } + }, + "vue-print-nb": { + "version": "1.5.0", + "resolved": "https://registry.npm.taobao.org/vue-print-nb/download/vue-print-nb-1.5.0.tgz", + "integrity": "sha1-sq9/opI//mmrTphYbgA36ZOBMWE=", + "requires": { + "core-js": "^2.6.5", + "echarts": "^4.6.0", + "qrcodejs2": "0.0.2", + "vue": "^2.6.10" + }, + "dependencies": { + "core-js": { + "version": "2.6.12", + "resolved": "https://registry.npm.taobao.org/core-js/download/core-js-2.6.12.tgz?cache=0&sync_timestamp=1606326889335&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fcore-js%2Fdownload%2Fcore-js-2.6.12.tgz", + "integrity": "sha1-2TM9+nsGXjR8xWgiGdb2kIWcwuw=" + } + } + }, + "vue-router": { + "version": "3.1.6", + "resolved": "https://registry.npm.taobao.org/vue-router/download/vue-router-3.1.6.tgz?cache=0&sync_timestamp=1584203224109&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fvue-router%2Fdownload%2Fvue-router-3.1.6.tgz", + "integrity": "sha1-RfWjo4Q+MXAsBh3YKTk1VOQyj4k=" + }, + "vue-style-loader": { + "version": "4.1.2", + "resolved": "https://registry.npm.taobao.org/vue-style-loader/download/vue-style-loader-4.1.2.tgz", + "integrity": "sha1-3t80mAbyXOtOZPOtfApE+6c1/Pg=", + "dev": true, + "requires": { + "hash-sum": "^1.0.2", + "loader-utils": "^1.0.2" + }, + "dependencies": { + "hash-sum": { + "version": "1.0.2", + "resolved": "https://registry.npm.taobao.org/hash-sum/download/hash-sum-1.0.2.tgz", + "integrity": "sha1-M7QHd3VMZDJXPBIMw4CLvRDUfwQ=", + "dev": true + } + } + }, + "vue-template-compiler": { + "version": "2.6.11", + "resolved": "https://registry.npm.taobao.org/vue-template-compiler/download/vue-template-compiler-2.6.11.tgz", + "integrity": "sha1-wEcE749JixUxMAGJk+VjCdRpgIA=", + "dev": true, + "requires": { + "de-indent": "^1.0.2", + "he": "^1.1.0" + } + }, + "vue-template-es2015-compiler": { + "version": "1.9.1", + "resolved": "https://registry.npm.taobao.org/vue-template-es2015-compiler/download/vue-template-es2015-compiler-1.9.1.tgz", + "integrity": "sha1-HuO8mhbsv1EYvjNLsV+cRvgvWCU=", + "dev": true + }, + "vuex": { + "version": "3.1.3", + "resolved": "https://registry.npm.taobao.org/vuex/download/vuex-3.1.3.tgz", + "integrity": "sha1-8q1z4/tzaRaYs4yT9m5Y4meUcYA=" + }, + "watchpack": { + "version": "1.6.0", + "resolved": "https://registry.npm.taobao.org/watchpack/download/watchpack-1.6.0.tgz", + "integrity": "sha1-S8EsLr6KonenHx0/FNaFx7RGzQA=", + "dev": true, + "requires": { + "chokidar": "^2.0.2", + "graceful-fs": "^4.1.2", + "neo-async": "^2.5.0" + } + }, + "wbuf": { + "version": "1.7.3", + "resolved": "https://registry.npm.taobao.org/wbuf/download/wbuf-1.7.3.tgz", + "integrity": "sha1-wdjRSTFtPqhShIiVy2oL/oh7h98=", + "dev": true, + "requires": { + "minimalistic-assert": "^1.0.0" + } + }, + "wcwidth": { + "version": "1.0.1", + "resolved": "https://registry.npm.taobao.org/wcwidth/download/wcwidth-1.0.1.tgz", + "integrity": "sha1-8LDc+RW8X/FSivrbLA4XtTLaL+g=", + "dev": true, + "requires": { + "defaults": "^1.0.3" + } + }, + "webpack": { + "version": "4.42.1", + "resolved": "https://registry.npm.taobao.org/webpack/download/webpack-4.42.1.tgz", + "integrity": "sha1-rnB7rwkfXKPvnDi4hCh8/o8Zg+8=", + "dev": true, + "requires": { + "@webassemblyjs/ast": "1.9.0", + "@webassemblyjs/helper-module-context": "1.9.0", + "@webassemblyjs/wasm-edit": "1.9.0", + "@webassemblyjs/wasm-parser": "1.9.0", + "acorn": "^6.2.1", + "ajv": "^6.10.2", + "ajv-keywords": "^3.4.1", + "chrome-trace-event": "^1.0.2", + "enhanced-resolve": "^4.1.0", + "eslint-scope": "^4.0.3", + "json-parse-better-errors": "^1.0.2", + "loader-runner": "^2.4.0", + "loader-utils": "^1.2.3", + "memory-fs": "^0.4.1", + "micromatch": "^3.1.10", + "mkdirp": "^0.5.3", + "neo-async": "^2.6.1", + "node-libs-browser": "^2.2.1", + "schema-utils": "^1.0.0", + "tapable": "^1.1.3", + "terser-webpack-plugin": "^1.4.3", + "watchpack": "^1.6.0", + "webpack-sources": "^1.4.1" + }, + "dependencies": { + "schema-utils": { + "version": "1.0.0", + "resolved": "https://registry.npm.taobao.org/schema-utils/download/schema-utils-1.0.0.tgz", + "integrity": "sha1-C3mpMgTXtgDUsoUNH2bCo0lRx3A=", + "dev": true, + "requires": { + "ajv": "^6.1.0", + "ajv-errors": "^1.0.0", + "ajv-keywords": "^3.1.0" + } + } + } + }, + "webpack-bundle-analyzer": { + "version": "3.6.1", + "resolved": "https://registry.npm.taobao.org/webpack-bundle-analyzer/download/webpack-bundle-analyzer-3.6.1.tgz", + "integrity": "sha1-vbY3wjBEJPL7/5qVDHvkKoOa5zs=", + "dev": true, + "requires": { + "acorn": "^7.1.1", + "acorn-walk": "^7.1.1", + "bfj": "^6.1.1", + "chalk": "^2.4.1", + "commander": "^2.18.0", + "ejs": "^2.6.1", + "express": "^4.16.3", + "filesize": "^3.6.1", + "gzip-size": "^5.0.0", + "lodash": "^4.17.15", + "mkdirp": "^0.5.1", + "opener": "^1.5.1", + "ws": "^6.0.0" + }, + "dependencies": { + "acorn": { + "version": "7.1.1", + "resolved": "https://registry.npm.taobao.org/acorn/download/acorn-7.1.1.tgz?cache=0&sync_timestamp=1583796606796&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Facorn%2Fdownload%2Facorn-7.1.1.tgz", + "integrity": "sha1-41Zo3gtALzWd5RXFSCoaufiaab8=", + "dev": true + } + } + }, + "webpack-chain": { + "version": "6.4.0", + "resolved": "https://registry.npm.taobao.org/webpack-chain/download/webpack-chain-6.4.0.tgz", + "integrity": "sha1-IvCye2qbye48uk+eZRPPZjlANOI=", + "dev": true, + "requires": { + "deepmerge": "^1.5.2", + "javascript-stringify": "^2.0.1" + } + }, + "webpack-dev-middleware": { + "version": "3.7.2", + "resolved": "https://registry.npm.taobao.org/webpack-dev-middleware/download/webpack-dev-middleware-3.7.2.tgz", + "integrity": "sha1-ABnD23FuP6XOy/ZPKriKdLqzMfM=", + "dev": true, + "requires": { + "memory-fs": "^0.4.1", + "mime": "^2.4.4", + "mkdirp": "^0.5.1", + "range-parser": "^1.2.1", + "webpack-log": "^2.0.0" + } + }, + "webpack-dev-server": { + "version": "3.10.3", + "resolved": "https://registry.npm.taobao.org/webpack-dev-server/download/webpack-dev-server-3.10.3.tgz", + "integrity": "sha1-81lFA2gT5X71gsJCDve0cOFNOvA=", + "dev": true, + "requires": { + "ansi-html": "0.0.7", + "bonjour": "^3.5.0", + "chokidar": "^2.1.8", + "compression": "^1.7.4", + "connect-history-api-fallback": "^1.6.0", + "debug": "^4.1.1", + "del": "^4.1.1", + "express": "^4.17.1", + "html-entities": "^1.2.1", + "http-proxy-middleware": "0.19.1", + "import-local": "^2.0.0", + "internal-ip": "^4.3.0", + "ip": "^1.1.5", + "is-absolute-url": "^3.0.3", + "killable": "^1.0.1", + "loglevel": "^1.6.6", + "opn": "^5.5.0", + "p-retry": "^3.0.1", + "portfinder": "^1.0.25", + "schema-utils": "^1.0.0", + "selfsigned": "^1.10.7", + "semver": "^6.3.0", + "serve-index": "^1.9.1", + "sockjs": "0.3.19", + "sockjs-client": "1.4.0", + "spdy": "^4.0.1", + "strip-ansi": "^3.0.1", + "supports-color": "^6.1.0", + "url": "^0.11.0", + "webpack-dev-middleware": "^3.7.2", + "webpack-log": "^2.0.0", + "ws": "^6.2.1", + "yargs": "12.0.5" + }, + "dependencies": { + "ansi-regex": { + "version": "2.1.1", + "resolved": "https://registry.npm.taobao.org/ansi-regex/download/ansi-regex-2.1.1.tgz", + "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", + "dev": true + }, + "cliui": { + "version": "4.1.0", + "resolved": "https://registry.npm.taobao.org/cliui/download/cliui-4.1.0.tgz?cache=0&sync_timestamp=1573942320052&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fcliui%2Fdownload%2Fcliui-4.1.0.tgz", + "integrity": "sha1-NIQi2+gtgAswIu709qwQvy5NG0k=", + "dev": true, + "requires": { + "string-width": "^2.1.1", + "strip-ansi": "^4.0.0", + "wrap-ansi": "^2.0.0" + }, + "dependencies": { + "ansi-regex": { + "version": "3.0.0", + "resolved": "https://registry.npm.taobao.org/ansi-regex/download/ansi-regex-3.0.0.tgz", + "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=", + "dev": true + }, + "strip-ansi": { + "version": "4.0.0", + "resolved": "https://registry.npm.taobao.org/strip-ansi/download/strip-ansi-4.0.0.tgz", + "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", + "dev": true, + "requires": { + "ansi-regex": "^3.0.0" + } + } + } + }, + "get-caller-file": { + "version": "1.0.3", + "resolved": "https://registry.npm.taobao.org/get-caller-file/download/get-caller-file-1.0.3.tgz", + "integrity": "sha1-+Xj6TJDR3+f/LWvtoqUV5xO9z0o=", + "dev": true + }, + "is-absolute-url": { + "version": "3.0.3", + "resolved": "https://registry.npm.taobao.org/is-absolute-url/download/is-absolute-url-3.0.3.tgz", + "integrity": "sha1-lsaiK2ojkpsR6gr7GDbDatSl1pg=", + "dev": true + }, + "is-fullwidth-code-point": { + "version": "1.0.0", + "resolved": "https://registry.npm.taobao.org/is-fullwidth-code-point/download/is-fullwidth-code-point-1.0.0.tgz", + "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=", + "dev": true, + "requires": { + "number-is-nan": "^1.0.0" + } + }, + "require-main-filename": { + "version": "1.0.1", + "resolved": "https://registry.npm.taobao.org/require-main-filename/download/require-main-filename-1.0.1.tgz", + "integrity": "sha1-l/cXtp1IeE9fUmpsWqj/3aBVpNE=", + "dev": true + }, + "schema-utils": { + "version": "1.0.0", + "resolved": "https://registry.npm.taobao.org/schema-utils/download/schema-utils-1.0.0.tgz", + "integrity": "sha1-C3mpMgTXtgDUsoUNH2bCo0lRx3A=", + "dev": true, + "requires": { + "ajv": "^6.1.0", + "ajv-errors": "^1.0.0", + "ajv-keywords": "^3.1.0" + } + }, + "semver": { + "version": "6.3.0", + "resolved": "https://registry.npm.taobao.org/semver/download/semver-6.3.0.tgz", + "integrity": "sha1-7gpkyK9ejO6mdoexM3YeG+y9HT0=", + "dev": true + }, + "strip-ansi": { + "version": "3.0.1", + "resolved": "https://registry.npm.taobao.org/strip-ansi/download/strip-ansi-3.0.1.tgz", + "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", + "dev": true, + "requires": { + "ansi-regex": "^2.0.0" + } + }, + "supports-color": { + "version": "6.1.0", + "resolved": "https://registry.npm.taobao.org/supports-color/download/supports-color-6.1.0.tgz?cache=0&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fsupports-color%2Fdownload%2Fsupports-color-6.1.0.tgz", + "integrity": "sha1-B2Srxpxj1ayELdSGfo0CXogN+PM=", + "dev": true, + "requires": { + "has-flag": "^3.0.0" + } + }, + "wrap-ansi": { + "version": "2.1.0", + "resolved": "https://registry.npm.taobao.org/wrap-ansi/download/wrap-ansi-2.1.0.tgz?cache=0&sync_timestamp=1573488719878&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fwrap-ansi%2Fdownload%2Fwrap-ansi-2.1.0.tgz", + "integrity": "sha1-2Pw9KE3QV5T+hJc8rs3Rz4JP3YU=", + "dev": true, + "requires": { + "string-width": "^1.0.1", + "strip-ansi": "^3.0.1" + }, + "dependencies": { + "string-width": { + "version": "1.0.2", + "resolved": "https://registry.npm.taobao.org/string-width/download/string-width-1.0.2.tgz", + "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", + "dev": true, + "requires": { + "code-point-at": "^1.0.0", + "is-fullwidth-code-point": "^1.0.0", + "strip-ansi": "^3.0.0" + } + } + } + }, + "yargs": { + "version": "12.0.5", + "resolved": "https://registry.npm.taobao.org/yargs/download/yargs-12.0.5.tgz", + "integrity": "sha1-BfWZe2CWR7ZPZrgeO0sQo2jnrRM=", + "dev": true, + "requires": { + "cliui": "^4.0.0", + "decamelize": "^1.2.0", + "find-up": "^3.0.0", + "get-caller-file": "^1.0.1", + "os-locale": "^3.0.0", + "require-directory": "^2.1.1", + "require-main-filename": "^1.0.1", + "set-blocking": "^2.0.0", + "string-width": "^2.0.0", + "which-module": "^2.0.0", + "y18n": "^3.2.1 || ^4.0.0", + "yargs-parser": "^11.1.1" + } + }, + "yargs-parser": { + "version": "11.1.1", + "resolved": "https://registry.npm.taobao.org/yargs-parser/download/yargs-parser-11.1.1.tgz?cache=0&sync_timestamp=1584342997286&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fyargs-parser%2Fdownload%2Fyargs-parser-11.1.1.tgz", + "integrity": "sha1-h5oIZZc7yp9rq1y987HGfsfTvPQ=", + "dev": true, + "requires": { + "camelcase": "^5.0.0", + "decamelize": "^1.2.0" + } + } + } + }, + "webpack-log": { + "version": "2.0.0", + "resolved": "https://registry.npm.taobao.org/webpack-log/download/webpack-log-2.0.0.tgz", + "integrity": "sha1-W3ko4GN1k/EZ0y9iJ8HgrDHhtH8=", + "dev": true, + "requires": { + "ansi-colors": "^3.0.0", + "uuid": "^3.3.2" + } + }, + "webpack-merge": { + "version": "4.2.2", + "resolved": "https://registry.npm.taobao.org/webpack-merge/download/webpack-merge-4.2.2.tgz?cache=0&sync_timestamp=1566978693896&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fwebpack-merge%2Fdownload%2Fwebpack-merge-4.2.2.tgz", + "integrity": "sha1-onxS6ng9E5iv0gh/VH17nS9DY00=", + "dev": true, + "requires": { + "lodash": "^4.17.15" + } + }, + "webpack-sources": { + "version": "1.4.3", + "resolved": "https://registry.npm.taobao.org/webpack-sources/download/webpack-sources-1.4.3.tgz?cache=0&sync_timestamp=1574264193174&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fwebpack-sources%2Fdownload%2Fwebpack-sources-1.4.3.tgz", + "integrity": "sha1-7t2OwLko+/HL/plOItLYkPMwqTM=", + "dev": true, + "requires": { + "source-list-map": "^2.0.0", + "source-map": "~0.6.1" + }, + "dependencies": { + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npm.taobao.org/source-map/download/source-map-0.6.1.tgz", + "integrity": "sha1-dHIq8y6WFOnCh6jQu95IteLxomM=", + "dev": true + } + } + }, + "websocket-driver": { + "version": "0.7.3", + "resolved": "https://registry.npm.taobao.org/websocket-driver/download/websocket-driver-0.7.3.tgz", + "integrity": "sha1-otTg1PTxFvHmKX66WLBdQwEA6fk=", + "dev": true, + "requires": { + "http-parser-js": ">=0.4.0 <0.4.11", + "safe-buffer": ">=5.1.0", + "websocket-extensions": ">=0.1.1" + } + }, + "websocket-extensions": { + "version": "0.1.3", + "resolved": "https://registry.npm.taobao.org/websocket-extensions/download/websocket-extensions-0.1.3.tgz", + "integrity": "sha1-XS/yKXcAPsaHpLhwc9+7rBRszyk=", + "dev": true + }, + "which": { + "version": "1.3.1", + "resolved": "https://registry.npm.taobao.org/which/download/which-1.3.1.tgz?cache=0&sync_timestamp=1574116262707&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fwhich%2Fdownload%2Fwhich-1.3.1.tgz", + "integrity": "sha1-pFBD1U9YBTFtqNYvn1CRjT2nCwo=", + "dev": true, + "requires": { + "isexe": "^2.0.0" + } + }, + "which-module": { + "version": "2.0.0", + "resolved": "https://registry.npm.taobao.org/which-module/download/which-module-2.0.0.tgz", + "integrity": "sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho=", + "dev": true + }, + "wmf": { + "version": "1.0.2", + "resolved": "https://registry.npm.taobao.org/wmf/download/wmf-1.0.2.tgz", + "integrity": "sha1-fRnWIQcaCMK9xrfmiKnENSmMwto=" + }, + "word": { + "version": "0.3.0", + "resolved": "https://registry.npm.taobao.org/word/download/word-0.3.0.tgz", + "integrity": "sha1-hUIVfk+OhJ9KNjooiZLUdhLbmWE=" + }, + "word-wrap": { + "version": "1.2.3", + "resolved": "https://registry.npm.taobao.org/word-wrap/download/word-wrap-1.2.3.tgz", + "integrity": "sha1-YQY29rH3A4kb00dxzLF/uTtHB5w=", + "dev": true + }, + "worker-farm": { + "version": "1.7.0", + "resolved": "https://registry.npm.taobao.org/worker-farm/download/worker-farm-1.7.0.tgz", + "integrity": "sha1-JqlMU5G7ypJhUgAvabhKS/dy5ag=", + "dev": true, + "requires": { + "errno": "~0.1.7" + } + }, + "wrap-ansi": { + "version": "6.2.0", + "resolved": "https://registry.npm.taobao.org/wrap-ansi/download/wrap-ansi-6.2.0.tgz?cache=0&sync_timestamp=1573488719878&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fwrap-ansi%2Fdownload%2Fwrap-ansi-6.2.0.tgz", + "integrity": "sha1-6Tk7oHEC5skaOyIUePAlfNKFblM=", + "dev": true, + "requires": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "dependencies": { + "ansi-styles": { + "version": "4.2.1", + "resolved": "https://registry.npm.taobao.org/ansi-styles/download/ansi-styles-4.2.1.tgz", + "integrity": "sha1-kK51xCTQCNJiTFvynq0xd+v881k=", + "dev": true, + "requires": { + "@types/color-name": "^1.1.1", + "color-convert": "^2.0.1" + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npm.taobao.org/color-convert/download/color-convert-2.0.1.tgz", + "integrity": "sha1-ctOmjVmMm9s68q0ehPIdiWq9TeM=", + "dev": true, + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npm.taobao.org/color-name/download/color-name-1.1.4.tgz", + "integrity": "sha1-wqCah6y95pVD3m9j+jmVyCbFNqI=", + "dev": true + }, + "is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npm.taobao.org/is-fullwidth-code-point/download/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha1-8Rb4Bk/pCz94RKOJl8C3UFEmnx0=", + "dev": true + }, + "string-width": { + "version": "4.2.0", + "resolved": "https://registry.npm.taobao.org/string-width/download/string-width-4.2.0.tgz", + "integrity": "sha1-lSGCxGzHssMT0VluYjmSvRY7crU=", + "dev": true, + "requires": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.0" + } + } + } + }, + "wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npm.taobao.org/wrappy/download/wrappy-1.0.2.tgz", + "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=", + "dev": true + }, + "write": { + "version": "1.0.3", + "resolved": "https://registry.npm.taobao.org/write/download/write-1.0.3.tgz", + "integrity": "sha1-CADhRSO5I6OH5BUSPIZWFqrg9cM=", + "dev": true, + "requires": { + "mkdirp": "^0.5.1" + } + }, + "ws": { + "version": "6.2.1", + "resolved": "https://registry.npm.taobao.org/ws/download/ws-6.2.1.tgz?cache=0&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fws%2Fdownload%2Fws-6.2.1.tgz", + "integrity": "sha1-RC/fCkftZPWbal2P8TD0dI7VJPs=", + "dev": true, + "requires": { + "async-limiter": "~1.0.0" + } + }, + "xlsx": { + "version": "0.16.9", + "resolved": "https://registry.npm.taobao.org/xlsx/download/xlsx-0.16.9.tgz?cache=0&sync_timestamp=1605857177269&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fxlsx%2Fdownload%2Fxlsx-0.16.9.tgz", + "integrity": "sha1-2s1btGvabdN0OUDJw9weIXGCYlY=", + "requires": { + "adler-32": "~1.2.0", + "cfb": "^1.1.4", + "codepage": "~1.14.0", + "commander": "~2.17.1", + "crc-32": "~1.2.0", + "exit-on-epipe": "~1.0.1", + "fflate": "^0.3.8", + "ssf": "~0.11.2", + "wmf": "~1.0.1", + "word": "~0.3.0" + }, + "dependencies": { + "commander": { + "version": "2.17.1", + "resolved": "https://registry.npm.taobao.org/commander/download/commander-2.17.1.tgz?cache=0&sync_timestamp=1605992767704&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fcommander%2Fdownload%2Fcommander-2.17.1.tgz", + "integrity": "sha1-vXerfebelCBc6sxy8XFtKfIKd78=" + } + } + }, + "xtend": { + "version": "4.0.2", + "resolved": "https://registry.npm.taobao.org/xtend/download/xtend-4.0.2.tgz", + "integrity": "sha1-u3J3n1+kZRhrH0OPZ0+jR/2121Q=", + "dev": true + }, + "y18n": { + "version": "4.0.0", + "resolved": "https://registry.npm.taobao.org/y18n/download/y18n-4.0.0.tgz", + "integrity": "sha1-le+U+F7MgdAHwmThkKEg8KPIVms=", + "dev": true + }, + "yallist": { + "version": "3.1.1", + "resolved": "https://registry.npm.taobao.org/yallist/download/yallist-3.1.1.tgz", + "integrity": "sha1-27fa+b/YusmrRev2ArjLrQ1dCP0=", + "dev": true + }, + "yargs": { + "version": "15.3.1", + "resolved": "https://registry.npm.taobao.org/yargs/download/yargs-15.3.1.tgz", + "integrity": "sha1-lQW0cnY5Y+VK/mAUitJ6MwgY6Ys=", + "dev": true, + "requires": { + "cliui": "^6.0.0", + "decamelize": "^1.2.0", + "find-up": "^4.1.0", + "get-caller-file": "^2.0.1", + "require-directory": "^2.1.1", + "require-main-filename": "^2.0.0", + "set-blocking": "^2.0.0", + "string-width": "^4.2.0", + "which-module": "^2.0.0", + "y18n": "^4.0.0", + "yargs-parser": "^18.1.1" + }, + "dependencies": { + "find-up": { + "version": "4.1.0", + "resolved": "https://registry.npm.taobao.org/find-up/download/find-up-4.1.0.tgz", + "integrity": "sha1-l6/n1s3AvFkoWEt8jXsW6KmqXRk=", + "dev": true, + "requires": { + "locate-path": "^5.0.0", + "path-exists": "^4.0.0" + } + }, + "is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npm.taobao.org/is-fullwidth-code-point/download/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha1-8Rb4Bk/pCz94RKOJl8C3UFEmnx0=", + "dev": true + }, + "locate-path": { + "version": "5.0.0", + "resolved": "https://registry.npm.taobao.org/locate-path/download/locate-path-5.0.0.tgz", + "integrity": "sha1-Gvujlq/WdqbUJQTQpno6frn2KqA=", + "dev": true, + "requires": { + "p-locate": "^4.1.0" + } + }, + "p-locate": { + "version": "4.1.0", + "resolved": "https://registry.npm.taobao.org/p-locate/download/p-locate-4.1.0.tgz", + "integrity": "sha1-o0KLtwiLOmApL2aRkni3wpetTwc=", + "dev": true, + "requires": { + "p-limit": "^2.2.0" + } + }, + "path-exists": { + "version": "4.0.0", + "resolved": "https://registry.npm.taobao.org/path-exists/download/path-exists-4.0.0.tgz", + "integrity": "sha1-UTvb4tO5XXdi6METfvoZXGxhtbM=", + "dev": true + }, + "string-width": { + "version": "4.2.0", + "resolved": "https://registry.npm.taobao.org/string-width/download/string-width-4.2.0.tgz", + "integrity": "sha1-lSGCxGzHssMT0VluYjmSvRY7crU=", + "dev": true, + "requires": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.0" + } + } + } + }, + "yargs-parser": { + "version": "18.1.1", + "resolved": "https://registry.npm.taobao.org/yargs-parser/download/yargs-parser-18.1.1.tgz?cache=0&sync_timestamp=1584342997286&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fyargs-parser%2Fdownload%2Fyargs-parser-18.1.1.tgz", + "integrity": "sha1-v3QHuRVCf8dg/LvMxsgrTw/8vTc=", + "dev": true, + "requires": { + "camelcase": "^5.0.0", + "decamelize": "^1.2.0" + } + }, + "yorkie": { + "version": "2.0.0", + "resolved": "https://registry.npm.taobao.org/yorkie/download/yorkie-2.0.0.tgz", + "integrity": "sha1-kkEZEtQ1IU4SxRwq4Qk+VLa7g9k=", + "dev": true, + "requires": { + "execa": "^0.8.0", + "is-ci": "^1.0.10", + "normalize-path": "^1.0.0", + "strip-indent": "^2.0.0" + }, + "dependencies": { + "cross-spawn": { + "version": "5.1.0", + "resolved": "https://registry.npm.taobao.org/cross-spawn/download/cross-spawn-5.1.0.tgz", + "integrity": "sha1-6L0O/uWPz/b4+UUQoKVUu/ojVEk=", + "dev": true, + "requires": { + "lru-cache": "^4.0.1", + "shebang-command": "^1.2.0", + "which": "^1.2.9" + } + }, + "execa": { + "version": "0.8.0", + "resolved": "https://registry.npm.taobao.org/execa/download/execa-0.8.0.tgz?cache=0&sync_timestamp=1576749001049&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fexeca%2Fdownload%2Fexeca-0.8.0.tgz", + "integrity": "sha1-2NdrvBtVIX7RkP1t1J08d07PyNo=", + "dev": true, + "requires": { + "cross-spawn": "^5.0.1", + "get-stream": "^3.0.0", + "is-stream": "^1.1.0", + "npm-run-path": "^2.0.0", + "p-finally": "^1.0.0", + "signal-exit": "^3.0.0", + "strip-eof": "^1.0.0" + } + }, + "get-stream": { + "version": "3.0.0", + "resolved": "https://registry.npm.taobao.org/get-stream/download/get-stream-3.0.0.tgz", + "integrity": "sha1-jpQ9E1jcN1VQVOy+LtsFqhdO3hQ=", + "dev": true + }, + "lru-cache": { + "version": "4.1.5", + "resolved": "https://registry.npm.taobao.org/lru-cache/download/lru-cache-4.1.5.tgz", + "integrity": "sha1-i75Q6oW+1ZvJ4z3KuCNe6bz0Q80=", + "dev": true, + "requires": { + "pseudomap": "^1.0.2", + "yallist": "^2.1.2" + } + }, + "normalize-path": { + "version": "1.0.0", + "resolved": "https://registry.npm.taobao.org/normalize-path/download/normalize-path-1.0.0.tgz", + "integrity": "sha1-MtDkcvkf80VwHBWoMRAY07CpA3k=", + "dev": true + }, + "yallist": { + "version": "2.1.2", + "resolved": "https://registry.npm.taobao.org/yallist/download/yallist-2.1.2.tgz", + "integrity": "sha1-HBH5IY8HYImkfdUS+TxmmaaoHVI=", + "dev": true + } + } + }, + "zrender": { + "version": "4.3.2", + "resolved": "https://registry.npm.taobao.org/zrender/download/zrender-4.3.2.tgz?cache=0&sync_timestamp=1605884445437&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fzrender%2Fdownload%2Fzrender-4.3.2.tgz", + "integrity": "sha1-7HQy+UFcgsc1hLa3uMR+GwFiCcY=" + } + } +} diff --git "a/1\343\200\201\345\220\210\345\220\214\347\263\273\347\273\237/contract-accounting-system-master/web\345\211\215\347\253\257/package.json" "b/1\343\200\201\345\220\210\345\220\214\347\263\273\347\273\237/contract-accounting-system-master/web\345\211\215\347\253\257/package.json" new file mode 100644 index 0000000..278ad4c --- /dev/null +++ "b/1\343\200\201\345\220\210\345\220\214\347\263\273\347\273\237/contract-accounting-system-master/web\345\211\215\347\253\257/package.json" @@ -0,0 +1,56 @@ +{ + "name": "myweb", + "version": "0.1.0", + "private": true, + "scripts": { + "serve": "vue-cli-service serve", + "build": "vue-cli-service build", + "lint": "vue-cli-service lint" + }, + "dependencies": { + "core-js": "^3.6.4", + "element-ui": "^2.4.5", + "file-saver": "^2.0.5", + "install": "^0.13.0", + "npm": "^6.14.4", + "script-loader": "^0.7.2", + "vue": "^2.6.11", + "vue-print-nb": "^1.5.0", + "vue-router": "^3.1.5", + "vuex": "^3.1.2", + "xlsx": "^0.16.9" + }, + "devDependencies": { + "@vue/cli-plugin-babel": "~4.2.0", + "@vue/cli-plugin-eslint": "~4.2.0", + "@vue/cli-plugin-router": "~4.2.0", + "@vue/cli-plugin-vuex": "~4.2.0", + "@vue/cli-service": "~4.2.0", + "axios": "^0.19.2", + "babel-eslint": "^10.0.3", + "eslint": "^6.7.2", + "eslint-plugin-vue": "^6.1.2", + "less": "^3.11.1", + "less-loader": "^5.0.0", + "vue-cli-plugin-element": "^1.0.1", + "vue-template-compiler": "^2.6.11" + }, + "eslintConfig": { + "root": true, + "env": { + "node": true + }, + "extends": [ + "plugin:vue/essential", + "eslint:recommended" + ], + "parserOptions": { + "parser": "babel-eslint" + }, + "rules": {} + }, + "browserslist": [ + "> 1%", + "last 2 versions" + ] +} diff --git "a/1\343\200\201\345\220\210\345\220\214\347\263\273\347\273\237/contract-accounting-system-master/web\345\211\215\347\253\257/public/favicon.ico" "b/1\343\200\201\345\220\210\345\220\214\347\263\273\347\273\237/contract-accounting-system-master/web\345\211\215\347\253\257/public/favicon.ico" new file mode 100644 index 0000000..df36fcf Binary files /dev/null and "b/1\343\200\201\345\220\210\345\220\214\347\263\273\347\273\237/contract-accounting-system-master/web\345\211\215\347\253\257/public/favicon.ico" differ diff --git "a/1\343\200\201\345\220\210\345\220\214\347\263\273\347\273\237/contract-accounting-system-master/web\345\211\215\347\253\257/public/index.html" "b/1\343\200\201\345\220\210\345\220\214\347\263\273\347\273\237/contract-accounting-system-master/web\345\211\215\347\253\257/public/index.html" new file mode 100644 index 0000000..c7e1778 --- /dev/null +++ "b/1\343\200\201\345\220\210\345\220\214\347\263\273\347\273\237/contract-accounting-system-master/web\345\211\215\347\253\257/public/index.html" @@ -0,0 +1,18 @@ + + + + + + + + 水滴合同报销管理系统 + + + + +
+ + + diff --git "a/1\343\200\201\345\220\210\345\220\214\347\263\273\347\273\237/contract-accounting-system-master/web\345\211\215\347\253\257/public/logo.png" "b/1\343\200\201\345\220\210\345\220\214\347\263\273\347\273\237/contract-accounting-system-master/web\345\211\215\347\253\257/public/logo.png" new file mode 100644 index 0000000..e63a617 Binary files /dev/null and "b/1\343\200\201\345\220\210\345\220\214\347\263\273\347\273\237/contract-accounting-system-master/web\345\211\215\347\253\257/public/logo.png" differ diff --git "a/1\343\200\201\345\220\210\345\220\214\347\263\273\347\273\237/contract-accounting-system-master/web\345\211\215\347\253\257/src/App.vue" "b/1\343\200\201\345\220\210\345\220\214\347\263\273\347\273\237/contract-accounting-system-master/web\345\211\215\347\253\257/src/App.vue" new file mode 100644 index 0000000..6682501 --- /dev/null +++ "b/1\343\200\201\345\220\210\345\220\214\347\263\273\347\273\237/contract-accounting-system-master/web\345\211\215\347\253\257/src/App.vue" @@ -0,0 +1,28 @@ + + + + + diff --git "a/1\343\200\201\345\220\210\345\220\214\347\263\273\347\273\237/contract-accounting-system-master/web\345\211\215\347\253\257/src/assets/css/global.css" "b/1\343\200\201\345\220\210\345\220\214\347\263\273\347\273\237/contract-accounting-system-master/web\345\211\215\347\253\257/src/assets/css/global.css" new file mode 100644 index 0000000..574d7ba --- /dev/null +++ "b/1\343\200\201\345\220\210\345\220\214\347\263\273\347\273\237/contract-accounting-system-master/web\345\211\215\347\253\257/src/assets/css/global.css" @@ -0,0 +1,13 @@ +html,body,#app{ + height: 100%; + margin: 0; + padding: 0; + font-family: "PingFang SC","Helvetica Neue", "Helvetica", "Hiragino Sans GB", "Microsoft YaHei", "微软雅黑", Arial, sans-serif; +} +.el-breadcrumb{ + margin-bottom: 15px; + font-size: 16px; +} +.el-card{ + box-shadow: 0 1px 1px rgba(0,0,0,0.15)!important; +} diff --git "a/1\343\200\201\345\220\210\345\220\214\347\263\273\347\273\237/contract-accounting-system-master/web\345\211\215\347\253\257/src/assets/leishen.jpg" "b/1\343\200\201\345\220\210\345\220\214\347\263\273\347\273\237/contract-accounting-system-master/web\345\211\215\347\253\257/src/assets/leishen.jpg" new file mode 100644 index 0000000..ffd4c99 Binary files /dev/null and "b/1\343\200\201\345\220\210\345\220\214\347\263\273\347\273\237/contract-accounting-system-master/web\345\211\215\347\253\257/src/assets/leishen.jpg" differ diff --git "a/1\343\200\201\345\220\210\345\220\214\347\263\273\347\273\237/contract-accounting-system-master/web\345\211\215\347\253\257/src/assets/leishen.png" "b/1\343\200\201\345\220\210\345\220\214\347\263\273\347\273\237/contract-accounting-system-master/web\345\211\215\347\253\257/src/assets/leishen.png" new file mode 100644 index 0000000..ffd4c99 Binary files /dev/null and "b/1\343\200\201\345\220\210\345\220\214\347\263\273\347\273\237/contract-accounting-system-master/web\345\211\215\347\253\257/src/assets/leishen.png" differ diff --git "a/1\343\200\201\345\220\210\345\220\214\347\263\273\347\273\237/contract-accounting-system-master/web\345\211\215\347\253\257/src/assets/logo.png" "b/1\343\200\201\345\220\210\345\220\214\347\263\273\347\273\237/contract-accounting-system-master/web\345\211\215\347\253\257/src/assets/logo.png" new file mode 100644 index 0000000..e63a617 Binary files /dev/null and "b/1\343\200\201\345\220\210\345\220\214\347\263\273\347\273\237/contract-accounting-system-master/web\345\211\215\347\253\257/src/assets/logo.png" differ diff --git "a/1\343\200\201\345\220\210\345\220\214\347\263\273\347\273\237/contract-accounting-system-master/web\345\211\215\347\253\257/src/assets/vue.png" "b/1\343\200\201\345\220\210\345\220\214\347\263\273\347\273\237/contract-accounting-system-master/web\345\211\215\347\253\257/src/assets/vue.png" new file mode 100644 index 0000000..f3d2503 Binary files /dev/null and "b/1\343\200\201\345\220\210\345\220\214\347\263\273\347\273\237/contract-accounting-system-master/web\345\211\215\347\253\257/src/assets/vue.png" differ diff --git "a/1\343\200\201\345\220\210\345\220\214\347\263\273\347\273\237/contract-accounting-system-master/web\345\211\215\347\253\257/src/components/HelloWorld.vue" "b/1\343\200\201\345\220\210\345\220\214\347\263\273\347\273\237/contract-accounting-system-master/web\345\211\215\347\253\257/src/components/HelloWorld.vue" new file mode 100644 index 0000000..1c544cb --- /dev/null +++ "b/1\343\200\201\345\220\210\345\220\214\347\263\273\347\273\237/contract-accounting-system-master/web\345\211\215\347\253\257/src/components/HelloWorld.vue" @@ -0,0 +1,60 @@ + + + + + + diff --git "a/1\343\200\201\345\220\210\345\220\214\347\263\273\347\273\237/contract-accounting-system-master/web\345\211\215\347\253\257/src/components/Project.vue" "b/1\343\200\201\345\220\210\345\220\214\347\263\273\347\273\237/contract-accounting-system-master/web\345\211\215\347\253\257/src/components/Project.vue" new file mode 100644 index 0000000..8505bcd --- /dev/null +++ "b/1\343\200\201\345\220\210\345\220\214\347\263\273\347\273\237/contract-accounting-system-master/web\345\211\215\347\253\257/src/components/Project.vue" @@ -0,0 +1,381 @@ + + + + + diff --git "a/1\343\200\201\345\220\210\345\220\214\347\263\273\347\273\237/contract-accounting-system-master/web\345\211\215\347\253\257/src/components/baoxiaochaxun.vue" "b/1\343\200\201\345\220\210\345\220\214\347\263\273\347\273\237/contract-accounting-system-master/web\345\211\215\347\253\257/src/components/baoxiaochaxun.vue" new file mode 100644 index 0000000..c874842 --- /dev/null +++ "b/1\343\200\201\345\220\210\345\220\214\347\263\273\347\273\237/contract-accounting-system-master/web\345\211\215\347\253\257/src/components/baoxiaochaxun.vue" @@ -0,0 +1,439 @@ + + + + + diff --git "a/1\343\200\201\345\220\210\345\220\214\347\263\273\347\273\237/contract-accounting-system-master/web\345\211\215\347\253\257/src/components/baoxiaoshenpi.vue" "b/1\343\200\201\345\220\210\345\220\214\347\263\273\347\273\237/contract-accounting-system-master/web\345\211\215\347\253\257/src/components/baoxiaoshenpi.vue" new file mode 100644 index 0000000..e4bbafa --- /dev/null +++ "b/1\343\200\201\345\220\210\345\220\214\347\263\273\347\273\237/contract-accounting-system-master/web\345\211\215\347\253\257/src/components/baoxiaoshenpi.vue" @@ -0,0 +1,1027 @@ + + + + + diff --git "a/1\343\200\201\345\220\210\345\220\214\347\263\273\347\273\237/contract-accounting-system-master/web\345\211\215\347\253\257/src/components/caigouhetong.vue" "b/1\343\200\201\345\220\210\345\220\214\347\263\273\347\273\237/contract-accounting-system-master/web\345\211\215\347\253\257/src/components/caigouhetong.vue" new file mode 100644 index 0000000..580cd6a --- /dev/null +++ "b/1\343\200\201\345\220\210\345\220\214\347\263\273\347\273\237/contract-accounting-system-master/web\345\211\215\347\253\257/src/components/caigouhetong.vue" @@ -0,0 +1,82 @@ + + + + + diff --git "a/1\343\200\201\345\220\210\345\220\214\347\263\273\347\273\237/contract-accounting-system-master/web\345\211\215\347\253\257/src/components/contian.vue" "b/1\343\200\201\345\220\210\345\220\214\347\263\273\347\273\237/contract-accounting-system-master/web\345\211\215\347\253\257/src/components/contian.vue" new file mode 100644 index 0000000..5540d76 --- /dev/null +++ "b/1\343\200\201\345\220\210\345\220\214\347\263\273\347\273\237/contract-accounting-system-master/web\345\211\215\347\253\257/src/components/contian.vue" @@ -0,0 +1,31 @@ + + + + + diff --git "a/1\343\200\201\345\220\210\345\220\214\347\263\273\347\273\237/contract-accounting-system-master/web\345\211\215\347\253\257/src/components/department.vue" "b/1\343\200\201\345\220\210\345\220\214\347\263\273\347\273\237/contract-accounting-system-master/web\345\211\215\347\253\257/src/components/department.vue" new file mode 100644 index 0000000..062a5f2 --- /dev/null +++ "b/1\343\200\201\345\220\210\345\220\214\347\263\273\347\273\237/contract-accounting-system-master/web\345\211\215\347\253\257/src/components/department.vue" @@ -0,0 +1,214 @@ + + + + + diff --git "a/1\343\200\201\345\220\210\345\220\214\347\263\273\347\273\237/contract-accounting-system-master/web\345\211\215\347\253\257/src/components/entityInfo.vue" "b/1\343\200\201\345\220\210\345\220\214\347\263\273\347\273\237/contract-accounting-system-master/web\345\211\215\347\253\257/src/components/entityInfo.vue" new file mode 100644 index 0000000..435092f --- /dev/null +++ "b/1\343\200\201\345\220\210\345\220\214\347\263\273\347\273\237/contract-accounting-system-master/web\345\211\215\347\253\257/src/components/entityInfo.vue" @@ -0,0 +1,260 @@ + + + + + diff --git "a/1\343\200\201\345\220\210\345\220\214\347\263\273\347\273\237/contract-accounting-system-master/web\345\211\215\347\253\257/src/components/home.vue" "b/1\343\200\201\345\220\210\345\220\214\347\263\273\347\273\237/contract-accounting-system-master/web\345\211\215\347\253\257/src/components/home.vue" new file mode 100644 index 0000000..7f6425b --- /dev/null +++ "b/1\343\200\201\345\220\210\345\220\214\347\263\273\347\273\237/contract-accounting-system-master/web\345\211\215\347\253\257/src/components/home.vue" @@ -0,0 +1,441 @@ + + + + + diff --git "a/1\343\200\201\345\220\210\345\220\214\347\263\273\347\273\237/contract-accounting-system-master/web\345\211\215\347\253\257/src/components/register.vue" "b/1\343\200\201\345\220\210\345\220\214\347\263\273\347\273\237/contract-accounting-system-master/web\345\211\215\347\253\257/src/components/register.vue" new file mode 100644 index 0000000..ac1eff6 --- /dev/null +++ "b/1\343\200\201\345\220\210\345\220\214\347\263\273\347\273\237/contract-accounting-system-master/web\345\211\215\347\253\257/src/components/register.vue" @@ -0,0 +1,119 @@ + + + + + diff --git "a/1\343\200\201\345\220\210\345\220\214\347\263\273\347\273\237/contract-accounting-system-master/web\345\211\215\347\253\257/src/components/reimbursement.vue" "b/1\343\200\201\345\220\210\345\220\214\347\263\273\347\273\237/contract-accounting-system-master/web\345\211\215\347\253\257/src/components/reimbursement.vue" new file mode 100644 index 0000000..af5f3df --- /dev/null +++ "b/1\343\200\201\345\220\210\345\220\214\347\263\273\347\273\237/contract-accounting-system-master/web\345\211\215\347\253\257/src/components/reimbursement.vue" @@ -0,0 +1,864 @@ + + + + + diff --git "a/1\343\200\201\345\220\210\345\220\214\347\263\273\347\273\237/contract-accounting-system-master/web\345\211\215\347\253\257/src/components/text.vue" "b/1\343\200\201\345\220\210\345\220\214\347\263\273\347\273\237/contract-accounting-system-master/web\345\211\215\347\253\257/src/components/text.vue" new file mode 100644 index 0000000..df14e84 --- /dev/null +++ "b/1\343\200\201\345\220\210\345\220\214\347\263\273\347\273\237/contract-accounting-system-master/web\345\211\215\347\253\257/src/components/text.vue" @@ -0,0 +1,20 @@ + + + + + diff --git "a/1\343\200\201\345\220\210\345\220\214\347\263\273\347\273\237/contract-accounting-system-master/web\345\211\215\347\253\257/src/components/web2020.vue" "b/1\343\200\201\345\220\210\345\220\214\347\263\273\347\273\237/contract-accounting-system-master/web\345\211\215\347\253\257/src/components/web2020.vue" new file mode 100644 index 0000000..a9b38dd --- /dev/null +++ "b/1\343\200\201\345\220\210\345\220\214\347\263\273\347\273\237/contract-accounting-system-master/web\345\211\215\347\253\257/src/components/web2020.vue" @@ -0,0 +1,179 @@ + + + + + diff --git "a/1\343\200\201\345\220\210\345\220\214\347\263\273\347\273\237/contract-accounting-system-master/web\345\211\215\347\253\257/src/components/welcome.vue" "b/1\343\200\201\345\220\210\345\220\214\347\263\273\347\273\237/contract-accounting-system-master/web\345\211\215\347\253\257/src/components/welcome.vue" new file mode 100644 index 0000000..ce74331 --- /dev/null +++ "b/1\343\200\201\345\220\210\345\220\214\347\263\273\347\273\237/contract-accounting-system-master/web\345\211\215\347\253\257/src/components/welcome.vue" @@ -0,0 +1,15 @@ + + + + + diff --git "a/1\343\200\201\345\220\210\345\220\214\347\263\273\347\273\237/contract-accounting-system-master/web\345\211\215\347\253\257/src/components/xiangmuhetong.vue" "b/1\343\200\201\345\220\210\345\220\214\347\263\273\347\273\237/contract-accounting-system-master/web\345\211\215\347\253\257/src/components/xiangmuhetong.vue" new file mode 100644 index 0000000..c1420f3 --- /dev/null +++ "b/1\343\200\201\345\220\210\345\220\214\347\263\273\347\273\237/contract-accounting-system-master/web\345\211\215\347\253\257/src/components/xiangmuhetong.vue" @@ -0,0 +1,1206 @@ + + + + + diff --git "a/1\343\200\201\345\220\210\345\220\214\347\263\273\347\273\237/contract-accounting-system-master/web\345\211\215\347\253\257/src/components/yonghuxinxi.vue" "b/1\343\200\201\345\220\210\345\220\214\347\263\273\347\273\237/contract-accounting-system-master/web\345\211\215\347\253\257/src/components/yonghuxinxi.vue" new file mode 100644 index 0000000..9b3c61b --- /dev/null +++ "b/1\343\200\201\345\220\210\345\220\214\347\263\273\347\273\237/contract-accounting-system-master/web\345\211\215\347\253\257/src/components/yonghuxinxi.vue" @@ -0,0 +1,381 @@ + + + + + diff --git "a/1\343\200\201\345\220\210\345\220\214\347\263\273\347\273\237/contract-accounting-system-master/web\345\211\215\347\253\257/src/components/zonghechaxun.vue" "b/1\343\200\201\345\220\210\345\220\214\347\263\273\347\273\237/contract-accounting-system-master/web\345\211\215\347\253\257/src/components/zonghechaxun.vue" new file mode 100644 index 0000000..31134c2 --- /dev/null +++ "b/1\343\200\201\345\220\210\345\220\214\347\263\273\347\273\237/contract-accounting-system-master/web\345\211\215\347\253\257/src/components/zonghechaxun.vue" @@ -0,0 +1,486 @@ + + + + + diff --git "a/1\343\200\201\345\220\210\345\220\214\347\263\273\347\273\237/contract-accounting-system-master/web\345\211\215\347\253\257/src/excel/Blob.js" "b/1\343\200\201\345\220\210\345\220\214\347\263\273\347\273\237/contract-accounting-system-master/web\345\211\215\347\253\257/src/excel/Blob.js" new file mode 100644 index 0000000..26382cc --- /dev/null +++ "b/1\343\200\201\345\220\210\345\220\214\347\263\273\347\273\237/contract-accounting-system-master/web\345\211\215\347\253\257/src/excel/Blob.js" @@ -0,0 +1,179 @@ +/* eslint-disable */ +/* Blob.js + * A Blob implementation. + * 2014-05-27 + * + * By Eli Grey, http://eligrey.com + * By Devin Samarin, https://github.com/eboyjr + * License: X11/MIT + * See LICENSE.md + */ + +/*global self, unescape */ +/*jslint bitwise: true, regexp: true, confusion: true, es5: true, vars: true, white: true, + plusplus: true */ + +/*! @source http://purl.eligrey.com/github/Blob.js/blob/master/Blob.js */ + +(function (view) { + "use strict"; + + view.URL = view.URL || view.webkitURL; + + if (view.Blob && view.URL) { + try { + new Blob; + return; + } catch (e) {} + } + + // Internally we use a BlobBuilder implementation to base Blob off of + // in order to support older browsers that only have BlobBuilder + var BlobBuilder = view.BlobBuilder || view.WebKitBlobBuilder || view.MozBlobBuilder || (function(view) { + var + get_class = function(object) { + return Object.prototype.toString.call(object).match(/^\[object\s(.*)\]$/)[1]; + } + , FakeBlobBuilder = function BlobBuilder() { + this.data = []; + } + , FakeBlob = function Blob(data, type, encoding) { + this.data = data; + this.size = data.length; + this.type = type; + this.encoding = encoding; + } + , FBB_proto = FakeBlobBuilder.prototype + , FB_proto = FakeBlob.prototype + , FileReaderSync = view.FileReaderSync + , FileException = function(type) { + this.code = this[this.name = type]; + } + , file_ex_codes = ( + "NOT_FOUND_ERR SECURITY_ERR ABORT_ERR NOT_READABLE_ERR ENCODING_ERR " + + "NO_MODIFICATION_ALLOWED_ERR INVALID_STATE_ERR SYNTAX_ERR" + ).split(" ") + , file_ex_code = file_ex_codes.length + , real_URL = view.URL || view.webkitURL || view + , real_create_object_URL = real_URL.createObjectURL + , real_revoke_object_URL = real_URL.revokeObjectURL + , URL = real_URL + , btoa = view.btoa + , atob = view.atob + + , ArrayBuffer = view.ArrayBuffer + , Uint8Array = view.Uint8Array + ; + FakeBlob.fake = FB_proto.fake = true; + while (file_ex_code--) { + FileException.prototype[file_ex_codes[file_ex_code]] = file_ex_code + 1; + } + if (!real_URL.createObjectURL) { + URL = view.URL = {}; + } + URL.createObjectURL = function(blob) { + var + type = blob.type + , data_URI_header + ; + if (type === null) { + type = "application/octet-stream"; + } + if (blob instanceof FakeBlob) { + data_URI_header = "data:" + type; + if (blob.encoding === "base64") { + return data_URI_header + ";base64," + blob.data; + } else if (blob.encoding === "URI") { + return data_URI_header + "," + decodeURIComponent(blob.data); + } if (btoa) { + return data_URI_header + ";base64," + btoa(blob.data); + } else { + return data_URI_header + "," + encodeURIComponent(blob.data); + } + } else if (real_create_object_URL) { + return real_create_object_URL.call(real_URL, blob); + } + }; + URL.revokeObjectURL = function(object_URL) { + if (object_URL.substring(0, 5) !== "data:" && real_revoke_object_URL) { + real_revoke_object_URL.call(real_URL, object_URL); + } + }; + FBB_proto.append = function(data/*, endings*/) { + var bb = this.data; + // decode data to a binary string + if (Uint8Array && (data instanceof ArrayBuffer || data instanceof Uint8Array)) { + var + str = "" + , buf = new Uint8Array(data) + , i = 0 + , buf_len = buf.length + ; + for (; i < buf_len; i++) { + str += String.fromCharCode(buf[i]); + } + bb.push(str); + } else if (get_class(data) === "Blob" || get_class(data) === "File") { + if (FileReaderSync) { + var fr = new FileReaderSync; + bb.push(fr.readAsBinaryString(data)); + } else { + // async FileReader won't work as BlobBuilder is sync + throw new FileException("NOT_READABLE_ERR"); + } + } else if (data instanceof FakeBlob) { + if (data.encoding === "base64" && atob) { + bb.push(atob(data.data)); + } else if (data.encoding === "URI") { + bb.push(decodeURIComponent(data.data)); + } else if (data.encoding === "raw") { + bb.push(data.data); + } + } else { + if (typeof data !== "string") { + data += ""; // convert unsupported types to strings + } + // decode UTF-16 to binary string + bb.push(unescape(encodeURIComponent(data))); + } + }; + FBB_proto.getBlob = function(type) { + if (!arguments.length) { + type = null; + } + return new FakeBlob(this.data.join(""), type, "raw"); + }; + FBB_proto.toString = function() { + return "[object BlobBuilder]"; + }; + FB_proto.slice = function(start, end, type) { + var args = arguments.length; + if (args < 3) { + type = null; + } + return new FakeBlob( + this.data.slice(start, args > 1 ? end : this.data.length) + , type + , this.encoding + ); + }; + FB_proto.toString = function() { + return "[object Blob]"; + }; + FB_proto.close = function() { + this.size = this.data.length = 0; + }; + return FakeBlobBuilder; + }(view)); + + view.Blob = function Blob(blobParts, options) { + var type = options ? (options.type || "") : ""; + var builder = new BlobBuilder(); + if (blobParts) { + for (var i = 0, len = blobParts.length; i < len; i++) { + builder.append(blobParts[i]); + } + } + return builder.getBlob(type); + }; +}(typeof self !== "undefined" && self || typeof window !== "undefined" && window || this.content || this)); diff --git "a/1\343\200\201\345\220\210\345\220\214\347\263\273\347\273\237/contract-accounting-system-master/web\345\211\215\347\253\257/src/excel/Export2Excel.js" "b/1\343\200\201\345\220\210\345\220\214\347\263\273\347\273\237/contract-accounting-system-master/web\345\211\215\347\253\257/src/excel/Export2Excel.js" new file mode 100644 index 0000000..8fd3c16 --- /dev/null +++ "b/1\343\200\201\345\220\210\345\220\214\347\263\273\347\273\237/contract-accounting-system-master/web\345\211\215\347\253\257/src/excel/Export2Excel.js" @@ -0,0 +1,142 @@ +/* eslint-disable */ +require('script-loader!file-saver'); +// require('script-loader!@/Excel/Blob'); +require('./Blob'); +require('script-loader!xlsx/dist/xlsx.core.min'); +function generateArray(table) { + var out = []; + var rows = table.querySelectorAll('tr'); + var ranges = []; + for (var R = 0; R < rows.length; ++R) { + var outRow = []; + var row = rows[R]; + var columns = row.querySelectorAll('td'); + for (var C = 0; C < columns.length; ++C) { + var cell = columns[C]; + var colspan = cell.getAttribute('colspan'); + var rowspan = cell.getAttribute('rowspan'); + var cellValue = cell.innerText; + if (cellValue !== "" && cellValue == +cellValue) cellValue = +cellValue; + + //Skip ranges + ranges.forEach(function (range) { + if (R >= range.s.r && R <= range.e.r && outRow.length >= range.s.c && outRow.length <= range.e.c) { + for (var i = 0; i <= range.e.c - range.s.c; ++i) outRow.push(null); + } + }); + + //Handle Row Span + if (rowspan || colspan) { + rowspan = rowspan || 1; + colspan = colspan || 1; + ranges.push({s: {r: R, c: outRow.length}, e: {r: R + rowspan - 1, c: outRow.length + colspan - 1}}); + } + ; + + //Handle Value + outRow.push(cellValue !== "" ? cellValue : null); + + //Handle Colspan + if (colspan) for (var k = 0; k < colspan - 1; ++k) outRow.push(null); + } + out.push(outRow); + } + return [out, ranges]; +}; + +function datenum(v, date1904) { + if (date1904) v += 1462; + var epoch = Date.parse(v); + return (epoch - new Date(Date.UTC(1899, 11, 30))) / (24 * 60 * 60 * 1000); +} + +function sheet_from_array_of_arrays(data, opts) { + var ws = {}; + var range = {s: {c: 10000000, r: 10000000}, e: {c: 0, r: 0}}; + for (var R = 0; R != data.length; ++R) { + for (var C = 0; C != data[R].length; ++C) { + if (range.s.r > R) range.s.r = R; + if (range.s.c > C) range.s.c = C; + if (range.e.r < R) range.e.r = R; + if (range.e.c < C) range.e.c = C; + var cell = {v: data[R][C]}; + if (cell.v == null) continue; + var cell_ref = XLSX.utils.encode_cell({c: C, r: R}); + + if (typeof cell.v === 'number') cell.t = 'n'; + else if (typeof cell.v === 'boolean') cell.t = 'b'; + else if (cell.v instanceof Date) { + cell.t = 'n'; + cell.z = XLSX.SSF._table[14]; + cell.v = datenum(cell.v); + } + else cell.t = 's'; + + ws[cell_ref] = cell; + } + } + if (range.s.c < 10000000) ws['!ref'] = XLSX.utils.encode_range(range); + return ws; +} + +function Workbook() { + if (!(this instanceof Workbook)) return new Workbook(); + this.SheetNames = []; + this.Sheets = {}; +} + +function s2ab(s) { + var buf = new ArrayBuffer(s.length); + var view = new Uint8Array(buf); + for (var i = 0; i != s.length; ++i) view[i] = s.charCodeAt(i) & 0xFF; + return buf; +} + +export function export_table_to_excel(id) { + var theTable = document.getElementById(id); + console.log('a') + var oo = generateArray(theTable); + var ranges = oo[1]; + + /* original data */ + var data = oo[0]; + var ws_name = "SheetJS"; + console.log(data); + + var wb = new Workbook(), ws = sheet_from_array_of_arrays(data); + + /* add ranges to worksheet */ + // ws['!cols'] = ['apple', 'banan']; + ws['!merges'] = ranges; + + /* add worksheet to workbook */ + wb.SheetNames.push(ws_name); + wb.Sheets[ws_name] = ws; + + var wbout = XLSX.write(wb, {bookType: 'xlsx', bookSST: false, type: 'binary'}); + + saveAs(new Blob([s2ab(wbout)], {type: "application/octet-stream"}), "test.xlsx") +} + +function formatJson(jsonData) { + console.log(jsonData) +} +export function export_json_to_excel(th, jsonData, defaultTitle) { + + /* original data */ + + var data = jsonData; + data.unshift(th); + var ws_name = "SheetJS"; + + var wb = new Workbook(), ws = sheet_from_array_of_arrays(data); + + + /* add worksheet to workbook */ + wb.SheetNames.push(ws_name); + wb.Sheets[ws_name] = ws; + + var wbout = XLSX.write(wb, {bookType: 'xlsx', bookSST: false, type: 'binary'}); + var title = defaultTitle || '列表' + saveAs(new Blob([s2ab(wbout)], {type: "application/octet-stream"}), title + ".xlsx") +} diff --git "a/1\343\200\201\345\220\210\345\220\214\347\263\273\347\273\237/contract-accounting-system-master/web\345\211\215\347\253\257/src/main.js" "b/1\343\200\201\345\220\210\345\220\214\347\263\273\347\273\237/contract-accounting-system-master/web\345\211\215\347\253\257/src/main.js" new file mode 100644 index 0000000..fe19ea0 --- /dev/null +++ "b/1\343\200\201\345\220\210\345\220\214\347\263\273\347\273\237/contract-accounting-system-master/web\345\211\215\347\253\257/src/main.js" @@ -0,0 +1,83 @@ +import Vue from 'vue' +import App from './App.vue' +import router from './router' +import store from './store' +import './plugins/element.js' +import './assets/css/global.css' +import axios from 'axios' +import qs from 'qs' +Vue.prototype.$qs = qs; +import Print from 'vue-print-nb' +Vue.use(Print) + +//配置请求 +axios.defaults.baseURL = '/api' +axios.interceptors.request.use(config => { + config.headers.Authorization = window.sessionStorage.getItem('token') + return config +}) + + + +axios.interceptors.response.use(response => { + return response +}, error => { + if (error.response) { + switch (error.response.status) { + + case 403: + if (error.response.data.detail === '用户认证失败!') { + localStorage.removeItem('token') + router.replace({ path: '/login' }) + return Promise.reject('用户验证失败,账号可能异地登录!'); + } + if(error.response.data.detail === 'You do not have permission to perform this action.'){ + return Promise.reject('你无权进行此操作!') + } + case 500: + return Promise.reject('服务器检测出操作错误,联系管理员!'); + case 550: + return Promise.reject('存在关联数据,不能删除'); + } + + } +}) +Vue.prototype.$http = axios +Vue.config.productionTip = false +// const service =axios.create( +// { +// baseURL:process.env.BASE_URL, +// timeout:5000 +// }) +// service.interceptors.request.use( +// config=>{ +// app.$vux.loading.show({ +// text:'数据加载中.....' +// }); +// config.method==='get' +// ? config.data = qs.stringfy({...config.data}) +// :config.params = {...config.params} +// config.headers.Authorization=window.sessionStorage.getItem('token') +// return config +// },error => { +// app.$vux.toast.show({ +// type:'warn', +// text:error +// }) +// } +// ) +new Vue({ + router, + store, + render: h => h(App) +}).$mount('#app') + +// const role = 'user' +// // 在进入一个页面前会触发 router.beforeEach 事件 +// router.beforeEach((to, from, next) => { +// if (to.meta.roles.includes(role)) { +// next() +// } else { +// next({path: '/404'}) +// } +// }) diff --git "a/1\343\200\201\345\220\210\345\220\214\347\263\273\347\273\237/contract-accounting-system-master/web\345\211\215\347\253\257/src/plugins/element.js" "b/1\343\200\201\345\220\210\345\220\214\347\263\273\347\273\237/contract-accounting-system-master/web\345\211\215\347\253\257/src/plugins/element.js" new file mode 100644 index 0000000..fbc4071 --- /dev/null +++ "b/1\343\200\201\345\220\210\345\220\214\347\263\273\347\273\237/contract-accounting-system-master/web\345\211\215\347\253\257/src/plugins/element.js" @@ -0,0 +1,6 @@ +import Vue from 'vue' +import Element from 'element-ui' +import 'element-ui/lib/theme-chalk/index.css' + +Vue.use(Element) + diff --git "a/1\343\200\201\345\220\210\345\220\214\347\263\273\347\273\237/contract-accounting-system-master/web\345\211\215\347\253\257/src/router/index.js" "b/1\343\200\201\345\220\210\345\220\214\347\263\273\347\273\237/contract-accounting-system-master/web\345\211\215\347\253\257/src/router/index.js" new file mode 100644 index 0000000..9dcd446 --- /dev/null +++ "b/1\343\200\201\345\220\210\345\220\214\347\263\273\347\273\237/contract-accounting-system-master/web\345\211\215\347\253\257/src/router/index.js" @@ -0,0 +1,104 @@ +import Vue from 'vue' +import VueRouter from 'vue-router' +// import Home from '../views/Home.vue' +import web2020 from '../components/web2020' +import home from '../components/home' +import welcome from '../components/welcome' +import yonghuxinxi from '../components/yonghuxinxi' +import department from '../components/department' +import entityInfo from '../components/entityInfo' +import Project from '../components/Project' +import reimbursement from '../components/reimbursement' +import baoxiaochaxun from '../components/baoxiaochaxun' +import baoxiaoshenpi from '../components/baoxiaoshenpi' +import zonghechaxun from '../components/zonghechaxun' +import xiangmuhetong from '../components/xiangmuhetong' +import caigouhetong from '../components/caigouhetong' +import register from '../components/register' + +// import contian from '../components/contian' + +Vue.use(VueRouter) + +const routes = [ + { + path: '/', redirect: '/login' + }, + { + path: '/register', + name:'register', + component:register + }, + // { + // path: 'yonghuxinxi', + // name: 'yonghuxinxi', + // meta: { + // roles: ['admin'] + // }, + // component: () => import('../components/yonghuxinxi.vue') + // }, + { + path: '/login', + name: 'web2020', + component: web2020 + }, + { + path: '/home', + name: 'home', + // route level code-splitting + // this generates a separate chunk (about.[hash].js) for this route + // which is lazy-loaded when the route is visited. + // component: () => import(/* webpackChunkName: "about" */ '../views/About.vue') + component: home, + // 页面路由 + redirect :'/welcome',children:[ + {path:'/welcome',component:welcome}, + {path:'/department',component:department}, + {path:'/yonghuxinxi',component:yonghuxinxi}, + {path:'/entityInfo',component:entityInfo}, + {path:'/Project',component:Project}, + {path:'/reimbursement',component:reimbursement}, + {path:'/baoxiaochaxun',component:baoxiaochaxun}, + {path:'/baoxiaoshenpi',component:baoxiaoshenpi}, + {path:'/zonghechaxun',component:zonghechaxun}, + {path:'/xiangmuhetong',component:xiangmuhetong}, + {path:'/caigouhetong',component:caigouhetong}, + ] + }, + // { + // path: '/contian', + // name: 'contian', + // // route level code-splitting + // // this generates a separate chunk (about.[hash].js) for this route + // // which is lazy-loaded when the route is visited. + // // component: () => import(/* webpackChunkName: "about" */ '../views/About.vue') + // component: contian, + // // 页面路由 + // redirect :'/welcome',children:[ + // {path:'/yonghuxinxi',component:yonghuxinxi} + // ] + // } +] + + +const router = new VueRouter({ + + mode: 'history', + base: process.env.BASE_URL, + routes, +}) +const originalPush = VueRouter.prototype.push +VueRouter.prototype.push = function push(location) { + return originalPush.call(this, location).catch(err => err) +} + +// 路由守卫 + router.beforeEach((to, from, next) => { + if (to.path === '/login'){ return next()} + if(to.path === '/register') { return next()} + const tokenStr=window.sessionStorage.getItem('token') + + if (!tokenStr) return next('/login') + next() +}) +export default router diff --git "a/1\343\200\201\345\220\210\345\220\214\347\263\273\347\273\237/contract-accounting-system-master/web\345\211\215\347\253\257/src/store/index.js" "b/1\343\200\201\345\220\210\345\220\214\347\263\273\347\273\237/contract-accounting-system-master/web\345\211\215\347\253\257/src/store/index.js" new file mode 100644 index 0000000..332b916 --- /dev/null +++ "b/1\343\200\201\345\220\210\345\220\214\347\263\273\347\273\237/contract-accounting-system-master/web\345\211\215\347\253\257/src/store/index.js" @@ -0,0 +1,15 @@ +import Vue from 'vue' +import Vuex from 'vuex' + +Vue.use(Vuex) + +export default new Vuex.Store({ + state: { + }, + mutations: { + }, + actions: { + }, + modules: { + } +}) diff --git "a/1\343\200\201\345\220\210\345\220\214\347\263\273\347\273\237/contract-accounting-system-master/web\345\211\215\347\253\257/src/views/About.vue" "b/1\343\200\201\345\220\210\345\220\214\347\263\273\347\273\237/contract-accounting-system-master/web\345\211\215\347\253\257/src/views/About.vue" new file mode 100644 index 0000000..3fa2807 --- /dev/null +++ "b/1\343\200\201\345\220\210\345\220\214\347\263\273\347\273\237/contract-accounting-system-master/web\345\211\215\347\253\257/src/views/About.vue" @@ -0,0 +1,5 @@ + diff --git "a/1\343\200\201\345\220\210\345\220\214\347\263\273\347\273\237/contract-accounting-system-master/web\345\211\215\347\253\257/src/views/Home.vue" "b/1\343\200\201\345\220\210\345\220\214\347\263\273\347\273\237/contract-accounting-system-master/web\345\211\215\347\253\257/src/views/Home.vue" new file mode 100644 index 0000000..8bd6c57 --- /dev/null +++ "b/1\343\200\201\345\220\210\345\220\214\347\263\273\347\273\237/contract-accounting-system-master/web\345\211\215\347\253\257/src/views/Home.vue" @@ -0,0 +1,18 @@ + + + diff --git "a/1\343\200\201\345\220\210\345\220\214\347\263\273\347\273\237/contract-accounting-system-master/web\345\211\215\347\253\257/src/views/global.css" "b/1\343\200\201\345\220\210\345\220\214\347\263\273\347\273\237/contract-accounting-system-master/web\345\211\215\347\253\257/src/views/global.css" new file mode 100644 index 0000000..0c4e0b7 --- /dev/null +++ "b/1\343\200\201\345\220\210\345\220\214\347\263\273\347\273\237/contract-accounting-system-master/web\345\211\215\347\253\257/src/views/global.css" @@ -0,0 +1,5 @@ +html,body,#app{ + height: 100%; + margin: 0; + padding: 0; +} \ No newline at end of file diff --git "a/1\343\200\201\345\220\210\345\220\214\347\263\273\347\273\237/contract-accounting-system-master/web\345\211\215\347\253\257/vue.config.js" "b/1\343\200\201\345\220\210\345\220\214\347\263\273\347\273\237/contract-accounting-system-master/web\345\211\215\347\253\257/vue.config.js" new file mode 100644 index 0000000..cc3b69d --- /dev/null +++ "b/1\343\200\201\345\220\210\345\220\214\347\263\273\347\273\237/contract-accounting-system-master/web\345\211\215\347\253\257/vue.config.js" @@ -0,0 +1,20 @@ +//module.exports = { + //lintOnSave: false +//} +module.exports = { + lintOnSave:false, + devServer: { + //跨域请求代理 + proxy: { + '/api': { + //target: 'http://192.168.231.128:9000/api', //对应自己的接口 + target: 'http://127.0.0.1:9000/api', //对应自己的接口 + changeOrigin: true, + ws: true, + pathRewrite: { + '^/api': '/' + } + } + } + } +} diff --git "a/1\343\200\201\345\220\210\345\220\214\347\263\273\347\273\237/contract-accounting-system-master/web\345\211\215\347\253\257/\344\275\277\347\224\250\350\257\264\346\230\216.md" "b/1\343\200\201\345\220\210\345\220\214\347\263\273\347\273\237/contract-accounting-system-master/web\345\211\215\347\253\257/\344\275\277\347\224\250\350\257\264\346\230\216.md" new file mode 100644 index 0000000..db0b1ec --- /dev/null +++ "b/1\343\200\201\345\220\210\345\220\214\347\263\273\347\273\237/contract-accounting-system-master/web\345\211\215\347\253\257/\344\275\277\347\224\250\350\257\264\346\230\216.md" @@ -0,0 +1,309 @@ +2022最强Python学习资料大礼包:https://mp.weixin.qq.com/s/sO6hbVqORy7JpN-5TlaKvQ + +==================================== + +# docker一键安装 + +``` +docker run -itd --name dbserver --restart=always -p 3306:3306 registry.cn-shanghai.aliyuncs.com/liu008/dbserver:1.1 + +docker run --link=dbserver:db --env DBIP=db --env DBPORT=3306 -p 8080:8080 -p 8022:22 -itd --name app --restart=always registry.cn-shanghai.aliyuncs.com/liu008/hetong:2.1 + +``` +**记得对外开放8080端口** + +# 一、软件系统构成: + +## 1.1 功能介绍 + +本系统是一个针对于中小企业的**合同管理**与**员工出差费用报销管理**。其中以项目为主线,针对项目进行出货合同(收款),和进货合同(付款)的记录管理。合同其中还包含资金和发票的计划管理,让管理人员一目标了然。另外,报销管理模块也可以与项目进行挂钩,方便管理人员核算出整体项目的成本与利润。总之这是一个不求功能复杂,界面简洁的公司合同帐务管理软件。 + +## 1.2 架构 + +系统采用BS架构,前后端分离构建,前端WEB服务器(VUECLI架构),后端采用DJANGO;数据库采用MYSQL + +## 1.3 WEB服务器环境: + +nodeJS --version v14.13.1 + +npm -version 6.14.8 + +## 1.4 API服务器环境: + +PYTHON:3.7 + +``` +# pip list +Package Version +------------------- ------- +asgiref 3.2.10 +Cython 0.29.21 +Django 3.1.2 +django-filter 2.4.0 +djangorestframework 3.12.1 +pip 20.2.3 +PyMySQL 0.10.1 +pytz 2020.1 +setuptools 50.3.0 +sqlparse 0.4.1 +wheel 0.35.1 +``` + +## 1.5 数据库环境: + +数据库安装MYSQL 版本 > 5.7 + +默认以下配置为和API服务器安装在同一台机器,可以自行改动,只需求在API服务中更改配置文件 + +数据库名:zw + +用户名:zw + +用户密码:zw123 + +``` +ApiServer/settings.py 文件中 +DATABASES = { + 'default': { + # 'ENGINE': 'django.db.backends.sqlite3', + # 'NAME': os.path.join(BASE_DIR, 'db.sqlite3'), + 'ENGINE': 'django.db.backends.mysql', + 'NAME': 'zw', + 'USER': 'zw', + 'PASSWORD': 'zw123', + 'HOST': '127.0.0.1', + 'PORT':'3306', + } +} +``` + +## 1.6 访问过程 + +用户浏览器--------->WEB服务器------>API服务器---------->MYSQL数据库 + + + +# 二、系统注册: + +1.安装部署成功后,用户通过浏览器(不支持IE)输入http://web服务器IP:8080 自动跳转到注册页面。将hostid复制下来,用来获取license注册 + +![](https://i.loli.net/2020/12/08/wDX1RSC5pcVb2E6.png) + +2.注册成功后,自动跳转至登录页面。 + + + +# 三、用户登录 + +1. **初始管理员 登录用户名:admin 密码:123456** + +![](https://i.loli.net/2020/12/08/OJfRQgKFkuteqNb.png) + +**2.登录成功后进入主页面** + +![](https://i.loli.net/2020/12/08/7i2TFUVcnHuyAgv.png) + + + +# 四、信息管理 + +## 4.1 用户信息 + +![](https://i.loli.net/2020/12/09/UXQdiEbzNDCOLeP.png) + +​ 用户信息即本系统使用人员(公司员工)的帐号管理,用户默认包含首次登录的admin帐户,默认密码:123456 登录后建议立即更改密码。 + +**帐号:** + +​ 建议使用手机号作为帐号。 + +**部门:** + +​ 公司内部的部门信息,方便对不同用户进行分类。需要预先在部门信息里进行新建部门。 + +**角色:** + +​ 角色即权限,分为管理员和普通用户 + +​ 普通用户:不能增加、修改、删除用户,在只在页面右上角个人中心修改自己的密码。 + +​ 管理员:可以做一切操作。同时管理员也是可以更改自己或其它用户为普通用户,**所以必须保证系统内至少有一个管理员帐号**。 + +**状态:** + +​ 当状态为非激活状态时该用户将不能再进行登录。 + +**删除:** + +​ 只有管理员才可以操作,但是如果该用户存在其它关联数据:比如报销内容,在这种情况下是不允许删除的(会有报错提示,阻止该行为)。因为一旦删除会造成帐务混乱对不上人员。人员离职正确的做法应该是在点击状态条目使之处理非激活状态即可。 + +## 4.2 部门信息 + +![](https://i.loli.net/2020/12/09/2UIMkYJe3gL79ay.png) + +## 4.3 单位信息 + +![](https://i.loli.net/2020/12/09/oyU4ajqIvfGkYhO.png) + +​ 单位实体用于记录合同系统中所涉及的单位或公司信息,只有单位名称是必写项(因此如果合同涉及是个人的话可以写对对方姓名)。 + +## 4.4 项目信息 + +项目信息就是针对某个工程项目先新立项目名称,后期可以与合同、报销相关联。 + +**客户对象:**指些项目的客户是哪个单位实体 + +**主体公司:**是指该项目是哪个公司的盈利项项目(这里主要考虑使用本系统的公司,名下可能会注册有多家公司的情况)。一般就是指使用本全合同系统的公司。 + +# 五、合同管理 + +## 5.1 项目合同 + +![](https://i.loli.net/2020/12/09/FwYZUSfEi6cWyCq.png) + +### 5.1.1 添加合同 + +点击此页面中点击添加合同即可新增。 + +- **合同类型** + + 类型分为:收款、付款 收款合同是指卖东西出去,付款合同是指针对项目买入的成本。 + +- **项目名称** + + 点击下拉可选择此合同对应的项目。 + +- **合同名称** + + 可以自行定义合同的名称 + +- **合同金额** + + 合同上涉及的总金额 + +- **合同本方** + + 指是谁在收款/付款 + +- **合同对方** + + 指是在向谁收款/付款 + +- 签订日期 + +- 到期日期 + + 合同的整体截至日期,一般指合同的最后履约时间。 + +- 税金成本 + + 此项不是必选项,如有必要可以记录此合同执行后,我方要缴纳多少税款。 + +- 备注 + + 此项不是必选项 + + + +## 5.2 修改合同 + +![](https://i.loli.net/2020/12/09/pZiTCh7N6Oqv3te.png) + +在合同列表中点击即可展开合同的详细信息,在详细信息中可以修改、删除合同。同进在修改合同的弹出页中可以进行:发票计划、资金计划、合同附件的操作。 + +### 5.2.1 发票计划 + +**介绍:**发票计划是指合同涉及的发票何时开具并收到。合同金额所涉及的发票是一次性全部开具出去或收票,还是分阶段。做了计划之后,点击完成状态开关按键即可设置此计划是否已完成。所有已经完成的计划,都会被显示到计划进度条中。 + +- **新增发票计划:** + + 点击发票计划按键即可新增发票计划。可以直接写入总金额的百分比和日期,先点击生成计划。生成计划之后才能点击提交。也可以在生成时不按照总金额的百分比,而是具体金额生成,只需要点击切换即可。 + +![](https://i.loli.net/2020/12/09/rPNKTQH2fnbwh6z.png) + +- **完成情况** + + 提交计划后,默认是处于未完成状态。未完成的计划是不会显示到进度条中去的。点击旁边的切换开关即可使之变成完成情况。还可以从完成切换回未完成。 + +- **删除** + +- **发票进度** + + 所有已经完成的计划会合并显示到发票进度。 + +### 5.2.2 资金计划 + +​ 操作和显示与发票计划一样。但是其代表的是真实的资金收付款情况。已经到账的应被视为已经完成,如果是项目尾款还未收到或付出,则应该被设置为未完成。 + +### 5.2.3 合同附件 + +​ 用户可以上传该合同相关的文件到服务器,后期方便下载查阅。 + + + +## 5.3 合同查询 + +![](https://i.loli.net/2020/12/09/9KaNh6BU8t1TCWj.png) + +​ 可以针对合同名称、项目名称、备注 进行关键字查询合同条目。也可以点击展开隐藏查询框进行,基于行合同签订时处于的年份、下拉选择具体项目(一个项目一般有进货出货多个关联合同)、合同类型(收、付款)进行查询。 + + + +# **六、报销管理** + +​ 报销管理里能操作和显示的都是基于当前操作者(**本人**)的报销。报销管理包含“**新增报销**”和“**报销查询**”两个部分,其中 新增报销中显示的是该用户最近新建的但是尚未经过管理人员(经理、或财务)审批的报销条目。而报销查询可以基于各种条件进行综合查询,但是只局限于查询自己本人的报销记录。 + + 另外,报销被分为两大类型:项目报销、其他报销。 + +## 6.1 新增报销 + +​ 点击“**新增展开**”后,可以填写用户需求报销的内容。其中分为**“出差报销”**和**“其它报销”**,两个类型。 + +- **出差报销** + + 是指人员去到外地出差的报销,会涉及交通费和住宿、出差补贴之类的,一般都是和项目挂钩,方便后期计入项目成本。如果没有明确项目或是项目还未成形,可以先在信息管理里自定义一个项目名称,再与之挂钩。标星号的都是必选项。**注**:补贴金额默认为50元一天。与你公司实际情况不符合,可以要求做代码更改。 + +![](https://i.loli.net/2020/12/10/7qafdAuQUObnrH8.png) + + + +- **其他报销** + + 其他报销是指不记录出差行程的报销,比如:请吃饭,或是采购了办公用品之类。可以作为出差报销的补充,也可以是单独的报销。它不需要强制与项目进行挂钩。 + +![](https://i.loli.net/2020/12/10/Q9AlzFowgcCGBj8.png) + +- **查看和修改、删除报销** + + 在新增报销页下显示了本人当前已经填写但还未审计通过的报销条目,如果需要修改或删除可以直接点击后面的编辑项目。 + + ![](https://i.loli.net/2020/12/10/HpdD9vn7rZBNYcT.png) + + + +## 6.2 报销查询 + +​ 此页面可以根据不同条件查询用户本人所有的报销记录。 + +![](https://i.loli.net/2020/12/10/tkBwDfosQIyV16M.png) + + + +# 七、财务管理 + +​ 该模块是给管理和查询所有的人报销情况,分为**“报销审批”**和**“综合查询”**两个内容。其中报销审批用于管理人员对各个员工报销进行审批;综合查询是统一查询所有人的报销内容。 + +## 7.1 报销审批 + +​ 此页包含两个列表,其中上面的列表显示最近提交过来的所有报销,可以根据条件进行过滤显示。钩选相应的报销条目后再点击“报销”按钮可以批量审批报销。报销后条目状态将变为已报销状态。只限于管理员才可以进行此操作。 + +​ 另外,下面的列表显示的所有已经报销的内容。如果发现操作有误,管理员可以对相应条目钩选后点击撤销。撤销之后,状态将变回未报销。 + +![](https://i.loli.net/2020/12/10/bczHYL5v1lxw6J9.png) + +## 7.2 综合查询 + +​ 综合查询只作查询之用,不能修改或审批。可以按条件过滤查询所有人用的报销。或种条件可以叠加组合进行查询。如果取消条件可以在在各个条件中删除或重置。其中重置按键和已报销、未报销为一组,是指删除已报销、未报销的条件约束。如果查看全部最快速的办法是重新点击左则“综合查询”进行页面刷新。 + +![](https://i.loli.net/2020/12/10/ErdUiYazTm4Rgp9.png) + diff --git "a/1\343\200\201\345\220\210\345\220\214\347\263\273\347\273\237/contract-accounting-system-master/\344\275\277\347\224\250\350\257\264\346\230\216.md" "b/1\343\200\201\345\220\210\345\220\214\347\263\273\347\273\237/contract-accounting-system-master/\344\275\277\347\224\250\350\257\264\346\230\216.md" new file mode 100644 index 0000000..db0b1ec --- /dev/null +++ "b/1\343\200\201\345\220\210\345\220\214\347\263\273\347\273\237/contract-accounting-system-master/\344\275\277\347\224\250\350\257\264\346\230\216.md" @@ -0,0 +1,309 @@ +2022最强Python学习资料大礼包:https://mp.weixin.qq.com/s/sO6hbVqORy7JpN-5TlaKvQ + +==================================== + +# docker一键安装 + +``` +docker run -itd --name dbserver --restart=always -p 3306:3306 registry.cn-shanghai.aliyuncs.com/liu008/dbserver:1.1 + +docker run --link=dbserver:db --env DBIP=db --env DBPORT=3306 -p 8080:8080 -p 8022:22 -itd --name app --restart=always registry.cn-shanghai.aliyuncs.com/liu008/hetong:2.1 + +``` +**记得对外开放8080端口** + +# 一、软件系统构成: + +## 1.1 功能介绍 + +本系统是一个针对于中小企业的**合同管理**与**员工出差费用报销管理**。其中以项目为主线,针对项目进行出货合同(收款),和进货合同(付款)的记录管理。合同其中还包含资金和发票的计划管理,让管理人员一目标了然。另外,报销管理模块也可以与项目进行挂钩,方便管理人员核算出整体项目的成本与利润。总之这是一个不求功能复杂,界面简洁的公司合同帐务管理软件。 + +## 1.2 架构 + +系统采用BS架构,前后端分离构建,前端WEB服务器(VUECLI架构),后端采用DJANGO;数据库采用MYSQL + +## 1.3 WEB服务器环境: + +nodeJS --version v14.13.1 + +npm -version 6.14.8 + +## 1.4 API服务器环境: + +PYTHON:3.7 + +``` +# pip list +Package Version +------------------- ------- +asgiref 3.2.10 +Cython 0.29.21 +Django 3.1.2 +django-filter 2.4.0 +djangorestframework 3.12.1 +pip 20.2.3 +PyMySQL 0.10.1 +pytz 2020.1 +setuptools 50.3.0 +sqlparse 0.4.1 +wheel 0.35.1 +``` + +## 1.5 数据库环境: + +数据库安装MYSQL 版本 > 5.7 + +默认以下配置为和API服务器安装在同一台机器,可以自行改动,只需求在API服务中更改配置文件 + +数据库名:zw + +用户名:zw + +用户密码:zw123 + +``` +ApiServer/settings.py 文件中 +DATABASES = { + 'default': { + # 'ENGINE': 'django.db.backends.sqlite3', + # 'NAME': os.path.join(BASE_DIR, 'db.sqlite3'), + 'ENGINE': 'django.db.backends.mysql', + 'NAME': 'zw', + 'USER': 'zw', + 'PASSWORD': 'zw123', + 'HOST': '127.0.0.1', + 'PORT':'3306', + } +} +``` + +## 1.6 访问过程 + +用户浏览器--------->WEB服务器------>API服务器---------->MYSQL数据库 + + + +# 二、系统注册: + +1.安装部署成功后,用户通过浏览器(不支持IE)输入http://web服务器IP:8080 自动跳转到注册页面。将hostid复制下来,用来获取license注册 + +![](https://i.loli.net/2020/12/08/wDX1RSC5pcVb2E6.png) + +2.注册成功后,自动跳转至登录页面。 + + + +# 三、用户登录 + +1. **初始管理员 登录用户名:admin 密码:123456** + +![](https://i.loli.net/2020/12/08/OJfRQgKFkuteqNb.png) + +**2.登录成功后进入主页面** + +![](https://i.loli.net/2020/12/08/7i2TFUVcnHuyAgv.png) + + + +# 四、信息管理 + +## 4.1 用户信息 + +![](https://i.loli.net/2020/12/09/UXQdiEbzNDCOLeP.png) + +​ 用户信息即本系统使用人员(公司员工)的帐号管理,用户默认包含首次登录的admin帐户,默认密码:123456 登录后建议立即更改密码。 + +**帐号:** + +​ 建议使用手机号作为帐号。 + +**部门:** + +​ 公司内部的部门信息,方便对不同用户进行分类。需要预先在部门信息里进行新建部门。 + +**角色:** + +​ 角色即权限,分为管理员和普通用户 + +​ 普通用户:不能增加、修改、删除用户,在只在页面右上角个人中心修改自己的密码。 + +​ 管理员:可以做一切操作。同时管理员也是可以更改自己或其它用户为普通用户,**所以必须保证系统内至少有一个管理员帐号**。 + +**状态:** + +​ 当状态为非激活状态时该用户将不能再进行登录。 + +**删除:** + +​ 只有管理员才可以操作,但是如果该用户存在其它关联数据:比如报销内容,在这种情况下是不允许删除的(会有报错提示,阻止该行为)。因为一旦删除会造成帐务混乱对不上人员。人员离职正确的做法应该是在点击状态条目使之处理非激活状态即可。 + +## 4.2 部门信息 + +![](https://i.loli.net/2020/12/09/2UIMkYJe3gL79ay.png) + +## 4.3 单位信息 + +![](https://i.loli.net/2020/12/09/oyU4ajqIvfGkYhO.png) + +​ 单位实体用于记录合同系统中所涉及的单位或公司信息,只有单位名称是必写项(因此如果合同涉及是个人的话可以写对对方姓名)。 + +## 4.4 项目信息 + +项目信息就是针对某个工程项目先新立项目名称,后期可以与合同、报销相关联。 + +**客户对象:**指些项目的客户是哪个单位实体 + +**主体公司:**是指该项目是哪个公司的盈利项项目(这里主要考虑使用本系统的公司,名下可能会注册有多家公司的情况)。一般就是指使用本全合同系统的公司。 + +# 五、合同管理 + +## 5.1 项目合同 + +![](https://i.loli.net/2020/12/09/FwYZUSfEi6cWyCq.png) + +### 5.1.1 添加合同 + +点击此页面中点击添加合同即可新增。 + +- **合同类型** + + 类型分为:收款、付款 收款合同是指卖东西出去,付款合同是指针对项目买入的成本。 + +- **项目名称** + + 点击下拉可选择此合同对应的项目。 + +- **合同名称** + + 可以自行定义合同的名称 + +- **合同金额** + + 合同上涉及的总金额 + +- **合同本方** + + 指是谁在收款/付款 + +- **合同对方** + + 指是在向谁收款/付款 + +- 签订日期 + +- 到期日期 + + 合同的整体截至日期,一般指合同的最后履约时间。 + +- 税金成本 + + 此项不是必选项,如有必要可以记录此合同执行后,我方要缴纳多少税款。 + +- 备注 + + 此项不是必选项 + + + +## 5.2 修改合同 + +![](https://i.loli.net/2020/12/09/pZiTCh7N6Oqv3te.png) + +在合同列表中点击即可展开合同的详细信息,在详细信息中可以修改、删除合同。同进在修改合同的弹出页中可以进行:发票计划、资金计划、合同附件的操作。 + +### 5.2.1 发票计划 + +**介绍:**发票计划是指合同涉及的发票何时开具并收到。合同金额所涉及的发票是一次性全部开具出去或收票,还是分阶段。做了计划之后,点击完成状态开关按键即可设置此计划是否已完成。所有已经完成的计划,都会被显示到计划进度条中。 + +- **新增发票计划:** + + 点击发票计划按键即可新增发票计划。可以直接写入总金额的百分比和日期,先点击生成计划。生成计划之后才能点击提交。也可以在生成时不按照总金额的百分比,而是具体金额生成,只需要点击切换即可。 + +![](https://i.loli.net/2020/12/09/rPNKTQH2fnbwh6z.png) + +- **完成情况** + + 提交计划后,默认是处于未完成状态。未完成的计划是不会显示到进度条中去的。点击旁边的切换开关即可使之变成完成情况。还可以从完成切换回未完成。 + +- **删除** + +- **发票进度** + + 所有已经完成的计划会合并显示到发票进度。 + +### 5.2.2 资金计划 + +​ 操作和显示与发票计划一样。但是其代表的是真实的资金收付款情况。已经到账的应被视为已经完成,如果是项目尾款还未收到或付出,则应该被设置为未完成。 + +### 5.2.3 合同附件 + +​ 用户可以上传该合同相关的文件到服务器,后期方便下载查阅。 + + + +## 5.3 合同查询 + +![](https://i.loli.net/2020/12/09/9KaNh6BU8t1TCWj.png) + +​ 可以针对合同名称、项目名称、备注 进行关键字查询合同条目。也可以点击展开隐藏查询框进行,基于行合同签订时处于的年份、下拉选择具体项目(一个项目一般有进货出货多个关联合同)、合同类型(收、付款)进行查询。 + + + +# **六、报销管理** + +​ 报销管理里能操作和显示的都是基于当前操作者(**本人**)的报销。报销管理包含“**新增报销**”和“**报销查询**”两个部分,其中 新增报销中显示的是该用户最近新建的但是尚未经过管理人员(经理、或财务)审批的报销条目。而报销查询可以基于各种条件进行综合查询,但是只局限于查询自己本人的报销记录。 + + 另外,报销被分为两大类型:项目报销、其他报销。 + +## 6.1 新增报销 + +​ 点击“**新增展开**”后,可以填写用户需求报销的内容。其中分为**“出差报销”**和**“其它报销”**,两个类型。 + +- **出差报销** + + 是指人员去到外地出差的报销,会涉及交通费和住宿、出差补贴之类的,一般都是和项目挂钩,方便后期计入项目成本。如果没有明确项目或是项目还未成形,可以先在信息管理里自定义一个项目名称,再与之挂钩。标星号的都是必选项。**注**:补贴金额默认为50元一天。与你公司实际情况不符合,可以要求做代码更改。 + +![](https://i.loli.net/2020/12/10/7qafdAuQUObnrH8.png) + + + +- **其他报销** + + 其他报销是指不记录出差行程的报销,比如:请吃饭,或是采购了办公用品之类。可以作为出差报销的补充,也可以是单独的报销。它不需要强制与项目进行挂钩。 + +![](https://i.loli.net/2020/12/10/Q9AlzFowgcCGBj8.png) + +- **查看和修改、删除报销** + + 在新增报销页下显示了本人当前已经填写但还未审计通过的报销条目,如果需要修改或删除可以直接点击后面的编辑项目。 + + ![](https://i.loli.net/2020/12/10/HpdD9vn7rZBNYcT.png) + + + +## 6.2 报销查询 + +​ 此页面可以根据不同条件查询用户本人所有的报销记录。 + +![](https://i.loli.net/2020/12/10/tkBwDfosQIyV16M.png) + + + +# 七、财务管理 + +​ 该模块是给管理和查询所有的人报销情况,分为**“报销审批”**和**“综合查询”**两个内容。其中报销审批用于管理人员对各个员工报销进行审批;综合查询是统一查询所有人的报销内容。 + +## 7.1 报销审批 + +​ 此页包含两个列表,其中上面的列表显示最近提交过来的所有报销,可以根据条件进行过滤显示。钩选相应的报销条目后再点击“报销”按钮可以批量审批报销。报销后条目状态将变为已报销状态。只限于管理员才可以进行此操作。 + +​ 另外,下面的列表显示的所有已经报销的内容。如果发现操作有误,管理员可以对相应条目钩选后点击撤销。撤销之后,状态将变回未报销。 + +![](https://i.loli.net/2020/12/10/bczHYL5v1lxw6J9.png) + +## 7.2 综合查询 + +​ 综合查询只作查询之用,不能修改或审批。可以按条件过滤查询所有人用的报销。或种条件可以叠加组合进行查询。如果取消条件可以在在各个条件中删除或重置。其中重置按键和已报销、未报销为一组,是指删除已报销、未报销的条件约束。如果查看全部最快速的办法是重新点击左则“综合查询”进行页面刷新。 + +![](https://i.loli.net/2020/12/10/ErdUiYazTm4Rgp9.png) + diff --git a/course/AnacondaCourse-Code/ReadME.md "b/1\343\200\201\345\220\210\345\220\214\347\263\273\347\273\237/contract-accounting-system-master/\346\234\215\345\212\241\345\231\250\345\220\216\347\253\257/.keep" similarity index 100% rename from course/AnacondaCourse-Code/ReadME.md rename to "1\343\200\201\345\220\210\345\220\214\347\263\273\347\273\237/contract-accounting-system-master/\346\234\215\345\212\241\345\231\250\345\220\216\347\253\257/.keep" diff --git "a/1\343\200\201\345\220\210\345\220\214\347\263\273\347\273\237/contract-accounting-system-master/\346\234\215\345\212\241\345\231\250\345\220\216\347\253\257/ApiServer/__init__.py" "b/1\343\200\201\345\220\210\345\220\214\347\263\273\347\273\237/contract-accounting-system-master/\346\234\215\345\212\241\345\231\250\345\220\216\347\253\257/ApiServer/__init__.py" new file mode 100644 index 0000000..626e977 --- /dev/null +++ "b/1\343\200\201\345\220\210\345\220\214\347\263\273\347\273\237/contract-accounting-system-master/\346\234\215\345\212\241\345\231\250\345\220\216\347\253\257/ApiServer/__init__.py" @@ -0,0 +1,4 @@ +import pymysql +pymysql.version_info = (1, 4, 13, "final", 0) +pymysql.install_as_MySQLdb() + diff --git "a/1\343\200\201\345\220\210\345\220\214\347\263\273\347\273\237/contract-accounting-system-master/\346\234\215\345\212\241\345\231\250\345\220\216\347\253\257/ApiServer/settings.py" "b/1\343\200\201\345\220\210\345\220\214\347\263\273\347\273\237/contract-accounting-system-master/\346\234\215\345\212\241\345\231\250\345\220\216\347\253\257/ApiServer/settings.py" new file mode 100644 index 0000000..42e6f5e --- /dev/null +++ "b/1\343\200\201\345\220\210\345\220\214\347\263\273\347\273\237/contract-accounting-system-master/\346\234\215\345\212\241\345\231\250\345\220\216\347\253\257/ApiServer/settings.py" @@ -0,0 +1,151 @@ +""" +Django settings for ApiServer project. + +Generated by 'django-admin startproject' using Django 2.2. + +For more information on this file, see +https://docs.djangoproject.com/en/2.2/topics/settings/ + +For the full list of settings and their values, see +https://docs.djangoproject.com/en/2.2/ref/settings/ +""" + +import os + +# Build paths inside the project like this: os.path.join(BASE_DIR, ...) +from django.conf.global_settings import AUTH_USER_MODEL + +BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__))) +MEDIA_URL = '/media/' +MEDIA_ROOT = os.path.join(BASE_DIR, 'media') + +# Quick-start development settings - unsuitable for production +# See https://docs.djangoproject.com/en/2.2/howto/deployment/checklist/ + +# SECURITY WARNING: keep the secret key used in production secret! +SECRET_KEY = 't=19=25!d&z6_+ad@_*2q_5%#7@eo!(oup(mk@ouko_^wux^2f' + +# SECURITY WARNING: don't run with debug turned on in production! +# DEBUG = True +DEBUG = True + +ALLOWED_HOSTS = ['*'] + + +# Application definition + +INSTALLED_APPS = [ + 'django.contrib.admin', + 'django.contrib.auth', + 'django.contrib.contenttypes', + 'django.contrib.sessions', + 'django.contrib.messages', + 'django.contrib.staticfiles', + # 'api.apps.ApiConfig', + 'api', + 'rest_framework', + 'django_filters', +] + +MIDDLEWARE = [ + 'api.utils.config.InitMiddle', + 'django.middleware.security.SecurityMiddleware', + 'django.contrib.sessions.middleware.SessionMiddleware', + 'django.middleware.common.CommonMiddleware', + 'django.middleware.csrf.CsrfViewMiddleware', + 'django.contrib.auth.middleware.AuthenticationMiddleware', + 'django.contrib.messages.middleware.MessageMiddleware', + 'django.middleware.clickjacking.XFrameOptionsMiddleware', +] + +ROOT_URLCONF = 'ApiServer.urls' + +TEMPLATES = [ + { + 'BACKEND': 'django.template.backends.django.DjangoTemplates', + 'DIRS': [os.path.join (BASE_DIR, 'templates')], + 'APP_DIRS': True, + 'OPTIONS': { + 'context_processors': [ + 'django.template.context_processors.debug', + 'django.template.context_processors.request', + 'django.contrib.auth.context_processors.auth', + 'django.contrib.messages.context_processors.messages', + # 'api.utils.global_settings' + ], + }, + }, +] + +WSGI_APPLICATION = 'ApiServer.wsgi.application' + + +# Database +# https://docs.djangoproject.com/en/2.2/ref/settings/#databases + +DATABASES = { + 'default': { + # 'ENGINE': 'django.db.backends.sqlite3', + # 'NAME': os.path.join(BASE_DIR, 'db.sqlite3'), + 'ENGINE': 'django.db.backends.mysql', + 'NAME': 'zw', + 'USER': 'zw', + 'PASSWORD': 'zw123', + 'HOST': '127.0.0.1', + 'PORT':'3306', + } +} + + +# Password validation +# https://docs.djangoproject.com/en/2.2/ref/settings/#auth-password-validators + +AUTH_PASSWORD_VALIDATORS = [ + { + 'NAME': 'django.contrib.auth.password_validation.UserAttributeSimilarityValidator', + }, + { + 'NAME': 'django.contrib.auth.password_validation.MinimumLengthValidator', + }, + { + 'NAME': 'django.contrib.auth.password_validation.CommonPasswordValidator', + }, + { + 'NAME': 'django.contrib.auth.password_validation.NumericPasswordValidator', + }, +] + + +# Internationalization +# https://docs.djangoproject.com/en/2.2/topics/i18n/ + +LANGUAGE_CODE = 'en-us' + +TIME_ZONE = 'Asia/Shanghai' + +USE_I18N = True + +USE_L10N = True + +USE_TZ = False + +INITCHECK = '' + +# Static files (CSS, JavaScript, Images) +# https://docs.djangoproject.com/en/2.2/howto/static-files/ + +STATIC_URL = '/static/' + +# AUTHENTICATION_BACKENDS =('api.utils.auth.CusertomBackend',) + +REST_FRAMEWORK = { + 'DEFAULT_AUTHENTICATION_CLASSES': ['api.utils.auth.ApiAuthentication',], #全局配置验证类列表 + #'DEFAULT_PERMISSION_CLASSES':['rest_framework.permissions.IsAuthenticated',],#全局配置权限验证类列表 + # 'DEFAULT_PARSER_CLASSES':['rest_framework.parsers.JSONParser','rest_framework.parsers.FormParser'],#全局配置request解析器 + # 'UNAUTHENTICATED_USER':lambda : "未登录用户", + 'UNAUTHENTICATED_USER':None, + 'UNAUTHENTICATED_TOKEN':None, + # 配置过滤 + 'DEFAULT_FILTER_BACKENDS': ('django_filters.rest_framework.DjangoFilterBackend',), + 'EXCEPTION_HANDLER': 'api.utils.myException.custom_exception_handler', +} diff --git "a/1\343\200\201\345\220\210\345\220\214\347\263\273\347\273\237/contract-accounting-system-master/\346\234\215\345\212\241\345\231\250\345\220\216\347\253\257/ApiServer/urls.py" "b/1\343\200\201\345\220\210\345\220\214\347\263\273\347\273\237/contract-accounting-system-master/\346\234\215\345\212\241\345\231\250\345\220\216\347\253\257/ApiServer/urls.py" new file mode 100644 index 0000000..69f8017 --- /dev/null +++ "b/1\343\200\201\345\220\210\345\220\214\347\263\273\347\273\237/contract-accounting-system-master/\346\234\215\345\212\241\345\231\250\345\220\216\347\253\257/ApiServer/urls.py" @@ -0,0 +1,28 @@ +"""ApiServer URL Configuration + +The `urlpatterns` list routes URLs to views. For more information please see: + https://docs.djangoproject.com/en/2.2/topics/http/urls/ +Examples: +Function views + 1. Add an import: from my_app import views + 2. Add a URL to urlpatterns: path('', views.home, name='home') +Class-based views + 1. Add an import: from other_app.views import Home + 2. Add a URL to urlpatterns: path('', Home.as_view(), name='home') +Including another URLconf + 1. Import the include() function: from django.urls import include, path + 2. Add a URL to urlpatterns: path('blog/', include('blog.urls')) +""" +from django.contrib import admin +from django.urls import path,include +from django.conf.urls.static import static +from ApiServer import settings +import api + +from api.views import index + +urlpatterns = [ + path('',api.views.index), + path('api/', include ("api.urls")), + path('admin/', admin.site.urls), +]+ static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT) diff --git "a/1\343\200\201\345\220\210\345\220\214\347\263\273\347\273\237/contract-accounting-system-master/\346\234\215\345\212\241\345\231\250\345\220\216\347\253\257/ApiServer/wsgi.py" "b/1\343\200\201\345\220\210\345\220\214\347\263\273\347\273\237/contract-accounting-system-master/\346\234\215\345\212\241\345\231\250\345\220\216\347\253\257/ApiServer/wsgi.py" new file mode 100644 index 0000000..427616d --- /dev/null +++ "b/1\343\200\201\345\220\210\345\220\214\347\263\273\347\273\237/contract-accounting-system-master/\346\234\215\345\212\241\345\231\250\345\220\216\347\253\257/ApiServer/wsgi.py" @@ -0,0 +1,17 @@ +""" +WSGI config for ApiServer project. + +It exposes the WSGI callable as a module-level variable named ``application``. + +For more information on this file, see +https://docs.djangoproject.com/en/2.2/howto/deployment/wsgi/ +""" + +import os + +from django.core.wsgi import get_wsgi_application + + +os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'ApiServer.settings') + +application = get_wsgi_application() diff --git "a/1\343\200\201\345\220\210\345\220\214\347\263\273\347\273\237/contract-accounting-system-master/\346\234\215\345\212\241\345\231\250\345\220\216\347\253\257/api/__init__.py" "b/1\343\200\201\345\220\210\345\220\214\347\263\273\347\273\237/contract-accounting-system-master/\346\234\215\345\212\241\345\231\250\345\220\216\347\253\257/api/__init__.py" new file mode 100644 index 0000000..5282938 --- /dev/null +++ "b/1\343\200\201\345\220\210\345\220\214\347\263\273\347\273\237/contract-accounting-system-master/\346\234\215\345\212\241\345\231\250\345\220\216\347\253\257/api/__init__.py" @@ -0,0 +1,2 @@ +from api.utils import config +config.startInit() diff --git "a/1\343\200\201\345\220\210\345\220\214\347\263\273\347\273\237/contract-accounting-system-master/\346\234\215\345\212\241\345\231\250\345\220\216\347\253\257/api/admin.py" "b/1\343\200\201\345\220\210\345\220\214\347\263\273\347\273\237/contract-accounting-system-master/\346\234\215\345\212\241\345\231\250\345\220\216\347\253\257/api/admin.py" new file mode 100644 index 0000000..b57bfa9 --- /dev/null +++ "b/1\343\200\201\345\220\210\345\220\214\347\263\273\347\273\237/contract-accounting-system-master/\346\234\215\345\212\241\345\231\250\345\220\216\347\253\257/api/admin.py" @@ -0,0 +1,11 @@ +# -*- coding: UTF-8 -*- +''' +@Author :程序员晚枫,B站/抖音/微博/小红书/公众号 +@WeChat :CoderWanFeng +@Blog :www.python-office.com +@Date :2022/12/28 21:03 +@Description : +''' +from django.contrib import admin + +# Register your models here. diff --git "a/1\343\200\201\345\220\210\345\220\214\347\263\273\347\273\237/contract-accounting-system-master/\346\234\215\345\212\241\345\231\250\345\220\216\347\253\257/api/apps.py" "b/1\343\200\201\345\220\210\345\220\214\347\263\273\347\273\237/contract-accounting-system-master/\346\234\215\345\212\241\345\231\250\345\220\216\347\253\257/api/apps.py" new file mode 100644 index 0000000..d87006d --- /dev/null +++ "b/1\343\200\201\345\220\210\345\220\214\347\263\273\347\273\237/contract-accounting-system-master/\346\234\215\345\212\241\345\231\250\345\220\216\347\253\257/api/apps.py" @@ -0,0 +1,5 @@ +from django.apps import AppConfig + + +class ApiConfig(AppConfig): + name = 'api' diff --git "a/1\343\200\201\345\220\210\345\220\214\347\263\273\347\273\237/contract-accounting-system-master/\346\234\215\345\212\241\345\231\250\345\220\216\347\253\257/api/migrations/0001_initial.py" "b/1\343\200\201\345\220\210\345\220\214\347\263\273\347\273\237/contract-accounting-system-master/\346\234\215\345\212\241\345\231\250\345\220\216\347\253\257/api/migrations/0001_initial.py" new file mode 100644 index 0000000..945b092 --- /dev/null +++ "b/1\343\200\201\345\220\210\345\220\214\347\263\273\347\273\237/contract-accounting-system-master/\346\234\215\345\212\241\345\231\250\345\220\216\347\253\257/api/migrations/0001_initial.py" @@ -0,0 +1,25 @@ +# Generated by Django 2.2 on 2020-06-11 13:56 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + initial = True + + dependencies = [ + ] + + operations = [ + migrations.CreateModel( + name='AuthGroup', + fields=[ + ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('name', models.CharField(max_length=150, unique=True)), + ], + options={ + 'db_table': 'home', + 'managed': False, + }, + ), + ] diff --git "a/1\343\200\201\345\220\210\345\220\214\347\263\273\347\273\237/contract-accounting-system-master/\346\234\215\345\212\241\345\231\250\345\220\216\347\253\257/api/migrations/0002_auto_20200611_1359.py" "b/1\343\200\201\345\220\210\345\220\214\347\263\273\347\273\237/contract-accounting-system-master/\346\234\215\345\212\241\345\231\250\345\220\216\347\253\257/api/migrations/0002_auto_20200611_1359.py" new file mode 100644 index 0000000..f1d61c5 --- /dev/null +++ "b/1\343\200\201\345\220\210\345\220\214\347\263\273\347\273\237/contract-accounting-system-master/\346\234\215\345\212\241\345\231\250\345\220\216\347\253\257/api/migrations/0002_auto_20200611_1359.py" @@ -0,0 +1,161 @@ +# Generated by Django 2.2 on 2020-06-11 13:59 + +from django.db import migrations, models +import django.db.models.deletion + + +class Migration(migrations.Migration): + + dependencies = [ + ('api', '0001_initial'), + ] + + operations = [ + migrations.CreateModel( + name='Contract_info', + fields=[ + ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('contract_name', models.CharField(max_length=64)), + ('contract_type', models.CharField(choices=[(1, '收款合同'), (2, '付款合同')], max_length=64)), + ('amount', models.DecimalField(decimal_places=2, max_digits=10)), + ('Date_start', models.DateField()), + ('Date_end', models.DateField(null=True)), + ('attachment', models.CharField(max_length=128, null=True)), + ('taxes', models.DecimalField(decimal_places=2, max_digits=10, null=True)), + ('explain', models.CharField(max_length=64, null=True)), + ], + ), + migrations.CreateModel( + name='Department', + fields=[ + ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('dept_name', models.CharField(default='技术部', max_length=64, unique=True)), + ], + ), + migrations.CreateModel( + name='Entity_info', + fields=[ + ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('entity_name', models.CharField(max_length=128, unique=True)), + ('entity_addr', models.CharField(max_length=128, null=True)), + ('phone', models.CharField(max_length=32, null=True)), + ('bank_addr', models.CharField(max_length=64, null=True)), + ('bank_number', models.CharField(max_length=64, null=True)), + ('shuiHao', models.CharField(max_length=64, null=True)), + ('explain', models.CharField(max_length=64, null=True)), + ], + ), + migrations.CreateModel( + name='Test', + fields=[ + ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('name', models.CharField(max_length=20)), + ], + ), + migrations.CreateModel( + name='Traffic_type', + fields=[ + ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('project_name', models.CharField(max_length=64, unique=True)), + ], + ), + migrations.CreateModel( + name='UserInfo', + fields=[ + ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('user_type', models.IntegerField(choices=[(1, '普通用户'), (2, '管理员')])), + ('username', models.CharField(max_length=32, unique=True)), + ('password', models.CharField(max_length=64)), + ('name', models.CharField(default='无名氏', max_length=32, unique=True)), + ('status', models.BooleanField(default=True)), + ('department', models.ForeignKey(null=True, on_delete=django.db.models.deletion.SET_NULL, to='api.Department')), + ], + ), + migrations.CreateModel( + name='UserToken', + fields=[ + ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('token', models.CharField(max_length=64)), + ('user', models.OneToOneField(on_delete=django.db.models.deletion.CASCADE, to='api.UserInfo')), + ], + ), + migrations.CreateModel( + name='Subsidize_info', + fields=[ + ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('money', models.DecimalField(decimal_places=2, max_digits=5)), + ('Department', models.ForeignKey(null=True, on_delete=django.db.models.deletion.SET_NULL, to='api.Department')), + ], + ), + migrations.CreateModel( + name='Project_info', + fields=[ + ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('project_name', models.CharField(max_length=64, unique=True)), + ('customer', models.ForeignKey(on_delete=django.db.models.deletion.PROTECT, related_name='project_customer', to='api.Entity_info')), + ('owner', models.ForeignKey(on_delete=django.db.models.deletion.PROTECT, related_name='project_owner', to='api.Entity_info')), + ], + ), + migrations.AddField( + model_name='department', + name='dept_manager', + field=models.ForeignKey(null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='dep_manager_user', to='api.UserInfo'), + ), + migrations.CreateModel( + name='Contract_plan', + fields=[ + ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('date_plan', models.DateField()), + ('money_plan', models.DecimalField(decimal_places=2, max_digits=10)), + ('invoice_type', models.CharField(choices=[(0, '未开发票/未付款'), (1, '已开发票/已付款')], max_length=64)), + ('money_type', models.CharField(choices=[(0, '未开发票/未付款'), (1, '已开发票/已付款')], max_length=64)), + ('contract', models.ForeignKey(on_delete=django.db.models.deletion.PROTECT, to='api.Contract_info')), + ], + ), + migrations.AddField( + model_name='contract_info', + name='body', + field=models.ForeignKey(on_delete=django.db.models.deletion.PROTECT, related_name='body_entity', to='api.Entity_info'), + ), + migrations.AddField( + model_name='contract_info', + name='project', + field=models.ForeignKey(on_delete=django.db.models.deletion.PROTECT, to='api.Project_info'), + ), + migrations.AddField( + model_name='contract_info', + name='target', + field=models.ForeignKey(on_delete=django.db.models.deletion.PROTECT, to='api.Entity_info'), + ), + migrations.CreateModel( + name='Account_project', + fields=[ + ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('zhushu', models.DecimalField(decimal_places=2, max_digits=10)), + ('money_traffic', models.DecimalField(decimal_places=2, max_digits=10)), + ('sumDate', models.IntegerField()), + ('sumButie', models.DecimalField(decimal_places=2, max_digits=10)), + ('start_date', models.DateField(null=True)), + ('end_date', models.DateField(null=True)), + ('account_date', models.DateTimeField(auto_now_add=True, null=True)), + ('explain', models.CharField(max_length=64)), + ('finish_flag', models.CharField(choices=[(0, '未完成报销'), (1, '已完成报销')], default=0, max_length=64)), + ('Type_traffic', models.ForeignKey(on_delete=django.db.models.deletion.PROTECT, to='api.Traffic_type')), + ('expense_name', models.ForeignKey(on_delete=django.db.models.deletion.PROTECT, to='api.UserInfo')), + ('project_name', models.ForeignKey(null=True, on_delete=django.db.models.deletion.PROTECT, to='api.Project_info')), + ], + ), + migrations.CreateModel( + name='Account_normal', + fields=[ + ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('date', models.DateField()), + ('account_date', models.DateField()), + ('money', models.DecimalField(decimal_places=2, max_digits=10)), + ('cause', models.CharField(max_length=64)), + ('finish_flag', models.CharField(choices=[(0, '未完成报销'), (1, '已完成报销')], default=0, max_length=64)), + ('expense_name', models.ForeignKey(on_delete=django.db.models.deletion.PROTECT, to='api.UserInfo')), + ('project_name', models.ForeignKey(null=True, on_delete=django.db.models.deletion.PROTECT, to='api.Project_info')), + ], + ), + ] diff --git "a/1\343\200\201\345\220\210\345\220\214\347\263\273\347\273\237/contract-accounting-system-master/\346\234\215\345\212\241\345\231\250\345\220\216\347\253\257/api/migrations/0003_auto_20200710_0931.py" "b/1\343\200\201\345\220\210\345\220\214\347\263\273\347\273\237/contract-accounting-system-master/\346\234\215\345\212\241\345\231\250\345\220\216\347\253\257/api/migrations/0003_auto_20200710_0931.py" new file mode 100644 index 0000000..0a43d0e --- /dev/null +++ "b/1\343\200\201\345\220\210\345\220\214\347\263\273\347\273\237/contract-accounting-system-master/\346\234\215\345\212\241\345\231\250\345\220\216\347\253\257/api/migrations/0003_auto_20200710_0931.py" @@ -0,0 +1,69 @@ +# Generated by Django 2.2 on 2020-07-10 09:31 + +from django.db import migrations, models +import django.db.models.deletion + + +class Migration(migrations.Migration): + + dependencies = [ + ('api', '0002_auto_20200611_1359'), + ] + + operations = [ + migrations.RemoveField( + model_name='contract_info', + name='attachment', + ), + migrations.AddField( + model_name='account_normal', + name='approve', + field=models.ForeignKey(null=True, on_delete=django.db.models.deletion.PROTECT, related_name='Accountnormal_approve_user', to='api.UserInfo'), + ), + migrations.AddField( + model_name='account_normal', + name='approvetime', + field=models.DateTimeField(blank=True, null=True), + ), + migrations.AddField( + model_name='account_project', + name='approve', + field=models.ForeignKey(null=True, on_delete=django.db.models.deletion.PROTECT, related_name='Accountproject_approve_user', to='api.UserInfo'), + ), + migrations.AddField( + model_name='account_project', + name='approvetime', + field=models.DateTimeField(blank=True, null=True), + ), + migrations.AlterField( + model_name='account_normal', + name='account_date', + field=models.DateTimeField(auto_now_add=True, null=True), + ), + migrations.CreateModel( + name='attachment', + fields=[ + ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('file_name', models.CharField(max_length=64)), + ('lujin', models.CharField(max_length=64)), + ('hetong', models.ForeignKey(on_delete=django.db.models.deletion.PROTECT, to='api.Contract_info')), + ], + ), + # migrations.CreateModel( + # name='Account_view', + # fields=[ + # ('type', models.CharField(max_length=2)), + # ('sysid', models.CharField(max_length=64, primary_key=True, serialize=False)), + # ('tableid', models.IntegerField(max_length=32)), + # ('cause', models.CharField(max_length=64)), + # ('money', models.DecimalField(decimal_places=2, max_digits=10)), + # ('account_date', models.DateTimeField(auto_now_add=True, null=True)), + # ('finish_flag', models.IntegerField()), + # ('expense_name', models.ForeignKey(on_delete=django.db.models.deletion.PROTECT, to='api.UserInfo')), + # ('project_name', models.ForeignKey(on_delete=django.db.models.deletion.PROTECT, to='api.Project_info')), + # ], + # options={ + # 'db_table': 'account_view', + # }, + # ), + ] diff --git "a/1\343\200\201\345\220\210\345\220\214\347\263\273\347\273\237/contract-accounting-system-master/\346\234\215\345\212\241\345\231\250\345\220\216\347\253\257/api/migrations/0004_auto_20200710_1140.py" "b/1\343\200\201\345\220\210\345\220\214\347\263\273\347\273\237/contract-accounting-system-master/\346\234\215\345\212\241\345\231\250\345\220\216\347\253\257/api/migrations/0004_auto_20200710_1140.py" new file mode 100644 index 0000000..88e50c3 --- /dev/null +++ "b/1\343\200\201\345\220\210\345\220\214\347\263\273\347\273\237/contract-accounting-system-master/\346\234\215\345\212\241\345\231\250\345\220\216\347\253\257/api/migrations/0004_auto_20200710_1140.py" @@ -0,0 +1,54 @@ +# Generated by Django 2.2 on 2020-07-10 11:40 + +from django.db import migrations, models +import django.db.models.deletion + + +class Migration(migrations.Migration): + + dependencies = [ + ('api', '0003_auto_20200710_0931'), + ] + + operations = [ + migrations.RemoveField( + model_name='attachment', + name='file_name', + ), + migrations.RemoveField( + model_name='attachment', + name='hetong', + ), + migrations.RemoveField( + model_name='attachment', + name='lujin', + ), + migrations.AddField( + model_name='attachment', + name='file', + field=models.FileField(default=1, upload_to='files/'), + preserve_default=False, + ), + migrations.AddField( + model_name='contract_info', + name='attachment', + field=models.ManyToManyField(null=True, to='api.attachment', verbose_name='附件'), + ), + # migrations.CreateModel( + # name='Account_view', + # fields=[ + # ('type', models.CharField(max_length=2)), + # ('sysid', models.CharField(max_length=64, primary_key=True, serialize=False)), + # ('tableid', models.IntegerField(max_length=32)), + # ('cause', models.CharField(max_length=64)), + # ('money', models.DecimalField(decimal_places=2, max_digits=10)), + # ('account_date', models.DateTimeField(auto_now_add=True, null=True)), + # ('finish_flag', models.IntegerField()), + # ('expense_name', models.ForeignKey(on_delete=django.db.models.deletion.PROTECT, to='api.UserInfo')), + # ('project_name', models.ForeignKey(on_delete=django.db.models.deletion.PROTECT, to='api.Project_info')), + # ], + # options={ + # 'db_table': 'account_view', + # }, + # ), + ] diff --git "a/1\343\200\201\345\220\210\345\220\214\347\263\273\347\273\237/contract-accounting-system-master/\346\234\215\345\212\241\345\231\250\345\220\216\347\253\257/api/migrations/0005_auto_20200716_1001.py" "b/1\343\200\201\345\220\210\345\220\214\347\263\273\347\273\237/contract-accounting-system-master/\346\234\215\345\212\241\345\231\250\345\220\216\347\253\257/api/migrations/0005_auto_20200716_1001.py" new file mode 100644 index 0000000..bea094b --- /dev/null +++ "b/1\343\200\201\345\220\210\345\220\214\347\263\273\347\273\237/contract-accounting-system-master/\346\234\215\345\212\241\345\231\250\345\220\216\347\253\257/api/migrations/0005_auto_20200716_1001.py" @@ -0,0 +1,37 @@ +# Generated by Django 2.2 on 2020-07-16 10:01 + +from django.db import migrations, models +import django.db.models.deletion + + +class Migration(migrations.Migration): + + dependencies = [ + ('api', '0004_auto_20200710_1140'), + ] + + operations = [ + migrations.AddField( + model_name='attachment', + name='hetong', + field=models.ForeignKey(default=1, on_delete=django.db.models.deletion.CASCADE, related_name='attchments', to='api.Contract_info'), + preserve_default=False, + ), + # migrations.CreateModel( + # name='Account_view', + # fields=[ + # ('type', models.CharField(max_length=2)), + # ('sysid', models.CharField(max_length=64, primary_key=True, serialize=False)), + # ('tableid', models.IntegerField(max_length=32)), + # ('cause', models.CharField(max_length=64)), + # ('money', models.DecimalField(decimal_places=2, max_digits=10)), + # ('account_date', models.DateTimeField(auto_now_add=True, null=True)), + # ('finish_flag', models.IntegerField()), + # ('expense_name', models.ForeignKey(on_delete=django.db.models.deletion.PROTECT, to='api.UserInfo')), + # ('project_name', models.ForeignKey(on_delete=django.db.models.deletion.PROTECT, to='api.Project_info')), + # ], + # options={ + # 'db_table': 'account_view', + # }, + # ), + ] diff --git "a/1\343\200\201\345\220\210\345\220\214\347\263\273\347\273\237/contract-accounting-system-master/\346\234\215\345\212\241\345\231\250\345\220\216\347\253\257/api/migrations/0006_auto_20200827_1145.py" "b/1\343\200\201\345\220\210\345\220\214\347\263\273\347\273\237/contract-accounting-system-master/\346\234\215\345\212\241\345\231\250\345\220\216\347\253\257/api/migrations/0006_auto_20200827_1145.py" new file mode 100644 index 0000000..f9b02be --- /dev/null +++ "b/1\343\200\201\345\220\210\345\220\214\347\263\273\347\273\237/contract-accounting-system-master/\346\234\215\345\212\241\345\231\250\345\220\216\347\253\257/api/migrations/0006_auto_20200827_1145.py" @@ -0,0 +1,52 @@ +# Generated by Django 2.2 on 2020-08-27 11:45 + +from django.db import migrations, models +import django.db.models.deletion +import django.utils.timezone + + +class Migration(migrations.Migration): + + dependencies = [ + ('api', '0005_auto_20200716_1001'), + ] + + operations = [ + migrations.RemoveField( + model_name='contract_plan', + name='invoice_type', + ), + migrations.RemoveField( + model_name='contract_plan', + name='money_type', + ), + migrations.AddField( + model_name='contract_plan', + name='contract_type', + field=models.CharField(choices=[(0, '发票类型/未完成'), (1, '资金类型/已完成')], default=0, max_length=64), + preserve_default=False, + ), + migrations.AddField( + model_name='contract_plan', + name='finish_type', + field=models.CharField(choices=[(0, '发票类型/未完成'), (1, '资金类型/已完成')], default=django.utils.timezone.now, max_length=64), + preserve_default=False, + ), + # migrations.CreateModel( + # name='Account_view', + # fields=[ + # ('type', models.CharField(max_length=2)), + # ('sysid', models.CharField(max_length=64, primary_key=True, serialize=False)), + # ('tableid', models.IntegerField(max_length=32)), + # ('cause', models.CharField(max_length=64)), + # ('money', models.DecimalField(decimal_places=2, max_digits=10)), + # ('account_date', models.DateTimeField(auto_now_add=True, null=True)), + # ('finish_flag', models.IntegerField()), + # ('expense_name', models.ForeignKey(on_delete=django.db.models.deletion.PROTECT, to='api.UserInfo')), + # ('project_name', models.ForeignKey(on_delete=django.db.models.deletion.PROTECT, to='api.Project_info')), + # ], + # options={ + # 'db_table': 'account_view', + # }, + # ), + ] diff --git "a/1\343\200\201\345\220\210\345\220\214\347\263\273\347\273\237/contract-accounting-system-master/\346\234\215\345\212\241\345\231\250\345\220\216\347\253\257/api/migrations/0007_auto_20200901_1738.py" "b/1\343\200\201\345\220\210\345\220\214\347\263\273\347\273\237/contract-accounting-system-master/\346\234\215\345\212\241\345\231\250\345\220\216\347\253\257/api/migrations/0007_auto_20200901_1738.py" new file mode 100644 index 0000000..db565ec --- /dev/null +++ "b/1\343\200\201\345\220\210\345\220\214\347\263\273\347\273\237/contract-accounting-system-master/\346\234\215\345\212\241\345\231\250\345\220\216\347\253\257/api/migrations/0007_auto_20200901_1738.py" @@ -0,0 +1,36 @@ +# Generated by Django 2.2 on 2020-09-01 17:38 + +from django.db import migrations, models +import django.db.models.deletion + + +class Migration(migrations.Migration): + + dependencies = [ + ('api', '0006_auto_20200827_1145'), + ] + + operations = [ + migrations.AlterField( + model_name='contract_plan', + name='contract', + field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='api.Contract_info'), + ), + # migrations.CreateModel( + # name='Account_view', + # fields=[ + # ('type', models.CharField(max_length=2)), + # ('sysid', models.CharField(max_length=64, primary_key=True, serialize=False)), + # ('tableid', models.IntegerField(max_length=32)), + # ('cause', models.CharField(max_length=64)), + # ('money', models.DecimalField(decimal_places=2, max_digits=10)), + # ('account_date', models.DateTimeField(auto_now_add=True, null=True)), + # ('finish_flag', models.IntegerField()), + # ('expense_name', models.ForeignKey(on_delete=django.db.models.deletion.PROTECT, to='api.UserInfo')), + # ('project_name', models.ForeignKey(on_delete=django.db.models.deletion.PROTECT, to='api.Project_info')), + # ], + # options={ + # 'db_table': 'account_view', + # }, + # ), + ] diff --git "a/1\343\200\201\345\220\210\345\220\214\347\263\273\347\273\237/contract-accounting-system-master/\346\234\215\345\212\241\345\231\250\345\220\216\347\253\257/api/migrations/0008_auto_20200901_1743.py" "b/1\343\200\201\345\220\210\345\220\214\347\263\273\347\273\237/contract-accounting-system-master/\346\234\215\345\212\241\345\231\250\345\220\216\347\253\257/api/migrations/0008_auto_20200901_1743.py" new file mode 100644 index 0000000..b3393ec --- /dev/null +++ "b/1\343\200\201\345\220\210\345\220\214\347\263\273\347\273\237/contract-accounting-system-master/\346\234\215\345\212\241\345\231\250\345\220\216\347\253\257/api/migrations/0008_auto_20200901_1743.py" @@ -0,0 +1,36 @@ +# Generated by Django 2.2 on 2020-09-01 17:43 + +from django.db import migrations, models +import django.db.models.deletion + + +class Migration(migrations.Migration): + + dependencies = [ + ('api', '0007_auto_20200901_1738'), + ] + + operations = [ + migrations.RenameField( + model_name='contract_plan', + old_name='contract', + new_name='contractinfo', + ), + # migrations.CreateModel( + # name='Account_view', + # fields=[ + # ('type', models.CharField(max_length=2)), + # ('sysid', models.CharField(max_length=64, primary_key=True, serialize=False)), + # ('tableid', models.IntegerField(max_length=32)), + # ('cause', models.CharField(max_length=64)), + # ('money', models.DecimalField(decimal_places=2, max_digits=10)), + # ('account_date', models.DateTimeField(auto_now_add=True, null=True)), + # ('finish_flag', models.IntegerField()), + # ('expense_name', models.ForeignKey(on_delete=django.db.models.deletion.PROTECT, to='api.UserInfo')), + # ('project_name', models.ForeignKey(on_delete=django.db.models.deletion.PROTECT, to='api.Project_info')), + # ], + # options={ + # 'db_table': 'account_view', + # }, + # ), + ] diff --git "a/1\343\200\201\345\220\210\345\220\214\347\263\273\347\273\237/contract-accounting-system-master/\346\234\215\345\212\241\345\231\250\345\220\216\347\253\257/api/migrations/0009_auto_20200924_1133.py" "b/1\343\200\201\345\220\210\345\220\214\347\263\273\347\273\237/contract-accounting-system-master/\346\234\215\345\212\241\345\231\250\345\220\216\347\253\257/api/migrations/0009_auto_20200924_1133.py" new file mode 100644 index 0000000..0a6a6cf --- /dev/null +++ "b/1\343\200\201\345\220\210\345\220\214\347\263\273\347\273\237/contract-accounting-system-master/\346\234\215\345\212\241\345\231\250\345\220\216\347\253\257/api/migrations/0009_auto_20200924_1133.py" @@ -0,0 +1,37 @@ +# Generated by Django 2.2 on 2020-09-24 11:33 + +import api.models +from django.db import migrations, models +import django.db.models.deletion + + +class Migration(migrations.Migration): + + dependencies = [ + ('api', '0008_auto_20200901_1743'), + ] + + operations = [ + migrations.AlterField( + model_name='attachment', + name='file', + field=models.FileField(upload_to=api.models.get_file_path), + ), + # migrations.CreateModel( + # name='Account_view', + # fields=[ + # ('type', models.CharField(max_length=2)), + # ('sysid', models.CharField(max_length=64, primary_key=True, serialize=False)), + # ('tableid', models.IntegerField(max_length=32)), + # ('cause', models.CharField(max_length=64)), + # ('money', models.DecimalField(decimal_places=2, max_digits=10)), + # ('account_date', models.DateTimeField(auto_now_add=True, null=True)), + # ('finish_flag', models.IntegerField()), + # ('expense_name', models.ForeignKey(on_delete=django.db.models.deletion.PROTECT, to='api.UserInfo')), + # ('project_name', models.ForeignKey(on_delete=django.db.models.deletion.PROTECT, to='api.Project_info')), + # ], + # options={ + # 'db_table': 'account_view', + # }, + # ), + ] diff --git "a/1\343\200\201\345\220\210\345\220\214\347\263\273\347\273\237/contract-accounting-system-master/\346\234\215\345\212\241\345\231\250\345\220\216\347\253\257/api/migrations/0010_auto_20201030_1155.py" "b/1\343\200\201\345\220\210\345\220\214\347\263\273\347\273\237/contract-accounting-system-master/\346\234\215\345\212\241\345\231\250\345\220\216\347\253\257/api/migrations/0010_auto_20201030_1155.py" new file mode 100644 index 0000000..a6f0d32 --- /dev/null +++ "b/1\343\200\201\345\220\210\345\220\214\347\263\273\347\273\237/contract-accounting-system-master/\346\234\215\345\212\241\345\231\250\345\220\216\347\253\257/api/migrations/0010_auto_20201030_1155.py" @@ -0,0 +1,44 @@ +# Generated by Django 3.1.2 on 2020-10-30 11:55 + +import datetime +from django.db import migrations, models +import django.db.models.deletion + + +class Migration(migrations.Migration): + + dependencies = [ + ('api', '0009_auto_20200924_1133'), + ] + + operations = [ + migrations.AddField( + model_name='account_project', + name='end_addr', + field=models.CharField(default=datetime.datetime(2020, 10, 30, 11, 54, 58, 911034), max_length=64), + preserve_default=False, + ), + migrations.AddField( + model_name='account_project', + name='start_addr', + field=models.CharField(default=datetime.datetime(2020, 10, 30, 11, 55, 12, 733252), max_length=64), + preserve_default=False, + ), + # migrations.CreateModel( + # name='Account_view', + # fields=[ + # ('type', models.CharField(max_length=2)), + # ('sysid', models.CharField(max_length=64, primary_key=True, serialize=False)), + # ('tableid', models.IntegerField(max_length=32)), + # ('cause', models.CharField(max_length=64)), + # ('money', models.DecimalField(decimal_places=2, max_digits=10)), + # ('account_date', models.DateTimeField(auto_now_add=True, null=True)), + # ('finish_flag', models.IntegerField()), + # ('expense_name', models.ForeignKey(on_delete=django.db.models.deletion.PROTECT, to='api.userinfo')), + # ('project_name', models.ForeignKey(on_delete=django.db.models.deletion.PROTECT, to='api.project_info')), + # ], + # options={ + # 'db_table': 'account_view', + # }, + # ), + ] diff --git "a/1\343\200\201\345\220\210\345\220\214\347\263\273\347\273\237/contract-accounting-system-master/\346\234\215\345\212\241\345\231\250\345\220\216\347\253\257/api/migrations/0011_account_view.py" "b/1\343\200\201\345\220\210\345\220\214\347\263\273\347\273\237/contract-accounting-system-master/\346\234\215\345\212\241\345\231\250\345\220\216\347\253\257/api/migrations/0011_account_view.py" new file mode 100644 index 0000000..b9894a0 --- /dev/null +++ "b/1\343\200\201\345\220\210\345\220\214\347\263\273\347\273\237/contract-accounting-system-master/\346\234\215\345\212\241\345\231\250\345\220\216\347\253\257/api/migrations/0011_account_view.py" @@ -0,0 +1,31 @@ +# Generated by Django 2.2 on 2020-12-08 15:32 + +from django.db import migrations, models +import django.db.models.deletion + + +class Migration(migrations.Migration): + + dependencies = [ + ('api', '0010_auto_20201030_1155'), + ] + + operations = [ + # migrations.CreateModel( + # name='Account_view', + # fields=[ + # ('type', models.CharField(max_length=2)), + # ('sysid', models.CharField(max_length=64, primary_key=True, serialize=False)), + # ('tableid', models.IntegerField(max_length=32)), + # ('cause', models.CharField(max_length=64)), + # ('money', models.DecimalField(decimal_places=2, max_digits=10)), + # ('account_date', models.DateTimeField(auto_now_add=True, null=True)), + # ('finish_flag', models.IntegerField()), + # ('expense_name', models.ForeignKey(on_delete=django.db.models.deletion.PROTECT, to='api.UserInfo')), + # ('project_name', models.ForeignKey(on_delete=django.db.models.deletion.PROTECT, to='api.Project_info')), + # ], + # options={ + # 'db_table': 'account_view', + # }, + # ), + ] diff --git a/flask/__init__.py "b/1\343\200\201\345\220\210\345\220\214\347\263\273\347\273\237/contract-accounting-system-master/\346\234\215\345\212\241\345\231\250\345\220\216\347\253\257/api/migrations/__init__.py" similarity index 100% rename from flask/__init__.py rename to "1\343\200\201\345\220\210\345\220\214\347\263\273\347\273\237/contract-accounting-system-master/\346\234\215\345\212\241\345\231\250\345\220\216\347\253\257/api/migrations/__init__.py" diff --git "a/1\343\200\201\345\220\210\345\220\214\347\263\273\347\273\237/contract-accounting-system-master/\346\234\215\345\212\241\345\231\250\345\220\216\347\253\257/api/models.py" "b/1\343\200\201\345\220\210\345\220\214\347\263\273\347\273\237/contract-accounting-system-master/\346\234\215\345\212\241\345\231\250\345\220\216\347\253\257/api/models.py" new file mode 100644 index 0000000..0ee9b68 --- /dev/null +++ "b/1\343\200\201\345\220\210\345\220\214\347\263\273\347\273\237/contract-accounting-system-master/\346\234\215\345\212\241\345\231\250\345\220\216\347\253\257/api/models.py" @@ -0,0 +1,171 @@ +import os + +from django.db import models + +# Create your models here. +from django.db.models import ForeignKey, AutoField +from django.db.models.functions import datetime + +class AuthGroup(models.Model): + name = models.CharField(unique=True, max_length=150) + class Meta: + managed = False + db_table = 'home' +class Test(models.Model): + name = models.CharField(max_length=20) + +#用户信息表 +class UserInfo(models.Model): + user_type_choices = ( + (1,"普通用户"), + (2,"管理员"), + ) + user_type = models.IntegerField(choices=user_type_choices) + username = models.CharField(max_length=32,unique=True) + password = models.CharField(max_length=64) + name = models.CharField(max_length=32,unique=True,default="无名氏") + status = models.BooleanField(default=True) + department = models.ForeignKey(to="Department",on_delete=models.SET_NULL,null=True) + # + # @property + # def department_dept_name(self): + # return self.department.dept_name + +#用户令牌表 +class UserToken(models.Model): + user = models.OneToOneField(to='UserInfo',on_delete=models.CASCADE) + token = models.CharField(max_length=64) + +#职能部门表 +class Department(models.Model): + dept_name = models.CharField(max_length=64,unique=True,blank=False,default="技术部") + dept_manager = models.ForeignKey(to="UserInfo",on_delete=models.SET_NULL,null=True,related_name="dep_manager_user") + + + +#工程项目表 +class Project_info(models.Model): + project_name = models.CharField(max_length=64,unique=True,blank=False)#项目名称 + customer = models.ForeignKey(to="Entity_info",on_delete=models.PROTECT,related_name="project_customer")#项目的客户名 + owner = models.ForeignKey(to="Entity_info",on_delete=models.PROTECT,related_name="project_owner")#项目所属公司 + + +#单位信息表 +class Entity_info(models.Model): + entity_name = models.CharField(max_length=128,unique=True,blank=False)#单位名称 + entity_addr = models.CharField(max_length=128,null=True)#单位地址 + phone = models.CharField(max_length=32,null=True)#单位电话 + bank_addr = models.CharField(max_length=64,null=True) + bank_number = models.CharField(max_length=64,null=True)#银行帐号 + shuiHao = models.CharField(max_length=64,null=True)#税号 + explain = models.CharField(max_length=64,null=True)#备注 + +#合同信息表 +class Contract_info(models.Model): + contract_type_choices = ( + (1, "收款合同"), + (2, "付款合同"), + ) + project = models.ForeignKey(to="Project_info",on_delete=models.PROTECT) #项目信息 + contract_name = models.CharField(max_length=64)#合同名称 + contract_type = models.CharField(max_length=64,choices=contract_type_choices) #合同类型 + amount = models.DecimalField(max_digits=10,decimal_places=2) #合同金额 + body = models.ForeignKey (to="Entity_info", on_delete=models.PROTECT,related_name="body_entity") # 合同本方 + target = models.ForeignKey (to="Entity_info", on_delete=models.PROTECT)#合同对方 + Date_start = models.DateField()#签订日期 + Date_end = models.DateField(null=True)#合同到期日期 + attachment =models.ManyToManyField("attachment",verbose_name=u'附件',null=True) + taxes = models.DecimalField(max_digits=10,decimal_places=2,null=True) #税金成本 + explain = models.CharField(max_length=64,null=True)#备注 + +#合同财务计划表 +class Contract_plan(models.Model): + type_choices = ( + (0, "发票类型/未完成"), + (1, "资金类型/已完成"), + ) + contractinfo = models.ForeignKey(to="Contract_info",on_delete=models.CASCADE) #对应的合同,合同删除计划也被删除 + date_plan = models.DateField() # 计划日期 + money_plan = models.DecimalField(max_digits=10,decimal_places=2) # 计划金额project_name + contract_type = models.CharField(max_length=64,choices=type_choices)#计划类型 + finish_type = models.CharField(max_length=64,choices=type_choices)#完成款情况 + +#交通方式 +class Traffic_type(models.Model): + project_name = models.CharField (max_length=64,unique=True, blank=False) + + +#补贴表 +class Subsidize_info(models.Model): + Department = models.ForeignKey (to="Department", on_delete=models.SET_NULL,null=True) + money = models.DecimalField(max_digits=5,decimal_places=2) #金额天 + +#项目出差报销记帐表 +class Account_project(models.Model): + finish_flag_choices = ( + (0, "未完成报销"), + (1, "已完成报销"), + ) + expense_name = models.ForeignKey(to="UserInfo",on_delete=models.PROTECT)#报销人 + project_name = models.ForeignKey(to="Project_info",on_delete=models.PROTECT,null=True)#所属项目 + start_addr = models.CharField(max_length=64) + end_addr = models.CharField(max_length=64) + zhushu = models.DecimalField(max_digits=10,decimal_places=2) #住宿金额 + Type_traffic = models.ForeignKey(to="Traffic_type",on_delete=models.PROTECT)#交通方式 + money_traffic = models.DecimalField(max_digits=10,decimal_places=2) #交通费 + sumDate = models.IntegerField()#天数 + sumButie = models.DecimalField(max_digits=10, decimal_places=2,) # 总补贴费 + start_date = models.DateField(null=True) #开始日期 + end_date = models.DateField(null=True) #结束日期 + account_date = models.DateTimeField(blank=True, auto_now_add=True, null=True) # 报销日期 + explain = models.CharField(max_length=64) #备注 (在serializers.py里面设置运行为空) + finish_flag = models.CharField(max_length=64,choices=finish_flag_choices,default=finish_flag_choices[0][0]) #完成情况(在serializers.py里面设置运行为空) + approve = models.ForeignKey(to="UserInfo",on_delete=models.PROTECT,related_name="Accountproject_approve_user",null=True)#审批人 + approvetime = models.DateTimeField(null=True,blank=True,) #审批时间 + +#用户判断 +#class User_judgment(models.Model): + #user = models.CharField(max_length=32,unique=True) + +#其他报销 +class Account_normal(models.Model): + finish_flag_choices = ( + (0, "未完成报销"), + (1, "已完成报销"), + ) + expense_name = models.ForeignKey (to="UserInfo",on_delete=models.PROTECT) # 报销人 + date = models.DateField() #发生日期 + account_date = models.DateTimeField(blank=True,auto_now_add=True,null=True) # 报销日期 + money = models.DecimalField(max_digits=10 ,decimal_places=2) # 金额 + cause = models.CharField(max_length=64,blank=False) #报销内容 + project_name = models.ForeignKey (to="Project_info",null=True,on_delete=models.PROTECT) # 所属项目 + finish_flag = models.CharField (max_length=64,choices=finish_flag_choices, default=finish_flag_choices[0][0]) # 完成情况 + approve = models.ForeignKey(to="UserInfo", on_delete=models.PROTECT,related_name="Accountnormal_approve_user",null=True) # 审批人 + approvetime = models.DateTimeField(null=True,blank=True,) #审批时间 + +def get_file_path(instance,filename): + return 'files/合同附件/'+str(instance.hetong.id)+'/'+filename + +#附件表 +class attachment(models.Model): + # file_name = models.CharField(max_length=64) + # file = models.FileField(max_length=100,upload_to="files/") + file = models.FileField(max_length=100,upload_to=get_file_path) + hetong = models.ForeignKey(to="Contract_info",on_delete=models.CASCADE,related_name='attchments')#反向查询时候要用到这个related_name + #attachment = models.CharField(max_length=128, null=True) + def filename(self): + return os.path.basename (self.file.name) +#查询视图 +class Account_view(models.Model): + type = models.CharField(max_length=2) # 类型 + sysid = models.CharField(primary_key=True,max_length=64) + expense_name = models.ForeignKey(to="UserInfo", on_delete=models.PROTECT) # 报销人 + tableid = models.IntegerField(max_length=32) + project_name = models.ForeignKey(to="Project_info", on_delete=models.PROTECT) #所属项目 + cause = models.CharField(max_length=64, blank=False) # 报销事由 + money = models.DecimalField(max_digits=10, decimal_places=2) # 金额 + account_date = models.DateTimeField(blank=True, auto_now_add=True, null=True) # 报销日期 + finish_flag = models.IntegerField()# 完成情况 + + class Meta: + db_table = 'account_view' diff --git "a/1\343\200\201\345\220\210\345\220\214\347\263\273\347\273\237/contract-accounting-system-master/\346\234\215\345\212\241\345\231\250\345\220\216\347\253\257/api/serializers.py" "b/1\343\200\201\345\220\210\345\220\214\347\263\273\347\273\237/contract-accounting-system-master/\346\234\215\345\212\241\345\231\250\345\220\216\347\253\257/api/serializers.py" new file mode 100644 index 0000000..687acad --- /dev/null +++ "b/1\343\200\201\345\220\210\345\220\214\347\263\273\347\273\237/contract-accounting-system-master/\346\234\215\345\212\241\345\231\250\345\220\216\347\253\257/api/serializers.py" @@ -0,0 +1,250 @@ +# -*- coding: UTF-8 -*- +''' +@Author :程序员晚枫,B站/抖音/微博/小红书/公众号 +@WeChat :CoderWanFeng +@Blog :www.python-office.com +@Date :2022/12/28 21:03 +@Description : +''' +from django.utils import timezone +from rest_framework import serializers + +from api import models +from api.models import UserInfo, Test, Department, Entity_info, Project_info, Traffic_type, Account_project, \ + Account_normal, Account_view, Contract_plan, Contract_info, attachment + + +# class UserstestSerializer(serializers.ModelSerializer): +# department = serializers.ReadOnlyField (source='department.dept_name') +# +# # brand = serializers.SlugRelatedField(read_only=True ,slug_field='name') ① +# # brand = serializers.StringRelatedField(label='类别') ② +# class Meta: +# model = UserInfo +# fields = "__all__" +# + +#用户信息 +class UserSerializer(serializers.HyperlinkedModelSerializer): + user_type_choices = ( + (1, "普通用户"), + (2, "管理员"), + ) + #user_type = serializers.CharField(source='get_user_type_display') 这个是在枚举中选中的值直接显示 + dept_name = serializers.ReadOnlyField(source='department.dept_name') #这里的department是指mode中的字段名 + department_id = serializers.IntegerField(required=False,allow_null=True) + # abc = serializers.ReadOnlyField(source='user_type_choices') 这个可以自定义想要传送的对象 + # stutstxt = serializers.HyperlinkedIdentityField(view_name='tt', lookup_field='id', lookup_url_kwarg='pk') + class Meta: + model = UserInfo + #exclude = () + fields = ['url','id','user_type','username','password','status','department_id','name',"dept_name"] + + # fields = "__all__" + +class TestSerializer (serializers.HyperlinkedModelSerializer): + class Meta: + model = Test + fields = ['url','name'] +#部门信息 +class DepartmentSerializer(serializers.HyperlinkedModelSerializer): + dept_manager_id = serializers.IntegerField (required=False, allow_null=True) + dept_manager_name = serializers.ReadOnlyField(source='dept_manager.name') + class Meta: + model = Department + fields = ['url','id','dept_name','dept_manager_id','dept_manager_name'] +#交通方式 +class TrafficSerializer (serializers.HyperlinkedModelSerializer): + class Meta: + model = Traffic_type + fields = ['url','id','project_name'] + +#全局修改 +class AccountQGlistSerializer(serializers.ListSerializer): + def update(self, instance, validated_data): + for index, obj in enumerate (instance): + self.child.update (obj, validated_data[index]) + return instance + +#项目出差报销记帐表 +class AccountSerializer (serializers.ModelSerializer): + expense_name = serializers.HiddenField(default=serializers.CurrentUserDefault()) + finish_flag = serializers.HiddenField(default=0) + start_date = serializers.DateField (format="%Y-%m-%d") + end_date = serializers.DateField (format="%Y-%m-%d") + type_traffic_name = serializers.ReadOnlyField (source='Type_traffic.project_name') + # account_date = serializers.HiddenField(default=timezone.now().strftime("%Y-%m-%d %H:%M:%S")) + account_date = serializers.DateTimeField (format="%Y-%m-%d %H:%M:%S", required=False, read_only=True) + approve_id = serializers.IntegerField (required=False, allow_null=True) + approvetime = serializers.DateTimeField (format="%Y-%m-%d %H:%M:%S", required=False, read_only=True) + + class Meta: + model = Account_project + fields = "__all__" + + + #list_serializer_class = AccountQGlistSerializer + +#报销查询 +class AccountlistSerializer(serializers.ModelSerializer): + account_date = serializers.DateTimeField(format="%Y-%m-%d %H:%M:%S", required=False, read_only=True) + pj_name = serializers.ReadOnlyField(source='project_name.project_name') + user = serializers.ReadOnlyField(source='expense_name.name') #models里用户报销表的报销人.user info中的name + zhushu = serializers.DecimalField(max_digits=10,decimal_places=2,coerce_to_string = False) + money_traffic = serializers.DecimalField(max_digits=10,decimal_places=2,coerce_to_string = False) + sumButie = serializers.DecimalField(max_digits=10, decimal_places=2,coerce_to_string = False) + jtfs = serializers.ReadOnlyField(source='Type_traffic.project_name') + approve_id = serializers.IntegerField (required=False, allow_null=True) + approve_user = serializers.ReadOnlyField(source='approve.name') + approvetime = serializers.DateTimeField (format="%Y-%m-%d %H:%M:%S", required=False) + class Meta: + model = Account_project + fields = ['id','pj_name','user','project_name','start_addr','end_addr','expense_name','zhushu','jtfs','Type_traffic','money_traffic','sumDate','sumButie','start_date','end_date','account_date','explain','finish_flag','approve_id','approvetime','approve_user'] + list_serializer_class = AccountQGlistSerializer + #extra_kwargs = {'pj_name'} + #exclude = () + # def __init__(self, *args, **kwargs): + # user = kwargs['context']['request'].user + # super (AccountSerializer, self).__init__ (*args, **kwargs) + # self.fields['owner'].default = user + # self.fields['parent'].queryset = Account_project.objects.filter (owner=user) + +#其他报销 +class Account_normalSerializer(serializers.ModelSerializer): + project_name_id = serializers.IntegerField(required=False,allow_null=True) + expense_name = serializers.HiddenField(default=serializers.CurrentUserDefault()) + account_date = serializers.DateTimeField(format="%Y-%m-%d %H:%M:%S", required=False, read_only=True) + finish_flag = serializers.HiddenField(default=0) + approve_id = serializers.IntegerField(required=False,allow_null=True) + approvetime = serializers.DateTimeField(format="%Y-%m-%d %H:%M:%S",required=False, read_only=True) + class Meta: + model = Account_normal + fields = "__all__" + +#其他报销查询 +class normallistSerializer(serializers.ModelSerializer): + pj_name = serializers.ReadOnlyField(source='project_name.project_name') + account_date = serializers.DateTimeField(format="%Y-%m-%d %H:%M:%S", required=False, read_only=True) + user = serializers.ReadOnlyField(source='expense_name.name') + approve_id = serializers.IntegerField (required=False, allow_null=True) + approve_user = serializers.ReadOnlyField(source='approve.name') + approvetime = serializers.DateTimeField (format="%Y-%m-%d %H:%M:%S", required=False) + class Meta: + model = Account_normal + fields = ['id','user','pj_name','expense_name','date','account_date','money','cause','project_name','finish_flag','approve_id','approvetime','approve_user'] + list_serializer_class = AccountQGlistSerializer + +#单位信息 +class EntitySerializer (serializers.HyperlinkedModelSerializer): + id = serializers.SerializerMethodField ( ) + entity_addr = serializers.CharField(required=False,allow_blank=True) + phone = serializers.CharField(required=False,allow_blank=True) + bank_addr = serializers.CharField(required=False,allow_blank=True) + bank_number = serializers.CharField(required=False,allow_blank=True) + shuiHao = serializers.CharField(required=False,allow_blank=True) + explain = serializers.CharField(required=False,allow_blank=True) + def get_id(self, instance): + return instance.id + class Meta: + model = Entity_info + read_only_fields = ["id"] + fields = "__all__" + exclude = [] + + #项目信息 +class ProjectSerializer(serializers.HyperlinkedModelSerializer): + customer_id=serializers.IntegerField () + owner_id=serializers.IntegerField () + customer_name= serializers.CharField(source='customer.entity_name',read_only=True) + owner_name = serializers.CharField(source='owner.entity_name',read_only=True) + + class Meta: + model = Project_info + # read_only_fields = ["id"] + # fields = "__all__" + # exclude = [] + fields = ['url','id','customer_id','owner_id','project_name','customer_name','owner_name'] + +#查询视图 +class Account_viewSerializer(serializers.ModelSerializer): + account_date = serializers.DateTimeField(format="%Y-%m-%d %H:%M:%S", required=False, read_only=True) + user = serializers.ReadOnlyField(source='expense_name.name') #models里用户报销表的报销人.user info中的name + pj_name = serializers.ReadOnlyField(source='project_name.project_name') +# project_name_id = serializers.IntegerField(required=False, allow_null=True) +# tableid = serializers.CharField(max_length=64) +# cause = serializers.CharField(max_length=64) + money = serializers.DecimalField(max_digits=10, decimal_places=2,coerce_to_string = False) + class Meta: + model = Account_view + fields = ['type','sysid','expense_name','tableid','project_name','cause','money','account_date','finish_flag','user','pj_name'] + +# #全局修改 +# class viewListSerializer(serializers.ListSerializer): +# def update(self, instance, validated_data): +# # print(instance) # 要更新的对象们 +# # print(validated_data) # 更新的对象对应的数据们 +# # print(self.child) # 服务的模型序列化类 - V2BookModelSerializer +# for index, obj in enumerate(instance): +# self.child.update(obj, validated_data[index]) +# return instance + +#附件 +class attachmentSerializer(serializers.ModelSerializer): + filename = serializers.ReadOnlyField() + class Meta: + model = attachment + # read_only_fields = ["id"] + # fields = "__all__" + fields = ['id','file','hetong','filename'] + +#合同信息 +class Contract_infoSerializer(serializers.ModelSerializer): + #contract_name = serializers.CharField(required=False,allow_blank=True) + project_name = serializers.ReadOnlyField(source='project.project_name') + Date_start = serializers.DateField(format="%Y-%m-%d") + Date_end = serializers.DateField(format="%Y-%m-%d", required=False) + taxes = serializers.DecimalField(required=False,allow_null=True,max_digits=10,decimal_places=2,coerce_to_string = False) + explain = serializers.CharField(required=False,allow_blank=True) + amount = serializers.DecimalField(max_digits=10, decimal_places=2,coerce_to_string = False) + attchments = attachmentSerializer(many=True,read_only=True) + zj_percent=serializers.SerializerMethodField() + fp_percent=serializers.SerializerMethodField() + # attachment = serializers.ListField( + # allow_null=True, + # child=serializers.FileField(max_length=None,allow_empty_file=False, )) + #attachment = serializers.SerializerMethodField() + # attachment = serializers.SlugRelatedField(many=True, slug_field='file', queryset=models.attachment.objects.all(), allow_null=True) + # attachment = serializers.ManyRelatedField(serializers.SlugRelatedField(slug_field='file',source='attachment_id',queryset=models.attachment.objects.all()),) + # attachment = serializers.ManyRelatedField(required=False,allow_null=True,child_relation=serializers.SlugRelatedField(slug_field='file',source='attachment_id',queryset=models.attachment.objects.all())) + # def get_attachment(self,obj): + # query_set = models.attachment.objects.all() + # return [{'file_name':obj.file} for obj in query_set] + + class Meta: + model = Contract_info + fields = ['id','project_name','project','contract_name','contract_type','amount','body','target','Date_start','Date_end','taxes','explain','attchments','zj_percent','fp_percent'] + def get_zj_percent(self,obj): + s = 0 + #查询该合同对应的所有资金计划 + query_set = models.Contract_plan.objects.filter(contractinfo_id=obj.id,contract_type=1) + for infoObj in query_set: + if infoObj.finish_type == '1': + s += round ((infoObj.money_plan / obj.amount)* 100,2) + return s + def get_fp_percent(self,obj): + s = 0 + # 查询该合同对应的所有发票计划 + query_set = models.Contract_plan.objects.filter (contractinfo_id=obj.id, contract_type=0) + for infoObj in query_set: + if infoObj.finish_type == '1': + s += round ((infoObj.money_plan / obj.amount) * 100,2 ) + return s +#合同账务计划 +class Contract_planSerializer(serializers.ModelSerializer): + # contract_id =serializers.IntegerField () + date_plan = serializers.DateField(format="%Y-%m-%d", required=False) + money_plan = serializers.DecimalField(max_digits=10, decimal_places=2,coerce_to_string = False) + xiangmu = serializers.ReadOnlyField(source='contract.project') + class Meta: + model = Contract_plan + fields = ['id','xiangmu','contractinfo','date_plan','money_plan','contract_type','finish_type'] diff --git "a/1\343\200\201\345\220\210\345\220\214\347\263\273\347\273\237/contract-accounting-system-master/\346\234\215\345\212\241\345\231\250\345\220\216\347\253\257/api/tests.py" "b/1\343\200\201\345\220\210\345\220\214\347\263\273\347\273\237/contract-accounting-system-master/\346\234\215\345\212\241\345\231\250\345\220\216\347\253\257/api/tests.py" new file mode 100644 index 0000000..7ce503c --- /dev/null +++ "b/1\343\200\201\345\220\210\345\220\214\347\263\273\347\273\237/contract-accounting-system-master/\346\234\215\345\212\241\345\231\250\345\220\216\347\253\257/api/tests.py" @@ -0,0 +1,3 @@ +from django.test import TestCase + +# Create your tests here. diff --git "a/1\343\200\201\345\220\210\345\220\214\347\263\273\347\273\237/contract-accounting-system-master/\346\234\215\345\212\241\345\231\250\345\220\216\347\253\257/api/urls.py" "b/1\343\200\201\345\220\210\345\220\214\347\263\273\347\273\237/contract-accounting-system-master/\346\234\215\345\212\241\345\231\250\345\220\216\347\253\257/api/urls.py" new file mode 100644 index 0000000..96cfa85 --- /dev/null +++ "b/1\343\200\201\345\220\210\345\220\214\347\263\273\347\273\237/contract-accounting-system-master/\346\234\215\345\212\241\345\231\250\345\220\216\347\253\257/api/urls.py" @@ -0,0 +1,43 @@ +from rest_framework.routers import DefaultRouter +from django.urls import path + + +from api.views import UserViewSet, TestViewSet, DepartmentViewSet, EntityViewSet, ProjectViewSet, \ + TrafficViewSet, AccountViewSet, Account_normalViewSet, Account_viewViewSet, Contract_planViewSet, \ + Contract_infoViewSet, attachmentViewSet, EntityAllViewSet, ProjectAllViewSet, UserAllViewSet, ZhuChe +from . import views + +router = DefaultRouter() +router.register(r'users',UserViewSet) +router.register(r'usersall',UserAllViewSet) +# router.register(r'userstest',UsertestViewSet) +router.register(r'dept',DepartmentViewSet) +router.register(r'entity',EntityViewSet) +router.register(r'entityall',EntityAllViewSet) +router.register(r'projects',ProjectViewSet) +router.register(r'projectsall',ProjectAllViewSet) +router.register(r'test',TestViewSet) +router.register(r'traffictypes',TrafficViewSet) +router.register(r'Account_projects',AccountViewSet,basename = 'Account_projects') +router.register(r'Account_normals',Account_normalViewSet) +router.register(r'Account_views',Account_viewViewSet) +router.register(r'Contract_plans',Contract_planViewSet) +router.register(r'Contract_infos',Contract_infoViewSet) +router.register(r'attachments',attachmentViewSet) + + + +urlpatterns = [ + # path('', views.index, name='index'), + # path('testdb', views.testdb), + path('dog', views.DogView.as_view()), + path('getUserInfo', views.getUserInfo), + path('login', views.Login.as_view()), + path('getdata',views.TestData.as_view()), + path('zhuche',ZhuChe.as_view()), + # path('menus',views.GetMenus.as_view()), +] + +urlpatterns += router.urls + + diff --git a/flask/apps/app1/models.py "b/1\343\200\201\345\220\210\345\220\214\347\263\273\347\273\237/contract-accounting-system-master/\346\234\215\345\212\241\345\231\250\345\220\216\347\253\257/api/utils/__init__.py" similarity index 100% rename from flask/apps/app1/models.py rename to "1\343\200\201\345\220\210\345\220\214\347\263\273\347\273\237/contract-accounting-system-master/\346\234\215\345\212\241\345\231\250\345\220\216\347\253\257/api/utils/__init__.py" diff --git "a/1\343\200\201\345\220\210\345\220\214\347\263\273\347\273\237/contract-accounting-system-master/\346\234\215\345\212\241\345\231\250\345\220\216\347\253\257/api/utils/apiurls" "b/1\343\200\201\345\220\210\345\220\214\347\263\273\347\273\237/contract-accounting-system-master/\346\234\215\345\212\241\345\231\250\345\220\216\347\253\257/api/utils/apiurls" new file mode 100644 index 0000000..0e23151 --- /dev/null +++ "b/1\343\200\201\345\220\210\345\220\214\347\263\273\347\273\237/contract-accounting-system-master/\346\234\215\345\212\241\345\231\250\345\220\216\347\253\257/api/utils/apiurls" @@ -0,0 +1,8 @@ +from django.conf.urls import url +from django.contrib.auth import views + +app_name = 'rest_framework' +urlpatterns = [ + url(r'^login/$', views.LoginView.as_view(template_name='rest_framework/login.html'), name='login'), + url(r'^logout/$', views.LogoutView.as_view(), name='logout'), +] diff --git "a/1\343\200\201\345\220\210\345\220\214\347\263\273\347\273\237/contract-accounting-system-master/\346\234\215\345\212\241\345\231\250\345\220\216\347\253\257/api/utils/auth.py" "b/1\343\200\201\345\220\210\345\220\214\347\263\273\347\273\237/contract-accounting-system-master/\346\234\215\345\212\241\345\231\250\345\220\216\347\253\257/api/utils/auth.py" new file mode 100644 index 0000000..3362608 --- /dev/null +++ "b/1\343\200\201\345\220\210\345\220\214\347\263\273\347\273\237/contract-accounting-system-master/\346\234\215\345\212\241\345\231\250\345\220\216\347\253\257/api/utils/auth.py" @@ -0,0 +1,205 @@ +import hashlib + +from django.contrib.auth.backends import ModelBackend, AllowAllUsersModelBackend +from django.db.models import Q +from rest_framework import exceptions, permissions +from rest_framework.authentication import BasicAuthentication,TokenAuthentication +from rest_framework.permissions import BasePermission +from django.db import models +from api import models +from rest_framework import HTTP_HEADER_ENCODING +from rest_framework.parsers import FormParser + +from api.models import UserInfo + + +def get_authorization_header(request): + """ + Return request's 'Authorization:' header, as a bytestring. + Hide some test client ickyness where the header can be unicode. + """ + auth = request.META.get('HTTP_AUTHORIZATION', b'') + if isinstance(auth, type('')): + # Work around django test client oddness + auth = auth.encode(HTTP_HEADER_ENCODING) + return auth + +#权限认证 +class ApiPermission1(BasePermission): + message = "需要2级权限" + def has_permission(self,request,view): + if request.user.user_type !=2: #判断权限类型 + return False + return True +class ApiPermission2(object): + def has_permission(self,request,view): + if request.user.user_type ==1: #判断权限类型 + return True + return False + +#普通用户只能改自己的密码 +class IsAdminOrReadOnlyForUser(permissions.BasePermission): + def has_object_permission(self, request, view, obj): # 带具体id检测 + # 管理员放行 + if request.user.user_type == 2: + return True + #安全方法放行 + if request.method in permissions.SAFE_METHODS: + return obj == request.user + #如果PATCH方法是改密码并且是自己的密码 + if request.method in ('PATCH'): + return ('password' in request.data) & (obj == request.user) + + return False + def has_permission(self, request, view):#全局检测 所有url 这个方法在先 + """ + Return `True` if permission is granted, `False` otherwise. + """ + print ("开始检查权限整体") + if request.method in permissions.SAFE_METHODS: + return True + if request.user.user_type == 2: + #print ("这是个管理员,让他去") + return True + #Put delete path 操作 + if request.method not in permissions.SAFE_METHODS: + url = ("/api/users/") + request = request._request + #如果是单个对象操作,放行 + if request.path not in url: + return True + else: + return False + return False +#不是管理员只有只读权限 +class IsAdminOrReadOnly(permissions.BasePermission): + def has_object_permission(self, request, view, obj): # 带具体id检测 + #安全方法放行 + if request.method in permissions.SAFE_METHODS: + return True + #管理员放行 + if request.user.user_type == 2: + return True + return False + def has_permission(self, request, view): + return bool( + request.method in permissions.SAFE_METHODS or + request.user and + request.user.user_type == 2 + ) +#只有管理员和对象本人才可以修改删除,否则只能读取 +class IsOwnerOrReadOnly(permissions.BasePermission): + def has_object_permission(self, request, view, obj): + # Read permissions are allowed to any request, + # so we'll always allow GET, HEAD or OPTIONS requests. + if request.method in permissions.SAFE_METHODS: + print("安全方法") + return True + if request.user.user_type == 2: + return True + # Instance must have an attribute named `owner`. + # return obj.user == request.user 这里的request.user是认证时候给过来的返回值 + return obj == request.user + +#只有管理员和对象本人才可以修改删除,否则只能读取,而且一但状态变成已报销后不能做DML操作 +class IsOwnerOrReadOnlyForAccount(permissions.BasePermission): + def has_object_permission(self, request, view, obj):#带具体id检测 + # Read permissions are allowed to any request, + # so we'll always allow GET, HEAD or OPTIONS requests. + # print("开始检查对象权限") + if request.method in permissions.SAFE_METHODS: + # print ("安全方法") + return True + if request.user.user_type == 2: + # print ("这是个管理员,让他去") + return True + # Instance must have an attribute named `owner`. + # 判断出差记录的报销人 + if request.method in ('DELETE','PUT','PATCH'): + # print ("这是一个'DELETE','PUT'请求",'PATCH') + # print('完成状态是'+obj.finish_flag) + if obj.finish_flag == '0': + return obj.expense_name == request.user + else: + return False + print ("最后的判断") + return obj.expense_name == request.user + + def has_permission(self, request, view):#全局检测 所有url + """ + Return `True` if permission is granted, `False` otherwise. + """ + print ("开始检查权限整体") + if request.user.user_type == 2: + print ("这是个管理员,让他去") + return True + if request.method in ("POST",): + return True + #Put delete path 操作 + if request.method not in permissions.SAFE_METHODS: + url = ("/api/Account_normals/","/api/Account_projects/",) + request = request._request + #如果是单个对象操作,放行 + if request.path not in url: + return True + else: + return False + # except : + # return False + # if request.method not in permissions.SAFE_METHODS: + # request.user + + return True +# 默认请求验证类 +class ApiAuthentication(TokenAuthentication): + def authenticate(self,request): + token = request.META.get('HTTP_AUTHORIZATION') + token_obj = models.UserToken.objects.filter(token=token).first() + if not token_obj: + raise exceptions.AuthenticationFailed('用户认证失败!') + #rest framework内部会用到元组内的两个字段段,request.user request.auth + return (token_obj.user,token_obj) + def authenticate_header(self,val): + pass + +class IsOwnerOrReadOnlyForAccountView(permissions.BasePermission): + def has_object_permission(self, request, view, obj): + # Read permissions are allowed to any request, + # so we'll always allow GET, HEAD or OPTIONS requests. + print("开始检查对象权限") + # if request.method in permissions.SAFE_METHODS: + # return True + if request.user.user_type == 2: + return True + # Instance must have an attribute named `owner`. + # 判断出差记录的报销人 + # if request.method in ('GET'): + # if obj.finish_flag == '0': + # return obj.expense_name == request.user + # else: + # return False + print(obj.expense_name == request.user) + return obj.expense_name == request.user + def has_permission(self, request, view): + """ + Return `True` if permission is granted, `False` otherwise. + """ + # print ("ajajajajajjajajajajajjajaj") + return True + +# 默认请求验证类 + +class CusertomBackend(AllowAllUsersModelBackend): + def authenticate(self, request, username=None, password=None, **kwargs): + try: + user = UserInfo.objects.get (username=username) + + if user.password == password: + return user + except Exception as e: + print (e) + return None + # try: + # id = request.data['id'] + # obj = models.UserToken.objects.filter(id=id).first() + # if obj['expense_name'] == request.user.id: diff --git "a/1\343\200\201\345\220\210\345\220\214\347\263\273\347\273\237/contract-accounting-system-master/\346\234\215\345\212\241\345\231\250\345\220\216\347\253\257/api/utils/config.bak" "b/1\343\200\201\345\220\210\345\220\214\347\263\273\347\273\237/contract-accounting-system-master/\346\234\215\345\212\241\345\231\250\345\220\216\347\253\257/api/utils/config.bak" new file mode 100644 index 0000000..be8b68e --- /dev/null +++ "b/1\343\200\201\345\220\210\345\220\214\347\263\273\347\273\237/contract-accounting-system-master/\346\234\215\345\212\241\345\231\250\345\220\216\347\253\257/api/utils/config.bak" @@ -0,0 +1,71 @@ +import hashlib +import configparser +import os + +from django.utils.deprecation import MiddlewareMixin + +from ApiServer import settings +from api.utils import httpback +from api.utils.httpback import HttpCode + + +class InitMiddle(MiddlewareMixin): + def process_request(self,request): + path = request.path_info + if path == "/api/zhuche": + pass + else: + if settings.INITCHECK == "istactive": + pass + else: + return httpback.result(code=HttpCode.notregister,message="系统未注册") + # return HttpResponse ("请求频率过快,请稍后重试", status=503) + # def process_response(self, request, response): + # print ('走了') + # return response +def getHostid(): + import uuid + node = uuid.getnode ( ) + mac = uuid.UUID (int=node).hex[-12:] + hostid = hashlib.md5 ((mac + '十年寒窗无人问').encode (encoding='UTF-8')).hexdigest ( ) + return hostid + +def getLicense(): + curpath = os.path.dirname (os.path.realpath (__file__)) # 当前文件路径 + inipath = os.path.join (curpath, "test_config.ini") + conf = configparser.ConfigParser ( ) + # 读内容 + conf.read (inipath, encoding="utf-8") + return conf.get ("hostid_conf", "license") + +def putLicense(license): + try : + curpath = os.path.dirname (os.path.realpath (__file__)) # 当前文件路径 + inipath = os.path.join (curpath, "test_config.ini") + conf = configparser.ConfigParser ( ) + # 读内容再写 + conf.read (inipath, encoding="utf-8") + conf.set ("hostid_conf", "license", license) + conf.write (open (inipath, "r+", encoding="utf-8")) + except Exception: + return False + return True + +def init(license): + hostid = getHostid() + a = hashlib.md5 ((hostid + 'liu008').encode (encoding='UTF-8')).hexdigest() + b = hashlib.md5((a+'都是寒门苦命人,你不讲武德').encode(encoding='UTF-8')).hexdigest() + if b == license: + #设置全局变量 + settings.INITCHECK = "istactive" + return True + else: + return False +def startInit(): + license = getLicense() + init(license) +# 读取配置文件变量 +# def global_settings(): +# return {"INITCHECK":settings.INITCHECK} +# settings.INITCHECK = "istactive" +# print(settings.INITCHECK) diff --git "a/1\343\200\201\345\220\210\345\220\214\347\263\273\347\273\237/contract-accounting-system-master/\346\234\215\345\212\241\345\231\250\345\220\216\347\253\257/api/utils/config.pyd" "b/1\343\200\201\345\220\210\345\220\214\347\263\273\347\273\237/contract-accounting-system-master/\346\234\215\345\212\241\345\231\250\345\220\216\347\253\257/api/utils/config.pyd" new file mode 100644 index 0000000..d5689d4 Binary files /dev/null and "b/1\343\200\201\345\220\210\345\220\214\347\263\273\347\273\237/contract-accounting-system-master/\346\234\215\345\212\241\345\231\250\345\220\216\347\253\257/api/utils/config.pyd" differ diff --git "a/1\343\200\201\345\220\210\345\220\214\347\263\273\347\273\237/contract-accounting-system-master/\346\234\215\345\212\241\345\231\250\345\220\216\347\253\257/api/utils/config.so" "b/1\343\200\201\345\220\210\345\220\214\347\263\273\347\273\237/contract-accounting-system-master/\346\234\215\345\212\241\345\231\250\345\220\216\347\253\257/api/utils/config.so" new file mode 100644 index 0000000..12fc37d Binary files /dev/null and "b/1\343\200\201\345\220\210\345\220\214\347\263\273\347\273\237/contract-accounting-system-master/\346\234\215\345\212\241\345\231\250\345\220\216\347\253\257/api/utils/config.so" differ diff --git "a/1\343\200\201\345\220\210\345\220\214\347\263\273\347\273\237/contract-accounting-system-master/\346\234\215\345\212\241\345\231\250\345\220\216\347\253\257/api/utils/httpback.py" "b/1\343\200\201\345\220\210\345\220\214\347\263\273\347\273\237/contract-accounting-system-master/\346\234\215\345\212\241\345\231\250\345\220\216\347\253\257/api/utils/httpback.py" new file mode 100644 index 0000000..e417edf --- /dev/null +++ "b/1\343\200\201\345\220\210\345\220\214\347\263\273\347\273\237/contract-accounting-system-master/\346\234\215\345\212\241\345\231\250\345\220\216\347\253\257/api/utils/httpback.py" @@ -0,0 +1,55 @@ + +# 自定义状态码 +from django.core.serializers.json import DjangoJSONEncoder +from django.http import JsonResponse + + +class HttpCode(object): + # 正常登陆 + ok = 200 + #未注册 + notregister = 300 + # 参数错误 + paramserror = 400 + # 权限错误 + unauth = 401 + # 方法错误 + methoderror = 405 + + # 服务器内部错误 + servererror = 500 + + +# 定义统一的 json 字符串返回格式 +def result(code=HttpCode.ok, message="", data=None, kwargs=None): + json_dict = {"code": code, "message": message, "data": data} + # isinstance(object对象, 类型):判断是否数据xx类型 + if kwargs and isinstance (kwargs, dict) and kwargs.keys ( ): + json_dict.update (kwargs) + response = JsonResponse (json_dict,json_dumps_params={'ensure_ascii':False},status=code) + + return response + + +def ok(): + return result ( ) + + +# 参数错误 +def params_error(message="", data=None): + return result (code=HttpCode.paramserror, message=message, data=data) + + +# 权限错误 +def unauth(message="", data=None): + return result (code=HttpCode.unauth, message=message, data=data) + + +# 方法错误 +def method_error(message="", data=None): + return result (code=HttpCode.methoderror, message=message, data=data) + + +# 服务器内部错误 +def server_error(message="", data=None): + return result (code=HttpCode.servererror, message=message, data=data) diff --git "a/1\343\200\201\345\220\210\345\220\214\347\263\273\347\273\237/contract-accounting-system-master/\346\234\215\345\212\241\345\231\250\345\220\216\347\253\257/api/utils/myException.py" "b/1\343\200\201\345\220\210\345\220\214\347\263\273\347\273\237/contract-accounting-system-master/\346\234\215\345\212\241\345\231\250\345\220\216\347\253\257/api/utils/myException.py" new file mode 100644 index 0000000..d121a57 --- /dev/null +++ "b/1\343\200\201\345\220\210\345\220\214\347\263\273\347\273\237/contract-accounting-system-master/\346\234\215\345\212\241\345\231\250\345\220\216\347\253\257/api/utils/myException.py" @@ -0,0 +1,21 @@ +from rest_framework.response import Response +from rest_framework.views import exception_handler + +def custom_exception_handler(exc, context): + # 先调用DRF默认的 exception_handler 方法, 对异常进行处理, + # 如果处理成功,会返回一个`Response`类型的对象 + response = exception_handler(exc, context) + + if response is None: + # 项目出错了,但DRF框架对出错的异常没有处理, + # 可以在此处对异常进行统一处理,比如:保存出错信息到日志文件 + view = context['view'] # 出错的视图 + error = '服务器内部错误, %s' % exc + print(context) + print('111111111%s: %s' % (view, error)) + #如果是因为数据库外键关键出错,提示550 + if 'through a protected foreign' in error: + return Response({'detail': error}, status=550) + return Response({'detail': error}, status=500) + + return response diff --git "a/1\343\200\201\345\220\210\345\220\214\347\263\273\347\273\237/contract-accounting-system-master/\346\234\215\345\212\241\345\231\250\345\220\216\347\253\257/api/utils/myfilters.py" "b/1\343\200\201\345\220\210\345\220\214\347\263\273\347\273\237/contract-accounting-system-master/\346\234\215\345\212\241\345\231\250\345\220\216\347\253\257/api/utils/myfilters.py" new file mode 100644 index 0000000..8fb85aa --- /dev/null +++ "b/1\343\200\201\345\220\210\345\220\214\347\263\273\347\273\237/contract-accounting-system-master/\346\234\215\345\212\241\345\231\250\345\220\216\347\253\257/api/utils/myfilters.py" @@ -0,0 +1,74 @@ +from django.db.models import Q +from django_filters.rest_framework.filterset import FilterSet + +from ..import models +from django_filters import filters + + + +class project_FilterSet(FilterSet): + # 区间查询,指定区间的最大最小值 + # min_price = filters.NumberFilter (field_name='price', lookup_expr='gte') # gte lte 源码里面有,表示最大最小值 + # max_price = filters.NumberFilter (field_name='price', lookup_expr='lte') + # 模糊查询,这里带i是忽略大小写 + # name = filters.CharFilter (field_name="name", lookup_expr="icontains") + sort = filters.OrderingFilter(fields=('id',)) + class Meta: + model = models.Project_info + fields = "__all__" + + +class Account_project_FilterSet(FilterSet): + # 区间查询,指定区间的最大最小值 + # min_price = filters.NumberFilter (field_name='price', lookup_expr='gte') # gte lte 源码里面有,表示最大最小值 + # max_price = filters.NumberFilter (field_name='price', lookup_expr='lte') + # 模糊查询,这里带i是忽略大小写 + # name = filters.CharFilter (field_name="name", lookup_expr="icontains") + class Meta: + model = models.Account_project + fields = ['project_name','expense_name','finish_flag'] + +class UserInfo_FilterSet(FilterSet): + query = filters.CharFilter (field_name="name", lookup_expr="icontains") + class Meta: + model = models.UserInfo + fields = ['query',] + +class Account_normal_FilterSet(FilterSet): + class Meta: + model = models.Account_normal + fields = ['project_name', 'expense_name', 'finish_flag'] + +class Account_view_FilterSet(FilterSet): + # query=filters.CharFilter(field_name='project_name__project_name', lookup_expr="icontains") + + query = filters.CharFilter(method='filter_case',lookup_expr="icontains") + timelte = filters.CharFilter(field_name='account_date',lookup_expr="lte") + timegte = filters.CharFilter(field_name='account_date',lookup_expr="gte") + #query = filters.CharFilter(field_name="project_name", lookup_expr="icontains") + # query = filters.CharFilter(field_name="cause", lookup_expr="icontains") + #records = query1 | query2 + # def filter_time(self,queryset,name,value): + # return queryset.filter(Q(account_date__gte=value[0])&Q(account_date__lte=value[1])) + def filter_case(self,queryset,name,value): + return queryset.filter(Q(project_name__project_name__icontains=value)|Q(cause__icontains=value)) + class Meta: + model = models.Account_view + fields = ['query','project_name', 'expense_name', 'finish_flag','type','timelte','timegte'] + +class Contract_info_FilterSet(FilterSet): + searchyear = filters.DateFilter(method='filter_searchyear') + query = filters.CharFilter(method='filter_case',lookup_expr="icontains") + def filter_searchyear(self,queryset,name,value): + year = format(value, '%Y') + return queryset.filter(Q(Date_start__year=year)) + def filter_case(self,queryset,name,value): + return queryset.filter(Q(project__project_name__icontains=value)|Q(explain__icontains=value)|Q(contract_name__icontains=value)) + class Meta: + model = models.Contract_info + fields = ['project', 'contract_type','query','searchyear'] + +class Cotract_plan_FilerSet(FilterSet): + class Meta: + model = models.Contract_plan + fields = '__all__' diff --git "a/1\343\200\201\345\220\210\345\220\214\347\263\273\347\273\237/contract-accounting-system-master/\346\234\215\345\212\241\345\231\250\345\220\216\347\253\257/api/utils/pageutils.py" "b/1\343\200\201\345\220\210\345\220\214\347\263\273\347\273\237/contract-accounting-system-master/\346\234\215\345\212\241\345\231\250\345\220\216\347\253\257/api/utils/pageutils.py" new file mode 100644 index 0000000..a7567b4 --- /dev/null +++ "b/1\343\200\201\345\220\210\345\220\214\347\263\273\347\273\237/contract-accounting-system-master/\346\234\215\345\212\241\345\231\250\345\220\216\347\253\257/api/utils/pageutils.py" @@ -0,0 +1,14 @@ +from rest_framework.pagination import PageNumberPagination + +''' +page_query_param:表示url中的页码参数 +page_size_query_param:表示url中每页数量参数 +page_size:表示每页的默认显示数量 +max_page_size:表示每页最大显示数量,做限制使用,避免突然大量的查询数据,数据库崩溃 +''' +class MyPageNumberPagination(PageNumberPagination): + page_size = 20 + max_page_size = 200 + page_size_query_param = 'size' + page_query_param = 'page' + diff --git "a/1\343\200\201\345\220\210\345\220\214\347\263\273\347\273\237/contract-accounting-system-master/\346\234\215\345\212\241\345\231\250\345\220\216\347\253\257/api/utils/setup.py" "b/1\343\200\201\345\220\210\345\220\214\347\263\273\347\273\237/contract-accounting-system-master/\346\234\215\345\212\241\345\231\250\345\220\216\347\253\257/api/utils/setup.py" new file mode 100644 index 0000000..2cb8dc4 --- /dev/null +++ "b/1\343\200\201\345\220\210\345\220\214\347\263\273\347\273\237/contract-accounting-system-master/\346\234\215\345\212\241\345\231\250\345\220\216\347\253\257/api/utils/setup.py" @@ -0,0 +1,4 @@ +from api.utils import config + +a = config.getHostid() +print(a) diff --git "a/1\343\200\201\345\220\210\345\220\214\347\263\273\347\273\237/contract-accounting-system-master/\346\234\215\345\212\241\345\231\250\345\220\216\347\253\257/api/utils/test_config.ini" "b/1\343\200\201\345\220\210\345\220\214\347\263\273\347\273\237/contract-accounting-system-master/\346\234\215\345\212\241\345\231\250\345\220\216\347\253\257/api/utils/test_config.ini" new file mode 100644 index 0000000..c939d5f --- /dev/null +++ "b/1\343\200\201\345\220\210\345\220\214\347\263\273\347\273\237/contract-accounting-system-master/\346\234\215\345\212\241\345\231\250\345\220\216\347\253\257/api/utils/test_config.ini" @@ -0,0 +1,4 @@ +[hostid_conf] +hostid = +license = + diff --git "a/1\343\200\201\345\220\210\345\220\214\347\263\273\347\273\237/contract-accounting-system-master/\346\234\215\345\212\241\345\231\250\345\220\216\347\253\257/api/views.py" "b/1\343\200\201\345\220\210\345\220\214\347\263\273\347\273\237/contract-accounting-system-master/\346\234\215\345\212\241\345\231\250\345\220\216\347\253\257/api/views.py" new file mode 100644 index 0000000..0d88de7 --- /dev/null +++ "b/1\343\200\201\345\220\210\345\220\214\347\263\273\347\273\237/contract-accounting-system-master/\346\234\215\345\212\241\345\231\250\345\220\216\347\253\257/api/views.py" @@ -0,0 +1,542 @@ +from django.db.models.functions import datetime +from django.http import JsonResponse +from django.http import HttpResponse,HttpResponseRedirect +from rest_framework.decorators import api_view +from rest_framework.response import Response +from rest_framework.utils import json +from api.utils import auth + +from api import models, serializers +from api.models import Test + +# Create your views here. +from api.serializers import UserSerializer, TestSerializer, DepartmentSerializer, EntitySerializer, ProjectSerializer, \ + TrafficSerializer, AccountSerializer, Account_normalSerializer, AccountlistSerializer, normallistSerializer, \ + Account_viewSerializer, Contract_planSerializer, Contract_infoSerializer, attachmentSerializer +from api.utils import httpback +from api.utils.auth import ApiPermission2, IsOwnerOrReadOnly, IsOwnerOrReadOnlyForAccount, \ + IsOwnerOrReadOnlyForAccountView, IsAdminOrReadOnly, IsAdminOrReadOnlyForUser +from api.utils import config +from api.utils.httpback import HttpCode +from api.utils.myfilters import Account_project_FilterSet, UserInfo_FilterSet, Account_normal_FilterSet, \ + Account_view_FilterSet, Contract_info_FilterSet, Cotract_plan_FilerSet, project_FilterSet +from api.utils.pageutils import MyPageNumberPagination +from django.conf import settings + +def index(request): + return HttpResponseRedirect ("/api") + + +# 测试数据库操作 +def testdb(request): + test1 = Test (name='liu008.com') + test1.save ( ) + return HttpResponse ("

数据添加成功!

") + + +from rest_framework.views import APIView +from rest_framework.authentication import BasicAuthentication +from rest_framework import exceptions, viewsets + + +#########################REST API 验证 +class MyAuthentication (BasicAuthentication): + def authenticate(self, request): + token = request._request.GET.get ('token') + if not token: + raise exceptions.AuthenticationFailed ('用户认证失败') + return {"alex", None} + + def authenticate_header(self, val): + pass + + +class DogView (APIView): + # authentication_classes = [MyAuthentication, ] + + def get(self, request, *args, **kwargs): + ret = {'code': 1000, 'msg': 'xxxxx'} + return HttpResponse (json.dumps (ret), status=201) + + +##########数据库查表认证 +def md5(user): + import hashlib + import time + + ctime = str (time.time ( )) + m = hashlib.md5 (bytes (user, encoding='utf-8')) + m.update (bytes (ctime, encoding='utf-8')) + return m.hexdigest ( ) + + +##---------------------登录验证 +class Login (APIView): + authentication_classes = [] # 列表里写入验证类,为空代表不需要验证 + + # permission_classes = [ApiPermission] #列表里写入权限控制类 + # parser_classes = [FileUploadParser] #单独指定解析器 + def post(self, request, *args, **kwargs): + # self.dispatch() + ret = {'data': {'email': None, 'id': None, 'mobile': None, 'rid': None, 'token': None, 'username': None, + 'name': None}, + 'meta': {'msg': "", 'status': 200}} + try: + data = request.data + user = data['username'] + pwd = data['password'] + print("用户名为:" + user + "想来登录") + # print ("用户名为:" + user + "想来登录") + obj = models.UserInfo.objects.filter (username=user, password=pwd).first ( ) + + if not obj: # 如果取不出 + ret['meta']['status'] = 1001 + ret['meta']['msg'] = "用户名密码错误" + return JsonResponse (ret) + token = md5 (user) + # 在数据表中写入或更新token + print (user + "登录成功") + models.UserToken.objects.update_or_create (user=obj, defaults={'token': token}) + ret['data']['token'] = token + ret['data']['id'] = obj.id + ret['data']['name'] = obj.name + except Exception as e: + print(e) + ret['meta']['status'] = 1001 + ret['meta']['msg'] = "请求异常" + return JsonResponse (ret) + +#通过token取个人信息 +@api_view(http_method_names=['POST']) +def getUserInfo(request): + data = request.data + token = data['token'] + try: + if not len(token)==0:#如果有token + print("token有值") + print(token+"999") + user = models.UserToken.objects.filter (token=token).first() + if user:#如果有返回用户 + user = user.user#查询数据并通过外键关键拿到用户对象 + else: + return httpback.params_error(message="别乱拿假数据过来!") + ul = UserSerializer(user,context={'request': request}) + data = ul.data + else: + return httpback.params_error(message="you have no token!") + except Exception as e: + # print(e) + return httpback.server_error( ) + + return httpback.result(data=data,message="ok") + + + +class ZhuChe(APIView): + authentication_classes = [] # 列表里写入验证类,为空代表不需要验证 + def get(self,request): + hostid = config.getHostid() + license =config.getLicense() + if license =="": + msg = "not register" + else: + if(config.init(license)): + msg = "registered" + else: + msg = "not register" + + return httpback.result(data={'hostid':hostid,'license':license},message=msg) + + def post(self,request, *args, **kwargs): + try: + data = request.data + license = data['license'] + if config.init(license): + #写入license + config.putLicense(license) + return httpback.result(message='ok') + else: + return httpback.result(code=HttpCode.paramserror,message="注册码有误") + except Exception as e: + # print(e) + return httpback.server_error ( ) +class TestData (APIView): + permission_classes = [ApiPermission2] + + def get(self, request): + ret = { + "key01": "vaule01", + "key02": "vaule02", + "key03": "vaule03", + } + return JsonResponse (ret) + + +# 获取用户主菜单 +# class GetMenus (APIView): +# def get(self, request): +# menu = { +# "data": [ +# { +# "id": 101, +# "authName": "用户管理", +# "path": "/user", +# "children": [ +# { +# "id": 102, +# "authName": "用户列表", +# "path": None, +# "children": [] +# } +# ] +# }, +# { +# "id": 201, +# "authName": "权限管理", +# "path": None, +# "children": [ +# { +# "id": 202, +# "authName": "权限管理", +# "path": None, +# "children": [] +# } +# ] +# +# } +# ], +# "meta": { +# "msg": "获取菜单列表成功", +# "status": 200 +# } +# } +# return JsonResponse (menu) + +#用户不分页 +class UserAllViewSet(viewsets.ModelViewSet): + queryset = models.UserInfo.objects.all() + serializer_class = UserSerializer + permission_classes = [IsAdminOrReadOnlyForUser, ] + # filter_backends = (DjangoFilterBackend, ) 可以全局配置,所以此处不再配置 + filter_class = UserInfo_FilterSet +class UserViewSet(viewsets.ModelViewSet): + queryset = models.UserInfo.objects.all() + pagination_class = MyPageNumberPagination + serializer_class = UserSerializer + permission_classes = [IsAdminOrReadOnlyForUser, ] + # filter_backends = (DjangoFilterBackend, ) 可以全局配置,所以此处不再配置 + filter_class = UserInfo_FilterSet + # search_fields = ('query', ) + # 核心部分就是list方法 + # def list(self, request): + # keyword = request.GET.get ('query') # 获取参数 + # print(keyword) + # if keyword is not None: # 如果参数不为空 + # # 执行filter()方法 + # queryset = models.UserInfo.objects.filter (name__contains=keyword)#在name字段找关键字 + # else: + # # 如果参数为空,执行all()方法 + # queryset = models.UserInfo.objects.all ( ) + # #serializer = UserSerializer (queryset, many=True) + # page = MyPageNumberPagination() + # page_roles =page.paginate_queryset(queryset,request) + # serializer = UserSerializer (page_roles, context={'request': request}, many=True) + # #serializer = UserSerializer (instance=page_roles, many=True) + # return page.get_paginated_response(serializer.data) # 最后返回经过序列化的数据 + + + + + +class TestViewSet(viewsets.ModelViewSet): + queryset = models.Test.objects.all() + serializer_class = TestSerializer + +class DepartmentViewSet(viewsets.ModelViewSet): + queryset = models.Department.objects.all() + serializer_class = DepartmentSerializer + permission_classes = [IsAdminOrReadOnly, ] +#单位 +class EntityViewSet(viewsets.ModelViewSet): + queryset = models.Entity_info.objects.all() + serializer_class = EntitySerializer + pagination_class = MyPageNumberPagination + +#单位不分页 +class EntityAllViewSet(viewsets.ModelViewSet): + queryset = models.Entity_info.objects.all() + serializer_class = EntitySerializer + + +# class UsertestViewSet(viewsets.ModelViewSet): +# queryset = models.UserInfo.objects.all() +# serializer_class = UserstestSerializer + +#项目 +class ProjectViewSet(viewsets.ModelViewSet): + queryset = models.Project_info.objects.all().order_by('-id')#排序一下,后建立的项目排前面 + serializer_class = ProjectSerializer + pagination_class = MyPageNumberPagination + filter_class = project_FilterSet +#项目不分页 +class ProjectAllViewSet(viewsets.ModelViewSet): + queryset = models.Project_info.objects.all().order_by('-id')#排序一下,后建立的项目排前面 + serializer_class = ProjectSerializer + filter_class = project_FilterSet + +#交通方式 +class TrafficViewSet(viewsets.ModelViewSet): + queryset = models.Traffic_type.objects.all() + serializer_class = TrafficSerializer + +#项目出差报销记帐表 +class AccountViewSet(viewsets.ModelViewSet): + queryset = models.Account_project.objects.all() + ##serializer_class = AccountSerializer + pagination_class = MyPageNumberPagination + permission_classes = [IsOwnerOrReadOnlyForAccount, ] + # serializer_class =AccountSerializer + # filter_backends = [DjangoFilterBackend] + filter_class = Account_project_FilterSet + serializers_class = Example_SERIALIZERS_DICT = { + 'list': AccountlistSerializer, + 'create': AccountSerializer, + 'update': AccountSerializer, + 'retrieve': AccountlistSerializer, + 'partial_update': AccountSerializer + } + + # def get_queryset(self): + # # queryset = self.queryset + # my = self.request.query_params.get('mylist',0) + # if my: + # user = self.request.user + # queryset = Account_project.objects.filter(expense_name = user) + # return queryset + # return models.Account_project.objects.all() + + def get_serializer_class(self): + try: + return self.serializers_class[self.action] + except KeyError: + raise # 处理不可对应的情况 + + # 群局部改(单局部改):请求数据 -[{pk:1,name=123},{pk:2,name=456},{pk:8,price:666}] + def patch(self, request, *args, **kwargs): + request_data = request.data # 数据包数据 + print(request.user) + # pk = request_data.get ('pk') + # 将单改,群改的数据都格式化成 pks=[要需要的对象主键标识] | request_data=[每个要修改的对象对应的修改数据] + # if pk and isinstance (request_data, dict): # 单改 + # pks = [pk, ] + # request_data = [request_data, ] + if isinstance (request_data, list): # 群改 + pks = [] + # 遍历前台数据[{pk:1, name:123}, {pk:3, price:7}, {pk:7, publish:2}],拿一个个字典 + for dic in request_data: + pk = dic.pop ('pk', None) # 返回pk值 + if pk: + pks.append (pk) + # pk没有传值 + else: + return Response ({ + 'status': 1, + 'msg': '参数错误' + }) + else: + return Response ({ + 'status': 1, + 'msg': '参数错误' + }) + # pks与request_data数据筛选, + # 1)将pks中的没有对应数据的pk与数据已删除的pk移除,request_data对应索引位上的数据也移除 + # 2)将合理的pks转换为 objs + objs = [] + new_request_data = [] + for index, pk in enumerate (pks): + try: + # 将pk合理的对象数据保存下来 + book_obj = models.Account_project.objects.get (id=pk) + objs.append (book_obj) + # 对应索引的数据也保存下来,并且加人审批人和审批时间 + spobj = request_data[index] + # spobj.approve_id = request.user + # spobj.approvetime = datetime.datetime.now() + spobj.update(approve_id=request.user.id) + spobj.update(approvetime=datetime.datetime.now()) + new_request_data.append (spobj) + # spobj = {'approve_id': user} + # spobj.update(approve_id = user) + # print(spobj) + except Exception as ex : + print(ex) + # 重点:反面教程 - pk对应的数据有误,将对应索引的data中request_data中移除 + # 在for循环中不要使用删除 + # index = pks.index(pk) + # request_data.pop(index) + continue + # 生成一个serializer对象 + try: + book_ser = serializers.AccountlistSerializer (instance=objs, data=new_request_data, partial=True, many=True) + book_ser.is_valid (raise_exception=True) + book_objs = book_ser.save ( ) + return Response ({ + 'status': 200, + 'msg': 'ok', + 'results': serializers.AccountlistSerializer (book_objs, many=True).data + }) + except Exception as ex : + print(ex) + return Response ({ + 'status': 501, + 'msg': 'err', + 'results': serializers.AccountlistSerializer (book_objs, many=True).data + }) + # new_params = list() + # # 直接获取 body(请求体, 二进制数据), 解码后, 进行切割 + # for param in request.body.decode(encoding="utf-8").split("&"): + # if "approve_id" in param: + # # 修改参数值, 并重新拼接参数 + # new_str = "approve_id=" + param.split("=")[1].replace("-", " ") + # new_params.append(new_str) + # else: + # new_params.append(param) + # # 重新构造请求体, 进行编码后, 重新赋值给 request._body + # # 注意: 是 request._body, 因为 request.body 是不可修改的, 但是 body 属性继承自 _body 属性, 所以直接修改 _body 属性 + # request._body = "&".join(new_params).encode(encoding="utf-8") + # + # ... + # + # def params_replace(self, data): + # # 按需求, 对请求参数中的值做出修改 + # name = data.patch("approve_id") + # if name: + # data["pprove_id"] = name.replace("-", " ") + # return data + # else: + # return None + + +#非项目出差报销 +class Account_normalViewSet(viewsets.ModelViewSet): + queryset = models.Account_normal.objects.all() + #serializer_class = Account_normalSerializer + pagination_class = MyPageNumberPagination + permission_classes = [IsOwnerOrReadOnlyForAccount, ] + filter_class = Account_normal_FilterSet + serializers_class = Example_SERIALIZERS_DICT = { + 'list': normallistSerializer, + 'create': Account_normalSerializer, + 'update': Account_normalSerializer, + 'retrieve': normallistSerializer, + 'partial_update': Account_normalSerializer + } + def get_serializer_class(self): + try: + return self.serializers_class[self.action] + except KeyError: + raise # 处理不可对应的情况 + def patch(self, request, *args, **kwargs): + request_data = request.data # 数据包数据 + # pk = request_data.get ('pk') + # 将单改,群改的数据都格式化成 pks=[要需要的对象主键标识] | request_data=[每个要修改的对象对应的修改数据] + # if pk and isinstance (request_data, dict): # 单改 + # pks = [pk, ] + # request_data = [request_data, ] + if isinstance (request_data, list): # 群改 + pks = [] + # 遍历前台数据[{pk:1, name:123}, {pk:3, price:7}, {pk:7, publish:2}],拿一个个字典 + for dic in request_data: + pk = dic.pop ('pk', None) # 返回pk值 + if pk: + pks.append (pk) + # pk没有传值 + else: + return Response ({ + 'status': 1, + 'msg': '参数错误' + }) + else: + return Response ({ + 'status': 1, + 'msg': '参数错误' + }) + # pks与request_data数据筛选, + # 1)将pks中的没有对应数据的pk与数据已删除的pk移除,request_data对应索引位上的数据也移除 + # 2)将合理的pks转换为 objs + + + objs = [] + new_request_data = [] + for index, pk in enumerate (pks): + try: + # 将pk合理的对象数据保存下来 + book_obj = models.Account_normal.objects.get (id=pk) + objs.append (book_obj) + # 对应索引的数据也保存下来,并且加人审批人和审批时间 + spobj = request_data[index] + spobj.update(approve_id=request.user.id) + spobj.update(approvetime=datetime.datetime.now()) + new_request_data.append (spobj) + except: + # 重点:反面教程 - pk对应的数据有误,将对应索引的data中request_data中移除 + # 在for循环中不要使用删除 + # index = pks.index(pk) + # request_data.pop(index) + continue + # 生成一个serializer对象 + try: + book_ser = serializers.normallistSerializer (instance=objs, data=new_request_data, partial=True, many=True) + book_ser.is_valid (raise_exception=True) + book_objs = book_ser.save ( ) + return Response ({ + 'status': 200, + 'msg': 'ok', + 'results': serializers.normallistSerializer (book_objs, many=True).data + }) + except Exception as ex : + return Response ({ + 'status': 501, + 'msg': 'err', + 'results': serializers.normallistSerializer (book_objs, many=True).data + }) + + + + +#查询视图 +class Account_viewViewSet(viewsets.ModelViewSet): + queryset = models.Account_view.objects.all() + serializer_class = Account_viewSerializer + pagination_class = MyPageNumberPagination + filter_class = Account_view_FilterSet + permission_classes = [IsOwnerOrReadOnlyForAccountView, ] + + + +#附件 +class attachmentViewSet(viewsets.ModelViewSet): + queryset = models.attachment.objects.all() + serializer_class = attachmentSerializer + permission_classes = [IsAdminOrReadOnly, ] + # pagination_class = MyPageNumberPagination + #删除的同时把存储的文件也删除了 + def perform_destroy(self, instance): + instance.file.delete (save=False) + instance.delete ( ) + +#合同信息 +class Contract_infoViewSet(viewsets.ModelViewSet): + queryset = models.Contract_info.objects.all() + serializer_class = Contract_infoSerializer + permission_classes = [IsAdminOrReadOnly, ] + pagination_class = MyPageNumberPagination + filter_class = Contract_info_FilterSet + +#合同财务计划 +class Contract_planViewSet(viewsets.ModelViewSet): + queryset = models.Contract_plan.objects.all() + serializer_class = Contract_planSerializer + permission_classes = [IsAdminOrReadOnly, ] + filter_class = Cotract_plan_FilerSet + # pagination_class = MyPageNumberPagination diff --git a/flask/apps/app1/urls.py "b/1\343\200\201\345\220\210\345\220\214\347\263\273\347\273\237/contract-accounting-system-master/\346\234\215\345\212\241\345\231\250\345\220\216\347\253\257/db.sqlite3" similarity index 100% rename from flask/apps/app1/urls.py rename to "1\343\200\201\345\220\210\345\220\214\347\263\273\347\273\237/contract-accounting-system-master/\346\234\215\345\212\241\345\231\250\345\220\216\347\253\257/db.sqlite3" diff --git "a/1\343\200\201\345\220\210\345\220\214\347\263\273\347\273\237/contract-accounting-system-master/\346\234\215\345\212\241\345\231\250\345\220\216\347\253\257/manage.py" "b/1\343\200\201\345\220\210\345\220\214\347\263\273\347\273\237/contract-accounting-system-master/\346\234\215\345\212\241\345\231\250\345\220\216\347\253\257/manage.py" new file mode 100644 index 0000000..294ae9c --- /dev/null +++ "b/1\343\200\201\345\220\210\345\220\214\347\263\273\347\273\237/contract-accounting-system-master/\346\234\215\345\212\241\345\231\250\345\220\216\347\253\257/manage.py" @@ -0,0 +1,21 @@ +#!/usr/bin/env python +"""Django's command-line utility for administrative tasks.""" +import os +import sys + + +def main(): + os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'ApiServer.settings') + try: + from django.core.management import execute_from_command_line + except ImportError as exc: + raise ImportError( + "Couldn't import Django. Are you sure it's installed and " + "available on your PYTHONPATH environment variable? Did you " + "forget to activate a virtual environment?" + ) from exc + execute_from_command_line(sys.argv) + + +if __name__ == '__main__': + main() diff --git "a/1\343\200\201\345\220\210\345\220\214\347\263\273\347\273\237/contract-accounting-system-master/\346\234\215\345\212\241\345\231\250\345\220\216\347\253\257/media/files/\345\220\210\345\220\214\351\231\204\344\273\266/1/2.jpg" "b/1\343\200\201\345\220\210\345\220\214\347\263\273\347\273\237/contract-accounting-system-master/\346\234\215\345\212\241\345\231\250\345\220\216\347\253\257/media/files/\345\220\210\345\220\214\351\231\204\344\273\266/1/2.jpg" new file mode 100644 index 0000000..80ca190 Binary files /dev/null and "b/1\343\200\201\345\220\210\345\220\214\347\263\273\347\273\237/contract-accounting-system-master/\346\234\215\345\212\241\345\231\250\345\220\216\347\253\257/media/files/\345\220\210\345\220\214\351\231\204\344\273\266/1/2.jpg" differ diff --git "a/1\343\200\201\345\220\210\345\220\214\347\263\273\347\273\237/contract-accounting-system-master/\346\234\215\345\212\241\345\231\250\345\220\216\347\253\257/media/files/\345\233\276\347\211\2071.jpg" "b/1\343\200\201\345\220\210\345\220\214\347\263\273\347\273\237/contract-accounting-system-master/\346\234\215\345\212\241\345\231\250\345\220\216\347\253\257/media/files/\345\233\276\347\211\2071.jpg" new file mode 100644 index 0000000..9392162 Binary files /dev/null and "b/1\343\200\201\345\220\210\345\220\214\347\263\273\347\273\237/contract-accounting-system-master/\346\234\215\345\212\241\345\231\250\345\220\216\347\253\257/media/files/\345\233\276\347\211\2071.jpg" differ diff --git "a/1\343\200\201\345\220\210\345\220\214\347\263\273\347\273\237/contract-accounting-system-master/\346\234\215\345\212\241\345\231\250\345\220\216\347\253\257/\344\275\277\347\224\250\350\257\264\346\230\216.md" "b/1\343\200\201\345\220\210\345\220\214\347\263\273\347\273\237/contract-accounting-system-master/\346\234\215\345\212\241\345\231\250\345\220\216\347\253\257/\344\275\277\347\224\250\350\257\264\346\230\216.md" new file mode 100644 index 0000000..db0b1ec --- /dev/null +++ "b/1\343\200\201\345\220\210\345\220\214\347\263\273\347\273\237/contract-accounting-system-master/\346\234\215\345\212\241\345\231\250\345\220\216\347\253\257/\344\275\277\347\224\250\350\257\264\346\230\216.md" @@ -0,0 +1,309 @@ +2022最强Python学习资料大礼包:https://mp.weixin.qq.com/s/sO6hbVqORy7JpN-5TlaKvQ + +==================================== + +# docker一键安装 + +``` +docker run -itd --name dbserver --restart=always -p 3306:3306 registry.cn-shanghai.aliyuncs.com/liu008/dbserver:1.1 + +docker run --link=dbserver:db --env DBIP=db --env DBPORT=3306 -p 8080:8080 -p 8022:22 -itd --name app --restart=always registry.cn-shanghai.aliyuncs.com/liu008/hetong:2.1 + +``` +**记得对外开放8080端口** + +# 一、软件系统构成: + +## 1.1 功能介绍 + +本系统是一个针对于中小企业的**合同管理**与**员工出差费用报销管理**。其中以项目为主线,针对项目进行出货合同(收款),和进货合同(付款)的记录管理。合同其中还包含资金和发票的计划管理,让管理人员一目标了然。另外,报销管理模块也可以与项目进行挂钩,方便管理人员核算出整体项目的成本与利润。总之这是一个不求功能复杂,界面简洁的公司合同帐务管理软件。 + +## 1.2 架构 + +系统采用BS架构,前后端分离构建,前端WEB服务器(VUECLI架构),后端采用DJANGO;数据库采用MYSQL + +## 1.3 WEB服务器环境: + +nodeJS --version v14.13.1 + +npm -version 6.14.8 + +## 1.4 API服务器环境: + +PYTHON:3.7 + +``` +# pip list +Package Version +------------------- ------- +asgiref 3.2.10 +Cython 0.29.21 +Django 3.1.2 +django-filter 2.4.0 +djangorestframework 3.12.1 +pip 20.2.3 +PyMySQL 0.10.1 +pytz 2020.1 +setuptools 50.3.0 +sqlparse 0.4.1 +wheel 0.35.1 +``` + +## 1.5 数据库环境: + +数据库安装MYSQL 版本 > 5.7 + +默认以下配置为和API服务器安装在同一台机器,可以自行改动,只需求在API服务中更改配置文件 + +数据库名:zw + +用户名:zw + +用户密码:zw123 + +``` +ApiServer/settings.py 文件中 +DATABASES = { + 'default': { + # 'ENGINE': 'django.db.backends.sqlite3', + # 'NAME': os.path.join(BASE_DIR, 'db.sqlite3'), + 'ENGINE': 'django.db.backends.mysql', + 'NAME': 'zw', + 'USER': 'zw', + 'PASSWORD': 'zw123', + 'HOST': '127.0.0.1', + 'PORT':'3306', + } +} +``` + +## 1.6 访问过程 + +用户浏览器--------->WEB服务器------>API服务器---------->MYSQL数据库 + + + +# 二、系统注册: + +1.安装部署成功后,用户通过浏览器(不支持IE)输入http://web服务器IP:8080 自动跳转到注册页面。将hostid复制下来,用来获取license注册 + +![](https://i.loli.net/2020/12/08/wDX1RSC5pcVb2E6.png) + +2.注册成功后,自动跳转至登录页面。 + + + +# 三、用户登录 + +1. **初始管理员 登录用户名:admin 密码:123456** + +![](https://i.loli.net/2020/12/08/OJfRQgKFkuteqNb.png) + +**2.登录成功后进入主页面** + +![](https://i.loli.net/2020/12/08/7i2TFUVcnHuyAgv.png) + + + +# 四、信息管理 + +## 4.1 用户信息 + +![](https://i.loli.net/2020/12/09/UXQdiEbzNDCOLeP.png) + +​ 用户信息即本系统使用人员(公司员工)的帐号管理,用户默认包含首次登录的admin帐户,默认密码:123456 登录后建议立即更改密码。 + +**帐号:** + +​ 建议使用手机号作为帐号。 + +**部门:** + +​ 公司内部的部门信息,方便对不同用户进行分类。需要预先在部门信息里进行新建部门。 + +**角色:** + +​ 角色即权限,分为管理员和普通用户 + +​ 普通用户:不能增加、修改、删除用户,在只在页面右上角个人中心修改自己的密码。 + +​ 管理员:可以做一切操作。同时管理员也是可以更改自己或其它用户为普通用户,**所以必须保证系统内至少有一个管理员帐号**。 + +**状态:** + +​ 当状态为非激活状态时该用户将不能再进行登录。 + +**删除:** + +​ 只有管理员才可以操作,但是如果该用户存在其它关联数据:比如报销内容,在这种情况下是不允许删除的(会有报错提示,阻止该行为)。因为一旦删除会造成帐务混乱对不上人员。人员离职正确的做法应该是在点击状态条目使之处理非激活状态即可。 + +## 4.2 部门信息 + +![](https://i.loli.net/2020/12/09/2UIMkYJe3gL79ay.png) + +## 4.3 单位信息 + +![](https://i.loli.net/2020/12/09/oyU4ajqIvfGkYhO.png) + +​ 单位实体用于记录合同系统中所涉及的单位或公司信息,只有单位名称是必写项(因此如果合同涉及是个人的话可以写对对方姓名)。 + +## 4.4 项目信息 + +项目信息就是针对某个工程项目先新立项目名称,后期可以与合同、报销相关联。 + +**客户对象:**指些项目的客户是哪个单位实体 + +**主体公司:**是指该项目是哪个公司的盈利项项目(这里主要考虑使用本系统的公司,名下可能会注册有多家公司的情况)。一般就是指使用本全合同系统的公司。 + +# 五、合同管理 + +## 5.1 项目合同 + +![](https://i.loli.net/2020/12/09/FwYZUSfEi6cWyCq.png) + +### 5.1.1 添加合同 + +点击此页面中点击添加合同即可新增。 + +- **合同类型** + + 类型分为:收款、付款 收款合同是指卖东西出去,付款合同是指针对项目买入的成本。 + +- **项目名称** + + 点击下拉可选择此合同对应的项目。 + +- **合同名称** + + 可以自行定义合同的名称 + +- **合同金额** + + 合同上涉及的总金额 + +- **合同本方** + + 指是谁在收款/付款 + +- **合同对方** + + 指是在向谁收款/付款 + +- 签订日期 + +- 到期日期 + + 合同的整体截至日期,一般指合同的最后履约时间。 + +- 税金成本 + + 此项不是必选项,如有必要可以记录此合同执行后,我方要缴纳多少税款。 + +- 备注 + + 此项不是必选项 + + + +## 5.2 修改合同 + +![](https://i.loli.net/2020/12/09/pZiTCh7N6Oqv3te.png) + +在合同列表中点击即可展开合同的详细信息,在详细信息中可以修改、删除合同。同进在修改合同的弹出页中可以进行:发票计划、资金计划、合同附件的操作。 + +### 5.2.1 发票计划 + +**介绍:**发票计划是指合同涉及的发票何时开具并收到。合同金额所涉及的发票是一次性全部开具出去或收票,还是分阶段。做了计划之后,点击完成状态开关按键即可设置此计划是否已完成。所有已经完成的计划,都会被显示到计划进度条中。 + +- **新增发票计划:** + + 点击发票计划按键即可新增发票计划。可以直接写入总金额的百分比和日期,先点击生成计划。生成计划之后才能点击提交。也可以在生成时不按照总金额的百分比,而是具体金额生成,只需要点击切换即可。 + +![](https://i.loli.net/2020/12/09/rPNKTQH2fnbwh6z.png) + +- **完成情况** + + 提交计划后,默认是处于未完成状态。未完成的计划是不会显示到进度条中去的。点击旁边的切换开关即可使之变成完成情况。还可以从完成切换回未完成。 + +- **删除** + +- **发票进度** + + 所有已经完成的计划会合并显示到发票进度。 + +### 5.2.2 资金计划 + +​ 操作和显示与发票计划一样。但是其代表的是真实的资金收付款情况。已经到账的应被视为已经完成,如果是项目尾款还未收到或付出,则应该被设置为未完成。 + +### 5.2.3 合同附件 + +​ 用户可以上传该合同相关的文件到服务器,后期方便下载查阅。 + + + +## 5.3 合同查询 + +![](https://i.loli.net/2020/12/09/9KaNh6BU8t1TCWj.png) + +​ 可以针对合同名称、项目名称、备注 进行关键字查询合同条目。也可以点击展开隐藏查询框进行,基于行合同签订时处于的年份、下拉选择具体项目(一个项目一般有进货出货多个关联合同)、合同类型(收、付款)进行查询。 + + + +# **六、报销管理** + +​ 报销管理里能操作和显示的都是基于当前操作者(**本人**)的报销。报销管理包含“**新增报销**”和“**报销查询**”两个部分,其中 新增报销中显示的是该用户最近新建的但是尚未经过管理人员(经理、或财务)审批的报销条目。而报销查询可以基于各种条件进行综合查询,但是只局限于查询自己本人的报销记录。 + + 另外,报销被分为两大类型:项目报销、其他报销。 + +## 6.1 新增报销 + +​ 点击“**新增展开**”后,可以填写用户需求报销的内容。其中分为**“出差报销”**和**“其它报销”**,两个类型。 + +- **出差报销** + + 是指人员去到外地出差的报销,会涉及交通费和住宿、出差补贴之类的,一般都是和项目挂钩,方便后期计入项目成本。如果没有明确项目或是项目还未成形,可以先在信息管理里自定义一个项目名称,再与之挂钩。标星号的都是必选项。**注**:补贴金额默认为50元一天。与你公司实际情况不符合,可以要求做代码更改。 + +![](https://i.loli.net/2020/12/10/7qafdAuQUObnrH8.png) + + + +- **其他报销** + + 其他报销是指不记录出差行程的报销,比如:请吃饭,或是采购了办公用品之类。可以作为出差报销的补充,也可以是单独的报销。它不需要强制与项目进行挂钩。 + +![](https://i.loli.net/2020/12/10/Q9AlzFowgcCGBj8.png) + +- **查看和修改、删除报销** + + 在新增报销页下显示了本人当前已经填写但还未审计通过的报销条目,如果需要修改或删除可以直接点击后面的编辑项目。 + + ![](https://i.loli.net/2020/12/10/HpdD9vn7rZBNYcT.png) + + + +## 6.2 报销查询 + +​ 此页面可以根据不同条件查询用户本人所有的报销记录。 + +![](https://i.loli.net/2020/12/10/tkBwDfosQIyV16M.png) + + + +# 七、财务管理 + +​ 该模块是给管理和查询所有的人报销情况,分为**“报销审批”**和**“综合查询”**两个内容。其中报销审批用于管理人员对各个员工报销进行审批;综合查询是统一查询所有人的报销内容。 + +## 7.1 报销审批 + +​ 此页包含两个列表,其中上面的列表显示最近提交过来的所有报销,可以根据条件进行过滤显示。钩选相应的报销条目后再点击“报销”按钮可以批量审批报销。报销后条目状态将变为已报销状态。只限于管理员才可以进行此操作。 + +​ 另外,下面的列表显示的所有已经报销的内容。如果发现操作有误,管理员可以对相应条目钩选后点击撤销。撤销之后,状态将变回未报销。 + +![](https://i.loli.net/2020/12/10/bczHYL5v1lxw6J9.png) + +## 7.2 综合查询 + +​ 综合查询只作查询之用,不能修改或审批。可以按条件过滤查询所有人用的报销。或种条件可以叠加组合进行查询。如果取消条件可以在在各个条件中删除或重置。其中重置按键和已报销、未报销为一组,是指删除已报销、未报销的条件约束。如果查看全部最快速的办法是重新点击左则“综合查询”进行页面刷新。 + +![](https://i.loli.net/2020/12/10/ErdUiYazTm4Rgp9.png) + diff --git "a/20\343\200\201\350\241\250\347\231\275\347\275\221\347\253\231/index.css" "b/20\343\200\201\350\241\250\347\231\275\347\275\221\347\253\231/index.css" new file mode 100644 index 0000000..ba66476 --- /dev/null +++ "b/20\343\200\201\350\241\250\347\231\275\347\275\221\347\253\231/index.css" @@ -0,0 +1,290 @@ +* { + box-sizing: border-box; +} + +body { + align-items: center; + background-color: #f9bf3b; + display: flex; + justify-content: center; + min-height: 100vh; +} + +:root { + --height: 300; + --width: 200; + --depth: 150; + --drawerSize: calc((var(--height) / 3) - 10); + --drawerHole: calc((var(--height) - ((10 * 4) + (10 + 30))) / 3); +} + +.chest { + height: calc(var(--height) * 1px); + transform: rotateX(-30deg) rotateY(40deg); + transform-style: preserve-3d; + width: calc(var(--width) * 1px); +} + +.chest__panel { + height: 100%; + position: absolute; + transform-style: preserve-3d; + width: 100%; +} + +.chest__panel:after { + content: ''; + display: block; + height: 100%; + width: 100%; +} + +.chest__panel--front { + transform: translate3d(0, 0, calc(var(--depth) / 2 * 1px)); +} + +.chest__panel--front:after { + background: #5b5b5b; + content: ''; + height: 4px; + position: absolute; + top: -2px; + width: 100%; +} + +.chest__panel--front-frame { + border: 10px solid #5b5b5b; + border-bottom-width: 30px; + border-top-width: 10px; + transform: translate3d(0, 0, 0); +} + +.chest__panel--front-frame:before { + background: #5b5b5b; + content: ''; + height: 20px; + left: 0; + position: absolute; + top: calc(var(--drawerHole) * 1px); + width: 100%; +} + +.chest__panel--front-frame:after { + background: #5b5b5b; + content: ''; + height: 20px; + left: 0; + position: absolute; + top: calc(var(--drawerHole) * 2px + 20px); + width: 100%; +} + +.chest__panel--back { + background: #5b5b5b; + transform: translate3d(0, 0, calc(var(--depth) / 2 * -1px)); +} + +.chest__panel--back:after { + background: #000; + transform: translate3d(0, 0, 1px); +} + +.chest__panel--top { + background: #474747; + bottom: 100%; + height: calc(var(--depth) * 1px); + left: 0; + transform: rotateX(90deg) translate3d(0, 50%, 1px); + transform-origin: bottom; + transform-style: preserve-3d; +} + +.chest__panel--top:after { + background: #1a1a1a; + transform: translate3d(0, 0, -1px); +} + +.chest__panel--bottom { + background: #474747; + height: calc(var(--depth) * 1px); + left: 0; + top: 100%; + transform: translateY(-50%) rotateX(90deg); +} + +.chest__panel--bottom:after { + background: #0d0d0d; + transform: translate3d(0, 0, 1px); +} + +.chest__panel--right { + background: #323232; + right: 0; + transform: translate3d(0, 0, calc(var(--depth) / 2 * 1px)) rotateY(-90deg); + transform-origin: right center; + width: calc(var(--depth) * 1px); +} + +.chest__panel--right:after { + background: #1a1a1a; + transform: translate3d(0, 0, 1px); +} + +.chest__panel--left { + width: calc(var(--depth) * 1px); + left: 0; + background: #323232; + transform-origin: left center; + transform: translate3d(0, -1px, calc(var(--depth) / 2 * 1px)) rotateY(90deg); +} + +.chest__panel--left:after { + background: #1a1a1a; + transform: translate3d(0, 0, 1px); +} + +.chest-drawer { + height: calc(var(--drawerSize) * 1px); + left: 0; + position: absolute; + top: 0; + transition: transform 0.25s; + transform-style: preserve-3d; + width: 100%; +} + +.chest-drawer--top, +.chest-drawer--middle, +.chest-drawer--bottom { + transform: translate3d(0, 0, calc(var(--depth) * 0.51px)); +} + +.chest-drawer--top { + top: 5px; + z-index: 3; +} + +.chest-drawer--middle { + top: calc((var(--drawerSize) + 10) * 1px); + z-index: 2; +} + +.chest-drawer--bottom { + top: calc((var(--drawerSize) * 2 + 15) * 1px); + z-index: 1; +} + +.chest-drawer details, +.chest-drawer summary { + background: #303030; + cursor: pointer; + height: 100%; + left: 0; + list-style: none; + position: absolute; + outline: 0; + top: 0; + transition: transform 0.25s; + transform: translate3d(0, 0, 0); + width: 100%; +} + +.chest-drawer details:after, +.chest-drawer summary:after { + background: #adadad; + content: ''; + height: 5%; + left: 50%; + position: absolute; + top: 10%; + transform: translate(-50%, 0); + width: 40%; +} + +.chest-drawer details::-webkit-details-marker, +.chest-drawer summary::-webkit-details-marker { + display: none; +} + +.chest-drawer details:hover:not([open]) { + transform: translate3d(0, 0, calc(var(--depth) * 0.05px)); +} + +.chest-drawer details[open], +.chest-drawer details[open] ~ .chest-drawer__structure { + transform: translate3d(0, 0, calc(var(--depth) * 0.9px)); +} + +.chest-drawer__panel { + height: 100%; + position: absolute; + transform-style: preserve-3d; + width: 100%; +} + +.chest-drawer__panel--left { + background: #e6e6e6; + bottom: 0; + height: calc(var(--drawerHole) * 0.65px); + left: 10px; + transform: translate3d(0, -16px, -2px) rotateY(90deg); + transform-origin: left; + width: calc(var(--depth) * 1px); +} + +.chest-drawer__panel--right { + background: #e6e6e6; + bottom: 0; + height: calc(var(--drawerHole) * 0.65px); + right: 10px; + transform: translate3d(0, -16px, -2px) rotateY(-90deg); + transform-origin: right; + width: calc((var(--depth) - 3) * 1px); +} + +.chest-drawer__panel--bottom { + background: #fff; + bottom: 18px; + height: calc(var(--depth) * 1px); + left: 10px; + transform: rotateX(90deg) translate3d(0, -2px, 0); + transform-origin: bottom center; + width: calc(100% - (2px * 10)); +} + +.chest-drawer__panel--back { + align-items: center; + background: #d9d9d9; + bottom: 16px; + display: flex; + font-family: 'Arial', sans-serif; + font-size: calc(var(--drawerHole) * 0.35px); + font-weight: bold; + height: calc(var(--drawerHole) * 0.65px); + justify-content: center; + left: 10px; + transform: translate3d(0, 0, calc((var(--depth) - 2) * -1px)); + width: calc(100% - (2px * 10)); +} + +.chest-drawer__structure { + height: 100%; + left: 0; + position: absolute; + top: 0; + transform-style: preserve-3d; + transition: transform 0.25s; + width: 100%; +} + +.chest-drawer--top .chest-drawer__panel--back { + color: #111; +} + +.chest-drawer--middle .chest-drawer__panel--back { + color: #111; +} + +.chest-drawer--bottom .chest-drawer__panel--back { + color: #111; +} \ No newline at end of file diff --git "a/20\343\200\201\350\241\250\347\231\275\347\275\221\347\253\231/index.html" "b/20\343\200\201\350\241\250\347\231\275\347\275\221\347\253\231/index.html" new file mode 100644 index 0000000..ec3d85e --- /dev/null +++ "b/20\343\200\201\350\241\250\347\231\275\347\275\221\347\253\231/index.html" @@ -0,0 +1,65 @@ + + + + + + 想对你说的话都在抽屉里 + + + + + + + + + + +
+
+
+
+
+
+
+
+
+
+
+ +
+
+
+
+
+
+
+
+ +
+
+ +
+
+
+
+
+
+
+
+ +
+
+ +
+
+
+
+
+
+
+
+ +
+ + + \ No newline at end of file diff --git "a/21\343\200\201\345\206\231\344\272\206\344\270\252\347\275\221\346\230\223\344\272\221/__init__.py" "b/21\343\200\201\345\206\231\344\272\206\344\270\252\347\275\221\346\230\223\344\272\221/__init__.py" new file mode 100644 index 0000000..eabf991 --- /dev/null +++ "b/21\343\200\201\345\206\231\344\272\206\344\270\252\347\275\221\346\230\223\344\272\221/__init__.py" @@ -0,0 +1,2 @@ +# Python电子书:http://t.cn/A6tMNzuI +# Python交流群:http://t.cn/A65MiFvH diff --git "a/21\343\200\201\345\206\231\344\272\206\344\270\252\347\275\221\346\230\223\344\272\221/bean/Async.py" "b/21\343\200\201\345\206\231\344\272\206\344\270\252\347\275\221\346\230\223\344\272\221/bean/Async.py" new file mode 100644 index 0000000..ea529b2 --- /dev/null +++ "b/21\343\200\201\345\206\231\344\272\206\344\270\252\347\275\221\346\230\223\344\272\221/bean/Async.py" @@ -0,0 +1,12 @@ +# Python电子书:http://t.cn/A6tMNzuI +# Python交流群:http://t.cn/A65MiFvH +import threading + +# 线程装饰器 +def asynchronous(func): + def wrapper(*args, **kwargs): + thread = threading.Thread(target=func, args=args, kwargs=kwargs) + thread.start() + return thread + + return wrapper diff --git "a/21\343\200\201\345\206\231\344\272\206\344\270\252\347\275\221\346\230\223\344\272\221/bean/Excludes.py" "b/21\343\200\201\345\206\231\344\272\206\344\270\252\347\275\221\346\230\223\344\272\221/bean/Excludes.py" new file mode 100644 index 0000000..02f25bf --- /dev/null +++ "b/21\343\200\201\345\206\231\344\272\206\344\270\252\347\275\221\346\230\223\344\272\221/bean/Excludes.py" @@ -0,0 +1,7 @@ +# Python电子书:http://t.cn/A6tMNzuI +# Python交流群:http://t.cn/A65MiFvH + +def getExcludes(): + excludes = [ + '还是', '音乐', '会怪'] + return excludes diff --git "a/21\343\200\201\345\206\231\344\272\206\344\270\252\347\275\221\346\230\223\344\272\221/bean/Music.py" "b/21\343\200\201\345\206\231\344\272\206\344\270\252\347\275\221\346\230\223\344\272\221/bean/Music.py" new file mode 100644 index 0000000..5ffe511 --- /dev/null +++ "b/21\343\200\201\345\206\231\344\272\206\344\270\252\347\275\221\346\230\223\344\272\221/bean/Music.py" @@ -0,0 +1,160 @@ +# Python电子书:http://t.cn/A6tMNzuI +# Python交流群:http://t.cn/A65MiFvH +# 音乐实体类 +class Music: + __slots__ = ( + '__id', '__name', '__artists', '__album', '__url', '__avatar', '__lyric', '__favorite', '__path', '__avatarId', + '__lastestTime', '__size', '__downloadTime', '__lyricId', '__source', '__filePath') + + def __init__(self, id=None, name=None, artists=None, album=None, url='', avatar=None, lyric=None, favorite=False, + path=None, avatarId=None, lastestTime='', size=None, downloadTime='', lyricId=None, source=None, + filePath=None + ): + self.__id = id # 歌曲id 唯一不失效 + self.__name = name # 歌曲名称 + self.__artists = artists # 歌手 列表 + self.__album = album # 专辑 + self.__url = url # 歌曲链接 + self.__avatar = avatar # 歌曲封面链接 + self.__lyric = lyric # 歌词 + self.__favorite = favorite # 是否喜欢 + self.__path = path # 歌曲封面路径 + self.__avatarId = avatarId # 封面id + self.__lastestTime = lastestTime # 最新播放时间 + self.__size = size # 音乐大小 + self.__downloadTime = downloadTime # 下载时间 + self.__lyricId = lyricId + self.__source = source + self.__filePath = filePath + + @property + def id(self): + return self.__id + + @property + def name(self): + return self.__name + + @property + def artists(self): + return self.__artists + + @property + def album(self): + return self.__album + + @property + def url(self): + return self.__url + + @property + def avatar(self): + return self.__avatar + + @property + def lyric(self): + return self.__lyric + + @property + def favorite(self): + return self.__favorite + + @property + def path(self): + return self.__path + + @property + def avatarId(self): + return self.__avatarId + + @property + def lastestTime(self): + return self.__lastestTime + + @property + def size(self): + return self.__size + + @property + def downloadTime(self): + return self.__downloadTime + + @property + def lyricId(self): + return self.__lyricId + + @property + def source(self): + return self.__source + + @property + def filePath(self): + return self.__filePath + + @id.setter + def id(self, id): + self.__id = id + + @name.setter + def name(self, name): + self.__name = name + + @artists.setter + def artists(self, artists): + self.__artists = artists + + @album.setter + def album(self, album): + self.__album = album + + @url.setter + def url(self, url): + self.__url = url + + @avatar.setter + def avatar(self, avatar): + self.__avatar = avatar + + @lyric.setter + def lyric(self, lyric): + self.__lyric = lyric + + @favorite.setter + def favorite(self, favorite): + self.__favorite = favorite + + @path.setter + def path(self, path): + self.__path = path + + @avatarId.setter + def avatarId(self, avatarId): + self.__avatarId = avatarId + + @lastestTime.setter + def lastestTime(self, lastestTime): + self.__lastestTime = lastestTime + + @size.setter + def size(self, size): + self.__size = size + + @downloadTime.setter + def downloadTime(self, downloadTime): + self.__downloadTime = downloadTime + + @lyricId.setter + def lyricId(self, lyricId): + self.__lyricId = lyricId + + @source.setter + def source(self, source): + self.__source = source + + @filePath.setter + def filePath(self, filePath): + self.__filePath = filePath + + def __repr__(self): + return "id:%s name:%s artists:%s album:%s avatar:%s avatarId:%s" % ( + self.__id, self.__name, self.__artists, self.__album, self.__avatar, self.__avatarId) diff --git "a/21\343\200\201\345\206\231\344\272\206\344\270\252\347\275\221\346\230\223\344\272\221/bean/MusicList.py" "b/21\343\200\201\345\206\231\344\272\206\344\270\252\347\275\221\346\230\223\344\272\221/bean/MusicList.py" new file mode 100644 index 0000000..17cba23 --- /dev/null +++ "b/21\343\200\201\345\206\231\344\272\206\344\270\252\347\275\221\346\230\223\344\272\221/bean/MusicList.py" @@ -0,0 +1,53 @@ +# Python电子书:http://t.cn/A6tMNzuI +# Python交流群:http://t.cn/A65MiFvH + +# 音乐列表 - 数据结构 +class MusicList(list): + # 指针 + point = -1 + + def __init__(self): + super(MusicList, self).__init__() + + def add(self, music): + self.point += 1 + self.append(music) + + def insertBatch(self, musicList): + if len(musicList) > 0: + # 更新位置 + self.point = len(self) + self += musicList + + def getCurrentMusic(self): + if len(self) > 0: + return self[self.point] + else: + return None + + def forward(self): + self.point -= 1 + mod = len(self) + self.point = (self.point + mod) % mod + return self[self.point] + + def backward(self): + self.point += 1 + self.point %= len(self) + return self[self.point] + + def clear(self): + self.point = -1 + self = [] + + def isBegin(self): + return self.point == 0 + + def isDeadline(self): + return self.point == len(self) - 1 + + def length(self): + return len(self) + + def extrapolate(self, music): + self.insert(0, music) diff --git "a/21\343\200\201\345\206\231\344\272\206\344\270\252\347\275\221\346\230\223\344\272\221/bean/RecodeStack.py" "b/21\343\200\201\345\206\231\344\272\206\344\270\252\347\275\221\346\230\223\344\272\221/bean/RecodeStack.py" new file mode 100644 index 0000000..b4fe7fb --- /dev/null +++ "b/21\343\200\201\345\206\231\344\272\206\344\270\252\347\275\221\346\230\223\344\272\221/bean/RecodeStack.py" @@ -0,0 +1,32 @@ +# Python电子书:http://t.cn/A6tMNzuI +# Python交流群:http://t.cn/A65MiFvH +class RecodeStack: + recodes = [] + ptr = -1 + + def __init__(self): + super(RecodeStack, self).__init__() + + # pageIndex 页面下标 + # tag 附信息 + def insert(self, pageIndex, tag=None): + self.ptr += 1 + del self.recodes[self.ptr:len(self.recodes)] + self.recodes.insert(self.ptr, [pageIndex, tag]) + + def backward(self): + self.ptr -= 1 + return self.recodes[self.ptr] + + def forward(self): + self.ptr += 1 + return self.recodes[self.ptr] + + def isBegin(self): + return self.ptr == 0 + + def isDeadline(self): + return self.ptr == len(self.recodes) - 1 + + +recodeStack = RecodeStack() diff --git "a/21\343\200\201\345\206\231\344\272\206\344\270\252\347\275\221\346\230\223\344\272\221/bean/Thread.py" "b/21\343\200\201\345\206\231\344\272\206\344\270\252\347\275\221\346\230\223\344\272\221/bean/Thread.py" new file mode 100644 index 0000000..829ba27 --- /dev/null +++ "b/21\343\200\201\345\206\231\344\272\206\344\270\252\347\275\221\346\230\223\344\272\221/bean/Thread.py" @@ -0,0 +1,19 @@ +# Python电子书:http://t.cn/A6tMNzuI +# Python交流群:http://t.cn/A65MiFvH +# QThread 封装 适配 +from PyQt5.QtCore import QThread, pyqtSignal + + +class Thread(QThread): + finish = pyqtSignal(object) + + def __init__(self, func, *args, **kwargs): + super(Thread, self).__init__() + + self.func = func + self.args = args + self.kwargs = kwargs + + def run(self): + result = self.func(*self.args, **self.kwargs) + self.finish.emit(result) diff --git "a/21\343\200\201\345\206\231\344\272\206\344\270\252\347\275\221\346\230\223\344\272\221/bean/__init__.py" "b/21\343\200\201\345\206\231\344\272\206\344\270\252\347\275\221\346\230\223\344\272\221/bean/__init__.py" new file mode 100644 index 0000000..eabf991 --- /dev/null +++ "b/21\343\200\201\345\206\231\344\272\206\344\270\252\347\275\221\346\230\223\344\272\221/bean/__init__.py" @@ -0,0 +1,2 @@ +# Python电子书:http://t.cn/A6tMNzuI +# Python交流群:http://t.cn/A65MiFvH diff --git "a/21\343\200\201\345\206\231\344\272\206\344\270\252\347\275\221\346\230\223\344\272\221/dao/Redis.py" "b/21\343\200\201\345\206\231\344\272\206\344\270\252\347\275\221\346\230\223\344\272\221/dao/Redis.py" new file mode 100644 index 0000000..759b579 --- /dev/null +++ "b/21\343\200\201\345\206\231\344\272\206\344\270\252\347\275\221\346\230\223\344\272\221/dao/Redis.py" @@ -0,0 +1,47 @@ +# Python电子书:http://t.cn/A6tMNzuI +# Python交流群:http://t.cn/A65MiFvH +import os +import shelve + +from gui.utils.Path import getPwd + + +class Redis(): + # 配置文件名称 + name = 'setting' + + def __init__(self): + self.path = getPwd() + os.sep + self.name + self.load() + + # 装载数据 + def load(self): + db = shelve.open(self.path) + try: + self.redis = db['redis'] + except: + self.redis = {} + finally: + db.close() + + # 设置值 + def setValue(self, key, value): + self.redis[key] = value + + # 获取值,若不存在,则可设置默认值 + def getValue(self, key, default): + value = self.redis.get(key) + if value != None: + return value + else: + self.redis[key] = default + return default + + # 持久化 程序关闭时调用 + def serialize(self): + db = shelve.open(self.path, writeback=True) + db['redis'] = self.redis + db.close() + + +redis = Redis() diff --git "a/21\343\200\201\345\206\231\344\272\206\344\270\252\347\275\221\346\230\223\344\272\221/dao/__init__.py" "b/21\343\200\201\345\206\231\344\272\206\344\270\252\347\275\221\346\230\223\344\272\221/dao/__init__.py" new file mode 100644 index 0000000..eabf991 --- /dev/null +++ "b/21\343\200\201\345\206\231\344\272\206\344\270\252\347\275\221\346\230\223\344\272\221/dao/__init__.py" @@ -0,0 +1,2 @@ +# Python电子书:http://t.cn/A6tMNzuI +# Python交流群:http://t.cn/A65MiFvH diff --git "a/21\343\200\201\345\206\231\344\272\206\344\270\252\347\275\221\346\230\223\344\272\221/gui/__init__.py" "b/21\343\200\201\345\206\231\344\272\206\344\270\252\347\275\221\346\230\223\344\272\221/gui/__init__.py" new file mode 100644 index 0000000..eabf991 --- /dev/null +++ "b/21\343\200\201\345\206\231\344\272\206\344\270\252\347\275\221\346\230\223\344\272\221/gui/__init__.py" @@ -0,0 +1,2 @@ +# Python电子书:http://t.cn/A6tMNzuI +# Python交流群:http://t.cn/A65MiFvH diff --git "a/21\343\200\201\345\206\231\344\272\206\344\270\252\347\275\221\346\230\223\344\272\221/gui/components/__init__.py" "b/21\343\200\201\345\206\231\344\272\206\344\270\252\347\275\221\346\230\223\344\272\221/gui/components/__init__.py" new file mode 100644 index 0000000..eabf991 --- /dev/null +++ "b/21\343\200\201\345\206\231\344\272\206\344\270\252\347\275\221\346\230\223\344\272\221/gui/components/__init__.py" @@ -0,0 +1,2 @@ +# Python电子书:http://t.cn/A6tMNzuI +# Python交流群:http://t.cn/A65MiFvH diff --git "a/21\343\200\201\345\206\231\344\272\206\344\270\252\347\275\221\346\230\223\344\272\221/gui/components/common/Button.py" "b/21\343\200\201\345\206\231\344\272\206\344\270\252\347\275\221\346\230\223\344\272\221/gui/components/common/Button.py" new file mode 100644 index 0000000..fc9bf2a --- /dev/null +++ "b/21\343\200\201\345\206\231\344\272\206\344\270\252\347\275\221\346\230\223\344\272\221/gui/components/common/Button.py" @@ -0,0 +1,25 @@ +# Python电子书:http://t.cn/A6tMNzuI +# Python交流群:http://t.cn/A65MiFvH +from PyQt5.QtWidgets import QPushButton +from PyQt5.QtCore import QEvent, pyqtSignal, Qt + + +# 继承自QPushButton 添加鼠标 悬浮 离开 信号 +class Button(QPushButton): + # 鼠标移入信号 + mouseEnter = pyqtSignal() + # 鼠标移除信号 + mouseLeave = pyqtSignal() + + def __init__(self, *args): + super(Button, self).__init__(*args) + # 事件监听 + self.installEventFilter(self) + + def eventFilter(self, obj, event): + # 当鼠标移入时 发射信号 + if event.type() == QEvent.Enter: + self.mouseEnter.emit() + if event.type() == QEvent.Leave: + self.mouseLeave.emit() + return super().eventFilter(obj, event) diff --git "a/21\343\200\201\345\206\231\344\272\206\344\270\252\347\275\221\346\230\223\344\272\221/gui/components/common/CommonButton.py" "b/21\343\200\201\345\206\231\344\272\206\344\270\252\347\275\221\346\230\223\344\272\221/gui/components/common/CommonButton.py" new file mode 100644 index 0000000..8bd4080 --- /dev/null +++ "b/21\343\200\201\345\206\231\344\272\206\344\270\252\347\275\221\346\230\223\344\272\221/gui/components/common/CommonButton.py" @@ -0,0 +1,36 @@ +# Python电子书:http://t.cn/A6tMNzuI +# Python交流群:http://t.cn/A65MiFvH +from PyQt5.QtGui import QCursor +from PyQt5.QtWidgets import QPushButton +from PyQt5.QtCore import Qt, pyqtSignal +import qtawesome as qta + + +class CommonButton(QPushButton): + cursor = Qt.PointingHandCursor + + tagSignal = pyqtSignal(int) + + def __init__(self, *args, **kwargs): + super(CommonButton, self).__init__(*args) + + cursor = kwargs.get('cursor') + if cursor != None: + self.cursor = cursor + self.setCursor(QCursor(self.cursor)) + + self.color = kwargs.get('color') + + iconName = kwargs.get('iconName') + if iconName != None: + self.setIcon(qta.icon('fa.' + iconName, color=self.color)) + + self.tag = kwargs.get('tag') + self.clicked.connect(self.tagSignalHandle) + + def resetIconName(self, iconName): + self.setIcon(qta.icon('fa.' + iconName, color=self.color)) + + def tagSignalHandle(self): + if self.tag != None: + self.tagSignal.emit(self.tag) diff --git "a/21\343\200\201\345\206\231\344\272\206\344\270\252\347\275\221\346\230\223\344\272\221/gui/components/common/HSeparateLine.py" "b/21\343\200\201\345\206\231\344\272\206\344\270\252\347\275\221\346\230\223\344\272\221/gui/components/common/HSeparateLine.py" new file mode 100644 index 0000000..928e3b0 --- /dev/null +++ "b/21\343\200\201\345\206\231\344\272\206\344\270\252\347\275\221\346\230\223\344\272\221/gui/components/common/HSeparateLine.py" @@ -0,0 +1,11 @@ +# Python电子书:http://t.cn/A6tMNzuI +# Python交流群:http://t.cn/A65MiFvH +from PyQt5.QtWidgets import QFrame + + +class HSeparateLine(QFrame): + def __init__(self): + super(HSeparateLine, self).__init__() + + self.setFrameShape(QFrame.HLine) + self.setFrameShadow(QFrame.Sunken) diff --git "a/21\343\200\201\345\206\231\344\272\206\344\270\252\347\275\221\346\230\223\344\272\221/gui/components/common/Loading.py" "b/21\343\200\201\345\206\231\344\272\206\344\270\252\347\275\221\346\230\223\344\272\221/gui/components/common/Loading.py" new file mode 100644 index 0000000..5a93d81 --- /dev/null +++ "b/21\343\200\201\345\206\231\344\272\206\344\270\252\347\275\221\346\230\223\344\272\221/gui/components/common/Loading.py" @@ -0,0 +1,30 @@ +# Python电子书:http://t.cn/A6tMNzuI +# Python交流群:http://t.cn/A65MiFvH +from PyQt5.QtGui import QMovie +from PyQt5.QtWidgets import QWidget, QLabel, QHBoxLayout + + +# 加载组件 +# 注意! .gif 图片路径 +class Loading(QWidget): + + def __init__(self, *args): + super(Loading, self).__init__(*args) + + self.setFixedSize(100, 40) + self.initUI() + + def initUI(self): + layout = QHBoxLayout() + layout.setContentsMargins(0, 0, 0, 0) + self.setLayout(layout) + + img = QLabel() + gif = QMovie('../../resource/img/loading.gif') + img.setMovie(gif) + layout.addWidget(img) + gif.start() + + text = QLabel("加载中") + text.setStyleSheet("font-weight:bold;") + layout.addWidget(text) diff --git "a/21\343\200\201\345\206\231\344\272\206\344\270\252\347\275\221\346\230\223\344\272\221/gui/components/common/ProgressBar.py" "b/21\343\200\201\345\206\231\344\272\206\344\270\252\347\275\221\346\230\223\344\272\221/gui/components/common/ProgressBar.py" new file mode 100644 index 0000000..91879e7 --- /dev/null +++ "b/21\343\200\201\345\206\231\344\272\206\344\270\252\347\275\221\346\230\223\344\272\221/gui/components/common/ProgressBar.py" @@ -0,0 +1,17 @@ +# Python电子书:http://t.cn/A6tMNzuI +# Python交流群:http://t.cn/A65MiFvH +from PyQt5.QtCore import pyqtSignal, Qt +from PyQt5.QtGui import QCursor +from PyQt5.QtWidgets import QProgressBar + + +class ProgressBar(QProgressBar): + clicked = pyqtSignal(float) + + def __init__(self, *args): + super(ProgressBar, self).__init__(*args) + self.setTextVisible(False) + self.setCursor(QCursor(Qt.PointingHandCursor)) + + def mousePressEvent(self, event): + self.clicked.emit(event.pos().x() / self.width()) diff --git "a/21\343\200\201\345\206\231\344\272\206\344\270\252\347\275\221\346\230\223\344\272\221/gui/components/common/__init__.py" "b/21\343\200\201\345\206\231\344\272\206\344\270\252\347\275\221\346\230\223\344\272\221/gui/components/common/__init__.py" new file mode 100644 index 0000000..eabf991 --- /dev/null +++ "b/21\343\200\201\345\206\231\344\272\206\344\270\252\347\275\221\346\230\223\344\272\221/gui/components/common/__init__.py" @@ -0,0 +1,2 @@ +# Python电子书:http://t.cn/A6tMNzuI +# Python交流群:http://t.cn/A65MiFvH diff --git "a/21\343\200\201\345\206\231\344\272\206\344\270\252\347\275\221\346\230\223\344\272\221/gui/components/content/ArtistWidget.py" "b/21\343\200\201\345\206\231\344\272\206\344\270\252\347\275\221\346\230\223\344\272\221/gui/components/content/ArtistWidget.py" new file mode 100644 index 0000000..87f84dd --- /dev/null +++ "b/21\343\200\201\345\206\231\344\272\206\344\270\252\347\275\221\346\230\223\344\272\221/gui/components/content/ArtistWidget.py" @@ -0,0 +1,28 @@ +# Python电子书:http://t.cn/A6tMNzuI +# Python交流群:http://t.cn/A65MiFvH +from PyQt5.QtWidgets import QWidget, QHBoxLayout + +from gui.components.content.HoverButton import HoverButton + +# 音乐标题栏按钮 +from gui.pages.GlobalSignal import globalSignal + + +class ArtistWidget(QWidget): + + def __init__(self, artists): + super(ArtistWidget, self).__init__() + self.artists = artists + self.initUI() + + def initUI(self): + layout = QHBoxLayout() + self.setLayout(layout) + + for i in range(len(self.artists)): + btn = HoverButton(inActiveColor='#B4B4B4', activeColor='#6A6B6B', text=self.artists[i], tag=i) + btn.tagSignal.connect(self.handle) + layout.addWidget(btn) + + def handle(self, index): + globalSignal.keywordSignal.emit(self.artists[index]) diff --git "a/21\343\200\201\345\206\231\344\272\206\344\270\252\347\275\221\346\230\223\344\272\221/gui/components/content/DisabledButton.py" "b/21\343\200\201\345\206\231\344\272\206\344\270\252\347\275\221\346\230\223\344\272\221/gui/components/content/DisabledButton.py" new file mode 100644 index 0000000..651dc5d --- /dev/null +++ "b/21\343\200\201\345\206\231\344\272\206\344\270\252\347\275\221\346\230\223\344\272\221/gui/components/content/DisabledButton.py" @@ -0,0 +1,29 @@ +# Python电子书:http://t.cn/A6tMNzuI +# Python交流群:http://t.cn/A65MiFvH +from PyQt5.QtCore import * +from PyQt5.QtGui import * +from PyQt5.QtWidgets import * +import qtawesome as qta + + +class DisabledButton(QPushButton): + inActiveColor = '#F2BABA' + activeColor = '#ffffff' + + def __init__(self, *args, **kwargs): + super(DisabledButton, self).__init__(*args) + + self.iconName = kwargs.get('iconName') + self.setButtonStatus(kwargs.get('disabled', True)) + + def setButtonStatus(self, disabled): + if disabled: # 禁用 + self.setCursor(QCursor(Qt.ArrowCursor)) + self.setIcon(qta.icon("fa." + self.iconName, color=self.inActiveColor)) + else: + self.setCursor(QCursor(Qt.PointingHandCursor)) + self.setIcon(qta.icon("fa." + self.iconName, color=self.activeColor)) + self.disabled = disabled + + def isDisabled(self): + return self.disabled diff --git "a/21\343\200\201\345\206\231\344\272\206\344\270\252\347\275\221\346\230\223\344\272\221/gui/components/content/FavourDownloadWidget.py" "b/21\343\200\201\345\206\231\344\272\206\344\270\252\347\275\221\346\230\223\344\272\221/gui/components/content/FavourDownloadWidget.py" new file mode 100644 index 0000000..a52e949 --- /dev/null +++ "b/21\343\200\201\345\206\231\344\272\206\344\270\252\347\275\221\346\230\223\344\272\221/gui/components/content/FavourDownloadWidget.py" @@ -0,0 +1,80 @@ +# Python电子书:http://t.cn/A6tMNzuI +# Python交流群:http://t.cn/A65MiFvH +from PyQt5.QtCore import pyqtSignal +from PyQt5.QtWidgets import QWidget, QHBoxLayout, QLabel + +from bean.MusicList import MusicList +from dao.Redis import redis +from gui.components.content.HoverButton import HoverButton + +# 音乐标题栏按钮 +from gui.pages.GlobalSignal import globalSignal + + +class FavourDownloadWidget(QWidget): + favourSignal = pyqtSignal(int) + downloadSignal = pyqtSignal(int) + + def __init__(self, index, music, showFavourBtn=True, showDownloadBtn=True): + super(FavourDownloadWidget, self).__init__() + + self.index = index + self.music = music + self.initUI(showFavourBtn, showDownloadBtn) + + def initUI(self, showFavourBtn, showDownloadBtn): + layout = QHBoxLayout() + self.setLayout(layout) + + tagLabel = QLabel() + tagLabel.setStyleSheet("font-weight:bold;") + tagLabel.setText(self.getText()) + layout.addWidget(tagLabel) + + if showFavourBtn: + # 判断当前歌曲是否已经收藏 + self.setMusicFavour() + self.favourBtn = HoverButton() + self.setFavourBtn() + self.favourBtn.clicked.connect(self.handle) + layout.addWidget(self.favourBtn) + + if showDownloadBtn: + downloadBtn = HoverButton(iconName='download', inActiveColor='#B4B4B4', activeColor='#6A6B6B') + downloadBtn.clicked.connect(lambda: globalSignal.downloadMusic.emit(self.music)) + layout.addWidget(downloadBtn) + + layout.addStretch(2) + + nameLabel = QLabel() + nameLabel.setText(self.music.name) + layout.addWidget(nameLabel) + + layout.addStretch(1) + + def getText(self): + id = self.index + 1 + if id < 10: + return '0' + str(id) + else: + return str(id) + + def handle(self): + self.music.favorite = not self.music.favorite + self.setFavourBtn() + globalSignal.favourMusic.emit(self.music) + + def setFavourBtn(self): + if self.music.favorite: + self.favourBtn.resetIconName('heart') + self.favourBtn.resetIconColor('#EC4141', '#EC4141') + else: + self.favourBtn.resetIconName('heart-o') + self.favourBtn.resetIconColor('#B4B4B4', '#6A6B6B') + + def setMusicFavour(self): + self.favoriteMusicList = redis.getValue('favoriteMusicList', MusicList()) + for i in range(self.favoriteMusicList.length()): + if self.favoriteMusicList[i].id == self.music.id: + self.music.favorite = True + return diff --git "a/21\343\200\201\345\206\231\344\272\206\344\270\252\347\275\221\346\230\223\344\272\221/gui/components/content/HoverButton.py" "b/21\343\200\201\345\206\231\344\272\206\344\270\252\347\275\221\346\230\223\344\272\221/gui/components/content/HoverButton.py" new file mode 100644 index 0000000..81ef540 --- /dev/null +++ "b/21\343\200\201\345\206\231\344\272\206\344\270\252\347\275\221\346\230\223\344\272\221/gui/components/content/HoverButton.py" @@ -0,0 +1,74 @@ +# Python电子书:http://t.cn/A6tMNzuI +# Python交流群:http://t.cn/A65MiFvH +from PyQt5.QtGui import QCursor +from PyQt5.QtCore import Qt, pyqtSignal +import qtawesome as qta +from functools import partial + +# 继承自Button 实现按钮背景图片的设置 及 鼠标悬浮时的变色 +from gui.components.common.Button import Button + + +class HoverButton(Button): + tagSignal = pyqtSignal(object) + + # 默认值 + activeColor = '#FFFFFF' + inActiveColor = '#F8CECE' + cursor = Qt.PointingHandCursor + + def __init__(self, *args, **kwargs): + super(HoverButton, self).__init__(*args) + + style = "HoverButton{border:none;}" + + # 图标颜色初始化 + activeColor = kwargs.get('activeColor') + if activeColor != None: + self.activeColor = activeColor + inActiveColor = kwargs.get('inActiveColor') + if inActiveColor != None: + self.inActiveColor = inActiveColor + + # 按钮文字 + text = kwargs.get('text') + if text != None: + self.setText(text) + style += "HoverButton{color:" + self.inActiveColor + ";}" + style += "HoverButton:hover{color:" + self.activeColor + ";}" + # 判断iconName是否存在 + iconName = kwargs.get('iconName') + if iconName != None: + self.iconName = iconName + self.setIcon(qta.icon("fa." + self.iconName, color=self.inActiveColor)) + if self.inActiveColor != self.activeColor: + self.mouseEnter.connect(partial(self.resetIcon, 1)) + self.mouseLeave.connect(partial(self.resetIcon, 0)) + + # 光标初始化 + cursor = kwargs.get('cursor') + if cursor != None: + self.cursor = cursor + self.setCursor(QCursor(self.cursor)) + self.setStyleSheet(style) + + # 按钮标记 + tag = kwargs.get('tag') + if tag != None: + self.clicked.connect(lambda: self.tagSignal.emit(tag)) + + # status为1 则为激活状态 否则为不激活状态 + def resetIcon(self, status): + if status == 1: + self.setIcon(qta.icon("fa." + self.iconName, color=self.activeColor)) + else: + self.setIcon(qta.icon("fa." + self.iconName, color=self.inActiveColor)) + + def resetIconName(self, iconName): + self.iconName = iconName + self.resetIcon(0) + + def resetIconColor(self, inActiveColor, activeColor): + self.activeColor = activeColor + self.inActiveColor = inActiveColor + self.resetIcon(0) diff --git "a/21\343\200\201\345\206\231\344\272\206\344\270\252\347\275\221\346\230\223\344\272\221/gui/components/content/LastestLabel.py" "b/21\343\200\201\345\206\231\344\272\206\344\270\252\347\275\221\346\230\223\344\272\221/gui/components/content/LastestLabel.py" new file mode 100644 index 0000000..54fdf7b --- /dev/null +++ "b/21\343\200\201\345\206\231\344\272\206\344\270\252\347\275\221\346\230\223\344\272\221/gui/components/content/LastestLabel.py" @@ -0,0 +1,19 @@ +# Python电子书:http://t.cn/A6tMNzuI +# Python交流群:http://t.cn/A65MiFvH +from PyQt5.QtCore import * +from PyQt5.QtWidgets import * + +# 音乐标题栏按钮 +from gui.utils.TimeFormatter import timeStamptoTime + + +class LastestLabel(QLabel): + + def __init__(self, lastestTime): + super(LastestLabel, self).__init__() + + self.setAlignment(Qt.AlignHCenter | Qt.AlignVCenter) + self.setText(self.getText(lastestTime)) + + def getText(self, lastestTime): + return timeStamptoTime(lastestTime) diff --git "a/21\343\200\201\345\206\231\344\272\206\344\270\252\347\275\221\346\230\223\344\272\221/gui/components/content/MenuButton.py" "b/21\343\200\201\345\206\231\344\272\206\344\270\252\347\275\221\346\230\223\344\272\221/gui/components/content/MenuButton.py" new file mode 100644 index 0000000..c68f2bc --- /dev/null +++ "b/21\343\200\201\345\206\231\344\272\206\344\270\252\347\275\221\346\230\223\344\272\221/gui/components/content/MenuButton.py" @@ -0,0 +1,63 @@ +# Python电子书:http://t.cn/A6tMNzuI +# Python交流群:http://t.cn/A65MiFvH +from PyQt5.QtGui import * +from PyQt5.QtWidgets import * +from PyQt5.QtCore import * +import qtawesome as qta + + +class MenuButton(QPushButton): + click = pyqtSignal(int) + + def __init__(self, index, text, icon=None): + super(MenuButton, self).__init__() + + self.index = index + self.setText(text) + if icon: + self.setIcon(qta.icon('fa.' + icon, color='#373737')) + + self.setCursor(QCursor(Qt.PointingHandCursor)) + self.initStyle() + + self.clicked.connect(lambda: self.click.emit(self.index)) + + def initStyle(self): + style = """ + MenuButton{ + color:#454545; + border:none; + text-align:left; + height:45px; + font-size:20px; + padding-left:5px; + } + MenuButton:hover{ + background:#F6F6F7; + } + """ + self.setStyleSheet(style) + + def setSelected(self, selected): + if selected: + self.setStyleSheet( + "MenuButton{border:none;text-align:left;height:45px;font-size:20px;padding-left:5px;color:#313131;font-weight:bold;background:#F6F6F7;}") + else: + self.initStyle() + + def getIndex(self): + return self.index + + +class Win(QWidget): + def __init__(self): + super(Win, self).__init__() + + layout = QHBoxLayout() + layout.setContentsMargins(0, 0, 0, 0) + self.setLayout(layout) + + button = MenuButton("发现歌曲") + button.setSelected(True) + layout.addWidget(button) + diff --git "a/21\343\200\201\345\206\231\344\272\206\344\270\252\347\275\221\346\230\223\344\272\221/gui/components/content/MusicItem.py" "b/21\343\200\201\345\206\231\344\272\206\344\270\252\347\275\221\346\230\223\344\272\221/gui/components/content/MusicItem.py" new file mode 100644 index 0000000..5315182 --- /dev/null +++ "b/21\343\200\201\345\206\231\344\272\206\344\270\252\347\275\221\346\230\223\344\272\221/gui/components/content/MusicItem.py" @@ -0,0 +1,51 @@ +# Python电子书:http://t.cn/A6tMNzuI +# Python交流群:http://t.cn/A65MiFvH +from PyQt5.QtWidgets import QWidget, QHBoxLayout, QLabel, QApplication + +from gui.components.common.CommonButton import CommonButton + + +class MusicItem(QWidget): + + def __init__(self, id, name, artist, album, url, avatar, lyric): + super(MusicItem, self).__init__() + + self.initStyle() + self.initUI(id, name, artist, album, url, avatar, lyric) + + def initStyle(self): + style = """ + CommonButton{ + border:none; + } + """ + self.setStyleSheet(style) + + def initUI(self, id, name, artist, album, url, avatar, lyric): + layout = QHBoxLayout() + self.setLayout(layout) + + id = QLabel(str(id)) + layout.addWidget(id) + + layout.addStretch(2) + + name = QLabel(name) + layout.addWidget(name) + + layout.addStretch(1) + + artist = CommonButton(artist) + layout.addWidget(artist) + + layout.addStretch(1) + + album = CommonButton(album) + layout.addWidget(album) + + +if __name__ == '__main__': + app = QApplication([]) + window = MusicItem(1, '十七岁', 'wo1', '专辑', 'www.baidu.com', 'aaa', 'bbb') + window.show() + app.exec_() diff --git "a/21\343\200\201\345\206\231\344\272\206\344\270\252\347\275\221\346\230\223\344\272\221/gui/components/content/Table.py" "b/21\343\200\201\345\206\231\344\272\206\344\270\252\347\275\221\346\230\223\344\272\221/gui/components/content/Table.py" new file mode 100644 index 0000000..822f368 --- /dev/null +++ "b/21\343\200\201\345\206\231\344\272\206\344\270\252\347\275\221\346\230\223\344\272\221/gui/components/content/Table.py" @@ -0,0 +1,32 @@ +# Python电子书:http://t.cn/A6tMNzuI +# Python交流群:http://t.cn/A65MiFvH +from PyQt5.QtWidgets import * + + +class Table(QTableWidget): + + def __init__(self, column): + super(Table, self).__init__() + + self.setStyleSheet(""" + QTableWidget{ + border:none; + } + """) + + # 设置列数 + self.setColumnCount(len(column)) + # 设置不可编辑 + self.setEditTriggers(QAbstractItemView.NoEditTriggers) + # 设置整行选择 + self.setSelectionBehavior(QAbstractItemView.SelectRows) + # 设置不显示垂直标题 + self.verticalHeader().setVisible(False) + # 设置不显示网格 + self.setShowGrid(False) + # 设置表头随窗口拉伸 + self.horizontalHeader().setSectionResizeMode(QHeaderView.Stretch) + # 设置表头的高度 + self.horizontalHeader().setFixedHeight(45) + # 设置单元行的高度 + self.verticalHeader().setDefaultSectionSize(45) diff --git "a/21\343\200\201\345\206\231\344\272\206\344\270\252\347\275\221\346\230\223\344\272\221/gui/components/content/TagWidget.py" "b/21\343\200\201\345\206\231\344\272\206\344\270\252\347\275\221\346\230\223\344\272\221/gui/components/content/TagWidget.py" new file mode 100644 index 0000000..2500607 --- /dev/null +++ "b/21\343\200\201\345\206\231\344\272\206\344\270\252\347\275\221\346\230\223\344\272\221/gui/components/content/TagWidget.py" @@ -0,0 +1,13 @@ +# Python电子书:http://t.cn/A6tMNzuI +# Python交流群:http://t.cn/A65MiFvH +from PyQt5.QtWidgets import QWidget + + +class TagWidget(QWidget): + + def __init__(self, tag): + super(TagWidget, self).__init__() + self.tag = tag + + def getTag(self): + return self.tag diff --git "a/21\343\200\201\345\206\231\344\272\206\344\270\252\347\275\221\346\230\223\344\272\221/gui/components/content/__init__.py" "b/21\343\200\201\345\206\231\344\272\206\344\270\252\347\275\221\346\230\223\344\272\221/gui/components/content/__init__.py" new file mode 100644 index 0000000..eabf991 --- /dev/null +++ "b/21\343\200\201\345\206\231\344\272\206\344\270\252\347\275\221\346\230\223\344\272\221/gui/components/content/__init__.py" @@ -0,0 +1,2 @@ +# Python电子书:http://t.cn/A6tMNzuI +# Python交流群:http://t.cn/A65MiFvH diff --git "a/21\343\200\201\345\206\231\344\272\206\344\270\252\347\275\221\346\230\223\344\272\221/gui/pages/GlobalSignal.py" "b/21\343\200\201\345\206\231\344\272\206\344\270\252\347\275\221\346\230\223\344\272\221/gui/pages/GlobalSignal.py" new file mode 100644 index 0000000..e864624 --- /dev/null +++ "b/21\343\200\201\345\206\231\344\272\206\344\270\252\347\275\221\346\230\223\344\272\221/gui/pages/GlobalSignal.py" @@ -0,0 +1,46 @@ +# Python电子书:http://t.cn/A6tMNzuI +# Python交流群:http://t.cn/A65MiFvH +from PyQt5.QtCore import pyqtSignal, QObject + +from bean.Music import Music + + +class Signal(QObject): + # ------------------------------ 搜索相关-----------------------------------# + # 播放音乐 + playMusic = pyqtSignal(Music) + # 下载音乐 + downloadMusic = pyqtSignal(Music) + # 收藏音乐 + favourMusic = pyqtSignal(Music) + # ------------------------------导航栏相关-----------------------------------# + # 关键字查询 + keywordSignal = pyqtSignal(str) + # 根据索引进行页面跳转 + pageIndexSignal = pyqtSignal(int) + # 设置backward状态 + backwardStatusSignal = pyqtSignal(bool) + # 设置forward状态 + forwardStatusSignal = pyqtSignal(bool) + # 用于进退 + keywordSignalI = pyqtSignal(str) + # ----------------------------发现页面相关信号--------------------------------# + # 播放音乐列表 + playMusicList = pyqtSignal(list) + # 跳转到展示音乐列表界面 + displayMusicList = pyqtSignal(list) + # -------------------------- 音乐播放器相关信号 ----------------------------- # + # 播放上一首 + playPreMusic = pyqtSignal() + # 播放下一首 + playNextMusic = pyqtSignal() + # -------------------------- 本地音乐相关信号 ----------------------------- # + playLocalMusic = pyqtSignal(Music) + + playStyleMusic = pyqtSignal() + + def __init__(self): + super(Signal, self).__init__() + + +globalSignal = Signal() diff --git "a/21\343\200\201\345\206\231\344\272\206\344\270\252\347\275\221\346\230\223\344\272\221/gui/pages/MainWindow.py" "b/21\343\200\201\345\206\231\344\272\206\344\270\252\347\275\221\346\230\223\344\272\221/gui/pages/MainWindow.py" new file mode 100644 index 0000000..2e50fac --- /dev/null +++ "b/21\343\200\201\345\206\231\344\272\206\344\270\252\347\275\221\346\230\223\344\272\221/gui/pages/MainWindow.py" @@ -0,0 +1,276 @@ +# Python电子书:http://t.cn/A6tMNzuI +# Python交流群:http://t.cn/A65MiFvH +import sys + +from PyQt5.QtCore import * +from PyQt5.QtWidgets import * +from PyQt5.QtGui import * + +from bean.Async import asynchronous +from bean.MusicList import MusicList +from gui.components.common.HSeparateLine import HSeparateLine +from gui.pages.content.Content import Content +from gui.pages.GlobalSignal import globalSignal +from gui.pages.navbar.NavBar import NavBar +from gui.pages.statusbar.StatusBar import StatusBar +from dao.Redis import redis +from resolver.SpiderResolver import getMusicListByKeywordResolver + + +class Window(QWidget): + # 窗体的最小宽高 + WINDOW_MIN_WIDTH = 1275 + WINDOW_MIN_HEIGHT = 835 + # 窗口边框宽度 + WINDOW_SHADOW_MARGIN = 20 + # 窗口拖拽标记 + drag = False + dragValid = False + flag = -1 + + def __init__(self): + super(Window, self).__init__() + + # 窗口基本参数配置 + self.setMinimumSize(self.WINDOW_MIN_WIDTH + 2 * self.WINDOW_SHADOW_MARGIN, + self.WINDOW_MIN_HEIGHT + 2 * self.WINDOW_SHADOW_MARGIN) + self.setWindowFlags(Qt.FramelessWindowHint) + self.setAttribute(Qt.WA_TranslucentBackground, True) + self.setMouseTracking(True) + + self.initParams() + self.initUI() + # 全局信号处理 + self.globalSignalHandle() + + def initParams(self): + size = redis.getValue('size', QSize(self.WINDOW_MIN_WIDTH, self.WINDOW_MIN_HEIGHT)) + self.resize(size) + pos = QPoint((QApplication.desktop().width() - size.width()) / 2, + (QApplication.desktop().height() - size.height()) / 2) + self.isMaximize = redis.getValue('isMaximize', 0) + + # 歌曲相关 + # 当前正在播放的歌单 + self.songs = redis.getValue("songs", MusicList()) + # 最近播放歌单 音乐标题 歌手 播放时间 清空列表 + self.recentMusicList = redis.getValue("recentMusicList", MusicList()) + # 收藏歌单 + self.favoriteMusicList = redis.getValue("favoriteMusicList", MusicList()) + # 下载歌单 + self.downloadMusicList = redis.getValue("downloadMusicList", MusicList()) + + self.words = redis.getValue('words', []) + + def initUI(self): + layout = QVBoxLayout() + layout.setSpacing(0) + self.setLayout(layout) + + # 是否最大化 + if self.isMaximize: + self.setLayoutContentsMargins(0) + self.showMaximized() + else: + self.setLayoutContentsMargins(self.WINDOW_SHADOW_MARGIN) + + # 窗口边框绘制 + border = QGraphicsDropShadowEffect() + border.setOffset(0, 0) + border.setColor(QColor("#444444")) + border.setBlurRadius(self.WINDOW_SHADOW_MARGIN) + self.setGraphicsEffect(border) + + self.navBar = NavBar() + self.navBar.setMaximumHeight(75) + self.navBar.moveSignal.connect(self.moveSignalHandle) + self.navBar.minimizeSignal.connect(self.showMinimized) + self.navBar.maximizeSignal.connect(self.maximizeSignalHandle) + self.navBar.restoreSignal.connect(self.restoreSignalHandle) + self.navBar.closeSignal.connect(self.closeSignalHandle) + + layout.addWidget(self.navBar) + + self.content = Content() + layout.addWidget(self.content) + + separateLine = HSeparateLine() + separateLine.setStyleSheet("background:#F6F6F7;border:1px solid #F6F6F7") + layout.addWidget(separateLine) + + self.statusBar = StatusBar() + self.statusBar.setMaximumHeight(100) + layout.addWidget(self.statusBar) + + def globalSignalHandle(self): + globalSignal.playMusicList.connect(self.playMusicList) + globalSignal.playPreMusic.connect(self.playPreMusic) + globalSignal.playNextMusic.connect(self.playNextMusic) + globalSignal.keywordSignal.connect(lambda keyword: self.content.searchMusicBykeyword(keyword)) + globalSignal.playMusic.connect(self.playMusic) + globalSignal.favourMusic.connect(self.favourMusic) + globalSignal.playLocalMusic.connect(self.playLocalMusic) + globalSignal.playStyleMusic.connect(self.playStyleMusic) + + # 播放歌单 + def playMusicList(self, musicList): + self.songs.clear() + self.songs.insertBatch(musicList) + # 添加至最近播放音乐列表 + music = self.songs.getCurrentMusic() + self.statusBar.playMusic(music) + + def playPreMusic(self): + music = self.songs.forward() + self.statusBar.playMusic(music) + + def playNextMusic(self): + music = self.songs.backward() + self.statusBar.playMusic(music) + + def playMusic(self, music): + self.statusBar.playMusic(music) + + def favourMusic(self, music): + if music.favorite: # 从未收藏 变为 已经收藏 + self.favoriteMusicList.extrapolate(music) + else: # 从已经收藏 变为未收藏 + for i in range(self.favoriteMusicList.length()): + if self.favoriteMusicList[i].id == music.id: + del self.favoriteMusicList[i] + self.content.pages.collectWidget.display() + + def playLocalMusic(self, music): + self.statusBar.playLocalMusic(music) + + # 窗口相关 + # 设置边框宽度 注:请确保已为窗口设置布局 + def setLayoutContentsMargins(self, width): + self.layout().setContentsMargins(width, width, width, width) + + # 窗口移动 + def moveSignalHandle(self, pos): + self.move(QPoint(pos.x() - self.WINDOW_SHADOW_MARGIN, pos.y() - self.WINDOW_SHADOW_MARGIN)) + + # 窗口最大化 + def maximizeSignalHandle(self): + self.setLayoutContentsMargins(0) + self.isMaximize = 1 + self.showMaximized() + + # 窗口还原 + def restoreSignalHandle(self): + self.setLayoutContentsMargins(self.WINDOW_SHADOW_MARGIN) + self.isMaximize = 0 + self.showNormal() + + # 关闭窗口 + def closeSignalHandle(self): + if self.pos().y() + self.size().height() > QApplication.desktop().height() or self.pos().y() < 0 or self.pos().x() < 0 or self.pos().x() + self.size().width() > QApplication.desktop().width(): + redis.setValue('size', None) + else: + redis.setValue('size', QSize(self.size().width(), self.size().height())) + redis.setValue('isMaximize', self.isMaximize) + redis.serialize() + self.close() + + # 窗口大小可拖拽 + def mousePressEvent(self, event): + self.drag = True + self.originPos = self.pos() + + def mouseMoveEvent(self, event): + distance = 0 + factor = self.WINDOW_SHADOW_MARGIN / 2 + if self.isMaximize: + return + + if self.dragValid == False: + if event.globalPos().x() > (self.pos().x() + self.width() - self.WINDOW_SHADOW_MARGIN + distance) \ + and event.globalPos().x() - ( + self.pos().x() + self.width() - self.WINDOW_SHADOW_MARGIN + distance) < factor: + if event.globalPos().y() < (self.WINDOW_SHADOW_MARGIN + self.pos().y() - distance) and ( + self.WINDOW_SHADOW_MARGIN + self.pos().y() - distance) - event.globalPos().y() < factor: + self.flag = 1 # 右上 + self.setCursor(QCursor(Qt.SizeBDiagCursor)) + elif event.globalPos().y() > (self.pos().y() + self.height() - self.WINDOW_SHADOW_MARGIN + distance) and \ + event.globalPos().y() - ( + self.pos().y() + self.height() - self.WINDOW_SHADOW_MARGIN + distance) < factor: + self.flag = 2 # 右下 + self.setCursor(QCursor(Qt.SizeFDiagCursor)) + elif event.globalPos().y() >= ( + self.pos().y() + self.WINDOW_SHADOW_MARGIN) and event.globalPos().y() <= ( + self.pos().y() + self.height() - self.WINDOW_SHADOW_MARGIN): + self.flag = 0 # 右0 + self.setCursor(QCursor(Qt.SizeHorCursor)) + else: + pass + elif event.globalPos().x() < (self.pos().x() + self.WINDOW_SHADOW_MARGIN - distance) and ( + self.pos().x() + self.WINDOW_SHADOW_MARGIN - distance) - event.globalPos().x() < factor: + if event.globalPos().y() < (self.WINDOW_SHADOW_MARGIN + self.pos().y() - distance) and ( + self.WINDOW_SHADOW_MARGIN + self.pos().y() - distance) - event.globalPos().y() < factor: + self.flag = 3 # 左上 + self.setCursor(QCursor(Qt.SizeFDiagCursor)) + elif event.globalPos().y() > (self.pos().y() + self.height() - self.WINDOW_SHADOW_MARGIN + distance) and \ + event.globalPos().y() - ( + self.pos().y() + self.height() - self.WINDOW_SHADOW_MARGIN + distance) < factor: + self.flag = 4 # 左下 + self.setCursor(QCursor(Qt.SizeBDiagCursor)) + else: + pass + else: + self.setCursor(QCursor(Qt.ArrowCursor)) + + if Qt.LeftButton and self.drag: + self.dragValid = True + if self.flag == 0: # 右边拖动 + self.resize(QSize(event.globalPos().x() - self.pos().x() + self.WINDOW_SHADOW_MARGIN, self.height())) + elif self.flag == 1: # 右上拖动 + self.resize(QSize(event.globalPos().x() - self.pos().x() + self.WINDOW_SHADOW_MARGIN, + self.height() + self.pos().y() + self.WINDOW_SHADOW_MARGIN - event.globalPos().y())) + y = self.pos().y() - self.pos().y() - self.WINDOW_SHADOW_MARGIN + event.globalPos().y() + if y > self.originPos.y(): + y = self.originPos.y() + self.move(self.x(), y) + elif self.flag == 2: # 右下拖动 + self.resize(QSize(event.globalPos().x() - self.pos().x() + self.WINDOW_SHADOW_MARGIN, + self.height() + event.globalPos().y() - self.pos().y() - self.height() + self.WINDOW_SHADOW_MARGIN)) + elif self.flag == 3: # 左上拖动 + self.resize(QSize(self.width() + (self.pos().x() + self.WINDOW_SHADOW_MARGIN) - event.globalPos().x(), + self.height() + self.pos().y() + self.WINDOW_SHADOW_MARGIN - event.globalPos().y())) + + x = self.pos().x() - ((self.pos().x() + self.WINDOW_SHADOW_MARGIN) - event.globalPos().x()) + y = self.pos().y() - (self.pos().y() + self.WINDOW_SHADOW_MARGIN - event.globalPos().y()) + if x > self.originPos.x(): + x = self.originPos.x() + if y > self.originPos.y(): + y = self.originPos.y() + self.move(x, y) + elif self.flag == 4: # 左下拖动 + self.resize(QSize(self.width() + (self.pos().x() + self.WINDOW_SHADOW_MARGIN) - event.globalPos().x(), + self.height() + event.globalPos().y() - self.pos().y() - self.height() + self.WINDOW_SHADOW_MARGIN)) + x = self.pos().x() - ((self.pos().x() + self.WINDOW_SHADOW_MARGIN) - event.globalPos().x()) + if x > self.originPos.x(): + x = self.originPos.x() + self.move(x, self.pos().y()) + else: + pass + + def mouseReleaseEvent(self, event): + self.drag = False + self.dragValid = False + + @asynchronous + def playStyleMusic(self): + self.words.sort(key=lambda x: x[1], reverse=True) + self.songs.clear() + self.songs.insertBatch(getMusicListByKeywordResolver(10, 1, self.words[0][0])) + + +if __name__ == '__main__': + app = QApplication(sys.argv) + window = Window() + window.show() + sys.exit(app.exec_()) + +# /storage/emulated/0/Music diff --git "a/21\343\200\201\345\206\231\344\272\206\344\270\252\347\275\221\346\230\223\344\272\221/gui/pages/__init__.py" "b/21\343\200\201\345\206\231\344\272\206\344\270\252\347\275\221\346\230\223\344\272\221/gui/pages/__init__.py" new file mode 100644 index 0000000..eabf991 --- /dev/null +++ "b/21\343\200\201\345\206\231\344\272\206\344\270\252\347\275\221\346\230\223\344\272\221/gui/pages/__init__.py" @@ -0,0 +1,2 @@ +# Python电子书:http://t.cn/A6tMNzuI +# Python交流群:http://t.cn/A65MiFvH diff --git "a/21\343\200\201\345\206\231\344\272\206\344\270\252\347\275\221\346\230\223\344\272\221/gui/pages/abc.jpg" "b/21\343\200\201\345\206\231\344\272\206\344\270\252\347\275\221\346\230\223\344\272\221/gui/pages/abc.jpg" new file mode 100644 index 0000000..ba47abc Binary files /dev/null and "b/21\343\200\201\345\206\231\344\272\206\344\270\252\347\275\221\346\230\223\344\272\221/gui/pages/abc.jpg" differ diff --git "a/21\343\200\201\345\206\231\344\272\206\344\270\252\347\275\221\346\230\223\344\272\221/gui/pages/content/Content.py" "b/21\343\200\201\345\206\231\344\272\206\344\270\252\347\275\221\346\230\223\344\272\221/gui/pages/content/Content.py" new file mode 100644 index 0000000..598a0cb --- /dev/null +++ "b/21\343\200\201\345\206\231\344\272\206\344\270\252\347\275\221\346\230\223\344\272\221/gui/pages/content/Content.py" @@ -0,0 +1,87 @@ +# Python电子书:http://t.cn/A6tMNzuI +# Python交流群:http://t.cn/A65MiFvH +from PyQt5.QtWidgets import * +from PyQt5.QtCore import * +from PyQt5.QtGui import * + +from bean.RecodeStack import recodeStack +from gui.pages.GlobalSignal import globalSignal +from gui.pages.content.MenuType import MenuType +from gui.pages.content.MenuListWidget import MenuListWidget +from gui.pages.content.PageStackedWidget import PageStackedWidget + + +class Content(QSplitter): + backwardButtonFirst = True + + def __init__(self): + super(Content, self).__init__() + + self.setChildrenCollapsible(False) + self.setCursor(QCursor(Qt.ArrowCursor)) + + self.initStyle() + self.initUI() + + def initStyle(self): + self.setAttribute(Qt.WA_StyledBackground, True) + style = """ + Content{ + background:#ffffff; + } + QSplitter{ + width:2px; + } + """ + self.setStyleSheet(style) + + def initUI(self): + # 注意加载顺序 + self.pages = PageStackedWidget() + + self.menus = MenuListWidget() + self.menus.itemClicked.connect(self.setPageCurrentIndex) + self.menus.setCurentIndex(MenuType.FIND_MUSIC.value) + + self.addWidget(self.menus) + self.addWidget(self.pages) + # 设置拉伸因子 + self.setStretchFactor(0, 0) + self.setStretchFactor(1, 1) + + # 页面跳转 + globalSignal.pageIndexSignal.connect(self.setPageCurrentIndexI) + globalSignal.keywordSignalI.connect(self.searchMusicBykeywordI) + + # 设置页面 + def setPageCurrentIndex(self, index): + self.recodeStackHandle(index) + self.pages.setCurrentPage(index) + + # 查询音乐 + def searchMusicBykeyword(self, keyword): + self.recodeStackHandle(MenuType.SEARCH.value, keyword) + self.menus.resetComponents() + self.pages.setCurrentPage(MenuType.SEARCH.value) + self.pages.keywordSearchWidget.searchMusicBykeyword(keyword) + + # 设置查询音乐页面 + def searchMusicBykeywordI(self, keyword): + self.menus.resetComponents() + self.pages.setCurrentPage(MenuType.SEARCH.value) + self.pages.keywordSearchWidget.searchMusicBykeyword(keyword) + + # 设置页面 用于导航栏 + def setPageCurrentIndexI(self, index): + self.menus.setCurrentIndexI(index) + self.pages.setCurrentPage(index) + + # 操作recodeStack数据结构 + def recodeStackHandle(self, index, tag=None): + recodeStack.insert(index, tag) + # 若为第一次加入 则不设置按钮状态 + if not self.backwardButtonFirst: + globalSignal.backwardStatusSignal.emit(False) + globalSignal.forwardStatusSignal.emit(True) + else: + self.backwardButtonFirst = False diff --git "a/21\343\200\201\345\206\231\344\272\206\344\270\252\347\275\221\346\230\223\344\272\221/gui/pages/content/MenuListWidget.py" "b/21\343\200\201\345\206\231\344\272\206\344\270\252\347\275\221\346\230\223\344\272\221/gui/pages/content/MenuListWidget.py" new file mode 100644 index 0000000..0b0fd69 --- /dev/null +++ "b/21\343\200\201\345\206\231\344\272\206\344\270\252\347\275\221\346\230\223\344\272\221/gui/pages/content/MenuListWidget.py" @@ -0,0 +1,106 @@ +# Python电子书:http://t.cn/A6tMNzuI +# Python交流群:http://t.cn/A65MiFvH +from PyQt5.QtWidgets import * + +from gui.components.content.MenuButton import MenuButton, pyqtSignal +from gui.pages.content.MenuType import MenuType + + +class MenuListWidget(QWidget): + WINDOW_MIN_WIDTH = 243 + + # 菜单列表中的所有列表 + components = [] + + itemClicked = pyqtSignal(int) + + originIndex = -1 + + def __init__(self): + super(MenuListWidget, self).__init__() + + self.setMinimumWidth(self.WINDOW_MIN_WIDTH) + self.setContentsMargins(0, 0, 0, 0) + + self.initStyle() + self.initUI() + + def initStyle(self): + style = """ + QListWidget{ + border:none; + } + QPushButton{ + border:none; + /*background:#F6F6F7;*/ + height:45px; + font-size:20px; + /*font-weight:bold;*/ + text-align:left; + padding-left:5px; + } + QLabel{ + padding-left:5px; + color:#999999; + } + """ + self.setStyleSheet(style) + + def initUI(self): + self.layout = QVBoxLayout() + self.setLayout(self.layout) + + findMusic = MenuButton(MenuType.FIND_MUSIC.value, '发现音乐') + self.layout.addWidget(findMusic) + + video = MenuButton(MenuType.VIDEO.value, '统计') + self.layout.addWidget(video) + + myDevice = MenuButton(MenuType.MY_DEVICE.value, '我的设备') # mobile + self.layout.addWidget(myDevice) + + myMusic = QLabel('我的音乐') # music + myMusic.setFixedHeight(45) + self.layout.addWidget(myMusic) + + home = MenuButton(MenuType.HOME.value, "本地音乐", 'home') + self.layout.addWidget(home) + + download = MenuButton(MenuType.DOWNLOAD.value, "下载管理", 'download') + self.layout.addWidget(download) + + recent = MenuButton(MenuType.RECENT.value, "最近播放", 'ravelry') + self.layout.addWidget(recent) + + collect = MenuButton(MenuType.COLLECT.value, "我的收藏", 'heart') + self.layout.addWidget(collect) + + self.layout.addStretch(1) + + # 添加itemClick事件 + for i in range(self.layout.count() - 1): + component = self.layout.itemAt(i).widget() + if isinstance(component, MenuButton): + component.click.connect(self.setCurentIndex) + self.components.append(component) + + # 根据index查找组件 + def indexAt(self, index): + for component in self.components: + if component.getIndex() == index: + return component + + def resetComponents(self): + for component in self.components: + component.setSelected(False) + + def setCurentIndex(self, index): + if self.originIndex != index: + self.originIndex = index + self.resetComponents() + self.indexAt(index).setSelected(True) + self.itemClicked.emit(index) + + def setCurrentIndexI(self, index): + self.resetComponents() + self.indexAt(index).setSelected(True) diff --git "a/21\343\200\201\345\206\231\344\272\206\344\270\252\347\275\221\346\230\223\344\272\221/gui/pages/content/MenuType.py" "b/21\343\200\201\345\206\231\344\272\206\344\270\252\347\275\221\346\230\223\344\272\221/gui/pages/content/MenuType.py" new file mode 100644 index 0000000..ba34683 --- /dev/null +++ "b/21\343\200\201\345\206\231\344\272\206\344\270\252\347\275\221\346\230\223\344\272\221/gui/pages/content/MenuType.py" @@ -0,0 +1,15 @@ +# Python电子书:http://t.cn/A6tMNzuI +# Python交流群:http://t.cn/A65MiFvH +from enum import Enum, unique + + +@unique +class MenuType(Enum): + FIND_MUSIC = 1 + VIDEO = 2 + MY_DEVICE = 3 + HOME = 4 + DOWNLOAD = 5 + RECENT = 6 + COLLECT = 7 + SEARCH = 8 diff --git "a/21\343\200\201\345\206\231\344\272\206\344\270\252\347\275\221\346\230\223\344\272\221/gui/pages/content/PageStackedWidget.py" "b/21\343\200\201\345\206\231\344\272\206\344\270\252\347\275\221\346\230\223\344\272\221/gui/pages/content/PageStackedWidget.py" new file mode 100644 index 0000000..8cf0aae --- /dev/null +++ "b/21\343\200\201\345\206\231\344\272\206\344\270\252\347\275\221\346\230\223\344\272\221/gui/pages/content/PageStackedWidget.py" @@ -0,0 +1,80 @@ +# Python电子书:http://t.cn/A6tMNzuI +# Python交流群:http://t.cn/A65MiFvH +from PyQt5.QtWidgets import * + +from gui.pages.content.MenuType import MenuType +from gui.pages.content.child.CollectWidget import CollectWidget +from gui.pages.content.child.DownloadWidget import DownloadWidget +from gui.pages.content.child.FindMusicWidget import FindMusicWidget +from gui.pages.content.child.HomeWidget import HomeWidget +from gui.pages.content.child.KeyWordSearchWidget import KeyWordSearchWidget +from gui.pages.content.child.MyDeviceWidget import MyDeviceWidget +from gui.pages.content.child.RecentWidget import RecentWidget +from gui.pages.content.child.VideoWidget import VideoWidget + + +class PageStackedWidget(QStackedWidget): + WINDOW_MIN_WIDTH = 1030 + + # 所有页面 + components = [] + + def __init__(self): + super(PageStackedWidget, self).__init__() + + self.setMinimumWidth(self.WINDOW_MIN_WIDTH) + + self.initStyle() + self.initUI() + + def initStyle(self): + style = """ + + """ + self.setStyleSheet(style) + + def initUI(self): + findMusicWidget = FindMusicWidget(MenuType.FIND_MUSIC.value) + self.addWidget(findMusicWidget) + + self.videoWidget = VideoWidget(MenuType.VIDEO.value) + self.addWidget(self.videoWidget) + + myDeviceWidget = MyDeviceWidget(MenuType.MY_DEVICE.value) + self.addWidget(myDeviceWidget) + + homeWidget = HomeWidget(MenuType.HOME.value) + self.addWidget(homeWidget) + + self.downloadWidget = DownloadWidget(MenuType.DOWNLOAD.value) + self.addWidget(self.downloadWidget) + + self.recentWidget = RecentWidget(MenuType.RECENT.value) + self.addWidget(self.recentWidget) + + self.collectWidget = CollectWidget(MenuType.COLLECT.value) + self.addWidget(self.collectWidget) + + self.keywordSearchWidget = KeyWordSearchWidget(MenuType.SEARCH.value) + self.addWidget(self.keywordSearchWidget) + + # 初始化components + for i in range(self.layout().count()): + self.components.append(self.layout().itemAt(i).widget()) + + # 根据tag查找组件 + def indexAt(self, tag): + for component in self.components: + if component.getTag() == tag: + return component + + def setCurrentPage(self, tag): + if tag == MenuType.RECENT.value: + self.recentWidget.display() + if tag == MenuType.COLLECT.value: + self.collectWidget.display() + if tag == MenuType.DOWNLOAD.value: + self.downloadWidget.display() + if tag == MenuType.VIDEO.value: + self.videoWidget.display() + self.setCurrentWidget(self.indexAt(tag)) diff --git "a/21\343\200\201\345\206\231\344\272\206\344\270\252\347\275\221\346\230\223\344\272\221/gui/pages/content/__init__.py" "b/21\343\200\201\345\206\231\344\272\206\344\270\252\347\275\221\346\230\223\344\272\221/gui/pages/content/__init__.py" new file mode 100644 index 0000000..eabf991 --- /dev/null +++ "b/21\343\200\201\345\206\231\344\272\206\344\270\252\347\275\221\346\230\223\344\272\221/gui/pages/content/__init__.py" @@ -0,0 +1,2 @@ +# Python电子书:http://t.cn/A6tMNzuI +# Python交流群:http://t.cn/A65MiFvH diff --git "a/21\343\200\201\345\206\231\344\272\206\344\270\252\347\275\221\346\230\223\344\272\221/gui/pages/content/child/CollectWidget.py" "b/21\343\200\201\345\206\231\344\272\206\344\270\252\347\275\221\346\230\223\344\272\221/gui/pages/content/child/CollectWidget.py" new file mode 100644 index 0000000..59f2f51 --- /dev/null +++ "b/21\343\200\201\345\206\231\344\272\206\344\270\252\347\275\221\346\230\223\344\272\221/gui/pages/content/child/CollectWidget.py" @@ -0,0 +1,56 @@ +# Python电子书:http://t.cn/A6tMNzuI +# Python交流群:http://t.cn/A65MiFvH +from PyQt5.QtCore import * +from PyQt5.QtWidgets import * + +from bean.MusicList import MusicList +from dao.Redis import redis +from gui.components.content.ArtistWidget import ArtistWidget +from gui.components.content.FavourDownloadWidget import FavourDownloadWidget +from gui.components.content.HoverButton import HoverButton +from gui.components.content.Table import Table +from gui.components.content.TagWidget import TagWidget +from gui.pages.GlobalSignal import globalSignal + + +class CollectWidget(TagWidget): + + def __init__(self, tag): + super(CollectWidget, self).__init__(tag) + + self.initStyle() + self.initUI() + + def initStyle(self): + style = """ + + """ + self.setStyleSheet(style) + + def initUI(self): + layout = QHBoxLayout() + self.setLayout(layout) + + headerLabels = ['音乐标题', '歌手', '专辑'] + self.table = Table(headerLabels) + self.table.setHorizontalHeaderLabels(headerLabels) + layout.addWidget(self.table) + + # 选中事件 + self.table.doubleClicked.connect(lambda event: globalSignal.playMusic.emit(self.musicList[event.row()])) + + def display(self): + self.favoriteMusicList = redis.getValue('favoriteMusicList', MusicList()) + n = self.favoriteMusicList.length() + self.table.setRowCount(n) + for i in range(n): + favourDownloadWidget = FavourDownloadWidget(i, self.favoriteMusicList[i]) + self.table.setCellWidget(i, 0, favourDownloadWidget) + + artistWidget = ArtistWidget(self.favoriteMusicList[i].artists) + self.table.setCellWidget(i, 1, artistWidget) + + albumBtn = HoverButton(inActiveColor='#B4B4B4', activeColor='#6A6B6B', text=self.favoriteMusicList[i].album, + tag=self.favoriteMusicList[i].album) + albumBtn.tagSignal.connect(lambda album: globalSignal.keywordSignal.emit(album)) + self.table.setCellWidget(i, 2, albumBtn) diff --git "a/21\343\200\201\345\206\231\344\272\206\344\270\252\347\275\221\346\230\223\344\272\221/gui/pages/content/child/DownloadWidget.py" "b/21\343\200\201\345\206\231\344\272\206\344\270\252\347\275\221\346\230\223\344\272\221/gui/pages/content/child/DownloadWidget.py" new file mode 100644 index 0000000..d22c114 --- /dev/null +++ "b/21\343\200\201\345\206\231\344\272\206\344\270\252\347\275\221\346\230\223\344\272\221/gui/pages/content/child/DownloadWidget.py" @@ -0,0 +1,87 @@ +# Python电子书:http://t.cn/A6tMNzuI +# Python交流群:http://t.cn/A65MiFvH +from PyQt5.QtCore import * +from PyQt5.QtWidgets import * + +from bean.MusicList import MusicList +from bean.Thread import Thread +from dao.Redis import redis +from gui.components.content.ArtistWidget import ArtistWidget +from gui.components.content.FavourDownloadWidget import FavourDownloadWidget +from gui.components.content.HoverButton import HoverButton +from gui.components.content.LastestLabel import LastestLabel +from gui.components.content.Table import Table +from gui.components.content.TagWidget import TagWidget +from gui.pages.GlobalSignal import globalSignal +from resolver.SpiderResolver import getMusicUrlResolver, getMusicUrlSizeResolver +from setting.SystemVariables import variables +from spider.Download import download, downloadMusic +from gui.utils.TimeFormatter import getTimeStamp + + +class DownloadWidget(TagWidget): + + def __init__(self, tag): + super(DownloadWidget, self).__init__(tag) + + self.initParam() + self.initStyle() + self.initUI() + # 绑定全局信号 + globalSignal.downloadMusic.connect(self.downloadMusic) + + def initParam(self): + # 获取下载路径 + self.downloadPath = variables.MUSIC_DOWNLOAD_PATH + self.downloadMusicList = redis.getValue("downloadMusicList", MusicList()) + + def initStyle(self): + style = """ + + """ + self.setStyleSheet(style) + + def initUI(self): + layout = QVBoxLayout() + self.setLayout(layout) + + headerLabels = ['音乐标题', '歌手', '专辑', '大小', '下载时间'] + self.table = Table(headerLabels) + self.table.setHorizontalHeaderLabels(headerLabels) + layout.addWidget(self.table) + + self.table.doubleClicked.connect(lambda event: globalSignal.playMusic.emit(self.downloadMusicList[event.row()])) + + def display(self): + self.downloadMusicList = redis.getValue("downloadMusicList", MusicList()) + n = self.downloadMusicList.length() + self.table.setRowCount(n) + for i in range(n): + favourDownloadWidget = FavourDownloadWidget(i, self.downloadMusicList[i], showFavourBtn=False, + showDownloadBtn=False) + self.table.setCellWidget(i, 0, favourDownloadWidget) + + artistWidget = ArtistWidget(self.downloadMusicList[i].artists) + self.table.setCellWidget(i, 1, artistWidget) + + albumBtn = HoverButton(inActiveColor='#B4B4B4', activeColor='#6A6B6B', text=self.downloadMusicList[i].album, + tag=self.downloadMusicList[i].album) + albumBtn.tagSignal.connect(lambda album: globalSignal.keywordSignal.emit(album)) + self.table.setCellWidget(i, 2, albumBtn) + + sizeLabel = QLabel() + sizeLabel.setAlignment(Qt.AlignVCenter | Qt.AlignHCenter) + sizeLabel.setText(str(round(self.downloadMusicList[i].size / (1024 * 1024), 2)) + "MB") + self.table.setCellWidget(i, 3, sizeLabel) + + downloadTime = LastestLabel(self.downloadMusicList[i].downloadTime) + self.table.setCellWidget(i, 4, downloadTime) + + def downloadMusic(self, music): + music.downloadTime = getTimeStamp() + params = getMusicUrlSizeResolver(music.id) + url = params.get('url') + music.size = params.get('size') + self.download = Thread(downloadMusic, url, self.downloadPath, music.name) + self.download.start() + self.downloadMusicList.add(music) diff --git "a/21\343\200\201\345\206\231\344\272\206\344\270\252\347\275\221\346\230\223\344\272\221/gui/pages/content/child/FindMusicWidget.py" "b/21\343\200\201\345\206\231\344\272\206\344\270\252\347\275\221\346\230\223\344\272\221/gui/pages/content/child/FindMusicWidget.py" new file mode 100644 index 0000000..7ae9b4c --- /dev/null +++ "b/21\343\200\201\345\206\231\344\272\206\344\270\252\347\275\221\346\230\223\344\272\221/gui/pages/content/child/FindMusicWidget.py" @@ -0,0 +1,143 @@ +# Python电子书:http://t.cn/A6tMNzuI +# Python交流群:http://t.cn/A65MiFvH +import threading + +from PyQt5.QtCore import * +from PyQt5.QtGui import * +from PyQt5.QtWidgets import * + +from gui.components.common.Button import Button +from gui.components.common.Loading import Loading +from gui.components.content.TagWidget import TagWidget + +import qtawesome as qta + +from gui.pages.GlobalSignal import globalSignal +from gui.utils.Spider import getPixmapByUrl +from resolver.SpiderResolver import getMusicListByIdResolver +from spider.ListIds import ListIds + + +class FindMusicWidget(TagWidget): + finishCount = 0 + + def __init__(self, tag): + super(FindMusicWidget, self).__init__(tag) + + self.resize(800, 600) + self.initStyle() + self.initUI() + + def initStyle(self): + style = """ + QPushButton{ + border:none; + } + """ + self.setStyleSheet(style) + + def initUI(self): + layout = QGridLayout() + self.setLayout(layout) + + self.loading = Loading() + self.layout().addWidget(self.loading, 1, 1) + + count = 0 + for item in ListIds: + widget = TagWidget(item.value) + widget.playMusicListSignal.connect(self.playMusicList) + widget.displayMusicListSignal.connect(self.displayMusicList) + widget.finish.connect(self.loadStateMonitor) + self.layout().addWidget(widget, count // 3, count % 3, alignment=Qt.AlignHCenter | Qt.AlignVCenter) + widget.hide() + count += 1 + + def playMusicList(self, music): + globalSignal.playMusicList.emit(music) + + def displayMusicList(self, music): + globalSignal.displayMusicList.emit(music) + + def loadStateMonitor(self): + self.finishCount += 1 + # 已全部加载完成 + if self.finishCount == 9: + self.loading.hide() + for i in range(self.layout().count()): + component = self.layout().itemAt(i).widget() + if isinstance(component, TagWidget): + component.show() + + +class TagWidget(Button): + MIN_WIDTH = 220 + MIN_HEIGHT = 220 + + playMusicListSignal = pyqtSignal(list) + displayMusicListSignal = pyqtSignal(list) + + # 检测是否加载完成 + finish = pyqtSignal() + + def __init__(self, id): + super(TagWidget, self).__init__() + + # 异步加载数据 + self.thread = LoadMusicListThread(id) + self.thread.finish.connect(self.finishLoad) + self.thread.start() + + self.setMinimumSize(self.MIN_WIDTH, self.MIN_HEIGHT) + self.setIconSize(QSize(self.MIN_WIDTH, self.MIN_HEIGHT)) + self.clicked.connect(lambda: self.displayMusicListSignal.emit(self.musicList)) + layout = QHBoxLayout() + self.setLayout(layout) + + self.play = QPushButton() + self.play.setCursor(QCursor(Qt.PointingHandCursor)) + self.play.setIcon(qta.icon('fa.play-circle-o', color='#D73535')) + self.play.setIconSize(QSize(60, 60)) + + self.play.clicked.connect(lambda: threading.Thread(self.playMusicListSignal.emit(self.musicList))) + layout.addWidget(self.play) + self.play.hide() + + self.mouseEnter.connect(lambda: self.showPlay(True)) + self.mouseLeave.connect(lambda: self.showPlay(False)) + + def showPlay(self, show): + if show: + self.play.show() + else: + self.play.hide() + + def finishLoad(self, data): + threading.Thread(target=self.setCover, + args=[data.get('coverImgUrl')]).start() + self.musicList = data.get('musicList') + + def setCover(self, url): + self.setIcon(QIcon(getPixmapByUrl(url))) + self.finish.emit() + + +# 异步加载歌单数据 +class LoadMusicListThread(QThread): + finish = pyqtSignal(dict) + + # 榜单类型 + def __init__(self, id): + super(LoadMusicListThread, self).__init__() + self.id = id + + def run(self): + data = getMusicListByIdResolver(self.id) + self.finish.emit(data) + + +if __name__ == '__main__': + app = QApplication([]) + window = FindMusicWidget(1) + window.show() + app.exec_() diff --git "a/21\343\200\201\345\206\231\344\272\206\344\270\252\347\275\221\346\230\223\344\272\221/gui/pages/content/child/HomeWidget.py" "b/21\343\200\201\345\206\231\344\272\206\344\270\252\347\275\221\346\230\223\344\272\221/gui/pages/content/child/HomeWidget.py" new file mode 100644 index 0000000..67ec5b6 --- /dev/null +++ "b/21\343\200\201\345\206\231\344\272\206\344\270\252\347\275\221\346\230\223\344\272\221/gui/pages/content/child/HomeWidget.py" @@ -0,0 +1,85 @@ +# Python电子书:http://t.cn/A6tMNzuI +# Python交流群:http://t.cn/A65MiFvH +import os + +from PyQt5.QtCore import Qt +from PyQt5.QtWidgets import * + +from bean.Music import Music +from dao.Redis import redis +from gui.components.content.Table import Table +from gui.components.content.TagWidget import TagWidget +from gui.pages.GlobalSignal import globalSignal + + +class HomeWidget(TagWidget): + musicList = [] + + def __init__(self, tag): + super(HomeWidget, self).__init__(tag) + self.initParams() + self.initStyle() + self.initUI() + + def initParams(self): + self.localMusicDirs = redis.getValue('localMusicDirs', []) + + def initStyle(self): + style = """ + QPushButton{ + } + """ + self.setStyleSheet(style) + + def initUI(self): + layout = QGridLayout() + self.setLayout(layout) + + self.combox = QComboBox() + self.combox.currentIndexChanged[str].connect(self.handle) + layout.addWidget(self.combox, 0, 0, 1, 3) + + button = QPushButton("选择目录") + button.clicked.connect(self.selectMusicDir) + layout.addWidget(button, 0, 3) + + headerLabels = ["歌曲名称"] + self.table = Table(headerLabels) + self.table.setHorizontalHeaderLabels(headerLabels) + self.table.doubleClicked.connect(lambda event: globalSignal.playLocalMusic.emit(self.musicList[event.row()])) + layout.addWidget(self.table, 1, 0, 1, 4) + + for dir in self.localMusicDirs: + self.combox.addItem(dir) + + def handle(self, dirPath): + self.loadMusicList(dirPath) + self.showMusicList() + + # 选择目录 + def selectMusicDir(self): + path = QFileDialog.getExistingDirectory(self, "选择目录") + if path: + for i in range(self.combox.count()): + if self.combox.itemText(i) == path: + return + self.localMusicDirs.append(path) + self.combox.addItem(path) + + # 加载指定文件夹下的音乐文件 + def loadMusicList(self, dir): + self.musicList = [] + format = ['mp3', 'm4a', 'flac', 'wav', 'ogg'] + for song in os.listdir(dir): + if song.split('.')[-1] in format: + self.musicList.append( + Music(name=song, filePath=os.path.join(dir, song).replace('\\', '/'))) + + def showMusicList(self): + self.table.setRowCount(len(self.musicList)) + for index in range(len(self.musicList)): + self.table.setItem(index, 0, QTableWidgetItem(self.musicList[index].name)) + + for i in range(self.table.rowCount()): + for j in range(self.table.columnCount()): + self.table.item(i, j).setTextAlignment(Qt.AlignHCenter | Qt.AlignVCenter) diff --git "a/21\343\200\201\345\206\231\344\272\206\344\270\252\347\275\221\346\230\223\344\272\221/gui/pages/content/child/KeyWordSearchWidget.py" "b/21\343\200\201\345\206\231\344\272\206\344\270\252\347\275\221\346\230\223\344\272\221/gui/pages/content/child/KeyWordSearchWidget.py" new file mode 100644 index 0000000..ce02071 --- /dev/null +++ "b/21\343\200\201\345\206\231\344\272\206\344\270\252\347\275\221\346\230\223\344\272\221/gui/pages/content/child/KeyWordSearchWidget.py" @@ -0,0 +1,90 @@ +# Python电子书:http://t.cn/A6tMNzuI +# Python交流群:http://t.cn/A65MiFvH +from PyQt5.QtWidgets import * + +from gui.components.common.Loading import Loading +from gui.components.content.ArtistWidget import ArtistWidget +from gui.components.content.FavourDownloadWidget import FavourDownloadWidget +from gui.components.content.HoverButton import HoverButton +from gui.components.content.Table import Table +from gui.components.content.TagWidget import TagWidget +from gui.pages.GlobalSignal import globalSignal +from resolver.SpiderResolver import getMusicListByKeywordResolver +from bean.Thread import Thread + + +class KeyWordSearchWidget(TagWidget): + + def __init__(self, tag): + super(KeyWordSearchWidget, self).__init__(tag) + + self.initParams() + self.initStyle() + self.initUI() + + def initParams(self): + self.count = 5 + + def initStyle(self): + style = """ + + """ + self.setStyleSheet(style) + + def initUI(self): + layout = QHBoxLayout() + self.setLayout(layout) + + # 加载效果 + self.loading = Loading() + self.loading.hide() + layout.addWidget(self.loading) + + # 信息展示 + headerLabels = ['音乐标题', '歌手', '专辑'] + self.table = Table(headerLabels) + self.table.setHorizontalHeaderLabels(headerLabels) + self.table.hide() + layout.addWidget(self.table) + + # 选中事件 + self.table.doubleClicked.connect(lambda event: globalSignal.playMusic.emit(self.musicList[event.row()])) + + def searchMusicBykeyword(self, keyword): + # 每次查询初始化参数 + self.pages = 1 + self.musicList = [] + self.keyword = keyword + self.nextPage() + + def callback(self, data): + start = len(self.musicList) + self.musicList += data + n = len(data) + self.table.setRowCount(n) + if n < self.count: + # 修改下一页为不可点击 + pass + for i in range(n): + # 对查询结果进行遍历 + favourDownloadWidget = FavourDownloadWidget(i, data[i]) + self.table.setCellWidget(i, 0, favourDownloadWidget) + + artistWidget = ArtistWidget(data[i].artists) + self.table.setCellWidget(i, 1, artistWidget) + + albumBtn = HoverButton(inActiveColor='#B4B4B4', activeColor='#6A6B6B', text=data[i].album, + tag=data[i].album) + albumBtn.tagSignal.connect(lambda album: globalSignal.keywordSignal.emit(album)) + self.table.setCellWidget(i, 2, albumBtn) + + self.loading.hide() + self.table.show() + + def nextPage(self): + self.table.hide() + self.loading.show() + + self.thread = Thread(getMusicListByKeywordResolver, self.count, self.pages, self.keyword) + self.thread.finish.connect(self.callback) + self.thread.start() diff --git "a/21\343\200\201\345\206\231\344\272\206\344\270\252\347\275\221\346\230\223\344\272\221/gui/pages/content/child/MyDeviceWidget.py" "b/21\343\200\201\345\206\231\344\272\206\344\270\252\347\275\221\346\230\223\344\272\221/gui/pages/content/child/MyDeviceWidget.py" new file mode 100644 index 0000000..75b2920 --- /dev/null +++ "b/21\343\200\201\345\206\231\344\272\206\344\270\252\347\275\221\346\230\223\344\272\221/gui/pages/content/child/MyDeviceWidget.py" @@ -0,0 +1,92 @@ +# Python电子书:http://t.cn/A6tMNzuI +# Python交流群:http://t.cn/A65MiFvH +import os + +from PyQt5.QtCore import Qt +from PyQt5.QtWidgets import * + +from gui.components.content.Table import Table +from gui.components.content.TagWidget import TagWidget + +import sys + + +class MyDeviceWidget(TagWidget): + + def __init__(self, tag): + super(MyDeviceWidget, self).__init__(tag) + + self.initStyle() + self.initUI() + + def initStyle(self): + style = """ + + """ + self.setStyleSheet(style) + + def initUI(self): + layout = QGridLayout() + self.setLayout(layout) + + self.display = QLabel("未检测到设备") + layout.addWidget(self.display, 0, 0, 1, 2) + + self.checkoutBtn = QPushButton("检测设备") + self.checkoutBtn.clicked.connect(self.checkout) + layout.addWidget(self.checkoutBtn, 0, 2) + + self.input = QLineEdit() + self.input.setPlaceholderText("手机路径") + self.input.setDisabled(True) + layout.addWidget(self.input, 1, 0) + + self.insertBtn = QPushButton("添加文件") + self.insertBtn.clicked.connect(self.insert) + self.insertBtn.setDisabled(True) + layout.addWidget(self.insertBtn, 1, 1) + + self.sendBtn = QPushButton("传送") + self.sendBtn.clicked.connect(self.send) + self.sendBtn.setDisabled(True) + layout.addWidget(self.sendBtn, 1, 2) + + headerLabels = ["文件名称"] + self.table = Table(headerLabels) + self.table.setHorizontalHeaderLabels(headerLabels) + layout.addWidget(self.table, 2, 0, 1, 4) + + self.files = [] + + # 检测设备 + def checkout(self): + os.popen('adb connect 127.0.0.1:62001') + result = os.popen('adb devices') + if "127.0.0.1:62001 device" in result.read(): + self.display.setText("已检测到设备") + self.checkoutBtn.setDisabled(True) + self.input.setDisabled(False) + self.insertBtn.setDisabled(False) + self.sendBtn.setDisabled(False) + else: + self.display.setText("未检测到设备 请稍后重试!") + + # 添加文件 + def insert(self): + result = QFileDialog.getOpenFileNames() + result = result[0] + length = len(result) + self.table.setRowCount(self.table.rowCount() + length) + for index in range(length): + self.table.setItem(index, 0, QTableWidgetItem(result[index].split('/')[-1])) + self.files += result + + for i in range(self.table.rowCount()): + self.table.item(i, 0).setTextAlignment(Qt.AlignHCenter | Qt.AlignVCenter) + + def send(self): + path = self.input.text() + if path: + for file in self.files: + print(file.split('/')[-1]) + os.system('adb push ' + file + ' ' + path + '/' + file.split('/')[-1]) diff --git "a/21\343\200\201\345\206\231\344\272\206\344\270\252\347\275\221\346\230\223\344\272\221/gui/pages/content/child/RecentWidget.py" "b/21\343\200\201\345\206\231\344\272\206\344\270\252\347\275\221\346\230\223\344\272\221/gui/pages/content/child/RecentWidget.py" new file mode 100644 index 0000000..cb9ab2b --- /dev/null +++ "b/21\343\200\201\345\206\231\344\272\206\344\270\252\347\275\221\346\230\223\344\272\221/gui/pages/content/child/RecentWidget.py" @@ -0,0 +1,52 @@ +# Python电子书:http://t.cn/A6tMNzuI +# Python交流群:http://t.cn/A65MiFvH +from PyQt5.QtWidgets import * + +from bean.MusicList import MusicList +from dao.Redis import redis +from gui.components.content.ArtistWidget import ArtistWidget +from gui.components.content.FavourDownloadWidget import FavourDownloadWidget +from gui.components.content.LastestLabel import LastestLabel +from gui.components.content.Table import Table +from gui.components.content.TagWidget import TagWidget +from gui.pages.GlobalSignal import globalSignal + + +class RecentWidget(TagWidget): + + def __init__(self, tag): + super(RecentWidget, self).__init__(tag) + + self.initStyle() + self.initUI() + + def initStyle(self): + style = """ + """ + self.setStyleSheet(style) + + def initUI(self): + layout = QHBoxLayout() + self.setLayout(layout) + + headerLabels = ['音乐标题', '歌手', '播放时间'] + self.table = Table(headerLabels) + self.table.setHorizontalHeaderLabels(headerLabels) + layout.addWidget(self.table) + + # 选中事件 + self.table.doubleClicked.connect(lambda event: globalSignal.playMusic.emit(self.recentMusicList[event.row()])) + + def display(self): + self.recentMusicList = redis.getValue('recentMusicList', MusicList()) + n = self.recentMusicList.length() + self.table.setRowCount(n) + for i in range(n): + favourDownloadWidget = FavourDownloadWidget(i, self.recentMusicList[i]) + self.table.setCellWidget(i, 0, favourDownloadWidget) + + artistWidget = ArtistWidget(self.recentMusicList[i].artists) + self.table.setCellWidget(i, 1, artistWidget) + + lastTime = LastestLabel(self.recentMusicList[i].lastestTime) + self.table.setCellWidget(i, 2, lastTime) diff --git "a/21\343\200\201\345\206\231\344\272\206\344\270\252\347\275\221\346\230\223\344\272\221/gui/pages/content/child/VideoWidget.py" "b/21\343\200\201\345\206\231\344\272\206\344\270\252\347\275\221\346\230\223\344\272\221/gui/pages/content/child/VideoWidget.py" new file mode 100644 index 0000000..396efec --- /dev/null +++ "b/21\343\200\201\345\206\231\344\272\206\344\270\252\347\275\221\346\230\223\344\272\221/gui/pages/content/child/VideoWidget.py" @@ -0,0 +1,46 @@ +# Python电子书:http://t.cn/A6tMNzuI +# Python交流群:http://t.cn/A65MiFvH +from PyQt5.QtGui import QPixmap, QImage +from PyQt5.QtWidgets import * +import wordcloud +from bean.Async import asynchronous +from dao.Redis import redis +from gui.components.content.TagWidget import TagWidget + + +class VideoWidget(TagWidget): + + def __init__(self, tag): + super(VideoWidget, self).__init__(tag) + + self.initParams() + self.initStyle() + self.initUI() + + self.wordcloudGenerator = wordcloud.WordCloud(font_path='msyh.ttc', background_color='white') + + def initParams(self): + self.words = redis.getValue('words', []) + + def initStyle(self): + style = """ + + """ + self.setStyleSheet(style) + + def initUI(self): + layout = QHBoxLayout() + self.setLayout(layout) + + self.img = QLabel() + self.img.setScaledContents(True) + layout.addWidget(self.img) + + @asynchronous + def display(self): + if len(self.words) > 0: + self.wordcloudGenerator.generate_from_frequencies(dict(self.words)) + # self.wordcloudGenerator.to_image() + # self.img.setPixmap(QPixmap.fromImage(ImageQt.ImageQt(image))) + self.wordcloudGenerator.to_file("abc.jpg") + self.img.setPixmap(QPixmap("abc.jpg")) diff --git "a/21\343\200\201\345\206\231\344\272\206\344\270\252\347\275\221\346\230\223\344\272\221/gui/pages/content/child/__init__.py" "b/21\343\200\201\345\206\231\344\272\206\344\270\252\347\275\221\346\230\223\344\272\221/gui/pages/content/child/__init__.py" new file mode 100644 index 0000000..eabf991 --- /dev/null +++ "b/21\343\200\201\345\206\231\344\272\206\344\270\252\347\275\221\346\230\223\344\272\221/gui/pages/content/child/__init__.py" @@ -0,0 +1,2 @@ +# Python电子书:http://t.cn/A6tMNzuI +# Python交流群:http://t.cn/A65MiFvH diff --git "a/21\343\200\201\345\206\231\344\272\206\344\270\252\347\275\221\346\230\223\344\272\221/gui/pages/navbar/LogoWidget.py" "b/21\343\200\201\345\206\231\344\272\206\344\270\252\347\275\221\346\230\223\344\272\221/gui/pages/navbar/LogoWidget.py" new file mode 100644 index 0000000..7d6cce2 --- /dev/null +++ "b/21\343\200\201\345\206\231\344\272\206\344\270\252\347\275\221\346\230\223\344\272\221/gui/pages/navbar/LogoWidget.py" @@ -0,0 +1,38 @@ +# Python电子书:http://t.cn/A6tMNzuI +# Python交流群:http://t.cn/A65MiFvH +from PyQt5.QtCore import * +from PyQt5.QtGui import * +from PyQt5.QtWidgets import * + +from gui.utils.ImgConverter import ToCircleImg + + +class LogoWidget(QWidget): + mouseDoubleClick = pyqtSignal() + + def __init__(self): + super(LogoWidget, self).__init__() + + self.setCursor(QCursor(Qt.PointingHandCursor)) + self.initUI() + + def initUI(self): + logoUrl = '../../resource/img/netease.png' + logoSize = 32 + + layout = QHBoxLayout() + self.setLayout(layout) + + logo = QLabel() + logo.setPixmap(ToCircleImg(logoUrl, logoSize, logoSize, self)) + layout.addWidget(logo) + + title = QLabel("网易云音乐") + title.setStyleSheet("font-size:23px;color:#FFFFFF;font-weight:bold;") + layout.addWidget(title) + + layout.addStretch(1) + + # 重写鼠标双击事件 + def mouseDoubleClickEvent(self, event): + self.mouseDoubleClick.emit() diff --git "a/21\343\200\201\345\206\231\344\272\206\344\270\252\347\275\221\346\230\223\344\272\221/gui/pages/navbar/MenuWidget.py" "b/21\343\200\201\345\206\231\344\272\206\344\270\252\347\275\221\346\230\223\344\272\221/gui/pages/navbar/MenuWidget.py" new file mode 100644 index 0000000..12ce2a3 --- /dev/null +++ "b/21\343\200\201\345\206\231\344\272\206\344\270\252\347\275\221\346\230\223\344\272\221/gui/pages/navbar/MenuWidget.py" @@ -0,0 +1,113 @@ +# Python电子书:http://t.cn/A6tMNzuI +# Python交流群:http://t.cn/A65MiFvH +from PyQt5.QtCore import * +from PyQt5.QtGui import * +from PyQt5.QtWidgets import * + +from gui.components.content.HoverButton import HoverButton +from gui.utils.ImgConverter import ToCircleImg + + +class MenuWidget(QWidget): + avatarUrl = '../../resource/img/avatar.png' + avatarSize = 32 + + avatarSignal = pyqtSignal() + settingSignal = pyqtSignal() + miniModelSignal = pyqtSignal() + minimizeSignal = pyqtSignal() + maximizeSignal = pyqtSignal() + closeSignal = pyqtSignal() + + def __init__(self): + super(MenuWidget, self).__init__() + + self.initStyle() + self.initUI() + + def initStyle(self): + style = """ + #avatar{ + width:32px; + height:32px; + } + #profile{ + color:#FBD9D9; + } + #profile:hover{ + color:#ffffff; + } + #minimize{ + padding-bottom:9px; + } + """ + self.setStyleSheet(style) + + def initUI(self): + layout = QHBoxLayout() + layout.setSpacing(24) + self.setLayout(layout) + + avatar = QPushButton() + avatar.setIcon(QIcon(ToCircleImg(self.avatarUrl, self.avatarSize, self.avatarSize, self))) + avatar.setIconSize(QSize(self.avatarSize, self.avatarSize)) + avatar.setCursor(QCursor(Qt.PointingHandCursor)) + avatar.setObjectName("avatar") + layout.addWidget(avatar) + + profile = HoverButton('乐乐', iconName='caret-down') + profile.setObjectName('profile') + layout.addWidget(profile) + + theme = HoverButton(iconName='diamond') + layout.addWidget(theme) + + setting = HoverButton(iconName='cog') + setting.setObjectName('setting') + layout.addWidget(setting) + + miniModel = HoverButton(iconName='desktop') + self.setObjectName('miniModel') + layout.addWidget(miniModel) + + self.minimize = HoverButton(iconName='window-minimize') + self.minimize.setObjectName("minimize") + layout.addWidget(self.minimize) + + self.maximize = HoverButton(iconName='window-maximize') + self.maximize.setObjectName('maximize') + layout.addWidget(self.maximize) + + self.close = HoverButton(iconName='window-close') + self.close.setObjectName('close') + layout.addWidget(self.close) + + QMetaObject.connectSlotsByName(self) + + @pyqtSlot() + def on_avatar_clicked(self): + self.avatarSignal.emit() + + @pyqtSlot() + def on_setting_clicked(self): + self.settingSignal.emit() + + @pyqtSlot() + def on_miniModel_clicked(self): + self.miniModelSignal.emit() + + @pyqtSlot() + def on_minimize_clicked(self): + self.minimizeSignal.emit() + + @pyqtSlot() + def on_maximize_clicked(self): + self.maximizeSignal.emit() + + @pyqtSlot() + def on_close_clicked(self): + self.closeSignal.emit() + + def setMaximizeIconName(self, iconName): + self.maximize.resetIconName(iconName) + diff --git "a/21\343\200\201\345\206\231\344\272\206\344\270\252\347\275\221\346\230\223\344\272\221/gui/pages/navbar/NavBar.py" "b/21\343\200\201\345\206\231\344\272\206\344\270\252\347\275\221\346\230\223\344\272\221/gui/pages/navbar/NavBar.py" new file mode 100644 index 0000000..2531880 --- /dev/null +++ "b/21\343\200\201\345\206\231\344\272\206\344\270\252\347\275\221\346\230\223\344\272\221/gui/pages/navbar/NavBar.py" @@ -0,0 +1,110 @@ +# Python电子书:http://t.cn/A6tMNzuI +# Python交流群:http://t.cn/A65MiFvH +from PyQt5.QtCore import * +from PyQt5.QtGui import * +from PyQt5.QtWidgets import * + +from dao.Redis import redis +from gui.pages.navbar.LogoWidget import LogoWidget +from gui.pages.navbar.MenuWidget import MenuWidget +from gui.pages.navbar.SearchWidget import SearchWidget + + +class NavBar(QWidget): + moveSignal = pyqtSignal(QPoint) + minimizeSignal = pyqtSignal() + maximizeSignal = pyqtSignal() + restoreSignal = pyqtSignal() + closeSignal = pyqtSignal() + + microphoneSignal = pyqtSignal() + avatarSignal = pyqtSignal() + settingSignal = pyqtSignal() + miniModelSignal = pyqtSignal() + + def __init__(self): + super(NavBar, self).__init__() + + self.setCursor(QCursor(Qt.ArrowCursor)) + + self.initStyle() + self.initParams() + self.initUI() + + def initStyle(self): + self.setAttribute(Qt.WA_StyledBackground, True) + style = """ + NavBar{ + background-color: #EC4141; + } + QPushButton{ + border:none; + } + """ + self.setStyleSheet(style) + + def initParams(self): + self.isMaximize = redis.getValue('isMaximize', 0) + + def initUI(self): + layout = QHBoxLayout() + self.setLayout(layout) + + logoWidget = LogoWidget() + logoWidget.setFixedWidth(185) + logoWidget.mouseDoubleClick.connect(self.launchMaximizeOrRestoreSignal) + layout.addWidget(logoWidget) + + space = QLabel() + space.setFixedWidth(95) + layout.addWidget(space) + + searchWidget = SearchWidget() + + searchWidget.microphoneSignal.connect(self.microphoneSignal) + layout.addWidget(searchWidget) + + layout.addStretch(1) + + self.menuWidget = MenuWidget() + self.menuWidget.avatarSignal.connect(self.avatarSignal) + self.menuWidget.settingSignal.connect(self.settingSignal) + self.menuWidget.miniModelSignal.connect(self.miniModelSignal) + self.menuWidget.minimizeSignal.connect(self.minimizeSignal) + self.menuWidget.maximizeSignal.connect(self.launchMaximizeOrRestoreSignal) + self.menuWidget.closeSignal.connect(self.closeSignal) + self.initMaximizeIconName() + layout.addWidget(self.menuWidget) + + def initMaximizeIconName(self): + if self.isMaximize: + self.menuWidget.setMaximizeIconName('window-restore') + else: + self.menuWidget.setMaximizeIconName('window-maximize') + + def launchMaximizeOrRestoreSignal(self): + if (self.isMaximize): + self.restoreSignal.emit() + self.menuWidget.setMaximizeIconName('window-maximize') + self.isMaximize = 0 + else: + self.maximizeSignal.emit() + self.menuWidget.setMaximizeIconName('window-restore') + self.isMaximize = 1 + + def mousePressEvent(self, event): + # if event.button() == Qt.LeftButton and event.pos().x() < self.menuWidget.pos().x(): + if event.button() == Qt.LeftButton: + self.drag = True + self.dragPosition = event.pos() + + def mouseMoveEvent(self, event): + if Qt.LeftButton and self.drag: + if self.isMaximize: + self.isMaximize = 0 + self.restoreSignal.emit() + self.menuWidget.setMaximizeIconName('window-maximize') + self.moveSignal.emit(event.globalPos() - self.dragPosition) + + def mouseReleaseEvent(self, event): + self.drag = False diff --git "a/21\343\200\201\345\206\231\344\272\206\344\270\252\347\275\221\346\230\223\344\272\221/gui/pages/navbar/SearchWidget.py" "b/21\343\200\201\345\206\231\344\272\206\344\270\252\347\275\221\346\230\223\344\272\221/gui/pages/navbar/SearchWidget.py" new file mode 100644 index 0000000..b8a1c7a --- /dev/null +++ "b/21\343\200\201\345\206\231\344\272\206\344\270\252\347\275\221\346\230\223\344\272\221/gui/pages/navbar/SearchWidget.py" @@ -0,0 +1,151 @@ +# Python电子书:http://t.cn/A6tMNzuI +# Python交流群:http://t.cn/A65MiFvH +from PyQt5.QtCore import * +from PyQt5.QtGui import * +from PyQt5.QtWidgets import * + +from bean.RecodeStack import recodeStack +from gui.components.content.DisabledButton import DisabledButton +from gui.components.content.HoverButton import HoverButton +from gui.pages.GlobalSignal import globalSignal +from gui.pages.content.MenuType import MenuType + + +class SearchWidget(QWidget): + microphoneSignal = pyqtSignal() + + originKeyword = '' + changeStatus = False + + def __init__(self): + super(SearchWidget, self).__init__() + + self.initStyle() + self.initUI() + + def initStyle(self): + style = """ + #backward,#forward{ + background-color:#E13E3E; + width:32px; + height:32px; + border-radius:16px; + } + #keyword{ + width:162px; + height:40px; + border-radius:20px; + border:none; + background-color:#E13E3E; + color:#ffffff; + padding-left:40px; + } + #search{ + color:#FBD9D9; + } + #search:hover{ + color:#ffffff; + } + #microphone{ + width:42px; + height:42px; + border-radius:21px; + background-color:#E13E3E; + } + """ + self.setStyleSheet(style) + + def initUI(self): + layout = QHBoxLayout() + layout.setContentsMargins(0, 0, 0, 0) + layout.setSpacing(15) + self.setLayout(layout) + + self.backward = DisabledButton(iconName='angle-left') + self.backward.setObjectName("backward") + layout.addWidget(self.backward) + + self.forward = DisabledButton(iconName='angle-right') + self.forward.setObjectName("forward") + layout.addWidget(self.forward) + + self.keyword = QLineEdit() + self.keyword.setPlaceholderText("搜索") + self.keyword.setObjectName("keyword") + layout.addWidget(self.keyword) + + search = HoverButton(self.keyword, iconName='search', cursor=Qt.ArrowCursor) + search.setObjectName("search") + search.move(10, 10) + + microphone = HoverButton(iconName='microphone', activeColor='#F8CECE', inActiveColor='#F8CECE') + microphone.setObjectName("microphone") + layout.addWidget(microphone) + + QMetaObject.connectSlotsByName(self) + + # 改变 前进后退 按钮 状态 + globalSignal.backwardStatusSignal.connect(self.changeBackwardStatus) + globalSignal.forwardStatusSignal.connect(self.changeforwardStatus) + + def resetChangeStatus(self): + self.changeStatus = False + + def changeBackwardStatus(self, status): + self.backward.setButtonStatus(status) + + def changeforwardStatus(self, status): + self.forward.setButtonStatus(status) + + def dispatch(self, page): + if page[0] == MenuType.SEARCH.value: + globalSignal.keywordSignalI.emit(page[1]) + else: + globalSignal.pageIndexSignal.emit(page[0]) + + @pyqtSlot() + def on_backward_clicked(self): + if not self.backward.disabled: + self.changeStatus = False + self.dispatch(recodeStack.backward()) + if recodeStack.isBegin(): + self.backward.setButtonStatus(True) + self.forward.setButtonStatus(False) + + @pyqtSlot() + def on_forward_clicked(self): + if not self.forward.disabled: + self.changeStatus = False + self.dispatch(recodeStack.forward()) + if recodeStack.isDeadline(): + self.forward.setButtonStatus(True) + self.backward.setButtonStatus(False) + + @pyqtSlot() + def on_microphone_clicked(self): + self.microphoneSignal.emit() + + @pyqtSlot() + def on_search_clicked(self): + self.keywordSearch() + + @pyqtSlot() + def on_keyword_returnPressed(self): + self.keywordSearch() + + def keywordSearch(self): + keyword = self.keyword.text() + if keyword != '' and keyword != self.originKeyword: + self.originKeyword = keyword + self.changeStatus = True + globalSignal.keywordSignal.emit(keyword) + + if self.changeStatus == False: + self.changeStatus = True + globalSignal.keywordSignal.emit(keyword) + + def setBackwardButtonStatus(self, disabled): + self.backward.setButtonStatus(disabled) + + def setForwardButtonStatus(self, disabled): + self.forward.setButtonStatus(disabled) diff --git "a/21\343\200\201\345\206\231\344\272\206\344\270\252\347\275\221\346\230\223\344\272\221/gui/pages/navbar/__init__.py" "b/21\343\200\201\345\206\231\344\272\206\344\270\252\347\275\221\346\230\223\344\272\221/gui/pages/navbar/__init__.py" new file mode 100644 index 0000000..eabf991 --- /dev/null +++ "b/21\343\200\201\345\206\231\344\272\206\344\270\252\347\275\221\346\230\223\344\272\221/gui/pages/navbar/__init__.py" @@ -0,0 +1,2 @@ +# Python电子书:http://t.cn/A6tMNzuI +# Python交流群:http://t.cn/A65MiFvH diff --git "a/21\343\200\201\345\206\231\344\272\206\344\270\252\347\275\221\346\230\223\344\272\221/gui/pages/statusbar/ControlWidget.py" "b/21\343\200\201\345\206\231\344\272\206\344\270\252\347\275\221\346\230\223\344\272\221/gui/pages/statusbar/ControlWidget.py" new file mode 100644 index 0000000..f265b96 --- /dev/null +++ "b/21\343\200\201\345\206\231\344\272\206\344\270\252\347\275\221\346\230\223\344\272\221/gui/pages/statusbar/ControlWidget.py" @@ -0,0 +1,83 @@ +# Python电子书:http://t.cn/A6tMNzuI +# Python交流群:http://t.cn/A65MiFvH +from PyQt5.QtCore import pyqtSignal, Qt +from PyQt5.QtWidgets import QWidget, QHBoxLayout, QSlider + +from dao.Redis import redis +from gui.components.common.CommonButton import CommonButton + + +class ControlWidget(QWidget): + volumnSignal = pyqtSignal(int) + + def __init__(self): + super(ControlWidget, self).__init__() + + self.initParams() + self.initStyle() + self.initUI() + + def initStyle(self): + style = """ + QPushButton{ + border:none; + } + """ + self.setStyleSheet(style) + + def initParams(self): + self.originalVolumn = redis.getValue('volumn', 50) + self.trumpetStatus = redis.getValue('trumpet', True) + + def initUI(self): + layout = QHBoxLayout() + layout.setContentsMargins(0, 0, 0, 0) + layout.setSpacing(15) + self.setLayout(layout) + + self.tone = CommonButton(iconName='superpowers') + layout.addWidget(self.tone) + + self.trumpet = CommonButton() + self.setTrumpetStatus() + self.trumpet.clicked.connect(self.changeTrumpetStatus) + layout.addWidget(self.trumpet) + + self.volumn = QSlider(Qt.Horizontal) + self.volumn.setMaximum(100) + self.setVolumn() + self.volumn.valueChanged.connect(self.volumnChangedHandle) + self.volumn.setObjectName('volumn') + layout.addWidget(self.volumn) + + self.list = CommonButton(iconName='align-justify') + layout.addWidget(self.list) + + def volumnChangedHandle(self, value): + if (value == 0): + self.trumpet.resetIconName('bell-slash-o') + else: + self.trumpet.resetIconName('bell-o') + self.volumnSignal.emit(value) + + def setTrumpetStatus(self): + if self.trumpetStatus: + self.trumpet.resetIconName('bell-o') + else: + self.trumpet.resetIconName('bell-slash-o') + + def setVolumn(self): + if self.trumpetStatus: + self.volumn.setValue(self.originalVolumn) + else: + self.volumn.setValue(0) + + def changeTrumpetStatus(self): + if self.trumpetStatus: + self.trumpet.resetIconName('bell-slash-o') + self.originalVolumn = self.volumn.value() + self.volumn.setValue(0) + else: + self.trumpet.resetIconName('bell-o') + self.volumn.setValue(self.originalVolumn) + self.trumpetStatus = not self.trumpetStatus diff --git "a/21\343\200\201\345\206\231\344\272\206\344\270\252\347\275\221\346\230\223\344\272\221/gui/pages/statusbar/LyricWidget.py" "b/21\343\200\201\345\206\231\344\272\206\344\270\252\347\275\221\346\230\223\344\272\221/gui/pages/statusbar/LyricWidget.py" new file mode 100644 index 0000000..6383281 --- /dev/null +++ "b/21\343\200\201\345\206\231\344\272\206\344\270\252\347\275\221\346\230\223\344\272\221/gui/pages/statusbar/LyricWidget.py" @@ -0,0 +1,59 @@ +# Python电子书:http://t.cn/A6tMNzuI +# Python交流群:http://t.cn/A65MiFvH +from PyQt5.QtCore import * +from PyQt5.QtGui import QCursor +from PyQt5.QtWidgets import * + + +class LyricWidget(QWidget): + # 窗体的最小宽高 + WINDOW_MIN_WIDTH = 800 + WINDOW_MIN_HEIGHT = 120 + + def __init__(self): + super(LyricWidget, self).__init__() + self.setMinimumSize(self.WINDOW_MIN_WIDTH, self.WINDOW_MIN_HEIGHT) + self.setCursor(QCursor(Qt.ClosedHandCursor)) + + self.setWindowFlags(Qt.FramelessWindowHint) + + # self.setAttribute(Qt.WA_TranslucentBackground) + + self.installEventFilter(self) + self.initUI() + + def initUI(self): + layout = QHBoxLayout() + self.setLayout(layout) + + self.raise_() + + self.display = QLabel() + self.display.setAlignment(Qt.AlignHCenter | Qt.AlignVCenter) + self.display.setStyleSheet("font-size:35px;color:#EC4141;") + layout.addWidget(self.display) + + def setLyric(self, lyric): + self.display.setText(lyric) + + def mousePressEvent(self, event): + if event.button() == Qt.LeftButton: + self.drag = True + self.dragPosition = event.pos() + + def mouseMoveEvent(self, event): + if Qt.LeftButton and self.drag: + self.move(event.globalPos() - self.dragPosition) + + def mouseReleaseEvent(self, event): + self.drag = False + + def eventFilter(self, obj, event): + # 当鼠标移入时 发射信号 + if event.type() == QEvent.Enter: + self.setWindowOpacity(0.9) + pass + if event.type() == QEvent.Leave: + pass + self.setWindowOpacity(0.4) + return super().eventFilter(obj, event) diff --git "a/21\343\200\201\345\206\231\344\272\206\344\270\252\347\275\221\346\230\223\344\272\221/gui/pages/statusbar/MusicPlayer.py" "b/21\343\200\201\345\206\231\344\272\206\344\270\252\347\275\221\346\230\223\344\272\221/gui/pages/statusbar/MusicPlayer.py" new file mode 100644 index 0000000..a1a76d7 --- /dev/null +++ "b/21\343\200\201\345\206\231\344\272\206\344\270\252\347\275\221\346\230\223\344\272\221/gui/pages/statusbar/MusicPlayer.py" @@ -0,0 +1,277 @@ +# Python电子书:http://t.cn/A6tMNzuI +# Python交流群:http://t.cn/A65MiFvH +import jieba +from PyQt5.QtMultimedia import QMediaPlayer, QMediaContent +from PyQt5.QtWidgets import QWidget, QGridLayout, QLabel +from PyQt5.QtCore import Qt, QTimer, pyqtSignal, QUrl + +from bean.Async import asynchronous +from bean.Excludes import getExcludes +from dao.Redis import redis +from gui.components.common.CommonButton import CommonButton +from gui.components.common.ProgressBar import ProgressBar +from gui.components.content.HoverButton import HoverButton +from gui.pages.GlobalSignal import globalSignal +from gui.pages.statusbar.LyricWidget import LyricWidget +from gui.utils.LyricFormatter import lyricFormatter +from gui.utils.TimeFormatter import MSToTime, SToTime +from resolver.SpiderResolver import getMusicUrlResolver, getLyricByIdResolver, Source + + +class MusicPlayer(QWidget): + # 播放器 + player = QMediaPlayer() + # 播放器状态 + playing = False + # 连续播放错误歌曲数 + serialErrorCount = 0 + + def __init__(self): + super(MusicPlayer, self).__init__() + + self.initParams() + self.initStyle() + self.initUI() + + self.player.durationChanged.connect(self.setDuration) + self.player.mediaStatusChanged.connect(self.playNextMusicCallBack) + + self.clock = Clock() + self.clock.call.connect(self.setProgressValue) + self.clock.call.connect(self.setLyric) + + def initParams(self): + self.excludes = getExcludes() + self.words = redis.getValue('words', []) + + def initStyle(self): + style = """ + QProgressBar{ + border-radius: 5px; + background-color: #E5E5E5; + } + QProgressBar::chunk { + border-radius: 5px; + background-color: #FF4E4E; + } + QPushButton{ + border:none; + } + #schema{ + margin-right:18px; + } + #status{ + border-radius:15px; + width:30px; + height:30px; + background-color:#F4F4F4 + } + #status:hover{ + background-color:#E5E5E5; + } + #lyric{ + margin-left:18px; + font-weight:bold; + } + #lyric:hover{ + color:#FF4E4E; + } + """ + self.setStyleSheet(style) + + def initUI(self): + activeColor = '#FF4E4E' + inActiveColor = '#333333' + + layout = QGridLayout() + layout.setSpacing(10) + layout.setContentsMargins(0, 0, 0, 0) + self.setLayout(layout) + + self.schema = HoverButton(activeColor=activeColor, inActiveColor=inActiveColor, iconName='heartbeat') + self.schema.setObjectName("schema") + self.schema.clicked.connect(globalSignal.playStyleMusic) + layout.addWidget(self.schema, 0, 0, 1, 3, Qt.AlignRight) + + self.backward = HoverButton(activeColor=activeColor, inActiveColor=inActiveColor, iconName='step-backward') + self.backward.clicked.connect(self.playPreMusic) + layout.addWidget(self.backward, 0, 3) + + self.status = HoverButton(activeColor=inActiveColor, inActiveColor=inActiveColor, iconName='play') + self.status.setObjectName("status") + self.status.clicked.connect(self.pause) + layout.addWidget(self.status, 0, 4) + + self.forward = HoverButton(activeColor=activeColor, inActiveColor=inActiveColor, iconName='step-forward') + self.forward.clicked.connect(self.playNextMusic) + layout.addWidget(self.forward, 0, 5) + + self.lyric = CommonButton("词") + self.lyric.setObjectName("lyric") + self.lyric.clicked.connect(self.showLyricWidget) + layout.addWidget(self.lyric, 0, 6, 1, 3, Qt.AlignLeft) + + self.current = QLabel("00:00") + layout.addWidget(self.current, 1, 0, Qt.AlignRight) + + self.progress = ProgressBar() + self.progress.setFixedHeight(6) # 设置进度条高度 + self.progress.clicked.connect(self.skip) + layout.addWidget(self.progress, 1, 1, 1, 7) + + self.total = QLabel() + layout.addWidget(self.total, 1, 8, Qt.AlignLeft) + + self.lyricWidget = LyricWidget() + self.lyricWidget.hide() + + # 音乐跳转 + def skip(self, value): + value = self.duration * value // 1000 * 1000 + self.player.setPosition(value) + self.clock.reset(value / 1000) + self.setProgressValue(value / 1000) + + @asynchronous + def play(self, music): + self.clock.stop() + self.clock.reset() + + self.playVO(music) + self.playing = True + self.player.play() + self.status.resetIconName('pause') + + def setDuration(self, duration): + self.duration = duration + self.total.setText(MSToTime(self.duration)) + if self.player.mediaStatus() != QMediaPlayer.MediaStatus.LoadedMedia: + self.clock.start() + + def setProgressValue(self, count): + self.current.setText(SToTime(count)) + if self.duration > 0: + # 更新进度条 + self.progress.setValue((count * 1000 * 100 / self.duration)) + self.progress.update() + + def pause(self): + if self.playing: + self.status.resetIconName('play') + self.player.pause() + self.playing = False + self.clock.stop() + else: + self.status.resetIconName('pause') + self.playing = True + mediaStatus = self.player.mediaStatus() + if mediaStatus == QMediaPlayer.MediaStatus.BufferedMedia or mediaStatus == QMediaPlayer.MediaStatus.LoadedMedia: + self.clock.start() + self.player.play() + else: + pass + + def setVolume(self, value): + self.player.setVolume(value) + + def playPreMusic(self): + self.clock.stop() + self.clock.reset() + globalSignal.playPreMusic.emit() + + def playNextMusic(self): + self.clock.stop() + self.clock.reset() + globalSignal.playNextMusic.emit() + + def playNextMusicCallBack(self, status): + if status == QMediaPlayer.MediaStatus.EndOfMedia: + self.clock.stop() + self.clock.reset() + globalSignal.playNextMusic.emit() + + @asynchronous + def prePlay(self, music): + self.playVO(music) + self.playing = False + self.status.resetIconName('play') + + # 歌词展示 + def showLyricWidget(self): + if self.lyricWidget.isVisible(): + self.lyricWidget.hide() + self.lyric.setStyleSheet("margin-left:18px;font-weight:bold;color:#000000;:hover{color:#FF4E4E;}") + else: + self.lyricWidget.show() + self.lyric.setStyleSheet("margin-left:18px;font-weight:bold;color:#FF4E4E;") + + def setLyric(self, count): + if self.lyricText != None: + text = self.lyricText.get(count) + if text != None: + self.lyricWidget.setLyric(text) + else: + self.lyricWidget.setLyric("当前歌曲为本地音乐,无歌词!") + + # 预加载播放 与 播放 公共抽取 + def playVO(self, music): + music.url = getMusicUrlResolver(music.id) + if music.url == '': + if self.serialErrorCount < 3: + print("获取" + music.name + "歌曲链接失败! 已为您跳转至下一首") + globalSignal.playNextMusic.emit() + self.serialErrorCount += 1 + else: + print("本歌单已连续3首播放失败,请选择其他歌单") + self.serialErrorCount = 0 + return + if music.lyricId != None: + music.lyric = lyricFormatter(getLyricByIdResolver(music.lyricId, music.source)) + else: + music.lyric = lyricFormatter(getLyricByIdResolver(music.id, Source.Netease_Cloud_Music.value)) + self.frequencyStatistics(music.lyric) + self.lyricText = music.lyric + self.player.setMedia(QMediaContent(QUrl(music.url))) + + def playLocalMusic(self, music): + self.clock.stop() + self.clock.reset() + + self.lyricText = None + self.player.setMedia(QMediaContent(QUrl.fromLocalFile(music.filePath))) + self.playing = True + self.player.play() + self.status.resetIconName('pause') + + # 根据歌词做频率统计 + def frequencyStatistics(self, lyric): + lyric = " ".join(lyric.values()) + words = jieba.lcut(lyric) + temps = {} + for word in words: + if len(word) == 1 or word in self.excludes: + continue + temps[word] = temps.get(word, 0) + 1 + items = list(temps.items()) + items.sort(key=lambda x: x[1], reverse=True) + self.words += items[0:10] + + + + +class Clock(QTimer): + call = pyqtSignal(int) + count = 0 + + def __init__(self, interval=1000): + super(Clock, self).__init__() + + self.setInterval(interval) + self.timeout.connect(self.handle) + + def reset(self, count=0): + self.count = count + + def handle(self): + self.count += 1 + self.call.emit(self.count) diff --git "a/21\343\200\201\345\206\231\344\272\206\344\270\252\347\275\221\346\230\223\344\272\221/gui/pages/statusbar/StatusBar.py" "b/21\343\200\201\345\206\231\344\272\206\344\270\252\347\275\221\346\230\223\344\272\221/gui/pages/statusbar/StatusBar.py" new file mode 100644 index 0000000..c013937 --- /dev/null +++ "b/21\343\200\201\345\206\231\344\272\206\344\270\252\347\275\221\346\230\223\344\272\221/gui/pages/statusbar/StatusBar.py" @@ -0,0 +1,84 @@ +# Python电子书:http://t.cn/A6tMNzuI +# Python交流群:http://t.cn/A65MiFvH +from PyQt5.QtGui import QCursor +from PyQt5.QtWidgets import QWidget, QHBoxLayout + +from PyQt5.QtCore import Qt + +from bean.MusicList import MusicList +from dao.Redis import redis +from gui.pages.statusbar.ControlWidget import ControlWidget +from gui.pages.statusbar.MusicPlayer import MusicPlayer +from gui.pages.statusbar.StatusWidget import StatusWidget +from gui.utils.TimeFormatter import getTimeStamp + + +class StatusBar(QWidget): + + def __init__(self): + super().__init__() + self.setFixedHeight(95) + self.setCursor(QCursor(Qt.ArrowCursor)) + + self.initStyle() + self.initUI() + self.preload() + + def initStyle(self): + self.setAttribute(Qt.WA_StyledBackground, True) + style = """ + StatusBar{ + background-color: #ffffff; + } + """ + self.setStyleSheet(style) + + def initUI(self): + layout = QHBoxLayout() + self.setLayout(layout) + + self.musicBar = StatusWidget() + self.musicBar.setFixedWidth(220) + layout.addWidget(self.musicBar) + + layout.addStretch(1) + + self.musicPlayer = MusicPlayer() + self.musicPlayer.setFixedWidth(565) + layout.addWidget(self.musicPlayer) + + layout.addStretch(1) + + controlBar = ControlWidget() + controlBar.volumnSignal.connect(self.setVolumn) + controlBar.setFixedWidth(220) + layout.addWidget(controlBar) + + def setVolumn(self, value): + self.musicPlayer.setVolume(value) + + # 预加载 + def preload(self): + self.songs = redis.getValue('songs', MusicList()) + self.recentMusicList = redis.getValue("recentMusicList", MusicList()) + music = self.songs.getCurrentMusic() + if music: + self.musicBar.display(music) + self.musicPlayer.prePlay(music) + + # 更新最近播放 + def updateRecentMusicList(self, music): + music.lastestTime = getTimeStamp() + for item in self.recentMusicList: + if music.id == item.id: + break + self.recentMusicList.add(music) + + def playMusic(self, music): + self.updateRecentMusicList(music) + self.musicBar.display(music) + self.musicPlayer.play(music) + + def playLocalMusic(self, music): + self.musicBar.display(music) + self.musicPlayer.playLocalMusic(music) diff --git "a/21\343\200\201\345\206\231\344\272\206\344\270\252\347\275\221\346\230\223\344\272\221/gui/pages/statusbar/StatusWidget.py" "b/21\343\200\201\345\206\231\344\272\206\344\270\252\347\275\221\346\230\223\344\272\221/gui/pages/statusbar/StatusWidget.py" new file mode 100644 index 0000000..bc9fcda --- /dev/null +++ "b/21\343\200\201\345\206\231\344\272\206\344\270\252\347\275\221\346\230\223\344\272\221/gui/pages/statusbar/StatusWidget.py" @@ -0,0 +1,125 @@ +# Python电子书:http://t.cn/A6tMNzuI +# Python交流群:http://t.cn/A65MiFvH +import os +import time +from PyQt5.QtWidgets import * +from PyQt5.QtCore import * + +from bean.Async import asynchronous +from gui.components.common.CommonButton import CommonButton +from gui.pages.GlobalSignal import globalSignal +from gui.utils.ImgConverter import QIcon +from gui.utils.Path import getPwd +from gui.utils.TimeFormatter import getTimeStamp +from resolver.SpiderResolver import getAvatarByIdResolver +from setting.SystemVariables import variables +from spider.Download import download + + +class StatusWidget(QWidget): + + def __init__(self): + super().__init__() + + self.initStyle() + self.initUI() + + def initStyle(self): + style = """ + QPushButton{ + border:none; + } + #coverImg{ + margin:0 8px; + } + #name{ + font-size:18px; + } + #name,#favour,#artist{ + text-align:left; + } + #artist{ + font-size:14px; + font-family:宋体; + } + + """ + self.setStyleSheet(style) + + def initUI(self): + layout = QGridLayout() + layout.setContentsMargins(0, 0, 0, 0) + self.setLayout(layout) + + self.coverImg = CommonButton() + self.coverImg.setObjectName("coverImg") + self.coverImg.setIconSize(QSize(60, 60)) + layout.addWidget(self.coverImg, 0, 0, 0, 1) + + self.name = CommonButton() + self.name.setObjectName("name") + layout.addWidget(self.name, 0, 1) + + self.favour = CommonButton(color='red') + self.favour.setObjectName("favour") + self.favour.clicked.connect(self.favourMusic) + layout.addWidget(self.favour, 0, 2) + + self.artists = QWidget() + artistsLayout = QHBoxLayout() + artistsLayout.setContentsMargins(0, 0, 0, 0) + self.artists.setLayout(artistsLayout) + layout.addWidget(self.artists, 1, 1, 1, 2) + + def favourMusic(self): + self.favorite = not self.favorite + self.setFavour(self.favorite) + # 触发信号 + + def setFavour(self, favorite): + if (favorite): + self.favour.resetIconName('heart') + else: + self.favour.resetIconName('heart-o') + + def display(self, music): + # 异步 + self.setCover(music) + + self.name.setText(music.name) + self.favorite = music.favorite + self.setFavour(self.favorite) + + # 移除所有 + for i in range(self.artists.layout().count()): + component = self.artists.layout().itemAt(i).widget() + if isinstance(component, CommonButton) or isinstance(component, QLabel): + component.deleteLater() + if music.artists != None: + for i in range(len(music.artists)): + artist = CommonButton(music.artists[i], tag=i) + artist.setObjectName("artist") + artist.tagSignal.connect(lambda tag: globalSignal.keywordSignal.emit(music.artists[tag])) + self.artists.layout().addWidget(artist) + else: + self.artists.layout().addWidget(QLabel("未知艺术家")) + + if music.filePath != None: + self.favour.hide() + + @asynchronous + def setCover(self, music): + if music.path != None and os.path.isfile(music.path): + self.coverImg.setIcon(QIcon(music.path)) + else: + if music.avatar == None and music.avatarId != None: + music.avatar = getAvatarByIdResolver(music.avatarId) + if music.avatar != None: + # 下载图片并缓存 + music.path = download(music.avatar, getPwd(), music.name + "_" + str(music.id)) + self.coverImg.setIcon(QIcon(music.path)) + else: + if variables.MUSIC_COVER_PATH == None or not os.path.isfile(variables.MUSIC_COVER_PATH): + variables.MUSIC_COVER_PATH = download(variables.MUSIC_COVER_URL, getPwd(), + 'MUSIC_COVER_PATH' + "_" + str(getTimeStamp())) + self.coverImg.setIcon(QIcon(variables.MUSIC_COVER_PATH)) diff --git "a/21\343\200\201\345\206\231\344\272\206\344\270\252\347\275\221\346\230\223\344\272\221/gui/pages/statusbar/__init__.py" "b/21\343\200\201\345\206\231\344\272\206\344\270\252\347\275\221\346\230\223\344\272\221/gui/pages/statusbar/__init__.py" new file mode 100644 index 0000000..eabf991 --- /dev/null +++ "b/21\343\200\201\345\206\231\344\272\206\344\270\252\347\275\221\346\230\223\344\272\221/gui/pages/statusbar/__init__.py" @@ -0,0 +1,2 @@ +# Python电子书:http://t.cn/A6tMNzuI +# Python交流群:http://t.cn/A65MiFvH diff --git "a/21\343\200\201\345\206\231\344\272\206\344\270\252\347\275\221\346\230\223\344\272\221/gui/utils/ImgConverter.py" "b/21\343\200\201\345\206\231\344\272\206\344\270\252\347\275\221\346\230\223\344\272\221/gui/utils/ImgConverter.py" new file mode 100644 index 0000000..8e86903 --- /dev/null +++ "b/21\343\200\201\345\206\231\344\272\206\344\270\252\347\275\221\346\230\223\344\272\221/gui/utils/ImgConverter.py" @@ -0,0 +1,21 @@ +# Python电子书:http://t.cn/A6tMNzuI +# Python交流群:http://t.cn/A65MiFvH +# 把图片变为圆形 +from PyQt5.QtCore import * +from PyQt5.QtGui import * + + +def ToCircleImg(url, width, height, parent): + originImg = QPixmap(url) + newImg = QPixmap(width, height) + newImg.fill(Qt.transparent) + painter = QPainter(newImg) + painter.begin(parent) + # 一个是平滑,一个是缩放保持比例 + painter.setRenderHints(QPainter.Antialiasing | QPainter.SmoothPixmapTransform) + path = QPainterPath() + path.addEllipse(0, 0, width, height); # 绘制椭圆 + painter.setClipPath(path) + painter.drawPixmap(0, 0, width, height, originImg) + painter.end() + return newImg diff --git "a/21\343\200\201\345\206\231\344\272\206\344\270\252\347\275\221\346\230\223\344\272\221/gui/utils/LyricFormatter.py" "b/21\343\200\201\345\206\231\344\272\206\344\270\252\347\275\221\346\230\223\344\272\221/gui/utils/LyricFormatter.py" new file mode 100644 index 0000000..69e3ac6 --- /dev/null +++ "b/21\343\200\201\345\206\231\344\272\206\344\270\252\347\275\221\346\230\223\344\272\221/gui/utils/LyricFormatter.py" @@ -0,0 +1,26 @@ +# Python电子书:http://t.cn/A6tMNzuI +# Python交流群:http://t.cn/A65MiFvH +import re + + +def lyricFormatter(lyric): + # 根据换行符分割字符串 + list = lyric.split("\n") + # 除去无效数据 + del list[0] + del list[len(list) - 1] + + lyricText = {} + + for i in range(len(list)): + # 切分为 时间 歌词 + temp = list[i].split(']') + # 切分 minute 秒 毫秒 + temp[0] = temp[0][1:-1] + + time = re.split('[:.]', temp[0]) + if int(time[2]) > 50: + time[1] = int(time[1]) + 1 + time = int(time[0]) * 60 + int(time[1]) + lyricText[time] = temp[1] + return lyricText diff --git "a/21\343\200\201\345\206\231\344\272\206\344\270\252\347\275\221\346\230\223\344\272\221/gui/utils/Path.py" "b/21\343\200\201\345\206\231\344\272\206\344\270\252\347\275\221\346\230\223\344\272\221/gui/utils/Path.py" new file mode 100644 index 0000000..4cd63e8 --- /dev/null +++ "b/21\343\200\201\345\206\231\344\272\206\344\270\252\347\275\221\346\230\223\344\272\221/gui/utils/Path.py" @@ -0,0 +1,16 @@ +# Python电子书:http://t.cn/A6tMNzuI +# Python交流群:http://t.cn/A65MiFvH +# 打包后也可适配路径哦 +import sys +import os + + +# def getPwd(): +# pwd = sys.path[0] +# if os.path.isfile(pwd): +# pwd = os.path.dirname(pwd) +# return pwd + +# 测试用 +def getPwd(): + return r'E:\代码\python\网易云\src\resource' diff --git "a/21\343\200\201\345\206\231\344\272\206\344\270\252\347\275\221\346\230\223\344\272\221/gui/utils/Spider.py" "b/21\343\200\201\345\206\231\344\272\206\344\270\252\347\275\221\346\230\223\344\272\221/gui/utils/Spider.py" new file mode 100644 index 0000000..9d5ec3b --- /dev/null +++ "b/21\343\200\201\345\206\231\344\272\206\344\270\252\347\275\221\346\230\223\344\272\221/gui/utils/Spider.py" @@ -0,0 +1,9 @@ +# Python电子书:http://t.cn/A6tMNzuI +# Python交流群:http://t.cn/A65MiFvH +import requests +from PyQt5.QtGui import * + + +def getPixmapByUrl(url): + data = requests.get(url).content + return QPixmap.fromImage(QImage.fromData(data)) diff --git "a/21\343\200\201\345\206\231\344\272\206\344\270\252\347\275\221\346\230\223\344\272\221/gui/utils/TimeFormatter.py" "b/21\343\200\201\345\206\231\344\272\206\344\270\252\347\275\221\346\230\223\344\272\221/gui/utils/TimeFormatter.py" new file mode 100644 index 0000000..000ae95 --- /dev/null +++ "b/21\343\200\201\345\206\231\344\272\206\344\270\252\347\275\221\346\230\223\344\272\221/gui/utils/TimeFormatter.py" @@ -0,0 +1,29 @@ +# Python电子书:http://t.cn/A6tMNzuI +# Python交流群:http://t.cn/A65MiFvH +# 时间转换 +import math +import time +from datetime import datetime + + +def MSToTime(ms): + return SToTime(ms / 1000) + + +def SToTime(s): + minute = int(s // 60) + if minute < 10: + minute = '0' + str(minute) + second = math.floor(s % 60) + if second < 10: + second = '0' + str(second) + return str(minute) + ":" + str(second) + + +def getTimeStamp(): + return math.floor(time.time()) + + +def timeStamptoTime(timeStamp): + return time.strftime("%Y-%m-%d %H:%M:%S", time.localtime(timeStamp)) + diff --git "a/21\343\200\201\345\206\231\344\272\206\344\270\252\347\275\221\346\230\223\344\272\221/gui/utils/__init__.py" "b/21\343\200\201\345\206\231\344\272\206\344\270\252\347\275\221\346\230\223\344\272\221/gui/utils/__init__.py" new file mode 100644 index 0000000..eabf991 --- /dev/null +++ "b/21\343\200\201\345\206\231\344\272\206\344\270\252\347\275\221\346\230\223\344\272\221/gui/utils/__init__.py" @@ -0,0 +1,2 @@ +# Python电子书:http://t.cn/A6tMNzuI +# Python交流群:http://t.cn/A65MiFvH diff --git "a/21\343\200\201\345\206\231\344\272\206\344\270\252\347\275\221\346\230\223\344\272\221/resolver/SpiderResolver.py" "b/21\343\200\201\345\206\231\344\272\206\344\270\252\347\275\221\346\230\223\344\272\221/resolver/SpiderResolver.py" new file mode 100644 index 0000000..5f78a1d --- /dev/null +++ "b/21\343\200\201\345\206\231\344\272\206\344\270\252\347\275\221\346\230\223\344\272\221/resolver/SpiderResolver.py" @@ -0,0 +1,70 @@ +# Python电子书:http://t.cn/A6tMNzuI +# Python交流群:http://t.cn/A65MiFvH +# 解析爬虫模块数据 再也不必牵一发而动全身啦 +from bean.Music import Music +from spider.api import * + + +def getMusicListByIdResolver(id): + data = getMusicListById(id) + if data.get('code') == 200: + playlist = data.get('playlist') + coverImgUrl = playlist.get('coverImgUrl') + tracks = playlist.get('tracks') + + musicList = [] + for track in tracks: + music = Music() + music.id = track.get('id') + music.name = track.get('name') + music.artists = [] + for artist in track.get('ar'): + music.artists.append(artist.get('name')) + music.avatar = track.get('al').get('picUrl') + music.album = track.get('al').get('name') + musicList.append(music) + return { + 'coverImgUrl': coverImgUrl, + 'musicList': musicList + } + + +# 获取网易云榜单歌曲url +def getMusicUrlResolver(id): + result = getMusicUrl(id, Source.Netease_Cloud_Music.value) + if result != None: + return result.get('url') + else: + return '' + + +# 获取网易云榜单歌曲url和size +def getMusicUrlSizeResolver(id): + return getMusicUrl(id, Source.Netease_Cloud_Music.value) + + +def getMusicListByKeywordResolver(count, pages, keyword): + musicList = [] + for s in Source: + for track in getMusicListByKeyword(count, s.value, pages, keyword): + music = Music() + music.id = track.get('id') + music.name = track.get('name') + music.artists = [] + for artist in track.get('artist'): + music.artists.append(artist) + music.avatarId = track.get('pic_id') + music.album = track.get('album') + music.lyricId = track.get('lyric_id') + music.source = track.get('source') + musicList.append(music) + return musicList + + +def getAvatarByIdResolver(id): + data = getMusicPic(id, Source.Netease_Cloud_Music.value) + return data.get('url') + + +def getLyricByIdResolver(id, source): + return getMusicLyric(id, source).get('lyric') diff --git "a/21\343\200\201\345\206\231\344\272\206\344\270\252\347\275\221\346\230\223\344\272\221/resolver/__init__.py" "b/21\343\200\201\345\206\231\344\272\206\344\270\252\347\275\221\346\230\223\344\272\221/resolver/__init__.py" new file mode 100644 index 0000000..eabf991 --- /dev/null +++ "b/21\343\200\201\345\206\231\344\272\206\344\270\252\347\275\221\346\230\223\344\272\221/resolver/__init__.py" @@ -0,0 +1,2 @@ +# Python电子书:http://t.cn/A6tMNzuI +# Python交流群:http://t.cn/A65MiFvH diff --git "a/21\343\200\201\345\206\231\344\272\206\344\270\252\347\275\221\346\230\223\344\272\221/resource/I\342\200\230M YOURS PT.2_571758505.jpg" "b/21\343\200\201\345\206\231\344\272\206\344\270\252\347\275\221\346\230\223\344\272\221/resource/I\342\200\230M YOURS PT.2_571758505.jpg" new file mode 100644 index 0000000..379ac80 Binary files /dev/null and "b/21\343\200\201\345\206\231\344\272\206\344\270\252\347\275\221\346\230\223\344\272\221/resource/I\342\200\230M YOURS PT.2_571758505.jpg" differ diff --git "a/21\343\200\201\345\206\231\344\272\206\344\270\252\347\275\221\346\230\223\344\272\221/resource/Love Is Gone (feat. Dylan Matthew) (Acoustic)_1401671455.jpg" "b/21\343\200\201\345\206\231\344\272\206\344\270\252\347\275\221\346\230\223\344\272\221/resource/Love Is Gone (feat. Dylan Matthew) (Acoustic)_1401671455.jpg" new file mode 100644 index 0000000..f40c2df Binary files /dev/null and "b/21\343\200\201\345\206\231\344\272\206\344\270\252\347\275\221\346\230\223\344\272\221/resource/Love Is Gone (feat. Dylan Matthew) (Acoustic)_1401671455.jpg" differ diff --git "a/21\343\200\201\345\206\231\344\272\206\344\270\252\347\275\221\346\230\223\344\272\221/resource/MUSIC_COVER_PATH_1625820601.jpg" "b/21\343\200\201\345\206\231\344\272\206\344\270\252\347\275\221\346\230\223\344\272\221/resource/MUSIC_COVER_PATH_1625820601.jpg" new file mode 100644 index 0000000..11bf625 Binary files /dev/null and "b/21\343\200\201\345\206\231\344\272\206\344\270\252\347\275\221\346\230\223\344\272\221/resource/MUSIC_COVER_PATH_1625820601.jpg" differ diff --git "a/21\343\200\201\345\206\231\344\272\206\344\270\252\347\275\221\346\230\223\344\272\221/resource/MUSIC_COVER_PATH_1625835914.jpg" "b/21\343\200\201\345\206\231\344\272\206\344\270\252\347\275\221\346\230\223\344\272\221/resource/MUSIC_COVER_PATH_1625835914.jpg" new file mode 100644 index 0000000..11bf625 Binary files /dev/null and "b/21\343\200\201\345\206\231\344\272\206\344\270\252\347\275\221\346\230\223\344\272\221/resource/MUSIC_COVER_PATH_1625835914.jpg" differ diff --git "a/21\343\200\201\345\206\231\344\272\206\344\270\252\347\275\221\346\230\223\344\272\221/resource/MUSIC_COVER_PATH_1625840900.jpg" "b/21\343\200\201\345\206\231\344\272\206\344\270\252\347\275\221\346\230\223\344\272\221/resource/MUSIC_COVER_PATH_1625840900.jpg" new file mode 100644 index 0000000..11bf625 Binary files /dev/null and "b/21\343\200\201\345\206\231\344\272\206\344\270\252\347\275\221\346\230\223\344\272\221/resource/MUSIC_COVER_PATH_1625840900.jpg" differ diff --git "a/21\343\200\201\345\206\231\344\272\206\344\270\252\347\275\221\346\230\223\344\272\221/resource/Mood (Lil Ghost Remix)_1840808119.jpg" "b/21\343\200\201\345\206\231\344\272\206\344\270\252\347\275\221\346\230\223\344\272\221/resource/Mood (Lil Ghost Remix)_1840808119.jpg" new file mode 100644 index 0000000..c615550 Binary files /dev/null and "b/21\343\200\201\345\206\231\344\272\206\344\270\252\347\275\221\346\230\223\344\272\221/resource/Mood (Lil Ghost Remix)_1840808119.jpg" differ diff --git "a/21\343\200\201\345\206\231\344\272\206\344\270\252\347\275\221\346\230\223\344\272\221/resource/New Boy_1857630559.jpg" "b/21\343\200\201\345\206\231\344\272\206\344\270\252\347\275\221\346\230\223\344\272\221/resource/New Boy_1857630559.jpg" new file mode 100644 index 0000000..55a49e2 Binary files /dev/null and "b/21\343\200\201\345\206\231\344\272\206\344\270\252\347\275\221\346\230\223\344\272\221/resource/New Boy_1857630559.jpg" differ diff --git "a/21\343\200\201\345\206\231\344\272\206\344\270\252\347\275\221\346\230\223\344\272\221/resource/Power (In Your Soul)_1843319489.jpg" "b/21\343\200\201\345\206\231\344\272\206\344\270\252\347\275\221\346\230\223\344\272\221/resource/Power (In Your Soul)_1843319489.jpg" new file mode 100644 index 0000000..685d3f9 Binary files /dev/null and "b/21\343\200\201\345\206\231\344\272\206\344\270\252\347\275\221\346\230\223\344\272\221/resource/Power (In Your Soul)_1843319489.jpg" differ diff --git "a/21\343\200\201\345\206\231\344\272\206\344\270\252\347\275\221\346\230\223\344\272\221/resource/Running Girls_474567346.jpg" "b/21\343\200\201\345\206\231\344\272\206\344\270\252\347\275\221\346\230\223\344\272\221/resource/Running Girls_474567346.jpg" new file mode 100644 index 0000000..532c019 Binary files /dev/null and "b/21\343\200\201\345\206\231\344\272\206\344\270\252\347\275\221\346\230\223\344\272\221/resource/Running Girls_474567346.jpg" differ diff --git "a/21\343\200\201\345\206\231\344\272\206\344\270\252\347\275\221\346\230\223\344\272\221/resource/img/avatar.png" "b/21\343\200\201\345\206\231\344\272\206\344\270\252\347\275\221\346\230\223\344\272\221/resource/img/avatar.png" new file mode 100644 index 0000000..9dcfd9f Binary files /dev/null and "b/21\343\200\201\345\206\231\344\272\206\344\270\252\347\275\221\346\230\223\344\272\221/resource/img/avatar.png" differ diff --git "a/21\343\200\201\345\206\231\344\272\206\344\270\252\347\275\221\346\230\223\344\272\221/resource/img/loading.gif" "b/21\343\200\201\345\206\231\344\272\206\344\270\252\347\275\221\346\230\223\344\272\221/resource/img/loading.gif" new file mode 100644 index 0000000..3c9f8dd Binary files /dev/null and "b/21\343\200\201\345\206\231\344\272\206\344\270\252\347\275\221\346\230\223\344\272\221/resource/img/loading.gif" differ diff --git "a/21\343\200\201\345\206\231\344\272\206\344\270\252\347\275\221\346\230\223\344\272\221/resource/img/netease.png" "b/21\343\200\201\345\206\231\344\272\206\344\270\252\347\275\221\346\230\223\344\272\221/resource/img/netease.png" new file mode 100644 index 0000000..cd3977e Binary files /dev/null and "b/21\343\200\201\345\206\231\344\272\206\344\270\252\347\275\221\346\230\223\344\272\221/resource/img/netease.png" differ diff --git "a/21\343\200\201\345\206\231\344\272\206\344\270\252\347\275\221\346\230\223\344\272\221/resource/setting.bak" "b/21\343\200\201\345\206\231\344\272\206\344\270\252\347\275\221\346\230\223\344\272\221/resource/setting.bak" new file mode 100644 index 0000000..b78f558 --- /dev/null +++ "b/21\343\200\201\345\206\231\344\272\206\344\270\252\347\275\221\346\230\223\344\272\221/resource/setting.bak" @@ -0,0 +1 @@ +'redis', (102400, 126832) diff --git "a/21\343\200\201\345\206\231\344\272\206\344\270\252\347\275\221\346\230\223\344\272\221/resource/setting.dat" "b/21\343\200\201\345\206\231\344\272\206\344\270\252\347\275\221\346\230\223\344\272\221/resource/setting.dat" new file mode 100644 index 0000000..171df17 Binary files /dev/null and "b/21\343\200\201\345\206\231\344\272\206\344\270\252\347\275\221\346\230\223\344\272\221/resource/setting.dat" differ diff --git "a/21\343\200\201\345\206\231\344\272\206\344\270\252\347\275\221\346\230\223\344\272\221/resource/setting.dir" "b/21\343\200\201\345\206\231\344\272\206\344\270\252\347\275\221\346\230\223\344\272\221/resource/setting.dir" new file mode 100644 index 0000000..b78f558 --- /dev/null +++ "b/21\343\200\201\345\206\231\344\272\206\344\270\252\347\275\221\346\230\223\344\272\221/resource/setting.dir" @@ -0,0 +1 @@ +'redis', (102400, 126832) diff --git "a/21\343\200\201\345\206\231\344\272\206\344\270\252\347\275\221\346\230\223\344\272\221/resource/\344\270\215\346\204\217\345\244\226\347\232\204\346\204\217\345\244\226_467320105.jpg" "b/21\343\200\201\345\206\231\344\272\206\344\270\252\347\275\221\346\230\223\344\272\221/resource/\344\270\215\346\204\217\345\244\226\347\232\204\346\204\217\345\244\226_467320105.jpg" new file mode 100644 index 0000000..96db137 Binary files /dev/null and "b/21\343\200\201\345\206\231\344\272\206\344\270\252\347\275\221\346\230\223\344\272\221/resource/\344\270\215\346\204\217\345\244\226\347\232\204\346\204\217\345\244\226_467320105.jpg" differ diff --git "a/21\343\200\201\345\206\231\344\272\206\344\270\252\347\275\221\346\230\223\344\272\221/resource/\344\273\226\345\217\252\346\230\257\347\273\217\350\277\207_1443838552.jpg" "b/21\343\200\201\345\206\231\344\272\206\344\270\252\347\275\221\346\230\223\344\272\221/resource/\344\273\226\345\217\252\346\230\257\347\273\217\350\277\207_1443838552.jpg" new file mode 100644 index 0000000..2b781e4 Binary files /dev/null and "b/21\343\200\201\345\206\231\344\272\206\344\270\252\347\275\221\346\230\223\344\272\221/resource/\344\273\226\345\217\252\346\230\257\347\273\217\350\277\207_1443838552.jpg" differ diff --git "a/21\343\200\201\345\206\231\344\272\206\344\270\252\347\275\221\346\230\223\344\272\221/resource/\344\274\240\350\257\264 (\344\270\255\345\245\263\344\270\247K\347\211\210)_465973443.jpg" "b/21\343\200\201\345\206\231\344\272\206\344\270\252\347\275\221\346\230\223\344\272\221/resource/\344\274\240\350\257\264 (\344\270\255\345\245\263\344\270\247K\347\211\210)_465973443.jpg" new file mode 100644 index 0000000..3ef9e7b Binary files /dev/null and "b/21\343\200\201\345\206\231\344\272\206\344\270\252\347\275\221\346\230\223\344\272\221/resource/\344\274\240\350\257\264 (\344\270\255\345\245\263\344\270\247K\347\211\210)_465973443.jpg" differ diff --git "a/21\343\200\201\345\206\231\344\272\206\344\270\252\347\275\221\346\230\223\344\272\221/resource/\344\275\240\346\260\270\350\277\234\346\230\257\346\210\221\347\232\204\345\256\235\350\264\235\357\274\214\345\256\235\350\264\235_1854105063.jpg" "b/21\343\200\201\345\206\231\344\272\206\344\270\252\347\275\221\346\230\223\344\272\221/resource/\344\275\240\346\260\270\350\277\234\346\230\257\346\210\221\347\232\204\345\256\235\350\264\235\357\274\214\345\256\235\350\264\235_1854105063.jpg" new file mode 100644 index 0000000..594ad2d Binary files /dev/null and "b/21\343\200\201\345\206\231\344\272\206\344\270\252\347\275\221\346\230\223\344\272\221/resource/\344\275\240\346\260\270\350\277\234\346\230\257\346\210\221\347\232\204\345\256\235\350\264\235\357\274\214\345\256\235\350\264\235_1854105063.jpg" differ diff --git "a/21\343\200\201\345\206\231\344\272\206\344\270\252\347\275\221\346\230\223\344\272\221/resource/\345\212\250\345\234\260\346\203\212\345\244\251\347\210\261\346\201\213\350\277\207_474932666.jpg" "b/21\343\200\201\345\206\231\344\272\206\344\270\252\347\275\221\346\230\223\344\272\221/resource/\345\212\250\345\234\260\346\203\212\345\244\251\347\210\261\346\201\213\350\277\207_474932666.jpg" new file mode 100644 index 0000000..95be729 Binary files /dev/null and "b/21\343\200\201\345\206\231\344\272\206\344\270\252\347\275\221\346\230\223\344\272\221/resource/\345\212\250\345\234\260\346\203\212\345\244\251\347\210\261\346\201\213\350\277\207_474932666.jpg" differ diff --git "a/21\343\200\201\345\206\231\344\272\206\344\270\252\347\275\221\346\230\223\344\272\221/resource/\345\220\214\346\241\214\347\232\204\344\275\240(\351\243\216\350\241\214\347\211\210)_108128.jpg" "b/21\343\200\201\345\206\231\344\272\206\344\270\252\347\275\221\346\230\223\344\272\221/resource/\345\220\214\346\241\214\347\232\204\344\275\240(\351\243\216\350\241\214\347\211\210)_108128.jpg" new file mode 100644 index 0000000..eb33b75 Binary files /dev/null and "b/21\343\200\201\345\206\231\344\272\206\344\270\252\347\275\221\346\230\223\344\272\221/resource/\345\220\214\346\241\214\347\232\204\344\275\240(\351\243\216\350\241\214\347\211\210)_108128.jpg" differ diff --git "a/21\343\200\201\345\206\231\344\272\206\344\270\252\347\275\221\346\230\223\344\272\221/resource/\345\220\214\346\241\214\347\232\204\344\275\240_0031zaiZ2ZmBYj.jpg" "b/21\343\200\201\345\206\231\344\272\206\344\270\252\347\275\221\346\230\223\344\272\221/resource/\345\220\214\346\241\214\347\232\204\344\275\240_0031zaiZ2ZmBYj.jpg" new file mode 100644 index 0000000..ab50c74 --- /dev/null +++ "b/21\343\200\201\345\206\231\344\272\206\344\270\252\347\275\221\346\230\223\344\272\221/resource/\345\220\214\346\241\214\347\232\204\344\275\240_0031zaiZ2ZmBYj.jpg" @@ -0,0 +1,7 @@ + + + NoSuchKey + 对象“Yf6l9z7iRQyBkjjsLy2Wdg==/002Wn9FY07BhG2.jpg”不存在,请指定正确的对象 + /yyimgs/Yf6l9z7iRQyBkjjsLy2Wdg==/002Wn9FY07BhG2.jpg + f81774fa-f8e1-4575-8e58-b0eb0c24687b + \ No newline at end of file diff --git "a/21\343\200\201\345\206\231\344\272\206\344\270\252\347\275\221\346\230\223\344\272\221/resource/\345\220\214\346\241\214\347\232\204\344\275\240_9f19a226fccb1f798c4de19bc35de47d.jpg" "b/21\343\200\201\345\206\231\344\272\206\344\270\252\347\275\221\346\230\223\344\272\221/resource/\345\220\214\346\241\214\347\232\204\344\275\240_9f19a226fccb1f798c4de19bc35de47d.jpg" new file mode 100644 index 0000000..f62301d --- /dev/null +++ "b/21\343\200\201\345\206\231\344\272\206\344\270\252\347\275\221\346\230\223\344\272\221/resource/\345\220\214\346\241\214\347\232\204\344\275\240_9f19a226fccb1f798c4de19bc35de47d.jpg" @@ -0,0 +1,7 @@ + + + NoSuchKey + 对象“cf6tnDwrkBUi9O4y6d3ucg==/9f19a226fccb1f798c4de19bc35de47d.jpg”不存在,请指定正确的对象 + /yyimgs/cf6tnDwrkBUi9O4y6d3ucg==/9f19a226fccb1f798c4de19bc35de47d.jpg + 317725a7-6572-4fb5-8d0b-0a3501e6273d + \ No newline at end of file diff --git "a/21\343\200\201\345\206\231\344\272\206\344\270\252\347\275\221\346\230\223\344\272\221/resource/\345\223\252\351\207\214\351\203\275\346\230\257\344\275\240_488249475.jpg" "b/21\343\200\201\345\206\231\344\272\206\344\270\252\347\275\221\346\230\223\344\272\221/resource/\345\223\252\351\207\214\351\203\275\346\230\257\344\275\240_488249475.jpg" new file mode 100644 index 0000000..259e1cc Binary files /dev/null and "b/21\343\200\201\345\206\231\344\272\206\344\270\252\347\275\221\346\230\223\344\272\221/resource/\345\223\252\351\207\214\351\203\275\346\230\257\344\275\240_488249475.jpg" differ diff --git "a/21\343\200\201\345\206\231\344\272\206\344\270\252\347\275\221\346\230\223\344\272\221/resource/\345\230\211\345\256\276_1846489646.jpg" "b/21\343\200\201\345\206\231\344\272\206\344\270\252\347\275\221\346\230\223\344\272\221/resource/\345\230\211\345\256\276_1846489646.jpg" new file mode 100644 index 0000000..d32c8d5 Binary files /dev/null and "b/21\343\200\201\345\206\231\344\272\206\344\270\252\347\275\221\346\230\223\344\272\221/resource/\345\230\211\345\256\276_1846489646.jpg" differ diff --git "a/21\343\200\201\345\206\231\344\272\206\344\270\252\347\275\221\346\230\223\344\272\221/resource/\345\233\236\346\265\267\344\270\212_462861546.jpg" "b/21\343\200\201\345\206\231\344\272\206\344\270\252\347\275\221\346\230\223\344\272\221/resource/\345\233\236\346\265\267\344\270\212_462861546.jpg" new file mode 100644 index 0000000..63a965b Binary files /dev/null and "b/21\343\200\201\345\206\231\344\272\206\344\270\252\347\275\221\346\230\223\344\272\221/resource/\345\233\236\346\265\267\344\270\212_462861546.jpg" differ diff --git "a/21\343\200\201\345\206\231\344\272\206\344\270\252\347\275\221\346\230\223\344\272\221/resource/\345\234\250\350\277\231\351\207\214\350\257\267\344\275\240\351\232\217\346\204\217_1317308643.jpg" "b/21\343\200\201\345\206\231\344\272\206\344\270\252\347\275\221\346\230\223\344\272\221/resource/\345\234\250\350\277\231\351\207\214\350\257\267\344\275\240\351\232\217\346\204\217_1317308643.jpg" new file mode 100644 index 0000000..3c7562e Binary files /dev/null and "b/21\343\200\201\345\206\231\344\272\206\344\270\252\347\275\221\346\230\223\344\272\221/resource/\345\234\250\350\277\231\351\207\214\350\257\267\344\275\240\351\232\217\346\204\217_1317308643.jpg" differ diff --git "a/21\343\200\201\345\206\231\344\272\206\344\270\252\347\275\221\346\230\223\344\272\221/resource/\345\244\217\345\244\251\347\232\204\351\243\216_1436709403.jpg" "b/21\343\200\201\345\206\231\344\272\206\344\270\252\347\275\221\346\230\223\344\272\221/resource/\345\244\217\345\244\251\347\232\204\351\243\216_1436709403.jpg" new file mode 100644 index 0000000..ade8fd4 Binary files /dev/null and "b/21\343\200\201\345\206\231\344\272\206\344\270\252\347\275\221\346\230\223\344\272\221/resource/\345\244\217\345\244\251\347\232\204\351\243\216_1436709403.jpg" differ diff --git "a/21\343\200\201\345\206\231\344\272\206\344\270\252\347\275\221\346\230\223\344\272\221/resource/\345\244\251\345\244\226\346\235\245\347\211\251_1463165983.jpg" "b/21\343\200\201\345\206\231\344\272\206\344\270\252\347\275\221\346\230\223\344\272\221/resource/\345\244\251\345\244\226\346\235\245\347\211\251_1463165983.jpg" new file mode 100644 index 0000000..dbf79f3 Binary files /dev/null and "b/21\343\200\201\345\206\231\344\272\206\344\270\252\347\275\221\346\230\223\344\272\221/resource/\345\244\251\345\244\226\346\235\245\347\211\251_1463165983.jpg" differ diff --git "a/21\343\200\201\345\206\231\344\272\206\344\270\252\347\275\221\346\230\223\344\272\221/resource/\345\245\275\345\245\275\347\210\261\344\270\252\345\245\263\345\255\251_464647443.jpg" "b/21\343\200\201\345\206\231\344\272\206\344\270\252\347\275\221\346\230\223\344\272\221/resource/\345\245\275\345\245\275\347\210\261\344\270\252\345\245\263\345\255\251_464647443.jpg" new file mode 100644 index 0000000..9002c57 Binary files /dev/null and "b/21\343\200\201\345\206\231\344\272\206\344\270\252\347\275\221\346\230\223\344\272\221/resource/\345\245\275\345\245\275\347\210\261\344\270\252\345\245\263\345\255\251_464647443.jpg" differ diff --git "a/21\343\200\201\345\206\231\344\272\206\344\270\252\347\275\221\346\230\223\344\272\221/resource/\346\203\205\344\272\272\350\207\252\346\211\260_464192558.jpg" "b/21\343\200\201\345\206\231\344\272\206\344\270\252\347\275\221\346\230\223\344\272\221/resource/\346\203\205\344\272\272\350\207\252\346\211\260_464192558.jpg" new file mode 100644 index 0000000..f355d08 Binary files /dev/null and "b/21\343\200\201\345\206\231\344\272\206\344\270\252\347\275\221\346\230\223\344\272\221/resource/\346\203\205\344\272\272\350\207\252\346\211\260_464192558.jpg" differ diff --git "a/21\343\200\201\345\206\231\344\272\206\344\270\252\347\275\221\346\230\223\344\272\221/resource/\346\205\242\346\205\242\344\271\240\346\203\257_469699365.jpg" "b/21\343\200\201\345\206\231\344\272\206\344\270\252\347\275\221\346\230\223\344\272\221/resource/\346\205\242\346\205\242\344\271\240\346\203\257_469699365.jpg" new file mode 100644 index 0000000..45e31d5 Binary files /dev/null and "b/21\343\200\201\345\206\231\344\272\206\344\270\252\347\275\221\346\230\223\344\272\221/resource/\346\205\242\346\205\242\344\271\240\346\203\257_469699365.jpg" differ diff --git "a/21\343\200\201\345\206\231\344\272\206\344\270\252\347\275\221\346\230\223\344\272\221/resource/\346\205\242\347\203\255_1824025894.jpg" "b/21\343\200\201\345\206\231\344\272\206\344\270\252\347\275\221\346\230\223\344\272\221/resource/\346\205\242\347\203\255_1824025894.jpg" new file mode 100644 index 0000000..2ddcd63 Binary files /dev/null and "b/21\343\200\201\345\206\231\344\272\206\344\270\252\347\275\221\346\230\223\344\272\221/resource/\346\205\242\347\203\255_1824025894.jpg" differ diff --git "a/21\343\200\201\345\206\231\344\272\206\344\270\252\347\275\221\346\230\223\344\272\221/resource/\346\210\220\345\205\250_472214046.jpg" "b/21\343\200\201\345\206\231\344\272\206\344\270\252\347\275\221\346\230\223\344\272\221/resource/\346\210\220\345\205\250_472214046.jpg" new file mode 100644 index 0000000..a9d56b7 Binary files /dev/null and "b/21\343\200\201\345\206\231\344\272\206\344\270\252\347\275\221\346\230\223\344\272\221/resource/\346\210\220\345\205\250_472214046.jpg" differ diff --git "a/21\343\200\201\345\206\231\344\272\206\344\270\252\347\275\221\346\230\223\344\272\221/resource/\346\210\221\344\270\215\350\203\275\345\277\230\350\256\260\344\275\240_472137753.jpg" "b/21\343\200\201\345\206\231\344\272\206\344\270\252\347\275\221\346\230\223\344\272\221/resource/\346\210\221\344\270\215\350\203\275\345\277\230\350\256\260\344\275\240_472137753.jpg" new file mode 100644 index 0000000..703a5c1 Binary files /dev/null and "b/21\343\200\201\345\206\231\344\272\206\344\270\252\347\275\221\346\230\223\344\272\221/resource/\346\210\221\344\270\215\350\203\275\345\277\230\350\256\260\344\275\240_472137753.jpg" differ diff --git "a/21\343\200\201\345\206\231\344\272\206\344\270\252\347\275\221\346\230\223\344\272\221/resource/\346\210\221\345\222\214\346\210\221\347\232\204\347\245\226\345\233\275_1392990601.jpg" "b/21\343\200\201\345\206\231\344\272\206\344\270\252\347\275\221\346\230\223\344\272\221/resource/\346\210\221\345\222\214\346\210\221\347\232\204\347\245\226\345\233\275_1392990601.jpg" new file mode 100644 index 0000000..7825388 Binary files /dev/null and "b/21\343\200\201\345\206\231\344\272\206\344\270\252\347\275\221\346\230\223\344\272\221/resource/\346\210\221\345\222\214\346\210\221\347\232\204\347\245\226\345\233\275_1392990601.jpg" differ diff --git "a/21\343\200\201\345\206\231\344\272\206\344\270\252\347\275\221\346\230\223\344\272\221/resource/\346\224\276\347\251\272_1841002409.jpg" "b/21\343\200\201\345\206\231\344\272\206\344\270\252\347\275\221\346\230\223\344\272\221/resource/\346\224\276\347\251\272_1841002409.jpg" new file mode 100644 index 0000000..2cbaf43 Binary files /dev/null and "b/21\343\200\201\345\206\231\344\272\206\344\270\252\347\275\221\346\230\223\344\272\221/resource/\346\224\276\347\251\272_1841002409.jpg" differ diff --git "a/21\343\200\201\345\206\231\344\272\206\344\270\252\347\275\221\346\230\223\344\272\221/resource/\346\225\205\346\204\217\344\270\215\347\210\261\344\275\240_454438905.jpg" "b/21\343\200\201\345\206\231\344\272\206\344\270\252\347\275\221\346\230\223\344\272\221/resource/\346\225\205\346\204\217\344\270\215\347\210\261\344\275\240_454438905.jpg" new file mode 100644 index 0000000..97a22a0 Binary files /dev/null and "b/21\343\200\201\345\206\231\344\272\206\344\270\252\347\275\221\346\230\223\344\272\221/resource/\346\225\205\346\204\217\344\270\215\347\210\261\344\275\240_454438905.jpg" differ diff --git "a/21\343\200\201\345\206\231\344\272\206\344\270\252\347\275\221\346\230\223\344\272\221/resource/\346\231\232\345\256\211_1359356908.jpg" "b/21\343\200\201\345\206\231\344\272\206\344\270\252\347\275\221\346\230\223\344\272\221/resource/\346\231\232\345\256\211_1359356908.jpg" new file mode 100644 index 0000000..1724879 Binary files /dev/null and "b/21\343\200\201\345\206\231\344\272\206\344\270\252\347\275\221\346\230\223\344\272\221/resource/\346\231\232\345\256\211_1359356908.jpg" differ diff --git "a/21\343\200\201\345\206\231\344\272\206\344\270\252\347\275\221\346\230\223\344\272\221/resource/\346\231\232\351\243\216_1441758494.jpg" "b/21\343\200\201\345\206\231\344\272\206\344\270\252\347\275\221\346\230\223\344\272\221/resource/\346\231\232\351\243\216_1441758494.jpg" new file mode 100644 index 0000000..8ff6180 Binary files /dev/null and "b/21\343\200\201\345\206\231\344\272\206\344\270\252\347\275\221\346\230\223\344\272\221/resource/\346\231\232\351\243\216_1441758494.jpg" differ diff --git "a/21\343\200\201\345\206\231\344\272\206\344\270\252\347\275\221\346\230\223\344\272\221/resource/\346\234\211\347\272\246_465783766.jpg" "b/21\343\200\201\345\206\231\344\272\206\344\270\252\347\275\221\346\230\223\344\272\221/resource/\346\234\211\347\272\246_465783766.jpg" new file mode 100644 index 0000000..3974136 Binary files /dev/null and "b/21\343\200\201\345\206\231\344\272\206\344\270\252\347\275\221\346\230\223\344\272\221/resource/\346\234\211\347\272\246_465783766.jpg" differ diff --git "a/21\343\200\201\345\206\231\344\272\206\344\270\252\347\275\221\346\230\223\344\272\221/resource/\346\236\227\344\270\255\351\270\237_001atNb13Mk3um.jpg" "b/21\343\200\201\345\206\231\344\272\206\344\270\252\347\275\221\346\230\223\344\272\221/resource/\346\236\227\344\270\255\351\270\237_001atNb13Mk3um.jpg" new file mode 100644 index 0000000..c4f0445 --- /dev/null +++ "b/21\343\200\201\345\206\231\344\272\206\344\270\252\347\275\221\346\230\223\344\272\221/resource/\346\236\227\344\270\255\351\270\237_001atNb13Mk3um.jpg" @@ -0,0 +1,13 @@ + + + NoSuchKey + 对象“MLAclbIP9_DoGPC_H9mG2w==/000TSwQz4E7Y4E.jpg”不存在,请指定正确的对象 + /yyimgs/MLAclbIP9_DoGPC_H9mG2w==/000TSwQz4E7Y4E.jpg + 4b461a85-7bd4-4a83-9a82-c867aa5a6a00 + + + NoSuchKey + 对象“MLAclbIP9_DoGPC_H9mG2w==/000TSwQz4E7Y4E.jpg”不存在,请指定正确的对象 + /yyimgs/MLAclbIP9_DoGPC_H9mG2w==/000TSwQz4E7Y4E.jpg + 6744a36e-f237-4750-84c1-242aa1c86ef2 + \ No newline at end of file diff --git "a/21\343\200\201\345\206\231\344\272\206\344\270\252\347\275\221\346\230\223\344\272\221/resource/\346\236\227\344\270\255\351\270\237_404784564.jpg" "b/21\343\200\201\345\206\231\344\272\206\344\270\252\347\275\221\346\230\223\344\272\221/resource/\346\236\227\344\270\255\351\270\237_404784564.jpg" new file mode 100644 index 0000000..eb428b4 Binary files /dev/null and "b/21\343\200\201\345\206\231\344\272\206\344\270\252\347\275\221\346\230\223\344\272\221/resource/\346\236\227\344\270\255\351\270\237_404784564.jpg" differ diff --git "a/21\343\200\201\345\206\231\344\272\206\344\270\252\347\275\221\346\230\223\344\272\221/resource/\346\236\227\344\270\255\351\270\237_c3e70164b1f15e6aecc136746f461731.jpg" "b/21\343\200\201\345\206\231\344\272\206\344\270\252\347\275\221\346\230\223\344\272\221/resource/\346\236\227\344\270\255\351\270\237_c3e70164b1f15e6aecc136746f461731.jpg" new file mode 100644 index 0000000..0919197 --- /dev/null +++ "b/21\343\200\201\345\206\231\344\272\206\344\270\252\347\275\221\346\230\223\344\272\221/resource/\346\236\227\344\270\255\351\270\237_c3e70164b1f15e6aecc136746f461731.jpg" @@ -0,0 +1,7 @@ + + + NoSuchKey + 对象“s2LC3pOsbfVjDw3ojKQq1A==/c3e70164b1f15e6aecc136746f461731.jpg”不存在,请指定正确的对象 + /yyimgs/s2LC3pOsbfVjDw3ojKQq1A==/c3e70164b1f15e6aecc136746f461731.jpg + 2f4b9923-39ec-4a93-9e18-648818ea1e97 + \ No newline at end of file diff --git "a/21\343\200\201\345\206\231\344\272\206\344\270\252\347\275\221\346\230\223\344\272\221/resource/\346\237\245\346\227\240\346\255\244\345\255\227_456175653.jpg" "b/21\343\200\201\345\206\231\344\272\206\344\270\252\347\275\221\346\230\223\344\272\221/resource/\346\237\245\346\227\240\346\255\244\345\255\227_456175653.jpg" new file mode 100644 index 0000000..619ba48 Binary files /dev/null and "b/21\343\200\201\345\206\231\344\272\206\344\270\252\347\275\221\346\230\223\344\272\221/resource/\346\237\245\346\227\240\346\255\244\345\255\227_456175653.jpg" differ diff --git "a/21\343\200\201\345\206\231\344\272\206\344\270\252\347\275\221\346\230\223\344\272\221/resource/\346\242\246_468817106.jpg" "b/21\343\200\201\345\206\231\344\272\206\344\270\252\347\275\221\346\230\223\344\272\221/resource/\346\242\246_468817106.jpg" new file mode 100644 index 0000000..f19ec8e Binary files /dev/null and "b/21\343\200\201\345\206\231\344\272\206\344\270\252\347\275\221\346\230\223\344\272\221/resource/\346\242\246_468817106.jpg" differ diff --git "a/21\343\200\201\345\206\231\344\272\206\344\270\252\347\275\221\346\230\223\344\272\221/resource/\346\260\264\346\230\237\350\256\260_441491828.jpg" "b/21\343\200\201\345\206\231\344\272\206\344\270\252\347\275\221\346\230\223\344\272\221/resource/\346\260\264\346\230\237\350\256\260_441491828.jpg" new file mode 100644 index 0000000..e2f1b59 Binary files /dev/null and "b/21\343\200\201\345\206\231\344\272\206\344\270\252\347\275\221\346\230\223\344\272\221/resource/\346\260\264\346\230\237\350\256\260_441491828.jpg" differ diff --git "a/21\343\200\201\345\206\231\344\272\206\344\270\252\347\275\221\346\230\223\344\272\221/resource/\346\261\237\346\271\226\346\231\232_475840671.jpg" "b/21\343\200\201\345\206\231\344\272\206\344\270\252\347\275\221\346\230\223\344\272\221/resource/\346\261\237\346\271\226\346\231\232_475840671.jpg" new file mode 100644 index 0000000..3a6f439 Binary files /dev/null and "b/21\343\200\201\345\206\231\344\272\206\344\270\252\347\275\221\346\230\223\344\272\221/resource/\346\261\237\346\271\226\346\231\232_475840671.jpg" differ diff --git "a/21\343\200\201\345\206\231\344\272\206\344\270\252\347\275\221\346\230\223\344\272\221/resource/\346\262\211\346\262\246\344\270\216\351\201\220\346\203\263_1492584510.jpg" "b/21\343\200\201\345\206\231\344\272\206\344\270\252\347\275\221\346\230\223\344\272\221/resource/\346\262\211\346\262\246\344\270\216\351\201\220\346\203\263_1492584510.jpg" new file mode 100644 index 0000000..422a597 Binary files /dev/null and "b/21\343\200\201\345\206\231\344\272\206\344\270\252\347\275\221\346\230\223\344\272\221/resource/\346\262\211\346\262\246\344\270\216\351\201\220\346\203\263_1492584510.jpg" differ diff --git "a/21\343\200\201\345\206\231\344\272\206\344\270\252\347\275\221\346\230\223\344\272\221/resource/\346\264\273\347\235\200_256e441e12409ad7b0b147442920f284.jpg" "b/21\343\200\201\345\206\231\344\272\206\344\270\252\347\275\221\346\230\223\344\272\221/resource/\346\264\273\347\235\200_256e441e12409ad7b0b147442920f284.jpg" new file mode 100644 index 0000000..7a756a2 --- /dev/null +++ "b/21\343\200\201\345\206\231\344\272\206\344\270\252\347\275\221\346\230\223\344\272\221/resource/\346\264\273\347\235\200_256e441e12409ad7b0b147442920f284.jpg" @@ -0,0 +1,7 @@ + + + NoSuchKey + 对象“WPdH5D4PEzC190V-ua2YrQ==/256e441e12409ad7b0b147442920f284.jpg”不存在,请指定正确的对象 + /yyimgs/WPdH5D4PEzC190V-ua2YrQ==/256e441e12409ad7b0b147442920f284.jpg + c0b78305-3638-4d13-b418-c072a604bef3 + \ No newline at end of file diff --git "a/21\343\200\201\345\206\231\344\272\206\344\270\252\347\275\221\346\230\223\344\272\221/resource/\346\265\267\345\272\225_1430583016.jpg" "b/21\343\200\201\345\206\231\344\272\206\344\270\252\347\275\221\346\230\223\344\272\221/resource/\346\265\267\345\272\225_1430583016.jpg" new file mode 100644 index 0000000..c3040bf Binary files /dev/null and "b/21\343\200\201\345\206\231\344\272\206\344\270\252\347\275\221\346\230\223\344\272\221/resource/\346\265\267\345\272\225_1430583016.jpg" differ diff --git "a/21\343\200\201\345\206\231\344\272\206\344\270\252\347\275\221\346\230\223\344\272\221/resource/\347\210\261\346\203\205\350\275\254\347\247\273_003u2qmP0Mp2pW.jpg" "b/21\343\200\201\345\206\231\344\272\206\344\270\252\347\275\221\346\230\223\344\272\221/resource/\347\210\261\346\203\205\350\275\254\347\247\273_003u2qmP0Mp2pW.jpg" new file mode 100644 index 0000000..dcac9c7 --- /dev/null +++ "b/21\343\200\201\345\206\231\344\272\206\344\270\252\347\275\221\346\230\223\344\272\221/resource/\347\210\261\346\203\205\350\275\254\347\247\273_003u2qmP0Mp2pW.jpg" @@ -0,0 +1,13 @@ + + + NoSuchKey + 对象“qbmFHekU7YxVL0L7esXKVw==/003yQidc3s7P65.jpg”不存在,请指定正确的对象 + /yyimgs/qbmFHekU7YxVL0L7esXKVw==/003yQidc3s7P65.jpg + 9a85a236-cdce-4db7-942c-46bf6881362b + + + NoSuchKey + 对象“qbmFHekU7YxVL0L7esXKVw==/003yQidc3s7P65.jpg”不存在,请指定正确的对象 + /yyimgs/qbmFHekU7YxVL0L7esXKVw==/003yQidc3s7P65.jpg + a2565b71-0f93-456c-943d-0d60d21abf6e + \ No newline at end of file diff --git "a/21\343\200\201\345\206\231\344\272\206\344\270\252\347\275\221\346\230\223\344\272\221/resource/\347\210\261\346\203\205\350\275\254\347\247\273_65536.jpg" "b/21\343\200\201\345\206\231\344\272\206\344\270\252\347\275\221\346\230\223\344\272\221/resource/\347\210\261\346\203\205\350\275\254\347\247\273_65536.jpg" new file mode 100644 index 0000000..6c80700 Binary files /dev/null and "b/21\343\200\201\345\206\231\344\272\206\344\270\252\347\275\221\346\230\223\344\272\221/resource/\347\210\261\346\203\205\350\275\254\347\247\273_65536.jpg" differ diff --git "a/21\343\200\201\345\206\231\344\272\206\344\270\252\347\275\221\346\230\223\344\272\221/resource/\347\251\272\345\247\220_470563212.jpg" "b/21\343\200\201\345\206\231\344\272\206\344\270\252\347\275\221\346\230\223\344\272\221/resource/\347\251\272\345\247\220_470563212.jpg" new file mode 100644 index 0000000..5af5a77 Binary files /dev/null and "b/21\343\200\201\345\206\231\344\272\206\344\270\252\347\275\221\346\230\223\344\272\221/resource/\347\251\272\345\247\220_470563212.jpg" differ diff --git "a/21\343\200\201\345\206\231\344\272\206\344\270\252\347\275\221\346\230\223\344\272\221/resource/\347\272\242\347\216\253\347\221\260_65533.jpg" "b/21\343\200\201\345\206\231\344\272\206\344\270\252\347\275\221\346\230\223\344\272\221/resource/\347\272\242\347\216\253\347\221\260_65533.jpg" new file mode 100644 index 0000000..6c80700 Binary files /dev/null and "b/21\343\200\201\345\206\231\344\272\206\344\270\252\347\275\221\346\230\223\344\272\221/resource/\347\272\242\347\216\253\347\221\260_65533.jpg" differ diff --git "a/21\343\200\201\345\206\231\344\272\206\344\270\252\347\275\221\346\230\223\344\272\221/resource/\347\273\231\344\275\240\345\221\200\357\274\210\345\217\210\345\220\215\357\274\232for ya\357\274\211_1497588709.jpg" "b/21\343\200\201\345\206\231\344\272\206\344\270\252\347\275\221\346\230\223\344\272\221/resource/\347\273\231\344\275\240\345\221\200\357\274\210\345\217\210\345\220\215\357\274\232for ya\357\274\211_1497588709.jpg" new file mode 100644 index 0000000..5fa4bf7 Binary files /dev/null and "b/21\343\200\201\345\206\231\344\272\206\344\270\252\347\275\221\346\230\223\344\272\221/resource/\347\273\231\344\275\240\345\221\200\357\274\210\345\217\210\345\220\215\357\274\232for ya\357\274\211_1497588709.jpg" differ diff --git "a/21\343\200\201\345\206\231\344\272\206\344\270\252\347\275\221\346\230\223\344\272\221/resource/\347\274\240\350\267\257_466257175.jpg" "b/21\343\200\201\345\206\231\344\272\206\344\270\252\347\275\221\346\230\223\344\272\221/resource/\347\274\240\350\267\257_466257175.jpg" new file mode 100644 index 0000000..77a25af Binary files /dev/null and "b/21\343\200\201\345\206\231\344\272\206\344\270\252\347\275\221\346\230\223\344\272\221/resource/\347\274\240\350\267\257_466257175.jpg" differ diff --git "a/21\343\200\201\345\206\231\344\272\206\344\270\252\347\275\221\346\230\223\344\272\221/resource/\350\212\261,\345\244\252\351\230\263,\345\275\251\350\231\271,\344\275\240_1826189041.jpg" "b/21\343\200\201\345\206\231\344\272\206\344\270\252\347\275\221\346\230\223\344\272\221/resource/\350\212\261,\345\244\252\351\230\263,\345\275\251\350\231\271,\344\275\240_1826189041.jpg" new file mode 100644 index 0000000..bf7bd70 Binary files /dev/null and "b/21\343\200\201\345\206\231\344\272\206\344\270\252\347\275\221\346\230\223\344\272\221/resource/\350\212\261,\345\244\252\351\230\263,\345\275\251\350\231\271,\344\275\240_1826189041.jpg" differ diff --git "a/21\343\200\201\345\206\231\344\272\206\344\270\252\347\275\221\346\230\223\344\272\221/resource/\350\265\267\351\243\216\344\272\206_1330348068.jpg" "b/21\343\200\201\345\206\231\344\272\206\344\270\252\347\275\221\346\230\223\344\272\221/resource/\350\265\267\351\243\216\344\272\206_1330348068.jpg" new file mode 100644 index 0000000..35aee98 Binary files /dev/null and "b/21\343\200\201\345\206\231\344\272\206\344\270\252\347\275\221\346\230\223\344\272\221/resource/\350\265\267\351\243\216\344\272\206_1330348068.jpg" differ diff --git "a/21\343\200\201\345\206\231\344\272\206\344\270\252\347\275\221\346\230\223\344\272\221/resource/\350\270\217\345\261\261\346\262\263_1804320463.jpg" "b/21\343\200\201\345\206\231\344\272\206\344\270\252\347\275\221\346\230\223\344\272\221/resource/\350\270\217\345\261\261\346\262\263_1804320463.jpg" new file mode 100644 index 0000000..fac8406 Binary files /dev/null and "b/21\343\200\201\345\206\231\344\272\206\344\270\252\347\275\221\346\230\223\344\272\221/resource/\350\270\217\345\261\261\346\262\263_1804320463.jpg" differ diff --git "a/21\343\200\201\345\206\231\344\272\206\344\270\252\347\275\221\346\230\223\344\272\221/resource/\350\277\230\346\230\257\344\274\232\346\203\263\344\275\240_1827600686.jpg" "b/21\343\200\201\345\206\231\344\272\206\344\270\252\347\275\221\346\230\223\344\272\221/resource/\350\277\230\346\230\257\344\274\232\346\203\263\344\275\240_1827600686.jpg" new file mode 100644 index 0000000..a545e37 Binary files /dev/null and "b/21\343\200\201\345\206\231\344\272\206\344\270\252\347\275\221\346\230\223\344\272\221/resource/\350\277\230\346\230\257\344\274\232\346\203\263\344\275\240_1827600686.jpg" differ diff --git "a/21\343\200\201\345\206\231\344\272\206\344\270\252\347\275\221\346\230\223\344\272\221/resource/\350\277\230\346\230\257\345\210\206\345\274\200_465921195.jpg" "b/21\343\200\201\345\206\231\344\272\206\344\270\252\347\275\221\346\230\223\344\272\221/resource/\350\277\230\346\230\257\345\210\206\345\274\200_465921195.jpg" new file mode 100644 index 0000000..fcd2e3b Binary files /dev/null and "b/21\343\200\201\345\206\231\344\272\206\344\270\252\347\275\221\346\230\223\344\272\221/resource/\350\277\230\346\230\257\345\210\206\345\274\200_465921195.jpg" differ diff --git "a/21\343\200\201\345\206\231\344\272\206\344\270\252\347\275\221\346\230\223\344\272\221/resource/\350\277\231\344\270\226\347\225\214\351\202\243\344\271\210\345\244\232\344\272\272_1842025914.jpg" "b/21\343\200\201\345\206\231\344\272\206\344\270\252\347\275\221\346\230\223\344\272\221/resource/\350\277\231\344\270\226\347\225\214\351\202\243\344\271\210\345\244\232\344\272\272_1842025914.jpg" new file mode 100644 index 0000000..f00339b Binary files /dev/null and "b/21\343\200\201\345\206\231\344\272\206\344\270\252\347\275\221\346\230\223\344\272\221/resource/\350\277\231\344\270\226\347\225\214\351\202\243\344\271\210\345\244\232\344\272\272_1842025914.jpg" differ diff --git "a/21\343\200\201\345\206\231\344\272\206\344\270\252\347\275\221\346\230\223\344\272\221/resource/\350\277\234\346\226\271 (\347\273\204\346\233\262)_437608504.jpg" "b/21\343\200\201\345\206\231\344\272\206\344\270\252\347\275\221\346\230\223\344\272\221/resource/\350\277\234\346\226\271 (\347\273\204\346\233\262)_437608504.jpg" new file mode 100644 index 0000000..218e2fd Binary files /dev/null and "b/21\343\200\201\345\206\231\344\272\206\344\270\252\347\275\221\346\230\223\344\272\221/resource/\350\277\234\346\226\271 (\347\273\204\346\233\262)_437608504.jpg" differ diff --git "a/21\343\200\201\345\206\231\344\272\206\344\270\252\347\275\221\346\230\223\344\272\221/resource/\350\277\275\346\242\246\347\232\204\350\267\257_449578710.jpg" "b/21\343\200\201\345\206\231\344\272\206\344\270\252\347\275\221\346\230\223\344\272\221/resource/\350\277\275\346\242\246\347\232\204\350\267\257_449578710.jpg" new file mode 100644 index 0000000..6c34da5 Binary files /dev/null and "b/21\343\200\201\345\206\231\344\272\206\344\270\252\347\275\221\346\230\223\344\272\221/resource/\350\277\275\346\242\246\347\232\204\350\267\257_449578710.jpg" differ diff --git "a/21\343\200\201\345\206\231\344\272\206\344\270\252\347\275\221\346\230\223\344\272\221/resource/\351\202\243\345\271\264\302\267\345\271\264\345\260\221_1495131163.jpg" "b/21\343\200\201\345\206\231\344\272\206\344\270\252\347\275\221\346\230\223\344\272\221/resource/\351\202\243\345\271\264\302\267\345\271\264\345\260\221_1495131163.jpg" new file mode 100644 index 0000000..6dcce46 Binary files /dev/null and "b/21\343\200\201\345\206\231\344\272\206\344\270\252\347\275\221\346\230\223\344\272\221/resource/\351\202\243\345\271\264\302\267\345\271\264\345\260\221_1495131163.jpg" differ diff --git "a/21\343\200\201\345\206\231\344\272\206\344\270\252\347\275\221\346\230\223\344\272\221/resource/\351\230\277\346\213\211\346\226\257\345\212\240\346\265\267\346\271\276_1500569811.jpg" "b/21\343\200\201\345\206\231\344\272\206\344\270\252\347\275\221\346\230\223\344\272\221/resource/\351\230\277\346\213\211\346\226\257\345\212\240\346\265\267\346\271\276_1500569811.jpg" new file mode 100644 index 0000000..3d8d991 Binary files /dev/null and "b/21\343\200\201\345\206\231\344\272\206\344\270\252\347\275\221\346\230\223\344\272\221/resource/\351\230\277\346\213\211\346\226\257\345\212\240\346\265\267\346\271\276_1500569811.jpg" differ diff --git "a/21\343\200\201\345\206\231\344\272\206\344\270\252\347\275\221\346\230\223\344\272\221/resource/\351\233\276\351\207\214_1815085049.jpg" "b/21\343\200\201\345\206\231\344\272\206\344\270\252\347\275\221\346\230\223\344\272\221/resource/\351\233\276\351\207\214_1815085049.jpg" new file mode 100644 index 0000000..ce0d2c8 Binary files /dev/null and "b/21\343\200\201\345\206\231\344\272\206\344\270\252\347\275\221\346\230\223\344\272\221/resource/\351\233\276\351\207\214_1815085049.jpg" differ diff --git "a/21\343\200\201\345\206\231\344\272\206\344\270\252\347\275\221\346\230\223\344\272\221/resource/\351\243\216\345\220\271\344\270\200\345\244\217_1851258433.jpg" "b/21\343\200\201\345\206\231\344\272\206\344\270\252\347\275\221\346\230\223\344\272\221/resource/\351\243\216\345\220\271\344\270\200\345\244\217_1851258433.jpg" new file mode 100644 index 0000000..c976174 Binary files /dev/null and "b/21\343\200\201\345\206\231\344\272\206\344\270\252\347\275\221\346\230\223\344\272\221/resource/\351\243\216\345\220\271\344\270\200\345\244\217_1851258433.jpg" differ diff --git "a/21\343\200\201\345\206\231\344\272\206\344\270\252\347\275\221\346\230\223\344\272\221/resource/\351\272\273\347\203\246\344\275\240_463840563.jpg" "b/21\343\200\201\345\206\231\344\272\206\344\270\252\347\275\221\346\230\223\344\272\221/resource/\351\272\273\347\203\246\344\275\240_463840563.jpg" new file mode 100644 index 0000000..adb8a83 Binary files /dev/null and "b/21\343\200\201\345\206\231\344\272\206\344\270\252\347\275\221\346\230\223\344\272\221/resource/\351\272\273\347\203\246\344\275\240_463840563.jpg" differ diff --git "a/21\343\200\201\345\206\231\344\272\206\344\270\252\347\275\221\346\230\223\344\272\221/setting/SystemVariables.py" "b/21\343\200\201\345\206\231\344\272\206\344\270\252\347\275\221\346\230\223\344\272\221/setting/SystemVariables.py" new file mode 100644 index 0000000..dfea76b --- /dev/null +++ "b/21\343\200\201\345\206\231\344\272\206\344\270\252\347\275\221\346\230\223\344\272\221/setting/SystemVariables.py" @@ -0,0 +1,14 @@ +# Python电子书:http://t.cn/A6tMNzuI +# Python交流群:http://t.cn/A65MiFvH +# 系统变量 +class SystemVariables: + + def __init__(self): + # 音乐播放器默认封面 + self.MUSIC_COVER_URL = 'http://p1.music.126.net/pSEHaYQA2pWbc30Rrr3ayA==/109951165363002796.jpg' + self.MUSIC_COVER_PATH = None + + self.MUSIC_DOWNLOAD_PATH = 'E:\作业' + + +variables = SystemVariables() diff --git "a/21\343\200\201\345\206\231\344\272\206\344\270\252\347\275\221\346\230\223\344\272\221/setting/__init__.py" "b/21\343\200\201\345\206\231\344\272\206\344\270\252\347\275\221\346\230\223\344\272\221/setting/__init__.py" new file mode 100644 index 0000000..eabf991 --- /dev/null +++ "b/21\343\200\201\345\206\231\344\272\206\344\270\252\347\275\221\346\230\223\344\272\221/setting/__init__.py" @@ -0,0 +1,2 @@ +# Python电子书:http://t.cn/A6tMNzuI +# Python交流群:http://t.cn/A65MiFvH diff --git "a/21\343\200\201\345\206\231\344\272\206\344\270\252\347\275\221\346\230\223\344\272\221/spider/Download.py" "b/21\343\200\201\345\206\231\344\272\206\344\270\252\347\275\221\346\230\223\344\272\221/spider/Download.py" new file mode 100644 index 0000000..ac380df --- /dev/null +++ "b/21\343\200\201\345\206\231\344\272\206\344\270\252\347\275\221\346\230\223\344\272\221/spider/Download.py" @@ -0,0 +1,26 @@ +# Python电子书:http://t.cn/A6tMNzuI +# Python交流群:http://t.cn/A65MiFvH +# 下载 +import os +import re + +import requests + + +def download(url, path, name): + res = requests.get(url) + suffix = re.findall('(jpg|png)', url)[0] + way = path + os.sep + name + '.' + suffix + with open(way, 'ab') as file: + file.write(res.content) + file.flush() + return way + + +def downloadMusic(url, path, name, suffix='mp3'): + res = requests.get(url) + way = path + os.sep + name + '.' + suffix + with open(way, 'ab') as file: + file.write(res.content) + file.flush() + return way diff --git "a/21\343\200\201\345\206\231\344\272\206\344\270\252\347\275\221\346\230\223\344\272\221/spider/ListIds.py" "b/21\343\200\201\345\206\231\344\272\206\344\270\252\347\275\221\346\230\223\344\272\221/spider/ListIds.py" new file mode 100644 index 0000000..cd5d5d8 --- /dev/null +++ "b/21\343\200\201\345\206\231\344\272\206\344\270\252\347\275\221\346\230\223\344\272\221/spider/ListIds.py" @@ -0,0 +1,28 @@ +# Python电子书:http://t.cn/A6tMNzuI +# Python交流群:http://t.cn/A65MiFvH +# 音乐榜单配置 +from enum import Enum, unique + + +# 热歌榜 3778678 +# 新歌榜 3779629 +# 飙升榜 19723756 +# 清酒踏月 3174582381 +# 华语金曲榜 4395559 +# 中国TOP排行榜(内地榜) 64016 +# 中国TOP排行榜(港台榜) 112504 +# 原创榜 2884035 +# 随机 2884037 + +# 榜单id +@unique +class ListIds(Enum): + HOT = 3778678 + NEW = 3779629 + SOAR = 19723756 + WINE = 3174582381 + GOLD = 4395559 + MAINLAND = 64016 + HKAT = 112504 + ORIGIN = 2884035 + RANDOM = 2884037 diff --git "a/21\343\200\201\345\206\231\344\272\206\344\270\252\347\275\221\346\230\223\344\272\221/spider/MusicDataSource.py" "b/21\343\200\201\345\206\231\344\272\206\344\270\252\347\275\221\346\230\223\344\272\221/spider/MusicDataSource.py" new file mode 100644 index 0000000..0dcb25c --- /dev/null +++ "b/21\343\200\201\345\206\231\344\272\206\344\270\252\347\275\221\346\230\223\344\272\221/spider/MusicDataSource.py" @@ -0,0 +1,43 @@ +# Python电子书:http://t.cn/A6tMNzuI +# Python交流群:http://t.cn/A65MiFvH +# 旧版拉取数据 当时我还太天真... +from spider.Source import Source +from spider.api import getMusicUrl, getMusicPic, getMusicLyric + + +class MusicDataSource(): + keyword = '' + + def __init__(self, count=1): + self.count = count + self.pages = 1 + pass + + def __searchMusicListResolver(self, source): + recodes = [] + list = searchMusicList(self.count, source, self.pages, self.keyword) + for item in list: + recode = {} + recode['name'] = item.get('name') + recode['artist'] = item.get('artist') + recode['album'] = item.get('album') + recode['url'] = getMusicUrl(item.get('id'), source).get('url') + recode['avatar'] = getMusicPic(item.get('pic_id'), source).get('url') + recode['lyric'] = getMusicLyric(item.get('lyric_id'), source).get('lyric') + recodes.append(recode) + return recodes + + def __summaryMusicList(self): + resultSet = [] + for item in Source: + resultSet += self.__searchMusicListResolver(item.value) + return resultSet + + def getMusicList(self, keyword): + self.pages = 1 + self.keyword = keyword + return self.__summaryMusicList() + + def getNext(self): + self.pages = self.pages + 1 + return self.__summaryMusicList() diff --git "a/21\343\200\201\345\206\231\344\272\206\344\270\252\347\275\221\346\230\223\344\272\221/spider/Source.py" "b/21\343\200\201\345\206\231\344\272\206\344\270\252\347\275\221\346\230\223\344\272\221/spider/Source.py" new file mode 100644 index 0000000..5622952 --- /dev/null +++ "b/21\343\200\201\345\206\231\344\272\206\344\270\252\347\275\221\346\230\223\344\272\221/spider/Source.py" @@ -0,0 +1,13 @@ +# Python电子书:http://t.cn/A6tMNzuI +# Python交流群:http://t.cn/A65MiFvH +# 数据源配置 +from enum import Enum, unique + + +@unique +class Source(Enum): + Netease_Cloud_Music = 'netease' + QQ_Music = 'tencent' + # Migu_Music = 'migu' + KuGou_Music = 'kugou' + # Baidu_Music = 'baidu' diff --git "a/21\343\200\201\345\206\231\344\272\206\344\270\252\347\275\221\346\230\223\344\272\221/spider/__init__.py" "b/21\343\200\201\345\206\231\344\272\206\344\270\252\347\275\221\346\230\223\344\272\221/spider/__init__.py" new file mode 100644 index 0000000..eabf991 --- /dev/null +++ "b/21\343\200\201\345\206\231\344\272\206\344\270\252\347\275\221\346\230\223\344\272\221/spider/__init__.py" @@ -0,0 +1,2 @@ +# Python电子书:http://t.cn/A6tMNzuI +# Python交流群:http://t.cn/A65MiFvH diff --git "a/21\343\200\201\345\206\231\344\272\206\344\270\252\347\275\221\346\230\223\344\272\221/spider/api.py" "b/21\343\200\201\345\206\231\344\272\206\344\270\252\347\275\221\346\230\223\344\272\221/spider/api.py" new file mode 100644 index 0000000..c1a6f74 --- /dev/null +++ "b/21\343\200\201\345\206\231\344\272\206\344\270\252\347\275\221\346\230\223\344\272\221/spider/api.py" @@ -0,0 +1,53 @@ +# Python电子书:http://t.cn/A6tMNzuI +# Python交流群:http://t.cn/A65MiFvH +from spider.Source import Source +from spider.req import req +import json + +URL = 'api.php' + + +# count 每页数据条数 +# source 音乐数据源 +# pages 当前页 +# keyword 查找关键字 +# 获取歌曲清单 +def getMusicListByKeyword(count, source, pages, keyword): + params = {'types': 'search', 'count': count, 'source': source, 'pages': pages, 'name': keyword} + r = req("POST", URL, params) + if r != None: + return json.loads(r.text) + else: + return [] + + +# 获取音乐url +def getMusicUrl(id, source): + params = {'types': 'url', 'id': id, 'source': source} + r = req("POST", URL, params) + if r != None: + result = json.loads(r.text) + return result + else: + return None + + +# 获取音乐封面图 +def getMusicPic(picId, source): + params = {'types': 'pic', 'id': picId, 'source': source} + r = req("POST", URL, params) + return json.loads(r.text) + + +# 获取歌词 +def getMusicLyric(lyricId, source): + params = {'types': 'lyric', 'id': lyricId, 'source': source} + r = req("POST", URL, params) + return json.loads(r.text) + + +# 根据榜单id爬取榜单歌曲 +def getMusicListById(id): + params = {'types': 'playlist', 'id': id} + r = req("POST", URL, params) + return json.loads(r.text) diff --git "a/21\343\200\201\345\206\231\344\272\206\344\270\252\347\275\221\346\230\223\344\272\221/spider/req.py" "b/21\343\200\201\345\206\231\344\272\206\344\270\252\347\275\221\346\230\223\344\272\221/spider/req.py" new file mode 100644 index 0000000..40b8d97 --- /dev/null +++ "b/21\343\200\201\345\206\231\344\272\206\344\270\252\347\275\221\346\230\223\344\272\221/spider/req.py" @@ -0,0 +1,23 @@ +# Python电子书:http://t.cn/A6tMNzuI +# Python交流群:http://t.cn/A65MiFvH +import requests +from datetime import datetime + +# 配置参数 +# 协议 +scheme = 'http' +# 主机地址 +host = 'kxyy.ledu360.com' +# 请求头 +headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:89.0) Gecko/20100101 Firefox/89.0'} + +timeout = 3 + + +def req(method, url, params): + try: + return requests.request(method, scheme + "://" + host + "/" + url, headers=headers, params=params, + timeout=timeout) + except: + print("时间:", str(datetime.now()), "---> 请求" + url + " 超时!", "数据源为:" + params['source']) + return None diff --git "a/24\343\200\201\344\275\277\347\224\250TinyDB\345\222\214pyecharts\357\274\214\345\256\236\347\216\260\345\212\250\346\200\201\346\225\260\346\215\256\345\217\257\350\247\206\345\214\226/city_fly.json" "b/24\343\200\201\344\275\277\347\224\250TinyDB\345\222\214pyecharts\357\274\214\345\256\236\347\216\260\345\212\250\346\200\201\346\225\260\346\215\256\345\217\257\350\247\206\345\214\226/city_fly.json" new file mode 100644 index 0000000..e3e7222 --- /dev/null +++ "b/24\343\200\201\344\275\277\347\224\250TinyDB\345\222\214pyecharts\357\274\214\345\256\236\347\216\260\345\212\250\346\200\201\346\225\260\346\215\256\345\217\257\350\247\206\345\214\226/city_fly.json" @@ -0,0 +1 @@ +{"city_index": {"1": {"city": "\u5e7f\u5dde", "index": 55}, "2": {"city": "\u5317\u4eac", "index": 66}, "3": {"city": "\u676d\u5dde", "index": 77}, "4": {"city": "\u91cd\u5e86", "index": 88}}, "city_line": {"1": {"from": "\u5e7f\u5dde", "to": "\u4e0a\u6d77"}, "2": {"from": "\u5e7f\u5dde", "to": "\u5317\u4eac"}, "3": {"from": "\u5e7f\u5dde", "to": "\u676d\u5dde"}, "4": {"from": "\u5e7f\u5dde", "to": "\u91cd\u5e86"}}} \ No newline at end of file diff --git "a/24\343\200\201\344\275\277\347\224\250TinyDB\345\222\214pyecharts\357\274\214\345\256\236\347\216\260\345\212\250\346\200\201\346\225\260\346\215\256\345\217\257\350\247\206\345\214\226/create_chart.py" "b/24\343\200\201\344\275\277\347\224\250TinyDB\345\222\214pyecharts\357\274\214\345\256\236\347\216\260\345\212\250\346\200\201\346\225\260\346\215\256\345\217\257\350\247\206\345\214\226/create_chart.py" new file mode 100644 index 0000000..df5289f --- /dev/null +++ "b/24\343\200\201\344\275\277\347\224\250TinyDB\345\222\214pyecharts\357\274\214\345\256\236\347\216\260\345\212\250\346\200\201\346\225\260\346\215\256\345\217\257\350\247\206\345\214\226/create_chart.py" @@ -0,0 +1,59 @@ +# -*- coding: UTF-8 -*- +''' +@Author :程序员晚枫,B站/抖音/微博/小红书/公众号 +@WeChat :CoderWanFeng +@Blog :www.python-office.com +@Date :2022/12/28 21:03 +@Description : +''' +import webbrowser + +from pyecharts import options as opts +from pyecharts.charts import Geo +from pyecharts.globals import ChartType, SymbolType + +from tinydb import TinyDB +from potime import RunTime + +@RunTime +def create_html(html_name): + db = TinyDB('./city_fly.json') + + ci_t = db.table('city_index') + ci_l = db.table('city_line') + + c = ( + Geo() + .add_schema( + maptype="china", + itemstyle_opts=opts.ItemStyleOpts(color="#323c48", border_color="#111"), + ) + .add( + "", + [(cit['city'], cit['index']) for cit in ci_t.all()], + type_=ChartType.EFFECT_SCATTER, + color="white", + ) + .add( + "geo", + [(cit['from'], cit['to']) for cit in ci_l.all()], + type_=ChartType.LINES, + effect_opts=opts.EffectOpts( + symbol=SymbolType.ARROW, symbol_size=6, color="blue" + ), + linestyle_opts=opts.LineStyleOpts(curve=0.2), + ) + .set_series_opts(label_opts=opts.LabelOpts(is_show=False)) + .set_global_opts(title_opts=opts.TitleOpts(title="Geo-Lines-background")) + .render(html_name) + ) + +@RunTime +def open_html(html_name): + webbrowser.open(html_name) + + +if __name__ == '__main__': + html_name = 'geo_lines_background.html' + create_html(html_name) + open_html(html_name) diff --git "a/24\343\200\201\344\275\277\347\224\250TinyDB\345\222\214pyecharts\357\274\214\345\256\236\347\216\260\345\212\250\346\200\201\346\225\260\346\215\256\345\217\257\350\247\206\345\214\226/create_data.py" "b/24\343\200\201\344\275\277\347\224\250TinyDB\345\222\214pyecharts\357\274\214\345\256\236\347\216\260\345\212\250\346\200\201\346\225\260\346\215\256\345\217\257\350\247\206\345\214\226/create_data.py" new file mode 100644 index 0000000..ab1f68c --- /dev/null +++ "b/24\343\200\201\344\275\277\347\224\250TinyDB\345\222\214pyecharts\357\274\214\345\256\236\347\216\260\345\212\250\346\200\201\346\225\260\346\215\256\345\217\257\350\247\206\345\214\226/create_data.py" @@ -0,0 +1,31 @@ +# -*- coding: UTF-8 -*- +''' +@Author :程序员晚枫,B站/抖音/微博/小红书/公众号 +@WeChat :CoderWanFeng +@Blog :www.python-office.com +@Date :2022/12/28 21:03 +@Description : +''' +from tinydb import TinyDB +from potime import RunTime + +@RunTime +def create_data(): + + db = TinyDB('./city_fly.json') + + ci_t = db.table('city_index') + ci_t.insert({'city': '广州', 'index': 55}) + ci_t.insert({'city': '北京', 'index': 66}) + ci_t.insert({'city': '杭州', 'index': 77}) + ci_t.insert({'city': '重庆', 'index': 88}) + + ci_l = db.table('city_line') + ci_l.insert({'from': '广州', 'to': '上海'}) + ci_l.insert({'from': '广州', 'to': '北京'}) + ci_l.insert({'from': '广州', 'to': '杭州'}) + ci_l.insert({'from': '广州', 'to': '重庆'}) + + +if __name__ == '__main__': + create_data() \ No newline at end of file diff --git "a/24\343\200\201\344\275\277\347\224\250TinyDB\345\222\214pyecharts\357\274\214\345\256\236\347\216\260\345\212\250\346\200\201\346\225\260\346\215\256\345\217\257\350\247\206\345\214\226/geo_lines_background.html" "b/24\343\200\201\344\275\277\347\224\250TinyDB\345\222\214pyecharts\357\274\214\345\256\236\347\216\260\345\212\250\346\200\201\346\225\260\346\215\256\345\217\257\350\247\206\345\214\226/geo_lines_background.html" new file mode 100644 index 0000000..b89841d --- /dev/null +++ "b/24\343\200\201\344\275\277\347\224\250TinyDB\345\222\214pyecharts\357\274\214\345\256\236\347\216\260\345\212\250\346\200\201\346\225\260\346\215\256\345\217\257\350\247\206\345\214\226/geo_lines_background.html" @@ -0,0 +1,259 @@ + + + + + Awesome-pyecharts + + + + + +
+ + + diff --git "a/25\343\200\201\347\224\250Python\345\210\266\344\275\234\344\272\214\347\273\264\347\240\201/001.py" "b/25\343\200\201\347\224\250Python\345\210\266\344\275\234\344\272\214\347\273\264\347\240\201/001.py" new file mode 100644 index 0000000..5c066c5 --- /dev/null +++ "b/25\343\200\201\347\224\250Python\345\210\266\344\275\234\344\272\214\347\273\264\347\240\201/001.py" @@ -0,0 +1,13 @@ +# -*- coding: UTF-8 -*- +''' +@Author :程序员晚枫,B站/抖音/微博/小红书/公众号 +@WeChat :CoderWanFeng +@Blog :www.python-office.com +@Date :2022/12/28 20:58 +@Description : +''' + +import segno + +price_tag = segno.make("https://mp.weixin.qq.com/s/BRBAJLruGGofgpntwywTGA") +price_tag.save("Price Tag.png") \ No newline at end of file diff --git "a/25\343\200\201\347\224\250Python\345\210\266\344\275\234\344\272\214\347\273\264\347\240\201/002.py" "b/25\343\200\201\347\224\250Python\345\210\266\344\275\234\344\272\214\347\273\264\347\240\201/002.py" new file mode 100644 index 0000000..a519812 --- /dev/null +++ "b/25\343\200\201\347\224\250Python\345\210\266\344\275\234\344\272\214\347\273\264\347\240\201/002.py" @@ -0,0 +1,13 @@ +# -*- coding: UTF-8 -*- +''' +@Author :程序员晚枫,B站/抖音/微博/小红书/公众号 +@WeChat :CoderWanFeng +@Blog :www.python-office.com +@Date :2022/12/28 21:02 +@Description : +''' + +import segno + +video = segno.make('http://t.cn/A6K3NfvL') +video.save('Video.png', scale=4) \ No newline at end of file diff --git "a/25\343\200\201\347\224\250Python\345\210\266\344\275\234\344\272\214\347\273\264\347\240\201/003.py" "b/25\343\200\201\347\224\250Python\345\210\266\344\275\234\344\272\214\347\273\264\347\240\201/003.py" new file mode 100644 index 0000000..f309105 --- /dev/null +++ "b/25\343\200\201\347\224\250Python\345\210\266\344\275\234\344\272\214\347\273\264\347\240\201/003.py" @@ -0,0 +1,13 @@ +# -*- coding: UTF-8 -*- +''' +@Author :程序员晚枫,B站/抖音/微博/小红书/公众号 +@WeChat :CoderWanFeng +@Blog :www.python-office.com +@Date :2022/12/28 21:03 +@Description : +''' + +import segno + +piet = segno.make('http://t.cn/A6K3NfvL', error='h') +piet.to_artistic(background="background.png", target='Piet.png', scale=16) \ No newline at end of file diff --git "a/25\343\200\201\347\224\250Python\345\210\266\344\275\234\344\272\214\347\273\264\347\240\201/Price Tag.png" "b/25\343\200\201\347\224\250Python\345\210\266\344\275\234\344\272\214\347\273\264\347\240\201/Price Tag.png" new file mode 100644 index 0000000..7c3169d Binary files /dev/null and "b/25\343\200\201\347\224\250Python\345\210\266\344\275\234\344\272\214\347\273\264\347\240\201/Price Tag.png" differ diff --git "a/25\343\200\201\347\224\250Python\345\210\266\344\275\234\344\272\214\347\273\264\347\240\201/Video.png" "b/25\343\200\201\347\224\250Python\345\210\266\344\275\234\344\272\214\347\273\264\347\240\201/Video.png" new file mode 100644 index 0000000..66ed3b7 Binary files /dev/null and "b/25\343\200\201\347\224\250Python\345\210\266\344\275\234\344\272\214\347\273\264\347\240\201/Video.png" differ diff --git "a/26\343\200\201\350\257\267\345\201\207\346\235\241/main.py" "b/26\343\200\201\350\257\267\345\201\207\346\235\241/main.py" new file mode 100644 index 0000000..e1bcc89 --- /dev/null +++ "b/26\343\200\201\350\257\267\345\201\207\346\235\241/main.py" @@ -0,0 +1,89 @@ +# -*- coding: UTF-8 -*- +''' +@Author :程序员晚枫,B站/抖音/微博/小红书/公众号 +@WeChat :CoderWanFeng +@Blog :www.python-office.com +@Date :2022/12/30 10:57 +@Description : +''' +from docx import Document +# 飞件涉及显落样式修改 +from docx.enum.text import WD_PARAGRAPH_ALIGNMENT +# 文件造及文字样式修改,领色修改、字号调整 +from docx.shared import RGBColor, Pt +# 设置中文字体 +from docx.oxml.ns import qn +from openpyxl import load_workbook +from potime import RunTime + + +@RunTime +def request_for_leave_wanfeng(name, department, reason, days, date): + doc = Document() + heading_1 = '请假条' + paragraph_1 = doc.add_heading(heading_1, level=1) # 居中对芳 + paragraph_1.alignment = WD_PARAGRAPH_ALIGNMENT.CENTER # 标题要打,单独修改教大字号 + for run in paragraph_1.runs: + run.font.size = Pt(17) + word_1 = " 本人" + word_2 = ",所在部门" + word_3 = ",由于" + word_4 = ",需请假" + word_5 = "天。" + + paragraph_3_python_office = doc.add_paragraph() + paragraph_3_python_office.add_run(word_1) + paragraph_3_python_office.add_run(name).underline = True + paragraph_3_python_office.add_run(word_2) + paragraph_3_python_office.add_run(department).underline = True + paragraph_3_python_office.add_run(word_3) + paragraph_3_python_office.add_run(reason).underline = True + paragraph_3_python_office.add_run(word_4) + paragraph_3_python_office.add_run(str(days)).underline = True + paragraph_3_python_office.add_run(word_5) + # 设置下划线 + paragraph_3_python_office.paragraph_format.line_spacing = 1.5 + word_6 = '申请人:' + paragraph_4_python4office_cn = doc.add_paragraph() + paragraph_4_python4office_cn.add_run(word_6) + paragraph_4_python4office_cn.add_run(name).underline = True + paragraph_4_python4office_cn.alignment = WD_PARAGRAPH_ALIGNMENT.RIGHT + + word_7 = '日期:' + sign_date = "{}年{}月{}日".format(date.split('-')[0], date.split('-')[1], date.split('-')[2]) + paragraph_5_python_office_com = doc.add_paragraph() + paragraph_5_python_office_com.add_run(word_7) + paragraph_5_python_office_com.add_run(sign_date).underline = True + paragraph_5_python_office_com.alignment = WD_PARAGRAPH_ALIGNMENT.RIGHT + for paragraph in doc.paragraphs: + for run in paragraph.runs: + # 统一修改颜色 + run.font.color.rgb = RGBColor(0, 0, 0) + run.font.name = '楷体' + r = run._element.rPr.rFonts + r.set(qn('w:eastAsia'), '楷体') + + doc.save(r".\res\{}-请假条.docx".format(name)) + + +@RunTime +def read_excel_python_office(): + path = r'晚枫的Excel员工文件.xlsx' # 路径为Excel 北件所在的位置,可按实际待况更改 + workbook = load_workbook(path) + sheet = workbook.active + n = 0 + for row in sheet.rows: + if n: + name = row[0].value + department = row[1].value + reason = row[2].value + days = row[3].value + date = str(row[4].value).split()[0] + print(date) + if date != 'None': + request_for_leave_wanfeng(name, department, reason, days, date) + n += 1 + + +if __name__ == '__main__': + read_excel_python_office() diff --git "a/26\343\200\201\350\257\267\345\201\207\346\235\241/python-office/\345\260\217\346\230\216-\350\257\267\345\201\207\346\235\241.docx" "b/26\343\200\201\350\257\267\345\201\207\346\235\241/python-office/\345\260\217\346\230\216-\350\257\267\345\201\207\346\235\241.docx" new file mode 100644 index 0000000..57c86ee Binary files /dev/null and "b/26\343\200\201\350\257\267\345\201\207\346\235\241/python-office/\345\260\217\346\230\216-\350\257\267\345\201\207\346\235\241.docx" differ diff --git "a/26\343\200\201\350\257\267\345\201\207\346\235\241/python-office/\347\250\213\345\272\217\345\221\230\346\231\232\346\236\253-\350\257\267\345\201\207\346\235\241.docx" "b/26\343\200\201\350\257\267\345\201\207\346\235\241/python-office/\347\250\213\345\272\217\345\221\230\346\231\232\346\236\253-\350\257\267\345\201\207\346\235\241.docx" new file mode 100644 index 0000000..6784787 Binary files /dev/null and "b/26\343\200\201\350\257\267\345\201\207\346\235\241/python-office/\347\250\213\345\272\217\345\221\230\346\231\232\346\236\253-\350\257\267\345\201\207\346\235\241.docx" differ diff --git "a/26\343\200\201\350\257\267\345\201\207\346\235\241/python-office/\351\251\254\344\272\221-\350\257\267\345\201\207\346\235\241.docx" "b/26\343\200\201\350\257\267\345\201\207\346\235\241/python-office/\351\251\254\344\272\221-\350\257\267\345\201\207\346\235\241.docx" new file mode 100644 index 0000000..06d32c5 Binary files /dev/null and "b/26\343\200\201\350\257\267\345\201\207\346\235\241/python-office/\351\251\254\344\272\221-\350\257\267\345\201\207\346\235\241.docx" differ diff --git "a/26\343\200\201\350\257\267\345\201\207\346\235\241/\346\231\232\346\236\253\347\232\204Excel\345\221\230\345\267\245\346\226\207\344\273\266.xlsx" "b/26\343\200\201\350\257\267\345\201\207\346\235\241/\346\231\232\346\236\253\347\232\204Excel\345\221\230\345\267\245\346\226\207\344\273\266.xlsx" new file mode 100644 index 0000000..b625c23 Binary files /dev/null and "b/26\343\200\201\350\257\267\345\201\207\346\235\241/\346\231\232\346\236\253\347\232\204Excel\345\221\230\345\267\245\346\226\207\344\273\266.xlsx" differ diff --git "a/2\343\200\201Python+Django\345\256\236\347\216\260\345\237\272\344\272\216\344\272\272\350\204\270\350\257\206\345\210\253\347\232\204\351\227\250\347\246\201\347\256\241\347\220\206\347\263\273\347\273\237\343\200\220\346\272\220\347\240\201\343\200\221/README.md" "b/2\343\200\201Python+Django\345\256\236\347\216\260\345\237\272\344\272\216\344\272\272\350\204\270\350\257\206\345\210\253\347\232\204\351\227\250\347\246\201\347\256\241\347\220\206\347\263\273\347\273\237\343\200\220\346\272\220\347\240\201\343\200\221/README.md" new file mode 100644 index 0000000..9f54735 --- /dev/null +++ "b/2\343\200\201Python+Django\345\256\236\347\216\260\345\237\272\344\272\216\344\272\272\350\204\270\350\257\206\345\210\253\347\232\204\351\227\250\347\246\201\347\256\241\347\220\206\347\263\273\347\273\237\343\200\220\346\272\220\347\240\201\343\200\221/README.md" @@ -0,0 +1,12 @@ +# 系统说明 + +链接:https://mp.weixin.qq.com/s/98X3nl-elyi7MYsU_uCeqA + +# 百度云 + +因为本项目的源码过大,因此放在百度云盘 + +链接:https://pan.baidu.com/s/1ByL6j-08oiuWfFb_MRPRog?pwd=0qzw + +提取码:0qzw + diff --git a/flask/apps/models.py "b/3\343\200\201\347\224\250Python\345\256\236\347\216\260\344\270\200\344\270\252\345\225\206\345\234\272\347\256\241\347\220\206\347\263\273\347\273\237(\351\231\204\346\272\220\347\240\201)/Django+Mysql+Bulma\345\256\236\347\216\260\347\232\204\345\225\206\345\234\272\347\256\241\347\220\206\347\263\273\347\273\237\346\272\220\347\240\201/shopping-mall-master/mall/__init__.py" similarity index 100% rename from flask/apps/models.py rename to "3\343\200\201\347\224\250Python\345\256\236\347\216\260\344\270\200\344\270\252\345\225\206\345\234\272\347\256\241\347\220\206\347\263\273\347\273\237(\351\231\204\346\272\220\347\240\201)/Django+Mysql+Bulma\345\256\236\347\216\260\347\232\204\345\225\206\345\234\272\347\256\241\347\220\206\347\263\273\347\273\237\346\272\220\347\240\201/shopping-mall-master/mall/__init__.py" diff --git "a/3\343\200\201\347\224\250Python\345\256\236\347\216\260\344\270\200\344\270\252\345\225\206\345\234\272\347\256\241\347\220\206\347\263\273\347\273\237(\351\231\204\346\272\220\347\240\201)/Django+Mysql+Bulma\345\256\236\347\216\260\347\232\204\345\225\206\345\234\272\347\256\241\347\220\206\347\263\273\347\273\237\346\272\220\347\240\201/shopping-mall-master/mall/admin.py" "b/3\343\200\201\347\224\250Python\345\256\236\347\216\260\344\270\200\344\270\252\345\225\206\345\234\272\347\256\241\347\220\206\347\263\273\347\273\237(\351\231\204\346\272\220\347\240\201)/Django+Mysql+Bulma\345\256\236\347\216\260\347\232\204\345\225\206\345\234\272\347\256\241\347\220\206\347\263\273\347\273\237\346\272\220\347\240\201/shopping-mall-master/mall/admin.py" new file mode 100644 index 0000000..8c38f3f --- /dev/null +++ "b/3\343\200\201\347\224\250Python\345\256\236\347\216\260\344\270\200\344\270\252\345\225\206\345\234\272\347\256\241\347\220\206\347\263\273\347\273\237(\351\231\204\346\272\220\347\240\201)/Django+Mysql+Bulma\345\256\236\347\216\260\347\232\204\345\225\206\345\234\272\347\256\241\347\220\206\347\263\273\347\273\237\346\272\220\347\240\201/shopping-mall-master/mall/admin.py" @@ -0,0 +1,3 @@ +from django.contrib import admin + +# Register your models here. diff --git "a/3\343\200\201\347\224\250Python\345\256\236\347\216\260\344\270\200\344\270\252\345\225\206\345\234\272\347\256\241\347\220\206\347\263\273\347\273\237(\351\231\204\346\272\220\347\240\201)/Django+Mysql+Bulma\345\256\236\347\216\260\347\232\204\345\225\206\345\234\272\347\256\241\347\220\206\347\263\273\347\273\237\346\272\220\347\240\201/shopping-mall-master/mall/apps.py" "b/3\343\200\201\347\224\250Python\345\256\236\347\216\260\344\270\200\344\270\252\345\225\206\345\234\272\347\256\241\347\220\206\347\263\273\347\273\237(\351\231\204\346\272\220\347\240\201)/Django+Mysql+Bulma\345\256\236\347\216\260\347\232\204\345\225\206\345\234\272\347\256\241\347\220\206\347\263\273\347\273\237\346\272\220\347\240\201/shopping-mall-master/mall/apps.py" new file mode 100644 index 0000000..3f19f1d --- /dev/null +++ "b/3\343\200\201\347\224\250Python\345\256\236\347\216\260\344\270\200\344\270\252\345\225\206\345\234\272\347\256\241\347\220\206\347\263\273\347\273\237(\351\231\204\346\272\220\347\240\201)/Django+Mysql+Bulma\345\256\236\347\216\260\347\232\204\345\225\206\345\234\272\347\256\241\347\220\206\347\263\273\347\273\237\346\272\220\347\240\201/shopping-mall-master/mall/apps.py" @@ -0,0 +1,6 @@ +from django.apps import AppConfig + + +class MallConfig(AppConfig): + default_auto_field = 'django.db.models.BigAutoField' + name = 'mall' diff --git "a/3\343\200\201\347\224\250Python\345\256\236\347\216\260\344\270\200\344\270\252\345\225\206\345\234\272\347\256\241\347\220\206\347\263\273\347\273\237(\351\231\204\346\272\220\347\240\201)/Django+Mysql+Bulma\345\256\236\347\216\260\347\232\204\345\225\206\345\234\272\347\256\241\347\220\206\347\263\273\347\273\237\346\272\220\347\240\201/shopping-mall-master/mall/cron.py" "b/3\343\200\201\347\224\250Python\345\256\236\347\216\260\344\270\200\344\270\252\345\225\206\345\234\272\347\256\241\347\220\206\347\263\273\347\273\237(\351\231\204\346\272\220\347\240\201)/Django+Mysql+Bulma\345\256\236\347\216\260\347\232\204\345\225\206\345\234\272\347\256\241\347\220\206\347\263\273\347\273\237\346\272\220\347\240\201/shopping-mall-master/mall/cron.py" new file mode 100644 index 0000000..ed4c725 --- /dev/null +++ "b/3\343\200\201\347\224\250Python\345\256\236\347\216\260\344\270\200\344\270\252\345\225\206\345\234\272\347\256\241\347\220\206\347\263\273\347\273\237(\351\231\204\346\272\220\347\240\201)/Django+Mysql+Bulma\345\256\236\347\216\260\347\232\204\345\225\206\345\234\272\347\256\241\347\220\206\347\263\273\347\273\237\346\272\220\347\240\201/shopping-mall-master/mall/cron.py" @@ -0,0 +1,10 @@ +from .models import * + +def scheduled(): + mers=merchant.objects.all() + for mer in mers: + money=0 + for shop in mer.shop_set: + money+=shop.type.paywater.money+shop.type.payelec.money+shop.market.rent.price + mer.balance-=money + mer.save() \ No newline at end of file diff --git "a/3\343\200\201\347\224\250Python\345\256\236\347\216\260\344\270\200\344\270\252\345\225\206\345\234\272\347\256\241\347\220\206\347\263\273\347\273\237(\351\231\204\346\272\220\347\240\201)/Django+Mysql+Bulma\345\256\236\347\216\260\347\232\204\345\225\206\345\234\272\347\256\241\347\220\206\347\263\273\347\273\237\346\272\220\347\240\201/shopping-mall-master/mall/data.py" "b/3\343\200\201\347\224\250Python\345\256\236\347\216\260\344\270\200\344\270\252\345\225\206\345\234\272\347\256\241\347\220\206\347\263\273\347\273\237(\351\231\204\346\272\220\347\240\201)/Django+Mysql+Bulma\345\256\236\347\216\260\347\232\204\345\225\206\345\234\272\347\256\241\347\220\206\347\263\273\347\273\237\346\272\220\347\240\201/shopping-mall-master/mall/data.py" new file mode 100644 index 0000000..296fefd --- /dev/null +++ "b/3\343\200\201\347\224\250Python\345\256\236\347\216\260\344\270\200\344\270\252\345\225\206\345\234\272\347\256\241\347\220\206\347\263\273\347\273\237(\351\231\204\346\272\220\347\240\201)/Django+Mysql+Bulma\345\256\236\347\216\260\347\232\204\345\225\206\345\234\272\347\256\241\347\220\206\347\263\273\347\273\237\346\272\220\347\240\201/shopping-mall-master/mall/data.py" @@ -0,0 +1,86 @@ +from mall.models import * + +# 商铺价位表的数据 +r1=rent.objects.create(id=1,price=4000) +r2=rent.objects.create(id=2,price=5000) +r3=rent.objects.create(id=3,price=6000) +r4=rent.objects.create(id=4,price=7000) + +# 商场表 +m1=market.objects.create(pos="A区101",is_rented=True,rent=r4) +m2=market.objects.create(pos="A区102",is_rented=True,rent=r4) +m3=market.objects.create(pos="A区103",is_rented=False,rent=r4) +m4=market.objects.create(pos="A区104",is_rented=True,rent=r3) +m5=market.objects.create(pos="A区201",is_rented=True,rent=r3) +m6=market.objects.create(pos="A区202",is_rented=False,rent=r3) +m7=market.objects.create(pos="A区203",is_rented=True,rent=r3) +m8=market.objects.create(pos="A区204",is_rented=False,rent=r2) +m9=market.objects.create(pos="B区101",is_rented=True,rent=r2) +m10=market.objects.create(pos="B区102",is_rented=False,rent=r2) +m11=market.objects.create(pos="B区103",is_rented=True,rent=r2) +m12=market.objects.create(pos="B区104",is_rented=False,rent=r2) +m13=market.objects.create(pos="B区201",is_rented=True,rent=r1) +m14=market.objects.create(pos="B区202",is_rented=True,rent=r1) +m15=market.objects.create(pos="B区203",is_rented=False,rent=r1) +m16=market.objects.create(pos="B区204",is_rented=True,rent=r1) + +# 水费价位表 +p1=paywater.objects.create(id=1,money=40) +p2=paywater.objects.create(id=2,money=60) +p3=paywater.objects.create(id=3,money=80) +p4=paywater.objects.create(id=4,money=100) +p5=paywater.objects.create(id=5,money=120) + +# 电费价位表 +pe1=payelec.objects.create(id=1,money=100) +pe2=payelec.objects.create(id=2,money=120) +pe3=payelec.objects.create(id=3,money=140) +pe4=payelec.objects.create(id=4,money=160) +pe5=payelec.objects.create(id=5,money=180) + +# 商户表 +u1=merchant.objects.create(name="葛二蛋",username='ai',password='123',tel='13798638123',balance=20000) +u2=merchant.objects.create(name="吴三桂",username='van',password='456',tel='13798618323',balance=13000) +u3=merchant.objects.create(name="竹牛逼",username='ia',password='789',tel='13868618323',balance=15000) + +# 种类表 +t1=type.objects.create(typename="品牌服装",paywater=p1,payelec=pe2) +t2=type.objects.create(typename="休闲零食",paywater=p2,payelec=pe3) +t3=type.objects.create(typename="恰饭管饱",paywater=p5,payelec=pe4) +t4=type.objects.create(typename="美容美发",paywater=p4,payelec=pe1) +t5=type.objects.create(typename="购物百货",paywater=p3,payelec=pe3) +t6=type.objects.create(typename="娱乐聚会",paywater=p1,payelec=pe5) +t7=type.objects.create(typename="电影院",paywater=p1,payelec=pe5) + +# 商铺表 +s1=shop.objects.create(name="七号小铺",market=m1,merchant=u1,type=t1) +s2=shop.objects.create(name="良品铺子",market=m2,merchant=u2,type=t2) +s3=shop.objects.create(name="南北零食",market=m4,merchant=u3,type=t2) +s4=shop.objects.create(name="牛鼎烧烤",market=m5,merchant=u1,type=t3) +s5=shop.objects.create(name="日式小料",market=m7,merchant=u2,type=t3) +s6=shop.objects.create(name="层层发艺",market=m9,merchant=u3,type=t4) +s7=shop.objects.create(name="俏佳人",market=m11,merchant=u1,type=t4) +s8=shop.objects.create(name="杰哥商超",market=m13,merchant=u2,type=t5) +s9=shop.objects.create(name="阿伟电动",market=m14,merchant=u3,type=t6) +s10=shop.objects.create(name="猫眼电影",market=m16,merchant=u1,type=t7) + +# 商品表 +g1=goods.objects.create(name="耐克凉鞋",detail="耐克最新款凉鞋",price=100,img="",shop=s1) +g2=goods.objects.create(name="阿迪达斯短袖",detail="阿迪达斯最新款短袖",price=80,img="",shop=s1) +g3=goods.objects.create(name="Peak短裤",detail="Peak最新款短裤",price=70,img="",shop=s1) +g4=goods.objects.create(name="安踏运动鞋",detail="安踏最新款运动鞋",price=150,img="",shop=s1) +g5=goods.objects.create(name="手撕面包",detail="敲好吃的面包",price=20,img="",shop=s2) +g6=goods.objects.create(name="海苔肉松卷",detail="敲好吃的海苔肉松卷",price=12.9,img="",shop=s2) +g7=goods.objects.create(name="猪肉脯",detail="敲好吃的猪肉脯",price=30.9,img="",shop=s2) +g8=goods.objects.create(name="多味花生",detail="敲好吃的多为花生",price=8.8,img="",shop=s2) +g9=goods.objects.create(name="绿豆饼",detail="网红绿豆饼",price=5.9,img="",shop=s3) +g10=goods.objects.create(name="烤馍片",detail="网红烤馍片",price=8.9,img="",shop=s3) +g11=goods.objects.create(name="威化饼干",detail="网红威化饼干",price=14.8,img="",shop=s3) +g12=goods.objects.create(name="里脊肉",detail="香喷喷的里脊肉",price=15,img='',shop=s4) +g13=goods.objects.create(name="火腿肠",detail="香喷喷的火腿肠",price=12,img='',shop=s4) +g14=goods.objects.create(name="肥牛卷",detail="香喷喷的肥牛卷",price=20,img='',shop=s4) +g15=goods.objects.create(name="味增汤",detail="和风味的味增汤",price=8,img='',shop=s5) +g16=goods.objects.create(name="筑前煮",detail="和风味的筑前煮",price=12,img='',shop=s5) +g17=goods.objects.create(name="大和煮",detail="和风味的大和煮",price=12,img='',shop=s5) +g18=goods.objects.create(name="唐扬饭",detail="和风味的唐扬饭",price=15,img='',shop=s5) + diff --git "a/3\343\200\201\347\224\250Python\345\256\236\347\216\260\344\270\200\344\270\252\345\225\206\345\234\272\347\256\241\347\220\206\347\263\273\347\273\237(\351\231\204\346\272\220\347\240\201)/Django+Mysql+Bulma\345\256\236\347\216\260\347\232\204\345\225\206\345\234\272\347\256\241\347\220\206\347\263\273\347\273\237\346\272\220\347\240\201/shopping-mall-master/mall/migrations/0001_initial.py" "b/3\343\200\201\347\224\250Python\345\256\236\347\216\260\344\270\200\344\270\252\345\225\206\345\234\272\347\256\241\347\220\206\347\263\273\347\273\237(\351\231\204\346\272\220\347\240\201)/Django+Mysql+Bulma\345\256\236\347\216\260\347\232\204\345\225\206\345\234\272\347\256\241\347\220\206\347\263\273\347\273\237\346\272\220\347\240\201/shopping-mall-master/mall/migrations/0001_initial.py" new file mode 100644 index 0000000..f3d421e --- /dev/null +++ "b/3\343\200\201\347\224\250Python\345\256\236\347\216\260\344\270\200\344\270\252\345\225\206\345\234\272\347\256\241\347\220\206\347\263\273\347\273\237(\351\231\204\346\272\220\347\240\201)/Django+Mysql+Bulma\345\256\236\347\216\260\347\232\204\345\225\206\345\234\272\347\256\241\347\220\206\347\263\273\347\273\237\346\272\220\347\240\201/shopping-mall-master/mall/migrations/0001_initial.py" @@ -0,0 +1,80 @@ +# Generated by Django 3.2 on 2022-05-01 03:19 + +from django.db import migrations, models +import django.db.models.deletion + + +class Migration(migrations.Migration): + + initial = True + + dependencies = [ + ] + + operations = [ + migrations.CreateModel( + name='goods', + fields=[ + ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('name', models.CharField(default='', max_length=25, verbose_name='商品名')), + ('detail', models.CharField(default='', max_length=255, verbose_name='商品描述')), + ('price', models.DecimalField(decimal_places=2, max_digits=7, verbose_name='商品价格')), + ('img', models.CharField(default='', max_length=100, verbose_name='商品图片')), + ], + ), + migrations.CreateModel( + name='market', + fields=[ + ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('pos', models.CharField(default='', max_length=100, verbose_name='商铺位置')), + ('is_rented', models.BooleanField(default=False, verbose_name='是否租出')), + ], + ), + migrations.CreateModel( + name='payment', + fields=[ + ('id', models.IntegerField(primary_key=True, serialize=False, verbose_name='缴费价位id')), + ('money', models.DecimalField(decimal_places=2, max_digits=7, verbose_name='费用')), + ], + ), + migrations.CreateModel( + name='rent', + fields=[ + ('id', models.IntegerField(primary_key=True, serialize=False, verbose_name='租商铺价位id')), + ('price', models.DecimalField(decimal_places=2, max_digits=7, verbose_name='价格')), + ], + ), + migrations.CreateModel( + name='shop', + fields=[ + ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('name', models.CharField(default='', max_length=25, verbose_name='商铺名称')), + ('market', models.OneToOneField(on_delete=django.db.models.deletion.CASCADE, to='mall.market')), + ('type', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='mall.payment')), + ], + ), + migrations.CreateModel( + name='order', + fields=[ + ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('amount', models.IntegerField(default=1, verbose_name='商品数量')), + ('time', models.DateTimeField(auto_now_add=True, verbose_name='订单创建时间')), + ('goods', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='mall.goods')), + ('shop', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='mall.shop')), + ], + ), + migrations.CreateModel( + name='merchant', + fields=[ + ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('name', models.CharField(default='', max_length=25, verbose_name='商户名')), + ('balance', models.DecimalField(decimal_places=2, max_digits=7, verbose_name='余额')), + ('shops', models.ManyToManyField(to='mall.shop')), + ], + ), + migrations.AddField( + model_name='market', + name='rent', + field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='mall.rent'), + ), + ] diff --git "a/3\343\200\201\347\224\250Python\345\256\236\347\216\260\344\270\200\344\270\252\345\225\206\345\234\272\347\256\241\347\220\206\347\263\273\347\273\237(\351\231\204\346\272\220\347\240\201)/Django+Mysql+Bulma\345\256\236\347\216\260\347\232\204\345\225\206\345\234\272\347\256\241\347\220\206\347\263\273\347\273\237\346\272\220\347\240\201/shopping-mall-master/mall/migrations/0002_auto_20220501_2002.py" "b/3\343\200\201\347\224\250Python\345\256\236\347\216\260\344\270\200\344\270\252\345\225\206\345\234\272\347\256\241\347\220\206\347\263\273\347\273\237(\351\231\204\346\272\220\347\240\201)/Django+Mysql+Bulma\345\256\236\347\216\260\347\232\204\345\225\206\345\234\272\347\256\241\347\220\206\347\263\273\347\273\237\346\272\220\347\240\201/shopping-mall-master/mall/migrations/0002_auto_20220501_2002.py" new file mode 100644 index 0000000..0cdb64f --- /dev/null +++ "b/3\343\200\201\347\224\250Python\345\256\236\347\216\260\344\270\200\344\270\252\345\225\206\345\234\272\347\256\241\347\220\206\347\263\273\347\273\237(\351\231\204\346\272\220\347\240\201)/Django+Mysql+Bulma\345\256\236\347\216\260\347\232\204\345\225\206\345\234\272\347\256\241\347\220\206\347\263\273\347\273\237\346\272\220\347\240\201/shopping-mall-master/mall/migrations/0002_auto_20220501_2002.py" @@ -0,0 +1,29 @@ +# Generated by Django 3.2 on 2022-05-01 12:02 + +from django.db import migrations, models +import django.db.models.deletion + + +class Migration(migrations.Migration): + + dependencies = [ + ('mall', '0001_initial'), + ] + + operations = [ + migrations.AddField( + model_name='goods', + name='shop', + field=models.ForeignKey(null=True, on_delete=django.db.models.deletion.CASCADE, to='mall.shop'), + ), + migrations.AddField( + model_name='shop', + name='payment', + field=models.ForeignKey(null=True, on_delete=django.db.models.deletion.CASCADE, to='mall.payment'), + ), + migrations.AlterField( + model_name='shop', + name='type', + field=models.CharField(default='', max_length=100, verbose_name='商铺种类'), + ), + ] diff --git "a/3\343\200\201\347\224\250Python\345\256\236\347\216\260\344\270\200\344\270\252\345\225\206\345\234\272\347\256\241\347\220\206\347\263\273\347\273\237(\351\231\204\346\272\220\347\240\201)/Django+Mysql+Bulma\345\256\236\347\216\260\347\232\204\345\225\206\345\234\272\347\256\241\347\220\206\347\263\273\347\273\237\346\272\220\347\240\201/shopping-mall-master/mall/migrations/0003_auto_20220501_2032.py" "b/3\343\200\201\347\224\250Python\345\256\236\347\216\260\344\270\200\344\270\252\345\225\206\345\234\272\347\256\241\347\220\206\347\263\273\347\273\237(\351\231\204\346\272\220\347\240\201)/Django+Mysql+Bulma\345\256\236\347\216\260\347\232\204\345\225\206\345\234\272\347\256\241\347\220\206\347\263\273\347\273\237\346\272\220\347\240\201/shopping-mall-master/mall/migrations/0003_auto_20220501_2032.py" new file mode 100644 index 0000000..f652fc3 --- /dev/null +++ "b/3\343\200\201\347\224\250Python\345\256\236\347\216\260\344\270\200\344\270\252\345\225\206\345\234\272\347\256\241\347\220\206\347\263\273\347\273\237(\351\231\204\346\272\220\347\240\201)/Django+Mysql+Bulma\345\256\236\347\216\260\347\232\204\345\225\206\345\234\272\347\256\241\347\220\206\347\263\273\347\273\237\346\272\220\347\240\201/shopping-mall-master/mall/migrations/0003_auto_20220501_2032.py" @@ -0,0 +1,38 @@ +# Generated by Django 3.2 on 2022-05-01 12:32 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('mall', '0002_auto_20220501_2002'), + ] + + operations = [ + migrations.CreateModel( + name='user', + fields=[ + ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('username', models.CharField(max_length=12, verbose_name='用户名')), + ('password', models.CharField(max_length=12, verbose_name='密码')), + ('sex', models.BooleanField(null=True)), + ('tel', models.CharField(max_length=11, null=True)), + ], + ), + migrations.AddField( + model_name='merchant', + name='password', + field=models.CharField(max_length=12, null=True, verbose_name='密码'), + ), + migrations.AddField( + model_name='merchant', + name='tel', + field=models.CharField(max_length=11, null=True), + ), + migrations.AddField( + model_name='merchant', + name='username', + field=models.CharField(max_length=12, null=True, verbose_name='用户名'), + ), + ] diff --git "a/3\343\200\201\347\224\250Python\345\256\236\347\216\260\344\270\200\344\270\252\345\225\206\345\234\272\347\256\241\347\220\206\347\263\273\347\273\237(\351\231\204\346\272\220\347\240\201)/Django+Mysql+Bulma\345\256\236\347\216\260\347\232\204\345\225\206\345\234\272\347\256\241\347\220\206\347\263\273\347\273\237\346\272\220\347\240\201/shopping-mall-master/mall/migrations/0004_auto_20220501_2105.py" "b/3\343\200\201\347\224\250Python\345\256\236\347\216\260\344\270\200\344\270\252\345\225\206\345\234\272\347\256\241\347\220\206\347\263\273\347\273\237(\351\231\204\346\272\220\347\240\201)/Django+Mysql+Bulma\345\256\236\347\216\260\347\232\204\345\225\206\345\234\272\347\256\241\347\220\206\347\263\273\347\273\237\346\272\220\347\240\201/shopping-mall-master/mall/migrations/0004_auto_20220501_2105.py" new file mode 100644 index 0000000..e3f7b96 --- /dev/null +++ "b/3\343\200\201\347\224\250Python\345\256\236\347\216\260\344\270\200\344\270\252\345\225\206\345\234\272\347\256\241\347\220\206\347\263\273\347\273\237(\351\231\204\346\272\220\347\240\201)/Django+Mysql+Bulma\345\256\236\347\216\260\347\232\204\345\225\206\345\234\272\347\256\241\347\220\206\347\263\273\347\273\237\346\272\220\347\240\201/shopping-mall-master/mall/migrations/0004_auto_20220501_2105.py" @@ -0,0 +1,23 @@ +# Generated by Django 3.2 on 2022-05-01 13:05 + +from django.db import migrations, models +import django.db.models.deletion + + +class Migration(migrations.Migration): + + dependencies = [ + ('mall', '0003_auto_20220501_2032'), + ] + + operations = [ + migrations.RemoveField( + model_name='merchant', + name='shops', + ), + migrations.AddField( + model_name='shop', + name='merchant', + field=models.ForeignKey(null=True, on_delete=django.db.models.deletion.CASCADE, to='mall.merchant'), + ), + ] diff --git "a/3\343\200\201\347\224\250Python\345\256\236\347\216\260\344\270\200\344\270\252\345\225\206\345\234\272\347\256\241\347\220\206\347\263\273\347\273\237(\351\231\204\346\272\220\347\240\201)/Django+Mysql+Bulma\345\256\236\347\216\260\347\232\204\345\225\206\345\234\272\347\256\241\347\220\206\347\263\273\347\273\237\346\272\220\347\240\201/shopping-mall-master/mall/migrations/0005_auto_20220503_1306.py" "b/3\343\200\201\347\224\250Python\345\256\236\347\216\260\344\270\200\344\270\252\345\225\206\345\234\272\347\256\241\347\220\206\347\263\273\347\273\237(\351\231\204\346\272\220\347\240\201)/Django+Mysql+Bulma\345\256\236\347\216\260\347\232\204\345\225\206\345\234\272\347\256\241\347\220\206\347\263\273\347\273\237\346\272\220\347\240\201/shopping-mall-master/mall/migrations/0005_auto_20220503_1306.py" new file mode 100644 index 0000000..6965ade --- /dev/null +++ "b/3\343\200\201\347\224\250Python\345\256\236\347\216\260\344\270\200\344\270\252\345\225\206\345\234\272\347\256\241\347\220\206\347\263\273\347\273\237(\351\231\204\346\272\220\347\240\201)/Django+Mysql+Bulma\345\256\236\347\216\260\347\232\204\345\225\206\345\234\272\347\256\241\347\220\206\347\263\273\347\273\237\346\272\220\347\240\201/shopping-mall-master/mall/migrations/0005_auto_20220503_1306.py" @@ -0,0 +1,36 @@ +# Generated by Django 3.2 on 2022-05-03 05:06 + +from django.db import migrations, models +import django.db.models.deletion + + +class Migration(migrations.Migration): + + dependencies = [ + ('mall', '0004_auto_20220501_2105'), + ] + + operations = [ + migrations.CreateModel( + name='payelec', + fields=[ + ('id', models.IntegerField(primary_key=True, serialize=False, verbose_name='电费价位id')), + ('money', models.DecimalField(decimal_places=2, max_digits=7, verbose_name='费用')), + ], + ), + migrations.CreateModel( + name='paywater', + fields=[ + ('id', models.IntegerField(primary_key=True, serialize=False, verbose_name='水费价位id')), + ('money', models.DecimalField(decimal_places=2, max_digits=7, verbose_name='费用')), + ], + ), + migrations.AlterField( + model_name='shop', + name='payment', + field=models.ForeignKey(null=True, on_delete=django.db.models.deletion.CASCADE, to='mall.payelec'), + ), + migrations.DeleteModel( + name='payment', + ), + ] diff --git "a/3\343\200\201\347\224\250Python\345\256\236\347\216\260\344\270\200\344\270\252\345\225\206\345\234\272\347\256\241\347\220\206\347\263\273\347\273\237(\351\231\204\346\272\220\347\240\201)/Django+Mysql+Bulma\345\256\236\347\216\260\347\232\204\345\225\206\345\234\272\347\256\241\347\220\206\347\263\273\347\273\237\346\272\220\347\240\201/shopping-mall-master/mall/migrations/0006_auto_20220503_1320.py" "b/3\343\200\201\347\224\250Python\345\256\236\347\216\260\344\270\200\344\270\252\345\225\206\345\234\272\347\256\241\347\220\206\347\263\273\347\273\237(\351\231\204\346\272\220\347\240\201)/Django+Mysql+Bulma\345\256\236\347\216\260\347\232\204\345\225\206\345\234\272\347\256\241\347\220\206\347\263\273\347\273\237\346\272\220\347\240\201/shopping-mall-master/mall/migrations/0006_auto_20220503_1320.py" new file mode 100644 index 0000000..666cfe2 --- /dev/null +++ "b/3\343\200\201\347\224\250Python\345\256\236\347\216\260\344\270\200\344\270\252\345\225\206\345\234\272\347\256\241\347\220\206\347\263\273\347\273\237(\351\231\204\346\272\220\347\240\201)/Django+Mysql+Bulma\345\256\236\347\216\260\347\232\204\345\225\206\345\234\272\347\256\241\347\220\206\347\263\273\347\273\237\346\272\220\347\240\201/shopping-mall-master/mall/migrations/0006_auto_20220503_1320.py" @@ -0,0 +1,24 @@ +# Generated by Django 3.2 on 2022-05-03 05:20 + +from django.db import migrations, models +import django.db.models.deletion + + +class Migration(migrations.Migration): + + dependencies = [ + ('mall', '0005_auto_20220503_1306'), + ] + + operations = [ + migrations.RenameField( + model_name='shop', + old_name='payment', + new_name='payelec', + ), + migrations.AddField( + model_name='shop', + name='paywater', + field=models.ForeignKey(null=True, on_delete=django.db.models.deletion.CASCADE, to='mall.paywater'), + ), + ] diff --git "a/3\343\200\201\347\224\250Python\345\256\236\347\216\260\344\270\200\344\270\252\345\225\206\345\234\272\347\256\241\347\220\206\347\263\273\347\273\237(\351\231\204\346\272\220\347\240\201)/Django+Mysql+Bulma\345\256\236\347\216\260\347\232\204\345\225\206\345\234\272\347\256\241\347\220\206\347\263\273\347\273\237\346\272\220\347\240\201/shopping-mall-master/mall/migrations/0007_auto_20220503_1628.py" "b/3\343\200\201\347\224\250Python\345\256\236\347\216\260\344\270\200\344\270\252\345\225\206\345\234\272\347\256\241\347\220\206\347\263\273\347\273\237(\351\231\204\346\272\220\347\240\201)/Django+Mysql+Bulma\345\256\236\347\216\260\347\232\204\345\225\206\345\234\272\347\256\241\347\220\206\347\263\273\347\273\237\346\272\220\347\240\201/shopping-mall-master/mall/migrations/0007_auto_20220503_1628.py" new file mode 100644 index 0000000..619abdf --- /dev/null +++ "b/3\343\200\201\347\224\250Python\345\256\236\347\216\260\344\270\200\344\270\252\345\225\206\345\234\272\347\256\241\347\220\206\347\263\273\347\273\237(\351\231\204\346\272\220\347\240\201)/Django+Mysql+Bulma\345\256\236\347\216\260\347\232\204\345\225\206\345\234\272\347\256\241\347\220\206\347\263\273\347\273\237\346\272\220\347\240\201/shopping-mall-master/mall/migrations/0007_auto_20220503_1628.py" @@ -0,0 +1,36 @@ +# Generated by Django 3.2 on 2022-05-03 08:28 + +from django.db import migrations, models +import django.db.models.deletion + + +class Migration(migrations.Migration): + + dependencies = [ + ('mall', '0006_auto_20220503_1320'), + ] + + operations = [ + migrations.RemoveField( + model_name='shop', + name='payelec', + ), + migrations.RemoveField( + model_name='shop', + name='paywater', + ), + migrations.CreateModel( + name='type', + fields=[ + ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('type', models.CharField(default='', max_length=10)), + ('payelec', models.ForeignKey(null=True, on_delete=django.db.models.deletion.CASCADE, to='mall.payelec')), + ('paywater', models.ForeignKey(null=True, on_delete=django.db.models.deletion.CASCADE, to='mall.paywater')), + ], + ), + migrations.AlterField( + model_name='shop', + name='type', + field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='mall.type'), + ), + ] diff --git "a/3\343\200\201\347\224\250Python\345\256\236\347\216\260\344\270\200\344\270\252\345\225\206\345\234\272\347\256\241\347\220\206\347\263\273\347\273\237(\351\231\204\346\272\220\347\240\201)/Django+Mysql+Bulma\345\256\236\347\216\260\347\232\204\345\225\206\345\234\272\347\256\241\347\220\206\347\263\273\347\273\237\346\272\220\347\240\201/shopping-mall-master/mall/migrations/0008_rename_type_type_typename.py" "b/3\343\200\201\347\224\250Python\345\256\236\347\216\260\344\270\200\344\270\252\345\225\206\345\234\272\347\256\241\347\220\206\347\263\273\347\273\237(\351\231\204\346\272\220\347\240\201)/Django+Mysql+Bulma\345\256\236\347\216\260\347\232\204\345\225\206\345\234\272\347\256\241\347\220\206\347\263\273\347\273\237\346\272\220\347\240\201/shopping-mall-master/mall/migrations/0008_rename_type_type_typename.py" new file mode 100644 index 0000000..0217535 --- /dev/null +++ "b/3\343\200\201\347\224\250Python\345\256\236\347\216\260\344\270\200\344\270\252\345\225\206\345\234\272\347\256\241\347\220\206\347\263\273\347\273\237(\351\231\204\346\272\220\347\240\201)/Django+Mysql+Bulma\345\256\236\347\216\260\347\232\204\345\225\206\345\234\272\347\256\241\347\220\206\347\263\273\347\273\237\346\272\220\347\240\201/shopping-mall-master/mall/migrations/0008_rename_type_type_typename.py" @@ -0,0 +1,18 @@ +# Generated by Django 3.2 on 2022-05-03 08:32 + +from django.db import migrations + + +class Migration(migrations.Migration): + + dependencies = [ + ('mall', '0007_auto_20220503_1628'), + ] + + operations = [ + migrations.RenameField( + model_name='type', + old_name='type', + new_name='typename', + ), + ] diff --git a/flask/apps/urls.py "b/3\343\200\201\347\224\250Python\345\256\236\347\216\260\344\270\200\344\270\252\345\225\206\345\234\272\347\256\241\347\220\206\347\263\273\347\273\237(\351\231\204\346\272\220\347\240\201)/Django+Mysql+Bulma\345\256\236\347\216\260\347\232\204\345\225\206\345\234\272\347\256\241\347\220\206\347\263\273\347\273\237\346\272\220\347\240\201/shopping-mall-master/mall/migrations/__init__.py" similarity index 100% rename from flask/apps/urls.py rename to "3\343\200\201\347\224\250Python\345\256\236\347\216\260\344\270\200\344\270\252\345\225\206\345\234\272\347\256\241\347\220\206\347\263\273\347\273\237(\351\231\204\346\272\220\347\240\201)/Django+Mysql+Bulma\345\256\236\347\216\260\347\232\204\345\225\206\345\234\272\347\256\241\347\220\206\347\263\273\347\273\237\346\272\220\347\240\201/shopping-mall-master/mall/migrations/__init__.py" diff --git "a/3\343\200\201\347\224\250Python\345\256\236\347\216\260\344\270\200\344\270\252\345\225\206\345\234\272\347\256\241\347\220\206\347\263\273\347\273\237(\351\231\204\346\272\220\347\240\201)/Django+Mysql+Bulma\345\256\236\347\216\260\347\232\204\345\225\206\345\234\272\347\256\241\347\220\206\347\263\273\347\273\237\346\272\220\347\240\201/shopping-mall-master/mall/models.py" "b/3\343\200\201\347\224\250Python\345\256\236\347\216\260\344\270\200\344\270\252\345\225\206\345\234\272\347\256\241\347\220\206\347\263\273\347\273\237(\351\231\204\346\272\220\347\240\201)/Django+Mysql+Bulma\345\256\236\347\216\260\347\232\204\345\225\206\345\234\272\347\256\241\347\220\206\347\263\273\347\273\237\346\272\220\347\240\201/shopping-mall-master/mall/models.py" new file mode 100644 index 0000000..973d76f --- /dev/null +++ "b/3\343\200\201\347\224\250Python\345\256\236\347\216\260\344\270\200\344\270\252\345\225\206\345\234\272\347\256\241\347\220\206\347\263\273\347\273\237(\351\231\204\346\272\220\347\240\201)/Django+Mysql+Bulma\345\256\236\347\216\260\347\232\204\345\225\206\345\234\272\347\256\241\347\220\206\347\263\273\347\273\237\346\272\220\347\240\201/shopping-mall-master/mall/models.py" @@ -0,0 +1,80 @@ +from django.db import models + +# Create your models here. +# 商场商铺的价位表 +class rent(models.Model): + id=models.IntegerField("租商铺价位id",primary_key=True) + price=models.DecimalField("价格",max_digits=7,decimal_places=2) + +# 商场表,可以看到所有商铺的状态 +class market(models.Model): + pos=models.CharField("商铺位置",max_length=100,default='') + # 商铺租金外键 + rent=models.ForeignKey(rent,on_delete=models.CASCADE) + is_rented=models.BooleanField("是否租出",null=False,default=False) + +# 水费价位表 +class paywater(models.Model): + id=models.IntegerField("水费价位id",primary_key=True) + money=models.DecimalField("费用",max_digits=7,decimal_places=2) + +# 电费价位表 +class payelec(models.Model): + id=models.IntegerField("电费价位id",primary_key=True) + money=models.DecimalField("费用",max_digits=7,decimal_places=2) + +# 商户表 +class merchant(models.Model): + name=models.CharField("商户名",max_length=25,null=False,default='') + username=models.CharField("用户名",max_length=12,null=True) + password=models.CharField("密码",max_length=12,null=True) + tel=models.CharField(max_length=11,null=True) + balance=models.DecimalField("余额",max_digits=7,decimal_places=2) + +# 商铺种类表,与缴费相关 +class type(models.Model): + typename=models.CharField(max_length=10,null=False,default='') + paywater=models.ForeignKey(paywater,on_delete=models.CASCADE,null=True) + payelec=models.ForeignKey(payelec,on_delete=models.CASCADE,null=True) + +# 商铺表,这是所有租出去的商铺的详细信息 +class shop(models.Model): + name=models.CharField("商铺名称",max_length=25,default='',null=False) + # 关联种类表 + type=models.ForeignKey(type,on_delete=models.CASCADE) + # 关联market表,用于修改is_rented字段 + market=models.OneToOneField(market,on_delete=models.CASCADE) + # 关联商户,一对多关系 + merchant=models.ForeignKey(merchant,null=True,on_delete=models.CASCADE) + +# 商品表 +class goods(models.Model): + name=models.CharField("商品名",max_length=25,default='') + detail=models.CharField("商品描述",max_length=255,default="") + price=models.DecimalField("商品价格",max_digits=7,decimal_places=2) + img=models.CharField("商品图片",max_length=100,default='') + shop=models.ForeignKey(shop,on_delete=models.CASCADE,null=True) + +# 订单表 +class order(models.Model): + # 关联商铺,表明这是哪家商铺的订单 + shop=models.ForeignKey(shop,on_delete=models.CASCADE) + # 关联商品,获取商品名和商品价格 + goods=models.ForeignKey(goods,on_delete=models.CASCADE) + amount=models.IntegerField("商品数量",default=1) + time=models.DateTimeField("订单创建时间",auto_now_add=True) + +class user(models.Model): + username=models.CharField("用户名",max_length=12,null=False) + password=models.CharField("密码",max_length=12,null=False) + sex=models.BooleanField(null=True) + tel=models.CharField(max_length=11,null=True) + +def scheduled(): + mers=merchant.objects.all() + for mer in mers: + money=0 + for shop in mer.shop_set: + money+=shop.type.paywater.money+shop.type.payelec.money+shop.market.rent.price + mer.balance-=money + mer.save() \ No newline at end of file diff --git "a/3\343\200\201\347\224\250Python\345\256\236\347\216\260\344\270\200\344\270\252\345\225\206\345\234\272\347\256\241\347\220\206\347\263\273\347\273\237(\351\231\204\346\272\220\347\240\201)/Django+Mysql+Bulma\345\256\236\347\216\260\347\232\204\345\225\206\345\234\272\347\256\241\347\220\206\347\263\273\347\273\237\346\272\220\347\240\201/shopping-mall-master/mall/tests.py" "b/3\343\200\201\347\224\250Python\345\256\236\347\216\260\344\270\200\344\270\252\345\225\206\345\234\272\347\256\241\347\220\206\347\263\273\347\273\237(\351\231\204\346\272\220\347\240\201)/Django+Mysql+Bulma\345\256\236\347\216\260\347\232\204\345\225\206\345\234\272\347\256\241\347\220\206\347\263\273\347\273\237\346\272\220\347\240\201/shopping-mall-master/mall/tests.py" new file mode 100644 index 0000000..7ce503c --- /dev/null +++ "b/3\343\200\201\347\224\250Python\345\256\236\347\216\260\344\270\200\344\270\252\345\225\206\345\234\272\347\256\241\347\220\206\347\263\273\347\273\237(\351\231\204\346\272\220\347\240\201)/Django+Mysql+Bulma\345\256\236\347\216\260\347\232\204\345\225\206\345\234\272\347\256\241\347\220\206\347\263\273\347\273\237\346\272\220\347\240\201/shopping-mall-master/mall/tests.py" @@ -0,0 +1,3 @@ +from django.test import TestCase + +# Create your tests here. diff --git "a/3\343\200\201\347\224\250Python\345\256\236\347\216\260\344\270\200\344\270\252\345\225\206\345\234\272\347\256\241\347\220\206\347\263\273\347\273\237(\351\231\204\346\272\220\347\240\201)/Django+Mysql+Bulma\345\256\236\347\216\260\347\232\204\345\225\206\345\234\272\347\256\241\347\220\206\347\263\273\347\273\237\346\272\220\347\240\201/shopping-mall-master/mall/urls.py" "b/3\343\200\201\347\224\250Python\345\256\236\347\216\260\344\270\200\344\270\252\345\225\206\345\234\272\347\256\241\347\220\206\347\263\273\347\273\237(\351\231\204\346\272\220\347\240\201)/Django+Mysql+Bulma\345\256\236\347\216\260\347\232\204\345\225\206\345\234\272\347\256\241\347\220\206\347\263\273\347\273\237\346\272\220\347\240\201/shopping-mall-master/mall/urls.py" new file mode 100644 index 0000000..2783343 --- /dev/null +++ "b/3\343\200\201\347\224\250Python\345\256\236\347\216\260\344\270\200\344\270\252\345\225\206\345\234\272\347\256\241\347\220\206\347\263\273\347\273\237(\351\231\204\346\272\220\347\240\201)/Django+Mysql+Bulma\345\256\236\347\216\260\347\232\204\345\225\206\345\234\272\347\256\241\347\220\206\347\263\273\347\273\237\346\272\220\347\240\201/shopping-mall-master/mall/urls.py" @@ -0,0 +1,13 @@ +from django.urls import path,re_path +from . import views + +urlpatterns = [ + path('',views.index_view), + path('shoplist',views.shoplist_view), + path('shopdetail/',views.shopdetail_view), + path('login',views.login_view), + path('manage/userinfo',views.manage_view), + path('manage/myshop',views.myshop_view), + path('manage/charge',views.charge_view), + path('manage/rentshop',views.rent_view) +] \ No newline at end of file diff --git "a/3\343\200\201\347\224\250Python\345\256\236\347\216\260\344\270\200\344\270\252\345\225\206\345\234\272\347\256\241\347\220\206\347\263\273\347\273\237(\351\231\204\346\272\220\347\240\201)/Django+Mysql+Bulma\345\256\236\347\216\260\347\232\204\345\225\206\345\234\272\347\256\241\347\220\206\347\263\273\347\273\237\346\272\220\347\240\201/shopping-mall-master/mall/views.py" "b/3\343\200\201\347\224\250Python\345\256\236\347\216\260\344\270\200\344\270\252\345\225\206\345\234\272\347\256\241\347\220\206\347\263\273\347\273\237(\351\231\204\346\272\220\347\240\201)/Django+Mysql+Bulma\345\256\236\347\216\260\347\232\204\345\225\206\345\234\272\347\256\241\347\220\206\347\263\273\347\273\237\346\272\220\347\240\201/shopping-mall-master/mall/views.py" new file mode 100644 index 0000000..f88655a --- /dev/null +++ "b/3\343\200\201\347\224\250Python\345\256\236\347\216\260\344\270\200\344\270\252\345\225\206\345\234\272\347\256\241\347\220\206\347\263\273\347\273\237(\351\231\204\346\272\220\347\240\201)/Django+Mysql+Bulma\345\256\236\347\216\260\347\232\204\345\225\206\345\234\272\347\256\241\347\220\206\347\263\273\347\273\237\346\272\220\347\240\201/shopping-mall-master/mall/views.py" @@ -0,0 +1,123 @@ +from django.http import HttpResponse, HttpResponseRedirect +from django.shortcuts import render +from .models import * + +# Create your views here. + +def index_view(request): + value=request.COOKIES.get('user','') + try: + name=merchant.objects.get(username=value).name + except: + pass + return render(request,"index.html",locals()) + +def shoplist_view(request): + value=request.COOKIES.get('user','') + try: + name=merchant.objects.get(username=value).name + except: + pass + shops=shop.objects.all() + return render(request,"shoplist.html",locals()) + +def shopdetail_view(request,_id): + value=request.COOKIES.get('user','') + try: + name=merchant.objects.get(username=value).name + except: + pass + goods=shop.objects.get(id=_id).goods_set.all() + return render(request,'shopdetail.html',locals()) + +def login_view(request): + if request.method=='GET': + value=request.COOKIES.get('user','') + try: + name=merchant.objects.get(username=value).name + except: + pass + return render(request,'login.html',locals()) + elif request.method=='POST': + uname=request.POST['uname'] + pwd=request.POST['pwd'] + try: + mer=merchant.objects.get(username = uname) + except: + return render(request,'login.html') + if mer.password==pwd: + resp=HttpResponseRedirect('/login') + resp.set_cookie('user',mer.username) + return resp + else: + return render(request,'login.html') + +def manage_view(request): + value=request.COOKIES.get('user','') + if value=='': + return HttpResponseRedirect('/login') + else: + mer=merchant.objects.get(username=value) + return render(request,'userinfo.html',locals()) + +def myshop_view(request): + value=request.COOKIES.get('user','') + if value=='': + return HttpResponseRedirect('/login') + else: + mer=merchant.objects.get(username=value) + shops=mer.shop_set.all() + return render(request,'usershop.html',locals()) + +def charge_view(request): + if request.method=='GET': + value=request.COOKIES.get('user','') + if value=='': + return HttpResponseRedirect('/login') + else: + mer=merchant.objects.get(username=value) + shops=mer.shop_set.all() + money=0 + for shop in shops: + money+=shop.type.paywater.money+shop.type.payelec.money+shop.market.rent.price + return render(request,'charge.html',locals()) + elif request.method=='POST': + value=request.COOKIES.get('user','') + mer=merchant.objects.get(username=value) + charge=int(request.POST['money']) + mer.balance+=charge + mer.save() + return HttpResponseRedirect('userinfo') + +def rent_view(request): + if request.method=='GET': + value=request.COOKIES.get('user','') + if value=='': + return HttpResponseRedirect('/login') + try: + name=merchant.objects.get(username=value).name + except: + pass + try: + id=int(request.GET['shop_id']) + except: + value=request.COOKIES.get('user','') + try: + name=merchant.objects.get(username=value).name + except: + pass + shops=market.objects.filter(is_rented=False) + return render(request,'rent.html',locals()) + return render(request,'rent_add.html',locals()) + elif request.method=='POST': + _type=request.POST['type'] + _name=request.POST['name'] + id=int(request.GET['shop_id']) + _market=market.objects.get(id=id) + _market.is_rented=True + _market.save() + t=type.objects.get(typename=_type) + value=request.COOKIES.get('user','') + m=merchant.objects.get(username=value) + shop.objects.create(name=_name,market=_market,merchant=m,type=t) + return HttpResponseRedirect("myshop") \ No newline at end of file diff --git "a/3\343\200\201\347\224\250Python\345\256\236\347\216\260\344\270\200\344\270\252\345\225\206\345\234\272\347\256\241\347\220\206\347\263\273\347\273\237(\351\231\204\346\272\220\347\240\201)/Django+Mysql+Bulma\345\256\236\347\216\260\347\232\204\345\225\206\345\234\272\347\256\241\347\220\206\347\263\273\347\273\237\346\272\220\347\240\201/shopping-mall-master/manage.py" "b/3\343\200\201\347\224\250Python\345\256\236\347\216\260\344\270\200\344\270\252\345\225\206\345\234\272\347\256\241\347\220\206\347\263\273\347\273\237(\351\231\204\346\272\220\347\240\201)/Django+Mysql+Bulma\345\256\236\347\216\260\347\232\204\345\225\206\345\234\272\347\256\241\347\220\206\347\263\273\347\273\237\346\272\220\347\240\201/shopping-mall-master/manage.py" new file mode 100644 index 0000000..89057a7 --- /dev/null +++ "b/3\343\200\201\347\224\250Python\345\256\236\347\216\260\344\270\200\344\270\252\345\225\206\345\234\272\347\256\241\347\220\206\347\263\273\347\273\237(\351\231\204\346\272\220\347\240\201)/Django+Mysql+Bulma\345\256\236\347\216\260\347\232\204\345\225\206\345\234\272\347\256\241\347\220\206\347\263\273\347\273\237\346\272\220\347\240\201/shopping-mall-master/manage.py" @@ -0,0 +1,23 @@ +#!/usr/bin/env python +"""Django's command-line utility for administrative tasks.""" +import os +import sys + + +def main(): + """Run administrative tasks.""" + os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'shoppingmall.settings') + try: + from django.core.management import execute_from_command_line + except ImportError as exc: + raise ImportError( + "Couldn't import Django. Are you sure it's installed and " + "available on your PYTHONPATH environment variable? Did you " + "forget to activate a virtual environment?" + ) from exc + execute_from_command_line(sys.argv) + + +if __name__ == '__main__': + main() + diff --git a/flask/apps/views.py "b/3\343\200\201\347\224\250Python\345\256\236\347\216\260\344\270\200\344\270\252\345\225\206\345\234\272\347\256\241\347\220\206\347\263\273\347\273\237(\351\231\204\346\272\220\347\240\201)/Django+Mysql+Bulma\345\256\236\347\216\260\347\232\204\345\225\206\345\234\272\347\256\241\347\220\206\347\263\273\347\273\237\346\272\220\347\240\201/shopping-mall-master/shoppingmall/__init__.py" similarity index 100% rename from flask/apps/views.py rename to "3\343\200\201\347\224\250Python\345\256\236\347\216\260\344\270\200\344\270\252\345\225\206\345\234\272\347\256\241\347\220\206\347\263\273\347\273\237(\351\231\204\346\272\220\347\240\201)/Django+Mysql+Bulma\345\256\236\347\216\260\347\232\204\345\225\206\345\234\272\347\256\241\347\220\206\347\263\273\347\273\237\346\272\220\347\240\201/shopping-mall-master/shoppingmall/__init__.py" diff --git "a/3\343\200\201\347\224\250Python\345\256\236\347\216\260\344\270\200\344\270\252\345\225\206\345\234\272\347\256\241\347\220\206\347\263\273\347\273\237(\351\231\204\346\272\220\347\240\201)/Django+Mysql+Bulma\345\256\236\347\216\260\347\232\204\345\225\206\345\234\272\347\256\241\347\220\206\347\263\273\347\273\237\346\272\220\347\240\201/shopping-mall-master/shoppingmall/asgi.py" "b/3\343\200\201\347\224\250Python\345\256\236\347\216\260\344\270\200\344\270\252\345\225\206\345\234\272\347\256\241\347\220\206\347\263\273\347\273\237(\351\231\204\346\272\220\347\240\201)/Django+Mysql+Bulma\345\256\236\347\216\260\347\232\204\345\225\206\345\234\272\347\256\241\347\220\206\347\263\273\347\273\237\346\272\220\347\240\201/shopping-mall-master/shoppingmall/asgi.py" new file mode 100644 index 0000000..d69baf5 --- /dev/null +++ "b/3\343\200\201\347\224\250Python\345\256\236\347\216\260\344\270\200\344\270\252\345\225\206\345\234\272\347\256\241\347\220\206\347\263\273\347\273\237(\351\231\204\346\272\220\347\240\201)/Django+Mysql+Bulma\345\256\236\347\216\260\347\232\204\345\225\206\345\234\272\347\256\241\347\220\206\347\263\273\347\273\237\346\272\220\347\240\201/shopping-mall-master/shoppingmall/asgi.py" @@ -0,0 +1,16 @@ +""" +ASGI config for shoppingmall project. + +It exposes the ASGI callable as a module-level variable named ``application``. + +For more information on this file, see +https://docs.djangoproject.com/en/3.2/howto/deployment/asgi/ +""" + +import os + +from django.core.asgi import get_asgi_application + +os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'shoppingmall.settings') + +application = get_asgi_application() diff --git "a/3\343\200\201\347\224\250Python\345\256\236\347\216\260\344\270\200\344\270\252\345\225\206\345\234\272\347\256\241\347\220\206\347\263\273\347\273\237(\351\231\204\346\272\220\347\240\201)/Django+Mysql+Bulma\345\256\236\347\216\260\347\232\204\345\225\206\345\234\272\347\256\241\347\220\206\347\263\273\347\273\237\346\272\220\347\240\201/shopping-mall-master/shoppingmall/settings.py" "b/3\343\200\201\347\224\250Python\345\256\236\347\216\260\344\270\200\344\270\252\345\225\206\345\234\272\347\256\241\347\220\206\347\263\273\347\273\237(\351\231\204\346\272\220\347\240\201)/Django+Mysql+Bulma\345\256\236\347\216\260\347\232\204\345\225\206\345\234\272\347\256\241\347\220\206\347\263\273\347\273\237\346\272\220\347\240\201/shopping-mall-master/shoppingmall/settings.py" new file mode 100644 index 0000000..1b328bb --- /dev/null +++ "b/3\343\200\201\347\224\250Python\345\256\236\347\216\260\344\270\200\344\270\252\345\225\206\345\234\272\347\256\241\347\220\206\347\263\273\347\273\237(\351\231\204\346\272\220\347\240\201)/Django+Mysql+Bulma\345\256\236\347\216\260\347\232\204\345\225\206\345\234\272\347\256\241\347\220\206\347\263\273\347\273\237\346\272\220\347\240\201/shopping-mall-master/shoppingmall/settings.py" @@ -0,0 +1,138 @@ +""" +Django settings for shoppingmall project. + +Generated by 'django-admin startproject' using Django 3.2. + +For more information on this file, see +https://docs.djangoproject.com/en/3.2/topics/settings/ + +For the full list of settings and their values, see +https://docs.djangoproject.com/en/3.2/ref/settings/ +""" + +from pathlib import Path + +# Build paths inside the project like this: BASE_DIR / 'subdir'. +BASE_DIR = Path(__file__).resolve().parent.parent + + +# Quick-start development settings - unsuitable for production +# See https://docs.djangoproject.com/en/3.2/howto/deployment/checklist/ + +# SECURITY WARNING: keep the secret key used in production secret! +SECRET_KEY = 'django-insecure-b67!r9wqg3sste#io%puya&t4*n7g&2g7@^fe96b0-drt70b7t' + +# SECURITY WARNING: don't run with debug turned on in production! +DEBUG = True + +ALLOWED_HOSTS = ['127.0.0.1','localhost','10.241.77.166'] + + +# Application definition + +INSTALLED_APPS = [ + 'django.contrib.admin', + 'django.contrib.auth', + 'django.contrib.contenttypes', + 'django.contrib.sessions', + 'django.contrib.messages', + 'django.contrib.staticfiles', + 'mall', + 'django_apscheduler', +] + +MIDDLEWARE = [ + 'django.middleware.security.SecurityMiddleware', + 'django.contrib.sessions.middleware.SessionMiddleware', + 'django.middleware.common.CommonMiddleware', + # 'django.middleware.csrf.CsrfViewMiddleware', + 'django.contrib.auth.middleware.AuthenticationMiddleware', + 'django.contrib.messages.middleware.MessageMiddleware', + 'django.middleware.clickjacking.XFrameOptionsMiddleware', +] + +ROOT_URLCONF = 'shoppingmall.urls' + +import os + +TEMPLATES = [ + { + 'BACKEND': 'django.template.backends.django.DjangoTemplates', + 'DIRS': [os.path.join(BASE_DIR,"templates")], + 'APP_DIRS': True, + 'OPTIONS': { + 'context_processors': [ + 'django.template.context_processors.debug', + 'django.template.context_processors.request', + 'django.contrib.auth.context_processors.auth', + 'django.contrib.messages.context_processors.messages', + ], + }, + }, +] + +WSGI_APPLICATION = 'shoppingmall.wsgi.application' + + +# Database +# https://docs.djangoproject.com/en/3.2/ref/settings/#databases + +DATABASES = { + 'default': { + 'ENGINE': 'django.db.backends.mysql', + 'NAME': 'mall', + 'USER': 'root', + 'PASSWORD': '123', + 'HOST': 'localhost', + 'PORT': '3306', + } +} + + +# Password validation +# https://docs.djangoproject.com/en/3.2/ref/settings/#auth-password-validators + +AUTH_PASSWORD_VALIDATORS = [ + { + 'NAME': 'django.contrib.auth.password_validation.UserAttributeSimilarityValidator', + }, + { + 'NAME': 'django.contrib.auth.password_validation.MinimumLengthValidator', + }, + { + 'NAME': 'django.contrib.auth.password_validation.CommonPasswordValidator', + }, + { + 'NAME': 'django.contrib.auth.password_validation.NumericPasswordValidator', + }, +] + + +# Internationalization +# https://docs.djangoproject.com/en/3.2/topics/i18n/ + +LANGUAGE_CODE = 'zh-Hans' + +TIME_ZONE = 'Asia/Shanghai' + +USE_I18N = True + +USE_L10N = True + +USE_TZ = True + + +# Static files (CSS, JavaScript, Images) +# https://docs.djangoproject.com/en/3.2/howto/static-files/ + +# 静态文件路由 +STATIC_URL = '/static/' +#静态文件的存储路径 +STATICFILES_DIRS = ( + os.path.join(BASE_DIR,"static"), +) + +# Default primary key field type +# https://docs.djangoproject.com/en/3.2/ref/settings/#default-auto-field + +DEFAULT_AUTO_FIELD = 'django.db.models.BigAutoField' diff --git "a/3\343\200\201\347\224\250Python\345\256\236\347\216\260\344\270\200\344\270\252\345\225\206\345\234\272\347\256\241\347\220\206\347\263\273\347\273\237(\351\231\204\346\272\220\347\240\201)/Django+Mysql+Bulma\345\256\236\347\216\260\347\232\204\345\225\206\345\234\272\347\256\241\347\220\206\347\263\273\347\273\237\346\272\220\347\240\201/shopping-mall-master/shoppingmall/urls.py" "b/3\343\200\201\347\224\250Python\345\256\236\347\216\260\344\270\200\344\270\252\345\225\206\345\234\272\347\256\241\347\220\206\347\263\273\347\273\237(\351\231\204\346\272\220\347\240\201)/Django+Mysql+Bulma\345\256\236\347\216\260\347\232\204\345\225\206\345\234\272\347\256\241\347\220\206\347\263\273\347\273\237\346\272\220\347\240\201/shopping-mall-master/shoppingmall/urls.py" new file mode 100644 index 0000000..24ab454 --- /dev/null +++ "b/3\343\200\201\347\224\250Python\345\256\236\347\216\260\344\270\200\344\270\252\345\225\206\345\234\272\347\256\241\347\220\206\347\263\273\347\273\237(\351\231\204\346\272\220\347\240\201)/Django+Mysql+Bulma\345\256\236\347\216\260\347\232\204\345\225\206\345\234\272\347\256\241\347\220\206\347\263\273\347\273\237\346\272\220\347\240\201/shopping-mall-master/shoppingmall/urls.py" @@ -0,0 +1,22 @@ +"""shoppingmall URL Configuration + +The `urlpatterns` list routes URLs to views. For more information please see: + https://docs.djangoproject.com/en/3.2/topics/http/urls/ +Examples: +Function views + 1. Add an import: from my_app import views + 2. Add a URL to urlpatterns: path('', views.home, name='home') +Class-based views + 1. Add an import: from other_app.views import Home + 2. Add a URL to urlpatterns: path('', Home.as_view(), name='home') +Including another URLconf + 1. Import the include() function: from django.urls import include, path + 2. Add a URL to urlpatterns: path('blog/', include('blog.urls')) +""" +from django.contrib import admin +from django.urls import path,include + +urlpatterns = [ + path('admin/', admin.site.urls), + path('',include("mall.urls")) +] diff --git "a/3\343\200\201\347\224\250Python\345\256\236\347\216\260\344\270\200\344\270\252\345\225\206\345\234\272\347\256\241\347\220\206\347\263\273\347\273\237(\351\231\204\346\272\220\347\240\201)/Django+Mysql+Bulma\345\256\236\347\216\260\347\232\204\345\225\206\345\234\272\347\256\241\347\220\206\347\263\273\347\273\237\346\272\220\347\240\201/shopping-mall-master/shoppingmall/wsgi.py" "b/3\343\200\201\347\224\250Python\345\256\236\347\216\260\344\270\200\344\270\252\345\225\206\345\234\272\347\256\241\347\220\206\347\263\273\347\273\237(\351\231\204\346\272\220\347\240\201)/Django+Mysql+Bulma\345\256\236\347\216\260\347\232\204\345\225\206\345\234\272\347\256\241\347\220\206\347\263\273\347\273\237\346\272\220\347\240\201/shopping-mall-master/shoppingmall/wsgi.py" new file mode 100644 index 0000000..0dee819 --- /dev/null +++ "b/3\343\200\201\347\224\250Python\345\256\236\347\216\260\344\270\200\344\270\252\345\225\206\345\234\272\347\256\241\347\220\206\347\263\273\347\273\237(\351\231\204\346\272\220\347\240\201)/Django+Mysql+Bulma\345\256\236\347\216\260\347\232\204\345\225\206\345\234\272\347\256\241\347\220\206\347\263\273\347\273\237\346\272\220\347\240\201/shopping-mall-master/shoppingmall/wsgi.py" @@ -0,0 +1,16 @@ +""" +WSGI config for shoppingmall project. + +It exposes the WSGI callable as a module-level variable named ``application``. + +For more information on this file, see +https://docs.djangoproject.com/en/3.2/howto/deployment/wsgi/ +""" + +import os + +from django.core.wsgi import get_wsgi_application + +os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'shoppingmall.settings') + +application = get_wsgi_application() diff --git "a/3\343\200\201\347\224\250Python\345\256\236\347\216\260\344\270\200\344\270\252\345\225\206\345\234\272\347\256\241\347\220\206\347\263\273\347\273\237(\351\231\204\346\272\220\347\240\201)/Django+Mysql+Bulma\345\256\236\347\216\260\347\232\204\345\225\206\345\234\272\347\256\241\347\220\206\347\263\273\347\273\237\346\272\220\347\240\201/shopping-mall-master/static/img/1.png" "b/3\343\200\201\347\224\250Python\345\256\236\347\216\260\344\270\200\344\270\252\345\225\206\345\234\272\347\256\241\347\220\206\347\263\273\347\273\237(\351\231\204\346\272\220\347\240\201)/Django+Mysql+Bulma\345\256\236\347\216\260\347\232\204\345\225\206\345\234\272\347\256\241\347\220\206\347\263\273\347\273\237\346\272\220\347\240\201/shopping-mall-master/static/img/1.png" new file mode 100644 index 0000000..f86d8d4 Binary files /dev/null and "b/3\343\200\201\347\224\250Python\345\256\236\347\216\260\344\270\200\344\270\252\345\225\206\345\234\272\347\256\241\347\220\206\347\263\273\347\273\237(\351\231\204\346\272\220\347\240\201)/Django+Mysql+Bulma\345\256\236\347\216\260\347\232\204\345\225\206\345\234\272\347\256\241\347\220\206\347\263\273\347\273\237\346\272\220\347\240\201/shopping-mall-master/static/img/1.png" differ diff --git "a/3\343\200\201\347\224\250Python\345\256\236\347\216\260\344\270\200\344\270\252\345\225\206\345\234\272\347\256\241\347\220\206\347\263\273\347\273\237(\351\231\204\346\272\220\347\240\201)/Django+Mysql+Bulma\345\256\236\347\216\260\347\232\204\345\225\206\345\234\272\347\256\241\347\220\206\347\263\273\347\273\237\346\272\220\347\240\201/shopping-mall-master/static/img/2.png" "b/3\343\200\201\347\224\250Python\345\256\236\347\216\260\344\270\200\344\270\252\345\225\206\345\234\272\347\256\241\347\220\206\347\263\273\347\273\237(\351\231\204\346\272\220\347\240\201)/Django+Mysql+Bulma\345\256\236\347\216\260\347\232\204\345\225\206\345\234\272\347\256\241\347\220\206\347\263\273\347\273\237\346\272\220\347\240\201/shopping-mall-master/static/img/2.png" new file mode 100644 index 0000000..288d397 Binary files /dev/null and "b/3\343\200\201\347\224\250Python\345\256\236\347\216\260\344\270\200\344\270\252\345\225\206\345\234\272\347\256\241\347\220\206\347\263\273\347\273\237(\351\231\204\346\272\220\347\240\201)/Django+Mysql+Bulma\345\256\236\347\216\260\347\232\204\345\225\206\345\234\272\347\256\241\347\220\206\347\263\273\347\273\237\346\272\220\347\240\201/shopping-mall-master/static/img/2.png" differ diff --git "a/3\343\200\201\347\224\250Python\345\256\236\347\216\260\344\270\200\344\270\252\345\225\206\345\234\272\347\256\241\347\220\206\347\263\273\347\273\237(\351\231\204\346\272\220\347\240\201)/Django+Mysql+Bulma\345\256\236\347\216\260\347\232\204\345\225\206\345\234\272\347\256\241\347\220\206\347\263\273\347\273\237\346\272\220\347\240\201/shopping-mall-master/static/img/3.png" "b/3\343\200\201\347\224\250Python\345\256\236\347\216\260\344\270\200\344\270\252\345\225\206\345\234\272\347\256\241\347\220\206\347\263\273\347\273\237(\351\231\204\346\272\220\347\240\201)/Django+Mysql+Bulma\345\256\236\347\216\260\347\232\204\345\225\206\345\234\272\347\256\241\347\220\206\347\263\273\347\273\237\346\272\220\347\240\201/shopping-mall-master/static/img/3.png" new file mode 100644 index 0000000..7252591 Binary files /dev/null and "b/3\343\200\201\347\224\250Python\345\256\236\347\216\260\344\270\200\344\270\252\345\225\206\345\234\272\347\256\241\347\220\206\347\263\273\347\273\237(\351\231\204\346\272\220\347\240\201)/Django+Mysql+Bulma\345\256\236\347\216\260\347\232\204\345\225\206\345\234\272\347\256\241\347\220\206\347\263\273\347\273\237\346\272\220\347\240\201/shopping-mall-master/static/img/3.png" differ diff --git "a/3\343\200\201\347\224\250Python\345\256\236\347\216\260\344\270\200\344\270\252\345\225\206\345\234\272\347\256\241\347\220\206\347\263\273\347\273\237(\351\231\204\346\272\220\347\240\201)/Django+Mysql+Bulma\345\256\236\347\216\260\347\232\204\345\225\206\345\234\272\347\256\241\347\220\206\347\263\273\347\273\237\346\272\220\347\240\201/shopping-mall-master/static/img/cover.jpg" "b/3\343\200\201\347\224\250Python\345\256\236\347\216\260\344\270\200\344\270\252\345\225\206\345\234\272\347\256\241\347\220\206\347\263\273\347\273\237(\351\231\204\346\272\220\347\240\201)/Django+Mysql+Bulma\345\256\236\347\216\260\347\232\204\345\225\206\345\234\272\347\256\241\347\220\206\347\263\273\347\273\237\346\272\220\347\240\201/shopping-mall-master/static/img/cover.jpg" new file mode 100644 index 0000000..81107d9 Binary files /dev/null and "b/3\343\200\201\347\224\250Python\345\256\236\347\216\260\344\270\200\344\270\252\345\225\206\345\234\272\347\256\241\347\220\206\347\263\273\347\273\237(\351\231\204\346\272\220\347\240\201)/Django+Mysql+Bulma\345\256\236\347\216\260\347\232\204\345\225\206\345\234\272\347\256\241\347\220\206\347\263\273\347\273\237\346\272\220\347\240\201/shopping-mall-master/static/img/cover.jpg" differ diff --git "a/3\343\200\201\347\224\250Python\345\256\236\347\216\260\344\270\200\344\270\252\345\225\206\345\234\272\347\256\241\347\220\206\347\263\273\347\273\237(\351\231\204\346\272\220\347\240\201)/Django+Mysql+Bulma\345\256\236\347\216\260\347\232\204\345\225\206\345\234\272\347\256\241\347\220\206\347\263\273\347\273\237\346\272\220\347\240\201/shopping-mall-master/static/img/database.png" "b/3\343\200\201\347\224\250Python\345\256\236\347\216\260\344\270\200\344\270\252\345\225\206\345\234\272\347\256\241\347\220\206\347\263\273\347\273\237(\351\231\204\346\272\220\347\240\201)/Django+Mysql+Bulma\345\256\236\347\216\260\347\232\204\345\225\206\345\234\272\347\256\241\347\220\206\347\263\273\347\273\237\346\272\220\347\240\201/shopping-mall-master/static/img/database.png" new file mode 100644 index 0000000..ee69ed7 Binary files /dev/null and "b/3\343\200\201\347\224\250Python\345\256\236\347\216\260\344\270\200\344\270\252\345\225\206\345\234\272\347\256\241\347\220\206\347\263\273\347\273\237(\351\231\204\346\272\220\347\240\201)/Django+Mysql+Bulma\345\256\236\347\216\260\347\232\204\345\225\206\345\234\272\347\256\241\347\220\206\347\263\273\347\273\237\346\272\220\347\240\201/shopping-mall-master/static/img/database.png" differ diff --git "a/3\343\200\201\347\224\250Python\345\256\236\347\216\260\344\270\200\344\270\252\345\225\206\345\234\272\347\256\241\347\220\206\347\263\273\347\273\237(\351\231\204\346\272\220\347\240\201)/Django+Mysql+Bulma\345\256\236\347\216\260\347\232\204\345\225\206\345\234\272\347\256\241\347\220\206\347\263\273\347\273\237\346\272\220\347\240\201/shopping-mall-master/static/img/design.png" "b/3\343\200\201\347\224\250Python\345\256\236\347\216\260\344\270\200\344\270\252\345\225\206\345\234\272\347\256\241\347\220\206\347\263\273\347\273\237(\351\231\204\346\272\220\347\240\201)/Django+Mysql+Bulma\345\256\236\347\216\260\347\232\204\345\225\206\345\234\272\347\256\241\347\220\206\347\263\273\347\273\237\346\272\220\347\240\201/shopping-mall-master/static/img/design.png" new file mode 100644 index 0000000..3774c1f Binary files /dev/null and "b/3\343\200\201\347\224\250Python\345\256\236\347\216\260\344\270\200\344\270\252\345\225\206\345\234\272\347\256\241\347\220\206\347\263\273\347\273\237(\351\231\204\346\272\220\347\240\201)/Django+Mysql+Bulma\345\256\236\347\216\260\347\232\204\345\225\206\345\234\272\347\256\241\347\220\206\347\263\273\347\273\237\346\272\220\347\240\201/shopping-mall-master/static/img/design.png" differ diff --git "a/3\343\200\201\347\224\250Python\345\256\236\347\216\260\344\270\200\344\270\252\345\225\206\345\234\272\347\256\241\347\220\206\347\263\273\347\273\237(\351\231\204\346\272\220\347\240\201)/Django+Mysql+Bulma\345\256\236\347\216\260\347\232\204\345\225\206\345\234\272\347\256\241\347\220\206\347\263\273\347\273\237\346\272\220\347\240\201/shopping-mall-master/static/img/favicon.png" "b/3\343\200\201\347\224\250Python\345\256\236\347\216\260\344\270\200\344\270\252\345\225\206\345\234\272\347\256\241\347\220\206\347\263\273\347\273\237(\351\231\204\346\272\220\347\240\201)/Django+Mysql+Bulma\345\256\236\347\216\260\347\232\204\345\225\206\345\234\272\347\256\241\347\220\206\347\263\273\347\273\237\346\272\220\347\240\201/shopping-mall-master/static/img/favicon.png" new file mode 100644 index 0000000..bab7c72 Binary files /dev/null and "b/3\343\200\201\347\224\250Python\345\256\236\347\216\260\344\270\200\344\270\252\345\225\206\345\234\272\347\256\241\347\220\206\347\263\273\347\273\237(\351\231\204\346\272\220\347\240\201)/Django+Mysql+Bulma\345\256\236\347\216\260\347\232\204\345\225\206\345\234\272\347\256\241\347\220\206\347\263\273\347\273\237\346\272\220\347\240\201/shopping-mall-master/static/img/favicon.png" differ diff --git "a/3\343\200\201\347\224\250Python\345\256\236\347\216\260\344\270\200\344\270\252\345\225\206\345\234\272\347\256\241\347\220\206\347\263\273\347\273\237(\351\231\204\346\272\220\347\240\201)/Django+Mysql+Bulma\345\256\236\347\216\260\347\232\204\345\225\206\345\234\272\347\256\241\347\220\206\347\263\273\347\273\237\346\272\220\347\240\201/shopping-mall-master/templates/banner.html" "b/3\343\200\201\347\224\250Python\345\256\236\347\216\260\344\270\200\344\270\252\345\225\206\345\234\272\347\256\241\347\220\206\347\263\273\347\273\237(\351\231\204\346\272\220\347\240\201)/Django+Mysql+Bulma\345\256\236\347\216\260\347\232\204\345\225\206\345\234\272\347\256\241\347\220\206\347\263\273\347\273\237\346\272\220\347\240\201/shopping-mall-master/templates/banner.html" new file mode 100644 index 0000000..ead0d50 --- /dev/null +++ "b/3\343\200\201\347\224\250Python\345\256\236\347\216\260\344\270\200\344\270\252\345\225\206\345\234\272\347\256\241\347\220\206\347\263\273\347\273\237(\351\231\204\346\272\220\347\240\201)/Django+Mysql+Bulma\345\256\236\347\216\260\347\232\204\345\225\206\345\234\272\347\256\241\347\220\206\347\263\273\347\273\237\346\272\220\347\240\201/shopping-mall-master/templates/banner.html" @@ -0,0 +1,67 @@ + + + + + {% load static %} + + + + + {% block title %} + Document + {% endblock %} + + + + + +
+
+

兴盛商场

+
+ +
+
+
+ {% block login %} + + + + {% endblock %} +
+
+
+
+ {% block content %} {% endblock %} + + + \ No newline at end of file diff --git "a/3\343\200\201\347\224\250Python\345\256\236\347\216\260\344\270\200\344\270\252\345\225\206\345\234\272\347\256\241\347\220\206\347\263\273\347\273\237(\351\231\204\346\272\220\347\240\201)/Django+Mysql+Bulma\345\256\236\347\216\260\347\232\204\345\225\206\345\234\272\347\256\241\347\220\206\347\263\273\347\273\237\346\272\220\347\240\201/shopping-mall-master/templates/charge.html" "b/3\343\200\201\347\224\250Python\345\256\236\347\216\260\344\270\200\344\270\252\345\225\206\345\234\272\347\256\241\347\220\206\347\263\273\347\273\237(\351\231\204\346\272\220\347\240\201)/Django+Mysql+Bulma\345\256\236\347\216\260\347\232\204\345\225\206\345\234\272\347\256\241\347\220\206\347\263\273\347\273\237\346\272\220\347\240\201/shopping-mall-master/templates/charge.html" new file mode 100644 index 0000000..bc11cce --- /dev/null +++ "b/3\343\200\201\347\224\250Python\345\256\236\347\216\260\344\270\200\344\270\252\345\225\206\345\234\272\347\256\241\347\220\206\347\263\273\347\273\237(\351\231\204\346\272\220\347\240\201)/Django+Mysql+Bulma\345\256\236\347\216\260\347\232\204\345\225\206\345\234\272\347\256\241\347\220\206\347\263\273\347\273\237\346\272\220\347\240\201/shopping-mall-master/templates/charge.html" @@ -0,0 +1,47 @@ +{% extends 'banner.html' %} {% block title %} +充值 +{% endblock %} {% block login %}{% if value != '' %} + + + +{% else %} + {% endif %}{% endblock %} {% block content %} +
+
+
+

您本月需要缴费{{ money }}

+

您目前的余额为{{ mer.balance }}

+
+
+
+
+
+

充值金额

+
+
+
+
+ +
+
+
+ +
+
+
+
+
+ + +{% endblock %} \ No newline at end of file diff --git "a/3\343\200\201\347\224\250Python\345\256\236\347\216\260\344\270\200\344\270\252\345\225\206\345\234\272\347\256\241\347\220\206\347\263\273\347\273\237(\351\231\204\346\272\220\347\240\201)/Django+Mysql+Bulma\345\256\236\347\216\260\347\232\204\345\225\206\345\234\272\347\256\241\347\220\206\347\263\273\347\273\237\346\272\220\347\240\201/shopping-mall-master/templates/index.html" "b/3\343\200\201\347\224\250Python\345\256\236\347\216\260\344\270\200\344\270\252\345\225\206\345\234\272\347\256\241\347\220\206\347\263\273\347\273\237(\351\231\204\346\272\220\347\240\201)/Django+Mysql+Bulma\345\256\236\347\216\260\347\232\204\345\225\206\345\234\272\347\256\241\347\220\206\347\263\273\347\273\237\346\272\220\347\240\201/shopping-mall-master/templates/index.html" new file mode 100644 index 0000000..17a399b --- /dev/null +++ "b/3\343\200\201\347\224\250Python\345\256\236\347\216\260\344\270\200\344\270\252\345\225\206\345\234\272\347\256\241\347\220\206\347\263\273\347\273\237(\351\231\204\346\272\220\347\240\201)/Django+Mysql+Bulma\345\256\236\347\216\260\347\232\204\345\225\206\345\234\272\347\256\241\347\220\206\347\263\273\347\273\237\346\272\220\347\240\201/shopping-mall-master/templates/index.html" @@ -0,0 +1,10 @@ +{% extends 'banner.html' %} {% block title %} +首页 +{% endblock %} {% block login %}{% if value != '' %} + + + +{% else %} + {% endif %}{% endblock %} {% block content %} + +{% endblock %} \ No newline at end of file diff --git "a/3\343\200\201\347\224\250Python\345\256\236\347\216\260\344\270\200\344\270\252\345\225\206\345\234\272\347\256\241\347\220\206\347\263\273\347\273\237(\351\231\204\346\272\220\347\240\201)/Django+Mysql+Bulma\345\256\236\347\216\260\347\232\204\345\225\206\345\234\272\347\256\241\347\220\206\347\263\273\347\273\237\346\272\220\347\240\201/shopping-mall-master/templates/login.html" "b/3\343\200\201\347\224\250Python\345\256\236\347\216\260\344\270\200\344\270\252\345\225\206\345\234\272\347\256\241\347\220\206\347\263\273\347\273\237(\351\231\204\346\272\220\347\240\201)/Django+Mysql+Bulma\345\256\236\347\216\260\347\232\204\345\225\206\345\234\272\347\256\241\347\220\206\347\263\273\347\273\237\346\272\220\347\240\201/shopping-mall-master/templates/login.html" new file mode 100644 index 0000000..e51be08 --- /dev/null +++ "b/3\343\200\201\347\224\250Python\345\256\236\347\216\260\344\270\200\344\270\252\345\225\206\345\234\272\347\256\241\347\220\206\347\263\273\347\273\237(\351\231\204\346\272\220\347\240\201)/Django+Mysql+Bulma\345\256\236\347\216\260\347\232\204\345\225\206\345\234\272\347\256\241\347\220\206\347\263\273\347\273\237\346\272\220\347\240\201/shopping-mall-master/templates/login.html" @@ -0,0 +1,38 @@ +{% extends 'banner.html' %} {% block title %} +登录 +{% endblock %} {% block content %} +
+
+
+
+
+ {% if value == '' %} +
+
+ +
+ +
+
+ +
+ +
+ +

+ + + +
+
+ {% else %} +
+

欢迎用户:{{ name }}

+ + + {% endif %} +
+
+
+
+{% endblock %} \ No newline at end of file diff --git "a/3\343\200\201\347\224\250Python\345\256\236\347\216\260\344\270\200\344\270\252\345\225\206\345\234\272\347\256\241\347\220\206\347\263\273\347\273\237(\351\231\204\346\272\220\347\240\201)/Django+Mysql+Bulma\345\256\236\347\216\260\347\232\204\345\225\206\345\234\272\347\256\241\347\220\206\347\263\273\347\273\237\346\272\220\347\240\201/shopping-mall-master/templates/rent.html" "b/3\343\200\201\347\224\250Python\345\256\236\347\216\260\344\270\200\344\270\252\345\225\206\345\234\272\347\256\241\347\220\206\347\263\273\347\273\237(\351\231\204\346\272\220\347\240\201)/Django+Mysql+Bulma\345\256\236\347\216\260\347\232\204\345\225\206\345\234\272\347\256\241\347\220\206\347\263\273\347\273\237\346\272\220\347\240\201/shopping-mall-master/templates/rent.html" new file mode 100644 index 0000000..dfa1f9c --- /dev/null +++ "b/3\343\200\201\347\224\250Python\345\256\236\347\216\260\344\270\200\344\270\252\345\225\206\345\234\272\347\256\241\347\220\206\347\263\273\347\273\237(\351\231\204\346\272\220\347\240\201)/Django+Mysql+Bulma\345\256\236\347\216\260\347\232\204\345\225\206\345\234\272\347\256\241\347\220\206\347\263\273\347\273\237\346\272\220\347\240\201/shopping-mall-master/templates/rent.html" @@ -0,0 +1,30 @@ +{% extends 'banner.html' %} {% block title %} +商铺管理 +{% endblock %} {% block login %}{% if value != '' %} + + + +{% else %} + {% endif %}{% endblock %} {% block content %} +
+
+ + + + + + + {% for shop in shops %} + + + + + + {% endfor %} +
商铺地段商铺租金操作
{{ shop.pos }}{{ shop.rent.price }} + + 租该商铺 + +
+
+{% endblock %} \ No newline at end of file diff --git "a/3\343\200\201\347\224\250Python\345\256\236\347\216\260\344\270\200\344\270\252\345\225\206\345\234\272\347\256\241\347\220\206\347\263\273\347\273\237(\351\231\204\346\272\220\347\240\201)/Django+Mysql+Bulma\345\256\236\347\216\260\347\232\204\345\225\206\345\234\272\347\256\241\347\220\206\347\263\273\347\273\237\346\272\220\347\240\201/shopping-mall-master/templates/rent_add.html" "b/3\343\200\201\347\224\250Python\345\256\236\347\216\260\344\270\200\344\270\252\345\225\206\345\234\272\347\256\241\347\220\206\347\263\273\347\273\237(\351\231\204\346\272\220\347\240\201)/Django+Mysql+Bulma\345\256\236\347\216\260\347\232\204\345\225\206\345\234\272\347\256\241\347\220\206\347\263\273\347\273\237\346\272\220\347\240\201/shopping-mall-master/templates/rent_add.html" new file mode 100644 index 0000000..7ff181b --- /dev/null +++ "b/3\343\200\201\347\224\250Python\345\256\236\347\216\260\344\270\200\344\270\252\345\225\206\345\234\272\347\256\241\347\220\206\347\263\273\347\273\237(\351\231\204\346\272\220\347\240\201)/Django+Mysql+Bulma\345\256\236\347\216\260\347\232\204\345\225\206\345\234\272\347\256\241\347\220\206\347\263\273\347\273\237\346\272\220\347\240\201/shopping-mall-master/templates/rent_add.html" @@ -0,0 +1,39 @@ +{% extends 'banner.html' %} {% block title %} +商铺信息确认 +{% endblock %} {% block login %}{% if value != '' %} + + + +{% else %} + {% endif %}{% endblock %} {% block content %} +
+
+
+

确认信息

+
+ +
+
+
+
+ +
+
+
+ +
+
+
+
+
+ + +{% endblock %} \ No newline at end of file diff --git "a/3\343\200\201\347\224\250Python\345\256\236\347\216\260\344\270\200\344\270\252\345\225\206\345\234\272\347\256\241\347\220\206\347\263\273\347\273\237(\351\231\204\346\272\220\347\240\201)/Django+Mysql+Bulma\345\256\236\347\216\260\347\232\204\345\225\206\345\234\272\347\256\241\347\220\206\347\263\273\347\273\237\346\272\220\347\240\201/shopping-mall-master/templates/shopdetail.html" "b/3\343\200\201\347\224\250Python\345\256\236\347\216\260\344\270\200\344\270\252\345\225\206\345\234\272\347\256\241\347\220\206\347\263\273\347\273\237(\351\231\204\346\272\220\347\240\201)/Django+Mysql+Bulma\345\256\236\347\216\260\347\232\204\345\225\206\345\234\272\347\256\241\347\220\206\347\263\273\347\273\237\346\272\220\347\240\201/shopping-mall-master/templates/shopdetail.html" new file mode 100644 index 0000000..d0837b8 --- /dev/null +++ "b/3\343\200\201\347\224\250Python\345\256\236\347\216\260\344\270\200\344\270\252\345\225\206\345\234\272\347\256\241\347\220\206\347\263\273\347\273\237(\351\231\204\346\272\220\347\240\201)/Django+Mysql+Bulma\345\256\236\347\216\260\347\232\204\345\225\206\345\234\272\347\256\241\347\220\206\347\263\273\347\273\237\346\272\220\347\240\201/shopping-mall-master/templates/shopdetail.html" @@ -0,0 +1,33 @@ +{% extends 'banner.html' %} {% block title %} +商品信息 +{% endblock %}{% block login %}{% if value != '' %} + + + +{% else %} + {% endif %}{% endblock %}{% block content %} +
+
+ {% for g in goods %} +
+
+
+
+ {% if g.img == "" %} + Placeholder image {% else %} + Placeholder image{% endif %} +
+
+
+
+

{{ g.name }}

+

{{ g.detail }}

+ +
+
+
+
+ {% endfor %} +
+
+{% endblock %} \ No newline at end of file diff --git "a/3\343\200\201\347\224\250Python\345\256\236\347\216\260\344\270\200\344\270\252\345\225\206\345\234\272\347\256\241\347\220\206\347\263\273\347\273\237(\351\231\204\346\272\220\347\240\201)/Django+Mysql+Bulma\345\256\236\347\216\260\347\232\204\345\225\206\345\234\272\347\256\241\347\220\206\347\263\273\347\273\237\346\272\220\347\240\201/shopping-mall-master/templates/shoplist.html" "b/3\343\200\201\347\224\250Python\345\256\236\347\216\260\344\270\200\344\270\252\345\225\206\345\234\272\347\256\241\347\220\206\347\263\273\347\273\237(\351\231\204\346\272\220\347\240\201)/Django+Mysql+Bulma\345\256\236\347\216\260\347\232\204\345\225\206\345\234\272\347\256\241\347\220\206\347\263\273\347\273\237\346\272\220\347\240\201/shopping-mall-master/templates/shoplist.html" new file mode 100644 index 0000000..0719e5f --- /dev/null +++ "b/3\343\200\201\347\224\250Python\345\256\236\347\216\260\344\270\200\344\270\252\345\225\206\345\234\272\347\256\241\347\220\206\347\263\273\347\273\237(\351\231\204\346\272\220\347\240\201)/Django+Mysql+Bulma\345\256\236\347\216\260\347\232\204\345\225\206\345\234\272\347\256\241\347\220\206\347\263\273\347\273\237\346\272\220\347\240\201/shopping-mall-master/templates/shoplist.html" @@ -0,0 +1,24 @@ +{% extends 'banner.html' %} {% block title %} +商铺列表 +{% endblock %}{% block login %}{% if value != '' %} + + + +{% else %} + {% endif %}{% endblock %}{% block content %} +
+ \ No newline at end of file diff --git "a/3\343\200\201\347\224\250Python\345\256\236\347\216\260\344\270\200\344\270\252\345\225\206\345\234\272\347\256\241\347\220\206\347\263\273\347\273\237(\351\231\204\346\272\220\347\240\201)/Django+Mysql+Bulma\345\256\236\347\216\260\347\232\204\345\225\206\345\234\272\347\256\241\347\220\206\347\263\273\347\273\237\346\272\220\347\240\201/shopping-mall-master/templates/userinfo.html" "b/3\343\200\201\347\224\250Python\345\256\236\347\216\260\344\270\200\344\270\252\345\225\206\345\234\272\347\256\241\347\220\206\347\263\273\347\273\237(\351\231\204\346\272\220\347\240\201)/Django+Mysql+Bulma\345\256\236\347\216\260\347\232\204\345\225\206\345\234\272\347\256\241\347\220\206\347\263\273\347\273\237\346\272\220\347\240\201/shopping-mall-master/templates/userinfo.html" new file mode 100644 index 0000000..7f3d1f8 --- /dev/null +++ "b/3\343\200\201\347\224\250Python\345\256\236\347\216\260\344\270\200\344\270\252\345\225\206\345\234\272\347\256\241\347\220\206\347\263\273\347\273\237(\351\231\204\346\272\220\347\240\201)/Django+Mysql+Bulma\345\256\236\347\216\260\347\232\204\345\225\206\345\234\272\347\256\241\347\220\206\347\263\273\347\273\237\346\272\220\347\240\201/shopping-mall-master/templates/userinfo.html" @@ -0,0 +1,49 @@ +{% extends 'banner.html' %} {% block title %} +商户信息 +{% endblock %} {% block login %}{% if value != '' %} + + + +{% else %} + {% endif %}{% endblock %} {% block content %} +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + +
商户名{{ mer.name }}
用户名{{ mer.username }}
联系电话{{ mer.tel }}
余额{{ mer.balance }}
我的商铺 + 查看 +
操作 + + + + + + + +
+
+{% endblock %} \ No newline at end of file diff --git "a/3\343\200\201\347\224\250Python\345\256\236\347\216\260\344\270\200\344\270\252\345\225\206\345\234\272\347\256\241\347\220\206\347\263\273\347\273\237(\351\231\204\346\272\220\347\240\201)/Django+Mysql+Bulma\345\256\236\347\216\260\347\232\204\345\225\206\345\234\272\347\256\241\347\220\206\347\263\273\347\273\237\346\272\220\347\240\201/shopping-mall-master/templates/usershop.html" "b/3\343\200\201\347\224\250Python\345\256\236\347\216\260\344\270\200\344\270\252\345\225\206\345\234\272\347\256\241\347\220\206\347\263\273\347\273\237(\351\231\204\346\272\220\347\240\201)/Django+Mysql+Bulma\345\256\236\347\216\260\347\232\204\345\225\206\345\234\272\347\256\241\347\220\206\347\263\273\347\273\237\346\272\220\347\240\201/shopping-mall-master/templates/usershop.html" new file mode 100644 index 0000000..527d039 --- /dev/null +++ "b/3\343\200\201\347\224\250Python\345\256\236\347\216\260\344\270\200\344\270\252\345\225\206\345\234\272\347\256\241\347\220\206\347\263\273\347\273\237(\351\231\204\346\272\220\347\240\201)/Django+Mysql+Bulma\345\256\236\347\216\260\347\232\204\345\225\206\345\234\272\347\256\241\347\220\206\347\263\273\347\273\237\346\272\220\347\240\201/shopping-mall-master/templates/usershop.html" @@ -0,0 +1,32 @@ +{% extends 'banner.html' %} {% block title %} +商铺管理 +{% endblock %} {% block login %}{% if value != '' %} + + + +{% else %} + {% endif %}{% endblock %} {% block content %} +
+
+ + + + + + + + + + {% for shop in shops %} + + + + + + + + + {% endfor %} +
商铺名称商铺种类商铺地段本月水费本月电费本月租金
{{ shop.name }}{{ shop.type.typename }}{{ shop.market.pos }}{{ shop.type.paywater.money }}{{ shop.type.payelec.money }}{{ shop.market.rent.price }}
+
+{% endblock %} \ No newline at end of file diff --git "a/3\343\200\201\347\224\250Python\345\256\236\347\216\260\344\270\200\344\270\252\345\225\206\345\234\272\347\256\241\347\220\206\347\263\273\347\273\237(\351\231\204\346\272\220\347\240\201)/Django+Mysql+Bulma\345\256\236\347\216\260\347\232\204\345\225\206\345\234\272\347\256\241\347\220\206\347\263\273\347\273\237\346\272\220\347\240\201/shopping-mall-master/\344\275\277\347\224\250\350\257\264\346\230\216.md" "b/3\343\200\201\347\224\250Python\345\256\236\347\216\260\344\270\200\344\270\252\345\225\206\345\234\272\347\256\241\347\220\206\347\263\273\347\273\237(\351\231\204\346\272\220\347\240\201)/Django+Mysql+Bulma\345\256\236\347\216\260\347\232\204\345\225\206\345\234\272\347\256\241\347\220\206\347\263\273\347\273\237\346\272\220\347\240\201/shopping-mall-master/\344\275\277\347\224\250\350\257\264\346\230\216.md" new file mode 100644 index 0000000..0a54c58 --- /dev/null +++ "b/3\343\200\201\347\224\250Python\345\256\236\347\216\260\344\270\200\344\270\252\345\225\206\345\234\272\347\256\241\347\220\206\347\263\273\347\273\237(\351\231\204\346\272\220\347\240\201)/Django+Mysql+Bulma\345\256\236\347\216\260\347\232\204\345\225\206\345\234\272\347\256\241\347\220\206\347\263\273\347\273\237\346\272\220\347\240\201/shopping-mall-master/\344\275\277\347\224\250\350\257\264\346\230\216.md" @@ -0,0 +1,6 @@ +# 系统说明 + +链接:https://mp.weixin.qq.com/s/0FR4o2ddPe-9C2ijlnTuAg + +> 2022最强Python学习资料大礼包:https://mp.weixin.qq.com/s/sO6hbVqORy7JpN-5TlaKvQ + diff --git "a/4\343\200\201Python\350\207\252\345\212\250\345\214\226\345\212\236\345\205\254\345\260\217\347\250\213\345\272\217\357\274\232\345\256\236\347\216\260\346\212\245\350\241\250\350\207\252\345\212\250\345\214\226\345\222\214\350\207\252\345\212\250\345\217\221\351\200\201\345\210\260\347\233\256\347\232\204\351\202\256\347\256\261/README.md" "b/4\343\200\201Python\350\207\252\345\212\250\345\214\226\345\212\236\345\205\254\345\260\217\347\250\213\345\272\217\357\274\232\345\256\236\347\216\260\346\212\245\350\241\250\350\207\252\345\212\250\345\214\226\345\222\214\350\207\252\345\212\250\345\217\221\351\200\201\345\210\260\347\233\256\347\232\204\351\202\256\347\256\261/README.md" new file mode 100644 index 0000000..2a16c47 --- /dev/null +++ "b/4\343\200\201Python\350\207\252\345\212\250\345\214\226\345\212\236\345\205\254\345\260\217\347\250\213\345\272\217\357\274\232\345\256\236\347\216\260\346\212\245\350\241\250\350\207\252\345\212\250\345\214\226\345\222\214\350\207\252\345\212\250\345\217\221\351\200\201\345\210\260\347\233\256\347\232\204\351\202\256\347\256\261/README.md" @@ -0,0 +1,5 @@ +# 系统说明 + +使用链接:https://mp.weixin.qq.com/s/RfG502Hez7UttfHMndc4eA + +> 另外一个自动化报表的项目:https://mp.weixin.qq.com/s/STSRuN9Q9NpETKdYQBmxqQ \ No newline at end of file diff --git "a/5\343\200\201Python\346\213\233\350\201\230\345\262\227\344\275\215\344\277\241\346\201\257\350\201\232\345\220\210\347\263\273\347\273\237\357\274\210\346\213\245\346\234\211\347\210\254\350\231\253\347\210\254\345\217\226\343\200\201\346\225\260\346\215\256\345\210\206\346\236\220\343\200\201\345\217\257\350\247\206\345\214\226\343\200\201\344\272\222\345\212\250\347\255\211\345\212\237\350\203\275\357\274\211/WorkAggregation-master/.gitattributes" "b/5\343\200\201Python\346\213\233\350\201\230\345\262\227\344\275\215\344\277\241\346\201\257\350\201\232\345\220\210\347\263\273\347\273\237\357\274\210\346\213\245\346\234\211\347\210\254\350\231\253\347\210\254\345\217\226\343\200\201\346\225\260\346\215\256\345\210\206\346\236\220\343\200\201\345\217\257\350\247\206\345\214\226\343\200\201\344\272\222\345\212\250\347\255\211\345\212\237\350\203\275\357\274\211/WorkAggregation-master/.gitattributes" new file mode 100644 index 0000000..353810b --- /dev/null +++ "b/5\343\200\201Python\346\213\233\350\201\230\345\262\227\344\275\215\344\277\241\346\201\257\350\201\232\345\220\210\347\263\273\347\273\237\357\274\210\346\213\245\346\234\211\347\210\254\350\231\253\347\210\254\345\217\226\343\200\201\346\225\260\346\215\256\345\210\206\346\236\220\343\200\201\345\217\257\350\247\206\345\214\226\343\200\201\344\272\222\345\212\250\347\255\211\345\212\237\350\203\275\357\274\211/WorkAggregation-master/.gitattributes" @@ -0,0 +1,3 @@ + *.js linguist-language=python + *.css linguist-language=python + *.html linguist-language=python diff --git "a/5\343\200\201Python\346\213\233\350\201\230\345\262\227\344\275\215\344\277\241\346\201\257\350\201\232\345\220\210\347\263\273\347\273\237\357\274\210\346\213\245\346\234\211\347\210\254\350\231\253\347\210\254\345\217\226\343\200\201\346\225\260\346\215\256\345\210\206\346\236\220\343\200\201\345\217\257\350\247\206\345\214\226\343\200\201\344\272\222\345\212\250\347\255\211\345\212\237\350\203\275\357\274\211/WorkAggregation-master/.gitignore" "b/5\343\200\201Python\346\213\233\350\201\230\345\262\227\344\275\215\344\277\241\346\201\257\350\201\232\345\220\210\347\263\273\347\273\237\357\274\210\346\213\245\346\234\211\347\210\254\350\231\253\347\210\254\345\217\226\343\200\201\346\225\260\346\215\256\345\210\206\346\236\220\343\200\201\345\217\257\350\247\206\345\214\226\343\200\201\344\272\222\345\212\250\347\255\211\345\212\237\350\203\275\357\274\211/WorkAggregation-master/.gitignore" new file mode 100644 index 0000000..87df4c7 --- /dev/null +++ "b/5\343\200\201Python\346\213\233\350\201\230\345\262\227\344\275\215\344\277\241\346\201\257\350\201\232\345\220\210\347\263\273\347\273\237\357\274\210\346\213\245\346\234\211\347\210\254\350\231\253\347\210\254\345\217\226\343\200\201\346\225\260\346\215\256\345\210\206\346\236\220\343\200\201\345\217\257\350\247\206\345\214\226\343\200\201\344\272\222\345\212\250\347\255\211\345\212\237\350\203\275\357\274\211/WorkAggregation-master/.gitignore" @@ -0,0 +1,3 @@ +# Project exclude paths +/web/data/ +/static/webjs/ diff --git "a/5\343\200\201Python\346\213\233\350\201\230\345\262\227\344\275\215\344\277\241\346\201\257\350\201\232\345\220\210\347\263\273\347\273\237\357\274\210\346\213\245\346\234\211\347\210\254\350\231\253\347\210\254\345\217\226\343\200\201\346\225\260\346\215\256\345\210\206\346\236\220\343\200\201\345\217\257\350\247\206\345\214\226\343\200\201\344\272\222\345\212\250\347\255\211\345\212\237\350\203\275\357\274\211/WorkAggregation-master/README.md" "b/5\343\200\201Python\346\213\233\350\201\230\345\262\227\344\275\215\344\277\241\346\201\257\350\201\232\345\220\210\347\263\273\347\273\237\357\274\210\346\213\245\346\234\211\347\210\254\350\231\253\347\210\254\345\217\226\343\200\201\346\225\260\346\215\256\345\210\206\346\236\220\343\200\201\345\217\257\350\247\206\345\214\226\343\200\201\344\272\222\345\212\250\347\255\211\345\212\237\350\203\275\357\274\211/WorkAggregation-master/README.md" new file mode 100644 index 0000000..b12bec1 --- /dev/null +++ "b/5\343\200\201Python\346\213\233\350\201\230\345\262\227\344\275\215\344\277\241\346\201\257\350\201\232\345\220\210\347\263\273\347\273\237\357\274\210\346\213\245\346\234\211\347\210\254\350\231\253\347\210\254\345\217\226\343\200\201\346\225\260\346\215\256\345\210\206\346\236\220\343\200\201\345\217\257\350\247\206\345\214\226\343\200\201\344\272\222\345\212\250\347\255\211\345\212\237\350\203\275\357\274\211/WorkAggregation-master/README.md" @@ -0,0 +1,3 @@ +# 系统说明 + +待定 diff --git a/pandas/read_excel.py "b/5\343\200\201Python\346\213\233\350\201\230\345\262\227\344\275\215\344\277\241\346\201\257\350\201\232\345\220\210\347\263\273\347\273\237\357\274\210\346\213\245\346\234\211\347\210\254\350\231\253\347\210\254\345\217\226\343\200\201\346\225\260\346\215\256\345\210\206\346\236\220\343\200\201\345\217\257\350\247\206\345\214\226\343\200\201\344\272\222\345\212\250\347\255\211\345\212\237\350\203\275\357\274\211/WorkAggregation-master/__init__.py" similarity index 100% rename from pandas/read_excel.py rename to "5\343\200\201Python\346\213\233\350\201\230\345\262\227\344\275\215\344\277\241\346\201\257\350\201\232\345\220\210\347\263\273\347\273\237\357\274\210\346\213\245\346\234\211\347\210\254\350\231\253\347\210\254\345\217\226\343\200\201\346\225\260\346\215\256\345\210\206\346\236\220\343\200\201\345\217\257\350\247\206\345\214\226\343\200\201\344\272\222\345\212\250\347\255\211\345\212\237\350\203\275\357\274\211/WorkAggregation-master/__init__.py" diff --git "a/5\343\200\201Python\346\213\233\350\201\230\345\262\227\344\275\215\344\277\241\346\201\257\350\201\232\345\220\210\347\263\273\347\273\237\357\274\210\346\213\245\346\234\211\347\210\254\350\231\253\347\210\254\345\217\226\343\200\201\346\225\260\346\215\256\345\210\206\346\236\220\343\200\201\345\217\257\350\247\206\345\214\226\343\200\201\344\272\222\345\212\250\347\255\211\345\212\237\350\203\275\357\274\211/WorkAggregation-master/analysis/__init__.py" "b/5\343\200\201Python\346\213\233\350\201\230\345\262\227\344\275\215\344\277\241\346\201\257\350\201\232\345\220\210\347\263\273\347\273\237\357\274\210\346\213\245\346\234\211\347\210\254\350\231\253\347\210\254\345\217\226\343\200\201\346\225\260\346\215\256\345\210\206\346\236\220\343\200\201\345\217\257\350\247\206\345\214\226\343\200\201\344\272\222\345\212\250\347\255\211\345\212\237\350\203\275\357\274\211/WorkAggregation-master/analysis/__init__.py" new file mode 100644 index 0000000..f72d205 --- /dev/null +++ "b/5\343\200\201Python\346\213\233\350\201\230\345\262\227\344\275\215\344\277\241\346\201\257\350\201\232\345\220\210\347\263\273\347\273\237\357\274\210\346\213\245\346\234\211\347\210\254\350\231\253\347\210\254\345\217\226\343\200\201\346\225\260\346\215\256\345\210\206\346\236\220\343\200\201\345\217\257\350\247\206\345\214\226\343\200\201\344\272\222\345\212\250\347\255\211\345\212\237\350\203\275\357\274\211/WorkAggregation-master/analysis/__init__.py" @@ -0,0 +1 @@ +__all__ = ['input_data', 'create_chart', 'process_data','test_analyze_data'] diff --git "a/5\343\200\201Python\346\213\233\350\201\230\345\262\227\344\275\215\344\277\241\346\201\257\350\201\232\345\220\210\347\263\273\347\273\237\357\274\210\346\213\245\346\234\211\347\210\254\350\231\253\347\210\254\345\217\226\343\200\201\346\225\260\346\215\256\345\210\206\346\236\220\343\200\201\345\217\257\350\247\206\345\214\226\343\200\201\344\272\222\345\212\250\347\255\211\345\212\237\350\203\275\357\274\211/WorkAggregation-master/analysis/analysis_main.py" "b/5\343\200\201Python\346\213\233\350\201\230\345\262\227\344\275\215\344\277\241\346\201\257\350\201\232\345\220\210\347\263\273\347\273\237\357\274\210\346\213\245\346\234\211\347\210\254\350\231\253\347\210\254\345\217\226\343\200\201\346\225\260\346\215\256\345\210\206\346\236\220\343\200\201\345\217\257\350\247\206\345\214\226\343\200\201\344\272\222\345\212\250\347\255\211\345\212\237\350\203\275\357\274\211/WorkAggregation-master/analysis/analysis_main.py" new file mode 100644 index 0000000..06721ec --- /dev/null +++ "b/5\343\200\201Python\346\213\233\350\201\230\345\262\227\344\275\215\344\277\241\346\201\257\350\201\232\345\220\210\347\263\273\347\273\237\357\274\210\346\213\245\346\234\211\347\210\254\350\231\253\347\210\254\345\217\226\343\200\201\346\225\260\346\215\256\345\210\206\346\236\220\343\200\201\345\217\257\350\247\206\345\214\226\343\200\201\344\272\222\345\212\250\347\255\211\345\212\237\350\203\275\357\274\211/WorkAggregation-master/analysis/analysis_main.py" @@ -0,0 +1,41 @@ +import configparser +import os +import pymysql +import sys + + +class Analyze(): + process_fn_list=[] + analyze_fn_list=[] + chart_fn_list=[] + + conf = configparser.ConfigParser() + + # 以下配置请修改 + user = "root" + password = "zym233521" + + + db = pymysql.connect(host="localhost", user=user, password=password, charset="utf8") + cursor = db.cursor() + # cursor.execute("CREATE DATABASE `ujn_a` CHARACTER SET 'utf8';") + cursor.execute('USE `ujn_a`;') + + path = os.getcwd().replace('\\', '/') + + @classmethod + def main(cls): + script_path = os.path.realpath(__file__) + script_dir = os.path.dirname(script_path) + sys.path.append(script_dir) + input_data.main() + + process_data.main() + + analyze_data.main() + + test_analyze_data.main() + + +if __name__ == '__main__': + pass diff --git "a/5\343\200\201Python\346\213\233\350\201\230\345\262\227\344\275\215\344\277\241\346\201\257\350\201\232\345\220\210\347\263\273\347\273\237\357\274\210\346\213\245\346\234\211\347\210\254\350\231\253\347\210\254\345\217\226\343\200\201\346\225\260\346\215\256\345\210\206\346\236\220\343\200\201\345\217\257\350\247\206\345\214\226\343\200\201\344\272\222\345\212\250\347\255\211\345\212\237\350\203\275\357\274\211/WorkAggregation-master/analysis/analyze_data.py" "b/5\343\200\201Python\346\213\233\350\201\230\345\262\227\344\275\215\344\277\241\346\201\257\350\201\232\345\220\210\347\263\273\347\273\237\357\274\210\346\213\245\346\234\211\347\210\254\350\231\253\347\210\254\345\217\226\343\200\201\346\225\260\346\215\256\345\210\206\346\236\220\343\200\201\345\217\257\350\247\206\345\214\226\343\200\201\344\272\222\345\212\250\347\255\211\345\212\237\350\203\275\357\274\211/WorkAggregation-master/analysis/analyze_data.py" new file mode 100644 index 0000000..ba53d81 --- /dev/null +++ "b/5\343\200\201Python\346\213\233\350\201\230\345\262\227\344\275\215\344\277\241\346\201\257\350\201\232\345\220\210\347\263\273\347\273\237\357\274\210\346\213\245\346\234\211\347\210\254\350\231\253\347\210\254\345\217\226\343\200\201\346\225\260\346\215\256\345\210\206\346\236\220\343\200\201\345\217\257\350\247\206\345\214\226\343\200\201\344\272\222\345\212\250\347\255\211\345\212\237\350\203\275\357\274\211/WorkAggregation-master/analysis/analyze_data.py" @@ -0,0 +1,686 @@ +import analysis_main as A +import numpy as np +import pandas as pd +import pyecharts + + +# 函数注册器 +def ways(func): + A.Analyze.analyze_fn_list.append(func) + + def wrapper(*args, **kw): + return func(*args, **kw) + + return wrapper + + +def main(): + global cursor, db, conf + cursor = A.Analyze.cursor + db = A.Analyze.db + + print(A.Analyze.analyze_fn_list) + conf = A.Analyze.conf + conf.add_section('chart') + + for fn in A.Analyze.analyze_fn_list: + fn() + print(fn.__name__ + ' ok') + + with open('conf.ini', 'a') as configfile: + conf.write(configfile) + + +@ways +def f1(): + cursor.execute("select ave_pay,number from 传统职业 where ID <'10000'") + re1 = cursor.fetchall() + m = [x[0] for x in re1 if x[0] is not None and x[1] is not None] + n = [int(x[1]) for x in re1 if x[0] is not None and x[1] is not None] + a = [] + for i in range(0, len(m)): + j = 0 + while j < n[i]: + a.append(m[i]) + j += 1 + a = np.array(a) + a1 = [a[i] for i in range(0, len(a)) if a[i] != a.max() and a[i] != a.min()] + + cursor.execute("select ave_pay,number from 新兴职业 where id <'10000'") + re2 = cursor.fetchall() + # # # + m = [x[0] for x in re2 if x[0] is not None and x[1] is not None] + n = [int(x[1]) for x in re2 if x[0] is not None and x[1] is not None] + a = [] + for i in range(0, len(m)): + j = 0 + while j < n[i]: + a.append(m[i]) + j += 1 + a = np.array(a) + b1 = [a[i] for i in range(0, len(a)) if a[i] != a.max() and a[i] != a.min()] + q = [a1, b1] + re1 = pyecharts.Boxplot.prepare_data(q) + conf.set('chart', 'chart.1.1', str(re1)) + + +@ways +def f2(): + cursor.execute("select industry from 大数据职位") + re = cursor.fetchall() + cursor.execute("select number from 大数据职位") + num = cursor.fetchall() + a = {} + for i in range(0, len(re)): + x = re[i][0].split(',') + for k in range(0, len(x)): + x[k] = x[k].strip() + if x[k] in a: + a[x[k]] += int(num[i][0]) + else: + a[x[k]] = int(num[i][0]) + b = [] + for key, value in a.items(): + b.append([value, key]) + b.sort(reverse=True) + hy = [x[1] for x in b[:10]] + n = [x[0] for x in b[:10]] + conf.set('chart', 'chart.2.1', str(hy)) + conf.set('chart', 'chart.2.2', str(n)) + + +@ways +def f3(): + l1_1 = ['XXXX讲师', '项目开发经理', '`''技术/研发总监''`', '大数据开发工程师', '`''技术/研究/项目负责人''`', '服务器工程师', '数据库工程师', '软件开发工程师', + '建模工程师', '硬件工程师', '网络工程师', '人工智能开发工程师', '后端工程师', '机器学习工程师'] + l2_1 = ['`''数据挖掘/分析/处理工程师''`', '数据管理工程师', 'Web前端工程师', '`''计算机维修/维护工程师''`'] + l3_1 = ['Java工程师', '`''C++工程师''`', 'PHP工程师', '`''C#工程师''`', '`''.NET工程师''`', 'Hadoop工程师', 'Python工程师', 'Perl工程师', + 'Ruby工程师', 'Nodejs工程师', 'Go工程师', 'Javascript工程师', 'Delphi工程师', 'jsp工程师', 'sql工程师', 'Linux开发工程师', + 'Android开发工程师', 'IOS开发工程师', '`''GIS开发/研发工程师''`', 'BI工程师'] + l = l1_1 + l2_1 + l3_1 + x = [] + city = ['上海', '深圳', '广州', '北京', '武汉', '成都', '杭州', '南京', '西安', '苏州'] + v = [] + for i in l: + sql = "select number from " + str(i) + " where id <'10000'" + cursor.execute(sql) + re = cursor.fetchall() + re = np.array(re) + re = re.astype(int) + if len(re) == 0: + continue + else: + s = re.sum() + v.append([s, i]) + v.sort(reverse=True) + l = [] + for i in range(10): + l.append(v[i][1]) + for i in l: + sql = "select place,number from " + str(i) + " where id <'10000'" + cursor.execute(sql) + re = cursor.fetchall() + re = list(re) + if len(re) == 0: + continue + a = {} + for j in range(0, len(re)): + if re[j][0] in city: + if re[j][0] in a: + a[re[j][0]] += int(re[j][1]) + else: + a[re[j][0]] = int(re[j][1]) + else: + continue + for key, value in a.items(): + x.append([key, i, value]) + ct = set([w[0] for w in x]) + conf.set('chart', 'chart.3.1', str(ct)) + conf.set('chart', 'chart.3.2', str(l)) + conf.set('chart', 'chart.3.3', str(x)) + + +@ways +def f4(): + cursor.execute("select place,ave_pay,number from qcwy where id < '10000'") + re = cursor.fetchall() + re = list(re) + df = pd.DataFrame(re) + df = df.dropna() + df.columns = ["place", "ave_pay", 'number'] + df['number'] = df['number'].astype(int) + a = df.groupby('place').mean().sort_values(by='ave_pay', ascending=False) + a = list(a.index) + a1 = df.groupby('place')['number'] + a2 = df.groupby('place')['ave_pay'] + b = [] + c = [a[i] for i in range(len(a)) if a[i].find('省') == -1 and a[i] != '台湾' and a[i] != '吉林' and a[i] != '国外' \ + and a[i] != '宣城' and a[i] != '新疆' and a[i] != '池州' and a[i] != '燕郊开发区' \ + and a[i] != '黔西南'] + # 取出前十的城市及薪资 + for i in c: + v = a1.get_group(i).values + u = a2.get_group(i).values + for j in range(0, len(v)): + u[j] = u[j] * v[j] + u = np.array(u) + v = np.array(v) + s = round(u.sum() / v.sum(), 2) + b.append([s, i]) + b.sort(reverse=True) + x = [w[1] for w in b[:10]] + y = [w[0] for w in b[:10]] + conf.set('chart', 'chart.4.1', str(x)) + conf.set('chart', 'chart.4.2', str(y)) + + +@ways +def f5(): + cursor.execute("select place,number from 大数据职位") + re = cursor.fetchall() + # 将数据存入 dataframe 中 + re = list(re) + df = pd.DataFrame(re) + df.columns = ['place', 'num'] + df['num'] = df['num'].astype('int') + # 用groupby函数进行分组,求和,排序 + a = df.groupby('place').sum().sort_values(by='num', ascending=False) + # 取出前十的城市及需求量 + b = [x for x in a.values[:10]] + c = [x for x in a.index[:10]] + # 将数组一维化 + b = np.array(b) + b = b.ravel() + b = list(b) + conf.set('chart', 'chart.5.1', str(c)) + conf.set('chart', 'chart.5.2', str(b)) + + +@ways +def f6(): + # 将学历,经验,薪水提出来 分析了10000条数据 + cursor.execute("select education,experience,ave_pay,number from qcwy where id <'10000'") + re = cursor.fetchall() + # 转化为dataframe + re = list(re) + df = pd.DataFrame(re) + df = df.dropna() + df.columns = ['education', 'experience', 'ave_pay', 'number'] + # df['experience'] = df['experience'].astype(int) + df['number'] = df['number'].astype(int) + df['experience'] = df['experience'].astype(int) + # 分组 + q = df.groupby(['education', 'experience'])['ave_pay'] + x = df.groupby(['education', 'experience'])['number'] + # p = df.groupby('education')['ave_pay'].mean() + # 获得所有的经验值 + w = df.groupby('experience')['ave_pay'].mean() + # 只选了需求较多的几个学历 + p = ['', '中专', '大专', '本科', '硕士'] + # 经验,排序 + w = list(w.index) + w.sort() + t = [] + for i in p: + for j in w: + try: + v = q.get_group((i, j)).values + u = x.get_group((i, j)).values + for k in range(0, len(v)): + v[k] = v[k] * u[k] + s = v.sum() / u.sum() + v = round(s, 2) + j = str(j) + '年' + if i == '': + t.append(['不限', j, v]) + else: + t.append([i, j, v]) + except: + pass + for i in range(0, len(w)): + w[i] = str(w[i]) + '年' + p[0] = '不限' + conf.set('chart', 'chart.6.1', str(p)) + conf.set('chart', 'chart.6.2', str(w)) + conf.set('chart', 'chart.6.3', str(t)) + + +@ways +def f7(): + cursor.execute("select education,ave_pay,number from qcwy where id < '10000'") + re = cursor.fetchall() + df = pd.DataFrame(list(re)) + df = df.dropna() + df.columns = ['education', 'pay', 'num'] + df['num'] = df['num'].astype(int) + a = df.groupby('education')['pay'] + b = df.groupby('education')['num'] + c = df.groupby('education')['num'].sum() + x = [] + y = [] + z = [] + for i in list(c.index): + v = a.get_group(i).values + w = np.array(b.get_group(i).values) + s = 0 + for j in range(0, len(v)): + s += v[j] * int(w[j]) + x.append(i) + y.append(round(s / w.sum(), 2)) + z.append(w.sum()) + x[x.index('')] = '不限' + conf.set('chart', 'chart.7.1', str(x)) + conf.set('chart', 'chart.7.2', str(y)) + conf.set('chart', 'chart.7.3', str(z)) + + +@ways +def f8(): + cursor.execute("select city,ave_pay from qlrc") + re = cursor.fetchall() + df = pd.DataFrame(list(re)) + df.columns = ['city', 'pay'] + df = df.dropna() + df['pay'] = df['pay'].astype(float) + a = df.groupby('city')['pay'].mean().sort_values(ascending=False) + city = [list(a.index)[i] for i in range(10)] + pay = [round(list(a.values)[i], 2) for i in range(10)] + conf.set('chart', 'chart.8.1', str(city)) + conf.set('chart', 'chart.8.2', str(pay)) + + +@ways +def f9(): + cursor.execute("select city from qlrc ") + re = cursor.fetchall() + df = pd.DataFrame(list(re)) + df.columns = ['city'] + df = df.dropna() + a = df.groupby('city')['city'].count() + conf.set('chart', 'chart.9.1', str(list(a.index))) + conf.set('chart', 'chart.9.2', str(list(a.values))) + + +@ways +def f10(): + cursor.execute("select experience,education ,number from 传统职业 where id <'10000'") + re = cursor.fetchall() + df1 = pd.DataFrame(list(re)) + df1 = df1.dropna() + # 学历 + df1.columns = ['experience', 'education', 'number'] + df1['number'] = df1['number'].astype(int) + q = df1.groupby('education')['number'].sum() + a = ['', '中专', '大专', '本科', '硕士'] + k = list(q.index) + b = [k[i] for i in range(0, len(k)) if k[i] in a] + try: + b[b.index('')] = '不限' + except: + pass + c = [q.values[i] for i in range(0, len(k)) if k[i] in a] + cursor.execute("select experience,education ,number from 新兴职业 where id <'10000'") + re = cursor.fetchall() + df2 = pd.DataFrame(list(re)) + df2 = df2.dropna() + df2.columns = ['experience', 'education', 'number'] + df2['number'] = df2['number'].astype(int) + q = df2.groupby('education')['number'].sum() + k = list(q.index) + d = [k[i] for i in range(0, len(k)) if k[i] in a] + try: + d[d.index('')] = '不限' + except: + pass + f = [q.values[i] for i in range(0, len(k)) if k[i] in a] + p1 = df1.groupby('experience')['number'].sum() + k = list(p1.index) + for i in range(0, len(k)): + k[i] = str(k[i]) + '年' + p2 = df2.groupby('experience')['number'].sum() + j = list(p2.index) + for i in range(0, len(j)): + j[i] = str(j[i]) + '年' + conf.set('chart', 'chart.10.1', str(b)) + conf.set('chart', 'chart.10.2', str(c)) + conf.set('chart', 'chart.10.3', str(d)) + conf.set('chart', 'chart.10.4', str(f)) + conf.set('chart', 'chart.10.5', str(k)) + conf.set('chart', 'chart.10.6', str(list(p1.values))) + conf.set('chart', 'chart.10.7', str(j)) + conf.set('chart', 'chart.10.8', str(list(p2.values))) + + +@ways +def f11(): + l1_1 = ['XXXX讲师', '项目开发经理', '`''技术/研发总监''`', '大数据开发工程师', '`''技术/研究/项目负责人''`', '服务器工程师', '数据库工程师', '软件开发工程师', + '建模工程师', '硬件工程师', '网络工程师', '人工智能开发工程师', '后端工程师', '机器学习工程师'] + l2_1 = ['`''数据挖掘/分析/处理工程师''`', '数据管理工程师', 'Web前端工程师', '`''计算机维修/维护工程师''`'] + l3_1 = ['Java工程师', '`''C++工程师''`', 'PHP工程师', '`''C#工程师''`', '`''.NET工程师''`', 'Hadoop工程师', 'Python工程师', 'Perl工程师', + 'Ruby工程师', 'Nodejs工程师', 'Go工程师', 'Javascript工程师', 'Delphi工程师', 'jsp工程师', 'sql工程师', 'Linux开发工程师', + 'Android开发工程师', 'IOS开发工程师', '`''GIS开发/研发工程师''`', 'BI工程师'] + l = l1_1 + l2_1 + l3_1 + a = [] + for i in l: + sql = "select experience,number from " + str(i) + " where id <'10000'" + # print(sql) + cursor.execute(sql) + re = cursor.fetchall() + re = list(re) + if len(re) == 0: + continue + # print(re) + c = np.array(list(map(lambda x: int(x[0]) * int(x[1]), re))) + d = np.array([int(x[1]) for x in re]) + c = c.astype(int) + d = d.astype(int) + s = round(c.sum() / d.sum(), 2) + a.append([s, i]) + a.sort(reverse=True) + x = [a[i][1] for i in range(10)] + y = [a[i][0] for i in range(10)] + conf.set('chart', 'chart.11.1', str(x)) + conf.set('chart', 'chart.11.2', str(y)) + + +@ways +def f12(): + cursor.execute("select experience,ave_pay,number from qcwy where id < '10000'") + re = cursor.fetchall() + df = pd.DataFrame(list(re)) + df = df.dropna() + df.columns = ['experience', 'pay', 'num'] + df['num'] = df['num'].astype(int) + a = df.groupby('experience')['pay'] + b = df.groupby('experience')['num'] + c = df.groupby('experience')['num'].sum() + data = [] + for i in list(c.index): + v = a.get_group(i).values + w = np.array(b.get_group(i).values) + s = 0 + for j in range(0, len(v)): + s += v[j] * int(w[j]) + data.append([i, w.sum(), round(s / w.sum(), 2)]) + conf.set('chart', 'chart.12.1', str(data)) + + +@ways +def f13(): + l1_1 = ['XXXX讲师', '项目开发经理', '`''技术/研发总监''`', '大数据开发工程师', '`''技术/研究/项目负责人''`', '服务器工程师', '数据库工程师', '软件开发工程师', + '建模工程师', '硬件工程师', '网络工程师', '人工智能开发工程师', '后端工程师', '机器学习工程师'] + l2_1 = ['`''数据挖掘/分析/处理工程师''`', '数据管理工程师', 'Web前端工程师', '`''计算机维修/维护工程师''`'] + l3_1 = ['Java工程师', '`''C++工程师''`', 'PHP工程师', '`''C#工程师''`', '`''.NET工程师''`', 'Hadoop工程师', 'Python工程师', 'Perl工程师', + 'Ruby工程师', 'Nodejs工程师', 'Go工程师', 'Javascript工程师', 'Delphi工程师', 'jsp工程师', 'sql工程师', 'Linux开发工程师', + 'Android开发工程师', 'IOS开发工程师', '`''GIS开发/研发工程师''`', 'BI工程师'] + l = l1_1 + l2_1 + l3_1 + x = [] + y = [] + z = [] + for i in l: + sql = "select ave_pay,number from " + str(i) + " where id <'10000'" + # print(sql) + cursor.execute(sql) + re = cursor.fetchall() + re = list(re) + if len(re) == 0: + continue + re1 = [x for x in re if x[0] is not None] + c = np.array(list(map(lambda x: float(x[0]) * int(x[1]), re1))) + d = np.array([x[1] for x in re1]) + c = c.astype(float) + d = d.astype(float) + s = round(c.sum() / d.sum(), 2) + x.append(i) + y.append(s) + z.append(d.sum()) + conf.set('chart', 'chart.13.1', str(x)) + conf.set('chart', 'chart.13.2', str(y)) + conf.set('chart', 'chart.13.3', str(z)) + + +@ways +def f14(): + l1 = ['软件开发', '人工智能', '`''深度\机器学习''`', '前端', '后端', '数据', '算法', '游戏', + '测试', '安全', '运维', 'UI', '区块链', '网络', '全栈', '硬件', '物联网'] + a = {} + for i in l1: + sql = "select ave_pay,number from " + str(i) + " where id <'10000'" + cursor.execute(sql) + re = cursor.fetchall() + re = list(re) + if len(re) == 0: + continue + re1 = [x for x in re if x[0] is not None] + c = np.array(list(map(lambda x: x[0] * int(x[1]), re1))) + d = np.array([int(x[1]) for x in re1]) + s = round(c.sum() / d.sum(), 2) + a[i] = s + list_words = [] + for key, value in a.items(): + list_words.append([value, key]) + list_words.sort(reverse=True) + q = [x[0] for x in list_words[:10]] + p = [x[1] for x in list_words[:10]] + conf.set('chart', 'chart.14.1', str(p)) + conf.set('chart', 'chart.14.2', str(q)) + + +@ways +def f15(): + l1_1 = ['XXXX讲师', '项目开发经理', '`''技术/研发总监''`', '大数据开发工程师', '`''技术/研究/项目负责人''`', '服务器工程师', '数据库工程师', '软件开发工程师', + '建模工程师', '硬件工程师', '网络工程师', '人工智能开发工程师', '后端工程师', '机器学习工程师'] + l2_1 = ['`''数据挖掘/分析/处理工程师''`', '数据管理工程师', 'Web前端工程师', '`''计算机维修/维护工程师''`'] + l3_1 = ['Java工程师', '`''C++工程师''`', 'PHP工程师', '`''C#工程师''`', '`''.NET工程师''`', 'Hadoop工程师', 'Python工程师', 'Perl工程师', + 'Ruby工程师', 'Nodejs工程师', 'Go工程师', 'Javascript工程师', 'Delphi工程师', 'jsp工程师', 'sql工程师', 'Linux开发工程师', + 'Android开发工程师', 'IOS开发工程师', '`''GIS开发/研发工程师''`', 'BI工程师'] + l = l1_1 + l2_1 + l3_1 + a = [] + for i in l: + sql = "select ave_pay,number from " + str(i) + " where id <'10000'" + cursor.execute(sql) + re = cursor.fetchall() + re = list(re) + if len(re) == 0: + continue + re1 = [x for x in re if x[0] is not None] + c = np.array(list(map(lambda x: float(x[0]) * int(x[1]), re1))) + d = np.array([int(x[1]) for x in re1]) + s = round(c.sum() / d.sum(), 2) + a.append([s, i]) + a.sort(reverse=True) + x = [x[1] for x in a[:10]] + y = [x[0] for x in a[:10]] + conf.set('chart', 'chart.15.1', str(x)) + conf.set('chart', 'chart.15.2', str(y)) + + +@ways +def f16(): + cursor.execute("select place,number from qcwy ") + re = cursor.fetchall() + re = list(re) + df = pd.DataFrame(re) + df = df.dropna() + df.columns = ['place', 'num'] + df['num'] = df['num'].astype('int') + # 根据place进行分组,根据num进行排序 + w = df.groupby('place').sum().sort_values(by='num', ascending=False) + z = np.array(w.values) + z = z.ravel() + w = list(w.index) + c = [w[i] for i in range(10)] + d = [z[i] for i in range(10)] + conf.set('chart', 'chart.16.1', str(c)) + conf.set('chart', 'chart.16.2', str(d)) + + +@ways +def f17(): + x = [] + l1 = ['Java工程师', 'C++工程师', 'PHP工程师', 'C#工程师', '.NET工程师', 'Hadoop工程师', 'Python工程师', 'Perl工程师', 'Ruby工程师', + 'Nodejs工程师', 'Go工程师', 'Javascript工程师', 'Delphi工程师', 'jsp工程师', 'sql工程师', 'Linux开发工程师', 'Android开发工程师', + 'IOS开发工程师', 'GIS开发/研发工程师', 'BI工程师'] + for i in l1: + j = '`' + i + '`' # SKILL_PAY + sql = "SELECT AVE_PAY,NUMBER FROM " + j + "" + cursor.execute(sql) + re = cursor.fetchall() + re = list(re) + if len(re) == 0: + continue + re1 = [x for x in re if x[0] is not None] + c = np.array(list(map(lambda x: float(x[0]) * int(x[1]), re1))) + d = np.array([int(x[1]) for x in re1]) + s = round(c.sum() / d.sum(), 2) + x.append([s, i]) + x.sort(reverse=True) + jn = [a[1] for a in x[:10]] + mo = [a[0] for a in x[:10]] + conf.set('chart', 'chart.17.1', str(jn)) + conf.set('chart', 'chart.17.2', str(mo)) + + +@ways +def f18(): + cursor.execute("select title,number from 新兴职业 where id <'10000'") + re = cursor.fetchall() + a = ['学习', '人工智能', '数据', '区块链', '算法', '物联网', '视觉', '自然语言'] + re = list(re) + df = pd.DataFrame(re) + df.columns = ['job', 'number'] + df['number'] = df['number'].astype(int) + b = {} + s = 0 + for i in range(0, df.shape[0] - 1): + s += df.ix[i, 'number'] + for j in a: + if df.ix[i, 'job'].find(j) != -1: + if j in b: + b[j] += df.ix[i, 'number'] + else: + b[j] = df.ix[i, 'number'] + job = [] + num = [] + for key, value in b.items(): + key = key.replace('数据', '大数据') + key = key.replace('学习', '机器学习') + key = key.replace('视觉', '机器视觉') + job.append(key) + num.append(round(value / s, 2)) + conf.set('chart', 'chart.18.1', str(job)) + conf.set('chart', 'chart.18.2', str(num)) + + +@ways +def f19(): + l1 = ['华为', '搜狐', '滴滴出行', '金山', '新浪', '美团', '甲骨文', '阿里巴巴', '微软', '爱奇艺', '中国电信', '百度', '奇虎', '英特尔', '完美世界', '字节跳动', + '中国移动', '中国联通', '巨人网络', '浪潮', '联想', '搜狗', '蚂蚁金服', '腾讯', '网易', '小米', 'IBM', '京东'] + l2 = ['初中及以下', '中专、技校、中技', '高中', '大专', '本科', '硕士', '博士', '不限'] + a = {} + for i in l1: + j = '`' + i + '`' + sql = "SELECT COUNT(*) FROM " + j + "" + cursor.execute(sql) + results = cursor.fetchone() + count1 = [] + for m in l2: + if m == '初中及以下': + sql = "SELECT ID FROM " + j + "where (education like '%初中%')" + cursor.execute(sql) + result = cursor.fetchall() + num = len(result) + num = int(num) + count1.append(num) + elif m == '中专、技校、中技': + sql = "SELECT ID FROM " + j + "where (education like '%中专%' or education like '%技校%' or education like '%中技%')" + cursor.execute(sql) + result = cursor.fetchall() + num = len(result) + num = int(num) + count1.append(num) + else: + sql = "SELECT ID FROM " + j + "where (education like '%" + m + "%')" + cursor.execute(sql) + result = cursor.fetchall() + num = len(result) + num = int(num) + count1.append(num) + a[i] = count1 + data = [] + for key, value in a.items(): + data.append(value) + conf.set('chart', 'chart.19.1', str(l1)) + conf.set('chart', 'chart.19.2', str(l2)) + conf.set('chart', 'chart.19.3', str(data)) + + +@ways +def f20(): + l1 = ['华为', '搜狐', '滴滴出行', '金山', '新浪', '美团', '甲骨文', '阿里巴巴', '微软', '爱奇艺', '中国电信', '百度', '奇虎', '英特尔', '完美世界', '字节跳动', + '中国移动', '中国联通', '巨人网络', '浪潮', '联想', '搜狗', '蚂蚁金服', '腾讯', '网易', '小米', 'IBM', '京东'] + x = [] + y = [] + g = [] + for i in l1: + j = '`' + i + '`' # SKILL_PAY + sql = "SELECT AVE_PAY FROM " + j + "where( AVE_PAY not like '面议')" + cursor.execute(sql) + results = cursor.fetchall() + results = list(results) + results = pd.DataFrame(results) + results = results.dropna() + if len(results) == 0: + continue + results.columns = ['PAY'] + results[['PAY']] = results[['PAY']].astype(float) + ave = results['PAY'].mean() + ave = float(ave) + ave = round(ave, 2) + sql = "SELECT experience2 FROM " + j + "" + cursor.execute(sql) + results = cursor.fetchall() + results = list(results) + results = pd.DataFrame(results) + results.columns = ['EXP'] + results[['EXP']] = results[['EXP']].astype(float) + ave3 = results['EXP'].mean() + ave3 = round(ave3, 2) + x.append(ave) + y.append(ave3) + g.append(i) + conf.set('chart', 'chart.20.1', str(g)) + conf.set('chart', 'chart.20.2', str(x)) + conf.set('chart', 'chart.20.3', str(y)) + + +@ways +def f21(): + l1 = ['华为', '搜狐', '滴滴出行', '金山', '新浪', '美团', '甲骨文', '阿里巴巴', '微软', '爱奇艺', '中国电信', '百度', '奇虎', '英特尔', '完美世界', '字节跳动', + '中国移动', '中国联通', '巨人网络', '浪潮', '联想', '搜狗', '蚂蚁金服', '腾讯', '网易', '小米', 'IBM', '京东'] + a = {} + for i in l1: + j = '`' + i + '`' + sql = "SELECT welfare FROM " + j + "" + cursor.execute(sql) + re = list(cursor.fetchall()) + for i in re: + if i[0] == '': + continue + q = i[0].replace('[', '') + q = q.replace(']', '') + x = q.split(',') + for k in x: + k = k.replace("'", '') + if k in a: + a[k] += 1 + else: + a[k] = 1 + x = [] + y = [] + for key, values in a.items(): + x.append(key) + y.append(values) + db.close() + conf.set('chart', 'chart.21.1', str(x)) + conf.set('chart', 'chart.21.2', str(y)) diff --git "a/5\343\200\201Python\346\213\233\350\201\230\345\262\227\344\275\215\344\277\241\346\201\257\350\201\232\345\220\210\347\263\273\347\273\237\357\274\210\346\213\245\346\234\211\347\210\254\350\231\253\347\210\254\345\217\226\343\200\201\346\225\260\346\215\256\345\210\206\346\236\220\343\200\201\345\217\257\350\247\206\345\214\226\343\200\201\344\272\222\345\212\250\347\255\211\345\212\237\350\203\275\357\274\211/WorkAggregation-master/analysis/create_chart.py" "b/5\343\200\201Python\346\213\233\350\201\230\345\262\227\344\275\215\344\277\241\346\201\257\350\201\232\345\220\210\347\263\273\347\273\237\357\274\210\346\213\245\346\234\211\347\210\254\350\231\253\347\210\254\345\217\226\343\200\201\346\225\260\346\215\256\345\210\206\346\236\220\343\200\201\345\217\257\350\247\206\345\214\226\343\200\201\344\272\222\345\212\250\347\255\211\345\212\237\350\203\275\357\274\211/WorkAggregation-master/analysis/create_chart.py" new file mode 100644 index 0000000..c2e2cbb --- /dev/null +++ "b/5\343\200\201Python\346\213\233\350\201\230\345\262\227\344\275\215\344\277\241\346\201\257\350\201\232\345\220\210\347\263\273\347\273\237\357\274\210\346\213\245\346\234\211\347\210\254\350\231\253\347\210\254\345\217\226\343\200\201\346\225\260\346\215\256\345\210\206\346\236\220\343\200\201\345\217\257\350\247\206\345\214\226\343\200\201\344\272\222\345\212\250\347\255\211\345\212\237\350\203\275\357\274\211/WorkAggregation-master/analysis/create_chart.py" @@ -0,0 +1,374 @@ +import os +import sys +import pyecharts as p +import configparser +import random + +from pyecharts import Style + +script_path = os.path.realpath(__file__) +script_dir = os.path.dirname(script_path) +sys.path.append(script_dir) + +import analysis_main as A + + +# 函数注册器 +def ways(func): + A.Analyze.chart_fn_list.append(func) + + def wrapper(*args, **kw): + return func(*args, **kw) + + return wrapper + + +# 图表参数迭代器 +def parameter(fn): + name = fn.__name__.replace('t', '') + for i in range(1, 50): + pa = 'chart.' + name + '.' + str(i) + yield eval(conf_chart[pa]) + + +def main(): + global conf_chart + conf = configparser.ConfigParser() + conf.read('./conf/conf.ini') + conf_chart = conf['chart'] + p.configure(global_theme='macarons') # 设置主题 + charts = [] + # print(A.Analyze.chart_fn_list) + for fn in A.Analyze.chart_fn_list: + pa = parameter(fn) + x = fn(pa) + x.width = '100%' + if fn.__name__ == 't3': + x.width = 650 + x.height = 500 + if fn.__name__ == 't12': + x.width = 700 + x.height = 500 + if fn.__name__ == 't21': + x.width = 700 + x.height = 500 + + charts.append(x) + # grid.add(fn(pa)) + # print(fn.__name__ + ' ok') + + return charts + + +@ways +def t1(pa): + y = next(pa) + print(y[0]) + box = p.Boxplot('新兴与传统职业薪水对比') + box.add('传统职业', ['薪水'], [y[0]], is_toolbox_show=False) + box.add('新兴职业', ['薪水'], [y[1]], is_toolbox_show=False) + + return box + + +@ways +def t2(pa): + bar = p.Bar('需求前10的行业') + + bar.add('需求', next(pa), next(pa), is_toolbox_show=False) + return bar + + +@ways +def t3(pa): + hm = p.HeatMap('地区职位与需求关系', width=1500, height=600) + hm.add("需求量", next(pa), next(pa), next(pa), is_visualmap=True, visual_range=[350, 25000], + visual_text_color="#000", visual_orient='horizontal', yaxis_label_textsize=8, + yaxis_rotate=-45, is_toolbox_show=False) + + return hm + + +@ways +def t4(pa): + bar = p.Bar("薪资前10城市") + bar.add("薪资", next(pa), next(pa), mark_line=["average"], is_toolbox_show=False) + return bar + + +@ways +def t5(pa): + bar = p.Bar("大数据职位需求前10城市") + bar.add("需求量", next(pa), next(pa), mark_line=["average"], is_toolbox_show=False) + return bar + + +@ways +def t6(pa): + bar3d = p.Bar3D("学历经验与薪水关系", width=1200, height=500) + range_color = ['#313695', '#4575b4', '#74add1', '#abd9e9', '#e0f3f8', '#ffffbf', + '#fee090', '#fdae61', '#f46d43', '#d73027', '#a50026'] + bar3d.add("学历经验薪水", next(pa), next(pa), next(pa), + is_visualmap=True, visual_range=[4000, 30000], + visual_range_color=range_color, grid3d_width=150, grid3d_depth=80, + is_grid3d_rotate=True, grid3d_shading='realistic', grid3d_rotate_speed=30, is_toolbox_show=False) + return bar3d + + +@ways +def t7(pa): + scatter = p.Scatter("学历与需求量、薪水关系") + scatter.add("薪水", next(pa), next(pa), extra_data=next(pa), is_visualmap=True, + xaxis_type="category", visual_dimension=2, visual_range=[500, 500000] + , is_toolbox_show=False, visual_top=9999) + return scatter + + +@ways +def t8(pa): + bar = p.Bar("山东薪水前10的城市排名") + bar.add("薪水", next(pa), next(pa), mark_line=['average'], is_toolbox_show=False) + return bar + + +@ways +def t9(pa): + # geo地图有不显示数值的bug加上下面的函数和 add的参数 label_formatter=label_formatter + def label_formatter(params): + return params.value[2] + + style = p.Style( + title_color="#fff", + title_pos="center", + width=1200, + height=600, + background_color='#404a59' + ) + chart = p.Geo("山东省计算机职位分布", '数据来自齐鲁人才网,部分地区数据不准确', **style.init_style, subtitle_text_size=18) + city = [i.replace('市', '') for i in next(pa)] + # label_formatter=label_formatter防bug maptype去掉就是全国地图 + chart.add("", city, next(pa), maptype='山东', visual_range=[0, 700], label_formatter=label_formatter, + visual_text_color="#fff", is_legend_show=True, + symbol_size=15, is_visualmap=True, + tooltip_formatter='{b}', + label_emphasis_textsize=15, + label_emphasis_pos='right', is_toolbox_show=False) + return chart + + +@ways +def t10(pa): + pie = p.Pie("新兴与传统职业学历经验需求对比", width=700, height=400) + pie.add("传统学历需求", next(pa), next(pa), + radius=[50, 55], center=[35, 53]) + pie.add("新兴学历需求", next(pa), next(pa), + radius=[0, 45], center=[35, 53], rosetype='radius', + is_random=True) + pie.add("传统经验需求", next(pa), next(pa), + radius=[50, 55], center=[70, 53]) + pie.add("新兴经验需求", next(pa), next(pa), + radius=[0, 45], center=[70, 53], rosetype='radius', + legend_orient='vertical', + legend_pos='left', legend_top='center', is_random=True, is_toolbox_show=False) + return pie + + +@ways +def t11(pa): + bar = p.Bar('经验要求前十的职位') + bar.add('经验', next(pa), next(pa), mark_line=["average"], is_toolbox_show=False) + return bar + + +@ways +def t12(pa): + range_color = [ + '#313695', '#4575b4', '#74add1', '#abd9e9', '#e0f3f8', '#ffffbf', + '#fee090', '#fdae61', '#f46d43', '#d73027', '#a50026'] + scatter3D = p.Scatter3D("经验需求薪水") + scatter3D.add("3D", next(pa), is_visualmap=True, visual_range_color=range_color, is_grid3d_rotate=True, + visual_range=[7000, 35000] + , xaxis3d_name='经验', yaxis3d_name='需求', zaxis3d_name='薪水', is_toolbox_show=False, visual_top=9999) + return scatter3D + + +@ways +def t13(pa): + scatter = p.EffectScatter("职位与需求量、薪水关系") + next(pa) + y = next(pa) + y2 = next(pa) + for i in range(len(y)): + scatter.add("薪水", [y[i]], [y2[i]], is_toolbox_show=False, symbol_size=15, + effect_scale=3, effect_period=3, symbol=random.choice(['roundRect', 'pin']), + effect_brushtype='fill') + + return scatter + + +@ways +def t14(pa): + bar = p.Bar('计算机专业薪水前10方向') + y = next(pa) + y_values = next(pa) + # bar.add("薪水", mark_line=['average'],is_toolbox_show=False) + for i in range(len(y) - 4): + bar.add(y[i], ['薪水'], [y_values[i]], is_show=True, is_toolbox_show=False, is_label_show=True, + label_formatter='{a}') + bar.add(y[-1], ['薪水'], [y_values[-1]], is_legend_show=False, is_toolbox_show=False, is_label_show=True, + label_formatter='{a}') + # bar.add('方向', next(pa), next(pa), is_stack=False, mark_line=["average"], is_toolbox_show=False) + return bar + + +@ways +def t15(pa): + bar = p.Bar('薪水前十的职位') + bar.add('薪水', next(pa), next(pa), mark_line=["average"], is_toolbox_show=False) + return bar + + +@ways +def t16(pa): + bar = p.Bar('计算机专业需求前十城市') + bar.add('需求量', next(pa), next(pa), mark_line=['average'], is_toolbox_show=False) + return bar + + +@ways +def t17(pa): + bar = p.Bar("高薪水技能") + y = next(pa) + y_values = next(pa) + # bar.add("薪水", mark_line=['average'],is_toolbox_show=False) + for i in range(len(y) - 4): + if i % 3 == 1: + bar.add(y[i], ['薪水'], [y_values[i]], is_show=True, mark_line=['average'], is_toolbox_show=False) + else: + bar.add(y[i], ['薪水'], [y_values[i]], is_show=True, is_toolbox_show=False) + + return bar + + +@ways +def t18(pa): + shape = ("path://M367.855,428.202c-3.674-1.385-7.452-1.966-11.146-1" + ".794c0.659-2.922,0.844-5.85,0.58-8.719 c-0.937-10.407-7." + "663-19.864-18.063-23.834c-10.697-4.043-22.298-1.168-29.9" + "02,6.403c3.015,0.026,6.074,0.594,9.035,1.728 c13.626,5." + "151,20.465,20.379,15.32,34.004c-1.905,5.02-5.177,9.115-9" + ".22,12.05c-6.951,4.992-16.19,6.536-24.777,3.271 c-13.625" + "-5.137-20.471-20.371-15.32-34.004c0.673-1.768,1.523-3.423" + ",2.526-4.992h-0.014c0,0,0,0,0,0.014 c4.386-6.853,8.145-14" + ".279,11.146-22.187c23.294-61.505-7.689-130.278-69.215-153" + ".579c-61.532-23.293-130.279,7.69-153.579,69.202 c-6.371," + "16.785-8.679,34.097-7.426,50.901c0.026,0.554,0.079,1.121," + "0.132,1.688c4.973,57.107,41.767,109.148,98.945,130.793 c58." + "162,22.008,121.303,6.529,162.839-34.465c7.103-6.893,17.826" + "-9.444,27.679-5.719c11.858,4.491,18.565,16.6,16.719,28.643 " + "c4.438-3.126,8.033-7.564,10.117-13.045C389.751,449.992," + "382.411,433.709,367.855,428.202z") + liquid = p.Liquid("各新兴职业所占比例") + liquid.add(next(pa), next(pa), is_liquid_outline_show=False, shape=shape, is_toolbox_show=False) + return liquid + + +@ways +def t19(pa): + # def label_formatter(params): + # print(233) + # print(params.value[2]) + # return params.value[2] + l1 = next(pa) + pp = next(pa) + data = next(pa) + pie = p.Pie('大公司学历要求') + style = Style() + pie_style = style.add( + is_label_show=True, + label_pos="center", + is_label_emphasis=False, + label_formatter='{b}', + label_text_size=16, + is_legend_show=False, + label_text_color="#000" + # label_text_color=None + ) + for i in range(len(data)): + data[i][0] = 0 + data[i][1] = 0 + + for i in range(len(l1)): + l1[i] = [l1[i], '', '', '', '', '', '', ''] + pie.add('', l1[0], data[0], center=[10, 25], radius=[13, 18], + **pie_style) + pie.add('', l1[1], data[1], center=[20, 25], radius=[13, 18], + legend_pos='left', **pie_style) + pie.add('', l1[2], data[2], center=[30, 25], radius=[13, 18], + **pie_style) + pie.add('', l1[3], data[3], center=[40, 25], radius=[13, 18], + **pie_style) + pie.add('', l1[4], data[4], center=[50, 25], radius=[13, 18], + **pie_style) + pie.add('', l1[5], data[5], center=[60, 25], radius=[13, 18], + **pie_style) + pie.add('', l1[6], data[6], center=[70, 25], radius=[13, 18], + **pie_style) + pie.add('', l1[7], data[7], center=[80, 25], radius=[13, 18], + **pie_style) + pie.add('', l1[8], data[8], center=[10, 53], radius=[13, 18], + **pie_style) + pie.add('', l1[9], data[9], center=[20, 53], radius=[13, 18], + **pie_style) + pie.add('', l1[10], data[10], center=[30, 53], radius=[13, 18], + **pie_style) + pie.add('', l1[11], data[11], center=[40, 53], radius=[13, 18], + **pie_style) + pie.add('', l1[12], data[12], center=[50, 53], radius=[13, 18], + **pie_style) + pie.add('', l1[13], data[13], center=[60, 53], radius=[13, 18], + **pie_style) + pie.add('', l1[14], data[14], center=[70, 53], radius=[13, 18], + **pie_style) + pie.add('', l1[15], data[15], center=[80, 53], radius=[13, 18], + **pie_style) + pie.add('', l1[16], data[16], center=[90, 25], radius=[13, 18], + **pie_style) + pie.add('', l1[17], data[17], center=[90, 53], radius=[13, 18], + **pie_style) + pie.add('', l1[18], data[18], center=[10, 80], radius=[13, 18], + **pie_style) + pie.add('', l1[19], data[19], center=[20, 80], radius=[13, 18], + **pie_style) + pie.add('', l1[20], data[20], center=[30, 80], radius=[13, 18], + **pie_style) + pie.add('', l1[21], data[21], center=[40, 80], radius=[13, 18], + **pie_style) + pie.add('', l1[22], data[22], center=[50, 80], radius=[13, 18], + **pie_style) + pie.add('', l1[23], data[23], center=[60, 80], radius=[13, 18], + **pie_style) + pie.add('', l1[24], data[24], center=[70, 80], radius=[13, 18], + **pie_style) + pie.add('', l1[25], data[25], center=[80, 80], radius=[13, 18], + **pie_style) + pie.add('', l1[26], data[26], center=[90, 80], radius=[13, 18], + **pie_style, is_toolbox_show=False) + + return pie + + +@ways +def t20(pa): + scatter = p.Scatter('各大公司工资经验') + scatter.add('工资', next(pa), next(pa), extra_data=next(pa), is_visualmap=True, visual_dimension=2, + xaxis_type="category", visual_range=[0, 6], is_toolbox_show=False + ) + return scatter + + +@ways +def t21(pa): + wordcloud = p.WordCloud('大公司福利', width=1300, height=620) + wordcloud.add("", next(pa), next(pa), word_size_range=[20, 100], is_toolbox_show=False) + return wordcloud diff --git "a/5\343\200\201Python\346\213\233\350\201\230\345\262\227\344\275\215\344\277\241\346\201\257\350\201\232\345\220\210\347\263\273\347\273\237\357\274\210\346\213\245\346\234\211\347\210\254\350\231\253\347\210\254\345\217\226\343\200\201\346\225\260\346\215\256\345\210\206\346\236\220\343\200\201\345\217\257\350\247\206\345\214\226\343\200\201\344\272\222\345\212\250\347\255\211\345\212\237\350\203\275\357\274\211/WorkAggregation-master/analysis/input_data.py" "b/5\343\200\201Python\346\213\233\350\201\230\345\262\227\344\275\215\344\277\241\346\201\257\350\201\232\345\220\210\347\263\273\347\273\237\357\274\210\346\213\245\346\234\211\347\210\254\350\231\253\347\210\254\345\217\226\343\200\201\346\225\260\346\215\256\345\210\206\346\236\220\343\200\201\345\217\257\350\247\206\345\214\226\343\200\201\344\272\222\345\212\250\347\255\211\345\212\237\350\203\275\357\274\211/WorkAggregation-master/analysis/input_data.py" new file mode 100644 index 0000000..4ed8a37 --- /dev/null +++ "b/5\343\200\201Python\346\213\233\350\201\230\345\262\227\344\275\215\344\277\241\346\201\257\350\201\232\345\220\210\347\263\273\347\273\237\357\274\210\346\213\245\346\234\211\347\210\254\350\231\253\347\210\254\345\217\226\343\200\201\346\225\260\346\215\256\345\210\206\346\236\220\343\200\201\345\217\257\350\247\206\345\214\226\343\200\201\344\272\222\345\212\250\347\255\211\345\212\237\350\203\275\357\274\211/WorkAggregation-master/analysis/input_data.py" @@ -0,0 +1,76 @@ +import analysis_main + +# 部分代码注释掉了 正式时取消注释 + +def main(): + for name in ['qcwy', 'qlrc', 'big']: + analysis_main.Analyze.cursor.execute('DROP TABLE IF EXISTS {}; '.format(name)) + if name == 'qcwy': + sql_1 = ''' + CREATE TABLE `qcwy` ( + `id` int(11) NOT NULL AUTO_INCREMENT, + `title` varchar(255), + `place` varchar(255), + `salary` varchar(255), + `xexperience` varchar(255), + `experience` varchar(255), + `education` varchar(255), + `number` varchar(255) , + `companytype` varchar(255), + `industry` varchar(255), + `description` text, + `MAX_PAY` double(10, 0) , + `MIN_PAY` double(10, 0) , + `AVE_PAY` double(10, 0) , + `work` varchar(255) , + `flag` int(6) DEFAULT 0, + PRIMARY KEY (`id`) + );''' + columns = '(title,place,salary,xexperience,education,number,companytype,industry,description)' + if name == 'big': + sql_1 = ''' + CREATE TABLE `big` ( + `id` int(11) NOT NULL AUTO_INCREMENT, + `job` varchar(255) , + `company` varchar(255) , + `salary` varchar(255), + `experience` varchar(255) , + `education` varchar(255) , + `welfare` varchar(255) , + `experience2` varchar(255), + `min_pay` varchar(100), + `max_pay` varchar(100) , + `ave_pay` varchar(100), + PRIMARY KEY (`id`) + );''' + columns = '(job,company,salary,experience,education,welfare)' + if name == 'qlrc': + sql_1 = ''' + CREATE TABLE `qlrc` ( + `id` int(11) NOT NULL AUTO_INCREMENT, + `job` varchar(255) , + `company` varchar(255) , + `place` varchar(255) , + `pay` varchar(255) , + `lessinfo` varchar(255) , + `city` varchar(255) , + `min_pay` double(12, 0) , + `ave_pay` double(12, 0) , + `max_pay` double(12, 0), + PRIMARY KEY (`id`) + ); ''' + columns = '(job,company,place,pay,lessinfo)' + + analysis_main.Analyze.cursor.execute(sql_1) + + print(analysis_main.Analyze.path) + + sql_2 = '''LOAD DATA INFILE "{0}/data/{1}.csv" into table `{2}` + fields terminated by "," optionally enclosed by '"' escaped by '"' lines terminated by '\r\n' + {3} ;'''.format('C:/Users/Administrator/Desktop/process/job/', name, name, columns) + analysis_main.Analyze.cursor.execute(sql_2) + analysis_main.Analyze.db.commit() + + +if __name__ == '__main__': + main() \ No newline at end of file diff --git "a/5\343\200\201Python\346\213\233\350\201\230\345\262\227\344\275\215\344\277\241\346\201\257\350\201\232\345\220\210\347\263\273\347\273\237\357\274\210\346\213\245\346\234\211\347\210\254\350\231\253\347\210\254\345\217\226\343\200\201\346\225\260\346\215\256\345\210\206\346\236\220\343\200\201\345\217\257\350\247\206\345\214\226\343\200\201\344\272\222\345\212\250\347\255\211\345\212\237\350\203\275\357\274\211/WorkAggregation-master/analysis/interaction.py" "b/5\343\200\201Python\346\213\233\350\201\230\345\262\227\344\275\215\344\277\241\346\201\257\350\201\232\345\220\210\347\263\273\347\273\237\357\274\210\346\213\245\346\234\211\347\210\254\350\231\253\347\210\254\345\217\226\343\200\201\346\225\260\346\215\256\345\210\206\346\236\220\343\200\201\345\217\257\350\247\206\345\214\226\343\200\201\344\272\222\345\212\250\347\255\211\345\212\237\350\203\275\357\274\211/WorkAggregation-master/analysis/interaction.py" new file mode 100644 index 0000000..a47d450 --- /dev/null +++ "b/5\343\200\201Python\346\213\233\350\201\230\345\262\227\344\275\215\344\277\241\346\201\257\350\201\232\345\220\210\347\263\273\347\273\237\357\274\210\346\213\245\346\234\211\347\210\254\350\231\253\347\210\254\345\217\226\343\200\201\346\225\260\346\215\256\345\210\206\346\236\220\343\200\201\345\217\257\350\247\206\345\214\226\343\200\201\344\272\222\345\212\250\347\255\211\345\212\237\350\203\275\357\274\211/WorkAggregation-master/analysis/interaction.py" @@ -0,0 +1,83 @@ +import pymysql +import pyecharts as p + + +def find(name): + user = "root" + password = "zym233521" + db = pymysql.connect(host="localhost", user=user, password=password, charset="utf8") + cursor = db.cursor() + cursor.execute('USE `ujn_a`;') + names = name + 's' + + cursor.execute('DROP VIEW IF EXISTS {};'.format(names)) + sql_1 = 'CREATE VIEW {} AS SELECT qcwy.xexperience,qcwy.education FROM qcwy WHERE title like "%{}%" '.format(names, + name) + cursor.execute(sql_1) + + cursor.execute("select count(*) from " + names) + alls = cursor.fetchone()[0] + + list1 = ['本科', '硕士', '博士'] + list_edu = [] + list_edu_sql = ["select count(*) from {} where education = '{}';".format(names, i) for i in list1] + for i in list_edu_sql: + cursor.execute(i) + list_edu.append(cursor.fetchone()[0]) + + list2 = ['无工作经验', '1年经验', '2年经验', '3-4年经验', '5-7年经验', '8-9年经验', '10年以上经验'] + list_exp = [] + list_exp_sql = ["select count(*) from {} where xexperience = '{}';".format(names, i) for i in list2] + for i in list_exp_sql: + cursor.execute(i) + list_exp.append(cursor.fetchone()[0]) + + p.configure(global_theme='macarons') # 设置主题 + + bing = p.Pie() + attr = list2 + v1 = list_exp + bing.add("", attr, v1, is_label_show=True, is_toolbox_show=False, legend_top='bottom') + bing.render('static/html/bing.html') + + list4 = [] + for i in range(3): + qiu = p.Liquid(title=list1[i], title_pos='center', title_text_size=30, title_top='80%', width=600, height=400) + list3 = [round(list_edu[i] / alls, 2)] + list4.extend(list3) + qiu.add(list1[i], list3, is_liquid_animation=True, is_toolbox_show=False, + liquid_color=['#21bbff', '#00b6ff', '#23c4ff', '#47c7ff'], is_liquid_outline_show=False) + qiu.render('static/html/qiu{}.html'.format(i + 1)) + + # 返回 + + n = 1 + e_all = 0 + for i in list_exp[1:]: + e_all = e_all + i / alls / 21 * n + n = n + 1 + + n = 1 + d_all = 0 + for i in list_edu[1:]: + d_all = d_all + i / alls / 2 * n + n = n + 1 + + if e_all > d_all: + if e_all - d_all <= 0.06: + result = '考研和直接就业都很不错呢' + else: + result = '建议您毕业后直接就业哦' + else: + result = '建议您准备考研哦' + + if name == '学习': name = '机器学习' + + back = [name, result] + return back + + return + + +if __name__ == '__main__': + find('软件') diff --git "a/5\343\200\201Python\346\213\233\350\201\230\345\262\227\344\275\215\344\277\241\346\201\257\350\201\232\345\220\210\347\263\273\347\273\237\357\274\210\346\213\245\346\234\211\347\210\254\350\231\253\347\210\254\345\217\226\343\200\201\346\225\260\346\215\256\345\210\206\346\236\220\343\200\201\345\217\257\350\247\206\345\214\226\343\200\201\344\272\222\345\212\250\347\255\211\345\212\237\350\203\275\357\274\211/WorkAggregation-master/analysis/process_data.py" "b/5\343\200\201Python\346\213\233\350\201\230\345\262\227\344\275\215\344\277\241\346\201\257\350\201\232\345\220\210\347\263\273\347\273\237\357\274\210\346\213\245\346\234\211\347\210\254\350\231\253\347\210\254\345\217\226\343\200\201\346\225\260\346\215\256\345\210\206\346\236\220\343\200\201\345\217\257\350\247\206\345\214\226\343\200\201\344\272\222\345\212\250\347\255\211\345\212\237\350\203\275\357\274\211/WorkAggregation-master/analysis/process_data.py" new file mode 100644 index 0000000..d5a5b5f --- /dev/null +++ "b/5\343\200\201Python\346\213\233\350\201\230\345\262\227\344\275\215\344\277\241\346\201\257\350\201\232\345\220\210\347\263\273\347\273\237\357\274\210\346\213\245\346\234\211\347\210\254\350\231\253\347\210\254\345\217\226\343\200\201\346\225\260\346\215\256\345\210\206\346\236\220\343\200\201\345\217\257\350\247\206\345\214\226\343\200\201\344\272\222\345\212\250\347\255\211\345\212\237\350\203\275\357\274\211/WorkAggregation-master/analysis/process_data.py" @@ -0,0 +1,403 @@ +import re +import jieba +import analysis_main as A + + +# 函数注册器 +def ways(func): + A.Analyze.process_fn_list.append(func) + + def wrapper(*args, **kw): + return func(*args, **kw) + + return wrapper + + +def main(): + global cursor, db + cursor = A.Analyze.cursor + db = A.Analyze.db + + print(A.Analyze.process_fn_list) + + for fn in A.Analyze.process_fn_list: + fn() + print(fn.__name__ + ' ok') + + +@ways +def big_del_null(): + cursor.execute("update big set salary = '' where salary is null") + db.commit() + cursor.execute("update big set experience = '' where experience is null") + db.commit() + cursor.execute("update big set education = '' where education is null") + db.commit() + # !!!!!注意 特殊的值有 None null + cursor.execute("update big set experience = '不限' where experience = 'None'") + db.commit() + cursor.execute("update big set experience = '1' where experience = '-1'") + db.commit() + cursor.execute("update big set experience = '不限' where experience = 'null'") + db.commit() + cursor.execute("update big set education = '不限' where education = ''") + db.commit() + cursor.execute("update big set welfare = '' where welfare is null") + db.commit() + +@ways +def big_chuligongzi(): + sql = "select salary from big " # 获取所有的工资信息 + cursor.execute(sql) + data = cursor.fetchall() + id = 1 + for i in data: + pay = i[0] + if pay.find('以上') != -1: + pattern = re.compile(r'\d+') + res = re.findall(pattern, pay) + min = res[0] + max = "不限" + ave = res[0] + sql = "UPDATE big SET MIN_PAY=" + str(min) + ",MAX_PAY='不限',AVE_PAY=" + str(ave) + " WHERE id=" + str( + id) + cursor.execute(sql) + id += 1 + continue + + elif pay.find('-') != -1: + pattern = re.compile(r'\d+') + res = re.findall(pattern, pay) + min = int(res[0]) + max = int(res[1]) + ave = int((min + max) // 2) + + elif pay.find('面议') != -1: + min = '面议' + max = '面议' + ave = '面议' + sql = "UPDATE big SET MIN_PAY='面议',MAX_PAY='面议',AVE_PAY='面议' WHERE id=" + str(id) + cursor.execute(sql) + id += 1 + continue + else: + pattern = re.compile(r'\d+') + res = re.findall(pattern, pay) + if res == None: + min = '面议' + max = '面议' + ave = '面议' + sql = "UPDATE big SET MIN_PAY='面议',MAX_PAY='面议',AVE_PAY='面议' WHERE id=" + str(id) + cursor.execute(sql) + id += 1 + continue + else: + min = res[0] + max = res[0] + ave = res[0] + sql = "UPDATE big SET MIN_PAY=" + str(min) + ",MAX_PAY=" + str(max) + ",AVE_PAY=" + str( + ave) + " WHERE id=" + str(id) + cursor.execute(sql) + if id % 5000 == 0: + db.commit() + id += 1 + db.commit() + + +@ways +def big_chulijingyan(): # 将经验提取出来 + sql = "SELECT experience FROM big" + cursor.execute(sql) + results = cursor.fetchall() + a = 1 + for row in results: + if row[0] == '': + a += 1 + continue + if row[0].isalpha() or row[0] == '无工作经验': + sql = "update big set experience2 = '0' where id = '%s'" % str(a) + cursor.execute(sql) + elif row[0].find('-') != -1 and row[0].split('-')[0] != '' and row[0].split('-')[1] != '': + pattern = re.compile(r'\d+') + res = re.findall(pattern, row[0]) + # try: + res = int((int(res[0]) + int(res[1])) / 2) + sql = "update big set experience2 = " + str(res) + " where id = '%s'" % str(a) + cursor.execute(sql) + else: + print(row[0], type(row[0])) + pattern = re.compile(r'\d+') + res = re.findall(pattern, row[0]) + sql = "update big set experience2 = " + str(res[0]) + " where id = '%s'" % str(a) + cursor.execute(sql) + # db.commit() + print(a) + if int(a) % 5000 == 0: + db.commit() + a += 1 + db.commit() + + +@ways +def qlrc(): + cursor.execute("select place from qlrc") + re = cursor.fetchall() + id = 1 + for i in range(0, len(re)): + if len(re[i][0]) == 0 or re[i][0].find('市') == -1: + id += 1 + continue + else: + x = list(jieba.cut(re[i][0])) + x = x[1] + cursor.execute("update qlrc set city = '" + str(x) + "' where id =" + str(id)) + db.commit() + id += 1 + + cursor.execute("select pay from qlrc") # 获取所有的工资信息 + data = cursor.fetchall() + id = 1 + for i in data: + pay = i[0] + if pay.find('-') != -1: + pay_min = float(((pay.split('-')[0]).split('K'))[0]) * 1000 + pay_max = float((pay.split('-')[1].split('K'))[0]) * 1000 + ave = round((pay_max + pay_min) / 2, 2) + sql = "UPDATE qlrc SET MIN_PAY=" + str(pay_min) + ",MAX_PAY=" + str(pay_max) + ",AVE_PAY=" + str( + ave) + " WHERE id=" + str(id) + cursor.execute(sql) + db.commit() + id += 1 + + + + + +@ways +def qcwy1(): + cursor.execute("select xexperience,number from qcwy") + data = cursor.fetchall() + id = 1 + for i in data: + # 处理人数 + if i[1].isalpha(): + res = 0 + sql = "update qcwy set number = " + str(res) + " where id = %s" % str(id) + cursor.execute(sql) + # db.commit() + elif i[1].find('-') != -1: + pattern = re.compile(r'\d+') + res = re.findall(pattern, i[1]) + res = int((int(res[0]) + int(res[1])) / 2) + sql = "update qcwy set number = " + str(res) + " where id = %s" % str(id) + cursor.execute(sql) + # db.commit() + else: + pattern = re.compile(r'\d+') + res = re.findall(pattern, i[1]) + sql = "update qcwy set number = " + str(res[0]) + " where id = %s" % str(id) + cursor.execute(sql) + # db.commit() + # 提经验值 + if i[0].isalpha(): + sql = "update qcwy set experience = '0' where id = %s" % str(id) + cursor.execute(sql) + # db.commit() + elif i[0].find('-') != -1: + pattern = re.compile(r'\d+') + res = re.findall(pattern, i[0]) + res = int((int(res[0]) + int(res[1])) / 2) + sql = "update qcwy set experience = " + str(res) + " where id = %s" % str(id) + cursor.execute(sql) + # db.commit() + else: + pattern = re.compile(r'\d+') + res = re.findall(pattern, i[0]) + sql = "update qcwy set experience = " + str(res[0]) + " where id = %s" % str(id) + cursor.execute(sql) + # db.commit() + if int(id) % 100000 == 0: + db.commit() + print(id) + id += 1 + db.commit() + + cursor.execute("SELECT number FROM qcwy ") + results = cursor.fetchall() + sum = 0 + count = 0 + for row in results: + if int(row[0]) != 0: + sum += int(row[0]) + count += 1 + b = int(sum / count) + print(b) + id = 1 + for row in results: + if int(row[0]) != 0: + id += 1 + continue + else: + sql = "update qcwy set number = " + str(b) + " where id = %s" % str(id) + cursor.execute(sql) + if int(id) % 100000 == 0: + db.commit() + print(id) + id += 1 + db.commit() + + +@ways +def qcwy2(): + cursor.execute('select salary from qcwy ') + data = cursor.fetchall() + id = 1 + for i in data: + pay = i[0] + if pay.find('千') != -1 or pay.find('万') != -1 or pay.find('元') != -1: # 如果为空值不处理,当字符串中存在千、万的时候就进行如下处理 + if pay.find('年') != -1: + x = 12 + elif pay.find('天') != -1: + x = 1 / 30 + else: + x = 1 + if pay.find('千') != -1: + if pay.find('-') != -1: + pay_min = pay.split('-')[0] + pay_max = pay.split('-')[1].split('千')[0] + min = float(pay_min) * 1000 / x + max = float(pay_max) * 1000 / x + ave = (min + max) / 2 + else: + min = max = ave = float(pay.split('千')[0]) * 1000 / x + elif pay.find('万') != -1: + if pay.find('-') != -1: + + pay_min = pay.split('-')[0] + pay_max = pay.split('-')[1].split('万')[0] + min = float(pay_min) * 10000 / x + max = float(pay_max) * 10000 / x + ave = (min + max) / 2 + else: + min = max = ave = float(pay.split('万')[0]) * 10000 / x + else: + if pay.find('-') != -1: + pay_min = pay.split('-')[0] + pay_max = pay.split('-')[1].split('元')[0] + min = float(pay_min) / x + max = float(pay_max) / x + ave = (min + max) / 2 + else: + min = max = ave = float(pay.split('元')[0]) / x + + # sql语句是将min max ave放入数据库 + sql = "UPDATE qcwy SET MIN_PAY=" + str(min) + ",MAX_PAY=" + str(max) + ",AVE_PAY=" + str( + ave) + " WHERE id=" + str(id) + cursor.execute(sql) + + if int(id) % 100000 == 0: + db.commit() + print(id) + id += 1 + db.commit() + + +@ways +def qcwy_view(): + def duquxieru(x, y): + count = 0 + for i in x: + info = [] + i = str(i) + m = y[count] + j = '`' + m + '`' + if i == '数据': + sql = 'create view ' + j + ' as select distinct * from qcwy where (qcwy.title like "%' + i + '%" and qcwy.title not like "%数据管理%")' + print(sql) + cursor.execute(sql) + elif i == '维修': + sql = 'create view ' + j + ' as select distinct * from qcwy where (qcwy.title like "%' + i + '%" or qcwy.title like "%维护%")' + print(sql) + cursor.execute(sql) + else: + + # sql = 'create view ' + j + ' as select distinct * from qcwy where (qcwy.title like "%' + i + '%" or qcwy.title like "%' + i2 + '%"' \ + # ' or qcwy.title like "%' + i3 + '%" or or qcwy.title like "%' + i4 + '%")' + + sql2 = 'create view ' + j + ' as select distinct * from qcwy where (qcwy.title like "%' + i + '%")' + print(sql2) + + cursor.execute(sql2) + + count += 1 + + sql = "SELECT * FROM qcwy" + cursor.execute(sql) + results = cursor.fetchall() + results = list(results) + + l1 = ['讲师', '经理', '总监', '大数据', '负责人', '服务器', '数据库', '软件', '建模', '硬件', '网络', '人工智能', '后端', '机器学习'] + l1_1 = ['XXXX讲师', '项目开发经理', '技术/研发总监', '大数据开发工程师', '技术/研究/项目负责人', '服务器工程师', '数据库工程师', '软件开发工程师', '建模工程师', '硬件工程师', + '网络工程师', '人工智能开发工程师', '后端工程师', '机器学习工程师'] + l2 = ['数据', '数据管理', '前端', '维修'] + l2_1 = ['数据挖掘/分析/处理工程师', '数据管理工程师', 'Web前端工程师', '计算机维修/维护工程师'] + l3 = ['Java', 'C++', 'PHP', 'C#', '.Net', 'Hadoop', 'Python', 'Perl', 'Ruby', 'Nodejs', 'Go', 'Javascript', + 'Delphi', 'jsp', 'sql', 'Linux', 'Android', 'IOS', 'GIS', 'BI'] + l3_1 = ['Java工程师', 'C++工程师', 'PHP工程师', 'C#工程师', '.NET工程师', 'Hadoop工程师', 'Python工程师', 'Perl工程师', 'Ruby工程师', + 'Nodejs工程师', 'Go工程师', 'Javascript工程师', 'Delphi工程师', 'jsp工程师', 'sql工程师', 'Linux开发工程师', 'Android开发工程师', + 'IOS开发工程师', 'GIS开发/研发工程师', 'BI工程师'] + + results = duquxieru(l1, l1_1) + print(1) + + results = duquxieru(l2, l2_1) + print(2) + + results = duquxieru(l3, l3_1) + print(3) + + +@ways +def oldnew_view(): + l3 = ['传统', '新兴'] + for i in l3: + if i == '新兴': # todo 改数量 + sql = 'create view `新兴职业` as select distinct ID ,title,ave_pay,number,experience,education ' \ + 'from qcwy where (qcwy.title like "%学习%" or qcwy.title like "%人工智能%" ' \ + 'or qcwy.title like "%数据%" or qcwy.title like "%算法%" or qcwy.title like "%区块链%"' \ + ' or qcwy.title like "%视觉%" or qcwy.title like "%物联网%" or qcwy.title like "%自然语言%"' \ + 'and qcwy.id < "10000")' + else: + sql = 'create view `传统职业` as select distinct ID ,title,ave_pay,number,experience,education from qcwy where (qcwy.title not like "%学习%" and qcwy.title not like "%人工智能%" ' \ + 'and qcwy.title not like "%数据%" and qcwy.title not like "%算法%" and qcwy.title not like "%区块链%"' \ + ' and qcwy.title not like "%视觉%" and qcwy.title not like "%物联网%" and qcwy.title not like "%自然语言%"' \ + 'and qcwy.id < "10000")' + cursor.execute(sql) + +@ways +def bigcompany_bigdata_view(): + l1 = ['华为', '搜狐', '滴滴出行', '金山', '新浪', '美团', '甲骨文', '阿里巴巴', '微软', '爱奇艺', '中国电信', '百度', '奇虎', '英特尔', '完美世界', '字节跳动', + '中国移动', '中国联通', '巨人网络', '浪潮', '联想', '搜狗', '蚂蚁金服', '腾讯', '网易', '小米', 'IBM', '京东'] + for i in l1: + j = '`' + i + '`' + cursor.execute('DROP VIEW IF EXISTS ' + j) + sql = 'create view ' + j + ' as select distinct * from big where (big.company like "%' + i + '%")' + cursor.execute(sql) + sql = 'create view `大数据职位` as select distinct ID ,place,number,industry from qcwy where (qcwy.title like "%数据%" )' + cursor.execute(sql) + +@ways +def another_view(): + l1 = ['软件', '人工智能', '学习', '前端', '后端', '数据', '算法', '测试', '安全', '运维', 'UI', '区块链', '网络', '全栈', '硬件', '物联网', '游戏'] + for i in l1: + j = '`' + i + '`' + if i == '学习': # 机器学习和深度学习都是学习 + # 视图名 原表名 原表名 + sql = 'create view `深度\机器学习` as select distinct * from qcwy where (qcwy.title like "%学习%")' + elif i == 'UI': + sql = 'create view `UI` as select distinct * from qcwy where (qcwy.title like "%UI%" and qcwy.title not like "%GUI%")' + elif i == '软件': + sql = 'create view `软件开发` as select distinct * from qcwy where (qcwy.title like "%软件%" and qcwy.title not like "%测试%")' + else: + sql = 'create view ' + j + ' as select distinct * from qcwy where (qcwy.title like "%' + i + '%")' + cursor.execute(sql) diff --git "a/5\343\200\201Python\346\213\233\350\201\230\345\262\227\344\275\215\344\277\241\346\201\257\350\201\232\345\220\210\347\263\273\347\273\237\357\274\210\346\213\245\346\234\211\347\210\254\350\231\253\347\210\254\345\217\226\343\200\201\346\225\260\346\215\256\345\210\206\346\236\220\343\200\201\345\217\257\350\247\206\345\214\226\343\200\201\344\272\222\345\212\250\347\255\211\345\212\237\350\203\275\357\274\211/WorkAggregation-master/conf/conf.ini" "b/5\343\200\201Python\346\213\233\350\201\230\345\262\227\344\275\215\344\277\241\346\201\257\350\201\232\345\220\210\347\263\273\347\273\237\357\274\210\346\213\245\346\234\211\347\210\254\350\231\253\347\210\254\345\217\226\343\200\201\346\225\260\346\215\256\345\210\206\346\236\220\343\200\201\345\217\257\350\247\206\345\214\226\343\200\201\344\272\222\345\212\250\347\255\211\345\212\237\350\203\275\357\274\211/WorkAggregation-master/conf/conf.ini" new file mode 100644 index 0000000..d1feb52 --- /dev/null +++ "b/5\343\200\201Python\346\213\233\350\201\230\345\262\227\344\275\215\344\277\241\346\201\257\350\201\232\345\220\210\347\263\273\347\273\237\357\274\210\346\213\245\346\234\211\347\210\254\350\231\253\347\210\254\345\217\226\343\200\201\346\225\260\346\215\256\345\210\206\346\236\220\343\200\201\345\217\257\350\247\206\345\214\226\343\200\201\344\272\222\345\212\250\347\255\211\345\212\237\350\203\275\357\274\211/WorkAggregation-master/conf/conf.ini" @@ -0,0 +1,55 @@ +[chart] +chart.1.1 = [[20.0, 7000.0, 9000.0, 12500.0, 250000.0], [1000.0, 7000.0, 12000.0, 17500.0, 550000.0]] +chart.2.1 = ['', '/', '(ϵͳݷά)', 'ͨ/Ӫֵ', 'ͨ//豸', '/Ͷ/֤ȯ', 'רҵ(ѯԴƻ)', 'Ӽ/뵼/ɵ·', '/ѵ/ԺУ', 'Ӳ'] +chart.2.2 = [24498, 13324, 8588, 5505, 4017, 3026, 1773, 1075, 1057, 1049] +chart.3.1 = {'ɶ', '', '', '', '', 'Ϻ', '', '人', '', 'Ͼ'} +chart.3.2 = ['ʦ', 'Javaʦ', '繤ʦ', 'Webǰ˹ʦ', '`ھ//ʦ`', '`.NETʦ`', '`C++ʦ`', 'Ӳʦ', 'Androidʦ', 'PHPʦ'] +chart.3.3 = [['', 'ʦ', 13705], ['Ϻ', 'ʦ', 24163], ['', 'ʦ', 15733], ['', 'ʦ', 8950], ['', 'ʦ', 7105], ['人', 'ʦ', 7831], ['ɶ', 'ʦ', 6417], ['Ͼ', 'ʦ', 8393], ['', 'ʦ', 6032], ['', 'ʦ', 5298], ['', 'Javaʦ', 17028], ['Ϻ', 'Javaʦ', 20124], ['', 'Javaʦ', 12821], ['', 'Javaʦ', 11747], ['', 'Javaʦ', 8724], ['人', 'Javaʦ', 6635], ['ɶ', 'Javaʦ', 5645], ['Ͼ', 'Javaʦ', 7685], ['', 'Javaʦ', 2365], ['', 'Javaʦ', 3911], ['', '繤ʦ', 4771], ['Ϻ', '繤ʦ', 7628], ['', '繤ʦ', 8282], ['', '繤ʦ', 12826], ['', '繤ʦ', 3012], ['人', '繤ʦ', 5181], ['ɶ', '繤ʦ', 3258], ['Ͼ', '繤ʦ', 2611], ['', '繤ʦ', 1704], ['', '繤ʦ', 2521], ['', 'Webǰ˹ʦ', 6212], ['Ϻ', 'Webǰ˹ʦ', 8812], ['', 'Webǰ˹ʦ', 6974], ['', 'Webǰ˹ʦ', 5976], ['', 'Webǰ˹ʦ', 3903], ['人', 'Webǰ˹ʦ', 3157], ['ɶ', 'Webǰ˹ʦ', 2454], ['Ͼ', 'Webǰ˹ʦ', 2376], ['', 'Webǰ˹ʦ', 1070], ['', 'Webǰ˹ʦ', 1244], ['', '`ھ//ʦ`', 7000], ['Ϻ', '`ھ//ʦ`', 10796], ['', '`ھ//ʦ`', 4095], ['', '`ھ//ʦ`', 4071], ['', '`ھ//ʦ`', 3159], ['人', '`ھ//ʦ`', 2171], ['ɶ', '`ھ//ʦ`', 1852], ['Ͼ', '`ھ//ʦ`', 2175], ['', '`ھ//ʦ`', 931], ['', '`ھ//ʦ`', 895], ['', '`.NETʦ`', 2113], ['Ϻ', '`.NETʦ`', 4658], ['', '`.NETʦ`', 2707], ['', '`.NETʦ`', 2814], ['', '`.NETʦ`', 1317], ['人', '`.NETʦ`', 1880], ['ɶ', '`.NETʦ`', 1350], ['Ͼ', '`.NETʦ`', 827], ['', '`.NETʦ`', 1136], ['', '`.NETʦ`', 674], ['', '`C++ʦ`', 3028], ['Ϻ', '`C++ʦ`', 3338], ['', '`C++ʦ`', 2716], ['', '`C++ʦ`', 1854], ['', '`C++ʦ`', 1691], ['人', '`C++ʦ`', 1929], ['ɶ', '`C++ʦ`', 1496], ['Ͼ', '`C++ʦ`', 1650], ['', '`C++ʦ`', 583], ['', '`C++ʦ`', 972], ['', 'Ӳʦ', 1856], ['Ϻ', 'Ӳʦ', 3064], ['', 'Ӳʦ', 5314], ['', 'Ӳʦ', 1314], ['', 'Ӳʦ', 1316], ['人', 'Ӳʦ', 1003], ['ɶ', 'Ӳʦ', 789], ['Ͼ', 'Ӳʦ', 1228], ['', 'Ӳʦ', 737], ['', 'Ӳʦ', 729], ['', 'Androidʦ', 2196], ['Ϻ', 'Androidʦ', 3437], ['', 'Androidʦ', 3406], ['', 'Androidʦ', 2128], ['', 'Androidʦ', 1606], ['人', 'Androidʦ', 1180], ['ɶ', 'Androidʦ', 886], ['Ͼ', 'Androidʦ', 1543], ['', 'Androidʦ', 351], ['', 'Androidʦ', 552], ['', 'PHPʦ', 1879], ['Ϻ', 'PHPʦ', 2636], ['', 'PHPʦ', 3131], ['', 'PHPʦ', 3492], ['', 'PHPʦ', 1023], ['人', 'PHPʦ', 1322], ['ɶ', 'PHPʦ', 822], ['Ͼ', 'PHPʦ', 610], ['', 'PHPʦ', 396], ['', 'PHPʦ', 397]] +chart.4.1 = ['', 'Ϻ', '', '', '麣', '', 'Ͼ', '', '', 'ɶ'] +chart.4.2 = [13410.12, 12043.13, 11162.47, 10920.99, 10107.79, 9608.01, 9493.3, 9190.94, 9042.76, 9034.65] +chart.5.1 = ['Ϻ', '', '', '', '', 'Ͼ', '人', 'ɶ', '֣', 'Ϸ'] +chart.5.2 = [10838, 7037, 4126, 4109, 3171, 2186, 2179, 1860, 1186, 989] +chart.6.1 = ['', 'ר', 'ר', '', '˶ʿ'] +chart.6.2 = ['0', '1', '2', '3', '6', '8', '10'] +chart.6.3 = [['', '0', 8826.03], ['', '1', 7221.86], ['', '2', 10092.25], ['', '3', 13300.76], ['', '6', 19661.01], ['', '8', 23832.51], ['', '10', 23941.95], ['ר', '0', 5453.62], ['ר', '1', 6162.78], ['ר', '2', 6847.99], ['ר', '3', 7950.56], ['ר', '6', 12287.23], ['ר', '8', 7750.0], ['ר', '10', 22250.0], ['ר', '0', 6905.18], ['ר', '1', 7699.5], ['ר', '2', 9205.89], ['ר', '3', 11869.37], ['ר', '6', 16144.18], ['ר', '8', 21767.06], ['ר', '10', 23740.88], ['', '0', 10339.4], ['', '1', 9359.86], ['', '2', 12049.28], ['', '3', 14936.52], ['', '6', 22106.98], ['', '8', 25687.7], ['', '10', 39685.28], ['˶ʿ', '0', 15570.43], ['˶ʿ', '1', 17352.8], ['˶ʿ', '2', 17455.45], ['˶ʿ', '3', 21095.3], ['˶ʿ', '6', 9326.4], ['˶ʿ', '8', 27837.5], ['˶ʿ', '10', 28105.34]] +chart.7.1 = ['', 'ר', 'м', 'м', 'ʿ', 'ר', '', '˶ʿ', ''] +chart.7.2 = [9223.51, 5956.67, 5735.57, 7909.98, 29173.58, 8592.38, 13130.19, 13699.68, 6651.08] +chart.7.3 = [284347, 40517, 6689, 13993, 513, 490977, 393023, 21525, 37302] +chart.8.1 = ['ൺ', 'Ϋ', '', '', '', '̨', 'ׯ', 'Ӫ', 'Ͳ', '̩'] +chart.8.2 = [6750.0, 6294.28, 6033.83, 6017.07, 5838.98, 5745.74, 5668.6, 5609.23, 5553.47, 5494.58] +chart.9.1 = ['Ӫ', '', '', '', '', 'ׯ', '̩', '', '', 'Ͳ', '', 'Ϋ', '̨', 'ij', '', '', 'ൺ'] +chart.9.2 = [331, 91, 60, 34, 206, 44, 333, 661, 316, 173, 47, 378, 362, 82, 67, 29, 145] +chart.10.1 = ['', 'ר', 'ר', '', '˶ʿ'] +chart.10.2 = [4342, 431, 6742, 8282, 844] +chart.10.3 = ['', 'ר', 'ר', '', '˶ʿ'] +chart.10.4 = [17162, 636, 14803, 33057, 6523] +chart.10.5 = ['0', '1', '10', '2', '3', '6', '8'] +chart.10.6 = [7995, 3817, 52, 3664, 3924, 1694, 78] +chart.10.7 = ['0', '1', '10', '2', '3', '6', '8'] +chart.10.8 = [34999, 7617, 107, 10295, 15190, 4569, 298] +chart.11.1 = ['`/зܼ`', '`/о/Ŀ`', 'Perlʦ', 'sqlʦ', 'Javaʦ', 'Hadoopʦ', 'Webǰ˹ʦ', 'XXXXʦ', 'Rubyʦ', 'ݿʦ'] +chart.11.2 = [3.52, 3.35, 2.28, 2.21, 2.15, 1.98, 1.93, 1.92, 1.92, 1.89] +chart.12.1 = [['0', 590542, 8347.11], ['1', 225742, 7918.54], ['10', 1484, 34955.87], ['2', 198015, 10408.65], ['3', 201392, 13676.4], ['6', 68293, 18754.41], ['8', 3418, 24935.4]] +chart.13.1 = ['XXXXʦ', '`/зܼ`', 'ݿʦ', '`/о/Ŀ`', 'ʦ', 'ݿ⹤ʦ', 'ʦ', 'ģʦ', 'Ӳʦ', '繤ʦ', '˹ܿʦ', '˹ʦ', 'ѧϰʦ', '`ھ//ʦ`', 'ݹʦ', 'Webǰ˹ʦ', '`ά/άʦ`', 'Javaʦ', '`C++ʦ`', 'PHPʦ', '`C#ʦ`', '`.NETʦ`', 'Hadoopʦ', 'Pythonʦ', 'Perlʦ', 'Rubyʦ', 'Nodejsʦ', 'Goʦ', 'Javascriptʦ', 'Delphiʦ', 'jspʦ', 'sqlʦ', 'Linuxʦ', 'Androidʦ', 'IOSʦ', '`GIS/зʦ`', 'BIʦ'] +chart.13.2 = [14988.95, 21955.26, 15953.78, 24987.15, 14272.27, 11721.03, 10380.47, 11076.1, 10760.87, 7551.72, 17207.77, 14997.28, 28248.46, 12099.28, 9060.51, 13211.76, 5907.56, 13178.04, 13033.55, 12344.86, 11297.68, 11203.72, 16004.27, 13926.78, 9131.58, 15471.69, 14130.15, 16032.86, 13174.3, 11046.3, 10460.41, 15448.45, 12705.12, 12550.01, 12810.86, 11788.51, 14208.11] +chart.13.3 = [2988.0, 9225.0, 11921.0, 902.0, 4326.0, 6625.0, 141114.0, 1247.0, 21319.0, 70435.0, 1804.0, 4572.0, 1158.0, 44223.0, 249.0, 50424.0, 16356.0, 123497.0, 24120.0, 21209.0, 11185.0, 26861.0, 670.0, 4199.0, 38.0, 166.0, 420.0, 2783.0, 633.0, 623.0, 59.0, 870.0, 5248.0, 21061.0, 12683.0, 2707.0, 3400.0] +chart.14.1 = ['', '`\\ѧϰ`', '㷨', 'ȫջ', '˹', '', 'ǰ', '', 'ȫ', ''] +chart.14.2 = [21158.92, 20589.06, 20373.05, 17382.85, 17207.77, 14997.28, 13211.76, 12979.79, 12887.54, 12082.26] +chart.15.1 = ['ѧϰʦ', '`/о/Ŀ`', '`/зܼ`', '˹ܿʦ', 'Goʦ', 'Hadoopʦ', 'ݿʦ', 'Rubyʦ', 'sqlʦ', '˹ʦ'] +chart.15.2 = [28248.46, 24987.15, 21955.26, 17207.77, 16032.86, 16004.27, 15953.78, 15471.69, 15448.45, 14997.28] +chart.16.1 = ['Ϻ', '', '', '', '', '人', 'ɶ', 'Ͼ', '', ''] +chart.16.2 = [219221, 186149, 164110, 126386, 79169, 74607, 54982, 52173, 35180, 34858] +chart.17.1 = ['Goʦ', 'Hadoopʦ', 'Rubyʦ', 'sqlʦ', 'BIʦ', 'Nodejsʦ', 'Pythonʦ', 'Javaʦ', 'Javascriptʦ', 'C++ʦ'] +chart.17.2 = [16032.86, 16004.27, 15471.69, 15448.45, 14208.11, 14130.15, 13926.78, 13178.04, 13174.3, 13033.55] +chart.18.1 = ['', '㷨', '', 'Ӿ', 'ѧϰ', '', '˹', 'Ȼ'] +chart.18.2 = [0.63, 0.21, 0.03, 0.09, 0.04, 0.02, 0.03, 0.0] +chart.19.1 = ['Ϊ', 'Ѻ', 'εγ', 'ɽ', '', '', '׹', 'Ͱ', '΢', '', 'й', 'ٶ', '滢', 'Ӣض', '', 'ֽ', 'йƶ', 'йͨ', '', '˳', '', 'ѹ', 'Ͻ', 'Ѷ', '', 'С', 'IBM', ''] +chart.19.2 = ['м', 'רУм', '', 'ר', '', '˶ʿ', 'ʿ', ''] +chart.19.3 = [[2, 8, 11, 84, 1046, 40, 10, 205], [0, 0, 3, 19, 486, 15, 0, 30], [0, 0, 2, 21, 828, 27, 0, 69], [2, 7, 5, 62, 481, 12, 2, 97], [0, 0, 0, 27, 462, 21, 0, 8], [0, 1, 2, 109, 723, 43, 4, 64], [0, 0, 1, 24, 303, 9, 0, 33], [0, 4, 1, 68, 1680, 47, 1, 263], [0, 0, 0, 1, 71, 10, 1, 5], [0, 0, 0, 4, 879, 54, 1, 15], [0, 23, 16, 237, 640, 33, 4, 101], [0, 5, 4, 118, 950, 34, 0, 58], [1, 0, 0, 32, 544, 11, 1, 52], [9, 9, 11, 83, 111, 8, 0, 80], [1, 0, 1, 77, 415, 7, 0, 189], [0, 1, 0, 76, 1233, 15, 0, 23], [0, 0, 2, 12, 133, 12, 0, 8], [0, 22, 6, 86, 359, 9, 0, 30], [5, 1, 0, 61, 115, 0, 0, 59], [0, 0, 3, 57, 137, 5, 0, 31], [0, 2, 4, 234, 636, 51, 3, 61], [0, 0, 0, 2, 327, 117, 2, 71], [0, 0, 0, 10, 1404, 77, 4, 172], [0, 1, 0, 62, 1871, 104, 6, 143], [1, 0, 1, 140, 1444, 90, 2, 155], [0, 2, 1, 67, 517, 39, 0, 75], [0, 2, 0, 11, 54, 2, 0, 10], [2, 5, 9, 177, 916, 59, 11, 119]] +chart.20.1 = ['Ϊ', 'Ѻ', 'εγ', 'ɽ', '', '', '׹', 'Ͱ', '΢', '', 'й', 'ٶ', '滢', 'Ӣض', '', 'ֽ', 'йƶ', 'йͨ', '', '˳', '', 'ѹ', 'Ͻ', 'Ѷ', '', 'С', 'IBM', ''] +chart.20.2 = [27123.81, 21423.06, 28307.65, 19156.99, 21399.26, 28301.58, 39697.75, 28767.47, 33386.88, 22522.74, 13168.67, 20488.55, 24519.55, 9852.34, 16456.22, 26341.62, 17827.26, 13212.58, 16796.35, 10042.76, 15949.12, 29250.64, 31866.36, 25395.31, 18624.52, 21181.19, 19347.22, 21365.78] +chart.20.3 = [3.47, 2.95, 3.86, 2.8, 3.03, 4.09, 4.71, 4.11, 3.03, 3.58, 2.38, 2.3, 3.19, 1.27, 2.15, 2.48, 2.98, 2.44, 2.52, 2.32, 3.17, 3.2, 3.44, 3.33, 2.68, 2.81, 3.73, 3.66] +chart.21.1 = ['һ', ' Ѱ೵', ' ', ' ˧', ' շֺ', ' Թ', ' Ч', ' Ů', ' ƱȨ', ' ͨ', ' ס', ' ', ' ˫', ' Ա', ' н', ' ˫н', ' ', ' ', 'רҵѵ', ' չռ', ' ҵ', ' ʻƽ̨', ' ೵', ' ', ' רҵѵ ', ' һ ', ' ͨ ', ' Ա ', ' ', ' Թ ', ' Ч ', ' ͨѶ ', ' ս ', ' ҽƱ ', ' һ ', ' ĩ˫ ', ' ո ', ' ݶ ', ' н ', ' ', ' ס ', ' Ӱಹ ', ' ² ', ' ȫڽ ', ' ', ' ס ', ' ', ' λ', ' ѵ', ' 淶', 'ר', ' һ', ' ƽ', ' ͨѶ', ' 쵼', ' ', ' ƱȨ ', ' 乫 ', ' ', 'н', 'ס', '500ǿ', ' ĩ˫', ' ְ', '15', ' һ', ' ѵ', ' Թʱ', ' ŶӷΧ', ' Ŀ', ' Ĭ', ' Ŷ', ' Ͳ', ' ', 'Ѱ೵', ' һ', ' ', ' ˧', ' ԡ', ' ٤', 'һ﹤Ȧ', ' רҵţ', ' ʻƷ', ' λýƷ', ' û', ' Ůǰ̨', ' ս', ' Ͳ', 'רҵѵ λ ո н Ա', ' ', ' Ѱ೵ ', ' 칫 ', '8Сʱ', ' Ա', ' ƽ̨', ' Ѳ', 'ͨ', 'Ͳ', ' ҽ', ' ӰͲ', ' Ƚ ', ' ڼո ', ' ȫн ', ' ', ' ȫڽ', ' Ӱಹ', ' Ա', ' ո', 'ȷֺ', ' Ƚ', ' ÿ2μн', '', 'ȫ֮·', ' ҵǰ', ' ŶǢ', ' ƽ̨Դ', ' ', ' ', ' ͸ ', ' 籣 ', ' ¶Ƚ ', ' party ', ' ', ' ¶Ƚ ', ' ݶ ', ' ʳ ', ' 5A칫 ', ' ѽ ', ' 12 ', ' Ѳ ', ' һ ', ' ڹ ', 'Աѵ', ' ƽ̨', ' ׸', ' ߸˧', ' ṩƽ ', ' ', ' ', ' ', ' н/˫н/շֺ', ' ṩס', ' ͨ ', ' Ͻ ', 'λ', 'ն', ' ', ' ͨ ', ' ׼ʱ ', ' Աڲ ', ' ', ' ռ ', ' յ ', ' ', ' ɸ ', ' ͽ ', ' ýռ ', ' Բ', ' ', ' ', 'Ա', ' شȦ', ' Ȥ', ' ս', ' ռ', ' 쵼ദ', ' ', ' ȶ ', ' ', ' ', ' ѧϰ', ' ', ' ҵ ', ' ˫н ', ' ĩ ', ' ', ' ʦĻ', ' ', ' ', ' ⷿ', ' Ƚ', ' ûһ', '14.6н', ' Ӱಹ', ' ', ' ٳɳ', ' Ͳ+ͨѶ', '', ' ƶ֧', ' ֧', ' ƹֵ', ' нѵ ', ' ռ ', ' ո ', ' ', ' ˮʳ', '', ' ṩס ', ' ͨѶ', ' Թ ', 'mac칫', ' ˫ߵ', ' ', ' ͽⷿ', ' ɳռ', ' źн ', ' нݼ ', ' ƽ ', ' ְҵţ ', ' û ', ' Ͳ ', ' һ ', ' ŶӷΧ ', ' ⷿ ', ' ', ' ', ' Աѵ', ' 4400', ' ס', ' ߴϣ', ' ', ' 䲹 ', ' ʳ', 'ס:ṩ', ' ְһ', ' 乤', ' нѵ', ' ڼ15', ' ṩͻԴ', ' ṩס ', 'ӹ˾', ' ', ' ҽƱ ', ' רҵѵ ', ' ', 'һ', ' ۼ', ' ź', ' ռ', ' Χ', ' ', ' ', '', ' ս', ' Ȩֺ ', '', ' AI', ' û', ' ͼΧ', ' ӢŶ', ' ', ' ڲתڻ', ' Ӱû', ' ɳռ', ' ʿ', ' ȼ', ' Ŷ', ' ջԾ', ' Ѷƽ̨', 'ѽ', ' ʩ', ' Ӱ', ' Ŷ ', ' Ѷƽ̨ ', 'Ž', ' ѵ', ' ڼո', ' Ʒû', ' ѽ', ' ְһ', ' Ůֽ', ' Ӧʳ', ' ʹŶ', ' ס', 'Ϊն', ' ҽ ', 'Ͳ', ' ', ' ˫ ', '61', ' ', ' ڼ3', 'ݶ', ' ս', ' ', ' ҹಹ20-30Ԫ', ' ʵʵ', ' 򳵣ʵʵ', ' +ո', ' ȫ', ' һ', ' Ůƻ', ' Ӽƻ', ' ', ' ', ' 14н ', ' Աѧ', ' 㻤', '', ' ', ' С', ' ڳҵ', ' Ӧ', ' С', ' ֧ҵ', ' ѽ', ' Ǯ', 'ȫڽ', ' 114н ', ' ', 'ס', ' ϱ', ' ҽƱ', ' ʧҵ', ' ˱', ' н', ' ', ' ', ' ҹಹ ', 'ݶ', ' Ѱ೵ ', ' ס޲ ', ' 500ǿʵϰ ', ' һһ ', ' ҵ ', ' չǰ ', '', 'ƽ̨', ' ְ', ' 鲻', ' '] +chart.21.2 = [6412, 3306, 3515, 2596, 383, 4464, 4262, 3799, 2463, 1348, 185, 184, 57, 80, 4260, 1880, 169, 58, 9, 9, 21, 9, 9, 10, 144, 136, 66, 58, 139, 45, 220, 78, 142, 68, 137, 59, 103, 32, 100, 173, 8, 25, 40, 38, 2, 17, 4, 5210, 4173, 2731, 663, 615, 2374, 657, 2471, 21, 13, 10, 2584, 612, 3, 1, 108, 1, 273, 1070, 273, 273, 273, 277, 455, 455, 2260, 2194, 70, 112, 112, 112, 112, 112, 87, 87, 87, 87, 87, 87, 87, 15, 6, 1, 42, 1, 18, 18, 108, 108, 104, 19, 41, 20, 2, 4, 2, 6, 66, 13, 4, 11, 30, 30, 30, 21, 2, 2, 2, 2, 2, 2, 10, 2, 5, 7, 2, 2, 4, 2, 1, 4, 1, 1, 5, 1, 102, 886, 3, 3, 1, 1, 1, 1, 1, 2, 5, 1, 6, 1, 5, 7, 8, 4, 7, 5, 6, 5, 2, 2, 1, 2, 1, 2, 1, 1, 1, 3, 3, 1, 1, 1, 1, 1, 1, 1, 5, 6, 1, 417, 417, 417, 2, 1, 7, 20, 5, 5, 5, 358, 5, 1, 1, 1, 4, 4, 6, 6, 1, 4, 10, 1, 1, 1, 797, 797, 797, 797, 797, 1, 2, 4, 2, 2, 5, 1, 3, 3, 1, 1, 3, 1, 1, 1, 1, 1, 3, 1, 1, 1, 2, 1, 1, 4, 4, 2, 1, 1, 1, 5, 4, 209, 209, 209, 3, 8, 5, 27, 2, 241, 241, 241, 241, 241, 241, 882, 882, 882, 882, 882, 34, 34, 34, 7, 7, 7, 1, 1, 1, 1, 1, 725, 1, 1, 25, 3, 4, 1, 353, 5, 1, 2, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 277, 277, 277, 277, 3, 40, 40, 18, 18, 18, 18, 18, 18, 18, 18, 18, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1] + + diff --git "a/5\343\200\201Python\346\213\233\350\201\230\345\262\227\344\275\215\344\277\241\346\201\257\350\201\232\345\220\210\347\263\273\347\273\237\357\274\210\346\213\245\346\234\211\347\210\254\350\231\253\347\210\254\345\217\226\343\200\201\346\225\260\346\215\256\345\210\206\346\236\220\343\200\201\345\217\257\350\247\206\345\214\226\343\200\201\344\272\222\345\212\250\347\255\211\345\212\237\350\203\275\357\274\211/WorkAggregation-master/conf/my.ini" "b/5\343\200\201Python\346\213\233\350\201\230\345\262\227\344\275\215\344\277\241\346\201\257\350\201\232\345\220\210\347\263\273\347\273\237\357\274\210\346\213\245\346\234\211\347\210\254\350\231\253\347\210\254\345\217\226\343\200\201\346\225\260\346\215\256\345\210\206\346\236\220\343\200\201\345\217\257\350\247\206\345\214\226\343\200\201\344\272\222\345\212\250\347\255\211\345\212\237\350\203\275\357\274\211/WorkAggregation-master/conf/my.ini" new file mode 100644 index 0000000..37dfe54 --- /dev/null +++ "b/5\343\200\201Python\346\213\233\350\201\230\345\262\227\344\275\215\344\277\241\346\201\257\350\201\232\345\220\210\347\263\273\347\273\237\357\274\210\346\213\245\346\234\211\347\210\254\350\231\253\347\210\254\345\217\226\343\200\201\346\225\260\346\215\256\345\210\206\346\236\220\343\200\201\345\217\257\350\247\206\345\214\226\343\200\201\344\272\222\345\212\250\347\255\211\345\212\237\350\203\275\357\274\211/WorkAggregation-master/conf/my.ini" @@ -0,0 +1,20 @@ +[mysqld] +#请直接替换原配置文件 + +log-bin = off +port = 3306 +# 请设置mysql的安装目录 如 basedir=E:\Mysql +basedir = +# 请设置mysql数据库的数据的存放目录 +datadir = + +character-set-server = utf8 +default-storage-engine = INNODB +default_authentication_plugin = mysql_native_password +innodb_flush_log_at_trx_commit = 0 +secure_file_priv = '' +[mysql] +default-character-set = utf8 +[client] +port = 3306 +default-character-set = utf8 diff --git "a/5\343\200\201Python\346\213\233\350\201\230\345\262\227\344\275\215\344\277\241\346\201\257\350\201\232\345\220\210\347\263\273\347\273\237\357\274\210\346\213\245\346\234\211\347\210\254\350\231\253\347\210\254\345\217\226\343\200\201\346\225\260\346\215\256\345\210\206\346\236\220\343\200\201\345\217\257\350\247\206\345\214\226\343\200\201\344\272\222\345\212\250\347\255\211\345\212\237\350\203\275\357\274\211/WorkAggregation-master/conf/\344\270\200\344\270\207.ini" "b/5\343\200\201Python\346\213\233\350\201\230\345\262\227\344\275\215\344\277\241\346\201\257\350\201\232\345\220\210\347\263\273\347\273\237\357\274\210\346\213\245\346\234\211\347\210\254\350\231\253\347\210\254\345\217\226\343\200\201\346\225\260\346\215\256\345\210\206\346\236\220\343\200\201\345\217\257\350\247\206\345\214\226\343\200\201\344\272\222\345\212\250\347\255\211\345\212\237\350\203\275\357\274\211/WorkAggregation-master/conf/\344\270\200\344\270\207.ini" new file mode 100644 index 0000000..b1f2230 --- /dev/null +++ "b/5\343\200\201Python\346\213\233\350\201\230\345\262\227\344\275\215\344\277\241\346\201\257\350\201\232\345\220\210\347\263\273\347\273\237\357\274\210\346\213\245\346\234\211\347\210\254\350\231\253\347\210\254\345\217\226\343\200\201\346\225\260\346\215\256\345\210\206\346\236\220\343\200\201\345\217\257\350\247\206\345\214\226\343\200\201\344\272\222\345\212\250\347\255\211\345\212\237\350\203\275\357\274\211/WorkAggregation-master/conf/\344\270\200\344\270\207.ini" @@ -0,0 +1,54 @@ +[chart] +chart.1.1 = [[20.0, 7000.0, 9000.0, 12500.0, 250000.0], [2500.0, 9000.0, 12500.0, 18000.0, 65000.0]] +chart.2.1 = ['', '/', '(ϵͳݷά)', 'ͨ/Ӫֵ', 'ͨ//豸', '/Ͷ/֤ȯ', 'רҵ(ѯԴƻ)', 'Ӽ/뵼/ɵ·', '/ѵ/ԺУ', 'Ӳ'] +chart.2.2 = [24498, 13324, 8588, 5505, 4017, 3026, 1773, 1075, 1057, 1049] +chart.3.1 = {''} +chart.3.2 = ['ʦ', 'Javaʦ', '繤ʦ', '`ھ//ʦ`', 'Webǰ˹ʦ', '`.NETʦ`', '`C++ʦ`', 'Ӳʦ', '`ά/άʦ`', 'PHPʦ'] +chart.3.3 = [['', 'ʦ', 2248], ['', 'Javaʦ', 2175], ['', '繤ʦ', 1560], ['', '`ھ//ʦ`', 916], ['', 'Webǰ˹ʦ', 898], ['', '`.NETʦ`', 450], ['', '`C++ʦ`', 436], ['', 'Ӳʦ', 432], ['', '`ά/άʦ`', 324], ['', 'PHPʦ', 310]] +chart.4.1 = [''] +chart.4.2 = [11254.05] +chart.5.1 = ['Ϻ', '', '', '', '', 'Ͼ', '人', 'ɶ', '֣', 'Ϸ'] +chart.5.2 = [10838, 7037, 4126, 4109, 3171, 2186, 2179, 1860, 1186, 989] +chart.6.1 = ['', 'ר', 'ר', '', '˶ʿ'] +chart.6.2 = ['0', '1', '2', '3', '6', '8', '10'] +chart.6.3 = [['', '0', 10539.4], ['', '1', 8027.37], ['', '2', 9570.29], ['', '3', 12988.75], ['', '6', 23356.56], ['', '8', 37500.0], ['', '10', 25625.0], ['ר', '0', 5642.78], ['ר', '1', 6088.33], ['ר', '2', 7085.53], ['ר', '3', 6730.94], ['ר', '6', 22500.0], ['ר', '10', 5250.0], ['ר', '0', 8043.55], ['ר', '1', 8319.71], ['ר', '2', 8887.44], ['ר', '3', 11878.77], ['ר', '6', 16390.68], ['ר', '8', 22583.33], ['ר', '10', 25864.62], ['', '0', 10806.71], ['', '1', 9808.96], ['', '2', 11976.57], ['', '3', 15207.95], ['', '6', 20716.05], ['', '8', 27401.48], ['', '10', 25532.08], ['˶ʿ', '0', 16625.67], ['˶ʿ', '1', 16443.0], ['˶ʿ', '2', 16822.77], ['˶ʿ', '3', 17865.59], ['˶ʿ', '6', 8775.22], ['˶ʿ', '8', 43333.33], ['˶ʿ', '10', 18000.0]] +chart.7.1 = ['', 'ר', 'м', 'м', 'ʿ', 'ר', '', '˶ʿ', ''] +chart.7.2 = [10669.76, 6164.3, 6021.91, 14581.58, 19897.31, 9412.56, 13252.33, 12699.62, 6601.71] +chart.7.3 = [4534, 443, 57, 190, 13, 7016, 8737, 1009, 331] +chart.8.1 = ['ൺ', 'Ϋ', '', '', '', '̨', 'ׯ', 'Ӫ', 'Ͳ', '̩'] +chart.8.2 = [6750.0, 6294.28, 6033.83, 6017.07, 5838.98, 5745.74, 5668.6, 5609.23, 5553.47, 5494.58] +chart.9.1 = ['Ӫ', '', '', '', '', 'ׯ', '̩', '', '', 'Ͳ', '', 'Ϋ', '̨', 'ij', '', '', 'ൺ'] +chart.9.2 = [331, 91, 60, 34, 206, 44, 333, 661, 316, 173, 47, 378, 362, 82, 67, 29, 145] +chart.10.1 = ['', 'ר', 'ר', '', '˶ʿ'] +chart.10.2 = [4342, 431, 6742, 8282, 844] +chart.10.3 = ['', 'ר', 'ר', '', '˶ʿ'] +chart.10.4 = [266, 12, 288, 694, 198] +chart.10.5 = ['0', '1', '10', '2', '3', '6', '8'] +chart.10.6 = [7995, 3817, 52, 3664, 3924, 1694, 78] +chart.10.7 = ['0', '1', '2', '3', '6', '8'] +chart.10.8 = [768, 168, 206, 272, 59, 3] +chart.11.1 = ['`/зܼ`', '`/о/Ŀ`', 'Goʦ', 'PHPʦ', 'Javascriptʦ', 'Javaʦ', 'ʦ', 'Nodejsʦ', '`C#ʦ`', '˹ʦ'] +chart.11.2 = [3.52, 3.26, 2.87, 2.57, 2.43, 2.36, 2.33, 2.33, 2.31, 2.18] +chart.12.1 = [['0', 8563, 10227.94], ['1', 3956, 8622.07], ['10', 47, 23883.0], ['2', 3836, 10477.94], ['3', 4115, 14030.61], ['6', 1737, 16378.19], ['8', 76, 27782.87]] +chart.13.1 = ['XXXXʦ', '`/зܼ`', 'ݿʦ', '`/о/Ŀ`', 'ʦ', 'ݿ⹤ʦ', 'ʦ', 'ģʦ', 'Ӳʦ', '繤ʦ', '˹ܿʦ', '˹ʦ', 'ѧϰʦ', '`ھ//ʦ`', 'ݹʦ', 'Webǰ˹ʦ', '`ά/άʦ`', 'Javaʦ', '`C++ʦ`', 'PHPʦ', '`C#ʦ`', '`.NETʦ`', 'Hadoopʦ', 'Pythonʦ', 'Rubyʦ', 'Nodejsʦ', 'Goʦ', 'Javascriptʦ', 'Delphiʦ', 'jspʦ', 'sqlʦ', 'Linuxʦ', 'Androidʦ', 'IOSʦ', '`GIS/зʦ`', 'BIʦ'] +chart.13.2 = [12333.33, 23207.15, 16538.14, 20032.61, 14437.5, 12535.37, 12065.11, 14166.67, 10651.88, 9616.09, 9114.58, 16055.56, 17640.62, 12671.26, 8386.36, 14015.29, 6958.7, 15126.29, 13940.3, 17367.15, 12362.55, 13125.74, 15416.67, 16481.97, 9000.0, 12666.67, 23349.26, 14309.43, 12227.27, 7380.86, 13785.71, 13040.88, 13700.61, 13394.37, 15212.5, 17300.0] +chart.13.3 = [51.0, 210.0, 271.0, 23.0, 64.0, 139.0, 2205.0, 12.0, 424.0, 1543.0, 48.0, 45.0, 32.0, 905.0, 11.0, 894.0, 318.0, 2144.0, 433.0, 308.0, 271.0, 450.0, 6.0, 74.0, 1.0, 3.0, 68.0, 7.0, 11.0, 7.0, 14.0, 159.0, 302.0, 157.0, 40.0, 60.0] +chart.14.1 = ['㷨', '', 'ȫջ', '', '', '`\\ѧϰ`', 'ȫ', 'ǰ', '', ''] +chart.14.2 = [21428.76, 21289.47, 16799.13, 16055.56, 14566.67, 14407.61, 14089.18, 14015.29, 12619.81, 12566.27] +chart.15.1 = ['Goʦ', '`/зܼ`', '`/о/Ŀ`', 'ѧϰʦ', 'PHPʦ', 'BIʦ', 'ݿʦ', 'Pythonʦ', '˹ʦ', 'Hadoopʦ'] +chart.15.2 = [23349.26, 23207.15, 20032.61, 17640.62, 17367.15, 17300.0, 16538.14, 16481.97, 16055.56, 15416.67] +chart.16.1 = ['Ϻ', '', '', '', '', '人', 'ɶ', 'Ͼ', '', ''] +chart.16.2 = [219221, 186149, 164110, 126386, 79169, 74607, 54982, 52173, 35180, 34858] +chart.17.1 = ['Goʦ', 'Hadoopʦ', 'Rubyʦ', 'sqlʦ', 'BIʦ', 'Nodejsʦ', 'Pythonʦ', 'Javaʦ', 'Javascriptʦ', 'C++ʦ'] +chart.17.2 = [16032.86, 16004.27, 15471.69, 15448.45, 14208.11, 14130.15, 13926.78, 13178.04, 13174.3, 13033.55] +chart.18.1 = ['', '㷨', '', 'Ӿ', 'ѧϰ', '', '˹', 'Ȼ'] +chart.18.2 = [0.63, 0.23, 0.04, 0.05, 0.06, 0.01, 0.03, 0.01] +chart.19.1 = ['Ϊ', 'Ѻ', 'εγ', 'ɽ', '', '', '׹', 'Ͱ', '΢', '', 'й', 'ٶ', '滢', 'Ӣض', '', 'ֽ', 'йƶ', 'йͨ', '', '˳', '', 'ѹ', 'Ͻ', 'Ѷ', '', 'С', 'IBM', ''] +chart.19.2 = ['м', 'רУм', '', 'ר', '', '˶ʿ', 'ʿ', ''] +chart.19.3 = [[2, 8, 11, 84, 1046, 40, 10, 205], [0, 0, 3, 19, 486, 15, 0, 30], [0, 0, 2, 21, 828, 27, 0, 69], [2, 7, 5, 62, 481, 12, 2, 97], [0, 0, 0, 27, 462, 21, 0, 8], [0, 1, 2, 109, 723, 43, 4, 64], [0, 0, 1, 24, 303, 9, 0, 33], [0, 4, 1, 68, 1680, 47, 1, 263], [0, 0, 0, 1, 71, 10, 1, 5], [0, 0, 0, 4, 879, 54, 1, 15], [0, 23, 16, 237, 640, 33, 4, 101], [0, 5, 4, 118, 950, 34, 0, 58], [1, 0, 0, 32, 544, 11, 1, 52], [9, 9, 11, 83, 111, 8, 0, 80], [1, 0, 1, 77, 415, 7, 0, 189], [0, 1, 0, 76, 1233, 15, 0, 23], [0, 0, 2, 12, 133, 12, 0, 8], [0, 22, 6, 86, 359, 9, 0, 30], [5, 1, 0, 61, 115, 0, 0, 59], [0, 0, 3, 57, 137, 5, 0, 31], [0, 2, 4, 234, 636, 51, 3, 61], [0, 0, 0, 2, 327, 117, 2, 71], [0, 0, 0, 10, 1404, 77, 4, 172], [0, 1, 0, 62, 1871, 104, 6, 143], [1, 0, 1, 140, 1444, 90, 2, 155], [0, 2, 1, 67, 517, 39, 0, 75], [0, 2, 0, 11, 54, 2, 0, 10], [2, 5, 9, 177, 916, 59, 11, 119]] +chart.20.1 = ['Ϊ', 'Ѻ', 'εγ', 'ɽ', '', '', '׹', 'Ͱ', '΢', '', 'й', 'ٶ', '滢', 'Ӣض', '', 'ֽ', 'йƶ', 'йͨ', '', '˳', '', 'ѹ', 'Ͻ', 'Ѷ', '', 'С', 'IBM', ''] +chart.20.2 = [27123.81, 21423.06, 28307.65, 19156.99, 21399.26, 28301.58, 39697.75, 28767.47, 33386.88, 22522.74, 13168.67, 20488.55, 24519.55, 9852.34, 16456.22, 26341.62, 17827.26, 13212.58, 16796.35, 10042.76, 15949.12, 29250.64, 31866.36, 25395.31, 18624.52, 21181.19, 19347.22, 21365.78] +chart.20.3 = [3.47, 2.95, 3.86, 2.8, 3.03, 4.09, 4.71, 4.11, 3.03, 3.58, 2.38, 2.3, 3.19, 1.27, 2.15, 2.48, 2.98, 2.44, 2.52, 2.32, 3.17, 3.2, 3.44, 3.33, 2.68, 2.81, 3.73, 3.66] +chart.21.1 = ['һ', ' Ѱ೵', ' ', ' ˧', ' շֺ', ' Թ', ' Ч', ' Ů', ' ƱȨ', ' ͨ', ' ס', ' ', ' ˫', ' Ա', ' н', ' ˫н', ' ', ' ', 'רҵѵ', ' չռ', ' ҵ', ' ʻƽ̨', ' ೵', ' ', ' רҵѵ ', ' һ ', ' ͨ ', ' Ա ', ' ', ' Թ ', ' Ч ', ' ͨѶ ', ' ս ', ' ҽƱ ', ' һ ', ' ĩ˫ ', ' ո ', ' ݶ ', ' н ', ' ', ' ס ', ' Ӱಹ ', ' ² ', ' ȫڽ ', ' ', ' ס ', ' ', ' λ', ' ѵ', ' 淶', 'ר', ' һ', ' ƽ', ' ͨѶ', ' 쵼', ' ', ' ƱȨ ', ' 乫 ', ' ', 'н', 'ס', '500ǿ', ' ĩ˫', ' ְ', '15', ' һ', ' ѵ', ' Թʱ', ' ŶӷΧ', ' Ŀ', ' Ĭ', ' Ŷ', ' Ͳ', ' ', 'Ѱ೵', ' һ', ' ', ' ˧', ' ԡ', ' ٤', 'һ﹤Ȧ', ' רҵţ', ' ʻƷ', ' λýƷ', ' û', ' Ůǰ̨', ' ս', ' Ͳ', 'רҵѵ λ ո н Ա', ' ', ' Ѱ೵ ', ' 칫 ', '8Сʱ', ' Ա', ' ƽ̨', ' Ѳ', 'ͨ', 'Ͳ', ' ҽ', ' ӰͲ', ' Ƚ ', ' ڼո ', ' ȫн ', ' ', ' ȫڽ', ' Ӱಹ', ' Ա', ' ո', 'ȷֺ', ' Ƚ', ' ÿ2μн', '', 'ȫ֮·', ' ҵǰ', ' ŶǢ', ' ƽ̨Դ', ' ', ' ', ' ͸ ', ' 籣 ', ' ¶Ƚ ', ' party ', ' ', ' ¶Ƚ ', ' ݶ ', ' ʳ ', ' 5A칫 ', ' ѽ ', ' 12 ', ' Ѳ ', ' һ ', ' ڹ ', 'Աѵ', ' ƽ̨', ' ׸', ' ߸˧', ' ṩƽ ', ' ', ' ', ' ', ' н/˫н/շֺ', ' ṩס', ' ͨ ', ' Ͻ ', 'λ', 'ն', ' ', ' ͨ ', ' ׼ʱ ', ' Աڲ ', ' ', ' ռ ', ' յ ', ' ', ' ɸ ', ' ͽ ', ' ýռ ', ' Բ', ' ', ' ', 'Ա', ' شȦ', ' Ȥ', ' ս', ' ռ', ' 쵼ദ', ' ', ' ȶ ', ' ', ' ', ' ѧϰ', ' ', ' ҵ ', ' ˫н ', ' ĩ ', ' ', ' ʦĻ', ' ', ' ', ' ⷿ', ' Ƚ', ' ûһ', '14.6н', ' Ӱಹ', ' ', ' ٳɳ', ' Ͳ+ͨѶ', '', ' ƶ֧', ' ֧', ' ƹֵ', ' нѵ ', ' ռ ', ' ո ', ' ', ' ˮʳ', '', ' ṩס ', ' ͨѶ', ' Թ ', 'mac칫', ' ˫ߵ', ' ', ' ͽⷿ', ' ɳռ', ' źн ', ' нݼ ', ' ƽ ', ' ְҵţ ', ' û ', ' Ͳ ', ' һ ', ' ŶӷΧ ', ' ⷿ ', ' ', ' ', ' Աѵ', ' 4400', ' ס', ' ߴϣ', ' ', ' 䲹 ', ' ʳ', 'ס:ṩ', ' ְһ', ' 乤', ' нѵ', ' ڼ15', ' ṩͻԴ', ' ṩס ', 'ӹ˾', ' ', ' ҽƱ ', ' רҵѵ ', ' ', 'һ', ' ۼ', ' ź', ' ռ', ' Χ', ' ', ' ', '', ' ս', ' Ȩֺ ', '', ' AI', ' û', ' ͼΧ', ' ӢŶ', ' ', ' ڲתڻ', ' Ӱû', ' ɳռ', ' ʿ', ' ȼ', ' Ŷ', ' ջԾ', ' Ѷƽ̨', 'ѽ', ' ʩ', ' Ӱ', ' Ŷ ', ' Ѷƽ̨ ', 'Ž', ' ѵ', ' ڼո', ' Ʒû', ' ѽ', ' ְһ', ' Ůֽ', ' Ӧʳ', ' ʹŶ', ' ס', 'Ϊն', ' ҽ ', 'Ͳ', ' ', ' ˫ ', '61', ' ', ' ڼ3', 'ݶ', ' ս', ' ', ' ҹಹ20-30Ԫ', ' ʵʵ', ' 򳵣ʵʵ', ' +ո', ' ȫ', ' һ', ' Ůƻ', ' Ӽƻ', ' ', ' ', ' 14н ', ' Աѧ', ' 㻤', '', ' ', ' С', ' ڳҵ', ' Ӧ', ' С', ' ֧ҵ', ' ѽ', ' Ǯ', 'ȫڽ', ' 114н ', ' ', 'ס', ' ϱ', ' ҽƱ', ' ʧҵ', ' ˱', ' н', ' ', ' ', ' ҹಹ ', 'ݶ', ' Ѱ೵ ', ' ס޲ ', ' 500ǿʵϰ ', ' һһ ', ' ҵ ', ' չǰ ', '', 'ƽ̨', ' ְ', ' 鲻', ' '] +chart.21.2 = [6412, 3306, 3515, 2596, 383, 4464, 4262, 3799, 2463, 1348, 185, 184, 57, 80, 4260, 1880, 169, 58, 9, 9, 21, 9, 9, 10, 144, 136, 66, 58, 139, 45, 220, 78, 142, 68, 137, 59, 103, 32, 100, 173, 8, 25, 40, 38, 2, 17, 4, 5210, 4173, 2731, 663, 615, 2374, 657, 2471, 21, 13, 10, 2584, 612, 3, 1, 108, 1, 273, 1070, 273, 273, 273, 277, 455, 455, 2260, 2194, 70, 112, 112, 112, 112, 112, 87, 87, 87, 87, 87, 87, 87, 15, 6, 1, 42, 1, 18, 18, 108, 108, 104, 19, 41, 20, 2, 4, 2, 6, 66, 13, 4, 11, 30, 30, 30, 21, 2, 2, 2, 2, 2, 2, 10, 2, 5, 7, 2, 2, 4, 2, 1, 4, 1, 1, 5, 1, 102, 886, 3, 3, 1, 1, 1, 1, 1, 2, 5, 1, 6, 1, 5, 7, 8, 4, 7, 5, 6, 5, 2, 2, 1, 2, 1, 2, 1, 1, 1, 3, 3, 1, 1, 1, 1, 1, 1, 1, 5, 6, 1, 417, 417, 417, 2, 1, 7, 20, 5, 5, 5, 358, 5, 1, 1, 1, 4, 4, 6, 6, 1, 4, 10, 1, 1, 1, 797, 797, 797, 797, 797, 1, 2, 4, 2, 2, 5, 1, 3, 3, 1, 1, 3, 1, 1, 1, 1, 1, 3, 1, 1, 1, 2, 1, 1, 4, 4, 2, 1, 1, 1, 5, 4, 209, 209, 209, 3, 8, 5, 27, 2, 241, 241, 241, 241, 241, 241, 882, 882, 882, 882, 882, 34, 34, 34, 7, 7, 7, 1, 1, 1, 1, 1, 725, 1, 1, 25, 3, 4, 1, 353, 5, 1, 2, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 277, 277, 277, 277, 3, 40, 40, 18, 18, 18, 18, 18, 18, 18, 18, 18, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1] + diff --git "a/5\343\200\201Python\346\213\233\350\201\230\345\262\227\344\275\215\344\277\241\346\201\257\350\201\232\345\220\210\347\263\273\347\273\237\357\274\210\346\213\245\346\234\211\347\210\254\350\231\253\347\210\254\345\217\226\343\200\201\346\225\260\346\215\256\345\210\206\346\236\220\343\200\201\345\217\257\350\247\206\345\214\226\343\200\201\344\272\222\345\212\250\347\255\211\345\212\237\350\203\275\357\274\211/WorkAggregation-master/data/test.csv" "b/5\343\200\201Python\346\213\233\350\201\230\345\262\227\344\275\215\344\277\241\346\201\257\350\201\232\345\220\210\347\263\273\347\273\237\357\274\210\346\213\245\346\234\211\347\210\254\350\231\253\347\210\254\345\217\226\343\200\201\346\225\260\346\215\256\345\210\206\346\236\220\343\200\201\345\217\257\350\247\206\345\214\226\343\200\201\344\272\222\345\212\250\347\255\211\345\212\237\350\203\275\357\274\211/WorkAggregation-master/data/test.csv" new file mode 100644 index 0000000..a49c37f --- /dev/null +++ "b/5\343\200\201Python\346\213\233\350\201\230\345\262\227\344\275\215\344\277\241\346\201\257\350\201\232\345\220\210\347\263\273\347\273\237\357\274\210\346\213\245\346\234\211\347\210\254\350\231\253\347\210\254\345\217\226\343\200\201\346\225\260\346\215\256\345\210\206\346\236\220\343\200\201\345\217\257\350\247\206\345\214\226\343\200\201\344\272\222\345\212\250\347\255\211\345\212\237\350\203\275\357\274\211/WorkAggregation-master/data/test.csv" @@ -0,0 +1,501 @@ +provider,keyword,title,place,salary,experience,education,companytype,industry,description +,软件,高薪直招跟船出海叉车工月过万五险一金,北京,8000-15000,不限,不限,民营,普工|技工|生产|机械, +,软件,直招跟船保安高薪包吃包住五险一金,北京,7000-15000,不限,不限,民营,家政|保安|物业|淘宝, +华北人才网,软件,游泳馆预售高薪招聘销售,北京,8000-16000,不限,不限,民营,咨询/法律/教育/科研, +鄂州,软件,海量附近招聘创业的你,北京,8000-16000,不限,不限,民营,服务业, +吉林,软件,诚聘优秀店长,北京,8000-16000,不限,不限,民营,销售/客服/技术支持, +华北人才网,软件,7K以上急聘安全员,北京,7000-8500,不限,大专,民营,建筑/房地产, +呼伦贝尔,软件,高薪招聘会销专员,北京,5000-10000,不限,不限,民营,销售/客服/技术支持, +,软件,高薪直招随船出海维修电工包吃住有五险一金,北京,8000-15000,不限,不限,民营,普工|技工|生产|机械, +,软件,直招跟船普工搬运工/月薪一万包吃住,北京,7000-15000,不限,不限,民营,普工|技工|生产|机械, +,软件,高薪直招月薪一万跟船出海电焊工,北京,8000-15000,不限,不限,民营,普工|技工|生产|机械, +吉林,软件,直招送餐员配车管住,北京,6000-12000,不限,不限,民营,服务业, +馒头招聘,软件,烧烤师,北京,5000-10000,不限,小学,民营,餐饮, +电力人才网,软件,在线客服线上文员日300招聘,北京,9000-12000,不限,高中,民营,计算机/互联网, +百姓网,软件,呼和浩特高铁乘务员餐吧员安检员招聘,北京,8000以上,不限,不限,民营,行政/后勤, +百姓网,软件,呼和浩特高端职位高铁乘务员招聘,北京,8000以上,不限,不限,民营,行政/后勤, +康强医疗人才网,软件,廊坊经营院长,北京,8000-15000,不限,大专,民营/其它,医疗, +百姓网,软件,呼和浩特相伴复兴号高铁乘务员招聘,北京,8000以上,不限,不限,民营,行政/后勤, +华北人才网,软件,招聘房产经纪人,北京,8000-16000,不限,不限,民营,服务业, +百姓网,软件,呼和浩特高铁乘务员招聘好岗位招聘,北京,8000以上,不限,不限,民营,行政/后勤, +医药人才网,软件,实习生招聘一单一结日300.,北京,9000-12000,不限,高中,民营,计算机/互联网, +前程无忧网,软件,软件工程师,北京,0.9-1.8万/月,2年经验,本科,民营公司,,岗位职责:1、从事仪器应用软件的开发工作;2、负责公司相关模块或产品软件的升级与维护工作;3、负责公司其他研发部门所需内部软件的开发工作;4、协助对公司其他部门提供软件使用的技术咨询。任职要求:1、全日制本科及以上学历,信息技术、电子、数学、计算机等相关专业,具有一年以上C/C++软件开发工作经验;2、熟悉Windows或Linux平台下应用软件开发,有多线程编程经验;3、精通C/C++语言,熟悉Qt或MFC的使用,熟练使用VS或Qt Creator进行软件开发,动态库开发,有界面开发经验;4、具有较强的逻辑分析能力和学习能力,责任心强,能独立负责相关业务;5、计算机基础知识扎实,熟悉常用数据结构、算法;6、有过相机开发经验,熟悉图像处理基本算法优先考虑。 职能类别:C/C++开发工程师 微信分享 +前程无忧网,软件,高级软件测工程师,北京,1.5-2万/月,3-4年经验,本科,民营公司,,技能要求:黑盒测试,性能测试,功能测试,自动化测试岗位职责:1、 参与软件需求分析,负责测试计划和测试方案的制定,评估项目风险;2、 负责编写技术文档,完整记录测试结果,撰写测试报告,编写自动测试脚本;3、 负责测试环境的搭建和维护;4、 负责单元测试、UI测试、功能测试、性能测试、系统测试、验收测试;5、 对测试中发现的问题进行详细分析和准确定位,与开发人员讨论缺陷解决方案;6、 提出改进的建议,评估方案合理性,统计分析测试结果,并提出反馈意见;7、 负责版本发布。任职要求:1、 通信、电子工程、计算机及其相关专业本科及以上学历;2、 4年以上软件测试工作经验,熟悉PC应用软件、C/S模式测试,有自动化测试经验;3、熟悉单元测试、UI测试、集成测试、功能测试、系统测试;熟悉验收测试的技术方法,工作流程;4、熟练使用测试用例管理工具、缺陷管理工具、自动化测试工具;5、 熟悉C/C++/C#/python语言中的一种或多种,能独立开发测试用例,熟练进行自动化测试脚本编写;6、 熟悉TCP/IP网络协议原理,熟悉数据库的基本知识;7、 熟悉Window测试环境配置及管理流程;8、 有测试管理岗位经验优先。 职能类别:高级软件工程师 微信分享 +前程无忧网,软件,测试工程师(软件&硬件),北京,4-7千/月,在校生/应届生,本科,民营公司,,岗位职责:1.负责linux操作系统产品的软件需求沟通,输出需求规格说明书;2.负责Linux操作系统产品的测试计划、测试方案等技术文档的编写;3.负责linux操作系统产品软硬件测试,并对测试中发现的问题进行分析和准确定位;4.负责客户使用说明书的编写; 5.负责客户现场应用过程中操作指导及问题跟踪解决;6.负责对关联部门提供相应的技术支持和培训。任职资格:1.本科及以上学历,计算机、自动化、通讯电子等相关专业;2.具有良好的沟通能力,优秀的学习、创新、分析与解决问题的能力;3.做事耐心细致,具有较强的团队协作意识与软件质量意识。福利待遇:1.底薪+全勤奖+午餐补助+通讯补助+季度奖金+年终奖2.节日慰问礼金+年度体检+年度员工旅游+丰富多彩的员工活动party3.根据实际需要可提供员工宿舍培养体系:新员工入职培训+入职导师指导+专业技能培训+公司级外派培训发展空间:1.纵向:中级测试工程师、高级测试工程师、测试主管2.横向:售前技术支持工程师、项目管理等 职能类别:软件测试工程师硬件测试工程师 关键字:嵌入式软件软件测试硬件测试 微信分享 +前程无忧网,软件,软件开发工程师(java)-综,北京,1.5-2.5万/月,5-7年经验,本科,国企,,"1、 完成软件系统代码的实现,编写代码注释和开发文档;2、 辅助进行系统的功能定义,程序设计;3、 根据设计文档或需求说明,能够独立完成功能模块的设计以及代码编写,调试,测试和维护;4、 分析并解决软件开发过程中的问题;5、 协助测试工程师制定测试计划,定位发现的问题;6、 配合项目经理完成相关任务目标。1、本科学历及以上,计算机相关专业5年以上工作经验,能熟练阅读英文技术文档;2、5年以上J2ee开发经验;熟悉软件工作流程;3、精通SpringMVC,Hibernate,Spring,Spring boot,Mybatis等开源框架;4、熟悉Linux操作系统,熟悉Shell脚本编程及常用Linux操作命令;5、具有Oracle和Mysql使用与开发经验;6、熟悉JavaScript脚本语言,有AJAX、JQuery、Vue、LayUI等框架的开发经验;7、熟悉Memcache、Redis、MongoDB、MQ、dubbo等第三方组件;8、熟悉Tomcat/Weblogic等常见应用服务器;9、熟悉系统功能日志记录组件;10、良好的沟通技巧、团队合作精神;对技术有强烈的兴趣,喜欢钻研;11、有webservice开发经验者优先;12、有实现单点登录开发经验者优先;13、有需求经验及原型工具使用如axure经验者优先;14、有信息化项目经验者优先;15、有大型微服务项目经验者优先。16、熟悉PHP者优先; 职能类别:软件工程师 关键字:软件开发 微信分享" +前程无忧网,软件,应用软件开发工程师,北京,1-1.5万/月,在校生/应届生,硕士,上市公司,,"岗位职责:1. 负责车联网终端侧各类应用软件开发及算法实现;2. 负责车联网终端侧数据交互平台层软件开发(与各路侧传感器对接);3. 负责车联网终端侧性能测试及其他测试工具、辅助模拟类工具开发;4. 和算法及测试同事紧密配合,解决产品开发过程中遇到的各类问题,共同提升产品质量。任职资格:1. 电子、通信、计算机等相关专业;2. 熟练掌握C/C++语言,熟练掌握常用数据结构和算法;3. 熟悉Linux系统,对操作系统较深理解;熟悉网络编程、多线程编程;4. 有较好的面向对象软件设计思想;5. 具有强烈的求知欲,良好的责任心、具有良好的沟通和团队协作能力。 职能类别:软件工程师 微信分享" +前程无忧网,软件,嵌入式软件研发-平台及基础软硬件 (职位编号:硬件研发),北京,,硕士,,国企,,"工作内容1.负责电力系统及新能源领域集成化项目和综合能源项目的规划分析、可研分析、方案和系统架构设计、编码实现、用户支撑、现场技术支持等工作;2.根据新项目开发进度和任务分配,开发相应的软件模块;根据需要及时修改、完善软件;3.协助进行客户沟通、项目需求调研分析、编写需求分析报告;4.系统测试以及现场运行技术支撑工作。学历要求:硕士 职能类别:软件测试工程师 关键字:电工类 微信分享" +前程无忧网,软件,软件研发-一次设备状态监测与运维、电网安全稳定分析与控制 (职位编号:软件研发),北京,,硕士,,国企,,"工作内容1.负责软件需求分析,软件结构设计,软件开发2.研发技术文档编写等工作.3.负责科技项目申报、执行、验收等工作4.参与电力系统监测与分析等产品开发.学历要求:硕士 职能类别:软件工程师 关键字:电工类计算机类 微信分享" +前程无忧网,软件,JAVA软件开发工程师(北京),北京,,在校生/应届生,本科,国企,,岗位职责:1、按照产品经理的设计负责系统的设计、开发工作。2、负责相关技术文档编写工作。3、解决系统中的关键问题和技术难题。任职要求:1、具有较强的沟通表达能力和良好的职业素质。2、计算机相关专业本科以上学历。3、熟悉J2EE体系架构,熟练使用Spring等后端开发技术,熟悉MVC设计模式,掌握SpingMVC等相关技术。4、对JavaScript、jQuery、HTML5、XML、CSS、Bootstrap等WEB前端页面开发技术有一定了解更佳。5、熟练应用一种以上主流J2EE应用服务器的部署,如Apache、WebLogic、Tomcat等;熟练运用Linux的基本操作和维护;能使用SVN/Git等源码管理系统。6、了解openlayers、PostgreSQL优先。7、能按照软件工程要求完成相应工作,并编写相关的系统文档。8、善于从国际互联网获取信息、对开源软件熟悉、对技术有热情者优先。 职能类别:Java开发工程师 微信分享 +前程无忧网,软件,软件开发工程师(北京),北京,,本科,,外资(欧美),,你想通过创新技术解决业务挑战吗?你喜欢与团队一起研究尖端的、可扩展的服务技术吗?你愿意参与可以推动行业发展的核心项目吗?为了服务亚?逊的客户,我们正在寻找顶尖的技术人才进行创新。顾客至尚的理念使我们成为 全球最受欢迎的品牌之一,这一观念已成为我们公司DNA的一部分。我们的软件开发工程师(Software Development Engineer)擅?运用尖端技术来解决复杂的问题,影响着数以亿计的用户,并亲眼目睹其工作对世界产生的影响。作为SDE在亚?逊需要面对巨大的技术挑战,能否解决这些挑战将影响全球的数百万的买家,卖 家和产品。我们正在寻找对从头开始研发新产品,新功能,新服务充满热情的年轻人。公司的开 发周期迅速,通常以周计算,而不是年。多数软件开发工程师岗位设置在北京,少量岗位设置在上海。欢迎大家的申请!申请人应在2020年8月到2021年8月之间获得学士/硕士/博士学位。职位描述:与经验丰富的团队合作,构思,设计创新的产品和服务,将其推向市场。在大型分布式计算环境中设计和构建创新技术,并帮助引领行业的变革。规模化、快速地使用创新技术,在分布式系统上创建解决方案进行预测。构建可扩展,容错,低成本且易于管理的分布式存储、索引、查询系统。设计解决方案并进行编码,解决广泛的技术问题。在敏捷环境中工作,交付高质量的软件。任职要求:计算机科学,计算机工程或相关领域的本科/研究生/博士。熟悉Java,C / C++或Python等语言。具备计算机科学基础知识,例如面向对象设计,算法设计,数据结构和复杂性分析。加分项:有技术实习经历。具有分布式,多层系统,算法或关系数据库的经验。在数学方面的经验,例如线性规划或非线性优化。可以有效表述技术问题并提供解决方案。具备抽象思考的能力,善于解决复杂的问题。亚马逊致力于打造多元化和包容性的工作场所。亚马逊是一家机会均等的雇主,不因种族、国籍、性别、性别身份、性取向、残疾、年龄或其他受法律保护的身份而歧视。如有残疾人士需要口译员或任何现场支持,请通知我们的团队。 职能类别:软件工程师 微信分享 +前程无忧网,软件,JAVA软件开发工程师(北京) (职位编号:8),北京,,本科,,民营公司,,岗位职责:    从事金融行业软件产品开发工作。基本要求:    本科或硕士,计算机、软件、信息、通信、数学等相关理工类专业;    学习能力突出,基础扎实,有责任心,思维活跃,有较好的沟通能力和团队协作精神;    熟悉JAVA/数据库等一种或多种技术,热爱软件开发工作,愿意致力于金融IT领域研发。 职能类别:Java开发工程师软件工程师 关键字:金融IT外汇开发 微信分享 +前程无忧网,软件,应用软件开发工程师,北京,,在校生/应届生,硕士,国企,,职责范围:1.负责5G基站操作维护相关的功能设计、开发和测试工作2.负责自动化测试环境集成及脚本编写工作任职要求:1、通信、信息、电子工程、计算机专业,硕士及以上学历2、有良好的C语言知识,有C语言开发经验3、良好的英文阅读能力,能够参考阅读英文文档4、具备OM或平台软件开发经验者优先5、对待工作有热情,能够承受一定的工作压力6、具有良好的沟通能力 职能类别:软件工程师 微信分享 +前程无忧网,软件,软件研发实习生(Java)(北京),北京,4.5-6千/月,本科,,合资,,任职要求:1、计算机相关专业,本科以上学历,优质院校优先考虑;2、在校期间学习过较全面的计算机原理、数据结构、设计模式、计算机网络、数据库技术等软件工程知识;3、Java基础良好,熟练使用SSM框架,熟练使用SVN、GIT等版本管理工具、熟练使用Eclipse/IDEA等开发工具;4、熟练使用SpringBoot、SpringCloud、Maven等优先;5、在校期间参与过软件开发竞技比赛并取得较好成绩的优先;6、学习能力强,认真能吃苦,有良好的沟通表达能力。岗位职责:1、承接项目任务分配,根据任务具体要求,完成软件研发及运行维护等工作;2、负责相关文档类材料的编写、更新等工作; 3、负责产品及项目研发;4、负责产品上线实施部署运维工作。 职能类别:Java开发工程师 微信分享 +前程无忧网,软件,再保系统软件开发工程师,北京,,本科,,民营公司,,"全日制本科及以上学历,计算机相关专业毕业,英语良好;主要职责为熟悉再保产品代码,可以为客户提供驻场服务,解决客户的生产问题和新需求开发;需要熟悉Java/J2EE,熟悉Java开发工具的使用; 职能类别:软件工程师 微信分享" +前程无忧网,软件,通信软件工程师(北京) (职位编号:06),北京,,本科,,外资(欧美),,岗位职责:1. 负责5G/4G/3G/2G/WiFi/BT/GNSS/NBIoT/eMTC/TCPIP等通信软件的设计、开发、集成验证和维护;2. 5G NR/4G LTE 物理层软件/协议栈软件研发;3. 5G未来演进方向通信软件研发,包括但不限于车联网/NR Lite/毫米波等方向;4. 分析和解决消费电子、工业电子产品项目对应的通信软件问题。任职要求:1. 计算机/通信/信号处理/电子/软件工程/自动化/(但并不限于)等专业本科及以上学历;2..掌握C/C++/Python/汇编等一种或几种编程语言,熟悉嵌入式软件开发流程;3. 具有ARM、DSP开发经验,MATLAB编程经验,FPGA开发经验优先;4 了解3GPP 5G/4G相关的标准知识,从事过相关研究优先;5. 积极主动、充满热情、学习能力强、善于沟通、具有良好的团队协作能力。 职能类别:软件工程师 微信分享 +前程无忧网,软件,软件开发(北京),北京,,本科,,国企,,基本要求1、遵纪守法、诚实守信,具有良好的个人品质,无不良记录;2、具有较好的团队合作精神、语言沟通能力和学习能力;3、具有正常履行工作职责的身体条件,和健康良好的心理素质;4、全日制大学本科及以上学历,计算机、软件工程、电子工程、通讯工程、信息工程、自动化、网络与安全、物联网、大数据、人工智能、数学、统计、金融等相关专业;5、符合公司亲属回避的有关规定。岗位要求:1、热爱编程,熟悉操作系统、编译原理、数据结构等;2、熟悉Java、Python、C等常见语言之一;3、计算机技术、软件工程、电子工程、自动化、网络与安全等信息科技类专业。 职能类别:软件工程师 微信分享 +前程无忧网,软件,高级软件工程师,北京,1.5-2万/月,5-7年经验,本科,民营公司,,1、负责产品项目的嵌入式软件设计和程序编写工作; 2、负责公司产品嵌入式软件的升级、改进、完善和维护; 3、负责协调嵌入式软件开发同硬件设计小组和其他部门的协调工作; 4、完成上级领导安排的工作。任职要求:1、计算机、电力系统、电子、自动化等相关专业毕业,全日制本科或以上学历;3年以上嵌入式软件编程经验; 2、具有丰富的MSP430 嵌入式软件(低功耗架构)编程经验; 3、熟练掌握C/C++编程; 4、熟悉常用硬件总线,如I2C、SPI、UART、USB、Ethernet等,并有基于部分总线的软件编写经验; 5、熟悉电力101、104、TCP/IP或61850等相关协议标准,了解GPRS无线通信基本原理,并有实际开发经验; 6、具备一定的硬件调试能力,能综合利用各种软硬件工具(仿真器、示波器等)进行硬件故障诊断和排除;7、具备独立开发故障指示器(FTU、DTU)或类似产品相关工作经验; 职能类别:高级软件工程师嵌入式软件开发(Linux/单片机/PLC/DSP…) 关键字:嵌入式开发软件工程师 微信分享 +前程无忧网,软件,软件工程师,北京,1.2-2万/月,2年经验,本科,上市公司,,工作内容:1、 完成软件需求调研,设计文档等过程文档编制并按照软件规范要求输出相关过程文档。2、 完成软件模块的代码编制和自测。3、 协助测试完成软件测试,进行Bug修复,按照部门要求进行软件质量控制。4、 善于主动发现问题,提出合理化建议,积极提出优化项目开发手段。5、协助进行团队技术管理和软件技术平台建设。岗位职责:1、精通C\C++或WPF语言,熟练使用VStudio开发环境。2、熟悉数据库操作,对SQL等基本操作、触发器、存储过程等有较好的理解。3、熟悉Windows操作系统消息触发机制。4、熟悉串口、TCP/IP网络编程,多线程环境下编程方法和规则。5、熟悉常用数值,图像处理算法,有较好的算法基础。 职能类别:软件工程师 微信分享 +前程无忧网,软件,软件开发工程师,北京,1-1.5万/月,在校生/应届生,硕士,国企,,岗位职责:软件的程序设计、代码编写、软件测试及文档编写。 任职资格:本科及以上学历,计算机、通信、电子相关专业;熟悉C/C++,C#(WinForm或者WPF)应用程序开发;了解通信原理、数据库应用等相关知识。 职能类别:软件工程师 关键字:软件开发 微信分享 +前程无忧网,软件,C#软件工程师,北京,1.5-2.5万/月,2年经验,本科,合资,,"岗位职能1.SECS/GEM软件和EFEM控制相关的研发及应用工作,支撑公司各设备部门对SEMI标准化及EFEM的应用需求。2. 基于现有平台架构,编写应用方案及设计文档。3. 完成半导体检测设备系统涉及平台相关的开发工作。4. 支持其他兄弟部门研发人员的系统集成相关工作。5. 技术支持和现场调试。岗位要求1、 本科及以上学历,计算机科学与技术、软件工程、自动化等相关专业;2、 熟练掌握C#语言,至少3年以上C#开发经验,熟悉C++;3、 具有面向对象编程思维,熟练应用各种设计模式;4、 熟悉SQL语言,有SQL Server或者Oracle数据库开发经验;5、 熟悉多线程编程,有线程同步、异步、阻塞等开发经验;6、 熟练掌握TCP/IP网络协议,熟悉RS232/485等数据通讯接口;7、 有较高的英语读写能力,较强的逻辑分析能力,具备较强的学习和总结能力;8、 有半导体软件开发经验,熟悉GEM/SECS等相关SEMI协议者优先录用。9、 为人积极热情,有团队合作精神。备注:公司总部在深圳,北京有研发中心,北京工作地点有:北京市大兴区经济技术开发区地盛中路3号B座106北京市海淀区西北旺东路10号院10号楼中关村新兴产业联盟大厦3层302室其他福利:5天8小时,入职即购买5险1金,假期按国家规定;午餐补贴+晚餐补助;高额的出差津贴;不间断的水果零食,每周集体下午茶,每月户外团建及员工生日party;节日礼品或礼金,结婚生子红包;上班交通方便,年度旅游、年度体检等。 职能类别:软件工程师 关键字:C#软件工程师 微信分享" +前程无忧网,软件,C++软件研发工程师(急聘2021应届硕士+落京户),北京,1-1.5万/月,在校生/应届生,硕士,国企,,岗位职责:1、负责平台及相关服务、组件的设计和研发工作;2、根据开发规范与研发流程进行编码;3、编码,测试,文档编写,上线部署和应急处理;4、参与技术选型,预研,设计评审,代码审查;5、同产品经理一起参与项目的需求分析和设计;6、解决项目生命周期中可能遇到的技术难题。任职要求:1、硕士及以上计算机相关专业,扎实的C++基础,良好的编程习惯;2、熟悉QT界面开发,理解QT信号槽机制。3、熟悉Linux环境下的软件开发。4、掌握C++指针、内存管理、多线程编程、网络编程。5、熟悉面向对象编程理论和实践。6、熟悉数据库编程(MYSQL/SQL SERVER等)。 7、有很强的独立编程能力,分析能力强,思维敏捷,善于学习和沟通,善于参与团队合作。 职能类别:C/C++开发工程师 关键字:软件工程师C++ 微信分享 +前程无忧网,软件,D002-软件测试工程师,北京,,硕士,,民营公司,,岗位职责: 1. 有独立筹建、管理运营软件测试实验统筹能力;2. 负责实验室CNAS/CMA体系建立及审核;3. 负责软件测试项目任务分配,项目管理,合同管理及售前工作;4. 建立并维护实验室技术文件体系,开拓新的测试方法;5. 负责电子政务及电子商务软件测评项目的测试工作;岗位要求:1、大学统招硕士以上学历,计算机相关专业;2、精通软件测试流程和测试方法;3、很强的学习能力和技术钻研能力,良好的沟通能力,善于团队合作;4、工作积极主动,执行能力强,努力推进问题解决并适应中短期出差。 职能类别:软件测试工程师 微信分享 +前程无忧网,软件,控制算法及软件开发(北京),北京,,硕士,,民营公司,,职位描述1、负责高精度车辆动态模型、全局规划、控制算法的设计与开发;2、负责模型、算法的软件开发、调试与测试验证;3、负责模型、算法的持续改进和工程优化;4、编写相应技术文档。岗位要求1、导航、自动控制、计算机算法等相关专业硕士以上学历; 2、熟悉规划、控制和高精度建模的工程方法; 3、熟练使用Matlab语言进行模型和算法仿 职能类别:软件工程师 微信分享 +前程无忧网,软件,嵌入式软件工程师(研究院),北京,,本科,,国企,,岗位职责:(1)根据产品软件需求完成软件架构设计、软件详细设计,编制相关设计文档;(2)参与产品需求调研,设计开发及测试;(3)参与分析已有产品存在的软件问题,提出问题解决方案,并改进;(4)参与公司内部评审,提出评审意见。任职要求:(1)具有单片机/STM32/ARM开发经验;(2)熟练使用开发工具,熟练调试串口、I2C、SPI等常用外设驱动;(3)具备一定的硬件基础和调试手段,能看懂原理图,快速阅读芯片数据手册;(4)具备良好的编程风格和习惯。  备注:此职位是通号(北京)轨道工业集团有限公司轨道交通技术研究院招聘 职能类别:软件工程师大学/大专应届毕业生 微信分享 +前程无忧网,软件,软件工程师(北京),北京,1.5-2万/月,硕士,,国企,,1.OA办公系统管理、升级;2.办公管理信息化建设;3.数据库管理及应用开发。 职能类别:软件工程师 微信分享 +华北人才网,软件,7K以上急聘安全员,北京,7000-8500,不限,大专,民营,建筑/房地产, +,软件,高薪直招跟船出海叉车工月过万五险一金,北京,8000-15000,不限,不限,民营,普工|技工|生产|机械, +医药人才网,软件,实习生招聘一单一结日300.,北京,9000-12000,不限,高中,民营,计算机/互联网, +鄂州,软件,海量附近招聘创业的你,北京,8000-16000,不限,不限,民营,服务业, +电力人才网,软件,在线客服线上文员日300招聘,北京,9000-12000,不限,高中,民营,计算机/互联网, +,软件,高薪直招随船出海维修电工包吃住有五险一金,北京,8000-15000,不限,不限,民营,普工|技工|生产|机械, +,软件,高薪直招月薪一万跟船出海电焊工,北京,8000-15000,不限,不限,民营,普工|技工|生产|机械, +华北人才网,软件,游泳馆预售高薪招聘销售,北京,8000-16000,不限,不限,民营,咨询/法律/教育/科研, +,软件,直招跟船普工搬运工/月薪一万包吃住,北京,7000-15000,不限,不限,民营,普工|技工|生产|机械, +华北人才网,软件,招聘房产经纪人,北京,8000-16000,不限,不限,民营,服务业, +百姓网,软件,呼和浩特相伴复兴号高铁乘务员招聘,北京,8000以上,不限,不限,民营,行政/后勤, +,软件,直招跟船保安高薪包吃包住五险一金,北京,7000-15000,不限,不限,民营,家政|保安|物业|淘宝, +百姓网,软件,呼和浩特高铁乘务员餐吧员安检员招聘,北京,8000以上,不限,不限,民营,行政/后勤, +康强医疗人才网,软件,廊坊经营院长,北京,8000-15000,不限,大专,民营/其它,医疗, +吉林,软件,诚聘优秀店长,北京,8000-16000,不限,不限,民营,销售/客服/技术支持, +百姓网,软件,呼和浩特高端职位高铁乘务员招聘,北京,8000以上,不限,不限,民营,行政/后勤, +呼伦贝尔,软件,高薪招聘会销专员,北京,5000-10000,不限,不限,民营,销售/客服/技术支持, +馒头招聘,软件,烧烤师,北京,5000-10000,不限,小学,民营,餐饮, +百姓网,软件,呼和浩特高铁乘务员招聘好岗位招聘,北京,8000以上,不限,不限,民营,行政/后勤, +吉林,软件,直招送餐员配车管住,北京,6000-12000,不限,不限,民营,服务业, +前程无忧网,软件,软件开发岗,北京,,本科,,外资(非欧美),,岗位职责:1.负责根据公司的个性化要求,完成系统开发工作。参与软件模块、数据库设计,解决开发中遇到的技术问题。2.负责信息化项目的需求编写、架构设计、系统开发、上线测试、日常维护等;3.对完成的系统进行检查、优化,提高易用性和性能。任职条件:1.学历要求:普通高等院校本科及以上学历毕业生以及教育部认可的国外院校本科及以上毕业生;2.专业范围:计算机类专业--软件工程、网络工程、物联网工程、电子与计算机工程、信息安全、人工智能、计算机科学与技术;3.外语水平:英语CET-4成绩达到425分及以上;4.年龄要求:原则上大学本科生25岁(即1996年1月1日后出生)以下,硕士研究生28岁(即1993年1月1日后出生)以下,博士研究生30岁(即1991年1月1日后出生)以下。5.具备良好的逻辑思维能力、细节关注能力和沟通协调能力,善于创新,身心健康,档案中无不良记录,认可公司文化; 职能类别:软件工程师 微信分享 +前程无忧网,软件,软件测试工程师,北京,,本科,,合资,,【岗位职责】 1. 按照测试流程和计划,定义测试环境,设计测试数据和测试用例;2. 参与自动化工具开发、测试与维护;3. 实施和执行测试用例,记录并分析测试结果;4. 跟进软件缺陷的解决,并提交测试报告;5. 按时完成领导交付的其他工作。【任职资格】1. 计算机、软件、通信、电子等相关专业,本科及以上学历,硕士优先;2. 熟悉计算机基础知识,熟悉主流数据库,掌握一定的sql语句;3. 掌握一门或多门编程语言,Python优先;4. 对Linux、Unix等操作系统有一定了解;5. 了解shell、VBScript等脚本语言之一;6. 具有强烈的质量意识和团队协作意识;7. 具有较强的逻辑分析能力和解决问题的能力。 职能类别:软件测试工程师 微信分享 +前程无忧网,软件,通用软件开发工程师(北京),北京,,本科,,民营公司,,职位描述1. 协助完成从客户需求到软件产品定义、架构设计、开发实现、再到上线运营维护等产品生命周期中的各个环节2. 能够创造性解决产品在实现过程中的技术难题,应用前沿技术提升产品的核心竞争力,如分布式系统、性能调优、可靠性、数据库等3. 有机会参与业界前沿技术研究和规划,把人工智能技术、机器学习的概念引入测量行业任职条件1. 计算机、软件、通信等相关专业本科及以上学历2. 热爱编程,基础扎实,熟悉掌握但不限于JAVA/C++/Python/JS/HTML/C#等编程语言中的一种或数种,有良好的编程习惯3. 具备独立工作能力和解决问题的能力、善于沟通,乐于合作,热衷新技术,善于总结分享,喜欢动手实践4. 对数据结构、算法有一定了解5. 优选条件:(1) 熟悉TCP/IP协议及互联网常见应用和协议的原理(2) 有IT应用软件、互联网软件、IOS/安卓等相关产品开发经验,不满足于课堂所学,在校期间积极参加校内外软件编程大赛或积极参于编程开源社区组织(3) 熟悉JS/AS/AJAX/HTML5/CSS等前端开发技术 职能类别:高级软件工程师 微信分享 +前程无忧网,软件,软件开发工程师 (职位编号:计算机-北京高盟-北京高盟新材料股份有限公司-8),北京,,在校生/应届生,本科,民营公司,,职责:1、参与公司信息系统二次开发、报表开发,以及系统之间的数据交互;2、参与公司管理流程梳理和优化,通过信息化工具支撑各运营管理流程优化并固化;3、参与ERP、OA、REPORT、SHR、云之家等信息系统的分析、评估、实施; 要求:1、熟练掌握JAVA开发语言;2、能够独立完成ABAP开发(接口、增强、报表等);3、熟悉HTML5页面开发;4、熟悉Oracle、SQLServer等至少一种数据库语言;5、熟悉BI及报表展示工具开发、移动端APP应用开发者优先。工作地点:北京或武汉 职能类别:C/C++开发工程师BI工程师 关键字:软件系统开发 微信分享 +前程无忧网,软件,软件工程师-技术类(北京) (职位编号:00xz),北京,,硕士,,国企,,"学历要求:硕士/优秀本科专业要求:计算机岗位职责:1、根据数字能源硬件产品需求与前端组协作开发并实现各产品功能;2、参与后端研发中涉及到的技术框架选型及相关实现;3、完成核心接口的定义、使用、测试并保证业务代码的运行效率;4、负责平台系统开发研究、通信设备质量检测实施及管理、企业及行业标准制定、研发项目管理等;5、与团队协作实现产品上线,并监控产品服务,及时处理线上异常。任职资格:1、 掌握MySQL数据库的开发技能,熟练掌握SQL查询优化及存储过程编写, 熟练使用redis等NoSQL技术;2、熟悉CI/CD,使用svn、git、maven、jenkins等工具;3、熟悉分布式架构,了解分布式框架应用,熟悉高并发、负载均衡、消息队列;4、熟悉手机端app、服务器后台、数据库、UI及接口的设计和开发,有一定的写作能力;5、熟练使用电力仪表、电能质量分析仪等测试仪表,对通信设备工作原理及性能指标有浓厚兴趣,善于总结梳理,有一定的写作能力。6、具有较强的学习能力,具有一定的英语阅读能力,能积极主动跟踪与研究业界主流技术和热点问题;7、具有良好的沟通和团队协作能力及解决问题的能力,良好的职业道德及敬业精神,具有责任心,踏实稳重,吃苦耐劳。 职能类别:软件工程师 微信分享" +前程无忧网,软件,软件开发-技术类(北京) (职位编号:00xz),北京,,本科,,国企,,学历要求:本科专业要求:计算机岗位职责:软件开发、软件工作量评估任职资格:有软件开发实习经验优先 职能类别:软件工程师 微信分享 +前程无忧网,软件,软件架构工程师(数字孪生方向)-技术类(北京) (职位编号:00xz),北京,,本科,,国企,,学历要求:本科及以上专业要求:计算机及相关专业岗位职责:1、负责企业数字孪生产品的整体架构设计、技术选型、搭建、开发、管理、监控和性能调优,保证数据服务高效稳定运行,对数据应用提供数据存储、查询引擎、实时计算、元数据管理的架构设计;2、负责、数字孪生、大数据管理平台架构,进行全局性和前瞻性的架构设计,以及核心技术细节的实现,推动数据汇聚、数据质量、数据仓库、数据模型、数据安全及相关标准规范的建设和实现3、提供面向业务的数据服务,完成数据指标的统计,多维分析和展现;4、参与项目前期的可行性分析、产品需求评审、需求分析、架构设计、技术决策以及详细设计;5、负责数字孪生、大数据平台架构的持续的创新和优化,研究跟进大数据领域新技术,协助指导工程师解决关键研发问题任职资格:1、本科及以上学历,计算机、数学、电子工程、通信等相关专业,具备架构师工作经验,具有大数据、数字孪生相关领域工作经验优先考虑;2、至少精通 Java、Python、Scala 等开发语言中的一种,熟悉数据结构,具备良好的编程能力及算法基础;3、有大型分布式系统设计经验,熟练使用spring cloud netfilx、spring cloud alibaba等至少一种微服务架构和技术及实现原理;负责过海量数据平台上高可用、高性能分布式系统的架构设计;4、对大数据基础架构和平台底层原理有深度理解和丰富开发经验,对复杂系统的性能优化和稳定性提升有一线实战经验,具备相关产品(Hadoop、Hive、HBase、Kafka、Spark、Flink、Kettle、ELK等)项目应用研发经验;5、熟悉分布式存储和NoSQL数据库技术(如MongoDB、Redis、Cassandra等),有实际生产项目应用经验;6、具有一定的项目规划和决策能力,善于捕捉业务需求、架构设计存在的问题,并给出有效的解决措施和方法。 职能类别:软件工程师 微信分享 +前程无忧网,软件,软件研发-智能制造 (职位编号:软件研发),北京,,硕士,,国企,,"工作内容1.负责基于ROS系统的机械臂软件系统开发、集成和代码测试;2.负责制定基于ROS的软件架构和功能模块划分,并完成传感器驱动节点、执行器控制节点、开源软件功能包等开发、集成和测试.3.负责编制项目相关的技术文档.学历要求:硕士 职能类别:Go开发工程师 关键字:计算机类 微信分享" +前程无忧网,软件,嵌入式软件工程师,北京,1-2.5万/月,3-4年经验,本科,上市公司,,"岗位描述:1. 参与(高级工程师是负责)需求分解及系统架构的设计 2. 负责根据模块需求,进行模块设计、编码、单元测试及详细设计文档的编写 3. 参与(高级工程师是负责)软件平台或子系统的开发维护工作 4. 负责解决产品在开发、测试及售后过程中产生的软件问题岗位要求:1. 全日制本科及以上学历,具备扎实的C/C++及数据结构基础,具备3年以上嵌入式软件独立开发经验;优秀的应届生也可考虑2. 熟练掌握进程通信,多线程编程,网络编程,熟悉RS232/485,SPI/IIC编程,熟悉HTTP/HTTPS, MQTT, CoAP等物联网通信协议;3. 熟悉嵌入式操作系统的工作原理,熟练操作Linux系统,熟练掌握Linux C/C++调试,能够独立设计和开发抢占式多任务应用程序;4. 有较强独立解决问题的能力,具备良好的编程习惯,对技术有浓厚兴趣;5. 有配电自动化行业相关产品开发经验者优先;6. 熟悉IEC101-104,Modbus,DLT-698相关协议标准者优先。7.熟悉嵌入式RTOS如rt-thread,freertos,rtx等开发优先. 8.熟悉docker容器技术优先  职能类别:嵌入式软件开发(Linux/单片机/PLC/DSP…)高级软件工程师 关键字:LinuxC/C++RTOSmqttIEC104modbusHPLClorart-thread嵌入式 微信分享" +前程无忧网,软件,嵌入式软件助理工程师,北京,6-8千/月,在校生/应届生,本科,民营公司,,"工作内容:1. 负责测试Linux, Vxworks系统下的软件驱动和应用程序;2. 负责简单的应用层测试程序开发;3. 负责工程应用软件的开发,包括QT, MFC等常用图形开发工具;4. 与客户对接,解决客户复杂的技术问题;5. 编写并校对软件研发相关的需求文档、技术文档,管理和维护技术资料;6. 完成上级领导分配的其他工作。任职要求:1. 大学统招本科及以上学历,电子/自动化/通信/机械等相关专业;2. 熟练阅读英文资料,具备CET-4以上水平;3. 熟练掌握C/C++语言,有良好的代码能力及编写风格;4. 至少对一种CPU平台有了解,X86, PPC, DSP, ARM等;5. 对计算机底层软件、编译调试软件设计有浓厚兴趣;6. 学习能力强,责任心强,具备良好的沟通能力和分析问题的能力;7. 有相关工作经验,或参加过相关竞赛者优先;Senbo公司简介我们在2003年于北京成立,专注于高可靠的嵌入式计算机硬件、软件及相关产品的研发、生产以及销售、服务。我们通过ODM和OEM的合作方式,致力于为客户量身打造定制化产品和系统解决方案,不断推出客户适用的高性能嵌入式计算机模块和应用平台。我们的产品广泛应用于军工电子、交通运输、电力系统、便携式移动设备、智能仪器等控制领域。我们凭借优秀的科研创新能力,获得高新技术企业资质,拥有多项专利和软件著作权,并且已通过国军标GJB9001C-2017和GB/T19001-2016 质量体系认证。目前以北京总部为中心,在天津、西安、成都、武汉、南京、沈阳、昆明等地设有分支机构,服务网络辐射全国。 职能类别:嵌入式软件开发(Linux/单片机/PLC/DSP…)技术文档工程师 关键字:嵌入式软件LinuxC语言C++驱动开发软件测试硬件军工电子ARMDSP 微信分享" +前程无忧网,软件,软件开发-Java(北京),北京,,本科,,民营公司,,岗位职责:1、在指导下开展编码及单元测试;2、根据设计文档、开发规范进行基础性编码工作,修复产品BUG。任职资格:1、2020年毕业,计算机软件相关专业本科及以上学历;2、熟练掌握Java,有相关编程项目经验优先;3、具备良好的沟通能力、逻辑思维能力,有较强的团队协作意识,能承受一定工作压力。工作地点:北京 职能类别:软件工程师 微信分享 +前程无忧网,软件,嵌入式软件工程师,北京,1-1.5万/月,1年经验,本科,民营公司,,"职位描述1、精通CC编程,具有良好的编程习惯和代码编辑效率;2、精通STM32、AVR、ARM、DSP系列控制器的嵌入式软件开发,熟悉硬件电路设计; 3、 熟悉相关控制器微系统移植,包括uCos, Linux等 系统的嵌入式编程; 职能类别:高级软件工程师 微信分享" +前程无忧网,软件,嵌入式软件开发、汇编代码研读,北京,1-1.5万/月,硕士,,民营公司,,"1. 对数据结构有深刻理解,精通C/C++语言2. 具有良好的编程风格及开发文档编写能力3. 具有良好的硬件基础,精通单片机原理及应用,能独立进行单片机应用系统的开发4. 至少精通一种单片机软件集成开发工具(Keil, Tasking等),并深刻理解影响代码生成的编译、链接选项5. 具有一定的汇编代码阅读理解并提炼程序逻辑的能力6. 熟悉嵌入式OS。有ucos开发经验者、熟悉ARM架构者优先。7. 具备良好的沟通能力与团队合作意识 职能类别:嵌入式软件开发(Linux/单片机/PLC/DSP…)软件工程师 关键字:嵌入式软件开发汇编代码研读 微信分享" +前程无忧网,软件,软件驱动开发工程师,北京,1.5-2.5万/月,3-4年经验,本科,民营公司,,1. 智能设备IOT相关的Linux系统驱动程序移植、调试与开发,负责不同硬件的适配、调试和性能优化; 2. 跟进及解决测试反馈的设备软件相关问题;3. 编制设计文档,设计测试工具。岗位要求: 1. 本科及以上学历,计算机、电子信息、通讯、自动化类相关专业;2. 三年以上linux嵌入式开发相关经验;3. 熟练掌握C语言开发和原理图查看; 4. 有手机开发经验者优先。 职能类别:软件工程师移动开发工程师 关键字:软件工程师驱动开发 微信分享 +前程无忧网,软件,对日开发VC++软件工程师,北京,0.6-1万/月,5-7年经验,,上市公司,,1. 计算机或相关专业毕业。 2. 五年以上的VC++程序设计开发经验。 3. 熟练进行MFC/SDK/DCOM/COM等应用程序和DLL的开发。 4. 具有独立完成项目开发与测试能力。 5. 良好的团队合作精神和沟通能力。 6. 有对日本项目开发及管理经验者优先。作息时间: 09:00-18:00(中午12:00-13:00休息) 双休,法定节假日正常休息 福利待遇: 完善的福利体系和晋升体系 五险一金,十三薪 法定的带薪年假,节日福利 每年两次调薪,每年至少一次出游 职能类别:高级软件工程师 微信分享 +前程无忧网,软件,网规软件开发工程师,北京,1.5-3万/月,3-4年经验,本科,国企,,岗位职责:1.车联网产品路测工具开发、网规网优、诊断工具开发;2.模组产测工具、烧录工具维护;高层协议栈软仿平台软件维护;3.维护工具相关需求和设计文档;任职资格:1.本科及以上,计算机、软件工程、通信、电子信息,3~10年工作经验;2.精通C语言,能够熟练使用C++语言,掌握STL模板的使用,熟悉常用面向对象设计模式;3.具有网规软件开发经验者优先考虑;4.熟练掌握QT框架,熟悉qml更佳,GIS开发经验更佳,了解MFC更佳;5.较强的专研能力,能够透过表象深入探究技术问题的本质;具备独立解决开发过程中所遇各种疑难问题的能力。该岗位15薪/年 职能类别:高级软件工程师 关键字:C 微信分享 +前程无忧网,软件,软件开发工程师,北京,0.8-1万/月,3-4年经验,本科,民营公司,,开发编写公司产品代码优化公司产品参与产品设计 岗位技能要求,熟悉以下技术者优先:WEB开发相关技术:Python、HTML、CSS、JavaScript、AjaxWEB服务器:ApacheWEB前端框架: jQuery、VUE、layuiWRB后端框架:Django数据库:MongoDB、MYSQL、SQL Server代码管理工具:Github具备网络安全相关经验 其它要求:有良好的英文阅读能力有软件测试经验有强烈求知欲和书善于学习勤奋敬业,团结合作,积极主动,能承受一定的工作压力,具有很好的沟通能力、服务意识和执行力。优秀的沟通能力、分析问题和解决问题的能力,具有良好的逻辑思维、技术能力和学习能力。良好的团队管理和沟通合作能力。能适应外地出差以及短期驻场工作。 职能类别:软件工程师 关键字:软件软件开发工程师计算机开发互联网 微信分享 +前程无忧网,软件,c++软件开发(上班地:太原),北京,10-15万/年,2年经验,本科,民营公司,,技能要求:C++,C#,VB,MFC任职要求:1、具备一定的C++/C# 开发经验,逻辑思维活跃;2、***具有自动控制、自动化、装备制造等相关从业经历,年龄不超过35岁;3、具备自动化控制系统设计及编程能力者优先;4、熟悉工业控制,可独立承担项目,可出差;岗位职责:1、负责自动化设备控制系统软件设计工作;2、负责编写控制流程代码;3、编写CIM等通信代码; 职能类别:C/C++开发工程师 关键字:C++软件工程师软件开发c++软件 微信分享 +前程无忧网,软件,软件测试工程师,北京,1-1.5万/月,2年经验,本科,民营公司,,岗位职责:1、负责企业级移动端产品的兼容性测试实施工作,细化测试需求,及时上报项目风险,确保测试活动的顺利开展;2、落实测试计划和方案,核验测试用例;3、编制相关报告,对软件问题进行跟踪分析和报告,推动测试中发现问题及时合理地解决;4、持续改进测试过程和测试方法。岗位要求:1、计算机或相关专业,本科以上学历,2年以上工作经验,至少2年及以上移动端测试相关工作经验;2、具备丰富的移动产品测试经验,包括但不限于Android 、ioS、APP产品,熟悉移动产品测试流程和工具方法;3、责任心强,具备快速学习能力,能在较大压力下工作;4、熟悉金融类 APP 产品测试者优先;5、有自动化测试脚本和工具开发者优先。公司福利:1、我们提供有竞争力的薪资;2、享受每年一次普调工资制度;3、享有年终奖金;4、为员工缴纳五险及住房公积金;5、生日惊喜、司龄惊喜;6、节假日福利;7、双休制,所有节假日均按照国家法定执行;8、年休假(五天以上)及婚假、产育假(男职工陪产假)等休假制度;9、专享来往探亲车票报销待遇;10、定期组织户外拓展活动以及聚餐活动;11、广阔的晋升空间;12、高新前沿的技能培训。晋升空间:技术:初级工程师→中级工程师→高级工程师→项目经理→技术总监管理:开发工程师→系统工程师→项目组长→项目经理→部门经理→公司高管业务:开发工程师→系统设计→业务策划→产品经理→业务专家 职能类别:软件测试工程师 微信分享 +前程无忧网,软件,软件测试(支付宝),北京,1-1.5万/月,3-4年经验,大专,民营公司,,职位要求:1、熟悉java编程基础,熟悉单元测试技术和TDD。2、具备自动化测试经验,熟悉testNG尤佳。2、较强的业务理解和逻辑思维能力,具备成熟的团队合作经验和冲突管理能力;3、熟悉软件研发过程,精通功能测试方法和用例设计,具备定位Bug根源的能力;4、有性能测试、白盒测试经验者优先;5、熟悉区块链相关技术者优先。   学历要求:大专及以上(学信网可查)     职能类别:软件测试工程师 关键字:软件测试测试测试工程师自动化测试Java测试开发性能测试 微信分享 +前程无忧网,软件,软件工程师(激光测距),北京,2-3万/月,3-4年经验,本科,民营公司,,岗位职责:1)参与系统总体方案设计;  2)参与软件接口协调;   3)负责激光测距软件开发、测试,配合系统或部件测试、联试;    4)产品持续改进。    任职要求:    1)统招本科以上学历,软件、电子、通信、无线电等相关专业,3-5年工作经验,熟练阅读英文技术资料;2)熟悉嵌入软件开发,熟练使用C等常用开发环境, 熟悉常用的RS232、RS422、CAN等通信接口,熟悉脉冲飞行时间、相位法激光测距,熟悉相关法等降噪算法;    3)具有一定激光测距工程经验,熟悉GJB国军标质量管理体系;    4)思维敏捷,具有较强的学习能力;  5)具有良好的沟通、理解能力和良好的协作意识,具有团队合作精神;   6)工作积极主动,具有高度责任感。     职能类别:高级软件工程师 关键字:软件开发激光测距工程师 微信分享 +前程无忧网,软件,软件测试工程师,北京,0.8-1.2万/月,在校生/应届生,本科,国企,,岗位职责:1、参与需求讨论并设计测试方案。2、制定测试计划,按照计划和方案设计测试用例3、根据测试计划和方案搭建和维护测试环境,执行测试用例,进行系统测试4、编写或录制自动测试或压力测试脚本,执行性能和压力测试5、对测试中发现的问题进行详细分析和准确定位6、及时跟踪并管理缺陷,与开发人员讨论缺陷解决方案,督促开发人员修复缺陷,保证系统正常运行7、分析缺陷分布及测试结果,总结并生成缺陷报告、测试报告,系统全面地体现系统功能的完整性和健全性8、提出对产品的进一步改进建议,并评估改进方案是否合理任职要求:1、计算机相关专业,本科及以上,熟悉软件开发流程、软件测试理论2、熟练使用sql语句,了解oracle数据库3、熟练使用基本的linux命令4、熟系性能/自动化测试,熟练使用相关测试工具(LoadRunner、Jmeter等)5、熟悉常用测试用例设计方法,了解常见问题的处理方案;6、具有一定的脚本编写能力和阅读能力,有开发经验者优先。7、有较强的逻辑分析、问题定位、沟通协调能力8、有较强的快速学习能力,有责任感主动性强,有良好的团队合作精神福利:五险一金,商业补充医疗保险,年终奖金,节日福利,交通补助,通讯补助,单身公寓,电影卡,生日卡,海关游泳卡,海关健身卡,公园年票,郊游拓展,党团活动,工会活动(电影,音乐会等) 职能类别:软件测试工程师 微信分享 +前程无忧网,软件,控制中心软件技术负责人,北京,1.2-3万/月,1年经验,大专,民营公司,,熟练掌握C#、C++软件开发和调试,熟悉网络系统部署,具有良好的人际交往能力,具有铁路或轨道交通经验者优先。 职能类别:C/C++开发工程师 关键字:项目经理系统集成软件开发 微信分享 +前程无忧网,软件,软件工程师/实施工程师(实习),北京,4.5-6千/月,在校生/应届生,大专,民营公司,,"1.参与项目需求分析, 研究项目技术细节,进行系统框架和核心模块的详细设计;编写相应的技术文档; 2. 根据公司要求规范,编写相应的技术文档;编制项目文档、记录质量测试结果 3. 完成项目初始至终结的全部技术跟踪协调工作 4. 根据开发进度和任务分解完成软件编码工作,配合测试工程师进行软件测试工作; 5. 参与客户沟通、项目需求调研分析并维持良好的客户关系;编写需求分析报告。 6. 进行用户现场软件的部署和实施 7. 完成公司领导交办的其他工作。 职位需求 1.计算机相关专业,数学专业优先,本科以上学历; 2.熟悉Orade、Sqlserver等数据库及SQL语言; 3.良好的团队合作精神和社交技巧及沟通协调能力; 职能类别:软件工程师运维开发 微信分享" +前程无忧网,软件,软件程序员(C++),北京,0.8-1万/月,3-4年经验,大专,国企,,(1)熟悉C++多线程开发,熟练应用VS2012开发工具者优先;(2)逻辑思维清晰,具备良好的分析和解决问题的能力;(3)良好编码习惯,有协同开发意识;(4)工业自动化软件开发经验优先;(5)有过独立软件开发经验。(6)统招本科毕业3年及以上,专科毕业4年及以上 职能类别:C/C++开发工程师 微信分享 +前程无忧网,软件,C++ 建筑软件研发工程师,北京,1-1.5万/月,在校生/应届生,本科,民营公司,,岗位职责:· 在Windows平台下,熟练应用VC/C++进行建筑结构应用软件的开发和维护工作;· 根据需求进行软件的设计与开发;· 根据测试和客户的返馈及时调试和维护软件;· 优化源代码,使代码复合面向对象和复用性的要求;· 其他软件开发相关工作。任职要求:·土木工程、力学、数学、物理、计算机等理工科专业背景,本科及以上学历;·对编程有浓厚兴趣;·有较强的逻辑思维能力;·致力于投身软件研发行业; · 掌握C/C++语言; · 具有良好沟通和团队协作能力,有较强的学习能力和解决问题的能力。若掌握以下技能之一者优先考虑:1)熟悉CAD软件的使用或者具有相关开发经验;2)有三维图形底层平台开发、BIM开发经验或具备相关概念;3)熟悉图形系统或应用的开发;4)熟悉python语言;5)有MFC应用项目开发经验;6)有过ObjectARX、Autolisp、VBA进行AutoCAD二次开发经验;7)有过实际软件编写经验。 职能类别:C/C++开发工程师 关键字:C++MFCObjectARXVBAAUTOLISPCADPython 微信分享 +前程无忧网,软件,A07-高级软件开发工程师JAVA(3年工作经验),北京,,本科,,政府机关,,1.本科以上学历且取得相应学位,3年以上开发经验;2.计算机及相关专业,熟练使用Java各类核心技术,具有需求分析和产品设计能力,有全栈开发能力者优先; 3. 熟练掌握jQuery等前端框架,熟悉HTML,JavaScript,CSS,熟悉Spring、SpringBoot、Struts2等常见后台框架;4.具有分布式调度、业务监控等系统架构设计经验者优先,熟悉数据库者优先;5.有良好的编码开发习惯,团队合作能力,善于沟通。 职能类别:高级软件工程师 微信分享 +前程无忧网,软件,嵌入式软件工程师(北京),北京,1-1.5万/月,本科,,民营公司,,"熟悉 C/C++编程,具有良好的编程风格;熟悉 ARM Cortex M0,M1,M3,M4 等相关的 32 位嵌入式处理器的一种或更多,如 stm32 等, 熟悉常用的底层总线及外设,有一定的底层驱动开发能力;熟悉 linux 操作系统,熟悉 linux 下的 C, C++编程;具有良好的英语读写能力和文档编写能力, 工作态度积极,责任心强,良好的沟通与团队配合。 职能类别:软件工程师 微信分享" +前程无忧网,软件,软件研发,北京,,本科,,国企,,岗位职责:主要负责公司产品的开发工作,包括前期调研、需求分析、设计开发、测试验证、问题解决、改进升级等相关工作。任职要求:1、本科及以上学历,计算机、软件工程等相关专业;2、至少熟悉一种高级程序设计语言(C++、Java、Go、C#、JavaScript、Python...);3、英语四级以上,具有良好的英文阅读能力;4、具有扎实的计算机知识基础有一定的编程基础,对设计模式、算法、分布式有一定认识者优先。 职能类别:软件工程师 微信分享 +前程无忧网,软件,软件工程师,北京,0.6-1万/月,1年经验,本科,民营公司,,岗位职责 主要负责CRM、OA及其它移动应用的IT支持工作,参与软件规划、需求、设计、开发跟进、测试、实施、培训上线全流程 负责推进系统的使用,及时发现潜在的问题及风险 负责与公司各个业务部门对接,维护软件,维护数据 负责系统运行过程中问题的记录与追踪,协调各方跟进修复 负责软件基础的前端开发或熟悉前端开发,能与外包开发团队进行有效沟通 上级安排的其他工作任职要求 本科及以上学历,信息管理、软件开发、计算机相关专业 熟悉使用Sql server、Mysql、Oracle等主流等数据库,能熟练编写存储过程及函数 精通html5/CSS3/Javascript,熟悉flex布局 熟悉react、angular优先 熟练使用excel及其他日常办公office 具备团队合作意识,工作主动性强,具有发现问题和分析问题的能力和意识 有较强的学习能力、良好的语言沟通能力、文字表达能力及数据分析能力 有医疗行业CRM、OA等系统的IT支持、系统实施、项目管理经验者优先 具有较强的前言软件嗅觉,做过前言软件研究推广经验者优先 职能类别:软件工程师 微信分享 +前程无忧网,软件,Software Engineer 软件开发工程师,北京,1.5-2万/月,在校生/应届生,本科,外资(欧美),,"Team Overview部门概况 This employee will be working in Support and Operations Readiness Tools team (SORT).  Responsibilities工作职责 Participating in Agile development activities including sprint planning, stand-ups, retrospectives and demos参与敏捷开发活动,包括sprint计划、站立会议、回顾和演示Responsible for implementing, testing, and maintaining of software modules with a high-quality standard负责实施、测试和维护具有高质量标准的软件模块To increase the code coverage rate of unit tests and automation tests提高单元测试和自动化测试的代码覆盖率Participating in peer reviews参与代码评审Communicate and collaborate among global teams’ environment在分布式的全球团队环境中沟通合作  Qualifications任职要求 Solid computer knowledges like OS, Network, Data Structure, etc.扎实的计算机基础知识,比如操作系统,网络原理,数据结构等Proficient in using any one of programming languages精通任意一种编程语言Experience with primary knowledge of the required programming languages like Python, Golang, Java and Perl.具备所需编程语言的主要知识,比如Python,Golang,Java和PerlKnowledge of Linux platforms具备Linux平台知识Good software engineering skills are a must, as you’ll be working with some of the best in the industry 必须有良好的软件开发技能,因为你将与业内一些顶尖的人才合作Good debugging/problem-solving skills sense良好的调试/解决问题的能力和意识A fast learner and self-starter with intellectual horsepower强大的快速学习以及自我激励的能力Excellent communication skills, both oral and written in both Chinese and English优秀的中英文口头和书面沟通能力Excellent working in a collaborative team environment能在协作团队环境中出色地工作Ability to work with minimal supervision and can-do attitude during work在最低限度的监督下工作的能力和愿意尝试新事物的态度Degree in Computer Science or equivalent experience is required必须拥有计算机科学学位(硕士优先)或同等教育经历Can work in fast-paced and challenging environment能够在快节奏和富有挑战性的环境中工作 Nice to have加分项 Knowledge of databases (SQL/NoSQL) and Storage is a plus具备数据库(SQL/NoSQL)、网络和存储方面的知识者优先Knowledge of design pattern is a plus了解设计模式者优先Knowledge of Linux kernel is a plus具备Linux内核知识者优先Knowledge of Cloud Storage/Service is a plus具备云存储/计算/服务知识者优先 At Veritas, we care about the causes close to your heart and enable you to volunteer, donate, and do good. We also value uniqueness and know that a more diverse and inclusive workforce makes a winning team, so come as you are! Interested? Then apply and find out more about #TeamVTAS! 职能类别:软件工程师 微信分享" +前程无忧网,软件,软件开发-Java(北京) (职位编号:技术族),北京,,本科,,民营公司,,岗位职责:1、在指导下开展编码及单元测试;2、根据设计文档、开发规范进行基础性编码工作,修复产品BUG。任职资格:1、2021届应届毕业,计算机软件相关专业本科及以上学历;2、熟练掌握Java,有相关编程项目经验优先;3、具备良好的沟通能力、逻辑思维能力,有较强的团队协作意识,能承受一定工作压力。 职能类别:Java开发工程师 微信分享 +前程无忧网,软件,对日软件工程师,北京,0.8-1万/月,1年经验,大专,民营公司,,JAVA 开发人员:1名一年以上开发经验。Java硬性技术要求:(1)精通JAVA开发语言、熟练掌握Eclipse开发工具;(2)精通TOMCAT等Web开发相关技术;(3)熟悉主流数据库如MySQL,熟练掌握SQL。(4)熟悉使用spring,Mybatis等常用开发框架。加分项:熟悉JS语言要求:会日语或者英语。日语更佳。 职能类别:Java开发工程师 微信分享 +前程无忧网,软件,软件研发工程师(北京),北京,4.5-6千/月,本科,,上市公司,,1、负责软件程序设计和开发;2、负责集成项目接口开发和调试工作;3、根据项目的具体要求,承担开发任务,按计划完成任务指标;4、既有产品功能扩展和维护;5、工作地点为天津(天津市西青区海泰发展二路15号)。 职能类别:软件工程师嵌入式软件开发(Linux/单片机/PLC/DSP…) 关键字:CC++嵌入式 微信分享 +,软件,直招跟船保安高薪包吃包住五险一金,北京,7000-15000,不限,不限,民营,家政|保安|物业|淘宝, +,软件,高薪直招随船出海维修电工包吃住有五险一金,北京,8000-15000,不限,不限,民营,普工|技工|生产|机械, +鄂州,软件,海量附近招聘创业的你,北京,8000-16000,不限,不限,民营,服务业, +百姓网,软件,呼和浩特高铁乘务员餐吧员安检员招聘,北京,8000以上,不限,不限,民营,行政/后勤, +百姓网,软件,呼和浩特高铁乘务员招聘好岗位招聘,北京,8000以上,不限,不限,民营,行政/后勤, +华北人才网,软件,游泳馆预售高薪招聘销售,北京,8000-16000,不限,不限,民营,咨询/法律/教育/科研, +呼伦贝尔,软件,高薪招聘会销专员,北京,5000-10000,不限,不限,民营,销售/客服/技术支持, +吉林,软件,直招送餐员配车管住,北京,6000-12000,不限,不限,民营,服务业, +百姓网,软件,呼和浩特相伴复兴号高铁乘务员招聘,北京,8000以上,不限,不限,民营,行政/后勤, +医药人才网,软件,实习生招聘一单一结日300.,北京,9000-12000,不限,高中,民营,计算机/互联网, +吉林,软件,诚聘优秀店长,北京,8000-16000,不限,不限,民营,销售/客服/技术支持, +华北人才网,软件,招聘房产经纪人,北京,8000-16000,不限,不限,民营,服务业, +,软件,高薪直招跟船出海叉车工月过万五险一金,北京,8000-15000,不限,不限,民营,普工|技工|生产|机械, +康强医疗人才网,软件,廊坊经营院长,北京,8000-15000,不限,大专,民营/其它,医疗, +华北人才网,软件,7K以上急聘安全员,北京,7000-8500,不限,大专,民营,建筑/房地产, +,软件,高薪直招月薪一万跟船出海电焊工,北京,8000-15000,不限,不限,民营,普工|技工|生产|机械, +,软件,直招跟船普工搬运工/月薪一万包吃住,北京,7000-15000,不限,不限,民营,普工|技工|生产|机械, +电力人才网,软件,在线客服线上文员日300招聘,北京,9000-12000,不限,高中,民营,计算机/互联网, +馒头招聘,软件,烧烤师,北京,5000-10000,不限,小学,民营,餐饮, +百姓网,软件,呼和浩特高端职位高铁乘务员招聘,北京,8000以上,不限,不限,民营,行政/后勤, +前程无忧网,软件,软件开发工程师(北京),北京,,本科,,民营公司,,岗位描述:     从事PC端工具和应用软件开发。任职要求:1.计算机或相关专业本科及以上学历;2.熟悉Windows 平台下C/C++开发,熟悉MFC、ATL等类库;3.熟悉多进程、多线程、网络编程等技术;4.熟悉Linux下GUI的开发(GTK,QT,SDL其中之一即可)优先 5.有跨平台(win32/linux/unix)应用开发经验优先6.有Android NDK和JNI开发经验者优先; 职能类别:高级软件工程师软件工程师 微信分享 +前程无忧网,软件,软件工程师岗(后端应用开发),北京,,在校生/应届生,硕士,国企,,工作职责:1. 依据公司软件研发相关规范,根据软件详细设计说明书,按项目进度完成应用程序代码的编写;2. 配合产品人员和系统架构师完成业务分析和架构设计;3. 参与设计和制定交互流程,实现业务需求,指导业务人员及用户使用产品;4. 参与设计系统技术方案,核心代码开发和系统调优,并参与项目组代码评审。任职资格:1. 全日制硕士及以上学历,计算机及相关专业,2020年应届毕业生或2021年应届毕业生,择优落户;2. 扎实的数据结构和算法基础,熟悉Java、C++、C#、Python中一种编程语言;3. 理解面向对象思想,有较强的编码能力,热爱计算机技术;4. 有优秀的逻辑分析能力,能够对业务逻辑进行合理的抽象和拆分;5. 具备较强的学习能力和沟通能力,具备良好的团队合作精神。 职能类别:软件工程师Java开发工程师 微信分享 +华北人才网,图像,游泳馆预售高薪招聘销售,北京,8000-16000,不限,不限,民营,咨询/法律/教育/科研, +吉林,图像,直招送餐员配车管住,北京,6000-12000,不限,不限,民营,服务业, +百姓网,图像,呼和浩特相伴复兴号高铁乘务员招聘,北京,8000以上,不限,不限,民营,行政/后勤, +康强医疗人才网,图像,廊坊经营院长,北京,8000-15000,不限,大专,民营/其它,医疗, +,图像,直招跟船保安高薪包吃包住五险一金,北京,7000-15000,不限,不限,民营,家政|保安|物业|淘宝, +,图像,高薪直招跟船出海叉车工月过万五险一金,北京,8000-15000,不限,不限,民营,普工|技工|生产|机械, +百姓网,图像,呼和浩特高端职位高铁乘务员招聘,北京,8000以上,不限,不限,民营,行政/后勤, +,图像,高薪直招月薪一万跟船出海电焊工,北京,8000-15000,不限,不限,民营,普工|技工|生产|机械, +百姓网,图像,呼和浩特高铁乘务员餐吧员安检员招聘,北京,8000以上,不限,不限,民营,行政/后勤, +电力人才网,图像,在线客服线上文员日300招聘,北京,9000-12000,不限,高中,民营,计算机/互联网, +馒头招聘,图像,烧烤师,北京,5000-10000,不限,小学,民营,餐饮, +医药人才网,图像,实习生招聘一单一结日300.,北京,9000-12000,不限,高中,民营,计算机/互联网, +吉林,图像,诚聘优秀店长,北京,8000-16000,不限,不限,民营,销售/客服/技术支持, +,图像,高薪直招随船出海维修电工包吃住有五险一金,北京,8000-15000,不限,不限,民营,普工|技工|生产|机械, +呼伦贝尔,图像,高薪招聘会销专员,北京,5000-10000,不限,不限,民营,销售/客服/技术支持, +华北人才网,图像,招聘房产经纪人,北京,8000-16000,不限,不限,民营,服务业, +,图像,直招跟船普工搬运工/月薪一万包吃住,北京,7000-15000,不限,不限,民营,普工|技工|生产|机械, +百姓网,图像,呼和浩特高铁乘务员招聘好岗位招聘,北京,8000以上,不限,不限,民营,行政/后勤, +鄂州,图像,海量附近招聘创业的你,北京,8000-16000,不限,不限,民营,服务业, +华北人才网,图像,7K以上急聘安全员,北京,7000-8500,不限,大专,民营,建筑/房地产, +前程无忧网,图像,服务端(高级)研发工程师 - 视频图像应用 (职位编号:6886270906944424206),北京,2.5-5万/月,无需经验,本科,民营公司,,职位描述:1、负责字节跳动视频中台高性能视频和图像处理系统的业务开发和技术架构;2、构建稳定支撑全球海量业务的业界领先的技术中台,包括但不限于图片音视频的流式处理、动态调度、访问控制等;3、对业务逻辑进行合理抽象,高效地满足 tech2B 产品化与商业化的架构和业务需求;4、主动发现现有系统的弱点并加以完善,确保模块线上运行稳定。职位要求:1、本科及以上学历,至少 1 年服务端开发经验,强悍的系统设计及编码能力;2、精通主流语言的至少一门 Go / C / C++ / Java / Python / Erlang / Rust 等;3、有优秀的逻辑分析能力,能够对业务逻辑进行合理的抽象和拆分;4、积极乐观,责任心强,工作认真细致,具有良好的团队沟通与协作能力;5、有强烈的求知欲、好奇心和进取心 ,能及时关注和学习业界***;6、【加分项】有大规模视频和图像处理系统的设计和开发经验。 职能类别:软件工程师 微信分享 +前程无忧网,图像,Camera SW Engineer(摄像头图像处理软件开发工程师),北京,1.5-3万/月,2年经验,本科,合资,,"工作职责: 负责芯擎车载平台的Camera开发和调试   职位要求: 1. 具有2年以上手机或嵌入式系统底层软件开发调试经验. 2. 熟练掌握C/C++/JAVA编程及系统调试方法. 3. 具有Linux, Android, RTOS下的驱动和系统开发调试经验. 4. 具有Camera Driver, Image Sensor, ISP, 3A, IQ Tuning等编程和调试经验. 5. 熟悉MIPI, CSI, I2C等camera相关接口及编程调试方法. 6. 熟悉ARM架构和编程,如ARMv8, Cortex A或Cortex M等. 7. 有高通、三星、瑞萨、MTK等芯片的车载平台开发经验优先. 8. 有360环视、倒车开发经验者优先. 9. 良好的学习沟通能力和问题分析解决能力,有责任心. 职能类别:高级软件工程师多媒体开发工程师 关键字:camera摄像头 微信分享" +前程无忧网,图像,C++开发工程师(流媒体图像处理与跟踪方向),北京,1.5-2.5万/月,5-7年经验,本科,民营公司,,"岗位职责:    1、负责计算机视觉、图像处理、视频理解相关算法的研发和优化;    2、结合公司业务,布局人工智能相关产品线,推动研究成果落地工作;    3、基于公司业务需求,给出有效的优化解决方案,成功落地到实际的场景当中,例如人脸识别、教学环境中的自动跟踪、基于图像的学情分析等    任职要求:    1、熟悉Windows操作系统;    2、熟悉VC++,QT、C++,python,等编程语言;    3、掌握数字图像处理的多种算法;    4、熟练使用OpenCV进行算法开发;熟练图像分类、目标检测、目标跟踪等常用图像识别算法;    5、熟悉经典的基于深度学习的图像算法原理及有相关开发经验;    6、熟悉机器视觉行业系统、硬件、光学技术等相关专业背景;    7、学历要求:统招本科以及上学历,不符合者勿投。 职能类别:C/C++开发工程师 关键字:C++、OpenCV软件工程师软件开发软件c++c嵌入式 微信分享" +前程无忧网,图像,高级软件工程师-图像方向,北京,1.8-3万/月,2年经验,本科,民营公司,,工作职责:负责医学影像(如CT/SPECT/PET等)处理软件的需求开发、软件设计、开发、测试和维护工作; 通过VTK/ITK/DCMTK/GDCM等第三方库,与算法设计人员合作,完成图像处理算法的高性能实现;负责设计开发过程的设计文档及记录文档的编制;负责图像处理软件子系统的外协管理。 任职要求:计算科学/软件工程/生物医学工程等相关专业,统招院校本科以上学历,具有2年以上图像处理相关工作经验;了解数字图像处理的基本概念与方法,具备图像处理算法实现能力;了解医学图像DICOM协议及应用方法;精通面向对象设计方法和C++开发语言,熟练使用QWidgets/QML界面开发框架;了解VTK/ITK图像显示和处理开源库,有1年以上的使用开发经验;具备需求分析和系统设计能力,具有较强的独立解决问题的能力;具备良好的编程风格和较强的文档编写能力,能根据公司的要求提供完整规范的研发文档和测试报;富有团队合作精神,工作积极主动,有韧性;具有良好的中英文口头及书面沟通表达能力和对问题的理解和逻辑分析能力;以下为加分项: -熟悉或了解C#/Java/Python等开发语言 -有DICOM三方库使用和开发经验,如DCMTK/GDCM等; -有PACS系统或医疗图像处理工作站开发经验; -有大型医疗影像设备图像开发经验,如CT/MR/SPECT/PET等; -有敏捷团队开发经验。 职能类别:高级软件工程师软件工程师 关键字:c++图像处理 微信分享 +前程无忧网,图像,图像处理算法工程师,北京,1-2万/月,3-4年经验,硕士,民营公司,,1)算法研发1.1图像处理算法研发,模块代码编写及速度优化。1.2图像处理算法及相关模块研发相关文档的编写。2)算法维护2.1现有图像处理算法的维护与升级。2.2对现有算法及模块的用户反馈进行分析,进行必要的修改。3)知识产权申报3.1跟踪行业内相关技术最新进展。3.2相关算法发明专利和软件著作权申请的相关工作。任职要求:1.教育水平:本科及以上。2.工作经验:2年及以上工作经验。3.专业要求:计算机、电子、生医、自动化等 相关专业。4.专业能力:具有扎实的数字图像处理理论基础,以及优秀的实际研发能力;                     良好的语言表达及沟通能力,良好的英文科技文献阅读能力;                     具有使用 Visual C++/QT 等C/C++开发平台进行图像处理算法研发的能力和经验;                     具有使用 Matlab 进行实际图像处理算法项目研发的能力及经验优先;                     熟练掌握 GPU加速技术,能够使用 CUDA C 对数字图像处理算法及相关 C/C++ 模块进行优化者优先。5.知识/实操经验:  1)2 年以上 C/C++ 实际编程经验;  2)2 年以上数字图像处理算法编程相关经验。6.项目经验:具有 CBCT 重建算法相关研发经历者优先。 7.思路清晰,具有良好的洞察力和较强的学习能力;工作责任心强,具有良好的抗压能力和团队合作精神。 职能类别:算法工程师软件工程师 微信分享 +前程无忧网,图像,C++开发工程师(图像开发),北京,2-2.5万/月,3-4年经验,本科,民营公司,,岗位职责1、软件模块详细设计2、编码开发3、产品维护4、配合测试组成员进行测试5、编写设计文档6、其他相关研发任务任职资格1、能熟练使用c/c++,基础扎实,深入了解C++多态实现,对内存管理线程模型有深刻了解2、有QT4/QT5/MFC相关开发经验(任意一项即可)3、熟悉OpenGL 4.x或者DX11,以及有图形算法开发经验优先4、能熟练的查阅资料,翻阅技术文档5、至少三年以上实际开发经验 职能类别:C/C++开发工程师 关键字:C++QTMFCopenGL 微信分享 +前程无忧网,图像,AI图像识别工程师,北京,2-3.5万/月,3-4年经验,硕士,民营公司,,1.负责计算机视觉算法和深度学习算法的前沿技术的研发工作;2.利用现有开源深度学习软件构建深度学习系统解决实际问题;3.利用模式识别/机器训练实现复杂场景不同目标的特征提取、识别。任职资格:1.深度学习、计算机视觉识别、模式识别等相关专业,硕士以上学历;2.熟练掌握C/C++/Matlab/Python等常用编程语言,有通用目标识别算法开发项目经验者优先;3.熟悉至少一种深度学习开发框架Caffe、MxNet、Tensorflow、Cuda-convnet、Torch等,具有机器学习算法经验优先;4.具备探索创新能力,能够以独创性思维进行算法研究。 职能类别:其他 微信分享 +前程无忧网,图像,AOI图像处理算法,北京,20-30万/年,5-7年经验,硕士,民营公司,,岗位职责:1、负责TFT-LCD行业Cell段及Module段 AOI设备图像处理算法的研发;2、负责产品及项目的图像处理算法方案设计,功能及模块划分,接口设计,组织团队人员进行各阶段设计,对工作量及人力资源进行策划和估算;3、负责编制算法技术规范;4、负责核心算法的攻关研发;5、负责团队人员的技术总结、交流与指导;6、负责算法系统重大问题分析、制定解决方案、组织人员进行解决;7、负责对图像处理算法技术发展进行规划。任职要求:1、计算机、软件工程、模式识别、应用数学、信号处理等相关专业,硕士及以上学历;2、CET-6 及以上或同等英语水平,听说读写能力良好;3、对机器视觉工作深刻认知;4、有深厚的图像算法、机器学习研发经验;5、具有TFT-LCD行业 AOI设备研发经验,负责过相关设备图像处理核心算法的研发;6、5年以上C/C++开发经验。 职能类别:算法工程师系统架构设计师 关键字:AOI机器视觉图像算法LCD 微信分享 +前程无忧网,图像,数字图像处理算法工程师,北京,1-1.5万/月,2年经验,硕士,民营公司,,岗位职责:从事数字图像处理算法的研发工作。工作经验:至少2年以上,如果你的经验不够,但是有足够的学识,我们依然期待与你交流;任职要求: 精密仪器、机电、光电、物理、数学等专业方向,硕士学历。 喜欢从事算法研究,能独立完成从算法思想到代码实现的过程,抗压能力强。 精通模式识别/机器视觉/深度学习相关专业知识或有相关项目研发经验。 良好的C++语言基础,熟练使用VS/VC开发环境。熟练掌握OPENCV库。北京和众视野科技有限公司是一家专注于光机电软一体化精密仪器研制的高新技术企业。我们先后与中国纺织科学研究院合作开发了纤维细度仪,与中国林业科学院合作开发了光学超景深显微数字成像系统,与公安部物证中心合作开发了扫描式高清文检扫描系统,疑难现场足迹扫描系统等等多种跨学科的复杂系统项目,多年来在相关应用领域我们的产品及服务一直处于技术与市场的主导地位。我们相信:人才是企业的创新之源,创新是企业的生命之源。 心怀理想的你,想做实事的你,期待伯乐的你,请加入和众视野的团队吧! 职能类别:算法工程师软件工程师 关键字:算法工程师 微信分享 +前程无忧网,图像,高级图像算法工程师,北京,1.8-3.5万/月,3-4年经验,硕士,民营公司,,上岗条件:1、硕士及以上学历,模式识别、图像处理、应用数学等相关专业优先。2、要求2年以上机器视觉或图像处理方面工作经验; 3、精通图像处理常用算法原理,熟悉实现方式,包括:图像预处理算法和高级处理算法。4、至少参与过2个机器视觉或图像处理方面项目经验,有C、C++、MATLAB等编程语言4年以上实际编码经验,熟悉opencv、halcon。5、良好的团队精神和沟通能力,很强的逻辑思维能力和学习能力。6、对工作认真负责,注重细节,肯吃苦,顾全大局。岗位职责:1、根据公司产品和业务需求,进行相关图像算法的研究和开发。2、根据图像处理项目具体要求,承担开发任务,制作开发计划,并按计划完成任务目标。3、图像处理算法开发,包括定位测量,形态学处理,图像滤波,三维重建及测量,条码识别、深度学习等算法。 职能类别:算法工程师软件工程师 关键字:大恒图像算法图像处理高级算法高级软件 微信分享 +前程无忧网,图像,图像处理软件开发工程师,北京,1.5-3万/月,2年经验,本科,民营公司,,"岗位职责:1、负责维护现有的软件.2、根据需求,开发新的功能. 任职要求:1、计算机,数学,及相关专业硕士及以上学历.2、具有医学图像处理软件开发经验1年以上.3、熟悉VTK/ITK/Voreen 等框架者优先.4、要求数字图像基础理论掌握良好.5、熟悉CUDA/OpenGL/GLSL 者优先.6、熟练使用C++/C#. 职能类别:软件工程师 关键字:图像处理C++C# 微信分享" +前程无忧网,图像,C++医学图像工程师,北京,1.5-3万/月,2年经验,本科,民营公司,,岗位职责: 1.     负责医学图像处理算法的开发、设计和优化; 2.     设计和开发医疗机器人设备影像系统和应用组件的软件。 参与软件开发的整个周期 3.     与系统工程师合作,研究系统/组件解决方案并定义系统/组件要求和体系结构 4.     定义软件需求和架构 5.     负责软件的详细设计与实现 6.     负责测试用例设计并参与测试执行   教育背景和经验: 1.     计算机科学或相关专业,本科及以上学历 2.     两年以上C/C++软件开发经验   任职要求: 1.     具备医学图像处理的项目经验,对算法有钻研能力; 2.     熟练使用C++语言,熟悉Visual Studio; 3.     具有面向对象的分析和设计经验,熟悉UML 4.     良好的软件工程基础和良好的软件研发实践 5.     具有ITK、VTK或OpenCV中一项或多项开发经验者优先; 6.     具有DICOM图像相关开发经验者优先 7.     具有QT开发经验者优先   个人特征: 1.     诚信,责任心,上进心,团队合作 2.     以技术为导向,愿意以技术作为事业的发展方向   职能类别:C/C++开发工程师 微信分享 +前程无忧网,图像,图像视觉工程师 (MJ000324),北京,1-1.6万/月,在校生/应届生,本科,外资(欧美),,工作职责:-         负责图像视觉相关算法的研究与工程化落地-         项目相关工具的开发以及案例的分析与改进   期望要求:1、具有数学、计算机、计算机视觉等相关专业在读本科或以上学历; 2、良好的编码能力、对数据结构和算法有较好理解,熟练使用python以及C/C++语言;3、熟悉经典CV中的常用操作,熟悉OpenCV; 4、良好的机器学习基础,有深度学习具体项目经验者优先;  5、了解 3D 视觉算法者优先。 职能类别:C/C++开发工程师 关键字:图像视觉 微信分享 +前程无忧网,图像,软件工程师(图像算法),北京,1-1.8万/月,1年经验,本科,民营公司,,岗位职责:1、负责图像识别、图像分割、图像故障检测等核心算法的研究、实现与性能提升;2、图像处理、图像识别以及图像故障检测算法的实现及优化;3、图像处理、机器视觉前沿技术探索及提案;4、深度学习模型的参数调试。任职要求:1、大学本科及以上学历,计算机相关专业,一年以上图像工程项目研发经验;2、熟悉常用的图像处理算法、熟悉常用的机器学习算法及其在图像识别中的应用;3、熟练使用Python语言,熟悉包括OpenCV/NumPy/sklearn以及tensorflow/pytorch/caffe深度学习框架的使用;4、熟练掌握至少一门面向对象开发语言,并有过相关代码编写经历;5、有图像处理以及机器学习的相关项目经历,在图像处理、计算机视觉或机器学习领域发表过高质量论文的优先考虑。6、较强的学习、分析问题的能力,良好的团队合作意识与跨部门沟通的能力。 职能类别:软件工程师 微信分享 +前程无忧网,图像,图像算法工程师,北京,10-30万/年,硕士,,民营公司,,1、图像处理算法的设计与开发。 2、技术文档及手册的编制与整理。任职要求:1、本科及以上学历,图像处理、信号处理相关专业;若是数学专业毕业,从事过图像处理研发的***。(计算机、电子、自动化及相关专业。)2、应届生或在职均可。3、良好的数学功底,具有数字图像处理专业基础,熟悉常用的图像处理方法,有图像处理软件开发经验,有医学或工业辐射成像图像处理研发经验者优先。4、一年以上C/C++项目开发经验,具有良好的编程基础和编程风格,熟悉面向对象设计方法,熟悉VC开发环境,熟练使用MATLAB的优先、熟悉Opencv的优先。5、良好的团队精神和沟通能力,较强的逻辑思维能力和学习能力。 6、良好的英文阅读、理解、文字表达能力。 职能类别:算法工程师软件工程师 关键字:算法C/C++ 微信分享 +前程无忧网,图像,图像处理/算法工程师,北京,1.2-2万/月,在校生/应届生,博士,民营公司,,"岗位职责:1、负责焊接机器人项目的图像处理系统的关键技术研究,包括但不限于:焊缝图像获取、焊缝检测、焊缝识别、焊缝跟踪等;2、负责焊接机器人项目的图像处理及识别相关算法的研发和工程实现,并负责相关技术的产品化;3、负责完成相关技术的研究项目申请、技术报告撰写、专利申请等;4、与负责焊接机器人项目的其他各模块工程师协同完成系统集成和调试工作。任职资格:1、 计算机或电子类相关专业,博士学历;2、 数学基础扎实,具有良好的C/C++、Matlab或Python编程能力,熟悉OpenCV计算机视觉库;3、 熟练掌握计算机视觉和图像处理相关的基本算法及应用,熟悉常见的机器学习算法;4、 熟练的英语文献阅读能力,能快速实现文献中的算法;5、 工作积极主动,责任心强,具有积极的学习态度和创新精神,良好的团队的合作意识和组织能力;6、 在计算机视觉、图像识别等国际***会议或者期刊上发表论文、相关国际比赛获奖、及有相关专利者优先;7、 有嵌入式软件系统开发经验者优先。 职能类别:软件工程师 微信分享" +前程无忧网,图像,图像算法工程师,北京,1.5-2万/月,1年经验,硕士,民营公司,,一、岗位职责:1、现有算法的更新维护;2、算法的c/c++代码实现、优化及移植;3、算法产品化过程中的现场测试;二、岗位要求:1、数字图像处理或模式识别相关专业研究生,一年以上实际工作经验;2、熟悉常用数字图像处理算法,机器学习算法和模式识别算法;3、具有车牌识别、车辆检测、车标识别、车型识别等相关开发经验的优先;4、从事过智能交通、安防监控、图像分析或智能视频相关行业者优先;5、具有较强的编程能力, 精通c/c++编程;6、良好的英文阅读能力;7、有责任心、严谨细致,有良好的创新意识和团队精神;三、学历: 硕士及以上四、工作经验:一年以上 职能类别:算法工程师高级软件工程师 微信分享 +前程无忧网,图像,图像算法工程师,北京,3-4万/月,3-4年经验,本科,民营公司,,岗位职责: 1. 负责图像识别技术,尤其是OCR技术的研发和优化 2. 负责沟通、承接和实施图像处理、识别业务的需求 岗位要求: 1. 为人踏实负责,具有团结合作精神; 2. 本科及以上学历,工作5年及以上; 3. 掌握c/c++语言,熟悉常用算法、数据结构和设计模式,熟练使用openCV; 4. 1年以上图像处理、识别经验,包括但不限于:传统图像处理算法,特征描述提取、图像匹配、目标定位、图像分析等,擅于特定背景或样本的算法设计和方案定制; 5. 有OCR项目经验者优先 6. 有机器学习背景者优先 职能类别:算法工程师高级软件工程师 关键字:图像识别算法工程师图像处理 微信分享 +前程无忧网,图像,图像识别软件研发,北京,0.8-2万/月,硕士,,国企,,职位描述:1. 参与图像产品的需求分析、方案设计、方案验证、产品设计、产品研发、产品优化等部分或所有环节。    2. 从与客户的交流中提取需求信息,帮助用户明确真实需求,并转化成图像产品蓝图。    3. 根据产品蓝图设计软硬件方案,验证技术关键点,对硬件提出具体需求,对相关技术的适应范围做出评估。    4. 从图像算法设计的角度对产品设计提供支持,从客户使用产品的角度对产品设计提供建议。    5. 负责具体的图像算法设计、编码、调试、离线与在线测试过程,持续优化算法性能。    6. 跟进产品的使用情况,适时更新图像算法,并从图像中分析设备状态和故障隐患,及时预警。任职资格:1. 具备良好的团队协作攻关能力,思路清晰,乐于学习和分享,责任心强,勤奋进取。    2. 一本院校全日制硕士研究生及以上,数字图像处理相关专业,了解自动控制、电路设计者优先。    3. 熟练使用C++和OpenCV作为图像研发工作的主要工具。    4. 熟练使用Linux操作系统,Ubuntu优先。    5. 熟练使用Python或Matlab作为图像研发工作的辅助工具。    6. 阅读并理解英文专业文献、技术手册和帮助文档。    7. 英语六级,计算机三级,会使用MySQL、Oracle数据库者优先。薪资待遇:1.提供具有竞争力的薪酬和丰厚的奖金福利;2.为优秀的应届硕士毕业生提供北京市户口。 职能类别:算法工程师高级软件工程师 关键字:图像处理带薪年假奖金丰厚出差补贴包住宿高温补贴提供班车 微信分享 +前程无忧网,图像,图像算法工程师,北京,3-4万/月,无需经验,,民营公司,,岗位职责1、主要是对扫描图像的算法进行处理2、图像高清、扫描文档自动纠偏、扫描图片去污点等(涉及到算法)3、通过机器学习等手段提取图片内重要信息任职要求1、人***在上海,并且有充裕的时间,如果人不在上海(最少一周能到一次公司)2、必须按时完成公司安排的任务,任务量不会太大3、可以是全职也可以是***、还可以是在家办公,方式可以自由选择(只要能按时完成任务)4、必须是对图像算法有深入研究的大神5、至少熟悉一种主流图像算法库 职能类别:算法工程师软件工程师 微信分享 +前程无忧网,图像,图像算法工程师,北京,1-2万/月,2年经验,硕士,国企,,从事医学图像处理交叉领域的算法研究与应用。岗位要求:1、获得计算机或相关专业硕士及以上学位,在医学影像或病理图像方面有相关软件算法开发经验者优先。2、有扎实的计算机科学专业基础知识,能够把握相关领域的国际前沿发展趋势,已发表一定数量和质量的科研论文,或申请有技术发明专利,对科研有浓厚兴趣,或参与过相关系统的研发。3、熟悉图像处理、计算机视觉、机器学习(特别是深度学习)等方向的一项或几项。4、具有较强的编程开发能力,能够熟练运用Python、Matlab、OpenCV或C/C++等语言的一项或几项开发程序。 5、具有独立工作能力,良好的团队合作意识,较强的沟通能力,以及敬业和钻研精神。 职能类别:算法工程师多媒体开发工程师 关键字:医学图像处理算法研究 微信分享 +前程无忧网,图像,软件工程师,北京,0.9-1.8万/月,2年经验,本科,民营公司,,岗位职责:1、从事仪器应用软件的开发工作;2、负责公司相关模块或产品软件的升级与维护工作;3、负责公司其他研发部门所需内部软件的开发工作;4、协助对公司其他部门提供软件使用的技术咨询。任职要求:1、全日制本科及以上学历,信息技术、电子、数学、计算机等相关专业,具有一年以上C/C++软件开发工作经验;2、熟悉Windows或Linux平台下应用软件开发,有多线程编程经验;3、精通C/C++语言,熟悉Qt或MFC的使用,熟练使用VS或Qt Creator进行软件开发,动态库开发,有界面开发经验;4、具有较强的逻辑分析能力和学习能力,责任心强,能独立负责相关业务;5、计算机基础知识扎实,熟悉常用数据结构、算法;6、有过相机开发经验,熟悉图像处理基本算法优先考虑。 职能类别:C/C++开发工程师 微信分享 +前程无忧网,图像,CPUBJ-08 X86系统优化工程师 (职位编号:CPUBJ-08),北京,,硕士,,国企,,【职责描述】1. 研究和开发模式识别、图像处理、压缩等领域的相关算法。2. 基于兆芯x86平台的特性对通用Linux应用程序进行性能优化。3. 在兆芯x86系统上搭建基于OpenStack、Ceph、Docker等开源软件的云平台,对云平台的性能进行分析以及优化。4. 客户支持以及开源云平台在兆芯x86系统上的适配。【任职要求】1. 计算机或者电子工程相关专业,硕士及以上学历,博士优先。2. 对算法研究具有强烈的兴趣,有模式识别、图像处理、压缩等领域的相关算法有研究者优先。3. 对性能优化的工具和方法有一定了解者优先。4. 熟悉开源云平台的相关技术,有部署开源云平台及其性能优化经验者优先。5. 具有良好的学习能力/沟通能力。 职能类别:研究生软件工程师 微信分享 +前程无忧网,图像,java开发-LINE(外企正编,日韩版wechat),北京,1.5-3万/月,3-4年经验,本科,民营公司,,"想回大连发展,厌倦996,想逃离北深杭的同学一定要往下康康!!!!!非外包、猎头项目,正编(非统招全日制本科、非互联网行业的童鞋勿投)LINE是全球三大即时通讯软件之一,于2011年6月正式推向市场。上线后迅速风靡全世界,支持17种语言版本,覆盖220多个国家和地区,全球用户突破5亿,下载量超过10亿。涵盖语音视频通话,手机游戏,新闻资讯,音乐,电子商务等服务,拥有超越一般即时通讯软件的运作模式。LINE Corporation总部位于日本。自2011年6月发布LINE以来,LINE Corporation一直将其业务核心放在LINE服务上,并积极推动该服务在全球范围内的进一步拓展,以及LINE平台的加速开发。LINE China大连研发中心作为LINE在全球的5个研发中心之一,研发团队以其精湛的技术能力,主要负责LINE platform的基础研发功能及LINE GAME Service相关平台产品的研发业务。其业务内容涵盖了AI,Timeline,图形开发,LINE基础平台,LINE游戏开发者平台,LINE自动化测试平台等产品的研发工作。福利待遇:基本不加班(弹性855,加班会有加班费)薪酬福利:基本工资+餐补+绩效奖金+法定加班费+其他?-五险一金+商业保险(补充医疗保险配偶&未成年子女都可享受)-逐年递增的带薪年假,奖励休假-免费早餐, 下午茶,健身器材-年度Outing,Team Outing,员工俱乐部-环境简单,技术导向java开发工程师岗位职责:负责LINE软件相关高并发、高可用、分布式服务端系统的架构设计及开发。主要包括TIMELINE、机器学习开放平台、AI 文字检测及图像识别等产品。岗位要求:1. 3年以上的java开发工作经验,有互联网行业开发经验的优先。2. Java基础扎实,熟悉Java虚拟机原理、Java高级特性和类库、Java网络与服务器编程、Java多线程编程。3. 精通分布式架构,熟悉主流的微服务框架,如Spring Cloud、Dubbo、Zookeeper等,并精通其原理。4. 熟练掌握主流的中间件,如mysql,redis,hbase,mongodb,kafka,elasticsearch等,并了解原理。5. 优秀的web前端js技术,熟练掌握jquery、reactjs、vue等前端框架。6. 研究过HTTP协议、缓存、JVM调优、序列化、NIO、RPC框架等,并且有相关实践经验。7. 了解Docker和Kubernetes技术,有运维能力,有Kubernetes二次开发经验的优先。8. 扎实的计算机网络、数据结构、操作系统、算法等基础知识。9. 较高的技术钻研能力、技术攻关能力,分析问题解决问题的能力,能独立承担任务和有系统进度把控能力,能够独立负责跨组项目,并保证结果。10. 具备良好的编码习惯和技术文档编写能力,可阅读英文技术文档,具有很强的沟通能力。加分项:1. 有一线或二线互联网公司工作背景。2. 有过高可用,高并发项目经验。3. 对技术有追求,善于思考总结技术问题,有自己的技术博客。4.除岗位要求外,涉及到以下技术栈会优先:Python/GO/Kafka/ES/ZooKeeper地址:大连市甘井子区火炬路3号【纳米大厦】 职能类别:Java开发工程师 关键字:java 微信分享" +前程无忧网,图像,软件工程师,北京,1.2-2万/月,2年经验,本科,上市公司,,工作内容:1、 完成软件需求调研,设计文档等过程文档编制并按照软件规范要求输出相关过程文档。2、 完成软件模块的代码编制和自测。3、 协助测试完成软件测试,进行Bug修复,按照部门要求进行软件质量控制。4、 善于主动发现问题,提出合理化建议,积极提出优化项目开发手段。5、协助进行团队技术管理和软件技术平台建设。岗位职责:1、精通C\C++或WPF语言,熟练使用VStudio开发环境。2、熟悉数据库操作,对SQL等基本操作、触发器、存储过程等有较好的理解。3、熟悉Windows操作系统消息触发机制。4、熟悉串口、TCP/IP网络编程,多线程环境下编程方法和规则。5、熟悉常用数值,图像处理算法,有较好的算法基础。 职能类别:软件工程师 微信分享 +前程无忧网,图像,人工智能类-计算机视觉工程师-北京,北京,,本科,,民营公司,,工作职责:1、CV算法的研发,包括但不限于目标识别、目标跟踪、图像质量检测、视频分类、人脸识别、语义分割、语义理解、SLAM、3D视觉等;2、CV算法在实际应用领域的性能优化;3、CV前沿算法跟进与研发。任职要求:1、本科及以上学历, 计算机、软件工程、机器学习、应用数学、模式识别、人工智能等相关专业;2、熟练掌握C/C++、Python等编程语言;3、熟悉OpenCV,以及图像处理基本方法;4、熟悉深度学习基础知识和图像分类、目标检测的经典网络模型;5、有学术比赛经验以及发表过顶会论文者优先。 职能类别:软件工程师 微信分享 +前程无忧网,图像,VB开发工程师,北京,1-2万/月,3-4年经验,大专,民营公司,,岗位职责:1、专科及以上学历,计算机相关专业2、3年以上VB编程经验,熟练使用SQLServer数据库;3、具有很强的面向对象设计能力,熟悉UML和设计模式;4、良好的客户沟通能力;5、熟悉C#、Dicom图像处理优先6、有医疗信息系统开发经验优先 职能类别:软件工程师 微信分享 +前程无忧网,图像,软件开发工程师,北京,1.5-3万/月,5-7年经验,本科,民营公司,,一、岗位职责:1、负责公司机器视觉检测设备的软件设计、开发、维护和测试。2、根据公司软件开发流程,编写各种开发文档;3、根据客户与公司需要出差,参加培训,为客户提供技术支持,参与产品与系统问题的分析与排查。二、任职要求:1、本科及以上学历,计算机、软件相关专业;2、5年以上软件开发经验,具有工业检测、机器视觉、图像识别、深度学习等领域的相关背景经验优先。3、熟练掌握C#编程,了解C++编程;4、熟练掌握常用数据结构和算法;5、熟练掌握Windows下Visual Studio编程环境,有良好的编程风格;6、熟悉硬件设备的编程,动手能力强;7、学习上进,爱岗敬业,善于沟通合作,工作责任心强。满足以下任意条件者优先考虑:1、 C++编程经验;2、 多线程编程经验;3、 数据库编程经验;4、 通讯协议编程经验;5、 嵌入式硬件系统的二次开发。项目经验丰富,相关学历、工作经验都考虑放宽。 职能类别:高级软件工程师 关键字:机器视觉目标检测 微信分享 +前程无忧网,图像,智能语音-3D虚拟数字人C++引擎开发,北京,3-6万/月,5-7年经验,本科,外资(非欧美),,项目介绍搜狗智能语音项目致力于打造业界领先的以语音为主的多模态输入、理解以及表达的人工智能技术。“AI合成主播”是在搜狗“分身”技术的支持下,通过人脸关键点检测、人脸特征提取、人脸重构、唇语识别、情感迁移等多项前沿技术,并结合语音、图像等多模态信息进行联合建模训练后,生成与真人无异的AI分身模型。该项技术能够将所输入的中英文文本自动生成相应内容的视频,并确保视频中音频和表情、唇动保持自然一致,展现与真人主播无异的信息传达效果。职位职责1、负责数字人项目3D引擎的开发与性能提升;2、与算法、美术、产品等团队协作,共同推进数字人产品的应用落地;3、研究前沿渲染技术,持续探索新的3D数字人技术。职位资格1、热爱图形学,有良好的代码编写习惯,熟练使用数据结构与算法;2、三年以上游戏引擎相关开发经验,支持过至少一款已上线游戏;3、精通UE4等商业引擎以及各类图形引擎渲染管线技术;4、熟练阅读英文资料。具备以下条件者优先考虑:a、有发表图形学论文者; b、有参与过3A级游戏开发(PC、手机、主机均可)。 职能类别:C/C++开发工程师 关键字:UE4C++3D引擎开发 微信分享 +前程无忧网,图像,阿里健康-iOS技术专家 (职位编号:GP662002),北京,,5-7年经验,本科,上市公司,,1.参与公司在移动端的业务需求分析、技术方案设计和研发工作,按计划完成功能开发和交付;2.参与移动端基础框架研究、设计和实现,主导关键技术验证和选型,参与效能工具建设;3.主动关注并学习新技术,并能够主导新技术在健康业务场景落地。1.热爱计算机和互联网技术,热衷于解决挑战性的问题,追求极致的用户体验;2.3年以上iOS开发经验,有丰富的客户端应用架构经验,可以独立承担架构设计,并主导项目;3.熟悉iOS系统框架,熟悉常用的开源库,并知晓其背后的实现原理;4.深入理解OC语言特性,熟悉常用的开发模式,在程序性能优化、稳定性方面有较深理解;5.有高度的工作热情和自我能动性,项目、技术推动和执行能力强,有团队合作精神;6.有创新业务技术攻关和落地能力者优先(不限于算法、生物识别、图形图像、3D建模、AR、多媒体等领域);7.有互联网医疗、人工智能、机器学习等领域项目背景者优先考虑。 职能类别:软件工程师 微信分享 +前程无忧网,图像,应用开发工程师(视觉AI方向),北京,1.5-2万/月,2年经验,本科,外资(非欧美),,工作职责:1. 负责深度学习和图像处理算法在不同硬件平台的适配、部署与调优;2. 负责内部深度学习和图像处理基础工具链的研发。3. 负责各种操作系统下的交互应用的开发;4. 负责系统软件开发,技术攻坚和性能优化。任职资格:1. 本科以上学历,计算机相关专业,计算机基础扎实,具备良好的编程能力和良好的编程习惯;2. 熟悉C++的现代特性和常用模式,熟悉STL标准库;3. 熟悉常见的图像处理算法,熟悉OpenCV等图像处理库;4. 有良好的代码开发风格和软件工程思维,熟悉Git、CMake等开发工具;5. 了解深度学习算法的原理,熟悉在任意平台(x86/ARM/CUDA)上的任意一种深度学习算法部署框架者优先;6. 熟悉Qt工作机制,熟练掌握Qt布局,Model/View,自定义控件和QML者优先;7. 具有工业AI软件开发和部署经验者优先;8. 善于沟通,有较强的团队意识和责任心。 职能类别:C/C++开发工程师 微信分享 +前程无忧网,图像,对日软件工程师(大学毕业生),北京,1.5-2万/月,在校生/应届生,大专,民营公司,,"【应聘条件】: 1.计算机或相关专业大专以上学历 2.熟悉对日软件项目开发过程,确保开发的规范性 3.精通JAVA,C++,C#,VB.NET,PHP,Python等一种以上开发语言 熟悉cvs、svn等版本管理工具 PHP语言开发者 - 熟悉LAMP环境,熟悉Cake,O/R Mapping,XOOPS,Eclipse, Subversion, phpMyAdmin,redmine等环境及开发工具,有EC开发经验者优先 C/ C++语言开发者 - 精通Linux下C/C++程序的开发,有图像处理经验者优先 JAVA语言开发者 - 熟悉HTML/XHTML、CSS、Javascript、AJAX等Web页面技术 熟悉Apache、Tomcat、Jboss等Web应用服务器的部署和配置,有FLEX,J2EE开发经验者优先 C#,VB.NET语言开发者 - 熟练使用Visual Studio 2008 等开发工具,熟悉B/S及C/S的多层架构设计及开发 精通javascript/html/css/xml等技术,对JQuery 或 Ext JS有所了解 4.有AWS或AI或Salesforce开发经验者或资格者优先(待遇提升) 5.能够配合(在日的中国)项目经理的工作 6.日语(日语达到2级或J.TEST実用日本語検定B級水平,有书面沟通能力) 7.接受简历语言:中文/日文 【待遇】: 补助:有加班补助、交通费补助、住房补助、考试资格补助、 全勤奖补助 休息日:每周休息2天(星期六、星期日、法定假日休息) 5月的黄金周、 年终等有连续休假等年122天以上休息日 有带薪休假(有半天休假制度)年10天-20天、 婚丧嫁娶等特别休假制度 工作时间:9:00~18:00(休息时间12:00~13:00)实际工作时间为8小时有到日本学习和深造的机会 职能类别:软件工程师 关键字:软件开发计算机系统开发java日语工程师 微信分享" +前程无忧网,图像,C ++开发工程师,北京,2-4万/月,3-4年经验,本科,民营公司,,岗位职责: 1、 负责x86平台(windows、linux系统等)、ARM平台(RK、高通等)等平台下算法移植、测试和系统软件的架构设计、软件开发及方案编写; 2、 负责系统性能优化,包括系统稳定性设计; 3、 为其他部门提供所需要的技术支持; 4、 负责给客户进行定制化开发; 任职资格: 1、 本科以上相关专业,计算机、通信、电子、自控或相关专业本科及以上学历; 2、 有3年及以上C++软件开发经验; 3、 精通C/C++编程; 4、 有图像处理和机器视觉算法开发、工程化经验优先; 5、 具有良好的团队意识和责任心,积极主动完成工作。 职能类别:C/C++开发工程师 微信分享 +前程无忧网,图像,研发主管,北京,1-2万/月,3-4年经验,本科,外资(欧美),,学历要求:具备本科以上学历,良好的英语阅读能力。计算机相关专业毕业。 任职要求: 本科3年以上工作经验,计算机相关专业。3年以上使用C++程序开发的经验,熟悉MFC,熟悉VC6,VS2010或以上VC开发环境2年以上使用用C#程序开发的经验,熟悉WinForm编程,熟悉各种控件的使用。有多线程开发经验,熟悉并行处理有网络通信和SOCKET编程经验熟悉WINDOWS SDK熟悉Windows桌面应用程序开发,有图形界面GDI开发经验熟悉ASP及Web开发熟悉数据库系统(SQLServer),能熟练使用SQL语言、存储过程。有一定的VB,VBA开发经验有较强系统架构分析和设计能力有安装盘制作经验(InstallShield使用经验)优先有图像处理和图像识别相关知识的优先对石化行业流程仿真有一定了解的优先有项目开发和管理经验   工作内容: 1、Gpres仿真平台的开发、维护、改进和技术支持 2、Web开发 职能类别:高级软件工程师 微信分享 +前程无忧网,图像,C++高级开发工程师,北京,1.5-2.4万/月,3-4年经验,本科,民营公司,,岗位职责:1、参与视觉识别类、大数据平台类产品开发项目组;2、负责软件产品相关模块的设计和开发;3、逐步参与新产品的规划;4、根据个人的特点,未来发展方向:产品经理、研发项目经理、产品架构设计师、行业专家。任职要求:1、具备3年以上C++开发经验,熟悉VS系列或LINUX QT开发环境,有界面(例如MFC或QT)开发经验;2、精通STL、熟悉部分boost库的用法;3、熟悉通信机制,对TCP/IP通信、串口通信,有多线程方面开发经验;优先考虑:1、熟悉主流GIS系统以及GIS地图开发技术优先;2、具备计算机视觉基础,熟悉目标跟踪、目标识别、图像增强等常见图像处理算法,具备算法应用能力优先;3、具备流媒体开发经验,熟悉海康等主流视频厂商SDK优先;4、有相关经验者优先考虑:数据库开发、boost库应用、Python开发,场景文本检测/识别、图像处理、深度学习等。福利待遇:六险一金(入职即缴纳五险一金+商业保险)+年终奖+ 定期体检 + 节日福利 + 带薪年假 + 定期团建 + 餐补、通讯补、交通补助 + 内训、外训等人员培养机制 职能类别:C/C++开发工程师 微信分享 +前程无忧网,图像,C++开发工程师 (职位编号:201712-19),北京,0.5-1.5万/月,2年经验,大专,上市公司,,岗位职责:1、使用MFC进行界面开发;2、使用VC++编写程序;3、会QT开发优先4、编写软件开发相关文档;5、在项目经理的安排下按时完成项目的开发。 任职要求:1、熟悉使用Visual Studio开发平台,熟悉MFC和Windows API2、如有图像识别处理类项目技术经验者优先考虑 职能类别:软件工程师 微信分享 +前程无忧网,图像,三维引擎研发工程师,北京,2-3万/月,3-4年经验,硕士,上市公司,,岗位职责:1、负责为公司三维产品提供底层开发接口支持;2、从事三维渲染优化、多线程优化、UI可视化编辑及脚本化等开发工作;3、三维系统相关的外部设备集成开发;4、跟踪图形、图像领域的前沿技术并实用化;5、完成上级领导交办的其他任务。任职要求:1、全日制硕士及以上学历, 计算机、软件工程等相关专业;2、具有3年以上DirectX9.0c或OpenGL的开发使用经验,熟悉DirectX11、DirectX12、Vulkan等API优先;3、具有编写Shader3.0及以上版本的经验(HLSL或GLSL均可);4、具有三维引擎的2年及以上的开发经验,有UnrealEngine3/4的研发经验优先;5、具有C++编程3年以上经验,熟悉线程池、内存池的优先,有跨平台开发经验优先;6、熟悉Git源代码管理库的使用; 7、具有良好的文档编写、团队协作能力,具有强烈的工作责任心。 职能类别:软件工程师 关键字:三维渲染DirectX9.0cOpenGLShader3.0C++Git源代码 微信分享 +前程无忧网,图像,软件开发工程师/算法工程师 (职位编号:02),北京,1-2万/月,3-4年经验,本科,民营公司,,"技能要求:嵌入式,机器学习一、     基本技能1、 编程基本功扎实掌握C/C++/JAVA等开发语言、常用算法和数据结构、熟悉TCP/UDP网络协议及相关编程、进程间通讯编程。2、 专业基础知识全面、扎实的软件知识结构,掌握操作系统、软件工程、设计模式、数据结构、数据库系统、网络安全等专业知识。3、 岗位要求(1) 了解MYSQL及SQL语言、编程,了解NoSQL, key-value存储原理;(2) 了解Python/Shell/Perl等脚本语言;(3) 熟练掌握Git/SVN代码管理工具和敏捷开发流程;(4) 熟悉常用的设计模式;4、 机器人嵌入式系统软件开发人员要求:(5) 精通C/C++/Python。(6) 精通Linux程序架构设计;精通Linux高级编程。熟练掌握网络协议编程,精通多线程/多进程编程。(7) 熟悉ROS机器人系统技术体系,熟练掌握ROS开发工具。熟悉ROS系统架构和模块开发,熟悉ROS仿真环境,ROS系统移植。(8) 熟悉硬件模块:camera、GPS、串口,熟悉各种通信接口,如CAN、UART、SPI、I2C、Ethernet。能够融合移植基于ROS系统的激光、视觉、红外等传感模块。(9) 了解机器人运动控制、定位、导航、语音等算法。二、基本素质1、 团队精神和协作能力协作能力作为是程序员应该具备的最基本的,也是最重要的安身立命之本。在进入商业化和产品化的开发任务,缺乏这种素质的人就完全不合格了。2、 文档习惯良好的文档是正规研发流程中非常重要的环节,作为代码程序员,30%的工作时间写技术文档是很正常的,而作为高级程序员和系统分析员,这个比例还要高很多。缺乏文档,一个软件系统就缺乏生命力,在未来的查错,升级以及模块的复用时就都会遇到极大的麻烦。3、 规范化标准化的代码编写习惯作为一些外国知名软件公司的规矩,代码的变量命名,代码内注释格式,甚至嵌套中行缩进的长度和函数间的空行数字都有明确规定,良好的编写习惯,不但有助于代码的移植和纠错,也有助于不同技术人员之间的协作。4、 需求理解能力可以快速理解项目需求,以及自身要做的内容处于项目的位置,要有全局的掌握能力。性能需求指标中,稳定性,并访支撑能力以及安全性都很重要,作为程序员需要评估该模块在系统运营中所处的环境,将要受到的负荷压力以及各种潜在的危险和恶意攻击的可能性。5、 复用性复用性设计,模块化思维就是要程序员在完成任何一个功能模块或函数的时候,要多想一些,不要局限在完成当前任务的简单思路上,想想看该模块是否可以脱离这个系统存在,是否可以通过简单的修改参数的方式在其他系统和应用环境下直接引用,这样就能极大避免重复性的开发工作。6、 测试习惯测试工作实际上需要考虑两方面,一方面是正常调用的测试,也就是看程序是否能在正常调用下完成基本功能,这是最基本的测试职责;第二方面就是异常调用的测试,比如高压力负荷下的稳定性测试,用户潜在的异常输入情况下的测试,整体系统局部故障情况下该模块受影响状况的测试,频发的异常请求阻塞资源时的模块稳定测试等等。7、 学习和总结的能力善于学习,对于任何职业而言,都是前进所必需的动力。善于总结,也是学习能力的一种体现,每次完成一个研发任务,完成一段代码,都应当有目的的跟踪该程序的应用状况和用户反馈,随时总结,找到自己的不足。8.精通Windows和Android操作系统下QT开发(C++) 职能类别:高级软件工程师算法工程师 关键字:软件开发人工智能算法机器学习深度学习图像处理软件工程师机器人 微信分享" +前程无忧网,图像,C++高级开发工程师(北京入职),北京,1.2-2.5万/月,5-7年经验,本科,民营公司,,岗位职责:1、参与版式文档跨平台工具版本研发2、参与版式文档相关SDK开发和维护3、项目实施支持任职要求:  1、3-5年以上相关工作经验(须有两年左右OFD版式文档开发经验),全日制本科及以上学历;  2、熟练掌握C++语言,并能够编写高质量的代码,具有一定的架构设计能力;  3、有跨平台应用开发经验者优先;  4、有UI开发经验,熟悉 QT者优先;  5、熟悉图形图像知识及相关算法或字体处理技术者优先;  6、熟悉数据结构与算法, 熟悉内存管理、以及性能相关问题并有常用的密码学知识;7、具备良好的发展潜力并能够适应工作变化及要求,具备团队精神,能够配合他人积极完成相关工作。 职能类别:C/C++开发工程师 关键字:C++OFD 微信分享 +前程无忧网,图像,C++工程师(视频)G00176,北京,1.2-2.4万/月,3-4年经验,本科,上市公司,,岗位职责:1. 视频显控客户端软件的开发与维护;2. 二次开发平台系统软件的设计、开发;3. 开发、维护音视频编、解码模块;4. 完成软件框架设计、代码编写、功能实现以及后期优化改进;任职要求:1. 本科及以上学历,计算机、电子、通信、自动化、图像等相关专业;3年以上工作经验2. 精通C++面向对象编程,熟练掌握Qt开发技术;3. 熟悉x264/265等编、解码协议,熟练掌握ffmpeg、libx264、libx265等编、解码库的开发技术;4. 掌握RTSP/RTMP/HLS等流媒体传输协议5. 有OpenGL开发经验优先; 职能类别:C/C++开发工程师 微信分享 +前程无忧网,图像,3D相机应用工程师,北京,2.5-3万/月,1年经验,硕士,民营公司,,职责描述:负责3D智能相机相关应用软件(抓取软件、测量软件)的开发;负责客户解决方案的设计和实现。任职要求:数学、计算机、电子等相关专业,硕士及以上学历;能熟练使用Qt、C#、有丰富的C++开发经验;有图像处理、点云处理算法开发经验;有3D抓取、3D测量项目经验者优先;熟悉几款当前领先的3D智能相机软件者优先。 职能类别:算法工程师软件工程师 微信分享 +前程无忧网,图像,区块链高级算法工程师,北京,3-4万/月,5-7年经验,本科,国企,,"职位职责:(主要工作内容的说明,请分条目填写)1、负责图像处理比对,视频比对相关算法研发;2、负责超大数据量、请求量的图片、视频检索系统架构开发设计;3、负责服务端检索架构优化,提升检索系统性能、容量、稳定性等;4、负责服务端架构的开发与改造,以使产品更高效的迭代; 5、负责图片搜索相关产品数据分析平台设计、研发与应用。任职要求:(应包括工作经验、职业技能、所学专业、最高学历、外语语种、优先考虑条件等内容。)1、本科及以上学历,计算机、机器学习、图像算法等相关专业,3年以上大型互联网公司相关工作经验;2、对机器学习算法有较深入的研究和理解,包括各类机器学习和NLP算法,包括Deep learning、GBDT等;3、熟练掌握PYTHON、C++、JAVA、GO等至少一门语言,熟悉数据结构和算法,熟悉OpenCV图像处理;4、熟练掌握一种常见的深度学习框架,譬如TensorFlow或者PyTorch等深度学习框架有相关项目经验者优先;5、对图像特征提取,视频分类,深度学习等方向有项目经验者优先; 6、工程开发能力强 职能类别:区块链开发 关键字:C++算法 微信分享" +前程无忧网,图像,商业发展经理,北京,2.5-3万/月,3-4年经验,硕士,民营公司,,岗位职责:1. 负责国外视觉产品供应商的战略开发,洽谈商务合作。2. 制定合作厂商的全年商业发展计划,并推动公司内部销售业务落地; 3. 与供应商进行日常沟通,支持重点销售项目达成;4. 能够准确分析和理解产品,制定和落实销售推广策略;任职要求:1. 硕士学历,光电子. 微电子. 图像处理. 模式识别或相关专业背景;海外留学背景2. 出色的英语沟通能力及读写能力;3. 强烈的责任心和进取心,能适应紧张的工作节奏;4. 较强的人际沟通和人际解读能力,擅长合作;5. 较好的资源协调,团队协作能力,思路开阔。 职能类别:高级软件工程师 微信分享 +前程无忧网,图像,三维重建医疗工程师,北京,0.5-1万/月,2年经验,大专,民营公司,,1、分析与筛选医疗影像数据(CT、MRI);2、使用医学三维重建软件讲CT/MRI生成得DICOM图像制作成3D模型;3、医院驻场,能与临床医生进行影像数据沟通,了解医生需求,对接与选择医生的医学数据来源;4、协助开发人员对产品的研发、台车的工业设计、以及导板的设计。任职资格:1、大专及以上学历,生物医学工程、医学相关专业,有医疗工作经验者优先;2、熟悉最新医学发展技术,特别是医学影像技术者优先;3、良好的计算机技能,会使用三维设计软件者优先,如mimics;4、良好的沟通能力及解决问题的能力,逻辑清晰,学习能力强。 职能类别:软件工程师 微信分享 +前程无忧网,图像,软件开发工程师,北京,1.5-2万/月,2年经验,本科,民营公司,,1.参与项目软件需求分析和软件概要设计;2.进行软件详细设计和编码实现,确保软件模块开发进度;3.设计软件软件界面布局,实现软件可视化操控;4.开发和维护统一的软件开发架构,发现和解决存在的软件设计问题;5.按软件工作流程编写和提交设计文件和相关文档;6.参与软件系统的调试. 问题整改. 改进完善。任职要求:1. 本科及以上学历,计算机. 模式识别. 电子. 自动化控制. 通信等相关专业;2. 2年以上软件开发经验,视觉软件应用开发经验优先;3. 熟练掌握C\C++语言程序设计,2年以上C\C++软件开发及算法项目开发的工作经验;4. 熟练掌握C#、MFC界面化编程,2年以上C#、MFC软件开发及算法项目开发的工作经验;4. 熟悉OpenGL图形绘制与渲染,有OpenGL开发经验者优先;5. 熟悉计算机图形学的基本原理,了解图像处理相关知识者优先; 职能类别:软件工程师 微信分享 +前程无忧网,图像,C++软件工程师(上海、芜湖),北京,0.9-2万/月,无需经验,本科,民营公司,,"公司国资政府军工背景,发展稳定福利好;国家战略新型企业(航空航天),拥有完整的航电IP和技术,来芜并根据学历过来可享受4~百万人才补贴。五险一金、班车、员工宿舍、食堂、高温假、出国学习及相关福利待遇一应俱全,早九晚五,工作日不加班。岗位职责:从事航电系统应用层软件的开发,包括6大飞行仪表,飞行管理系统,移动地图,航图,EVS(增强视景),SVS(同步视景)等。岗位要求:(1)熟悉C++并有过项目项目经验者,或有过OpenCV/OpenGL/OpenSG相关项目经验者(论文、比赛等有涉及皆可);(2)本科及以上学历,计算机、电子、自动化、航空相关专业;以下为加分项:(3)良好的英文能力;(4)有过地图、图像等相关项目经验者;(5)具有C++图形用户界面应用程序开发经验的;(6)具有以下开发平台使用经验的:QT,Scade,VAPS,GLStudio;(7)具有汽车车载应用程序、人机交互界面开发经验的;(8)有从事航空领域工作经验者。(9)熟悉飞机、航电、适航相关条款经验者。 职能类别:软件工程师C/C++开发工程师 关键字:C++软件工程师软件开发 微信分享" +前程无忧网,图像,上位机软件工程师,北京,1.4-2万/月,5-7年经验,大专,国企,,专业方向:电子、自动化、测控等相关专业。岗位职责:(1)负责公司集成测试系统、电源负载设备、电池测试系统、光电测试系统等产品的上位机控制系统开发工作;(2)编制上位机软件相关的技术文档、项目方案等;(3)领导交办的其它工作。任职要求:(1)5年及以上系统集成、电源负载设备、电池测试系统、光电测试系统等产品的上位机开发经验;(2)精通Labview、VC++中一种编程语言及相关的量产项目经验;(3)精通通讯接口、自动控制、数据处理、运动控制、图像处理中一种及以上;(4)较强的技术文献编写能力,熟悉主流电源测试仪器性能指标更佳。 职能类别:软件工程师 关键字:系统集成 微信分享 +前程无忧网,图像,软件算法工程师,北京,1-2万/月,3-4年经验,本科,民营公司,,岗位职责:1.超声系统各种后处理算法及功能开发;2.超声调图工具的开发;3.负责落实系统部的软件需求;任职资格:1.本科以上学历,有2年以上相关工作经验;2.熟练掌握图像处理算法;3.熟悉算法研究工具Matlab/labview等;4.熟悉c/c++编程;5.熟悉异构编程,gpu编程,掌握openGL/openCL/cuda等异构编程工具; 职能类别:算法工程师软件工程师 关键字:软件算法C++ 微信分享 +前程无忧网,图像,软件工程师(后端),北京,1.5-3万/月,1年经验,本科,民营公司,,"1、负责参与图像数据处理产品的研发工作。2、负责参与三维图像数据处理算法的设计和开发工作。职位要求:1、计算机类相关专业,本科及以上学历2、喜欢编程工作,能采用图像算法解决问题。3、具备1年以上C++或OPENCV语言开发经验。4、能够编写高质量的代码,重视代码的重用和可测试性。有以下工作经验者优先录取:1、熟悉QT,ITK类库。2、使用pytorch, keras, tensoflow开发过视觉AI算法,并实现了产品化。3、参与过github开源项目,并作为项目主要贡献者。4、熟悉常见的2D,3D图像处理算法并有能力做优化。有意者可直接投递简历,我们将尽快与您取得联系,欢迎您的加入!~ 职能类别:软件工程师图像处理工程师 关键字:后端软件工程师图像数据处理编程 微信分享" +前程无忧网,图像,上位机软件开发工程师,北京,1-2万/月,1年经验,本科,民营公司,,岗位职责 1、上位机界面显示、控制、通信软件设计开发 2、参与大系统软件流程调试 3、参与产品软件维护工作,完成更改、故障修正等工作,保证设计质量。 岗位要求 1、本科及以上学历; 2、精通C/C++语言,熟练使用QT平台、VC、VS等开发工具; 3、掌握基于MFC框架的软件界面开发,有Windows平台应用软件开发经验; 4、掌握Windows下的网络通信、多线程操作、图像显示功能开发。 职能类别:C/C++开发工程师 关键字:QT软件开发VC软件开发VS软件开发 微信分享 +前程无忧网,图像,多媒体技术竞争力中心系统工程师3513 (职位编号:003513),北京,3-5万/月,3-4年经验,本科,外资(非欧美),,"岗位职责:岗位职责:1、负责Camera及图像AI软硬件系统分析、系统设计、技术规划;2、负责音频,视频,显示领域软硬件系统分析、系统设计、技术规划;3、负责Camera及图像AI新Feature的方案开发,包括与各功能部门技术方案讨论及落实施跟踪;4、负责音频,视频,显示领域新Feature的方案开发,包括与各功能部门技术方案讨论及实施跟踪;5、负责芯片项目IPD SE流程需求分析、分解、分配。 任职资格:1、计算机,电子等相关专业本科5年以上,硕士3年以上工作经验。2、精通如下一个或多个领域: 有丰富软件开发经验,熟悉Android/Linux多媒体框架, Camera相关***。对软件架构,设计模式等有深刻理解; 熟悉Vision DSP,GPU,NPU硬件结构与软件开发; 对camera模组,镜头/光学,CMOS sensor等有深刻理解。熟悉图像质量评测方法; 熟悉音视频压缩标准; 熟悉图像/视频质量评测方法,音频质量评测方法; 有图像处理算法,计算机视觉算法,图像AI算法开发经验; 有视频处理算法,显示处理算法,音频处理算法开发经验;3、工作态度认真,思维清晰,热爱技术;4、具备良好的团队协作能力和沟通能力。 职能类别:多媒体开发工程师 微信分享" +前程无忧网,图像,C++工程师(CAD模型开发),北京,1.5-3万/月,2年经验,博士,合资,,1.根据项目需求及相关文档开发实现模块2.根据开发计划按时完成开发任务3.完成软件的设计、实现、测试、修改bug等工作 任职要求:1、2年以上C语言开发经验,精通C语言,熟悉linux开发环境,有丰富的数据结构和算法知识。2、有CAD模型相关工作经验者优先3、具有代码优化能力和项目文档编写能力4、良好的代码编写风格5、具有良好的沟通能力和团队精神,能承受一定的工作压力6、有图像相关工作经验者优先。 职能类别:C/C++开发工程师 关键字:CLinuxCAD算法 微信分享 +前程无忧网,图像,C++软件工程师,北京,2-3.5万/月,3-4年经验,本科,民营公司,,岗位职责:1、负责医学图像工作站的设计开发工作,在现有的框架上,实现新功能的完善与软件优化;2、根据产品需求,完成功能模块的独立设计、实现和测试;3、学习并借鉴开源代码中高效完善的方法,对图形图像渲染层进行优化改进;4、负责医学图像算法研究及代码实现。任职要求:1、本科及以上学历,应用数学、图像处理、计算机等相关专业;2、5年以上C++/C开发经验;熟悉多线程,使用过CUDA进行GPU编程经验优先;了解OpenCV、ITK等图像库或具有图像方面算法研究经验优先;3、熟悉windows平台下软件开发、测试流程;熟悉软件界面开发,使用一种或几种界面库,如MFC、QT、DUI等;深入研究过一种或几种图形引擎如VTK、cocos2d、ogre等;熟悉医学影像相关软件或开源软件3DSlicer 、MITK等优先; 4、具备较强的学习能力、团队协作能力、沟通能力、责任意识及上进心。 职能类别:C/C++开发工程师 关键字:医学图像医疗器械 微信分享 +前程无忧网,图像,C ++软件工程师,北京,1.2-2万/月,在校生/应届生,本科,民营公司,,岗位要求:1、C++基础扎实,热爱编程工作。2、能熟练使用Visual C++开发平台进行软件开发。3、了解基本数据结构与算法基础。4、能熟练使用MFC编写图形交互界面。5、具有良好的软件开发规范习惯、团队合作精神,擅于沟通与学习能力的;善于学习,独立思考能力强;6、具有计算机或工程技术类专业背景优先。7、熟悉计算机图形学和计算机三维绘图原理,具备扎实的计算机图像处理基础知识优先8、有OGRE,OSG,vtk或其他3D图形引擎应用效果开发工作经验优先;9、应届生要求C++基础扎实,数据与算法基础好,踏实,性格不偏执!我们提供:1、 我们提供舒适的工作环境;2、 较好的人际氛围;3、一个目标明确的专业化研发团队期待你的加入让我们的团队更加出色!我们提供五险一金+年终奖+旅游+培训+一年多个假期及超长春节假 职能类别:高级软件工程师 关键字:C++MFC 微信分享 +前程无忧网,图像,数据处理,北京,4-6千/月,无需经验,本科,民营公司,,a) 负责各卫星数据归档和恢复任务监测处理,对出错任务进行手工处理。b) 负责各卫星数据上传任务监测处理,针对不同原因,开展相关后续处理。c) 负责各卫星灾备数据备份任务监测处理;对出错任务进行手工处理;d) 负责各卫星数据向主用户传输的监测处理;e) 负责归档、分发盘阵容量的监控;f) 负责数据库状态的监测;g) 负责带库磁带的出入库操作;h) 负责磁带驱动器的定期清洗;i) 配合硬件维护岗完成部分硬件设备维护;j) 负责相关问题的记录及上报;k) 完成领导交办的其他工作。任职要求:1、地理信息、计算机相关专业优先;2、从事过卫星图像处理相关工作者优先;3、本科,接受实习生、毕业有机会转正;居住地在工作地附近的可适当放宽要求工作地点:中国资源卫星应用中心 16号线永丰站附近 职能类别:GIS工程师 关键字:遥感地理信息数据处理图像质检测绘 微信分享 +前程无忧网,图像,FPGA工程师,北京,1.1-2万/月,2年经验,本科,民营公司,,您需要提供以下服务:1、根据项目需求制定技术实施方案、项目计划,编写相关设计文档;2、负责模块代码编写、仿真与调试;3、负责协助系统联调、测试和维护优化等工作。我希望您具备以下能力,并请关注诸多‘优先’的加分项,以便能得到更多的面试机会:1、本科以上学历,电子、微电子、通信、自动化等相关专业;2、熟练掌握VHDL/Verilog硬件描述语言,编程习惯良好;3、熟悉Xilinx或Altera FPGA、SoC,熟练使用对应的Quartus、ISE或Vivado等开发工具;4、有硬件设计和调试基础,熟悉常用接口、总线,能使用示波器、逻辑分析仪等常用调试工具;5、有一定数学基础,能够阅读和分解算法原型,有图像、通信和信号处理类算法移植经验者优先,有大型工程构架经验者优先。6、英语良好,阅读英文资料手册无障碍;7、具有认真的工作态度、积极上进、善于学习,责任心强,有较好的沟通能力和团队合作精神。 职能类别:硬件工程师软件工程师 关键字:FPGA 微信分享 +前程无忧网,图像,高新急聘算法工程师 待遇很好,北京,2-3万/月,无需经验,本科,民营公司,,职位名称:算法工程师 基本要求:计算机或相关专业本科及以上学历 岗位职责:1、负责公司视频推荐系统和用户画像系统推荐算法的研发;负责机器学习平台的搭建;2、持续关注内容数据、推荐规则、推荐算法对推荐效果的影响,持续改善推荐效果指标;3、提供基于数据驱动的功能创新方案,优化用户体验;4、针对具体的场景挑战,研发新的推荐策略和算法,并不断优化效果和性能。任职要求:1. 计算机相关专业本科及以上学历,1年以上相关项目开发经验;2. 熟悉常用机器学习算法和数据结构;3. 熟悉内容推荐、协同过滤、FM等经典推荐算法;4. 熟悉Java/Python/Scala中的至少2种语言;5. 熟悉深度学习算法原理,有TensorFlow开发经验者优先;6. 熟悉Hadoop、Spark、Kafka等计算平台和工具者优先;7. 具备用户画像、排序优化、知识库建设等经验优先;8.有视频行业经验者优先。 职能类别:算法工程师软件工程师 关键字:算法人工智能C++机器学习深度学习图像处理软件工程师机器人 微信分享 +前程无忧网,图像,软件测试工程师,北京,1-2.5万/月,2年经验,大专,民营公司,,"1.负责本公司静态CT产品软件部分的功能和性能测试等;2.依据需求文档及设计文档,编写测试用例;3.根据测试计划,搭建测试环境;4.完成软件的集成测试与系统测试;5.依据测试用例执行手工测试,反馈跟踪产品BUG及用例缺陷;6.完成领导安排的其他工作;任职要求:1.计算机、软件工程等相关专业专科及以上学历,至少2年以上测试工作经验;2.掌握软件测试理论,熟悉软件测试方法、流程和规范,熟练运用各种黑盒测试用例设计方法;3.熟悉 Windows操作系统,了解Linux系统,可以搭建测试环境;4.熟悉所测试系统和应用的需求,并对医疗影像业务比较熟悉;5.具备CT产品软件测试经验,具有CT图像质量质控经验者优先;6.有良好的逻辑分析能力、沟通表达能力和较强的团队合作意识。 职能类别:软件测试工程师测试开发 微信分享" +前程无忧网,图像,软件工程师,北京,0.9-1.6万/月,无需经验,本科,民营公司,,"职位要求:1. 遥感地信背景,有图像信息批处理能力的更好。如果非这个专业的,足够感兴趣也可以;2. 有一定C语言编程基础,会其他语言更好。 岗位职责:高光谱软件的研发工作 工作地点:北京市海淀区安宁庄东路18号光华创业园5号楼 职能类别:软件工程师C/C++开发工程师 关键字:C语言,遥感 微信分享" +前程无忧网,图像,三维重建算法软件工程师,北京,2-5万/月,3-4年经验,本科,民营公司,,"岗位职责:1. 负责公司的三维重建算法研发以及优化;2. 负责基于图片或激光的三维重建算法研发与优化;3. 负责三维重建成果与BIM结合应用的研究开发;4. 与团队内外人员合作,完成整体系统的开发,集成,测试,工程应用和技术支持;岗位要求:1. 具有摄影测量/计算机视觉/计算机图形(图像)学/数学/模式识别等相关专业,211/985 硕士以上2年以上工作经验,能够顺利阅读国外相关的文献和论文;2.熟悉计算机视觉与机器学习领域的基础理论和算法;3.熟练掌握多视图几何学和三维重建技术相关算法,精通OpenMVS,MVE,Colmap,Opencv,Eigen等开源库;4.具有SFM(Structure from motion)、空三、相机标定等相关算法,掌握多种特征匹配算子、平差方法等研发经验;5.熟练掌握C++/Python/MATLAB,代码实现能力强;6.精通Vulkan,CUDA等GPU算法编程优先考虑;7. 喜欢新技术,具备快速学习能力,敢于接受挑战。具备英文阅读能力,善于文献检索与阅读,能快速应用;8. 有较强的逻辑/抽象思维能力,善于分析、归纳、描述、沟通和解决问题,积极参与团队合作;9.积极主动,乐于分享和合作,具有团队精神,沟通能力强; 职能类别:高级软件工程师C/C++开发工程师 关键字:三维引擎渲染引擎软件研发软件开发C++OSGOPENGL 微信分享" +前程无忧网,图像,C++开发工程师,北京,1-1.5万/月,3-4年经验,本科,民营公司,,1 本科以上学历,计算机或相关专业,良好的英文阅读能力,3年以上工作经验; 2 精通C++ 语言开发,熟悉Windows/Linux开发环境,有丰富的数据结构和算法知识,有扎实的代码编写能力和良好的设计能力  3 有丰富的视频编解码及图像处理开发经验,有相关大型C++项目开发经验4热爱编程,注重代码质量,有较强的学习能力,有钻研精神,能及时关注和学习业界技术,能在压力下独立解决问题,有团队合作精神;有以下情况者优先:1 有过计算机竞赛获奖经历。2熟悉FFMPEG、常见多媒体文件格式封装。 3 有过人工智能开发经验,对深度学***流算法有了解。    职能类别:软件工程师 微信分享 +前程无忧网,图像,C++高级工程师/架构师,北京,2-3万/月,3-4年经验,本科,民营公司,,1、基于公司既有产品,架构,设计,领导,及开发新产品平台2、参与公司产品系统设计的讨论并贡献3、运用软件工程,按照软件开发流程需求分析,架构设计,编码等工作4、在公司业务范围内,承担新技术的研究与开发工作;5、协助项目经理进行产品的需求分析,并结合需求分析完成软件的总体设计和详细设计6、上级交给的其他软件相关工作任务。任职资格:1、、计算机、,电子、自动化相关专业正规统招本科以上。2、扎实的C++/C#语言基础及编程经验,良好的软件工程思想,3年以上C++/C#开发经验。3、精通winfrom/wpf界面开发,熟练使用mvvm框架,精通多线程开发,熟练使用依赖注入,熟练使用vs。有软件架构基础的优先4、熟悉图形、图像学的优先;5、良好的英文阅读能力和文档归纳能力;6、强烈的责任心和钻研精神,言行合一;7、优秀的沟通能力和团队合作精神。 职能类别:高级软件工程师 关键字:C++ 微信分享 +前程无忧网,图像,数据库开发工程师,北京,1.5-2万/月,2年经验,硕士,外资(非欧美),,技能要求:MySQL,数据库开发,大数据开发,SQL,数据库架构,Java 岗位职责:1. 全面负责全景病理数据库的搭建工作,拟定详细的设计方案,包括内部平台的前后端架构设计;2. 实施数据库项目的整体开发和单元测试,并协助完成系统上线、维护、优化工作,对进行持续的维护和优化;3. 与数据分析团队协作,面向未来开发符合大型全景病理智能应用场景的数据存储规范;对公司现有的项目数据进行规范化管理,优化数据存储流程,提高管理效率,确保数据安全。任职要求:1. 2年以上数据库开发经验;2. 深入理解 Web 标准,熟悉Javasript/HTML/CSS等前端开发技术,熟练掌握一种或者多种 Vue / React / Angular 等前端框架;3. Java基础扎实,熟悉微服务的基本原理,掌握SpringCloud、SpringBoot等微服务框架的原理及调用;4. 熟悉MySql,精通SQL语言;5. 熟悉Linux操作系统,熟练使用常用指令及shell,熟练使用代码管理工具 GIT 或 SVN;6. 熟悉 Web 开发技术栈,有Web服务器设计和实现经验;7. 有数据产品开发经验者优先,有海量图像存储应用开发经验者优先;有自己的技术产品、开源作品,或活跃的开源社区贡献者优先。 职能类别:大数据开发工程师 关键字:数据库开发 微信分享 +,自然语言处理,直招跟船保安高薪包吃包住五险一金,北京,7000-15000,不限,不限,民营,家政|保安|物业|淘宝, +华北人才网,自然语言处理,招聘房产经纪人,北京,8000-16000,不限,不限,民营,服务业, +吉林,自然语言处理,直招送餐员配车管住,北京,6000-12000,不限,不限,民营,服务业, +百姓网,自然语言处理,呼和浩特高铁乘务员餐吧员安检员招聘,北京,8000以上,不限,不限,民营,行政/后勤, +,自然语言处理,直招跟船普工搬运工/月薪一万包吃住,北京,7000-15000,不限,不限,民营,普工|技工|生产|机械, +,自然语言处理,高薪直招月薪一万跟船出海电焊工,北京,8000-15000,不限,不限,民营,普工|技工|生产|机械, +百姓网,自然语言处理,呼和浩特高端职位高铁乘务员招聘,北京,8000以上,不限,不限,民营,行政/后勤, +鄂州,自然语言处理,海量附近招聘创业的你,北京,8000-16000,不限,不限,民营,服务业, +馒头招聘,自然语言处理,烧烤师,北京,5000-10000,不限,小学,民营,餐饮, +百姓网,自然语言处理,呼和浩特高铁乘务员招聘好岗位招聘,北京,8000以上,不限,不限,民营,行政/后勤, +,自然语言处理,高薪直招随船出海维修电工包吃住有五险一金,北京,8000-15000,不限,不限,民营,普工|技工|生产|机械, +医药人才网,自然语言处理,实习生招聘一单一结日300.,北京,9000-12000,不限,高中,民营,计算机/互联网, +华北人才网,自然语言处理,7K以上急聘安全员,北京,7000-8500,不限,大专,民营,建筑/房地产, +康强医疗人才网,自然语言处理,廊坊经营院长,北京,8000-15000,不限,大专,民营/其它,医疗, +呼伦贝尔,自然语言处理,高薪招聘会销专员,北京,5000-10000,不限,不限,民营,销售/客服/技术支持, +吉林,自然语言处理,诚聘优秀店长,北京,8000-16000,不限,不限,民营,销售/客服/技术支持, +华北人才网,自然语言处理,游泳馆预售高薪招聘销售,北京,8000-16000,不限,不限,民营,咨询/法律/教育/科研, +电力人才网,自然语言处理,在线客服线上文员日300招聘,北京,9000-12000,不限,高中,民营,计算机/互联网, +,自然语言处理,高薪直招跟船出海叉车工月过万五险一金,北京,8000-15000,不限,不限,民营,普工|技工|生产|机械, +百姓网,自然语言处理,呼和浩特相伴复兴号高铁乘务员招聘,北京,8000以上,不限,不限,民营,行政/后勤, +前程无忧网,自然语言处理,人工智能类-自然语言处理工程师-北京,北京,,本科,,民营公司,,工作职责:1、研发NLP基础词句、篇章语法与语义分析算法,包括但不限于分词、词性标注、命名实体识别、依存分析、语义角色标注、情感分析、主题模型等;2、运用NLP与机器学习算法开发文本挖掘、信息抽取、预测分析、阅读理解等高级功能;3、运用NLP与机器学习算法领域相关项目开发,如对话系统、检索系统、知识图谱等,并根据不同的产品属性进行算法的优化;4、NLP前沿算法跟进与研发。任职要求:1、本科及以上学历, 计算机、软件工程、机器学习、应用数学、模式识别、人工智能等相关专业;2、热爱计算机科学和开发技术,对算法有浓厚兴趣;3、有NLP中的文本分类、信息抽取等任务经验;4、熟悉深度学习基础知识和NLP领域经典网络模型;5、有学术比赛经验以及发表过顶会论文者优先。 职能类别:软件工程师 微信分享 +前程无忧网,自然语言处理,自然语言处理工程师,北京,20-30万/年,2年经验,硕士,民营公司,,【岗位职责】1、构建基础NLP算法平台;2、应用NLP技术在具体业务场景中解决实际需求,优化/提升现有模型准确率和效率;3、探究NLP相关技术在金融等领域的应用;4、将新技术、新方法应用到实际业务场景,提升业务效果。【任职要求】1、全日制硕士及以上学历,数学、人工智能等相关专业;2、NLP领域有较深远的研究,2年以上NLP金融类相关项目经验(必需);3、精通NLP语言模型或预训练模型(Transformer、BERT、XLNET、ALBERT等),并有过语言模型或预训练模型训练和调优经验(必需);4、有过实际项目中优化BERT效率,并不太损失准确率者优先;5、发表过高水平学术会议论文者优先(机器学习/深度学习/NLP);6、在自动问答、人机对话、对话理解、知识库管理等领域有实际的开发和从业经验者优先。 职能类别:算法工程师高级软件工程师 关键字:NLP自然语言 微信分享 +前程无忧网,自然语言处理,民宿业务- 自然语言处理算法工程师,北京,3-4万/月,3-4年经验,,上市公司,,"职位描述:1. poi相关,包括房源标签挖掘、个性化标题生成、房源摘要生成、自动文案生成2. query相关,包括纠错、改写、意图识别、语义相关度计算3. 评论相关,包括倾向性分析、评论标签抽取、评论质量排序、基于评论的推荐理由生成4. 会话相关:包括话题识别、自动问答、基于对话的推荐5. 其他:如垃圾消息过滤、敏感词过滤、广告过滤以及所有与民宿业务相关的自然语言处理和自然语言理解技术应用职位要求:1. 自然语言处理、机器学习、数据挖掘、模式识别等相关专业2. 有nlp相关项目经验,对自然语言处理技术体系和应用场景有深刻理解3. 熟悉深度学习技术,有深度学习在文本领域的应用经验4. 熟悉java/python,熟悉深度学习代码框架,有较强的算法工程能力5. 很强的使命感和自我驱动力,对技术充满热情6. 良好的沟通能力,重视团队合作,职位描述:1. poi相关,包括房源标签挖掘、个性化标题生成、房源摘要生成、自动文案生成2. query相关,包括纠错、改写、意图识别、语义相关度计算3. 评论相关,包括倾向性分析、评论标签抽取、评论质量排序、基于评论的推荐理由生成4. 会话相关:包括话题识别、自动问答、基于对话的推荐5. 其他:如垃圾消息过滤、敏感词过滤、广告过滤以及所有与民宿业务相关的自然语言处理和自然语言理解技术应用职位要求:1. 自然语言处理、机器学习、数据挖掘、模式识别等相关专业2. 有nlp相关项目经验,对自然语言处理技术体系和应用场景有深刻理解3. 熟悉深度学习技术,有深度学习在文本领域的应用经验4. 熟悉java/python,熟悉深度学习代码框架,有较强的算法工程能力5. 很强的使命感和自我驱动力,对技术充满热情6. 良好的沟通能力,重视团队合作 职能类别:其他 微信分享" +前程无忧网,自然语言处理,自然语言处理工程师,北京,1.5-2万/月,在校生/应届生,硕士,上市公司,,2021校招岗位职责:-自然语言处理,涉及领域包括但不限于:-智能问答:为公司的企业客户提供定制化的智能问答,人工智能助手;-为公司的各产品线提供情感分析、知识抽取、文本生成等自然语言处理相关的任务;- 为公司的知识图谱项目提供知识抽取、知识融合、知识表示相关的算法。任职要求:-熟练掌握python/java至少一门编程语言,熟悉常用数据结构和算法;-熟悉机器学习、自然语言处理等相关技术,并具备实际项目经验;-使用过tensorflow等软件包者优先,有深度学习等相关经验者优先;-能独立阅读英文paper,有NLP领域高水平paper者优先。 职能类别:高级软件工程师 微信分享 +前程无忧网,自然语言处理,JAVA开发岗-自然语言方向(校招岗位),北京,,本科,,合资,,1、负责智能问答、知识图谱、情感分析、语义理解、推理决策等自然语言处理相关的算法研究、设计与实现;2、负责业务项目中,自然语言处理相关的算法设计和编码实现,负责业务项目中相关badcase(错误案例)的收集和算法调优。   1、本科及以上学历的应届毕业生,计算机科学与技术、软件工程、应数学等理工类专业;2、具有自然语言处理相关课题或项目研发经验;3、具备Java实际开发经验,能独立完成编码工作,掌握HanLP、jieba、ansj者优先,持有OCJP认证者优先;4、掌握关系型数据库如MySQL、PostgreSQL中的任意一种,掌握标准SQL及数据库调优技术,掌握Redis、Solr、neo4j或ElasticSearch者优先;5、诚信谦逊、踏实进取、严谨负责,有较强的沟通能力、学习能力,有强烈的创新意识。 职能类别:Java开发工程师 微信分享 +前程无忧网,自然语言处理,算法工程师 Algorithm Engineer,北京,,本科,,民营公司,,职位描述     1、参与公司基础数据挖掘核心技术研究和研发     2、为公司推荐提供文本特征和算法支持     2、构建知识库,挖掘领域内部的实体关系     3、探索研究NLP/推荐算法在公司领域的应用     任职要求     1.精通自然语言处理相关领域的知识与技能,熟悉常见的机器学习算法 ;     2.对自然语言处理相关的实体识别、句法分析、情感分析和观点抽取、语义分析等有相关的实践经验;     3.熟悉Java,Python,C++等一种或一种以上编程语言;     4.较好的主动性和分享精神,良好的沟通和协作能力;           职能类别:软件工程师 微信分享 +前程无忧网,自然语言处理,系统架构师(大数据),北京,2.5-3万/月,3-4年经验,本科,民营公司,,岗位职责:1.作为大数据平台架构师,负责规划设计大数据基础平台及研究相关技术;2.负责海量数据采集、处理及存储、应用方案的技术选型及架构实现;3.负责海量数据分析/查询、分布式存储、流式/实时计算等应用层架构搭建及核心代码实现;4.负责大数据技术应用的技术难点攻关、技术发展研究。任职要求:1.本科及以上学历,数学或计算机相关专业毕业,具有扎实的计算机基础理论知识;2.计算机领域五年以上工作经验,2年以上hadoop项目设计及研发经验;3.熟悉hive、hbase、storm、mahout、flume、ElasticSearch、Spark、Kafka等,具备实际项目设计或开发经验;4.熟悉大规模数据挖掘、机器学习、自然语言处理、分布式计算中一项或多项技术,并具备多年的实际工作经验;5.熟悉主流关系型数据库(Oracle、MySql)、NoSql数据库,熟悉pl/sql编程;6.对技术充满热情且具有钻研精神,对新技术以及行业动向保持敏感性;7.具有较强的执行力,高度的责任感、很强的学习、沟通能力,能够在高压下高效工作;8.有医疗、保险行业经验者优先。 职能类别:系统架构设计师 关键字:大数据Hadoop 微信分享 +前程无忧网,自然语言处理,直播资金安全算法工程师 (职位编号:6898171255310190862),北京,2.5-5万/月,无需经验,本科,民营公司,,职位描述:1、负责直播资金安全风控的基础数据挖掘和核心算法策略研发,带来直播业务增长和提升用户体验;2、深入分析与挖掘数据潜在关联,构建数据指标体系和画像体系;3、深入理解业务,运用机器学习技术,优化模型和策略,持续提升资金安全风控效果;4、研究前沿机器学习算法在领域的实践和应用;5、根据规则配置决策引擎,灵活响应业务的调整需求。职位要求:1、熟悉并掌握数据挖掘算法、机器学习、深度学习、自然语言处理、异常检测中一项或多项,掌握算法原理,能够针对具体问题选择或开发合适算法解决问题,清楚算法适用背景,有实际使用经验;2、精通一种或几种以下语言,Python/Go/Java/C++,编程能力强,熟悉大数据处理技术,善于学习应用业界领先数据架构和技术;3、学习能力强,优秀的发现问题,思考问题,分析问题和解决问题的能力,对解决具有挑战性问题充满激情;4、责任心强,积极主动,有良好的沟通能力和团队合作能力;5、有很好的产品意识,对业务流程有良好的抽象和总结能力;6、有风控算法研发经验者优先。 职能类别:软件工程师 微信分享 +前程无忧网,自然语言处理,地图引擎研发专家,北京,2-4万/月,5-7年经验,本科,上市公司,,岗位职责:1、 负责检索系统的研发和优化。2、 负责引擎召回和多结果选择相关检索逻辑的实现与优化,通过机器学习或深度学习的方法,不断提升结果召回的准确性与相关性。3、 负责检索日志的挖掘,通过线上日志的分析,不断修正相关检索策略。岗位要求:1、 本科以上学历,计算机相关专业(并行计算、软件工程、大数据等方),工作3-5年。2、 熟悉C/C++、Python语言编程,对数据结构和算法设计有较为深刻的理解。3、 熟悉网络编程、多线程编程技术,有大规模系统开发和设计经验。4、 熟悉常见的机器学习算法,例如:随机森林、GDBT、LTR、XGBoost等。具有以下条件者优先:1、 具有搜索、推荐系统相关研发经验者优先(工作经验1年以上)。2、 对机器学习算法熟悉,特别是自然语言处理相关算法了解的优先考虑。 职能类别:C/C++开发工程师 关键字:C++、Python 微信分享 +前程无忧网,自然语言处理,算法工程师,北京,1.5-2.5万/月,3-4年经验,本科,民营公司,,岗位要求:1、具有数据挖掘、自然语言处理、信息检索、机器学习、模型训练项目经验;2、具有搜索相关技术研发经验;3、熟悉搜索引擎和个性化推荐相关技术,精通主流分词算法、分类、提取摘要、大规模网页聚类、索引、检索等相关开发经验。4、全日制本科以上学历,计算机等专业,3年以上Java或python开发经验;5、有扎实的计算机基础、熟悉常用数据结构,具备丰富的爬虫和反爬虫经验;6、至少精通Java/Python其中一种语言,良好的编码风格及编码能力;7、精通行为验证码识别、模拟登陆、数据清洗、去重、入库等;8、熟悉Mysql,redis,mongdb三者至少之一,有过图数据库调优和海量数据存储经验;9、熟悉高并发、高性能的分布式系统的设计及应用,熟悉常用数据存储,各种数据处理技术;10、有nutch,heritrix抓取经验或者分布式抓取经验者优先; 职能类别:算法工程师高级软件工程师 关键字:算法爬虫人工智能 微信分享 +前程无忧网,自然语言处理,JAVA开发岗-自然语言方向(校招岗位),北京,1.5-2万/月,在校生/应届生,本科,外资(非欧美),,1、负责智能问答、知识图谱、情感分析、语义理解、推理决策等自然语言处理相关的算法研究、设计与实现;2、负责业务项目中,自然语言处理相关的算法设计和编码实现,负责业务项目中相关badcase(错误案例)的收集和算法调优。     任职条件:1、本科及以上学历,计算机科学与技术、软件工程、应用数学、人工智能等理工类专业;2、具备Java实际开发经验,能独立完成编码工作,熟练掌握HanLP、jieba、ansj者优先,持有OCJP认证者优先;3、熟练掌握关系型数据库如MySQL、PostgreSQL中的任意一种,熟练掌握标准SQL及数据库调优技术,熟练掌握Redis、Solr、neo4j或ElasticSearch者优先;4、具备Python实际开发经验者优先,熟练掌握tensorflow、keras、pytorch者优先;5、具有自然语言处理相关课题或项目研发经验者优先;6、诚信谦逊、踏实进取、严谨负责,有较强的沟通能力、学习能力,有强烈的创新意识。 职能类别:Java开发工程师 关键字:java 微信分享 +前程无忧网,自然语言处理,Java开发工程师,北京,0.8-1.2万/月,3-4年经验,大专,民营公司,,"岗位需求:1.学历专科及以上;2.掌握常见的数据结构和算法,对设计模式有深入理解和应用;3.良好的英文文档阅读能力;4.学习能力强,对数据处理以及人工智能有浓厚的兴趣;5.责任感强烈,良好的团队合作精神;6.熟练掌握Python, java, C++语言中的种或多种,据有良好的编程习惯。岗位职责:1.数据处理、自然语言处理领域的算法设计和实现;2.参与AI项目的研究和开发,学习人工智能新兴技术 职能类别:Java开发工程师移动开发工程师 关键字:java软件开发软件工程师java开发开发工程师 微信分享" +前程无忧网,自然语言处理,系统架构设计师(大数据方向),北京,,5-7年经验,本科,国企,,岗位职责:1.作为大数据平台架构师,负责规划设计大数据基础平台及研究相关技术;2.负责海量数据采集、处理及存储、应用方案的技术选型及架构实现;3.负责海量数据分析/查询、分布式存储、流式/实时计算等应用层架构搭建及核心代码实现;4.负责大数据技术应用的技术难点攻关、技术发展研究。任职要求:1.本科及以上学历,数学或计算机相关专业毕业,具有扎实的计算机基础理论知识;2.计算机领域五年以上工作经验,2年以上hadoop项目设计及研发经验;3.熟悉hive、hbase、storm、mahout、flume、ElasticSearch、Spark、Kafka等,具备实际项目设计或开发经验;4.熟悉大规模数据挖掘、机器学习、自然语言处理、分布式计算中一项或多项技术,并具备多年的实际工作经验;5.熟悉主流关系型数据库(Oracle、MySql)、NoSql数据库,熟悉pl/sql编程;6.对技术充满热情且具有钻研精神,对新技术以及行业动向保持敏感性;7.具有较强的执行力,高度的责任感、很强的学习、沟通能力,能够在高压下高效工作;8.有物流、快递、电子商务行业经验者优先。 职能类别:系统架构设计师 微信分享 +华北人才网,自然语言处理,招聘房产经纪人,北京,8000-16000,不限,不限,民营,服务业, +呼伦贝尔,自然语言处理,高薪招聘会销专员,北京,5000-10000,不限,不限,民营,销售/客服/技术支持, +华北人才网,自然语言处理,游泳馆预售高薪招聘销售,北京,8000-16000,不限,不限,民营,咨询/法律/教育/科研, +百姓网,自然语言处理,呼和浩特相伴复兴号高铁乘务员招聘,北京,8000以上,不限,不限,民营,行政/后勤, +电力人才网,自然语言处理,在线客服线上文员日300招聘,北京,9000-12000,不限,高中,民营,计算机/互联网, +,自然语言处理,直招跟船普工搬运工/月薪一万包吃住,北京,7000-15000,不限,不限,民营,普工|技工|生产|机械, +,自然语言处理,直招跟船保安高薪包吃包住五险一金,北京,7000-15000,不限,不限,民营,家政|保安|物业|淘宝, +,自然语言处理,高薪直招跟船出海叉车工月过万五险一金,北京,8000-15000,不限,不限,民营,普工|技工|生产|机械, +,自然语言处理,高薪直招月薪一万跟船出海电焊工,北京,8000-15000,不限,不限,民营,普工|技工|生产|机械, +康强医疗人才网,自然语言处理,廊坊经营院长,北京,8000-15000,不限,大专,民营/其它,医疗, +百姓网,自然语言处理,呼和浩特高端职位高铁乘务员招聘,北京,8000以上,不限,不限,民营,行政/后勤, +馒头招聘,自然语言处理,烧烤师,北京,5000-10000,不限,小学,民营,餐饮, +吉林,自然语言处理,直招送餐员配车管住,北京,6000-12000,不限,不限,民营,服务业, +,自然语言处理,高薪直招随船出海维修电工包吃住有五险一金,北京,8000-15000,不限,不限,民营,普工|技工|生产|机械, +吉林,自然语言处理,诚聘优秀店长,北京,8000-16000,不限,不限,民营,销售/客服/技术支持, +百姓网,自然语言处理,呼和浩特高铁乘务员招聘好岗位招聘,北京,8000以上,不限,不限,民营,行政/后勤, +鄂州,自然语言处理,海量附近招聘创业的你,北京,8000-16000,不限,不限,民营,服务业, +医药人才网,自然语言处理,实习生招聘一单一结日300.,北京,9000-12000,不限,高中,民营,计算机/互联网, +华北人才网,自然语言处理,7K以上急聘安全员,北京,7000-8500,不限,大专,民营,建筑/房地产, +百姓网,自然语言处理,呼和浩特高铁乘务员餐吧员安检员招聘,北京,8000以上,不限,不限,民营,行政/后勤, +前程无忧网,自然语言处理,36811-算法中心总监 (职位编号:54812),北京,,3-4年经验,本科,民营公司,,岗位职责:负责腾讯新闻的推荐系统的整体设计,包括系统架构和算法应用;负责腾讯新闻的推荐系统召回/排序/多样性等模块的关键技术落地,包括点击预估和结果排序等; 持续对系统的架构、算法进行改进和优化,提升海量数据的处理性能,提高算法迭代速度;负责推荐团队的建设和管理岗位要求:1、具有个性化推荐、搜索排序、计算广告、自然语言处理等丰富的项目经验,熟悉推荐业务常用理论和算法,在多个领域(如排序模型,召回模型,用户画像,深度学习等)有5年以上实际工作经验;扎实的机器学习基础,能够运用LR、GBDT、SVM等传统模型解决实际的业务问题,熟练掌握深度学习及其在工业界的一些典型应用案例;熟练使用一种或几种深度学习框架(如tensorflow、caffe、mxnet、pytorch等),熟悉python、C++、scala、golang等至少一门编程语言;硕士研究生或以上学历,机器学习、NLP、数据挖掘等相关专业优先;能够有较好的技术结合业务思维,有较强的分析和解决问题能力,较强的工作激情和团队协作能力;具备大型推荐系统0-1能力,有相关技术团队搭建和管理经验优先,有良好的产品sense优先。 职能类别:高级软件工程师 微信分享 +前程无忧网,自然语言处理,Python开发工程师 (职位编号:TAIJI001683),北京,1.3-2.3万/月,2年经验,,国企,,岗位职责:1.参与系统架构设计,提出解决方案;2.系统功能模块的详细设计及编码实现; 任职资格:1、本科以上学历,计算机或人工智能相关专业;2、2年以上Python开发经验,3年以上工作经验;3、至少掌握Django或Flask框架、有Web项目开发部署经验;4、有一定的机器学习基础知识,有计算机视觉、自然语言处理相关工作经验者优先;5、积极主动、抗压能力强、有团队合作精神。 职能类别:Python开发工程师 微信分享 +前程无忧网,自然语言处理,Java开发工程师,北京,1.2-1.6万/月,3-4年经验,本科,上市公司,,岗位职责:1、独立完成模块需求分析、模块设计、编码实现、联调等各阶段的开发任务;2、根据项目具体要求,承担开发任务,按计划完成任务目标;3、负责编制与项目相关的技术文档;4、协助相关应用软件的安装调试工作;用人需求:1、计算机、通信、电子等相关专业本科以上学历;2、3年以上java大型项目实际研发经验;3、精通Struts,Spring,SpringMVC,熟练应用Redis、Nginx等主流框架及产品;4、熟练掌握HTML、JavaScript、XML、AJAX、JSON等前端语言或技术;5. 熟悉微服务架构SpringCloud 及 Restful API设计框架;6、熟练掌握TCP,HTTP,HTTPS协议,具有爬虫经验优先;7、熟悉大型数据库如Oracle、MySQL等,熟悉No-sql数据库如HBase、MongoDB;8、具有较强的面向对象的分析、设计、开发能力,掌握并且会把相关的设计模式应用到实际开发中;9、具有很强的问题分析定位能力及系统调优能力;10、对高并发、高吞吐、高稳定性、分布式系统的架构设计与实现有自己的理解与实践;11、有大数据或自然语言处理相关经验者优先。 职能类别:Java开发工程师 微信分享 +前程无忧网,自然语言处理,人工智能(AI)软件开发工程师,北京,1.5-2.5万/月,2年经验,本科,国企,,岗位职责:1)     负责软件系统总体方案设计、详细设计,负责系统层、应用层软件架构定义,负责制定系统测试方案;2)     负责AI产品开发,技术难点攻关等;3)     负责代码配置管理,移植以及整合;4)     负责软件系统需求分解和集成调试组织;5)     负责产品整体软件性能提升及架构优化;6)     跟踪业界最新进展,了解新技术突破情况。 岗位要求:1)     计算机、通信、电子相关专业本科及以上学历;2)     精通Python,GO,R,Scala,LISP,JavaScript或Java中的至少一种编程语言3)     熟悉图像分析(计算机视觉)、机器学习、深度学习、自然语言处理、大规模分布式计算;4)     了解有监督和无监督机器学习算法和现代人工神经网络,如CNN,RNN,LSTM或GAN5)     拥有深度学习开发库或框架的先前经验。 职能类别:软件工程师 微信分享 +前程无忧网,自然语言处理,机器学习岗,北京,,2年经验,本科,合资,,"职责:1、结合业务需要提出合适的算法解决方案,推动方案在业务系统中实现,构建实时化高并发系统,例如基于大规模用户行为建立推荐系统。算法包括但不限于机器学习、推荐系统、自然语言处理、文本挖掘等;2、追踪算法前沿技术,结合业务特点,探索将前沿的算法技术应用于实际业务。要求:1、计算机、数学或者统计学相关专业本科以上学历;2、熟悉常用的一种或多种编程工具,如Java, Python,C++等,有2年以上开发实践经验;3、对主流机器学习算法有深入了解,对nlp或ctr预估有相关项目经验者尤佳;4、自我驱动意识和抗压能力,良好团队合作精神。 对以上职位有意者,请于2021年1月15日前将中英文求职信、简历E-MAIL至:bocitalent@bocichina.com.cn,请在标题栏注明“应聘*****岗位”。 职能类别:其他 微信分享" +前程无忧网,自然语言处理,大数据开发工程师,北京,0.8-1.5万/月,1年经验,本科,民营公司,,1. 负责数据建模、海量数据架构设计,开发与性能优化2. 对用户基础数据、实时状态数据进行数据平台建设,为业务场景提供数据服务和洞察分析能力3. 通过专题分析,对用户及业务问题进行深入分析,为用户增长提供数据支持4. 沉淀分析思路与框架,提炼数据产品需求,与相关团队协作并推动产品的落地5. 与相关团队协作进行数据建模和快速迭代,推动数据驱动增长落地,负责业务中台的设计和落地,降低数据使用成本,让数据赋能业务任职资格:1. 本科及以上学历,计算机相关专业,1年以上大数据开发经验;2. 具有丰富的数仓建模,电商行业数据仓库、数据应用经验,熟悉电商相关领域业务优先;3. 有良好的数学基础,了解机器学习常用算法,具备自然语言处理、特征分析等方面知识及应用经验者优先; 4. 有数据分析处理优化经验,推荐、广告、搜索等相关系统开发经验者优先; 5. 熟悉开源大数据生态,精通Hadoop、storm、Hive、HBase、Cassandra、spark、Kafka等大数据和相关技术;6. 责任心强,良好的沟通能力和团队协作精神; 职能类别:大数据开发工程师 关键字:大数据大数据开发数据分析 微信分享 +前程无忧网,自然语言处理,Java开发工程师,北京,0.7-1.4万/月,2年经验,本科,国企,,岗位职责: 1.负责自然语言处理、机器翻译相关应用系统和工具软件的开发; 2.负责架构设计与产品开发等工作。 任职条件: 1.本科学历以上,计算机、软件相关专业; 2.两年以上Java开发的经验,精通AOP、MVC等框架; 3.熟悉WEB开发的相关技术:html/js/ajax/xml等; 4.对Hadoop、HBase、Pig、Hive、Spark、Storm、Flume等分布式计算框架或其它开源技术感兴趣,有一定实践经验; 5.熟练使用Oracle、mssql等数据库; 6.具有较强的沟通能力、分析能力与学习能力,具有团队合作精神。 职能类别:Java开发工程师 微信分享 +前程无忧网,自然语言处理,中高级Java工程师,北京,1-1.6万/月,5-7年经验,本科,民营公司,,岗位职责:1. 参与技术架构的设计、模块核心代码的编写,关键技术预研与攻关,参与技术评审。2. 负责软件产品的模块设计和代码编写工作。3. 确保代码的规范性、易读性、扩展性、高效性和可维护性,要求代码注释清晰详尽,可协同项目经理确保整体项目代码的合理性和规范性。4. 参与数据库设计及SQL命令的编写与优化。5. 负责第三方或自开发系统与SAP(ECC / S4HANA)系统集成接口的二次开发、功能联调以及优化工作。6. 参与公司自有软件系统(WMS、MDM)交付项目的需求分析、可行性分析,技术开发方案设计。具有MDM产品相关研发,交付经验者优先。7. 负责带领研发团队,整体协调研发团队内部工作。8. 负责交付项目上线后的运维支持。任职要求:1. 五年JAVA开发经验,本科及以上学历,计算机或相关专业。2. 具备微服务实战经验3. 熟练掌握SpringCloud、SpringBoot、MyBatis、MQ等主流JAVA技术框架。4. 精通并具备JAVA设计模式经验5. 熟练掌握docker及k8s容器管理6. 能够参与架构设计讨论,且具备数据库设计及优化能力,具备高性能设计编程及调优能力。7. 熟练使用MySQL、ORACLE、Redis、MongoDB等数据库,熟练掌握ElasticSearch搜索引擎。8. 熟练使用RabbitMq、Kafka等消息队列。熟悉Python、Scala、R一种或以上语言者优先。9. 能够理解开源项目源码、有重构项目经验。具备RBAC权限系统设计经验。10. 具备良好的沟通理解能力和团队合作能力。11. 熟悉数据挖掘、机器学习算法、自然语言处理等技术者优先。12. 接受30-50%时间的出差 职能类别:Java开发工程师 微信分享 +前程无忧网,自然语言处理,数据分析挖掘工程师,北京,0.6-1.6万/月,2年经验,本科,事业单位,,岗位职责:负责文字、图片等大数据清洗、处理、特征提取和挖掘工作;基于已有的结构化及非结构化数据资源,评估其在不同场景下的可用性和附加价值;深入理解业务需求,利用数据挖掘、数据分析、机器学习相关算法,对业务数据分析挖掘后,建立模型,形成知识库。任职要求:本科及以上学历,计算机、图像处理或计算机视觉分析专业背景或相关工作经验;具有两年以上大数据分析挖掘工作经验,具有扎实的数据挖掘/机器学习/自然语言处理理论基础,并有应用于海量非结构化数据采集、处理及分析的实际项目经验;具备Hadoop、Spark等平台上进行大数据操作、处理的能力,熟悉Java、Python等;熟练使用SPSS、SAS等数据分析工具;掌握Oracle、Mysql等数据库的使用;具有良好的沟通和团队协作能力,良好的数据敏感度,能从海量数据提炼核心结果。         职能类别:高级软件工程师软件工程师 关键字:数据分析数据挖掘 微信分享 +前程无忧网,自然语言处理,搜索研发工程师3421 (职位编号:NavInfo003421),北京,2.5-3万/月,5-7年经验,本科,上市公司,,岗位职责:工作职责:1.负责搜索服务端的开发工作2.负责语义分析,索引和查询的算法优化3.研究数据的存储、传输,优化系统架构,不断提升系统时效性、灵活性及性能4.负责分析用户搜索行为,提升用户搜索体验 任职资格:任职资格:1.计算机或相关专业本科及以上学历2.熟练掌握Java,有扎实的算法和数据结构基础,熟悉C/C++或者Python优先3.有使用ES/Solr/Lucene搜索相关技术优先4.良好的编码规范,有强烈的上进心和求知欲,善于学习新事物5.良好的逻辑思维能力,对数据敏感,能够发现关键数据、抓住核心问题6.有自然语言处理、相关性算法、rerank等经验者或数据挖掘实践经验者优先 职能类别:软件工程师 微信分享 +前程无忧网,自然语言处理,数据挖掘工程师,北京,1.5-2万/月,2年经验,本科,民营公司,,岗位职责 1、利用数据挖掘、机器学习相关算法,解决业务需求,驱动业务创新; 2、对海量的业务数据、用户数据进行挖掘分析,发现数据和业务背后的规律,完成建模; 3、负责推荐/挖掘等产品新需求的调研和开发。 4、负责对网络信息进行寻找、爬取、并维护爬虫工具。 岗位要求 1.本科及以上学历相关机械、电气、控制、计算机、数学专业,两年以上数据分析、模型开发工作经验; 2.熟悉常用数据结构,具备Linux环境研发能力,熟悉python语言,熟悉挖掘相关的工具; 3.熟悉数据挖掘相关算法,包括但不限于决策树、SVM、聚类、逻辑回归等,并实际业务中的深度学习/机器学习相关工作经验; 4. 理解数据库原理,能熟练操作常见MySQL\Oracal\MSSQL,以及非关系数据库; 5.对个性化推荐、热点挖掘、搜索系统、自然语言处理等领域了解者优先考虑。 6.熟悉Spark,Hadoop,Hive,Storm者优先; 7.对爬虫工具及数据处理具有实际项目经验,对数据分析有深刻理解者优先; 8.具备良好的学习能力和沟通交流能力,能够迅速熟悉业务,融入团队; 职能类别:算法工程师大数据开发工程师 关键字:数据挖掘数据分析大数据算法数据建模python 微信分享 +前程无忧网,自然语言处理,Java爬虫工程师,北京,2-3.5万/月,5-7年经验,本科,民营公司,,"岗位职责:负责爬虫平台的架构设计、数据库设计;设计爬虫策略和防屏蔽规则,提升网页抓取的效率和质量;负责爬虫核心算法的开发,对采集的信息进行数据清洗、入库及整理分析;负责持续跟踪分析爬虫系统的技术缺陷,对策略架构做出合理地调整和改进,持续不断提升爬虫系统的性能、时效性、稳定性、易用性.任职要求:全日制本科及以上学历,3年以上爬虫技术开发工作经验;精通Java编程语言,熟悉常用的爬虫框架;精通信息抓取和整合技术,从结构化和非结构化的数据中获取信息;精通反爬虫机制,处理账号限制、复杂验证码、模拟登陆等疑难问题;精通 HTML、XPath、正则表达式、AJAX等技术,熟悉HTTP、HTTPS等网络协议及数据抓包、分析;熟练使用Mysql,MongoDB,Redis数据库中至少一种。熟练应用分布式、多线程技术,有独立完成爬虫架构和部署经验;熟悉网络数据抓取的工作原理与工作流程,熟悉分布式、RPC、爬虫、消息队列等相关技丰富的Linux服务器部署、调优、问题排查、数据库SQL优化、性能优化经验;具有优秀的解决问题的能力,有较强的逻辑思维、独立思考和分析判断能力强;具有较强的沟通表达能力和良好的团队合作精神,较强的抗压能力和问题解决能力;责任感强,做事有耐心,认同公司企业文化,具有良好的职业操守。                                                            加分项:同时熟悉Java和Python优先。具有数据挖掘、自然语言处理等背景者优先;有新闻门户类爬虫经验者优先;有 CI/CD 自动化测试经验优先; 职能类别:爬虫开发工程师 关键字:java爬虫python 微信分享" +前程无忧网,自然语言处理,系统架构师 (MJ000142),北京,1.5-2.5万/月,5-7年经验,本科,国企,,岗位职责:1.负责系统架构的整体规划、设计,以及持续优化;2.针对司法业务、金融风控业务的需求,设计解决方案;3.协助制定硬件及云服务的采购、管理计划;4.负责核心模块代码开发;5.负责指导其他技术人员,组织团队研发。工作经验要求:1.5年以上相关工作经验,3年以上的架构师工作经验;2.熟悉大数据、云计算、人工智能相关技术,有相关领域3年以上工作经验;3.负责过大型系统设计或具备机器学习经验4.具有PB级关系型数据存储、实时查询、计算处理经验;具有PB级文档数据存储、实时查询、计算处理经验;5.有大型互联网企业工作经验者优先。专业能力要求:1.熟练掌握java,熟悉Python或C/C++;2.熟练使用Hadoop、Spark、Hbase、Redis、Kafka、Flume、ZooKeeper等大数据常用中间件;3.精通Oracle、MySQL、PostgreSQL等数据库的使用、调优,熟练使用SQL语句;熟悉MongoDB、OrientDB等数据库;4.熟练使用Linux,shell脚本;5.精通网络、TCP/IP,熟悉网络安全;6.了解机器学习、自然语言处理;7.熟悉CMMI等项目管理流程。其他要求:1.年龄30至38岁,最近5年内就职单位不超过2家;2.***学历为国家一本全日制本科及以上;3.计算机相关专业。 职能类别:系统架构设计师 微信分享 +前程无忧网,自然语言处理,Java开发工程师,北京,1.2-1.5万/月,3-4年经验,本科,民营公司,,技能要求:JQUERY/AJAX/HTML岗位职责:1、负责公司项目的开发和维护工作。2、根据项目任务计划独立按时完成高质量的编码和测试工作。3、规范文档的编写、维护,以及其他与项目相关工作。4、完成软件的设计、开发、测试、修改bug等工作,包括业务需求的沟通,功能模块 详细设计,业务功能实现与单元测试、系统维护。5、参与产品构思和架构设计。6、撰写相关的技术文档。7、支持售前技术服务。8、支持项目对产品的应用服务。9、完成上级领导安排其他临时性工作。任职要求:1、自然语言处理、大数据、计算机科学与技术、软件工程2、有较好的算法基础,掌握常用算法3、掌握数据库的基本知识,熟悉主流的结构化数据库之一4、熟练掌握Java语言5、熟悉jquery/ajax/html等相关技术6、有责任心,能力强,具有良好的团队合作精神,对工作有热情7、具有良好的分析问题和解决问题的能力,对解决具有挑战性问题充满激情8、年龄28岁以下 职能类别:Java开发工程师软件工程师 微信分享 +前程无忧网,自然语言处理,算法工程师,北京,2-4万/月,招若干人,11-19发布,民营公司,,工作职责: 1、负责头条、社区、直播、视频、广告、商城等领域的个性化推荐算法开发和架构研发、支持海量数据和请求,实现在相关产品中的精准推荐; 2、负责推荐系统软件工程,以及初筛召回、点击率预估和推荐排序模型研发和优化; 3、负责推荐系统的数据分析、场景策略、质量监控和高并发性能调优; 4、实现推荐系统促进商业化目标; 5、负责建立场景画像、用户画像和行为模型; 6、引进业界先进技术落地提升推荐效果。 任职要求: 1、计算机、数学、机器学习、统计学、自然语言处理或相关专业,硕士或博士优先,有实际工作经验优先; 2、有优秀的逻辑思维能力和数据分析能力,能够从海量数据中发现有价值的规律,善于分析和解决问题; 3、熟练推荐模型常用理论和算法,在一个活多个领域(如排序模型、点击预估、召回模型、用户画像、深度学习等),有2年以上实际工作经验;熟悉SVD、GBM、XGB、GBDT、LTR、word2vec、CRF、LSTM等常见算法; 4、熟练掌握机器学习、深度学习的基础理论和方法,并在自然语言处理任务中有实际应用经验着优先;熟练使用一种或几种深度学习框架,如tensorflow、caffe、mxnet、pytorch等; 5、熟悉spark、hadoop分布式计算法编程者优先; 6、良好的沟通能力与团队协作能力; 7、有医疗健康行业工作经验优先考虑。 职能类别:软件工程师 微信分享 +前程无忧网,自然语言处理,Java中级开发工程师,北京,1.4-2万/月,3-4年经验,本科,创业公司,,我们需要你:1.负责1Step相关系统开发;2.优化系统架构,提高服务稳定性、吞吐量和性能;3.服务治理、保证数据准确、一致,提高开发效率;4.服务运维,及时解决线上问题;我们希望你:1.3年以上研发工作经验,精通Java、spring等;2.熟练掌握 MySQL 应用开发、数据库原理和常用性能优化和扩展技术,以及 NoSQL,Queue 的原理、使用场景以及限制;3.有良好编程习惯,有代码洁癖;4.积极沟通,工作主动,愿意尝试新的技术领域;5.对自然语言处理方向的人工智能技术有浓厚兴趣;6.对流式计算有一定了解;7.对数据仓库建模有一定了解;8. 对Python有一定了解。 职能类别:Java开发工程师 关键字:java 微信分享 +前程无忧网,自然语言处理,Java高级开发工程师,北京,1.5-2.5万/月,5-7年经验,本科,民营公司,,"1、配合项目经理制定并按计划执行项目开发计划    2、根据客户业务需求,分析并编制软件需求,参与软件功能设计工作    3、按照公司或客户软件开发管理规范要求,编制概要及详细功能设计文档    4、根据开发文档,进行重要功能模块的编码开发,针对工作中技术难点问题进行技术攻关,按项目计划高质量完成代码开发工作。    5、配合项测试人员修正测试bug,保证测试进度。    6、指导和协助开发团队人员,高质量完成项目组开发工作。任职资格:1. 学历要求:本科及以上。2. 专业:计算机相关专业、信息系统相关专业。3. 从业经验:- 5年以上软件开发经验(不含实施)。- 2年以上开发团队管理经验。-有1年以上金融行业相关项目经理经验。4. 技能要求:- 精通Springboot及Spring、MyBatis等主流的Java开发框架,掌握MySQL/Redis等数据存储/缓存技术等。- 熟悉java高级特性,比如:java多线程、网络、反射、高并发和JVM原理等,熟悉java分布式系统设计和实现,对Java社区的新技术和动向有一定了解,对优秀开源软件源码并有心得。- 对设计模式有一定的理解。- maven、gradle等构建工具的使用、管理能力。- mysql、oracle、db2、greenplum等多种数据能力,有一定的数据库优化及实施能力。- html、javascript、css等前端编码能力。- Easyui、ExtJs、Bootstrap等前端UI经验。- AugularJs、Vue等前端框使用经验。- svn、git等代码版本控制工具使用、分支代码管理经验。- tomcat、weblgic、nginx等中间件的部署及优化能力,Java 虚拟机有较深的了解,有JVM分析及调优的实际经验。- 文档整理、编写能力。5. 能根据项目需要接受短期出差及加班。6. 具备良好的职业素养和团队协作精神,有较强的学习和沟通能力,具有强烈的质量意识。7. 有搜索、推荐及自然语言处理相关系统的研发经验者优先。8. 熟悉搜索引擎架构,具有Lucene、Solr或ElasticSearch等平台开发、优化经验者优先。9. 有数据治理领域相关系统的开发经验者优先。 职能类别:高级软件工程师软件工程师 关键字:Java开发银行 微信分享" +前程无忧网,自然语言处理,高级算法工程师,北京,2.5-3万/月,5-7年经验,本科,民营公司,,岗位职责:1、维护和改进云教学平台数据的文本挖掘的算法及应用;2、文本挖掘与语义分析在互联网平台上的应用;3、开发多种个性化的推荐算法;4、跟踪互联网领域最新的自然语言处理,及文本挖掘算法的进展和发展趋势。任职要求:1、计算机,机器学习,模式识别等相关专业,本科学历,硕士及以上优先;2、熟练掌握一门或多门编程语言,python语言优先;3、扎实的理论基础,熟悉常用的机器学习相关算法;4、拥有知识图谱实际项目经验,对知识图谱技术栈有清晰的认知,围绕知识图谱构建(知识建模与获取)与应用(基于KG的问答、推荐等)有丰富实践经验者或论文发表者优先;5、熟练掌握主流的nlp技术工具及模型算法,包括CRF、CNN、LSTM、TopicalWordEmbedding、FastText、Seq2Seq、bert等,有tensorflow实战经验优先6、熟悉常用的中文分词,以及文本挖掘算法,参与过分词、命名实体识别、深度文本匹配、文本分类、知识图谱、Chatbot等相关项目;7、良好的沟通能力,较强的独立工作能力和解决问题的能力。 职能类别:软件工程师 微信分享 +前程无忧网,自然语言处理,数据开发,北京,2.5-3万/月,2年经验,本科,民营公司,,职位描述1.有较强的编程能力,熟悉Java编程语言,有Python相关编程经验者加分2.熟悉大数据相关技术(Hadoop、HBase、Hive、Kylin),并且熟练使用Hive SQL,有Spark相关经验者加分3.有较强的学习能力,能够独立思考,具备一定的研究能力4.熟悉SVM、逻辑回归、人工神经网络(CNN、RNN)等机器学习算法者优先5.有自然语言处理相关经验者优先6.熟悉主流机器学习框架(TensorFlow、scikit-learn)者加分 职能类别:数据运营大数据开发工程师 关键字:数据运营 微信分享 +前程无忧网,自然语言处理,数据分析工程师(实习)G00199,北京,2-3千/月,在校生/应届生,本科,上市公司,,"岗位职责:1、负责机器学习算法的研发;2、研究数据识别方向和安全数据分析方向;3、将研究及分析结果运用于产品研发;4、配合产品研发和测试,持续改进产品质量;任职要求:1、本科以上学历、计算机等相关专业;2、熟悉常用机器学习算法,包括:SVM,决策树,逻辑回归等等;3、熟悉深度学习模型,包括CNN/RNN/GNN等;4、熟练使用至少一种:pytorch/tensorflow/mxnet等常见框架;5、研究方向包括但不限于计算机视觉、自然语言处理、语音识别、数据挖掘;6、有竞赛经验者优先;有发表过国际论文者优先;CET-6优先。 职能类别:大数据开发工程师 微信分享" +前程无忧网,自然语言处理,周末软件技术培训师,北京,3000元/天,5-7年经验,本科,民营公司,,"招专/part-time讲师,培训师,技术咨询,技术外包招周末培训讲师,技术咨询,技术支持,项目外包北京,上海,成都,武汉,广州,深圳,福州,杭州,大连,沈阳等工作内容:2-5天短周期,可周末,技术或软件培训,技术咨询,技术支持。或短周期的技术咨询,项目外包。工作收获:充实生活,展现水平,提高自信,提炼自己知识体系,相互提高,积累资源,锻炼演讲沟通能力,结交技术同行,寻找项目机会,获得丰厚收入。 要求:本科以上,精通某专业技术,理论和实践经验丰富, 3年以上实际项目经历,热情,热心,表达能力强,有耐心,不保守,***有乙方心态,有培训,咨询,演讲经验者***。可周末,有意请发简历或联系,并单独列明下技术或软件特长名称,谢谢!  1.大数据,hadoop,spark,splunk,数据分析,数据挖掘,微软BI,MS BI,powrebi,power bi,R语言,可视化,机器视觉,slam2.机器学习,深度学习,Tensorflow、Caffe、Theano,图形语言,图像处理,图像识别slam,cuda,gpu,opengl,opencv,机器人,商业智能,人工智能,自然语言处理,nlp,文本挖掘3.ansible,python,Jekins持续集成,Mongodb,nosql,redis, AngularJS4.虚拟化vmware,云计算,openstack,docker,k8s, kubernetes存储备份等5.嵌入式架构,硬件设计,电机控制,电机驱动,电机仿真,硬件测试,fpga图像6.EMC电磁兼容,信号可靠性, Allegro Cadence PCB,pcb si仿真,emc仿真,dodaf,mbse7.电子,电气,电磁,信号完整性,数据信号,altium,cadense,高速pcb,IC设计老师,数字前端,数字后端,集成电路类8.solidworks,catia,solidworks有限元,钢结构,pkpm.3d3s,结构设计讲师,bim,建筑设计,钢结构设计,钢结构施工,abaqus,sysweld,ployflow,procast,deform,autoform,moldflow,hyperlynx,adams,flotherm,ansys fluent系列讲师9.嵌入式dsp,fpga,vxworks,arm,ucos,labview,系列技术及产品讲师10.模拟电路设计,,ASIC,数字电路,pcb,cadense,信号完整性,emc电磁,硬件测试,电子产品结构设计,电子产品可靠性,单片机,开关电源等讲师.汽车电子开发,mbd,mbs,电机开发,电机控制,adams,cruise,simulink自动代码生成profine,flexray,canoe,CAN总线,AUTOFORM11.Arcgis,gis,三维遥感等***老师13. Linux编程,内核,管理系列技术讲师14.有限元讲师,Cfd,cae,fluent,ansys,abaqus,cfx.openfoam,comsol系列讲师15. Spss,sas,Matlab讲师,simulink讲师,stateflow数据分析,市场调查16.Erp,sap,ebs,oracle erp17.通信系列技术讲师lte,4g,5g,zigbee,射频技术,opnet,exata网络仿真技术等18. 软件开发,net,j2ee,C++,liferay,web开发,gwt,ios,android,python,perl,ruby讲师19.移动互联开发,app,web开发,web前端,html5,phonegap,ios,android HTML+CSS+**********,讲师,微信开发,微信小程序,微信公众号20. 商业智能,数据仓库,etl,infomatic数据挖掘,bo,biee讲师,greenplum,Tableau,powerbi,qlikview,可视化 22.信息化规划,CIO,IT规划,需求分析讲师。项目管理project,软件测试,持续集成,jira,质量管理,配置管理培训讲师,uml,visio,设计模式等24.NET 架构设计,系统架构,软件架构,系统集成,wcf,wpf,vsts,tfs培训讲师/25.微软project,net,office,mcse,sql server系列技术及产品讲师27.oracle,Hyperion,weblogic,tuxedo,websphere,mysql,sql server.数据库设计与管理培训讲师28.信息安全,网络安全,ccnp,juniper,数据中心,数据运维类30.adobe 讲师,trados,framemaker 讲师其它有特殊技能或软件特长等发邮件时请单独列下软件或技术特长名称,谢谢。 职能类别:其他高级软件工程师 关键字:周末培训软件 微信分享" +前程无忧网,自然语言处理,C++研发工程师(2021校招北京),北京,1.5-1.8万/月,在校生/应届生,本科,外资(非欧美),,工作职责:1、 搜索引擎、推荐系统、效果广告系统的研发工作。 2、 根据产品需求设计技术实现并完成相应的编码工作。任职资格:1、 国家统招本科及以上学, 理工科专业。2、 熟悉算法设计、数据结构、操作系统等基础知识。3、 熟悉C/C++语言,或者Python/Java/Go/Scala等开发语言。 4、 具有搜索、推荐、自然语言处理、机器学习背景和项目实习经验者优先。5、 良好的沟通能力、团队合作精神、责任感和抗压能力。 职能类别:C/C++开发工程师 微信分享 +前程无忧网,自然语言处理,大数据研发经理/总监 (职位编号:016742),北京,3.5-7万/月,10年以上经验,,国企,,"岗位职责:1、大数据相关平台和方案的需求分析、体系架构规划设计,并主导团队研发实现;2、基于数据仓库、数据治理、数据图谱、数据湖、特征工程等数据相关技术及平台研发,及核心及疑难技术问题攻关;3、主导构建领域相关的用户画像、企业画像等,为产品及方案提供支撑;4、建设数据运营及决策支撑平台,持续积累数据分析模型和方案,支撑部门产品提升数据运营能力,加强为客户输出智能化数据分析服务的能力;5、负责业务数据的安全、质量、成本、效率、服务五大方向融合闭环。 任职资格:1、本科以上学历,计算机/软件工程/统计学等相关专业,6年以上工作经验;2、具有大型项目架构设计经验,参与过大数据架构设计及技术选型,设计健壮、可扩展的大数据分析系统/服务;3、有丰富的数据仓库建设、用户画像构建经验,能够基于数据分析挖掘数据价值,对信息进行深度挖掘和有效利用,驱动产品改进;4、熟悉Hive SQL语言,熟悉scala语言,熟悉java, python等至少一种编程语言,有hadoop、spark等至少一种大数据平台的使用经验;5、理解能力强,善于沟通,有责任心和团队精神,抗压性强;6、具备机器学习、深度学习、自然语言处理技术、商业数据分析、金融科技经验者优先;7、具有团队精神和责任感,自驱力强,对技术有持续的热情。 职能类别:高级软件工程师 微信分享" +前程无忧网,自然语言处理,反欺诈策略 (职位编号:6891946690954217736),北京,1.5-4万/月,3-4年经验,本科,民营公司,,职位描述:1、负责反欺诈风险策略的落地和实施细则沟通;2、负责风险规则的在决策引擎中的布控、测试及上线,根据规则配置决策引擎,灵活响应业务的调整需求;3、推动自有数据、三方数据的特征挖掘,并对数据挖掘结果进行评估和校验;4、监控各业务线的风险相关数据,建立预警监控体系和应对措施。职位要求:1、本科及以上学历;2、熟练使用SQL/Hive/Spark等数据统计工具,熟练掌握Python/R等至少一种常用语言;3、有过3年以上反欺诈风控的策略管理或者模型经验;符合以下条件优先:1、有账户安全、交易欺诈、活动作弊工作经验;2、有自然语言处理、关系网络、强化学习、深度学习经验;3、有过大型互金、银行的金融数据智能工作经验。 职能类别:大数据开发工程师 微信分享 +前程无忧网,自然语言处理,NLP算法工程师 - 广告系统 (职位编号:34514),北京,2.5-5万/月,5-7年经验,本科,民营公司,,职位描述:1、通过结构化或者半结构化的数据,结合数据挖掘的方法构建广告知识库;2、依据广告知识库构建应用,优化一系列投放策略、产品;3、广告质量策略的设计与开发,解决诸如虚假夸大,低俗,标题党等问题;4、利用NLP技术辅助广告文案生成。职位要求:1、本科及以上学历应届毕业生,计算机、机器学习和模式识别相关专业;2、掌握自然语言处理、信息检索、深度学习理论,实现过相关算法或有相关应用;3、具备解决大数据集且样本不均衡的文本分类/情感分析的项目经验;4、具有深度学习(CNN/RNN)、聚类、Topic Model、序列标注等算法实际应用经验;5、责任心强,积极主动,有良好的沟通能力和团队合作能力。 职能类别:软件工程师 微信分享 +前程无忧网,自然语言处理,NLP算法平台工程师 (职位编号:22018),北京,2-4万/月,2年经验,本科,民营公司,,职位描述:1、NLP算法平台的Web开发、任务流实现和调度开发;2、设计和实现NLP各种任务的标注页面;3、改进平台的易用性、提高吞吐量;提升平台使用效率。职位要求:1、掌握Web前/后端开发技术,熟练使用至少一种Web框架;2、精通Python、C++、Java、Golang中的至少一门语言;3、了解数据库原理,熟练使用一种关系型数据库,了解NoSql存储;4、有较强软件架构设计能力,有较强代码优化能力;5、对新事物好奇,热爱学习,有转向NLP算法意愿的会优先考虑。 职能类别:软件工程师 微信分享 +前程无忧网,自然语言处理,机器学习/数据挖掘高级工程师 - 抖音/火山 (职位编号:21162),北京,2.5-4.5万/月,3-4年经验,本科,民营公司,,职位描述:1、利用机器学习技术,改进短视频的推荐系统,优化数亿用户的阅读体验;2、分析基础数据,挖掘用户兴趣、内容价值,增强推荐系统的预测能力;职位要求:1、热爱计算机科学和互联网技术,对人工智能类产品有浓厚兴趣;2、具备强悍的编码能力,熟悉 linux 开发环境,熟悉 C++ 和 Python 语言优先;3、优秀的分析问题和解决问题的能力,对解决具有挑战性问题充满激情4、有扎实的数据结构和算法功底,熟悉机器学习、自然语言处理、数据挖掘中一项或多项;5、对推荐系统、计算广告、搜索引擎相关技术有经验者优先; 职能类别:软件工程师 微信分享 +前程无忧网,自然语言处理,NLP算法工程师 - 国际化 (职位编号:18249),北京,2.5-5万/月,2年经验,本科,民营公司,,"职位描述:1、国际化业务相关的内容质量策略的设计与研发,解决诸如低俗、标题党、题文不符、谣言黑稿等问题2、国际化业务相关的文本特征的挖掘与识别,为推荐系统提供基础特征3、对用户反馈建模,快速定位问题与收集数据,实现解决方案,提升产品体验职位要求:1、经验1-3年,学历本科及以上2、拥有强悍的编码能力,扎实的数据结构和算法功底3、熟悉Linux开发环境,熟悉Python/Java/C++语言4、掌握自然语言处理、信息检索理论,实现过相关算法或有相关应用5、责任心强,积极主动,有良好的沟通能力和团队合作能力6、具有多语言分词、文本聚类与分类等业务经验者优先 职能类别:软件工程师 微信分享" +前程无忧网,自然语言处理,机器学习/数据挖掘高级工程师 - 互娱 (职位编号:17711),北京,2.5-4.5万/月,3-4年经验,本科,民营公司,,职位描述:1、利用机器学习技术,改进短视频的推荐系统,优化数亿用户的阅读体验;2、分析基础数据,挖掘用户兴趣、内容价值,增强推荐系统的预测能力;职位要求:1、热爱计算机科学和互联网技术,对人工智能类产品有浓厚兴趣;2、具备强悍的编码能力,熟悉 linux 开发环境,熟悉 C++ 和 Python 语言优先;3、优秀的分析问题和解决问题的能力,对解决具有挑战性问题充满激情4、有扎实的数据结构和算法功底,熟悉机器学习、自然语言处理、数据挖掘中一项或多项;5、对推荐系统、计算广告、搜索引擎相关技术有经验者优先; 职能类别:软件工程师 微信分享 +前程无忧网,自然语言处理,NLP算法工程师 - 国际化,北京,2.5-5万/月,2年经验,本科,民营公司,,职位描述:1、多语言内容处理Pipeline的设计与开发,实现关键词抽取、聚类、Topic等基础特征;2、频道机制的实现与效果提升,包括分类效果的优化,召回与排序效果的改进;职位要求:1、拥有强悍的编码能力,扎实的数据结构和算法功底。2、熟悉Linux开发环境,熟悉Python/Java/C++语言。3、掌握自然语言处理、信息检索理论,实现过相关算法或有相关应用;4、责任心强,积极主动,有良好的沟通能力和团队合作能力;5、具有多语言分词、文本聚类与分类等业务经验者优先。 职能类别:软件工程师 微信分享 +前程无忧网,自然语言处理,Java高级开发工程师,北京,0.8-1.2万/月,3-4年经验,大专,民营公司,,"岗位需求:1.学历专科及以上;2.掌握常见的数据结构和算法,对设计模式有深入理解和应用;3.良好的英文文档阅读能力;4.学习能力强,对数据处理以及人工智能有浓厚的兴趣;5.责任感强烈,良好的团队合作精神;6.熟练掌握Python, java, C++语言中的种或多种,据有良好的编程习惯。岗位职责:1.数据处理、自然语言处理领域的算法设计和实现;2.参与AI项目的研究和开发,学习人工智能新兴技术 职能类别:高级软件工程师Java开发工程师 关键字:java软件开发软件工程师开发工程师java开发 微信分享" +前程无忧网,自然语言处理,系统架构设计师(人工智能方向),北京,,1年经验,本科,国企,,"岗位职责:1.从事人工智能、AR领域相关技术研究、产品研发及评测工作;2.推动先进的AI、AR技术及产品在公司产品中应用;3.参与项目AI、AR相关技术攻关;4.日常领导安排的其他工作。任职要求:1.本科及以上学历,精通C/C++/Java/Python等两种以上编程语言,编程能力强;2.从事过如下研究方向工作之一者优先:深度学习、图像处理、自然语言处理、知识工程、AR应用尤其AR眼镜应用;3.了解各种深度学习开源框架,例如TensorFlow、Caffe等;4.对科技创新抱有极大热情;5.扎实的机器学习背景和计算机视觉(目标识别/目标检测)背景,熟悉OpenCV等图像处理库;6.熟悉Linux开发环境,至少熟练掌握以下一种开发语言:C, C++, Java, Python;7.至少熟练掌握一种深度学习框架:Tensorflow, Keras, Caffee, Torch;8.有Android开发经验或大型应用系统开发经验者优先。 职能类别:系统架构设计师 微信分享" +前程无忧网,自然语言处理,CSIG16-大数据AI高级工程师(北京) (职位编号:59106),北京,,3-4年经验,本科,民营公司,,岗位职责:1. 利用海量腾讯系的定位数据(500亿)及形成的用户轨迹数据,进行海量数据模型设计、数据ETL开发,实现智能化处理和自动化入库;2. 应用机器学习技术,建立道路数据画像,构建实时的基础数据的挖掘模型,提升位置服务能力3. 研发智能交通出行领域中的关键机器学习算法,以及模型算法的产品化岗位要求:机器学习/计算机/数学相关方向硕士以上学历或 3 年以上工作经验,有较强的学习能力及创新能力;熟悉C/C++语言、Python、Java任意一种语言,较强的算法和数据结构功底;对机器学习基础理论及常用算法有深刻的理解,具备出色的工程实践能力;在机器学习或者机器学习应用(包括但不限于搜索/推荐/自然语言处理/计算广告/图像处理等方向)方向有2年以上相关项目经验;良好的沟通能力及团队协作能力,较强的进取心和事业心。 职能类别:高级软件工程师 微信分享 +前程无忧网,自然语言处理,20052-问答系统研发工程师 (职位编号:59724),北京,,3-4年经验,本科,民营公司,,岗位职责:1.负责搜索场景10亿流量级别的高并发,高稳定性的业务框架的研发2.业务相关需求的落地、业界前沿技术的探索与落地。3.追踪问答对话等前沿技术,结合业务需求,探索并应用实际业务岗位要求:1.计算机及相关本科以上学历,两年以上工作经验2.有较强的编码工程能力(C++方向)和一定的高并发服务研发背景,3.有大规模高并发业务开发经验者优先。4.熟悉Hadoop/Spark/Hive等大数据相关技术优先。5.具有问答系统/对话系统/知识图谱/自然语言处理等研究背景和项目经历等经验者优先。 职能类别:高级软件工程师 微信分享 +前程无忧网,自然语言处理,搜索_Java工程师/专家,北京,4-5万/月,5-7年经验,,上市公司,,"搜索与NLP部是美团人工智能技术研发的核心团队,致力于打造高性能、高扩展的搜索引擎和领先的自然语言处理核心技术和服务能力,依托搜索排序,NLP(自然语言处理)、Deep Learning(深度学习)、Knowledge Graph(知识图谱)等技术,处理美团海量文本数据,打通餐饮、旅行、休闲娱乐等本地生活服务各个场景数据,不断加深对用户、场景、查询和服务的理解,高效地支撑形态各样的生活服务搜索,解决搜索场景下的多意图、个性化,时效性问题,给用户优质的搜索体验,构建美团知识图谱,搭建通用NLP Service,为美团各项业务提供智能的文本语义理解服务。我们的团队既注重AI技术的落地,也开展中长期的搜索、NLP及知识图谱基础研究。目前项目及业务包括搜索引擎研发、知识图谱、智能客服、语音语义搜索、文章评论语义理解、智能助理等。我们致力于让更多人更便捷地找到更多生活服务。在这里,我们打造高性能高扩展的搜索引擎,来高效地支撑形态各样的生活服务搜索;在这里,我们用自然语言处理、机器学习、知识图谱等技术,不断加深对用户、场景、查询和服务的理解,以能更好地连接用户和服务;在这里,我们和产品一起,精细打磨点滴的搜索体验,为亿万用户提供更智能的生活服务搜索体验。岗位职责:1. 参与美团平台搜索排序架构和离线特征工程建设;2. 参与美团平台搜索相关业务优化与开发;3. 参与美团平台搜索相关运营系统,支撑系统的开发和完善;4. 持续提升现有系统的稳定性和性能。岗位要求:1. 具有良好的基础,掌握基本的数据结构,具备一定的算法设计能力,思维活跃; 2. JAVA基础扎实,理解io、多线程、集合等基础框架,对JVM原理有一定的了解;3. 掌握多线程及高性能的设计与编码及性能调优,有高并发应用开发经验; 4. 在数据统计与分析方面有一定的能力和经验,能够进行实时、离线数据的分析;5. 对技术充满热情,敢于尝试不同的技术,从技术趋势和思路上能影响技术团队。 ,搜索与NLP部是美团人工智能技术研发的核心团队,致力于打造高性能、高扩展的搜索引擎和领先的自然语言处理核心技术和服务能力,依托搜索排序,NLP(自然语言处理)、Deep Learning(深度学习)、Knowledge Graph(知识图谱)等技术,处理美团海量文本数据,打通餐饮、旅行、休闲娱乐等本地生活服务各个场景数据,不断加深对用户、场景、查询和服务的理解,高效地支撑形态各样的生活服务搜索,解决搜索场景下的多意图、个性化,时效性问题,给用户优质的搜索体验,构建美团知识图谱,搭建通用NLP Service,为美团各项业务提供智能的文本语义理解服务。我们的团队既注重AI技术的落地,也开展中长期的搜索、NLP及知识图谱基础研究。目前项目及业务包括搜索引擎研发、知识图谱、智能客服、语音语义搜索、文章评论语义理解、智能助理等。我们致力于让更多人更便捷地找到更多生活服务。在这里,我们打造高性能高扩展的搜索引擎,来高效地支撑形态各样的生活服务搜索;在这里,我们用自然语言处理、机器学习、知识图谱等技术,不断加深对用户、场景、查询和服务的理解,以能更好地连接用户和服务;在这里,我们和产品一起,精细打磨点滴的搜索体验,为亿万用户提供更智能的生活服务搜索体验。岗位职责:1. 参与美团平台搜索排序架构和离线特征工程建设;2. 参与美团平台搜索相关业务优化与开发;3. 参与美团平台搜索相关运营系统,支撑系统的开发和完善;4. 持续提升现有系统的稳定性和性能。岗位要求:1. 具有良好的基础,掌握基本的数据结构,具备一定的算法设计能力,思维活跃; 2. JAVA基础扎实,理解io、多线程、集合等基础框架,对JVM原理有一定的了解;3. 掌握多线程及高性能的设计与编码及性能调优,有高并发应用开发经验; 4. 在数据统计与分析方面有一定的能力和经验,能够进行实时、离线数据的分析;5. 对技术充满热情,敢于尝试不同的技术,从技术趋势和思路上能影响技术团队。 职能类别:Java开发工程师 微信分享" +前程无忧网,自然语言处理,NLP工程后台研发工程师(C++/JAVA),北京,2-2.5万/月,3-4年经验,,上市公司,,"岗位职责团队介绍: 美团用户平台-搜索与NLP部-NLP中心是负责美团人工智能技术研发的核心团队,使命是打造出色的自然语言处理核心技术和服务能力,依托NLP(自然语言处理)、Deep Learning(深度学习)、Knowledge Graph(知识图谱)等技术,处理美团海量文本数据,打通餐饮、旅行、休闲娱乐等各个场景数据,构建美团知识图谱,搭建通用NLP Service,为美团各项业务提供智能的文本语义理解服务。 我们的团队既注重AI技术的落地,也开展中长期的NLP及知识图谱基础研究。目前项目及业务包括美团知识图谱、智能客服、语音语义搜索、文章评论语义理解、美团智能助理等。岗位职责:1、负责智能客服、NLP Service、知识图谱等领域核心服务研发工作;2、全面参与项目的需求分析、架构设计、核心模块开发,保证系统高性能、高可用、高可扩展 ;3、重点、难点技术预研与攻关,持续探索前沿技术,持续的系统改进和优化,能够应对突发状况,快速定位问题、解决问题。 岗位基本需求1、本科及以上学历,计算机及相关专业;2、2年及以上C++/JAVA开发经验 ;3、对技术充满热情,乐于钻研源码、持续关注互联网行业技术动态 。具备以下者优先1、有高并发、高可靠分布式系统的设计、研发经验,熟悉大规模系统的容量评估、性能调优、故障排查者优先 ;2、有智能客服、NLP Service、知识图谱领域相关开发经验者优先。岗位亮点1、团队牛人云集,业务环境复杂、挑战性大(优化和整合的环境);2、与优质行业AI机构合作,投入资源,培养和孵化优质项目;3、有特色工作机制,包括Mentor机制、Paper Readig机制、Deep Dive/Brain Storming机制、学术论文、专利机制等;4、有行业影响力的培训和学习交流机会、参加国际优质学术会议等;5、公司级项目,具有挑战性。 ,岗位职责团队介绍: 美团用户平台-搜索与NLP部-NLP中心是负责美团人工智能技术研发的核心团队,使命是打造出色的自然语言处理核心技术和服务能力,依托NLP(自然语言处理)、Deep Learning(深度学习)、Knowledge Graph(知识图谱)等技术,处理美团海量文本数据,打通餐饮、旅行、休闲娱乐等各个场景数据,构建美团知识图谱,搭建通用NLP Service,为美团各项业务提供智能的文本语义理解服务。 我们的团队既注重AI技术的落地,也开展中长期的NLP及知识图谱基础研究。目前项目及业务包括美团知识图谱、智能客服、语音语义搜索、文章评论语义理解、美团智能助理等。岗位职责:1、负责智能客服、NLP Service、知识图谱等领域核心服务研发工作;2、全面参与项目的需求分析、架构设计、核心模块开发,保证系统高性能、高可用、高可扩展 ;3、重点、难点技术预研与攻关,持续探索前沿技术,持续的系统改进和优化,能够应对突发状况,快速定位问题、解决问题。 岗位基本需求1、本科及以上学历,计算机及相关专业;2、2年及以上C++/JAVA开发经验 ;3、对技术充满热情,乐于钻研源码、持续关注互联网行业技术动态 。具备以下者优先1、有高并发、高可靠分布式系统的设计、研发经验,熟悉大规模系统的容量评估、性能调优、故障排查者优先 ;2、有智能客服、NLP Service、知识图谱领域相关开发经验者优先。岗位亮点1、团队牛人云集,业务环境复杂、挑战性大(优化和整合的环境);2、与优质行业AI机构合作,投入资源,培养和孵化优质项目;3、有特色工作机制,包括Mentor机制、Paper Readig机制、Deep Dive/Brain Storming机制、学术论文、专利机制等;4、有行业影响力的培训和学习交流机会、参加国际优质学术会议等;5、公司级项目,具有挑战性。 职能类别:软件工程师 微信分享" +前程无忧网,自然语言处理,搜索_Java高级工程师,北京,3-4万/月,5-7年经验,,上市公司,,"搜索与NLP部是美团人工智能技术研发的核心团队,致力于打造高性能、高扩展的搜索引擎和领先的自然语言处理核心技术和服务能力,依托搜索排序,NLP(自然语言处理)、Deep Learning(深度学习)、Knowledge Graph(知识图谱)等技术,处理美团海量文本数据,打通餐饮、旅行、休闲娱乐等本地生活服务各个场景数据,不断加深对用户、场景、查询和服务的理解,高效地支撑形态各样的生活服务搜索,解决搜索场景下的多意图、个性化,时效性问题,给用户优质的搜索体验,构建美团知识图谱,搭建通用NLP Service,为美团各项业务提供智能的文本语义理解服务。我们的团队既注重AI技术的落地,也开展中长期的搜索、NLP及知识图谱基础研究。目前项目及业务包括搜索引擎研发、知识图谱、智能客服、语音语义搜索、文章评论语义理解、智能助理等。我们致力于让更多人更便捷地找到更多生活服务。在这里,我们打造高性能高扩展的搜索引擎,来高效地支撑形态各样的生活服务搜索;在这里,我们用自然语言处理、机器学习、知识图谱等技术,不断加深对用户、场景、查询和服务的理解,以能更好地连接用户和服务;在这里,我们和产品一起,精细打磨点滴的搜索体验,为亿万用户提供更智能的生活服务搜索体验。岗位职责:1. 参与美团平台搜索排序架构和离线特征工程建设;2. 参与美团平台搜索相关业务优化与开发;3. 参与美团平台搜索相关运营系统,支撑系统的开发和完善;4. 持续提升现有系统的稳定性和性能。岗位要求:1. 具有良好的基础,掌握基本的数据结构,具备一定的算法设计能力,思维活跃; 2. JAVA基础扎实,理解io、多线程、集合等基础框架,对JVM原理有一定的了解;3. 掌握多线程及高性能的设计与编码及性能调优,有高并发应用开发经验; 4. 在数据统计与分析方面有一定的能力和经验,能够进行实时、离线数据的分析;5. 对技术充满热情,敢于尝试不同的技术,从技术趋势和思路上能影响技术团队。 ,搜索与NLP部是美团人工智能技术研发的核心团队,致力于打造高性能、高扩展的搜索引擎和领先的自然语言处理核心技术和服务能力,依托搜索排序,NLP(自然语言处理)、Deep Learning(深度学习)、Knowledge Graph(知识图谱)等技术,处理美团海量文本数据,打通餐饮、旅行、休闲娱乐等本地生活服务各个场景数据,不断加深对用户、场景、查询和服务的理解,高效地支撑形态各样的生活服务搜索,解决搜索场景下的多意图、个性化,时效性问题,给用户优质的搜索体验,构建美团知识图谱,搭建通用NLP Service,为美团各项业务提供智能的文本语义理解服务。我们的团队既注重AI技术的落地,也开展中长期的搜索、NLP及知识图谱基础研究。目前项目及业务包括搜索引擎研发、知识图谱、智能客服、语音语义搜索、文章评论语义理解、智能助理等。我们致力于让更多人更便捷地找到更多生活服务。在这里,我们打造高性能高扩展的搜索引擎,来高效地支撑形态各样的生活服务搜索;在这里,我们用自然语言处理、机器学习、知识图谱等技术,不断加深对用户、场景、查询和服务的理解,以能更好地连接用户和服务;在这里,我们和产品一起,精细打磨点滴的搜索体验,为亿万用户提供更智能的生活服务搜索体验。岗位职责:1. 参与美团平台搜索排序架构和离线特征工程建设;2. 参与美团平台搜索相关业务优化与开发;3. 参与美团平台搜索相关运营系统,支撑系统的开发和完善;4. 持续提升现有系统的稳定性和性能。岗位要求:1. 具有良好的基础,掌握基本的数据结构,具备一定的算法设计能力,思维活跃; 2. JAVA基础扎实,理解io、多线程、集合等基础框架,对JVM原理有一定的了解;3. 掌握多线程及高性能的设计与编码及性能调优,有高并发应用开发经验; 4. 在数据统计与分析方面有一定的能力和经验,能够进行实时、离线数据的分析;5. 对技术充满热情,敢于尝试不同的技术,从技术趋势和思路上能影响技术团队。 职能类别:Java开发工程师 微信分享" +前程无忧网,自然语言处理,Java高级开发工程师,北京,1.5-2.5万/月,8-9年经验,本科,民营公司,,岗位职责:1. 参与技术架构的设计、模块核心代码的编写,关键技术预研与攻关,参与技术评审。2. 负责软件产品的模块设计和代码编写工作。3. 确保代码的规范性、易读性、扩展性、高效性和可维护性,要求代码注释清晰详尽,可协同项目经理确保整体项目代码的合理性和规范性。4. 参与数据库设计及SQL命令的编写与优化。5. 负责第三方或自开发系统与SAP(ECC / S4HANA)系统集成接口的二次开发、功能联调以及优化工作。6. 参与公司自有软件系统(WMS、MDM)交付项目的需求分析、可行性分析,技术开发方案设计。具有MDM产品相关研发,交付经验者优先。7. 负责带领研发团队,整体协调研发团队内部工作。8. 负责交付项目上线后的运维支持。任职要求:1. 五年以上JAVA开发经验,本科及以上学历,计算机或相关专业。2. 具备微服务实战经验3. 熟练掌握SpringCloud、SpringBoot、MyBatis、MQ等主流JAVA技术框架。4. 精通并具备JAVA设计模式经验5. 熟练掌握docker及k8s容器管理6. 能够参与架构设计讨论,且具备数据库设计及优化能力,具备高性能设计编程及调优能力。7. 熟练使用MySQL、ORACLE、Redis、MongoDB等数据库,熟练掌握ElasticSearch搜索引擎。8. 熟练使用RabbitMq、Kafka等消息队列。熟悉Python、Scala、R一种或以上语言者优先。9. 能够理解开源项目源码、有重构项目经验。具备RBAC权限系统设计经验。10. 具备良好的沟通理解能力和团队合作能力。11. 熟悉数据挖掘、机器学习算法、自然语言处理等技术者优先。12. 接受30-50%时间的出差 职能类别:Java开发工程师 微信分享 +呼伦贝尔,自然语言处理,高薪招聘会销专员,北京,5000-10000,不限,不限,民营,销售/客服/技术支持, +馒头招聘,自然语言处理,烧烤师,北京,5000-10000,不限,小学,民营,餐饮, +鄂州,自然语言处理,海量附近招聘创业的你,北京,8000-16000,不限,不限,民营,服务业, +百姓网,自然语言处理,呼和浩特高铁乘务员招聘好岗位招聘,北京,8000以上,不限,不限,民营,行政/后勤, +,自然语言处理,直招跟船普工搬运工/月薪一万包吃住,北京,7000-15000,不限,不限,民营,普工|技工|生产|机械, +电力人才网,自然语言处理,在线客服线上文员日300招聘,北京,9000-12000,不限,高中,民营,计算机/互联网, +百姓网,自然语言处理,呼和浩特高端职位高铁乘务员招聘,北京,8000以上,不限,不限,民营,行政/后勤, +华北人才网,自然语言处理,7K以上急聘安全员,北京,7000-8500,不限,大专,民营,建筑/房地产, +,自然语言处理,直招跟船保安高薪包吃包住五险一金,北京,7000-15000,不限,不限,民营,家政|保安|物业|淘宝, +,自然语言处理,高薪直招跟船出海叉车工月过万五险一金,北京,8000-15000,不限,不限,民营,普工|技工|生产|机械, +医药人才网,自然语言处理,实习生招聘一单一结日300.,北京,9000-12000,不限,高中,民营,计算机/互联网, +华北人才网,自然语言处理,游泳馆预售高薪招聘销售,北京,8000-16000,不限,不限,民营,咨询/法律/教育/科研, +百姓网,自然语言处理,呼和浩特高铁乘务员餐吧员安检员招聘,北京,8000以上,不限,不限,民营,行政/后勤, +百姓网,自然语言处理,呼和浩特相伴复兴号高铁乘务员招聘,北京,8000以上,不限,不限,民营,行政/后勤, +吉林,自然语言处理,直招送餐员配车管住,北京,6000-12000,不限,不限,民营,服务业, +,自然语言处理,高薪直招随船出海维修电工包吃住有五险一金,北京,8000-15000,不限,不限,民营,普工|技工|生产|机械, +吉林,自然语言处理,诚聘优秀店长,北京,8000-16000,不限,不限,民营,销售/客服/技术支持, +康强医疗人才网,自然语言处理,廊坊经营院长,北京,8000-15000,不限,大专,民营/其它,医疗, +华北人才网,自然语言处理,招聘房产经纪人,北京,8000-16000,不限,不限,民营,服务业, +,自然语言处理,高薪直招月薪一万跟船出海电焊工,北京,8000-15000,不限,不限,民营,普工|技工|生产|机械, +前程无忧网,自然语言处理,Java开发工程师(大数据) (MJ000141),北京,1-2万/月,3-4年经验,本科,国企,,"岗位职责:1.负责司法及金融风控行业大数据的分析、挖掘及模型设计工作;2.与市场部、产品部密切配合,寻求数据层面的业务价值,利用数据分析结论推动产品优化;3.带领团队对大数据进行分析、挖掘,完成相关的算法、应用的设计与开发;4.制定分析规范,撰写相关技术文档,负责团队人员的技术指导和培训。工作经验要求:1.5年以上相关工作经验,3年以上大数据、BI工作经验;2.熟悉大数据、云计算、人工智能相关技术;3.有大型互联网企业工作经验者优先。专业能力要求:1.熟练掌握java,熟悉Python或C/C++;2.熟练使用Hadoop、Spark、Hbase、Redis、Kafka、Flume、ZooKeeper等大数据常用中间件;3.精通Oracle、MySQL、PostgreSQL等数据库的使用、调优,熟练使用SQL语句;熟悉MongoDB、OrientDB等数据库;4.熟练使用Linux,shell脚本;5.了解机器学习、自然语言处理;其他要求:1.年龄28至35岁,最近5年内就职单位不超过3家;2.***学历为国家一本全日制本科及以上;3.计算机、数学、金融相关专业。 职能类别:Java开发工程师 微信分享" +前程无忧网,自然语言处理,系统架构师 (MJ000142),北京,1.5-2.5万/月,3-4年经验,本科,国企,,岗位职责:1.负责系统架构的整体规划、设计,以及持续优化;2.针对司法业务、金融风控业务的需求,设计解决方案;3.协助制定硬件及云服务的采购、管理计划;4.负责核心模块代码开发;5.负责指导其他技术人员,组织团队研发。工作经验要求:1.5年以上相关工作经验,3年以上的架构师工作经验;2.熟悉大数据、云计算、人工智能相关技术,有相关领域3年以上工作经验;3.负责过大型系统设计或具备机器学习经验4.具有PB级关系型数据存储、实时查询、计算处理经验;具有PB级文档数据存储、实时查询、计算处理经验;5.有大型互联网企业工作经验者优先。专业能力要求:1.熟练掌握java,熟悉Python或C/C++;2.熟练使用Hadoop、Spark、Hbase、Redis、Kafka、Flume、ZooKeeper等大数据常用中间件;3.精通Oracle、MySQL、PostgreSQL等数据库的使用、调优,熟练使用SQL语句;熟悉MongoDB、OrientDB等数据库;4.熟练使用Linux,shell脚本;5.精通网络、TCP/IP,熟悉网络安全;6.了解机器学习、自然语言处理;7.熟悉CMMI等项目管理流程。其他要求:1.年龄30至38岁,最近5年内就职单位不超过2家;2.***学历为国家一本全日制本科及以上;3.计算机相关专业。 职能类别:系统架构设计师 微信分享 +华北人才网,人工智能,游泳馆预售高薪招聘销售,北京,8000-16000,不限,不限,民营,咨询/法律/教育/科研, +,人工智能,直招跟船普工搬运工/月薪一万包吃住,北京,7000-15000,不限,不限,民营,普工|技工|生产|机械, +鄂州,人工智能,海量附近招聘创业的你,北京,8000-16000,不限,不限,民营,服务业, +百姓网,人工智能,呼和浩特高端职位高铁乘务员招聘,北京,8000以上,不限,不限,民营,行政/后勤, +百姓网,人工智能,呼和浩特高铁乘务员餐吧员安检员招聘,北京,8000以上,不限,不限,民营,行政/后勤, +康强医疗人才网,人工智能,廊坊经营院长,北京,8000-15000,不限,大专,民营/其它,医疗, +华北人才网,人工智能,招聘房产经纪人,北京,8000-16000,不限,不限,民营,服务业, +,人工智能,高薪直招随船出海维修电工包吃住有五险一金,北京,8000-15000,不限,不限,民营,普工|技工|生产|机械, +,人工智能,直招跟船保安高薪包吃包住五险一金,北京,7000-15000,不限,不限,民营,家政|保安|物业|淘宝, +吉林,人工智能,直招送餐员配车管住,北京,6000-12000,不限,不限,民营,服务业, +医药人才网,人工智能,实习生招聘一单一结日300.,北京,9000-12000,不限,高中,民营,计算机/互联网, +百姓网,人工智能,呼和浩特高铁乘务员招聘好岗位招聘,北京,8000以上,不限,不限,民营,行政/后勤, +电力人才网,人工智能,在线客服线上文员日300招聘,北京,9000-12000,不限,高中,民营,计算机/互联网, +吉林,人工智能,诚聘优秀店长,北京,8000-16000,不限,不限,民营,销售/客服/技术支持, +,人工智能,高薪直招月薪一万跟船出海电焊工,北京,8000-15000,不限,不限,民营,普工|技工|生产|机械, +呼伦贝尔,人工智能,高薪招聘会销专员,北京,5000-10000,不限,不限,民营,销售/客服/技术支持, +,人工智能,高薪直招跟船出海叉车工月过万五险一金,北京,8000-15000,不限,不限,民营,普工|技工|生产|机械, +华北人才网,人工智能,7K以上急聘安全员,北京,7000-8500,不限,大专,民营,建筑/房地产, +馒头招聘,人工智能,烧烤师,北京,5000-10000,不限,小学,民营,餐饮, +百姓网,人工智能,呼和浩特相伴复兴号高铁乘务员招聘,北京,8000以上,不限,不限,民营,行政/后勤, +前程无忧网,人工智能,人工智能类-计算机视觉工程师-北京,北京,,本科,,民营公司,,工作职责:1、CV算法的研发,包括但不限于目标识别、目标跟踪、图像质量检测、视频分类、人脸识别、语义分割、语义理解、SLAM、3D视觉等;2、CV算法在实际应用领域的性能优化;3、CV前沿算法跟进与研发。任职要求:1、本科及以上学历, 计算机、软件工程、机器学习、应用数学、模式识别、人工智能等相关专业;2、熟练掌握C/C++、Python等编程语言;3、熟悉OpenCV,以及图像处理基本方法;4、熟悉深度学习基础知识和图像分类、目标检测的经典网络模型;5、有学术比赛经验以及发表过顶会论文者优先。 职能类别:软件工程师 微信分享 +前程无忧网,人工智能,人工智能实施助理(专业不限) (职位编号:011),北京,6-8千/月,无需经验,大专,民营公司,,任职要求:年龄:20-26周岁学历:大专及以上专业:不限岗位职责:● 针对业务,通过深度分析进行数据价值挖掘,提供业务策略支持;● 配合各业务部门项目,给予数据支持,从多种数据源组合数据进行深度诊断分析,完成业务专题分析,输出核心业务报告。福利待遇:1、试用期工资不打折,年终14薪,新年发红包,人人有份份,各种节假日福利,端午、中秋、春节,季度员工生日会等;2、 早九晚六,不加班,即使加班也有加班费,每月1000元补贴(餐补+车补+交通补)晚十点下班可享有打车报销,值班补贴80-120/天;3、完善的假期组合:带薪年假14天、带薪调休及法定假期;4、优厚的福利体系:养老保险、医疗保险、生育保险、工伤保险、失业保险及住房公积金;5、丰富多彩的员工活动:每月员工聚餐、年度体检、节日晚会、国内定期旅游活动、秋季运动会、领导新春红包雨,年会及优秀员工表彰活动等; 职能类别:系统分析员地勤人员 关键字:计算机数据分析财务出纳工程管理设计物流数控编程 微信分享 +前程无忧网,人工智能,人工智能计算应用支撑环境开发,北京,15-20万/年,在校生/应届生,本科,国企,,"任职资格1、 重点院校计算机网络或应用相关专业本科以上学历;2、 精通Java和SQL语言;3、 熟悉TCP/IP网络通讯协议,精通Java的Socket编程;4、 熟悉锁和同步机制,精通Java的多线程编程;5、 熟练使用J2EE开发技术以及流行开源框架,包括:Spring, Mybatis等;6、 良好沟通和团队协作能力,积极主动解决问题;7、 有Linux环境下开发经验者优先。职责描述1、 负责需求分析,软件设计和编写代码; 2、 负责Web后端应用容器的业务软件开发;3、 负责数据库/文件系统的管理、备份、加密/解密程序开发;4、 负责开发项目的文档编写和维护;5、 负责开发项目程序维护和升级。 职能类别:软件工程师 微信分享" +前程无忧网,人工智能,Python人工智能实习,北京,6-8千/月,无需经验,大专,民营公司,,技能要求:【能力要求】:1、具有一定的数据敏感度,具备较强的数据分析能力、逻辑思维能力、归纳提炼及文字表达能力;2、具有良好的学习能力、自我驱动能力、良好的组织协调和沟通能力,团队合作意识强,具有敬业精神和钻研精神;【基本条件】1、遵守国家法律法规,具有良好的思想品质和道德素质;2、认同公司核心价值观;3、本人档案中无不良记录;一、任职要求:1. 学历不得低于大专,男女不限,年龄18周岁-30周岁之间;2. 可接受入门基础人员,只要你有很强的学习能力;3. 有良好学习与团队协作能力,肯吃苦耐劳;4. 踏实稳定,有意愿从事技术岗位工作;5. 想获得一份有长远发展、稳定、有晋升空间的工作。二、福利待遇:1、薪资结构:底薪+绩效奖金+项目提成+项目奖金+社会福利+其他补贴等,试用期1-3个月,转正后享有平均月薪范围6000-8000元;2、上班时间:9:00-18:00,中午休息1个小时,周末双休,不加班,享受国家法定节假日,上下班交通便利。3、定期组织员工参加户外活动、体育比赛等业余活动,丰富员工的工作生活;4、良好的晋升机制,广阔的晋升空间。 职能类别:Python开发工程师 关键字:it计算机Python人工智能工程师助理 微信分享 +前程无忧网,人工智能,人工智能开发工程师,北京,,5-7年经验,本科,国企,,工作职责1.主攻AI算法研究;2.AI技术设计方案的分析及撰写;3.与AI开发团队一起开展工作、把控AI各项目的开发质量;4.和资深业务专家BA人员一起制定调优方案并能指导AI开发工程师进行模型落地编码及训练。 任职条件1.全日制大学本科及以上学历(学位)(在国(境)外获得的学历或学位须经国家教育部学历学位认证中心认证),计算机、统计学、数学等相关专业;2.对AI技术研究有浓厚的兴趣,技术背景工作经验5年及以上;3.精通各种算法及调优策略;4.指导和解决技术问题的能力;5.较强的组织沟通协调能力;6.40周岁以下,身体健康。 职能类别:软件工程师 微信分享 +前程无忧网,人工智能,人工智能研究员 AI Researcher (职位编号:228974),北京,,1年经验,本科,外资(欧美),,"Job Description This position develops AI solutions and proofs of concept in the field of industrial production and engineering systems. As part of an innovative team you perform applied research with a focus on Deep Learning technologies (e.g. image classiciation, object recognition) and Reinforcement Learning (e.g. optimization problems) and related industrial problem setups. Thereby, close collaboration with the business units of Siemens Digital Industries and the AI innovation department in headquaters in Germany is required.Ready to apply your knowledge in AI to real-world problems and work in a team of highly motivated AI experts? Then this is the right position for you!Responsibilities• Working with business unit (e.g. product managers, business development, system architects), Siemens factories and selected customers to identify AI use cases and understand requirements.• Implementation of proofs of concept, and investigation and implementation of different solution alternatives.• Investigation of the latest AI technologies and assessment of their benefits.• Application of AI technologies to real-world problems in industrial use cases (e.g. automation, control, etc.)Required Knowledge / Skills, Education, and Experience• Strong independent AI technical survey ability and implementation skills. Able to review and implement state of art.• Good at source code reading and incremental development ability• Strong programming skills (Python is a must)• Good mathematics understanding (linear algebra, probability and statistic, convex optimization)• Knowledge in both classic machine learning (decision-tree, svm, etc.) and deep learning (classification, object detection, embedding learning, etc).• Familiar with scikit-learn, pytorch, tensorflow or other related frameworks/libraries.• Excellent interpersonal and communication skills in English (verbal & written).• Willingness to learn every day and curiosity to learn how new technologies can make an impact in industry business.Knowledge as a Plus• Knowledge of classic computer vision techniques (Canny, SIFT, etc.)• Knowledge of reinforcement learning (model-based and model free RL, on- and off-policy learning, inverse-RL, etc.)• Knowledge of data efficient learning (metric-learning, meta-learning, etc.) 职能类别:软件工程师 微信分享" +前程无忧网,人工智能,产品经理(大数据人工智能方向),北京,1.8-3万/月,本科,,民营公司,,产品经理(大数据人工智能方向,2名) 【岗位职责】 基于海量数据,分析用户行为模式与规律,挖掘有效的特征与线索,形成与利用有效的算法进行建模与训练,进行合理的预测;跟进大数据或人工智能产品或项目业务进程,输出改进或解决方案,形成相应的机器学习模型,实现相应的预测预警,指导与优化实战;根据公司战略,参与产品线规划,研究同业竞争产品,分析行业发展,能够快速形成相应的产品方案,并进行相应的产品规划、设计、管理工作;对销售进行支持,涉及相应产品资料的整理、产品培训、产品演示、产品方案等的准备;也能据项目需求进行招投标相关工作。公司或部门安排的其他工作。 【任职要求】 品行端正,富团队精神与责任感,有较强主人翁意识和一定组织协调能力,具有良好的沟通能力和严谨逻辑思维能力,适应中短期出差。熟悉数据库的基本原理,精通使用SQL、Excel和PPT,能熟练使用R或Python等,了解并掌握SAS、SPSS clementine及Power BI、Fine BI等工具;扎实的数据结构和算法功底,熟悉大规模数据挖掘、机器学习、深度学习中一项或多项算法,了解XGBoost、TensorFlow、Caffe等框架中的一种或多种,且具备实际工作经验。熟悉需求调研方法,具有较强的业务流程和业务模型分析设计能力,善于控制需求,进行版本范围和项目范围管理。3年以上产品相关工作经验,完成过至少两个产品的规划、设计、实施、监督控制直至交付全流程工作。熟练使用Axure、MindManager等工具软件。具有独立解决方案编写与讲解能力,熟悉与了解招投标的过程,并能独立进行招投标材料的编写。有公安行业背景经验者优先考虑。 职能类别:软件工程师 关键字:大数据人工智能 微信分享 +前程无忧网,人工智能,人工智能产品测评工程师2020SZD27 (职位编号:caict003036),北京,1.5-2万/月,无需经验,本科,事业单位,,岗位职责:1、开展人工智能相关产品的测评工作,具体涉及如智能语音,机器视觉、生物识别、人工智能算法、AR/VR等方面;2、开展人工智能相关领域的课题研究工作,申报并执行相关科研项目;3、跟踪人工智能产品***热点,撰写研究报告,制定技术方案;4、参与跟踪标准组织工作,编写技术标准。 任职资格:1、具有较强的沟通及学习能力;2、具有人工智能相关技术的理论基础和项目经验;3、关注智能化产品的技术热点,有能力针对其构建出初步测评方案;4、具有较强的英文听说读写能力,能够顺畅翻译日常所需的英文资料;5、具有良好的公文写作能力,熟练掌握各类办公软件;6、具有良好的团队合作精神和服务意识,执行力强且对工作热忱;7、学历要求:本科及以上;8、专业要求:计算机_互联网_通信_电子_光学_人工智能。 职能类别:其他测试工程师 微信分享 +前程无忧网,人工智能,系统架构设计师(人工智能方向),北京,,1年经验,本科,国企,,"岗位职责:1.从事人工智能、AR领域相关技术研究、产品研发及评测工作;2.推动先进的AI、AR技术及产品在公司产品中应用;3.参与项目AI、AR相关技术攻关;4.日常领导安排的其他工作。任职要求:1.本科及以上学历,精通C/C++/Java/Python等两种以上编程语言,编程能力强;2.从事过如下研究方向工作之一者优先:深度学习、图像处理、自然语言处理、知识工程、AR应用尤其AR眼镜应用;3.了解各种深度学习开源框架,例如TensorFlow、Caffe等;4.对科技创新抱有极大热情;5.扎实的机器学习背景和计算机视觉(目标识别/目标检测)背景,熟悉OpenCV等图像处理库;6.熟悉Linux开发环境,至少熟练掌握以下一种开发语言:C, C++, Java, Python;7.至少熟练掌握一种深度学习框架:Tensorflow, Keras, Caffee, Torch;8.有Android开发经验或大型应用系统开发经验者优先。 职能类别:系统架构设计师 微信分享" +前程无忧网,人工智能,人工智能流程自动化技术助理,北京,6-8千/月,无需经验,大专,民营公司,,【能力要求】:1、具有一定的数据敏感度,具备较强的数据分析能力、逻辑思维能力、归纳提炼及文字表达能力;  2、具有良好的学习能力、自我驱动能力、良好的组织协调和沟通能力,团队合作意识强,具有敬业精神和钻研精神;【基本条件】1、遵守国家法律法规,具有良好的思想品质和道德素质;2、认同公司核心价值观; 3、本人档案中无不良记录;一、任职要求:1. 学历不得低于中专,男女不限,年龄18周岁-30周岁之间;2. 可接受入门基础人员,只要你有很强的学习能力;3. 有良好学习与团队协作能力,肯吃苦耐劳;4. 踏实稳定,有意愿从事技术岗位工作;5. 想获得一份有长远发展、稳定、有晋升空间的工作。二、福利待遇:1、薪资结构:底薪+绩效奖金+项目提成+项目奖金+社会福利+其他补贴等,试用期1-3个月,转正后享有平均月薪范围6000-8000元;2、上班时间:9:00-18:00,中午休息1个小时,周末双休,不加班,享受国家法定节假日,上下班交通便利。 3、定期组织员工参加户外活动、体育比赛等业余活动,丰富员工的工作生活;4、良好的晋升机制,广阔的晋升空间。 职能类别:产品助理系统测试 微信分享 +前程无忧网,人工智能,人工智能(AI)软件开发工程师,北京,1.5-2.5万/月,2年经验,本科,国企,,岗位职责:1)     负责软件系统总体方案设计、详细设计,负责系统层、应用层软件架构定义,负责制定系统测试方案;2)     负责AI产品开发,技术难点攻关等;3)     负责代码配置管理,移植以及整合;4)     负责软件系统需求分解和集成调试组织;5)     负责产品整体软件性能提升及架构优化;6)     跟踪业界最新进展,了解新技术突破情况。 岗位要求:1)     计算机、通信、电子相关专业本科及以上学历;2)     精通Python,GO,R,Scala,LISP,JavaScript或Java中的至少一种编程语言3)     熟悉图像分析(计算机视觉)、机器学习、深度学习、自然语言处理、大规模分布式计算;4)     了解有监督和无监督机器学习算法和现代人工神经网络,如CNN,RNN,LSTM或GAN5)     拥有深度学习开发库或框架的先前经验。 职能类别:软件工程师 微信分享 +前程无忧网,人工智能,软件工程师(人工智能、大数据、系统架构方向),北京,1.5-2万/月,3-4年经验,本科,国企,,技能要求:工控设计调试,人工智能,大数据处理,信息系统架构设计,AI任职要求:1、大学本科及以上学历,计算机、电气自动化相关专业;2、3年以上相关工作经验;3、具有工控相关设计调试经验,或者人工智能、大数据处理,信息系统架构设计开发项(AI相关专业)设计调试经验。 职能类别:算法工程师大数据开发工程师 关键字:工控设计人工智能大数据架构设计AI 微信分享 +前程无忧网,人工智能,软件工程师(人工智能),北京,1-1.8万/月,无需经验,本科,民营公司,,岗位职责;            1、设计开发基于人工智能图像识别类算法的过程管控软件;            2、熟练掌握图像识别算法,可以根据核心算法开发出稳定的特征识别应用;            3、配合用户与设计院要求,可以对接需求、配合开发,去现场调研,去现场进行软件的测试与改进;            4、按公司要求编写文档,做好资料归档。       任职要求:            1、本科及以上学历,控制、自动化、人工智能等专业;           2、熟练掌握图像识别算法,可独立开发相关应用;           3、具有软件架构设计能力,可以指导其他开发人员者优先;           4、具有良好的沟通交流能力,可出差。 职能类别:软件工程师 微信分享 +前程无忧网,人工智能,人工智能/大数据安全研究岗,北京,1.5-3万/月,无需经验,本科,国企,,岗位职责: 1、开展人工智能、大数据或人工智能及大数据在信息安全应用领域等方向的研究和开发工作; 2、参与相关信息安全、网络安全平台及技术的构建和优化改进; 3、参与相关科研项目的申请及执行。 任职要求: 初级研究岗: 1、统招本科及以上学历,计算机、网络安全、信息安全、电子、通信等相关专业; 2、优秀应届毕业生或具备1年及以上人工智能、大数据等相关安全领域技术工作经验,在相关领域具有研究经验和研究成果者优先考虑; 3、高度的自我管理,责任心强,能够主动积极沟通; 4、具备良好的组织能力、团队协作精神,较强的分析和解决问题的能力。 中级研究岗: 1、统招硕士及以上学历,计算机、网络安全、信息安全、电子、通信等相关专业; 2、具备3年及以上人工智能、大数据等相关安全领域技术工作经验,在相关领域具有研究经验和研究成果; 3、熟悉并研究过人工智能、大数据及在信息安全领域应用的前沿技术,了解国外相关领域的技术及行业发展者优先; 4、具备较强的文档撰写能力,善于学习运用新知识和技术,具备优秀的分析、解决问题的能力; 5、高度的自我管理,责任心强,能够主动积极沟通。 高级研究岗: 1、统招硕士及以上学历,计算机、网络安全、信息安全、电子、通信等相关专业; 2、在人工智能、大数据专业领域及其信息安全应用领域具有较深造诣; 3、深刻了解国家及相关部门对人工智能、大数据及其信息安全领域的发展规划; 4、责任心强、抗压能力强,具有突出的团队沟通协调能力和合作精神; 5、具有优秀的方案及文档撰写能力、项目管理能力、演讲能力。 职能类别:机器学习工程师大数据开发工程师 微信分享 +前程无忧网,人工智能,测试工程师(北京),北京,,本科,,民营公司,,岗位职责:1.     负责测试环境的搭建和维护;2.     负责跟踪定位产品软件中的缺陷和问题,保证项目质量和进度,完善测试过程,制定测试规范;3.     负责编写测试总结报告及相关技术文档编写工作。任职要求:1.     本科以上学历,计算机相关专业;2.     能够熟练使用相关测试工具;3.     对web测试、数据库测试、日志测试有深入理解;        4.    具备抗压能力,富有工作热情,良好的沟通表达能力,优秀的分析和解决问题能力。 职能类别:测试工程师软件测试工程师 关键字:测试工程师web测试数据库测试日志测试人工智能无人驾驶 微信分享 +前程无忧网,人工智能,嵌入式软件工程师,北京,1.5-2.5万/月,3-4年经验,本科,民营公司,,1、熟悉Linux环境下的开发和调试,熟练掌握嵌入式linux上调试手段和工具。2、 熟练掌握C/C++等常用编程语言,具有实现大型复杂可扩展的多线程面向对象软件的经验,遵循分层、模块化软件设计思想。3、负责嵌入式软件开发工作,完成软件功能设计、文档编写、代码实现。4、负责公司现有产品升级维护。5、负责编写软件测试用例,执行单元测试,集成测试以及系统联调保证代码质量。6、沟通交流能力强,良好的团队合作精神,工作主动性强。任职要求:1、计算机科学或相关领域的学士或硕士学位。2、至少3-5年以上嵌入式软件工作经验,医疗器械相关行业优先。技能技巧:1、 精通C语言。2、 熟悉STM32等嵌入式MCU开发;扎实的编程功底,良好的编程风格和习惯。3、 熟练使用IAR、KEIL等软件编译环境和软件调试工具。4、 精通常见总线协议及驱动设计:UART、SPI、I2C,CAN等。5、 有电机控制开发经验者优先。 职能类别:高级软件工程师 微信分享 +前程无忧网,人工智能,软件开发(北京),北京,,本科,,国企,,基本要求1、遵纪守法、诚实守信,具有良好的个人品质,无不良记录;2、具有较好的团队合作精神、语言沟通能力和学习能力;3、具有正常履行工作职责的身体条件,和健康良好的心理素质;4、全日制大学本科及以上学历,计算机、软件工程、电子工程、通讯工程、信息工程、自动化、网络与安全、物联网、大数据、人工智能、数学、统计、金融等相关专业;5、符合公司亲属回避的有关规定。岗位要求:1、热爱编程,熟悉操作系统、编译原理、数据结构等;2、熟悉Java、Python、C等常见语言之一;3、计算机技术、软件工程、电子工程、自动化、网络与安全等信息科技类专业。 职能类别:软件工程师 微信分享 +前程无忧网,人工智能,软件开发岗,北京,,本科,,外资(非欧美),,岗位职责:1.负责根据公司的个性化要求,完成系统开发工作。参与软件模块、数据库设计,解决开发中遇到的技术问题。2.负责信息化项目的需求编写、架构设计、系统开发、上线测试、日常维护等;3.对完成的系统进行检查、优化,提高易用性和性能。任职条件:1.学历要求:普通高等院校本科及以上学历毕业生以及教育部认可的国外院校本科及以上毕业生;2.专业范围:计算机类专业--软件工程、网络工程、物联网工程、电子与计算机工程、信息安全、人工智能、计算机科学与技术;3.外语水平:英语CET-4成绩达到425分及以上;4.年龄要求:原则上大学本科生25岁(即1996年1月1日后出生)以下,硕士研究生28岁(即1993年1月1日后出生)以下,博士研究生30岁(即1991年1月1日后出生)以下。5.具备良好的逻辑思维能力、细节关注能力和沟通协调能力,善于创新,身心健康,档案中无不良记录,认可公司文化; 职能类别:软件工程师 微信分享 +前程无忧网,人工智能,通用软件开发工程师(北京),北京,,本科,,民营公司,,职位描述1. 协助完成从客户需求到软件产品定义、架构设计、开发实现、再到上线运营维护等产品生命周期中的各个环节2. 能够创造性解决产品在实现过程中的技术难题,应用前沿技术提升产品的核心竞争力,如分布式系统、性能调优、可靠性、数据库等3. 有机会参与业界前沿技术研究和规划,把人工智能技术、机器学习的概念引入测量行业任职条件1. 计算机、软件、通信等相关专业本科及以上学历2. 热爱编程,基础扎实,熟悉掌握但不限于JAVA/C++/Python/JS/HTML/C#等编程语言中的一种或数种,有良好的编程习惯3. 具备独立工作能力和解决问题的能力、善于沟通,乐于合作,热衷新技术,善于总结分享,喜欢动手实践4. 对数据结构、算法有一定了解5. 优选条件:(1) 熟悉TCP/IP协议及互联网常见应用和协议的原理(2) 有IT应用软件、互联网软件、IOS/安卓等相关产品开发经验,不满足于课堂所学,在校期间积极参加校内外软件编程大赛或积极参于编程开源社区组织(3) 熟悉JS/AS/AJAX/HTML5/CSS等前端开发技术 职能类别:高级软件工程师 微信分享 +前程无忧网,人工智能,系统测试工程师,北京,1.3-2万/月,3-4年经验,大专,民营公司,,1.大专及以上学历背景;2.三年以上车企或tier1工作经历;3.有ADAS/AD相关标定或测试经验,熟悉ADAS/AD各种功能;4.热爱汽车、智能驾驶、自动驾驶和人工智能,有中国驾照,熟悉驾驶;5.具备快速的学习能力和意愿,良好的沟通表达能力,良好的分析解决问题的能力;6.熟悉软件测试基本理论、软件测试流程及其规范者优先;7.了解CAN总线相关知识、熟悉车载CAN总线架构和诊断功能者优先;8.熟悉ISO26262标准,熟悉ISO、ENCAP、NHTSA等相关测试标准者优先。 职能类别:系统测试 关键字:canadas 微信分享 +前程无忧网,人工智能,产业总部/区域招商总监方向,北京,,硕士,,外资(非欧美),,需求专业:信息技术、集成电路、人工智能、生物医药、影视传媒、市场营销等相关专业。薪资:本科:12W-18W硕士:12W-40W博士:27W-60W福利:五险一金 带薪年假 过节费 取暖费 防暑费 工作餐补贴 体检费 服装费 旅游费 交通费 通讯费 生日会 。 职能类别:其他 微信分享 +华北人才网,人工智能,招聘房产经纪人,北京,8000-16000,不限,不限,民营,服务业, +吉林,人工智能,诚聘优秀店长,北京,8000-16000,不限,不限,民营,销售/客服/技术支持, +,人工智能,直招跟船普工搬运工/月薪一万包吃住,北京,7000-15000,不限,不限,民营,普工|技工|生产|机械, +康强医疗人才网,人工智能,廊坊经营院长,北京,8000-15000,不限,大专,民营/其它,医疗, +电力人才网,人工智能,在线客服线上文员日300招聘,北京,9000-12000,不限,高中,民营,计算机/互联网, +吉林,人工智能,直招送餐员配车管住,北京,6000-12000,不限,不限,民营,服务业, +馒头招聘,人工智能,烧烤师,北京,5000-10000,不限,小学,民营,餐饮, +医药人才网,人工智能,实习生招聘一单一结日300.,北京,9000-12000,不限,高中,民营,计算机/互联网, +,人工智能,高薪直招跟船出海叉车工月过万五险一金,北京,8000-15000,不限,不限,民营,普工|技工|生产|机械, +华北人才网,人工智能,7K以上急聘安全员,北京,7000-8500,不限,大专,民营,建筑/房地产, +呼伦贝尔,人工智能,高薪招聘会销专员,北京,5000-10000,不限,不限,民营,销售/客服/技术支持, +,人工智能,高薪直招随船出海维修电工包吃住有五险一金,北京,8000-15000,不限,不限,民营,普工|技工|生产|机械, +,人工智能,直招跟船保安高薪包吃包住五险一金,北京,7000-15000,不限,不限,民营,家政|保安|物业|淘宝, +百姓网,人工智能,呼和浩特高铁乘务员招聘好岗位招聘,北京,8000以上,不限,不限,民营,行政/后勤, +百姓网,人工智能,呼和浩特高铁乘务员餐吧员安检员招聘,北京,8000以上,不限,不限,民营,行政/后勤, +华北人才网,人工智能,游泳馆预售高薪招聘销售,北京,8000-16000,不限,不限,民营,咨询/法律/教育/科研, +鄂州,人工智能,海量附近招聘创业的你,北京,8000-16000,不限,不限,民营,服务业, +,人工智能,高薪直招月薪一万跟船出海电焊工,北京,8000-15000,不限,不限,民营,普工|技工|生产|机械, +百姓网,人工智能,呼和浩特高端职位高铁乘务员招聘,北京,8000以上,不限,不限,民营,行政/后勤, +百姓网,人工智能,呼和浩特相伴复兴号高铁乘务员招聘,北京,8000以上,不限,不限,民营,行政/后勤, +前程无忧网,人工智能,Python开发工程师(北京),北京,1.5-2万/月,本科,,民营公司,,岗位职责:1.负责用python语言实现产品的后端研发;2.负责高质量的设计和编码;3.承担重难点技术攻坚任务;4.参与产品的讨论和开发实现;岗位要求:1.计算机、软件类等相关专业本科以上学历;2.熟悉python后台开发,有完整的项目开发经验,熟练使用Django或flask框架;3.熟悉linux的平台,能够独立完成python项目部署、调优、运维;4.熟悉mysql数据库和redis数据库;5.对项目安全性问题和并发问题有一定理解和相应的解决方法。【公司简介】上海清鹤科技股份有限公司(股票代码:834762)由上海市领军人才和清华大学优博毕业生带领复旦浙大哈工大一批科技人才创立,2017至2019年持续三年入选新三板的创新层,自主创新的企业级视频AI技术开辟了细分行业的崭新方向,为酒店、景区、政务、医疗、司法五大垂直行业提供智慧视频场景化解决方案,搭建“Micro Cloud”(微云)及“Multi-Service Cloud”(多服务云)的云平台,以大数据、人工智能技术为支撑,解决行业场景的可视化、智慧化。2020年9月,公司与清华大学联合成立了“视频场景融合联合研究中心”,搭建清鹤企业级视频融合边缘计算中心,致力于攻克行业信息化高端核心领域的“卡脖子”技术难题。公司自主研发的产品体系已经覆盖全国各省市,并在一带一路国家有落地示范,入选国家级重点产品库。清鹤科技总部设在上海张江,分别在美国硅谷、北京、深圳等全国二十多个城市设有分支机构。清鹤科技过去三年连续营收增长超过40%,研发投入超10%,并拥有近百项软件著作权和多项国家发明专利授权,正在稳健快步走向科创板等高一级资本平台,迈向新的发展高度。【福利待遇】高于行业标准的基本薪酬+各类奖金+股权激励+上海户口绿色通道+国家法定节假日及带薪年假+五险一金+出差、午餐、通讯、租房等各位补贴+节日礼品、生日礼物、办公室水果零食+员工培训、自我提升基金+员工体检【招聘流程】简历网申/网上投递-参与线上/线下宣讲-人事初面-部门复试-签约录用 职能类别:Python开发工程师 关键字:Python人工智能后台代码开发 微信分享 +前程无忧网,人工智能,软件设计(集成),北京,,硕士,,国企,,工作内容:负责公司大型信息化系统项目软件系统设计建设各阶段工作;负责与软件外协厂商沟通协调,负责跟踪软件前沿技术,开展技术研发,提升系统建设能力;完成领导交办的其他工作事项。岗位要求:熟悉国家项目科研生产管理的有关法律、法规、政策和制度;熟练使用开发工具及编程语言,熟悉面向对象的软件设计方法及设计模式,熟悉计算机、网络、数据库、操作系统知识及应用;具备清晰的系统思维能力和良好的语言表达能力,具备较强的软件设计及软件开发能力,具备良好的代码编程习惯和文档编写能力,对新技术感兴趣,对技术有自己的理解和追求。   专业要求:计算机、软件、大数据、可视化、人工智能、通信及地理信息、页面设计等相关专业、其他理工科类专业。 职能类别:软件工程师 微信分享 +前程无忧网,人工智能,11 网络安全研究员(北京),北京,,硕士,,国企,,职位名称:网络安全研究员岗位职责:负责宽带移动通信、网络攻防、人工智能、数据挖掘、安全计算等方向相关技术研究和项目开发;对外面向产业发展,参与行业标准研究、指南编制、课题争取、用户拓展等;对内负责领域技术攻关,为项目提出解决方案,引入创新技术。岗位要求:1.计算机、信息安全、通信等相关专业,硕士及以上学历,博士优先;2.在宽带移动通信、网络攻防、人工智能、数据挖掘、安全计算任一方向有相关项目经验;3.具有良好的沟通、协作、文档编写能力。 职能类别:其他 微信分享 +前程无忧网,人工智能,搜狗搜索-测试开发工程师,北京,1.5-3万/月,3-4年经验,本科,外资(非欧美),,工作职责: 1、从事搜索核心组件的集成测试; 2、根据项目需求负责自动化平台开发工作; 3、AI在测试平台的落地。 任职要求: 1、计算机相关专业本科及以上学历,有linux服务端测试经验; 2、有人工智能、算法相关项目经验的同学优先; 3、至少熟练掌握C++或者java或者python等一门通用语言,熟悉linux上通用代码调试方法; 4、能够开发socket连接测试工具,使用多线程提高工具并发度; 5、可以使用memcache、hadoop、redis等至少一种第三方系统搭建服务; 6、熟悉业界常用测试框架,独立搭建并且使用过至少一种测试框架。 职能类别:测试开发 关键字:测试开发 微信分享 +前程无忧网,人工智能,优化算法研发工程师 (职位编号:989),北京,1-2万/月,无需经验,硕士,民营公司,,岗位职责:1.拓扑优化/设计优化/可靠性分析程序设计与研发;2.研发领域涉及内容包括采样方法、数模建立、寻优算法等。任职要求:1.硕士及以上学历,计算机/人工智能/数学等相关专业,博士学位优先;2.有较强的优化方法基础,并具有相应的代码开发经验;3.熟悉Visual Studio 开发环境,熟练使用Fortran,C或C++开发语言,良好的编码习惯及面向对象的编程思想;4.熟悉软件架构设计的基本方法和工具,熟悉软件开发流程与设计模式,熟悉常用数据结构与算法;5.具有优化设计分析软件使用经验者优先,如iSight等;6.良好的学习、沟通与表达能力,良好的团队协作精神与责任感,思维敏捷,踏实肯干,积极主动。 工作地点:大连、沈阳、西安、北京、无锡 职能类别:高级软件工程师算法工程师 关键字:优化设计分析iSight数模建立采样方法寻优算法 微信分享 +前程无忧网,人工智能,阿里巴巴银泰商业-Java开发专家-北京 (职位编号:GP529784),北京,,5-7年经验,本科,上市公司,,1、主导商品、会员、交易、营销、供应链、场智能等领域的技术研发工作,支撑丰富场景下的复杂业务,完成业务产品建设和技术能力持续沉淀;2、主导数据、人工智能、软硬结合、机器视觉及线上线下系统融合重构等核心技术能力创新;3、深入理解业务,能够发现并解决所负责领域的关键难题,提升供应效率和经营效率,保障新的消费者体验落地;4、和其他业务团队沟通协调,能够对于系统设计方案有思考,推动相关合作方共同带来技术和业务价值。1、JAVA基础扎实,理解io、多线程、集合等基础框架,对计算机基础和JVM原理有一定的了解;2、具备5年及以上JAVA开发实践经验,对于使用过的开源框架,能了解其原理和机制,熟悉spring、mybatis等开源框架; 3、熟悉分布式系统的设计和应用,熟悉分布式、缓存、消息等机制,能够合理应用分布式常用技术解决问题;4、掌握多线程及高性能的设计与编码及其性能调优,有高并发应用开发经验者优先;5、掌握Linux 操作系统、大型数据库(Oracle、MySql);6、对于复杂问题的解决有自己的见解,对于问题的识别、优先级分配有见解,善于寻求资源解决问题;7、对技术有较强兴趣,喜欢钻研及尝试最新的技术,追求编写优雅的代码,积极分享技术趋势和思路,促进团队成员共同进步。 职能类别:软件工程师 微信分享 +前程无忧网,人工智能,后端开发工程师,北京,0.8-1万/月,在校生/应届生,本科,民营公司,,岗位职责(符合其中一项或多项): 1、基于Linux负责应用软件开发 2、硬件架设与开发调试 3、数据采集实验与处理 4、前后台程序联调 5、部分后台程序开发 6、数据库开发 任职要求(满足1项或多项技术要求即可): 1、本科以上学历优先,计算机、软件、自动化、机械电子相关专业优先 2、自我学习能力强,能提出创造性解决方案者优先,工作积极有热情、踏实肯干 3、 熟练使用Linux操作系统,以及在Linux操作系统上的相关开发经验(如C/C++、python),熟悉嵌入式arm软件开发优先 4、有图形界面客户端开发经验,如使用QT/C#等 5、有相关网络开发经验,如远程调用、API的设计等 7、有数据库相关开发经验,掌握数据库设计及开发的基本原理 7、有计算机视觉相关基础优先 8、有人工智能相关基础优先 9、数学和编程基础好,具有较强逻辑分析能力和学习能力,具有较强的独立分析、信息搜索、问题分解和问题解决能力; 10、 具有良好的沟通能力和团队合作精神,具有强烈的责任心和钻研精神。 福利待遇: 1、清华大学人工智能技术培训 2、一线企业参观学习,了解业界对人工智能的真实需求 3、薪资在业内极有竞争力,基本薪资+业绩提成模式 4、公司为员工提供五险一金,节日福利,团建活动; 5、弹性工作制 6、公司为员工提供优越舒适的办公环境,休息区有食品、水果供应。 职能类别:Python开发工程师 关键字:软件开发系统集成 微信分享 +前程无忧网,人工智能,嵌入式软件工程师,北京,1.5-3万/月,3-4年经验,本科,外资(欧美),,"嵌入式软件开发工程师地点:北京朝阳/海淀职责:为端侧人工智能系统设计、开发嵌入式软件,包括:1、深入了解和明确设计需求,和其他专业团队(芯片、算法团队)合作进行高质量的设计工作2、设计产品测试策略和方法,建立自动化的产品测试程序3、开发高质量的嵌入式系统软件4、开发嵌入式系统底层驱动模块 要求:1、相关专业(计算机科学、自动控制、电子工程、精密仪器、应用物理等)本科或者本科以上学位2、有三年以上的BSP开发经验,有三年以上IC设计公司工作经验优先。3、良好的C/C++程序开发能力,有较好的架构构建水平4、熟悉RTOS, bootloader, BSP, Multiprocessing,驱动和硬件底层设计等等5、了解“敏捷软件开发”方法,并有相关工程实践,能应用到版本控制、代码分析、单元测试、代码整合中去。6、精通USB协议,熟悉USB3.0/USB2.0 等相关协议;7、能够独立分析、解决USB相关的功能和性能方面的问题8、有良好的口头和书面表达能力,良好的团队合作精神 职能类别:软件工程师高级软件工程师 关键字:嵌入式软件linux驱动软件开发C/C++ 微信分享" +前程无忧网,人工智能,人脸技术专家 (职位编号:6901636624461187336),北京,3.5-7万/月,3-4年经验,硕士,民营公司,,"职位描述:1、利用计算机视觉和人工智能技术,改进头条、抖音等产品的创作和观看体验;2、根据算法和产品问题,以及实际市场需求,能够攻克技术难点,针对性地设计解决方案,推动技术在各产品线的真正落地;3、负责人脸相关算法研发和落地工作,包含但不限于最新算法的探索和新产品落地及推动;4、参与计算机视觉和人工智能等领域的前沿技术研究。职位要求:1、三年以上人脸、计算机视觉或人工智能相关工作经验;2、良好的数学和算法基础;3、丰富的创造性思维,敢于突破;4、积极主动有热情,能与团队融洽合作相处;5、实际动手能力强,能够快速实现算法工程化;6、熟练掌握计算机视觉、图像处理、深度学习相关算法,在通用检测、识别、分割、生成或人脸检测识别等一个或多个方向有深入研究;7、在国际顶尖会议或期刊(包括但不限于CVPR, ICCV, ECCV, NeurIPS, ICML, AAAI, TPAMI, IJCV等)上发表过论文者优先。 职能类别:软件工程师 微信分享" +前程无忧网,人工智能,5G+行业解决方案经理,北京,1.5-2万/月,5-7年经验,本科,外资(欧美),,职责描述:1.有核心网、无线等通信网络从业经验,对技术钻研有浓厚兴趣,可胜任高强度工作;2.洞悉5G行业应用,了解人工智能、云计算、大数据、物联网的技术发展趋势,熟悉关键技术和应用;3.了解人工智能应用场景,对边缘计算及边云协同有一定理解;4.具有较强的书面表达能力和口头沟通能力,能够与销售人员、客户、开发人员顺畅交流,并独立完成各种文档的编写和产品文案;5.为客户提供具有商业价值的,可实施的系统解决方案及面向特性场景及技术的解决方案;6.对内负责与研发团队对接,实现方案的内部落地与推动。任职要求:1.通信类专业,统招本科以上学历;2.具有通信系统售前方案或实际部署方案经验,熟悉项目运作;3.对于通信系统及其应用具有系统级的理解和认知;4.深入了解5G、NB-IOT、MEC、AI、VR、AR在石油石化、园区、矿山、医疗、港口等行业发展的最新动态;5.有较强的PPT制作及演讲能力,方案撰写及Word编辑能力;6.沟通能力强,工作热情、有责任心、具备一定团队协作精神;7.适应经常出差的工作模式。8.有石油石化、园区、矿山、医疗、港口等5G行业应用解决方案或落地实施方案经验优先; 职能类别:其他 关键字:5GNB-IOTMEC物联网卫星通信传输网技术4GLTE无线通信 微信分享 +前程无忧网,人工智能,自然语言处理工程师,北京,20-30万/年,2年经验,硕士,民营公司,,【岗位职责】1、构建基础NLP算法平台;2、应用NLP技术在具体业务场景中解决实际需求,优化/提升现有模型准确率和效率;3、探究NLP相关技术在金融等领域的应用;4、将新技术、新方法应用到实际业务场景,提升业务效果。【任职要求】1、全日制硕士及以上学历,数学、人工智能等相关专业;2、NLP领域有较深远的研究,2年以上NLP金融类相关项目经验(必需);3、精通NLP语言模型或预训练模型(Transformer、BERT、XLNET、ALBERT等),并有过语言模型或预训练模型训练和调优经验(必需);4、有过实际项目中优化BERT效率,并不太损失准确率者优先;5、发表过高水平学术会议论文者优先(机器学习/深度学习/NLP);6、在自动问答、人机对话、对话理解、知识库管理等领域有实际的开发和从业经验者优先。 职能类别:算法工程师高级软件工程师 关键字:NLP自然语言 微信分享 +前程无忧网,人工智能,美团优选-Java高级工程师/技术专家(运输系统),北京,2.5-3万/月,3-4年经验,,上市公司,,"岗位职责1.负责美团优选运输系统后端开发;2.与业务&产品团队合作,充分理解业务需求及用户场景;3.参与后端技术方案设计评审、Code Review等;4.根据需求进行技术方案设计,并独立承担关键功能模块的设计和开发;5.在系统设计、开发、维护过程中,遵守并实践相关规范,确保系统稳定性;6.主动发现和分析产品存在的用户痛点及技术问题,并提出可行的改进方案,持续改进产品及代码质量。岗位基本需求1.本科及以上学历,计算机相关专业,2年及以上工作经验;2.Java基础扎实,理解IO、多线程、集合等基础框架;3.熟悉Spring&SpringMVC、MyBatis框架,对框架源码和原理有一定了解;4.熟悉MySQL数据库,对查询优化有一定经验,对索引的使用及原理有深入认识;5.熟悉NoSQL、缓存、消息通信、队列、异步框架等技术;6.具备较强的分析问题和解决问题的能力,思维敏捷,喜欢有挑战性的工作;7.有较好的编码规范习惯;8.有团队精神,有责任心,有较强的执行力和一定的抗压能力;具备以下者优先1.对解决业务复杂度,降低系统耦合性,以及提高系统稳定性等问题具有一定经验者优先;2.熟悉供应链业务,参与过供应链/物流核心系统建设或高并发系统经验者优先;3.如你技术实力深厚;足够聪明、乐观、皮实;能够自我驱动,追求卓越。请忽略以上所有要求,欢迎你的加入;岗位亮点1.参与新零售全域业务,与团队一起建设供应链、仓储、交易等零售系统;2.伴随业务共同成长,为零售业务提供支持,在应对各种挑战的过程中,提升业务认知,锤炼过硬技术;3.能和电商、O2O、物流、零售、人工智能等多元化背景的团队技术大牛一起,综合学习,共同进步。,岗位职责1.负责美团优选运输系统后端开发;2.与业务&产品团队合作,充分理解业务需求及用户场景;3.参与后端技术方案设计评审、Code Review等;4.根据需求进行技术方案设计,并独立承担关键功能模块的设计和开发;5.在系统设计、开发、维护过程中,遵守并实践相关规范,确保系统稳定性;6.主动发现和分析产品存在的用户痛点及技术问题,并提出可行的改进方案,持续改进产品及代码质量。岗位基本需求1.本科及以上学历,计算机相关专业,2年及以上工作经验;2.Java基础扎实,理解IO、多线程、集合等基础框架;3.熟悉Spring&SpringMVC、MyBatis框架,对框架源码和原理有一定了解;4.熟悉MySQL数据库,对查询优化有一定经验,对索引的使用及原理有深入认识;5.熟悉NoSQL、缓存、消息通信、队列、异步框架等技术;6.具备较强的分析问题和解决问题的能力,思维敏捷,喜欢有挑战性的工作;7.有较好的编码规范习惯;8.有团队精神,有责任心,有较强的执行力和一定的抗压能力;具备以下者优先1.对解决业务复杂度,降低系统耦合性,以及提高系统稳定性等问题具有一定经验者优先;2.熟悉供应链业务,参与过供应链/物流核心系统建设或高并发系统经验者优先;3.如你技术实力深厚;足够聪明、乐观、皮实;能够自我驱动,追求卓越。请忽略以上所有要求,欢迎你的加入;岗位亮点1.参与新零售全域业务,与团队一起建设供应链、仓储、交易等零售系统;2.伴随业务共同成长,为零售业务提供支持,在应对各种挑战的过程中,提升业务认知,锤炼过硬技术;3.能和电商、O2O、物流、零售、人工智能等多元化背景的团队技术大牛一起,综合学习,共同进步。 职能类别:高级软件工程师 微信分享" +前程无忧网,人工智能,Python开发 (职位编号:649467119501570),北京,1-1.5万/月,3-4年经验,本科,外资(欧美),,职位描述:参与微软行业人工智能项目开发任务,能够按照项目计划,按时提交高质量的代码,完成开发任务;职位要求:技能要求:深入理解人工智能,愿意学习人工智能相关技术。熟练掌握Python, 良好的数据结构、算法基础。本科计算机方向,具备良好的学习能力,能够快速学习新技术。能与团队合作,有强烈的责任心和敬业精神。 职能类别:软件工程师 微信分享 +前程无忧网,人工智能,100强互联网#解决方案测试工程师#,北京,1.5-2.5万/月,2年经验,本科,上市公司,,职责: 1、负责数字政府相关的联合创新型解决方案的集成验证工作:测试方案/用例设计,测试环境搭建,测试用例执行,测试报告输出等,保障方案按计划发布; 2、负责实验局POC项目测交付,支持项目成功,提升解决方案竞争力 要求: 1、本科学历及3年以上软件测试经验,有一定网络基础,了解TCP/IP协议; 有一定IT基础,熟悉服务器、存储设备的配置; 2、掌握或熟悉测试方法及流程,测试工具等; 3、具备ICT解决方案需求理解和沟通交流能力,有跨产品或与合作伙伴互联互通测试经验者优先; 4、有云计算、大数据、人工智能、区块链等领域经验者优先。 职能类别:软件测试工程师测试工程师 关键字:软件测试测试测试工程师 微信分享 +前程无忧网,人工智能,软件开发工程师/算法工程师 (职位编号:02),北京,1-2万/月,3-4年经验,本科,民营公司,,"技能要求:嵌入式,机器学习一、     基本技能1、 编程基本功扎实掌握C/C++/JAVA等开发语言、常用算法和数据结构、熟悉TCP/UDP网络协议及相关编程、进程间通讯编程。2、 专业基础知识全面、扎实的软件知识结构,掌握操作系统、软件工程、设计模式、数据结构、数据库系统、网络安全等专业知识。3、 岗位要求(1) 了解MYSQL及SQL语言、编程,了解NoSQL, key-value存储原理;(2) 了解Python/Shell/Perl等脚本语言;(3) 熟练掌握Git/SVN代码管理工具和敏捷开发流程;(4) 熟悉常用的设计模式;4、 机器人嵌入式系统软件开发人员要求:(5) 精通C/C++/Python。(6) 精通Linux程序架构设计;精通Linux高级编程。熟练掌握网络协议编程,精通多线程/多进程编程。(7) 熟悉ROS机器人系统技术体系,熟练掌握ROS开发工具。熟悉ROS系统架构和模块开发,熟悉ROS仿真环境,ROS系统移植。(8) 熟悉硬件模块:camera、GPS、串口,熟悉各种通信接口,如CAN、UART、SPI、I2C、Ethernet。能够融合移植基于ROS系统的激光、视觉、红外等传感模块。(9) 了解机器人运动控制、定位、导航、语音等算法。二、基本素质1、 团队精神和协作能力协作能力作为是程序员应该具备的最基本的,也是最重要的安身立命之本。在进入商业化和产品化的开发任务,缺乏这种素质的人就完全不合格了。2、 文档习惯良好的文档是正规研发流程中非常重要的环节,作为代码程序员,30%的工作时间写技术文档是很正常的,而作为高级程序员和系统分析员,这个比例还要高很多。缺乏文档,一个软件系统就缺乏生命力,在未来的查错,升级以及模块的复用时就都会遇到极大的麻烦。3、 规范化标准化的代码编写习惯作为一些外国知名软件公司的规矩,代码的变量命名,代码内注释格式,甚至嵌套中行缩进的长度和函数间的空行数字都有明确规定,良好的编写习惯,不但有助于代码的移植和纠错,也有助于不同技术人员之间的协作。4、 需求理解能力可以快速理解项目需求,以及自身要做的内容处于项目的位置,要有全局的掌握能力。性能需求指标中,稳定性,并访支撑能力以及安全性都很重要,作为程序员需要评估该模块在系统运营中所处的环境,将要受到的负荷压力以及各种潜在的危险和恶意攻击的可能性。5、 复用性复用性设计,模块化思维就是要程序员在完成任何一个功能模块或函数的时候,要多想一些,不要局限在完成当前任务的简单思路上,想想看该模块是否可以脱离这个系统存在,是否可以通过简单的修改参数的方式在其他系统和应用环境下直接引用,这样就能极大避免重复性的开发工作。6、 测试习惯测试工作实际上需要考虑两方面,一方面是正常调用的测试,也就是看程序是否能在正常调用下完成基本功能,这是最基本的测试职责;第二方面就是异常调用的测试,比如高压力负荷下的稳定性测试,用户潜在的异常输入情况下的测试,整体系统局部故障情况下该模块受影响状况的测试,频发的异常请求阻塞资源时的模块稳定测试等等。7、 学习和总结的能力善于学习,对于任何职业而言,都是前进所必需的动力。善于总结,也是学习能力的一种体现,每次完成一个研发任务,完成一段代码,都应当有目的的跟踪该程序的应用状况和用户反馈,随时总结,找到自己的不足。8.精通Windows和Android操作系统下QT开发(C++) 职能类别:高级软件工程师算法工程师 关键字:软件开发人工智能算法机器学习深度学习图像处理软件工程师机器人 微信分享" +前程无忧网,人工智能,系统测试工程师,北京,0.8-1.3万/月,1年经验,硕士,上市公司,,岗位职责: 1、参与人工智能项目的需求分析,关注项目需求的可测性,并能预先评估项目的风险;2、负责人工智能项目的测试方案制定,设计测试方法和测试场景,并进行相互评审;3、负责人工智能相关产品功能、性能、稳定性及相关软硬件可靠性的测试;4、负责撰写测试计划、测试用例、测试报告;5、收集并整理测试问题,驱动开发完成问题的修改。任职要求:1、计算机、通信、电子、自动控制等相关专业大学本科学历;2、熟悉人工智能领域相关算法和平台,同时对工程机械和农业机械的功能和工作方式有较好的了解,明确用户的关注点和痛点所在;3、良好的文档编写习惯;4、对工作认真负责,态度端正,有良好的团队合作精神和沟通协调能力。 职能类别:软件测试工程师 微信分享 +前程无忧网,人工智能,前端/后端高级软件开发工程师(Python/C#) (职位编号:90805424),北京,1-2万/月,2年经验,本科,外资(欧美),,"你需要做的是负责江森自控自有软件的开发工作。你将会怎么做完成新功能设计和开发; 能够适应多任务的,敏捷开发的工作环境; 诊断和处理来自客户的问题; 维护当前的产品功能,并开发新客户需求的功能; 撰写功能文档和设计文档; 能够在不同的小组,项目中工作。我们期待的是要求本科以上学历,计算机、自动化或数学相关专业,能够独立完成数据库开发前端访问,后台维护,数据运算处理等项目; 2年以上Python或C#等后端开发经验,熟悉SQL Server/MySQL存储过程,熟悉数据库性能调优/服务器性能调优; 2年以上Web开发经验,熟悉HTML/CSS/JavaScript(Angular, React); 熟悉Git等版本控制工具; 思路清晰,思维敏捷,学习能力强,有良好的英文资料阅读能力;优先考虑的 良好的沟通及人际技巧,与团队成员高效协作,能承受工作压力,有良好的团队合作精神; 具有机器学习/人工智能/大数据相关开发经验优先。 职能类别:高级软件工程师 关键字:C#python 微信分享" +前程无忧网,人工智能,算法工程师,北京,1.5-2.5万/月,3-4年经验,本科,民营公司,,岗位要求:1、具有数据挖掘、自然语言处理、信息检索、机器学习、模型训练项目经验;2、具有搜索相关技术研发经验;3、熟悉搜索引擎和个性化推荐相关技术,精通主流分词算法、分类、提取摘要、大规模网页聚类、索引、检索等相关开发经验。4、全日制本科以上学历,计算机等专业,3年以上Java或python开发经验;5、有扎实的计算机基础、熟悉常用数据结构,具备丰富的爬虫和反爬虫经验;6、至少精通Java/Python其中一种语言,良好的编码风格及编码能力;7、精通行为验证码识别、模拟登陆、数据清洗、去重、入库等;8、熟悉Mysql,redis,mongdb三者至少之一,有过图数据库调优和海量数据存储经验;9、熟悉高并发、高性能的分布式系统的设计及应用,熟悉常用数据存储,各种数据处理技术;10、有nutch,heritrix抓取经验或者分布式抓取经验者优先; 职能类别:算法工程师高级软件工程师 关键字:算法爬虫人工智能 微信分享 +前程无忧网,人工智能,企业IT架构师,北京,4-6万/月,8-9年经验,本科,民营公司,,地点:大连/北京/上海 薪资:可议 内容: 职责描述: 1、在企业转型规划项目中负责企业技术架构设计 2、负责企业专项设计,如:云平台战略规划与高阶架构设计。数据治理体系规划,数据中台规划设计等 3、帮助企业制定技术标准和技术规范 4、将技术架构与业务战略融合,加速企业实现数字化转型 5、与行业条线和专业条线通力合作,为客户提供高质量交付的同时,挖掘潜在商机 任职资格: *工作年限8年以上 1、有业务流程建模方法论及实践经验。 2、具备企业应用系统架构的分析和设计能力 3、具备数据架构和数据建模能力;有数仓或大数据应用经验。熟悉大数据平台技术体系;对企业数据中台的规划和建设有深入的认识和实践经验; 4、扎实的云计算技术能力,精通主流的IaaS/PaaS技术栈与。具备企业云平台的战略规划与高阶设计能力;具备传统数据中心云转型的实践经验;对企业云平台的运营有深入的了解; 5、对物联网、区块链、人工智能等新技术领域有深入认识和一定的实践经验者优先。 6、熟悉企业的IT研发与运维流程; 7、熟悉企业信息安全技术支持与管理体系 8、具备IT治理相关问题分析和解决能力优先 *计算机相关专业本科及以上学历 *TOGAF证书优先 *有过企业高级技术管理工作经历优先 联系方式:Vivien Wang Email:vivien@China-genius.com 电话:0411-3970 7291 职能类别:系统架构设计师 微信分享 +前程无忧网,人工智能,C++算法工程师,北京,1.5-2万/月,2年经验,本科,民营公司,,C++算法工程师岗位职责:1、参与用户需求调研和需求分析及与软件设计工作,并编写相关文档;2、负责项目模块的详细设计、编码调试和单元级测试工作;3、配合完成项目的单元级、配置项级和系统级测试的相关工作;4、配合完成项目的联调联试工作。任职要求:1、具有大学本科及以上学历,地理信息、计算机及相关专业;2、熟悉C++语言,有2年以上开发经验;3、熟悉Linux操作系统;4、熟悉Socket网络编程和多线程编程;5、有GIS开发经验优先;6、有过云计算、大数据处理研发经验者优先。 职能类别:C/C++开发工程师软件工程师 关键字:C++c++软件开发软件算法人工智能 微信分享 +前程无忧网,人工智能,数据挖掘高级工程师,北京,2-2.5万/月,3-4年经验,硕士,上市公司,,Position Description: 基于公司现有各类数据,进行深入分析和数据挖掘,寻找数据应用突破点,更好地促进质量改进。2. 基于手机质量管理或者用户行为分析等方向,设计并优化业务数据算法和逻辑,通过数据分析以及数据挖掘,为部门运营决策、质量改进,提升用户体验等提供数据支持,从数据分析和数据挖掘的角度为业务诉求、痛点及问题提供建议。3. 构建数据挖掘、机器学习、人工智能等算法与模型,基于公司大数据平台实现面向不同产品、不同国家客户的应用实践。4. 参与部门大数据系统、数据仓库、数据平台设计。5. 持续学习,保持跟进深度学习领域最新研究方向。 Position Requirement:1. 统计学、应用数学、计算机软件等相关专业,硕士及以上学历。2. 至少3年以上的数据分析,算法设计,数据挖掘等相关的工作经验。3. 对常见的核心算法和数据挖掘方法有透彻的理解和实践,熟练使用深度学习框架 TensorFlow/Pytorch/Keras其中的一种或者多种,能够构建数据挖掘、机器学习、人工智能等算法与模型。熟悉Hadoop、MapReduce、Hive、Spark、Storm等大规模数据平台。4. 至少熟悉一种编程语言精通,R语言优先,有工程实现能力。5. 具有良好的逻辑思维能力,和数据敏感度,一级良好的组织沟通能力/执行能力和团队精神,乐于接受挑战。 职能类别:大数据开发工程师 微信分享 +前程无忧网,人工智能,系统架构师,北京,2-3.5万/月,5-7年经验,本科,外资(非欧美),,岗位职责:参与公司智慧矿山项目的相关技术规划,并参与技术研发与产品落地,为公司业务发展提供全面的技术保障。参与公司智慧矿山项目相关系统的规划和架构设计工作,主导系统的架构设计和重难点技术攻关负责形成平台及软件产品成果,持续推动产品的优化改进,配合市场推广作为工业互联网平台技术专家,能够指导技术团队开展工作,保证公司在商业和技术上的竞争力 负责新技术探索,并能将新技术与业务进行结合,转化落地到实际应用参与技术团队建设,为团队整体的知识积累、技能提升做贡献                            任职要求:本科及以上学历,计算机、自动化、物联网等相关专业,3年以上项目研发经验,1年以上架构设计经验,具备智慧矿山、工业互联网等项目的研发经验。掌握工业互联网发展方向和技术实现路径,熟悉大数据、云计算、人工智能等技术的特点及应用场景,并能主导将相关技术在智慧矿山等工业互联网应用场景落地;熟悉常用的设计模式、数据结构算法以及面向对象思想,善于代码重构,编写高性能、高可维护性的代码。精通Java开发语言,熟悉Spring MVC、MyBatis、Hibernate等主流框架,熟悉行业常用各种类型数据库。具备良好的团队合作精神,较强的沟通能力,具备良好的技术领导能力。政治素质好,遵守纪律,品行端正,爱岗敬业。有煤矿行业、智慧矿山等相关产品研发经验者优先,具有技术项目管理经验者优先。 职能类别:系统架构设计师高级软件工程师 微信分享 +前程无忧网,人工智能,JAVA开发岗-自然语言方向(校招岗位),北京,1.5-2万/月,在校生/应届生,本科,外资(非欧美),,1、负责智能问答、知识图谱、情感分析、语义理解、推理决策等自然语言处理相关的算法研究、设计与实现;2、负责业务项目中,自然语言处理相关的算法设计和编码实现,负责业务项目中相关badcase(错误案例)的收集和算法调优。     任职条件:1、本科及以上学历,计算机科学与技术、软件工程、应用数学、人工智能等理工类专业;2、具备Java实际开发经验,能独立完成编码工作,熟练掌握HanLP、jieba、ansj者优先,持有OCJP认证者优先;3、熟练掌握关系型数据库如MySQL、PostgreSQL中的任意一种,熟练掌握标准SQL及数据库调优技术,熟练掌握Redis、Solr、neo4j或ElasticSearch者优先;4、具备Python实际开发经验者优先,熟练掌握tensorflow、keras、pytorch者优先;5、具有自然语言处理相关课题或项目研发经验者优先;6、诚信谦逊、踏实进取、严谨负责,有较强的沟通能力、学习能力,有强烈的创新意识。 职能类别:Java开发工程师 关键字:java 微信分享 +前程无忧网,人工智能,Java开发工程师,北京,0.8-1万/月,1年经验,本科,国企,,岗位职责:根据项目情况,进行需求分析,二次开发任职资格:熟练掌握SpringBoot、MyBatis开发框架;掌握Oracle、MySQL等常用关系型数据库及开发技术;熟练掌握设计模式;有软件产品设计经验者优先考虑;熟练掌握主流开发工具Eclipse、IDEA、Maven;了解Vue前端开发、Flink开发、大数据、云计算、人工智能者优先考虑; 具有良好的沟通能力、有团队合作精神,能够在压力下保证工作质量;备注:如入职地在北京,需要长期出差到广州 职能类别:Java开发工程师 关键字:java 微信分享 +前程无忧网,人工智能,计算平台性能优化专家3519 (职位编号:003519),北京,3-5万/月,3-4年经验,硕士,外资(非欧美),,岗位职责:1. 从事计算平台整体优化解决方案研发,致力于在端侧发掘SOC的机器学习计算能力2. 与算法工程师合作,分析业务能瓶颈,根据系统架构和微构架特征,软硬件结合优化实现极致性能3. 洞悉人工智能及深度学习的应用发展趋势,参与下一代机器学习产品设计 任职资格:1. 丰富的GPU编程经验,特别对ARM GPU有深入理解;2. 精通C/C++语言,掌握Linux软件开发环境,熟练运用脚本语言(例如python)3. 熟悉主流深度学习框架(例如TensorFlow/PyTorch),对深度学习训练和推理模型调试、调优有实操经验4. 计算机电子类相关专业硕士以上学历和3年以上相关工作经验: 职能类别:高级软件工程师 微信分享 +前程无忧网,人工智能,大数据资深工程师,北京,1.2-1.8万/月,5-7年经验,本科,国企,,任务描述:1、负责大数据平台底层整体架构设计,技术路线规划等工作,确保系统能支持业务不断发展过程中对数据存储和计算的高要求2、负责大数据应用开发平台、准实时数据平台、数据中台、数据资产管理等相关产品之一的设计、开发、优化3、负责底层分布式计算系统和用户画像数据挖掘平台的开发,主要工作内容包括:用户标签体系建设、用户分群、多业务画像融合、画像迁移等;5、通过市场分析、用户调研结合合作方需求,挖掘更多能力输出价值点,推动原始数据积累,并管理海量用户数据,为后续数据分析、挖掘等提供强有力的支撑。6、负责数据仓库构建、ETL开发;7、结合业务需求和机器学习技术,建立数学模型;8、能够进行数据分析,形成数据分析成果; 岗位要求:1.本科以上学历,计算机、应用数学、模式识别、人工智能、统计学等专业优先,三年以上相关实际工作经验,有系统设计、架构能力2.熟练掌握C、Java、scala、python等编程语言,熟悉hadoop spark hive,zookeeper,hbase, kafka, storm等大数据框架,钻研过框架源码;3.对机器学习、数据挖掘、概率统计等算法原理及其在互联网行业的应用有深入的理解;4.实现过高并发,高计算量的分布式系统有深度学习,强化学习,海量数据处理和并行计算开发经验优先;5.熟悉广电及工业互联网业务经验者优先。 职能类别:大数据开发工程师ETL开发工程师 关键字:大数据大数据开发 微信分享 +前程无忧网,人工智能,知名互联网公司 Java开发工程师,北京,2-3万/月,3-4年经验,本科,民营公司,,工作内容负责公司大数据平台的开发与维护工作;? 参与项目的需求分析、系统设计和编码等工作;? 依据软件需求进行软件设计并编写软件代码、单元测试;? 独立解决项目开发或产品研发中的技术问题;? 独立完成分配的功能模块的开发、测试工作;? 输出日常需要的文档;? 能适应出差到客户现场的沟通、开发与维护工作;任职要求? 本科及以上学历;? 三年以上Java实际开发经验;? 熟悉Spring,Hibernate,Mybatis等开源框架;? 熟悉关系型数据库(Postgres、MySQL)的使用、开发,并具有调优经验;? 熟悉Memcache、Redis等分布式缓存;? 熟悉Zookeeper、Eureka等分布式协同组件;? 熟悉Dubbo、Spring Cloud等开源分布式框架;? 熟悉OSI 7层网络协议;? 具有分布式系统开发经验,熟悉微服务架构;? 熟悉数据挖掘、人工智能算法者优先考虑;? 熟悉Hadoop、Hive、ElasticSearch、Spark、Storm、Flink等大数据处理框架者优先考虑;? 对网络安全、系统安全、安全数据分析具有浓厚兴趣者优先考虑。 职能类别:Java开发工程师 关键字:javaJava开发后端开发工程师 微信分享 +馒头招聘,学习,烧烤师,北京,5000-10000,不限,小学,民营,餐饮, +,学习,高薪直招月薪一万跟船出海电焊工,北京,8000-15000,不限,不限,民营,普工|技工|生产|机械, +华北人才网,学习,招聘房产经纪人,北京,8000-16000,不限,不限,民营,服务业, +呼伦贝尔,学习,高薪招聘会销专员,北京,5000-10000,不限,不限,民营,销售/客服/技术支持, +鄂州,学习,海量附近招聘创业的你,北京,8000-16000,不限,不限,民营,服务业, +,学习,直招跟船普工搬运工/月薪一万包吃住,北京,7000-15000,不限,不限,民营,普工|技工|生产|机械, +康强医疗人才网,学习,廊坊经营院长,北京,8000-15000,不限,大专,民营/其它,医疗, +医药人才网,学习,实习生招聘一单一结日300.,北京,9000-12000,不限,高中,民营,计算机/互联网, +电力人才网,学习,在线客服线上文员日300招聘,北京,9000-12000,不限,高中,民营,计算机/互联网, +吉林,学习,诚聘优秀店长,北京,8000-16000,不限,不限,民营,销售/客服/技术支持, +华北人才网,学习,7K以上急聘安全员,北京,7000-8500,不限,大专,民营,建筑/房地产, +,学习,直招跟船保安高薪包吃包住五险一金,北京,7000-15000,不限,不限,民营,家政|保安|物业|淘宝, +,学习,高薪直招跟船出海叉车工月过万五险一金,北京,8000-15000,不限,不限,民营,普工|技工|生产|机械, +百姓网,学习,呼和浩特高铁乘务员餐吧员安检员招聘,北京,8000以上,不限,不限,民营,行政/后勤, +,学习,高薪直招随船出海维修电工包吃住有五险一金,北京,8000-15000,不限,不限,民营,普工|技工|生产|机械, +百姓网,学习,呼和浩特高铁乘务员招聘好岗位招聘,北京,8000以上,不限,不限,民营,行政/后勤, +华北人才网,学习,游泳馆预售高薪招聘销售,北京,8000-16000,不限,不限,民营,咨询/法律/教育/科研, +百姓网,学习,呼和浩特高端职位高铁乘务员招聘,北京,8000以上,不限,不限,民营,行政/后勤, +吉林,学习,直招送餐员配车管住,北京,6000-12000,不限,不限,民营,服务业, +百姓网,学习,呼和浩特相伴复兴号高铁乘务员招聘,北京,8000以上,不限,不限,民营,行政/后勤, +前程无忧网,学习,人工智能类-机器学习工程师-北京,北京,,本科,,民营公司,,工作职责:1、应用机器学习、深度学习、分类聚类等相关技术进行算法研发;2、基于地产业务数据的模型拟合、数据挖掘工作等;3、基于用户行为数据及画像、商品信息数据,构建推荐场景的预估模型、多目标排序模型等。任职要求:1、本科及以上学历, 计算机、软件工程、机器学习、应用数学、模式识别、人工智能等相关专业;2、热爱计算机科学和开发技术,对算法有浓厚兴趣;3、熟悉分类、聚类等常用算法模型;4、有同方向项目经验、学术比赛经验以及发表过顶会论文者优先。 职能类别:软件工程师 微信分享 +前程无忧网,学习,深度学习和降阶模型快速算法研发工程师 (职位编号:986),北京,1-2万/月,无需经验,硕士,民营公司,,岗位职责:1.面对军事、民用领域的软件开发和仿真分析需求,完成关键数据的系统整理与分析;2.建立高效准确的降阶模型,优化算法和软件功能的开发过程,通过数学建模与快速算法解决实际工程问题。任职要求:1.硕士及以上学历,博士学位优先;2.具有良好的数学基础,对模型的建立、使用和升级有较多工程经验;3.熟练使用数据分析软件。 工作地点:大连、沈阳、西安、北京、无锡 职能类别:高级软件工程师算法工程师 关键字:数学建模降阶模型 微信分享 +前程无忧网,学习,深度学习数据工程实习生 (职位编号:6874760038759368967),北京,0.6-1万/月,在校生/应届生,本科,民营公司,,"职位描述:1、负责数据收集。根据特定的要求标签,事件等,整理创建用于爬数据的工具,并管理大规模数据;2、创建用于数据可视化,标记和清洁的文档和工具;3、与标签团队合作进行数据标注修正;4、负责进行模型测试和评估,将模型部署到平台以测试收益,通过专项分析,输出专项分析报告,为业务模块的决策和产品方向提供数据支持;5、为公开开放数据集基准测试创建工具;6、参与数据底层的工具、平台、部署流程等技术体系建设的研发工作。职位要求:1、计算机、电子、自动化等相关专业硕士及以上学历;2、熟悉Python、Linux OS;3、有HDFS/Spark等数据平台开发和使用经验;4、有一定的 SQL 经验;5、良好的英语沟通/写作能力;6、有比较好的主观能动性,善于沟通,工作积极主动,责任心强,具备良好的团队协作能力。具有以下条件者优先:1、 熟悉多项大数据领域的开源框架,如Hadoop, Hive, Presto, Storm, Spark, Kafka, HBase, Redis, RocksDB, ElasticSearch, Druid等; 2、 强悍的编码和 troubleshooting 能力;3、具有分布式大规模深度学习数据管理的经验。 职能类别:软件工程师 微信分享" +前程无忧网,学习,阿里云智能-企业学习平台研发专家-北京/杭州 (职位编号:GP680066),北京,,5-7年经验,本科,上市公司,,1.参与完成项目的系统分析、设计,能够主导完成系统架构设计,并负责核心业务功能与底层基础功能的架构设计、代码编写。2.能够在团队中主导code review任务,确保相关代码的有效性和正确性,并能够通过code review提出相关性能以及稳定性等方面相关建议。3.参与建设通用、灵活、智能的在线系统平台的设计与开发,支撑上层多场景的复杂业务。1. 本科或以上学历,计算机软件或相关专业,3年以上互联网公司Java开发经验;2. 熟悉互联网分布式技术体系,对各类常用中间件有深入理解;有高并发、大流量、高性能、高稳定性系统设计与问题处理经验;3. 有较强的关注细节,沟通和理解能力,善于团队合作,理解和适应变化,为结果负责;4. 有在线培训、教育、网校网课等行业在线系统平台设计和研发经验者优先; 职能类别:软件工程师 微信分享 +前程无忧网,学习,Java开发工程师(机器学习平台),北京,1.5-2.5万/月,3-4年经验,本科,民营公司,,"1. 参与/负责哗啦啦机器学习平台建设,核心功能代码编写,重点项目架构设计/开发。2. 与算法大牛一同落地算法服务化,业务化。3. 算法部门后台工程师关门子弟,若你不甘于仅写CRUD,非常欢迎参与架构,业务,大数据,机器学习技术等方向。岗位要求:1. JAVA基础扎实,熟悉io、多线程并发、集合等基础框架。2. 3年以上Java开发经验,有较好J2EE技术体系背景,熟悉Springboot、Grpc、Mybatis等基础框架和系统。3. 熟悉unix/linux操作系统。4. 有较强的逻辑思维能力,善于分析和解决问题,有较强的主动性和自驱力,能够发现问题,并推动系统演进至完美状态。5. 有大数居、机器学习技术经验加分。【我们的成就】1.超过40万餐饮商户2.连锁客户占比78%3.年交易量占全国餐饮流水占比10%4.覆盖C端用户超1亿人【我们能提供】1.定期晋升调薪机会2.团队年轻有活力,学习氛围浓厚,定期分享培训、丰富多彩的团建活动3.可以与来自BAT、用友、金蝶等公司的技术大咖碰撞,擦出新火花!4.交通便利,汇集多条地铁及公交线路欢迎餐饮领域志同道合的伙伴加入! 职能类别:软件工程师 微信分享" +前程无忧网,学习,数字化学习平台架构师,北京,3-6万/月,5-7年经验,大专,外资(欧美),,主要工作职责:1. 服务于豪华汽车品牌,依托现有对品牌现有数字化学习平台的整体架构和内容进行不断优化,设计当前架构以及前瞻未来架构,旨在为汽车品牌以及经销商人员提供省时、高效的知识服务2. 负责数字化学习平台的需求分析、前后端、产品、测试等环节的管理工作3. 结合目前市面上数字化学习平台(如:混沌大学、得到等)搭建的优秀做法,搭建框架,提供一套各行各业提取的多元化思维模型课程4. 对数字化学习平台的业务架构、数据架构、应用架构负责,并进行结束落地5. 持续提升数字化学习平台的优化,确保高可用性、可扩展性、安全等,并指导团队落地6. 参与数字化学习平台的维护和推展,主导架构、标准的制定,为设计、开发和部署提供架构指导原则任职要求:1、5年以上行业解决方案或架构设计的从业经验2、熟悉数字数字化学习平台的运营体系、模式、技术等3、对新技术持有敏感性以及愿意致力于新技术的探索和研究4、具备良好的学习能力、沟通能力、分析及解决问题能力,优秀的团队协作精神,能够指导他人工作 职能类别:系统架构设计师 关键字:平台架构设计 微信分享 +前程无忧网,学习,机器学习岗,北京,,2年经验,本科,合资,,"职责:1、结合业务需要提出合适的算法解决方案,推动方案在业务系统中实现,构建实时化高并发系统,例如基于大规模用户行为建立推荐系统。算法包括但不限于机器学习、推荐系统、自然语言处理、文本挖掘等;2、追踪算法前沿技术,结合业务特点,探索将前沿的算法技术应用于实际业务。要求:1、计算机、数学或者统计学相关专业本科以上学历;2、熟悉常用的一种或多种编程工具,如Java, Python,C++等,有2年以上开发实践经验;3、对主流机器学习算法有深入了解,对nlp或ctr预估有相关项目经验者尤佳;4、自我驱动意识和抗压能力,良好团队合作精神。 对以上职位有意者,请于2021年1月15日前将中英文求职信、简历E-MAIL至:bocitalent@bocichina.com.cn,请在标题栏注明“应聘*****岗位”。 职能类别:其他 微信分享" +前程无忧网,学习,深度学习研发工程师,北京,1-2万/月,3-4年经验,硕士,民营公司,,"岗位职责:1.负责基于深度学习的文字行检测算法研究2.负责基于深度学习的文字行识别算法研究3.负责基于深度学习的OCR算法和技术的研发工作,更注重于预研技术或项目   任职要求:1.计算机、模式识别等相关专业硕士及以上学历;2.对cnn,rcnn,lstm熟悉,并且有一定深度学习实战经验者优先3.对常用的开源实现,如opencv、dlib、Caffe等有实践经验;4.熟练掌握c/c++/matlab等编程语言;5.积极向上,具有学习的意愿优先; 职能类别:高级软件工程师软件工程师 微信分享" +前程无忧网,学习,机器学习策略开发,北京,1.5-2万/月,1年经验,本科,民营公司,,工作内容:1、使用机器学习算法开发量化交易策略。 2、与团队合作对现有模型进行调试改进。3、负责高频数据量化策略研究与开发。任职要求: 1、熟练使用python语言。熟练使用Numpy,Scipy等科学计算库、Pandas等数值计算库;2、熟悉sklearn、nlp等机器学习工具包;3、熟悉至少一种深度学习框架,如:TensorFlow、Caffe、Theano、Keras、ConvNet、Torch等;4、在遗传规划、深度学习领域有项目经验及算法实现能力者优先考虑;5、有高频量化交易策略开发经验者优先。 职能类别:软件工程师 微信分享 +前程无忧网,学习,java开发工程师(HYZC1wl)(J12439),北京,1-1.5万/月,2年经验,本科,上市公司,,"工作职责:1. 从事Java开发和前端应用开发,参与软件的架构设计与研发,参与并负责完成代码开发;2. 负责线上系统性能优化、漏洞修复及bug解决;3. 除完成单元测试外,需配合测试人员完成测试集成测试、验收测试等;4. 参与系统的相关文档的编写工作。任职资格:1. 计算机相关专业本科及以上学历,2年以上java开发经验,并在至少一个项目中承担过核心开发工作,java基础扎实,熟练使用各种集合框架、I/O操作等;2. 熟练使用常用关系型数据库:如mysql和oracle,,具备常见SQL的优化能力,熟悉常见NoSql数据库:hbase等的基本操作;3. 熟练使用tomcat、nginx等常用web服务器;4. 了解jvm的基本原理及常用参数,熟悉类加载机制、GC机制等,有JVM调优经验优先;5. 熟悉多线程编程,有相关项目的开发经验;6. 熟练使用至少1中消息队列:如kafka、RabbitMQ等;7. 熟练使用spring、mybatis、springboot等开源框架;8. 熟练使用redis、MongoDB等缓存数据库;9. 大数据开发相关经验优先;10. 熟悉设计原则(开闭原则、里氏替换等),并能熟练常用的设计模式(单例模式、工厂模式、代理模式等);11. 具有良好的表达能力和人际沟通技巧,具有良好的团队合作精神,工作认真负责,善于学习。 职能类别:Java开发工程师 微信分享" +前程无忧网,学习,软件工程师,北京,0.9-1.8万/月,2年经验,本科,民营公司,,岗位职责:1、从事仪器应用软件的开发工作;2、负责公司相关模块或产品软件的升级与维护工作;3、负责公司其他研发部门所需内部软件的开发工作;4、协助对公司其他部门提供软件使用的技术咨询。任职要求:1、全日制本科及以上学历,信息技术、电子、数学、计算机等相关专业,具有一年以上C/C++软件开发工作经验;2、熟悉Windows或Linux平台下应用软件开发,有多线程编程经验;3、精通C/C++语言,熟悉Qt或MFC的使用,熟练使用VS或Qt Creator进行软件开发,动态库开发,有界面开发经验;4、具有较强的逻辑分析能力和学习能力,责任心强,能独立负责相关业务;5、计算机基础知识扎实,熟悉常用数据结构、算法;6、有过相机开发经验,熟悉图像处理基本算法优先考虑。 职能类别:C/C++开发工程师 微信分享 +前程无忧网,学习,资深Python后端研发,北京,2.5-3.5万/月,3-4年经验,本科,事业单位,,职位描述:1、参与公司某个产品线后端研发团队的搭建和管理;2、设计技术构架、控制代码质量;3、主导或参与系统设计、研发、部署等相关工作;4、研发基础服务组件,解决共性需求,减少重复开发;5、参与部分生产系统维护工作,解决生产系统问题及进行系统调优。职位要求:1、计算机及其相关专业,本科及以上学历;2、5年以上的研发经验,有管理经验,能够打造快速进步的优秀团队;3、熟练掌握Python,熟练掌握PHP、JAVA优先;4、熟悉MYSQL、NOSQL、消息队列等常用WEB组件;5、有较强的系统问题分析经验和能力,能够解决复杂的系统问题;6、有较强的学习能力,有强烈的求知欲、好奇心和进取心,有良好的沟通能力和业务理解能力。 职能类别:Python开发工程师 微信分享 +前程无忧网,学习,高级java开发工程师(001001) (职位编号:UEC001001),北京,2-3万/月,5-7年经验,大专,上市公司,,岗位职责:1、按照客户的开发需求,完成项目交付2、 与客户现场的交流沟通;3、 与销售的沟通,完成交付质量; 任职资格:1、掌握主流框架,例如分布式体系结构,缓存,消息队列,微服务以及包括但2不限于Spring,MyBatis,Spring Cloud,Redis,Kafka在内的技术2、熟练掌握主流数据库,例如MySQL,Oracle,Postgre SQL,MongoDB,Hbase;3、精通Tomcat和Nginx等主流Web应用程序;4、具有大型数据集和繁重的Web流量环境的经验;5、具有扎实的基于云的开发经验,具有SAAS平台经验者优先;6、非常熟悉版本控制系统,尤其是GIT;7、擅长解释分析、设计和实施指令--以口头、书面(如用例简介、敏捷用户故事、功能需求和数据字典)或图表形式(如活动流、ERD和UI流;8、强大的分析、解决问题和调试技能;9、有电商平台开发经验者优先;10、对学习/实践新技术充满热情;11、了解敏捷和精益,能够在高度动态和变化的环境中工作;12、抗压能力强;13、有以结果和客户为导向的思维和工作方式;14、良好的英语读写能力;15、熟悉捷软件开发的过程。 职能类别:Java开发工程师 微信分享 +前程无忧网,学习,高级Java开发工程师,北京,1.5-2.5万/月,3-4年经验,大专,民营公司,,岗位职责:1、参与功能需求进行模块功能设计,负责完成核心代码;2、能独立完成软件设计;3、根据流程独立完成核心模块的设计和编码相关文档;4、技术分享、新技术研究。任职要求:1、精通java,熟练使用多线程,流操作,socket等基础技术,至少三年开发经验;2、精通数据库技术,有oracle数据库经验优先;3、熟悉spring技术体系,熟练使用springcloud优先;4、熟悉消息队列,缓存,事务机制;5、熟悉linux系统者优先;6、学习能力强,逻辑思维能力强,有创新精神,细心耐心。 职能类别:Java开发工程师软件工程师 关键字:springcloudredis消息队列RabbitMq缓存事务机制 微信分享 +前程无忧网,学习,测试工程师(软件&硬件),北京,4-7千/月,在校生/应届生,本科,民营公司,,岗位职责:1.负责linux操作系统产品的软件需求沟通,输出需求规格说明书;2.负责Linux操作系统产品的测试计划、测试方案等技术文档的编写;3.负责linux操作系统产品软硬件测试,并对测试中发现的问题进行分析和准确定位;4.负责客户使用说明书的编写; 5.负责客户现场应用过程中操作指导及问题跟踪解决;6.负责对关联部门提供相应的技术支持和培训。任职资格:1.本科及以上学历,计算机、自动化、通讯电子等相关专业;2.具有良好的沟通能力,优秀的学习、创新、分析与解决问题的能力;3.做事耐心细致,具有较强的团队协作意识与软件质量意识。福利待遇:1.底薪+全勤奖+午餐补助+通讯补助+季度奖金+年终奖2.节日慰问礼金+年度体检+年度员工旅游+丰富多彩的员工活动party3.根据实际需要可提供员工宿舍培养体系:新员工入职培训+入职导师指导+专业技能培训+公司级外派培训发展空间:1.纵向:中级测试工程师、高级测试工程师、测试主管2.横向:售前技术支持工程师、项目管理等 职能类别:软件测试工程师硬件测试工程师 关键字:嵌入式软件软件测试硬件测试 微信分享 +华北人才网,学习,招聘房产经纪人,北京,8000-16000,不限,不限,民营,服务业, +鄂州,学习,海量附近招聘创业的你,北京,8000-16000,不限,不限,民营,服务业, +呼伦贝尔,学习,高薪招聘会销专员,北京,5000-10000,不限,不限,民营,销售/客服/技术支持, +百姓网,学习,呼和浩特相伴复兴号高铁乘务员招聘,北京,8000以上,不限,不限,民营,行政/后勤, +百姓网,学习,呼和浩特高端职位高铁乘务员招聘,北京,8000以上,不限,不限,民营,行政/后勤, +馒头招聘,学习,烧烤师,北京,5000-10000,不限,小学,民营,餐饮, +,学习,直招跟船普工搬运工/月薪一万包吃住,北京,7000-15000,不限,不限,民营,普工|技工|生产|机械, +百姓网,学习,呼和浩特高铁乘务员招聘好岗位招聘,北京,8000以上,不限,不限,民营,行政/后勤, +吉林,学习,直招送餐员配车管住,北京,6000-12000,不限,不限,民营,服务业, +华北人才网,学习,7K以上急聘安全员,北京,7000-8500,不限,大专,民营,建筑/房地产, +,学习,高薪直招随船出海维修电工包吃住有五险一金,北京,8000-15000,不限,不限,民营,普工|技工|生产|机械, +,学习,直招跟船保安高薪包吃包住五险一金,北京,7000-15000,不限,不限,民营,家政|保安|物业|淘宝, +,学习,高薪直招跟船出海叉车工月过万五险一金,北京,8000-15000,不限,不限,民营,普工|技工|生产|机械, +康强医疗人才网,学习,廊坊经营院长,北京,8000-15000,不限,大专,民营/其它,医疗, +华北人才网,学习,游泳馆预售高薪招聘销售,北京,8000-16000,不限,不限,民营,咨询/法律/教育/科研, +百姓网,学习,呼和浩特高铁乘务员餐吧员安检员招聘,北京,8000以上,不限,不限,民营,行政/后勤, +电力人才网,学习,在线客服线上文员日300招聘,北京,9000-12000,不限,高中,民营,计算机/互联网, +,学习,高薪直招月薪一万跟船出海电焊工,北京,8000-15000,不限,不限,民营,普工|技工|生产|机械, +医药人才网,学习,实习生招聘一单一结日300.,北京,9000-12000,不限,高中,民营,计算机/互联网, +吉林,学习,诚聘优秀店长,北京,8000-16000,不限,不限,民营,销售/客服/技术支持, +前程无忧网,学习,智慧油田-软件开发工程师(java)-1,北京,1.5-3万/月,5-7年经验,本科,国企,,负责油田项目集(公共基础应用组件项目)相关服务端的需求分析、设计和开发工作。 1、计算机相关专业,本科及以上学历,5年以上实际Java项目开发工作经验;2、熟悉当前主流开发框架SpringMVC、SpringCloud、Hibernate/Mybatis等;3、熟练掌握PostgreSQL、Oracle等主流数据库的应用,能写高性能的SQL语句;4、具有软件项目现场实施经验,具有云平台相关软件运维能力;5、具有跟客户、合作厂商的良好沟通能力;6、具有良好的学习能力,能快速熟悉产品,整理文档,并对客户进行使用培训和问题定位与修复;7、工作积极主动责任心强;8、保证项目按时交付。9、优先条件:可接受海外长期出差;10、优先条件:英语语口语良好的优先; 职能类别:高级软件工程师 关键字:软件开发 微信分享 +前程无忧网,学习,测试工程师-路侧,北京,6-8千/月,在校生/应届生,本科,上市公司,,岗位职责:1. 负责车联网通信产品、平台产品、app产品的测试工作;2. 参与产品需求评审;3. 负责设计、编写测试用例,组织测试用例评审;4. 对测试问题分析总结,编写测试报告。任职资格:1、熟悉网络协议、通信原理;2、熟悉linux系统,常用命令;3、对软件测试有浓厚兴趣,有提升产品品质意识,有较强的分析能力;4、良好的学习习惯,有团队合作精神。 职能类别:测试工程师 微信分享 +前程无忧网,学习,Java高级开发工程师,北京,15-25万/年,5-7年经验,本科,上市公司,,"岗位职责1、 参与系统的需求调研和需求分析,撰写相关技术文档;2、 搭建系统开发环境,完成系统框架和核心代码的实现;3、 项目概要设计、详细设计、开发计划等的编制并实施;4、 系统开发测试、部署和集成;5、 负责解决开发过程中的技术问题;6、 参与代码维护与备份。岗位要求:1、 研究生1年以上,本科3年以上计算机及相关专业学历;2、 三年以上Java开发经验;熟悉Java Socket编程,Java多线程技术;3、 熟悉Java数据库编程;4、 对J2EE体系有一定了解;5、 掌握面向对象的开发思想和方法;6、 工作踏实,责任心强,具有良好的团队精神;7、 学习能力强,有一定英文文档阅读能力;8、 熟悉PKI体系,具有JCE、JCA、JSSE等技术的实践经验者优先。 职能类别:高级软件工程师 微信分享" +前程无忧网,学习,中间件研发工程师,北京,2.5-3万/月,在校生/应届生,硕士,国企,,岗位职责:1.参与中间件需求分析、功能设计以及研发运维工作;2.参与新技术、中间件的调研与选型引入工作;3.按照项目计划,与所在组其他成员协同工作,完成开发任务。任职要求:1.硕士及以上学历,限计算机、软件工程等相关专业;2.有一定开发语言基础(Java/Golang等),有技术热情,喜欢钻研开源项目、框架源码优先考虑;3.工作主动,善于学习与独立思考,能够独立分析和解决问题;4.有较强的逻辑分析能力、执行能力、沟通协调能力、学习能力和责任心。 职能类别:高级软件工程师 关键字:校园招聘 微信分享 +前程无忧网,学习,Java开发工程师,北京,,本科,,民营公司,,"岗位职责:1.     参与产品需求讨论,负责后台系统的需求分析和功能设计,完成产品的开发和维护;2.     能够独立负责具体业务模块的开发,按时、高质量完成工作,确保代码质量;3.     解决开发过程中遇到的技术和业务问题,确保所负责系统的持续稳定运行;4.     对现有系统持续进行优化和改进;5.     配合测试部门进行BUG修复。任职要求:1.     本科及以上学历,计算机相关专业,扎实的Java基础知识;2.     了解JavaScript、AJAX , 了解HTML,CSS,XML;3.     思路清晰、善于思考,具备独立分析及解决问题能力;4.     学习能力强、责任心强、有良好的沟通能力。  职能类别:软件工程师Java开发工程师 关键字:JAVA开发工程师软件软件工程师HTMLJAVA工程师JAVA实习生 微信分享" +前程无忧网,学习,JAVA软件开发工程师(北京) (职位编号:8),北京,,本科,,民营公司,,岗位职责:    从事金融行业软件产品开发工作。基本要求:    本科或硕士,计算机、软件、信息、通信、数学等相关理工类专业;    学习能力突出,基础扎实,有责任心,思维活跃,有较好的沟通能力和团队协作精神;    熟悉JAVA/数据库等一种或多种技术,热爱软件开发工作,愿意致力于金融IT领域研发。 职能类别:Java开发工程师软件工程师 关键字:金融IT外汇开发 微信分享 +前程无忧网,学习,FPGA工程师,北京,,硕士,,国企,,职责范围: 1.参与研发需求论证 ;2.负责协议FPGA NR各个信道的相关设计工作;3.负责相关产品维护、问题定位;4、负责综测仪FPGA开发设计工作;任职要求:1.全日制大学通信、电子相关专业,硕士及以上;2.熟悉和深刻理解通信原理和数字信号处理的基本概念;3.对于链路级或系统级仿真有较为深入的了解的优先; 4.能够运用英文阅读通信物理层协议、算法文献资料;5.英语六级; 6.具备快速的学习能力,良好的交流沟通能力以及团队协作能力。 职能类别:其他 微信分享 +前程无忧网,学习,数据开发工程师,北京,,本科,,上市公司,,岗位职责:1.       负责数据平台核心引擎的开发与优化2.       负责数据接入系统、数据查询系统的开发与维护3.       负责大数据平台的开发、测试和运维工作; 4.       项目交付过程中的开发文档编写。 岗位要求:1.       计算机或相关专业毕业,本科及以上学历,有 Hadoop 及相关生态的应用与开发经验;2.       熟练掌握 Linux 系统下的 C 语言和 Java 语言编程,有良好的代码习惯;3.       了解 MPP 架构,有 Impala/Hive/Spark 等计算系统底层执行引擎调优经验者优先;4.       对大数据方向感兴趣,乐于帮助客户实现数据驱动;5.       计算机基础知识扎实,对分布式系统具有浓厚兴趣;6.       对接触各种互联网产品感兴趣,乐于培养自身的产品意识;7.       快速学习能力,主动性强。 职能类别:Java开发工程师 微信分享 +前程无忧网,学习,软件研发实习生(Java)(北京),北京,4.5-6千/月,本科,,合资,,任职要求:1、计算机相关专业,本科以上学历,优质院校优先考虑;2、在校期间学习过较全面的计算机原理、数据结构、设计模式、计算机网络、数据库技术等软件工程知识;3、Java基础良好,熟练使用SSM框架,熟练使用SVN、GIT等版本管理工具、熟练使用Eclipse/IDEA等开发工具;4、熟练使用SpringBoot、SpringCloud、Maven等优先;5、在校期间参与过软件开发竞技比赛并取得较好成绩的优先;6、学习能力强,认真能吃苦,有良好的沟通表达能力。岗位职责:1、承接项目任务分配,根据任务具体要求,完成软件研发及运行维护等工作;2、负责相关文档类材料的编写、更新等工作; 3、负责产品及项目研发;4、负责产品上线实施部署运维工作。 职能类别:Java开发工程师 微信分享 +前程无忧网,学习,通信软件工程师(北京) (职位编号:06),北京,,本科,,外资(欧美),,岗位职责:1. 负责5G/4G/3G/2G/WiFi/BT/GNSS/NBIoT/eMTC/TCPIP等通信软件的设计、开发、集成验证和维护;2. 5G NR/4G LTE 物理层软件/协议栈软件研发;3. 5G未来演进方向通信软件研发,包括但不限于车联网/NR Lite/毫米波等方向;4. 分析和解决消费电子、工业电子产品项目对应的通信软件问题。任职要求:1. 计算机/通信/信号处理/电子/软件工程/自动化/(但并不限于)等专业本科及以上学历;2..掌握C/C++/Python/汇编等一种或几种编程语言,熟悉嵌入式软件开发流程;3. 具有ARM、DSP开发经验,MATLAB编程经验,FPGA开发经验优先;4 了解3GPP 5G/4G相关的标准知识,从事过相关研究优先;5. 积极主动、充满热情、学习能力强、善于沟通、具有良好的团队协作能力。 职能类别:软件工程师 微信分享 +前程无忧网,学习,软件开发(北京),北京,,本科,,国企,,基本要求1、遵纪守法、诚实守信,具有良好的个人品质,无不良记录;2、具有较好的团队合作精神、语言沟通能力和学习能力;3、具有正常履行工作职责的身体条件,和健康良好的心理素质;4、全日制大学本科及以上学历,计算机、软件工程、电子工程、通讯工程、信息工程、自动化、网络与安全、物联网、大数据、人工智能、数学、统计、金融等相关专业;5、符合公司亲属回避的有关规定。岗位要求:1、热爱编程,熟悉操作系统、编译原理、数据结构等;2、熟悉Java、Python、C等常见语言之一;3、计算机技术、软件工程、电子工程、自动化、网络与安全等信息科技类专业。 职能类别:软件工程师 微信分享 +前程无忧网,学习,CPUBJ-07 X86 System Software Engineer- Linux (职位编号:CPUBJ-07),北京,,硕士,,国企,,"【职责描述】1. 开发Linux内核态驱动以及相关的内核栈模块。2. 在Linux OS上进行系统级验证以及模块级验证, 包括同硬件部门合作进行相关问题的调试。3. 跟踪最新的行业标准,在深入了解Linux OS行为模式的基础上参与SOC的架构设计。4. 维护现有的Linux驱动、应用软件和软件产品。【任职要求】1. 计算机或者电子工程相关专业,硕士及以上学历,博士优先。2. 具备良好的C、C++、BASH编程基础。3. 熟悉Linux操作系统,熟悉Linux驱动;有Linux驱动开发、Linux系统移植、Linux应用软件开发经验者优先。4. 具有良好的学习能力/沟通能力。 职能类别:研究生软件工程师 微信分享" +前程无忧网,学习,测试工程师,北京,6-8千/月,本科,,民营公司,,岗位职责1、全面理解游戏产品的功能及非功能需求,并根据需求进行测试设计及测试用例的编写;2、对测试中发现的问题进行分析和定位,与开发人员、需求人员沟通解决方案;3、发现工作中的效率提升点,开发需要的测试工具,不断优化与改进岗位要求1、国家正规统招本科及以上学历,计算机软件、通信、信息、网络工程、软件测试或相关专业毕业,熟悉软件测试流程优先;2、熟悉数据库存储过程的编写,至少熟悉一种编程语言,会python者优先;3、有较强的逻辑分析能力和学习能力;拥有较好的沟通技巧及团队合作精神,较强的责任感及进取精神;4、热爱软件测试工作,可以胜任重复性工作,工作细致认真,有耐心;5、热爱手机游戏行业,学习和创新能力强,乐于接受有挑战的工作,工作认真细致,能够承受较大的工作压力。薪酬范围年薪10万起,实习薪资150—200/天 职能类别:测试工程师 微信分享 +前程无忧网,学习,Java高级开发工程师,北京,1.3-1.8万/月,5-7年经验,本科,合资,,【岗位职责】:    1、负责公司相关产品平台核心代码开发;    2、参与公司系统架构设计和部分开发;    3、进行系统重构与优化,涉及性能、算法和大规模数据处理方面;    4、技术调研选型以及难点攻关;    5、其它上级安排工作。        【任职要求】:    1、本科以上学历,4年以上JAVA开发经验,计算机相关专业毕业;    2、精通多线程技术,能够处理高并发或者异步模型;    3、熟练掌握JAVA高级特性,例如反射、nio、锁机制等;    4、熟练掌握常见设计模式以及开源框架,理解其内部运作机制并可进行扩展;    5、熟料掌握一种以上常见关系型数据库并可进行相关的性能优化;    6、熟练掌握一种以上NoSQL数据库,并能够设计对应的业务模型;    7、可构建高性能的web系统并了解常见的优化方法;    8、良好代码习惯和自主学习能力,有抽象、系统重构、架构设计经验者优先;    9、有分布式系统开发经验者优先;    10. 有SpringCloud开发经验者优先 职能类别:Java开发工程师 关键字:java软件开发 微信分享 +前程无忧网,学习,测试工程师,北京,0.5-1万/月,无需经验,本科,国企,,1. 对测试需求进行分析,编写测试大纲、测试说明2. 依据测试大纲和软件编写测试说明3. 能够使用通用的接口、性能等测试工具4. 编写测试记录及测试报告任职要求:1. 本科及以上学历2. 通信、电子、计算机等相关专业3. 熟悉软件测试的基本知识和相关流程4. 熟悉C/C++、Java、Python等一种或多种语言5. 具有计算机、通信、网络、数据库相关专业知识6. 具有清晰的逻辑思维、较强的学习能力、良好的沟通能力和语言表达能力7. 能够适应一定强度的出差 职能类别:软件测试工程师 微信分享 +前程无忧网,学习,java开发-LINE(外企正编,日韩版wechat),北京,1.5-3万/月,3-4年经验,本科,民营公司,,"想回大连发展,厌倦996,想逃离北深杭的同学一定要往下康康!!!!!非外包、猎头项目,正编(非统招全日制本科、非互联网行业的童鞋勿投)LINE是全球三大即时通讯软件之一,于2011年6月正式推向市场。上线后迅速风靡全世界,支持17种语言版本,覆盖220多个国家和地区,全球用户突破5亿,下载量超过10亿。涵盖语音视频通话,手机游戏,新闻资讯,音乐,电子商务等服务,拥有超越一般即时通讯软件的运作模式。LINE Corporation总部位于日本。自2011年6月发布LINE以来,LINE Corporation一直将其业务核心放在LINE服务上,并积极推动该服务在全球范围内的进一步拓展,以及LINE平台的加速开发。LINE China大连研发中心作为LINE在全球的5个研发中心之一,研发团队以其精湛的技术能力,主要负责LINE platform的基础研发功能及LINE GAME Service相关平台产品的研发业务。其业务内容涵盖了AI,Timeline,图形开发,LINE基础平台,LINE游戏开发者平台,LINE自动化测试平台等产品的研发工作。福利待遇:基本不加班(弹性855,加班会有加班费)薪酬福利:基本工资+餐补+绩效奖金+法定加班费+其他?-五险一金+商业保险(补充医疗保险配偶&未成年子女都可享受)-逐年递增的带薪年假,奖励休假-免费早餐, 下午茶,健身器材-年度Outing,Team Outing,员工俱乐部-环境简单,技术导向java开发工程师岗位职责:负责LINE软件相关高并发、高可用、分布式服务端系统的架构设计及开发。主要包括TIMELINE、机器学习开放平台、AI 文字检测及图像识别等产品。岗位要求:1. 3年以上的java开发工作经验,有互联网行业开发经验的优先。2. Java基础扎实,熟悉Java虚拟机原理、Java高级特性和类库、Java网络与服务器编程、Java多线程编程。3. 精通分布式架构,熟悉主流的微服务框架,如Spring Cloud、Dubbo、Zookeeper等,并精通其原理。4. 熟练掌握主流的中间件,如mysql,redis,hbase,mongodb,kafka,elasticsearch等,并了解原理。5. 优秀的web前端js技术,熟练掌握jquery、reactjs、vue等前端框架。6. 研究过HTTP协议、缓存、JVM调优、序列化、NIO、RPC框架等,并且有相关实践经验。7. 了解Docker和Kubernetes技术,有运维能力,有Kubernetes二次开发经验的优先。8. 扎实的计算机网络、数据结构、操作系统、算法等基础知识。9. 较高的技术钻研能力、技术攻关能力,分析问题解决问题的能力,能独立承担任务和有系统进度把控能力,能够独立负责跨组项目,并保证结果。10. 具备良好的编码习惯和技术文档编写能力,可阅读英文技术文档,具有很强的沟通能力。加分项:1. 有一线或二线互联网公司工作背景。2. 有过高可用,高并发项目经验。3. 对技术有追求,善于思考总结技术问题,有自己的技术博客。4.除岗位要求外,涉及到以下技术栈会优先:Python/GO/Kafka/ES/ZooKeeper地址:大连市甘井子区火炬路3号【纳米大厦】 职能类别:Java开发工程师 关键字:java 微信分享" +前程无忧网,学习,Java开发工程师,北京,1-2万/月,2年经验,本科,民营公司,,岗位职责:1. 参与和负责项目系统的设计、开发、优化,按时提交高质量的代码,完成开发任务。2. 参与项目系统的产品设计、概要设计、数据库等详细设计文档的编写。3. 参与系统的测试、部署,与客户的协调等工作。4. 保证系统的高可用、高可靠、可扩展、安全等。任职要求:1. 计算机相关专业,1-3年JAVA开发经验,熟悉Spring、Spring Boot、Spring Cloud、Mybatis、Dubbo等框架和工具的使用。2. 基础知识扎实,熟悉常用的算法,喜欢技术钻研,有熟悉常用工具算法源码原理的优先考虑录用。3. 动手能力强,勇于探索,有解决复杂问题的决心、兴趣和能力。对于系统架构的设计和实现有独立思考和见解。4. 要求熟练应用Web后端开发的相关技术,包括Tomcat、MySQL、Redis、RocketMQ、RabbitMQ等。5. 要求有一定的客户端javascript编程能力,有过vue + element ui项目经验的优先考虑。6. 有医疗器械、体外诊断试剂行业开发工作经历的优先考虑录用。企业福利待遇:●有竞争力的薪资待遇,入职即交五险一金●完善的培训和学习体系,广阔的发展空间●法定节假日正常休,春节假期长达15天●节假日和生日福利,每年组织外出旅游●享受正规小区宿舍环境●喜欢运动的你不会孤单:许多的同事每天运动打卡●喜欢读书的你不会寂寞:购书经费能帮你清空书单●还有全年无休的咖啡与茶,各种各样零食免费供应●上班时间:8:30-17:30(弹性时间30分钟)●福利多多:双休,餐补,全勤奖,带薪年假 职能类别:Java开发工程师 关键字:java软件开发开发工程师java开发Web后端开发 微信分享 +前程无忧网,学习,Python开发工程师,北京,1.4-1.9万/月,3-4年经验,大专,外资(欧美),,工作职责:通过数据与算法结合,AI能力与业务场景结合,打造适用于地产、商业、长租、物业业务的AI基础能力平台。任职要求:1、大专及以上学历,3年以上Python工作经验;2、了解docker运行机制;3、至少掌握一种WEB框架,精通Django者优先考虑;4、 掌握Linux系统使用,能够在linux环境下进行工作;5、 良好的沟通技能和学习能力,团队合作精神,能独立承担工作。 职能类别:Python开发工程师 关键字:python 微信分享 +前程无忧网,学习,中级Java工程师,北京,1.2-1.6万/月,3-4年经验,本科,上市公司,,岗位职责:1、参与项目的功能需求分析和系统概要设计,完成核心模块设计,并撰写相关文档;2、根据开发规范与流程独立完成核心模块的开发及测试工作;3、解决项目中的关键问题和技术难题;4、配合生产版本部署上线及验证等。任职要求:1、本科以上学历,计算机及相关专业;2、3年以上Java开发工作经验,熟悉JVM工作原理;3、熟悉常见设计模式,熟练使用 Spring、SpringMVC、Mybatis等框架,有Springboot、SpringCloud等相关框架开发经验优先;4、熟悉前端常用框架和技术:HTML、CSS、HTML5、JavaScript、jQuery、VUE、Nodejs等;5、熟悉Linux常用命令,至少熟练使用Mysql、Oracle、SqlServer其中一种,具有SQL编写及调优能力优先;6、熟悉常见消息中间件者优先,如:ActiveMQ、RabbitMQ、Kafka 等;7、熟悉Git、SVN、maven等版本控制工具;8、善于独立思考,有较强的责任心、学习力与探索精神,具备良好的团队合作精神和承受能力。(非外包公司,工作地点:丰台区) 职能类别:Java开发工程师 微信分享 +前程无忧网,学习,高级测试工程师,北京,1.5-2.5万/月,8-9年经验,本科,民营公司,,1、本科以上学历,计算机、数学、自动化等工科类专业,8年以上软件测试经验;2、能熟练地应用一门或几门开发语言,比如:Java; Linux/Unix Shell编程、Python;熟悉Jmeter或者Loadrunner工具,能够应用新方法、新工具提高测试效率;3、快速的产品及业务学习能力,敏捷而周到的逻辑思维能力、有责任心,敢于担当,工作积极主动;4、良好的沟通表达能力和学习领悟能力,热爱测试工作,细心、有技术敏感度、善于创新,具备良好的团队合作精神,责任感强,工作积极主动。5. 有金融、物流、医疗等相关业务系统经验者优先。 职能类别:系统测试 关键字:系统测试功能测试 微信分享 +前程无忧网,学习,29912-微视机器学习平台(北京) (职位编号:62881),北京,,3-4年经验,本科,民营公司,,岗位职责:1. 负责推荐、搜索、增长、商业化等场景算法的开发与迭代2. 负责深度学习框架的扩展与优化3. 负责机器学习平台的建设(样本平台、特征平台、算法仓库、模型仓库、评估与分析工具、全流程监控)4. 负责离线pipeline的建设与在线服务的优化(特征服务、rank服务)岗位要求:1. 掌握常用的机器学习算法和深度学习算法模型,有推荐或相关领域算法优化项目经验2. 熟练使用Tensorflow或其他类似的深度学习框架,对分布式训练与serving有了解,对源码有研究的是加分项3. 有平台设计与开发项目经验,有较强的分析、抽象和设计能力4. 掌握常用的大数据处理技术如hadoop技术栈,spark,kafka,flink等5. 掌握并深入一种以上rpc技术,一种以上kv技术,有分布式高并发在线服务项目经验6. 有较强的分析和解决问题的能力,学习能力,自驱能力和团队协作能力(以上要求满足其中3条及以上) 职能类别:高级软件工程师 微信分享 +前程无忧网,学习,C#开发工程师,北京,0.6-1万/月,无需经验,本科,上市公司,,岗位职责:1、 根据开发进度和任务分配,高质量完成相应软件的设计、开发、编程任务;2、 独立进行需求分析和功能设计,编写详细设计文档;3、 根据设计文档、需求说明或测试脚本领导系统技术测试;4、 分析并解决软件开发过程中的问题;5、 已有产品的软件部分维护更新工作使之保持可用性和稳定性;6、 能独立处理和解决所负责的任务。任职资格:1、计算机相关专业,统招本科(含)以上学历,具有一定的软件开发工作经验;2、精通C#编程技术,熟悉WebForm开发环境;3、能使用JavaScript及类似的客户端技术,对XML有基本的了解;4、精通SQL Server数据库,熟练掌握SQL语句,存储过程;5、善于沟通、责任心强、具备良好的团队合作精神;6、具有良好的语言表达和文档撰写能力;7、良好的自学能力,可以快速学习和掌握新的方法和技术。 职能类别:C#开发工程师 微信分享 +前程无忧网,学习,Splunk大数据工程师,北京,0.8-1.6万/月,1年经验,本科,上市公司,,"职位:Splunk大数据工程师岗位职责:1. 负责Splunk大数据产品相关项目的实施或开发工作;2. 负责Splunk大数据产品的运维和优化工作;3. 提供客户技术支持、培训等工作;4. 保持良好的客户关系,及时反馈客户信息。任职要求:1. 全日制本科以上学历,计算机相关专业,良好的英文读写能力;2. 熟悉Linux系统,了解Python语言或Linux Shell,1年以上工作经验;3. 熟悉主流的操作系统、应用中间件、数据库及网络基础知识;4. 有前端开发经验优先;5. 有安全运维相关工作经验优先;6. 具备较强的学习能力,进入到公司后通过培训能够快速掌握Splunk。 职能类别:大数据开发工程师 微信分享" +前程无忧网,学习,资深大数据开发工程师,北京,2.5-4.5万/月,5-7年经验,本科,民营公司,,工作职责: 1.负责万顺叫车出行侧产品用户行为数据采集,数据仓库、ETL任务设计及开发,大数据BI平台开发等工作; 2.负责相关业务的数据梳理以及流程优化,完善数据指标体系建设,为产品迭代提供数据化分析的方法论以及数据支撑; 3.承担策略分析、用户行为分析、业务运营分析等多方数据开发需求; 4.大数据ETL、计算任务等需求分析、设计、开发、维护,调优。 任职资格: 1.计算机、通信、数学,软件工程等相关专业毕业,大学本科以上学历,计算机基础扎实,3年以上工作经验; 2. 有扎实的编程能力,精通SQL、java、scala等语言,熟悉Linux命令、shell脚本; 3. 熟悉Hadoop\Hive\Spark\Flink\ClickHouse\Kafka\Storm\ElasticSerach等大数据相关技术; 4. 熟悉数据仓库、数据建模的理论并有丰富的实战经验;对数据敏感,具备很强的数据分析和解决问题的能力,有较强的数据驱动的意识; 5. 熟悉数据采集、传输、加工、存储、计算等数据处理流程,有全链路数据治理的方法论和实践经验; 6. 优秀的理解沟通能力;责任心强,具有良好的团队沟通与协作能力; 7. 有地图计算相关经验,包括:轨迹数据和地图数据分析经验优先; 8. 能承受一定的工作压力,有责任心和上进心,能通过持续学习完善自身,有担当,执行力强,乐于分享。 公司位于东四环金长安大厦9层、10层整层,办公环境优越 职能类别:大数据开发工程师 关键字:大数据开发java数据挖掘hadoopKafka\spark 微信分享 +前程无忧网,学习,Java开发工程师 (职位编号:FTC2-昆仑银行-01),北京,6-8千/月,1年经验,本科,上市公司,,岗位职责:1.Java类项目开发,涉及到银联前置、人脸支付等业务;2.负责按时按质完成项目经理交给的项目工作任务;3.负责主动了解工作范围边界和需求规格定义,对不明确的地方,***时间主动提出来细化、清晰化;4.负责主动积累、学习完成工作所需的业务知识和技术知识;5.完成上级领导交办的其他工作。任职资格:1、了解Spring mvc架构;2、熟练使用java开发;3、了解oracle数据库。 职能类别:Java开发工程师 微信分享 +前程无忧网,学习,Java开发工程师,北京,0.7-1.2万/月,1年经验,大专,上市公司,,职位描述:1、主要负责保险行业数据治理相关项目的后端开发及维护。2、性格开朗,学习及语言表达能力强,善于与人沟通、交流;3、热爱技术研发,快速主动的学习能力,注重代码质量,有良好的软件工程知识和编码规范意识;4、良好的沟通能力,思路清晰,善于思考,能独立分析和解决问题;5、有上进心,有强烈的责任心和团队合作精神,有良好的抗压能力,心态积极,能主动融入团队。6、有保险行业背景优先;技能要求:JAVA开发工程师1、专科及本科以上学历,计算机相关专业优先,2年以上研发经验;2、具有扎实的Java功底,对JVM的原理有一定的了解,具有较好的Java IO、多线程、网络等方面的编程能力;3、熟悉Spring、MyBatis,SpringBoot、Springcloud 等常用Java开源框架,对运行原理有较好的理解;4、熟悉Oracle、Mysql关系数据库,以及redis、mongodb等非关系型数据库,具有良好的SQL编写和优化能力;5、熟悉hadoop、hive等大数据开发技术;6、熟悉常规的分布式架构,熟悉缓存、消息队列等开源中间件; 职能类别:软件工程师 关键字:java软件开发 微信分享 +前程无忧网,学习,Java开发工程师,北京,1.6-1.8万/月,5-7年经验,本科,民营公司,,岗位职责:1.参与系统需求分析与设计,负责完成核心代码编写,接口规范制定。2.参与架构设计,服务性能效率优化等。3.拆解产品需求,提出技术实现方案和步骤。4.参与软件开发人员能力鉴定,指导软件开发人员能力提升。岗位要求:1.本科及以上计算机相关学历。2.5年以上Java项目开发经验,Java基础扎实,规范的编码,了解设计模式。3.熟悉常用的前端html、js、jquery、ajax、Json等相关技术。4.熟悉常用的数据结构,深入理解面向对象、MVC等相关概念。5.熟练使用sql以及相关优化,了解sql语句的一般规范,能够优化并清除慢查询语句,具备数据库应用系统的规划及设计能力。6.熟练操作Linux、Unix,熟悉Tomcat、Weblogic、WebSphere等服务端软件的配置与调优。7.积极主动,较强的学习能力,能够思考和优化解决方案,能够独立完成项目的设计和交付。 职能类别:Java开发工程师 关键字:htmljsjqueryajaxJsonLinuxUnixTomcatWeblogicWebSphere 微信分享 +前程无忧网,学习,大数据开发工程师,北京,1.5-2万/月,3-4年经验,本科,民营公司,,"1、负责公司的各类数据处理任务有数据仓库的使用和架构经验。2、负责配合算法团队,一起开发相应的大数据分析平台。 3、负责大数据集群搭建、优化。任职要求:1、计算机或相关专业本科以上学历,2年以上java开发经验,1年以上大数据工作经验。2、熟悉Linux平台上的开发环境,熟悉常用脚本语言。3、至少掌握一种计算框架Hadoop/Spark等。4、至少掌握一种分布式存储技术HBase/Cassandra等。5、至少掌握一种大数据ETL工具Hive/Spark等。 6、善于学习新的知识,对解决具有挑战性问题充满激情。 职能类别:大数据开发工程师 微信分享" +前程无忧网,学习,产业服务类(电子信息),北京,,硕士,,国企,,专业要求:计算机技术与工程、管理信息系统、电子信息类等相关专业应聘条件:1、2021年全日制国家统招重点高校及优秀专业院校应届毕业生; 2、硕士研究生(含)以上学历,所学专业符合应聘岗位要求;3、学习成绩优异,综合素质较高,能在2021年7月31日前按时取得相应学历的毕业证和学位证书;4、具有良好的英语听说读写能力;5、具有强烈事业心、责任感和团队精神;6、身体健康,精力充沛。注意事项:1、条件优秀者可解决北京户口;2、网上报名为本次招聘的唯一报名方式,每位应聘者仅限填报1个岗位;3、最终录用岗位将根据集团总部及子公司实际需求统筹安排;4、资格审核将贯穿招聘全过程,应聘人员须保证所提供信息真实可靠,如有发现弄虚作假者,取消其应聘及录用资格;5、招聘过程中,公司将通过应聘者在线报名时填写的联系方式(包括手机、E-MAIL等)与本人联系,请应聘者保持通讯畅通;6、中关村发展集团有权根据岗位需求变化及报名情况等因素,调整、取消或终止个别岗位的招聘工作,并对本次招聘享有最终解释权。 职能类别:电子工程师/技术员软件工程师 微信分享 +前程无忧网,学习,测试岗(校招岗位),北京,,本科,,合资,,1、根据测试计划,参与需求与设计评审、设计测试用例、执行测试任务,汇报测试结果;2、根据部门发展规划,进行测试技术预研和技术积累。1、本科及以上学历的应届毕业生,计算机、通信、电子等理工类相关专业;2、深入理解测试原理及测试方法,熟悉测试环境的搭建,掌握测试流程、过程和编写测试文档,熟练使用LoadRunner等性能测试工具; 3、熟悉HTTP协议、Oracle或MySQL等任意一种关系型数据库、WEB/WAP开发规范、常用Linux命令及WEB应用常识;4、诚信谦逊、踏实进取、严谨负责,有较强的沟通能力、学习能力,有强烈的创新意识。 职能类别:测试工程师 微信分享 +前程无忧网,学习,高级测试工程师,北京,1.5-2万/月,5-7年经验,大专,民营公司,,非外包,非外包,非外包!岗位职责1、负责公司贷款业务的功能性测试,制定项目测试方案,计划并实施,保证项目质量和进度;2、理解产品需求,进行测试用例的设计,讨论、完善和维护,并负责设计和实现相应工具、平台,提高效率与质量;3、对功能性测试过程中发现的缺陷进行跟踪分析和报告,推动测试中发现问题及时合理解决;4、设计与执行测试用例,跟踪定位产品软件中的缺陷或问题4、完成对产品的集成测试、系统测试,以及对产品进行必要的性能测试,对产品的功能、安全及其他方面的测试负责;5、总结测试过程中的问题,进行发布评估,并总结版本历史和遗留问题,为以后的测试提供关键依据;6、参与产品需求、系统设计和程序代码的评审工作,并提出改进意见。任职要求:1、计算机及相关专业统招本科及以上学历;2、5年以上软件测试工作经验,有2年及以上银行、网络贷款项目测试经验,有过贷款、核算、银行核心系统等银行业务经验者优先考虑; 3、精通软件测试理论和方法,能够设计高质量的测试用例、制定测试策略及方案、熟练使用测试管理工具(如Jira/禅道/QC等);4、自动化测试常用工具(如monkeyrunner、appiumselenium等);5、具有一定的性能测试能力,熟悉性能测试理论和方法,能熟练使用性能测试工具(jemter/Loadrunner等),熟练编写性能测试脚步,能定位性能瓶颈,有性能调优经验优先考虑;6、熟练使用Linux/Unix操作系统,能熟练使用常用操作命令。熟练操作DB2数据库;7、熟悉接口测试理论及方法,能熟练使用接口测试工具(postman等);8、善于学习和运用新知识,具有良好的分析和解决问题能力;9、对软件测试和软件工程有较好的理解,能承担一定压力,多任务并行能力强;10、熟悉银行业、互联网行业、互联网金融行业业务流程技术架构优先。优先选择:有过专业的测试培训者优先、有初级的JAVA/C/Python开发基础者优先、有设计、编码经验者优先; 职能类别:软件测试工程师测试工程师 关键字:银行 微信分享 +前程无忧网,学习,C#软件工程师,北京,1.5-2.5万/月,2年经验,本科,合资,,"岗位职能1.SECS/GEM软件和EFEM控制相关的研发及应用工作,支撑公司各设备部门对SEMI标准化及EFEM的应用需求。2. 基于现有平台架构,编写应用方案及设计文档。3. 完成半导体检测设备系统涉及平台相关的开发工作。4. 支持其他兄弟部门研发人员的系统集成相关工作。5. 技术支持和现场调试。岗位要求1、 本科及以上学历,计算机科学与技术、软件工程、自动化等相关专业;2、 熟练掌握C#语言,至少3年以上C#开发经验,熟悉C++;3、 具有面向对象编程思维,熟练应用各种设计模式;4、 熟悉SQL语言,有SQL Server或者Oracle数据库开发经验;5、 熟悉多线程编程,有线程同步、异步、阻塞等开发经验;6、 熟练掌握TCP/IP网络协议,熟悉RS232/485等数据通讯接口;7、 有较高的英语读写能力,较强的逻辑分析能力,具备较强的学习和总结能力;8、 有半导体软件开发经验,熟悉GEM/SECS等相关SEMI协议者优先录用。9、 为人积极热情,有团队合作精神。备注:公司总部在深圳,北京有研发中心,北京工作地点有:北京市大兴区经济技术开发区地盛中路3号B座106北京市海淀区西北旺东路10号院10号楼中关村新兴产业联盟大厦3层302室其他福利:5天8小时,入职即购买5险1金,假期按国家规定;午餐补贴+晚餐补助;高额的出差津贴;不间断的水果零食,每周集体下午茶,每月户外团建及员工生日party;节日礼品或礼金,结婚生子红包;上班交通方便,年度旅游、年度体检等。 职能类别:软件工程师 关键字:C#软件工程师 微信分享" +前程无忧网,学习,C++软件研发工程师(急聘2021应届硕士+落京户),北京,1-1.5万/月,在校生/应届生,硕士,国企,,岗位职责:1、负责平台及相关服务、组件的设计和研发工作;2、根据开发规范与研发流程进行编码;3、编码,测试,文档编写,上线部署和应急处理;4、参与技术选型,预研,设计评审,代码审查;5、同产品经理一起参与项目的需求分析和设计;6、解决项目生命周期中可能遇到的技术难题。任职要求:1、硕士及以上计算机相关专业,扎实的C++基础,良好的编程习惯;2、熟悉QT界面开发,理解QT信号槽机制。3、熟悉Linux环境下的软件开发。4、掌握C++指针、内存管理、多线程编程、网络编程。5、熟悉面向对象编程理论和实践。6、熟悉数据库编程(MYSQL/SQL SERVER等)。 7、有很强的独立编程能力,分析能力强,思维敏捷,善于学习和沟通,善于参与团队合作。 职能类别:C/C++开发工程师 关键字:软件工程师C++ 微信分享 +前程无忧网,学习,D002-软件测试工程师,北京,,硕士,,民营公司,,岗位职责: 1. 有独立筹建、管理运营软件测试实验统筹能力;2. 负责实验室CNAS/CMA体系建立及审核;3. 负责软件测试项目任务分配,项目管理,合同管理及售前工作;4. 建立并维护实验室技术文件体系,开拓新的测试方法;5. 负责电子政务及电子商务软件测评项目的测试工作;岗位要求:1、大学统招硕士以上学历,计算机相关专业;2、精通软件测试流程和测试方法;3、很强的学习能力和技术钻研能力,良好的沟通能力,善于团队合作;4、工作积极主动,执行能力强,努力推进问题解决并适应中短期出差。 职能类别:软件测试工程师 微信分享 +前程无忧网,学习,JAVA开发工程师(北京),北京,,本科,,民营公司,,JAVA开发工程师参与SAAS业财数据中台开发工作;参与大数据系统设计与代码开发;对编写的代码进行注释和编配开发文档。要求: 1) 2021年计算机相关专业应届毕业生,熟练掌握JAVA等主流框架或语言;2) 对大数据,数据智能应用,数据科学有浓厚兴趣,具备较强的学习能力及应对挑战的信心与实力。 职能类别:Java开发工程师 微信分享 +鄂州,学习,海量附近招聘创业的你,北京,8000-16000,不限,不限,民营,服务业, +百姓网,学习,呼和浩特高端职位高铁乘务员招聘,北京,8000以上,不限,不限,民营,行政/后勤, +吉林,学习,诚聘优秀店长,北京,8000-16000,不限,不限,民营,销售/客服/技术支持, +,学习,直招跟船普工搬运工/月薪一万包吃住,北京,7000-15000,不限,不限,民营,普工|技工|生产|机械, +,学习,高薪直招月薪一万跟船出海电焊工,北京,8000-15000,不限,不限,民营,普工|技工|生产|机械, +,学习,高薪直招跟船出海叉车工月过万五险一金,北京,8000-15000,不限,不限,民营,普工|技工|生产|机械, diff --git "a/5\343\200\201Python\346\213\233\350\201\230\345\262\227\344\275\215\344\277\241\346\201\257\350\201\232\345\220\210\347\263\273\347\273\237\357\274\210\346\213\245\346\234\211\347\210\254\350\231\253\347\210\254\345\217\226\343\200\201\346\225\260\346\215\256\345\210\206\346\236\220\343\200\201\345\217\257\350\247\206\345\214\226\343\200\201\344\272\222\345\212\250\347\255\211\345\212\237\350\203\275\357\274\211/WorkAggregation-master/install_package.bat" "b/5\343\200\201Python\346\213\233\350\201\230\345\262\227\344\275\215\344\277\241\346\201\257\350\201\232\345\220\210\347\263\273\347\273\237\357\274\210\346\213\245\346\234\211\347\210\254\350\231\253\347\210\254\345\217\226\343\200\201\346\225\260\346\215\256\345\210\206\346\236\220\343\200\201\345\217\257\350\247\206\345\214\226\343\200\201\344\272\222\345\212\250\347\255\211\345\212\237\350\203\275\357\274\211/WorkAggregation-master/install_package.bat" new file mode 100644 index 0000000..39a9971 --- /dev/null +++ "b/5\343\200\201Python\346\213\233\350\201\230\345\262\227\344\275\215\344\277\241\346\201\257\350\201\232\345\220\210\347\263\273\347\273\237\357\274\210\346\213\245\346\234\211\347\210\254\350\231\253\347\210\254\345\217\226\343\200\201\346\225\260\346\215\256\345\210\206\346\236\220\343\200\201\345\217\257\350\247\206\345\214\226\343\200\201\344\272\222\345\212\250\347\255\211\345\212\237\350\203\275\357\274\211/WorkAggregation-master/install_package.bat" @@ -0,0 +1 @@ +pip install -r requirements.txt \ No newline at end of file diff --git "a/5\343\200\201Python\346\213\233\350\201\230\345\262\227\344\275\215\344\277\241\346\201\257\350\201\232\345\220\210\347\263\273\347\273\237\357\274\210\346\213\245\346\234\211\347\210\254\350\231\253\347\210\254\345\217\226\343\200\201\346\225\260\346\215\256\345\210\206\346\236\220\343\200\201\345\217\257\350\247\206\345\214\226\343\200\201\344\272\222\345\212\250\347\255\211\345\212\237\350\203\275\357\274\211/WorkAggregation-master/js.7z" "b/5\343\200\201Python\346\213\233\350\201\230\345\262\227\344\275\215\344\277\241\346\201\257\350\201\232\345\220\210\347\263\273\347\273\237\357\274\210\346\213\245\346\234\211\347\210\254\350\231\253\347\210\254\345\217\226\343\200\201\346\225\260\346\215\256\345\210\206\346\236\220\343\200\201\345\217\257\350\247\206\345\214\226\343\200\201\344\272\222\345\212\250\347\255\211\345\212\237\350\203\275\357\274\211/WorkAggregation-master/js.7z" new file mode 100644 index 0000000..6ccf26c Binary files /dev/null and "b/5\343\200\201Python\346\213\233\350\201\230\345\262\227\344\275\215\344\277\241\346\201\257\350\201\232\345\220\210\347\263\273\347\273\237\357\274\210\346\213\245\346\234\211\347\210\254\350\231\253\347\210\254\345\217\226\343\200\201\346\225\260\346\215\256\345\210\206\346\236\220\343\200\201\345\217\257\350\247\206\345\214\226\343\200\201\344\272\222\345\212\250\347\255\211\345\212\237\350\203\275\357\274\211/WorkAggregation-master/js.7z" differ diff --git "a/5\343\200\201Python\346\213\233\350\201\230\345\262\227\344\275\215\344\277\241\346\201\257\350\201\232\345\220\210\347\263\273\347\273\237\357\274\210\346\213\245\346\234\211\347\210\254\350\231\253\347\210\254\345\217\226\343\200\201\346\225\260\346\215\256\345\210\206\346\236\220\343\200\201\345\217\257\350\247\206\345\214\226\343\200\201\344\272\222\345\212\250\347\255\211\345\212\237\350\203\275\357\274\211/WorkAggregation-master/my.ini" "b/5\343\200\201Python\346\213\233\350\201\230\345\262\227\344\275\215\344\277\241\346\201\257\350\201\232\345\220\210\347\263\273\347\273\237\357\274\210\346\213\245\346\234\211\347\210\254\350\231\253\347\210\254\345\217\226\343\200\201\346\225\260\346\215\256\345\210\206\346\236\220\343\200\201\345\217\257\350\247\206\345\214\226\343\200\201\344\272\222\345\212\250\347\255\211\345\212\237\350\203\275\357\274\211/WorkAggregation-master/my.ini" new file mode 100644 index 0000000..17d72c3 --- /dev/null +++ "b/5\343\200\201Python\346\213\233\350\201\230\345\262\227\344\275\215\344\277\241\346\201\257\350\201\232\345\220\210\347\263\273\347\273\237\357\274\210\346\213\245\346\234\211\347\210\254\350\231\253\347\210\254\345\217\226\343\200\201\346\225\260\346\215\256\345\210\206\346\236\220\343\200\201\345\217\257\350\247\206\345\214\226\343\200\201\344\272\222\345\212\250\347\255\211\345\212\237\350\203\275\357\274\211/WorkAggregation-master/my.ini" @@ -0,0 +1,30 @@ +[mysqld] +#ֱ滻ԭļ + +log-bin = off +port = 3306 +# mysqlİװĿ¼ basedir=E:\Mysql +basedir = +# mysqlݿݵĴĿ¼ +datadir = + +character-set-server = utf8 +default-storage-engine = INNODB +default_authentication_plugin = mysql_native_password + +skip-external-locking +innodb_flush_log_at_trx_commit = 0 +max_connections = 1000 +read_buffer_size = 4M +read_rnd_buffer_size = 4M +max_allowed_packet = 4M +max_connect_errors = 10000 +innodb_log_file_size = 2G +innodb_log_buffer_size = 4M +innodb_buffer_pool_size = 4G +secure_file_priv = '' +[mysql] +default-character-set = utf8 +[client] +port = 3306 +default-character-set = utf8 diff --git "a/5\343\200\201Python\346\213\233\350\201\230\345\262\227\344\275\215\344\277\241\346\201\257\350\201\232\345\220\210\347\263\273\347\273\237\357\274\210\346\213\245\346\234\211\347\210\254\350\231\253\347\210\254\345\217\226\343\200\201\346\225\260\346\215\256\345\210\206\346\236\220\343\200\201\345\217\257\350\247\206\345\214\226\343\200\201\344\272\222\345\212\250\347\255\211\345\212\237\350\203\275\357\274\211/WorkAggregation-master/requirements.txt" "b/5\343\200\201Python\346\213\233\350\201\230\345\262\227\344\275\215\344\277\241\346\201\257\350\201\232\345\220\210\347\263\273\347\273\237\357\274\210\346\213\245\346\234\211\347\210\254\350\231\253\347\210\254\345\217\226\343\200\201\346\225\260\346\215\256\345\210\206\346\236\220\343\200\201\345\217\257\350\247\206\345\214\226\343\200\201\344\272\222\345\212\250\347\255\211\345\212\237\350\203\275\357\274\211/WorkAggregation-master/requirements.txt" new file mode 100644 index 0000000..259d6c3 --- /dev/null +++ "b/5\343\200\201Python\346\213\233\350\201\230\345\262\227\344\275\215\344\277\241\346\201\257\350\201\232\345\220\210\347\263\273\347\273\237\357\274\210\346\213\245\346\234\211\347\210\254\350\231\253\347\210\254\345\217\226\343\200\201\346\225\260\346\215\256\345\210\206\346\236\220\343\200\201\345\217\257\350\247\206\345\214\226\343\200\201\344\272\222\345\212\250\347\255\211\345\212\237\350\203\275\357\274\211/WorkAggregation-master/requirements.txt" @@ -0,0 +1,13 @@ +PyMySQL==0.9.2 +lxml==4.2.4 +Flask==1.1.1 +numpy==1.15.0 +pyecharts==0.5.9 +beautifulsoup4==4.6.3 +jieba==0.39 +pandas==0.23.4 +Requests==2.20.0 +csvtotable==2.1.1 +echarts-themes-pypkg==0.0.3 +echarts-countries-pypkg==0.1.4 +echarts-china-provinces-pypkg==0.0.2 \ No newline at end of file diff --git "a/5\343\200\201Python\346\213\233\350\201\230\345\262\227\344\275\215\344\277\241\346\201\257\350\201\232\345\220\210\347\263\273\347\273\237\357\274\210\346\213\245\346\234\211\347\210\254\350\231\253\347\210\254\345\217\226\343\200\201\346\225\260\346\215\256\345\210\206\346\236\220\343\200\201\345\217\257\350\247\206\345\214\226\343\200\201\344\272\222\345\212\250\347\255\211\345\212\237\350\203\275\357\274\211/WorkAggregation-master/server.py" "b/5\343\200\201Python\346\213\233\350\201\230\345\262\227\344\275\215\344\277\241\346\201\257\350\201\232\345\220\210\347\263\273\347\273\237\357\274\210\346\213\245\346\234\211\347\210\254\350\231\253\347\210\254\345\217\226\343\200\201\346\225\260\346\215\256\345\210\206\346\236\220\343\200\201\345\217\257\350\247\206\345\214\226\343\200\201\344\272\222\345\212\250\347\255\211\345\212\237\350\203\275\357\274\211/WorkAggregation-master/server.py" new file mode 100644 index 0000000..9e4df67 --- /dev/null +++ "b/5\343\200\201Python\346\213\233\350\201\230\345\262\227\344\275\215\344\277\241\346\201\257\350\201\232\345\220\210\347\263\273\347\273\237\357\274\210\346\213\245\346\234\211\347\210\254\350\231\253\347\210\254\345\217\226\343\200\201\346\225\260\346\215\256\345\210\206\346\236\220\343\200\201\345\217\257\350\247\206\345\214\226\343\200\201\344\272\222\345\212\250\347\255\211\345\212\237\350\203\275\357\274\211/WorkAggregation-master/server.py" @@ -0,0 +1,88 @@ +import logging +from datetime import timedelta +from flask import Flask, render_template, request,send_file,send_from_directory +from analysis import analysis_main, create_chart, interaction +from spider import spider_main, tool + +# css不更新 右键Chrome刷新按钮,“硬性重新加载”或者更新一步“清空缓存并硬性重新加载” +REMOTE_HOST = "../static/js" + +app = Flask(__name__) +# 解决缓存刷新问题 +app.config['SEND_FILE_MAX_AGE_DEFAULT'] = timedelta(seconds=2) +# 原日志 +logging.getLogger('werkzeug').setLevel(logging.ERROR) +# 文件输出日志 自写日志 +handler = logging.FileHandler(filename='log.txt', mode='a') +handler.setLevel(logging.ERROR) +app.logger.addHandler(handler) + + +# @app.errorhandler(500) +# def internal_error(exception): +# app.logger.error(exception) +# return render_template('500.html'), 500 + + +@app.route("/") +def index(): + return render_template('index.html') + + +@app.route("/爬虫") +def ready_spider(): + return render_template('spider.html') + + +@app.route('/爬虫完成', methods=['POST']) +def get_spider(): + dict_parameter = dict(request.form) + spider_main.main(dict_parameter) + return app.send_static_file('./html/data.html') + + +@app.route("/爬虫结果") +def result_spider(): + return render_template('data.html') + + +@app.route("/分析") +def analyse(): + analysis_main.Analyze.main() + return index() + + +chart = create_chart.main() +js=['echarts.min', 'echarts-gl.min','macarons','echarts-wordcloud.min','echarts-liquidfill.min'] + +@app.route("/展示") +def showresult(): + return render_template( + "show.html", + script_list=js, + host=REMOTE_HOST + ) + + +@app.route('/chart/') +def showresult1(id): + t = chart[eval(id)] + return t.render_embed() + + +@app.route("/互动") +def eachother(): + if request.args.get('name'): + result = interaction.find(request.args.get('name')) + print(request.args.get('name')) + return render_template('interaction.html', x=2, w=result[0], r=result[1]) + return render_template('interaction.html', x=1) + + +@app.route("/us") +def us(): + return render_template('us.html') + + +if __name__ == '__main__': + app.run(debug=True,host='127.0.0.1',port=80) diff --git a/std-lib/logging.py "b/5\343\200\201Python\346\213\233\350\201\230\345\262\227\344\275\215\344\277\241\346\201\257\350\201\232\345\220\210\347\263\273\347\273\237\357\274\210\346\213\245\346\234\211\347\210\254\350\231\253\347\210\254\345\217\226\343\200\201\346\225\260\346\215\256\345\210\206\346\236\220\343\200\201\345\217\257\350\247\206\345\214\226\343\200\201\344\272\222\345\212\250\347\255\211\345\212\237\350\203\275\357\274\211/WorkAggregation-master/spider/__init__.py" similarity index 100% rename from std-lib/logging.py rename to "5\343\200\201Python\346\213\233\350\201\230\345\262\227\344\275\215\344\277\241\346\201\257\350\201\232\345\220\210\347\263\273\347\273\237\357\274\210\346\213\245\346\234\211\347\210\254\350\231\253\347\210\254\345\217\226\343\200\201\346\225\260\346\215\256\345\210\206\346\236\220\343\200\201\345\217\257\350\247\206\345\214\226\343\200\201\344\272\222\345\212\250\347\255\211\345\212\237\350\203\275\357\274\211/WorkAggregation-master/spider/__init__.py" diff --git "a/5\343\200\201Python\346\213\233\350\201\230\345\262\227\344\275\215\344\277\241\346\201\257\350\201\232\345\220\210\347\263\273\347\273\237\357\274\210\346\213\245\346\234\211\347\210\254\350\231\253\347\210\254\345\217\226\343\200\201\346\225\260\346\215\256\345\210\206\346\236\220\343\200\201\345\217\257\350\247\206\345\214\226\343\200\201\344\272\222\345\212\250\347\255\211\345\212\237\350\203\275\357\274\211/WorkAggregation-master/spider/conf.ini" "b/5\343\200\201Python\346\213\233\350\201\230\345\262\227\344\275\215\344\277\241\346\201\257\350\201\232\345\220\210\347\263\273\347\273\237\357\274\210\346\213\245\346\234\211\347\210\254\350\231\253\347\210\254\345\217\226\343\200\201\346\225\260\346\215\256\345\210\206\346\236\220\343\200\201\345\217\257\350\247\206\345\214\226\343\200\201\344\272\222\345\212\250\347\255\211\345\212\237\350\203\275\357\274\211/WorkAggregation-master/spider/conf.ini" new file mode 100644 index 0000000..b5f3558 --- /dev/null +++ "b/5\343\200\201Python\346\213\233\350\201\230\345\262\227\344\275\215\344\277\241\346\201\257\350\201\232\345\220\210\347\263\273\347\273\237\357\274\210\346\213\245\346\234\211\347\210\254\350\231\253\347\210\254\345\217\226\343\200\201\346\225\260\346\215\256\345\210\206\346\236\220\343\200\201\345\217\257\350\247\206\345\214\226\343\200\201\344\272\222\345\212\250\347\255\211\345\212\237\350\203\275\357\274\211/WorkAggregation-master/spider/conf.ini" @@ -0,0 +1,382 @@ +[citycode] +̩ = 071800 + = 010000 +Ϻ = 020000 + = 030200 + = 040000 +人 = 180200 + = 200200 + = 080200 +Ͼ = 070200 +ɶ = 090200 + = 060000 +ݸ = 030800 + = 230300 + = 230200 + = 070300 + = 250200 +ɳ = 190200 +Ϸ = 150200 + = 080300 +֣ = 170200 + = 050000 +ൺ = 120300 + = 120200 + = 220200 + = 240200 + = 110200 +Ͽ = 171800 + = 110700 +ɳ = 101500 + = 100300 +ɽ = 300500 +ͷ = 030400 +β = 032400 + = 201100 + = 171300 + = 131200 +ع = 031400 + = 191000 + = 080500 +ũ = 181700 +ʮ = 180600 +ʯ = 310800 +ʯׯ = 160200 +ʯɽ = 290500 +˫Ѽɽ = 221100 +˷ = 210900 +ƽ = 240600 +ԭ = 240700 +Ǩ = 072000 + = 151600 + = 181200 +绯 = 220400 + = 091500 + = 311500 +̨ = 080800 +̩ = 121100 +̩ = 072300 +̫ = 071600 +̫ԭ = 210200 +ɽ = 160500 + = 181600 +ˮ = 270600 + = 231200 +ͨ = 240500 +ͨ = 280700 +ͭ = 200500 +ͭ = 150800 +ͭ = 260600 +ͼľ = 311100 +³ = 311400 +Ͳ = 101200 +ֶ = 102000 +Ű = 091800 +̨ = 120400 +γ = 071300 +Ӱ = 200600 +ӱ = 241100 +Ӽ = 240800 +ོ = 161300 + = 201200 + = 070800 +־ÿ = 100400 + = 032800 +Ȫ = 210800 + = 220300 + = 310500 +˱ = 090700 +˲ = 180300 +˴ = 131000 + = 081400 + = 190800 + = 290200 +ӥ̶ = 130700 +Ӫ = 230500 + = 191300 + = 200800 + = 140600 + = 320900 +Ϫ = 250400 + = 190600 +Ƹ = 032900 +˳ = 210300 +ׯ = 121600 +տ = 031700 + = 110500 +żҸ = 071400 +żҽ = 191400 +żҿ = 160900 +Ҵ = 270900 +ͨ = 251300 + = 031800 + = 071000 +ɽ = 030700 + = 290400 +ɽ = 081100 +ܿ = 170800 +麣 = 030500 + = 190300 +פ = 171400 + = 091400 +Ͳ = 120700 +Թ = 090800 + = 260300 + = 100700 + = 120600 +Ϋ = 120500 +μ = 200700 + = 080400 +IJ = 100500 +ɽ = 251400 +ں = 281000 +첼 = 281200 +³ľ = 310200 + = 070400 +ߺ = 150300 + = 140700 + = 290300 + = 270700 + = 311000 +ָɽ = 101000 + = 091900 + = 320200 +˫ = 251500 +ֹ = 281400 + = 110300 + = 181400 + = 181300 + = 200300 + = 180500 +̶ = 190400 + = 191500 +Т = 180900 + = 170700 + = 130600 + = 211100 + = 171200 +˰ = 281300 +̨ = 161100 +۰ = 160100 + = 071100 + = 171100 + = 151400 +֦ = 091000 +̽ = 231300 +Ƽ = 130500 +ƽɽ = 171000 +ƽ = 271000 + = 110600 +ն = 251100 + = 171600 +̨ = 221300 + = 220600 +ǭ = 260900 +ǭ = 261000 +ǭ = 260800 +DZ = 181500 + = 140900 +ػʵ = 160600 +Զ = 031900 + = 271300 + = 100600 + = 101600 + = 250300 +Ȫ = 110400 + = 081200 +տ = 300300 + = 121200 + = 300200 + = 121800 + = 141300 + = 270200 +ȷ = 160300 +ɽ = 090400 + = 250600 +ˮ = 081000 +Ƹ = 071200 +ɽ = 092300 +ij = 121700 + = 231100 +Դ = 240400 +֥ = 300400 +ٲ = 251800 +ٷ = 210500 +ٸ = 101400 + = 271400 + = 120800 +ˮ = 102100 + = 140400 + = 151200 +ˮ = 260400 + = 111000 +¤ = 271200 +¦ = 191200 + = 211200 + = 170300 + = 090500 + = 171500 +ɽ = 150500 +ï = 032300 +÷ = 032600 +üɽ = 091200 + = 090300 +ĵ = 220700 + = 300700 +ϲ = 130200 +ϳ = 091100 + = 140200 +ƽ = 110800 +ͨ = 070900 + = 170600 +ڽ = 090900 + = 110900 +ŭ = 251900 + = 220900 + = 130900 + = 240300 + = 120900 +Դ = 171900 + = 080700 + = 270400 +ľ˹ = 220800 + = 031500 + = 170500 + = 032200 + = 270300 + = 080600 + = 230700 + = 210700 + = 211000 + = 180800 + = 180700 + = 130400 + = 072500 +Ž = 130300 +Ȫ = 270500 +ʲ = 310400 + = 170400 +ƽ = 032700 + = 310300 +տ¶ = 311700 +ɽ = 070600 + = 310700 + = 320500 + = 320300 + = 100200 + = 320700 + = 081600 + = 320400 + = 160700 + = 200900 + = 121400 + = 311600 +ӳ = 141200 +Դ = 032100 +ױ = 171700 +׸ = 221000 + = 141500 +ں = 221200 +ˮ = 161200 + = 190500 + = 251000 +ͺ = 280200 +ױ = 281100 +« = 230900 + = 080900 + = 191100 + = 071900 + = 151700 + = 151100 +Ƹ = 181100 + = 320600 +ɽ = 151000 +ʯ = 180400 + = 030300 + = 091700 + = 250500 + = 220500 +ͬ = 210400 +˰ = 221400 + = 230800 + = 072100 +º = 251600 + = 090600 + = 121300 + = 172000 + = 252000 + = 101100 + = 271100 + = 100900 +Ӫ = 121000 + = 100800 +˹ = 280800 + = 181000 +ʩ = 181800 +Ǹ = 140800 +ɽ = 030600 +˳ = 230600 + = 131100 + = 231500 + = 150700 + = 271500 + = 092100 + = 130800 +ԭ = 290600 +㰲 = 091300 +Ԫ = 091600 + = 140300 + = 141000 + = 260200 + = 320800 + = 092200 + = 310600 + = 310900 + = 281500 +̩ = 311300 + = 300800 +ɽ = 230400 + = 201000 + = 150400 +˳ = 260500 + = 170900 +׶ = 280900 + = 311800 + = 092000 +׳ = 241000 +ɳ = 101800 +ɽ = 240900 + = 270800 +ɫ = 141100 + = 150600 +ͷ = 280400 + = 160400 +ɽ = 251200 +ͤ = 101700 + = 200400 + = 140500 +Ϫ = 231000 +Ͻ = 260700 + = 121500 + = 311900 + = 151800 + = 160800 + = 300600 + = 311200 + = 101900 + = 190700 + = 070700 + = 070500 + = 210600 + = 231400 + = 032000 + = 190900 + = 101300 +е = 161000 + = 151500 + = 280300 + = 141400 + = 150900 + = 251700 + = 01 + diff --git "a/5\343\200\201Python\346\213\233\350\201\230\345\262\227\344\275\215\344\277\241\346\201\257\350\201\232\345\220\210\347\263\273\347\273\237\357\274\210\346\213\245\346\234\211\347\210\254\350\231\253\347\210\254\345\217\226\343\200\201\346\225\260\346\215\256\345\210\206\346\236\220\343\200\201\345\217\257\350\247\206\345\214\226\343\200\201\344\272\222\345\212\250\347\255\211\345\212\237\350\203\275\357\274\211/WorkAggregation-master/spider/spider_main.py" "b/5\343\200\201Python\346\213\233\350\201\230\345\262\227\344\275\215\344\277\241\346\201\257\350\201\232\345\220\210\347\263\273\347\273\237\357\274\210\346\213\245\346\234\211\347\210\254\350\231\253\347\210\254\345\217\226\343\200\201\346\225\260\346\215\256\345\210\206\346\236\220\343\200\201\345\217\257\350\247\206\345\214\226\343\200\201\344\272\222\345\212\250\347\255\211\345\212\237\350\203\275\357\274\211/WorkAggregation-master/spider/spider_main.py" new file mode 100644 index 0000000..0e028bd --- /dev/null +++ "b/5\343\200\201Python\346\213\233\350\201\230\345\262\227\344\275\215\344\277\241\346\201\257\350\201\232\345\220\210\347\263\273\347\273\237\357\274\210\346\213\245\346\234\211\347\210\254\350\231\253\347\210\254\345\217\226\343\200\201\346\225\260\346\215\256\345\210\206\346\236\220\343\200\201\345\217\257\350\247\206\345\214\226\343\200\201\344\272\222\345\212\250\347\255\211\345\212\237\350\203\275\357\274\211/WorkAggregation-master/spider/spider_main.py" @@ -0,0 +1,400 @@ +# -*- coding: utf-8 -*- +import configparser +import csv +import json +import os +import random +import threading +import time +import traceback +from multiprocessing import Process, Queue +from threading import Thread + +import bs4 +import requests +from lxml import etree + +from .tool import log, timer + + +class SpiderMeta(type): + spiders = [] + + def __new__(cls, name, bases, attrs): + cls.spiders.append(type.__new__(cls, name, bases, attrs)) + return type.__new__(cls, name, bases, attrs) + + +class BaseSpider(object): + headers = { + 'Accept': 'text/html,application/xhtml+xml,application/xml;' + 'q=0.9,image/webp,image/apng,*/*;q=0.8', + 'Accept-Encoding': 'gzip, deflate, br', + 'Accept-Language': 'zh-CN,zh;q=0.9,en;q=0.8', + 'Connection': 'keep-alive', + 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) ' + 'AppleWebKit/537.36 (KHTML, like Gecko) ' + 'Chrome/64.0.3282.119 Safari/537.36', + 'Upgrade-Insecure-Requests': '1', + } + + request_sleep = 0.7 + _time_recode = 0 + number = 0 + + def request(self, method='get', url=None, encoding=None, **kwargs): + + if not kwargs.get('headers'): + kwargs['headers'] = self.headers + + if not kwargs.get('timeout'): + kwargs['timeout'] = 5 + + rand_multi = random.uniform(0.8, 1.2) + interval = time.time() - self._time_recode + if interval < self.request_sleep: + time.sleep((self.request_sleep - interval) * rand_multi) + + resp = getattr(requests, method)(url, **kwargs) + self._time_recode = time.time() + + self.number = self.number + 1 + + if encoding: + resp.encoding = encoding + return resp.text + + +class Job51Spider(BaseSpider, metaclass=SpiderMeta): + request_sleep = 0 + + def run(self): + conf = configparser.ConfigParser() + conf.read('./spider/conf.ini') + citycode = conf['citycode'][self.city] + page = 1 + # 获得总页数 + url = "https://search.51job.com/list/{},000000,0100%252C2400%252C2700%252C2500,00,9,99,{},2," \ + "{}.html?lang=c&stype=&postchannel=0000&workyear=99&cotype=99°reefrom=99&jobterm=99&companysize=99" \ + "&providesalary=99&lonlat=0%2C0&radius=-1&ord_field=0&confirmdate=9&fromType=&dibiaoid=0&address=&line" \ + "=&specialarea=00&from=&welfare=".format(citycode, self.job, page) + a = self.request(url=url, method='get', encoding='GBK') + + js = etree.HTML(a).xpath('/html/body/script[2]/text()')[0] # 注意解析变成html里的js变量了 + jsonCode = js.partition('=')[2].strip() + json_res = json.loads(jsonCode) + + maxpage = eval(json_res['total_page']) + + # 解析页数 + while True: + url = "https://search.51job.com/list/{},000000,0100%252C2400%252C2700%252C2500,00,9,99,{},2," \ + "{}.html?lang=c&stype=&postchannel=0000&workyear=99&cotype=99°reefrom=99&jobterm=99&companysize=99" \ + "&providesalary=99&lonlat=0%2C0&radius=-1&ord_field=0&confirmdate=9&fromType=&dibiaoid=0&address=&line" \ + "=&specialarea=00&from=&welfare=".format(citycode, self.job, page) + self.get_urls(url) + + log.printlog('多线程+' + str(page) + '页完成--' + self.city + self.job) + page = page + 1 + if page == maxpage + 1: + break + return 'over' + + def get_urls(self, url): + try: + a = self.request(url=url, method='get', encoding='GBK') + js = etree.HTML(a).xpath('/html/body/script[2]/text()')[0] # 注意解析变成html里的js变量了 + jsonCode = js.partition('=')[2].strip() + json_res = json.loads(jsonCode) + urls = [i['job_href'] for i in json_res['engine_search_result']] + if threading.activeCount() > 10: + log.printlog(str(threading.activeCount()) + '线程存在,请注意检查程序外部阻塞原因') + time.sleep(3) + if self.threads: + for i in urls: + t = threading.Thread(target=self.get_job_detail, args=(i,)) + t.start() + time.sleep(0.03) + else: + for i in urls: + self.get_job_detail(i) + except Exception as e: + traceback.print_exc() + time.sleep(2) + self.get_urls(url) + + def get_job_detail(self, url): + if 'jobs' not in url: + return + try: + while True: + try: + a = self.request(url=url, method='get', encoding='GBK') + html = etree.HTML(a) + break + except: + time.sleep(3) + try: + pay = html.xpath('/ html / body / div[3] / div[2] / div[2] / div / div[1] / strong/text()')[0].strip() + except: + pay = '' + list1 = html.xpath('/html/body/div[3]/div[2]/div[2]/div/div[1]/p[2]/@title')[0].split("|") + + list1 = [i.strip() for i in list1] + if '招' in list1[2]: + education = None + else: + education = list1[2] + result = { + 'keyword': self.job, + 'provider': '前程无忧网', + 'place': self.city, + 'title': html.xpath('/html/body/div[3]/div[2]/div[2]/div/div[1]/h1/text()')[0].strip(), + 'salary': pay, + 'experience': list1[1], + 'education': education, + 'companytype': html.xpath('/html/body/div[3]/div[2]/div[4]/div[1]/div[2]/p[1]/text()')[0].strip(), + 'industry': html.xpath('/html/body/div[3]/div[2]/div[4]/div[1]/div[2]/p[3]/text()')[0].strip(), + 'description': html.xpath(' / html / body / div[3] / div[2] / div[3] / div[1] / div')[0].xpath( + 'string(.)').strip().replace('"', '').strip().replace('\t', '').replace('\r', '').replace('\n', '') + } + self.queue.put(result) + return + except: + time.sleep(3) + return + + +class QiluSpider(BaseSpider, metaclass=SpiderMeta): + request_sleep = 3 + + def run(self): + keys = [26, 2511, 24] + for key in keys: + page = 1 + + while True: + detail_list = self.get_page(page, key) + if detail_list == []: + return 'over' + page = page + 1 + # 错了 + while detail_list != []: + detail = [i.get_text(strip=True) for i in detail_list] + del detail_list[:9] + self.get_detail(detail) + + def get_page(self, page, key): + pageurl = 'http://www.qlrc.com/personal/js/ajaxPager' + pagedata = { + 'txtKeyWord': self.job, + 'oldRegionID': 32, + 'iddcIndustryID': '31 32 1 33 34', + 'idSFrom': 1310, + 'type': 0, + 'page': page + } + html = self.request('post', url=pageurl, data=pagedata) + soup = bs4.BeautifulSoup(html, "html.parser") + detail_list = soup.select('.JobList table td') + return detail_list + + def get_detail(self, detail): + + list1 = detail[7].split('|') + result = { + 'keyword': self.job, + 'provider': '齐鲁人才网', + 'place': detail[3], + 'title': detail[0], + 'salary': detail[4], + 'experience': list1[1].strip(), + 'education': list1[0].strip(), + 'description': list1[3].strip() + } + self.queue.put(result) + + +class BaiduSpider(BaseSpider, metaclass=SpiderMeta): + request_sleep = 1 + + def run(self): + i = 0 + while True: + url = 'http://zhaopin.baidu.com/api/qzasync?query={}&city={}&pcmod=1&pn={}&rn=50&sort_type=1'.format( + self.job, self.city, i * 50) + if i * 50 >= 760: + return 'over' + i = i + 1 + self.get_job_detail(url) + + def get_job_detail(self, url): + html = self.request(url=url, method='get') + try: + dict1 = json.loads(html) + except Exception as e: + return + + dict2 = dict1['data']['disp_data'] + + for i in dict2: + if 'jobfirstclass' not in i.keys(): + i['jobfirstclass'] = '' + result = { + 'provider': i['provider'], + 'keyword': self.job, + 'place': self.city, + 'title': i['title'], + 'salary': i['ori_salary'], + 'experience': i['ori_experience'], + 'education': i['ori_education'], + 'companytype': i['employertype'], + 'industry': i['jobfirstclass'] + } + self.queue.put(result) + + +class SpiderProcess(Process): + + def __init__(self, data_queue, job, city, type, threads): + Process.__init__(self) + self.data_queue = data_queue + self.job = job + self.city = city + self.type = type + + self.threads = threads + + def iter_spider(self, spider, spider_count): + setattr(spider, 'job', self.job) + setattr(spider, 'city', self.city) + setattr(spider, 'threads', self.threads) + setattr(spider, 'queue', self.data_queue) + error = 0 + result = spider.run() + if result == 'over': + self.data_queue.put('over') + error += 1 + if error == 10: + log.printlog('%s-%s-%s- 爬虫已结束' % (spider.__class__.__name__, self.city, self.job)) + return + + def run(self): + spiders = [] + + if '51' in self.type: + spiders.append(SpiderMeta.spiders[0]()) + if 'qilu' in self.type: + spiders.append(SpiderMeta.spiders[1]()) + if 'baidu' in self.type: + spiders.append(SpiderMeta.spiders[2]()) + + spider_count = len(spiders) + threads = [] + for i in range(spider_count): + t = Thread(target=self.iter_spider, args=(spiders[i], spider_count,)) + t.setDaemon(True) + t.start() + threads.append(t) + while True: + if len([True for i in threads if i.is_alive() == False]) == spider_count: + break + + time.sleep(2) + + # return + + +class WriterProcess(Process): + """写数据进程""" + + def __init__(self, data_queue, number, type=None, spider_process=None, spider_count=None): + Process.__init__(self) + self.data_queue = data_queue + self.type = type + self.number = number + self.spider_process = spider_process + self.spider_count = spider_count + + def run(self): + id, over = 1, 0 + with open('data/test.csv', 'a+', encoding='utf-8', newline='') as f: + writer = csv.writer(f) + while True: + if id == self.number + 1: + f.close() + return + result = self.data_queue.get() + if result == 'over': + over = over + 1 + if over == self.spider_count: + f.close() + return + elif result: + row = [ + result.get('provider'), result.get('keyword'), result.get('title'), result.get('place'), + result.get('salary'), result.get('experience'), result.get('education'), + result.get('companytype'), result.get('industry'), result.get('description') + ] + id = id + 1 + writer.writerow(row) + + +def main(dict_parameter): + queue = Queue() + + jobs = ['软件', '图像', '自然语言处理', '人工智能', '学习', '前端', '后端', '数据', '算法', '测试', '网络安全', '运维', 'UI', '区块链', '网络', '全栈', + '硬件', 'Java', 'C++', 'PHP', 'C#', '.NET', 'Hadoop', 'Python', 'Perl', 'Ruby', 'Nodejs', 'Go', 'Javascript', + 'Delphi', 'jsp', 'sql'] + + citys = ['北京', '深圳', '广州', '杭州', '武汉', '成都', '南京', '苏州', '西安', '长沙', '重庆', '合肥', '东莞', '无锡', '福州', '大连', '宁波', + '郑州', '济南', '天津', '佛山', '昆山', '沈阳', '青岛', '珠海', '厦门', '昆明', '南昌', '常州', '中山', '南宁', '惠州', '长春', '哈尔滨', + '嘉兴', '石家庄', '贵阳', '南通', '张家港', '兰州', '海口', '江门', '温州', '徐州', '扬州', '太原', '烟台', '镇江', '泉州', '唐山', '绵阳', + '太仓', '洛阳', '金华', '台州', '湖州', '柳州', '威海', '芜湖', '义乌', '保定', '泰州', '秦皇岛', '咸阳', '株洲', '韶关', '常熟', '澳门', + '湘潭', '宜昌', '香港', '盐城', '潍坊', '襄阳', '绍兴', '马鞍山', '三亚', '汕头', '宿迁', '鹰潭', '乌鲁木齐', '连云港', '呼和浩特', '德阳', '岳阳', + '靖江', '延安', '莆田', '新乡', '桂林', '盘锦', '鄂州', '滁州', '玉林', '黄石', '邢台', '云浮', '大理', '九江', '自贡', '济宁', '漳州', '揭阳', + '银川', '梅州', '鄂尔多斯', '宜春', '上饶', '鞍山', '枣庄', '六安', '荆门', '赣州', '龙岩', '西宁', '孝感', '德州', '南平', '泰安', '菏泽', + '阜阳', '拉萨', '清远', '宿州', '丽水', '铜陵', '湛江', '沧州', '黄山', '阿克苏', '舟山', '安庆', '临沂', '衢州', '南阳', '肇庆', '随州', + '吉安', '兴安盟', '萍乡', '攀枝花', '承德', '上海'] + + if os.path.exists('./data/test.csv'): + try: + os.remove('./data/test.csv') + os.remove('./static/html/data.html') + except: + pass + with open('data/test.csv', 'a+', encoding='utf-8', newline='') as f: + writer = csv.writer(f) + writer.writerow( + ['provider', 'keyword', 'title', 'place', 'salary', 'experience', 'education', 'companytype', + 'industry', 'description']) + total = eval(dict_parameter.get('total')[0]) #todo 不知道为什么服务器上不需要【0】 + number = eval(dict_parameter.get('number')[0]) #todo 不知道为什么服务器上不需要【0】 + if dict_parameter.get('threads'): + threads = True + else: + threads = None + no = 1 + for city in citys: + for job in jobs: + if dict_parameter.get('time'): + timer.main(beginhour=eval(dict_parameter.get('hour')[0]), + beginminute=eval(dict_parameter.get('minute')[0])) + spider_type = dict_parameter.get('type') + p1 = SpiderProcess(queue, job, city, type=spider_type, threads=threads) + p2 = WriterProcess(queue, number=number, spider_process=p1, spider_count=len(spider_type)) + p1.start() + p2.start() + p2.join() + log.printlog(string=city + job + '爬取完成') + p1.terminate() + if no * number >= total: + os.system('csvtotable ./data/test.csv ./static/html/data.html') + p2.terminate() + return + p1.join() + no = no + 1 + + +if __name__ == '__main__': + main() diff --git a/std-lib/random.py "b/5\343\200\201Python\346\213\233\350\201\230\345\262\227\344\275\215\344\277\241\346\201\257\350\201\232\345\220\210\347\263\273\347\273\237\357\274\210\346\213\245\346\234\211\347\210\254\350\231\253\347\210\254\345\217\226\343\200\201\346\225\260\346\215\256\345\210\206\346\236\220\343\200\201\345\217\257\350\247\206\345\214\226\343\200\201\344\272\222\345\212\250\347\255\211\345\212\237\350\203\275\357\274\211/WorkAggregation-master/spider/tool/__init__.py" similarity index 100% rename from std-lib/random.py rename to "5\343\200\201Python\346\213\233\350\201\230\345\262\227\344\275\215\344\277\241\346\201\257\350\201\232\345\220\210\347\263\273\347\273\237\357\274\210\346\213\245\346\234\211\347\210\254\350\231\253\347\210\254\345\217\226\343\200\201\346\225\260\346\215\256\345\210\206\346\236\220\343\200\201\345\217\257\350\247\206\345\214\226\343\200\201\344\272\222\345\212\250\347\255\211\345\212\237\350\203\275\357\274\211/WorkAggregation-master/spider/tool/__init__.py" diff --git "a/5\343\200\201Python\346\213\233\350\201\230\345\262\227\344\275\215\344\277\241\346\201\257\350\201\232\345\220\210\347\263\273\347\273\237\357\274\210\346\213\245\346\234\211\347\210\254\350\231\253\347\210\254\345\217\226\343\200\201\346\225\260\346\215\256\345\210\206\346\236\220\343\200\201\345\217\257\350\247\206\345\214\226\343\200\201\344\272\222\345\212\250\347\255\211\345\212\237\350\203\275\357\274\211/WorkAggregation-master/spider/tool/log.py" "b/5\343\200\201Python\346\213\233\350\201\230\345\262\227\344\275\215\344\277\241\346\201\257\350\201\232\345\220\210\347\263\273\347\273\237\357\274\210\346\213\245\346\234\211\347\210\254\350\231\253\347\210\254\345\217\226\343\200\201\346\225\260\346\215\256\345\210\206\346\236\220\343\200\201\345\217\257\350\247\206\345\214\226\343\200\201\344\272\222\345\212\250\347\255\211\345\212\237\350\203\275\357\274\211/WorkAggregation-master/spider/tool/log.py" new file mode 100644 index 0000000..626f120 --- /dev/null +++ "b/5\343\200\201Python\346\213\233\350\201\230\345\262\227\344\275\215\344\277\241\346\201\257\350\201\232\345\220\210\347\263\273\347\273\237\357\274\210\346\213\245\346\234\211\347\210\254\350\231\253\347\210\254\345\217\226\343\200\201\346\225\260\346\215\256\345\210\206\346\236\220\343\200\201\345\217\257\350\247\206\345\214\226\343\200\201\344\272\222\345\212\250\347\255\211\345\212\237\350\203\275\357\274\211/WorkAggregation-master/spider/tool/log.py" @@ -0,0 +1,35 @@ +from logging import * +from random import randint + +import requests + +global logger, hander, console +logger = getLogger(__name__) +hander = FileHandler('temp.txt') + +logger.setLevel(INFO) +hander.setLevel(INFO) + +formmatter = Formatter('%(asctime)s %(message)s') +hander.setFormatter(formmatter) +logger.addHandler(hander) + + +def push(string='', text=''): + text = 'ID ' + str(randint(0, 999)) + ' ' + text + url = 'https://pushbear.ftqq.com/sub' + data = {'sendkey': '5106-f0e4971ad40f466108ec2cb182fb7640', 'text': string, 'desp': text} + requests.post(url=url, data=data) + + +def printlog(string='', text='', filename=''): + print(string + text) + + +def easypush(string, filename='', text='', ): + print(string + text) + push(string=string, text=text) + + +if __name__ == '__main__': + easypush(string='我爱你啊', filename='log', text='emmm') diff --git "a/5\343\200\201Python\346\213\233\350\201\230\345\262\227\344\275\215\344\277\241\346\201\257\350\201\232\345\220\210\347\263\273\347\273\237\357\274\210\346\213\245\346\234\211\347\210\254\350\231\253\347\210\254\345\217\226\343\200\201\346\225\260\346\215\256\345\210\206\346\236\220\343\200\201\345\217\257\350\247\206\345\214\226\343\200\201\344\272\222\345\212\250\347\255\211\345\212\237\350\203\275\357\274\211/WorkAggregation-master/spider/tool/timer.py" "b/5\343\200\201Python\346\213\233\350\201\230\345\262\227\344\275\215\344\277\241\346\201\257\350\201\232\345\220\210\347\263\273\347\273\237\357\274\210\346\213\245\346\234\211\347\210\254\350\231\253\347\210\254\345\217\226\343\200\201\346\225\260\346\215\256\345\210\206\346\236\220\343\200\201\345\217\257\350\247\206\345\214\226\343\200\201\344\272\222\345\212\250\347\255\211\345\212\237\350\203\275\357\274\211/WorkAggregation-master/spider/tool/timer.py" new file mode 100644 index 0000000..1240897 --- /dev/null +++ "b/5\343\200\201Python\346\213\233\350\201\230\345\262\227\344\275\215\344\277\241\346\201\257\350\201\232\345\220\210\347\263\273\347\273\237\357\274\210\346\213\245\346\234\211\347\210\254\350\231\253\347\210\254\345\217\226\343\200\201\346\225\260\346\215\256\345\210\206\346\236\220\343\200\201\345\217\257\350\247\206\345\214\226\343\200\201\344\272\222\345\212\250\347\255\211\345\212\237\350\203\275\357\274\211/WorkAggregation-master/spider/tool/timer.py" @@ -0,0 +1,30 @@ +import datetime +import time + + +# beginhour beginminute开始时间 overhour overminute结束时间 wait sleep检测时间频率 +def main(beginhour=0, overhour=0, beginminute=0, overminute=0, wait=5): + if overhour == 0 and overminute == 0: + while True: + now = datetime.datetime.now() + if now.hour == beginhour and now.minute == beginminute: # 到达设定时间,进入函数外循环 + break + time.sleep(wait) # 等几秒后检测 + return + else: + now = datetime.datetime.now() + if now.hour == overhour and now.minute == overminute: + while True: + now = datetime.datetime.now() + if now.hour == beginhour and now.minute == beginminute: + break + time.sleep(wait) + else: + return + + +if __name__ == '__main__': + for i in range(500): + time.sleep(2) + print(i) + main(beginhour=22, beginminute=34, overhour=22, overminute=35) diff --git "a/5\343\200\201Python\346\213\233\350\201\230\345\262\227\344\275\215\344\277\241\346\201\257\350\201\232\345\220\210\347\263\273\347\273\237\357\274\210\346\213\245\346\234\211\347\210\254\350\231\253\347\210\254\345\217\226\343\200\201\346\225\260\346\215\256\345\210\206\346\236\220\343\200\201\345\217\257\350\247\206\345\214\226\343\200\201\344\272\222\345\212\250\347\255\211\345\212\237\350\203\275\357\274\211/WorkAggregation-master/static/css/c1.css" "b/5\343\200\201Python\346\213\233\350\201\230\345\262\227\344\275\215\344\277\241\346\201\257\350\201\232\345\220\210\347\263\273\347\273\237\357\274\210\346\213\245\346\234\211\347\210\254\350\231\253\347\210\254\345\217\226\343\200\201\346\225\260\346\215\256\345\210\206\346\236\220\343\200\201\345\217\257\350\247\206\345\214\226\343\200\201\344\272\222\345\212\250\347\255\211\345\212\237\350\203\275\357\274\211/WorkAggregation-master/static/css/c1.css" new file mode 100644 index 0000000..a4574fa --- /dev/null +++ "b/5\343\200\201Python\346\213\233\350\201\230\345\262\227\344\275\215\344\277\241\346\201\257\350\201\232\345\220\210\347\263\273\347\273\237\357\274\210\346\213\245\346\234\211\347\210\254\350\231\253\347\210\254\345\217\226\343\200\201\346\225\260\346\215\256\345\210\206\346\236\220\343\200\201\345\217\257\350\247\206\345\214\226\343\200\201\344\272\222\345\212\250\347\255\211\345\212\237\350\203\275\357\274\211/WorkAggregation-master/static/css/c1.css" @@ -0,0 +1,244 @@ +body{} +.box { + float: left; + width: 230px; + height: 230px; + margin: 60px; + border-radius: 125px; /* 圆形为长宽一半*/ + text-align: center; + box-shadow: 1px 1px 400px #9C9C9C; /*方向 方向 模糊程度*/ +} +.box:hover +{ + box-shadow: 1px 1px 60px #9C9C9C!important; /*方向 方向 模糊程度*/ +} + +.box img { + position: relative; /*垂直居中*/ + width: 50%; + height: 50%; + top: 60px; +} + +.container { + position: relative; + top: 100px; + display: inline-block; + margin: auto; + text-align:center; +} + +.c1 { + background-image: linear-gradient(to right, #4facfe 0%, #00f2fe 100%); +} + +.c2 { + background-image: linear-gradient(to right, #43e97b 0%, #38f9d7 100%); +} + +.c3 { + background-image: linear-gradient(to right, #fa709a 0%, #fee140 100%); +} + +.c4 { + background-image: linear-gradient(120deg, #a6c0fe 0%, #f68084 100%); +} + +a { + text-decoration-line: none; +} + +span { + color: grey +} + +.container2 { + position: relative; + top: 130px; + width: 75%; + margin: auto; +} + +.container3 { + width: 30%; + position: relative; + float: right; + top: 250px; + right: 350px; + font-size: medium; + z-index: 99; +} + +#robot { + position: relative; + float: right; + top: 180px; + right: 90px; +} + +#robot2 { + display: none; +} + +#robot3 { + display: none; + width: 40%; +!important; +} + +#robot4 { + width: 16%; + position: relative; + float: right; + top: 240px; + right: 130px; + font-size: 1.2em; + display: block; + color: black; +} + +.text { + color: rgba(17, 16, 18, 0.79); + margin: 15px; +} + +.mdui-chip +{ + margin: 5px; +!important;} + +.p1 { + position: relative; + top: 30px; +} + +.p2 { + position: relative; + bottom: 60px; +} + +#fab1 { + right: 120px; +} + +#fab2 { + right: 210px; +} + + + +.boxus { + float: left; + width: 200px; + height: 200px; + margin: 50px; + border-radius: 125px; /* 圆形为长宽一半*/ + text-align: center; + box-shadow: 1px 1px 400px #9C9C9C; /*方向 方向 模糊程度*/ + overflow: hidden !important; +} +.boxus img { + position: relative; /*垂直居中*/ + width: 100%; + height: 100%; +} + +.ustext { + float: left; + width: 200px; + margin: 30px 50px 50px 50px; + text-align: center; + overflow: visible !important; + font-family: "微软雅黑 Light"; + color: grey; +} + +.p usname { + font-size: medium; +} + + + + + + + + + + + + + + +.loader { + zoom: 1.6; + -webkit-transform: scale(1.5); + -moz-transform: scale(1.5); + background-color: white; + position: fixed; + z-index: 999; + width: 100%; + height: 100%; + transform: rotate(165deg); +} + +.loader:before, .loader:after { + content: ''; + position: absolute; + top: 50%; + left: 50%; + display: block; + width: 0.5em; + height: 0.5em; + border-radius: 0.25em; + transform: translate(-50%, -50%); +} + +.loader:before { + animation: before 2s infinite; +} + +.loader:after { + animation: after 2s infinite; +} + +@keyframes before { + 0% { + width: 0.5em; + box-shadow: 1em -0.5em rgba(225, 20, 98, 0.75), -1em 0.5em rgba(111, 202, 220, 0.75); + } + 35% { + width: 2.5em; + box-shadow: 0 -0.5em rgba(225, 20, 98, 0.75), 0 0.5em rgba(111, 202, 220, 0.75); + } + 70% { + width: 0.5em; + box-shadow: -1em -0.5em rgba(225, 20, 98, 0.75), 1em 0.5em rgba(111, 202, 220, 0.75); + } + 100% { + box-shadow: 1em -0.5em rgba(225, 20, 98, 0.75), -1em 0.5em rgba(111, 202, 220, 0.75); + } +} + +@keyframes after { + 0% { + height: 0.5em; + box-shadow: 0.5em 1em rgba(61, 184, 143, 0.75), -0.5em -1em rgba(233, 169, 32, 0.75); + } + 35% { + height: 2.5em; + box-shadow: 0.5em 0 rgba(61, 184, 143, 0.75), -0.5em 0 rgba(233, 169, 32, 0.75); + } + 70% { + height: 0.5em; + box-shadow: 0.5em -1em rgba(61, 184, 143, 0.75), -0.5em 1em rgba(233, 169, 32, 0.75); + } + 100% { + box-shadow: 0.5em 1em rgba(61, 184, 143, 0.75), -0.5em -1em rgba(233, 169, 32, 0.75); + } +} + +#displayno +{ + display: none; +} \ No newline at end of file diff --git "a/5\343\200\201Python\346\213\233\350\201\230\345\262\227\344\275\215\344\277\241\346\201\257\350\201\232\345\220\210\347\263\273\347\273\237\357\274\210\346\213\245\346\234\211\347\210\254\350\231\253\347\210\254\345\217\226\343\200\201\346\225\260\346\215\256\345\210\206\346\236\220\343\200\201\345\217\257\350\247\206\345\214\226\343\200\201\344\272\222\345\212\250\347\255\211\345\212\237\350\203\275\357\274\211/WorkAggregation-master/static/css/mdui.min.css" "b/5\343\200\201Python\346\213\233\350\201\230\345\262\227\344\275\215\344\277\241\346\201\257\350\201\232\345\220\210\347\263\273\347\273\237\357\274\210\346\213\245\346\234\211\347\210\254\350\231\253\347\210\254\345\217\226\343\200\201\346\225\260\346\215\256\345\210\206\346\236\220\343\200\201\345\217\257\350\247\206\345\214\226\343\200\201\344\272\222\345\212\250\347\255\211\345\212\237\350\203\275\357\274\211/WorkAggregation-master/static/css/mdui.min.css" new file mode 100644 index 0000000..cc24a17 --- /dev/null +++ "b/5\343\200\201Python\346\213\233\350\201\230\345\262\227\344\275\215\344\277\241\346\201\257\350\201\232\345\220\210\347\263\273\347\273\237\357\274\210\346\213\245\346\234\211\347\210\254\350\231\253\347\210\254\345\217\226\343\200\201\346\225\260\346\215\256\345\210\206\346\236\220\343\200\201\345\217\257\350\247\206\345\214\226\343\200\201\344\272\222\345\212\250\347\255\211\345\212\237\350\203\275\357\274\211/WorkAggregation-master/static/css/mdui.min.css" @@ -0,0 +1,6 @@ +/*! + * mdui v0.4.1 (https://mdui.org) + * Copyright 2016-2018 zdhxiong + * Licensed under MIT + */.mdui-theme-primary-amber .mdui-color-theme{color:rgba(0,0,0,.87)!important;background-color:#ffc107!important}.mdui-theme-primary-amber .mdui-color-theme-50{color:rgba(0,0,0,.87)!important;background-color:#fff8e1!important}.mdui-theme-primary-amber .mdui-color-theme-100{color:rgba(0,0,0,.87)!important;background-color:#ffecb3!important}.mdui-theme-primary-amber .mdui-color-theme-200{color:rgba(0,0,0,.87)!important;background-color:#ffe082!important}.mdui-theme-primary-amber .mdui-color-theme-300{color:rgba(0,0,0,.87)!important;background-color:#ffd54f!important}.mdui-theme-primary-amber .mdui-color-theme-400{color:rgba(0,0,0,.87)!important;background-color:#ffca28!important}.mdui-theme-primary-amber .mdui-color-theme-500{color:rgba(0,0,0,.87)!important;background-color:#ffc107!important}.mdui-theme-primary-amber .mdui-color-theme-600{color:rgba(0,0,0,.87)!important;background-color:#ffb300!important}.mdui-theme-primary-amber .mdui-color-theme-700{color:rgba(0,0,0,.87)!important;background-color:#ffa000!important}.mdui-theme-primary-amber .mdui-color-theme-800{color:rgba(0,0,0,.87)!important;background-color:#ff8f00!important}.mdui-theme-primary-amber .mdui-color-theme-900{color:rgba(0,0,0,.87)!important;background-color:#ff6f00!important}.mdui-theme-primary-blue .mdui-color-theme{color:rgba(0,0,0,.87)!important;background-color:#2196f3!important}.mdui-theme-primary-blue .mdui-color-theme-50{color:rgba(0,0,0,.87)!important;background-color:#e3f2fd!important}.mdui-theme-primary-blue .mdui-color-theme-100{color:rgba(0,0,0,.87)!important;background-color:#bbdefb!important}.mdui-theme-primary-blue .mdui-color-theme-200{color:rgba(0,0,0,.87)!important;background-color:#90caf9!important}.mdui-theme-primary-blue .mdui-color-theme-300{color:rgba(0,0,0,.87)!important;background-color:#64b5f6!important}.mdui-theme-primary-blue .mdui-color-theme-400{color:rgba(0,0,0,.87)!important;background-color:#42a5f5!important}.mdui-theme-primary-blue .mdui-color-theme-500{color:rgba(0,0,0,.87)!important;background-color:#2196f3!important}.mdui-theme-primary-blue .mdui-color-theme-600{color:#fff!important;background-color:#1e88e5!important}.mdui-theme-primary-blue .mdui-color-theme-700{color:#fff!important;background-color:#1976d2!important}.mdui-theme-primary-blue .mdui-color-theme-800{color:#fff!important;background-color:#1565c0!important}.mdui-theme-primary-blue .mdui-color-theme-900{color:#fff!important;background-color:#0d47a1!important}.mdui-theme-primary-blue-grey .mdui-color-theme{color:#fff!important;background-color:#607d8b!important}.mdui-theme-primary-blue-grey .mdui-color-theme-50{color:rgba(0,0,0,.87)!important;background-color:#eceff1!important}.mdui-theme-primary-blue-grey .mdui-color-theme-100{color:rgba(0,0,0,.87)!important;background-color:#cfd8dc!important}.mdui-theme-primary-blue-grey .mdui-color-theme-200{color:rgba(0,0,0,.87)!important;background-color:#b0bec5!important}.mdui-theme-primary-blue-grey .mdui-color-theme-300{color:rgba(0,0,0,.87)!important;background-color:#90a4ae!important}.mdui-theme-primary-blue-grey .mdui-color-theme-400{color:#fff!important;background-color:#78909c!important}.mdui-theme-primary-blue-grey .mdui-color-theme-500{color:#fff!important;background-color:#607d8b!important}.mdui-theme-primary-blue-grey .mdui-color-theme-600{color:#fff!important;background-color:#546e7a!important}.mdui-theme-primary-blue-grey .mdui-color-theme-700{color:#fff!important;background-color:#455a64!important}.mdui-theme-primary-blue-grey .mdui-color-theme-800{color:#fff!important;background-color:#37474f!important}.mdui-theme-primary-blue-grey .mdui-color-theme-900{color:#fff!important;background-color:#263238!important}.mdui-theme-primary-brown .mdui-color-theme{color:#fff!important;background-color:#795548!important}.mdui-theme-primary-brown .mdui-color-theme-50{color:rgba(0,0,0,.87)!important;background-color:#efebe9!important}.mdui-theme-primary-brown .mdui-color-theme-100{color:rgba(0,0,0,.87)!important;background-color:#d7ccc8!important}.mdui-theme-primary-brown .mdui-color-theme-200{color:rgba(0,0,0,.87)!important;background-color:#bcaaa4!important}.mdui-theme-primary-brown .mdui-color-theme-300{color:#fff!important;background-color:#a1887f!important}.mdui-theme-primary-brown .mdui-color-theme-400{color:#fff!important;background-color:#8d6e63!important}.mdui-theme-primary-brown .mdui-color-theme-500{color:#fff!important;background-color:#795548!important}.mdui-theme-primary-brown .mdui-color-theme-600{color:#fff!important;background-color:#6d4c41!important}.mdui-theme-primary-brown .mdui-color-theme-700{color:#fff!important;background-color:#5d4037!important}.mdui-theme-primary-brown .mdui-color-theme-800{color:#fff!important;background-color:#4e342e!important}.mdui-theme-primary-brown .mdui-color-theme-900{color:#fff!important;background-color:#3e2723!important}.mdui-theme-primary-cyan .mdui-color-theme{color:rgba(0,0,0,.87)!important;background-color:#00bcd4!important}.mdui-theme-primary-cyan .mdui-color-theme-50{color:rgba(0,0,0,.87)!important;background-color:#e0f7fa!important}.mdui-theme-primary-cyan .mdui-color-theme-100{color:rgba(0,0,0,.87)!important;background-color:#b2ebf2!important}.mdui-theme-primary-cyan .mdui-color-theme-200{color:rgba(0,0,0,.87)!important;background-color:#80deea!important}.mdui-theme-primary-cyan .mdui-color-theme-300{color:rgba(0,0,0,.87)!important;background-color:#4dd0e1!important}.mdui-theme-primary-cyan .mdui-color-theme-400{color:rgba(0,0,0,.87)!important;background-color:#26c6da!important}.mdui-theme-primary-cyan .mdui-color-theme-500{color:rgba(0,0,0,.87)!important;background-color:#00bcd4!important}.mdui-theme-primary-cyan .mdui-color-theme-600{color:rgba(0,0,0,.87)!important;background-color:#00acc1!important}.mdui-theme-primary-cyan .mdui-color-theme-700{color:#fff!important;background-color:#0097a7!important}.mdui-theme-primary-cyan .mdui-color-theme-800{color:#fff!important;background-color:#00838f!important}.mdui-theme-primary-cyan .mdui-color-theme-900{color:#fff!important;background-color:#006064!important}.mdui-theme-primary-deep-orange .mdui-color-theme{color:rgba(0,0,0,.87)!important;background-color:#ff5722!important}.mdui-theme-primary-deep-orange .mdui-color-theme-50{color:rgba(0,0,0,.87)!important;background-color:#fbe9e7!important}.mdui-theme-primary-deep-orange .mdui-color-theme-100{color:rgba(0,0,0,.87)!important;background-color:#ffccbc!important}.mdui-theme-primary-deep-orange .mdui-color-theme-200{color:rgba(0,0,0,.87)!important;background-color:#ffab91!important}.mdui-theme-primary-deep-orange .mdui-color-theme-300{color:rgba(0,0,0,.87)!important;background-color:#ff8a65!important}.mdui-theme-primary-deep-orange .mdui-color-theme-400{color:rgba(0,0,0,.87)!important;background-color:#ff7043!important}.mdui-theme-primary-deep-orange .mdui-color-theme-500{color:rgba(0,0,0,.87)!important;background-color:#ff5722!important}.mdui-theme-primary-deep-orange .mdui-color-theme-600{color:#fff!important;background-color:#f4511e!important}.mdui-theme-primary-deep-orange .mdui-color-theme-700{color:#fff!important;background-color:#e64a19!important}.mdui-theme-primary-deep-orange .mdui-color-theme-800{color:#fff!important;background-color:#d84315!important}.mdui-theme-primary-deep-orange .mdui-color-theme-900{color:#fff!important;background-color:#bf360c!important}.mdui-theme-primary-deep-purple .mdui-color-theme{color:#fff!important;background-color:#673ab7!important}.mdui-theme-primary-deep-purple .mdui-color-theme-50{color:rgba(0,0,0,.87)!important;background-color:#ede7f6!important}.mdui-theme-primary-deep-purple .mdui-color-theme-100{color:rgba(0,0,0,.87)!important;background-color:#d1c4e9!important}.mdui-theme-primary-deep-purple .mdui-color-theme-200{color:rgba(0,0,0,.87)!important;background-color:#b39ddb!important}.mdui-theme-primary-deep-purple .mdui-color-theme-300{color:#fff!important;background-color:#9575cd!important}.mdui-theme-primary-deep-purple .mdui-color-theme-400{color:#fff!important;background-color:#7e57c2!important}.mdui-theme-primary-deep-purple .mdui-color-theme-500{color:#fff!important;background-color:#673ab7!important}.mdui-theme-primary-deep-purple .mdui-color-theme-600{color:#fff!important;background-color:#5e35b1!important}.mdui-theme-primary-deep-purple .mdui-color-theme-700{color:#fff!important;background-color:#512da8!important}.mdui-theme-primary-deep-purple .mdui-color-theme-800{color:#fff!important;background-color:#4527a0!important}.mdui-theme-primary-deep-purple .mdui-color-theme-900{color:#fff!important;background-color:#311b92!important}.mdui-theme-primary-green .mdui-color-theme{color:rgba(0,0,0,.87)!important;background-color:#4caf50!important}.mdui-theme-primary-green .mdui-color-theme-50{color:rgba(0,0,0,.87)!important;background-color:#e8f5e9!important}.mdui-theme-primary-green .mdui-color-theme-100{color:rgba(0,0,0,.87)!important;background-color:#c8e6c9!important}.mdui-theme-primary-green .mdui-color-theme-200{color:rgba(0,0,0,.87)!important;background-color:#a5d6a7!important}.mdui-theme-primary-green .mdui-color-theme-300{color:rgba(0,0,0,.87)!important;background-color:#81c784!important}.mdui-theme-primary-green .mdui-color-theme-400{color:rgba(0,0,0,.87)!important;background-color:#66bb6a!important}.mdui-theme-primary-green .mdui-color-theme-500{color:rgba(0,0,0,.87)!important;background-color:#4caf50!important}.mdui-theme-primary-green .mdui-color-theme-600{color:#fff!important;background-color:#43a047!important}.mdui-theme-primary-green .mdui-color-theme-700{color:#fff!important;background-color:#388e3c!important}.mdui-theme-primary-green .mdui-color-theme-800{color:#fff!important;background-color:#2e7d32!important}.mdui-theme-primary-green .mdui-color-theme-900{color:#fff!important;background-color:#1b5e20!important}.mdui-theme-primary-grey .mdui-color-theme{color:rgba(0,0,0,.87)!important;background-color:#9e9e9e!important}.mdui-theme-primary-grey .mdui-color-theme-50{color:rgba(0,0,0,.87)!important;background-color:#fafafa!important}.mdui-theme-primary-grey .mdui-color-theme-100{color:rgba(0,0,0,.87)!important;background-color:#f5f5f5!important}.mdui-theme-primary-grey .mdui-color-theme-200{color:rgba(0,0,0,.87)!important;background-color:#eee!important}.mdui-theme-primary-grey .mdui-color-theme-300{color:rgba(0,0,0,.87)!important;background-color:#e0e0e0!important}.mdui-theme-primary-grey .mdui-color-theme-400{color:rgba(0,0,0,.87)!important;background-color:#bdbdbd!important}.mdui-theme-primary-grey .mdui-color-theme-500{color:rgba(0,0,0,.87)!important;background-color:#9e9e9e!important}.mdui-theme-primary-grey .mdui-color-theme-600{color:#fff!important;background-color:#757575!important}.mdui-theme-primary-grey .mdui-color-theme-700{color:#fff!important;background-color:#616161!important}.mdui-theme-primary-grey .mdui-color-theme-800{color:#fff!important;background-color:#424242!important}.mdui-theme-primary-grey .mdui-color-theme-900{color:#fff!important;background-color:#212121!important}.mdui-theme-primary-indigo .mdui-color-theme{color:#fff!important;background-color:#3f51b5!important}.mdui-theme-primary-indigo .mdui-color-theme-50{color:rgba(0,0,0,.87)!important;background-color:#e8eaf6!important}.mdui-theme-primary-indigo .mdui-color-theme-100{color:rgba(0,0,0,.87)!important;background-color:#c5cae9!important}.mdui-theme-primary-indigo .mdui-color-theme-200{color:rgba(0,0,0,.87)!important;background-color:#9fa8da!important}.mdui-theme-primary-indigo .mdui-color-theme-300{color:#fff!important;background-color:#7986cb!important}.mdui-theme-primary-indigo .mdui-color-theme-400{color:#fff!important;background-color:#5c6bc0!important}.mdui-theme-primary-indigo .mdui-color-theme-500{color:#fff!important;background-color:#3f51b5!important}.mdui-theme-primary-indigo .mdui-color-theme-600{color:#fff!important;background-color:#3949ab!important}.mdui-theme-primary-indigo .mdui-color-theme-700{color:#fff!important;background-color:#303f9f!important}.mdui-theme-primary-indigo .mdui-color-theme-800{color:#fff!important;background-color:#283593!important}.mdui-theme-primary-indigo .mdui-color-theme-900{color:#fff!important;background-color:#1a237e!important}.mdui-theme-primary-light-blue .mdui-color-theme{color:rgba(0,0,0,.87)!important;background-color:#03a9f4!important}.mdui-theme-primary-light-blue .mdui-color-theme-50{color:rgba(0,0,0,.87)!important;background-color:#e1f5fe!important}.mdui-theme-primary-light-blue .mdui-color-theme-100{color:rgba(0,0,0,.87)!important;background-color:#b3e5fc!important}.mdui-theme-primary-light-blue .mdui-color-theme-200{color:rgba(0,0,0,.87)!important;background-color:#81d4fa!important}.mdui-theme-primary-light-blue .mdui-color-theme-300{color:rgba(0,0,0,.87)!important;background-color:#4fc3f7!important}.mdui-theme-primary-light-blue .mdui-color-theme-400{color:rgba(0,0,0,.87)!important;background-color:#29b6f6!important}.mdui-theme-primary-light-blue .mdui-color-theme-500{color:rgba(0,0,0,.87)!important;background-color:#03a9f4!important}.mdui-theme-primary-light-blue .mdui-color-theme-600{color:rgba(0,0,0,.87)!important;background-color:#039be5!important}.mdui-theme-primary-light-blue .mdui-color-theme-700{color:#fff!important;background-color:#0288d1!important}.mdui-theme-primary-light-blue .mdui-color-theme-800{color:#fff!important;background-color:#0277bd!important}.mdui-theme-primary-light-blue .mdui-color-theme-900{color:#fff!important;background-color:#01579b!important}.mdui-theme-primary-light-green .mdui-color-theme{color:rgba(0,0,0,.87)!important;background-color:#8bc34a!important}.mdui-theme-primary-light-green .mdui-color-theme-50{color:rgba(0,0,0,.87)!important;background-color:#f1f8e9!important}.mdui-theme-primary-light-green .mdui-color-theme-100{color:rgba(0,0,0,.87)!important;background-color:#dcedc8!important}.mdui-theme-primary-light-green .mdui-color-theme-200{color:rgba(0,0,0,.87)!important;background-color:#c5e1a5!important}.mdui-theme-primary-light-green .mdui-color-theme-300{color:rgba(0,0,0,.87)!important;background-color:#aed581!important}.mdui-theme-primary-light-green .mdui-color-theme-400{color:rgba(0,0,0,.87)!important;background-color:#9ccc65!important}.mdui-theme-primary-light-green .mdui-color-theme-500{color:rgba(0,0,0,.87)!important;background-color:#8bc34a!important}.mdui-theme-primary-light-green .mdui-color-theme-600{color:rgba(0,0,0,.87)!important;background-color:#7cb342!important}.mdui-theme-primary-light-green .mdui-color-theme-700{color:rgba(0,0,0,.87)!important;background-color:#689f38!important}.mdui-theme-primary-light-green .mdui-color-theme-800{color:#fff!important;background-color:#558b2f!important}.mdui-theme-primary-light-green .mdui-color-theme-900{color:#fff!important;background-color:#33691e!important}.mdui-theme-primary-lime .mdui-color-theme{color:rgba(0,0,0,.87)!important;background-color:#cddc39!important}.mdui-theme-primary-lime .mdui-color-theme-50{color:rgba(0,0,0,.87)!important;background-color:#f9fbe7!important}.mdui-theme-primary-lime .mdui-color-theme-100{color:rgba(0,0,0,.87)!important;background-color:#f0f4c3!important}.mdui-theme-primary-lime .mdui-color-theme-200{color:rgba(0,0,0,.87)!important;background-color:#e6ee9c!important}.mdui-theme-primary-lime .mdui-color-theme-300{color:rgba(0,0,0,.87)!important;background-color:#dce775!important}.mdui-theme-primary-lime .mdui-color-theme-400{color:rgba(0,0,0,.87)!important;background-color:#d4e157!important}.mdui-theme-primary-lime .mdui-color-theme-500{color:rgba(0,0,0,.87)!important;background-color:#cddc39!important}.mdui-theme-primary-lime .mdui-color-theme-600{color:rgba(0,0,0,.87)!important;background-color:#c0ca33!important}.mdui-theme-primary-lime .mdui-color-theme-700{color:rgba(0,0,0,.87)!important;background-color:#afb42b!important}.mdui-theme-primary-lime .mdui-color-theme-800{color:rgba(0,0,0,.87)!important;background-color:#9e9d24!important}.mdui-theme-primary-lime .mdui-color-theme-900{color:#fff!important;background-color:#827717!important}.mdui-theme-primary-orange .mdui-color-theme{color:rgba(0,0,0,.87)!important;background-color:#ff9800!important}.mdui-theme-primary-orange .mdui-color-theme-50{color:rgba(0,0,0,.87)!important;background-color:#fff3e0!important}.mdui-theme-primary-orange .mdui-color-theme-100{color:rgba(0,0,0,.87)!important;background-color:#ffe0b2!important}.mdui-theme-primary-orange .mdui-color-theme-200{color:rgba(0,0,0,.87)!important;background-color:#ffcc80!important}.mdui-theme-primary-orange .mdui-color-theme-300{color:rgba(0,0,0,.87)!important;background-color:#ffb74d!important}.mdui-theme-primary-orange .mdui-color-theme-400{color:rgba(0,0,0,.87)!important;background-color:#ffa726!important}.mdui-theme-primary-orange .mdui-color-theme-500{color:rgba(0,0,0,.87)!important;background-color:#ff9800!important}.mdui-theme-primary-orange .mdui-color-theme-600{color:rgba(0,0,0,.87)!important;background-color:#fb8c00!important}.mdui-theme-primary-orange .mdui-color-theme-700{color:rgba(0,0,0,.87)!important;background-color:#f57c00!important}.mdui-theme-primary-orange .mdui-color-theme-800{color:rgba(0,0,0,.87)!important;background-color:#ef6c00!important}.mdui-theme-primary-orange .mdui-color-theme-900{color:#fff!important;background-color:#e65100!important}.mdui-theme-primary-pink .mdui-color-theme{color:#fff!important;background-color:#e91e63!important}.mdui-theme-primary-pink .mdui-color-theme-50{color:rgba(0,0,0,.87)!important;background-color:#fce4ec!important}.mdui-theme-primary-pink .mdui-color-theme-100{color:rgba(0,0,0,.87)!important;background-color:#f8bbd0!important}.mdui-theme-primary-pink .mdui-color-theme-200{color:rgba(0,0,0,.87)!important;background-color:#f48fb1!important}.mdui-theme-primary-pink .mdui-color-theme-300{color:rgba(0,0,0,.87)!important;background-color:#f06292!important}.mdui-theme-primary-pink .mdui-color-theme-400{color:#fff!important;background-color:#ec407a!important}.mdui-theme-primary-pink .mdui-color-theme-500{color:#fff!important;background-color:#e91e63!important}.mdui-theme-primary-pink .mdui-color-theme-600{color:#fff!important;background-color:#d81b60!important}.mdui-theme-primary-pink .mdui-color-theme-700{color:#fff!important;background-color:#c2185b!important}.mdui-theme-primary-pink .mdui-color-theme-800{color:#fff!important;background-color:#ad1457!important}.mdui-theme-primary-pink .mdui-color-theme-900{color:#fff!important;background-color:#880e4f!important}.mdui-theme-primary-purple .mdui-color-theme{color:#fff!important;background-color:#9c27b0!important}.mdui-theme-primary-purple .mdui-color-theme-50{color:rgba(0,0,0,.87)!important;background-color:#f3e5f5!important}.mdui-theme-primary-purple .mdui-color-theme-100{color:rgba(0,0,0,.87)!important;background-color:#e1bee7!important}.mdui-theme-primary-purple .mdui-color-theme-200{color:rgba(0,0,0,.87)!important;background-color:#ce93d8!important}.mdui-theme-primary-purple .mdui-color-theme-300{color:#fff!important;background-color:#ba68c8!important}.mdui-theme-primary-purple .mdui-color-theme-400{color:#fff!important;background-color:#ab47bc!important}.mdui-theme-primary-purple .mdui-color-theme-500{color:#fff!important;background-color:#9c27b0!important}.mdui-theme-primary-purple .mdui-color-theme-600{color:#fff!important;background-color:#8e24aa!important}.mdui-theme-primary-purple .mdui-color-theme-700{color:#fff!important;background-color:#7b1fa2!important}.mdui-theme-primary-purple .mdui-color-theme-800{color:#fff!important;background-color:#6a1b9a!important}.mdui-theme-primary-purple .mdui-color-theme-900{color:#fff!important;background-color:#4a148c!important}.mdui-theme-primary-red .mdui-color-theme{color:#fff!important;background-color:#f44336!important}.mdui-theme-primary-red .mdui-color-theme-50{color:rgba(0,0,0,.87)!important;background-color:#ffebee!important}.mdui-theme-primary-red .mdui-color-theme-100{color:rgba(0,0,0,.87)!important;background-color:#ffcdd2!important}.mdui-theme-primary-red .mdui-color-theme-200{color:rgba(0,0,0,.87)!important;background-color:#ef9a9a!important}.mdui-theme-primary-red .mdui-color-theme-300{color:rgba(0,0,0,.87)!important;background-color:#e57373!important}.mdui-theme-primary-red .mdui-color-theme-400{color:#fff!important;background-color:#ef5350!important}.mdui-theme-primary-red .mdui-color-theme-500{color:#fff!important;background-color:#f44336!important}.mdui-theme-primary-red .mdui-color-theme-600{color:#fff!important;background-color:#e53935!important}.mdui-theme-primary-red .mdui-color-theme-700{color:#fff!important;background-color:#d32f2f!important}.mdui-theme-primary-red .mdui-color-theme-800{color:#fff!important;background-color:#c62828!important}.mdui-theme-primary-red .mdui-color-theme-900{color:#fff!important;background-color:#b71c1c!important}.mdui-theme-primary-teal .mdui-color-theme{color:#fff!important;background-color:#009688!important}.mdui-theme-primary-teal .mdui-color-theme-50{color:rgba(0,0,0,.87)!important;background-color:#e0f2f1!important}.mdui-theme-primary-teal .mdui-color-theme-100{color:rgba(0,0,0,.87)!important;background-color:#b2dfdb!important}.mdui-theme-primary-teal .mdui-color-theme-200{color:rgba(0,0,0,.87)!important;background-color:#80cbc4!important}.mdui-theme-primary-teal .mdui-color-theme-300{color:rgba(0,0,0,.87)!important;background-color:#4db6ac!important}.mdui-theme-primary-teal .mdui-color-theme-400{color:rgba(0,0,0,.87)!important;background-color:#26a69a!important}.mdui-theme-primary-teal .mdui-color-theme-500{color:#fff!important;background-color:#009688!important}.mdui-theme-primary-teal .mdui-color-theme-600{color:#fff!important;background-color:#00897b!important}.mdui-theme-primary-teal .mdui-color-theme-700{color:#fff!important;background-color:#00796b!important}.mdui-theme-primary-teal .mdui-color-theme-800{color:#fff!important;background-color:#00695c!important}.mdui-theme-primary-teal .mdui-color-theme-900{color:#fff!important;background-color:#004d40!important}.mdui-theme-primary-yellow .mdui-color-theme{color:rgba(0,0,0,.87)!important;background-color:#ffeb3b!important}.mdui-theme-primary-yellow .mdui-color-theme-50{color:rgba(0,0,0,.87)!important;background-color:#fffde7!important}.mdui-theme-primary-yellow .mdui-color-theme-100{color:rgba(0,0,0,.87)!important;background-color:#fff9c4!important}.mdui-theme-primary-yellow .mdui-color-theme-200{color:rgba(0,0,0,.87)!important;background-color:#fff59d!important}.mdui-theme-primary-yellow .mdui-color-theme-300{color:rgba(0,0,0,.87)!important;background-color:#fff176!important}.mdui-theme-primary-yellow .mdui-color-theme-400{color:rgba(0,0,0,.87)!important;background-color:#ffee58!important}.mdui-theme-primary-yellow .mdui-color-theme-500{color:rgba(0,0,0,.87)!important;background-color:#ffeb3b!important}.mdui-theme-primary-yellow .mdui-color-theme-600{color:rgba(0,0,0,.87)!important;background-color:#fdd835!important}.mdui-theme-primary-yellow .mdui-color-theme-700{color:rgba(0,0,0,.87)!important;background-color:#fbc02d!important}.mdui-theme-primary-yellow .mdui-color-theme-800{color:rgba(0,0,0,.87)!important;background-color:#f9a825!important}.mdui-theme-primary-yellow .mdui-color-theme-900{color:rgba(0,0,0,.87)!important;background-color:#f57f17!important}.mdui-theme-accent-amber .mdui-color-theme-accent{color:rgba(0,0,0,.87)!important;background-color:#ffd740!important}.mdui-theme-accent-amber .mdui-color-theme-a100{color:rgba(0,0,0,.87)!important;background-color:#ffe57f!important}.mdui-theme-accent-amber .mdui-color-theme-a200{color:rgba(0,0,0,.87)!important;background-color:#ffd740!important}.mdui-theme-accent-amber .mdui-color-theme-a400{color:rgba(0,0,0,.87)!important;background-color:#ffc400!important}.mdui-theme-accent-amber .mdui-color-theme-a700{color:rgba(0,0,0,.87)!important;background-color:#ffab00!important}.mdui-theme-accent-blue .mdui-color-theme-accent{color:#fff!important;background-color:#448aff!important}.mdui-theme-accent-blue .mdui-color-theme-a100{color:rgba(0,0,0,.87)!important;background-color:#82b1ff!important}.mdui-theme-accent-blue .mdui-color-theme-a200{color:#fff!important;background-color:#448aff!important}.mdui-theme-accent-blue .mdui-color-theme-a400{color:#fff!important;background-color:#2979ff!important}.mdui-theme-accent-blue .mdui-color-theme-a700{color:#fff!important;background-color:#2962ff!important}.mdui-theme-accent-cyan .mdui-color-theme-accent{color:rgba(0,0,0,.87)!important;background-color:#18ffff!important}.mdui-theme-accent-cyan .mdui-color-theme-a100{color:rgba(0,0,0,.87)!important;background-color:#84ffff!important}.mdui-theme-accent-cyan .mdui-color-theme-a200{color:rgba(0,0,0,.87)!important;background-color:#18ffff!important}.mdui-theme-accent-cyan .mdui-color-theme-a400{color:rgba(0,0,0,.87)!important;background-color:#00e5ff!important}.mdui-theme-accent-cyan .mdui-color-theme-a700{color:rgba(0,0,0,.87)!important;background-color:#00b8d4!important}.mdui-theme-accent-deep-orange .mdui-color-theme-accent{color:rgba(0,0,0,.87)!important;background-color:#ff6e40!important}.mdui-theme-accent-deep-orange .mdui-color-theme-a100{color:rgba(0,0,0,.87)!important;background-color:#ff9e80!important}.mdui-theme-accent-deep-orange .mdui-color-theme-a200{color:rgba(0,0,0,.87)!important;background-color:#ff6e40!important}.mdui-theme-accent-deep-orange .mdui-color-theme-a400{color:#fff!important;background-color:#ff3d00!important}.mdui-theme-accent-deep-orange .mdui-color-theme-a700{color:#fff!important;background-color:#dd2c00!important}.mdui-theme-accent-deep-purple .mdui-color-theme-accent{color:#fff!important;background-color:#7c4dff!important}.mdui-theme-accent-deep-purple .mdui-color-theme-a100{color:rgba(0,0,0,.87)!important;background-color:#b388ff!important}.mdui-theme-accent-deep-purple .mdui-color-theme-a200{color:#fff!important;background-color:#7c4dff!important}.mdui-theme-accent-deep-purple .mdui-color-theme-a400{color:#fff!important;background-color:#651fff!important}.mdui-theme-accent-deep-purple .mdui-color-theme-a700{color:#fff!important;background-color:#6200ea!important}.mdui-theme-accent-green .mdui-color-theme-accent{color:rgba(0,0,0,.87)!important;background-color:#69f0ae!important}.mdui-theme-accent-green .mdui-color-theme-a100{color:rgba(0,0,0,.87)!important;background-color:#b9f6ca!important}.mdui-theme-accent-green .mdui-color-theme-a200{color:rgba(0,0,0,.87)!important;background-color:#69f0ae!important}.mdui-theme-accent-green .mdui-color-theme-a400{color:rgba(0,0,0,.87)!important;background-color:#00e676!important}.mdui-theme-accent-green .mdui-color-theme-a700{color:rgba(0,0,0,.87)!important;background-color:#00c853!important}.mdui-theme-accent-indigo .mdui-color-theme-accent{color:#fff!important;background-color:#536dfe!important}.mdui-theme-accent-indigo .mdui-color-theme-a100{color:rgba(0,0,0,.87)!important;background-color:#8c9eff!important}.mdui-theme-accent-indigo .mdui-color-theme-a200{color:#fff!important;background-color:#536dfe!important}.mdui-theme-accent-indigo .mdui-color-theme-a400{color:#fff!important;background-color:#3d5afe!important}.mdui-theme-accent-indigo .mdui-color-theme-a700{color:#fff!important;background-color:#304ffe!important}.mdui-theme-accent-light-blue .mdui-color-theme-accent{color:rgba(0,0,0,.87)!important;background-color:#40c4ff!important}.mdui-theme-accent-light-blue .mdui-color-theme-a100{color:rgba(0,0,0,.87)!important;background-color:#80d8ff!important}.mdui-theme-accent-light-blue .mdui-color-theme-a200{color:rgba(0,0,0,.87)!important;background-color:#40c4ff!important}.mdui-theme-accent-light-blue .mdui-color-theme-a400{color:rgba(0,0,0,.87)!important;background-color:#00b0ff!important}.mdui-theme-accent-light-blue .mdui-color-theme-a700{color:#fff!important;background-color:#0091ea!important}.mdui-theme-accent-light-green .mdui-color-theme-accent{color:rgba(0,0,0,.87)!important;background-color:#b2ff59!important}.mdui-theme-accent-light-green .mdui-color-theme-a100{color:rgba(0,0,0,.87)!important;background-color:#ccff90!important}.mdui-theme-accent-light-green .mdui-color-theme-a200{color:rgba(0,0,0,.87)!important;background-color:#b2ff59!important}.mdui-theme-accent-light-green .mdui-color-theme-a400{color:rgba(0,0,0,.87)!important;background-color:#76ff03!important}.mdui-theme-accent-light-green .mdui-color-theme-a700{color:rgba(0,0,0,.87)!important;background-color:#64dd17!important}.mdui-theme-accent-lime .mdui-color-theme-accent{color:rgba(0,0,0,.87)!important;background-color:#eeff41!important}.mdui-theme-accent-lime .mdui-color-theme-a100{color:rgba(0,0,0,.87)!important;background-color:#f4ff81!important}.mdui-theme-accent-lime .mdui-color-theme-a200{color:rgba(0,0,0,.87)!important;background-color:#eeff41!important}.mdui-theme-accent-lime .mdui-color-theme-a400{color:rgba(0,0,0,.87)!important;background-color:#c6ff00!important}.mdui-theme-accent-lime .mdui-color-theme-a700{color:rgba(0,0,0,.87)!important;background-color:#aeea00!important}.mdui-theme-accent-orange .mdui-color-theme-accent{color:rgba(0,0,0,.87)!important;background-color:#ffab40!important}.mdui-theme-accent-orange .mdui-color-theme-a100{color:rgba(0,0,0,.87)!important;background-color:#ffd180!important}.mdui-theme-accent-orange .mdui-color-theme-a200{color:rgba(0,0,0,.87)!important;background-color:#ffab40!important}.mdui-theme-accent-orange .mdui-color-theme-a400{color:rgba(0,0,0,.87)!important;background-color:#ff9100!important}.mdui-theme-accent-orange .mdui-color-theme-a700{color:rgba(0,0,0,.87)!important;background-color:#ff6d00!important}.mdui-theme-accent-pink .mdui-color-theme-accent{color:#fff!important;background-color:#ff4081!important}.mdui-theme-accent-pink .mdui-color-theme-a100{color:rgba(0,0,0,.87)!important;background-color:#ff80ab!important}.mdui-theme-accent-pink .mdui-color-theme-a200{color:#fff!important;background-color:#ff4081!important}.mdui-theme-accent-pink .mdui-color-theme-a400{color:#fff!important;background-color:#f50057!important}.mdui-theme-accent-pink .mdui-color-theme-a700{color:#fff!important;background-color:#c51162!important}.mdui-theme-accent-purple .mdui-color-theme-accent{color:#fff!important;background-color:#e040fb!important}.mdui-theme-accent-purple .mdui-color-theme-a100{color:rgba(0,0,0,.87)!important;background-color:#ea80fc!important}.mdui-theme-accent-purple .mdui-color-theme-a200{color:#fff!important;background-color:#e040fb!important}.mdui-theme-accent-purple .mdui-color-theme-a400{color:#fff!important;background-color:#d500f9!important}.mdui-theme-accent-purple .mdui-color-theme-a700{color:#fff!important;background-color:#a0f!important}.mdui-theme-accent-red .mdui-color-theme-accent{color:#fff!important;background-color:#ff5252!important}.mdui-theme-accent-red .mdui-color-theme-a100{color:rgba(0,0,0,.87)!important;background-color:#ff8a80!important}.mdui-theme-accent-red .mdui-color-theme-a200{color:#fff!important;background-color:#ff5252!important}.mdui-theme-accent-red .mdui-color-theme-a400{color:#fff!important;background-color:#ff1744!important}.mdui-theme-accent-red .mdui-color-theme-a700{color:#fff!important;background-color:#d50000!important}.mdui-theme-accent-teal .mdui-color-theme-accent{color:rgba(0,0,0,.87)!important;background-color:#64ffda!important}.mdui-theme-accent-teal .mdui-color-theme-a100{color:rgba(0,0,0,.87)!important;background-color:#a7ffeb!important}.mdui-theme-accent-teal .mdui-color-theme-a200{color:rgba(0,0,0,.87)!important;background-color:#64ffda!important}.mdui-theme-accent-teal .mdui-color-theme-a400{color:rgba(0,0,0,.87)!important;background-color:#1de9b6!important}.mdui-theme-accent-teal .mdui-color-theme-a700{color:rgba(0,0,0,.87)!important;background-color:#00bfa5!important}.mdui-theme-accent-yellow .mdui-color-theme-accent{color:rgba(0,0,0,.87)!important;background-color:#ff0!important}.mdui-theme-accent-yellow .mdui-color-theme-a100{color:rgba(0,0,0,.87)!important;background-color:#ffff8d!important}.mdui-theme-accent-yellow .mdui-color-theme-a200{color:rgba(0,0,0,.87)!important;background-color:#ff0!important}.mdui-theme-accent-yellow .mdui-color-theme-a400{color:rgba(0,0,0,.87)!important;background-color:#ffea00!important}.mdui-theme-accent-yellow .mdui-color-theme-a700{color:rgba(0,0,0,.87)!important;background-color:#ffd600!important}.mdui-color-amber{color:rgba(0,0,0,.87)!important;background-color:#ffc107!important}.mdui-color-amber-50{color:rgba(0,0,0,.87)!important;background-color:#fff8e1!important}.mdui-color-amber-100{color:rgba(0,0,0,.87)!important;background-color:#ffecb3!important}.mdui-color-amber-200{color:rgba(0,0,0,.87)!important;background-color:#ffe082!important}.mdui-color-amber-300{color:rgba(0,0,0,.87)!important;background-color:#ffd54f!important}.mdui-color-amber-400{color:rgba(0,0,0,.87)!important;background-color:#ffca28!important}.mdui-color-amber-500{color:rgba(0,0,0,.87)!important;background-color:#ffc107!important}.mdui-color-amber-600{color:rgba(0,0,0,.87)!important;background-color:#ffb300!important}.mdui-color-amber-700{color:rgba(0,0,0,.87)!important;background-color:#ffa000!important}.mdui-color-amber-800{color:rgba(0,0,0,.87)!important;background-color:#ff8f00!important}.mdui-color-amber-900{color:rgba(0,0,0,.87)!important;background-color:#ff6f00!important}.mdui-color-blue{color:rgba(0,0,0,.87)!important;background-color:#2196f3!important}.mdui-color-blue-50{color:rgba(0,0,0,.87)!important;background-color:#e3f2fd!important}.mdui-color-blue-100{color:rgba(0,0,0,.87)!important;background-color:#bbdefb!important}.mdui-color-blue-200{color:rgba(0,0,0,.87)!important;background-color:#90caf9!important}.mdui-color-blue-300{color:rgba(0,0,0,.87)!important;background-color:#64b5f6!important}.mdui-color-blue-400{color:rgba(0,0,0,.87)!important;background-color:#42a5f5!important}.mdui-color-blue-500{color:rgba(0,0,0,.87)!important;background-color:#2196f3!important}.mdui-color-blue-600{color:#fff!important;background-color:#1e88e5!important}.mdui-color-blue-700{color:#fff!important;background-color:#1976d2!important}.mdui-color-blue-800{color:#fff!important;background-color:#1565c0!important}.mdui-color-blue-900{color:#fff!important;background-color:#0d47a1!important}.mdui-color-blue-grey{color:#fff!important;background-color:#607d8b!important}.mdui-color-blue-grey-50{color:rgba(0,0,0,.87)!important;background-color:#eceff1!important}.mdui-color-blue-grey-100{color:rgba(0,0,0,.87)!important;background-color:#cfd8dc!important}.mdui-color-blue-grey-200{color:rgba(0,0,0,.87)!important;background-color:#b0bec5!important}.mdui-color-blue-grey-300{color:rgba(0,0,0,.87)!important;background-color:#90a4ae!important}.mdui-color-blue-grey-400{color:#fff!important;background-color:#78909c!important}.mdui-color-blue-grey-500{color:#fff!important;background-color:#607d8b!important}.mdui-color-blue-grey-600{color:#fff!important;background-color:#546e7a!important}.mdui-color-blue-grey-700{color:#fff!important;background-color:#455a64!important}.mdui-color-blue-grey-800{color:#fff!important;background-color:#37474f!important}.mdui-color-blue-grey-900{color:#fff!important;background-color:#263238!important}.mdui-color-brown{color:#fff!important;background-color:#795548!important}.mdui-color-brown-50{color:rgba(0,0,0,.87)!important;background-color:#efebe9!important}.mdui-color-brown-100{color:rgba(0,0,0,.87)!important;background-color:#d7ccc8!important}.mdui-color-brown-200{color:rgba(0,0,0,.87)!important;background-color:#bcaaa4!important}.mdui-color-brown-300{color:#fff!important;background-color:#a1887f!important}.mdui-color-brown-400{color:#fff!important;background-color:#8d6e63!important}.mdui-color-brown-500{color:#fff!important;background-color:#795548!important}.mdui-color-brown-600{color:#fff!important;background-color:#6d4c41!important}.mdui-color-brown-700{color:#fff!important;background-color:#5d4037!important}.mdui-color-brown-800{color:#fff!important;background-color:#4e342e!important}.mdui-color-brown-900{color:#fff!important;background-color:#3e2723!important}.mdui-color-cyan{color:rgba(0,0,0,.87)!important;background-color:#00bcd4!important}.mdui-color-cyan-50{color:rgba(0,0,0,.87)!important;background-color:#e0f7fa!important}.mdui-color-cyan-100{color:rgba(0,0,0,.87)!important;background-color:#b2ebf2!important}.mdui-color-cyan-200{color:rgba(0,0,0,.87)!important;background-color:#80deea!important}.mdui-color-cyan-300{color:rgba(0,0,0,.87)!important;background-color:#4dd0e1!important}.mdui-color-cyan-400{color:rgba(0,0,0,.87)!important;background-color:#26c6da!important}.mdui-color-cyan-500{color:rgba(0,0,0,.87)!important;background-color:#00bcd4!important}.mdui-color-cyan-600{color:rgba(0,0,0,.87)!important;background-color:#00acc1!important}.mdui-color-cyan-700{color:#fff!important;background-color:#0097a7!important}.mdui-color-cyan-800{color:#fff!important;background-color:#00838f!important}.mdui-color-cyan-900{color:#fff!important;background-color:#006064!important}.mdui-color-deep-orange{color:rgba(0,0,0,.87)!important;background-color:#ff5722!important}.mdui-color-deep-orange-50{color:rgba(0,0,0,.87)!important;background-color:#fbe9e7!important}.mdui-color-deep-orange-100{color:rgba(0,0,0,.87)!important;background-color:#ffccbc!important}.mdui-color-deep-orange-200{color:rgba(0,0,0,.87)!important;background-color:#ffab91!important}.mdui-color-deep-orange-300{color:rgba(0,0,0,.87)!important;background-color:#ff8a65!important}.mdui-color-deep-orange-400{color:rgba(0,0,0,.87)!important;background-color:#ff7043!important}.mdui-color-deep-orange-500{color:rgba(0,0,0,.87)!important;background-color:#ff5722!important}.mdui-color-deep-orange-600{color:#fff!important;background-color:#f4511e!important}.mdui-color-deep-orange-700{color:#fff!important;background-color:#e64a19!important}.mdui-color-deep-orange-800{color:#fff!important;background-color:#d84315!important}.mdui-color-deep-orange-900{color:#fff!important;background-color:#bf360c!important}.mdui-color-deep-purple{color:#fff!important;background-color:#673ab7!important}.mdui-color-deep-purple-50{color:rgba(0,0,0,.87)!important;background-color:#ede7f6!important}.mdui-color-deep-purple-100{color:rgba(0,0,0,.87)!important;background-color:#d1c4e9!important}.mdui-color-deep-purple-200{color:rgba(0,0,0,.87)!important;background-color:#b39ddb!important}.mdui-color-deep-purple-300{color:#fff!important;background-color:#9575cd!important}.mdui-color-deep-purple-400{color:#fff!important;background-color:#7e57c2!important}.mdui-color-deep-purple-500{color:#fff!important;background-color:#673ab7!important}.mdui-color-deep-purple-600{color:#fff!important;background-color:#5e35b1!important}.mdui-color-deep-purple-700{color:#fff!important;background-color:#512da8!important}.mdui-color-deep-purple-800{color:#fff!important;background-color:#4527a0!important}.mdui-color-deep-purple-900{color:#fff!important;background-color:#311b92!important}.mdui-color-green{color:rgba(0,0,0,.87)!important;background-color:#4caf50!important}.mdui-color-green-50{color:rgba(0,0,0,.87)!important;background-color:#e8f5e9!important}.mdui-color-green-100{color:rgba(0,0,0,.87)!important;background-color:#c8e6c9!important}.mdui-color-green-200{color:rgba(0,0,0,.87)!important;background-color:#a5d6a7!important}.mdui-color-green-300{color:rgba(0,0,0,.87)!important;background-color:#81c784!important}.mdui-color-green-400{color:rgba(0,0,0,.87)!important;background-color:#66bb6a!important}.mdui-color-green-500{color:rgba(0,0,0,.87)!important;background-color:#4caf50!important}.mdui-color-green-600{color:#fff!important;background-color:#43a047!important}.mdui-color-green-700{color:#fff!important;background-color:#388e3c!important}.mdui-color-green-800{color:#fff!important;background-color:#2e7d32!important}.mdui-color-green-900{color:#fff!important;background-color:#1b5e20!important}.mdui-color-grey{color:rgba(0,0,0,.87)!important;background-color:#9e9e9e!important}.mdui-color-grey-50{color:rgba(0,0,0,.87)!important;background-color:#fafafa!important}.mdui-color-grey-100{color:rgba(0,0,0,.87)!important;background-color:#f5f5f5!important}.mdui-color-grey-200{color:rgba(0,0,0,.87)!important;background-color:#eee!important}.mdui-color-grey-300{color:rgba(0,0,0,.87)!important;background-color:#e0e0e0!important}.mdui-color-grey-400{color:rgba(0,0,0,.87)!important;background-color:#bdbdbd!important}.mdui-color-grey-500{color:rgba(0,0,0,.87)!important;background-color:#9e9e9e!important}.mdui-color-grey-600{color:#fff!important;background-color:#757575!important}.mdui-color-grey-700{color:#fff!important;background-color:#616161!important}.mdui-color-grey-800{color:#fff!important;background-color:#424242!important}.mdui-color-grey-900{color:#fff!important;background-color:#212121!important}.mdui-color-indigo{color:#fff!important;background-color:#3f51b5!important}.mdui-color-indigo-50{color:rgba(0,0,0,.87)!important;background-color:#e8eaf6!important}.mdui-color-indigo-100{color:rgba(0,0,0,.87)!important;background-color:#c5cae9!important}.mdui-color-indigo-200{color:rgba(0,0,0,.87)!important;background-color:#9fa8da!important}.mdui-color-indigo-300{color:#fff!important;background-color:#7986cb!important}.mdui-color-indigo-400{color:#fff!important;background-color:#5c6bc0!important}.mdui-color-indigo-500{color:#fff!important;background-color:#3f51b5!important}.mdui-color-indigo-600{color:#fff!important;background-color:#3949ab!important}.mdui-color-indigo-700{color:#fff!important;background-color:#303f9f!important}.mdui-color-indigo-800{color:#fff!important;background-color:#283593!important}.mdui-color-indigo-900{color:#fff!important;background-color:#1a237e!important}.mdui-color-light-blue{color:rgba(0,0,0,.87)!important;background-color:#03a9f4!important}.mdui-color-light-blue-50{color:rgba(0,0,0,.87)!important;background-color:#e1f5fe!important}.mdui-color-light-blue-100{color:rgba(0,0,0,.87)!important;background-color:#b3e5fc!important}.mdui-color-light-blue-200{color:rgba(0,0,0,.87)!important;background-color:#81d4fa!important}.mdui-color-light-blue-300{color:rgba(0,0,0,.87)!important;background-color:#4fc3f7!important}.mdui-color-light-blue-400{color:rgba(0,0,0,.87)!important;background-color:#29b6f6!important}.mdui-color-light-blue-500{color:rgba(0,0,0,.87)!important;background-color:#03a9f4!important}.mdui-color-light-blue-600{color:rgba(0,0,0,.87)!important;background-color:#039be5!important}.mdui-color-light-blue-700{color:#fff!important;background-color:#0288d1!important}.mdui-color-light-blue-800{color:#fff!important;background-color:#0277bd!important}.mdui-color-light-blue-900{color:#fff!important;background-color:#01579b!important}.mdui-color-light-green{color:rgba(0,0,0,.87)!important;background-color:#8bc34a!important}.mdui-color-light-green-50{color:rgba(0,0,0,.87)!important;background-color:#f1f8e9!important}.mdui-color-light-green-100{color:rgba(0,0,0,.87)!important;background-color:#dcedc8!important}.mdui-color-light-green-200{color:rgba(0,0,0,.87)!important;background-color:#c5e1a5!important}.mdui-color-light-green-300{color:rgba(0,0,0,.87)!important;background-color:#aed581!important}.mdui-color-light-green-400{color:rgba(0,0,0,.87)!important;background-color:#9ccc65!important}.mdui-color-light-green-500{color:rgba(0,0,0,.87)!important;background-color:#8bc34a!important}.mdui-color-light-green-600{color:rgba(0,0,0,.87)!important;background-color:#7cb342!important}.mdui-color-light-green-700{color:rgba(0,0,0,.87)!important;background-color:#689f38!important}.mdui-color-light-green-800{color:#fff!important;background-color:#558b2f!important}.mdui-color-light-green-900{color:#fff!important;background-color:#33691e!important}.mdui-color-lime{color:rgba(0,0,0,.87)!important;background-color:#cddc39!important}.mdui-color-lime-50{color:rgba(0,0,0,.87)!important;background-color:#f9fbe7!important}.mdui-color-lime-100{color:rgba(0,0,0,.87)!important;background-color:#f0f4c3!important}.mdui-color-lime-200{color:rgba(0,0,0,.87)!important;background-color:#e6ee9c!important}.mdui-color-lime-300{color:rgba(0,0,0,.87)!important;background-color:#dce775!important}.mdui-color-lime-400{color:rgba(0,0,0,.87)!important;background-color:#d4e157!important}.mdui-color-lime-500{color:rgba(0,0,0,.87)!important;background-color:#cddc39!important}.mdui-color-lime-600{color:rgba(0,0,0,.87)!important;background-color:#c0ca33!important}.mdui-color-lime-700{color:rgba(0,0,0,.87)!important;background-color:#afb42b!important}.mdui-color-lime-800{color:rgba(0,0,0,.87)!important;background-color:#9e9d24!important}.mdui-color-lime-900{color:#fff!important;background-color:#827717!important}.mdui-color-orange{color:rgba(0,0,0,.87)!important;background-color:#ff9800!important}.mdui-color-orange-50{color:rgba(0,0,0,.87)!important;background-color:#fff3e0!important}.mdui-color-orange-100{color:rgba(0,0,0,.87)!important;background-color:#ffe0b2!important}.mdui-color-orange-200{color:rgba(0,0,0,.87)!important;background-color:#ffcc80!important}.mdui-color-orange-300{color:rgba(0,0,0,.87)!important;background-color:#ffb74d!important}.mdui-color-orange-400{color:rgba(0,0,0,.87)!important;background-color:#ffa726!important}.mdui-color-orange-500{color:rgba(0,0,0,.87)!important;background-color:#ff9800!important}.mdui-color-orange-600{color:rgba(0,0,0,.87)!important;background-color:#fb8c00!important}.mdui-color-orange-700{color:rgba(0,0,0,.87)!important;background-color:#f57c00!important}.mdui-color-orange-800{color:rgba(0,0,0,.87)!important;background-color:#ef6c00!important}.mdui-color-orange-900{color:#fff!important;background-color:#e65100!important}.mdui-color-pink{color:#fff!important;background-color:#e91e63!important}.mdui-color-pink-50{color:rgba(0,0,0,.87)!important;background-color:#fce4ec!important}.mdui-color-pink-100{color:rgba(0,0,0,.87)!important;background-color:#f8bbd0!important}.mdui-color-pink-200{color:rgba(0,0,0,.87)!important;background-color:#f48fb1!important}.mdui-color-pink-300{color:rgba(0,0,0,.87)!important;background-color:#f06292!important}.mdui-color-pink-400{color:#fff!important;background-color:#ec407a!important}.mdui-color-pink-500{color:#fff!important;background-color:#e91e63!important}.mdui-color-pink-600{color:#fff!important;background-color:#d81b60!important}.mdui-color-pink-700{color:#fff!important;background-color:#c2185b!important}.mdui-color-pink-800{color:#fff!important;background-color:#ad1457!important}.mdui-color-pink-900{color:#fff!important;background-color:#880e4f!important}.mdui-color-purple{color:#fff!important;background-color:#9c27b0!important}.mdui-color-purple-50{color:rgba(0,0,0,.87)!important;background-color:#f3e5f5!important}.mdui-color-purple-100{color:rgba(0,0,0,.87)!important;background-color:#e1bee7!important}.mdui-color-purple-200{color:rgba(0,0,0,.87)!important;background-color:#ce93d8!important}.mdui-color-purple-300{color:#fff!important;background-color:#ba68c8!important}.mdui-color-purple-400{color:#fff!important;background-color:#ab47bc!important}.mdui-color-purple-500{color:#fff!important;background-color:#9c27b0!important}.mdui-color-purple-600{color:#fff!important;background-color:#8e24aa!important}.mdui-color-purple-700{color:#fff!important;background-color:#7b1fa2!important}.mdui-color-purple-800{color:#fff!important;background-color:#6a1b9a!important}.mdui-color-purple-900{color:#fff!important;background-color:#4a148c!important}.mdui-color-red{color:#fff!important;background-color:#f44336!important}.mdui-color-red-50{color:rgba(0,0,0,.87)!important;background-color:#ffebee!important}.mdui-color-red-100{color:rgba(0,0,0,.87)!important;background-color:#ffcdd2!important}.mdui-color-red-200{color:rgba(0,0,0,.87)!important;background-color:#ef9a9a!important}.mdui-color-red-300{color:rgba(0,0,0,.87)!important;background-color:#e57373!important}.mdui-color-red-400{color:#fff!important;background-color:#ef5350!important}.mdui-color-red-500{color:#fff!important;background-color:#f44336!important}.mdui-color-red-600{color:#fff!important;background-color:#e53935!important}.mdui-color-red-700{color:#fff!important;background-color:#d32f2f!important}.mdui-color-red-800{color:#fff!important;background-color:#c62828!important}.mdui-color-red-900{color:#fff!important;background-color:#b71c1c!important}.mdui-color-teal{color:#fff!important;background-color:#009688!important}.mdui-color-teal-50{color:rgba(0,0,0,.87)!important;background-color:#e0f2f1!important}.mdui-color-teal-100{color:rgba(0,0,0,.87)!important;background-color:#b2dfdb!important}.mdui-color-teal-200{color:rgba(0,0,0,.87)!important;background-color:#80cbc4!important}.mdui-color-teal-300{color:rgba(0,0,0,.87)!important;background-color:#4db6ac!important}.mdui-color-teal-400{color:rgba(0,0,0,.87)!important;background-color:#26a69a!important}.mdui-color-teal-500{color:#fff!important;background-color:#009688!important}.mdui-color-teal-600{color:#fff!important;background-color:#00897b!important}.mdui-color-teal-700{color:#fff!important;background-color:#00796b!important}.mdui-color-teal-800{color:#fff!important;background-color:#00695c!important}.mdui-color-teal-900{color:#fff!important;background-color:#004d40!important}.mdui-color-yellow{color:rgba(0,0,0,.87)!important;background-color:#ffeb3b!important}.mdui-color-yellow-50{color:rgba(0,0,0,.87)!important;background-color:#fffde7!important}.mdui-color-yellow-100{color:rgba(0,0,0,.87)!important;background-color:#fff9c4!important}.mdui-color-yellow-200{color:rgba(0,0,0,.87)!important;background-color:#fff59d!important}.mdui-color-yellow-300{color:rgba(0,0,0,.87)!important;background-color:#fff176!important}.mdui-color-yellow-400{color:rgba(0,0,0,.87)!important;background-color:#ffee58!important}.mdui-color-yellow-500{color:rgba(0,0,0,.87)!important;background-color:#ffeb3b!important}.mdui-color-yellow-600{color:rgba(0,0,0,.87)!important;background-color:#fdd835!important}.mdui-color-yellow-700{color:rgba(0,0,0,.87)!important;background-color:#fbc02d!important}.mdui-color-yellow-800{color:rgba(0,0,0,.87)!important;background-color:#f9a825!important}.mdui-color-yellow-900{color:rgba(0,0,0,.87)!important;background-color:#f57f17!important}.mdui-color-amber-accent{color:rgba(0,0,0,.87)!important;background-color:#ffd740!important}.mdui-color-amber-a100{color:rgba(0,0,0,.87)!important;background-color:#ffe57f!important}.mdui-color-amber-a200{color:rgba(0,0,0,.87)!important;background-color:#ffd740!important}.mdui-color-amber-a400{color:rgba(0,0,0,.87)!important;background-color:#ffc400!important}.mdui-color-amber-a700{color:rgba(0,0,0,.87)!important;background-color:#ffab00!important}.mdui-color-blue-accent{color:#fff!important;background-color:#448aff!important}.mdui-color-blue-a100{color:rgba(0,0,0,.87)!important;background-color:#82b1ff!important}.mdui-color-blue-a200{color:#fff!important;background-color:#448aff!important}.mdui-color-blue-a400{color:#fff!important;background-color:#2979ff!important}.mdui-color-blue-a700{color:#fff!important;background-color:#2962ff!important}.mdui-color-cyan-accent{color:rgba(0,0,0,.87)!important;background-color:#18ffff!important}.mdui-color-cyan-a100{color:rgba(0,0,0,.87)!important;background-color:#84ffff!important}.mdui-color-cyan-a200{color:rgba(0,0,0,.87)!important;background-color:#18ffff!important}.mdui-color-cyan-a400{color:rgba(0,0,0,.87)!important;background-color:#00e5ff!important}.mdui-color-cyan-a700{color:rgba(0,0,0,.87)!important;background-color:#00b8d4!important}.mdui-color-deep-orange-accent{color:rgba(0,0,0,.87)!important;background-color:#ff6e40!important}.mdui-color-deep-orange-a100{color:rgba(0,0,0,.87)!important;background-color:#ff9e80!important}.mdui-color-deep-orange-a200{color:rgba(0,0,0,.87)!important;background-color:#ff6e40!important}.mdui-color-deep-orange-a400{color:#fff!important;background-color:#ff3d00!important}.mdui-color-deep-orange-a700{color:#fff!important;background-color:#dd2c00!important}.mdui-color-deep-purple-accent{color:#fff!important;background-color:#7c4dff!important}.mdui-color-deep-purple-a100{color:rgba(0,0,0,.87)!important;background-color:#b388ff!important}.mdui-color-deep-purple-a200{color:#fff!important;background-color:#7c4dff!important}.mdui-color-deep-purple-a400{color:#fff!important;background-color:#651fff!important}.mdui-color-deep-purple-a700{color:#fff!important;background-color:#6200ea!important}.mdui-color-green-accent{color:rgba(0,0,0,.87)!important;background-color:#69f0ae!important}.mdui-color-green-a100{color:rgba(0,0,0,.87)!important;background-color:#b9f6ca!important}.mdui-color-green-a200{color:rgba(0,0,0,.87)!important;background-color:#69f0ae!important}.mdui-color-green-a400{color:rgba(0,0,0,.87)!important;background-color:#00e676!important}.mdui-color-green-a700{color:rgba(0,0,0,.87)!important;background-color:#00c853!important}.mdui-color-indigo-accent{color:#fff!important;background-color:#536dfe!important}.mdui-color-indigo-a100{color:rgba(0,0,0,.87)!important;background-color:#8c9eff!important}.mdui-color-indigo-a200{color:#fff!important;background-color:#536dfe!important}.mdui-color-indigo-a400{color:#fff!important;background-color:#3d5afe!important}.mdui-color-indigo-a700{color:#fff!important;background-color:#304ffe!important}.mdui-color-light-blue-accent{color:rgba(0,0,0,.87)!important;background-color:#40c4ff!important}.mdui-color-light-blue-a100{color:rgba(0,0,0,.87)!important;background-color:#80d8ff!important}.mdui-color-light-blue-a200{color:rgba(0,0,0,.87)!important;background-color:#40c4ff!important}.mdui-color-light-blue-a400{color:rgba(0,0,0,.87)!important;background-color:#00b0ff!important}.mdui-color-light-blue-a700{color:#fff!important;background-color:#0091ea!important}.mdui-color-light-green-accent{color:rgba(0,0,0,.87)!important;background-color:#b2ff59!important}.mdui-color-light-green-a100{color:rgba(0,0,0,.87)!important;background-color:#ccff90!important}.mdui-color-light-green-a200{color:rgba(0,0,0,.87)!important;background-color:#b2ff59!important}.mdui-color-light-green-a400{color:rgba(0,0,0,.87)!important;background-color:#76ff03!important}.mdui-color-light-green-a700{color:rgba(0,0,0,.87)!important;background-color:#64dd17!important}.mdui-color-lime-accent{color:rgba(0,0,0,.87)!important;background-color:#eeff41!important}.mdui-color-lime-a100{color:rgba(0,0,0,.87)!important;background-color:#f4ff81!important}.mdui-color-lime-a200{color:rgba(0,0,0,.87)!important;background-color:#eeff41!important}.mdui-color-lime-a400{color:rgba(0,0,0,.87)!important;background-color:#c6ff00!important}.mdui-color-lime-a700{color:rgba(0,0,0,.87)!important;background-color:#aeea00!important}.mdui-color-orange-accent{color:rgba(0,0,0,.87)!important;background-color:#ffab40!important}.mdui-color-orange-a100{color:rgba(0,0,0,.87)!important;background-color:#ffd180!important}.mdui-color-orange-a200{color:rgba(0,0,0,.87)!important;background-color:#ffab40!important}.mdui-color-orange-a400{color:rgba(0,0,0,.87)!important;background-color:#ff9100!important}.mdui-color-orange-a700{color:rgba(0,0,0,.87)!important;background-color:#ff6d00!important}.mdui-color-pink-accent{color:#fff!important;background-color:#ff4081!important}.mdui-color-pink-a100{color:rgba(0,0,0,.87)!important;background-color:#ff80ab!important}.mdui-color-pink-a200{color:#fff!important;background-color:#ff4081!important}.mdui-color-pink-a400{color:#fff!important;background-color:#f50057!important}.mdui-color-pink-a700{color:#fff!important;background-color:#c51162!important}.mdui-color-purple-accent{color:#fff!important;background-color:#e040fb!important}.mdui-color-purple-a100{color:rgba(0,0,0,.87)!important;background-color:#ea80fc!important}.mdui-color-purple-a200{color:#fff!important;background-color:#e040fb!important}.mdui-color-purple-a400{color:#fff!important;background-color:#d500f9!important}.mdui-color-purple-a700{color:#fff!important;background-color:#a0f!important}.mdui-color-red-accent{color:#fff!important;background-color:#ff5252!important}.mdui-color-red-a100{color:rgba(0,0,0,.87)!important;background-color:#ff8a80!important}.mdui-color-red-a200{color:#fff!important;background-color:#ff5252!important}.mdui-color-red-a400{color:#fff!important;background-color:#ff1744!important}.mdui-color-red-a700{color:#fff!important;background-color:#d50000!important}.mdui-color-teal-accent{color:rgba(0,0,0,.87)!important;background-color:#64ffda!important}.mdui-color-teal-a100{color:rgba(0,0,0,.87)!important;background-color:#a7ffeb!important}.mdui-color-teal-a200{color:rgba(0,0,0,.87)!important;background-color:#64ffda!important}.mdui-color-teal-a400{color:rgba(0,0,0,.87)!important;background-color:#1de9b6!important}.mdui-color-teal-a700{color:rgba(0,0,0,.87)!important;background-color:#00bfa5!important}.mdui-color-yellow-accent{color:rgba(0,0,0,.87)!important;background-color:#ff0!important}.mdui-color-yellow-a100{color:rgba(0,0,0,.87)!important;background-color:#ffff8d!important}.mdui-color-yellow-a200{color:rgba(0,0,0,.87)!important;background-color:#ff0!important}.mdui-color-yellow-a400{color:rgba(0,0,0,.87)!important;background-color:#ffea00!important}.mdui-color-yellow-a700{color:rgba(0,0,0,.87)!important;background-color:#ffd600!important}.mdui-color-black{color:#fff!important;background-color:#000!important}.mdui-color-white{color:rgba(0,0,0,.87)!important;background-color:#fff!important}.mdui-color-transparent{background-color:transparent!important}.mdui-theme-primary-amber .mdui-text-color-theme{color:#ffc107!important}.mdui-theme-primary-amber .mdui-text-color-theme-50{color:#fff8e1!important}.mdui-theme-primary-amber .mdui-text-color-theme-100{color:#ffecb3!important}.mdui-theme-primary-amber .mdui-text-color-theme-200{color:#ffe082!important}.mdui-theme-primary-amber .mdui-text-color-theme-300{color:#ffd54f!important}.mdui-theme-primary-amber .mdui-text-color-theme-400{color:#ffca28!important}.mdui-theme-primary-amber .mdui-text-color-theme-500{color:#ffc107!important}.mdui-theme-primary-amber .mdui-text-color-theme-600{color:#ffb300!important}.mdui-theme-primary-amber .mdui-text-color-theme-700{color:#ffa000!important}.mdui-theme-primary-amber .mdui-text-color-theme-800{color:#ff8f00!important}.mdui-theme-primary-amber .mdui-text-color-theme-900{color:#ff6f00!important}.mdui-theme-primary-blue .mdui-text-color-theme{color:#2196f3!important}.mdui-theme-primary-blue .mdui-text-color-theme-50{color:#e3f2fd!important}.mdui-theme-primary-blue .mdui-text-color-theme-100{color:#bbdefb!important}.mdui-theme-primary-blue .mdui-text-color-theme-200{color:#90caf9!important}.mdui-theme-primary-blue .mdui-text-color-theme-300{color:#64b5f6!important}.mdui-theme-primary-blue .mdui-text-color-theme-400{color:#42a5f5!important}.mdui-theme-primary-blue .mdui-text-color-theme-500{color:#2196f3!important}.mdui-theme-primary-blue .mdui-text-color-theme-600{color:#1e88e5!important}.mdui-theme-primary-blue .mdui-text-color-theme-700{color:#1976d2!important}.mdui-theme-primary-blue .mdui-text-color-theme-800{color:#1565c0!important}.mdui-theme-primary-blue .mdui-text-color-theme-900{color:#0d47a1!important}.mdui-theme-primary-blue-grey .mdui-text-color-theme{color:#607d8b!important}.mdui-theme-primary-blue-grey .mdui-text-color-theme-50{color:#eceff1!important}.mdui-theme-primary-blue-grey .mdui-text-color-theme-100{color:#cfd8dc!important}.mdui-theme-primary-blue-grey .mdui-text-color-theme-200{color:#b0bec5!important}.mdui-theme-primary-blue-grey .mdui-text-color-theme-300{color:#90a4ae!important}.mdui-theme-primary-blue-grey .mdui-text-color-theme-400{color:#78909c!important}.mdui-theme-primary-blue-grey .mdui-text-color-theme-500{color:#607d8b!important}.mdui-theme-primary-blue-grey .mdui-text-color-theme-600{color:#546e7a!important}.mdui-theme-primary-blue-grey .mdui-text-color-theme-700{color:#455a64!important}.mdui-theme-primary-blue-grey .mdui-text-color-theme-800{color:#37474f!important}.mdui-theme-primary-blue-grey .mdui-text-color-theme-900{color:#263238!important}.mdui-theme-primary-brown .mdui-text-color-theme{color:#795548!important}.mdui-theme-primary-brown .mdui-text-color-theme-50{color:#efebe9!important}.mdui-theme-primary-brown .mdui-text-color-theme-100{color:#d7ccc8!important}.mdui-theme-primary-brown .mdui-text-color-theme-200{color:#bcaaa4!important}.mdui-theme-primary-brown .mdui-text-color-theme-300{color:#a1887f!important}.mdui-theme-primary-brown .mdui-text-color-theme-400{color:#8d6e63!important}.mdui-theme-primary-brown .mdui-text-color-theme-500{color:#795548!important}.mdui-theme-primary-brown .mdui-text-color-theme-600{color:#6d4c41!important}.mdui-theme-primary-brown .mdui-text-color-theme-700{color:#5d4037!important}.mdui-theme-primary-brown .mdui-text-color-theme-800{color:#4e342e!important}.mdui-theme-primary-brown .mdui-text-color-theme-900{color:#3e2723!important}.mdui-theme-primary-cyan .mdui-text-color-theme{color:#00bcd4!important}.mdui-theme-primary-cyan .mdui-text-color-theme-50{color:#e0f7fa!important}.mdui-theme-primary-cyan .mdui-text-color-theme-100{color:#b2ebf2!important}.mdui-theme-primary-cyan .mdui-text-color-theme-200{color:#80deea!important}.mdui-theme-primary-cyan .mdui-text-color-theme-300{color:#4dd0e1!important}.mdui-theme-primary-cyan .mdui-text-color-theme-400{color:#26c6da!important}.mdui-theme-primary-cyan .mdui-text-color-theme-500{color:#00bcd4!important}.mdui-theme-primary-cyan .mdui-text-color-theme-600{color:#00acc1!important}.mdui-theme-primary-cyan .mdui-text-color-theme-700{color:#0097a7!important}.mdui-theme-primary-cyan .mdui-text-color-theme-800{color:#00838f!important}.mdui-theme-primary-cyan .mdui-text-color-theme-900{color:#006064!important}.mdui-theme-primary-deep-orange .mdui-text-color-theme{color:#ff5722!important}.mdui-theme-primary-deep-orange .mdui-text-color-theme-50{color:#fbe9e7!important}.mdui-theme-primary-deep-orange .mdui-text-color-theme-100{color:#ffccbc!important}.mdui-theme-primary-deep-orange .mdui-text-color-theme-200{color:#ffab91!important}.mdui-theme-primary-deep-orange .mdui-text-color-theme-300{color:#ff8a65!important}.mdui-theme-primary-deep-orange .mdui-text-color-theme-400{color:#ff7043!important}.mdui-theme-primary-deep-orange .mdui-text-color-theme-500{color:#ff5722!important}.mdui-theme-primary-deep-orange .mdui-text-color-theme-600{color:#f4511e!important}.mdui-theme-primary-deep-orange .mdui-text-color-theme-700{color:#e64a19!important}.mdui-theme-primary-deep-orange .mdui-text-color-theme-800{color:#d84315!important}.mdui-theme-primary-deep-orange .mdui-text-color-theme-900{color:#bf360c!important}.mdui-theme-primary-deep-purple .mdui-text-color-theme{color:#673ab7!important}.mdui-theme-primary-deep-purple .mdui-text-color-theme-50{color:#ede7f6!important}.mdui-theme-primary-deep-purple .mdui-text-color-theme-100{color:#d1c4e9!important}.mdui-theme-primary-deep-purple .mdui-text-color-theme-200{color:#b39ddb!important}.mdui-theme-primary-deep-purple .mdui-text-color-theme-300{color:#9575cd!important}.mdui-theme-primary-deep-purple .mdui-text-color-theme-400{color:#7e57c2!important}.mdui-theme-primary-deep-purple .mdui-text-color-theme-500{color:#673ab7!important}.mdui-theme-primary-deep-purple .mdui-text-color-theme-600{color:#5e35b1!important}.mdui-theme-primary-deep-purple .mdui-text-color-theme-700{color:#512da8!important}.mdui-theme-primary-deep-purple .mdui-text-color-theme-800{color:#4527a0!important}.mdui-theme-primary-deep-purple .mdui-text-color-theme-900{color:#311b92!important}.mdui-theme-primary-green .mdui-text-color-theme{color:#4caf50!important}.mdui-theme-primary-green .mdui-text-color-theme-50{color:#e8f5e9!important}.mdui-theme-primary-green .mdui-text-color-theme-100{color:#c8e6c9!important}.mdui-theme-primary-green .mdui-text-color-theme-200{color:#a5d6a7!important}.mdui-theme-primary-green .mdui-text-color-theme-300{color:#81c784!important}.mdui-theme-primary-green .mdui-text-color-theme-400{color:#66bb6a!important}.mdui-theme-primary-green .mdui-text-color-theme-500{color:#4caf50!important}.mdui-theme-primary-green .mdui-text-color-theme-600{color:#43a047!important}.mdui-theme-primary-green .mdui-text-color-theme-700{color:#388e3c!important}.mdui-theme-primary-green .mdui-text-color-theme-800{color:#2e7d32!important}.mdui-theme-primary-green .mdui-text-color-theme-900{color:#1b5e20!important}.mdui-theme-primary-grey .mdui-text-color-theme{color:#9e9e9e!important}.mdui-theme-primary-grey .mdui-text-color-theme-50{color:#fafafa!important}.mdui-theme-primary-grey .mdui-text-color-theme-100{color:#f5f5f5!important}.mdui-theme-primary-grey .mdui-text-color-theme-200{color:#eee!important}.mdui-theme-primary-grey .mdui-text-color-theme-300{color:#e0e0e0!important}.mdui-theme-primary-grey .mdui-text-color-theme-400{color:#bdbdbd!important}.mdui-theme-primary-grey .mdui-text-color-theme-500{color:#9e9e9e!important}.mdui-theme-primary-grey .mdui-text-color-theme-600{color:#757575!important}.mdui-theme-primary-grey .mdui-text-color-theme-700{color:#616161!important}.mdui-theme-primary-grey .mdui-text-color-theme-800{color:#424242!important}.mdui-theme-primary-grey .mdui-text-color-theme-900{color:#212121!important}.mdui-theme-primary-indigo .mdui-text-color-theme{color:#3f51b5!important}.mdui-theme-primary-indigo .mdui-text-color-theme-50{color:#e8eaf6!important}.mdui-theme-primary-indigo .mdui-text-color-theme-100{color:#c5cae9!important}.mdui-theme-primary-indigo .mdui-text-color-theme-200{color:#9fa8da!important}.mdui-theme-primary-indigo .mdui-text-color-theme-300{color:#7986cb!important}.mdui-theme-primary-indigo .mdui-text-color-theme-400{color:#5c6bc0!important}.mdui-theme-primary-indigo .mdui-text-color-theme-500{color:#3f51b5!important}.mdui-theme-primary-indigo .mdui-text-color-theme-600{color:#3949ab!important}.mdui-theme-primary-indigo .mdui-text-color-theme-700{color:#303f9f!important}.mdui-theme-primary-indigo .mdui-text-color-theme-800{color:#283593!important}.mdui-theme-primary-indigo .mdui-text-color-theme-900{color:#1a237e!important}.mdui-theme-primary-light-blue .mdui-text-color-theme{color:#03a9f4!important}.mdui-theme-primary-light-blue .mdui-text-color-theme-50{color:#e1f5fe!important}.mdui-theme-primary-light-blue .mdui-text-color-theme-100{color:#b3e5fc!important}.mdui-theme-primary-light-blue .mdui-text-color-theme-200{color:#81d4fa!important}.mdui-theme-primary-light-blue .mdui-text-color-theme-300{color:#4fc3f7!important}.mdui-theme-primary-light-blue .mdui-text-color-theme-400{color:#29b6f6!important}.mdui-theme-primary-light-blue .mdui-text-color-theme-500{color:#03a9f4!important}.mdui-theme-primary-light-blue .mdui-text-color-theme-600{color:#039be5!important}.mdui-theme-primary-light-blue .mdui-text-color-theme-700{color:#0288d1!important}.mdui-theme-primary-light-blue .mdui-text-color-theme-800{color:#0277bd!important}.mdui-theme-primary-light-blue .mdui-text-color-theme-900{color:#01579b!important}.mdui-theme-primary-light-green .mdui-text-color-theme{color:#8bc34a!important}.mdui-theme-primary-light-green .mdui-text-color-theme-50{color:#f1f8e9!important}.mdui-theme-primary-light-green .mdui-text-color-theme-100{color:#dcedc8!important}.mdui-theme-primary-light-green .mdui-text-color-theme-200{color:#c5e1a5!important}.mdui-theme-primary-light-green .mdui-text-color-theme-300{color:#aed581!important}.mdui-theme-primary-light-green .mdui-text-color-theme-400{color:#9ccc65!important}.mdui-theme-primary-light-green .mdui-text-color-theme-500{color:#8bc34a!important}.mdui-theme-primary-light-green .mdui-text-color-theme-600{color:#7cb342!important}.mdui-theme-primary-light-green .mdui-text-color-theme-700{color:#689f38!important}.mdui-theme-primary-light-green .mdui-text-color-theme-800{color:#558b2f!important}.mdui-theme-primary-light-green .mdui-text-color-theme-900{color:#33691e!important}.mdui-theme-primary-lime .mdui-text-color-theme{color:#cddc39!important}.mdui-theme-primary-lime .mdui-text-color-theme-50{color:#f9fbe7!important}.mdui-theme-primary-lime .mdui-text-color-theme-100{color:#f0f4c3!important}.mdui-theme-primary-lime .mdui-text-color-theme-200{color:#e6ee9c!important}.mdui-theme-primary-lime .mdui-text-color-theme-300{color:#dce775!important}.mdui-theme-primary-lime .mdui-text-color-theme-400{color:#d4e157!important}.mdui-theme-primary-lime .mdui-text-color-theme-500{color:#cddc39!important}.mdui-theme-primary-lime .mdui-text-color-theme-600{color:#c0ca33!important}.mdui-theme-primary-lime .mdui-text-color-theme-700{color:#afb42b!important}.mdui-theme-primary-lime .mdui-text-color-theme-800{color:#9e9d24!important}.mdui-theme-primary-lime .mdui-text-color-theme-900{color:#827717!important}.mdui-theme-primary-orange .mdui-text-color-theme{color:#ff9800!important}.mdui-theme-primary-orange .mdui-text-color-theme-50{color:#fff3e0!important}.mdui-theme-primary-orange .mdui-text-color-theme-100{color:#ffe0b2!important}.mdui-theme-primary-orange .mdui-text-color-theme-200{color:#ffcc80!important}.mdui-theme-primary-orange .mdui-text-color-theme-300{color:#ffb74d!important}.mdui-theme-primary-orange .mdui-text-color-theme-400{color:#ffa726!important}.mdui-theme-primary-orange .mdui-text-color-theme-500{color:#ff9800!important}.mdui-theme-primary-orange .mdui-text-color-theme-600{color:#fb8c00!important}.mdui-theme-primary-orange .mdui-text-color-theme-700{color:#f57c00!important}.mdui-theme-primary-orange .mdui-text-color-theme-800{color:#ef6c00!important}.mdui-theme-primary-orange .mdui-text-color-theme-900{color:#e65100!important}.mdui-theme-primary-pink .mdui-text-color-theme{color:#e91e63!important}.mdui-theme-primary-pink .mdui-text-color-theme-50{color:#fce4ec!important}.mdui-theme-primary-pink .mdui-text-color-theme-100{color:#f8bbd0!important}.mdui-theme-primary-pink .mdui-text-color-theme-200{color:#f48fb1!important}.mdui-theme-primary-pink .mdui-text-color-theme-300{color:#f06292!important}.mdui-theme-primary-pink .mdui-text-color-theme-400{color:#ec407a!important}.mdui-theme-primary-pink .mdui-text-color-theme-500{color:#e91e63!important}.mdui-theme-primary-pink .mdui-text-color-theme-600{color:#d81b60!important}.mdui-theme-primary-pink .mdui-text-color-theme-700{color:#c2185b!important}.mdui-theme-primary-pink .mdui-text-color-theme-800{color:#ad1457!important}.mdui-theme-primary-pink .mdui-text-color-theme-900{color:#880e4f!important}.mdui-theme-primary-purple .mdui-text-color-theme{color:#9c27b0!important}.mdui-theme-primary-purple .mdui-text-color-theme-50{color:#f3e5f5!important}.mdui-theme-primary-purple .mdui-text-color-theme-100{color:#e1bee7!important}.mdui-theme-primary-purple .mdui-text-color-theme-200{color:#ce93d8!important}.mdui-theme-primary-purple .mdui-text-color-theme-300{color:#ba68c8!important}.mdui-theme-primary-purple .mdui-text-color-theme-400{color:#ab47bc!important}.mdui-theme-primary-purple .mdui-text-color-theme-500{color:#9c27b0!important}.mdui-theme-primary-purple .mdui-text-color-theme-600{color:#8e24aa!important}.mdui-theme-primary-purple .mdui-text-color-theme-700{color:#7b1fa2!important}.mdui-theme-primary-purple .mdui-text-color-theme-800{color:#6a1b9a!important}.mdui-theme-primary-purple .mdui-text-color-theme-900{color:#4a148c!important}.mdui-theme-primary-red .mdui-text-color-theme{color:#f44336!important}.mdui-theme-primary-red .mdui-text-color-theme-50{color:#ffebee!important}.mdui-theme-primary-red .mdui-text-color-theme-100{color:#ffcdd2!important}.mdui-theme-primary-red .mdui-text-color-theme-200{color:#ef9a9a!important}.mdui-theme-primary-red .mdui-text-color-theme-300{color:#e57373!important}.mdui-theme-primary-red .mdui-text-color-theme-400{color:#ef5350!important}.mdui-theme-primary-red .mdui-text-color-theme-500{color:#f44336!important}.mdui-theme-primary-red .mdui-text-color-theme-600{color:#e53935!important}.mdui-theme-primary-red .mdui-text-color-theme-700{color:#d32f2f!important}.mdui-theme-primary-red .mdui-text-color-theme-800{color:#c62828!important}.mdui-theme-primary-red .mdui-text-color-theme-900{color:#b71c1c!important}.mdui-theme-primary-teal .mdui-text-color-theme{color:#009688!important}.mdui-theme-primary-teal .mdui-text-color-theme-50{color:#e0f2f1!important}.mdui-theme-primary-teal .mdui-text-color-theme-100{color:#b2dfdb!important}.mdui-theme-primary-teal .mdui-text-color-theme-200{color:#80cbc4!important}.mdui-theme-primary-teal .mdui-text-color-theme-300{color:#4db6ac!important}.mdui-theme-primary-teal .mdui-text-color-theme-400{color:#26a69a!important}.mdui-theme-primary-teal .mdui-text-color-theme-500{color:#009688!important}.mdui-theme-primary-teal .mdui-text-color-theme-600{color:#00897b!important}.mdui-theme-primary-teal .mdui-text-color-theme-700{color:#00796b!important}.mdui-theme-primary-teal .mdui-text-color-theme-800{color:#00695c!important}.mdui-theme-primary-teal .mdui-text-color-theme-900{color:#004d40!important}.mdui-theme-primary-yellow .mdui-text-color-theme{color:#ffeb3b!important}.mdui-theme-primary-yellow .mdui-text-color-theme-50{color:#fffde7!important}.mdui-theme-primary-yellow .mdui-text-color-theme-100{color:#fff9c4!important}.mdui-theme-primary-yellow .mdui-text-color-theme-200{color:#fff59d!important}.mdui-theme-primary-yellow .mdui-text-color-theme-300{color:#fff176!important}.mdui-theme-primary-yellow .mdui-text-color-theme-400{color:#ffee58!important}.mdui-theme-primary-yellow .mdui-text-color-theme-500{color:#ffeb3b!important}.mdui-theme-primary-yellow .mdui-text-color-theme-600{color:#fdd835!important}.mdui-theme-primary-yellow .mdui-text-color-theme-700{color:#fbc02d!important}.mdui-theme-primary-yellow .mdui-text-color-theme-800{color:#f9a825!important}.mdui-theme-primary-yellow .mdui-text-color-theme-900{color:#f57f17!important}.mdui-theme-accent-amber .mdui-text-color-theme-accent{color:#ffd740!important}.mdui-theme-accent-amber .mdui-text-color-theme-a100{color:#ffe57f!important}.mdui-theme-accent-amber .mdui-text-color-theme-a200{color:#ffd740!important}.mdui-theme-accent-amber .mdui-text-color-theme-a400{color:#ffc400!important}.mdui-theme-accent-amber .mdui-text-color-theme-a700{color:#ffab00!important}.mdui-theme-accent-blue .mdui-text-color-theme-accent{color:#448aff!important}.mdui-theme-accent-blue .mdui-text-color-theme-a100{color:#82b1ff!important}.mdui-theme-accent-blue .mdui-text-color-theme-a200{color:#448aff!important}.mdui-theme-accent-blue .mdui-text-color-theme-a400{color:#2979ff!important}.mdui-theme-accent-blue .mdui-text-color-theme-a700{color:#2962ff!important}.mdui-theme-accent-cyan .mdui-text-color-theme-accent{color:#18ffff!important}.mdui-theme-accent-cyan .mdui-text-color-theme-a100{color:#84ffff!important}.mdui-theme-accent-cyan .mdui-text-color-theme-a200{color:#18ffff!important}.mdui-theme-accent-cyan .mdui-text-color-theme-a400{color:#00e5ff!important}.mdui-theme-accent-cyan .mdui-text-color-theme-a700{color:#00b8d4!important}.mdui-theme-accent-deep-orange .mdui-text-color-theme-accent{color:#ff6e40!important}.mdui-theme-accent-deep-orange .mdui-text-color-theme-a100{color:#ff9e80!important}.mdui-theme-accent-deep-orange .mdui-text-color-theme-a200{color:#ff6e40!important}.mdui-theme-accent-deep-orange .mdui-text-color-theme-a400{color:#ff3d00!important}.mdui-theme-accent-deep-orange .mdui-text-color-theme-a700{color:#dd2c00!important}.mdui-theme-accent-deep-purple .mdui-text-color-theme-accent{color:#7c4dff!important}.mdui-theme-accent-deep-purple .mdui-text-color-theme-a100{color:#b388ff!important}.mdui-theme-accent-deep-purple .mdui-text-color-theme-a200{color:#7c4dff!important}.mdui-theme-accent-deep-purple .mdui-text-color-theme-a400{color:#651fff!important}.mdui-theme-accent-deep-purple .mdui-text-color-theme-a700{color:#6200ea!important}.mdui-theme-accent-green .mdui-text-color-theme-accent{color:#69f0ae!important}.mdui-theme-accent-green .mdui-text-color-theme-a100{color:#b9f6ca!important}.mdui-theme-accent-green .mdui-text-color-theme-a200{color:#69f0ae!important}.mdui-theme-accent-green .mdui-text-color-theme-a400{color:#00e676!important}.mdui-theme-accent-green .mdui-text-color-theme-a700{color:#00c853!important}.mdui-theme-accent-indigo .mdui-text-color-theme-accent{color:#536dfe!important}.mdui-theme-accent-indigo .mdui-text-color-theme-a100{color:#8c9eff!important}.mdui-theme-accent-indigo .mdui-text-color-theme-a200{color:#536dfe!important}.mdui-theme-accent-indigo .mdui-text-color-theme-a400{color:#3d5afe!important}.mdui-theme-accent-indigo .mdui-text-color-theme-a700{color:#304ffe!important}.mdui-theme-accent-light-blue .mdui-text-color-theme-accent{color:#40c4ff!important}.mdui-theme-accent-light-blue .mdui-text-color-theme-a100{color:#80d8ff!important}.mdui-theme-accent-light-blue .mdui-text-color-theme-a200{color:#40c4ff!important}.mdui-theme-accent-light-blue .mdui-text-color-theme-a400{color:#00b0ff!important}.mdui-theme-accent-light-blue .mdui-text-color-theme-a700{color:#0091ea!important}.mdui-theme-accent-light-green .mdui-text-color-theme-accent{color:#b2ff59!important}.mdui-theme-accent-light-green .mdui-text-color-theme-a100{color:#ccff90!important}.mdui-theme-accent-light-green .mdui-text-color-theme-a200{color:#b2ff59!important}.mdui-theme-accent-light-green .mdui-text-color-theme-a400{color:#76ff03!important}.mdui-theme-accent-light-green .mdui-text-color-theme-a700{color:#64dd17!important}.mdui-theme-accent-lime .mdui-text-color-theme-accent{color:#eeff41!important}.mdui-theme-accent-lime .mdui-text-color-theme-a100{color:#f4ff81!important}.mdui-theme-accent-lime .mdui-text-color-theme-a200{color:#eeff41!important}.mdui-theme-accent-lime .mdui-text-color-theme-a400{color:#c6ff00!important}.mdui-theme-accent-lime .mdui-text-color-theme-a700{color:#aeea00!important}.mdui-theme-accent-orange .mdui-text-color-theme-accent{color:#ffab40!important}.mdui-theme-accent-orange .mdui-text-color-theme-a100{color:#ffd180!important}.mdui-theme-accent-orange .mdui-text-color-theme-a200{color:#ffab40!important}.mdui-theme-accent-orange .mdui-text-color-theme-a400{color:#ff9100!important}.mdui-theme-accent-orange .mdui-text-color-theme-a700{color:#ff6d00!important}.mdui-theme-accent-pink .mdui-text-color-theme-accent{color:#ff4081!important}.mdui-theme-accent-pink .mdui-text-color-theme-a100{color:#ff80ab!important}.mdui-theme-accent-pink .mdui-text-color-theme-a200{color:#ff4081!important}.mdui-theme-accent-pink .mdui-text-color-theme-a400{color:#f50057!important}.mdui-theme-accent-pink .mdui-text-color-theme-a700{color:#c51162!important}.mdui-theme-accent-purple .mdui-text-color-theme-accent{color:#e040fb!important}.mdui-theme-accent-purple .mdui-text-color-theme-a100{color:#ea80fc!important}.mdui-theme-accent-purple .mdui-text-color-theme-a200{color:#e040fb!important}.mdui-theme-accent-purple .mdui-text-color-theme-a400{color:#d500f9!important}.mdui-theme-accent-purple .mdui-text-color-theme-a700{color:#a0f!important}.mdui-theme-accent-red .mdui-text-color-theme-accent{color:#ff5252!important}.mdui-theme-accent-red .mdui-text-color-theme-a100{color:#ff8a80!important}.mdui-theme-accent-red .mdui-text-color-theme-a200{color:#ff5252!important}.mdui-theme-accent-red .mdui-text-color-theme-a400{color:#ff1744!important}.mdui-theme-accent-red .mdui-text-color-theme-a700{color:#d50000!important}.mdui-theme-accent-teal .mdui-text-color-theme-accent{color:#64ffda!important}.mdui-theme-accent-teal .mdui-text-color-theme-a100{color:#a7ffeb!important}.mdui-theme-accent-teal .mdui-text-color-theme-a200{color:#64ffda!important}.mdui-theme-accent-teal .mdui-text-color-theme-a400{color:#1de9b6!important}.mdui-theme-accent-teal .mdui-text-color-theme-a700{color:#00bfa5!important}.mdui-theme-accent-yellow .mdui-text-color-theme-accent{color:#ff0!important}.mdui-theme-accent-yellow .mdui-text-color-theme-a100{color:#ffff8d!important}.mdui-theme-accent-yellow .mdui-text-color-theme-a200{color:#ff0!important}.mdui-theme-accent-yellow .mdui-text-color-theme-a400{color:#ffea00!important}.mdui-theme-accent-yellow .mdui-text-color-theme-a700{color:#ffd600!important}.mdui-text-color-amber{color:#ffc107!important}.mdui-text-color-amber-50{color:#fff8e1!important}.mdui-text-color-amber-100{color:#ffecb3!important}.mdui-text-color-amber-200{color:#ffe082!important}.mdui-text-color-amber-300{color:#ffd54f!important}.mdui-text-color-amber-400{color:#ffca28!important}.mdui-text-color-amber-500{color:#ffc107!important}.mdui-text-color-amber-600{color:#ffb300!important}.mdui-text-color-amber-700{color:#ffa000!important}.mdui-text-color-amber-800{color:#ff8f00!important}.mdui-text-color-amber-900{color:#ff6f00!important}.mdui-text-color-blue{color:#2196f3!important}.mdui-text-color-blue-50{color:#e3f2fd!important}.mdui-text-color-blue-100{color:#bbdefb!important}.mdui-text-color-blue-200{color:#90caf9!important}.mdui-text-color-blue-300{color:#64b5f6!important}.mdui-text-color-blue-400{color:#42a5f5!important}.mdui-text-color-blue-500{color:#2196f3!important}.mdui-text-color-blue-600{color:#1e88e5!important}.mdui-text-color-blue-700{color:#1976d2!important}.mdui-text-color-blue-800{color:#1565c0!important}.mdui-text-color-blue-900{color:#0d47a1!important}.mdui-text-color-blue-grey{color:#607d8b!important}.mdui-text-color-blue-grey-50{color:#eceff1!important}.mdui-text-color-blue-grey-100{color:#cfd8dc!important}.mdui-text-color-blue-grey-200{color:#b0bec5!important}.mdui-text-color-blue-grey-300{color:#90a4ae!important}.mdui-text-color-blue-grey-400{color:#78909c!important}.mdui-text-color-blue-grey-500{color:#607d8b!important}.mdui-text-color-blue-grey-600{color:#546e7a!important}.mdui-text-color-blue-grey-700{color:#455a64!important}.mdui-text-color-blue-grey-800{color:#37474f!important}.mdui-text-color-blue-grey-900{color:#263238!important}.mdui-text-color-brown{color:#795548!important}.mdui-text-color-brown-50{color:#efebe9!important}.mdui-text-color-brown-100{color:#d7ccc8!important}.mdui-text-color-brown-200{color:#bcaaa4!important}.mdui-text-color-brown-300{color:#a1887f!important}.mdui-text-color-brown-400{color:#8d6e63!important}.mdui-text-color-brown-500{color:#795548!important}.mdui-text-color-brown-600{color:#6d4c41!important}.mdui-text-color-brown-700{color:#5d4037!important}.mdui-text-color-brown-800{color:#4e342e!important}.mdui-text-color-brown-900{color:#3e2723!important}.mdui-text-color-cyan{color:#00bcd4!important}.mdui-text-color-cyan-50{color:#e0f7fa!important}.mdui-text-color-cyan-100{color:#b2ebf2!important}.mdui-text-color-cyan-200{color:#80deea!important}.mdui-text-color-cyan-300{color:#4dd0e1!important}.mdui-text-color-cyan-400{color:#26c6da!important}.mdui-text-color-cyan-500{color:#00bcd4!important}.mdui-text-color-cyan-600{color:#00acc1!important}.mdui-text-color-cyan-700{color:#0097a7!important}.mdui-text-color-cyan-800{color:#00838f!important}.mdui-text-color-cyan-900{color:#006064!important}.mdui-text-color-deep-orange{color:#ff5722!important}.mdui-text-color-deep-orange-50{color:#fbe9e7!important}.mdui-text-color-deep-orange-100{color:#ffccbc!important}.mdui-text-color-deep-orange-200{color:#ffab91!important}.mdui-text-color-deep-orange-300{color:#ff8a65!important}.mdui-text-color-deep-orange-400{color:#ff7043!important}.mdui-text-color-deep-orange-500{color:#ff5722!important}.mdui-text-color-deep-orange-600{color:#f4511e!important}.mdui-text-color-deep-orange-700{color:#e64a19!important}.mdui-text-color-deep-orange-800{color:#d84315!important}.mdui-text-color-deep-orange-900{color:#bf360c!important}.mdui-text-color-deep-purple{color:#673ab7!important}.mdui-text-color-deep-purple-50{color:#ede7f6!important}.mdui-text-color-deep-purple-100{color:#d1c4e9!important}.mdui-text-color-deep-purple-200{color:#b39ddb!important}.mdui-text-color-deep-purple-300{color:#9575cd!important}.mdui-text-color-deep-purple-400{color:#7e57c2!important}.mdui-text-color-deep-purple-500{color:#673ab7!important}.mdui-text-color-deep-purple-600{color:#5e35b1!important}.mdui-text-color-deep-purple-700{color:#512da8!important}.mdui-text-color-deep-purple-800{color:#4527a0!important}.mdui-text-color-deep-purple-900{color:#311b92!important}.mdui-text-color-green{color:#4caf50!important}.mdui-text-color-green-50{color:#e8f5e9!important}.mdui-text-color-green-100{color:#c8e6c9!important}.mdui-text-color-green-200{color:#a5d6a7!important}.mdui-text-color-green-300{color:#81c784!important}.mdui-text-color-green-400{color:#66bb6a!important}.mdui-text-color-green-500{color:#4caf50!important}.mdui-text-color-green-600{color:#43a047!important}.mdui-text-color-green-700{color:#388e3c!important}.mdui-text-color-green-800{color:#2e7d32!important}.mdui-text-color-green-900{color:#1b5e20!important}.mdui-text-color-grey{color:#9e9e9e!important}.mdui-text-color-grey-50{color:#fafafa!important}.mdui-text-color-grey-100{color:#f5f5f5!important}.mdui-text-color-grey-200{color:#eee!important}.mdui-text-color-grey-300{color:#e0e0e0!important}.mdui-text-color-grey-400{color:#bdbdbd!important}.mdui-text-color-grey-500{color:#9e9e9e!important}.mdui-text-color-grey-600{color:#757575!important}.mdui-text-color-grey-700{color:#616161!important}.mdui-text-color-grey-800{color:#424242!important}.mdui-text-color-grey-900{color:#212121!important}.mdui-text-color-indigo{color:#3f51b5!important}.mdui-text-color-indigo-50{color:#e8eaf6!important}.mdui-text-color-indigo-100{color:#c5cae9!important}.mdui-text-color-indigo-200{color:#9fa8da!important}.mdui-text-color-indigo-300{color:#7986cb!important}.mdui-text-color-indigo-400{color:#5c6bc0!important}.mdui-text-color-indigo-500{color:#3f51b5!important}.mdui-text-color-indigo-600{color:#3949ab!important}.mdui-text-color-indigo-700{color:#303f9f!important}.mdui-text-color-indigo-800{color:#283593!important}.mdui-text-color-indigo-900{color:#1a237e!important}.mdui-text-color-light-blue{color:#03a9f4!important}.mdui-text-color-light-blue-50{color:#e1f5fe!important}.mdui-text-color-light-blue-100{color:#b3e5fc!important}.mdui-text-color-light-blue-200{color:#81d4fa!important}.mdui-text-color-light-blue-300{color:#4fc3f7!important}.mdui-text-color-light-blue-400{color:#29b6f6!important}.mdui-text-color-light-blue-500{color:#03a9f4!important}.mdui-text-color-light-blue-600{color:#039be5!important}.mdui-text-color-light-blue-700{color:#0288d1!important}.mdui-text-color-light-blue-800{color:#0277bd!important}.mdui-text-color-light-blue-900{color:#01579b!important}.mdui-text-color-light-green{color:#8bc34a!important}.mdui-text-color-light-green-50{color:#f1f8e9!important}.mdui-text-color-light-green-100{color:#dcedc8!important}.mdui-text-color-light-green-200{color:#c5e1a5!important}.mdui-text-color-light-green-300{color:#aed581!important}.mdui-text-color-light-green-400{color:#9ccc65!important}.mdui-text-color-light-green-500{color:#8bc34a!important}.mdui-text-color-light-green-600{color:#7cb342!important}.mdui-text-color-light-green-700{color:#689f38!important}.mdui-text-color-light-green-800{color:#558b2f!important}.mdui-text-color-light-green-900{color:#33691e!important}.mdui-text-color-lime{color:#cddc39!important}.mdui-text-color-lime-50{color:#f9fbe7!important}.mdui-text-color-lime-100{color:#f0f4c3!important}.mdui-text-color-lime-200{color:#e6ee9c!important}.mdui-text-color-lime-300{color:#dce775!important}.mdui-text-color-lime-400{color:#d4e157!important}.mdui-text-color-lime-500{color:#cddc39!important}.mdui-text-color-lime-600{color:#c0ca33!important}.mdui-text-color-lime-700{color:#afb42b!important}.mdui-text-color-lime-800{color:#9e9d24!important}.mdui-text-color-lime-900{color:#827717!important}.mdui-text-color-orange{color:#ff9800!important}.mdui-text-color-orange-50{color:#fff3e0!important}.mdui-text-color-orange-100{color:#ffe0b2!important}.mdui-text-color-orange-200{color:#ffcc80!important}.mdui-text-color-orange-300{color:#ffb74d!important}.mdui-text-color-orange-400{color:#ffa726!important}.mdui-text-color-orange-500{color:#ff9800!important}.mdui-text-color-orange-600{color:#fb8c00!important}.mdui-text-color-orange-700{color:#f57c00!important}.mdui-text-color-orange-800{color:#ef6c00!important}.mdui-text-color-orange-900{color:#e65100!important}.mdui-text-color-pink{color:#e91e63!important}.mdui-text-color-pink-50{color:#fce4ec!important}.mdui-text-color-pink-100{color:#f8bbd0!important}.mdui-text-color-pink-200{color:#f48fb1!important}.mdui-text-color-pink-300{color:#f06292!important}.mdui-text-color-pink-400{color:#ec407a!important}.mdui-text-color-pink-500{color:#e91e63!important}.mdui-text-color-pink-600{color:#d81b60!important}.mdui-text-color-pink-700{color:#c2185b!important}.mdui-text-color-pink-800{color:#ad1457!important}.mdui-text-color-pink-900{color:#880e4f!important}.mdui-text-color-purple{color:#9c27b0!important}.mdui-text-color-purple-50{color:#f3e5f5!important}.mdui-text-color-purple-100{color:#e1bee7!important}.mdui-text-color-purple-200{color:#ce93d8!important}.mdui-text-color-purple-300{color:#ba68c8!important}.mdui-text-color-purple-400{color:#ab47bc!important}.mdui-text-color-purple-500{color:#9c27b0!important}.mdui-text-color-purple-600{color:#8e24aa!important}.mdui-text-color-purple-700{color:#7b1fa2!important}.mdui-text-color-purple-800{color:#6a1b9a!important}.mdui-text-color-purple-900{color:#4a148c!important}.mdui-text-color-red{color:#f44336!important}.mdui-text-color-red-50{color:#ffebee!important}.mdui-text-color-red-100{color:#ffcdd2!important}.mdui-text-color-red-200{color:#ef9a9a!important}.mdui-text-color-red-300{color:#e57373!important}.mdui-text-color-red-400{color:#ef5350!important}.mdui-text-color-red-500{color:#f44336!important}.mdui-text-color-red-600{color:#e53935!important}.mdui-text-color-red-700{color:#d32f2f!important}.mdui-text-color-red-800{color:#c62828!important}.mdui-text-color-red-900{color:#b71c1c!important}.mdui-text-color-teal{color:#009688!important}.mdui-text-color-teal-50{color:#e0f2f1!important}.mdui-text-color-teal-100{color:#b2dfdb!important}.mdui-text-color-teal-200{color:#80cbc4!important}.mdui-text-color-teal-300{color:#4db6ac!important}.mdui-text-color-teal-400{color:#26a69a!important}.mdui-text-color-teal-500{color:#009688!important}.mdui-text-color-teal-600{color:#00897b!important}.mdui-text-color-teal-700{color:#00796b!important}.mdui-text-color-teal-800{color:#00695c!important}.mdui-text-color-teal-900{color:#004d40!important}.mdui-text-color-yellow{color:#ffeb3b!important}.mdui-text-color-yellow-50{color:#fffde7!important}.mdui-text-color-yellow-100{color:#fff9c4!important}.mdui-text-color-yellow-200{color:#fff59d!important}.mdui-text-color-yellow-300{color:#fff176!important}.mdui-text-color-yellow-400{color:#ffee58!important}.mdui-text-color-yellow-500{color:#ffeb3b!important}.mdui-text-color-yellow-600{color:#fdd835!important}.mdui-text-color-yellow-700{color:#fbc02d!important}.mdui-text-color-yellow-800{color:#f9a825!important}.mdui-text-color-yellow-900{color:#f57f17!important}.mdui-text-color-amber-accent{color:#ffd740!important}.mdui-text-color-amber-a100{color:#ffe57f!important}.mdui-text-color-amber-a200{color:#ffd740!important}.mdui-text-color-amber-a400{color:#ffc400!important}.mdui-text-color-amber-a700{color:#ffab00!important}.mdui-text-color-blue-accent{color:#448aff!important}.mdui-text-color-blue-a100{color:#82b1ff!important}.mdui-text-color-blue-a200{color:#448aff!important}.mdui-text-color-blue-a400{color:#2979ff!important}.mdui-text-color-blue-a700{color:#2962ff!important}.mdui-text-color-cyan-accent{color:#18ffff!important}.mdui-text-color-cyan-a100{color:#84ffff!important}.mdui-text-color-cyan-a200{color:#18ffff!important}.mdui-text-color-cyan-a400{color:#00e5ff!important}.mdui-text-color-cyan-a700{color:#00b8d4!important}.mdui-text-color-deep-orange-accent{color:#ff6e40!important}.mdui-text-color-deep-orange-a100{color:#ff9e80!important}.mdui-text-color-deep-orange-a200{color:#ff6e40!important}.mdui-text-color-deep-orange-a400{color:#ff3d00!important}.mdui-text-color-deep-orange-a700{color:#dd2c00!important}.mdui-text-color-deep-purple-accent{color:#7c4dff!important}.mdui-text-color-deep-purple-a100{color:#b388ff!important}.mdui-text-color-deep-purple-a200{color:#7c4dff!important}.mdui-text-color-deep-purple-a400{color:#651fff!important}.mdui-text-color-deep-purple-a700{color:#6200ea!important}.mdui-text-color-green-accent{color:#69f0ae!important}.mdui-text-color-green-a100{color:#b9f6ca!important}.mdui-text-color-green-a200{color:#69f0ae!important}.mdui-text-color-green-a400{color:#00e676!important}.mdui-text-color-green-a700{color:#00c853!important}.mdui-text-color-indigo-accent{color:#536dfe!important}.mdui-text-color-indigo-a100{color:#8c9eff!important}.mdui-text-color-indigo-a200{color:#536dfe!important}.mdui-text-color-indigo-a400{color:#3d5afe!important}.mdui-text-color-indigo-a700{color:#304ffe!important}.mdui-text-color-light-blue-accent{color:#40c4ff!important}.mdui-text-color-light-blue-a100{color:#80d8ff!important}.mdui-text-color-light-blue-a200{color:#40c4ff!important}.mdui-text-color-light-blue-a400{color:#00b0ff!important}.mdui-text-color-light-blue-a700{color:#0091ea!important}.mdui-text-color-light-green-accent{color:#b2ff59!important}.mdui-text-color-light-green-a100{color:#ccff90!important}.mdui-text-color-light-green-a200{color:#b2ff59!important}.mdui-text-color-light-green-a400{color:#76ff03!important}.mdui-text-color-light-green-a700{color:#64dd17!important}.mdui-text-color-lime-accent{color:#eeff41!important}.mdui-text-color-lime-a100{color:#f4ff81!important}.mdui-text-color-lime-a200{color:#eeff41!important}.mdui-text-color-lime-a400{color:#c6ff00!important}.mdui-text-color-lime-a700{color:#aeea00!important}.mdui-text-color-orange-accent{color:#ffab40!important}.mdui-text-color-orange-a100{color:#ffd180!important}.mdui-text-color-orange-a200{color:#ffab40!important}.mdui-text-color-orange-a400{color:#ff9100!important}.mdui-text-color-orange-a700{color:#ff6d00!important}.mdui-text-color-pink-accent{color:#ff4081!important}.mdui-text-color-pink-a100{color:#ff80ab!important}.mdui-text-color-pink-a200{color:#ff4081!important}.mdui-text-color-pink-a400{color:#f50057!important}.mdui-text-color-pink-a700{color:#c51162!important}.mdui-text-color-purple-accent{color:#e040fb!important}.mdui-text-color-purple-a100{color:#ea80fc!important}.mdui-text-color-purple-a200{color:#e040fb!important}.mdui-text-color-purple-a400{color:#d500f9!important}.mdui-text-color-purple-a700{color:#a0f!important}.mdui-text-color-red-accent{color:#ff5252!important}.mdui-text-color-red-a100{color:#ff8a80!important}.mdui-text-color-red-a200{color:#ff5252!important}.mdui-text-color-red-a400{color:#ff1744!important}.mdui-text-color-red-a700{color:#d50000!important}.mdui-text-color-teal-accent{color:#64ffda!important}.mdui-text-color-teal-a100{color:#a7ffeb!important}.mdui-text-color-teal-a200{color:#64ffda!important}.mdui-text-color-teal-a400{color:#1de9b6!important}.mdui-text-color-teal-a700{color:#00bfa5!important}.mdui-text-color-yellow-accent{color:#ff0!important}.mdui-text-color-yellow-a100{color:#ffff8d!important}.mdui-text-color-yellow-a200{color:#ff0!important}.mdui-text-color-yellow-a400{color:#ffea00!important}.mdui-text-color-yellow-a700{color:#ffd600!important}.mdui-text-color-black{color:#000!important}.mdui-text-color-black-text,.mdui-text-color-theme-text{color:rgba(0,0,0,.87)!important}.mdui-text-color-black-secondary,.mdui-text-color-theme-secondary{color:rgba(0,0,0,.54)!important}.mdui-text-color-black-disabled,.mdui-text-color-theme-disabled{color:rgba(0,0,0,.38)!important}.mdui-text-color-black-divider,.mdui-text-color-theme-divider{color:rgba(0,0,0,.12)!important}.mdui-text-color-black-icon,.mdui-text-color-theme-icon{color:rgba(0,0,0,.54)!important}.mdui-text-color-black-icon-disabled,.mdui-text-color-theme-icon-disabled{color:rgba(0,0,0,.26)!important}.mdui-text-color-white{color:#fff!important}.mdui-text-color-white-text{color:#fff!important}.mdui-text-color-white-secondary{color:rgba(255,255,255,.7)!important}.mdui-text-color-white-disabled{color:rgba(255,255,255,.5)!important}.mdui-text-color-white-divider{color:rgba(255,255,255,.12)!important}.mdui-text-color-white-icon{color:#fff!important}.mdui-text-color-white-icon-disabled{color:rgba(255,255,255,.3)!important}.mdui-theme-layout-dark .mdui-text-color-theme-text{color:#fff!important}.mdui-theme-layout-dark .mdui-text-color-theme-secondary{color:rgba(255,255,255,.7)!important}.mdui-theme-layout-dark .mdui-text-color-theme-disabled{color:rgba(255,255,255,.5)!important}.mdui-theme-layout-dark .mdui-text-color-theme-divider{color:rgba(255,255,255,.12)!important}.mdui-theme-layout-dark .mdui-text-color-theme-icon{color:#fff!important}.mdui-theme-layout-dark .mdui-text-color-theme-icon-disabled{color:rgba(255,255,255,.3)!important}.mdui-m-a-0{margin:0!important}.mdui-m-t-0{margin-top:0!important}.mdui-m-r-0{margin-right:0!important}.mdui-m-b-0{margin-bottom:0!important}.mdui-m-l-0{margin-left:0!important}.mdui-m-x-0{margin-right:0!important;margin-left:0!important}.mdui-m-y-0{margin-top:0!important;margin-bottom:0!important}.mdui-p-a-0{padding:0!important}.mdui-p-t-0{padding-top:0!important}.mdui-p-r-0{padding-right:0!important}.mdui-p-b-0{padding-bottom:0!important}.mdui-p-l-0{padding-left:0!important}.mdui-p-x-0{padding-right:0!important;padding-left:0!important}.mdui-p-y-0{padding-top:0!important;padding-bottom:0!important}.mdui-m-a-1{margin:8px!important}.mdui-m-t-1{margin-top:8px!important}.mdui-m-r-1{margin-right:8px!important}.mdui-m-b-1{margin-bottom:8px!important}.mdui-m-l-1{margin-left:8px!important}.mdui-m-x-1{margin-right:8px!important;margin-left:8px!important}.mdui-m-y-1{margin-top:8px!important;margin-bottom:8px!important}.mdui-p-a-1{padding:8px!important}.mdui-p-t-1{padding-top:8px!important}.mdui-p-r-1{padding-right:8px!important}.mdui-p-b-1{padding-bottom:8px!important}.mdui-p-l-1{padding-left:8px!important}.mdui-p-x-1{padding-right:8px!important;padding-left:8px!important}.mdui-p-y-1{padding-top:8px!important;padding-bottom:8px!important}.mdui-m-a-2{margin:16px!important}.mdui-m-t-2{margin-top:16px!important}.mdui-m-r-2{margin-right:16px!important}.mdui-m-b-2{margin-bottom:16px!important}.mdui-m-l-2{margin-left:16px!important}.mdui-m-x-2{margin-right:16px!important;margin-left:16px!important}.mdui-m-y-2{margin-top:16px!important;margin-bottom:16px!important}.mdui-p-a-2{padding:16px!important}.mdui-p-t-2{padding-top:16px!important}.mdui-p-r-2{padding-right:16px!important}.mdui-p-b-2{padding-bottom:16px!important}.mdui-p-l-2{padding-left:16px!important}.mdui-p-x-2{padding-right:16px!important;padding-left:16px!important}.mdui-p-y-2{padding-top:16px!important;padding-bottom:16px!important}.mdui-m-a-3{margin:24px!important}.mdui-m-t-3{margin-top:24px!important}.mdui-m-r-3{margin-right:24px!important}.mdui-m-b-3{margin-bottom:24px!important}.mdui-m-l-3{margin-left:24px!important}.mdui-m-x-3{margin-right:24px!important;margin-left:24px!important}.mdui-m-y-3{margin-top:24px!important;margin-bottom:24px!important}.mdui-p-a-3{padding:24px!important}.mdui-p-t-3{padding-top:24px!important}.mdui-p-r-3{padding-right:24px!important}.mdui-p-b-3{padding-bottom:24px!important}.mdui-p-l-3{padding-left:24px!important}.mdui-p-x-3{padding-right:24px!important;padding-left:24px!important}.mdui-p-y-3{padding-top:24px!important;padding-bottom:24px!important}.mdui-m-a-4{margin:32px!important}.mdui-m-t-4{margin-top:32px!important}.mdui-m-r-4{margin-right:32px!important}.mdui-m-b-4{margin-bottom:32px!important}.mdui-m-l-4{margin-left:32px!important}.mdui-m-x-4{margin-right:32px!important;margin-left:32px!important}.mdui-m-y-4{margin-top:32px!important;margin-bottom:32px!important}.mdui-p-a-4{padding:32px!important}.mdui-p-t-4{padding-top:32px!important}.mdui-p-r-4{padding-right:32px!important}.mdui-p-b-4{padding-bottom:32px!important}.mdui-p-l-4{padding-left:32px!important}.mdui-p-x-4{padding-right:32px!important;padding-left:32px!important}.mdui-p-y-4{padding-top:32px!important;padding-bottom:32px!important}.mdui-m-a-5{margin:40px!important}.mdui-m-t-5{margin-top:40px!important}.mdui-m-r-5{margin-right:40px!important}.mdui-m-b-5{margin-bottom:40px!important}.mdui-m-l-5{margin-left:40px!important}.mdui-m-x-5{margin-right:40px!important;margin-left:40px!important}.mdui-m-y-5{margin-top:40px!important;margin-bottom:40px!important}.mdui-p-a-5{padding:40px!important}.mdui-p-t-5{padding-top:40px!important}.mdui-p-r-5{padding-right:40px!important}.mdui-p-b-5{padding-bottom:40px!important}.mdui-p-l-5{padding-left:40px!important}.mdui-p-x-5{padding-right:40px!important;padding-left:40px!important}.mdui-p-y-5{padding-top:40px!important;padding-bottom:40px!important}.mdui-float-left{float:left!important}.mdui-float-right{float:right!important}.mdui-center{display:block!important;margin-right:auto!important;margin-left:auto!important}.mdui-valign{display:-webkit-box!important;display:-webkit-flex!important;display:-ms-flexbox!important;display:flex!important;-webkit-box-align:center!important;-webkit-align-items:center!important;-ms-flex-align:center!important;align-items:center!important}.mdui-text-left{text-align:left!important}.mdui-text-center{text-align:center!important}.mdui-text-right{text-align:right!important}.mdui-text-lowercase{text-transform:lowercase!important}.mdui-text-uppercase{text-transform:uppercase!important}.mdui-text-capitalize{text-transform:capitalize!important}.mdui-text-truncate{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.mdui-clearfix:after,.mdui-clearfix:before{display:table;content:" "}.mdui-clearfix:after{clear:both}.mdui-hidden,[hidden]{display:none!important}.mdui-invisible{visibility:hidden}@media (max-width:599px){.mdui-hidden-xs{display:none!important}}@media (min-width:600px) and (max-width:1023px){.mdui-hidden-sm{display:none!important}}@media (min-width:1024px) and (max-width:1439px){.mdui-hidden-md{display:none!important}}@media (min-width:1440px) and (max-width:1919px){.mdui-hidden-lg{display:none!important}}@media (min-width:1920px){.mdui-hidden-xl{display:none!important}}@media (max-width:599px){.mdui-hidden-xs-down{display:none!important}}@media (max-width:1023px){.mdui-hidden-sm-down{display:none!important}}@media (max-width:1439px){.mdui-hidden-md-down{display:none!important}}@media (max-width:1919px){.mdui-hidden-lg-down{display:none!important}}.mdui-hidden-xl-down{display:none!important}.mdui-hidden-xs-up{display:none!important}@media (min-width:600px){.mdui-hidden-sm-up{display:none!important}}@media (min-width:1024px){.mdui-hidden-md-up{display:none!important}}@media (min-width:1440px){.mdui-hidden-lg-up{display:none!important}}@media (min-width:1920px){.mdui-hidden-xl-up{display:none!important}}/*! normalize.css v6.0.0 | MIT License | github.com/necolas/normalize.css */html{line-height:1.15;-webkit-text-size-adjust:100%;-ms-text-size-adjust:100%}body{margin:0}article,aside,footer,header,nav,section{display:block}h1{margin:.67em 0;font-size:2em}figcaption,figure,main{display:block}figure{margin:1em 40px}hr{height:0;-webkit-box-sizing:content-box;box-sizing:content-box;overflow:visible}pre{font-family:monospace,monospace;font-size:1em}a{background-color:transparent;-webkit-text-decoration-skip:objects}abbr[title]{text-decoration:underline;text-decoration:underline dotted;border-bottom:none;-webkit-text-decoration:underline dotted;-moz-text-decoration:underline dotted}b,strong{font-weight:inherit}b,strong{font-weight:bolder}code,kbd,samp{font-family:monospace,monospace;font-size:1em}dfn{font-style:italic}mark{color:#000;background-color:#ff0}small{font-size:80%}sub,sup{position:relative;font-size:75%;line-height:0;vertical-align:baseline}sub{bottom:-.25em}sup{top:-.5em}audio,video{display:inline-block}audio:not([controls]){display:none;height:0}img{border-style:none}svg:not(:root){overflow:hidden}button,input,optgroup,select,textarea{margin:0}button,input{overflow:visible}button,select{text-transform:none}[type=reset],[type=submit],button,html [type=button]{-webkit-appearance:button}[type=button]::-moz-focus-inner,[type=reset]::-moz-focus-inner,[type=submit]::-moz-focus-inner,button::-moz-focus-inner{padding:0;border-style:none}legend{display:table;max-width:100%;-webkit-box-sizing:border-box;box-sizing:border-box;padding:0;color:inherit;white-space:normal}progress{display:inline-block;vertical-align:baseline}textarea{overflow:auto}[type=checkbox],[type=radio]{-webkit-box-sizing:border-box;box-sizing:border-box;padding:0}[type=number]::-webkit-inner-spin-button,[type=number]::-webkit-outer-spin-button{height:auto}[type=search]{-webkit-appearance:textfield;outline-offset:-2px}[type=search]::-webkit-search-cancel-button,[type=search]::-webkit-search-decoration{-webkit-appearance:none}::-webkit-file-upload-button{-webkit-appearance:button;font:inherit}details,menu{display:block}summary{display:list-item}canvas{display:inline-block}template{display:none}[hidden]{display:none}body{font-family:Roboto,Noto,Helvetica,Arial,sans-serif;font-size:14px;color:rgba(0,0,0,.87);background-color:#fff}@media (min-width:600px){body{font-size:14.5px}}@media (min-width:1024px){body{font-size:15px}}body ::-webkit-scrollbar{width:5px;height:5px;background:0 0}@media (min-width:1024px){body ::-webkit-scrollbar{width:8px;height:8px}}body ::-webkit-scrollbar-thumb{background:rgba(0,0,0,.2)}body.mdui-theme-layout-dark ::-webkit-scrollbar{width:5px;height:5px;background:0 0}@media (min-width:1024px){body.mdui-theme-layout-dark ::-webkit-scrollbar{width:8px;height:8px}}body.mdui-theme-layout-dark ::-webkit-scrollbar-thumb{background:rgba(255,255,255,.3)}*{-webkit-tap-highlight-color:transparent}body.mdui-locked{overflow:hidden}.mdui-overlay{position:fixed;top:-5000px;right:-5000px;bottom:-5000px;left:-5000px;z-index:2000;visibility:hidden;background:rgba(0,0,0,.4);opacity:0;-webkit-transition-duration:.3s;transition-duration:.3s;-webkit-transition-property:opacity,visibility;transition-property:opacity,visibility;-webkit-backface-visibility:hidden;backface-visibility:hidden;will-change:opacity}.mdui-overlay-show{visibility:visible;opacity:1}.mdui-no-transition{-webkit-transition-property:none!important;transition-property:none!important}.mdui-theme-layout-dark{color:#fff;background-color:#303030}.mdui-icon,.mdui-icon::before{font-size:24px;font-style:normal;font-weight:400;line-height:1;color:inherit;text-transform:none;letter-spacing:normal;word-wrap:normal;white-space:nowrap;vertical-align:middle;direction:ltr}.mdui-icon{display:inline-block;text-align:center}.mdui-icon::before{display:block!important;width:24px;height:24px}@font-face{font-family:'Material Icons';font-style:normal;font-weight:400;src:local('Material Icons'),local('MaterialIcons-Regular'),url(../icons/material-icons/MaterialIcons-Regular.woff2) format('woff2'),url(../icons/material-icons/MaterialIcons-Regular.woff) format('woff')}.material-icons{font-family:'Material Icons';-webkit-font-smoothing:antialiased;text-rendering:optimizeLegibility;-moz-osx-font-smoothing:grayscale;-webkit-font-feature-settings:'liga';-moz-font-feature-settings:'liga';font-feature-settings:'liga'}@font-face{font-family:Roboto;font-style:normal;font-weight:100;src:local('Roboto Thin'),local('Roboto-Thin'),url(../fonts/roboto/Roboto-Thin.woff2) format('woff2'),url(../fonts/roboto/Roboto-Thin.woff) format('woff')}@font-face{font-family:Roboto;font-style:italic;font-weight:100;src:local('Roboto ThinItalic'),local('Roboto-ThinItalic'),url(../fonts/roboto/Roboto-ThinItalic.woff2) format('woff2'),url(../fonts/roboto/Roboto-ThinItalic.woff) format('woff')}@font-face{font-family:Roboto;font-style:normal;font-weight:300;src:local('Roboto Light'),local('Roboto-Light'),url(../fonts/roboto/Roboto-Light.woff2) format('woff2'),url(../fonts/roboto/Roboto-Light.woff) format('woff')}@font-face{font-family:Roboto;font-style:italic;font-weight:300;src:local('Roboto LightItalic'),local('Roboto-LightItalic'),url(../fonts/roboto/Roboto-LightItalic.woff2) format('woff2'),url(../fonts/roboto/Roboto-LightItalic.woff) format('woff')}@font-face{font-family:Roboto;font-style:normal;font-weight:400;src:local('Roboto Regular'),local('Roboto-Regular'),url(../fonts/roboto/Roboto-Regular.woff2) format('woff2'),url(../fonts/roboto/Roboto-Regular.woff) format('woff')}@font-face{font-family:Roboto;font-style:italic;font-weight:400;src:local('Roboto RegularItalic'),local('Roboto-RegularItalic'),url(../fonts/roboto/Roboto-RegularItalic.woff2) format('woff2'),url(../fonts/roboto/Roboto-RegularItalic.woff) format('woff')}@font-face{font-family:Roboto;font-style:normal;font-weight:500;src:local('Roboto Medium'),local('Roboto-Medium'),url(../fonts/roboto/Roboto-Medium.woff2) format('woff2'),url(../fonts/roboto/Roboto-Medium.woff) format('woff')}@font-face{font-family:Roboto;font-style:italic;font-weight:500;src:local('Roboto MediumItalic'),local('Roboto-MediumItalic'),url(../fonts/roboto/Roboto-MediumItalic.woff2) format('woff2'),url(../fonts/roboto/Roboto-MediumItalic.woff) format('woff')}@font-face{font-family:Roboto;font-style:normal;font-weight:700;src:local('Roboto Bold'),local('Roboto-Bold'),url(../fonts/roboto/Roboto-Bold.woff2) format('woff2'),url(../fonts/roboto/Roboto-Bold.woff) format('woff')}@font-face{font-family:Roboto;font-style:italic;font-weight:700;src:local('Roboto BoldItalic'),local('Roboto-BoldItalic'),url(../fonts/roboto/Roboto-BoldItalic.woff2) format('woff2'),url(../fonts/roboto/Roboto-BoldItalic.woff) format('woff')}@font-face{font-family:Roboto;font-style:normal;font-weight:900;src:local('Roboto Black'),local('Roboto-Black'),url(../fonts/roboto/Roboto-Black.woff2) format('woff2'),url(../fonts/roboto/Roboto-Black.woff) format('woff')}@font-face{font-family:Roboto;font-style:italic;font-weight:900;src:local('Roboto BlackItalic'),local('Roboto-BlackItalic'),url(../fonts/roboto/Roboto-BlackItalic.woff2) format('woff2'),url(../fonts/roboto/Roboto-BlackItalic.woff) format('woff')}.mdui-typo-display-4,.mdui-typo-display-4-opacity{font-size:112px;font-weight:300;letter-spacing:-.04em}.mdui-typo-display-4-opacity{opacity:.54}.mdui-typo-display-3,.mdui-typo-display-3-opacity{font-size:56px;font-weight:400;letter-spacing:-.02em}.mdui-typo-display-3-opacity{opacity:.54}.mdui-typo-display-2,.mdui-typo-display-2-opacity{font-size:45px;font-weight:400;letter-spacing:0}.mdui-typo-display-2-opacity{opacity:.54}.mdui-typo-display-1,.mdui-typo-display-1-opacity{font-size:34px;font-weight:400;letter-spacing:0}.mdui-typo-display-1-opacity{opacity:.54}.mdui-typo-headline,.mdui-typo-headline-opacity{font-size:24px;font-weight:400;-moz-osx-font-smoothing:grayscale}.mdui-typo-headline-opacity{opacity:.87}.mdui-typo-title,.mdui-typo-title-opacity{font-size:20px;font-weight:500;letter-spacing:.02em}.mdui-typo-title-opacity{opacity:.87}.mdui-typo-subheading,.mdui-typo-subheading-opacity{font-size:16px;font-weight:400;letter-spacing:.04em}.mdui-typo-subheading-opacity{opacity:.87}.mdui-typo-body-2,.mdui-typo-body-2-opacity{font-size:14px;font-weight:500;letter-spacing:.04em}.mdui-typo-body-2-opacity{opacity:.87}.mdui-typo-body-1,.mdui-typo-body-1-opacity{font-size:14px;font-weight:400;letter-spacing:.04em}.mdui-typo-body-1-opacity{opacity:.87}.mdui-typo-caption,.mdui-typo-caption-opacity{font-size:12px;font-weight:400;letter-spacing:.08em}.mdui-typo-caption-opacity{opacity:.54}.mdui-typo{line-height:1.8;word-wrap:break-word}.mdui-typo address,.mdui-typo caption,.mdui-typo cite,.mdui-typo code,.mdui-typo dfn,.mdui-typo th{font-style:normal;font-weight:400}.mdui-typo caption,.mdui-typo th{text-align:left}.mdui-typo q:after,.mdui-typo q:before{content:''}.mdui-typo code,.mdui-typo kbd,.mdui-typo pre,.mdui-typo pre tt,.mdui-typo samp{font-family:Consolas,Courier,'Courier New',monospace}.mdui-typo figcaption{font-size:80%;color:rgba(0,0,0,.54)}.mdui-typo [draggable]{cursor:move}.mdui-typo .mdui-table,.mdui-typo .mdui-table-fluid,.mdui-typo dl,.mdui-typo figure,.mdui-typo form,.mdui-typo hr,.mdui-typo ol,.mdui-typo p,.mdui-typo pre,.mdui-typo table,.mdui-typo ul{margin:0 0 1.2em 0}.mdui-typo a{position:relative;display:inline-block;overflow:hidden;color:#ff4081;text-decoration:none;vertical-align:top;outline:0}.mdui-typo a:before{position:absolute;top:auto;bottom:1px;left:0;width:100%;height:1px;content:' ';background-color:#ff4081;-webkit-transition:all .2s;transition:all .2s;-webkit-transform:scaleX(0);transform:scaleX(0);-webkit-backface-visibility:hidden;backface-visibility:hidden}.mdui-typo a:focus:before,.mdui-typo a:hover:before{-webkit-transform:scaleX(1);transform:scaleX(1)}.mdui-typo small{font-size:80%}.mdui-typo blockquote{padding-left:1em;margin:1em 3em 1em 2em;font-weight:400;border-left:4px solid rgba(0,0,0,.12)}@media only screen and (max-width:599px){.mdui-typo blockquote{margin:1em 0}}.mdui-typo blockquote footer{font-size:86%;color:rgba(0,0,0,.54)}.mdui-typo mark{padding:2px;margin:0 5px;background:#fffdd1;border-bottom:1px solid #ffedce}.mdui-typo h1,.mdui-typo h2,.mdui-typo h3,.mdui-typo h4,.mdui-typo h5,.mdui-typo h6{margin-top:1.2em;margin-bottom:.6em;font-family:inherit;font-weight:400;line-height:1.35;color:inherit}.mdui-typo h1 small,.mdui-typo h2 small,.mdui-typo h3 small,.mdui-typo h4 small,.mdui-typo h5 small,.mdui-typo h6 small{font-size:65%;font-weight:400;line-height:1;color:rgba(0,0,0,.54)}.mdui-typo h1{font-size:2em}.mdui-typo h2{font-size:1.8em}.mdui-typo h3{font-size:1.6em}.mdui-typo h4{font-size:1.4em}.mdui-typo h5{font-size:1.2em}.mdui-typo h6{font-size:1.1em}.mdui-typo code{padding:2px 6px;color:#c7254e;background-color:#f7f7f9;border-radius:2px}.mdui-typo pre code{padding:0;font-size:inherit;line-height:1.7;color:inherit;background-color:transparent;border-radius:0}.mdui-typo abbr[title]{text-decoration:none;cursor:help;border-bottom:1px dotted}.mdui-typo ins{text-decoration:none;border-bottom:1px solid}.mdui-typo u{text-decoration:none;border-bottom:1px solid}.mdui-typo del{text-decoration:line-through}.mdui-typo hr{height:10px;margin-bottom:.8em;border:none;border-bottom:1px solid rgba(0,0,0,.12)}.mdui-typo pre{padding:12px 16px;overflow-x:auto;-webkit-overflow-scrolling:touch;border:1px solid rgba(0,0,0,.12);border-radius:2px}.mdui-typo kbd{padding:2px 6px;font-size:90%;color:#fff;background-color:#333;border-radius:2px}.mdui-typo ul{padding-left:2em;list-style:disc}.mdui-typo ol{padding-left:2em;list-style:decimal}.mdui-typo li ol,.mdui-typo li ul{margin:.8em 0}.mdui-typo li ul{list-style:circle}.mdui-typo img{max-width:100%}.mdui-theme-accent-amber .mdui-typo a{color:#ffd740}.mdui-theme-accent-amber .mdui-typo a:before{background-color:#ffd740}.mdui-theme-accent-blue .mdui-typo a{color:#448aff}.mdui-theme-accent-blue .mdui-typo a:before{background-color:#448aff}.mdui-theme-accent-cyan .mdui-typo a{color:#18ffff}.mdui-theme-accent-cyan .mdui-typo a:before{background-color:#18ffff}.mdui-theme-accent-deep-orange .mdui-typo a{color:#ff6e40}.mdui-theme-accent-deep-orange .mdui-typo a:before{background-color:#ff6e40}.mdui-theme-accent-deep-purple .mdui-typo a{color:#7c4dff}.mdui-theme-accent-deep-purple .mdui-typo a:before{background-color:#7c4dff}.mdui-theme-accent-green .mdui-typo a{color:#69f0ae}.mdui-theme-accent-green .mdui-typo a:before{background-color:#69f0ae}.mdui-theme-accent-indigo .mdui-typo a{color:#536dfe}.mdui-theme-accent-indigo .mdui-typo a:before{background-color:#536dfe}.mdui-theme-accent-light-blue .mdui-typo a{color:#40c4ff}.mdui-theme-accent-light-blue .mdui-typo a:before{background-color:#40c4ff}.mdui-theme-accent-light-green .mdui-typo a{color:#b2ff59}.mdui-theme-accent-light-green .mdui-typo a:before{background-color:#b2ff59}.mdui-theme-accent-lime .mdui-typo a{color:#eeff41}.mdui-theme-accent-lime .mdui-typo a:before{background-color:#eeff41}.mdui-theme-accent-orange .mdui-typo a{color:#ffab40}.mdui-theme-accent-orange .mdui-typo a:before{background-color:#ffab40}.mdui-theme-accent-pink .mdui-typo a{color:#ff4081}.mdui-theme-accent-pink .mdui-typo a:before{background-color:#ff4081}.mdui-theme-accent-purple .mdui-typo a{color:#e040fb}.mdui-theme-accent-purple .mdui-typo a:before{background-color:#e040fb}.mdui-theme-accent-red .mdui-typo a{color:#ff5252}.mdui-theme-accent-red .mdui-typo a:before{background-color:#ff5252}.mdui-theme-accent-teal .mdui-typo a{color:#64ffda}.mdui-theme-accent-teal .mdui-typo a:before{background-color:#64ffda}.mdui-theme-accent-yellow .mdui-typo a{color:#ff0}.mdui-theme-accent-yellow .mdui-typo a:before{background-color:#ff0}.mdui-theme-layout-dark .mdui-typo blockquote{border-left-color:rgba(255,255,255,.12)}.mdui-theme-layout-dark .mdui-typo blockquote footer{color:rgba(255,255,255,.7)}.mdui-theme-layout-dark .mdui-typo figcaption{color:rgba(255,255,255,.7)}.mdui-theme-layout-dark .mdui-typo mark{background:#aaa;border-bottom-color:#bbb}.mdui-theme-layout-dark .mdui-typo h1 small,.mdui-theme-layout-dark .mdui-typo h2 small,.mdui-theme-layout-dark .mdui-typo h3 small,.mdui-theme-layout-dark .mdui-typo h4 small,.mdui-theme-layout-dark .mdui-typo h5 small,.mdui-theme-layout-dark .mdui-typo h6 small{color:rgba(255,255,255,.7)}.mdui-theme-layout-dark .mdui-typo code{color:#ffcdd2;background-color:#424242}.mdui-theme-layout-dark .mdui-typo pre{background:#424242;border-color:rgba(255,255,255,.12)}.mdui-theme-layout-dark .mdui-typo kbd{background:#424242}.mdui-theme-layout-dark .mdui-typo hr{border-color:rgba(255,255,255,.12)}.mdui-headroom{-webkit-transition:all .3s cubic-bezier(.4,0,.2,1)!important;transition:all .3s cubic-bezier(.4,0,.2,1)!important}.mdui-headroom-pinned-top{-webkit-transform:translate3d(0,0,0)!important;transform:translate3d(0,0,0)!important}.mdui-headroom-unpinned-top{-webkit-box-shadow:none!important;box-shadow:none!important;-webkit-transform:translate3d(0,-100%,0)!important;transform:translate3d(0,-100%,0)!important}.mdui-headroom-pinned-down{-webkit-transform:translate3d(0,0,0)!important;transform:translate3d(0,0,0)!important}.mdui-headroom-unpinned-down{-webkit-box-shadow:none!important;box-shadow:none!important;-webkit-transform:translate3d(0,100%,0)!important;transform:translate3d(0,100%,0)!important}.mdui-headroom-pinned-toolbar{-webkit-transform:translate3d(0,0,0)!important;transform:translate3d(0,0,0)!important}.mdui-headroom-unpinned-toolbar{-webkit-transform:translate3d(0,-56px,0)!important;transform:translate3d(0,-56px,0)!important}@media (min-width:600px){.mdui-headroom-unpinned-toolbar{-webkit-transform:translate3d(0,-64px,0)!important;transform:translate3d(0,-64px,0)!important}}@media (orientation:landscape) and (max-width:959px){.mdui-headroom-unpinned-toolbar{-webkit-transform:translate3d(0,-48px,0)!important;transform:translate3d(0,-48px,0)!important}}.mdui-collapse-item-header .mdui-collapse-item-arrow,.mdui-collapse-item-header.mdui-collapse-item-arrow{-webkit-transition:-webkit-transform .3s cubic-bezier(.4,0,.2,1);transition:-webkit-transform .3s cubic-bezier(.4,0,.2,1);transition:transform .3s cubic-bezier(.4,0,.2,1);transition:transform .3s cubic-bezier(.4,0,.2,1),-webkit-transform .3s cubic-bezier(.4,0,.2,1);-webkit-transform:rotate(0);transform:rotate(0);will-change:transform}.mdui-collapse-item-body{height:0;padding-top:0;padding-bottom:0;margin-top:0;margin-bottom:0;overflow:hidden;-webkit-transition:all .3s cubic-bezier(.4,0,.2,1);transition:all .3s cubic-bezier(.4,0,.2,1);will-change:height}.mdui-collapse-item-body .mdui-list-item{padding-left:72px}.mdui-collapse-item-open>.mdui-collapse-item-header .mdui-collapse-item-arrow,.mdui-collapse-item-open>.mdui-collapse-item-header.mdui-collapse-item-arrow{-webkit-transform:rotate(180deg);transform:rotate(180deg)}.mdui-collapse-item-open>.mdui-collapse-item-body{height:auto}.mdui-table{position:relative;width:100%;border-spacing:0;border-collapse:separate;background-color:#fff;border:1px solid rgba(0,0,0,.12);border-bottom:none;-webkit-box-shadow:0 3px 1px -2px rgba(0,0,0,.2),0 2px 2px 0 rgba(0,0,0,.14),0 1px 5px 0 rgba(0,0,0,.12);box-shadow:0 3px 1px -2px rgba(0,0,0,.2),0 2px 2px 0 rgba(0,0,0,.14),0 1px 5px 0 rgba(0,0,0,.12)}.mdui-table tbody tr{position:relative;-webkit-transition:background-color .28s cubic-bezier(.4,0,.2,1);transition:background-color .28s cubic-bezier(.4,0,.2,1)}.mdui-table td,.mdui-table th{position:relative;-webkit-box-sizing:border-box;box-sizing:border-box;padding:12px 28px;text-align:left;vertical-align:middle;border-bottom:1px solid rgba(0,0,0,.12)}.mdui-table td:last-child,.mdui-table th:last-child{padding-right:24px}.mdui-table td:first-child,.mdui-table th:first-child{padding-right:0;padding-left:24px}.mdui-table td:nth-child(2),.mdui-table th:nth-child(2){padding-left:24px}.mdui-table th{overflow:hidden;font-size:13px;font-weight:700;line-height:32px;color:rgba(0,0,0,.54);text-overflow:ellipsis;white-space:nowrap}.mdui-table td{font-size:14px;line-height:24px;color:rgba(0,0,0,.87)}.mdui-table-cell-checkbox{padding-top:0!important;padding-bottom:0!important;padding-left:24px!important}.mdui-table-cell-checkbox .mdui-checkbox{margin-top:7px}.mdui-table-cell-checkbox+td,.mdui-table-cell-checkbox+th{padding-left:6px!important}th.mdui-table-cell-checkbox .mdui-checkbox{margin-top:11px}.mdui-table-hoverable tbody tr:hover{background-color:#eee}.mdui-table-fluid{width:100%;overflow-x:auto;-webkit-overflow-scrolling:touch;border:1px solid rgba(0,0,0,.12);border-bottom:none;-webkit-box-shadow:0 3px 1px -2px rgba(0,0,0,.2),0 2px 2px 0 rgba(0,0,0,.14),0 1px 5px 0 rgba(0,0,0,.12);box-shadow:0 3px 1px -2px rgba(0,0,0,.2),0 2px 2px 0 rgba(0,0,0,.14),0 1px 5px 0 rgba(0,0,0,.12)}.mdui-table-fluid .mdui-table{margin:0;border:none;-webkit-box-shadow:none;box-shadow:none}.mdui-table-col-numeric{text-align:right!important}.mdui-table-row-selected{background-color:#f5f5f5}.mdui-theme-layout-dark .mdui-table{background-color:#303030;border:1px solid rgba(255,255,255,.12);border-bottom:none}.mdui-theme-layout-dark .mdui-table td,.mdui-theme-layout-dark .mdui-table th{border-bottom:1px solid rgba(255,255,255,.12)}.mdui-theme-layout-dark .mdui-table th{color:rgba(255,255,255,.7)}.mdui-theme-layout-dark .mdui-table td{color:#fff}.mdui-theme-layout-dark .mdui-table-hoverable tbody tr:hover{background-color:#616161}.mdui-theme-layout-dark .mdui-table-fluid{border:1px solid rgba(255,255,255,.12);border-bottom:none}.mdui-theme-layout-dark .mdui-table-fluid .mdui-table{border:none;-webkit-box-shadow:none;box-shadow:none}.mdui-theme-layout-dark .mdui-table-row-selected{background-color:#424242}.mdui-divider,.mdui-divider-dark,.mdui-divider-inset,.mdui-divider-inset-dark,.mdui-divider-inset-light,.mdui-divider-light{height:1px;margin:-1px 0 0 0;border:none}.mdui-divider-inset,.mdui-divider-inset-dark,.mdui-divider-inset-light{margin-left:72px}.mdui-divider,.mdui-divider-inset{background-color:rgba(0,0,0,.12)}.mdui-theme-layout-dark .mdui-divider,.mdui-theme-layout-dark .mdui-divider-inset{background-color:rgba(255,255,255,.12)}.mdui-divider-inset-light,.mdui-divider-light{background-color:rgba(255,255,255,.12)}.mdui-divider-dark,.mdui-divider-inset-dark{background-color:rgba(0,0,0,.12)}.mdui-img-fluid,.mdui-video-fluid{display:block;max-width:100%;height:auto}.mdui-img-rounded{border-radius:2px}.mdui-img-circle{border-radius:50%}.mdui-video-container{position:relative;height:0;padding-bottom:56.25%;overflow:hidden}.mdui-video-container embed,.mdui-video-container iframe,.mdui-video-container object{position:absolute;top:0;left:0;width:100%;height:100%}.mdui-ripple{position:relative;overflow:hidden;cursor:pointer;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.mdui-ripple-wave{position:absolute!important;top:0;left:0;z-index:1;padding:0;margin:0;font-size:0;pointer-events:none;background-color:rgba(0,0,0,.1);border-radius:50%;-webkit-transition-duration:1.4s;transition-duration:1.4s;-webkit-transform:translate3d(0,0,0) scale(0);transform:translate3d(0,0,0) scale(0)}.mdui-ripple[class*=mdui-color-] .mdui-ripple-wave{background-color:rgba(255,255,255,.3)}.mdui-ripple-white .mdui-ripple-wave{background-color:rgba(255,255,255,.3)!important}.mdui-ripple-black .mdui-ripple-wave{background-color:rgba(0,0,0,.1)!important}.mdui-ripple-wave-fill{opacity:.35;-webkit-transition-duration:.3s;transition-duration:.3s}.mdui-ripple-wave-out{opacity:0;-webkit-transition-duration:.6s;transition-duration:.6s}.mdui-ripple-amber .mdui-ripple-wave{background-color:rgba(255,193,7,.3)!important}.mdui-ripple-blue .mdui-ripple-wave{background-color:rgba(33,150,243,.3)!important}.mdui-ripple-blue-grey .mdui-ripple-wave{background-color:rgba(96,125,139,.3)!important}.mdui-ripple-brown .mdui-ripple-wave{background-color:rgba(121,85,72,.3)!important}.mdui-ripple-cyan .mdui-ripple-wave{background-color:rgba(0,188,212,.3)!important}.mdui-ripple-deep-orange .mdui-ripple-wave{background-color:rgba(255,87,34,.3)!important}.mdui-ripple-deep-purple .mdui-ripple-wave{background-color:rgba(103,58,183,.3)!important}.mdui-ripple-green .mdui-ripple-wave{background-color:rgba(76,175,80,.3)!important}.mdui-ripple-grey .mdui-ripple-wave{background-color:rgba(158,158,158,.3)!important}.mdui-ripple-indigo .mdui-ripple-wave{background-color:rgba(63,81,181,.3)!important}.mdui-ripple-light-blue .mdui-ripple-wave{background-color:rgba(3,169,244,.3)!important}.mdui-ripple-light-green .mdui-ripple-wave{background-color:rgba(139,195,74,.3)!important}.mdui-ripple-lime .mdui-ripple-wave{background-color:rgba(205,220,57,.3)!important}.mdui-ripple-orange .mdui-ripple-wave{background-color:rgba(255,152,0,.3)!important}.mdui-ripple-pink .mdui-ripple-wave{background-color:rgba(233,30,99,.3)!important}.mdui-ripple-purple .mdui-ripple-wave{background-color:rgba(156,39,176,.3)!important}.mdui-ripple-red .mdui-ripple-wave{background-color:rgba(244,67,54,.3)!important}.mdui-ripple-teal .mdui-ripple-wave{background-color:rgba(0,150,136,.3)!important}.mdui-ripple-yellow .mdui-ripple-wave{background-color:rgba(255,235,59,.3)!important}.mdui-theme-layout-dark .mdui-ripple-wave{background-color:rgba(255,255,255,.3)}.mdui-textfield{position:relative;padding-top:16px;padding-bottom:8px;overflow:hidden}.mdui-textfield-has-bottom{padding-bottom:28px}.mdui-textfield-input{display:block;width:100%;height:36px;-webkit-box-sizing:border-box;box-sizing:border-box;-webkit-appearance:none;padding:8px 0;margin:0;overflow:hidden;font-family:inherit;font-size:16px;line-height:20px;color:rgba(0,0,0,.87);resize:none;background:0 0;border:none;border-bottom:1px solid rgba(0,0,0,.42);border-radius:0;outline:0;-webkit-box-shadow:none;box-shadow:none;-webkit-transition-timing-function:cubic-bezier(.4,0,.2,1);transition-timing-function:cubic-bezier(.4,0,.2,1);-webkit-transition-duration:.2s;transition-duration:.2s;-webkit-transition-property:border-bottom-color,padding-right,-webkit-box-shadow;transition-property:border-bottom-color,padding-right,-webkit-box-shadow;transition-property:border-bottom-color,padding-right,box-shadow;transition-property:border-bottom-color,padding-right,box-shadow,-webkit-box-shadow;-moz-appearance:none;appearance:none}.mdui-textfield-input::-webkit-input-placeholder{color:inherit;opacity:.42}.mdui-textfield-input:not([disabled]):hover{cursor:pointer;border-bottom:1px solid rgba(0,0,0,.87);-webkit-box-shadow:0 1px 0 0 rgba(0,0,0,.87);box-shadow:0 1px 0 0 rgba(0,0,0,.87)}.mdui-textfield-input[rows]{height:auto!important;overflow:auto;-webkit-overflow-scrolling:touch}.mdui-textfield-label{display:block;width:100%;font-size:16px;color:rgba(0,0,0,.54);pointer-events:none;-webkit-transition:all .2s;transition:all .2s;-webkit-transform:scale(.75) translateY(0);transform:scale(.75) translateY(0);-webkit-transform-origin:left;transform-origin:left}.mdui-textfield-error,.mdui-textfield-helper{position:absolute;bottom:8px;height:12px;overflow:hidden;font-size:12px;line-height:12px;text-overflow:ellipsis;white-space:nowrap}.mdui-textfield-error{color:rgba(255,23,68,.87);visibility:hidden}.mdui-textfield-helper{color:rgba(0,0,0,.54)}.mdui-textfield .mdui-icon{position:absolute;bottom:8px;padding:6px;color:rgba(0,0,0,.54)}.mdui-textfield .mdui-icon~.mdui-textfield-error,.mdui-textfield .mdui-icon~.mdui-textfield-flex-wrap,.mdui-textfield .mdui-icon~.mdui-textfield-helper,.mdui-textfield .mdui-icon~.mdui-textfield-input,.mdui-textfield .mdui-icon~.mdui-textfield-label{width:calc(100% - 56px);margin-left:56px}.mdui-textfield-has-bottom .mdui-icon{bottom:28px}.mdui-textfield-focus .mdui-textfield-input,.mdui-textfield-focus .mdui-textfield-input:hover{border-bottom-color:#c51162;-webkit-box-shadow:0 1px 0 0 #c51162;box-shadow:0 1px 0 0 #c51162}.mdui-textfield-focus .mdui-icon,.mdui-textfield-focus .mdui-textfield-label{color:rgba(197,17,98,.87)}.mdui-textfield-floating-label .mdui-textfield-label{color:rgba(0,0,0,.35);-webkit-transform:scale(1) translateY(27px);transform:scale(1) translateY(27px)}.mdui-textfield-floating-label.mdui-textfield-focus .mdui-textfield-label,.mdui-textfield-floating-label.mdui-textfield-not-empty .mdui-textfield-label{color:rgba(0,0,0,.65);-webkit-transform:scale(.75) translateY(0);transform:scale(.75) translateY(0)}.mdui-textfield-floating-label.mdui-textfield-focus .mdui-textfield-label{color:#e91e63}.mdui-textfield-expandable{width:36px;min-height:36px;padding:1px 0;-webkit-transition:width .3s cubic-bezier(.4,0,.2,1);transition:width .3s cubic-bezier(.4,0,.2,1)}.mdui-textfield-expandable .mdui-icon{bottom:0;padding:0}.mdui-textfield-expandable .mdui-textfield-input{width:calc(100% - 36px);padding-right:0;margin-left:36px}.mdui-textfield-expandable .mdui-textfield-icon{position:absolute;top:0;left:0}.mdui-textfield-expandable .mdui-textfield-close{position:absolute;top:0;right:0;-webkit-transform:scale(0);transform:scale(0)}.mdui-textfield-expandable.mdui-textfield-expanded{width:100%}.mdui-textfield-expandable.mdui-textfield-expanded .mdui-textfield-input{padding-right:36px}.mdui-textfield-expandable.mdui-textfield-expanded .mdui-textfield-close{-webkit-transform:scale(1);transform:scale(1)}.mdui-textfield-invalid .mdui-textfield-input,.mdui-textfield-invalid-html5 .mdui-textfield-input,.mdui-textfield-invalid-html5.mdui-textfield-focus .mdui-textfield-input,.mdui-textfield-invalid.mdui-textfield-focus .mdui-textfield-input{border-bottom-color:#ff1744!important;-webkit-box-shadow:0 1px 0 0 #ff1744!important;box-shadow:0 1px 0 0 #ff1744!important}.mdui-textfield-invalid .mdui-textfield-label,.mdui-textfield-invalid-html5 .mdui-textfield-label{color:#ff1744!important}.mdui-textfield-invalid-html5.mdui-textfield-floating-label .mdui-textfield-label,.mdui-textfield-invalid.mdui-textfield-floating-label .mdui-textfield-label{color:rgba(255,23,68,.35)!important}.mdui-textfield-invalid-html5.mdui-textfield-floating-label.mdui-textfield-focus .mdui-textfield-label,.mdui-textfield-invalid-html5.mdui-textfield-floating-label.mdui-textfield-not-empty .mdui-textfield-label,.mdui-textfield-invalid.mdui-textfield-floating-label.mdui-textfield-focus .mdui-textfield-label,.mdui-textfield-invalid.mdui-textfield-floating-label.mdui-textfield-not-empty .mdui-textfield-label{color:#ff1744!important}.mdui-textfield-invalid .mdui-textfield-error,.mdui-textfield-invalid-html5 .mdui-textfield-error{visibility:visible}.mdui-textfield-invalid .mdui-textfield-error+.mdui-textfield-helper,.mdui-textfield-invalid-html5 .mdui-textfield-error+.mdui-textfield-helper{visibility:hidden}.mdui-textfield-disabled .mdui-textfield-input::-webkit-input-placeholder,.mdui-textfield-disabled .mdui-textfield-label{color:rgba(0,0,0,.38)}.mdui-textfield-disabled .mdui-textfield-input{color:rgba(0,0,0,.42);cursor:default}.mdui-textfield-disabled .mdui-textfield-input{border-bottom:1px dashed rgba(0,0,0,.42)}.mdui-textfield-counter{position:absolute;right:8px;bottom:8px;height:12px;font-size:12px;line-height:12px;color:rgba(0,0,0,.54)}.mdui-theme-layout-dark .mdui-textfield-input{color:#fff;border-bottom-color:rgba(255,255,255,.7)}.mdui-theme-layout-dark .mdui-textfield-input::-webkit-input-placeholder{color:rgba(255,255,255,.5)}.mdui-theme-layout-dark .mdui-textfield-input:not([disabled]):hover{border-bottom-color:#fff;-webkit-box-shadow:0 1px 0 0 #fff;box-shadow:0 1px 0 0 #fff}.mdui-theme-layout-dark .mdui-textfield .mdui-icon{color:rgba(255,255,255,.7)}.mdui-theme-layout-dark .mdui-textfield-label{color:rgba(255,255,255,.7)}.mdui-theme-layout-dark .mdui-textfield-floating-label .mdui-textfield-label{color:rgba(255,255,255,.35)}.mdui-theme-layout-dark .mdui-textfield-error{color:#ff1744}.mdui-theme-layout-dark .mdui-textfield-helper{color:rgba(255,255,255,.7)}.mdui-theme-layout-dark .mdui-textfield-counter{color:rgba(255,255,255,.7)}.mdui-theme-layout-dark .mdui-textfield-focus .mdui-textfield-input,.mdui-theme-layout-dark .mdui-textfield-focus .mdui-textfield-input:hover{border-bottom-color:#ff4081;-webkit-box-shadow:0 1px 0 0 #ff4081;box-shadow:0 1px 0 0 #ff4081}.mdui-theme-layout-dark .mdui-textfield-focus .mdui-textfield-label{color:#ff4081}.mdui-theme-layout-dark .mdui-textfield-disabled .mdui-textfield-input::-webkit-input-placeholder,.mdui-theme-layout-dark .mdui-textfield-disabled .mdui-textfield-label{color:rgba(255,255,255,.5)}.mdui-theme-layout-dark .mdui-textfield-disabled .mdui-textfield-input{color:rgba(255,255,255,.5)}.mdui-theme-layout-dark .mdui-textfield-disabled .mdui-textfield-input{border-bottom-color:rgba(255,255,255,.7)}.mdui-theme-accent-amber .mdui-textfield-focus .mdui-textfield-input{border-bottom-color:#ffab00;-webkit-box-shadow:0 1px 0 0 #ffab00;box-shadow:0 1px 0 0 #ffab00}.mdui-theme-accent-amber .mdui-textfield-focus .mdui-icon,.mdui-theme-accent-amber .mdui-textfield-focus .mdui-textfield-floating-label.mdui-textfield-focus .mdui-textfield-label,.mdui-theme-accent-amber .mdui-textfield-focus .mdui-textfield-label{color:rgba(255,171,0,.87)}.mdui-theme-accent-amber.mdui-theme-layout-dark .mdui-textfield-focus .mdui-textfield-input{border-bottom-color:#ffd740;-webkit-box-shadow:0 1px 0 0 #ffd740;box-shadow:0 1px 0 0 #ffd740}.mdui-theme-accent-amber.mdui-theme-layout-dark .mdui-textfield-focus .mdui-icon,.mdui-theme-accent-amber.mdui-theme-layout-dark .mdui-textfield-focus .mdui-textfield-floating-label.mdui-textfield-focus .mdui-textfield-label,.mdui-theme-accent-amber.mdui-theme-layout-dark .mdui-textfield-focus .mdui-textfield-label{color:#ffd740}.mdui-theme-accent-blue .mdui-textfield-focus .mdui-textfield-input{border-bottom-color:#2962ff;-webkit-box-shadow:0 1px 0 0 #2962ff;box-shadow:0 1px 0 0 #2962ff}.mdui-theme-accent-blue .mdui-textfield-focus .mdui-icon,.mdui-theme-accent-blue .mdui-textfield-focus .mdui-textfield-floating-label.mdui-textfield-focus .mdui-textfield-label,.mdui-theme-accent-blue .mdui-textfield-focus .mdui-textfield-label{color:rgba(41,98,255,.87)}.mdui-theme-accent-blue.mdui-theme-layout-dark .mdui-textfield-focus .mdui-textfield-input{border-bottom-color:#448aff;-webkit-box-shadow:0 1px 0 0 #448aff;box-shadow:0 1px 0 0 #448aff}.mdui-theme-accent-blue.mdui-theme-layout-dark .mdui-textfield-focus .mdui-icon,.mdui-theme-accent-blue.mdui-theme-layout-dark .mdui-textfield-focus .mdui-textfield-floating-label.mdui-textfield-focus .mdui-textfield-label,.mdui-theme-accent-blue.mdui-theme-layout-dark .mdui-textfield-focus .mdui-textfield-label{color:#448aff}.mdui-theme-accent-cyan .mdui-textfield-focus .mdui-textfield-input{border-bottom-color:#00b8d4;-webkit-box-shadow:0 1px 0 0 #00b8d4;box-shadow:0 1px 0 0 #00b8d4}.mdui-theme-accent-cyan .mdui-textfield-focus .mdui-icon,.mdui-theme-accent-cyan .mdui-textfield-focus .mdui-textfield-floating-label.mdui-textfield-focus .mdui-textfield-label,.mdui-theme-accent-cyan .mdui-textfield-focus .mdui-textfield-label{color:rgba(0,184,212,.87)}.mdui-theme-accent-cyan.mdui-theme-layout-dark .mdui-textfield-focus .mdui-textfield-input{border-bottom-color:#18ffff;-webkit-box-shadow:0 1px 0 0 #18ffff;box-shadow:0 1px 0 0 #18ffff}.mdui-theme-accent-cyan.mdui-theme-layout-dark .mdui-textfield-focus .mdui-icon,.mdui-theme-accent-cyan.mdui-theme-layout-dark .mdui-textfield-focus .mdui-textfield-floating-label.mdui-textfield-focus .mdui-textfield-label,.mdui-theme-accent-cyan.mdui-theme-layout-dark .mdui-textfield-focus .mdui-textfield-label{color:#18ffff}.mdui-theme-accent-deep-orange .mdui-textfield-focus .mdui-textfield-input{border-bottom-color:#dd2c00;-webkit-box-shadow:0 1px 0 0 #dd2c00;box-shadow:0 1px 0 0 #dd2c00}.mdui-theme-accent-deep-orange .mdui-textfield-focus .mdui-icon,.mdui-theme-accent-deep-orange .mdui-textfield-focus .mdui-textfield-floating-label.mdui-textfield-focus .mdui-textfield-label,.mdui-theme-accent-deep-orange .mdui-textfield-focus .mdui-textfield-label{color:rgba(221,44,0,.87)}.mdui-theme-accent-deep-orange.mdui-theme-layout-dark .mdui-textfield-focus .mdui-textfield-input{border-bottom-color:#ff6e40;-webkit-box-shadow:0 1px 0 0 #ff6e40;box-shadow:0 1px 0 0 #ff6e40}.mdui-theme-accent-deep-orange.mdui-theme-layout-dark .mdui-textfield-focus .mdui-icon,.mdui-theme-accent-deep-orange.mdui-theme-layout-dark .mdui-textfield-focus .mdui-textfield-floating-label.mdui-textfield-focus .mdui-textfield-label,.mdui-theme-accent-deep-orange.mdui-theme-layout-dark .mdui-textfield-focus .mdui-textfield-label{color:#ff6e40}.mdui-theme-accent-deep-purple .mdui-textfield-focus .mdui-textfield-input{border-bottom-color:#6200ea;-webkit-box-shadow:0 1px 0 0 #6200ea;box-shadow:0 1px 0 0 #6200ea}.mdui-theme-accent-deep-purple .mdui-textfield-focus .mdui-icon,.mdui-theme-accent-deep-purple .mdui-textfield-focus .mdui-textfield-floating-label.mdui-textfield-focus .mdui-textfield-label,.mdui-theme-accent-deep-purple .mdui-textfield-focus .mdui-textfield-label{color:rgba(98,0,234,.87)}.mdui-theme-accent-deep-purple.mdui-theme-layout-dark .mdui-textfield-focus .mdui-textfield-input{border-bottom-color:#7c4dff;-webkit-box-shadow:0 1px 0 0 #7c4dff;box-shadow:0 1px 0 0 #7c4dff}.mdui-theme-accent-deep-purple.mdui-theme-layout-dark .mdui-textfield-focus .mdui-icon,.mdui-theme-accent-deep-purple.mdui-theme-layout-dark .mdui-textfield-focus .mdui-textfield-floating-label.mdui-textfield-focus .mdui-textfield-label,.mdui-theme-accent-deep-purple.mdui-theme-layout-dark .mdui-textfield-focus .mdui-textfield-label{color:#7c4dff}.mdui-theme-accent-green .mdui-textfield-focus .mdui-textfield-input{border-bottom-color:#00c853;-webkit-box-shadow:0 1px 0 0 #00c853;box-shadow:0 1px 0 0 #00c853}.mdui-theme-accent-green .mdui-textfield-focus .mdui-icon,.mdui-theme-accent-green .mdui-textfield-focus .mdui-textfield-floating-label.mdui-textfield-focus .mdui-textfield-label,.mdui-theme-accent-green .mdui-textfield-focus .mdui-textfield-label{color:rgba(0,200,83,.87)}.mdui-theme-accent-green.mdui-theme-layout-dark .mdui-textfield-focus .mdui-textfield-input{border-bottom-color:#69f0ae;-webkit-box-shadow:0 1px 0 0 #69f0ae;box-shadow:0 1px 0 0 #69f0ae}.mdui-theme-accent-green.mdui-theme-layout-dark .mdui-textfield-focus .mdui-icon,.mdui-theme-accent-green.mdui-theme-layout-dark .mdui-textfield-focus .mdui-textfield-floating-label.mdui-textfield-focus .mdui-textfield-label,.mdui-theme-accent-green.mdui-theme-layout-dark .mdui-textfield-focus .mdui-textfield-label{color:#69f0ae}.mdui-theme-accent-indigo .mdui-textfield-focus .mdui-textfield-input{border-bottom-color:#304ffe;-webkit-box-shadow:0 1px 0 0 #304ffe;box-shadow:0 1px 0 0 #304ffe}.mdui-theme-accent-indigo .mdui-textfield-focus .mdui-icon,.mdui-theme-accent-indigo .mdui-textfield-focus .mdui-textfield-floating-label.mdui-textfield-focus .mdui-textfield-label,.mdui-theme-accent-indigo .mdui-textfield-focus .mdui-textfield-label{color:rgba(48,79,254,.87)}.mdui-theme-accent-indigo.mdui-theme-layout-dark .mdui-textfield-focus .mdui-textfield-input{border-bottom-color:#536dfe;-webkit-box-shadow:0 1px 0 0 #536dfe;box-shadow:0 1px 0 0 #536dfe}.mdui-theme-accent-indigo.mdui-theme-layout-dark .mdui-textfield-focus .mdui-icon,.mdui-theme-accent-indigo.mdui-theme-layout-dark .mdui-textfield-focus .mdui-textfield-floating-label.mdui-textfield-focus .mdui-textfield-label,.mdui-theme-accent-indigo.mdui-theme-layout-dark .mdui-textfield-focus .mdui-textfield-label{color:#536dfe}.mdui-theme-accent-light-blue .mdui-textfield-focus .mdui-textfield-input{border-bottom-color:#0091ea;-webkit-box-shadow:0 1px 0 0 #0091ea;box-shadow:0 1px 0 0 #0091ea}.mdui-theme-accent-light-blue .mdui-textfield-focus .mdui-icon,.mdui-theme-accent-light-blue .mdui-textfield-focus .mdui-textfield-floating-label.mdui-textfield-focus .mdui-textfield-label,.mdui-theme-accent-light-blue .mdui-textfield-focus .mdui-textfield-label{color:rgba(0,145,234,.87)}.mdui-theme-accent-light-blue.mdui-theme-layout-dark .mdui-textfield-focus .mdui-textfield-input{border-bottom-color:#40c4ff;-webkit-box-shadow:0 1px 0 0 #40c4ff;box-shadow:0 1px 0 0 #40c4ff}.mdui-theme-accent-light-blue.mdui-theme-layout-dark .mdui-textfield-focus .mdui-icon,.mdui-theme-accent-light-blue.mdui-theme-layout-dark .mdui-textfield-focus .mdui-textfield-floating-label.mdui-textfield-focus .mdui-textfield-label,.mdui-theme-accent-light-blue.mdui-theme-layout-dark .mdui-textfield-focus .mdui-textfield-label{color:#40c4ff}.mdui-theme-accent-light-green .mdui-textfield-focus .mdui-textfield-input{border-bottom-color:#64dd17;-webkit-box-shadow:0 1px 0 0 #64dd17;box-shadow:0 1px 0 0 #64dd17}.mdui-theme-accent-light-green .mdui-textfield-focus .mdui-icon,.mdui-theme-accent-light-green .mdui-textfield-focus .mdui-textfield-floating-label.mdui-textfield-focus .mdui-textfield-label,.mdui-theme-accent-light-green .mdui-textfield-focus .mdui-textfield-label{color:rgba(100,221,23,.87)}.mdui-theme-accent-light-green.mdui-theme-layout-dark .mdui-textfield-focus .mdui-textfield-input{border-bottom-color:#b2ff59;-webkit-box-shadow:0 1px 0 0 #b2ff59;box-shadow:0 1px 0 0 #b2ff59}.mdui-theme-accent-light-green.mdui-theme-layout-dark .mdui-textfield-focus .mdui-icon,.mdui-theme-accent-light-green.mdui-theme-layout-dark .mdui-textfield-focus .mdui-textfield-floating-label.mdui-textfield-focus .mdui-textfield-label,.mdui-theme-accent-light-green.mdui-theme-layout-dark .mdui-textfield-focus .mdui-textfield-label{color:#b2ff59}.mdui-theme-accent-lime .mdui-textfield-focus .mdui-textfield-input{border-bottom-color:#aeea00;-webkit-box-shadow:0 1px 0 0 #aeea00;box-shadow:0 1px 0 0 #aeea00}.mdui-theme-accent-lime .mdui-textfield-focus .mdui-icon,.mdui-theme-accent-lime .mdui-textfield-focus .mdui-textfield-floating-label.mdui-textfield-focus .mdui-textfield-label,.mdui-theme-accent-lime .mdui-textfield-focus .mdui-textfield-label{color:rgba(174,234,0,.87)}.mdui-theme-accent-lime.mdui-theme-layout-dark .mdui-textfield-focus .mdui-textfield-input{border-bottom-color:#eeff41;-webkit-box-shadow:0 1px 0 0 #eeff41;box-shadow:0 1px 0 0 #eeff41}.mdui-theme-accent-lime.mdui-theme-layout-dark .mdui-textfield-focus .mdui-icon,.mdui-theme-accent-lime.mdui-theme-layout-dark .mdui-textfield-focus .mdui-textfield-floating-label.mdui-textfield-focus .mdui-textfield-label,.mdui-theme-accent-lime.mdui-theme-layout-dark .mdui-textfield-focus .mdui-textfield-label{color:#eeff41}.mdui-theme-accent-orange .mdui-textfield-focus .mdui-textfield-input{border-bottom-color:#ff6d00;-webkit-box-shadow:0 1px 0 0 #ff6d00;box-shadow:0 1px 0 0 #ff6d00}.mdui-theme-accent-orange .mdui-textfield-focus .mdui-icon,.mdui-theme-accent-orange .mdui-textfield-focus .mdui-textfield-floating-label.mdui-textfield-focus .mdui-textfield-label,.mdui-theme-accent-orange .mdui-textfield-focus .mdui-textfield-label{color:rgba(255,109,0,.87)}.mdui-theme-accent-orange.mdui-theme-layout-dark .mdui-textfield-focus .mdui-textfield-input{border-bottom-color:#ffab40;-webkit-box-shadow:0 1px 0 0 #ffab40;box-shadow:0 1px 0 0 #ffab40}.mdui-theme-accent-orange.mdui-theme-layout-dark .mdui-textfield-focus .mdui-icon,.mdui-theme-accent-orange.mdui-theme-layout-dark .mdui-textfield-focus .mdui-textfield-floating-label.mdui-textfield-focus .mdui-textfield-label,.mdui-theme-accent-orange.mdui-theme-layout-dark .mdui-textfield-focus .mdui-textfield-label{color:#ffab40}.mdui-theme-accent-pink .mdui-textfield-focus .mdui-textfield-input{border-bottom-color:#c51162;-webkit-box-shadow:0 1px 0 0 #c51162;box-shadow:0 1px 0 0 #c51162}.mdui-theme-accent-pink .mdui-textfield-focus .mdui-icon,.mdui-theme-accent-pink .mdui-textfield-focus .mdui-textfield-floating-label.mdui-textfield-focus .mdui-textfield-label,.mdui-theme-accent-pink .mdui-textfield-focus .mdui-textfield-label{color:rgba(197,17,98,.87)}.mdui-theme-accent-pink.mdui-theme-layout-dark .mdui-textfield-focus .mdui-textfield-input{border-bottom-color:#ff4081;-webkit-box-shadow:0 1px 0 0 #ff4081;box-shadow:0 1px 0 0 #ff4081}.mdui-theme-accent-pink.mdui-theme-layout-dark .mdui-textfield-focus .mdui-icon,.mdui-theme-accent-pink.mdui-theme-layout-dark .mdui-textfield-focus .mdui-textfield-floating-label.mdui-textfield-focus .mdui-textfield-label,.mdui-theme-accent-pink.mdui-theme-layout-dark .mdui-textfield-focus .mdui-textfield-label{color:#ff4081}.mdui-theme-accent-purple .mdui-textfield-focus .mdui-textfield-input{border-bottom-color:#a0f;-webkit-box-shadow:0 1px 0 0 #a0f;box-shadow:0 1px 0 0 #a0f}.mdui-theme-accent-purple .mdui-textfield-focus .mdui-icon,.mdui-theme-accent-purple .mdui-textfield-focus .mdui-textfield-floating-label.mdui-textfield-focus .mdui-textfield-label,.mdui-theme-accent-purple .mdui-textfield-focus .mdui-textfield-label{color:rgba(170,0,255,.87)}.mdui-theme-accent-purple.mdui-theme-layout-dark .mdui-textfield-focus .mdui-textfield-input{border-bottom-color:#e040fb;-webkit-box-shadow:0 1px 0 0 #e040fb;box-shadow:0 1px 0 0 #e040fb}.mdui-theme-accent-purple.mdui-theme-layout-dark .mdui-textfield-focus .mdui-icon,.mdui-theme-accent-purple.mdui-theme-layout-dark .mdui-textfield-focus .mdui-textfield-floating-label.mdui-textfield-focus .mdui-textfield-label,.mdui-theme-accent-purple.mdui-theme-layout-dark .mdui-textfield-focus .mdui-textfield-label{color:#e040fb}.mdui-theme-accent-red .mdui-textfield-focus .mdui-textfield-input{border-bottom-color:#d50000;-webkit-box-shadow:0 1px 0 0 #d50000;box-shadow:0 1px 0 0 #d50000}.mdui-theme-accent-red .mdui-textfield-focus .mdui-icon,.mdui-theme-accent-red .mdui-textfield-focus .mdui-textfield-floating-label.mdui-textfield-focus .mdui-textfield-label,.mdui-theme-accent-red .mdui-textfield-focus .mdui-textfield-label{color:rgba(213,0,0,.87)}.mdui-theme-accent-red.mdui-theme-layout-dark .mdui-textfield-focus .mdui-textfield-input{border-bottom-color:#ff5252;-webkit-box-shadow:0 1px 0 0 #ff5252;box-shadow:0 1px 0 0 #ff5252}.mdui-theme-accent-red.mdui-theme-layout-dark .mdui-textfield-focus .mdui-icon,.mdui-theme-accent-red.mdui-theme-layout-dark .mdui-textfield-focus .mdui-textfield-floating-label.mdui-textfield-focus .mdui-textfield-label,.mdui-theme-accent-red.mdui-theme-layout-dark .mdui-textfield-focus .mdui-textfield-label{color:#ff5252}.mdui-theme-accent-teal .mdui-textfield-focus .mdui-textfield-input{border-bottom-color:#00bfa5;-webkit-box-shadow:0 1px 0 0 #00bfa5;box-shadow:0 1px 0 0 #00bfa5}.mdui-theme-accent-teal .mdui-textfield-focus .mdui-icon,.mdui-theme-accent-teal .mdui-textfield-focus .mdui-textfield-floating-label.mdui-textfield-focus .mdui-textfield-label,.mdui-theme-accent-teal .mdui-textfield-focus .mdui-textfield-label{color:rgba(0,191,165,.87)}.mdui-theme-accent-teal.mdui-theme-layout-dark .mdui-textfield-focus .mdui-textfield-input{border-bottom-color:#64ffda;-webkit-box-shadow:0 1px 0 0 #64ffda;box-shadow:0 1px 0 0 #64ffda}.mdui-theme-accent-teal.mdui-theme-layout-dark .mdui-textfield-focus .mdui-icon,.mdui-theme-accent-teal.mdui-theme-layout-dark .mdui-textfield-focus .mdui-textfield-floating-label.mdui-textfield-focus .mdui-textfield-label,.mdui-theme-accent-teal.mdui-theme-layout-dark .mdui-textfield-focus .mdui-textfield-label{color:#64ffda}.mdui-theme-accent-yellow .mdui-textfield-focus .mdui-textfield-input{border-bottom-color:#ffd600;-webkit-box-shadow:0 1px 0 0 #ffd600;box-shadow:0 1px 0 0 #ffd600}.mdui-theme-accent-yellow .mdui-textfield-focus .mdui-icon,.mdui-theme-accent-yellow .mdui-textfield-focus .mdui-textfield-floating-label.mdui-textfield-focus .mdui-textfield-label,.mdui-theme-accent-yellow .mdui-textfield-focus .mdui-textfield-label{color:rgba(255,214,0,.87)}.mdui-theme-accent-yellow.mdui-theme-layout-dark .mdui-textfield-focus .mdui-textfield-input{border-bottom-color:#ff0;-webkit-box-shadow:0 1px 0 0 #ff0;box-shadow:0 1px 0 0 #ff0}.mdui-theme-accent-yellow.mdui-theme-layout-dark .mdui-textfield-focus .mdui-icon,.mdui-theme-accent-yellow.mdui-theme-layout-dark .mdui-textfield-focus .mdui-textfield-floating-label.mdui-textfield-focus .mdui-textfield-label,.mdui-theme-accent-yellow.mdui-theme-layout-dark .mdui-textfield-focus .mdui-textfield-label{color:#ff0}.mdui-checkbox{position:relative;display:inline-block;height:36px;padding-left:36px;line-height:36px;cursor:pointer;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.mdui-checkbox input{position:absolute;width:0;height:0;overflow:hidden;visibility:hidden}.mdui-checkbox-icon{position:absolute;top:9px;left:0;display:inline-block;width:18px;height:18px;vertical-align:middle;background-color:transparent;border:none;border-radius:18px;-webkit-transition:-webkit-box-shadow .14s cubic-bezier(.4,0,.2,1);transition:-webkit-box-shadow .14s cubic-bezier(.4,0,.2,1);transition:box-shadow .14s cubic-bezier(.4,0,.2,1);transition:box-shadow .14s cubic-bezier(.4,0,.2,1),-webkit-box-shadow .14s cubic-bezier(.4,0,.2,1)}.mdui-checkbox-icon:after{position:absolute;top:0;left:0;z-index:0;width:18px;height:18px;-webkit-box-sizing:border-box;box-sizing:border-box;content:' ';border:2px solid rgba(0,0,0,.54);border-radius:2px;-webkit-transition:all .3s cubic-bezier(.4,0,.2,1);transition:all .3s cubic-bezier(.4,0,.2,1)}.mdui-checkbox-icon:before{position:absolute;top:2px;left:0;z-index:1;width:8px;height:13px;-webkit-box-sizing:border-box;box-sizing:border-box;content:' ';border-right:2px solid #fff;border-bottom:2px solid #fff;opacity:0;-webkit-transition:all .3s cubic-bezier(.4,0,.2,1);transition:all .3s cubic-bezier(.4,0,.2,1);-webkit-transform:rotateZ(37deg) scale(0);transform:rotateZ(37deg) scale(0);-webkit-transform-origin:100% 100%;transform-origin:100% 100%}.mdui-checkbox input[type=checkbox]:checked+.mdui-checkbox-icon:after{background-color:#ff4081;border-color:#ff4081}.mdui-checkbox input[type=checkbox]:checked+.mdui-checkbox-icon:before{opacity:1;-webkit-transform:rotateZ(37deg) scale(1);transform:rotateZ(37deg) scale(1)}.mdui-checkbox input[type=checkbox]:disabled+.mdui-checkbox-icon:after{border-color:rgba(0,0,0,.26)}.mdui-checkbox input[type=checkbox]:disabled:checked+.mdui-checkbox-icon:after{background-color:rgba(0,0,0,.26)!important;border-color:transparent!important}.mdui-checkbox:active input[type=checkbox]+.mdui-checkbox-icon{-webkit-box-shadow:0 0 0 15px rgba(0,0,0,.1);box-shadow:0 0 0 15px rgba(0,0,0,.1)}.mdui-checkbox:active input[type=checkbox]:checked:not(:disabled)+.mdui-checkbox-icon{-webkit-box-shadow:0 0 0 15px rgba(255,64,129,.16);box-shadow:0 0 0 15px rgba(255,64,129,.16)}.mdui-theme-accent-amber .mdui-checkbox input[type=checkbox]:checked+.mdui-checkbox-icon:after{background-color:#ffd740;border-color:#ffd740}.mdui-theme-accent-amber .mdui-checkbox:active input[type=checkbox]:checked:not(:disabled)+.mdui-checkbox-icon{-webkit-box-shadow:0 0 0 15px rgba(255,215,64,.16);box-shadow:0 0 0 15px rgba(255,215,64,.16)}.mdui-theme-accent-blue .mdui-checkbox input[type=checkbox]:checked+.mdui-checkbox-icon:after{background-color:#448aff;border-color:#448aff}.mdui-theme-accent-blue .mdui-checkbox:active input[type=checkbox]:checked:not(:disabled)+.mdui-checkbox-icon{-webkit-box-shadow:0 0 0 15px rgba(68,138,255,.16);box-shadow:0 0 0 15px rgba(68,138,255,.16)}.mdui-theme-accent-cyan .mdui-checkbox input[type=checkbox]:checked+.mdui-checkbox-icon:after{background-color:#18ffff;border-color:#18ffff}.mdui-theme-accent-cyan .mdui-checkbox:active input[type=checkbox]:checked:not(:disabled)+.mdui-checkbox-icon{-webkit-box-shadow:0 0 0 15px rgba(24,255,255,.16);box-shadow:0 0 0 15px rgba(24,255,255,.16)}.mdui-theme-accent-deep-orange .mdui-checkbox input[type=checkbox]:checked+.mdui-checkbox-icon:after{background-color:#ff6e40;border-color:#ff6e40}.mdui-theme-accent-deep-orange .mdui-checkbox:active input[type=checkbox]:checked:not(:disabled)+.mdui-checkbox-icon{-webkit-box-shadow:0 0 0 15px rgba(255,110,64,.16);box-shadow:0 0 0 15px rgba(255,110,64,.16)}.mdui-theme-accent-deep-purple .mdui-checkbox input[type=checkbox]:checked+.mdui-checkbox-icon:after{background-color:#7c4dff;border-color:#7c4dff}.mdui-theme-accent-deep-purple .mdui-checkbox:active input[type=checkbox]:checked:not(:disabled)+.mdui-checkbox-icon{-webkit-box-shadow:0 0 0 15px rgba(124,77,255,.16);box-shadow:0 0 0 15px rgba(124,77,255,.16)}.mdui-theme-accent-green .mdui-checkbox input[type=checkbox]:checked+.mdui-checkbox-icon:after{background-color:#69f0ae;border-color:#69f0ae}.mdui-theme-accent-green .mdui-checkbox:active input[type=checkbox]:checked:not(:disabled)+.mdui-checkbox-icon{-webkit-box-shadow:0 0 0 15px rgba(105,240,174,.16);box-shadow:0 0 0 15px rgba(105,240,174,.16)}.mdui-theme-accent-indigo .mdui-checkbox input[type=checkbox]:checked+.mdui-checkbox-icon:after{background-color:#536dfe;border-color:#536dfe}.mdui-theme-accent-indigo .mdui-checkbox:active input[type=checkbox]:checked:not(:disabled)+.mdui-checkbox-icon{-webkit-box-shadow:0 0 0 15px rgba(83,109,254,.16);box-shadow:0 0 0 15px rgba(83,109,254,.16)}.mdui-theme-accent-light-blue .mdui-checkbox input[type=checkbox]:checked+.mdui-checkbox-icon:after{background-color:#40c4ff;border-color:#40c4ff}.mdui-theme-accent-light-blue .mdui-checkbox:active input[type=checkbox]:checked:not(:disabled)+.mdui-checkbox-icon{-webkit-box-shadow:0 0 0 15px rgba(64,196,255,.16);box-shadow:0 0 0 15px rgba(64,196,255,.16)}.mdui-theme-accent-light-green .mdui-checkbox input[type=checkbox]:checked+.mdui-checkbox-icon:after{background-color:#b2ff59;border-color:#b2ff59}.mdui-theme-accent-light-green .mdui-checkbox:active input[type=checkbox]:checked:not(:disabled)+.mdui-checkbox-icon{-webkit-box-shadow:0 0 0 15px rgba(178,255,89,.16);box-shadow:0 0 0 15px rgba(178,255,89,.16)}.mdui-theme-accent-lime .mdui-checkbox input[type=checkbox]:checked+.mdui-checkbox-icon:after{background-color:#eeff41;border-color:#eeff41}.mdui-theme-accent-lime .mdui-checkbox:active input[type=checkbox]:checked:not(:disabled)+.mdui-checkbox-icon{-webkit-box-shadow:0 0 0 15px rgba(238,255,65,.16);box-shadow:0 0 0 15px rgba(238,255,65,.16)}.mdui-theme-accent-orange .mdui-checkbox input[type=checkbox]:checked+.mdui-checkbox-icon:after{background-color:#ffab40;border-color:#ffab40}.mdui-theme-accent-orange .mdui-checkbox:active input[type=checkbox]:checked:not(:disabled)+.mdui-checkbox-icon{-webkit-box-shadow:0 0 0 15px rgba(255,171,64,.16);box-shadow:0 0 0 15px rgba(255,171,64,.16)}.mdui-theme-accent-pink .mdui-checkbox input[type=checkbox]:checked+.mdui-checkbox-icon:after{background-color:#ff4081;border-color:#ff4081}.mdui-theme-accent-pink .mdui-checkbox:active input[type=checkbox]:checked:not(:disabled)+.mdui-checkbox-icon{-webkit-box-shadow:0 0 0 15px rgba(255,64,129,.16);box-shadow:0 0 0 15px rgba(255,64,129,.16)}.mdui-theme-accent-purple .mdui-checkbox input[type=checkbox]:checked+.mdui-checkbox-icon:after{background-color:#e040fb;border-color:#e040fb}.mdui-theme-accent-purple .mdui-checkbox:active input[type=checkbox]:checked:not(:disabled)+.mdui-checkbox-icon{-webkit-box-shadow:0 0 0 15px rgba(224,64,251,.16);box-shadow:0 0 0 15px rgba(224,64,251,.16)}.mdui-theme-accent-red .mdui-checkbox input[type=checkbox]:checked+.mdui-checkbox-icon:after{background-color:#ff5252;border-color:#ff5252}.mdui-theme-accent-red .mdui-checkbox:active input[type=checkbox]:checked:not(:disabled)+.mdui-checkbox-icon{-webkit-box-shadow:0 0 0 15px rgba(255,82,82,.16);box-shadow:0 0 0 15px rgba(255,82,82,.16)}.mdui-theme-accent-teal .mdui-checkbox input[type=checkbox]:checked+.mdui-checkbox-icon:after{background-color:#64ffda;border-color:#64ffda}.mdui-theme-accent-teal .mdui-checkbox:active input[type=checkbox]:checked:not(:disabled)+.mdui-checkbox-icon{-webkit-box-shadow:0 0 0 15px rgba(100,255,218,.16);box-shadow:0 0 0 15px rgba(100,255,218,.16)}.mdui-theme-accent-yellow .mdui-checkbox input[type=checkbox]:checked+.mdui-checkbox-icon:after{background-color:#ff0;border-color:#ff0}.mdui-theme-accent-yellow .mdui-checkbox:active input[type=checkbox]:checked:not(:disabled)+.mdui-checkbox-icon{-webkit-box-shadow:0 0 0 15px rgba(255,255,0,.16);box-shadow:0 0 0 15px rgba(255,255,0,.16)}.mdui-theme-layout-dark .mdui-checkbox-icon:after{border-color:rgba(255,255,255,.7)}.mdui-theme-layout-dark .mdui-checkbox-icon:before{border-right-color:#303030;border-bottom-color:#303030}.mdui-theme-layout-dark .mdui-checkbox input[type=checkbox]:disabled+.mdui-checkbox-icon:after{border-color:rgba(255,255,255,.3)}.mdui-theme-layout-dark .mdui-checkbox input[type=checkbox]:disabled:checked+.mdui-checkbox-icon:after{background-color:rgba(255,255,255,.3)!important;border-color:transparent!important}.mdui-theme-layout-dark .mdui-checkbox:active input[type=checkbox]+.mdui-checkbox-icon{-webkit-box-shadow:0 0 0 15px rgba(255,255,255,.1);box-shadow:0 0 0 15px rgba(255,255,255,.1)}.mdui-radio{position:relative;display:inline-block;height:36px;padding-left:36px;line-height:36px;cursor:pointer;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.mdui-radio input{position:absolute;width:0;height:0;overflow:hidden;visibility:hidden}.mdui-radio-icon{position:absolute;top:9px;left:0;display:inline-block;width:18px;height:18px;-webkit-box-sizing:border-box;box-sizing:border-box;vertical-align:middle;border:2px solid rgba(0,0,0,.54);border-radius:18px;-webkit-transition:all .3s cubic-bezier(.4,0,.2,1),-webkit-box-shadow .14s cubic-bezier(.4,0,.2,1);transition:all .3s cubic-bezier(.4,0,.2,1),-webkit-box-shadow .14s cubic-bezier(.4,0,.2,1);transition:all .3s cubic-bezier(.4,0,.2,1),box-shadow .14s cubic-bezier(.4,0,.2,1);transition:all .3s cubic-bezier(.4,0,.2,1),box-shadow .14s cubic-bezier(.4,0,.2,1),-webkit-box-shadow .14s cubic-bezier(.4,0,.2,1)}.mdui-radio-icon:before{position:absolute;top:0;left:0;width:14px;height:14px;content:' ';background-color:#ff4081;border-radius:14px;opacity:0;-webkit-transition:all .3s cubic-bezier(.4,0,.2,1);transition:all .3s cubic-bezier(.4,0,.2,1);-webkit-transform:scale(0);transform:scale(0)}.mdui-radio input[type=radio]:checked+.mdui-radio-icon{border-color:#ff4081}.mdui-radio input[type=radio]:checked+.mdui-radio-icon:before{opacity:1;-webkit-transform:scale(.68);transform:scale(.68)}.mdui-radio input[type=radio]:disabled+.mdui-radio-icon{border-color:rgba(0,0,0,.26)!important}.mdui-radio input[type=radio]:disabled:checked+.mdui-radio-icon:before{background-color:rgba(0,0,0,.26)!important}.mdui-radio:active input[type=radio]+.mdui-radio-icon{-webkit-box-shadow:0 0 0 15px rgba(0,0,0,.1);box-shadow:0 0 0 15px rgba(0,0,0,.1)}.mdui-radio:active input[type=radio]:checked:not(:disabled)+.mdui-radio-icon{-webkit-box-shadow:0 0 0 15px rgba(255,64,129,.16);box-shadow:0 0 0 15px rgba(255,64,129,.16)}.mdui-theme-accent-amber .mdui-radio input[type=radio]:checked+.mdui-radio-icon{border-color:#ffd740}.mdui-theme-accent-amber .mdui-radio input[type=radio]:checked+.mdui-radio-icon:before{background-color:#ffd740}.mdui-theme-accent-amber .mdui-radio:active input[type=radio]:checked:not(:disabled)+.mdui-radio-icon{-webkit-box-shadow:0 0 0 15px rgba(255,215,64,.16);box-shadow:0 0 0 15px rgba(255,215,64,.16)}.mdui-theme-accent-blue .mdui-radio input[type=radio]:checked+.mdui-radio-icon{border-color:#448aff}.mdui-theme-accent-blue .mdui-radio input[type=radio]:checked+.mdui-radio-icon:before{background-color:#448aff}.mdui-theme-accent-blue .mdui-radio:active input[type=radio]:checked:not(:disabled)+.mdui-radio-icon{-webkit-box-shadow:0 0 0 15px rgba(68,138,255,.16);box-shadow:0 0 0 15px rgba(68,138,255,.16)}.mdui-theme-accent-cyan .mdui-radio input[type=radio]:checked+.mdui-radio-icon{border-color:#18ffff}.mdui-theme-accent-cyan .mdui-radio input[type=radio]:checked+.mdui-radio-icon:before{background-color:#18ffff}.mdui-theme-accent-cyan .mdui-radio:active input[type=radio]:checked:not(:disabled)+.mdui-radio-icon{-webkit-box-shadow:0 0 0 15px rgba(24,255,255,.16);box-shadow:0 0 0 15px rgba(24,255,255,.16)}.mdui-theme-accent-deep-orange .mdui-radio input[type=radio]:checked+.mdui-radio-icon{border-color:#ff6e40}.mdui-theme-accent-deep-orange .mdui-radio input[type=radio]:checked+.mdui-radio-icon:before{background-color:#ff6e40}.mdui-theme-accent-deep-orange .mdui-radio:active input[type=radio]:checked:not(:disabled)+.mdui-radio-icon{-webkit-box-shadow:0 0 0 15px rgba(255,110,64,.16);box-shadow:0 0 0 15px rgba(255,110,64,.16)}.mdui-theme-accent-deep-purple .mdui-radio input[type=radio]:checked+.mdui-radio-icon{border-color:#7c4dff}.mdui-theme-accent-deep-purple .mdui-radio input[type=radio]:checked+.mdui-radio-icon:before{background-color:#7c4dff}.mdui-theme-accent-deep-purple .mdui-radio:active input[type=radio]:checked:not(:disabled)+.mdui-radio-icon{-webkit-box-shadow:0 0 0 15px rgba(124,77,255,.16);box-shadow:0 0 0 15px rgba(124,77,255,.16)}.mdui-theme-accent-green .mdui-radio input[type=radio]:checked+.mdui-radio-icon{border-color:#69f0ae}.mdui-theme-accent-green .mdui-radio input[type=radio]:checked+.mdui-radio-icon:before{background-color:#69f0ae}.mdui-theme-accent-green .mdui-radio:active input[type=radio]:checked:not(:disabled)+.mdui-radio-icon{-webkit-box-shadow:0 0 0 15px rgba(105,240,174,.16);box-shadow:0 0 0 15px rgba(105,240,174,.16)}.mdui-theme-accent-indigo .mdui-radio input[type=radio]:checked+.mdui-radio-icon{border-color:#536dfe}.mdui-theme-accent-indigo .mdui-radio input[type=radio]:checked+.mdui-radio-icon:before{background-color:#536dfe}.mdui-theme-accent-indigo .mdui-radio:active input[type=radio]:checked:not(:disabled)+.mdui-radio-icon{-webkit-box-shadow:0 0 0 15px rgba(83,109,254,.16);box-shadow:0 0 0 15px rgba(83,109,254,.16)}.mdui-theme-accent-light-blue .mdui-radio input[type=radio]:checked+.mdui-radio-icon{border-color:#40c4ff}.mdui-theme-accent-light-blue .mdui-radio input[type=radio]:checked+.mdui-radio-icon:before{background-color:#40c4ff}.mdui-theme-accent-light-blue .mdui-radio:active input[type=radio]:checked:not(:disabled)+.mdui-radio-icon{-webkit-box-shadow:0 0 0 15px rgba(64,196,255,.16);box-shadow:0 0 0 15px rgba(64,196,255,.16)}.mdui-theme-accent-light-green .mdui-radio input[type=radio]:checked+.mdui-radio-icon{border-color:#b2ff59}.mdui-theme-accent-light-green .mdui-radio input[type=radio]:checked+.mdui-radio-icon:before{background-color:#b2ff59}.mdui-theme-accent-light-green .mdui-radio:active input[type=radio]:checked:not(:disabled)+.mdui-radio-icon{-webkit-box-shadow:0 0 0 15px rgba(178,255,89,.16);box-shadow:0 0 0 15px rgba(178,255,89,.16)}.mdui-theme-accent-lime .mdui-radio input[type=radio]:checked+.mdui-radio-icon{border-color:#eeff41}.mdui-theme-accent-lime .mdui-radio input[type=radio]:checked+.mdui-radio-icon:before{background-color:#eeff41}.mdui-theme-accent-lime .mdui-radio:active input[type=radio]:checked:not(:disabled)+.mdui-radio-icon{-webkit-box-shadow:0 0 0 15px rgba(238,255,65,.16);box-shadow:0 0 0 15px rgba(238,255,65,.16)}.mdui-theme-accent-orange .mdui-radio input[type=radio]:checked+.mdui-radio-icon{border-color:#ffab40}.mdui-theme-accent-orange .mdui-radio input[type=radio]:checked+.mdui-radio-icon:before{background-color:#ffab40}.mdui-theme-accent-orange .mdui-radio:active input[type=radio]:checked:not(:disabled)+.mdui-radio-icon{-webkit-box-shadow:0 0 0 15px rgba(255,171,64,.16);box-shadow:0 0 0 15px rgba(255,171,64,.16)}.mdui-theme-accent-pink .mdui-radio input[type=radio]:checked+.mdui-radio-icon{border-color:#ff4081}.mdui-theme-accent-pink .mdui-radio input[type=radio]:checked+.mdui-radio-icon:before{background-color:#ff4081}.mdui-theme-accent-pink .mdui-radio:active input[type=radio]:checked:not(:disabled)+.mdui-radio-icon{-webkit-box-shadow:0 0 0 15px rgba(255,64,129,.16);box-shadow:0 0 0 15px rgba(255,64,129,.16)}.mdui-theme-accent-purple .mdui-radio input[type=radio]:checked+.mdui-radio-icon{border-color:#e040fb}.mdui-theme-accent-purple .mdui-radio input[type=radio]:checked+.mdui-radio-icon:before{background-color:#e040fb}.mdui-theme-accent-purple .mdui-radio:active input[type=radio]:checked:not(:disabled)+.mdui-radio-icon{-webkit-box-shadow:0 0 0 15px rgba(224,64,251,.16);box-shadow:0 0 0 15px rgba(224,64,251,.16)}.mdui-theme-accent-red .mdui-radio input[type=radio]:checked+.mdui-radio-icon{border-color:#ff5252}.mdui-theme-accent-red .mdui-radio input[type=radio]:checked+.mdui-radio-icon:before{background-color:#ff5252}.mdui-theme-accent-red .mdui-radio:active input[type=radio]:checked:not(:disabled)+.mdui-radio-icon{-webkit-box-shadow:0 0 0 15px rgba(255,82,82,.16);box-shadow:0 0 0 15px rgba(255,82,82,.16)}.mdui-theme-accent-teal .mdui-radio input[type=radio]:checked+.mdui-radio-icon{border-color:#64ffda}.mdui-theme-accent-teal .mdui-radio input[type=radio]:checked+.mdui-radio-icon:before{background-color:#64ffda}.mdui-theme-accent-teal .mdui-radio:active input[type=radio]:checked:not(:disabled)+.mdui-radio-icon{-webkit-box-shadow:0 0 0 15px rgba(100,255,218,.16);box-shadow:0 0 0 15px rgba(100,255,218,.16)}.mdui-theme-accent-yellow .mdui-radio input[type=radio]:checked+.mdui-radio-icon{border-color:#ff0}.mdui-theme-accent-yellow .mdui-radio input[type=radio]:checked+.mdui-radio-icon:before{background-color:#ff0}.mdui-theme-accent-yellow .mdui-radio:active input[type=radio]:checked:not(:disabled)+.mdui-radio-icon{-webkit-box-shadow:0 0 0 15px rgba(255,255,0,.16);box-shadow:0 0 0 15px rgba(255,255,0,.16)}.mdui-theme-layout-dark .mdui-radio-icon{border-color:rgba(255,255,255,.7)}.mdui-theme-layout-dark .mdui-radio input[type=radio]:disabled+.mdui-radio-icon{border-color:rgba(255,255,255,.3)!important}.mdui-theme-layout-dark .mdui-radio input[type=radio]:disabled:checked+.mdui-radio-icon:before{background-color:rgba(255,255,255,.3)!important}.mdui-theme-layout-dark .mdui-radio:active input[type=radio]+.mdui-radio-icon{-webkit-box-shadow:0 0 0 15px rgba(255,255,255,.1);box-shadow:0 0 0 15px rgba(255,255,255,.1)}.mdui-switch{display:inline-block;height:36px;line-height:36px;cursor:pointer;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.mdui-switch input{position:absolute;width:0;height:0;overflow:hidden;visibility:hidden}.mdui-switch-icon{position:relative;display:inline-block;width:36px;height:14px;vertical-align:middle;background-color:rgba(0,0,0,.38);border-radius:14px;-webkit-transition:background-color .3s cubic-bezier(.4,0,.2,1);transition:background-color .3s cubic-bezier(.4,0,.2,1)}.mdui-switch-icon:before{position:absolute;top:-3px;left:-3px;display:inline-block;width:20px;height:20px;content:' ';background-color:#fafafa;border-radius:20px;-webkit-box-shadow:0 2px 1px -1px rgba(0,0,0,.2),0 1px 1px 0 rgba(0,0,0,.14),0 1px 3px 0 rgba(0,0,0,.12);box-shadow:0 2px 1px -1px rgba(0,0,0,.2),0 1px 1px 0 rgba(0,0,0,.14),0 1px 3px 0 rgba(0,0,0,.12);-webkit-transition:background-color .3s cubic-bezier(.4,0,.2,1),left .3s cubic-bezier(.4,0,.2,1),-webkit-box-shadow .14s cubic-bezier(.4,0,.2,1);transition:background-color .3s cubic-bezier(.4,0,.2,1),left .3s cubic-bezier(.4,0,.2,1),-webkit-box-shadow .14s cubic-bezier(.4,0,.2,1);transition:box-shadow .14s cubic-bezier(.4,0,.2,1),background-color .3s cubic-bezier(.4,0,.2,1),left .3s cubic-bezier(.4,0,.2,1);transition:box-shadow .14s cubic-bezier(.4,0,.2,1),background-color .3s cubic-bezier(.4,0,.2,1),left .3s cubic-bezier(.4,0,.2,1),-webkit-box-shadow .14s cubic-bezier(.4,0,.2,1)}.mdui-switch input[type=checkbox]:checked+.mdui-switch-icon{background-color:rgba(255,64,129,.5)}.mdui-switch input[type=checkbox]:checked+.mdui-switch-icon:before{left:20px;background-color:#ff4081}.mdui-switch:active input[type=checkbox]+.mdui-switch-icon:before{-webkit-box-shadow:0 2px 1px -1px rgba(0,0,0,.2),0 1px 1px 0 rgba(0,0,0,.14),0 1px 3px 0 rgba(0,0,0,.12),0 0 0 15px rgba(0,0,0,.1);box-shadow:0 2px 1px -1px rgba(0,0,0,.2),0 1px 1px 0 rgba(0,0,0,.14),0 1px 3px 0 rgba(0,0,0,.12),0 0 0 15px rgba(0,0,0,.1)}.mdui-switch:active input[type=checkbox]:checked:not(:disabled)+.mdui-switch-icon:before{-webkit-box-shadow:0 2px 1px -1px rgba(0,0,0,.2),0 1px 1px 0 rgba(0,0,0,.14),0 1px 3px 0 rgba(0,0,0,.12),0 0 0 15px rgba(255,64,129,.16);box-shadow:0 2px 1px -1px rgba(0,0,0,.2),0 1px 1px 0 rgba(0,0,0,.14),0 1px 3px 0 rgba(0,0,0,.12),0 0 0 15px rgba(255,64,129,.16)}.mdui-switch input[type=checkbox]:disabled+.mdui-switch-icon{background-color:rgba(0,0,0,.12)!important}.mdui-switch input[type=checkbox]:disabled+.mdui-switch-icon:before{background-color:#bdbdbd!important}.mdui-theme-accent-amber .mdui-switch input[type=checkbox]:checked+.mdui-switch-icon{background-color:rgba(255,215,64,.5)}.mdui-theme-accent-amber .mdui-switch input[type=checkbox]:checked+.mdui-switch-icon:before{background-color:#ffd740}.mdui-theme-accent-amber .mdui-switch:active input[type=checkbox]:checked:not(:disabled)+.mdui-switch-icon:before{-webkit-box-shadow:0 2px 1px -1px rgba(0,0,0,.2),0 1px 1px 0 rgba(0,0,0,.14),0 1px 3px 0 rgba(0,0,0,.12),0 0 0 15px rgba(255,215,64,.16);box-shadow:0 2px 1px -1px rgba(0,0,0,.2),0 1px 1px 0 rgba(0,0,0,.14),0 1px 3px 0 rgba(0,0,0,.12),0 0 0 15px rgba(255,215,64,.16)}.mdui-theme-accent-blue .mdui-switch input[type=checkbox]:checked+.mdui-switch-icon{background-color:rgba(68,138,255,.5)}.mdui-theme-accent-blue .mdui-switch input[type=checkbox]:checked+.mdui-switch-icon:before{background-color:#448aff}.mdui-theme-accent-blue .mdui-switch:active input[type=checkbox]:checked:not(:disabled)+.mdui-switch-icon:before{-webkit-box-shadow:0 2px 1px -1px rgba(0,0,0,.2),0 1px 1px 0 rgba(0,0,0,.14),0 1px 3px 0 rgba(0,0,0,.12),0 0 0 15px rgba(68,138,255,.16);box-shadow:0 2px 1px -1px rgba(0,0,0,.2),0 1px 1px 0 rgba(0,0,0,.14),0 1px 3px 0 rgba(0,0,0,.12),0 0 0 15px rgba(68,138,255,.16)}.mdui-theme-accent-cyan .mdui-switch input[type=checkbox]:checked+.mdui-switch-icon{background-color:rgba(24,255,255,.5)}.mdui-theme-accent-cyan .mdui-switch input[type=checkbox]:checked+.mdui-switch-icon:before{background-color:#18ffff}.mdui-theme-accent-cyan .mdui-switch:active input[type=checkbox]:checked:not(:disabled)+.mdui-switch-icon:before{-webkit-box-shadow:0 2px 1px -1px rgba(0,0,0,.2),0 1px 1px 0 rgba(0,0,0,.14),0 1px 3px 0 rgba(0,0,0,.12),0 0 0 15px rgba(24,255,255,.16);box-shadow:0 2px 1px -1px rgba(0,0,0,.2),0 1px 1px 0 rgba(0,0,0,.14),0 1px 3px 0 rgba(0,0,0,.12),0 0 0 15px rgba(24,255,255,.16)}.mdui-theme-accent-deep-orange .mdui-switch input[type=checkbox]:checked+.mdui-switch-icon{background-color:rgba(255,110,64,.5)}.mdui-theme-accent-deep-orange .mdui-switch input[type=checkbox]:checked+.mdui-switch-icon:before{background-color:#ff6e40}.mdui-theme-accent-deep-orange .mdui-switch:active input[type=checkbox]:checked:not(:disabled)+.mdui-switch-icon:before{-webkit-box-shadow:0 2px 1px -1px rgba(0,0,0,.2),0 1px 1px 0 rgba(0,0,0,.14),0 1px 3px 0 rgba(0,0,0,.12),0 0 0 15px rgba(255,110,64,.16);box-shadow:0 2px 1px -1px rgba(0,0,0,.2),0 1px 1px 0 rgba(0,0,0,.14),0 1px 3px 0 rgba(0,0,0,.12),0 0 0 15px rgba(255,110,64,.16)}.mdui-theme-accent-deep-purple .mdui-switch input[type=checkbox]:checked+.mdui-switch-icon{background-color:rgba(124,77,255,.5)}.mdui-theme-accent-deep-purple .mdui-switch input[type=checkbox]:checked+.mdui-switch-icon:before{background-color:#7c4dff}.mdui-theme-accent-deep-purple .mdui-switch:active input[type=checkbox]:checked:not(:disabled)+.mdui-switch-icon:before{-webkit-box-shadow:0 2px 1px -1px rgba(0,0,0,.2),0 1px 1px 0 rgba(0,0,0,.14),0 1px 3px 0 rgba(0,0,0,.12),0 0 0 15px rgba(124,77,255,.16);box-shadow:0 2px 1px -1px rgba(0,0,0,.2),0 1px 1px 0 rgba(0,0,0,.14),0 1px 3px 0 rgba(0,0,0,.12),0 0 0 15px rgba(124,77,255,.16)}.mdui-theme-accent-green .mdui-switch input[type=checkbox]:checked+.mdui-switch-icon{background-color:rgba(105,240,174,.5)}.mdui-theme-accent-green .mdui-switch input[type=checkbox]:checked+.mdui-switch-icon:before{background-color:#69f0ae}.mdui-theme-accent-green .mdui-switch:active input[type=checkbox]:checked:not(:disabled)+.mdui-switch-icon:before{-webkit-box-shadow:0 2px 1px -1px rgba(0,0,0,.2),0 1px 1px 0 rgba(0,0,0,.14),0 1px 3px 0 rgba(0,0,0,.12),0 0 0 15px rgba(105,240,174,.16);box-shadow:0 2px 1px -1px rgba(0,0,0,.2),0 1px 1px 0 rgba(0,0,0,.14),0 1px 3px 0 rgba(0,0,0,.12),0 0 0 15px rgba(105,240,174,.16)}.mdui-theme-accent-indigo .mdui-switch input[type=checkbox]:checked+.mdui-switch-icon{background-color:rgba(83,109,254,.5)}.mdui-theme-accent-indigo .mdui-switch input[type=checkbox]:checked+.mdui-switch-icon:before{background-color:#536dfe}.mdui-theme-accent-indigo .mdui-switch:active input[type=checkbox]:checked:not(:disabled)+.mdui-switch-icon:before{-webkit-box-shadow:0 2px 1px -1px rgba(0,0,0,.2),0 1px 1px 0 rgba(0,0,0,.14),0 1px 3px 0 rgba(0,0,0,.12),0 0 0 15px rgba(83,109,254,.16);box-shadow:0 2px 1px -1px rgba(0,0,0,.2),0 1px 1px 0 rgba(0,0,0,.14),0 1px 3px 0 rgba(0,0,0,.12),0 0 0 15px rgba(83,109,254,.16)}.mdui-theme-accent-light-blue .mdui-switch input[type=checkbox]:checked+.mdui-switch-icon{background-color:rgba(64,196,255,.5)}.mdui-theme-accent-light-blue .mdui-switch input[type=checkbox]:checked+.mdui-switch-icon:before{background-color:#40c4ff}.mdui-theme-accent-light-blue .mdui-switch:active input[type=checkbox]:checked:not(:disabled)+.mdui-switch-icon:before{-webkit-box-shadow:0 2px 1px -1px rgba(0,0,0,.2),0 1px 1px 0 rgba(0,0,0,.14),0 1px 3px 0 rgba(0,0,0,.12),0 0 0 15px rgba(64,196,255,.16);box-shadow:0 2px 1px -1px rgba(0,0,0,.2),0 1px 1px 0 rgba(0,0,0,.14),0 1px 3px 0 rgba(0,0,0,.12),0 0 0 15px rgba(64,196,255,.16)}.mdui-theme-accent-light-green .mdui-switch input[type=checkbox]:checked+.mdui-switch-icon{background-color:rgba(178,255,89,.5)}.mdui-theme-accent-light-green .mdui-switch input[type=checkbox]:checked+.mdui-switch-icon:before{background-color:#b2ff59}.mdui-theme-accent-light-green .mdui-switch:active input[type=checkbox]:checked:not(:disabled)+.mdui-switch-icon:before{-webkit-box-shadow:0 2px 1px -1px rgba(0,0,0,.2),0 1px 1px 0 rgba(0,0,0,.14),0 1px 3px 0 rgba(0,0,0,.12),0 0 0 15px rgba(178,255,89,.16);box-shadow:0 2px 1px -1px rgba(0,0,0,.2),0 1px 1px 0 rgba(0,0,0,.14),0 1px 3px 0 rgba(0,0,0,.12),0 0 0 15px rgba(178,255,89,.16)}.mdui-theme-accent-lime .mdui-switch input[type=checkbox]:checked+.mdui-switch-icon{background-color:rgba(238,255,65,.5)}.mdui-theme-accent-lime .mdui-switch input[type=checkbox]:checked+.mdui-switch-icon:before{background-color:#eeff41}.mdui-theme-accent-lime .mdui-switch:active input[type=checkbox]:checked:not(:disabled)+.mdui-switch-icon:before{-webkit-box-shadow:0 2px 1px -1px rgba(0,0,0,.2),0 1px 1px 0 rgba(0,0,0,.14),0 1px 3px 0 rgba(0,0,0,.12),0 0 0 15px rgba(238,255,65,.16);box-shadow:0 2px 1px -1px rgba(0,0,0,.2),0 1px 1px 0 rgba(0,0,0,.14),0 1px 3px 0 rgba(0,0,0,.12),0 0 0 15px rgba(238,255,65,.16)}.mdui-theme-accent-orange .mdui-switch input[type=checkbox]:checked+.mdui-switch-icon{background-color:rgba(255,171,64,.5)}.mdui-theme-accent-orange .mdui-switch input[type=checkbox]:checked+.mdui-switch-icon:before{background-color:#ffab40}.mdui-theme-accent-orange .mdui-switch:active input[type=checkbox]:checked:not(:disabled)+.mdui-switch-icon:before{-webkit-box-shadow:0 2px 1px -1px rgba(0,0,0,.2),0 1px 1px 0 rgba(0,0,0,.14),0 1px 3px 0 rgba(0,0,0,.12),0 0 0 15px rgba(255,171,64,.16);box-shadow:0 2px 1px -1px rgba(0,0,0,.2),0 1px 1px 0 rgba(0,0,0,.14),0 1px 3px 0 rgba(0,0,0,.12),0 0 0 15px rgba(255,171,64,.16)}.mdui-theme-accent-pink .mdui-switch input[type=checkbox]:checked+.mdui-switch-icon{background-color:rgba(255,64,129,.5)}.mdui-theme-accent-pink .mdui-switch input[type=checkbox]:checked+.mdui-switch-icon:before{background-color:#ff4081}.mdui-theme-accent-pink .mdui-switch:active input[type=checkbox]:checked:not(:disabled)+.mdui-switch-icon:before{-webkit-box-shadow:0 2px 1px -1px rgba(0,0,0,.2),0 1px 1px 0 rgba(0,0,0,.14),0 1px 3px 0 rgba(0,0,0,.12),0 0 0 15px rgba(255,64,129,.16);box-shadow:0 2px 1px -1px rgba(0,0,0,.2),0 1px 1px 0 rgba(0,0,0,.14),0 1px 3px 0 rgba(0,0,0,.12),0 0 0 15px rgba(255,64,129,.16)}.mdui-theme-accent-purple .mdui-switch input[type=checkbox]:checked+.mdui-switch-icon{background-color:rgba(224,64,251,.5)}.mdui-theme-accent-purple .mdui-switch input[type=checkbox]:checked+.mdui-switch-icon:before{background-color:#e040fb}.mdui-theme-accent-purple .mdui-switch:active input[type=checkbox]:checked:not(:disabled)+.mdui-switch-icon:before{-webkit-box-shadow:0 2px 1px -1px rgba(0,0,0,.2),0 1px 1px 0 rgba(0,0,0,.14),0 1px 3px 0 rgba(0,0,0,.12),0 0 0 15px rgba(224,64,251,.16);box-shadow:0 2px 1px -1px rgba(0,0,0,.2),0 1px 1px 0 rgba(0,0,0,.14),0 1px 3px 0 rgba(0,0,0,.12),0 0 0 15px rgba(224,64,251,.16)}.mdui-theme-accent-red .mdui-switch input[type=checkbox]:checked+.mdui-switch-icon{background-color:rgba(255,82,82,.5)}.mdui-theme-accent-red .mdui-switch input[type=checkbox]:checked+.mdui-switch-icon:before{background-color:#ff5252}.mdui-theme-accent-red .mdui-switch:active input[type=checkbox]:checked:not(:disabled)+.mdui-switch-icon:before{-webkit-box-shadow:0 2px 1px -1px rgba(0,0,0,.2),0 1px 1px 0 rgba(0,0,0,.14),0 1px 3px 0 rgba(0,0,0,.12),0 0 0 15px rgba(255,82,82,.16);box-shadow:0 2px 1px -1px rgba(0,0,0,.2),0 1px 1px 0 rgba(0,0,0,.14),0 1px 3px 0 rgba(0,0,0,.12),0 0 0 15px rgba(255,82,82,.16)}.mdui-theme-accent-teal .mdui-switch input[type=checkbox]:checked+.mdui-switch-icon{background-color:rgba(100,255,218,.5)}.mdui-theme-accent-teal .mdui-switch input[type=checkbox]:checked+.mdui-switch-icon:before{background-color:#64ffda}.mdui-theme-accent-teal .mdui-switch:active input[type=checkbox]:checked:not(:disabled)+.mdui-switch-icon:before{-webkit-box-shadow:0 2px 1px -1px rgba(0,0,0,.2),0 1px 1px 0 rgba(0,0,0,.14),0 1px 3px 0 rgba(0,0,0,.12),0 0 0 15px rgba(100,255,218,.16);box-shadow:0 2px 1px -1px rgba(0,0,0,.2),0 1px 1px 0 rgba(0,0,0,.14),0 1px 3px 0 rgba(0,0,0,.12),0 0 0 15px rgba(100,255,218,.16)}.mdui-theme-accent-yellow .mdui-switch input[type=checkbox]:checked+.mdui-switch-icon{background-color:rgba(255,255,0,.5)}.mdui-theme-accent-yellow .mdui-switch input[type=checkbox]:checked+.mdui-switch-icon:before{background-color:#ff0}.mdui-theme-accent-yellow .mdui-switch:active input[type=checkbox]:checked:not(:disabled)+.mdui-switch-icon:before{-webkit-box-shadow:0 2px 1px -1px rgba(0,0,0,.2),0 1px 1px 0 rgba(0,0,0,.14),0 1px 3px 0 rgba(0,0,0,.12),0 0 0 15px rgba(255,255,0,.16);box-shadow:0 2px 1px -1px rgba(0,0,0,.2),0 1px 1px 0 rgba(0,0,0,.14),0 1px 3px 0 rgba(0,0,0,.12),0 0 0 15px rgba(255,255,0,.16)}.mdui-theme-layout-dark .mdui-switch-icon{background-color:rgba(255,255,255,.3)}.mdui-theme-layout-dark .mdui-switch-icon:before{background-color:#bdbdbd}.mdui-theme-layout-dark.mdui-theme-accent-amber .mdui-switch input[type=checkbox]:checked+.mdui-switch-icon{background-color:rgba(255,229,127,.5)}.mdui-theme-layout-dark.mdui-theme-accent-amber .mdui-switch input[type=checkbox]:checked+.mdui-switch-icon:before{background-color:#ffe57f}.mdui-theme-layout-dark.mdui-theme-accent-blue .mdui-switch input[type=checkbox]:checked+.mdui-switch-icon{background-color:rgba(130,177,255,.5)}.mdui-theme-layout-dark.mdui-theme-accent-blue .mdui-switch input[type=checkbox]:checked+.mdui-switch-icon:before{background-color:#82b1ff}.mdui-theme-layout-dark.mdui-theme-accent-cyan .mdui-switch input[type=checkbox]:checked+.mdui-switch-icon{background-color:rgba(132,255,255,.5)}.mdui-theme-layout-dark.mdui-theme-accent-cyan .mdui-switch input[type=checkbox]:checked+.mdui-switch-icon:before{background-color:#84ffff}.mdui-theme-layout-dark.mdui-theme-accent-deep-orange .mdui-switch input[type=checkbox]:checked+.mdui-switch-icon{background-color:rgba(255,158,128,.5)}.mdui-theme-layout-dark.mdui-theme-accent-deep-orange .mdui-switch input[type=checkbox]:checked+.mdui-switch-icon:before{background-color:#ff9e80}.mdui-theme-layout-dark.mdui-theme-accent-deep-purple .mdui-switch input[type=checkbox]:checked+.mdui-switch-icon{background-color:rgba(179,136,255,.5)}.mdui-theme-layout-dark.mdui-theme-accent-deep-purple .mdui-switch input[type=checkbox]:checked+.mdui-switch-icon:before{background-color:#b388ff}.mdui-theme-layout-dark.mdui-theme-accent-green .mdui-switch input[type=checkbox]:checked+.mdui-switch-icon{background-color:rgba(185,246,202,.5)}.mdui-theme-layout-dark.mdui-theme-accent-green .mdui-switch input[type=checkbox]:checked+.mdui-switch-icon:before{background-color:#b9f6ca}.mdui-theme-layout-dark.mdui-theme-accent-indigo .mdui-switch input[type=checkbox]:checked+.mdui-switch-icon{background-color:rgba(140,158,255,.5)}.mdui-theme-layout-dark.mdui-theme-accent-indigo .mdui-switch input[type=checkbox]:checked+.mdui-switch-icon:before{background-color:#8c9eff}.mdui-theme-layout-dark.mdui-theme-accent-light-blue .mdui-switch input[type=checkbox]:checked+.mdui-switch-icon{background-color:rgba(128,216,255,.5)}.mdui-theme-layout-dark.mdui-theme-accent-light-blue .mdui-switch input[type=checkbox]:checked+.mdui-switch-icon:before{background-color:#80d8ff}.mdui-theme-layout-dark.mdui-theme-accent-light-green .mdui-switch input[type=checkbox]:checked+.mdui-switch-icon{background-color:rgba(204,255,144,.5)}.mdui-theme-layout-dark.mdui-theme-accent-light-green .mdui-switch input[type=checkbox]:checked+.mdui-switch-icon:before{background-color:#ccff90}.mdui-theme-layout-dark.mdui-theme-accent-lime .mdui-switch input[type=checkbox]:checked+.mdui-switch-icon{background-color:rgba(244,255,129,.5)}.mdui-theme-layout-dark.mdui-theme-accent-lime .mdui-switch input[type=checkbox]:checked+.mdui-switch-icon:before{background-color:#f4ff81}.mdui-theme-layout-dark.mdui-theme-accent-orange .mdui-switch input[type=checkbox]:checked+.mdui-switch-icon{background-color:rgba(255,209,128,.5)}.mdui-theme-layout-dark.mdui-theme-accent-orange .mdui-switch input[type=checkbox]:checked+.mdui-switch-icon:before{background-color:#ffd180}.mdui-theme-layout-dark.mdui-theme-accent-pink .mdui-switch input[type=checkbox]:checked+.mdui-switch-icon{background-color:rgba(255,128,171,.5)}.mdui-theme-layout-dark.mdui-theme-accent-pink .mdui-switch input[type=checkbox]:checked+.mdui-switch-icon:before{background-color:#ff80ab}.mdui-theme-layout-dark.mdui-theme-accent-purple .mdui-switch input[type=checkbox]:checked+.mdui-switch-icon{background-color:rgba(234,128,252,.5)}.mdui-theme-layout-dark.mdui-theme-accent-purple .mdui-switch input[type=checkbox]:checked+.mdui-switch-icon:before{background-color:#ea80fc}.mdui-theme-layout-dark.mdui-theme-accent-red .mdui-switch input[type=checkbox]:checked+.mdui-switch-icon{background-color:rgba(255,138,128,.5)}.mdui-theme-layout-dark.mdui-theme-accent-red .mdui-switch input[type=checkbox]:checked+.mdui-switch-icon:before{background-color:#ff8a80}.mdui-theme-layout-dark.mdui-theme-accent-teal .mdui-switch input[type=checkbox]:checked+.mdui-switch-icon{background-color:rgba(167,255,235,.5)}.mdui-theme-layout-dark.mdui-theme-accent-teal .mdui-switch input[type=checkbox]:checked+.mdui-switch-icon:before{background-color:#a7ffeb}.mdui-theme-layout-dark.mdui-theme-accent-yellow .mdui-switch input[type=checkbox]:checked+.mdui-switch-icon{background-color:rgba(255,255,141,.5)}.mdui-theme-layout-dark.mdui-theme-accent-yellow .mdui-switch input[type=checkbox]:checked+.mdui-switch-icon:before{background-color:#ffff8d}.mdui-theme-layout-dark .mdui-switch:active input[type=checkbox]+.mdui-switch-icon:before{-webkit-box-shadow:0 2px 1px -1px rgba(0,0,0,.2),0 1px 1px 0 rgba(0,0,0,.14),0 1px 3px 0 rgba(0,0,0,.12),0 0 0 15px rgba(255,255,255,.1);box-shadow:0 2px 1px -1px rgba(0,0,0,.2),0 1px 1px 0 rgba(0,0,0,.14),0 1px 3px 0 rgba(0,0,0,.12),0 0 0 15px rgba(255,255,255,.1)}.mdui-theme-layout-dark .mdui-switch input[type=checkbox]:disabled+.mdui-switch-icon{background-color:rgba(255,255,255,.1)!important}.mdui-theme-layout-dark .mdui-switch input[type=checkbox]:disabled+.mdui-switch-icon:before{background-color:#424242!important}.mdui-slider{position:relative;display:block;width:100%;height:36px}.mdui-slider input[type=range]{position:absolute;top:50%;z-index:2;width:100%;height:20px;-webkit-appearance:none;margin-top:-10px;cursor:pointer;opacity:0;-moz-appearance:none;appearance:none}.mdui-slider-fill,.mdui-slider-track{position:absolute;top:50%;height:2px;-webkit-box-sizing:border-box;box-sizing:border-box;margin-top:-1px}.mdui-slider-fill:before,.mdui-slider-track:before{display:block;width:100%;height:100%;content:' '}.mdui-slider-track{right:0}.mdui-slider-track:before{background-color:#bdbdbd;-webkit-transition:background-color .3s cubic-bezier(.4,0,.2,1);transition:background-color .3s cubic-bezier(.4,0,.2,1)}.mdui-slider-fill{left:0}.mdui-slider-fill:before{background-color:#ff4081}.mdui-slider-thumb{position:absolute;top:50%;width:12px;height:12px;-webkit-box-sizing:border-box;box-sizing:border-box;margin-top:-6px;background-color:#ff4081;border:2px solid #ff4081;border-radius:50%;-webkit-transition:background .45s cubic-bezier(.4,0,.2,1),border-color .45s cubic-bezier(.4,0,.2,1),border-radius .2s cubic-bezier(.4,0,.2,1),-webkit-transform .2s cubic-bezier(.4,0,.2,1);transition:background .45s cubic-bezier(.4,0,.2,1),border-color .45s cubic-bezier(.4,0,.2,1),border-radius .2s cubic-bezier(.4,0,.2,1),-webkit-transform .2s cubic-bezier(.4,0,.2,1);transition:background .45s cubic-bezier(.4,0,.2,1),border-color .45s cubic-bezier(.4,0,.2,1),transform .2s cubic-bezier(.4,0,.2,1),border-radius .2s cubic-bezier(.4,0,.2,1);transition:background .45s cubic-bezier(.4,0,.2,1),border-color .45s cubic-bezier(.4,0,.2,1),transform .2s cubic-bezier(.4,0,.2,1),border-radius .2s cubic-bezier(.4,0,.2,1),-webkit-transform .2s cubic-bezier(.4,0,.2,1);-webkit-transform:translate(-50%);transform:translate(-50%);will-change:background,border-color,transform,border-radius}.mdui-theme-accent-amber .mdui-slider-fill:before{background-color:#ffd740}.mdui-theme-accent-amber .mdui-slider-thumb{background-color:#ffd740;border:2px solid #ffd740}.mdui-theme-accent-blue .mdui-slider-fill:before{background-color:#448aff}.mdui-theme-accent-blue .mdui-slider-thumb{background-color:#448aff;border:2px solid #448aff}.mdui-theme-accent-cyan .mdui-slider-fill:before{background-color:#18ffff}.mdui-theme-accent-cyan .mdui-slider-thumb{background-color:#18ffff;border:2px solid #18ffff}.mdui-theme-accent-deep-orange .mdui-slider-fill:before{background-color:#ff6e40}.mdui-theme-accent-deep-orange .mdui-slider-thumb{background-color:#ff6e40;border:2px solid #ff6e40}.mdui-theme-accent-deep-purple .mdui-slider-fill:before{background-color:#7c4dff}.mdui-theme-accent-deep-purple .mdui-slider-thumb{background-color:#7c4dff;border:2px solid #7c4dff}.mdui-theme-accent-green .mdui-slider-fill:before{background-color:#69f0ae}.mdui-theme-accent-green .mdui-slider-thumb{background-color:#69f0ae;border:2px solid #69f0ae}.mdui-theme-accent-indigo .mdui-slider-fill:before{background-color:#536dfe}.mdui-theme-accent-indigo .mdui-slider-thumb{background-color:#536dfe;border:2px solid #536dfe}.mdui-theme-accent-light-blue .mdui-slider-fill:before{background-color:#40c4ff}.mdui-theme-accent-light-blue .mdui-slider-thumb{background-color:#40c4ff;border:2px solid #40c4ff}.mdui-theme-accent-light-green .mdui-slider-fill:before{background-color:#b2ff59}.mdui-theme-accent-light-green .mdui-slider-thumb{background-color:#b2ff59;border:2px solid #b2ff59}.mdui-theme-accent-lime .mdui-slider-fill:before{background-color:#eeff41}.mdui-theme-accent-lime .mdui-slider-thumb{background-color:#eeff41;border:2px solid #eeff41}.mdui-theme-accent-orange .mdui-slider-fill:before{background-color:#ffab40}.mdui-theme-accent-orange .mdui-slider-thumb{background-color:#ffab40;border:2px solid #ffab40}.mdui-theme-accent-pink .mdui-slider-fill:before{background-color:#ff4081}.mdui-theme-accent-pink .mdui-slider-thumb{background-color:#ff4081;border:2px solid #ff4081}.mdui-theme-accent-purple .mdui-slider-fill:before{background-color:#e040fb}.mdui-theme-accent-purple .mdui-slider-thumb{background-color:#e040fb;border:2px solid #e040fb}.mdui-theme-accent-red .mdui-slider-fill:before{background-color:#ff5252}.mdui-theme-accent-red .mdui-slider-thumb{background-color:#ff5252;border:2px solid #ff5252}.mdui-theme-accent-teal .mdui-slider-fill:before{background-color:#64ffda}.mdui-theme-accent-teal .mdui-slider-thumb{background-color:#64ffda;border:2px solid #64ffda}.mdui-theme-accent-yellow .mdui-slider-fill:before{background-color:#ff0}.mdui-theme-accent-yellow .mdui-slider-thumb{background-color:#ff0;border:2px solid #ff0}.mdui-slider-focus .mdui-slider-track:before{background-color:#9e9e9e}.mdui-slider-focus .mdui-slider-thumb{-webkit-transform:translate(-50%) scale(1.6);transform:translate(-50%) scale(1.6)}.mdui-slider-zero .mdui-slider-thumb{background-color:#fff;border-color:#bdbdbd}.mdui-slider-zero.mdui-slider-focus .mdui-slider-thumb{border-color:#9e9e9e}.mdui-slider-disabled input[type=range]{cursor:default}.mdui-slider-disabled .mdui-slider-track:before{background-color:#bdbdbd}.mdui-slider-disabled .mdui-slider-fill:before{background-color:#bdbdbd}.mdui-slider-disabled .mdui-slider-thumb{background-color:#bdbdbd;border-color:transparent!important;-webkit-transform:translate(-50%) scale(.72);transform:translate(-50%) scale(.72)}.mdui-slider-discrete .mdui-slider-thumb{width:30px;height:30px;margin-top:-15px;margin-left:-15px;border:none;-webkit-transform:rotate(-45deg) scale(.4);transform:rotate(-45deg) scale(.4)}.mdui-slider-discrete .mdui-slider-thumb span{position:absolute;top:9px;left:-1px;width:100%;font-size:12px;color:#fff;text-align:center;opacity:0;-webkit-transition:opacity .25s cubic-bezier(.4,0,.2,1);transition:opacity .25s cubic-bezier(.4,0,.2,1);-webkit-transform:rotate(45deg);transform:rotate(45deg)}.mdui-slider-discrete.mdui-slider-focus .mdui-slider-thumb{border-radius:15px 15px 15px 0;-webkit-transform:rotate(-45deg) scale(1) translate(22px,-22px);transform:rotate(-45deg) scale(1) translate(22px,-22px)}.mdui-slider-discrete.mdui-slider-focus .mdui-slider-thumb span{opacity:1}.mdui-slider-discrete.mdui-slider-zero .mdui-slider-thumb{background-color:#323232}.mdui-slider-discrete.mdui-slider-zero.mdui-slider-focus .mdui-slider-thumb{background-color:#bdbdbd}.mdui-slider-discrete.mdui-slider-disabled .mdui-slider-thumb{-webkit-transform:rotate(-45deg) scale(.288);transform:rotate(-45deg) scale(.288)}.mdui-slider-discrete.mdui-slider-zero.mdui-slider-disabled .mdui-slider-thumb{background-color:#bdbdbd}.mdui-theme-layout-dark .mdui-slider-track:before{background-color:#4c4c4c}.mdui-theme-layout-dark .mdui-slider-focus .mdui-slider-track:before{background-color:#4c4c4c}.mdui-theme-layout-dark .mdui-slider-zero .mdui-slider-thumb{background-color:#303030;border-color:#4c4c4c}.mdui-theme-layout-dark .mdui-slider-zero.mdui-slider-focus .mdui-slider-thumb{border-color:#4c4c4c}.mdui-theme-layout-dark .mdui-slider-disabled .mdui-slider-track:before{background-color:#4c4c4c}.mdui-theme-layout-dark .mdui-slider-disabled .mdui-slider-fill:before{background-color:#4c4c4c}.mdui-theme-layout-dark .mdui-slider-disabled .mdui-slider-thumb{background-color:#4c4c4c}.mdui-theme-layout-dark .mdui-slider-discrete.mdui-slider-zero .mdui-slider-thumb{background-color:#fefefe}.mdui-theme-layout-dark .mdui-slider-discrete.mdui-slider-zero.mdui-slider-focus .mdui-slider-thumb{background-color:#5c5c5c}.mdui-theme-layout-dark .mdui-slider-discrete.mdui-slider-zero.mdui-slider-disabled .mdui-slider-thumb{background-color:#4c4c4c}.mdui-btn,.mdui-fab{position:relative;display:inline-block;min-width:88px;height:36px;-webkit-box-sizing:border-box;box-sizing:border-box;padding:0 16px;margin:0;overflow:hidden;font-size:14px;font-weight:500;line-height:36px;color:inherit;text-align:center;text-decoration:none;text-transform:uppercase;letter-spacing:.04em;white-space:nowrap;vertical-align:middle;-ms-touch-action:manipulation;touch-action:manipulation;cursor:pointer;zoom:1;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;background:0 0;border:none;border-radius:2px;outline:0;-webkit-transition:all .2s cubic-bezier(.4,0,.2,1),-webkit-box-shadow .2s cubic-bezier(.4,0,1,1);transition:all .2s cubic-bezier(.4,0,.2,1),-webkit-box-shadow .2s cubic-bezier(.4,0,1,1);transition:all .2s cubic-bezier(.4,0,.2,1),box-shadow .2s cubic-bezier(.4,0,1,1);transition:all .2s cubic-bezier(.4,0,.2,1),box-shadow .2s cubic-bezier(.4,0,1,1),-webkit-box-shadow .2s cubic-bezier(.4,0,1,1);will-change:box-shadow;-webkit-user-drag:none}.mdui-btn:hover,.mdui-fab:hover{background-color:rgba(0,0,0,.1)}.mdui-btn:not(.mdui-ripple):active,.mdui-fab:not(.mdui-ripple):active{background-color:rgba(0,0,0,.165)}.mdui-btn[class*=mdui-color-]:hover,.mdui-fab[class*=mdui-color-]:hover{opacity:.87}.mdui-btn:not(.mdui-ripple)[class*=mdui-color-]:active,.mdui-fab:not(.mdui-ripple)[class*=mdui-color-]:active{opacity:.76}.mdui-btn .mdui-icon-left,.mdui-btn .mdui-icon-left::before,.mdui-btn .mdui-icon-right,.mdui-btn .mdui-icon-right::before{height:inherit;font-size:1.3em;line-height:inherit}.mdui-btn .mdui-icon-left{float:left;margin-right:.4em}.mdui-btn .mdui-icon-right{float:right;margin-left:.4em}input.mdui-btn[type=submit]{-webkit-appearance:none;-moz-appearance:none;appearance:none}.mdui-btn-raised{-webkit-box-shadow:0 3px 1px -2px rgba(0,0,0,.2),0 2px 2px 0 rgba(0,0,0,.14),0 1px 5px 0 rgba(0,0,0,.12);box-shadow:0 3px 1px -2px rgba(0,0,0,.2),0 2px 2px 0 rgba(0,0,0,.14),0 1px 5px 0 rgba(0,0,0,.12)}.mdui-btn-raised:hover{-webkit-box-shadow:0 2px 4px -1px rgba(0,0,0,.2),0 4px 5px 0 rgba(0,0,0,.14),0 1px 10px 0 rgba(0,0,0,.12);box-shadow:0 2px 4px -1px rgba(0,0,0,.2),0 4px 5px 0 rgba(0,0,0,.14),0 1px 10px 0 rgba(0,0,0,.12)}.mdui-btn-raised:active{-webkit-box-shadow:0 5px 5px -3px rgba(0,0,0,.2),0 8px 10px 1px rgba(0,0,0,.14),0 3px 14px 2px rgba(0,0,0,.12);box-shadow:0 5px 5px -3px rgba(0,0,0,.2),0 8px 10px 1px rgba(0,0,0,.14),0 3px 14px 2px rgba(0,0,0,.12)}.mdui-btn[disabled],.mdui-btn[disabled]:active,.mdui-btn[disabled]:focus,.mdui-btn[disabled]:hover,.mdui-fab[disabled],.mdui-fab[disabled]:active,.mdui-fab[disabled]:focus,.mdui-fab[disabled]:hover{color:rgba(0,0,0,.26)!important;cursor:default!important;background-color:transparent!important;-webkit-box-shadow:none!important;box-shadow:none!important;opacity:1!important}.mdui-btn[disabled] .mdui-icon,.mdui-btn[disabled]:active .mdui-icon,.mdui-btn[disabled]:focus .mdui-icon,.mdui-btn[disabled]:hover .mdui-icon,.mdui-fab[disabled] .mdui-icon,.mdui-fab[disabled]:active .mdui-icon,.mdui-fab[disabled]:focus .mdui-icon,.mdui-fab[disabled]:hover .mdui-icon{color:rgba(0,0,0,.26)!important}.mdui-btn-raised[disabled],.mdui-btn-raised[disabled]:active,.mdui-btn-raised[disabled]:focus,.mdui-btn-raised[disabled]:hover,.mdui-fab[disabled],.mdui-fab[disabled]:active,.mdui-fab[disabled]:focus,.mdui-fab[disabled]:hover{background-color:rgba(0,0,0,.12)!important;-webkit-box-shadow:0 3px 1px -2px rgba(0,0,0,.2),0 2px 2px 0 rgba(0,0,0,.14),0 1px 5px 0 rgba(0,0,0,.12)!important;box-shadow:0 3px 1px -2px rgba(0,0,0,.2),0 2px 2px 0 rgba(0,0,0,.14),0 1px 5px 0 rgba(0,0,0,.12)!important}.mdui-btn-bold{font-weight:700}.mdui-btn-icon{width:36px;min-width:36px;height:36px;padding:0;margin-right:0;margin-left:0;overflow:hidden;font-size:24px;line-height:normal;border-radius:50%}.mdui-btn-icon .mdui-icon{position:absolute;top:50%;left:50%;width:24px;line-height:24px;-webkit-transform:translate(-12px,-12px);transform:translate(-12px,-12px)}.mdui-btn-icon.mdui-ripple{-webkit-transform:translateZ(0);transform:translateZ(0)}.mdui-btn-block{display:block;width:100%}.mdui-btn-dense{height:32px;font-size:13px;line-height:32px}.mdui-btn-dense.mdui-btn-icon{width:32px;min-width:32px}.mdui-btn-group{position:relative;display:inline-block;vertical-align:middle}.mdui-btn-group .mdui-btn{float:left;min-width:inherit;padding:0 12px;color:rgba(0,0,0,.54);border-radius:0}.mdui-btn-group .mdui-btn:before{position:absolute;top:0;bottom:0;left:0;content:' ';border-left:1px solid transparent}.mdui-btn-group .mdui-btn:first-child{border-top-left-radius:2px;border-bottom-left-radius:2px}.mdui-btn-group .mdui-btn:first-child:before{border-left:none}.mdui-btn-group .mdui-btn:last-child{border-top-right-radius:2px;border-bottom-right-radius:2px}.mdui-btn-group .mdui-btn.mdui-btn-active{color:rgba(0,0,0,.87);background-color:rgba(0,0,0,.215)}.mdui-btn-group .mdui-btn.mdui-btn-active+.mdui-btn-active:before{border-left:1px solid rgba(0,0,0,.145)}.mdui-theme-layout-dark .mdui-btn:hover,.mdui-theme-layout-dark .mdui-fab:hover{background-color:rgba(255,255,255,.1)}.mdui-theme-layout-dark .mdui-btn:not(.mdui-ripple):active,.mdui-theme-layout-dark .mdui-fab:not(.mdui-ripple):active{background-color:rgba(255,255,255,.165)}.mdui-theme-layout-dark .mdui-btn[class*=mdui-color-]:hover,.mdui-theme-layout-dark .mdui-fab[class*=mdui-color-]:hover{opacity:.87}.mdui-theme-layout-dark .mdui-btn:not(.mdui-ripple)[class*=mdui-color-]:active,.mdui-theme-layout-dark .mdui-fab:not(.mdui-ripple)[class*=mdui-color-]:active{opacity:.76}.mdui-theme-layout-dark .mdui-btn[disabled],.mdui-theme-layout-dark .mdui-btn[disabled]:active,.mdui-theme-layout-dark .mdui-btn[disabled]:focus,.mdui-theme-layout-dark .mdui-btn[disabled]:hover,.mdui-theme-layout-dark .mdui-fab[disabled],.mdui-theme-layout-dark .mdui-fab[disabled]:active,.mdui-theme-layout-dark .mdui-fab[disabled]:focus,.mdui-theme-layout-dark .mdui-fab[disabled]:hover{color:rgba(255,255,255,.3)!important;background-color:transparent!important}.mdui-theme-layout-dark .mdui-btn[disabled] .mdui-icon,.mdui-theme-layout-dark .mdui-btn[disabled]:active .mdui-icon,.mdui-theme-layout-dark .mdui-btn[disabled]:focus .mdui-icon,.mdui-theme-layout-dark .mdui-btn[disabled]:hover .mdui-icon,.mdui-theme-layout-dark .mdui-fab[disabled] .mdui-icon,.mdui-theme-layout-dark .mdui-fab[disabled]:active .mdui-icon,.mdui-theme-layout-dark .mdui-fab[disabled]:focus .mdui-icon,.mdui-theme-layout-dark .mdui-fab[disabled]:hover .mdui-icon{color:rgba(255,255,255,.3)!important}.mdui-theme-layout-dark .mdui-btn-raised[disabled],.mdui-theme-layout-dark .mdui-btn-raised[disabled]:active,.mdui-theme-layout-dark .mdui-btn-raised[disabled]:focus,.mdui-theme-layout-dark .mdui-btn-raised[disabled]:hover,.mdui-theme-layout-dark .mdui-fab[disabled],.mdui-theme-layout-dark .mdui-fab[disabled]:active,.mdui-theme-layout-dark .mdui-fab[disabled]:focus,.mdui-theme-layout-dark .mdui-fab[disabled]:hover{background-color:rgba(255,255,255,.12)!important}.mdui-fab{width:56px;min-width:56px;height:56px;padding:0!important;margin:auto;overflow:hidden;font-size:24px;line-height:normal!important;border-radius:50%;-webkit-box-shadow:0 3px 5px -1px rgba(0,0,0,.2),0 6px 10px 0 rgba(0,0,0,.14),0 1px 18px 0 rgba(0,0,0,.12);box-shadow:0 3px 5px -1px rgba(0,0,0,.2),0 6px 10px 0 rgba(0,0,0,.14),0 1px 18px 0 rgba(0,0,0,.12)}.mdui-fab:hover{-webkit-box-shadow:0 5px 5px -3px rgba(0,0,0,.2),0 8px 10px 1px rgba(0,0,0,.14),0 3px 14px 2px rgba(0,0,0,.12);box-shadow:0 5px 5px -3px rgba(0,0,0,.2),0 8px 10px 1px rgba(0,0,0,.14),0 3px 14px 2px rgba(0,0,0,.12)}.mdui-fab:active{-webkit-box-shadow:0 7px 8px -4px rgba(0,0,0,.2),0 12px 17px 2px rgba(0,0,0,.14),0 5px 22px 4px rgba(0,0,0,.12);box-shadow:0 7px 8px -4px rgba(0,0,0,.2),0 12px 17px 2px rgba(0,0,0,.14),0 5px 22px 4px rgba(0,0,0,.12)}.mdui-fab .mdui-icon{position:absolute;top:0;left:0;width:24px;margin-top:16px;margin-left:16px;line-height:24px}.mdui-fab-mini{width:40px;min-width:40px;height:40px}.mdui-fab-mini .mdui-icon{margin-top:8px;margin-left:8px}.mdui-fab-fixed,.mdui-fab-wrapper{position:fixed!important;right:25px;bottom:25px}@media (min-width:1024px){.mdui-fab-fixed,.mdui-fab-wrapper{right:35px;bottom:35px}}.mdui-fab-wrapper{position:relative;z-index:4000;width:56px;height:56px;padding-top:8px}.mdui-fab-wrapper>.mdui-fab .mdui-icon:not(.mdui-fab-opened){opacity:1;-webkit-transition:all .2s cubic-bezier(.4,0,.2,1);transition:all .2s cubic-bezier(.4,0,.2,1);will-change:opacity,transform}.mdui-fab-wrapper>.mdui-fab .mdui-icon.mdui-fab-opened{opacity:0;-webkit-transition:all .2s cubic-bezier(.4,0,.2,1);transition:all .2s cubic-bezier(.4,0,.2,1);-webkit-transform:rotate(225deg);transform:rotate(225deg);will-change:opacity,transform}.mdui-fab-wrapper>.mdui-fab.mdui-fab-opened .mdui-icon:not(.mdui-fab-opened){opacity:0;-webkit-transform:rotate(225deg);transform:rotate(225deg)}.mdui-fab-wrapper>.mdui-fab.mdui-fab-opened .mdui-icon.mdui-fab-opened{opacity:1;-webkit-transform:rotate(360deg);transform:rotate(360deg)}.mdui-fab-wrapper .mdui-fab-dial{position:absolute;right:0;bottom:64px;left:0;height:0;text-align:center;visibility:visible}.mdui-fab-wrapper .mdui-fab-dial .mdui-fab{margin:8px 0;opacity:0;-webkit-transition:color .2s cubic-bezier(.4,0,.2,1),opacity 150ms cubic-bezier(.4,0,.2,1),-webkit-box-shadow .2s cubic-bezier(.4,0,1,1),-webkit-transform 150ms cubic-bezier(.4,0,.2,1);transition:color .2s cubic-bezier(.4,0,.2,1),opacity 150ms cubic-bezier(.4,0,.2,1),-webkit-box-shadow .2s cubic-bezier(.4,0,1,1),-webkit-transform 150ms cubic-bezier(.4,0,.2,1);transition:box-shadow .2s cubic-bezier(.4,0,1,1),color .2s cubic-bezier(.4,0,.2,1),transform 150ms cubic-bezier(.4,0,.2,1),opacity 150ms cubic-bezier(.4,0,.2,1);transition:box-shadow .2s cubic-bezier(.4,0,1,1),color .2s cubic-bezier(.4,0,.2,1),transform 150ms cubic-bezier(.4,0,.2,1),opacity 150ms cubic-bezier(.4,0,.2,1),-webkit-box-shadow .2s cubic-bezier(.4,0,1,1),-webkit-transform 150ms cubic-bezier(.4,0,.2,1);-webkit-transform:scale(0);transform:scale(0)}.mdui-fab-wrapper .mdui-fab-dial.mdui-fab-dial-show .mdui-fab{opacity:1;-webkit-transform:scale(1);transform:scale(1)}.mdui-fab,.mdui-fab-mini,.mdui-fab-wrapper{-webkit-transition:all .2s cubic-bezier(.4,0,.2,1),-webkit-box-shadow .2s cubic-bezier(.4,0,1,1),-webkit-transform .2s;transition:all .2s cubic-bezier(.4,0,.2,1),-webkit-box-shadow .2s cubic-bezier(.4,0,1,1),-webkit-transform .2s;transition:all .2s cubic-bezier(.4,0,.2,1),box-shadow .2s cubic-bezier(.4,0,1,1),transform .2s;transition:all .2s cubic-bezier(.4,0,.2,1),box-shadow .2s cubic-bezier(.4,0,1,1),transform .2s,-webkit-box-shadow .2s cubic-bezier(.4,0,1,1),-webkit-transform .2s;-webkit-transform:scale(1) translateZ(0);transform:scale(1) translateZ(0);will-change:transform}.mdui-fab-mini.mdui-fab-hide,.mdui-fab-wrapper.mdui-fab-hide,.mdui-fab.mdui-fab-hide{-webkit-transform:scale(0) translateZ(0);transform:scale(0) translateZ(0)}.mdui-select{position:relative;display:inline-block;max-width:100%;height:36px;-webkit-box-sizing:border-box;box-sizing:border-box;-webkit-appearance:none;padding-right:24px;padding-left:0;font-family:Roboto,Noto,Helvetica,Arial,sans-serif;font-size:16px;vertical-align:middle;cursor:pointer;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;background-image:url(data:image/svg+xml,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20width%3D%2210%22%20height%3D%2210%22%20viewBox%3D%220%200%2010%2010%22%3E%3Cpath%20d%3D%22m-0.00254%2C2.5l5%2C5l5%2C-5l-10%2C0z%22%20fill%3D%22%23000000%22%20opacity%3D%220.54%22%2F%3E%3C%2Fsvg%3E%0A);background-repeat:no-repeat;background-position:right center;border:none;border-bottom:1px solid rgba(0,0,0,.12);outline:0;-webkit-transition-timing-function:cubic-bezier(.4,0,.2,1);transition-timing-function:cubic-bezier(.4,0,.2,1);-webkit-transition-duration:.2s;transition-duration:.2s;-webkit-transition-property:background-color,background-position-x,-webkit-box-shadow;transition-property:background-color,background-position-x,-webkit-box-shadow;transition-property:background-color,box-shadow,background-position-x;transition-property:background-color,box-shadow,background-position-x,-webkit-box-shadow;-moz-appearance:none;appearance:none;will-change:background-color,box-shadow,background-position-x}.mdui-select.mdui-select-open{border-bottom:none}.mdui-select-position-top{background-image:url("data:image/svg+xml,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20width%3D%2210%22%20height%3D%2210%22%20viewBox%3D%220%200%2010%2010%22%3E%3Cpath%20d%3D%22m-0.00254%2C2.5l5%2C5l5%2C-5l-10%2C0z%22%20fill%3D%22%23000000%22%20opacity%3D%220.54%22%20transform%3D%22rotate(-180%205%2C5)%22%2F%3E%3C%2Fsvg%3E%0A")}.mdui-select-open.mdui-select-position-bottom,.mdui-select-open.mdui-select-position-top{z-index:99999;background-color:#fff;background-position-x:calc(100% - 12px);border-radius:2px}.mdui-select-open.mdui-select-position-top{border-top:1px solid rgba(0,0,0,.12);border-bottom:2px solid transparent;border-top-left-radius:0;border-top-right-radius:0;-webkit-box-shadow:0 10px 10px -3px rgba(0,0,0,.2),0 0 14px 1px rgba(0,0,0,.14),0 -7px 24px 2px rgba(0,0,0,.12);box-shadow:0 10px 10px -3px rgba(0,0,0,.2),0 0 14px 1px rgba(0,0,0,.14),0 -7px 24px 2px rgba(0,0,0,.12)}.mdui-select-open.mdui-select-position-top .mdui-select-menu{border-bottom-right-radius:0;border-bottom-left-radius:0;-webkit-box-shadow:0 -4px 4px -2px rgba(0,0,0,.06),8px 0 8px -4px rgba(0,0,0,.12),-8px 0 8px -4px rgba(0,0,0,.12);box-shadow:0 -4px 4px -2px rgba(0,0,0,.06),8px 0 8px -4px rgba(0,0,0,.12),-8px 0 8px -4px rgba(0,0,0,.12)}.mdui-select-open.mdui-select-position-bottom{border-bottom:1px solid rgba(0,0,0,.12);border-bottom-right-radius:0;border-bottom-left-radius:0;-webkit-box-shadow:0 5px 5px -3px rgba(0,0,0,.2),0 8px 10px 1px rgba(0,0,0,.14),0 3px 14px 2px rgba(0,0,0,.12);box-shadow:0 5px 5px -3px rgba(0,0,0,.2),0 8px 10px 1px rgba(0,0,0,.14),0 3px 14px 2px rgba(0,0,0,.12)}.mdui-select-open.mdui-select-position-bottom .mdui-select-menu{border-top-left-radius:0;border-top-right-radius:0;-webkit-box-shadow:0 5px 5px -3px rgba(0,0,0,.2),0 9px 9px 1px rgba(0,0,0,.14),0 8px 8px 2px rgba(0,0,0,.06);box-shadow:0 5px 5px -3px rgba(0,0,0,.2),0 9px 9px 1px rgba(0,0,0,.14),0 8px 8px 2px rgba(0,0,0,.06)}.mdui-select-selected{position:absolute;top:50%;right:24px;left:0;display:block;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;-webkit-transition:left .2s cubic-bezier(0,0,.2,1);transition:left .2s cubic-bezier(0,0,.2,1);-webkit-transform:translateY(-50%);transform:translateY(-50%)}.mdui-select-open .mdui-select-selected{right:32px;left:16px}.mdui-select-open.mdui-select-position-auto .mdui-select-selected{visibility:hidden}.mdui-select-menu{position:relative;z-index:99999;height:36px;-webkit-box-sizing:border-box;box-sizing:border-box;margin:0 -24px 0 0;overflow-y:scroll;-webkit-overflow-scrolling:touch;color:rgba(0,0,0,.87);cursor:default;visibility:hidden;background-color:#fff;border-radius:2px;-webkit-box-shadow:0 5px 5px -3px rgba(0,0,0,.2),0 8px 10px 1px rgba(0,0,0,.14),0 3px 14px 2px rgba(0,0,0,.12);box-shadow:0 5px 5px -3px rgba(0,0,0,.2),0 8px 10px 1px rgba(0,0,0,.14),0 3px 14px 2px rgba(0,0,0,.12);opacity:0;-webkit-transition-timing-function:cubic-bezier(0,0,.2,1);transition-timing-function:cubic-bezier(0,0,.2,1);-webkit-transition-duration:.2s;transition-duration:.2s;-webkit-transition-property:opacity,visibility,-webkit-transform;transition-property:opacity,visibility,-webkit-transform;transition-property:transform,opacity,visibility;transition-property:transform,opacity,visibility,-webkit-transform;-webkit-transform:scale(1,0);transform:scale(1,0);will-change:transform,opacity,visibility}.mdui-select-open .mdui-select-menu{overflow-y:hidden;visibility:visible;opacity:1;-webkit-transform:scale(1,1);transform:scale(1,1)}.mdui-select-closing .mdui-select-menu{overflow-y:hidden;visibility:visible;-webkit-box-shadow:none;box-shadow:none;opacity:0;-webkit-transform:scale(1,1);transform:scale(1,1)}.mdui-select-menu-item{height:48px;padding:0 16px;overflow:hidden;line-height:48px;text-overflow:ellipsis;white-space:nowrap;cursor:pointer}.mdui-select-menu-item:hover{background-color:#eee}.mdui-select-menu-item:first-child{margin-top:8px}.mdui-select-menu-item:last-child{margin-bottom:8px}.mdui-select-menu-item[disabled]{color:rgba(0,0,0,.38)!important;cursor:default}.mdui-select-menu-item[disabled]:hover{background-color:inherit!important}.mdui-select-menu-item[selected]{color:#ff4081}select.mdui-select{background-color:transparent}select.mdui-select option{color:rgba(0,0,0,.87)}select.mdui-select::-ms-expand{display:none}select.mdui-select[multiple]{height:auto;padding:0;font-size:15px;cursor:default;background-color:#fff;background-image:none;border:1px solid rgba(0,0,0,.38)}select.mdui-select[multiple] optgroup{padding:0 0 0 16px;margin:8px 0 0 0;color:rgba(0,0,0,.38)}select.mdui-select[multiple] optgroup:last-child{margin-bottom:8px}select.mdui-select[multiple] optgroup:not(:first-child){padding-top:8px;border-top:1px solid rgba(0,0,0,.12)}select.mdui-select[multiple] option{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;height:32px;padding:0 16px;margin:0 0 0 -16px;color:rgba(0,0,0,.87);-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center}select.mdui-select[multiple] option:first-child{margin-top:8px}select.mdui-select[multiple] option:last-child{margin-bottom:8px}.mdui-theme-accent-amber .mdui-select-menu-item[selected]{color:#ffc107}.mdui-theme-accent-blue .mdui-select-menu-item[selected]{color:#2196f3}.mdui-theme-accent-cyan .mdui-select-menu-item[selected]{color:#00bcd4}.mdui-theme-accent-deep-orange .mdui-select-menu-item[selected]{color:#ff5722}.mdui-theme-accent-deep-purple .mdui-select-menu-item[selected]{color:#673ab7}.mdui-theme-accent-green .mdui-select-menu-item[selected]{color:#4caf50}.mdui-theme-accent-indigo .mdui-select-menu-item[selected]{color:#3f51b5}.mdui-theme-accent-light-blue .mdui-select-menu-item[selected]{color:#03a9f4}.mdui-theme-accent-light-green .mdui-select-menu-item[selected]{color:#8bc34a}.mdui-theme-accent-lime .mdui-select-menu-item[selected]{color:#cddc39}.mdui-theme-accent-orange .mdui-select-menu-item[selected]{color:#ff9800}.mdui-theme-accent-pink .mdui-select-menu-item[selected]{color:#e91e63}.mdui-theme-accent-purple .mdui-select-menu-item[selected]{color:#9c27b0}.mdui-theme-accent-red .mdui-select-menu-item[selected]{color:#f44336}.mdui-theme-accent-teal .mdui-select-menu-item[selected]{color:#009688}.mdui-theme-accent-yellow .mdui-select-menu-item[selected]{color:#ffeb3b}.mdui-theme-layout-dark .mdui-select{background-image:url(data:image/svg+xml,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20width%3D%2210%22%20height%3D%2210%22%20viewBox%3D%220%200%2010%2010%22%3E%3Cpath%20d%3D%22m-0.00254%2C2.5l5%2C5l5%2C-5l-10%2C0z%22%20fill%3D%22%23FFFFFF%22%2F%3E%3C%2Fsvg%3E%0A);border-bottom:1px solid rgba(255,255,255,.12)}.mdui-theme-layout-dark .mdui-select-position-top{background-image:url("data:image/svg+xml,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20width%3D%2210%22%20height%3D%2210%22%20viewBox%3D%220%200%2010%2010%22%3E%3Cpath%20d%3D%22m-0.00254%2C2.5l5%2C5l5%2C-5l-10%2C0z%22%20fill%3D%22%23FFFFFF%22%20transform%3D%22rotate(-180%205%2C5)%22%2F%3E%3C%2Fsvg%3E%0A")}.mdui-theme-layout-dark .mdui-select-open.mdui-select-position-bottom,.mdui-theme-layout-dark .mdui-select-open.mdui-select-position-top{background-color:#424242}.mdui-theme-layout-dark .mdui-select-open.mdui-select-position-top{border-top:1px solid rgba(255,255,255,.12)}.mdui-theme-layout-dark .mdui-select-open.mdui-select-position-bottom{border-bottom:1px solid rgba(255,255,255,.12)}.mdui-theme-layout-dark .mdui-select-menu{color:#fff;background-color:#424242}.mdui-theme-layout-dark .mdui-select-menu-item:hover{background-color:#616161}.mdui-theme-layout-dark .mdui-select-menu-item[disabled]{color:rgba(255,255,255,.5)!important}.mdui-theme-layout-dark select.mdui-select{color:#fff;background-color:#303030}.mdui-theme-layout-dark select.mdui-select option{color:#fff;background-color:#303030}.mdui-theme-layout-dark select.mdui-select[multiple]{border:1px solid rgba(255,255,255,.5)}.mdui-theme-layout-dark select.mdui-select[multiple] optgroup{color:rgba(255,255,255,.5)}.mdui-theme-layout-dark select.mdui-select[multiple] optgroup:not(:first-child){border-top:1px solid rgba(255,255,255,.12)}.mdui-container,.mdui-container-fluid{-webkit-box-sizing:border-box;box-sizing:border-box;padding-right:8px;padding-left:8px;margin-right:auto;margin-left:auto}.mdui-container-fluid:after,.mdui-container:after{display:table;clear:both;content:''}.mdui-container{width:96%;max-width:1280px}@media (min-width:600px){.mdui-container{width:94%}}@media (min-width:1024px){.mdui-container{width:92%}}.mdui-row,[class*=mdui-row-]{margin-right:-8px;margin-left:-8px}.mdui-row:after,[class*=mdui-row-]:after{display:table;clear:both;content:''}.mdui-col,[class*=mdui-col-lg-],[class*=mdui-col-md-],[class*=mdui-col-sm-],[class*=mdui-col-xl-],[class*=mdui-col-xs-]{position:relative;min-height:1px;-webkit-box-sizing:border-box;box-sizing:border-box;padding-right:8px;padding-left:8px}.mdui-row-gapless .mdui-col,.mdui-row-gapless [class*=mdui-col-lg-],.mdui-row-gapless [class*=mdui-col-md-],.mdui-row-gapless [class*=mdui-col-sm-],.mdui-row-gapless [class*=mdui-col-xl-],.mdui-row-gapless [class*=mdui-col-xs-]{padding-right:0;padding-left:0}.mdui-row-gapless .mdui-row,.mdui-row-gapless [class*=mdui-row-]{margin-right:0;margin-left:0}.mdui-col-xs-1{float:left;width:8.333333%}.mdui-col-offset-xs-1{margin-left:8.333333%}.mdui-row-xs-1 .mdui-col{float:left;width:100%}.mdui-col-xs-2{float:left;width:16.666667%}.mdui-col-offset-xs-2{margin-left:16.666667%}.mdui-row-xs-2 .mdui-col{float:left;width:50%}.mdui-col-xs-3{float:left;width:25%}.mdui-col-offset-xs-3{margin-left:25%}.mdui-row-xs-3 .mdui-col{float:left;width:33.333333%}.mdui-col-xs-4{float:left;width:33.333333%}.mdui-col-offset-xs-4{margin-left:33.333333%}.mdui-row-xs-4 .mdui-col{float:left;width:25%}.mdui-col-xs-5{float:left;width:41.666667%}.mdui-col-offset-xs-5{margin-left:41.666667%}.mdui-row-xs-5 .mdui-col{float:left;width:20%}.mdui-col-xs-6{float:left;width:50%}.mdui-col-offset-xs-6{margin-left:50%}.mdui-row-xs-6 .mdui-col{float:left;width:16.666667%}.mdui-col-xs-7{float:left;width:58.333333%}.mdui-col-offset-xs-7{margin-left:58.333333%}.mdui-row-xs-7 .mdui-col{float:left;width:14.285714%}.mdui-col-xs-8{float:left;width:66.666667%}.mdui-col-offset-xs-8{margin-left:66.666667%}.mdui-row-xs-8 .mdui-col{float:left;width:12.5%}.mdui-col-xs-9{float:left;width:75%}.mdui-col-offset-xs-9{margin-left:75%}.mdui-row-xs-9 .mdui-col{float:left;width:11.111111%}.mdui-col-xs-10{float:left;width:83.333333%}.mdui-col-offset-xs-10{margin-left:83.333333%}.mdui-row-xs-10 .mdui-col{float:left;width:10%}.mdui-col-xs-11{float:left;width:91.666667%}.mdui-col-offset-xs-11{margin-left:91.666667%}.mdui-row-xs-11 .mdui-col{float:left;width:9.090909%}.mdui-col-xs-12{float:left;width:100%}.mdui-col-offset-xs-12{margin-left:100%}.mdui-row-xs-12 .mdui-col{float:left;width:8.333333%}@media (min-width:600px){.mdui-col-sm-1{float:left;width:8.333333%}.mdui-col-offset-sm-1{margin-left:8.333333%}.mdui-row-sm-1 .mdui-col{float:left;width:100%}.mdui-col-sm-2{float:left;width:16.666667%}.mdui-col-offset-sm-2{margin-left:16.666667%}.mdui-row-sm-2 .mdui-col{float:left;width:50%}.mdui-col-sm-3{float:left;width:25%}.mdui-col-offset-sm-3{margin-left:25%}.mdui-row-sm-3 .mdui-col{float:left;width:33.333333%}.mdui-col-sm-4{float:left;width:33.333333%}.mdui-col-offset-sm-4{margin-left:33.333333%}.mdui-row-sm-4 .mdui-col{float:left;width:25%}.mdui-col-sm-5{float:left;width:41.666667%}.mdui-col-offset-sm-5{margin-left:41.666667%}.mdui-row-sm-5 .mdui-col{float:left;width:20%}.mdui-col-sm-6{float:left;width:50%}.mdui-col-offset-sm-6{margin-left:50%}.mdui-row-sm-6 .mdui-col{float:left;width:16.666667%}.mdui-col-sm-7{float:left;width:58.333333%}.mdui-col-offset-sm-7{margin-left:58.333333%}.mdui-row-sm-7 .mdui-col{float:left;width:14.285714%}.mdui-col-sm-8{float:left;width:66.666667%}.mdui-col-offset-sm-8{margin-left:66.666667%}.mdui-row-sm-8 .mdui-col{float:left;width:12.5%}.mdui-col-sm-9{float:left;width:75%}.mdui-col-offset-sm-9{margin-left:75%}.mdui-row-sm-9 .mdui-col{float:left;width:11.111111%}.mdui-col-sm-10{float:left;width:83.333333%}.mdui-col-offset-sm-10{margin-left:83.333333%}.mdui-row-sm-10 .mdui-col{float:left;width:10%}.mdui-col-sm-11{float:left;width:91.666667%}.mdui-col-offset-sm-11{margin-left:91.666667%}.mdui-row-sm-11 .mdui-col{float:left;width:9.090909%}.mdui-col-sm-12{float:left;width:100%}.mdui-col-offset-sm-12{margin-left:100%}.mdui-row-sm-12 .mdui-col{float:left;width:8.333333%}}@media (min-width:1024px){.mdui-col-md-1{float:left;width:8.333333%}.mdui-col-offset-md-1{margin-left:8.333333%}.mdui-row-md-1 .mdui-col{float:left;width:100%}.mdui-col-md-2{float:left;width:16.666667%}.mdui-col-offset-md-2{margin-left:16.666667%}.mdui-row-md-2 .mdui-col{float:left;width:50%}.mdui-col-md-3{float:left;width:25%}.mdui-col-offset-md-3{margin-left:25%}.mdui-row-md-3 .mdui-col{float:left;width:33.333333%}.mdui-col-md-4{float:left;width:33.333333%}.mdui-col-offset-md-4{margin-left:33.333333%}.mdui-row-md-4 .mdui-col{float:left;width:25%}.mdui-col-md-5{float:left;width:41.666667%}.mdui-col-offset-md-5{margin-left:41.666667%}.mdui-row-md-5 .mdui-col{float:left;width:20%}.mdui-col-md-6{float:left;width:50%}.mdui-col-offset-md-6{margin-left:50%}.mdui-row-md-6 .mdui-col{float:left;width:16.666667%}.mdui-col-md-7{float:left;width:58.333333%}.mdui-col-offset-md-7{margin-left:58.333333%}.mdui-row-md-7 .mdui-col{float:left;width:14.285714%}.mdui-col-md-8{float:left;width:66.666667%}.mdui-col-offset-md-8{margin-left:66.666667%}.mdui-row-md-8 .mdui-col{float:left;width:12.5%}.mdui-col-md-9{float:left;width:75%}.mdui-col-offset-md-9{margin-left:75%}.mdui-row-md-9 .mdui-col{float:left;width:11.111111%}.mdui-col-md-10{float:left;width:83.333333%}.mdui-col-offset-md-10{margin-left:83.333333%}.mdui-row-md-10 .mdui-col{float:left;width:10%}.mdui-col-md-11{float:left;width:91.666667%}.mdui-col-offset-md-11{margin-left:91.666667%}.mdui-row-md-11 .mdui-col{float:left;width:9.090909%}.mdui-col-md-12{float:left;width:100%}.mdui-col-offset-md-12{margin-left:100%}.mdui-row-md-12 .mdui-col{float:left;width:8.333333%}}@media (min-width:1440px){.mdui-col-lg-1{float:left;width:8.333333%}.mdui-col-offset-lg-1{margin-left:8.333333%}.mdui-row-lg-1 .mdui-col{float:left;width:100%}.mdui-col-lg-2{float:left;width:16.666667%}.mdui-col-offset-lg-2{margin-left:16.666667%}.mdui-row-lg-2 .mdui-col{float:left;width:50%}.mdui-col-lg-3{float:left;width:25%}.mdui-col-offset-lg-3{margin-left:25%}.mdui-row-lg-3 .mdui-col{float:left;width:33.333333%}.mdui-col-lg-4{float:left;width:33.333333%}.mdui-col-offset-lg-4{margin-left:33.333333%}.mdui-row-lg-4 .mdui-col{float:left;width:25%}.mdui-col-lg-5{float:left;width:41.666667%}.mdui-col-offset-lg-5{margin-left:41.666667%}.mdui-row-lg-5 .mdui-col{float:left;width:20%}.mdui-col-lg-6{float:left;width:50%}.mdui-col-offset-lg-6{margin-left:50%}.mdui-row-lg-6 .mdui-col{float:left;width:16.666667%}.mdui-col-lg-7{float:left;width:58.333333%}.mdui-col-offset-lg-7{margin-left:58.333333%}.mdui-row-lg-7 .mdui-col{float:left;width:14.285714%}.mdui-col-lg-8{float:left;width:66.666667%}.mdui-col-offset-lg-8{margin-left:66.666667%}.mdui-row-lg-8 .mdui-col{float:left;width:12.5%}.mdui-col-lg-9{float:left;width:75%}.mdui-col-offset-lg-9{margin-left:75%}.mdui-row-lg-9 .mdui-col{float:left;width:11.111111%}.mdui-col-lg-10{float:left;width:83.333333%}.mdui-col-offset-lg-10{margin-left:83.333333%}.mdui-row-lg-10 .mdui-col{float:left;width:10%}.mdui-col-lg-11{float:left;width:91.666667%}.mdui-col-offset-lg-11{margin-left:91.666667%}.mdui-row-lg-11 .mdui-col{float:left;width:9.090909%}.mdui-col-lg-12{float:left;width:100%}.mdui-col-offset-lg-12{margin-left:100%}.mdui-row-lg-12 .mdui-col{float:left;width:8.333333%}}@media (min-width:1920px){.mdui-col-xl-1{float:left;width:8.333333%}.mdui-col-offset-xl-1{margin-left:8.333333%}.mdui-row-xl-1 .mdui-col{float:left;width:100%}.mdui-col-xl-2{float:left;width:16.666667%}.mdui-col-offset-xl-2{margin-left:16.666667%}.mdui-row-xl-2 .mdui-col{float:left;width:50%}.mdui-col-xl-3{float:left;width:25%}.mdui-col-offset-xl-3{margin-left:25%}.mdui-row-xl-3 .mdui-col{float:left;width:33.333333%}.mdui-col-xl-4{float:left;width:33.333333%}.mdui-col-offset-xl-4{margin-left:33.333333%}.mdui-row-xl-4 .mdui-col{float:left;width:25%}.mdui-col-xl-5{float:left;width:41.666667%}.mdui-col-offset-xl-5{margin-left:41.666667%}.mdui-row-xl-5 .mdui-col{float:left;width:20%}.mdui-col-xl-6{float:left;width:50%}.mdui-col-offset-xl-6{margin-left:50%}.mdui-row-xl-6 .mdui-col{float:left;width:16.666667%}.mdui-col-xl-7{float:left;width:58.333333%}.mdui-col-offset-xl-7{margin-left:58.333333%}.mdui-row-xl-7 .mdui-col{float:left;width:14.285714%}.mdui-col-xl-8{float:left;width:66.666667%}.mdui-col-offset-xl-8{margin-left:66.666667%}.mdui-row-xl-8 .mdui-col{float:left;width:12.5%}.mdui-col-xl-9{float:left;width:75%}.mdui-col-offset-xl-9{margin-left:75%}.mdui-row-xl-9 .mdui-col{float:left;width:11.111111%}.mdui-col-xl-10{float:left;width:83.333333%}.mdui-col-offset-xl-10{margin-left:83.333333%}.mdui-row-xl-10 .mdui-col{float:left;width:10%}.mdui-col-xl-11{float:left;width:91.666667%}.mdui-col-offset-xl-11{margin-left:91.666667%}.mdui-row-xl-11 .mdui-col{float:left;width:9.090909%}.mdui-col-xl-12{float:left;width:100%}.mdui-col-offset-xl-12{margin-left:100%}.mdui-row-xl-12 .mdui-col{float:left;width:8.333333%}}.mdui-toolbar{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;width:100%;-webkit-box-sizing:border-box;box-sizing:border-box;-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center}.mdui-toolbar>*{margin:0 16px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.mdui-toolbar[class*=mdui-color-]:not(.mdui-color-transparent) .mdui-btn:hover{background-color:rgba(255,255,255,.1)}.mdui-toolbar[class*=mdui-color-]:not(.mdui-color-transparent) .mdui-btn:active{background-color:rgba(255,255,255,.165)}.mdui-toolbar>a{color:inherit;text-decoration:none;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.mdui-toolbar>.mdui-btn-icon{width:48px;min-width:48px;height:48px}@media (orientation:landscape) and (max-width:959px){.mdui-toolbar>.mdui-btn-icon{width:40px;min-width:40px;height:40px}}.mdui-toolbar>.mdui-btn-icon .mdui-icon{height:24px;line-height:24px}.mdui-toolbar .mdui-icon{color:inherit}.mdui-toolbar-spacer{margin:0;-webkit-box-flex:1;-webkit-flex-grow:1;-ms-flex-positive:1;flex-grow:1}.mdui-toolbar{height:56px;line-height:56px}.mdui-toolbar>.mdui-btn{margin:0 4px}.mdui-toolbar>.mdui-btn+.mdui-btn{margin-left:0}@media (min-width:600px){.mdui-appbar .mdui-toolbar{height:64px;line-height:64px}.mdui-appbar .mdui-toolbar>.mdui-btn{margin:0 8px}.mdui-appbar .mdui-toolbar>.mdui-btn+.mdui-btn{margin-left:0}}@media (orientation:landscape) and (max-width:959px){.mdui-appbar .mdui-toolbar{height:48px;line-height:48px}.mdui-appbar .mdui-toolbar>.mdui-btn{margin:0 4px}.mdui-appbar .mdui-toolbar>.mdui-btn+.mdui-btn{margin-left:0}}.mdui-appbar{z-index:1000;width:100%;-webkit-box-shadow:0 2px 4px -1px rgba(0,0,0,.2),0 4px 5px 0 rgba(0,0,0,.14),0 1px 10px 0 rgba(0,0,0,.12);box-shadow:0 2px 4px -1px rgba(0,0,0,.2),0 4px 5px 0 rgba(0,0,0,.14),0 1px 10px 0 rgba(0,0,0,.12)}.mdui-appbar-fixed{position:fixed;top:0;right:0;left:0}.mdui-appbar-with-toolbar{padding-top:56px}@media (min-width:600px){.mdui-appbar-with-toolbar{padding-top:64px}}@media (orientation:landscape) and (max-width:959px){.mdui-appbar-with-toolbar{padding-top:48px}}.mdui-appbar-with-tab{padding-top:48px}.mdui-appbar-with-tab-larger{padding-top:72px}.mdui-appbar-with-toolbar.mdui-appbar-with-tab{padding-top:104px}@media (min-width:600px){.mdui-appbar-with-toolbar.mdui-appbar-with-tab{padding-top:112px}}@media (orientation:landscape) and (max-width:959px){.mdui-appbar-with-toolbar.mdui-appbar-with-tab{padding-top:96px}}.mdui-appbar-with-toolbar.mdui-appbar-with-tab-larger{padding-top:128px}@media (min-width:600px){.mdui-appbar-with-toolbar.mdui-appbar-with-tab-larger{padding-top:136px}}@media (orientation:landscape) and (max-width:959px){.mdui-appbar-with-toolbar.mdui-appbar-with-tab-larger{padding-top:120px}}.mdui-theme-layout-dark .mdui-appbar>[class*=mdui-color-]:not(.mdui-color-transparent){color:#fff!important;background-color:#212121!important}.mdui-card{position:relative;-webkit-box-sizing:border-box;box-sizing:border-box;overflow:hidden;color:#000;background-color:#fff;border-radius:25px;-webkit-box-shadow:0 3px 1px -2px rgba(0,0,0,.2),0 2px 2px 0 rgba(0,0,0,.14),0 1px 5px 0 rgba(0,0,0,.12);box-shadow:0 3px 1px -2px rgba(0,0,0,.2),0 2px 2px 0 rgba(0,0,0,.14),0 1px 5px 0 rgba(0,0,0,.12)}.mdui-card-header{position:relative;height:72px;-webkit-box-sizing:border-box;box-sizing:border-box;padding:16px}.mdui-card-header-avatar{float:left;width:40px;height:40px;border-radius:50%}.mdui-card-header-title{display:block;margin-left:52px;overflow:hidden;font-size:16px;font-weight:500;line-height:20px;text-overflow:ellipsis;white-space:nowrap;opacity:.87}.mdui-card-header-subtitle{display:block;margin-left:52px;overflow:hidden;font-size:14px;font-weight:400;line-height:20px;text-overflow:ellipsis;white-space:nowrap;opacity:.54}.mdui-card-primary{position:relative;padding:24px 16px 16px 16px}.mdui-card-primary-title{display:block;font-size:24px;line-height:36px;opacity:.87}.mdui-card-primary-subtitle{display:block;font-size:14px;line-height:24px;opacity:.54}.mdui-card-content{position:relative;padding:16px;font-size:14px;line-height:24px}.mdui-card-menu{position:absolute;top:16px;right:16px;z-index:1}.mdui-card-menu .mdui-btn{margin-left:8px}.mdui-card-actions{position:relative;-webkit-box-sizing:border-box;box-sizing:border-box;padding:8px}.mdui-card-actions:after,.mdui-card-actions:before{display:table;content:" "}.mdui-card-actions:after{clear:both}.mdui-card-actions:after,.mdui-card-actions:before{display:table;content:" "}.mdui-card-actions:after{clear:both}.mdui-card-actions .mdui-btn{max-width:100%;margin:0 8px 0 0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.mdui-card-actions .mdui-btn-icon{width:36px;height:36px;margin:0 8px}.mdui-card-actions-stacked .mdui-btn{display:block;margin:0 0 4px 0}.mdui-card-actions-stacked .mdui-btn:last-child{margin:0}.mdui-card-media{position:relative}.mdui-card-media img,.mdui-card-media video{display:block;width:100%}.mdui-card-media-covered{position:absolute;right:0;bottom:0;left:0;color:#fff;background:rgba(0,0,0,.2)}.mdui-card-media-covered .mdui-card-primary-title{opacity:1}.mdui-card-media-covered .mdui-card-primary-subtitle{opacity:.7}.mdui-card-media-covered-top{top:0;bottom:auto}.mdui-card-media-covered-transparent{background:0 0}.mdui-card-media-covered-gradient{background:-webkit-gradient(linear,left bottom,left top,from(rgba(0,0,0,.26)),to(rgba(0,0,0,0)));background:linear-gradient(to top,rgba(0,0,0,.26),rgba(0,0,0,0))}.mdui-card-media-covered-gradient.mdui-card-media-covered-top{background:-webkit-gradient(linear,left top,left bottom,from(rgba(0,0,0,.26)),to(rgba(0,0,0,0)));background:linear-gradient(to bottom,rgba(0,0,0,.26),rgba(0,0,0,0))}.mdui-theme-layout-dark .mdui-card{color:#fff;background-color:#424242}.mdui-tab{position:relative;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;min-height:48px;max-height:72px;padding:0;margin:0 auto;overflow-x:auto;overflow-y:hidden;-webkit-overflow-scrolling:touch;white-space:nowrap}.mdui-tab a{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;min-width:72px;min-height:48px;max-height:72px;-webkit-box-sizing:border-box;box-sizing:border-box;padding:12px;overflow:hidden;font-size:14px;color:inherit;text-align:center;text-decoration:none;text-overflow:ellipsis;text-transform:uppercase;cursor:pointer;flex-direction:column;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;opacity:.7;-webkit-box-flex:1;-webkit-flex:1;-ms-flex:1;flex:1;-webkit-box-orient:vertical;-webkit-box-direction:normal;-webkit-flex-direction:column;-ms-flex-direction:column;-webkit-box-pack:center;-webkit-justify-content:center;-ms-flex-pack:center;justify-content:center;-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center}.mdui-tab a .mdui-icon{opacity:.7}@media (min-width:600px){.mdui-tab a{min-width:99px;max-width:264px;padding:12px 24px;-webkit-box-flex:0;-webkit-flex:none;-ms-flex:none;flex:none}}@media (min-width:1024px){.mdui-tab a{min-width:112px}}@media (min-width:1440px){.mdui-tab a{min-width:136px}}@media (min-width:1920px){.mdui-tab a{min-width:160px}}.mdui-tab a label{display:block;width:100%;cursor:pointer}.mdui-tab a .mdui-icon+label{margin-top:8px}.mdui-tab a[disabled]{cursor:default;opacity:.38}.mdui-tab a[disabled] label{cursor:default}.mdui-tab .mdui-tab-active{color:#3f51b5;opacity:1}.mdui-tab .mdui-tab-active .mdui-icon{opacity:1}@media (min-width:600px){.mdui-tab-centered:before{content:' ';-webkit-box-flex:1;-webkit-flex-grow:1;-ms-flex-positive:1;flex-grow:1}.mdui-tab-centered:after{content:' ';-webkit-box-flex:1;-webkit-flex-grow:1;-ms-flex-positive:1;flex-grow:1}.mdui-tab-centered a{-webkit-box-flex:0;-webkit-flex:none;-ms-flex:none;flex:none}}.mdui-tab-full-width a{max-width:none;-webkit-box-flex:1;-webkit-flex:1;-ms-flex:1;flex:1}.mdui-tab-scrollable{padding-left:56px}.mdui-tab-scrollable a{-webkit-box-flex:0;-webkit-flex:none;-ms-flex:none;flex:none}@media (max-width:599px){.mdui-tab-scrollable{padding-left:60px}}.mdui-tab-indicator{position:absolute;bottom:0;height:2px;background-color:#3f51b5;-webkit-transition:all .35s cubic-bezier(.4,0,.2,1);transition:all .35s cubic-bezier(.4,0,.2,1);will-change:left,width}.mdui-theme-primary-amber .mdui-tab .mdui-tab-active{color:#ffc107}.mdui-theme-primary-amber .mdui-tab-indicator{background-color:#ffc107}.mdui-theme-primary-blue .mdui-tab .mdui-tab-active{color:#2196f3}.mdui-theme-primary-blue .mdui-tab-indicator{background-color:#2196f3}.mdui-theme-primary-blue-grey .mdui-tab .mdui-tab-active{color:#607d8b}.mdui-theme-primary-blue-grey .mdui-tab-indicator{background-color:#607d8b}.mdui-theme-primary-brown .mdui-tab .mdui-tab-active{color:#795548}.mdui-theme-primary-brown .mdui-tab-indicator{background-color:#795548}.mdui-theme-primary-cyan .mdui-tab .mdui-tab-active{color:#00bcd4}.mdui-theme-primary-cyan .mdui-tab-indicator{background-color:#00bcd4}.mdui-theme-primary-deep-orange .mdui-tab .mdui-tab-active{color:#ff5722}.mdui-theme-primary-deep-orange .mdui-tab-indicator{background-color:#ff5722}.mdui-theme-primary-deep-purple .mdui-tab .mdui-tab-active{color:#673ab7}.mdui-theme-primary-deep-purple .mdui-tab-indicator{background-color:#673ab7}.mdui-theme-primary-green .mdui-tab .mdui-tab-active{color:#4caf50}.mdui-theme-primary-green .mdui-tab-indicator{background-color:#4caf50}.mdui-theme-primary-grey .mdui-tab .mdui-tab-active{color:#9e9e9e}.mdui-theme-primary-grey .mdui-tab-indicator{background-color:#9e9e9e}.mdui-theme-primary-indigo .mdui-tab .mdui-tab-active{color:#3f51b5}.mdui-theme-primary-indigo .mdui-tab-indicator{background-color:#3f51b5}.mdui-theme-primary-light-blue .mdui-tab .mdui-tab-active{color:#03a9f4}.mdui-theme-primary-light-blue .mdui-tab-indicator{background-color:#03a9f4}.mdui-theme-primary-light-green .mdui-tab .mdui-tab-active{color:#8bc34a}.mdui-theme-primary-light-green .mdui-tab-indicator{background-color:#8bc34a}.mdui-theme-primary-lime .mdui-tab .mdui-tab-active{color:#cddc39}.mdui-theme-primary-lime .mdui-tab-indicator{background-color:#cddc39}.mdui-theme-primary-orange .mdui-tab .mdui-tab-active{color:#ff9800}.mdui-theme-primary-orange .mdui-tab-indicator{background-color:#ff9800}.mdui-theme-primary-pink .mdui-tab .mdui-tab-active{color:#e91e63}.mdui-theme-primary-pink .mdui-tab-indicator{background-color:#e91e63}.mdui-theme-primary-purple .mdui-tab .mdui-tab-active{color:#9c27b0}.mdui-theme-primary-purple .mdui-tab-indicator{background-color:#9c27b0}.mdui-theme-primary-red .mdui-tab .mdui-tab-active{color:#f44336}.mdui-theme-primary-red .mdui-tab-indicator{background-color:#f44336}.mdui-theme-primary-teal .mdui-tab .mdui-tab-active{color:#009688}.mdui-theme-primary-teal .mdui-tab-indicator{background-color:#009688}.mdui-theme-primary-yellow .mdui-tab .mdui-tab-active{color:#ffeb3b}.mdui-theme-primary-yellow .mdui-tab-indicator{background-color:#ffeb3b}.mdui-tab[class*=mdui-color-]:not(.mdui-color-white) .mdui-tab-active{color:inherit}.mdui-tab[class*=mdui-color-]:not(.mdui-color-white) .mdui-tab-indicator{background-color:#fff}.mdui-tab[class*=mdui-color-]:not(.mdui-color-white)::-webkit-scrollbar{width:5px;height:5px;background:0 0}@media (min-width:1024px){.mdui-tab[class*=mdui-color-]:not(.mdui-color-white)::-webkit-scrollbar{width:8px;height:8px}}.mdui-tab[class*=mdui-color-]:not(.mdui-color-white)::-webkit-scrollbar-thumb{background:rgba(255,255,255,.3)}.mdui-subheader,.mdui-subheader-inset{position:relative;height:48px;-webkit-box-sizing:border-box;box-sizing:border-box;padding-right:16px;padding-left:16px;overflow:hidden;font-size:14px;font-weight:500;line-height:48px;color:rgba(0,0,0,.54);text-overflow:ellipsis;white-space:nowrap;cursor:default}.mdui-subheader-inset{padding-left:72px}.mdui-theme-layout-dark .mdui-subheader,.mdui-theme-layout-dark .mdui-subheader-inset{color:rgba(255,255,255,.7)}.mdui-grid-list{margin:0 -2px}.mdui-grid-list .mdui-col,.mdui-grid-list [class*=mdui-col-lg-],.mdui-grid-list [class*=mdui-col-md-],.mdui-grid-list [class*=mdui-col-sm-],.mdui-grid-list [class*=mdui-col-xl-],.mdui-grid-list [class*=mdui-col-xs-]{padding-right:2px;padding-left:2px}.mdui-grid-tile{position:relative;-webkit-box-sizing:border-box;box-sizing:border-box;margin-bottom:4px;overflow:hidden}.mdui-grid-tile img{display:block;width:100%}.mdui-grid-tile-actions{position:absolute;right:0;bottom:0;left:0;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;min-height:48px;max-height:68px;-webkit-box-sizing:border-box;box-sizing:border-box;padding:16px;color:#fff;background:rgba(0,0,0,.2);-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center}.mdui-grid-tile-actions .mdui-icon{color:#fff}.mdui-grid-tile-text{overflow:hidden;-webkit-box-flex:1;-webkit-flex:1;-ms-flex:1;flex:1}.mdui-grid-tile-title{height:16px;overflow:hidden;font-size:16px;line-height:16px;text-overflow:ellipsis;white-space:nowrap}.mdui-grid-tile-title .mdui-icon{margin-right:8px}.mdui-grid-tile-subtitle{height:18px;margin-top:4px;overflow:hidden;font-size:12px;line-height:18px;text-overflow:ellipsis;white-space:nowrap}.mdui-grid-tile-subtitle .mdui-icon{margin-right:8px;font-size:18px}.mdui-grid-tile-buttons{margin:-8px;white-space:nowrap;-webkit-box-flex:0;-webkit-flex:none;-ms-flex:none;flex:none}.mdui-grid-tile-buttons .mdui-btn{margin-left:8px}.mdui-grid-tile-buttons .mdui-btn:first-child{margin-left:0}.mdui-grid-tile-text+.mdui-grid-tile-buttons{margin-left:8px}.mdui-grid-tile-buttons+.mdui-grid-tile-text{margin-left:16px}.mdui-grid-tile-actions-top{top:0;bottom:auto}.mdui-grid-tile-actions-transparent{background:0 0}.mdui-grid-tile-actions-gradient{background:-webkit-gradient(linear,left bottom,left top,from(rgba(0,0,0,.26)),to(rgba(0,0,0,0)));background:linear-gradient(to top,rgba(0,0,0,.26),rgba(0,0,0,0))}.mdui-grid-tile-actions-gradient.mdui-grid-tile-actions-top{background:-webkit-gradient(linear,left top,left bottom,from(rgba(0,0,0,.26)),to(rgba(0,0,0,0)));background:linear-gradient(to bottom,rgba(0,0,0,.26),rgba(0,0,0,0))}.mdui-list{padding:8px 0;margin:0;list-style:none;background-color:transparent}.mdui-list .mdui-list{padding:0}.mdui-list>.mdui-divider,.mdui-list>.mdui-divider-dark,.mdui-list>.mdui-divider-inset,.mdui-list>.mdui-divider-inset-dark,.mdui-list>.mdui-divider-inset-light,.mdui-list>.mdui-divider-light{margin-top:8px;margin-bottom:8px}.mdui-list a{color:inherit;text-decoration:none}.mdui-list .mdui-subheader,.mdui-list .mdui-subheader-inset{margin-top:8px}.mdui-list .mdui-subheader-inset:before,.mdui-list .mdui-subheader:before{position:absolute;right:0;left:0;display:block;height:1px;content:' ';background-color:rgba(0,0,0,.12)}.mdui-list .mdui-subheader-inset:first-child,.mdui-list .mdui-subheader:first-child{margin-top:-8px}.mdui-list .mdui-subheader-inset:first-child:before,.mdui-list .mdui-subheader:first-child:before{background-color:transparent}.mdui-list .mdui-subheader-inset:before{left:72px}.mdui-list-item{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;min-height:48px;-webkit-box-sizing:border-box;box-sizing:border-box;padding:0 16px;text-decoration:none;cursor:pointer;-webkit-transition:background-color .3s cubic-bezier(.4,0,.2,1);transition:background-color .3s cubic-bezier(.4,0,.2,1);-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center}.mdui-list-item:hover{background-color:rgba(0,0,0,.08)}.mdui-list-item:after{height:48px;visibility:hidden;content:' '}.mdui-list-item-icon{width:24px;min-width:24px;height:24px;color:rgba(0,0,0,.54)}.mdui-list-item-avatar{min-width:40px;max-width:40px;height:40px;margin-top:8px;margin-bottom:8px;line-height:40px;color:#fff;text-align:center;background-color:#bdbdbd;border-radius:50%}.mdui-list-item-avatar img{width:100%;height:100%;border-radius:50%}.mdui-list-item-content{padding-top:14px;padding-bottom:14px;font-size:16px;font-weight:400;line-height:20px;-webkit-box-flex:1;-webkit-flex-grow:1;-ms-flex-positive:1;flex-grow:1}.mdui-list-item-text{font-size:14px;color:rgba(0,0,0,.54)}.mdui-list-item-title~.mdui-list-item-text{margin-top:4px}.mdui-list-item-active{font-weight:700;background-color:rgba(0,0,0,.08)}.mdui-list-item-active .mdui-list-item-content{font-weight:700}.mdui-list-item-active .mdui-list-item-text{font-weight:400}.mdui-list-item-one-line,.mdui-list-item-three-line,.mdui-list-item-two-line{display:-webkit-box;overflow:hidden;text-overflow:ellipsis;-webkit-box-orient:vertical}.mdui-list-item-one-line{height:20px;-webkit-line-clamp:1}.mdui-list-item-two-line{height:40px;-webkit-line-clamp:2}.mdui-list-item-three-line{height:60px;-webkit-line-clamp:3}.mdui-list-item-icon~.mdui-list-item-content{margin-left:32px}.mdui-checkbox~.mdui-list-item-content,.mdui-radio~.mdui-list-item-content,.mdui-switch~.mdui-list-item-content{margin-left:20px}.mdui-list-item-avatar~.mdui-list-item-content{margin-left:16px}.mdui-list-item-content~.mdui-checkbox,.mdui-list-item-content~.mdui-list-item-avatar,.mdui-list-item-content~.mdui-list-item-icon,.mdui-list-item-content~.mdui-radio,.mdui-list-item-content~.mdui-switch{margin-left:16px}.mdui-list-item-content~.mdui-checkbox,.mdui-list-item-content~.mdui-radio{padding-left:24px}.mdui-list-dense{padding:4px 0;font-size:13px}.mdui-list-dense>.mdui-divider,.mdui-list-dense>.mdui-divider-dark,.mdui-list-dense>.mdui-divider-inset,.mdui-list-dense>.mdui-divider-inset-dark,.mdui-list-dense>.mdui-divider-inset-light,.mdui-list-dense>.mdui-divider-light{margin-top:4px;margin-bottom:4px}.mdui-list-dense .mdui-subheader,.mdui-list-dense .mdui-subheader-inset{height:40px;margin-top:4px;font-size:12px;line-height:40px}.mdui-list-dense .mdui-subheader-inset:first-child,.mdui-list-dense .mdui-subheader:first-child{margin-top:-4px}.mdui-list-dense .mdui-list-item{min-height:40px}.mdui-list-dense .mdui-list-item:after{height:40px}.mdui-list-dense .mdui-list-item-icon{width:20px;height:20px;font-size:20px}.mdui-list-dense .mdui-list-item-avatar{min-width:36px;height:36px;min-height:36px}.mdui-list-dense .mdui-list-item-content{padding-top:11px;padding-bottom:11px;font-size:13px;line-height:18px}.mdui-list-dense .mdui-list-item-text{font-size:13px}.mdui-list-dense .mdui-list-item-title~.mdui-list-item-text{margin-top:2px}.mdui-list-dense .mdui-list-item-one-line{height:18px}.mdui-list-dense .mdui-list-item-two-line{height:36px}.mdui-list-dense .mdui-list-item-three-line{height:54px}.mdui-theme-layout-dark .mdui-list .mdui-subheader-inset:before,.mdui-theme-layout-dark .mdui-list .mdui-subheader:before{background-color:rgba(255,255,255,.12)}.mdui-theme-layout-dark .mdui-list .mdui-subheader-inset:first-child:before,.mdui-theme-layout-dark .mdui-list .mdui-subheader:first-child:before{background-color:transparent}.mdui-theme-layout-dark .mdui-list-item{color:#fff}.mdui-theme-layout-dark .mdui-list-item:hover{background-color:rgba(255,255,255,.08)}.mdui-theme-layout-dark .mdui-list-item-icon{color:#fff}.mdui-theme-layout-dark .mdui-list-item-text{color:rgba(255,255,255,.7)}.mdui-theme-layout-dark .mdui-list-item-active{background-color:rgba(255,255,255,.08)}[class*=mdui-color-] .mdui-list-item{color:inherit}[class*=mdui-color-] .mdui-list-item-icon{color:inherit}body.mdui-loaded{-webkit-transition:padding .3s cubic-bezier(0,0,.2,1);transition:padding .3s cubic-bezier(0,0,.2,1)}body.mdui-loaded .mdui-drawer{-webkit-transition:all .3s cubic-bezier(0,0,.2,1);transition:all .3s cubic-bezier(0,0,.2,1)}.mdui-drawer{position:fixed;top:0;bottom:0;left:0;z-index:5000;width:calc(100% - 56px);max-width:280px;-webkit-box-sizing:border-box;box-sizing:border-box;margin:0;overflow-x:hidden;overflow-y:auto;-webkit-overflow-scrolling:touch;white-space:nowrap;will-change:transform}@media (max-width:1023px){.mdui-drawer:not(.mdui-drawer-open){-webkit-box-shadow:none!important;box-shadow:none!important}}@media (min-width:600px){.mdui-drawer{width:calc(100% - 64px);max-width:320px}}@media (min-width:1024px){.mdui-drawer{width:240px;max-width:none}.mdui-drawer.mdui-drawer-close{-webkit-box-shadow:none!important;box-shadow:none!important}}.mdui-drawer-right{right:0;left:auto}@media (max-width:1023px){.mdui-drawer{background-color:#fff;-webkit-box-shadow:0 8px 10px -5px rgba(0,0,0,.2),0 16px 24px 2px rgba(0,0,0,.14),0 6px 30px 5px rgba(0,0,0,.12);box-shadow:0 8px 10px -5px rgba(0,0,0,.2),0 16px 24px 2px rgba(0,0,0,.14),0 6px 30px 5px rgba(0,0,0,.12);-webkit-transform:translateX(-330px);transform:translateX(-330px)}.mdui-drawer-right{-webkit-transform:translateX(330px);transform:translateX(330px)}}@media (max-width:599px){.mdui-drawer{-webkit-transform:translateX(-290px);transform:translateX(-290px)}.mdui-drawer-right{-webkit-transform:translateX(290px);transform:translateX(290px)}}.mdui-drawer-close{-webkit-transform:translateX(-290px);transform:translateX(-290px)}.mdui-drawer-close.mdui-drawer-right{-webkit-transform:translateX(290px);transform:translateX(290px)}@media (min-width:600px){.mdui-drawer-close{-webkit-transform:translateX(-330px);transform:translateX(-330px)}.mdui-drawer-close.mdui-drawer-right{-webkit-transform:translateX(330px);transform:translateX(330px)}}@media (min-width:1024px){.mdui-drawer-close{-webkit-transform:translateX(-250px);transform:translateX(-250px)}.mdui-drawer-close.mdui-drawer-right{-webkit-transform:translateX(250px);transform:translateX(250px)}}.mdui-drawer-open{-webkit-transform:translateX(0)!important;transform:translateX(0)!important}@media (min-width:1024px){.mdui-drawer-body-left{padding-left:240px}.mdui-drawer-body-right{padding-right:240px}.mdui-appbar-with-toolbar .mdui-drawer{top:64px}.mdui-appbar-with-tab .mdui-drawer{top:48px}.mdui-appbar-with-tab-larger .mdui-drawer{top:72px}.mdui-appbar-with-toolbar.mdui-appbar-with-tab .mdui-drawer{top:112px}.mdui-appbar-with-toolbar.mdui-appbar-with-tab-larger .mdui-drawer{top:136px}}.mdui-drawer[class*=mdui-color-]:not(.mdui-color-transparent){-webkit-box-shadow:0 8px 10px -5px rgba(0,0,0,.2),0 16px 24px 2px rgba(0,0,0,.14),0 6px 30px 5px rgba(0,0,0,.12);box-shadow:0 8px 10px -5px rgba(0,0,0,.2),0 16px 24px 2px rgba(0,0,0,.14),0 6px 30px 5px rgba(0,0,0,.12)}.mdui-drawer-full-height{top:0!important}@media (max-width:1023px){.mdui-theme-layout-dark .mdui-drawer{background-color:#424242}}.mdui-dialog{position:fixed;right:0;left:0;z-index:6000;display:none;width:92%;min-width:180px;max-width:728px;max-height:90%;-webkit-box-sizing:border-box;box-sizing:border-box;margin:auto;overflow:hidden;color:#000;background-color:#fff;border-radius:2px;-webkit-box-shadow:0 11px 15px -7px rgba(0,0,0,.2),0 24px 38px 3px rgba(0,0,0,.14),0 9px 46px 8px rgba(0,0,0,.12);box-shadow:0 11px 15px -7px rgba(0,0,0,.2),0 24px 38px 3px rgba(0,0,0,.14),0 9px 46px 8px rgba(0,0,0,.12);opacity:0;-webkit-transition-duration:.3s;transition-duration:.3s;-webkit-transition-property:opacity,visibility,-webkit-transform;transition-property:opacity,visibility,-webkit-transform;transition-property:transform,opacity,visibility;transition-property:transform,opacity,visibility,-webkit-transform;-webkit-transform:scale(.95);transform:scale(.95);will-change:top,opacity,transform}@media (min-width:600px){.mdui-dialog{width:85%;max-height:85%}}@media (min-width:1024px){.mdui-dialog{width:80%;max-height:80%}}.mdui-dialog-open{opacity:1;-webkit-transform:scale(1);transform:scale(1)}.mdui-dialog-title{-webkit-box-sizing:border-box;box-sizing:border-box;font-size:20px;font-weight:500;line-height:24px;text-align:left}.mdui-dialog>.mdui-dialog-title{padding:24px 24px 20px 24px}.mdui-dialog-content{-webkit-box-sizing:border-box;box-sizing:border-box;padding:24px;overflow-y:auto;-webkit-overflow-scrolling:touch;font-size:15px;line-height:1.5;color:rgba(0,0,0,.7)}.mdui-dialog-content>.mdui-dialog-title{padding-bottom:20px}.mdui-dialog-title+.mdui-dialog-content{padding-top:0}.mdui-dialog-actions{-webkit-box-sizing:border-box;box-sizing:border-box;padding:8px;text-align:right}.mdui-dialog-actions .mdui-btn{min-width:64px;margin-left:8px;color:#e91e63}.mdui-dialog-actions .mdui-btn:first-child{margin-left:0}.mdui-dialog-content>.mdui-dialog-actions{padding-top:32px;margin:0 -24px -24px -24px}.mdui-dialog-actions-stacked{padding:8px 0 8px 0}.mdui-dialog-actions-stacked .mdui-btn{width:100%;height:48px;margin:0;line-height:48px!important;text-align:right;border-radius:0}.mdui-theme-accent-amber .mdui-dialog-actions .mdui-btn{color:#ffc107}.mdui-theme-accent-blue .mdui-dialog-actions .mdui-btn{color:#2196f3}.mdui-theme-accent-cyan .mdui-dialog-actions .mdui-btn{color:#00bcd4}.mdui-theme-accent-deep-orange .mdui-dialog-actions .mdui-btn{color:#ff5722}.mdui-theme-accent-deep-purple .mdui-dialog-actions .mdui-btn{color:#673ab7}.mdui-theme-accent-green .mdui-dialog-actions .mdui-btn{color:#4caf50}.mdui-theme-accent-indigo .mdui-dialog-actions .mdui-btn{color:#3f51b5}.mdui-theme-accent-light-blue .mdui-dialog-actions .mdui-btn{color:#03a9f4}.mdui-theme-accent-light-green .mdui-dialog-actions .mdui-btn{color:#8bc34a}.mdui-theme-accent-lime .mdui-dialog-actions .mdui-btn{color:#cddc39}.mdui-theme-accent-orange .mdui-dialog-actions .mdui-btn{color:#ff9800}.mdui-theme-accent-pink .mdui-dialog-actions .mdui-btn{color:#e91e63}.mdui-theme-accent-purple .mdui-dialog-actions .mdui-btn{color:#9c27b0}.mdui-theme-accent-red .mdui-dialog-actions .mdui-btn{color:#f44336}.mdui-theme-accent-teal .mdui-dialog-actions .mdui-btn{color:#009688}.mdui-theme-accent-yellow .mdui-dialog-actions .mdui-btn{color:#ffeb3b}.mdui-theme-layout-dark .mdui-dialog{color:#fff;background-color:#424242}.mdui-theme-layout-dark .mdui-dialog-content{color:rgba(255,255,255,.7)}.mdui-dialog-alert{max-width:448px}.mdui-dialog-confirm{max-width:448px}.mdui-dialog-prompt{max-width:448px}.mdui-dialog-prompt .mdui-textfield{padding-top:0}.mdui-shadow-0{-webkit-box-shadow:none;box-shadow:none}.mdui-shadow-1{-webkit-box-shadow:0 2px 1px -1px rgba(0,0,0,.2),0 1px 1px 0 rgba(0,0,0,.14),0 1px 3px 0 rgba(0,0,0,.12);box-shadow:0 2px 1px -1px rgba(0,0,0,.2),0 1px 1px 0 rgba(0,0,0,.14),0 1px 3px 0 rgba(0,0,0,.12)}.mdui-shadow-2{-webkit-box-shadow:0 3px 1px -2px rgba(0,0,0,.2),0 2px 2px 0 rgba(0,0,0,.14),0 1px 5px 0 rgba(0,0,0,.12);box-shadow:0 3px 1px -2px rgba(0,0,0,.2),0 2px 2px 0 rgba(0,0,0,.14),0 1px 5px 0 rgba(0,0,0,.12)}.mdui-shadow-3{-webkit-box-shadow:0 3px 3px -2px rgba(0,0,0,.2),0 3px 4px 0 rgba(0,0,0,.14),0 1px 8px 0 rgba(0,0,0,.12);box-shadow:0 3px 3px -2px rgba(0,0,0,.2),0 3px 4px 0 rgba(0,0,0,.14),0 1px 8px 0 rgba(0,0,0,.12)}.mdui-shadow-4{-webkit-box-shadow:0 2px 4px -1px rgba(0,0,0,.2),0 4px 5px 0 rgba(0,0,0,.14),0 1px 10px 0 rgba(0,0,0,.12);box-shadow:0 2px 4px -1px rgba(0,0,0,.2),0 4px 5px 0 rgba(0,0,0,.14),0 1px 10px 0 rgba(0,0,0,.12)}.mdui-shadow-5{-webkit-box-shadow:0 3px 5px -1px rgba(0,0,0,.2),0 5px 8px 0 rgba(0,0,0,.14),0 1px 14px 0 rgba(0,0,0,.12);box-shadow:0 3px 5px -1px rgba(0,0,0,.2),0 5px 8px 0 rgba(0,0,0,.14),0 1px 14px 0 rgba(0,0,0,.12)}.mdui-shadow-6{-webkit-box-shadow:0 3px 5px -1px rgba(0,0,0,.2),0 6px 10px 0 rgba(0,0,0,.14),0 1px 18px 0 rgba(0,0,0,.12);box-shadow:0 3px 5px -1px rgba(0,0,0,.2),0 6px 10px 0 rgba(0,0,0,.14),0 1px 18px 0 rgba(0,0,0,.12)}.mdui-shadow-7{-webkit-box-shadow:0 4px 5px -2px rgba(0,0,0,.2),0 7px 10px 1px rgba(0,0,0,.14),0 2px 16px 1px rgba(0,0,0,.12);box-shadow:0 4px 5px -2px rgba(0,0,0,.2),0 7px 10px 1px rgba(0,0,0,.14),0 2px 16px 1px rgba(0,0,0,.12)}.mdui-shadow-8{-webkit-box-shadow:0 5px 5px -3px rgba(0,0,0,.2),0 8px 10px 1px rgba(0,0,0,.14),0 3px 14px 2px rgba(0,0,0,.12);box-shadow:0 5px 5px -3px rgba(0,0,0,.2),0 8px 10px 1px rgba(0,0,0,.14),0 3px 14px 2px rgba(0,0,0,.12)}.mdui-shadow-9{-webkit-box-shadow:0 5px 6px -3px rgba(0,0,0,.2),0 9px 12px 1px rgba(0,0,0,.14),0 3px 16px 2px rgba(0,0,0,.12);box-shadow:0 5px 6px -3px rgba(0,0,0,.2),0 9px 12px 1px rgba(0,0,0,.14),0 3px 16px 2px rgba(0,0,0,.12)}.mdui-shadow-10{-webkit-box-shadow:0 6px 6px -3px rgba(0,0,0,.2),0 10px 14px 1px rgba(0,0,0,.14),0 4px 18px 3px rgba(0,0,0,.12);box-shadow:0 6px 6px -3px rgba(0,0,0,.2),0 10px 14px 1px rgba(0,0,0,.14),0 4px 18px 3px rgba(0,0,0,.12)}.mdui-shadow-11{-webkit-box-shadow:0 6px 7px -4px rgba(0,0,0,.2),0 11px 15px 1px rgba(0,0,0,.14),0 4px 20px 3px rgba(0,0,0,.12);box-shadow:0 6px 7px -4px rgba(0,0,0,.2),0 11px 15px 1px rgba(0,0,0,.14),0 4px 20px 3px rgba(0,0,0,.12)}.mdui-shadow-12{-webkit-box-shadow:0 7px 8px -4px rgba(0,0,0,.2),0 12px 17px 2px rgba(0,0,0,.14),0 5px 22px 4px rgba(0,0,0,.12);box-shadow:0 7px 8px -4px rgba(0,0,0,.2),0 12px 17px 2px rgba(0,0,0,.14),0 5px 22px 4px rgba(0,0,0,.12)}.mdui-shadow-13{-webkit-box-shadow:0 7px 8px -4px rgba(0,0,0,.2),0 13px 19px 2px rgba(0,0,0,.14),0 5px 24px 4px rgba(0,0,0,.12);box-shadow:0 7px 8px -4px rgba(0,0,0,.2),0 13px 19px 2px rgba(0,0,0,.14),0 5px 24px 4px rgba(0,0,0,.12)}.mdui-shadow-14{-webkit-box-shadow:0 7px 9px -4px rgba(0,0,0,.2),0 14px 21px 2px rgba(0,0,0,.14),0 5px 26px 4px rgba(0,0,0,.12);box-shadow:0 7px 9px -4px rgba(0,0,0,.2),0 14px 21px 2px rgba(0,0,0,.14),0 5px 26px 4px rgba(0,0,0,.12)}.mdui-shadow-15{-webkit-box-shadow:0 8px 9px -5px rgba(0,0,0,.2),0 15px 22px 2px rgba(0,0,0,.14),0 6px 28px 5px rgba(0,0,0,.12);box-shadow:0 8px 9px -5px rgba(0,0,0,.2),0 15px 22px 2px rgba(0,0,0,.14),0 6px 28px 5px rgba(0,0,0,.12)}.mdui-shadow-16{-webkit-box-shadow:0 8px 10px -5px rgba(0,0,0,.2),0 16px 24px 2px rgba(0,0,0,.14),0 6px 30px 5px rgba(0,0,0,.12);box-shadow:0 8px 10px -5px rgba(0,0,0,.2),0 16px 24px 2px rgba(0,0,0,.14),0 6px 30px 5px rgba(0,0,0,.12)}.mdui-shadow-17{-webkit-box-shadow:0 8px 11px -5px rgba(0,0,0,.2),0 17px 26px 2px rgba(0,0,0,.14),0 6px 32px 5px rgba(0,0,0,.12);box-shadow:0 8px 11px -5px rgba(0,0,0,.2),0 17px 26px 2px rgba(0,0,0,.14),0 6px 32px 5px rgba(0,0,0,.12)}.mdui-shadow-18{-webkit-box-shadow:0 9px 11px -5px rgba(0,0,0,.2),0 18px 28px 2px rgba(0,0,0,.14),0 7px 34px 6px rgba(0,0,0,.12);box-shadow:0 9px 11px -5px rgba(0,0,0,.2),0 18px 28px 2px rgba(0,0,0,.14),0 7px 34px 6px rgba(0,0,0,.12)}.mdui-shadow-19{-webkit-box-shadow:0 9px 12px -6px rgba(0,0,0,.2),0 19px 29px 2px rgba(0,0,0,.14),0 7px 36px 6px rgba(0,0,0,.12);box-shadow:0 9px 12px -6px rgba(0,0,0,.2),0 19px 29px 2px rgba(0,0,0,.14),0 7px 36px 6px rgba(0,0,0,.12)}.mdui-shadow-20{-webkit-box-shadow:0 10px 13px -6px rgba(0,0,0,.2),0 20px 31px 3px rgba(0,0,0,.14),0 8px 38px 7px rgba(0,0,0,.12);box-shadow:0 10px 13px -6px rgba(0,0,0,.2),0 20px 31px 3px rgba(0,0,0,.14),0 8px 38px 7px rgba(0,0,0,.12)}.mdui-shadow-21{-webkit-box-shadow:0 10px 13px -6px rgba(0,0,0,.2),0 21px 33px 3px rgba(0,0,0,.14),0 8px 40px 7px rgba(0,0,0,.12);box-shadow:0 10px 13px -6px rgba(0,0,0,.2),0 21px 33px 3px rgba(0,0,0,.14),0 8px 40px 7px rgba(0,0,0,.12)}.mdui-shadow-22{-webkit-box-shadow:0 10px 14px -6px rgba(0,0,0,.2),0 22px 35px 3px rgba(0,0,0,.14),0 8px 42px 7px rgba(0,0,0,.12);box-shadow:0 10px 14px -6px rgba(0,0,0,.2),0 22px 35px 3px rgba(0,0,0,.14),0 8px 42px 7px rgba(0,0,0,.12)}.mdui-shadow-23{-webkit-box-shadow:0 11px 14px -7px rgba(0,0,0,.2),0 23px 36px 3px rgba(0,0,0,.14),0 9px 44px 8px rgba(0,0,0,.12);box-shadow:0 11px 14px -7px rgba(0,0,0,.2),0 23px 36px 3px rgba(0,0,0,.14),0 9px 44px 8px rgba(0,0,0,.12)}.mdui-shadow-24{-webkit-box-shadow:0 11px 15px -7px rgba(0,0,0,.2),0 24px 38px 3px rgba(0,0,0,.14),0 9px 46px 8px rgba(0,0,0,.12);box-shadow:0 11px 15px -7px rgba(0,0,0,.2),0 24px 38px 3px rgba(0,0,0,.14),0 9px 46px 8px rgba(0,0,0,.12)}.mdui-hoverable{-webkit-transition:-webkit-box-shadow .25s cubic-bezier(.4,0,.2,1);transition:-webkit-box-shadow .25s cubic-bezier(.4,0,.2,1);transition:box-shadow .25s cubic-bezier(.4,0,.2,1);transition:box-shadow .25s cubic-bezier(.4,0,.2,1),-webkit-box-shadow .25s cubic-bezier(.4,0,.2,1);will-change:box-shadow}.mdui-hoverable:focus,.mdui-hoverable:hover{-webkit-box-shadow:0 5px 5px -3px rgba(0,0,0,.2),0 8px 10px 1px rgba(0,0,0,.14),0 3px 14px 2px rgba(0,0,0,.12);box-shadow:0 5px 5px -3px rgba(0,0,0,.2),0 8px 10px 1px rgba(0,0,0,.14),0 3px 14px 2px rgba(0,0,0,.12)}.mdui-tooltip{position:absolute;z-index:9000;display:inline-block;max-width:180px;min-height:32px;-webkit-box-sizing:border-box;box-sizing:border-box;padding:8px 16px;font-size:14px;font-weight:500;line-height:22px;color:#fff;text-align:left;background-color:rgba(97,97,97,.9);border-radius:2px;opacity:0;-webkit-transition-timing-function:cubic-bezier(.4,0,.2,1);transition-timing-function:cubic-bezier(.4,0,.2,1);-webkit-transition-duration:.15s;transition-duration:.15s;-webkit-transition-property:opacity,-webkit-transform;transition-property:opacity,-webkit-transform;transition-property:opacity,transform;transition-property:opacity,transform,-webkit-transform;-webkit-transform:scale(0);transform:scale(0);will-change:opacity,transform}@media (min-width:1024px){.mdui-tooltip{max-width:200px;min-height:24px;padding:4px 8px;font-size:12px;line-height:18px}}.mdui-tooltip-open{opacity:1;-webkit-transform:scale(1);transform:scale(1)}.mdui-snackbar{position:fixed;z-index:7000;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;width:100%;min-height:48px;-webkit-box-sizing:border-box;box-sizing:border-box;padding:0 24px 0 24px;font-size:14px;line-height:20px;color:#fff;background-color:#323232;-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center;-webkit-box-pack:justify;-webkit-justify-content:space-between;-ms-flex-pack:justify;justify-content:space-between;will-change:transform}@media (min-width:600px){.mdui-snackbar{width:auto;min-width:288px;max-width:568px;border-radius:2px}}.mdui-snackbar-bottom,.mdui-snackbar-left-bottom,.mdui-snackbar-left-top,.mdui-snackbar-right-bottom,.mdui-snackbar-right-top,.mdui-snackbar-top{-webkit-transition:-webkit-transform .3s cubic-bezier(.4,0,.2,1);transition:-webkit-transform .3s cubic-bezier(.4,0,.2,1);transition:transform .3s cubic-bezier(.4,0,.2,1);transition:transform .3s cubic-bezier(.4,0,.2,1),-webkit-transform .3s cubic-bezier(.4,0,.2,1)}.mdui-snackbar-bottom,.mdui-snackbar-left-bottom,.mdui-snackbar-right-bottom{bottom:0}.mdui-snackbar-left-top,.mdui-snackbar-right-top,.mdui-snackbar-top{top:0}.mdui-snackbar-bottom,.mdui-snackbar-top{left:50%}@media (min-width:600px){.mdui-snackbar-left-top{top:24px;left:24px}.mdui-snackbar-left-bottom{bottom:24px;left:24px}.mdui-snackbar-right-top{top:24px;right:24px}.mdui-snackbar-right-bottom{right:24px;bottom:24px}}.mdui-snackbar-text{position:relative;max-width:100%;padding:14px 0 14px 0;overflow:hidden;text-overflow:ellipsis}.mdui-snackbar-action{margin-right:-16px;color:#ff80ab;white-space:nowrap}.mdui-theme-accent-amber .mdui-snackbar-action{color:#ffe57f}.mdui-theme-accent-blue .mdui-snackbar-action{color:#82b1ff}.mdui-theme-accent-cyan .mdui-snackbar-action{color:#84ffff}.mdui-theme-accent-deep-orange .mdui-snackbar-action{color:#ff9e80}.mdui-theme-accent-deep-purple .mdui-snackbar-action{color:#b388ff}.mdui-theme-accent-green .mdui-snackbar-action{color:#b9f6ca}.mdui-theme-accent-indigo .mdui-snackbar-action{color:#8c9eff}.mdui-theme-accent-light-blue .mdui-snackbar-action{color:#80d8ff}.mdui-theme-accent-light-green .mdui-snackbar-action{color:#ccff90}.mdui-theme-accent-lime .mdui-snackbar-action{color:#f4ff81}.mdui-theme-accent-orange .mdui-snackbar-action{color:#ffd180}.mdui-theme-accent-pink .mdui-snackbar-action{color:#ff80ab}.mdui-theme-accent-purple .mdui-snackbar-action{color:#ea80fc}.mdui-theme-accent-red .mdui-snackbar-action{color:#ff8a80}.mdui-theme-accent-teal .mdui-snackbar-action{color:#a7ffeb}.mdui-theme-accent-yellow .mdui-snackbar-action{color:#ffff8d}.mdui-theme-layout-dark .mdui-snackbar{background-color:#5d5d5d}.mdui-chip{display:inline-block;height:32px;-webkit-box-sizing:border-box;box-sizing:border-box;white-space:nowrap;cursor:pointer;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;background-color:#e0e0e0;border-radius:16px;-webkit-transition:-webkit-box-shadow .25s cubic-bezier(.4,0,.2,1);transition:-webkit-box-shadow .25s cubic-bezier(.4,0,.2,1);transition:box-shadow .25s cubic-bezier(.4,0,.2,1);transition:box-shadow .25s cubic-bezier(.4,0,.2,1),-webkit-box-shadow .25s cubic-bezier(.4,0,.2,1);will-change:box-shadow}.mdui-chip:focus,.mdui-chip:hover{-webkit-box-shadow:0 3px 1px -2px rgba(0,0,0,.2),0 2px 2px 0 rgba(0,0,0,.14),0 1px 5px 0 rgba(0,0,0,.12);box-shadow:0 3px 1px -2px rgba(0,0,0,.2),0 2px 2px 0 rgba(0,0,0,.14),0 1px 5px 0 rgba(0,0,0,.12)}.mdui-chip:active{background-color:#d6d6d6}.mdui-chip-icon{position:relative;display:inline-block;width:32px;height:32px;margin-right:-4px;overflow:hidden;font-size:18px;line-height:32px;color:#fff;text-align:center;vertical-align:middle;background-color:#989898;border-radius:50%}.mdui-chip-icon .mdui-icon{position:absolute;top:4px;left:4px;color:#fff}.mdui-chip-title{display:inline-block;height:32px;padding-right:12px;padding-left:12px;font-size:14px;line-height:32px;vertical-align:middle}.mdui-chip-delete{display:inline-block;width:24px;height:24px;margin-right:4px;margin-left:-8px;overflow:hidden;text-align:center;text-decoration:none;vertical-align:middle;cursor:pointer;border-radius:50%;opacity:.54;-webkit-transition:opacity .25s cubic-bezier(.4,0,.2,1);transition:opacity .25s cubic-bezier(.4,0,.2,1);will-change:opacity}.mdui-chip-delete:focus,.mdui-chip-delete:hover{opacity:.87}.mdui-theme-layout-dark .mdui-chip{background-color:#484848}.mdui-theme-layout-dark .mdui-chip:active{background-color:#5d5d5d}.mdui-bottom-nav{position:relative;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;height:56px;padding:0;margin:0 auto;overflow:hidden;white-space:nowrap}@media (min-width:600px){.mdui-bottom-nav:before{content:' ';-webkit-box-flex:1;-webkit-flex-grow:1;-ms-flex-positive:1;flex-grow:1}.mdui-bottom-nav:after{content:' ';-webkit-box-flex:1;-webkit-flex-grow:1;-ms-flex-positive:1;flex-grow:1}}.mdui-bottom-nav a{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;min-width:32px;max-width:none;padding:8px 12px 10px 12px;overflow:hidden;font-size:12px;color:inherit;text-align:center;text-decoration:none;text-overflow:ellipsis;cursor:pointer;flex-direction:column;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;opacity:.7;-webkit-transition:all .2s cubic-bezier(.4,0,.2,1);transition:all .2s cubic-bezier(.4,0,.2,1);-webkit-box-flex:1;-webkit-flex:1;-ms-flex:1;flex:1;-webkit-box-orient:vertical;-webkit-box-direction:normal;-webkit-flex-direction:column;-ms-flex-direction:column;-webkit-box-pack:center;-webkit-justify-content:center;-ms-flex-pack:center;justify-content:center;-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center;will-change:padding}@media (min-width:600px){.mdui-bottom-nav a{max-width:144px}}.mdui-bottom-nav a .mdui-icon{opacity:.7}.mdui-bottom-nav a label{display:block;width:100%;cursor:pointer;-webkit-transition:-webkit-transform .2s cubic-bezier(.4,0,.2,1);transition:-webkit-transform .2s cubic-bezier(.4,0,.2,1);transition:transform .2s cubic-bezier(.4,0,.2,1);transition:transform .2s cubic-bezier(.4,0,.2,1),-webkit-transform .2s cubic-bezier(.4,0,.2,1);will-change:font-size}.mdui-bottom-nav a .mdui-icon+label{margin-top:6px}.mdui-bottom-nav a.mdui-bottom-nav-active{font-size:14px;color:#3f51b5;opacity:1}.mdui-bottom-nav a.mdui-bottom-nav-active .mdui-icon{opacity:1}.mdui-bottom-nav-text-auto a{min-width:32px;padding-right:0;padding-left:0}@media (min-width:600px){.mdui-bottom-nav-text-auto a{max-width:156px}}.mdui-bottom-nav-text-auto a .mdui-icon{padding-top:16px;-webkit-transition:padding-top .2s cubic-bezier(.4,0,.2,1);transition:padding-top .2s cubic-bezier(.4,0,.2,1);will-change:padding-top}.mdui-bottom-nav-text-auto a label{-webkit-transform:scale(0);transform:scale(0)}.mdui-bottom-nav-text-auto a.mdui-bottom-nav-active{padding-right:18px;padding-left:18px}.mdui-bottom-nav-text-auto a.mdui-bottom-nav-active .mdui-icon{padding-top:0}.mdui-bottom-nav-text-auto a.mdui-bottom-nav-active label{-webkit-transform:scale(1);transform:scale(1)}.mdui-bottom-nav-fixed{padding-bottom:56px}.mdui-bottom-nav-fixed .mdui-bottom-nav{position:fixed;right:0;bottom:0;left:0}.mdui-theme-primary-amber .mdui-bottom-nav a.mdui-bottom-nav-active{color:#ffc107}.mdui-theme-primary-blue .mdui-bottom-nav a.mdui-bottom-nav-active{color:#2196f3}.mdui-theme-primary-blue-grey .mdui-bottom-nav a.mdui-bottom-nav-active{color:#607d8b}.mdui-theme-primary-brown .mdui-bottom-nav a.mdui-bottom-nav-active{color:#795548}.mdui-theme-primary-cyan .mdui-bottom-nav a.mdui-bottom-nav-active{color:#00bcd4}.mdui-theme-primary-deep-orange .mdui-bottom-nav a.mdui-bottom-nav-active{color:#ff5722}.mdui-theme-primary-deep-purple .mdui-bottom-nav a.mdui-bottom-nav-active{color:#673ab7}.mdui-theme-primary-green .mdui-bottom-nav a.mdui-bottom-nav-active{color:#4caf50}.mdui-theme-primary-grey .mdui-bottom-nav a.mdui-bottom-nav-active{color:#9e9e9e}.mdui-theme-primary-indigo .mdui-bottom-nav a.mdui-bottom-nav-active{color:#3f51b5}.mdui-theme-primary-light-blue .mdui-bottom-nav a.mdui-bottom-nav-active{color:#03a9f4}.mdui-theme-primary-light-green .mdui-bottom-nav a.mdui-bottom-nav-active{color:#8bc34a}.mdui-theme-primary-lime .mdui-bottom-nav a.mdui-bottom-nav-active{color:#cddc39}.mdui-theme-primary-orange .mdui-bottom-nav a.mdui-bottom-nav-active{color:#ff9800}.mdui-theme-primary-pink .mdui-bottom-nav a.mdui-bottom-nav-active{color:#e91e63}.mdui-theme-primary-purple .mdui-bottom-nav a.mdui-bottom-nav-active{color:#9c27b0}.mdui-theme-primary-red .mdui-bottom-nav a.mdui-bottom-nav-active{color:#f44336}.mdui-theme-primary-teal .mdui-bottom-nav a.mdui-bottom-nav-active{color:#009688}.mdui-theme-primary-yellow .mdui-bottom-nav a.mdui-bottom-nav-active{color:#ffeb3b}.mdui-bottom-nav[class*=mdui-color-] .mdui-bottom-nav-active{color:inherit!important}.mdui-progress{position:relative;display:block;width:100%;height:4px;overflow:hidden;background-color:rgba(63,81,181,.2);border-radius:2px}.mdui-progress-determinate{position:absolute;top:0;bottom:0;left:0;background-color:#3f51b5;-webkit-transition:width .3s linear;transition:width .3s linear}.mdui-progress-indeterminate{background-color:#3f51b5}.mdui-progress-indeterminate:before{position:absolute;top:0;bottom:0;left:0;content:' ';background-color:inherit;-webkit-animation:mdui-progress-indeterminate 2s linear infinite;animation:mdui-progress-indeterminate 2s linear infinite;will-change:left,width}.mdui-progress-indeterminate:after{position:absolute;top:0;bottom:0;left:0;content:' ';background-color:inherit;-webkit-animation:mdui-progress-indeterminate-short 2s linear infinite;animation:mdui-progress-indeterminate-short 2s linear infinite;will-change:left,width}@-webkit-keyframes mdui-progress-indeterminate{0%{left:0;width:0}50%{left:30%;width:70%}75%{left:100%;width:0}}@keyframes mdui-progress-indeterminate{0%{left:0;width:0}50%{left:30%;width:70%}75%{left:100%;width:0}}@-webkit-keyframes mdui-progress-indeterminate-short{0%{left:0;width:0}50%{left:0;width:0}75%{left:0;width:25%}100%{left:100%;width:0}}@keyframes mdui-progress-indeterminate-short{0%{left:0;width:0}50%{left:0;width:0}75%{left:0;width:25%}100%{left:100%;width:0}}.mdui-theme-primary-amber .mdui-progress{background-color:rgba(255,193,7,.2)}.mdui-theme-primary-amber .mdui-progress-determinate,.mdui-theme-primary-amber .mdui-progress-indeterminate{background-color:#ffc107}.mdui-theme-primary-blue .mdui-progress{background-color:rgba(33,150,243,.2)}.mdui-theme-primary-blue .mdui-progress-determinate,.mdui-theme-primary-blue .mdui-progress-indeterminate{background-color:#2196f3}.mdui-theme-primary-blue-grey .mdui-progress{background-color:rgba(96,125,139,.2)}.mdui-theme-primary-blue-grey .mdui-progress-determinate,.mdui-theme-primary-blue-grey .mdui-progress-indeterminate{background-color:#607d8b}.mdui-theme-primary-brown .mdui-progress{background-color:rgba(121,85,72,.2)}.mdui-theme-primary-brown .mdui-progress-determinate,.mdui-theme-primary-brown .mdui-progress-indeterminate{background-color:#795548}.mdui-theme-primary-cyan .mdui-progress{background-color:rgba(0,188,212,.2)}.mdui-theme-primary-cyan .mdui-progress-determinate,.mdui-theme-primary-cyan .mdui-progress-indeterminate{background-color:#00bcd4}.mdui-theme-primary-deep-orange .mdui-progress{background-color:rgba(255,87,34,.2)}.mdui-theme-primary-deep-orange .mdui-progress-determinate,.mdui-theme-primary-deep-orange .mdui-progress-indeterminate{background-color:#ff5722}.mdui-theme-primary-deep-purple .mdui-progress{background-color:rgba(103,58,183,.2)}.mdui-theme-primary-deep-purple .mdui-progress-determinate,.mdui-theme-primary-deep-purple .mdui-progress-indeterminate{background-color:#673ab7}.mdui-theme-primary-green .mdui-progress{background-color:rgba(76,175,80,.2)}.mdui-theme-primary-green .mdui-progress-determinate,.mdui-theme-primary-green .mdui-progress-indeterminate{background-color:#4caf50}.mdui-theme-primary-grey .mdui-progress{background-color:rgba(158,158,158,.2)}.mdui-theme-primary-grey .mdui-progress-determinate,.mdui-theme-primary-grey .mdui-progress-indeterminate{background-color:#9e9e9e}.mdui-theme-primary-indigo .mdui-progress{background-color:rgba(63,81,181,.2)}.mdui-theme-primary-indigo .mdui-progress-determinate,.mdui-theme-primary-indigo .mdui-progress-indeterminate{background-color:#3f51b5}.mdui-theme-primary-light-blue .mdui-progress{background-color:rgba(3,169,244,.2)}.mdui-theme-primary-light-blue .mdui-progress-determinate,.mdui-theme-primary-light-blue .mdui-progress-indeterminate{background-color:#03a9f4}.mdui-theme-primary-light-green .mdui-progress{background-color:rgba(139,195,74,.2)}.mdui-theme-primary-light-green .mdui-progress-determinate,.mdui-theme-primary-light-green .mdui-progress-indeterminate{background-color:#8bc34a}.mdui-theme-primary-lime .mdui-progress{background-color:rgba(205,220,57,.2)}.mdui-theme-primary-lime .mdui-progress-determinate,.mdui-theme-primary-lime .mdui-progress-indeterminate{background-color:#cddc39}.mdui-theme-primary-orange .mdui-progress{background-color:rgba(255,152,0,.2)}.mdui-theme-primary-orange .mdui-progress-determinate,.mdui-theme-primary-orange .mdui-progress-indeterminate{background-color:#ff9800}.mdui-theme-primary-pink .mdui-progress{background-color:rgba(233,30,99,.2)}.mdui-theme-primary-pink .mdui-progress-determinate,.mdui-theme-primary-pink .mdui-progress-indeterminate{background-color:#e91e63}.mdui-theme-primary-purple .mdui-progress{background-color:rgba(156,39,176,.2)}.mdui-theme-primary-purple .mdui-progress-determinate,.mdui-theme-primary-purple .mdui-progress-indeterminate{background-color:#9c27b0}.mdui-theme-primary-red .mdui-progress{background-color:rgba(244,67,54,.2)}.mdui-theme-primary-red .mdui-progress-determinate,.mdui-theme-primary-red .mdui-progress-indeterminate{background-color:#f44336}.mdui-theme-primary-teal .mdui-progress{background-color:rgba(0,150,136,.2)}.mdui-theme-primary-teal .mdui-progress-determinate,.mdui-theme-primary-teal .mdui-progress-indeterminate{background-color:#009688}.mdui-theme-primary-yellow .mdui-progress{background-color:rgba(255,235,59,.2)}.mdui-theme-primary-yellow .mdui-progress-determinate,.mdui-theme-primary-yellow .mdui-progress-indeterminate{background-color:#ffeb3b}.mdui-spinner{position:relative;display:inline-block;width:28px;height:28px;-webkit-animation:mdui-spinner 1568ms linear infinite;animation:mdui-spinner 1568ms linear infinite}@-webkit-keyframes mdui-spinner{to{-webkit-transform:rotate(360deg);transform:rotate(360deg)}}@keyframes mdui-spinner{to{-webkit-transform:rotate(360deg);transform:rotate(360deg)}}.mdui-spinner-layer{position:absolute;width:100%;height:100%;border-color:#3f51b5;opacity:0;opacity:1;-webkit-animation:mdui-spinner-layer-fill-unfill-rotate 5332ms cubic-bezier(.4,0,.2,1) infinite both;animation:mdui-spinner-layer-fill-unfill-rotate 5332ms cubic-bezier(.4,0,.2,1) infinite both}.mdui-spinner-layer-1{border-color:#42a5f5!important;-webkit-animation:mdui-spinner-layer-fill-unfill-rotate 5332ms cubic-bezier(.4,0,.2,1) infinite both,mdui-spinner-layer-1-fade-in-out 5332ms cubic-bezier(.4,0,.2,1) infinite both;animation:mdui-spinner-layer-fill-unfill-rotate 5332ms cubic-bezier(.4,0,.2,1) infinite both,mdui-spinner-layer-1-fade-in-out 5332ms cubic-bezier(.4,0,.2,1) infinite both}.mdui-spinner-layer-2{border-color:#f44336!important;-webkit-animation:mdui-spinner-layer-fill-unfill-rotate 5332ms cubic-bezier(.4,0,.2,1) infinite both,mdui-spinner-layer-2-fade-in-out 5332ms cubic-bezier(.4,0,.2,1) infinite both;animation:mdui-spinner-layer-fill-unfill-rotate 5332ms cubic-bezier(.4,0,.2,1) infinite both,mdui-spinner-layer-2-fade-in-out 5332ms cubic-bezier(.4,0,.2,1) infinite both}.mdui-spinner-layer-3{border-color:#fdd835!important;-webkit-animation:mdui-spinner-layer-fill-unfill-rotate 5332ms cubic-bezier(.4,0,.2,1) infinite both,mdui-spinner-layer-3-fade-in-out 5332ms cubic-bezier(.4,0,.2,1) infinite both;animation:mdui-spinner-layer-fill-unfill-rotate 5332ms cubic-bezier(.4,0,.2,1) infinite both,mdui-spinner-layer-3-fade-in-out 5332ms cubic-bezier(.4,0,.2,1) infinite both}.mdui-spinner-layer-4{border-color:#4caf50!important;-webkit-animation:mdui-spinner-layer-fill-unfill-rotate 5332ms cubic-bezier(.4,0,.2,1) infinite both,mdui-spinner-layer-4-fade-in-out 5332ms cubic-bezier(.4,0,.2,1) infinite both;animation:mdui-spinner-layer-fill-unfill-rotate 5332ms cubic-bezier(.4,0,.2,1) infinite both,mdui-spinner-layer-4-fade-in-out 5332ms cubic-bezier(.4,0,.2,1) infinite both}@-webkit-keyframes mdui-spinner-layer-fill-unfill-rotate{12.5%{-webkit-transform:rotate(135deg);transform:rotate(135deg)}25%{-webkit-transform:rotate(270deg);transform:rotate(270deg)}37.5%{-webkit-transform:rotate(405deg);transform:rotate(405deg)}50%{-webkit-transform:rotate(540deg);transform:rotate(540deg)}62.5%{-webkit-transform:rotate(675deg);transform:rotate(675deg)}75%{-webkit-transform:rotate(810deg);transform:rotate(810deg)}87.5%{-webkit-transform:rotate(945deg);transform:rotate(945deg)}to{-webkit-transform:rotate(1080deg);transform:rotate(1080deg)}}@keyframes mdui-spinner-layer-fill-unfill-rotate{12.5%{-webkit-transform:rotate(135deg);transform:rotate(135deg)}25%{-webkit-transform:rotate(270deg);transform:rotate(270deg)}37.5%{-webkit-transform:rotate(405deg);transform:rotate(405deg)}50%{-webkit-transform:rotate(540deg);transform:rotate(540deg)}62.5%{-webkit-transform:rotate(675deg);transform:rotate(675deg)}75%{-webkit-transform:rotate(810deg);transform:rotate(810deg)}87.5%{-webkit-transform:rotate(945deg);transform:rotate(945deg)}to{-webkit-transform:rotate(1080deg);transform:rotate(1080deg)}}@-webkit-keyframes mdui-spinner-layer-1-fade-in-out{from{opacity:1}25%{opacity:1}26%{opacity:0}89%{opacity:0}90%{opacity:1}100%{opacity:1}}@keyframes mdui-spinner-layer-1-fade-in-out{from{opacity:1}25%{opacity:1}26%{opacity:0}89%{opacity:0}90%{opacity:1}100%{opacity:1}}@-webkit-keyframes mdui-spinner-layer-2-fade-in-out{from{opacity:0}15%{opacity:0}25%{opacity:1}50%{opacity:1}51%{opacity:0}}@keyframes mdui-spinner-layer-2-fade-in-out{from{opacity:0}15%{opacity:0}25%{opacity:1}50%{opacity:1}51%{opacity:0}}@-webkit-keyframes mdui-spinner-layer-3-fade-in-out{from{opacity:0}40%{opacity:0}50%{opacity:1}75%{opacity:1}76%{opacity:0}}@keyframes mdui-spinner-layer-3-fade-in-out{from{opacity:0}40%{opacity:0}50%{opacity:1}75%{opacity:1}76%{opacity:0}}@-webkit-keyframes mdui-spinner-layer-4-fade-in-out{from{opacity:0}65%{opacity:0}75%{opacity:1}90%{opacity:1}100%{opacity:0}}@keyframes mdui-spinner-layer-4-fade-in-out{from{opacity:0}65%{opacity:0}75%{opacity:1}90%{opacity:1}100%{opacity:0}}.mdui-spinner-gap-patch{position:absolute;top:0;left:45%;width:10%;height:100%;overflow:hidden;border-color:inherit}.mdui-spinner-gap-patch .mdui-spinner-circle{left:-450%;width:1000%;-webkit-box-sizing:border-box;box-sizing:border-box}.mdui-spinner-circle-clipper{position:relative;display:inline-block;width:50%;height:100%;overflow:hidden;border-color:inherit}.mdui-spinner-circle-clipper .mdui-spinner-circle{position:absolute;top:0;right:0;bottom:0;width:200%;height:100%;-webkit-box-sizing:border-box;box-sizing:border-box;border-color:inherit;border-style:solid;border-width:3px;border-bottom-color:transparent!important;border-radius:50%;-webkit-animation:none;animation:none}.mdui-spinner-circle-clipper.mdui-spinner-left{float:left}.mdui-spinner-circle-clipper.mdui-spinner-left .mdui-spinner-circle{left:0;border-right-color:transparent!important;-webkit-transform:rotate(129deg);transform:rotate(129deg);-webkit-animation:mdui-spinner-left-spin 1333ms cubic-bezier(.4,0,.2,1) infinite both;animation:mdui-spinner-left-spin 1333ms cubic-bezier(.4,0,.2,1) infinite both}.mdui-spinner-circle-clipper.mdui-spinner-right{float:right}.mdui-spinner-circle-clipper.mdui-spinner-right .mdui-spinner-circle{left:-100%;border-left-color:transparent!important;-webkit-transform:rotate(-129deg);transform:rotate(-129deg);-webkit-animation:mdui-spinner-right-spin 1333ms cubic-bezier(.4,0,.2,1) infinite both;animation:mdui-spinner-right-spin 1333ms cubic-bezier(.4,0,.2,1) infinite both}@-webkit-keyframes mdui-spinner-left-spin{from{-webkit-transform:rotate(130deg);transform:rotate(130deg)}50%{-webkit-transform:rotate(-5deg);transform:rotate(-5deg)}to{-webkit-transform:rotate(130deg);transform:rotate(130deg)}}@keyframes mdui-spinner-left-spin{from{-webkit-transform:rotate(130deg);transform:rotate(130deg)}50%{-webkit-transform:rotate(-5deg);transform:rotate(-5deg)}to{-webkit-transform:rotate(130deg);transform:rotate(130deg)}}@-webkit-keyframes mdui-spinner-right-spin{from{-webkit-transform:rotate(-130deg);transform:rotate(-130deg)}50%{-webkit-transform:rotate(5deg);transform:rotate(5deg)}to{-webkit-transform:rotate(-130deg);transform:rotate(-130deg)}}@keyframes mdui-spinner-right-spin{from{-webkit-transform:rotate(-130deg);transform:rotate(-130deg)}50%{-webkit-transform:rotate(5deg);transform:rotate(5deg)}to{-webkit-transform:rotate(-130deg);transform:rotate(-130deg)}}.mdui-theme-primary-amber .mdui-spinner-layer{border-color:#ffc107}.mdui-theme-primary-blue .mdui-spinner-layer{border-color:#2196f3}.mdui-theme-primary-blue-grey .mdui-spinner-layer{border-color:#607d8b}.mdui-theme-primary-brown .mdui-spinner-layer{border-color:#795548}.mdui-theme-primary-cyan .mdui-spinner-layer{border-color:#00bcd4}.mdui-theme-primary-deep-orange .mdui-spinner-layer{border-color:#ff5722}.mdui-theme-primary-deep-purple .mdui-spinner-layer{border-color:#673ab7}.mdui-theme-primary-green .mdui-spinner-layer{border-color:#4caf50}.mdui-theme-primary-grey .mdui-spinner-layer{border-color:#9e9e9e}.mdui-theme-primary-indigo .mdui-spinner-layer{border-color:#3f51b5}.mdui-theme-primary-light-blue .mdui-spinner-layer{border-color:#03a9f4}.mdui-theme-primary-light-green .mdui-spinner-layer{border-color:#8bc34a}.mdui-theme-primary-lime .mdui-spinner-layer{border-color:#cddc39}.mdui-theme-primary-orange .mdui-spinner-layer{border-color:#ff9800}.mdui-theme-primary-pink .mdui-spinner-layer{border-color:#e91e63}.mdui-theme-primary-purple .mdui-spinner-layer{border-color:#9c27b0}.mdui-theme-primary-red .mdui-spinner-layer{border-color:#f44336}.mdui-theme-primary-teal .mdui-spinner-layer{border-color:#009688}.mdui-theme-primary-yellow .mdui-spinner-layer{border-color:#ffeb3b}.mdui-panel{width:100%;-webkit-box-sizing:border-box;box-sizing:border-box}.mdui-panel-item{color:rgba(0,0,0,.87);background-color:#fff;border-bottom:1px solid rgba(0,0,0,.12);-webkit-box-shadow:0 3px 1px -2px rgba(0,0,0,.2),0 2px 2px 0 rgba(0,0,0,.14),0 1px 5px 0 rgba(0,0,0,.12);box-shadow:0 3px 1px -2px rgba(0,0,0,.2),0 2px 2px 0 rgba(0,0,0,.14),0 1px 5px 0 rgba(0,0,0,.12);-webkit-transition:margin .3s cubic-bezier(.4,0,.2,1);transition:margin .3s cubic-bezier(.4,0,.2,1);will-change:margin}.mdui-panel-item:last-child{border-bottom:none}.mdui-panel-item-header{position:relative;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;width:100%;height:48px;-webkit-box-sizing:border-box;box-sizing:border-box;padding:0 24px;overflow:hidden;font-size:15px;text-overflow:ellipsis;white-space:nowrap;cursor:pointer;-webkit-transition:all .3s cubic-bezier(.4,0,.2,1);transition:all .3s cubic-bezier(.4,0,.2,1);-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center;will-change:height,background-color}.mdui-panel-item-header:active{background-color:#eee}.mdui-panel-item-title{width:36%;min-width:36%;-webkit-box-sizing:border-box;box-sizing:border-box;padding-right:16px;overflow:hidden;font-weight:500;text-overflow:ellipsis;white-space:nowrap}.mdui-panel-item-summary{-webkit-box-sizing:border-box;box-sizing:border-box;padding-right:16px;overflow:hidden;color:rgba(0,0,0,.54);text-overflow:ellipsis;white-space:nowrap;-webkit-box-flex:1;-webkit-flex-grow:1;-ms-flex-positive:1;flex-grow:1}.mdui-panel-item-arrow{position:absolute;top:12px;right:24px;color:rgba(0,0,0,.54);-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;-webkit-transition:all .3s cubic-bezier(.4,0,.2,1);transition:all .3s cubic-bezier(.4,0,.2,1);-webkit-transform:rotate(0);transform:rotate(0);will-change:transform,top}.mdui-panel-item-summary+.mdui-panel-item-arrow{position:relative;top:0!important;right:0}.mdui-panel-item-body{height:0;padding:0 24px;overflow:hidden;-webkit-transition:height .3s cubic-bezier(.4,0,.2,1);transition:height .3s cubic-bezier(.4,0,.2,1);will-change:height}.mdui-panel-item-body:after,.mdui-panel-item-body:before{display:table;content:" "}.mdui-panel-item-body:after{clear:both}.mdui-panel-item-body:after,.mdui-panel-item-body:before{display:table;content:" "}.mdui-panel-item-body:after{clear:both}.mdui-panel-item-body:after{height:16px}.mdui-panel-item-actions{display:block;width:100%;padding:16px 24px 0 24px;margin:16px -24px 0 -24px;text-align:right;border-top:1px solid rgba(0,0,0,.12)}.mdui-panel-item-actions .mdui-btn{margin-left:8px}.mdui-panel-item-actions .mdui-btn:first-child{margin-left:0}.mdui-panel-gapless{-webkit-box-shadow:0 3px 1px -2px rgba(0,0,0,.2),0 2px 2px 0 rgba(0,0,0,.14),0 1px 5px 0 rgba(0,0,0,.12);box-shadow:0 3px 1px -2px rgba(0,0,0,.2),0 2px 2px 0 rgba(0,0,0,.14),0 1px 5px 0 rgba(0,0,0,.12)}.mdui-panel-gapless .mdui-panel-item{-webkit-box-shadow:none;box-shadow:none}.mdui-panel-gapless .mdui-panel-item-open{margin-top:0;margin-bottom:0}.mdui-panel-popout .mdui-panel-item-open{margin-right:-16px;margin-left:-16px}.mdui-panel-item-open{height:auto;margin-top:16px;margin-bottom:16px}.mdui-panel-item-open>.mdui-panel-item-header{height:64px}.mdui-panel-item-open>.mdui-panel-item-header .mdui-panel-item-arrow{top:20px;-webkit-transform:rotate(180deg);transform:rotate(180deg)}.mdui-panel-item-open>.mdui-panel-item-body{height:auto}.mdui-theme-layout-dark .mdui-panel-item{color:#fff;background-color:#303030;border-bottom:1px solid rgba(255,255,255,.12)}.mdui-theme-layout-dark .mdui-panel-item:last-child{border-bottom:none}.mdui-theme-layout-dark .mdui-panel-item-header:active{background-color:#424242}.mdui-theme-layout-dark .mdui-panel-item-summary{color:rgba(255,255,255,.7)}.mdui-theme-layout-dark .mdui-panel-item-arrow{color:#fff}.mdui-theme-layout-dark .mdui-panel-item-actions{border-top:1px solid rgba(255,255,255,.12)}.mdui-menu{position:fixed;z-index:99999;display:block;width:168px;-webkit-box-sizing:border-box;box-sizing:border-box;padding:8px 0;margin:0;overflow-y:auto;-webkit-overflow-scrolling:touch;font-size:16px;color:rgba(0,0,0,.87);list-style:none;visibility:hidden;background-color:#fff;border-radius:2px;-webkit-box-shadow:0 5px 5px -3px rgba(0,0,0,.2),0 8px 10px 1px rgba(0,0,0,.14),0 3px 14px 2px rgba(0,0,0,.12);box-shadow:0 5px 5px -3px rgba(0,0,0,.2),0 8px 10px 1px rgba(0,0,0,.14),0 3px 14px 2px rgba(0,0,0,.12);opacity:0;-webkit-transition-timing-function:cubic-bezier(0,0,.2,1);transition-timing-function:cubic-bezier(0,0,.2,1);-webkit-transition-duration:.3s;transition-duration:.3s;-webkit-transition-property:opacity,visibility,-webkit-transform;transition-property:opacity,visibility,-webkit-transform;transition-property:transform,opacity,visibility;transition-property:transform,opacity,visibility,-webkit-transform;-webkit-transform:scale(0);transform:scale(0);will-change:transform,opacity,visibility}.mdui-menu .mdui-divider{margin-top:8px;margin-bottom:8px}.mdui-menu-open{visibility:visible;opacity:1;-webkit-transform:scale(1);transform:scale(1)}.mdui-menu-closing{visibility:visible;opacity:0;-webkit-transform:scale(1);transform:scale(1)}.mdui-menu-item{position:relative}.mdui-menu-item>a{position:relative;display:block;height:48px;padding:0 16px;overflow:hidden;line-height:48px;color:inherit;text-decoration:none;text-overflow:ellipsis;white-space:nowrap;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.mdui-menu-item>a:hover{background-color:#eee}.mdui-menu-item>.mdui-menu{position:absolute;-webkit-box-shadow:0 5px 6px -3px rgba(0,0,0,.2),0 9px 12px 1px rgba(0,0,0,.14),0 3px 16px 2px rgba(0,0,0,.12);box-shadow:0 5px 6px -3px rgba(0,0,0,.2),0 9px 12px 1px rgba(0,0,0,.14),0 3px 16px 2px rgba(0,0,0,.12)}.mdui-menu-item[disabled]>a{color:rgba(0,0,0,.38)!important;cursor:default}.mdui-menu-item[disabled]>a:hover{background-color:inherit!important}.mdui-menu-item[disabled]>a .mdui-icon{color:rgba(0,0,0,.26)}.mdui-menu-item-active{background-color:#eee}.mdui-menu-item-icon{display:inline-block;width:40px;-webkit-box-sizing:border-box;box-sizing:border-box;padding-right:16px;color:rgba(0,0,0,.54)}.mdui-menu-item-helper{float:right}.mdui-menu-item-more{float:right;width:24px;height:24px;margin:4px 0;background-image:url("data:image/svg+xml,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20width%3D%2224%22%20height%3D%2224%22%20viewBox%3D%220%200%2024%2024%22%3E%3Cpath%20d%3D%22M7%2010l5%205%205-5z%22%20opacity%3D%220.54%22%20transform%3D%22rotate(-90%2012%2C12.5)%22%20fill%3D%22%23000000%22%2F%3E%3C%2Fsvg%3E%0A")}.mdui-menu-cascade{width:320px;padding:16px 0;overflow-y:visible;font-size:15px}.mdui-menu-cascade>.mdui-menu-item>a{height:32px;padding:0 24px;line-height:32px}.mdui-theme-layout-dark .mdui-menu{color:#fff;background-color:#424242}.mdui-theme-layout-dark .mdui-menu-item>a:hover{background-color:#616161}.mdui-theme-layout-dark .mdui-menu-item[disabled]>a{color:rgba(255,255,255,.5)!important}.mdui-theme-layout-dark .mdui-menu-item[disabled]>a .mdui-icon{color:rgba(255,255,255,.3)}.mdui-theme-layout-dark .mdui-menu-item-active{background-color:#616161}.mdui-theme-layout-dark .mdui-menu-item-icon{color:#fff}.mdui-theme-layout-dark .mdui-menu-item-more{background-image:url("data:image/svg+xml,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20width%3D%2224%22%20height%3D%2224%22%20viewBox%3D%220%200%2024%2024%22%3E%3Cpath%20d%3D%22M7%2010l5%205%205-5z%22%20transform%3D%22rotate(-90%2012%2C12.5)%22%20fill%3D%22%23FFFFFF%22%2F%3E%3C%2Fsvg%3E%0A")} +/*# sourceMappingURL=mdui.min.css.map */ diff --git "a/5\343\200\201Python\346\213\233\350\201\230\345\262\227\344\275\215\344\277\241\346\201\257\350\201\232\345\220\210\347\263\273\347\273\237\357\274\210\346\213\245\346\234\211\347\210\254\350\231\253\347\210\254\345\217\226\343\200\201\346\225\260\346\215\256\345\210\206\346\236\220\343\200\201\345\217\257\350\247\206\345\214\226\343\200\201\344\272\222\345\212\250\347\255\211\345\212\237\350\203\275\357\274\211/WorkAggregation-master/static/html/bing.html" "b/5\343\200\201Python\346\213\233\350\201\230\345\262\227\344\275\215\344\277\241\346\201\257\350\201\232\345\220\210\347\263\273\347\273\237\357\274\210\346\213\245\346\234\211\347\210\254\350\231\253\347\210\254\345\217\226\343\200\201\346\225\260\346\215\256\345\210\206\346\236\220\343\200\201\345\217\257\350\247\206\345\214\226\343\200\201\344\272\222\345\212\250\347\255\211\345\212\237\350\203\275\357\274\211/WorkAggregation-master/static/html/bing.html" new file mode 100644 index 0000000..49eace3 --- /dev/null +++ "b/5\343\200\201Python\346\213\233\350\201\230\345\262\227\344\275\215\344\277\241\346\201\257\350\201\232\345\220\210\347\263\273\347\273\237\357\274\210\346\213\245\346\234\211\347\210\254\350\231\253\347\210\254\345\217\226\343\200\201\346\225\260\346\215\256\345\210\206\346\236\220\343\200\201\345\217\257\350\247\206\345\214\226\343\200\201\344\272\222\345\212\250\347\255\211\345\212\237\350\203\275\357\274\211/WorkAggregation-master/static/html/bing.html" @@ -0,0 +1,156 @@ + + + + + Echarts + + + + +
+ + + diff --git "a/5\343\200\201Python\346\213\233\350\201\230\345\262\227\344\275\215\344\277\241\346\201\257\350\201\232\345\220\210\347\263\273\347\273\237\357\274\210\346\213\245\346\234\211\347\210\254\350\231\253\347\210\254\345\217\226\343\200\201\346\225\260\346\215\256\345\210\206\346\236\220\343\200\201\345\217\257\350\247\206\345\214\226\343\200\201\344\272\222\345\212\250\347\255\211\345\212\237\350\203\275\357\274\211/WorkAggregation-master/static/html/qiu1.html" "b/5\343\200\201Python\346\213\233\350\201\230\345\262\227\344\275\215\344\277\241\346\201\257\350\201\232\345\220\210\347\263\273\347\273\237\357\274\210\346\213\245\346\234\211\347\210\254\350\231\253\347\210\254\345\217\226\343\200\201\346\225\260\346\215\256\345\210\206\346\236\220\343\200\201\345\217\257\350\247\206\345\214\226\343\200\201\344\272\222\345\212\250\347\255\211\345\212\237\350\203\275\357\274\211/WorkAggregation-master/static/html/qiu1.html" new file mode 100644 index 0000000..d5d494e --- /dev/null +++ "b/5\343\200\201Python\346\213\233\350\201\230\345\262\227\344\275\215\344\277\241\346\201\257\350\201\232\345\220\210\347\263\273\347\273\237\357\274\210\346\213\245\346\234\211\347\210\254\350\231\253\347\210\254\345\217\226\343\200\201\346\225\260\346\215\256\345\210\206\346\236\220\343\200\201\345\217\257\350\247\206\345\214\226\343\200\201\344\272\222\345\212\250\347\255\211\345\212\237\350\203\275\357\274\211/WorkAggregation-master/static/html/qiu1.html" @@ -0,0 +1,117 @@ + + + + + Echarts + + + + + +
+ + + diff --git "a/5\343\200\201Python\346\213\233\350\201\230\345\262\227\344\275\215\344\277\241\346\201\257\350\201\232\345\220\210\347\263\273\347\273\237\357\274\210\346\213\245\346\234\211\347\210\254\350\231\253\347\210\254\345\217\226\343\200\201\346\225\260\346\215\256\345\210\206\346\236\220\343\200\201\345\217\257\350\247\206\345\214\226\343\200\201\344\272\222\345\212\250\347\255\211\345\212\237\350\203\275\357\274\211/WorkAggregation-master/static/html/qiu2.html" "b/5\343\200\201Python\346\213\233\350\201\230\345\262\227\344\275\215\344\277\241\346\201\257\350\201\232\345\220\210\347\263\273\347\273\237\357\274\210\346\213\245\346\234\211\347\210\254\350\231\253\347\210\254\345\217\226\343\200\201\346\225\260\346\215\256\345\210\206\346\236\220\343\200\201\345\217\257\350\247\206\345\214\226\343\200\201\344\272\222\345\212\250\347\255\211\345\212\237\350\203\275\357\274\211/WorkAggregation-master/static/html/qiu2.html" new file mode 100644 index 0000000..959f247 --- /dev/null +++ "b/5\343\200\201Python\346\213\233\350\201\230\345\262\227\344\275\215\344\277\241\346\201\257\350\201\232\345\220\210\347\263\273\347\273\237\357\274\210\346\213\245\346\234\211\347\210\254\350\231\253\347\210\254\345\217\226\343\200\201\346\225\260\346\215\256\345\210\206\346\236\220\343\200\201\345\217\257\350\247\206\345\214\226\343\200\201\344\272\222\345\212\250\347\255\211\345\212\237\350\203\275\357\274\211/WorkAggregation-master/static/html/qiu2.html" @@ -0,0 +1,117 @@ + + + + + Echarts + + + + + +
+ + + diff --git "a/5\343\200\201Python\346\213\233\350\201\230\345\262\227\344\275\215\344\277\241\346\201\257\350\201\232\345\220\210\347\263\273\347\273\237\357\274\210\346\213\245\346\234\211\347\210\254\350\231\253\347\210\254\345\217\226\343\200\201\346\225\260\346\215\256\345\210\206\346\236\220\343\200\201\345\217\257\350\247\206\345\214\226\343\200\201\344\272\222\345\212\250\347\255\211\345\212\237\350\203\275\357\274\211/WorkAggregation-master/static/html/qiu3.html" "b/5\343\200\201Python\346\213\233\350\201\230\345\262\227\344\275\215\344\277\241\346\201\257\350\201\232\345\220\210\347\263\273\347\273\237\357\274\210\346\213\245\346\234\211\347\210\254\350\231\253\347\210\254\345\217\226\343\200\201\346\225\260\346\215\256\345\210\206\346\236\220\343\200\201\345\217\257\350\247\206\345\214\226\343\200\201\344\272\222\345\212\250\347\255\211\345\212\237\350\203\275\357\274\211/WorkAggregation-master/static/html/qiu3.html" new file mode 100644 index 0000000..450cf32 --- /dev/null +++ "b/5\343\200\201Python\346\213\233\350\201\230\345\262\227\344\275\215\344\277\241\346\201\257\350\201\232\345\220\210\347\263\273\347\273\237\357\274\210\346\213\245\346\234\211\347\210\254\350\231\253\347\210\254\345\217\226\343\200\201\346\225\260\346\215\256\345\210\206\346\236\220\343\200\201\345\217\257\350\247\206\345\214\226\343\200\201\344\272\222\345\212\250\347\255\211\345\212\237\350\203\275\357\274\211/WorkAggregation-master/static/html/qiu3.html" @@ -0,0 +1,117 @@ + + + + + Echarts + + + + + +
+ + + diff --git "a/5\343\200\201Python\346\213\233\350\201\230\345\262\227\344\275\215\344\277\241\346\201\257\350\201\232\345\220\210\347\263\273\347\273\237\357\274\210\346\213\245\346\234\211\347\210\254\350\231\253\347\210\254\345\217\226\343\200\201\346\225\260\346\215\256\345\210\206\346\236\220\343\200\201\345\217\257\350\247\206\345\214\226\343\200\201\344\272\222\345\212\250\347\255\211\345\212\237\350\203\275\357\274\211/WorkAggregation-master/static/icon/1.png" "b/5\343\200\201Python\346\213\233\350\201\230\345\262\227\344\275\215\344\277\241\346\201\257\350\201\232\345\220\210\347\263\273\347\273\237\357\274\210\346\213\245\346\234\211\347\210\254\350\231\253\347\210\254\345\217\226\343\200\201\346\225\260\346\215\256\345\210\206\346\236\220\343\200\201\345\217\257\350\247\206\345\214\226\343\200\201\344\272\222\345\212\250\347\255\211\345\212\237\350\203\275\357\274\211/WorkAggregation-master/static/icon/1.png" new file mode 100644 index 0000000..cfd5c51 Binary files /dev/null and "b/5\343\200\201Python\346\213\233\350\201\230\345\262\227\344\275\215\344\277\241\346\201\257\350\201\232\345\220\210\347\263\273\347\273\237\357\274\210\346\213\245\346\234\211\347\210\254\350\231\253\347\210\254\345\217\226\343\200\201\346\225\260\346\215\256\345\210\206\346\236\220\343\200\201\345\217\257\350\247\206\345\214\226\343\200\201\344\272\222\345\212\250\347\255\211\345\212\237\350\203\275\357\274\211/WorkAggregation-master/static/icon/1.png" differ diff --git "a/5\343\200\201Python\346\213\233\350\201\230\345\262\227\344\275\215\344\277\241\346\201\257\350\201\232\345\220\210\347\263\273\347\273\237\357\274\210\346\213\245\346\234\211\347\210\254\350\231\253\347\210\254\345\217\226\343\200\201\346\225\260\346\215\256\345\210\206\346\236\220\343\200\201\345\217\257\350\247\206\345\214\226\343\200\201\344\272\222\345\212\250\347\255\211\345\212\237\350\203\275\357\274\211/WorkAggregation-master/static/icon/2.png" "b/5\343\200\201Python\346\213\233\350\201\230\345\262\227\344\275\215\344\277\241\346\201\257\350\201\232\345\220\210\347\263\273\347\273\237\357\274\210\346\213\245\346\234\211\347\210\254\350\231\253\347\210\254\345\217\226\343\200\201\346\225\260\346\215\256\345\210\206\346\236\220\343\200\201\345\217\257\350\247\206\345\214\226\343\200\201\344\272\222\345\212\250\347\255\211\345\212\237\350\203\275\357\274\211/WorkAggregation-master/static/icon/2.png" new file mode 100644 index 0000000..fa3213d Binary files /dev/null and "b/5\343\200\201Python\346\213\233\350\201\230\345\262\227\344\275\215\344\277\241\346\201\257\350\201\232\345\220\210\347\263\273\347\273\237\357\274\210\346\213\245\346\234\211\347\210\254\350\231\253\347\210\254\345\217\226\343\200\201\346\225\260\346\215\256\345\210\206\346\236\220\343\200\201\345\217\257\350\247\206\345\214\226\343\200\201\344\272\222\345\212\250\347\255\211\345\212\237\350\203\275\357\274\211/WorkAggregation-master/static/icon/2.png" differ diff --git "a/5\343\200\201Python\346\213\233\350\201\230\345\262\227\344\275\215\344\277\241\346\201\257\350\201\232\345\220\210\347\263\273\347\273\237\357\274\210\346\213\245\346\234\211\347\210\254\350\231\253\347\210\254\345\217\226\343\200\201\346\225\260\346\215\256\345\210\206\346\236\220\343\200\201\345\217\257\350\247\206\345\214\226\343\200\201\344\272\222\345\212\250\347\255\211\345\212\237\350\203\275\357\274\211/WorkAggregation-master/static/icon/3.png" "b/5\343\200\201Python\346\213\233\350\201\230\345\262\227\344\275\215\344\277\241\346\201\257\350\201\232\345\220\210\347\263\273\347\273\237\357\274\210\346\213\245\346\234\211\347\210\254\350\231\253\347\210\254\345\217\226\343\200\201\346\225\260\346\215\256\345\210\206\346\236\220\343\200\201\345\217\257\350\247\206\345\214\226\343\200\201\344\272\222\345\212\250\347\255\211\345\212\237\350\203\275\357\274\211/WorkAggregation-master/static/icon/3.png" new file mode 100644 index 0000000..5890302 Binary files /dev/null and "b/5\343\200\201Python\346\213\233\350\201\230\345\262\227\344\275\215\344\277\241\346\201\257\350\201\232\345\220\210\347\263\273\347\273\237\357\274\210\346\213\245\346\234\211\347\210\254\350\231\253\347\210\254\345\217\226\343\200\201\346\225\260\346\215\256\345\210\206\346\236\220\343\200\201\345\217\257\350\247\206\345\214\226\343\200\201\344\272\222\345\212\250\347\255\211\345\212\237\350\203\275\357\274\211/WorkAggregation-master/static/icon/3.png" differ diff --git "a/5\343\200\201Python\346\213\233\350\201\230\345\262\227\344\275\215\344\277\241\346\201\257\350\201\232\345\220\210\347\263\273\347\273\237\357\274\210\346\213\245\346\234\211\347\210\254\350\231\253\347\210\254\345\217\226\343\200\201\346\225\260\346\215\256\345\210\206\346\236\220\343\200\201\345\217\257\350\247\206\345\214\226\343\200\201\344\272\222\345\212\250\347\255\211\345\212\237\350\203\275\357\274\211/WorkAggregation-master/static/icon/4.png" "b/5\343\200\201Python\346\213\233\350\201\230\345\262\227\344\275\215\344\277\241\346\201\257\350\201\232\345\220\210\347\263\273\347\273\237\357\274\210\346\213\245\346\234\211\347\210\254\350\231\253\347\210\254\345\217\226\343\200\201\346\225\260\346\215\256\345\210\206\346\236\220\343\200\201\345\217\257\350\247\206\345\214\226\343\200\201\344\272\222\345\212\250\347\255\211\345\212\237\350\203\275\357\274\211/WorkAggregation-master/static/icon/4.png" new file mode 100644 index 0000000..8a78a74 Binary files /dev/null and "b/5\343\200\201Python\346\213\233\350\201\230\345\262\227\344\275\215\344\277\241\346\201\257\350\201\232\345\220\210\347\263\273\347\273\237\357\274\210\346\213\245\346\234\211\347\210\254\350\231\253\347\210\254\345\217\226\343\200\201\346\225\260\346\215\256\345\210\206\346\236\220\343\200\201\345\217\257\350\247\206\345\214\226\343\200\201\344\272\222\345\212\250\347\255\211\345\212\237\350\203\275\357\274\211/WorkAggregation-master/static/icon/4.png" differ diff --git "a/5\343\200\201Python\346\213\233\350\201\230\345\262\227\344\275\215\344\277\241\346\201\257\350\201\232\345\220\210\347\263\273\347\273\237\357\274\210\346\213\245\346\234\211\347\210\254\350\231\253\347\210\254\345\217\226\343\200\201\346\225\260\346\215\256\345\210\206\346\236\220\343\200\201\345\217\257\350\247\206\345\214\226\343\200\201\344\272\222\345\212\250\347\255\211\345\212\237\350\203\275\357\274\211/WorkAggregation-master/static/icon/QR.jpg" "b/5\343\200\201Python\346\213\233\350\201\230\345\262\227\344\275\215\344\277\241\346\201\257\350\201\232\345\220\210\347\263\273\347\273\237\357\274\210\346\213\245\346\234\211\347\210\254\350\231\253\347\210\254\345\217\226\343\200\201\346\225\260\346\215\256\345\210\206\346\236\220\343\200\201\345\217\257\350\247\206\345\214\226\343\200\201\344\272\222\345\212\250\347\255\211\345\212\237\350\203\275\357\274\211/WorkAggregation-master/static/icon/QR.jpg" new file mode 100644 index 0000000..10740e9 Binary files /dev/null and "b/5\343\200\201Python\346\213\233\350\201\230\345\262\227\344\275\215\344\277\241\346\201\257\350\201\232\345\220\210\347\263\273\347\273\237\357\274\210\346\213\245\346\234\211\347\210\254\350\231\253\347\210\254\345\217\226\343\200\201\346\225\260\346\215\256\345\210\206\346\236\220\343\200\201\345\217\257\350\247\206\345\214\226\343\200\201\344\272\222\345\212\250\347\255\211\345\212\237\350\203\275\357\274\211/WorkAggregation-master/static/icon/QR.jpg" differ diff --git "a/5\343\200\201Python\346\213\233\350\201\230\345\262\227\344\275\215\344\277\241\346\201\257\350\201\232\345\220\210\347\263\273\347\273\237\357\274\210\346\213\245\346\234\211\347\210\254\350\231\253\347\210\254\345\217\226\343\200\201\346\225\260\346\215\256\345\210\206\346\236\220\343\200\201\345\217\257\350\247\206\345\214\226\343\200\201\344\272\222\345\212\250\347\255\211\345\212\237\350\203\275\357\274\211/WorkAggregation-master/static/icon/home.png" "b/5\343\200\201Python\346\213\233\350\201\230\345\262\227\344\275\215\344\277\241\346\201\257\350\201\232\345\220\210\347\263\273\347\273\237\357\274\210\346\213\245\346\234\211\347\210\254\350\231\253\347\210\254\345\217\226\343\200\201\346\225\260\346\215\256\345\210\206\346\236\220\343\200\201\345\217\257\350\247\206\345\214\226\343\200\201\344\272\222\345\212\250\347\255\211\345\212\237\350\203\275\357\274\211/WorkAggregation-master/static/icon/home.png" new file mode 100644 index 0000000..12627a3 Binary files /dev/null and "b/5\343\200\201Python\346\213\233\350\201\230\345\262\227\344\275\215\344\277\241\346\201\257\350\201\232\345\220\210\347\263\273\347\273\237\357\274\210\346\213\245\346\234\211\347\210\254\350\231\253\347\210\254\345\217\226\343\200\201\346\225\260\346\215\256\345\210\206\346\236\220\343\200\201\345\217\257\350\247\206\345\214\226\343\200\201\344\272\222\345\212\250\347\255\211\345\212\237\350\203\275\357\274\211/WorkAggregation-master/static/icon/home.png" differ diff --git "a/5\343\200\201Python\346\213\233\350\201\230\345\262\227\344\275\215\344\277\241\346\201\257\350\201\232\345\220\210\347\263\273\347\273\237\357\274\210\346\213\245\346\234\211\347\210\254\350\231\253\347\210\254\345\217\226\343\200\201\346\225\260\346\215\256\345\210\206\346\236\220\343\200\201\345\217\257\350\247\206\345\214\226\343\200\201\344\272\222\345\212\250\347\255\211\345\212\237\350\203\275\357\274\211/WorkAggregation-master/static/icon/qq.png" "b/5\343\200\201Python\346\213\233\350\201\230\345\262\227\344\275\215\344\277\241\346\201\257\350\201\232\345\220\210\347\263\273\347\273\237\357\274\210\346\213\245\346\234\211\347\210\254\350\231\253\347\210\254\345\217\226\343\200\201\346\225\260\346\215\256\345\210\206\346\236\220\343\200\201\345\217\257\350\247\206\345\214\226\343\200\201\344\272\222\345\212\250\347\255\211\345\212\237\350\203\275\357\274\211/WorkAggregation-master/static/icon/qq.png" new file mode 100644 index 0000000..a8e62d4 Binary files /dev/null and "b/5\343\200\201Python\346\213\233\350\201\230\345\262\227\344\275\215\344\277\241\346\201\257\350\201\232\345\220\210\347\263\273\347\273\237\357\274\210\346\213\245\346\234\211\347\210\254\350\231\253\347\210\254\345\217\226\343\200\201\346\225\260\346\215\256\345\210\206\346\236\220\343\200\201\345\217\257\350\247\206\345\214\226\343\200\201\344\272\222\345\212\250\347\255\211\345\212\237\350\203\275\357\274\211/WorkAggregation-master/static/icon/qq.png" differ diff --git "a/5\343\200\201Python\346\213\233\350\201\230\345\262\227\344\275\215\344\277\241\346\201\257\350\201\232\345\220\210\347\263\273\347\273\237\357\274\210\346\213\245\346\234\211\347\210\254\350\231\253\347\210\254\345\217\226\343\200\201\346\225\260\346\215\256\345\210\206\346\236\220\343\200\201\345\217\257\350\247\206\345\214\226\343\200\201\344\272\222\345\212\250\347\255\211\345\212\237\350\203\275\357\274\211/WorkAggregation-master/static/icon/robot.png" "b/5\343\200\201Python\346\213\233\350\201\230\345\262\227\344\275\215\344\277\241\346\201\257\350\201\232\345\220\210\347\263\273\347\273\237\357\274\210\346\213\245\346\234\211\347\210\254\350\231\253\347\210\254\345\217\226\343\200\201\346\225\260\346\215\256\345\210\206\346\236\220\343\200\201\345\217\257\350\247\206\345\214\226\343\200\201\344\272\222\345\212\250\347\255\211\345\212\237\350\203\275\357\274\211/WorkAggregation-master/static/icon/robot.png" new file mode 100644 index 0000000..4e646d3 Binary files /dev/null and "b/5\343\200\201Python\346\213\233\350\201\230\345\262\227\344\275\215\344\277\241\346\201\257\350\201\232\345\220\210\347\263\273\347\273\237\357\274\210\346\213\245\346\234\211\347\210\254\350\231\253\347\210\254\345\217\226\343\200\201\346\225\260\346\215\256\345\210\206\346\236\220\343\200\201\345\217\257\350\247\206\345\214\226\343\200\201\344\272\222\345\212\250\347\255\211\345\212\237\350\203\275\357\274\211/WorkAggregation-master/static/icon/robot.png" differ diff --git "a/5\343\200\201Python\346\213\233\350\201\230\345\262\227\344\275\215\344\277\241\346\201\257\350\201\232\345\220\210\347\263\273\347\273\237\357\274\210\346\213\245\346\234\211\347\210\254\350\231\253\347\210\254\345\217\226\343\200\201\346\225\260\346\215\256\345\210\206\346\236\220\343\200\201\345\217\257\350\247\206\345\214\226\343\200\201\344\272\222\345\212\250\347\255\211\345\212\237\350\203\275\357\274\211/WorkAggregation-master/static/icon/us.png" "b/5\343\200\201Python\346\213\233\350\201\230\345\262\227\344\275\215\344\277\241\346\201\257\350\201\232\345\220\210\347\263\273\347\273\237\357\274\210\346\213\245\346\234\211\347\210\254\350\231\253\347\210\254\345\217\226\343\200\201\346\225\260\346\215\256\345\210\206\346\236\220\343\200\201\345\217\257\350\247\206\345\214\226\343\200\201\344\272\222\345\212\250\347\255\211\345\212\237\350\203\275\357\274\211/WorkAggregation-master/static/icon/us.png" new file mode 100644 index 0000000..baa9cc9 Binary files /dev/null and "b/5\343\200\201Python\346\213\233\350\201\230\345\262\227\344\275\215\344\277\241\346\201\257\350\201\232\345\220\210\347\263\273\347\273\237\357\274\210\346\213\245\346\234\211\347\210\254\350\231\253\347\210\254\345\217\226\343\200\201\346\225\260\346\215\256\345\210\206\346\236\220\343\200\201\345\217\257\350\247\206\345\214\226\343\200\201\344\272\222\345\212\250\347\255\211\345\212\237\350\203\275\357\274\211/WorkAggregation-master/static/icon/us.png" differ diff --git "a/5\343\200\201Python\346\213\233\350\201\230\345\262\227\344\275\215\344\277\241\346\201\257\350\201\232\345\220\210\347\263\273\347\273\237\357\274\210\346\213\245\346\234\211\347\210\254\350\231\253\347\210\254\345\217\226\343\200\201\346\225\260\346\215\256\345\210\206\346\236\220\343\200\201\345\217\257\350\247\206\345\214\226\343\200\201\344\272\222\345\212\250\347\255\211\345\212\237\350\203\275\357\274\211/WorkAggregation-master/static/icon/us/1.jpg" "b/5\343\200\201Python\346\213\233\350\201\230\345\262\227\344\275\215\344\277\241\346\201\257\350\201\232\345\220\210\347\263\273\347\273\237\357\274\210\346\213\245\346\234\211\347\210\254\350\231\253\347\210\254\345\217\226\343\200\201\346\225\260\346\215\256\345\210\206\346\236\220\343\200\201\345\217\257\350\247\206\345\214\226\343\200\201\344\272\222\345\212\250\347\255\211\345\212\237\350\203\275\357\274\211/WorkAggregation-master/static/icon/us/1.jpg" new file mode 100644 index 0000000..7b07a77 Binary files /dev/null and "b/5\343\200\201Python\346\213\233\350\201\230\345\262\227\344\275\215\344\277\241\346\201\257\350\201\232\345\220\210\347\263\273\347\273\237\357\274\210\346\213\245\346\234\211\347\210\254\350\231\253\347\210\254\345\217\226\343\200\201\346\225\260\346\215\256\345\210\206\346\236\220\343\200\201\345\217\257\350\247\206\345\214\226\343\200\201\344\272\222\345\212\250\347\255\211\345\212\237\350\203\275\357\274\211/WorkAggregation-master/static/icon/us/1.jpg" differ diff --git "a/5\343\200\201Python\346\213\233\350\201\230\345\262\227\344\275\215\344\277\241\346\201\257\350\201\232\345\220\210\347\263\273\347\273\237\357\274\210\346\213\245\346\234\211\347\210\254\350\231\253\347\210\254\345\217\226\343\200\201\346\225\260\346\215\256\345\210\206\346\236\220\343\200\201\345\217\257\350\247\206\345\214\226\343\200\201\344\272\222\345\212\250\347\255\211\345\212\237\350\203\275\357\274\211/WorkAggregation-master/static/icon/us/2.jpg" "b/5\343\200\201Python\346\213\233\350\201\230\345\262\227\344\275\215\344\277\241\346\201\257\350\201\232\345\220\210\347\263\273\347\273\237\357\274\210\346\213\245\346\234\211\347\210\254\350\231\253\347\210\254\345\217\226\343\200\201\346\225\260\346\215\256\345\210\206\346\236\220\343\200\201\345\217\257\350\247\206\345\214\226\343\200\201\344\272\222\345\212\250\347\255\211\345\212\237\350\203\275\357\274\211/WorkAggregation-master/static/icon/us/2.jpg" new file mode 100644 index 0000000..d3463e5 Binary files /dev/null and "b/5\343\200\201Python\346\213\233\350\201\230\345\262\227\344\275\215\344\277\241\346\201\257\350\201\232\345\220\210\347\263\273\347\273\237\357\274\210\346\213\245\346\234\211\347\210\254\350\231\253\347\210\254\345\217\226\343\200\201\346\225\260\346\215\256\345\210\206\346\236\220\343\200\201\345\217\257\350\247\206\345\214\226\343\200\201\344\272\222\345\212\250\347\255\211\345\212\237\350\203\275\357\274\211/WorkAggregation-master/static/icon/us/2.jpg" differ diff --git "a/5\343\200\201Python\346\213\233\350\201\230\345\262\227\344\275\215\344\277\241\346\201\257\350\201\232\345\220\210\347\263\273\347\273\237\357\274\210\346\213\245\346\234\211\347\210\254\350\231\253\347\210\254\345\217\226\343\200\201\346\225\260\346\215\256\345\210\206\346\236\220\343\200\201\345\217\257\350\247\206\345\214\226\343\200\201\344\272\222\345\212\250\347\255\211\345\212\237\350\203\275\357\274\211/WorkAggregation-master/static/icon/us/3.jpg" "b/5\343\200\201Python\346\213\233\350\201\230\345\262\227\344\275\215\344\277\241\346\201\257\350\201\232\345\220\210\347\263\273\347\273\237\357\274\210\346\213\245\346\234\211\347\210\254\350\231\253\347\210\254\345\217\226\343\200\201\346\225\260\346\215\256\345\210\206\346\236\220\343\200\201\345\217\257\350\247\206\345\214\226\343\200\201\344\272\222\345\212\250\347\255\211\345\212\237\350\203\275\357\274\211/WorkAggregation-master/static/icon/us/3.jpg" new file mode 100644 index 0000000..5aaa7de Binary files /dev/null and "b/5\343\200\201Python\346\213\233\350\201\230\345\262\227\344\275\215\344\277\241\346\201\257\350\201\232\345\220\210\347\263\273\347\273\237\357\274\210\346\213\245\346\234\211\347\210\254\350\231\253\347\210\254\345\217\226\343\200\201\346\225\260\346\215\256\345\210\206\346\236\220\343\200\201\345\217\257\350\247\206\345\214\226\343\200\201\344\272\222\345\212\250\347\255\211\345\212\237\350\203\275\357\274\211/WorkAggregation-master/static/icon/us/3.jpg" differ diff --git "a/5\343\200\201Python\346\213\233\350\201\230\345\262\227\344\275\215\344\277\241\346\201\257\350\201\232\345\220\210\347\263\273\347\273\237\357\274\210\346\213\245\346\234\211\347\210\254\350\231\253\347\210\254\345\217\226\343\200\201\346\225\260\346\215\256\345\210\206\346\236\220\343\200\201\345\217\257\350\247\206\345\214\226\343\200\201\344\272\222\345\212\250\347\255\211\345\212\237\350\203\275\357\274\211/WorkAggregation-master/static/icon/us/4.jpg" "b/5\343\200\201Python\346\213\233\350\201\230\345\262\227\344\275\215\344\277\241\346\201\257\350\201\232\345\220\210\347\263\273\347\273\237\357\274\210\346\213\245\346\234\211\347\210\254\350\231\253\347\210\254\345\217\226\343\200\201\346\225\260\346\215\256\345\210\206\346\236\220\343\200\201\345\217\257\350\247\206\345\214\226\343\200\201\344\272\222\345\212\250\347\255\211\345\212\237\350\203\275\357\274\211/WorkAggregation-master/static/icon/us/4.jpg" new file mode 100644 index 0000000..2e24073 Binary files /dev/null and "b/5\343\200\201Python\346\213\233\350\201\230\345\262\227\344\275\215\344\277\241\346\201\257\350\201\232\345\220\210\347\263\273\347\273\237\357\274\210\346\213\245\346\234\211\347\210\254\350\231\253\347\210\254\345\217\226\343\200\201\346\225\260\346\215\256\345\210\206\346\236\220\343\200\201\345\217\257\350\247\206\345\214\226\343\200\201\344\272\222\345\212\250\347\255\211\345\212\237\350\203\275\357\274\211/WorkAggregation-master/static/icon/us/4.jpg" differ diff --git "a/5\343\200\201Python\346\213\233\350\201\230\345\262\227\344\275\215\344\277\241\346\201\257\350\201\232\345\220\210\347\263\273\347\273\237\357\274\210\346\213\245\346\234\211\347\210\254\350\231\253\347\210\254\345\217\226\343\200\201\346\225\260\346\215\256\345\210\206\346\236\220\343\200\201\345\217\257\350\247\206\345\214\226\343\200\201\344\272\222\345\212\250\347\255\211\345\212\237\350\203\275\357\274\211/WorkAggregation-master/static/icon/us/5.jpg" "b/5\343\200\201Python\346\213\233\350\201\230\345\262\227\344\275\215\344\277\241\346\201\257\350\201\232\345\220\210\347\263\273\347\273\237\357\274\210\346\213\245\346\234\211\347\210\254\350\231\253\347\210\254\345\217\226\343\200\201\346\225\260\346\215\256\345\210\206\346\236\220\343\200\201\345\217\257\350\247\206\345\214\226\343\200\201\344\272\222\345\212\250\347\255\211\345\212\237\350\203\275\357\274\211/WorkAggregation-master/static/icon/us/5.jpg" new file mode 100644 index 0000000..f83002c Binary files /dev/null and "b/5\343\200\201Python\346\213\233\350\201\230\345\262\227\344\275\215\344\277\241\346\201\257\350\201\232\345\220\210\347\263\273\347\273\237\357\274\210\346\213\245\346\234\211\347\210\254\350\231\253\347\210\254\345\217\226\343\200\201\346\225\260\346\215\256\345\210\206\346\236\220\343\200\201\345\217\257\350\247\206\345\214\226\343\200\201\344\272\222\345\212\250\347\255\211\345\212\237\350\203\275\357\274\211/WorkAggregation-master/static/icon/us/5.jpg" differ diff --git "a/5\343\200\201Python\346\213\233\350\201\230\345\262\227\344\275\215\344\277\241\346\201\257\350\201\232\345\220\210\347\263\273\347\273\237\357\274\210\346\213\245\346\234\211\347\210\254\350\231\253\347\210\254\345\217\226\343\200\201\346\225\260\346\215\256\345\210\206\346\236\220\343\200\201\345\217\257\350\247\206\345\214\226\343\200\201\344\272\222\345\212\250\347\255\211\345\212\237\350\203\275\357\274\211/WorkAggregation-master/templates/index.html" "b/5\343\200\201Python\346\213\233\350\201\230\345\262\227\344\275\215\344\277\241\346\201\257\350\201\232\345\220\210\347\263\273\347\273\237\357\274\210\346\213\245\346\234\211\347\210\254\350\231\253\347\210\254\345\217\226\343\200\201\346\225\260\346\215\256\345\210\206\346\236\220\343\200\201\345\217\257\350\247\206\345\214\226\343\200\201\344\272\222\345\212\250\347\255\211\345\212\237\350\203\275\357\274\211/WorkAggregation-master/templates/index.html" new file mode 100644 index 0000000..414a126 --- /dev/null +++ "b/5\343\200\201Python\346\213\233\350\201\230\345\262\227\344\275\215\344\277\241\346\201\257\350\201\232\345\220\210\347\263\273\347\273\237\357\274\210\346\213\245\346\234\211\347\210\254\350\231\253\347\210\254\345\217\226\343\200\201\346\225\260\346\215\256\345\210\206\346\236\220\343\200\201\345\217\257\350\247\206\345\214\226\343\200\201\344\272\222\345\212\250\347\255\211\345\212\237\350\203\275\357\274\211/WorkAggregation-master/templates/index.html" @@ -0,0 +1,58 @@ + + + + + 公众号:程序员晚枫 + + + + + + + +
+ + + + + + + + + + + + + diff --git "a/5\343\200\201Python\346\213\233\350\201\230\345\262\227\344\275\215\344\277\241\346\201\257\350\201\232\345\220\210\347\263\273\347\273\237\357\274\210\346\213\245\346\234\211\347\210\254\350\231\253\347\210\254\345\217\226\343\200\201\346\225\260\346\215\256\345\210\206\346\236\220\343\200\201\345\217\257\350\247\206\345\214\226\343\200\201\344\272\222\345\212\250\347\255\211\345\212\237\350\203\275\357\274\211/WorkAggregation-master/templates/interaction.html" "b/5\343\200\201Python\346\213\233\350\201\230\345\262\227\344\275\215\344\277\241\346\201\257\350\201\232\345\220\210\347\263\273\347\273\237\357\274\210\346\213\245\346\234\211\347\210\254\350\231\253\347\210\254\345\217\226\343\200\201\346\225\260\346\215\256\345\210\206\346\236\220\343\200\201\345\217\257\350\247\206\345\214\226\343\200\201\344\272\222\345\212\250\347\255\211\345\212\237\350\203\275\357\274\211/WorkAggregation-master/templates/interaction.html" new file mode 100644 index 0000000..54f6103 --- /dev/null +++ "b/5\343\200\201Python\346\213\233\350\201\230\345\262\227\344\275\215\344\277\241\346\201\257\350\201\232\345\220\210\347\263\273\347\273\237\357\274\210\346\213\245\346\234\211\347\210\254\350\231\253\347\210\254\345\217\226\343\200\201\346\225\260\346\215\256\345\210\206\346\236\220\343\200\201\345\217\257\350\247\206\345\214\226\343\200\201\344\272\222\345\212\250\347\255\211\345\212\237\350\203\275\357\274\211/WorkAggregation-master/templates/interaction.html" @@ -0,0 +1,278 @@ + + + + + 公众号:程序员晚枫 + + + + + + + + +
+ + + {#
#} +
+ +
+ + {#
#} + {#
#} + {# 您好,我是机器人小明,感谢您使用本系统。
#} + {# 假设您是一位在校大学生,正在学习计算机相关的专业,并且热爱计算机。
#} + {#
#} + {# #} + {#
#} + {##} + {##} + {#
#} + {#
#} + {# 您和您周围的同学肯定会有像这样的苦恼
#} + {# 究竟是应该准备读研深造呢,还是好好学习技术毕业直接就业呢..(。•ˇ‸ˇ•。) ..
#} + {#
#} + {# #} + {##} + {#
#} + + + + + + + + + + +
+
+ +
+ +
+
+
    +
  • 对 HTML / CSS / JavaScript 具有一定的知识;
  • +
  • 有较熟练使用 AngularJS / Vue / jQuery 或者其它类库的经验;
  • +
  • 较熟悉第三方组件(插件)生态环境及具体案例;
  • +
  • 有较熟练使用 Jade / Swig / Handlebars / Mustache 或者其它模板引擎的经验;
  • +
  • 有较熟练使用 SASS 或者其它 CSS 预处理器的经验;
  • +
  • 有较熟练使用 CoffeeScript 的经验;
  • +
  • 对 CSS / JavaScript 设计模式有很好的认识及应用;
  • +
  • 对常用数据结构和算法熟悉;
  • +
  • 有使用 GruntJS / GulpJS 任务运行器的经验;
  • +
  • 有使用 Yeoman 生成器的经验;
  • +
  • 有诸如 Bower / Volo / JSPM 等前端静态资源包管理器使用经验;
  • +
  • 熟悉本地及远程(真机)调试操作;
  • +
  • 有 Git 的使用经验;
  • +
+ + +
+ +
+ +
+
+ + + + + + +
+
+ +
+
+ + + + +
+
+ +
+ + + + + \ No newline at end of file diff --git "a/5\343\200\201Python\346\213\233\350\201\230\345\262\227\344\275\215\344\277\241\346\201\257\350\201\232\345\220\210\347\263\273\347\273\237\357\274\210\346\213\245\346\234\211\347\210\254\350\231\253\347\210\254\345\217\226\343\200\201\346\225\260\346\215\256\345\210\206\346\236\220\343\200\201\345\217\257\350\247\206\345\214\226\343\200\201\344\272\222\345\212\250\347\255\211\345\212\237\350\203\275\357\274\211/WorkAggregation-master/templates/show.html" "b/5\343\200\201Python\346\213\233\350\201\230\345\262\227\344\275\215\344\277\241\346\201\257\350\201\232\345\220\210\347\263\273\347\273\237\357\274\210\346\213\245\346\234\211\347\210\254\350\231\253\347\210\254\345\217\226\343\200\201\346\225\260\346\215\256\345\210\206\346\236\220\343\200\201\345\217\257\350\247\206\345\214\226\343\200\201\344\272\222\345\212\250\347\255\211\345\212\237\350\203\275\357\274\211/WorkAggregation-master/templates/show.html" new file mode 100644 index 0000000..1a63e37 --- /dev/null +++ "b/5\343\200\201Python\346\213\233\350\201\230\345\262\227\344\275\215\344\277\241\346\201\257\350\201\232\345\220\210\347\263\273\347\273\237\357\274\210\346\213\245\346\234\211\347\210\254\350\231\253\347\210\254\345\217\226\343\200\201\346\225\260\346\215\256\345\210\206\346\236\220\343\200\201\345\217\257\350\247\206\345\214\226\343\200\201\344\272\222\345\212\250\347\255\211\345\212\237\350\203\275\357\274\211/WorkAggregation-master/templates/show.html" @@ -0,0 +1,108 @@ + + + + + + 公众号:程序员晚枫 + + + + + {% for jsfile_name in script_list %} + + {% endfor %} + + + + + + +
+
+
+
+
+
+ +
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ + +
+
+
+
+
+
+ + + + + + + \ No newline at end of file diff --git "a/5\343\200\201Python\346\213\233\350\201\230\345\262\227\344\275\215\344\277\241\346\201\257\350\201\232\345\220\210\347\263\273\347\273\237\357\274\210\346\213\245\346\234\211\347\210\254\350\231\253\347\210\254\345\217\226\343\200\201\346\225\260\346\215\256\345\210\206\346\236\220\343\200\201\345\217\257\350\247\206\345\214\226\343\200\201\344\272\222\345\212\250\347\255\211\345\212\237\350\203\275\357\274\211/WorkAggregation-master/templates/spider.html" "b/5\343\200\201Python\346\213\233\350\201\230\345\262\227\344\275\215\344\277\241\346\201\257\350\201\232\345\220\210\347\263\273\347\273\237\357\274\210\346\213\245\346\234\211\347\210\254\350\231\253\347\210\254\345\217\226\343\200\201\346\225\260\346\215\256\345\210\206\346\236\220\343\200\201\345\217\257\350\247\206\345\214\226\343\200\201\344\272\222\345\212\250\347\255\211\345\212\237\350\203\275\357\274\211/WorkAggregation-master/templates/spider.html" new file mode 100644 index 0000000..a6060ac --- /dev/null +++ "b/5\343\200\201Python\346\213\233\350\201\230\345\262\227\344\275\215\344\277\241\346\201\257\350\201\232\345\220\210\347\263\273\347\273\237\357\274\210\346\213\245\346\234\211\347\210\254\350\231\253\347\210\254\345\217\226\343\200\201\346\225\260\346\215\256\345\210\206\346\236\220\343\200\201\345\217\257\350\247\206\345\214\226\343\200\201\344\272\222\345\212\250\347\255\211\345\212\237\350\203\275\357\274\211/WorkAggregation-master/templates/spider.html" @@ -0,0 +1,134 @@ + + + + + 公众号:程序员晚枫 + + + + + + + + + + + +

等待数分钟后将自动下载爬取的数据

+ +
+
+ + + + + + + + + + + + +
+
+ + + + + + + + +
+
+

 

+
+
+
  • +
    + 多线程➕ +
    + +
  • +
    + + +
    +
    + + +
    + +
    +

    + +
  • +
    + 定时爬取 +
    + +
  • + +
    + + +
    +
    + + +
    +
    +

     服务器性能有限,
    可能需要等待3-5分钟
    抓取的数据将自动下载

    +
    +
    + +
    +
    + + + + + +
    + + + + \ No newline at end of file diff --git "a/5\343\200\201Python\346\213\233\350\201\230\345\262\227\344\275\215\344\277\241\346\201\257\350\201\232\345\220\210\347\263\273\347\273\237\357\274\210\346\213\245\346\234\211\347\210\254\350\231\253\347\210\254\345\217\226\343\200\201\346\225\260\346\215\256\345\210\206\346\236\220\343\200\201\345\217\257\350\247\206\345\214\226\343\200\201\344\272\222\345\212\250\347\255\211\345\212\237\350\203\275\357\274\211/WorkAggregation-master/templates/test.html" "b/5\343\200\201Python\346\213\233\350\201\230\345\262\227\344\275\215\344\277\241\346\201\257\350\201\232\345\220\210\347\263\273\347\273\237\357\274\210\346\213\245\346\234\211\347\210\254\350\231\253\347\210\254\345\217\226\343\200\201\346\225\260\346\215\256\345\210\206\346\236\220\343\200\201\345\217\257\350\247\206\345\214\226\343\200\201\344\272\222\345\212\250\347\255\211\345\212\237\350\203\275\357\274\211/WorkAggregation-master/templates/test.html" new file mode 100644 index 0000000..3e16709 --- /dev/null +++ "b/5\343\200\201Python\346\213\233\350\201\230\345\262\227\344\275\215\344\277\241\346\201\257\350\201\232\345\220\210\347\263\273\347\273\237\357\274\210\346\213\245\346\234\211\347\210\254\350\231\253\347\210\254\345\217\226\343\200\201\346\225\260\346\215\256\345\210\206\346\236\220\343\200\201\345\217\257\350\247\206\345\214\226\343\200\201\344\272\222\345\212\250\347\255\211\345\212\237\350\203\275\357\274\211/WorkAggregation-master/templates/test.html" @@ -0,0 +1,16 @@ + + + + + 公众号:程序员晚枫 + + + + + + + + + + + \ No newline at end of file diff --git "a/5\343\200\201Python\346\213\233\350\201\230\345\262\227\344\275\215\344\277\241\346\201\257\350\201\232\345\220\210\347\263\273\347\273\237\357\274\210\346\213\245\346\234\211\347\210\254\350\231\253\347\210\254\345\217\226\343\200\201\346\225\260\346\215\256\345\210\206\346\236\220\343\200\201\345\217\257\350\247\206\345\214\226\343\200\201\344\272\222\345\212\250\347\255\211\345\212\237\350\203\275\357\274\211/WorkAggregation-master/templates/us.html" "b/5\343\200\201Python\346\213\233\350\201\230\345\262\227\344\275\215\344\277\241\346\201\257\350\201\232\345\220\210\347\263\273\347\273\237\357\274\210\346\213\245\346\234\211\347\210\254\350\231\253\347\210\254\345\217\226\343\200\201\346\225\260\346\215\256\345\210\206\346\236\220\343\200\201\345\217\257\350\247\206\345\214\226\343\200\201\344\272\222\345\212\250\347\255\211\345\212\237\350\203\275\357\274\211/WorkAggregation-master/templates/us.html" new file mode 100644 index 0000000..a888ab2 --- /dev/null +++ "b/5\343\200\201Python\346\213\233\350\201\230\345\262\227\344\275\215\344\277\241\346\201\257\350\201\232\345\220\210\347\263\273\347\273\237\357\274\210\346\213\245\346\234\211\347\210\254\350\231\253\347\210\254\345\217\226\343\200\201\346\225\260\346\215\256\345\210\206\346\236\220\343\200\201\345\217\257\350\247\206\345\214\226\343\200\201\344\272\222\345\212\250\347\255\211\345\212\237\350\203\275\357\274\211/WorkAggregation-master/templates/us.html" @@ -0,0 +1,85 @@ + + + + + 公众号:程序员晚枫 + + + + + + + + +
    + + +
    + +
    + + +
    + + +
    + +
    + + +
    + +
    + + +
    + +
    + + +
    + + +
    + 汤艳萍 +

    今天也要加油鸭! +

    队长,统筹全局,负责数据处理 +
    + + +
    + 张益铭 +

    不造重复的轮子,但你要会造 +

    负责爬虫、平台前后端建设、文档撰写 +
    + +
    + 郑文超 +

    +

    负责数据处理、数据分析、数据可视化 +
    + +
    + 王政凯 +

    真实 +

    负责数据处理、数据分析、论文撰写 +
    + +
    + 张振磊 +

    #include<bits/stdc++.h> +

    负责交互互动 +
    + +
    + + + + + + + + + \ No newline at end of file diff --git "a/6\343\200\201Python\345\256\236\347\216\260\347\226\253\346\203\205\345\214\273\347\226\227\344\277\241\346\201\257\347\256\241\347\220\206\347\263\273\347\273\237(\351\231\204\346\272\220\347\240\201)/EIMS-main/README.md" "b/6\343\200\201Python\345\256\236\347\216\260\347\226\253\346\203\205\345\214\273\347\226\227\344\277\241\346\201\257\347\256\241\347\220\206\347\263\273\347\273\237(\351\231\204\346\272\220\347\240\201)/EIMS-main/README.md" new file mode 100644 index 0000000..26f3341 --- /dev/null +++ "b/6\343\200\201Python\345\256\236\347\216\260\347\226\253\346\203\205\345\214\273\347\226\227\344\277\241\346\201\257\347\256\241\347\220\206\347\263\273\347\273\237(\351\231\204\346\272\220\347\240\201)/EIMS-main/README.md" @@ -0,0 +1,5 @@ +# EIMS +数据库课程设计,Python+SQLServer实现疫情医疗信息管理系统 + +最强Python学习资源:https://mp.weixin.qq.com/s/sO6hbVqORy7JpN-5TlaKvQ + diff --git "a/6\343\200\201Python\345\256\236\347\216\260\347\226\253\346\203\205\345\214\273\347\226\227\344\277\241\346\201\257\347\256\241\347\220\206\347\263\273\347\273\237(\351\231\204\346\272\220\347\240\201)/EIMS-main/db/EIMS.mdf" "b/6\343\200\201Python\345\256\236\347\216\260\347\226\253\346\203\205\345\214\273\347\226\227\344\277\241\346\201\257\347\256\241\347\220\206\347\263\273\347\273\237(\351\231\204\346\272\220\347\240\201)/EIMS-main/db/EIMS.mdf" new file mode 100644 index 0000000..533a7b4 Binary files /dev/null and "b/6\343\200\201Python\345\256\236\347\216\260\347\226\253\346\203\205\345\214\273\347\226\227\344\277\241\346\201\257\347\256\241\347\220\206\347\263\273\347\273\237(\351\231\204\346\272\220\347\240\201)/EIMS-main/db/EIMS.mdf" differ diff --git "a/6\343\200\201Python\345\256\236\347\216\260\347\226\253\346\203\205\345\214\273\347\226\227\344\277\241\346\201\257\347\256\241\347\220\206\347\263\273\347\273\237(\351\231\204\346\272\220\347\240\201)/EIMS-main/db/EIMS_log.ldf" "b/6\343\200\201Python\345\256\236\347\216\260\347\226\253\346\203\205\345\214\273\347\226\227\344\277\241\346\201\257\347\256\241\347\220\206\347\263\273\347\273\237(\351\231\204\346\272\220\347\240\201)/EIMS-main/db/EIMS_log.ldf" new file mode 100644 index 0000000..4a449da Binary files /dev/null and "b/6\343\200\201Python\345\256\236\347\216\260\347\226\253\346\203\205\345\214\273\347\226\227\344\277\241\346\201\257\347\256\241\347\220\206\347\263\273\347\273\237(\351\231\204\346\272\220\347\240\201)/EIMS-main/db/EIMS_log.ldf" differ diff --git "a/6\343\200\201Python\345\256\236\347\216\260\347\226\253\346\203\205\345\214\273\347\226\227\344\277\241\346\201\257\347\256\241\347\220\206\347\263\273\347\273\237(\351\231\204\346\272\220\347\240\201)/EIMS-main/db/donate.dbf" "b/6\343\200\201Python\345\256\236\347\216\260\347\226\253\346\203\205\345\214\273\347\226\227\344\277\241\346\201\257\347\256\241\347\220\206\347\263\273\347\273\237(\351\231\204\346\272\220\347\240\201)/EIMS-main/db/donate.dbf" new file mode 100644 index 0000000..1912de1 Binary files /dev/null and "b/6\343\200\201Python\345\256\236\347\216\260\347\226\253\346\203\205\345\214\273\347\226\227\344\277\241\346\201\257\347\256\241\347\220\206\347\263\273\347\273\237(\351\231\204\346\272\220\347\240\201)/EIMS-main/db/donate.dbf" differ diff --git "a/6\343\200\201Python\345\256\236\347\216\260\347\226\253\346\203\205\345\214\273\347\226\227\344\277\241\346\201\257\347\256\241\347\220\206\347\263\273\347\273\237(\351\231\204\346\272\220\347\240\201)/EIMS-main/db/hospital.dbf" "b/6\343\200\201Python\345\256\236\347\216\260\347\226\253\346\203\205\345\214\273\347\226\227\344\277\241\346\201\257\347\256\241\347\220\206\347\263\273\347\273\237(\351\231\204\346\272\220\347\240\201)/EIMS-main/db/hospital.dbf" new file mode 100644 index 0000000..8c2dedb Binary files /dev/null and "b/6\343\200\201Python\345\256\236\347\216\260\347\226\253\346\203\205\345\214\273\347\226\227\344\277\241\346\201\257\347\256\241\347\220\206\347\263\273\347\273\237(\351\231\204\346\272\220\347\240\201)/EIMS-main/db/hospital.dbf" differ diff --git "a/6\343\200\201Python\345\256\236\347\216\260\347\226\253\346\203\205\345\214\273\347\226\227\344\277\241\346\201\257\347\256\241\347\220\206\347\263\273\347\273\237(\351\231\204\346\272\220\347\240\201)/EIMS-main/db/medical_supplies.dbf" "b/6\343\200\201Python\345\256\236\347\216\260\347\226\253\346\203\205\345\214\273\347\226\227\344\277\241\346\201\257\347\256\241\347\220\206\347\263\273\347\273\237(\351\231\204\346\272\220\347\240\201)/EIMS-main/db/medical_supplies.dbf" new file mode 100644 index 0000000..a886bc0 Binary files /dev/null and "b/6\343\200\201Python\345\256\236\347\216\260\347\226\253\346\203\205\345\214\273\347\226\227\344\277\241\346\201\257\347\256\241\347\220\206\347\263\273\347\273\237(\351\231\204\346\272\220\347\240\201)/EIMS-main/db/medical_supplies.dbf" differ diff --git "a/6\343\200\201Python\345\256\236\347\216\260\347\226\253\346\203\205\345\214\273\347\226\227\344\277\241\346\201\257\347\256\241\347\220\206\347\263\273\347\273\237(\351\231\204\346\272\220\347\240\201)/EIMS-main/db/myUser.dbf" "b/6\343\200\201Python\345\256\236\347\216\260\347\226\253\346\203\205\345\214\273\347\226\227\344\277\241\346\201\257\347\256\241\347\220\206\347\263\273\347\273\237(\351\231\204\346\272\220\347\240\201)/EIMS-main/db/myUser.dbf" new file mode 100644 index 0000000..9e55aa1 Binary files /dev/null and "b/6\343\200\201Python\345\256\236\347\216\260\347\226\253\346\203\205\345\214\273\347\226\227\344\277\241\346\201\257\347\256\241\347\220\206\347\263\273\347\273\237(\351\231\204\346\272\220\347\240\201)/EIMS-main/db/myUser.dbf" differ diff --git "a/6\343\200\201Python\345\256\236\347\216\260\347\226\253\346\203\205\345\214\273\347\226\227\344\277\241\346\201\257\347\256\241\347\220\206\347\263\273\347\273\237(\351\231\204\346\272\220\347\240\201)/EIMS-main/db/patient.dbf" "b/6\343\200\201Python\345\256\236\347\216\260\347\226\253\346\203\205\345\214\273\347\226\227\344\277\241\346\201\257\347\256\241\347\220\206\347\263\273\347\273\237(\351\231\204\346\272\220\347\240\201)/EIMS-main/db/patient.dbf" new file mode 100644 index 0000000..789c448 Binary files /dev/null and "b/6\343\200\201Python\345\256\236\347\216\260\347\226\253\346\203\205\345\214\273\347\226\227\344\277\241\346\201\257\347\256\241\347\220\206\347\263\273\347\273\237(\351\231\204\346\272\220\347\240\201)/EIMS-main/db/patient.dbf" differ diff --git "a/6\343\200\201Python\345\256\236\347\216\260\347\226\253\346\203\205\345\214\273\347\226\227\344\277\241\346\201\257\347\256\241\347\220\206\347\263\273\347\273\237(\351\231\204\346\272\220\347\240\201)/EIMS-main/db/worker.dbf" "b/6\343\200\201Python\345\256\236\347\216\260\347\226\253\346\203\205\345\214\273\347\226\227\344\277\241\346\201\257\347\256\241\347\220\206\347\263\273\347\273\237(\351\231\204\346\272\220\347\240\201)/EIMS-main/db/worker.dbf" new file mode 100644 index 0000000..2fa839e Binary files /dev/null and "b/6\343\200\201Python\345\256\236\347\216\260\347\226\253\346\203\205\345\214\273\347\226\227\344\277\241\346\201\257\347\256\241\347\220\206\347\263\273\347\273\237(\351\231\204\346\272\220\347\240\201)/EIMS-main/db/worker.dbf" differ diff --git "a/6\343\200\201Python\345\256\236\347\216\260\347\226\253\346\203\205\345\214\273\347\226\227\344\277\241\346\201\257\347\256\241\347\220\206\347\263\273\347\273\237(\351\231\204\346\272\220\347\240\201)/EIMS-main/info.txt" "b/6\343\200\201Python\345\256\236\347\216\260\347\226\253\346\203\205\345\214\273\347\226\227\344\277\241\346\201\257\347\256\241\347\220\206\347\263\273\347\273\237(\351\231\204\346\272\220\347\240\201)/EIMS-main/info.txt" new file mode 100644 index 0000000..6276c0e --- /dev/null +++ "b/6\343\200\201Python\345\256\236\347\216\260\347\226\253\346\203\205\345\214\273\347\226\227\344\277\241\346\201\257\347\256\241\347\220\206\347\263\273\347\273\237(\351\231\204\346\272\220\347\240\201)/EIMS-main/info.txt" @@ -0,0 +1 @@ +2@高家鸥@123456@1351@山东郯城@0@无症状@轻型@1651@13515@1@1@1@1@0@ \ No newline at end of file diff --git "a/6\343\200\201Python\345\256\236\347\216\260\347\226\253\346\203\205\345\214\273\347\226\227\344\277\241\346\201\257\347\256\241\347\220\206\347\263\273\347\273\237(\351\231\204\346\272\220\347\240\201)/EIMS-main/main.py" "b/6\343\200\201Python\345\256\236\347\216\260\347\226\253\346\203\205\345\214\273\347\226\227\344\277\241\346\201\257\347\256\241\347\220\206\347\263\273\347\273\237(\351\231\204\346\272\220\347\240\201)/EIMS-main/main.py" new file mode 100644 index 0000000..c039d13 --- /dev/null +++ "b/6\343\200\201Python\345\256\236\347\216\260\347\226\253\346\203\205\345\214\273\347\226\227\344\277\241\346\201\257\347\256\241\347\220\206\347\263\273\347\273\237(\351\231\204\346\272\220\347\240\201)/EIMS-main/main.py" @@ -0,0 +1,34 @@ +# from model.ConnDB import ConnDB +# from model.user import User +# # 数据库参数配置 +# server = "127.0.0.1" +# port = "1433" +# user = "sa" +# password = "123456" +# charset = "utf-8" +# database = "EIMS" +# ms = ConnDB(server=server, port=port, user=user, password=password, database=database, autocommit=True, as_dict=True) +# +# # 查 +# sql = "select * from myUser" +# # 增 +# sql2 = "insert into myUser values (%s, %s, %s, %s)" +# # 改 +# sql3 = "update myUser set password=%s where user_id=%s" +# result = ms.ExecQuery(sql, ()) +# # nums = len(result) +# item = result[0] +# user = User(item['user_id'], item['username'], item['password'], item['is_deleted']) +# print(user.username) +# # ms.ExecNonQuery(sql2, (nums+1, "lisa", "123456", 0)) +# ms.ExecNonQuery(sql3, ("1234567", 3)) +# ms.close() + +# -*- coding: utf-8 -*- +import tkinter +from view.login import * +root = tkinter.Tk() +style = ttk.Style("cosmo") +root.title("疫情医疗信息管理系统") +LoginPage(root) +root.mainloop() diff --git "a/6\343\200\201Python\345\256\236\347\216\260\347\226\253\346\203\205\345\214\273\347\226\227\344\277\241\346\201\257\347\256\241\347\220\206\347\263\273\347\273\237(\351\231\204\346\272\220\347\240\201)/EIMS-main/model/ConnDB.py" "b/6\343\200\201Python\345\256\236\347\216\260\347\226\253\346\203\205\345\214\273\347\226\227\344\277\241\346\201\257\347\256\241\347\220\206\347\263\273\347\273\237(\351\231\204\346\272\220\347\240\201)/EIMS-main/model/ConnDB.py" new file mode 100644 index 0000000..262ec3f --- /dev/null +++ "b/6\343\200\201Python\345\256\236\347\216\260\347\226\253\346\203\205\345\214\273\347\226\227\344\277\241\346\201\257\347\256\241\347\220\206\347\263\273\347\273\237(\351\231\204\346\272\220\347\240\201)/EIMS-main/model/ConnDB.py" @@ -0,0 +1,95 @@ +# -*- coding: utf-8 -*- +""" +@Time: 2022/4/27 20:08 +@Author: http://t.cn/A65MiFvH +@Version: 0.0.0 +@Description:数据库连接封装类 +@WeChat Account: http://t.cn/A65MiFvH +""" +import pymssql + + +class ConnDB(object): + def __init__(self, as_dict=True): + super(ConnDB, self).__init__() + self.server = "127.0.0.1" + self.port = "1433" + self.user = "sa" + self.password = "123456" + self.charset = "utf-8" + self.database = "EIMS" + self.autocommit = True + self.as_dict = as_dict + + def __GetConnect(self): + """ + 得到连接信息 + 返回: conn.cursor() + """ + if not self.database: + raise (NameError, "没有设置数据库信息") + self.conn = pymssql.connect(server=self.server, port=self.port, user=self.user, password=self.password, + database=self.database, autocommit=self.autocommit, charset='cp936') + self.cur = self.conn.cursor(as_dict=self.as_dict) + if not self.cur: + raise (NameError, "连接数据库失败") + else: + return self.cur + + """ + 增加一条记录 + """ + """ + 执行查询语句 + """ + def ExecQuery(self, sql, args=(), restype="all"): + """ + 执行查询语句 + 调用示例: + ms = MSSQL(host="localhost",user="sa",pwd="123456",db="PythonWeiboStatistics") + resList = ms.ExecQuery("SELECT id,NickName FROM WeiBoUser") + for (id,NickName) in resList: + print str(id),NickName + """ + cur = self.__GetConnect() + # 执行sql语句 + cur.execute(sql, args) + # 获取数据 + if restype == "one": + resList = cur.fetchone() # 获取一条数据 + elif isinstance(restype, int): + resList = cur.fetchmany(int(restype)) # 自定义获取数据 + else: + resList = cur.fetchall() + return resList + + """ + 执行非查询语句 + """ + def ExecNonQuery(self, sql, args=()): + """ + 执行非查询语句 + + 调用示例: + cur = self.__GetConnect() + cur.execute(sql) + self.conn.commit() + self.conn.close() + """ + cur = self.__GetConnect() + # try: + cur.execute(sql.encode("gbk"), args) + self.conn.commit() + # except Exception as e: + # self.conn.rollback() + # print(str(e)) + """ + 关闭数据库连接 + """ + def close(self): + # 如果数据打开,则关闭;否则没有操作 + if self.conn and self.cur: + self.cur.close() + self.conn.close() + return True + raise Exception("not conn and cur") diff --git "a/6\343\200\201Python\345\256\236\347\216\260\347\226\253\346\203\205\345\214\273\347\226\227\344\277\241\346\201\257\347\256\241\347\220\206\347\263\273\347\273\237(\351\231\204\346\272\220\347\240\201)/EIMS-main/model/user.py" "b/6\343\200\201Python\345\256\236\347\216\260\347\226\253\346\203\205\345\214\273\347\226\227\344\277\241\346\201\257\347\256\241\347\220\206\347\263\273\347\273\237(\351\231\204\346\272\220\347\240\201)/EIMS-main/model/user.py" new file mode 100644 index 0000000..48c88f6 --- /dev/null +++ "b/6\343\200\201Python\345\256\236\347\216\260\347\226\253\346\203\205\345\214\273\347\226\227\344\277\241\346\201\257\347\256\241\347\220\206\347\263\273\347\273\237(\351\231\204\346\272\220\347\240\201)/EIMS-main/model/user.py" @@ -0,0 +1,45 @@ +# -*- coding: utf-8 -*- +""" +@Time: 2022/4/27 20:10 +@Author: http://t.cn/A65MiFvH +@Version: 0.0.0 +@Description: +@WeChat Account: http://t.cn/A65MiFvH +""" + + +class User(object): + def __init__(self, user_id, username, password, is_deleted): + super(User, self).__init__() + self.user_id = user_id + self.username = username + self.password = password + self.is_deleted = is_deleted + + def get_user_id(self): + return self.user_id + + def set_user_id(self, user_id): + self.user_id = user_id + return True + + def get_username(self): + return self.username + + def set_username(self, username): + self.username = username + return True + + def get_password(self): + return self.password + + def set_password(self, pwd): + self.password = pwd + return True + + def get_is_deleted(self): + return self.is_deleted + + def set_is_deleted(self, is_deleted): + self.is_deleted = is_deleted + return True diff --git "a/6\343\200\201Python\345\256\236\347\216\260\347\226\253\346\203\205\345\214\273\347\226\227\344\277\241\346\201\257\347\256\241\347\220\206\347\263\273\347\273\237(\351\231\204\346\272\220\347\240\201)/EIMS-main/requirements.txt" "b/6\343\200\201Python\345\256\236\347\216\260\347\226\253\346\203\205\345\214\273\347\226\227\344\277\241\346\201\257\347\256\241\347\220\206\347\263\273\347\273\237(\351\231\204\346\272\220\347\240\201)/EIMS-main/requirements.txt" new file mode 100644 index 0000000..3928c57 --- /dev/null +++ "b/6\343\200\201Python\345\256\236\347\216\260\347\226\253\346\203\205\345\214\273\347\226\227\344\277\241\346\201\257\347\256\241\347\220\206\347\263\273\347\273\237(\351\231\204\346\272\220\347\240\201)/EIMS-main/requirements.txt" @@ -0,0 +1,3 @@ +pymssql==2.2.5 +ttkthemes==3.2.2 +ttkbootstrap==1.7.6 \ No newline at end of file diff --git "a/6\343\200\201Python\345\256\236\347\216\260\347\226\253\346\203\205\345\214\273\347\226\227\344\277\241\346\201\257\347\256\241\347\220\206\347\263\273\347\273\237(\351\231\204\346\272\220\347\240\201)/EIMS-main/user.txt" "b/6\343\200\201Python\345\256\236\347\216\260\347\226\253\346\203\205\345\214\273\347\226\227\344\277\241\346\201\257\347\256\241\347\220\206\347\263\273\347\273\237(\351\231\204\346\272\220\347\240\201)/EIMS-main/user.txt" new file mode 100644 index 0000000..f77b004 --- /dev/null +++ "b/6\343\200\201Python\345\256\236\347\216\260\347\226\253\346\203\205\345\214\273\347\226\227\344\277\241\346\201\257\347\256\241\347\220\206\347\263\273\347\273\237(\351\231\204\346\272\220\347\240\201)/EIMS-main/user.txt" @@ -0,0 +1 @@ +admin \ No newline at end of file diff --git "a/6\343\200\201Python\345\256\236\347\216\260\347\226\253\346\203\205\345\214\273\347\226\227\344\277\241\346\201\257\347\256\241\347\220\206\347\263\273\347\273\237(\351\231\204\346\272\220\347\240\201)/EIMS-main/view/dataEntryForm.py" "b/6\343\200\201Python\345\256\236\347\216\260\347\226\253\346\203\205\345\214\273\347\226\227\344\277\241\346\201\257\347\256\241\347\220\206\347\263\273\347\273\237(\351\231\204\346\272\220\347\240\201)/EIMS-main/view/dataEntryForm.py" new file mode 100644 index 0000000..e35e04c --- /dev/null +++ "b/6\343\200\201Python\345\256\236\347\216\260\347\226\253\346\203\205\345\214\273\347\226\227\344\277\241\346\201\257\347\256\241\347\220\206\347\263\273\347\273\237(\351\231\204\346\272\220\347\240\201)/EIMS-main/view/dataEntryForm.py" @@ -0,0 +1,221 @@ +# -*- coding: utf-8 -*- +""" +@Time: 2022/4/28 16:03 +@Author: http://t.cn/A65MiFvH +@Version: 0.0.0 +@Description: +@WeChat Account: http://t.cn/A65MiFvH +""" +from tkinter import * +from tkinter.messagebox import showinfo, askyesno +from model.ConnDB import ConnDB +import ttkbootstrap as ttk +from ttkbootstrap.constants import * + + +class DataEntryForm(ttk.Frame): + def __init__(self, master): + super().__init__(master, padding=(20, 10)) + with open('info.txt', 'r', encoding='utf-8') as f: + data = f.readlines() + lista = data[0].split('@') + f.close() + self.root = master # 定义内部变量root + self.root.geometry('%dx%d' % (800, 600)) # 设置窗口大小 + # self.root.minsize(500, 350) + # self.root.maxsize(500, 350) + + self.root.title('修改信息') + self.page = Frame(self.root) # 创建Frame + # form variables + self.patient_id = IntVar() + self.patient_name = StringVar() + self.patient_tel = IntVar() + self.patient_birth = StringVar() + self.patient_place = StringVar() + self.is_enter = IntVar() + self.diagnosis = StringVar() + self.level = StringVar() + self.admission_time = StringVar() + self.confirmed_time = StringVar() + self.is_recovery = IntVar() + self.hospital_id = IntVar() + self.worker_id = IntVar() + self.medical_supplies_id = IntVar() + self.patient_id.set(int(lista[0])) + self.patient_name.set(lista[1]) + self.patient_tel.set(int(lista[2])) + self.patient_birth.set(lista[3]) + self.patient_place.set(lista[4]) + self.is_enter.set(int(lista[5])) + self.diagnosis.set(lista[6]) + self.level.set(lista[7]) + self.admission_time.set(lista[8]) + self.confirmed_time.set(lista[9]) + self.is_recovery.set(int(lista[10])) + self.hospital_id.set(int(lista[11])) + self.worker_id.set(int(lista[12])) + self.medical_supplies_id.set(int(lista[13])) + self.createPage() + + def createPage(self): + ttk.Label(self.root, text='添加病例信息', font='SimSum -16 bold').grid(row=0, column=0, pady=10) + ttk.Label(self.root, text='姓 名:', font='SimSun -14').grid(row=1, column=0, pady=10) + ttk.Label(self.root, text='联系方式:', font='SimSun -14').grid(row=2, column=0, pady=10) + ttk.Label(self.root, text='出生日期:', font='SimSun -14').grid(row=3, column=0, pady=10) + ttk.Label(self.root, text='籍 贯:', font='SimSun -14').grid(row=4, column=0, pady=10) + ttk.Label(self.root, text='是否境外输入:', font='SimSun -14').grid(row=5, column=0, pady=10) + ttk.Label(self.root, text='诊断结果:', font='SimSun -14').grid(row=6, column=0, pady=10) + ttk.Label(self.root, text='症状等级:', font='SimSun -14').grid(row=7, column=0, pady=10) + ttk.Label(self.root, text='就诊时间:', font='SimSun -14').grid(row=1, column=3, pady=10) + ttk.Label(self.root, text='确诊时间:', font='SimSun -14').grid(row=2, column=3, pady=10) + ttk.Label(self.root, text='是否治愈:', font='SimSun -14').grid(row=3, column=3, pady=10) + ttk.Label(self.root, text='医院代号:', font='SimSun -14').grid(row=4, column=3, pady=10) + ttk.Label(self.root, text='负责人编号:', font='SimSun -14').grid(row=5, column=3, pady=10) + ttk.Label(self.root, text='物资编号:', font='SimSun -14').grid(row=6, column=3, pady=10) + ttk.Entry(self.root, text=self.patient_name, textvariable=self.patient_name).grid(row=1, column=1, columnspan=2, + pady=10, sticky=W + E) + ttk.Entry(self.root, text=self.patient_tel, textvariable=self.patient_tel).grid(row=2, column=1, columnspan=2, + pady=10, sticky=W + E) + ttk.Entry(self.root, text=self.patient_birth, textvariable=self.patient_birth).grid(row=3, column=1, + columnspan=2, pady=10, + sticky=W + E) + ttk.Entry(self.root, text=self.patient_place, textvariable=self.patient_place).grid(row=4, column=1, + columnspan=2, pady=10, + sticky=W + E) + ttk.Radiobutton(self.root, text="否", value=0, variable=self.is_enter).grid( + row=5, column=1, padx=5, pady=10, sticky=W) + ttk.Radiobutton(self.root, text="是", value=1, variable=self.is_enter).grid( + row=5, column=2, padx=5, pady=10, sticky=W) + ttk.Entry(self.root, text=self.diagnosis, textvariable=self.diagnosis).grid(row=6, column=1, pady=10, + sticky=W + E) + ttk.Entry(self.root, text=self.level, textvariable=self.level).grid(row=7, column=1, pady=10, sticky=W + E) + ttk.Entry(self.root, text=self.admission_time, textvariable=self.admission_time).grid(row=1, column=4, pady=10, + sticky=W + E) + ttk.Entry(self.root, text=self.confirmed_time, textvariable=self.confirmed_time).grid(row=2, column=4, pady=10, + sticky=W + E) + ttk.Radiobutton(self.root, text="否", value=0, variable=self.is_recovery).grid( + row=3, column=4, padx=5, pady=10, sticky=W) + ttk.Radiobutton(self.root, text="是", value=1, variable=self.is_recovery).grid( + row=3, column=5, padx=5, pady=10, sticky=W) + ttk.Entry(self.root, text=self.hospital_id, textvariable=self.hospital_id).grid(row=4, column=4, pady=10, + sticky=W + E) + ttk.Entry(self.root, text=self.worker_id, textvariable=self.worker_id).grid(row=5, column=4, pady=10, + sticky=W + E) + ttk.Entry(self.root, text=self.medical_supplies_id, textvariable=self.medical_supplies_id).grid(row=6, column=4, + pady=10, + sticky=W + E) + ttk.Button(self.root, text='提交', command=self.datacommit, width=10, bootstyle="Primary").grid(row=8, column=1, + pady=10) + ttk.Button(self.root, text='关闭', command=self.closePage, width=10, bootstyle="Danger").grid(row=8, column=3, + pady=10) + + def datacommit(self): + global patient_name, patient_tel, patient_birth, diagnosis, patient_place, level, confirmed_time, admission_time, hospital_id, medical_supplies_id, worker_id, is_recovery + ms = ConnDB() + if self.patient_name.get(): + patient_name = self.patient_name.get() + else: + showinfo(title='提示', message='姓名不能为空!') + return False + if self.patient_tel.get(): + patient_tel = self.patient_tel.get() + else: + showinfo(title='提示', message='联系方式不能为空!') + return False + if self.patient_birth.get(): + patient_birth = self.patient_birth.get() + else: + showinfo(title='提示', message='出生日期不能为空!') + return False + if self.patient_place.get(): + patient_place = self.patient_place.get() + else: + showinfo(title='提示', message='籍贯不能为空!') + return False + if self.diagnosis.get(): + diagnosis = self.diagnosis.get() + else: + showinfo(title='提示', message='诊断结果不能为空!') + return False + if self.level.get(): + level = self.level.get() + else: + showinfo(title='提示', message='症状等级不能为空!') + return False + if self.admission_time.get(): + admission_time = self.admission_time.get() + else: + showinfo(title='提示', message='就诊时间不能为空!') + return False + if self.confirmed_time.get(): + confirmed_time = self.confirmed_time.get() + else: + showinfo(title='提示', message='确诊时间不能为空!') + return False + if self.hospital_id.get(): + hospital_id = self.hospital_id.get() + else: + showinfo(title='提示', message='医院代号不能为空!') + return False + if self.worker_id.get(): + worker_id = self.worker_id.get() + else: + showinfo(title='提示', message='负责人编号不能为空!') + return False + if self.medical_supplies_id.get(): + medical_supplies_id = self.medical_supplies_id.get() + else: + showinfo(title='提示', message='医疗用品编号不能为空!') + return False + number = len(ms.ExecQuery("select patient_id from patient")) + sql = "update patient set patient_name=N'{}',patient_tel={},patient_birth=N'{}',patient_place=N'{}'," \ + "is_enter={},diagnosis=N'{}',level=N'{}',admission_time=N'{}',confirmed_time=N'{}',is_recovery={}," \ + "hospital_id={},worker_id={},medical_supplies_id={} where patient_id={}".format( + patient_name, + patient_tel, patient_birth, + patient_place, self.is_enter.get(), + diagnosis, + level, + admission_time, + confirmed_time, + self.is_recovery.get(), + hospital_id, + worker_id, + medical_supplies_id, + self.patient_id.get()) + print(sql) + try: + # print(sql) + ms.ExecNonQuery(sql, ()) + showinfo(title='提示', message='更改成功!') + self.clear() + self.root.destroy() + + except Exception as e: + showinfo(title='提示', message='出错了!请重试!') + print(str(e)) + ms.close() + + def clear(self): + self.patient_name.set('') + self.patient_tel.set('') + self.patient_birth.set('') + self.patient_place.set('') + self.is_enter.set(0) + self.diagnosis.set('') + self.level.set('') + self.admission_time.set('') + self.confirmed_time.set('') + self.hospital_id.set(1) + self.worker_id.set(1) + self.medical_supplies_id.set(1) + + def closePage(self): + if askyesno('确认操作', '确定执行?'): + self.root.destroy() +# if __name__ == "__main__": +# +# app = ttk.Window("Data Entry", "superhero", resizable=(False, False)) +# DataEntryForm(app) +# app.mainloop() diff --git "a/6\343\200\201Python\345\256\236\347\216\260\347\226\253\346\203\205\345\214\273\347\226\227\344\277\241\346\201\257\347\256\241\347\220\206\347\263\273\347\273\237(\351\231\204\346\272\220\347\240\201)/EIMS-main/view/login.py" "b/6\343\200\201Python\345\256\236\347\216\260\347\226\253\346\203\205\345\214\273\347\226\227\344\277\241\346\201\257\347\256\241\347\220\206\347\263\273\347\273\237(\351\231\204\346\272\220\347\240\201)/EIMS-main/view/login.py" new file mode 100644 index 0000000..bbbc703 --- /dev/null +++ "b/6\343\200\201Python\345\256\236\347\216\260\347\226\253\346\203\205\345\214\273\347\226\227\344\277\241\346\201\257\347\256\241\347\220\206\347\263\273\347\273\237(\351\231\204\346\272\220\347\240\201)/EIMS-main/view/login.py" @@ -0,0 +1,69 @@ +# -*- coding: utf-8 -*- +""" +@Time: 2022/4/27 20:53 +@Author: http://t.cn/A65MiFvH +@Version: 0.0.0 +@Description: +@WeChat Account: http://t.cn/A65MiFvH +""" +from tkinter import * +from tkinter.messagebox import * +from ttkbootstrap.constants import * +import ttkbootstrap as ttk +from model.ConnDB import * +from model.user import * +from view.mainpage import MainPage +from view.dataEntryForm import DataEntryForm + +class LoginPage(object): + def __init__(self, master=None): + self.root = master # 定义内部变量root + self.root.geometry('%dx%d' % (500, 350)) # 设置窗口大小 + # self.root.minsize(500, 350) + # self.root.maxsize(500, 350) + self.root.title('登录') + self.username = StringVar() + self.password = StringVar() + self.page = Frame(self.root) # 创建Frame + self.createPage() + + def createPage(self): + self.page.pack() + ttk.Label(self.page, text="疫情医疗信息管理系统", font='SimSun 25 bold').grid(row=0, stick=W+E, pady=40, columnspan=2) + ttk.Label(self.page, text='用户名: ', font='SimSun -14').grid(row=1, sticky=E, pady=10) + ttk.Entry(self.page, textvariable=self.username).grid(row=1, column=1, sticky=W) + ttk.Label(self.page, text='密 码: ', font='SimSun -14').grid(row=2, sticky=E, pady=10) + ttk.Entry(self.page, textvariable=self.password, show='*').grid(row=2, column=1, sticky=W) + ttk.Button(self.page, text='登录', width=30, command=self.loginCheck, bootstyle="primary-outline").grid(row=3, column=0, + columnspan=2, pady=20) + + def loginCheck(self): + global user + name = self.username.get() + secret = self.password.get() + if name: + ms = ConnDB() + sql = "select * from myUser where is_deleted=0 and username=%s" + result = ms.ExecQuery(sql, (name,)) + if len(result): + item = result[0] + user = User(item['user_id'], item['username'], item['password'], item['is_deleted']) + if secret: + if secret == user.password: + f = open('user.txt', 'w', encoding='utf-8') + f.truncate() + f.write(user.get_username()) + f.close() + self.page.destroy() + MainPage(self.root) + # DataEntryForm(self.root) + else: + showinfo(title='提示', message='账号或密码错误!') + else: + showinfo(title='提示', message='请输入密码!') + else: + showinfo(title="提示", message="用户不存在!") + ms.close() + + else: + showinfo(title='提示', message='请输入用户名!') diff --git "a/6\343\200\201Python\345\256\236\347\216\260\347\226\253\346\203\205\345\214\273\347\226\227\344\277\241\346\201\257\347\256\241\347\220\206\347\263\273\347\273\237(\351\231\204\346\272\220\347\240\201)/EIMS-main/view/mainpage.py" "b/6\343\200\201Python\345\256\236\347\216\260\347\226\253\346\203\205\345\214\273\347\226\227\344\277\241\346\201\257\347\256\241\347\220\206\347\263\273\347\273\237(\351\231\204\346\272\220\347\240\201)/EIMS-main/view/mainpage.py" new file mode 100644 index 0000000..85fdb41 --- /dev/null +++ "b/6\343\200\201Python\345\256\236\347\216\260\347\226\253\346\203\205\345\214\273\347\226\227\344\277\241\346\201\257\347\256\241\347\220\206\347\263\273\347\273\237(\351\231\204\346\272\220\347\240\201)/EIMS-main/view/mainpage.py" @@ -0,0 +1,58 @@ +# -*- coding: utf-8 -*- +""" +@Time: 2022/4/28 9:24 +@Author: http://t.cn/A65MiFvH +@Version: 0.0.0 +@Description: +@WeChat Account: http://t.cn/A65MiFvH +""" +# -*- coding: utf-8 -*- +import tkinter +from tkinter import * +from ttkbootstrap.constants import * +import ttkbootstrap as ttk +from view.view import * # 菜单栏对应的各个子页面 +import view.login as login + + +class MainPage(object): + def __init__(self, master=None): + self.root = master # 定义内部变量root + self.root.geometry("1200x600") + f = open('user.txt', 'r', encoding='utf-8') + self.tablename = f.read() + f.close() + self.root.title('疫情医疗信息管理系统 ' + '欢迎您:' + self.tablename) + # self.root.resizable(0, 0) + self.createPage() + + def createPage(self): + self.AddPatient = AddPatientFrame(self.root) # 创建不同Frame + self.Search = SearchFrame(self.root) + # self.Editinfo = EditFrame(self.root) + # self.Delete = DeleteFrame(self.root) + self.Search.grid() # 默认显示查询界面 + menubar = Menu(self.root) + menubar.add_command(label='添加病例', command=self.add, font='SimSun -14') + menubar.add_command(label='查询病例', command=self.search, font='SimSun -14') + # menubar.add_command(label='更新', command=self.edit, font='SimSun -14') + # menubar.add_command(label='删除', command=self.delete, font='SimSun -14') + # menubar.add_command(label='备份与恢复', command=self.copy, font='SimSun -14') + menubar.add_command(label='切换账户', command=self.change, font='SimSun -14') + self.root['menu'] = menubar # 设置菜单栏 + + def add(self): + self.AddPatient.grid() + self.Search.grid_forget() + + def search(self): + self.AddPatient.grid_forget() + self.Search.grid() + + def change(self): + if askokcancel('提示', '确定要切换账户?'): + self.root.destroy() + root = tkinter.Tk() + root.title("疫情医疗信息管理系统") + login.LoginPage(root) + root.mainloop() diff --git "a/6\343\200\201Python\345\256\236\347\216\260\347\226\253\346\203\205\345\214\273\347\226\227\344\277\241\346\201\257\347\256\241\347\220\206\347\263\273\347\273\237(\351\231\204\346\272\220\347\240\201)/EIMS-main/view/view.py" "b/6\343\200\201Python\345\256\236\347\216\260\347\226\253\346\203\205\345\214\273\347\226\227\344\277\241\346\201\257\347\256\241\347\220\206\347\263\273\347\273\237(\351\231\204\346\272\220\347\240\201)/EIMS-main/view/view.py" new file mode 100644 index 0000000..edc68da --- /dev/null +++ "b/6\343\200\201Python\345\256\236\347\216\260\347\226\253\346\203\205\345\214\273\347\226\227\344\277\241\346\201\257\347\256\241\347\220\206\347\263\273\347\273\237(\351\231\204\346\272\220\347\240\201)/EIMS-main/view/view.py" @@ -0,0 +1,691 @@ +# -*- coding: utf-8 -*- +""" +@Time: 2022/4/28 9:28 +@Author: http://t.cn/A65MiFvH +@Version: 0.0.0 +@Description: +@WeChat Account: http://t.cn/A65MiFvH +""" +# -*- coding: utf-8 -*- +from tkinter import * +from tkinter.messagebox import * +from ttkbootstrap.constants import * +import ttkbootstrap as ttk +from model.ConnDB import * +from view.dataEntryForm import DataEntryForm + + +class AddPatientFrame(Frame): # 继承Frame类 + def __init__(self, master=None): + Frame.__init__(self, master) + self.root = master # 定义内部变量root + self.patient_id = StringVar() + self.patient_name = StringVar() + self.patient_tel = StringVar() + self.patient_birth = StringVar() + self.patient_place = StringVar() + self.is_enter = IntVar() + self.diagnosis = StringVar() + self.level = StringVar() + self.admission_time = StringVar() + self.confirmed_time = StringVar() + self.hospital_id = IntVar() + self.worker_id = IntVar() + self.medical_supplies_id = IntVar() + self.createPage() + + def createPage(self): + ttk.Label(self, text='添加病例信息', font='SimSum -16 bold').grid(row=0, column=0, pady=10) + ttk.Label(self, text='姓 名:', font='SimSun -14').grid(row=1, column=0, pady=10) + ttk.Label(self, text='联系方式:', font='SimSun -14').grid(row=2, column=0, pady=10) + ttk.Label(self, text='出生日期:', font='SimSun -14').grid(row=3, column=0, pady=10) + ttk.Label(self, text='籍 贯:', font='SimSun -14').grid(row=4, column=0, pady=10) + ttk.Label(self, text='是否境外输入:', font='SimSun -14').grid(row=5, column=0, pady=10) + ttk.Label(self, text='诊断结果:', font='SimSun -14').grid(row=6, column=0, pady=10) + ttk.Label(self, text='症状等级:', font='SimSun -14').grid(row=1, column=3, pady=10) + ttk.Label(self, text='就诊时间:', font='SimSun -14').grid(row=2, column=3, pady=10) + ttk.Label(self, text='确诊时间:', font='SimSun -14').grid(row=3, column=3, pady=10) + ttk.Label(self, text='医院代号:', font='SimSun -14').grid(row=4, column=3, pady=10) + ttk.Label(self, text='负责人编号:', font='SimSun -14').grid(row=5, column=3, pady=10) + ttk.Label(self, text='物资编号:', font='SimSun -14').grid(row=6, column=3, pady=10) + ttk.Entry(self, textvariable=self.patient_name).grid(row=1, column=1, columnspan=2, pady=10, sticky=W + E) + ttk.Entry(self, textvariable=self.patient_tel).grid(row=2, column=1, columnspan=2, pady=10, sticky=W + E) + ttk.Entry(self, textvariable=self.patient_birth).grid(row=3, column=1, columnspan=2, pady=10, sticky=W + E) + ttk.Entry(self, textvariable=self.patient_place).grid(row=4, column=1, columnspan=2, pady=10, sticky=W + E) + ttk.Radiobutton(self, text="否", value=0, variable=self.is_enter).grid( + row=5, column=1, padx=5, pady=10) + ttk.Radiobutton(self, text="是", value=1, variable=self.is_enter).grid( + row=5, column=2, padx=5, pady=10) + self.is_enter.set(0) + ttk.Entry(self, textvariable=self.diagnosis).grid(row=6, column=1, pady=10, sticky=W + E) + ttk.Entry(self, textvariable=self.level).grid(row=1, column=4, pady=10, sticky=W + E) + ttk.Entry(self, textvariable=self.admission_time).grid(row=2, column=4, pady=10, sticky=W + E) + ttk.Entry(self, textvariable=self.confirmed_time).grid(row=3, column=4, pady=10, sticky=W + E) + ttk.Entry(self, textvariable=self.hospital_id).grid(row=4, column=4, pady=10, sticky=W + E) + ttk.Entry(self, textvariable=self.worker_id).grid(row=5, column=4, pady=10, sticky=W + E) + ttk.Entry(self, textvariable=self.medical_supplies_id).grid(row=6, column=4, pady=10, sticky=W + E) + ttk.Button(self, text='提交', command=self.datacommit, width=10, bootstyle="Primary").grid(row=7, column=1, + pady=10) + ttk.Button(self, text='清除', command=self.clear, width=10, bootstyle="Danger").grid(row=7, column=3, pady=10) + + def datacommit(self): + global patient_name, patient_tel, patient_birth, diagnosis, patient_place, level, confirmed_time, admission_time, hospital_id, medical_supplies_id, worker_id + ms = ConnDB() + if self.patient_name.get(): + patient_name = self.patient_name.get() + else: + showinfo(title='提示', message='姓名不能为空!') + if self.patient_tel.get(): + patient_tel = self.patient_tel.get() + else: + showinfo(title='提示', message='联系方式不能为空!') + if self.patient_birth.get(): + patient_birth = self.patient_birth.get() + else: + showinfo(title='提示', message='出生日期不能为空!') + if self.patient_place.get(): + patient_place = self.patient_place.get() + else: + showinfo(title='提示', message='籍贯不能为空!') + if self.diagnosis.get(): + diagnosis = self.diagnosis.get() + else: + showinfo(title='提示', message='诊断结果不能为空!') + if self.level.get(): + level = self.level.get() + else: + showinfo(title='提示', message='症状等级不能为空!') + if self.admission_time.get(): + admission_time = self.admission_time.get() + else: + showinfo(title='提示', message='就诊时间不能为空!') + if self.confirmed_time.get(): + confirmed_time = self.confirmed_time.get() + else: + showinfo(title='提示', message='确诊时间不能为空!') + if self.hospital_id.get(): + hospital_id = self.hospital_id.get() + else: + showinfo(title='提示', message='医院代号不能为空!') + if self.worker_id.get(): + worker_id = self.worker_id.get() + else: + showinfo(title='提示', message='负责人编号不能为空!') + if self.medical_supplies_id.get(): + medical_supplies_id = self.medical_supplies_id.get() + else: + showinfo(title='提示', message='医疗用品编号不能为空!') + number = len(ms.ExecQuery("select patient_id from patient")) + sql = "insert into patient values({},N'{}',{},N'{}',N'{}',{},N'{}',N'{}',N'{}',N'{}',{},{},{},{},0)".format( + number + 1, patient_name, + patient_tel, patient_birth, + patient_place, self.is_enter.get(), + diagnosis, + level, + admission_time, + confirmed_time, 0, + hospital_id, + worker_id, + medical_supplies_id) + try: + # print(sql) + ms.ExecNonQuery(sql, ()) + showinfo(title='提示', message='添加成功!') + self.clear() + + except Exception as e: + showinfo(title='提示', message='出错了!请重试!') + print(str(e)) + ms.close() + + def clear(self): + self.patient_name.set('') + self.patient_tel.set('') + self.patient_birth.set('') + self.patient_place.set('') + self.is_enter.set(0) + self.diagnosis.set('') + self.level.set('') + self.admission_time.set('') + self.confirmed_time.set('') + self.hospital_id.set(1) + self.worker_id.set(1) + self.medical_supplies_id.set(1) + + +class SearchFrame(Frame): # 继承Frame类 + def __init__(self, master=None): + Frame.__init__(self, master) + self.root = master # 定义内部变量root + self.number = StringVar() + self.userName = StringVar() + self.sex = StringVar() + self.age = StringVar() + self.birth = StringVar() + self.tel = StringVar() + self.email = StringVar() + self.address = StringVar() + self.major = StringVar() + self.r = IntVar() + self.index = StringVar() + self.way = StringVar() + self.createPage() + + def createPage(self): + Label(self, text='查询病例信息', font='SimSum -16 bold').grid(row=0, column=0, pady=10) + Button(self, text="显示全部病例", command=self.displayall, font='SimSun -14').grid(row=1, column=4, padx=5, pady=10, + sticky=W + E + N + S) + Label(self, text='查询方式:', font='SimSun -14').grid(row=1, column=0, padx=5, pady=10, sticky=W) + combobox = ttk.Combobox(self, textvariable=self.way, font='SimSun -14') + combobox.grid(row=1, column=1, padx=5, pady=10, sticky=W + E + N + S) + # 设置下拉菜单中的值 + combobox['value'] = ("编号", "姓名") + combobox['state'] = "readonly" # 设定下拉框状态,readonly表示只读,不可更改内容 + combobox.current(0) + Entry(self, text=self.index).grid(row=1, column=2, padx=5, pady=10, sticky=W + E + N + S) + Button(self, text='查询', command=lambda: self.search(self.way.get(), self.index.get()), font='SimSun -14') \ + .grid(row=1, column=3, padx=5, pady=10, sticky=W + E + N + S) + Label(self, text='上一次查询记录:', font='SimSun -14').grid(row=4, column=0, padx=5, pady=10, sticky=N) + + def displayall(self): + ms = ConnDB(as_dict=False) + sql = "select patient_id,patient_name,patient_place,patient_tel,is_enter,diagnosis,hospital_name,worker_name " \ + "from patient left join hospital on patient.hospital_id = hospital.hospital_id LEFT JOIN worker ON " \ + "patient.worker_id=worker.worker_id LEFT JOIN medical_supplies on patient.medical_supplies_id = " \ + "medical_supplies.medical_supplies_id where is_deleted=0 " + result = ms.ExecQuery(sql, ()) + ms.close() + # 定义列 + columns = ("编号", "姓名", "籍贯", "联系方式", "是否境外输入", "诊断结果", "医院", "负责人") + tree = ttk.Treeview(self, show='headings', columns=columns) + tree.grid(row=4, column=1, columnspan=1000, sticky=W + E + N + S) + # 设置列,不显示 + tree.column("编号", width=80, anchor="center") + tree.column("姓名", width=80, anchor="center") + tree.column("籍贯", width=80, anchor="center") + tree.column("联系方式", width=100, anchor="center") + tree.column("是否境外输入", width=100, anchor="center") + tree.column("诊断结果", width=80, anchor="center") + tree.column("医院", width=200, anchor="center") + tree.column("负责人", width=80, anchor="center") + # 显示表头 + tree.heading("编号", text="编号") + tree.heading("姓名", text="姓名") + tree.heading("籍贯", text="籍贯") + tree.heading("联系方式", text="联系方式") + tree.heading("是否境外输入", text="是否境外输入") + tree.heading("诊断结果", text="诊断结果") + tree.heading("医院", text="医院") + tree.heading("负责人", text="负责人") + # 添加数据 + i = 0 + for data in result: + # for j in range(0, len(data)): + # if type(result[i][j]) == int: + # continue + # # print(chardet.detect(data[j])) + # data[j].encode('utf-8') + tree.insert("", i, text=str(i), values=data) + i += 1 + + def all(event): + item = tree.selection() # 'I001'、'I002' + if item: + txt = tree.item(item[0], 'values') + ms = ConnDB(as_dict=False) + sql = "select * from patient where patient_id={} and is_deleted=0".format(int(txt[0])) + result = ms.ExecQuery(sql, ())[0] + ms.close() + f = open('info.txt', 'w', encoding='utf-8') + f.truncate() + for item in result: + f.writelines(str(item)+'@') + f.close() + top = Toplevel() + DataEntryForm(top) + + def deleteItem(event): + + item = tree.selection() # 'I001'、'I002' + if item: + txt = tree.item(item[0], 'values') + if askyesno('确认操作', '确定删除该条记录?'): + ms = ConnDB(as_dict=False) + sql = "update patient set is_deleted=1 where patient_id={}".format(int(txt[0])) + ms.ExecNonQuery(sql, ()) + ms.close() + showinfo("提示", "删除成功!") + tree.bind('', all) + tree.bind('<3>', deleteItem) + + def search(self, way, index): + ms = ConnDB(as_dict=False) + if way == '编号': + + sql = "select patient_id,patient_name,patient_place,patient_tel,is_enter,diagnosis,hospital_name," \ + "worker_name " \ + "from patient left join hospital on patient.hospital_id = hospital.hospital_id LEFT JOIN worker ON " \ + "patient.worker_id=worker.worker_id LEFT JOIN medical_supplies on patient.medical_supplies_id = " \ + "medical_supplies.medical_supplies_id where patient_id=%s " + if index.isdigit(): + result = ms.ExecQuery(sql, (index,)) + ms.close() + if len(result): + # 定义列 + columns = ("编号", "姓名", "籍贯", "联系方式", "是否境外输入", "诊断结果", "医院", "负责人") + tree = ttk.Treeview(self, show='headings', columns=columns) + tree.grid(row=4, column=1, columnspan=10) + # 设置列,不显示 + tree.column("编号", width=80, anchor="center") + tree.column("姓名", width=80, anchor="center") + tree.column("籍贯", width=80, anchor="center") + tree.column("联系方式", width=100, anchor="center") + tree.column("是否境外输入", width=100, anchor="center") + tree.column("诊断结果", width=80, anchor="center") + tree.column("医院", width=200, anchor="center") + tree.column("负责人", width=80, anchor="center") + # 显示表头 + tree.heading("编号", text="编号") + tree.heading("姓名", text="姓名") + tree.heading("籍贯", text="籍贯") + tree.heading("联系方式", text="联系方式") + tree.heading("是否境外输入", text="是否境外输入") + tree.heading("诊断结果", text="诊断结果") + tree.heading("医院", text="医院") + tree.heading("负责人", text="负责人") + # 添加数据 + for i in range(0, len(result)): + # for j in range(0, len(result[i])): + # if type(result[i][j]) == int: + # continue + # # print(chardet.detect(result[i][j])) + # result[i][j].encode('utf-8') + tree.insert("", i, text=str(i), values=result[i]) + + else: + showinfo('提示', '该编号的病例不存在!') + else: + showinfo(title='提示', message='请输入正确编号!') + elif way == '姓名': + sql = "select patient_id,patient_name,patient_place,patient_tel,is_enter,diagnosis,hospital_name," \ + "worker_name " \ + "from patient left join hospital on patient.hospital_id = hospital.hospital_id LEFT JOIN worker ON " \ + "patient.worker_id=worker.worker_id LEFT JOIN medical_supplies on patient.medical_supplies_id = " \ + "medical_supplies.medical_supplies_id where patient_name=N'%s' " % index + result = ms.ExecQuery(sql, ()) + ms.close() + if len(result): + # 定义列 + columns = ("编号", "姓名", "籍贯", "联系方式", "是否境外输入", "诊断结果", "医院", "负责人") + tree = ttk.Treeview(self, show='headings', columns=columns) + tree.grid(row=4, column=1, columnspan=10) + # 设置列,不显示 + tree.column("编号", width=80, anchor="center") + tree.column("姓名", width=80, anchor="center") + tree.column("籍贯", width=80, anchor="center") + tree.column("联系方式", width=100, anchor="center") + tree.column("是否境外输入", width=100, anchor="center") + tree.column("诊断结果", width=80, anchor="center") + tree.column("医院", width=200, anchor="center") + tree.column("负责人", width=80, anchor="center") + # 显示表头 + tree.heading("编号", text="编号") + tree.heading("姓名", text="姓名") + tree.heading("籍贯", text="籍贯") + tree.heading("联系方式", text="联系方式") + tree.heading("是否境外输入", text="是否境外输入") + tree.heading("诊断结果", text="诊断结果") + tree.heading("医院", text="医院") + tree.heading("负责人", text="负责人") + # 添加数据 + for i in range(0, len(result)): + # for j in range(0, len(result[i])): + # if type(result[i][j]) == int: + # continue + # # print(chardet.detect(result[i][j])) + # result[i][j].encode('utf-8') + tree.insert("", i, text=str(i), values=result[i]) + else: + showinfo('提示', '该姓名的病例不存在!') + +# class EditFrame(Frame): # 继承Frame类 +# def __init__(self, master=None): +# Frame.__init__(self, master) +# self.root = master # 定义内部变量root +# self.number = StringVar() +# self.userName = StringVar() +# self.sex = StringVar() +# self.age = StringVar() +# self.birth = StringVar() +# self.tel = StringVar() +# self.email = StringVar() +# self.address = StringVar() +# self.major = StringVar() +# self.r = IntVar() +# self.index = StringVar() +# self.way = StringVar() +# self.oldusername = StringVar() +# self.oldsex = StringVar() +# self.oldage = StringVar() +# self.oldbirth = StringVar() +# self.oldtel = StringVar() +# self.oldemail = StringVar() +# self.oldaddress = StringVar() +# self.oldmajor = StringVar() +# self.createPage() +# +# def createPage(self): +# Label(self, text='更新病例信息', font='SimSun -16 bold').grid(row=0, column=0, pady=10) +# Label(self, text='编号').grid(row=1, column=0, padx=5, pady=10) +# Entry(self, textvariable=self.number).grid(row=1, column=1, padx=5, pady=10) +# Button(self, text='查询', command=lambda: self.search(self.number.get()), font='SimSun -14', width=10).grid(row=1, +# column=2, +# padx=5, +# pady=10) +# Label(self, text='姓 名:', font='SimSun -14').grid(row=2, column=0, pady=10) +# Label(self, text='性 别:', font='SimSun -14').grid(row=3, column=0, pady=10) +# Label(self, text='年 龄:', font='SimSun -14').grid(row=4, column=0, pady=10) +# Label(self, text='出生日期:', font='SimSun -14').grid(row=5, column=0, pady=10) +# Label(self, text='联系方式:', font='SimSun -14').grid(row=2, column=2, pady=10) +# Label(self, text='邮 箱:', font='SimSun -14').grid(row=3, column=2, pady=10) +# Label(self, text='地 址:', font='SimSun -14').grid(row=4, column=2, pady=10) +# Label(self, text='专 业:', font='SimSun -14').grid(row=5, column=2, pady=10) +# Entry(self, textvariable=self.userName).grid(row=2, column=1, pady=10) +# Entry(self, textvariable=self.sex).grid(row=3, column=1, pady=10) +# Entry(self, textvariable=self.age).grid(row=4, column=1, pady=10) +# Entry(self, textvariable=self.birth).grid(row=5, column=1, pady=10) +# Entry(self, textvariable=self.tel).grid(row=2, column=3, pady=10) +# Entry(self, textvariable=self.email).grid(row=3, column=3, pady=10) +# Entry(self, textvariable=self.address).grid(row=4, column=3, pady=10) +# Entry(self, textvariable=self.major).grid(row=5, column=3, pady=10) +# Button(self, text='更新', command=lambda: self.updateinfo(self.number.get()), font='SimSun -14', width=10).grid( +# row=6, column=1, pady=10) +# Button(self, text='撤销', command=lambda: self.repeal(self.number.get()), font='SimSun -14', width=10).grid(row=6, +# column=2, +# pady=10) +# +# def search(self, number): +# if number: +# db = MySQLdb.connect(host='localhost', user='root', password='woyangni0109', db='new_schema', +# charset='utf8') +# cur = db.cursor() +# numberexists = 0 +# sql = "select number from {}" +# sql = sql.format(self.tablename) +# cur.execute(sql) +# numberdata = cur.fetchall() +# for i in range(0, len(numberdata)): +# if numberdata[i][0] == number: +# numberexists = 1 +# break +# else: +# i += 1 +# if numberexists: +# sql = "select * from {} where number = '{}'" +# sql = sql.format(self.tablename, number) +# cur.execute(sql) +# contactsdata = cur.fetchall() +# db.close() +# self.oldusername = contactsdata[0][1] +# self.oldsex = contactsdata[0][2] +# self.oldage = contactsdata[0][3] +# self.oldbirth = contactsdata[0][4] +# self.oldtel = contactsdata[0][5] +# self.oldemail = contactsdata[0][6] +# self.oldaddress = contactsdata[0][7] +# self.oldmajor = contactsdata[0][8] +# +# self.userName.set(contactsdata[0][1]) +# self.sex.set(contactsdata[0][2]) +# self.age.set(contactsdata[0][3]) +# self.birth.set(contactsdata[0][4]) +# self.tel.set(contactsdata[0][5]) +# self.email.set(contactsdata[0][6]) +# self.address.set(contactsdata[0][7]) +# self.major.set(contactsdata[0][8]) +# else: +# showinfo('提示', '该学号的学生不存在!') +# self.number.set('') +# else: +# showinfo('提示', '学号不能为空!') +# +# def updateinfo(self, number): +# newusername = self.userName.get() +# newsex = self.sex.get() +# newage = self.age.get() +# newbirth = self.birth.get() +# newtel = self.tel.get() +# newemail = self.email.get() +# newaddress = self.address.get() +# newmajor = self.major.get() +# # 提交到数据库 +# db = MySQLdb.connect(host='localhost', user='root', password='woyangni0109', db='new_schema', charset='utf8') +# cur = db.cursor() +# sql = "update {} set userName = '{}',sex = '{}'," \ +# "age = '{}',birth = '{}',tel='{}',email = '{}',address = '{}',major = '{}' where number = '{}'" +# sql = sql.format(self.tablename, newusername, newsex, newage, newbirth, newtel, newemail, newaddress, newmajor, +# number) +# try: +# cur.execute(sql) +# db.commit() +# db.close() +# showinfo('提示', '数据更新成功!') +# except: +# showinfo('提示', '数据更新失败!') +# +# def repeal(self, number): +# db = MySQLdb.connect(host='localhost', user='root', password='woyangni0109', db='new_schema', charset='utf8') +# cur = db.cursor() +# sql = "update {} set userName = '{}',sex = '{}'," \ +# "age = '{}',birth = '{}',tel='{}',email = '{}',address = '{}',major = '{}' where number = '{}'" +# sql = sql.format(self.tablename, self.oldusername, self.oldsex, self.oldage, self.oldbirth, +# self.oldtel, self.oldemail, self.oldaddress, self.oldmajor, number) +# try: +# cur.execute(sql) +# db.commit() +# db.close() +# showinfo('提示', '撤销成功!') +# except: +# showinfo('提示', '撤销失败!') +# +# +# class DeleteFrame(Frame): # 继承Frame类 +# def __init__(self, master=None): +# Frame.__init__(self, master) +# self.root = master # 定义内部变量root +# self.number = StringVar() +# self.userName = StringVar() +# self.sex = StringVar() +# self.age = StringVar() +# self.birth = StringVar() +# self.tel = StringVar() +# self.email = StringVar() +# self.address = StringVar() +# self.major = StringVar() +# self.r = IntVar() +# self.index = StringVar() +# self.way = StringVar() +# f = open('user.txt', 'r', encoding='utf-8') +# self.tablename = f.read() +# f.close() +# self.oldusername = StringVar() +# self.oldsex = StringVar() +# self.oldage = StringVar() +# self.oldbirth = StringVar() +# self.oldtel = StringVar() +# self.oldemail = StringVar() +# self.oldaddress = StringVar() +# self.oldmajor = StringVar() +# self.createPage() +# +# def createPage(self): +# Label(self, text='删除学生信息', font='SimSun -16 bold').grid(row=0, column=0, pady=10) +# Label(self, text='学号').grid(row=1, column=0, padx=5, pady=10) +# Entry(self, textvariable=self.number).grid(row=1, column=1, padx=5, pady=10) +# Button(self, text='查询', command=lambda: self.search(self.number.get()), font='SimSun -14', width=10).grid(row=1, +# column=2, +# padx=5, +# pady=10) +# Label(self, text='姓 名:', font='SimSun -14').grid(row=2, column=0, pady=10) +# Label(self, text='性 别:', font='SimSun -14').grid(row=3, column=0, pady=10) +# Label(self, text='年 龄:', font='SimSun -14').grid(row=4, column=0, pady=10) +# Label(self, text='出生日期:', font='SimSun -14').grid(row=5, column=0, pady=10) +# Label(self, text='联系方式:', font='SimSun -14').grid(row=2, column=2, pady=10) +# Label(self, text='邮 箱:', font='SimSun -14').grid(row=3, column=2, pady=10) +# Label(self, text='地 址:', font='SimSun -14').grid(row=4, column=2, pady=10) +# Label(self, text='专 业:', font='SimSun -14').grid(row=5, column=2, pady=10) +# Entry(self, textvariable=self.userName).grid(row=2, column=1, pady=10) +# Entry(self, textvariable=self.sex).grid(row=3, column=1, pady=10) +# Entry(self, textvariable=self.age).grid(row=4, column=1, pady=10) +# Entry(self, textvariable=self.birth).grid(row=5, column=1, pady=10) +# Entry(self, textvariable=self.tel).grid(row=2, column=3, pady=10) +# Entry(self, textvariable=self.email).grid(row=3, column=3, pady=10) +# Entry(self, textvariable=self.address).grid(row=4, column=3, pady=10) +# Entry(self, textvariable=self.major).grid(row=5, column=3, pady=10) +# Button(self, text='删除', command=lambda: self.delete(self.number.get()), font='SimSun -14', width=10).grid(row=6, +# column=1, +# pady=10) +# Button(self, text='撤销', command=lambda: self.repeal(self.number.get()), font='SimSun -14', width=10).grid(row=6, +# column=2, +# pady=10) +# +# def search(self, number): +# if number: +# db = MySQLdb.connect(host='localhost', user='root', password='woyangni0109', db='new_schema', +# charset='utf8') +# cur = db.cursor() +# numberexists = 0 +# sql = "select number from {}" +# sql = sql.format(self.tablename) +# cur.execute(sql) +# numberdata = cur.fetchall() +# for i in range(0, len(numberdata)): +# if numberdata[i][0] == number: +# numberexists = 1 +# break +# else: +# i += 1 +# if numberexists: +# sql = "select * from {} where number = '{}'" +# sql = sql.format(self.tablename, number) +# cur.execute(sql) +# contactsdata = cur.fetchall() +# db.close() +# self.oldusername = contactsdata[0][1] +# self.oldsex = contactsdata[0][2] +# self.oldage = contactsdata[0][3] +# self.oldbirth = contactsdata[0][4] +# self.oldtel = contactsdata[0][5] +# self.oldemail = contactsdata[0][6] +# self.oldaddress = contactsdata[0][7] +# self.oldmajor = contactsdata[0][8] +# +# self.userName.set(contactsdata[0][1]) +# self.sex.set(contactsdata[0][2]) +# self.age.set(contactsdata[0][3]) +# self.birth.set(contactsdata[0][4]) +# self.tel.set(contactsdata[0][5]) +# self.email.set(contactsdata[0][6]) +# self.address.set(contactsdata[0][7]) +# self.major.set(contactsdata[0][8]) +# else: +# showinfo('提示', '该学号的学生不存在!') +# self.number.set('') +# else: +# showinfo('提示', '学号不能为空!') +# +# def delete(self, number): +# db = MySQLdb.connect(host='localhost', user='root', password='woyangni0109', db='new_schema', charset='utf8') +# cur = db.cursor() +# sql = "delete from {} where number = '{}'" +# sql = sql.format(self.tablename, number) +# try: +# cur.execute(sql) +# db.commit() +# db.close() +# showinfo('提示', '删除成功!') +# self.number.set('') +# self.userName.set('') +# self.sex.set('') +# self.age.set('') +# self.birth.set('') +# self.tel.set('') +# self.email.set('') +# self.address.set('') +# self.major.set('') +# except: +# showinfo('提示', '删除失败!') +# +# def repeal(self, number): +# db = MySQLdb.connect(host='localhost', user='root', password='woyangni0109', db='new_schema', charset='utf8') +# cur = db.cursor() +# sql = "update {} set userName = '{}',sex = '{}'," \ +# "age = '{}',birth = '{}',tel='{}',email = '{}',address = '{}',major = '{}' where number = '{}'" +# sql = sql.format(self.tablename, self.oldusername, self.oldsex, self.oldage, self.oldbirth, +# self.oldtel, self.oldemail, self.oldaddress, self.oldmajor, number) +# try: +# cur.execute(sql) +# db.commit() +# db.close() +# showinfo('提示', '撤销成功!') +# except: +# showinfo('提示', '撤销失败!') + + +# class CopyFrame(Frame): # 继承Frame类 +# def __init__(self, master=None): +# Frame.__init__(self, master) +# self.root = master # 定义内部变量root +# f = open('user.txt', 'r', encoding='utf-8') +# self.tablename = f.read() +# f.close() +# self.createPage() +# +# def createPage(self): +# Label(self, text='数据备份与恢复', font='SimSun -16 bold').grid(row=0, column=0, padx=5, pady=10, sticky=W) +# Button(self, text='备份数据', command=self.backups, font='SimSun -14').grid( +# row=1, column=0, padx=5, pady=10, sticky=W) +# Button(self, text='恢复数据', command=self.renew, font='SimSun -14').grid( +# row=1, column=1, padx=5, pady=10, sticky=W) +# +# def backups(self): +# # 追加mysql的bin目录到环境变量 +# # sys.path.append('C:\Users\HP\AppData\Bin') +# # 如果不存在backup文件,新建一个 +# if not os.path.exists('backup'): +# os.mkdir('backup') +# # 切换到新建的文件夹中 +# os.chdir('backup') +# # def tuplesql(command,server,user,passwd,db,table,filename): +# # return (mysqlcomm,dbserver,dbuser,dbpasswd,dbname,dbtable,exportfile) +# # 定义一系列参数 +# mysqlcomm = 'mysqldump' +# dbserver = 'locolhost' +# dbuser = 'root' +# dbpasswd = 'woyangni0109' +# dbname = 'new_schema' +# dbtable = str(self.tablename) +# exportfile = 'backups.sql' +# # 定义sql的格式 +# sqlfromat = "%s -h%s -u%s -p%s %s %s >%s" +# # 生成相应的sql语句 +# sql = (sqlfromat % (mysqlcomm, dbserver, dbuser, dbpasswd, dbname, dbtable, exportfile)) +# +# # 判断是否已经有相应的sql文件生成;如果有,就按时间重命名该文件 +# if os.path.exists(r'backups.sql'): +# os.rename('backups.sql', 'backups' + str(time.time()) + '.sql') +# # 执行sql并获取语句,os.system和subprocess.Popen执行该sql无效果,不知道是怎么回事,后续会继续关注 +# result = os.popen(sql) +# # 对sql执行进行判断 +# if result: +# showinfo(title='提示', message='数据备份成功!') +# else: +# showinfo(title='提示', message='数据备份失败!') +# +# def renew(self): +# # 简单的恢复关键代码其实就下面这一行mysqldump换为mysql 用户名 密码 你要恢复到的数据库名 < sql文件 +# try: +# os.system("mysql -uroot -pwoyangni0109 new_schema < /backup/backups.sql") +# showinfo(title='提示', message='数据恢复成功!') +# except Exception as e: +# showinfo(title='提示', message='数据恢复失败!\n' + str(e)) diff --git a/std-lib/str.py "b/7\343\200\201\347\224\250 Python \345\206\231\344\272\206\344\270\200\344\270\252\347\224\265\345\255\220\350\200\203\345\213\244\347\263\273\347\273\237\357\274\201/__init__.py" similarity index 100% rename from std-lib/str.py rename to "7\343\200\201\347\224\250 Python \345\206\231\344\272\206\344\270\200\344\270\252\347\224\265\345\255\220\350\200\203\345\213\244\347\263\273\347\273\237\357\274\201/__init__.py" diff --git "a/7\343\200\201\347\224\250 Python \345\206\231\344\272\206\344\270\200\344\270\252\347\224\265\345\255\220\350\200\203\345\213\244\347\263\273\347\273\237\357\274\201/code/__init__.py" "b/7\343\200\201\347\224\250 Python \345\206\231\344\272\206\344\270\200\344\270\252\347\224\265\345\255\220\350\200\203\345\213\244\347\263\273\347\273\237\357\274\201/code/__init__.py" new file mode 100644 index 0000000..3a96d5b --- /dev/null +++ "b/7\343\200\201\347\224\250 Python \345\206\231\344\272\206\344\270\200\344\270\252\347\224\265\345\255\220\350\200\203\345\213\244\347\263\273\347\273\237\357\274\201/code/__init__.py" @@ -0,0 +1,7 @@ +print('=' * 30) +print('【python-office库】,功能持续更新中') +print('使用有问题 or 提交你的功能需求 or 参与项目开发') +print('1、全部功能【视频 & 文字】教程:https://www.python-office.com/') +print('2、请+【项目交流群】:http://t.cn/A6SSrID0') +print('3、本开源项目的【代码仓库】:https://github.com/CoderWanFeng/python-office') +print('=' * 30) diff --git "a/7\343\200\201\347\224\250 Python \345\206\231\344\272\206\344\270\200\344\270\252\347\224\265\345\255\220\350\200\203\345\213\244\347\263\273\347\273\237\357\274\201/code/stu_attendance.py" "b/7\343\200\201\347\224\250 Python \345\206\231\344\272\206\344\270\200\344\270\252\347\224\265\345\255\220\350\200\203\345\213\244\347\263\273\347\273\237\357\274\201/code/stu_attendance.py" new file mode 100644 index 0000000..e8d6e62 --- /dev/null +++ "b/7\343\200\201\347\224\250 Python \345\206\231\344\272\206\344\270\200\344\270\252\347\224\265\345\255\220\350\200\203\345\213\244\347\263\273\347\273\237\357\274\201/code/stu_attendance.py" @@ -0,0 +1,94 @@ +import csv +import time +student_infos = [] + +def load_stu_info(): + """ + 加载学生信息 + 从stu_infos.csv文件中加载数据 + :return: 无 + """ + with open(r"stu_infos.csv", encoding='utf-8-sig') as file: + f_csv = csv.reader(file) + header = next(f_csv) + for row in f_csv: + student_info = {} + for index in range(3): + student_info[header[index]] = row[index] + student_infos.append(student_info) + + +def login(): + """ + 用户使用学号和密码进行登录 + 最多让用户登录三次,如果连续三次都登录失败(用户名或者密码错误),只要密码和用户都正确表示登录成功 + :return:登录成功返回True和学号,三次都登录失败返回False和None + """ + retry_time = 0 + while retry_time < 3: + user_no = input('请输入登录账号:') + password = input('请输入密码:') + for i in student_infos: + if i['no']==user_no and i['password']==password: + return True,user_no + print('用户名或者密码错误!!!请重新输入。') + retry_time += 1 + else: + return False, None + +def add(user_no): + for x in student_infos: + if user_no==x['no']: + name=x['name'] + break + times=time.strftime("%Y-%m-%d %H:%M:%S", time.localtime()) + choices=['出勤','迟到','请假','缺勤'] + a=int(input("\t该学生出勤情况:1-出勤\t2-迟到\t3-请假\t4-缺勤:")) + if a==1: + data=choices[0] + elif a==2: + data=choices[1] + elif a==3: + data=choices[2] + else: + data=choices[3] + with open(r"attendance.csv",'a+',newline='', encoding='utf-8') as f: + wf = csv.writer(f) + wf.writerow([user_no,name,times,data])#写入一行数据 + print("{}同学{}数据已经写入成功!操作时间是{}".format(name,data,times)) + + +def select(): + student = [] + with open(r"attendance.csv", encoding='utf-8-sig') as file: + f_csv = csv.reader(file) + header = next(f_csv) + for row in f_csv: + students = {} + for index in range(4): + students[header[index]] = row[index] + student.append(students) + name=input("请输入你需要查找的姓名:") + print(" 学号\t\t姓名\t\t操作时间\t\t出勤状态") + for a in student: + if a['name']==name: + print(a['no']+'\t'+a['name']+'\t'+a['time']+'\t\t'+a['state']) + else: + print("无此人!!!") + break + + +if __name__ == '__main__': + load_stu_info() + success, stu_no = login() + print(stu_no) + if success: + print('登录成功!') + add(stu_no) + q = int(input("你想要查询出勤数据吗?\tyes(1)--no(0)")) + if q == 1: + select() + else: + print("欢迎下次登录电子考勤系统") + else: + print('登录失败') diff --git "a/7\343\200\201\347\224\250 Python \345\206\231\344\272\206\344\270\200\344\270\252\347\224\265\345\255\220\350\200\203\345\213\244\347\263\273\347\273\237\357\274\201/code/stu_infos.csv" "b/7\343\200\201\347\224\250 Python \345\206\231\344\272\206\344\270\200\344\270\252\347\224\265\345\255\220\350\200\203\345\213\244\347\263\273\347\273\237\357\274\201/code/stu_infos.csv" new file mode 100644 index 0000000..3727365 --- /dev/null +++ "b/7\343\200\201\347\224\250 Python \345\206\231\344\272\206\344\270\200\344\270\252\347\224\265\345\255\220\350\200\203\345\213\244\347\263\273\347\273\237\357\274\201/code/stu_infos.csv" @@ -0,0 +1,2 @@ +no,name,time,state +2019443001,程序员晚枫,2022-10-15 16:03:01,出勤 \ No newline at end of file diff --git "a/8\343\200\201\346\226\207\347\214\256\346\225\260\346\215\256\346\214\226\346\216\230\347\263\273\347\273\237(\351\231\204\346\272\220\347\240\201)/DataMingingPaper/__init__.py" "b/8\343\200\201\346\226\207\347\214\256\346\225\260\346\215\256\346\214\226\346\216\230\347\263\273\347\273\237(\351\231\204\346\272\220\347\240\201)/DataMingingPaper/__init__.py" new file mode 100644 index 0000000..c45523b --- /dev/null +++ "b/8\343\200\201\346\226\207\347\214\256\346\225\260\346\215\256\346\214\226\346\216\230\347\263\273\347\273\237(\351\231\204\346\272\220\347\240\201)/DataMingingPaper/__init__.py" @@ -0,0 +1,2 @@ +import pymysql +pymysql.install_as_MySQLdb() \ No newline at end of file diff --git "a/8\343\200\201\346\226\207\347\214\256\346\225\260\346\215\256\346\214\226\346\216\230\347\263\273\347\273\237(\351\231\204\346\272\220\347\240\201)/DataMingingPaper/settings.py" "b/8\343\200\201\346\226\207\347\214\256\346\225\260\346\215\256\346\214\226\346\216\230\347\263\273\347\273\237(\351\231\204\346\272\220\347\240\201)/DataMingingPaper/settings.py" new file mode 100644 index 0000000..de95881 --- /dev/null +++ "b/8\343\200\201\346\226\207\347\214\256\346\225\260\346\215\256\346\214\226\346\216\230\347\263\273\347\273\237(\351\231\204\346\272\220\347\240\201)/DataMingingPaper/settings.py" @@ -0,0 +1,161 @@ +""" +Django settings for DataMingingPaper project. + +Generated by 'django-admin startproject' using Django 2.1.7. + +For more information on this file, see +https://docs.djangoproject.com/en/2.1/topics/settings/ + +For the full list of settings and their values, see +https://docs.djangoproject.com/en/2.1/ref/settings/ +""" + +import os +import sys +# Build paths inside the project like this: os.path.join(BASE_DIR, ...) +BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__))) +sys.path.insert(0,os.path.join(BASE_DIR, 'apps')) +sys.path.insert(0,os.path.join(BASE_DIR, 'extra_apps')) + +# Quick-start development settings - unsuitable for production +# See https://docs.djangoproject.com/en/2.1/howto/deployment/checklist/ + +# SECURITY WARNING: keep the secret key used in production secret! +SECRET_KEY = '7@kkx=@uiz_!51-pj09n(02po=$dnln90q&^y(@s+svk-c+nw7' + +# SECURITY WARNING: don't run with debug turned on in production! +DEBUG = False + +ALLOWED_HOSTS = ['*'] + +# 设置邮箱和用户名均可登录 +AUTHENTICATION_BACKENDS = ( + 'users.views.CustomBackend', +) + +# Application definition + +INSTALLED_APPS = [ + 'django.contrib.admin', + 'django.contrib.auth', + 'django.contrib.contenttypes', + 'django.contrib.sessions', + 'django.contrib.messages', + 'django.contrib.staticfiles', + 'users', + 'statistic', + 'xadmin', + 'crispy_forms', # 和xadmin协同工作的表单包 + 'extra_apps', + 'captcha', # 图片验证码 + 'pure_pagination', # 实现分页 +] +AUTH_USER_MODEL = 'users.UserProfile' + +PAGINATION_SETTINGS = { + 'PAGE_RANGE_DISPLAYED': 10, # 总共会显示多少个page。(包括省略号,包括两边和中间) + 'MARGIN_PAGES_DISPLAYED': 2, # 旁边会显示多少个page。 + 'SHOW_FIRST_PAGE_WHEN_INVALID': True, # 当输入页数不合法是否要跳到第一页 +} + +MIDDLEWARE = [ + 'django.middleware.security.SecurityMiddleware', + 'django.contrib.sessions.middleware.SessionMiddleware', + 'django.middleware.common.CommonMiddleware', + 'django.middleware.csrf.CsrfViewMiddleware', + 'django.contrib.auth.middleware.AuthenticationMiddleware', + 'django.contrib.messages.middleware.MessageMiddleware', + 'django.middleware.clickjacking.XFrameOptionsMiddleware', +] + +ROOT_URLCONF = 'DataMingingPaper.urls' + +TEMPLATES = [ + { + 'BACKEND': 'django.template.backends.django.DjangoTemplates', + 'DIRS': [os.path.join(BASE_DIR, 'templates')] + , + 'APP_DIRS': True, + 'OPTIONS': { + # 上下文处理器 + 'context_processors': [ + 'django.template.context_processors.debug', + 'django.template.context_processors.request', + 'django.contrib.auth.context_processors.auth', + 'django.contrib.messages.context_processors.messages', + # 添加图片处理器,为了使MEDIA_URL添加到课程机构的列表前面中 + 'django.template.context_processors.media', + ], + }, + }, +] + +WSGI_APPLICATION = 'DataMingingPaper.wsgi.application' + + +# Database +# https://docs.djangoproject.com/en/2.1/ref/settings/#databases + +DATABASES = { + 'default': { + 'ENGINE': 'django.db.backends.mysql', + 'NAME': 'datamingingpaper', + 'USER': 'root', + 'PASSWORD': '', + 'HOST': '10.0.86.245', + } +} + + +# Password validation +# https://docs.djangoproject.com/en/2.1/ref/settings/#auth-password-validators + +AUTH_PASSWORD_VALIDATORS = [ + { + 'NAME': 'django.contrib.auth.password_validation.UserAttributeSimilarityValidator', + }, + { + 'NAME': 'django.contrib.auth.password_validation.MinimumLengthValidator', + }, + { + 'NAME': 'django.contrib.auth.password_validation.CommonPasswordValidator', + }, + { + 'NAME': 'django.contrib.auth.password_validation.NumericPasswordValidator', + }, +] + + +# Internationalization +# https://docs.djangoproject.com/en/2.1/topics/i18n/ + +# 语言-中文 +LANGUAGE_CODE = 'zh-hans' +# 时区-上海 +TIME_ZONE = 'Asia/Shanghai' + +USE_I18N = True + +USE_L10N = True +# 数据库存储使用时间,True时间会被存为UTC的时间 +USE_TZ = False + + +# Static files (CSS, JavaScript, Images) +# https://docs.djangoproject.com/en/2.1/howto/static-files/ + + +# 发送邮件的setting设置 +EMAIL_HOST = 'smtp.163.com' +EMAIL_POST = '25' +EMAIL_HOST_USER = 'test_paper_dm@163.com' +EMAIL_HOST_PASSWORD = 'admin123' # 这里不是邮箱登录密码,而是授权码 +EMAIL_FROM = 'test_paper_dm@163.com' + + +# 设置我们上传文件的路径 +MEDIA_URL = '/media/' +MEDIA_ROOT = os.path.join(BASE_DIR, 'media') + +STATIC_URL = '/static/' +STATIC_ROOT = os.path.join(BASE_DIR, 'static') diff --git "a/8\343\200\201\346\226\207\347\214\256\346\225\260\346\215\256\346\214\226\346\216\230\347\263\273\347\273\237(\351\231\204\346\272\220\347\240\201)/DataMingingPaper/urls.py" "b/8\343\200\201\346\226\207\347\214\256\346\225\260\346\215\256\346\214\226\346\216\230\347\263\273\347\273\237(\351\231\204\346\272\220\347\240\201)/DataMingingPaper/urls.py" new file mode 100644 index 0000000..94c1f21 --- /dev/null +++ "b/8\343\200\201\346\226\207\347\214\256\346\225\260\346\215\256\346\214\226\346\216\230\347\263\273\347\273\237(\351\231\204\346\272\220\347\240\201)/DataMingingPaper/urls.py" @@ -0,0 +1,49 @@ +"""DataMingingPaper URL Configuration + +The `urlpatterns` list routes URLs to views. For more information please see: + https://docs.djangoproject.com/en/2.1/topics/http/urls/ +Examples: +Function views + 1. Add an import: from my_app import views + 2. Add a URL to urlpatterns: path('', views.home, name='home') +Class-based views + 1. Add an import: from other_app.views import Home + 2. Add a URL to urlpatterns: path('', Home.as_view(), name='home') +Including another URLconf + 1. Import the include() function: from django.urls import include, path + 2. Add a URL to urlpatterns: path('blog/', include('blog.urls')) +""" +from django.urls import path, include, re_path +from django.views.generic import TemplateView +from django.views.static import serve +# 导入xadmin,替换admin +import xadmin +from users.views import LoginView, RegisterView, ActiveUserView, ForgetPwdView, ResetView, ModifyPwdView, LogoutView +from DataMingingPaper.settings import MEDIA_ROOT, STATIC_ROOT + + +urlpatterns = [ + path('xadmin/', xadmin.site.urls), + # TemplateView.as_view会将template转换为view + path('', TemplateView.as_view(template_name='homepage.html'), name='homepage'), + path('login/', LoginView.as_view(), name='login'), + path('logout/', LogoutView.as_view(), name='logout'), + path('register/', RegisterView.as_view(), name='register'), + path('captcha/', include('captcha.urls')), + # 这里的'P'是参数(parameter)的意思;'.*'代表全部提取的正则 + re_path('active/(?P.*)/', ActiveUserView.as_view(), name='user_active'), + re_path('reset/(?P.*)/', ResetView.as_view(), name='reset_pwd'), + # 处理图片显示的url,使用Django自带serve,传入参数告诉它去哪个路径找,我们有配置好的路径MEDIAROOT + re_path('media/(?P.*)', serve, {'document_root':MEDIA_ROOT}), + re_path('static/(?P.*)', serve, {'document_root':STATIC_ROOT}), + + + path('forgetPwd/', ForgetPwdView.as_view(), name='forget_pwd'), + path('modifyPwd/', ModifyPwdView.as_view(), name='modify_pwd'), + + # 论文统计app + path('statistic/', include('statistic.urls', namespace='statistic')), + + # 用户信息app + path('user/', include('users.urls', namespace='users')), +] diff --git "a/8\343\200\201\346\226\207\347\214\256\346\225\260\346\215\256\346\214\226\346\216\230\347\263\273\347\273\237(\351\231\204\346\272\220\347\240\201)/DataMingingPaper/wsgi.py" "b/8\343\200\201\346\226\207\347\214\256\346\225\260\346\215\256\346\214\226\346\216\230\347\263\273\347\273\237(\351\231\204\346\272\220\347\240\201)/DataMingingPaper/wsgi.py" new file mode 100644 index 0000000..db7807e --- /dev/null +++ "b/8\343\200\201\346\226\207\347\214\256\346\225\260\346\215\256\346\214\226\346\216\230\347\263\273\347\273\237(\351\231\204\346\272\220\347\240\201)/DataMingingPaper/wsgi.py" @@ -0,0 +1,16 @@ +""" +WSGI config for DataMingingPaper project. + +It exposes the WSGI callable as a module-level variable named ``application``. + +For more information on this file, see +https://docs.djangoproject.com/en/2.1/howto/deployment/wsgi/ +""" + +import os + +from django.core.wsgi import get_wsgi_application + +os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'DataMingingPaper.settings') + +application = get_wsgi_application() diff --git "a/8\343\200\201\346\226\207\347\214\256\346\225\260\346\215\256\346\214\226\346\216\230\347\263\273\347\273\237(\351\231\204\346\272\220\347\240\201)/LICENSE" "b/8\343\200\201\346\226\207\347\214\256\346\225\260\346\215\256\346\214\226\346\216\230\347\263\273\347\273\237(\351\231\204\346\272\220\347\240\201)/LICENSE" new file mode 100644 index 0000000..9f5f988 --- /dev/null +++ "b/8\343\200\201\346\226\207\347\214\256\346\225\260\346\215\256\346\214\226\346\216\230\347\263\273\347\273\237(\351\231\204\346\272\220\347\240\201)/LICENSE" @@ -0,0 +1,21 @@ +MIT License + +Copyright (c) 2019 Spark_Shi + +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. diff --git "a/8\343\200\201\346\226\207\347\214\256\346\225\260\346\215\256\346\214\226\346\216\230\347\263\273\347\273\237(\351\231\204\346\272\220\347\240\201)/apps/__init__.py" "b/8\343\200\201\346\226\207\347\214\256\346\225\260\346\215\256\346\214\226\346\216\230\347\263\273\347\273\237(\351\231\204\346\272\220\347\240\201)/apps/__init__.py" new file mode 100644 index 0000000..e69de29 diff --git "a/8\343\200\201\346\226\207\347\214\256\346\225\260\346\215\256\346\214\226\346\216\230\347\263\273\347\273\237(\351\231\204\346\272\220\347\240\201)/apps/statistic/__init__.py" "b/8\343\200\201\346\226\207\347\214\256\346\225\260\346\215\256\346\214\226\346\216\230\347\263\273\347\273\237(\351\231\204\346\272\220\347\240\201)/apps/statistic/__init__.py" new file mode 100644 index 0000000..e69de29 diff --git "a/8\343\200\201\346\226\207\347\214\256\346\225\260\346\215\256\346\214\226\346\216\230\347\263\273\347\273\237(\351\231\204\346\272\220\347\240\201)/apps/statistic/admin.py" "b/8\343\200\201\346\226\207\347\214\256\346\225\260\346\215\256\346\214\226\346\216\230\347\263\273\347\273\237(\351\231\204\346\272\220\347\240\201)/apps/statistic/admin.py" new file mode 100644 index 0000000..8c38f3f --- /dev/null +++ "b/8\343\200\201\346\226\207\347\214\256\346\225\260\346\215\256\346\214\226\346\216\230\347\263\273\347\273\237(\351\231\204\346\272\220\347\240\201)/apps/statistic/admin.py" @@ -0,0 +1,3 @@ +from django.contrib import admin + +# Register your models here. diff --git "a/8\343\200\201\346\226\207\347\214\256\346\225\260\346\215\256\346\214\226\346\216\230\347\263\273\347\273\237(\351\231\204\346\272\220\347\240\201)/apps/statistic/apps.py" "b/8\343\200\201\346\226\207\347\214\256\346\225\260\346\215\256\346\214\226\346\216\230\347\263\273\347\273\237(\351\231\204\346\272\220\347\240\201)/apps/statistic/apps.py" new file mode 100644 index 0000000..1ef6829 --- /dev/null +++ "b/8\343\200\201\346\226\207\347\214\256\346\225\260\346\215\256\346\214\226\346\216\230\347\263\273\347\273\237(\351\231\204\346\272\220\347\240\201)/apps/statistic/apps.py" @@ -0,0 +1,5 @@ +from django.apps import AppConfig + + +class StatisticConfig(AppConfig): + name = 'statistic' diff --git "a/8\343\200\201\346\226\207\347\214\256\346\225\260\346\215\256\346\214\226\346\216\230\347\263\273\347\273\237(\351\231\204\346\272\220\347\240\201)/apps/statistic/connect_hbase.py" "b/8\343\200\201\346\226\207\347\214\256\346\225\260\346\215\256\346\214\226\346\216\230\347\263\273\347\273\237(\351\231\204\346\272\220\347\240\201)/apps/statistic/connect_hbase.py" new file mode 100644 index 0000000..6d947a4 --- /dev/null +++ "b/8\343\200\201\346\226\207\347\214\256\346\225\260\346\215\256\346\214\226\346\216\230\347\263\273\347\273\237(\351\231\204\346\272\220\347\240\201)/apps/statistic/connect_hbase.py" @@ -0,0 +1,238 @@ +# -*- coding: utf-8 -*- +__author__ = 'shiliang' +__date__ = '2019/3/1 23:48' + +import math + +from thrift.transport import TSocket,TTransport +from thrift.protocol import TBinaryProtocol +from hbase.ttypes import ColumnDescriptor +from hbase import Hbase +from hbase.ttypes import Mutation +from tqdm import tqdm +import xlrd + +def connectHBase(): + ''' + 连接远程HBase + :return: 连接HBase的客户端实例 + ''' + # thrift默认端口是9090 + socket = TSocket.TSocket('10.0.86.245',9090) # 10.0.86.245是master结点ip + socket.setTimeout(5000) + transport = TTransport.TBufferedTransport(socket) + protocol = TBinaryProtocol.TBinaryProtocol(transport) + client = Hbase.Client(protocol) + socket.open() + return client + +def ListTables(client): + ''' + 列出所有表 + ''' + print(client.getTableNames()) + +def createTable(client, tableName, *colFamilys): + ''' + 创建新表 + :param client: 连接HBase的客户端实例 + :param tableName: 表名 + :param *colFamilys: 任意个数的列簇名 + ''' + colFamilyList = [] + # 根据可变参数定义列族 + for colFamily in colFamilys: + col = ColumnDescriptor(name=str(colFamily)) + colFamilyList.append(col) + # 创建表 + client.createTable(tableName,colFamilyList) + print('建表成功!') + +def deleteTable(client, tableName): + ''' + 删除表 + ''' + if client.isTableEnabled(tableName): + client.disableTable(tableName) # 删除表前需要先设置该表不可用 + client.deleteTable(tableName) + print('删除表{}成功!'.format(tableName)) + +def deleteTable(client, tableName): + ''' + 删除表 + :param client: 连接HBase的客户端实例 + :param tableName: 表名 + :return: + ''' + if client.isTableEnabled(tableName): + client.disableTable(tableName) + client.deleteTable(tableName) + print('删除表'+tableName+'成功.') + +def insertRow(client, tableName, rowName, colFamily, columnName, value): + ''' + 在指定表指定行指定列簇插入/更新列值 + ''' + mutations = [Mutation(column='{0}:{1}'.format(colFamily, columnName), value=str(value).encode('utf-8').decode('utf-8'))] + client.mutateRow(tableName, rowName, mutations) + # print('在{0}表{1}列簇{2}列插入{3}数据成功.'.format(tableName, colFamily, columnName, value)) + +def scannerGetSelect(client, tableName, columns, startRow, stopRow=None, rowsCnt=7000): + ''' + 依次扫描HBase指定表的每行数据(根据起始行,扫描到表的最后一行或指定行的前一行) + :param client: 连接HBase的客户端实例 + :param tableName: 表名 + :param columns: 一个包含(一个或多个列簇下对应列名的)列表 + :param startRow: 起始扫描行 + :param stopRow: 停止扫描行(默认为空) + :param rowsCnt: 需要扫描的行数 + :return MutilRowsDict: 返回一个包含多行数据的字典,以每行行键定位是哪一行 + ''' + # 如果stopRow为空,则使用scannerOpen方法扫描到表最后一行 + if stopRow is None: + scannerId = client.scannerOpen(tableName, startRow, columns) + # 如果stopRow不为空,则使用scannerOpenWithStop方法扫描到表的stopRow行 + else: + scannerId = client.scannerOpenWithStop(tableName, startRow, stopRow, columns) + results = client.scannerGetList(scannerId, rowsCnt) + # 如果查询结果不为空,则传入行键值或列值参数正确 + if results: + MutilRowsDict = {} + for result in results: + RowDict = {} # 一个包含一行所有列簇:列值字典的字典 + colFamilyDict = {} # 一个包含当前列簇下所有的列值的字典 + preColFamily = None # 记录前一次循环的列簇值,为空表示遍历该列簇的第一个列值起 + cnt = 0 # 循环计数器 + for key, TCell_value in result.columns.items(): + cnt += 1 + # 获取该行行键 + rowKey = result.row + # 由于key值是'列簇:列名'形式,所以需要通过split函数以':'把列名分割出来 + colFamily_colName = key.split(':') # 一个含有1.列簇2.列名的列表 + colFamily = colFamily_colName[0] # 列簇 + colName = colFamily_colName[1] # 列名 + # 如果本次列簇为空或和上次循环的列簇相同,则每个列值归属为colFamilyDict字典中并更新上一次列簇的记录 + if (preColFamily is None) or preColFamily == colFamily: + colFamilyDict[colName] = TCell_value.value + preColFamily = colFamily # 记录上一次列簇名 + # 如果本次列簇和上次循环的列簇不相同,则把含有列值的colFamilyDict归属为RowDict字典中并清空colFamilyDict字典和preColFamily记录 + else: + RowDict[preColFamily] = colFamilyDict + colFamilyDict = {} + colFamilyDict[colName] = TCell_value.value + preColFamily = None + # 若是最后一次迭代,则把含有列值的colFamilyDict归属为RowDict字典中 + if cnt == len(result.columns.items()): + RowDict[colFamily] = colFamilyDict + # 把当前含有多个列值信息的行的字典和改行行键存储在MutilRowsDict中 + MutilRowsDict[rowKey] = RowDict + return MutilRowsDict + # 如果查询结果为空,则传入行键值或列值参数错误,返回空列表 + else: + return [] + + +def xlsx2HBase(client, xlsx_Path, sheetNum, tableName, colFamily_per, year): + ''' + xlsx数据上传到HBase中 + :param client: 连接HBase的客户端实例 + :param xlsx_Path: xlsx文件所在地址 + :param sheetNum: sheet序号 + :param tableName: 表名 + :param colFamily_per: 论文信息列簇 + :param colFamily_cre: 作者列簇 + :param colFamily_aff: 机构列簇 + :param colFamily_try: 国家列簇 + :param year: 年份 + ''' + # 1.打开所在工作簿 + data = xlrd.open_workbook(xlsx_Path) + # 2.获取工作簿中的sheet + sheet = data.sheets()[sheetNum] + # 3.获取当前sheet的行数(含表头) + nRows = sheet.nrows + # 从第1行遍历到第nRows-1行,tqdm()使用进度条 + for RowNum in tqdm(range(1,nRows)): + # for RowNum in tqdm(range(1,10)): + rowName = year+'{:0>4d}'.format(RowNum) # 根据年份和行值拼接成字符串形成rowKey + for ColNum in range(0,3): # 从第0列遍历到第2列 + value = sheet.cell(RowNum, ColNum).value # 单元格信息 + # 对于发表频数,只保留整数 + if ColNum == 2: + value = int(value) + header = sheet.cell(0, ColNum).value # 每列的表头信息 + insertRow(client, tableName, rowName, colFamily_per, header, value) + # print('第'+rowName+'行'+header+'列插入数据成功.') + +# def xlsx2HBase(client, xlsx_Path, sheetNum, tableName, colFamily1, colFamily2, year): +# ''' +# xlsx数据上传到HBase中 +# :param client: 连接HBase的客户端实例 +# :param xlsx_Path: xlsx文件所在地址 +# :param sheetNum: sheet序号 +# :param tableName: 表名 +# :param colFamily1: 列簇1 +# :param colFamily2: 列簇2 +# :param year: 年份 +# ''' +# # 1.打开所在工作簿 +# data = xlrd.open_workbook(xlsx_Path) +# # 2.获取工作簿中的sheet +# sheet = data.sheets()[sheetNum] +# # 3.获取当前sheet的行数(含表头) +# nRows = sheet.nrows +# # 从第1行遍历到第nRows-1行,tqdm()使用进度条 +# for RowNum in tqdm(range(1,nRows)): +# rowName = year+'{:0>4d}'.format(RowNum) # 根据年份和行值拼接成字符串形成rowKey +# for ColNum in range(2,5): # 从第2列遍历到第4列 +# value = sheet.cell(RowNum, ColNum).value # 单元格信息 +# if str(value) == '0' or str(value) == '0.0': +# continue +# header = sheet.cell(0, ColNum).value # 每列的表头信息 +# insertRow(client, tableName, rowName, colFamily_per, header, value) +# # print('第'+rowName+'行'+header+'列插入数据成功.') +# for ColNum in range(5,39): # 从第5列遍历到第46列 +# value = sheet.cell(RowNum, ColNum).value # 单元格信息 +# if str(value) == '0' or str(value) == '0.0': +# continue +# header = sheet.cell(0, ColNum).value # 每列的表头信息 +# insertRow(client, tableName, rowName, colFamily2, header, value) +# # print('第'+rowName+'行'+header+'列插入数据成功.') + + +if __name__ == '__main__': + # tableName = '2018AAAI' # 数据库表名 + # tableName = 'trash' # 数据库表名 + # tableName = 'p5_AAAI_aff_all' # 数据库表名 + tableName = 'p5_AAAI_author_all' # 数据库表名 + colFamily_per = 'paper' # 论文信息列簇 + colFamily_cre = 'creator' # 作者列簇 + colFamily_aff = 'affiliation' # 机构列簇 + colFamily_try = 'country' # 国家列簇 + colFamily_aut1st = 'info' # 论文信息列簇 + # colFamily_aut1st = 'author_1st' # 论文信息列簇 + colFamily_autAll = 'author_all' # 作者列簇 + colFamily_aff1st = 'aff_1st' # 机构列簇 + colFamily_affAll = 'aff_all' # 国家列簇 + xlsx_Path = r'C:\Users\Administrator\Desktop\2014-2017.xlsx' + # xlsx_Path = r'C:\Users\Administrator\Desktop\statistic_data.xlsx' + sheetNum = 12 + # year = '2018' + year = 'p5_' + # 连接HBase数据库,返回客户端实例 + client = connectHBase() + # xlsx数据上传到HBase中 + # xlsx2HBase(client, xlsx_Path, sheetNum, tableName, colFamily_aut1st, year) + # 创建表 + # createTable(client, tableName, 'info') + # createTable(client, tableName, colFamily_per, colFamily_cre, colFamily_aff, colFamily_try) + # 插入或更新列值 + # insertRow(client, tableName, '20180936', 'creator_info', 'affiliation2', 'Ecole Polytechnique Fédérale de Lausanne (EPFL)') + # 删除整表 + # deleteTable(client, tableName) + # 依次扫描HBase指定表的每行数据(根据起始行,扫描到表的最后一行或指定行的前一行) + # MutilRowsDict = scannerGetSelect(client, tableName, ['creator_info:affiliation2'], '20180936') + # MutilRowsDict = scannerGetSelect(client, tableName, ['paper:title','creator'], '20180291', '20180291') + # print(MutilRowsDict) + # 列出所有表名 + ListTables(client) diff --git "a/8\343\200\201\346\226\207\347\214\256\346\225\260\346\215\256\346\214\226\346\216\230\347\263\273\347\273\237(\351\231\204\346\272\220\347\240\201)/apps/statistic/migrations/0001_initial.py" "b/8\343\200\201\346\226\207\347\214\256\346\225\260\346\215\256\346\214\226\346\216\230\347\263\273\347\273\237(\351\231\204\346\272\220\347\240\201)/apps/statistic/migrations/0001_initial.py" new file mode 100644 index 0000000..c5b62ad --- /dev/null +++ "b/8\343\200\201\346\226\207\347\214\256\346\225\260\346\215\256\346\214\226\346\216\230\347\263\273\347\273\237(\351\231\204\346\272\220\347\240\201)/apps/statistic/migrations/0001_initial.py" @@ -0,0 +1,27 @@ +# Generated by Django 2.0.1 on 2019-03-25 17:20 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + initial = True + + dependencies = [ + ] + + operations = [ + migrations.CreateModel( + name='AffDistribute', + fields=[ + ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('affiliation', models.CharField(max_length=220, verbose_name='机构名称')), + ('country', models.CharField(max_length=20, verbose_name='所属国家')), + ('count', models.IntegerField(default=0, verbose_name='发表频数')), + ], + options={ + 'verbose_name': '机构国家分布表', + 'verbose_name_plural': '机构国家分布表', + }, + ), + ] diff --git "a/8\343\200\201\346\226\207\347\214\256\346\225\260\346\215\256\346\214\226\346\216\230\347\263\273\347\273\237(\351\231\204\346\272\220\347\240\201)/apps/statistic/migrations/0002_delete_affdistribute.py" "b/8\343\200\201\346\226\207\347\214\256\346\225\260\346\215\256\346\214\226\346\216\230\347\263\273\347\273\237(\351\231\204\346\272\220\347\240\201)/apps/statistic/migrations/0002_delete_affdistribute.py" new file mode 100644 index 0000000..0877375 --- /dev/null +++ "b/8\343\200\201\346\226\207\347\214\256\346\225\260\346\215\256\346\214\226\346\216\230\347\263\273\347\273\237(\351\231\204\346\272\220\347\240\201)/apps/statistic/migrations/0002_delete_affdistribute.py" @@ -0,0 +1,16 @@ +# Generated by Django 2.0.1 on 2019-03-25 17:20 + +from django.db import migrations + + +class Migration(migrations.Migration): + + dependencies = [ + ('statistic', '0001_initial'), + ] + + operations = [ + migrations.DeleteModel( + name='AffDistribute', + ), + ] diff --git "a/8\343\200\201\346\226\207\347\214\256\346\225\260\346\215\256\346\214\226\346\216\230\347\263\273\347\273\237(\351\231\204\346\272\220\347\240\201)/apps/statistic/migrations/0003_affdistribute.py" "b/8\343\200\201\346\226\207\347\214\256\346\225\260\346\215\256\346\214\226\346\216\230\347\263\273\347\273\237(\351\231\204\346\272\220\347\240\201)/apps/statistic/migrations/0003_affdistribute.py" new file mode 100644 index 0000000..2722db7 --- /dev/null +++ "b/8\343\200\201\346\226\207\347\214\256\346\225\260\346\215\256\346\214\226\346\216\230\347\263\273\347\273\237(\351\231\204\346\272\220\347\240\201)/apps/statistic/migrations/0003_affdistribute.py" @@ -0,0 +1,28 @@ +# Generated by Django 2.0.1 on 2019-03-25 18:01 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + initial = True + + dependencies = [ + ('statistic', '0002_delete_affdistribute'), + ] + + operations = [ + migrations.CreateModel( + name='AffDistribute', + fields=[ + ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('affiliation', models.CharField(max_length=220, verbose_name='机构名称')), + ('country', models.CharField(max_length=20, verbose_name='所属国家')), + ('count', models.IntegerField(default=0, verbose_name='发表频数')), + ], + options={ + 'verbose_name': '机构国家分布表', + 'verbose_name_plural': '机构国家分布表', + }, + ), + ] diff --git "a/8\343\200\201\346\226\207\347\214\256\346\225\260\346\215\256\346\214\226\346\216\230\347\263\273\347\273\237(\351\231\204\346\272\220\347\240\201)/apps/statistic/migrations/__init__.py" "b/8\343\200\201\346\226\207\347\214\256\346\225\260\346\215\256\346\214\226\346\216\230\347\263\273\347\273\237(\351\231\204\346\272\220\347\240\201)/apps/statistic/migrations/__init__.py" new file mode 100644 index 0000000..e69de29 diff --git "a/8\343\200\201\346\226\207\347\214\256\346\225\260\346\215\256\346\214\226\346\216\230\347\263\273\347\273\237(\351\231\204\346\272\220\347\240\201)/apps/statistic/models.py" "b/8\343\200\201\346\226\207\347\214\256\346\225\260\346\215\256\346\214\226\346\216\230\347\263\273\347\273\237(\351\231\204\346\272\220\347\240\201)/apps/statistic/models.py" new file mode 100644 index 0000000..97d6b92 --- /dev/null +++ "b/8\343\200\201\346\226\207\347\214\256\346\225\260\346\215\256\346\214\226\346\216\230\347\263\273\347\273\237(\351\231\204\346\272\220\347\240\201)/apps/statistic/models.py" @@ -0,0 +1,17 @@ +from django.db import models + +# Create your models here. +''' +机构国家分布 +''' +class AffDistribute(models.Model): + affiliation = models.CharField(max_length=220, verbose_name='机构名称') + country = models.CharField(max_length=20, verbose_name=u'所属国家') + count = models.IntegerField(default=0, verbose_name=u'发表频数') + + class Meta: + # verbose_name_plural是verbose_name的复数形式。不设置则会自动补s。 + verbose_name = u'机构国家分布表' + verbose_name_plural = verbose_name + def __str__(self): + return '{0}({1})'.format(self.affiliation, self.country) \ No newline at end of file diff --git "a/8\343\200\201\346\226\207\347\214\256\346\225\260\346\215\256\346\214\226\346\216\230\347\263\273\347\273\237(\351\231\204\346\272\220\347\240\201)/apps/statistic/tests.py" "b/8\343\200\201\346\226\207\347\214\256\346\225\260\346\215\256\346\214\226\346\216\230\347\263\273\347\273\237(\351\231\204\346\272\220\347\240\201)/apps/statistic/tests.py" new file mode 100644 index 0000000..7ce503c --- /dev/null +++ "b/8\343\200\201\346\226\207\347\214\256\346\225\260\346\215\256\346\214\226\346\216\230\347\263\273\347\273\237(\351\231\204\346\272\220\347\240\201)/apps/statistic/tests.py" @@ -0,0 +1,3 @@ +from django.test import TestCase + +# Create your tests here. diff --git "a/8\343\200\201\346\226\207\347\214\256\346\225\260\346\215\256\346\214\226\346\216\230\347\263\273\347\273\237(\351\231\204\346\272\220\347\240\201)/apps/statistic/urls.py" "b/8\343\200\201\346\226\207\347\214\256\346\225\260\346\215\256\346\214\226\346\216\230\347\263\273\347\273\237(\351\231\204\346\272\220\347\240\201)/apps/statistic/urls.py" new file mode 100644 index 0000000..4660588 --- /dev/null +++ "b/8\343\200\201\346\226\207\347\214\256\346\225\260\346\215\256\346\214\226\346\216\230\347\263\273\347\273\237(\351\231\204\346\272\220\347\240\201)/apps/statistic/urls.py" @@ -0,0 +1,20 @@ +# encoding:utf-8 +__author__ = 'shiliang' +__date__ = '2019/3/6 16:46' + +from django.urls import path, include, re_path +from .views import affDistributeView, acceptRateView, allSessionView, sessionDetailView, wordCloudView, authorRankView, affRankView, authorMapView, topicModelView + +app_name = 'statistic' + +urlpatterns = [ + path('affDistribute/', affDistributeView.as_view(), name='affDistribute'), + path('acceptRate/', acceptRateView.as_view(), name='acceptRate'), + path('allSession/', allSessionView.as_view(), name='allSession'), + path('wordcloud/', wordCloudView.as_view(), name='wordcloud'), + path('authorRank/', authorRankView.as_view(), name='authorRank'), + path('affRank/', affRankView.as_view(), name='affRank'), + path('authorMap/', authorMapView.as_view(), name='authorMap'), + path('topicModel/', topicModelView.as_view(), name='topicModel'), + re_path('sessionDetail/(?P.*)/', sessionDetailView.as_view(), name='sessionDetail'), +] diff --git "a/8\343\200\201\346\226\207\347\214\256\346\225\260\346\215\256\346\214\226\346\216\230\347\263\273\347\273\237(\351\231\204\346\272\220\347\240\201)/apps/statistic/views.py" "b/8\343\200\201\346\226\207\347\214\256\346\225\260\346\215\256\346\214\226\346\216\230\347\263\273\347\273\237(\351\231\204\346\272\220\347\240\201)/apps/statistic/views.py" new file mode 100644 index 0000000..b61aaad --- /dev/null +++ "b/8\343\200\201\346\226\207\347\214\256\346\225\260\346\215\256\346\214\226\346\216\230\347\263\273\347\273\237(\351\231\204\346\272\220\347\240\201)/apps/statistic/views.py" @@ -0,0 +1,248 @@ +from django.shortcuts import render +from django.views.generic.base import View + +from .connect_hbase import connectHBase, scannerGetSelect +from .models import AffDistribute + + +''' +机构国家分布View +''' +class affDistributeView(View): + def get(self, request): + USDict = AffDistribute.objects.all().filter(country='United States') + ChinaDict = AffDistribute.objects.all().filter(country='China') + SingaporeDict = AffDistribute.objects.all().filter(country='Singapore') + HKDict = AffDistribute.objects.all().filter(country='Hong Kong') + AustraliaDict = AffDistribute.objects.all().filter(country='Australia') + UKDict = AffDistribute.objects.all().filter(country='United Kingdom') + JapanDict = AffDistribute.objects.all().filter(country='Japan') + GermanyDict = AffDistribute.objects.all().filter(country='Germany') + IndiaDict = AffDistribute.objects.all().filter(country='India') + CanadaDict = AffDistribute.objects.all().filter(country='Canada') + return render(request, 'AffDistribute.html', { + 'USDict':USDict, + 'ChinaDict':ChinaDict, + 'SingaporeDict':SingaporeDict, + 'HKDict':HKDict, + 'AustraliaDict':AustraliaDict, + 'UKDict':UKDict, + 'JapanDict':JapanDict, + 'GermanyDict':GermanyDict, + 'IndiaDict':IndiaDict, + 'CanadaDict':CanadaDict, + }) + +''' +会议论文接受率View +''' +class acceptRateView(View): + def get(self, request): + return render(request, 'accept_rate.html', {}) + + +class topicModelView(View): + ''' + LDA主题模型View + ''' + def get(self, request): + return render(request, 'LDA_Topic_Model.html', {}) + +''' +会议论文统览View(2014~2018) +''' +class allSessionView(View): + def get(self, request): + # 连接HBase数据库,返回客户端实例 + client = connectHBase() + titleCreDict18 = scannerGetSelect(client, '2018AAAI', ['paper:title','creator'], '20180001') + titleCreDict17 = scannerGetSelect(client, '2017AAAI', ['paper:title','creator'], '20170001') + titleCreDict16 = scannerGetSelect(client, '2016AAAI', ['paper:title','creator'], '20160001') + titleCreDict15 = scannerGetSelect(client, '2015AAAI', ['paper:title','creator'], '20150001') + titleCreDict14 = scannerGetSelect(client, '2014AAAI', ['paper:title','creator'], '20140001') + # 存储筛选出来的字典 + titleCreDict2018 = {} + titleCreDict2017 = {} + titleCreDict2016 = {} + titleCreDict2015 = {} + titleCreDict2014 = {} + # 论文标题搜索 + search_keywords = request.GET.get('keywords','') + if search_keywords: # 如果关键词存在 + # 2018全局搜索 + for rowkey, dict in titleCreDict18.items(): + if search_keywords.lower() in dict['paper']['title'].lower(): + titleCreDict2018[rowkey] = dict + # 2017全局搜索 + for rowkey, dict in titleCreDict17.items(): + if search_keywords.lower() in dict['paper']['title'].lower(): + titleCreDict2017[rowkey] = dict + # 2016全局搜索 + for rowkey, dict in titleCreDict16.items(): + if search_keywords.lower() in dict['paper']['title'].lower(): + titleCreDict2016[rowkey] = dict + # 2015全局搜索 + for rowkey, dict in titleCreDict15.items(): + if search_keywords.lower() in dict['paper']['title'].lower(): + titleCreDict2015[rowkey] = dict + # 2014全局搜索 + for rowkey, dict in titleCreDict14.items(): + if search_keywords.lower() in dict['paper']['title'].lower(): + titleCreDict2014[rowkey] = dict + else: + titleCreDict2018 = titleCreDict18 + titleCreDict2017 = titleCreDict17 + titleCreDict2016 = titleCreDict16 + titleCreDict2015 = titleCreDict15 + titleCreDict2014 = titleCreDict14 + + return render(request, 'allSession.html', { + 'titleCreDict2018': titleCreDict2018, + 'titleCreDict2017': titleCreDict2017, + 'titleCreDict2016': titleCreDict2016, + 'titleCreDict2015': titleCreDict2015, + 'titleCreDict2014': titleCreDict2014, + }) + +''' +论文详情页面View +''' +class sessionDetailView(View): + def get(self, request, rowKey): + tableName = rowKey[:4]+'AAAI' # 根据行键前四位合成数据库表名 + startRow = endRow = rowKey + # 连接HBase数据库,返回客户端实例 + client = connectHBase() + rowDict = scannerGetSelect(client, tableName, ['creator','affiliation','country','paper'], startRow, endRow) + # 由于hbase获取数据按照内在索引有小到大排序,故暂无法顺序获取,索引号可由debug查到 + for row_key,rowValueDict in rowDict.items(): # 获取rowKey对应的字典 + creatorList = [] # 对应1.affiliation、2.country和3.creator三个值的多个作者的列表 + for i in range(0, rowValueDict['creator'].__len__()): + creatorList.append([]) + for colName,colValue in rowValueDict.items(): + if colName == 'paper': + continue + cnt = 0 # creatorDict索引 + for colNameNum,colValueNum in colValue.items(): + creatorList[cnt].append(colValueNum) + cnt += 1 + + return render(request, 'paper_info.html', { + 'paperDict': rowValueDict['paper'], + 'creatorList': creatorList, + 'rowkey': row_key, # 日后可能会用到的参数 + }) + +''' +词云图View +''' +class wordCloudView(View): + def get(self, request): + return render(request, 'wordcloud.html', {}) + +''' +作者统计View +''' +class authorRankView(View): + def get(self, request): + # 连接HBase数据库,返回客户端实例 + client = connectHBase() + author_1stDict18 = scannerGetSelect(client, '2018AAAI_author_1st', ['info'], '20180001') + author_allDict18 = scannerGetSelect(client, '2018AAAI_author_all', ['info'], '20180001') + author_1st_p3 = scannerGetSelect(client, 'p3_AAAI_author_1st', ['info'], 'p3_0001') + author_all_p3 = scannerGetSelect(client, 'p3_AAAI_author_all', ['info'], 'p3_0001') + author_1st_p5 = scannerGetSelect(client, 'p5_AAAI_author_1st', ['info'], 'p5_0001') + author_all_p5 = scannerGetSelect(client, 'p5_AAAI_author_all', ['info'], 'p5_0001') + + # 存储筛选出来的字典 + author_1stDict2018 = author_1stDict18 + author_allDict2018 = {} + author_1stDict_p3 = author_1st_p3 + author_allDict_p3 = {} + author_1stDict_p5 = author_1st_p5 + author_allDict_p5 = {} + # 论文作者全局搜索 + search_keywords = request.GET.get('keywords', '') + if search_keywords: # 如果关键词存在 + # 2018所有作全局搜索 + for rowkey, dict in author_allDict18.items(): + if search_keywords.lower() in dict['info']['autName'].lower(): + author_allDict2018[rowkey] = dict + # 前3年所有一作全局搜索 + for rowkey, dict in author_all_p3.items(): + if search_keywords.lower() in dict['info']['autName'].lower(): + author_allDict_p3[rowkey] = dict + # 前5年所有一作全局搜索 + for rowkey, dict in author_all_p5.items(): + if search_keywords.lower() in dict['info']['autName'].lower(): + author_allDict_p5[rowkey] = dict + else: + author_allDict2018 = author_allDict18 + author_allDict_p3 = author_all_p3 + author_allDict_p5 = author_all_p5 + + return render(request, 'author_rank.html', { + 'author_1stDict2018': author_1stDict2018, + 'author_allDict2018': author_allDict2018, + 'author_1stDict_p3': author_1stDict_p3, + 'author_allDict_p3': author_allDict_p3, + 'author_1stDict_p5': author_1stDict_p5, + 'author_allDict_p5': author_allDict_p5, + }) + +''' +机构统计View +''' +class affRankView(View): + def get(self, request): + # 连接HBase数据库,返回客户端实例 + client = connectHBase() + aff_1stDict18 = scannerGetSelect(client, '2018AAAI_aff_1st', ['info'], '20180001') + aff_allDict18 = scannerGetSelect(client, '2018AAAI_aff_all', ['info'], '20180001') + aff_1st_p3 = scannerGetSelect(client, 'p3_AAAI_aff_1st', ['info'], 'p3_0001') + aff_all_p3 = scannerGetSelect(client, 'p3_AAAI_aff_all', ['info'], 'p3_0001') + aff_1st_p5 = scannerGetSelect(client, 'p5_AAAI_aff_1st', ['info'], 'p5_0001') + aff_all_p5 = scannerGetSelect(client, 'p5_AAAI_aff_all', ['info'], 'p5_0001') + + # 存储筛选出来的字典 + aff_1stDict2018 = aff_1stDict18 + aff_allDict2018 = {} + aff_1stDict_p3 = aff_1st_p3 + aff_allDict_p3 = {} + aff_1stDict_p5 = aff_1st_p5 + aff_allDict_p5 = {} + # 论文机构全局搜索 + search_keywords = request.GET.get('keywords', '') + if search_keywords: # 如果关键词存在 + # 2018所有作机构全局搜索 + for rowkey, dict in aff_allDict18.items(): + if search_keywords.lower() in dict['info']['affiliation'].lower(): + aff_allDict2018[rowkey] = dict + # 前3年所有一作机构全局搜索 + for rowkey, dict in aff_all_p3.items(): + if search_keywords.lower() in dict['info']['affiliation'].lower(): + aff_allDict_p3[rowkey] = dict + # 前5年所有一作机构全局搜索 + for rowkey, dict in aff_all_p5.items(): + if search_keywords.lower() in dict['info']['affiliation'].lower(): + aff_allDict_p5[rowkey] = dict + else: + aff_allDict2018 = aff_allDict18 + aff_allDict_p3 = aff_all_p3 + aff_allDict_p5 = aff_all_p5 + + return render(request, 'aff_rank.html', { + 'aff_1stDict2018': aff_1stDict2018, + 'aff_allDict2018': aff_allDict2018, + 'aff_1stDict_p3': aff_1stDict_p3, + 'aff_allDict_p3': aff_allDict_p3, + 'aff_1stDict_p5': aff_1stDict_p5, + 'aff_allDict_p5': aff_allDict_p5, + }) + +''' +作者关系图谱View +''' +class authorMapView(View): + def get(self, request): + return render(request, 'authorMap.html', {}) diff --git "a/8\343\200\201\346\226\207\347\214\256\346\225\260\346\215\256\346\214\226\346\216\230\347\263\273\347\273\237(\351\231\204\346\272\220\347\240\201)/apps/users/__init__.py" "b/8\343\200\201\346\226\207\347\214\256\346\225\260\346\215\256\346\214\226\346\216\230\347\263\273\347\273\237(\351\231\204\346\272\220\347\240\201)/apps/users/__init__.py" new file mode 100644 index 0000000..8fde5d5 --- /dev/null +++ "b/8\343\200\201\346\226\207\347\214\256\346\225\260\346\215\256\346\214\226\346\216\230\347\263\273\347\273\237(\351\231\204\346\272\220\347\240\201)/apps/users/__init__.py" @@ -0,0 +1 @@ +default_app_config = 'users.apps.UsersConfig' \ No newline at end of file diff --git "a/8\343\200\201\346\226\207\347\214\256\346\225\260\346\215\256\346\214\226\346\216\230\347\263\273\347\273\237(\351\231\204\346\272\220\347\240\201)/apps/users/admin.py" "b/8\343\200\201\346\226\207\347\214\256\346\225\260\346\215\256\346\214\226\346\216\230\347\263\273\347\273\237(\351\231\204\346\272\220\347\240\201)/apps/users/admin.py" new file mode 100644 index 0000000..694323f --- /dev/null +++ "b/8\343\200\201\346\226\207\347\214\256\346\225\260\346\215\256\346\214\226\346\216\230\347\263\273\347\273\237(\351\231\204\346\272\220\347\240\201)/apps/users/admin.py" @@ -0,0 +1 @@ +from django.contrib import admin diff --git "a/8\343\200\201\346\226\207\347\214\256\346\225\260\346\215\256\346\214\226\346\216\230\347\263\273\347\273\237(\351\231\204\346\272\220\347\240\201)/apps/users/adminx.py" "b/8\343\200\201\346\226\207\347\214\256\346\225\260\346\215\256\346\214\226\346\216\230\347\263\273\347\273\237(\351\231\204\346\272\220\347\240\201)/apps/users/adminx.py" new file mode 100644 index 0000000..0033cc1 --- /dev/null +++ "b/8\343\200\201\346\226\207\347\214\256\346\225\260\346\215\256\346\214\226\346\216\230\347\263\273\347\273\237(\351\231\204\346\272\220\347\240\201)/apps/users/adminx.py" @@ -0,0 +1,41 @@ +# encoding:utf-8 +__author__ = 'shiliang' +__date__ = '2019/2/21 19:28' + +import xadmin +from xadmin import views +from .models import EmailVerifyRecord + +# 创建admin的管理类,这里不再是继承admin,而是继承object +class EmailVerifyRecordAdmin(object): + # 配置后台我们需要显示的列 + list_display = ['code', 'email', 'send_type', 'send_time'] + # 配置搜索字段,不做时间搜索 + search_fields = ['code', 'email', 'send_type'] + # 配置筛选字段 + list_filter = ['code', 'email', 'send_type', 'send_time'] + + +''' +创建xadmin的全局管理器并与view绑定。 +''' +class BaseSetting(object): + # 开启主题功能 + enable_themes = True + use_bootswatch = True + +''' +xadmin全局配置参数信息设置 +''' +class GlobalSettings(object): + site_title = '文献数据挖掘系统管理后台' + site_footer = 'Copyright 2019 shiliang, Inc. NXU.' + # 收起菜单 + menu_style = 'accordion' + + +xadmin.site.register(EmailVerifyRecord, EmailVerifyRecordAdmin) +# 将全局配置管理与view绑定注册 +xadmin.site.register(views.BaseAdminView, BaseSetting) +# 将头部与脚部信息进行注册: +xadmin.site.register(views.CommAdminView, GlobalSettings) \ No newline at end of file diff --git "a/8\343\200\201\346\226\207\347\214\256\346\225\260\346\215\256\346\214\226\346\216\230\347\263\273\347\273\237(\351\231\204\346\272\220\347\240\201)/apps/users/apps.py" "b/8\343\200\201\346\226\207\347\214\256\346\225\260\346\215\256\346\214\226\346\216\230\347\263\273\347\273\237(\351\231\204\346\272\220\347\240\201)/apps/users/apps.py" new file mode 100644 index 0000000..0cf9f3a --- /dev/null +++ "b/8\343\200\201\346\226\207\347\214\256\346\225\260\346\215\256\346\214\226\346\216\230\347\263\273\347\273\237(\351\231\204\346\272\220\347\240\201)/apps/users/apps.py" @@ -0,0 +1,6 @@ +from django.apps import AppConfig + + +class UsersConfig(AppConfig): + name = 'users' + verbose_name = '用户管理' diff --git "a/8\343\200\201\346\226\207\347\214\256\346\225\260\346\215\256\346\214\226\346\216\230\347\263\273\347\273\237(\351\231\204\346\272\220\347\240\201)/apps/users/forms.py" "b/8\343\200\201\346\226\207\347\214\256\346\225\260\346\215\256\346\214\226\346\216\230\347\263\273\347\273\237(\351\231\204\346\272\220\347\240\201)/apps/users/forms.py" new file mode 100644 index 0000000..5d0c53c --- /dev/null +++ "b/8\343\200\201\346\226\207\347\214\256\346\225\260\346\215\256\346\214\226\346\216\230\347\263\273\347\273\237(\351\231\204\346\272\220\347\240\201)/apps/users/forms.py" @@ -0,0 +1,51 @@ +# encoding:utf-8 +__author__ = 'shiliang' +__date__ = '2019/2/23 16:06' + +from django import forms +# 引入验证码field +from captcha.fields import CaptchaField +from .models import UserProfile + +''' +登录form +''' +class LoginForm(forms.Form): + username = forms.CharField(required=True) + password = forms.CharField(required=True, min_length=5) + +''' +验证码form & 注册表单form +''' +class RegisterForm(forms.Form): + # 此处email与前端name需保持一致 + email = forms.EmailField(required=True) + password = forms.CharField(required=True,min_length=5) + # 应用验证码 + captcha = CaptchaField(error_messages={'invalid':'验证码错误'}) + +''' +找回密码form +''' +class ForgetPwdForm(forms.Form): + # 此处email与前端name需保持一致 + email = forms.EmailField(required=True) + # 应用验证码 + captcha = CaptchaField(error_messages={'invalid':'验证码错误'}) + +''' +重置密码form(点击邮件链接后的页面的form) +''' +class ModifyPwdForm(forms.Form): + password1 = forms.CharField(required=True, min_length=5) + password2 = forms.CharField(required=True, min_length=5) + +class UploadImageForm(forms.ModelForm): + class Meta: + model = UserProfile + fields = ['image'] + +class UserInfoForm(forms.ModelForm): + class Meta: + model = UserProfile + fields = ['nick_name', 'gender', 'birthday', 'address', 'mobile'] \ No newline at end of file diff --git "a/8\343\200\201\346\226\207\347\214\256\346\225\260\346\215\256\346\214\226\346\216\230\347\263\273\347\273\237(\351\231\204\346\272\220\347\240\201)/apps/users/migrations/0001_initial.py" "b/8\343\200\201\346\226\207\347\214\256\346\225\260\346\215\256\346\214\226\346\216\230\347\263\273\347\273\237(\351\231\204\346\272\220\347\240\201)/apps/users/migrations/0001_initial.py" new file mode 100644 index 0000000..e0666be --- /dev/null +++ "b/8\343\200\201\346\226\207\347\214\256\346\225\260\346\215\256\346\214\226\346\216\230\347\263\273\347\273\237(\351\231\204\346\272\220\347\240\201)/apps/users/migrations/0001_initial.py" @@ -0,0 +1,49 @@ +# Generated by Django 2.1.7 on 2019-02-18 08:28 + +import django.contrib.auth.models +import django.contrib.auth.validators +from django.db import migrations, models +import django.utils.timezone + + +class Migration(migrations.Migration): + + initial = True + + dependencies = [ + ('auth', '0009_alter_user_last_name_max_length'), + ] + + operations = [ + migrations.CreateModel( + name='UserProfile', + fields=[ + ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('password', models.CharField(max_length=128, verbose_name='password')), + ('last_login', models.DateTimeField(blank=True, null=True, verbose_name='last login')), + ('is_superuser', models.BooleanField(default=False, help_text='Designates that this user has all permissions without explicitly assigning them.', verbose_name='superuser status')), + ('username', models.CharField(error_messages={'unique': 'A user with that username already exists.'}, help_text='Required. 150 characters or fewer. Letters, digits and @/./+/-/_ only.', max_length=150, unique=True, validators=[django.contrib.auth.validators.UnicodeUsernameValidator()], verbose_name='username')), + ('first_name', models.CharField(blank=True, max_length=30, verbose_name='first name')), + ('last_name', models.CharField(blank=True, max_length=150, verbose_name='last name')), + ('email', models.EmailField(blank=True, max_length=254, verbose_name='email address')), + ('is_staff', models.BooleanField(default=False, help_text='Designates whether the user can log into this admin site.', verbose_name='staff status')), + ('is_active', models.BooleanField(default=True, help_text='Designates whether this user should be treated as active. Unselect this instead of deleting accounts.', verbose_name='active')), + ('date_joined', models.DateTimeField(default=django.utils.timezone.now, verbose_name='date joined')), + ('nick_name', models.CharField(default='', max_length=50, verbose_name='昵称')), + ('birthday', models.DateField(blank=True, null=True, verbose_name='生日')), + ('gender', models.CharField(choices=[('male', '男'), ('female', '女')], default='male', max_length=5, verbose_name='性别')), + ('address', models.CharField(default='', max_length=100, verbose_name='地址')), + ('mobile', models.CharField(blank=True, max_length=11, null=True, verbose_name='电话')), + ('image', models.ImageField(default='image/default.png', upload_to='image/%Y/%m/%d')), + ('groups', models.ManyToManyField(blank=True, help_text='The groups this user belongs to. A user will get all permissions granted to each of their groups.', related_name='user_set', related_query_name='user', to='auth.Group', verbose_name='groups')), + ('user_permissions', models.ManyToManyField(blank=True, help_text='Specific permissions for this user.', related_name='user_set', related_query_name='user', to='auth.Permission', verbose_name='user permissions')), + ], + options={ + 'verbose_name': '用户信息', + 'verbose_name_plural': '用户信息', + }, + managers=[ + ('objects', django.contrib.auth.models.UserManager()), + ], + ), + ] diff --git "a/8\343\200\201\346\226\207\347\214\256\346\225\260\346\215\256\346\214\226\346\216\230\347\263\273\347\273\237(\351\231\204\346\272\220\347\240\201)/apps/users/migrations/0002_auto_20190218_1650.py" "b/8\343\200\201\346\226\207\347\214\256\346\225\260\346\215\256\346\214\226\346\216\230\347\263\273\347\273\237(\351\231\204\346\272\220\347\240\201)/apps/users/migrations/0002_auto_20190218_1650.py" new file mode 100644 index 0000000..ed647d6 --- /dev/null +++ "b/8\343\200\201\346\226\207\347\214\256\346\225\260\346\215\256\346\214\226\346\216\230\347\263\273\347\273\237(\351\231\204\346\272\220\347\240\201)/apps/users/migrations/0002_auto_20190218_1650.py" @@ -0,0 +1,18 @@ +# Generated by Django 2.1.7 on 2019-02-18 08:50 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('users', '0001_initial'), + ] + + operations = [ + migrations.AlterField( + model_name='userprofile', + name='image', + field=models.ImageField(default='image/default.png', upload_to='image/%Y/%m'), + ), + ] diff --git "a/8\343\200\201\346\226\207\347\214\256\346\225\260\346\215\256\346\214\226\346\216\230\347\263\273\347\273\237(\351\231\204\346\272\220\347\240\201)/apps/users/migrations/0003_banner_emailverifyrecord.py" "b/8\343\200\201\346\226\207\347\214\256\346\225\260\346\215\256\346\214\226\346\216\230\347\263\273\347\273\237(\351\231\204\346\272\220\347\240\201)/apps/users/migrations/0003_banner_emailverifyrecord.py" new file mode 100644 index 0000000..d4e4ba9 --- /dev/null +++ "b/8\343\200\201\346\226\207\347\214\256\346\225\260\346\215\256\346\214\226\346\216\230\347\263\273\347\273\237(\351\231\204\346\272\220\347\240\201)/apps/users/migrations/0003_banner_emailverifyrecord.py" @@ -0,0 +1,43 @@ +# Generated by Django 2.1.7 on 2019-02-19 07:54 + +import datetime +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('users', '0002_auto_20190218_1650'), + ] + + operations = [ + migrations.CreateModel( + name='Banner', + fields=[ + ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('title', models.CharField(max_length=100, verbose_name='标题')), + ('image', models.ImageField(upload_to='banner/%Y/%m', verbose_name='轮播图')), + ('url', models.URLField(max_length=100, verbose_name='访问地址')), + ('index', models.IntegerField(default=100, verbose_name='顺序')), + ('add_time', models.DateTimeField(default=datetime.datetime.now, verbose_name='添加时间')), + ], + options={ + 'verbose_name': '轮播图', + 'verbose_name_plural': '轮播图', + }, + ), + migrations.CreateModel( + name='EmailVerifyRecord', + fields=[ + ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('code', models.CharField(max_length=20, verbose_name='验证码')), + ('email', models.EmailField(max_length=50, verbose_name='邮箱')), + ('send_type', models.CharField(choices=[('register', '注册'), ('forget', '找回密码')], max_length=10)), + ('send_time', models.DateTimeField(default=datetime.datetime.now)), + ], + options={ + 'verbose_name': '邮箱验证码', + 'verbose_name_plural': '邮箱验证码', + }, + ), + ] diff --git "a/8\343\200\201\346\226\207\347\214\256\346\225\260\346\215\256\346\214\226\346\216\230\347\263\273\347\273\237(\351\231\204\346\272\220\347\240\201)/apps/users/migrations/0004_auto_20190219_2200.py" "b/8\343\200\201\346\226\207\347\214\256\346\225\260\346\215\256\346\214\226\346\216\230\347\263\273\347\273\237(\351\231\204\346\272\220\347\240\201)/apps/users/migrations/0004_auto_20190219_2200.py" new file mode 100644 index 0000000..4fa972d --- /dev/null +++ "b/8\343\200\201\346\226\207\347\214\256\346\225\260\346\215\256\346\214\226\346\216\230\347\263\273\347\273\237(\351\231\204\346\272\220\347\240\201)/apps/users/migrations/0004_auto_20190219_2200.py" @@ -0,0 +1,18 @@ +# Generated by Django 2.1.7 on 2019-02-19 14:00 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('users', '0003_banner_emailverifyrecord'), + ] + + operations = [ + migrations.AlterField( + model_name='userprofile', + name='gender', + field=models.CharField(choices=[('male', '男'), ('female', '女')], default='male', max_length=6, verbose_name='性别'), + ), + ] diff --git "a/8\343\200\201\346\226\207\347\214\256\346\225\260\346\215\256\346\214\226\346\216\230\347\263\273\347\273\237(\351\231\204\346\272\220\347\240\201)/apps/users/migrations/0005_auto_20190223_2347.py" "b/8\343\200\201\346\226\207\347\214\256\346\225\260\346\215\256\346\214\226\346\216\230\347\263\273\347\273\237(\351\231\204\346\272\220\347\240\201)/apps/users/migrations/0005_auto_20190223_2347.py" new file mode 100644 index 0000000..679d1f6 --- /dev/null +++ "b/8\343\200\201\346\226\207\347\214\256\346\225\260\346\215\256\346\214\226\346\216\230\347\263\273\347\273\237(\351\231\204\346\272\220\347\240\201)/apps/users/migrations/0005_auto_20190223_2347.py" @@ -0,0 +1,24 @@ +# Generated by Django 2.0.1 on 2019-02-23 23:47 + +import datetime +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('users', '0004_auto_20190219_2200'), + ] + + operations = [ + migrations.AlterField( + model_name='emailverifyrecord', + name='send_time', + field=models.DateTimeField(default=datetime.datetime.now, verbose_name='发送时间'), + ), + migrations.AlterField( + model_name='emailverifyrecord', + name='send_type', + field=models.CharField(choices=[('register', '注册'), ('forget', '找回密码')], max_length=10, verbose_name='验证码类型'), + ), + ] diff --git "a/8\343\200\201\346\226\207\347\214\256\346\225\260\346\215\256\346\214\226\346\216\230\347\263\273\347\273\237(\351\231\204\346\272\220\347\240\201)/apps/users/migrations/0006_delete_banner.py" "b/8\343\200\201\346\226\207\347\214\256\346\225\260\346\215\256\346\214\226\346\216\230\347\263\273\347\273\237(\351\231\204\346\272\220\347\240\201)/apps/users/migrations/0006_delete_banner.py" new file mode 100644 index 0000000..f5a5b13 --- /dev/null +++ "b/8\343\200\201\346\226\207\347\214\256\346\225\260\346\215\256\346\214\226\346\216\230\347\263\273\347\273\237(\351\231\204\346\272\220\347\240\201)/apps/users/migrations/0006_delete_banner.py" @@ -0,0 +1,16 @@ +# Generated by Django 2.0.1 on 2019-03-03 16:46 + +from django.db import migrations + + +class Migration(migrations.Migration): + + dependencies = [ + ('users', '0005_auto_20190223_2347'), + ] + + operations = [ + migrations.DeleteModel( + name='Banner', + ), + ] diff --git "a/8\343\200\201\346\226\207\347\214\256\346\225\260\346\215\256\346\214\226\346\216\230\347\263\273\347\273\237(\351\231\204\346\272\220\347\240\201)/apps/users/migrations/0007_auto_20190303_1706.py" "b/8\343\200\201\346\226\207\347\214\256\346\225\260\346\215\256\346\214\226\346\216\230\347\263\273\347\273\237(\351\231\204\346\272\220\347\240\201)/apps/users/migrations/0007_auto_20190303_1706.py" new file mode 100644 index 0000000..09d8301 --- /dev/null +++ "b/8\343\200\201\346\226\207\347\214\256\346\225\260\346\215\256\346\214\226\346\216\230\347\263\273\347\273\237(\351\231\204\346\272\220\347\240\201)/apps/users/migrations/0007_auto_20190303_1706.py" @@ -0,0 +1,18 @@ +# Generated by Django 2.0.1 on 2019-03-03 17:06 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('users', '0006_delete_banner'), + ] + + operations = [ + migrations.AlterField( + model_name='userprofile', + name='image', + field=models.ImageField(default='media/image/default/Entity/user_default.png', upload_to='media/image/%Y/%m'), + ), + ] diff --git "a/8\343\200\201\346\226\207\347\214\256\346\225\260\346\215\256\346\214\226\346\216\230\347\263\273\347\273\237(\351\231\204\346\272\220\347\240\201)/apps/users/migrations/0008_auto_20190424_1701.py" "b/8\343\200\201\346\226\207\347\214\256\346\225\260\346\215\256\346\214\226\346\216\230\347\263\273\347\273\237(\351\231\204\346\272\220\347\240\201)/apps/users/migrations/0008_auto_20190424_1701.py" new file mode 100644 index 0000000..454c4e6 --- /dev/null +++ "b/8\343\200\201\346\226\207\347\214\256\346\225\260\346\215\256\346\214\226\346\216\230\347\263\273\347\273\237(\351\231\204\346\272\220\347\240\201)/apps/users/migrations/0008_auto_20190424_1701.py" @@ -0,0 +1,23 @@ +# Generated by Django 2.0.1 on 2019-04-24 17:01 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('users', '0007_auto_20190303_1706'), + ] + + operations = [ + migrations.AlterField( + model_name='userprofile', + name='address', + field=models.CharField(blank=True, max_length=100, null=True, verbose_name='地址'), + ), + migrations.AlterField( + model_name='userprofile', + name='image', + field=models.ImageField(default='image/default/Entity/user_default.png', upload_to='image/%Y/%m'), + ), + ] diff --git "a/8\343\200\201\346\226\207\347\214\256\346\225\260\346\215\256\346\214\226\346\216\230\347\263\273\347\273\237(\351\231\204\346\272\220\347\240\201)/apps/users/migrations/__init__.py" "b/8\343\200\201\346\226\207\347\214\256\346\225\260\346\215\256\346\214\226\346\216\230\347\263\273\347\273\237(\351\231\204\346\272\220\347\240\201)/apps/users/migrations/__init__.py" new file mode 100644 index 0000000..e69de29 diff --git "a/8\343\200\201\346\226\207\347\214\256\346\225\260\346\215\256\346\214\226\346\216\230\347\263\273\347\273\237(\351\231\204\346\272\220\347\240\201)/apps/users/models.py" "b/8\343\200\201\346\226\207\347\214\256\346\225\260\346\215\256\346\214\226\346\216\230\347\263\273\347\273\237(\351\231\204\346\272\220\347\240\201)/apps/users/models.py" new file mode 100644 index 0000000..0ec2fa4 --- /dev/null +++ "b/8\343\200\201\346\226\207\347\214\256\346\225\260\346\215\256\346\214\226\346\216\230\347\263\273\347\273\237(\351\231\204\346\272\220\347\240\201)/apps/users/models.py" @@ -0,0 +1,61 @@ +from django.db import models +from datetime import datetime + +from django.contrib.auth.models import AbstractUser +''' +用户信息 +''' +class UserProfile(AbstractUser): + # 自定义的性别选择规则 + GENDER_CHOICES = ( + ('male',u'男'), + ('female',u'女'), + ) + # 昵称 + nick_name = models.CharField(max_length=50, verbose_name=u'昵称', default='') + # 生日,可以为空 + birthday = models.DateField(verbose_name=u'生日', null=True, blank=True) + # 性别 只能男或女,默认男 + gender = models.CharField( + max_length=6, + verbose_name=u'性别', + choices=GENDER_CHOICES, + default='male', + ) + # 地址 + address = models.CharField(max_length=100, verbose_name=u'地址', null=True, blank=True) + # 电话 + mobile = models.CharField(max_length=11, verbose_name=u'电话', null=True, blank=True) + # 头像 默认使用default.png + image = models.ImageField( + max_length=100, + upload_to='image/%Y/%m', + default='image/default/Entity/user_default.png' + ) + # meta信息,即后台栏目名 + class Meta: + verbose_name = u'用户信息' + verbose_name_plural = verbose_name + # 重载__str__方法,打印实例会打印username,username为继承自abstractuser + def __str__(self): + return self.username +''' +邮箱验证码 +''' +class EmailVerifyRecord(models.Model): + SEND_CHOICES = ( + ('register',u'注册'), + ('forget',u'找回密码'), + ) + code = models.CharField(max_length=20, verbose_name=u'验证码') + email = models.EmailField(max_length=50, verbose_name=u'邮箱') + send_type = models.CharField(max_length=10, choices=SEND_CHOICES, verbose_name='验证码类型') + # 这里的now得去掉(),不去掉会根据编译时间。而不是根据实例化时间。 + send_time = models.DateTimeField(default=datetime.now, verbose_name='发送时间') + + class Meta: + # verbose_name_plural是verbose_name的复数形式。不设置则会自动补s。 + verbose_name = u'邮箱验证码' + verbose_name_plural = verbose_name + def __str__(self): + return '{0}({1})'.format(self.code, self.email) diff --git "a/8\343\200\201\346\226\207\347\214\256\346\225\260\346\215\256\346\214\226\346\216\230\347\263\273\347\273\237(\351\231\204\346\272\220\347\240\201)/apps/users/tests.py" "b/8\343\200\201\346\226\207\347\214\256\346\225\260\346\215\256\346\214\226\346\216\230\347\263\273\347\273\237(\351\231\204\346\272\220\347\240\201)/apps/users/tests.py" new file mode 100644 index 0000000..7ce503c --- /dev/null +++ "b/8\343\200\201\346\226\207\347\214\256\346\225\260\346\215\256\346\214\226\346\216\230\347\263\273\347\273\237(\351\231\204\346\272\220\347\240\201)/apps/users/tests.py" @@ -0,0 +1,3 @@ +from django.test import TestCase + +# Create your tests here. diff --git "a/8\343\200\201\346\226\207\347\214\256\346\225\260\346\215\256\346\214\226\346\216\230\347\263\273\347\273\237(\351\231\204\346\272\220\347\240\201)/apps/users/urls.py" "b/8\343\200\201\346\226\207\347\214\256\346\225\260\346\215\256\346\214\226\346\216\230\347\263\273\347\273\237(\351\231\204\346\272\220\347\240\201)/apps/users/urls.py" new file mode 100644 index 0000000..e744a18 --- /dev/null +++ "b/8\343\200\201\346\226\207\347\214\256\346\225\260\346\215\256\346\214\226\346\216\230\347\263\273\347\273\237(\351\231\204\346\272\220\347\240\201)/apps/users/urls.py" @@ -0,0 +1,19 @@ +# encoding:utf-8 +__author__ = 'shiliang' +__date__ = '2019/3/6 16:46' + +from django.urls import path, include, re_path +from .views import UserInfoView, UploadImageView, UpdatePwdView + +app_name = 'users' + +urlpatterns = [ + # 课程机构列表url + path('info/', UserInfoView.as_view(), name='user_info'), + + # 用户头像上传 + path('image/upload/', UploadImageView.as_view(), name='image_upload'), + + # 用户中心修改个人密码 + path('update/pwd/', UpdatePwdView.as_view(), name='update_pwd'), +] \ No newline at end of file diff --git "a/8\343\200\201\346\226\207\347\214\256\346\225\260\346\215\256\346\214\226\346\216\230\347\263\273\347\273\237(\351\231\204\346\272\220\347\240\201)/apps/users/views.py" "b/8\343\200\201\346\226\207\347\214\256\346\225\260\346\215\256\346\214\226\346\216\230\347\263\273\347\273\237(\351\231\204\346\272\220\347\240\201)/apps/users/views.py" new file mode 100644 index 0000000..c0fef5d --- /dev/null +++ "b/8\343\200\201\346\226\207\347\214\256\346\225\260\346\215\256\346\214\226\346\216\230\347\263\273\347\273\237(\351\231\204\346\272\220\347\240\201)/apps/users/views.py" @@ -0,0 +1,243 @@ +import json +from django.shortcuts import render, HttpResponseRedirect, reverse +from django.contrib.auth.views import logout, login +from django.contrib.auth import authenticate, login +from django.contrib.auth.backends import ModelBackend +from django.contrib.auth.hashers import make_password +from django.http import HttpResponse +from users.models import UserProfile, EmailVerifyRecord +# 并集运算 +from django.db.models import Q +# 基于类实现需要继承的view +from django.views.generic.base import View +from .forms import LoginForm, RegisterForm, ForgetPwdForm, ModifyPwdForm, UploadImageForm, UserInfoForm +from utils.email_send import send_register_email +from utils.mixin_utils import LoginRequiredMixin + +# 实现用户名邮箱均可登录 +# 继承ModelBackend类,因为它有方法authenticate,可点进源码查看 +class CustomBackend(ModelBackend): + def authenticate(self, request, username=None, password=None, **kwargs): + # 不希望用户存在两个,get只能有一个。两个是get失败的一种原因 Q为使用并集查询 + try: + # django的后台中密码加密:所以不能password==password + # UserProfile继承的AbstractUser中有def check_password(self, raw_password): + user = UserProfile.objects.get(Q(username=username)|Q(email=username)) + if user.check_password(password): + return user + except Exception as e: + return None + +''' +注册功能的view +''' +class RegisterView(View): + def get(self, request): + # 添加验证码 + register_form = RegisterForm() + return render(request, 'register.html', {'register_form':register_form}) + def post(self, request): + register_form = RegisterForm(request.POST) + if register_form.is_valid(): + user_name = request.POST.get('email', '') + if UserProfile.objects.filter(email=user_name): + return render(request, 'register.html', {'register_form': register_form, 'msg':'用户已存在!'}) + pass_word = request.POST.get('password', '') + # 实例化一个user_profile对象,将前台值存入 + user_profile = UserProfile() + user_profile.username = user_name + user_profile.email = user_name + # 加密password进行保存 + user_profile.password = make_password(pass_word) + # 默认激活状态为false + user_profile.is_active = False + user_profile.save() + # 发送注册激活邮件 + send_register_email(email=user_name, send_type='register') + return render(request, 'login.html', {}) + return render(request, 'register.html', {'register_form': register_form}) + +''' +登录功能的view +''' +class LoginView(View): + # 直接调用get方法免去判断 + def get(self, request): + # render三变量: request 模板名称 一个字典写明传给前端的值 + return render(request, 'login.html', {}) + def post(self, request): + # 类实例化需要一个字典参数dict:request.POST就是一个QueryDict所以直接传入 + # POST中的usernamepassword,会对应到form中 + login_form = LoginForm(request.POST) + if login_form.is_valid(): + user_name = request.POST.get('username', '') + pass_word = request.POST.get('password', '') + # 成功返回user对象,失败返回null + user = authenticate(username=user_name, password=pass_word) + if user is not None: + # login_in 两参数:1.request, 2.user + # 实际是对request写了一部分东西进去,然后在render的时候: + # request是要render回去的。这些信息也就随着返回浏览器。完成登录 + if user.is_active: + login(request=request, user=user) + return render(request, 'homepage.html', ) + else: + return render(request, 'login.html', {'msg': '用户未激活!'}) + else: + return render(request, 'login.html', {'msg': '用户名或密码错误!'}) + else: + return render(request, 'login.html', {'login_form': login_form}) + +''' +用户登出View +''' +class LogoutView(View): + def get(self, request): + # django自带的logout + logout(request) + # 重定向到首页, + return HttpResponseRedirect(reverse('homepage')) + +''' +激活功能的view +''' +class ActiveUserView(View): + def get(self, request, active_code): + # 查询邮箱验证记录是否存在 + all_records = EmailVerifyRecord.objects.filter(code=active_code) + if all_records: + for record in all_records: + # 查找到邮箱对应的user + user = UserProfile.objects.get(email=record.email) + user.is_active = True + user.save() + # 激活成功跳转到登录页面 + return render(request, 'login.html', {}) + else: + return render(request, 'active_fail.html') + +''' +用户忘记密码的处理view +''' +class ForgetPwdView(View): + def get(self, request): + # 添加验证码 + forget_form = ForgetPwdForm() + return render(request, 'forgetpwd.html', {'forget_form':forget_form}) + def post(self, request): + forget_form = ForgetPwdForm(request.POST) + if forget_form.is_valid(): + email = request.POST.get('email','') + send_register_email(email=email, send_type='forget') + return render(request, 'send_success.html') + else: + return render(request, 'forgetpwd.html', {'forget_form': forget_form}) + +''' +重置密码的view +''' +class ResetView(View): + def get(self, request, reset_code): + # 查询邮箱验证记录是否存在 + all_records = EmailVerifyRecord.objects.filter(code=reset_code) + if all_records: + for record in all_records: + # 将email传回来 + return render(request, 'password_reset.html', {'email':record.email}) + else: + return render(request, 'active_fail.html') + +''' +重置密码页面中,确认密码的表单提交后的View +''' +class ModifyPwdView(View): + def post(self, request): + modify_form = ModifyPwdForm(request.POST) + email = request.POST.get('email', '') # 获取hidden组件post来的邮箱 + if modify_form.is_valid(): + pwd1 = request.POST.get('password1', '') + pwd2 = request.POST.get('password2', '') + # 如果两次密码不相等,返回错误信息 + if pwd1 != pwd2: + return render(request, 'password_reset.html', {'email': email, 'msg':'密码不一致'}) + user = UserProfile.objects.get(email=email) + # 加密成密文存入password字段中 + user.password = make_password(pwd1) + user.save() + return render(request, 'login.html', {'msg':'修改密码成功,请重新登录'}) + else: + return render(request, 'password_reset.html', {'email': email, 'modify_form':modify_form}) + +class UpdatePwdView(View): + ''' + 个人中心修改用户密码 + ''' + def post(self, request): + modify_form = ModifyPwdForm(request.POST) + if modify_form.is_valid(): + pwd1 = request.POST.get('password1', '') + pwd2 = request.POST.get('password2', '') + # 如果两次密码不相等,返回错误信息 + if pwd1 != pwd2: + return HttpResponse('{"status":"fail","msg":"密码不一致!"}', content_type='application/json') + user = request.user + # 加密成密文存入password字段中 + user.password = make_password(pwd1) + user.save() + return HttpResponse('{"status":"success"}', content_type='application/json') + else: + return HttpResponse(json.dumps(modify_form.errors), content_type='application/json') + +class UploadImageView(LoginRequiredMixin, View): + ''' + 用户上传图片view + ''' + def post(self, request): + image_form = UploadImageForm(request.POST, request.FILES, instance=request.user) + if image_form.is_valid(): + image_form.save() + return HttpResponse("{'status':'success'}", content_type='application/json') + else: + return HttpResponse("{'status':'fail'}", content_type='application/json') + + +class UserInfoView(LoginRequiredMixin, View): + ''' + 用户个人中心view + ''' + def get(self, request): + return render(request, 'usercenter-info.html', {}) + def post(self, request): + user_info_form = UserInfoForm(request.POST, instance=request.user) + if user_info_form.is_valid(): + user_info_form.save() + return HttpResponse("{'status':'success'}", content_type='application/json') + else: + return HttpResponse(json.dumps(user_info_form.errors), content_type='application/json') + +def page_not_found(request): + ''' + 全局404处理函数 + ''' + from django.shortcuts import render_to_response + response = render_to_response('404.html', {}) + response.status_code = '404' + return response + +def page_error(request): + ''' + 全局500处理函数 + ''' + from django.shortcuts import render_to_response + response = render_to_response('500.html', {}) + response.status_code = '500' + return response + +def permission_denied(request): + ''' + 全局403处理函数 + ''' + from django.shortcuts import render_to_response + response = render_to_response('403.html', {}) + response.status_code = '403' + return response \ No newline at end of file diff --git "a/8\343\200\201\346\226\207\347\214\256\346\225\260\346\215\256\346\214\226\346\216\230\347\263\273\347\273\237(\351\231\204\346\272\220\347\240\201)/apps/utils/__init__.py" "b/8\343\200\201\346\226\207\347\214\256\346\225\260\346\215\256\346\214\226\346\216\230\347\263\273\347\273\237(\351\231\204\346\272\220\347\240\201)/apps/utils/__init__.py" new file mode 100644 index 0000000..e920441 --- /dev/null +++ "b/8\343\200\201\346\226\207\347\214\256\346\225\260\346\215\256\346\214\226\346\216\230\347\263\273\347\273\237(\351\231\204\346\272\220\347\240\201)/apps/utils/__init__.py" @@ -0,0 +1,3 @@ +# encoding:utf-8 +__author__ = 'shiliang' +__date__ = '2019/2/24 11:24' \ No newline at end of file diff --git "a/8\343\200\201\346\226\207\347\214\256\346\225\260\346\215\256\346\214\226\346\216\230\347\263\273\347\273\237(\351\231\204\346\272\220\347\240\201)/apps/utils/email_send.py" "b/8\343\200\201\346\226\207\347\214\256\346\225\260\346\215\256\346\214\226\346\216\230\347\263\273\347\273\237(\351\231\204\346\272\220\347\240\201)/apps/utils/email_send.py" new file mode 100644 index 0000000..3eeb178 --- /dev/null +++ "b/8\343\200\201\346\226\207\347\214\256\346\225\260\346\215\256\346\214\226\346\216\230\347\263\273\347\273\237(\351\231\204\346\272\220\347\240\201)/apps/utils/email_send.py" @@ -0,0 +1,56 @@ +# encoding:utf-8 +__author__ = 'shiliang' +__date__ = '2019/2/24 11:25' +from random import Random +# 导入Django自带的邮件模块 +from users.models import EmailVerifyRecord +# 导入Django自带的邮件模块 +from django.core.mail import send_mail +# 导入setting中发送邮件的配置 +from DataMingingPaper.settings import EMAIL_FROM + +''' +生成随机字符串 +''' +def random_str(random_length=8): + str = '' + # 生成字符串的可选字符串 + str_set = 'AaBbCcDdEeFfGgHhIiJjKkLlMmNnOoPpQqRrSsTtUuVvWwXxYyZz0123456789' + random = Random() + for i in range(random_length): + index = random.randint(0, len(str_set)-1) + str += str_set[index] + return str + +''' +发送注册邮件 +''' +def send_register_email(email, send_type='register'): + # 1.发送之前先保存到数据库,到时候查询链接是否存在 + # 实例化一个EmailVerifyRecord对象 + email_record = EmailVerifyRecord() + # 生成随机的code放入链接 + code = random_str(16) + email_record.code = code + email_record.email = email + email_record.send_type = send_type + email_record.save() + # 2.定义邮件内容并发送 + email_title = '' + email_body = '' + if send_type == 'register': + email_title = 'Django在线文献数据挖掘系统网站,注册激活链接.' + email_body = '请点击下面的链接激活你的账号: http://www.dataminging.com/active/{0}'.format(code) + # 使用Django内置函数完成邮件发送。四个参数:1.subject,2.message,3.from_email,4.recipient_list + send_status = send_mail(email_title, email_body, EMAIL_FROM, [email]) + # 如果发送成功 + if send_status: + pass + elif send_type == 'forget': + email_title = 'Django在线文献数据挖掘系统网站,密码重置链接.' + email_body = '请点击下面的链接重置你的密码: http://www.dataminging.com/reset/{0}'.format(code) + # 使用Django内置函数完成邮件发送。四个参数:1.subject,2.message,3.from_email,4.recipient_list + send_status = send_mail(email_title, email_body, EMAIL_FROM, [email]) + # 如果发送成功 + if send_status: + pass \ No newline at end of file diff --git "a/8\343\200\201\346\226\207\347\214\256\346\225\260\346\215\256\346\214\226\346\216\230\347\263\273\347\273\237(\351\231\204\346\272\220\347\240\201)/apps/utils/mixin_utils.py" "b/8\343\200\201\346\226\207\347\214\256\346\225\260\346\215\256\346\214\226\346\216\230\347\263\273\347\273\237(\351\231\204\346\272\220\347\240\201)/apps/utils/mixin_utils.py" new file mode 100644 index 0000000..27a17af --- /dev/null +++ "b/8\343\200\201\346\226\207\347\214\256\346\225\260\346\215\256\346\214\226\346\216\230\347\263\273\347\273\237(\351\231\204\346\272\220\347\240\201)/apps/utils/mixin_utils.py" @@ -0,0 +1,13 @@ +# encoding:utf-8 +__author__ = 'shiliang' +__date__ = '2019/4/23 23:32' + +from django.contrib.auth.decorators import login_required +from django.utils.decorators import method_decorator + + +class LoginRequiredMixin(object): + + @method_decorator(login_required(login_url='/login/')) + def dispatch(self, request, *args, **kwargs): + return super(LoginRequiredMixin, self).dispatch(request, *args, **kwargs) \ No newline at end of file diff --git "a/8\343\200\201\346\226\207\347\214\256\346\225\260\346\215\256\346\214\226\346\216\230\347\263\273\347\273\237(\351\231\204\346\272\220\347\240\201)/datamingingpaper.sql" "b/8\343\200\201\346\226\207\347\214\256\346\225\260\346\215\256\346\214\226\346\216\230\347\263\273\347\273\237(\351\231\204\346\272\220\347\240\201)/datamingingpaper.sql" new file mode 100644 index 0000000..bd0e06b --- /dev/null +++ "b/8\343\200\201\346\226\207\347\214\256\346\225\260\346\215\256\346\214\226\346\216\230\347\263\273\347\273\237(\351\231\204\346\272\220\347\240\201)/datamingingpaper.sql" @@ -0,0 +1,764 @@ +/* +Navicat MySQL Data Transfer + +Source Server : Django项目部署 +Source Server Version : 50560 +Source Host : 10.0.86.245:3306 +Source Database : datamingingpaper + +Target Server Type : MYSQL +Target Server Version : 50560 +File Encoding : 65001 + +Date: 2019-06-01 12:51:31 +*/ + +SET FOREIGN_KEY_CHECKS=0; + +-- ---------------------------- +-- Table structure for `auth_group` +-- ---------------------------- +DROP TABLE IF EXISTS `auth_group`; +CREATE TABLE `auth_group` ( + `id` int(11) NOT NULL AUTO_INCREMENT, + `name` varchar(80) NOT NULL, + PRIMARY KEY (`id`), + UNIQUE KEY `name` (`name`) USING BTREE +) ENGINE=InnoDB DEFAULT CHARSET=utf8; + +-- ---------------------------- +-- Records of auth_group +-- ---------------------------- + +-- ---------------------------- +-- Table structure for `auth_group_permissions` +-- ---------------------------- +DROP TABLE IF EXISTS `auth_group_permissions`; +CREATE TABLE `auth_group_permissions` ( + `id` int(11) NOT NULL AUTO_INCREMENT, + `group_id` int(11) NOT NULL, + `permission_id` int(11) NOT NULL, + PRIMARY KEY (`id`), + UNIQUE KEY `auth_group_permissions_group_id_permission_id_0cd325b0_uniq` (`group_id`,`permission_id`) USING BTREE, + KEY `auth_group_permissio_permission_id_84c5c92e_fk_auth_perm` (`permission_id`) USING BTREE, + CONSTRAINT `auth_group_permissions_ibfk_1` FOREIGN KEY (`permission_id`) REFERENCES `auth_permission` (`id`), + CONSTRAINT `auth_group_permissions_ibfk_2` FOREIGN KEY (`group_id`) REFERENCES `auth_group` (`id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; + +-- ---------------------------- +-- Records of auth_group_permissions +-- ---------------------------- + +-- ---------------------------- +-- Table structure for `auth_permission` +-- ---------------------------- +DROP TABLE IF EXISTS `auth_permission`; +CREATE TABLE `auth_permission` ( + `id` int(11) NOT NULL AUTO_INCREMENT, + `name` varchar(255) NOT NULL, + `content_type_id` int(11) NOT NULL, + `codename` varchar(100) NOT NULL, + PRIMARY KEY (`id`), + UNIQUE KEY `auth_permission_content_type_id_codename_01ab375a_uniq` (`content_type_id`,`codename`) USING BTREE, + CONSTRAINT `auth_permission_ibfk_1` FOREIGN KEY (`content_type_id`) REFERENCES `django_content_type` (`id`) +) ENGINE=InnoDB AUTO_INCREMENT=53 DEFAULT CHARSET=utf8; + +-- ---------------------------- +-- Records of auth_permission +-- ---------------------------- +INSERT INTO `auth_permission` VALUES ('1', 'Can add log entry', '1', 'add_logentry'); +INSERT INTO `auth_permission` VALUES ('2', 'Can change log entry', '1', 'change_logentry'); +INSERT INTO `auth_permission` VALUES ('3', 'Can delete log entry', '1', 'delete_logentry'); +INSERT INTO `auth_permission` VALUES ('4', 'Can view log entry', '1', 'view_logentry'); +INSERT INTO `auth_permission` VALUES ('5', 'Can add permission', '2', 'add_permission'); +INSERT INTO `auth_permission` VALUES ('6', 'Can change permission', '2', 'change_permission'); +INSERT INTO `auth_permission` VALUES ('7', 'Can delete permission', '2', 'delete_permission'); +INSERT INTO `auth_permission` VALUES ('8', 'Can add group', '3', 'add_group'); +INSERT INTO `auth_permission` VALUES ('9', 'Can change group', '3', 'change_group'); +INSERT INTO `auth_permission` VALUES ('10', 'Can delete group', '3', 'delete_group'); +INSERT INTO `auth_permission` VALUES ('11', 'Can view group', '3', 'view_group'); +INSERT INTO `auth_permission` VALUES ('12', 'Can view permission', '2', 'view_permission'); +INSERT INTO `auth_permission` VALUES ('13', 'Can add content type', '4', 'add_contenttype'); +INSERT INTO `auth_permission` VALUES ('14', 'Can change content type', '4', 'change_contenttype'); +INSERT INTO `auth_permission` VALUES ('15', 'Can delete content type', '4', 'delete_contenttype'); +INSERT INTO `auth_permission` VALUES ('16', 'Can view content type', '4', 'view_contenttype'); +INSERT INTO `auth_permission` VALUES ('17', 'Can add session', '5', 'add_session'); +INSERT INTO `auth_permission` VALUES ('18', 'Can change session', '5', 'change_session'); +INSERT INTO `auth_permission` VALUES ('19', 'Can delete session', '5', 'delete_session'); +INSERT INTO `auth_permission` VALUES ('20', 'Can view session', '5', 'view_session'); +INSERT INTO `auth_permission` VALUES ('21', 'Can add 用户信息', '6', 'add_userprofile'); +INSERT INTO `auth_permission` VALUES ('22', 'Can change 用户信息', '6', 'change_userprofile'); +INSERT INTO `auth_permission` VALUES ('23', 'Can delete 用户信息', '6', 'delete_userprofile'); +INSERT INTO `auth_permission` VALUES ('24', 'Can add 邮箱验证码', '7', 'add_emailverifyrecord'); +INSERT INTO `auth_permission` VALUES ('25', 'Can change 邮箱验证码', '7', 'change_emailverifyrecord'); +INSERT INTO `auth_permission` VALUES ('26', 'Can delete 邮箱验证码', '7', 'delete_emailverifyrecord'); +INSERT INTO `auth_permission` VALUES ('27', 'Can view 邮箱验证码', '7', 'view_emailverifyrecord'); +INSERT INTO `auth_permission` VALUES ('28', 'Can view 用户信息', '6', 'view_userprofile'); +INSERT INTO `auth_permission` VALUES ('29', 'Can add Bookmark', '8', 'add_bookmark'); +INSERT INTO `auth_permission` VALUES ('30', 'Can change Bookmark', '8', 'change_bookmark'); +INSERT INTO `auth_permission` VALUES ('31', 'Can delete Bookmark', '8', 'delete_bookmark'); +INSERT INTO `auth_permission` VALUES ('32', 'Can add User Setting', '9', 'add_usersettings'); +INSERT INTO `auth_permission` VALUES ('33', 'Can change User Setting', '9', 'change_usersettings'); +INSERT INTO `auth_permission` VALUES ('34', 'Can delete User Setting', '9', 'delete_usersettings'); +INSERT INTO `auth_permission` VALUES ('35', 'Can add User Widget', '10', 'add_userwidget'); +INSERT INTO `auth_permission` VALUES ('36', 'Can change User Widget', '10', 'change_userwidget'); +INSERT INTO `auth_permission` VALUES ('37', 'Can delete User Widget', '10', 'delete_userwidget'); +INSERT INTO `auth_permission` VALUES ('38', 'Can add log entry', '11', 'add_log'); +INSERT INTO `auth_permission` VALUES ('39', 'Can change log entry', '11', 'change_log'); +INSERT INTO `auth_permission` VALUES ('40', 'Can delete log entry', '11', 'delete_log'); +INSERT INTO `auth_permission` VALUES ('41', 'Can view Bookmark', '8', 'view_bookmark'); +INSERT INTO `auth_permission` VALUES ('42', 'Can view log entry', '11', 'view_log'); +INSERT INTO `auth_permission` VALUES ('43', 'Can view User Setting', '9', 'view_usersettings'); +INSERT INTO `auth_permission` VALUES ('44', 'Can view User Widget', '10', 'view_userwidget'); +INSERT INTO `auth_permission` VALUES ('45', 'Can add captcha store', '12', 'add_captchastore'); +INSERT INTO `auth_permission` VALUES ('46', 'Can change captcha store', '12', 'change_captchastore'); +INSERT INTO `auth_permission` VALUES ('47', 'Can delete captcha store', '12', 'delete_captchastore'); +INSERT INTO `auth_permission` VALUES ('48', 'Can view captcha store', '12', 'view_captchastore'); +INSERT INTO `auth_permission` VALUES ('49', 'Can add 机构国家分布表', '13', 'add_affdistribute'); +INSERT INTO `auth_permission` VALUES ('50', 'Can change 机构国家分布表', '13', 'change_affdistribute'); +INSERT INTO `auth_permission` VALUES ('51', 'Can delete 机构国家分布表', '13', 'delete_affdistribute'); +INSERT INTO `auth_permission` VALUES ('52', 'Can view 机构国家分布表', '13', 'view_affdistribute'); + +-- ---------------------------- +-- Table structure for `captcha_captchastore` +-- ---------------------------- +DROP TABLE IF EXISTS `captcha_captchastore`; +CREATE TABLE `captcha_captchastore` ( + `id` int(11) NOT NULL AUTO_INCREMENT, + `challenge` varchar(32) NOT NULL, + `response` varchar(32) NOT NULL, + `hashkey` varchar(40) NOT NULL, + `expiration` datetime(6) NOT NULL, + PRIMARY KEY (`id`), + UNIQUE KEY `hashkey` (`hashkey`) USING BTREE +) ENGINE=InnoDB AUTO_INCREMENT=68 DEFAULT CHARSET=utf8; + +-- ---------------------------- +-- Records of captcha_captchastore +-- ---------------------------- +INSERT INTO `captcha_captchastore` VALUES ('66', 'RWME', 'rwme', '9745237a5f9508a0b9050976a32ee2dc2e3ca944', '2019-05-24 14:16:53.000000'); +INSERT INTO `captcha_captchastore` VALUES ('67', 'VGXF', 'vgxf', '22b70db308e83989e07fbc0f7f7e379bfb677d27', '2019-06-01 11:37:28.000000'); + +-- ---------------------------- +-- Table structure for `django_admin_log` +-- ---------------------------- +DROP TABLE IF EXISTS `django_admin_log`; +CREATE TABLE `django_admin_log` ( + `id` int(11) NOT NULL AUTO_INCREMENT, + `action_time` datetime(6) NOT NULL, + `object_id` longtext, + `object_repr` varchar(200) NOT NULL, + `action_flag` smallint(5) unsigned NOT NULL, + `change_message` longtext NOT NULL, + `content_type_id` int(11) DEFAULT NULL, + `user_id` int(11) NOT NULL, + PRIMARY KEY (`id`), + KEY `django_admin_log_content_type_id_c4bce8eb_fk_django_co` (`content_type_id`) USING BTREE, + KEY `django_admin_log_user_id_c564eba6_fk_users_userprofile_id` (`user_id`) USING BTREE, + CONSTRAINT `django_admin_log_ibfk_1` FOREIGN KEY (`content_type_id`) REFERENCES `django_content_type` (`id`), + CONSTRAINT `django_admin_log_ibfk_2` FOREIGN KEY (`user_id`) REFERENCES `users_userprofile` (`id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; + +-- ---------------------------- +-- Records of django_admin_log +-- ---------------------------- + +-- ---------------------------- +-- Table structure for `django_content_type` +-- ---------------------------- +DROP TABLE IF EXISTS `django_content_type`; +CREATE TABLE `django_content_type` ( + `id` int(11) NOT NULL AUTO_INCREMENT, + `app_label` varchar(100) NOT NULL, + `model` varchar(100) NOT NULL, + PRIMARY KEY (`id`), + UNIQUE KEY `django_content_type_app_label_model_76bd3d3b_uniq` (`app_label`,`model`) USING BTREE +) ENGINE=InnoDB AUTO_INCREMENT=14 DEFAULT CHARSET=utf8; + +-- ---------------------------- +-- Records of django_content_type +-- ---------------------------- +INSERT INTO `django_content_type` VALUES ('1', 'admin', 'logentry'); +INSERT INTO `django_content_type` VALUES ('3', 'auth', 'group'); +INSERT INTO `django_content_type` VALUES ('2', 'auth', 'permission'); +INSERT INTO `django_content_type` VALUES ('12', 'captcha', 'captchastore'); +INSERT INTO `django_content_type` VALUES ('4', 'contenttypes', 'contenttype'); +INSERT INTO `django_content_type` VALUES ('5', 'sessions', 'session'); +INSERT INTO `django_content_type` VALUES ('13', 'statistic', 'affdistribute'); +INSERT INTO `django_content_type` VALUES ('7', 'users', 'emailverifyrecord'); +INSERT INTO `django_content_type` VALUES ('6', 'users', 'userprofile'); +INSERT INTO `django_content_type` VALUES ('8', 'xadmin', 'bookmark'); +INSERT INTO `django_content_type` VALUES ('11', 'xadmin', 'log'); +INSERT INTO `django_content_type` VALUES ('9', 'xadmin', 'usersettings'); +INSERT INTO `django_content_type` VALUES ('10', 'xadmin', 'userwidget'); + +-- ---------------------------- +-- Table structure for `django_migrations` +-- ---------------------------- +DROP TABLE IF EXISTS `django_migrations`; +CREATE TABLE `django_migrations` ( + `id` int(11) NOT NULL AUTO_INCREMENT, + `app` varchar(255) NOT NULL, + `name` varchar(255) NOT NULL, + `applied` datetime(6) NOT NULL, + PRIMARY KEY (`id`) +) ENGINE=InnoDB AUTO_INCREMENT=35 DEFAULT CHARSET=utf8; + +-- ---------------------------- +-- Records of django_migrations +-- ---------------------------- +INSERT INTO `django_migrations` VALUES ('1', 'contenttypes', '0001_initial', '2019-03-03 16:47:07.012991'); +INSERT INTO `django_migrations` VALUES ('2', 'contenttypes', '0002_remove_content_type_name', '2019-03-03 16:47:09.479043'); +INSERT INTO `django_migrations` VALUES ('3', 'auth', '0001_initial', '2019-03-03 16:47:16.846500'); +INSERT INTO `django_migrations` VALUES ('4', 'auth', '0002_alter_permission_name_max_length', '2019-03-03 16:47:17.696202'); +INSERT INTO `django_migrations` VALUES ('5', 'auth', '0003_alter_user_email_max_length', '2019-03-03 16:47:17.742179'); +INSERT INTO `django_migrations` VALUES ('6', 'auth', '0004_alter_user_username_opts', '2019-03-03 16:47:17.997131'); +INSERT INTO `django_migrations` VALUES ('7', 'auth', '0005_alter_user_last_login_null', '2019-03-03 16:47:18.281947'); +INSERT INTO `django_migrations` VALUES ('8', 'auth', '0006_require_contenttypes_0002', '2019-03-03 16:47:18.362898'); +INSERT INTO `django_migrations` VALUES ('9', 'auth', '0007_alter_validators_add_error_messages', '2019-03-03 16:47:18.638084'); +INSERT INTO `django_migrations` VALUES ('10', 'auth', '0008_alter_user_username_max_length', '2019-03-03 16:47:18.886060'); +INSERT INTO `django_migrations` VALUES ('11', 'auth', '0009_alter_user_last_name_max_length', '2019-03-03 16:47:18.938074'); +INSERT INTO `django_migrations` VALUES ('12', 'users', '0001_initial', '2019-03-03 16:47:29.540537'); +INSERT INTO `django_migrations` VALUES ('13', 'admin', '0001_initial', '2019-03-03 16:47:33.262424'); +INSERT INTO `django_migrations` VALUES ('14', 'admin', '0002_logentry_remove_auto_add', '2019-03-03 16:47:33.359377'); +INSERT INTO `django_migrations` VALUES ('15', 'captcha', '0001_initial', '2019-03-03 16:47:34.527321'); +INSERT INTO `django_migrations` VALUES ('16', 'sessions', '0001_initial', '2019-03-03 16:47:35.846716'); +INSERT INTO `django_migrations` VALUES ('17', 'users', '0002_auto_20190218_1650', '2019-03-03 16:47:36.055731'); +INSERT INTO `django_migrations` VALUES ('18', 'users', '0003_banner_emailverifyrecord', '2019-03-03 16:47:37.780696'); +INSERT INTO `django_migrations` VALUES ('19', 'users', '0004_auto_20190219_2200', '2019-03-03 16:47:38.009408'); +INSERT INTO `django_migrations` VALUES ('20', 'users', '0005_auto_20190223_2347', '2019-03-03 16:47:38.054384'); +INSERT INTO `django_migrations` VALUES ('21', 'users', '0006_delete_banner', '2019-03-03 16:47:38.481137'); +INSERT INTO `django_migrations` VALUES ('22', 'xadmin', '0001_initial', '2019-03-03 16:47:51.794849'); +INSERT INTO `django_migrations` VALUES ('23', 'xadmin', '0002_log', '2019-03-03 16:47:57.203146'); +INSERT INTO `django_migrations` VALUES ('24', 'xadmin', '0003_auto_20160715_0100', '2019-03-03 16:48:02.145478'); +INSERT INTO `django_migrations` VALUES ('25', 'users', '0007_auto_20190303_1706', '2019-03-03 17:06:45.865178'); +INSERT INTO `django_migrations` VALUES ('26', 'statistic', '0001_initial', '2019-03-25 00:29:09.929313'); +INSERT INTO `django_migrations` VALUES ('27', 'statistic', '0002_affdistribute_count11', '2019-03-25 17:09:22.342530'); +INSERT INTO `django_migrations` VALUES ('28', 'statistic', '0002_affdistribute_count', '2019-03-25 17:14:05.681162'); +INSERT INTO `django_migrations` VALUES ('29', 'statistic', '0003_delete_affdistribute', '2019-03-25 17:15:25.921679'); +INSERT INTO `django_migrations` VALUES ('30', 'statistic', '0004_affdistribute', '2019-03-25 17:16:22.142994'); +INSERT INTO `django_migrations` VALUES ('31', 'statistic', '0005_delete_affdistribute', '2019-03-25 17:17:02.965977'); +INSERT INTO `django_migrations` VALUES ('32', 'statistic', '0002_delete_affdistribute', '2019-03-25 17:20:45.954786'); +INSERT INTO `django_migrations` VALUES ('33', 'statistic', '0003_affdistribute', '2019-03-25 18:01:21.632490'); +INSERT INTO `django_migrations` VALUES ('34', 'users', '0008_auto_20190424_1701', '2019-04-24 17:01:46.104556'); + +-- ---------------------------- +-- Table structure for `django_session` +-- ---------------------------- +DROP TABLE IF EXISTS `django_session`; +CREATE TABLE `django_session` ( + `session_key` varchar(40) NOT NULL, + `session_data` longtext NOT NULL, + `expire_date` datetime(6) NOT NULL, + PRIMARY KEY (`session_key`), + KEY `django_session_expire_date_a5c62663` (`expire_date`) USING BTREE +) ENGINE=InnoDB DEFAULT CHARSET=utf8; + +-- ---------------------------- +-- Records of django_session +-- ---------------------------- +INSERT INTO `django_session` VALUES ('3euvrpkzrug5dutt0dsjs7d7xvgcunxv', 'NWY3NGQ2MGY5ZjgzMzM0NzI0NGQ5MTgwOTA3ZjBiNmMxNjUzODFlYTp7Il9hdXRoX3VzZXJfaWQiOiIxIiwiX2F1dGhfdXNlcl9iYWNrZW5kIjoidXNlcnMudmlld3MuQ3VzdG9tQmFja2VuZCIsIl9hdXRoX3VzZXJfaGFzaCI6IjE1MmYwOTI1ZWE1MmMxMDZlMGYyYmFlMzhiYzk3N2I3YmYzZjk4M2MiLCJMSVNUX1FVRVJZIjpbWyJ1c2VycyIsInVzZXJwcm9maWxlIl0sIiJdfQ==', '2019-03-20 13:11:29.385861'); +INSERT INTO `django_session` VALUES ('gxobrguun0stuqwm6gpqfggqwliwy9lp', 'NWY3NGQ2MGY5ZjgzMzM0NzI0NGQ5MTgwOTA3ZjBiNmMxNjUzODFlYTp7Il9hdXRoX3VzZXJfaWQiOiIxIiwiX2F1dGhfdXNlcl9iYWNrZW5kIjoidXNlcnMudmlld3MuQ3VzdG9tQmFja2VuZCIsIl9hdXRoX3VzZXJfaGFzaCI6IjE1MmYwOTI1ZWE1MmMxMDZlMGYyYmFlMzhiYzk3N2I3YmYzZjk4M2MiLCJMSVNUX1FVRVJZIjpbWyJ1c2VycyIsInVzZXJwcm9maWxlIl0sIiJdfQ==', '2019-03-26 11:28:01.208786'); +INSERT INTO `django_session` VALUES ('h3h4ail94hklnaivqtzecsq8oseo0m7f', 'MTM4YjAxNWRkZDUxYzg0MGY5MDMyYjc1MzdjMjcxNTFkMDE1MDYxMjp7Il9hdXRoX3VzZXJfaWQiOiIxOCIsIl9hdXRoX3VzZXJfYmFja2VuZCI6InVzZXJzLnZpZXdzLkN1c3RvbUJhY2tlbmQiLCJfYXV0aF91c2VyX2hhc2giOiI2NzU2ZDc3MzFkNGI4MjNmYWExYWEyMDQwY2I3YmU0Y2NmNzAyODEyIiwibmF2X21lbnUiOiJbe1widGl0bGVcIjogXCJcdTc1MjhcdTYyMzdcdTdiYTFcdTc0MDZcIiwgXCJtZW51c1wiOiBbe1widGl0bGVcIjogXCJcdTc1MjhcdTYyMzdcdTRmZTFcdTYwNmZcIiwgXCJ1cmxcIjogXCIveGFkbWluL3VzZXJzL3VzZXJwcm9maWxlL1wiLCBcImljb25cIjogXCJmYSBmYS11c2VyXCIsIFwib3JkZXJcIjogM30sIHtcInRpdGxlXCI6IFwiXHU5MGFlXHU3YmIxXHU5YThjXHU4YmMxXHU3ODAxXCIsIFwidXJsXCI6IFwiL3hhZG1pbi91c2Vycy9lbWFpbHZlcmlmeXJlY29yZC9cIiwgXCJpY29uXCI6IG51bGwsIFwib3JkZXJcIjogNX1dLCBcImZpcnN0X2ljb25cIjogXCJmYSBmYS11c2VyXCIsIFwiZmlyc3RfdXJsXCI6IFwiL3hhZG1pbi91c2Vycy91c2VycHJvZmlsZS9cIn0sIHtcInRpdGxlXCI6IFwiXHU3YmExXHU3NDA2XCIsIFwibWVudXNcIjogW3tcInRpdGxlXCI6IFwiXHU2NWU1XHU1ZmQ3XHU4YmIwXHU1ZjU1XCIsIFwidXJsXCI6IFwiL3hhZG1pbi94YWRtaW4vbG9nL1wiLCBcImljb25cIjogXCJmYSBmYS1jb2dcIiwgXCJvcmRlclwiOiA3fV0sIFwiZmlyc3RfaWNvblwiOiBcImZhIGZhLWNvZ1wiLCBcImZpcnN0X3VybFwiOiBcIi94YWRtaW4veGFkbWluL2xvZy9cIn0sIHtcInRpdGxlXCI6IFwiXHU4YmE0XHU4YmMxXHU1NDhjXHU2Mzg4XHU2NzQzXCIsIFwibWVudXNcIjogW3tcInRpdGxlXCI6IFwiXHU3ZWM0XCIsIFwidXJsXCI6IFwiL3hhZG1pbi9hdXRoL2dyb3VwL1wiLCBcImljb25cIjogXCJmYSBmYS1ncm91cFwiLCBcIm9yZGVyXCI6IDJ9LCB7XCJ0aXRsZVwiOiBcIlx1Njc0M1x1OTY1MFwiLCBcInVybFwiOiBcIi94YWRtaW4vYXV0aC9wZXJtaXNzaW9uL1wiLCBcImljb25cIjogXCJmYSBmYS1sb2NrXCIsIFwib3JkZXJcIjogNH1dLCBcImZpcnN0X2ljb25cIjogXCJmYSBmYS1ncm91cFwiLCBcImZpcnN0X3VybFwiOiBcIi94YWRtaW4vYXV0aC9ncm91cC9cIn1dIiwiTElTVF9RVUVSWSI6W1sidXNlcnMiLCJlbWFpbHZlcmlmeXJlY29yZCJdLCIiXX0=', '2019-06-15 11:48:51.000000'); +INSERT INTO `django_session` VALUES ('n7fcz82kh6y6ykcccnstc5257fpon2pp', 'YmJkMmMzNDAyZTQ4NGYyNWI2ZjRjZDQ2MGI1ZjcxN2U2ZjJkZDdiMjp7Il9hdXRoX3VzZXJfaWQiOiIxOCIsIl9hdXRoX3VzZXJfYmFja2VuZCI6InVzZXJzLnZpZXdzLkN1c3RvbUJhY2tlbmQiLCJfYXV0aF91c2VyX2hhc2giOiI2NzU2ZDc3MzFkNGI4MjNmYWExYWEyMDQwY2I3YmU0Y2NmNzAyODEyIn0=', '2019-05-17 14:30:10.753544'); +INSERT INTO `django_session` VALUES ('sbnwas7uh2tqyopc4e9t8qaxnm66aap1', 'MGYyZTBhMjIxOGYyZDI2NmNhZGQ1N2E1OWU4N2MzZmVkOGM5MmFlMTp7Il9hdXRoX3VzZXJfaWQiOiIxMCIsIl9hdXRoX3VzZXJfYmFja2VuZCI6InVzZXJzLnZpZXdzLkN1c3RvbUJhY2tlbmQiLCJfYXV0aF91c2VyX2hhc2giOiJiODc4YzhmMGE2M2VlMzNiNTYyYWM4NjE1OWMyNGYxMzQ4ZTVjOTVmIn0=', '2019-03-20 14:16:03.529972'); +INSERT INTO `django_session` VALUES ('v4xjafi263z2lqirgsraebvj2kbpj177', 'NzQwMDE5ODc3NDgxOTBlNjcxMGNkYzJhMWNiNWEyMWJmMWQ0NjQ5NDp7fQ==', '2019-03-20 14:10:25.331528'); + +-- ---------------------------- +-- Table structure for `statistic_affdistribute` +-- ---------------------------- +DROP TABLE IF EXISTS `statistic_affdistribute`; +CREATE TABLE `statistic_affdistribute` ( + `id` int(11) NOT NULL AUTO_INCREMENT, + `affiliation` varchar(220) NOT NULL, + `country` varchar(20) NOT NULL, + `count` int(11) NOT NULL, + PRIMARY KEY (`id`) +) ENGINE=InnoDB AUTO_INCREMENT=270 DEFAULT CHARSET=utf8; + +-- ---------------------------- +-- Records of statistic_affdistribute +-- ---------------------------- +INSERT INTO `statistic_affdistribute` VALUES ('1', 'Carnegie Mellon University', 'United States', '26'); +INSERT INTO `statistic_affdistribute` VALUES ('2', 'University of California', 'United States', '15'); +INSERT INTO `statistic_affdistribute` VALUES ('3', 'IBM', 'United States', '14'); +INSERT INTO `statistic_affdistribute` VALUES ('4', 'University of Pittsburgh', 'United States', '10'); +INSERT INTO `statistic_affdistribute` VALUES ('5', 'Stanford University', 'United States', '9'); +INSERT INTO `statistic_affdistribute` VALUES ('6', 'Duke University', 'United States', '9'); +INSERT INTO `statistic_affdistribute` VALUES ('7', 'University of Southern California', 'United States', '8'); +INSERT INTO `statistic_affdistribute` VALUES ('8', 'University of Maryland', 'United States', '7'); +INSERT INTO `statistic_affdistribute` VALUES ('9', 'University of Texas at Austin', 'United States', '7'); +INSERT INTO `statistic_affdistribute` VALUES ('10', 'Cornell University', 'United States', '6'); +INSERT INTO `statistic_affdistribute` VALUES ('11', 'MIT', 'United States', '5'); +INSERT INTO `statistic_affdistribute` VALUES ('12', 'Arizona State University', 'United States', '5'); +INSERT INTO `statistic_affdistribute` VALUES ('13', 'University of Minnesota', 'United States', '5'); +INSERT INTO `statistic_affdistribute` VALUES ('14', 'Georgia Institute of Technology', 'United States', '5'); +INSERT INTO `statistic_affdistribute` VALUES ('15', 'Harvard University', 'United States', '5'); +INSERT INTO `statistic_affdistribute` VALUES ('16', 'University of Washington', 'United States', '5'); +INSERT INTO `statistic_affdistribute` VALUES ('17', 'Microsoft', 'United States', '5'); +INSERT INTO `statistic_affdistribute` VALUES ('18', 'Rutgers University', 'United States', '4'); +INSERT INTO `statistic_affdistribute` VALUES ('19', 'Northwestern University', 'United States', '4'); +INSERT INTO `statistic_affdistribute` VALUES ('20', 'Rensselaer Polytechnic Institute', 'United States', '4'); +INSERT INTO `statistic_affdistribute` VALUES ('21', 'University of Michigan', 'United States', '4'); +INSERT INTO `statistic_affdistribute` VALUES ('22', 'University of Massachusetts Amherst', 'United States', '4'); +INSERT INTO `statistic_affdistribute` VALUES ('23', 'Purdue University', 'United States', '4'); +INSERT INTO `statistic_affdistribute` VALUES ('24', 'Virginia Tech', 'United States', '4'); +INSERT INTO `statistic_affdistribute` VALUES ('25', 'University of Illinois at Chicago', 'United States', '3'); +INSERT INTO `statistic_affdistribute` VALUES ('26', 'University of Illinois at Urbana-Champaign', 'United States', '3'); +INSERT INTO `statistic_affdistribute` VALUES ('27', 'University of Pennsylvania', 'United States', '3'); +INSERT INTO `statistic_affdistribute` VALUES ('28', 'Washington University in St. Louis', 'United States', '3'); +INSERT INTO `statistic_affdistribute` VALUES ('29', 'Columbia University', 'United States', '3'); +INSERT INTO `statistic_affdistribute` VALUES ('30', 'Iowa State University', 'United States', '3'); +INSERT INTO `statistic_affdistribute` VALUES ('31', 'Google', 'United States', '3'); +INSERT INTO `statistic_affdistribute` VALUES ('32', 'Tufts University', 'United States', '2'); +INSERT INTO `statistic_affdistribute` VALUES ('33', 'University of Texas at Dallas', 'United States', '2'); +INSERT INTO `statistic_affdistribute` VALUES ('34', 'Texas A&M University', 'United States', '2'); +INSERT INTO `statistic_affdistribute` VALUES ('35', 'University of Marylandollege Park', 'United States', '2'); +INSERT INTO `statistic_affdistribute` VALUES ('36', 'California Institute of Technology', 'United States', '2'); +INSERT INTO `statistic_affdistribute` VALUES ('37', 'OpenAI', 'United States', '2'); +INSERT INTO `statistic_affdistribute` VALUES ('38', 'Rochester Institute of Technology', 'United States', '2'); +INSERT INTO `statistic_affdistribute` VALUES ('39', 'Johns Hopkins University', 'United States', '2'); +INSERT INTO `statistic_affdistribute` VALUES ('40', 'Stony Brook University', 'United States', '2'); +INSERT INTO `statistic_affdistribute` VALUES ('41', 'University of Colorado Boulder', 'United States', '2'); +INSERT INTO `statistic_affdistribute` VALUES ('42', 'George Mason University', 'United States', '2'); +INSERT INTO `statistic_affdistribute` VALUES ('43', 'The Ohio State University', 'United States', '2'); +INSERT INTO `statistic_affdistribute` VALUES ('44', 'Vassar College', 'United States', '2'); +INSERT INTO `statistic_affdistribute` VALUES ('45', 'Facebook AI Research', 'United States', '2'); +INSERT INTO `statistic_affdistribute` VALUES ('46', 'The University of North Carolina at Chapel Hill', 'United States', '2'); +INSERT INTO `statistic_affdistribute` VALUES ('47', 'University of South Carolina', 'United States', '2'); +INSERT INTO `statistic_affdistribute` VALUES ('48', 'New Jersey Institute of Technology', 'United States', '1'); +INSERT INTO `statistic_affdistribute` VALUES ('49', 'R7 Speech Sciences', 'United States', '1'); +INSERT INTO `statistic_affdistribute` VALUES ('50', 'ENS and UC Davis', 'United States', '1'); +INSERT INTO `statistic_affdistribute` VALUES ('51', 'Vanderbilt University', 'United States', '1'); +INSERT INTO `statistic_affdistribute` VALUES ('52', 'University of Virginia', 'United States', '1'); +INSERT INTO `statistic_affdistribute` VALUES ('53', 'Oregon State University', 'United States', '1'); +INSERT INTO `statistic_affdistribute` VALUES ('54', 'Swarthmore College', 'United States', '1'); +INSERT INTO `statistic_affdistribute` VALUES ('55', 'University of New Hampshire', 'United States', '1'); +INSERT INTO `statistic_affdistribute` VALUES ('56', 'State University of New York at Buffalo', 'United States', '1'); +INSERT INTO `statistic_affdistribute` VALUES ('57', 'U.S. Army Research Laboratory', 'United States', '1'); +INSERT INTO `statistic_affdistribute` VALUES ('58', 'Vicarious AI', 'United States', '1'); +INSERT INTO `statistic_affdistribute` VALUES ('59', 'University of Notre Dame', 'United States', '1'); +INSERT INTO `statistic_affdistribute` VALUES ('60', 'Cardiogram', 'United States', '1'); +INSERT INTO `statistic_affdistribute` VALUES ('61', 'Missouri University of Science and Technology', 'United States', '1'); +INSERT INTO `statistic_affdistribute` VALUES ('62', 'University of Connecticut', 'United States', '1'); +INSERT INTO `statistic_affdistribute` VALUES ('63', 'University of North Florida', 'United States', '1'); +INSERT INTO `statistic_affdistribute` VALUES ('64', 'Samsung Research America', 'United States', '1'); +INSERT INTO `statistic_affdistribute` VALUES ('65', 'Appier Inc.', 'United States', '1'); +INSERT INTO `statistic_affdistribute` VALUES ('66', 'The University of Tennessee, Knoxville', 'United States', '1'); +INSERT INTO `statistic_affdistribute` VALUES ('67', 'Pennsylvania State University', 'United States', '1'); +INSERT INTO `statistic_affdistribute` VALUES ('68', 'Toyota Technological Institute at Chicago', 'United States', '1'); +INSERT INTO `statistic_affdistribute` VALUES ('69', 'The University of Texas at Dallas', 'United States', '1'); +INSERT INTO `statistic_affdistribute` VALUES ('70', 'Binghamton University', 'United States', '1'); +INSERT INTO `statistic_affdistribute` VALUES ('71', 'SIFT,LLC', 'United States', '1'); +INSERT INTO `statistic_affdistribute` VALUES ('72', 'University of Pennsylvania, Honda Research Institute', 'United States', '1'); +INSERT INTO `statistic_affdistribute` VALUES ('73', 'HRL Laboratories,LLC', 'United States', '1'); +INSERT INTO `statistic_affdistribute` VALUES ('74', 'Brown University, Providence,Rhode Island', 'United States', '1'); +INSERT INTO `statistic_affdistribute` VALUES ('75', 'The University of Texas at Arlington', 'United States', '1'); +INSERT INTO `statistic_affdistribute` VALUES ('76', 'Information Sciences Institute', 'United States', '1'); +INSERT INTO `statistic_affdistribute` VALUES ('77', 'University of Michigan, Ann Arbor', 'United States', '1'); +INSERT INTO `statistic_affdistribute` VALUES ('78', 'Netflix Inc.', 'United States', '1'); +INSERT INTO `statistic_affdistribute` VALUES ('79', 'Rice University', 'United States', '1'); +INSERT INTO `statistic_affdistribute` VALUES ('80', 'AT&T Labs Research', 'United States', '1'); +INSERT INTO `statistic_affdistribute` VALUES ('81', 'Toyota Technical Institute at Chicago', 'United States', '1'); +INSERT INTO `statistic_affdistribute` VALUES ('82', 'Princeton University', 'United States', '1'); +INSERT INTO `statistic_affdistribute` VALUES ('83', 'University of Texas at Arlington', 'United States', '1'); +INSERT INTO `statistic_affdistribute` VALUES ('84', 'Syracuse University', 'United States', '1'); +INSERT INTO `statistic_affdistribute` VALUES ('85', 'University of North Carolina at Chapel Hill', 'United States', '1'); +INSERT INTO `statistic_affdistribute` VALUES ('86', 'The Pennsylvania State University', 'United States', '1'); +INSERT INTO `statistic_affdistribute` VALUES ('87', 'University of Wisconsin-Madison', 'United States', '1'); +INSERT INTO `statistic_affdistribute` VALUES ('88', 'Snap Inc.', 'United States', '1'); +INSERT INTO `statistic_affdistribute` VALUES ('89', 'University of Illinois at Urbana–Champaign', 'United States', '1'); +INSERT INTO `statistic_affdistribute` VALUES ('90', 'Siemens Healthineers', 'United States', '1'); +INSERT INTO `statistic_affdistribute` VALUES ('91', 'IHMC', 'United States', '1'); +INSERT INTO `statistic_affdistribute` VALUES ('92', 'University of Massachusetts Boston', 'United States', '1'); +INSERT INTO `statistic_affdistribute` VALUES ('93', 'University of Rochester', 'United States', '1'); +INSERT INTO `statistic_affdistribute` VALUES ('94', 'Information Sciences Institute, USC', 'United States', '1'); +INSERT INTO `statistic_affdistribute` VALUES ('95', 'North Carolina State University', 'United States', '1'); +INSERT INTO `statistic_affdistribute` VALUES ('96', 'Allen Institute for Artificial Intelligence', 'United States', '1'); +INSERT INTO `statistic_affdistribute` VALUES ('97', 'Wright State University', 'United States', '1'); +INSERT INTO `statistic_affdistribute` VALUES ('98', 'University of Illinois at Urbana Champaign', 'United States', '1'); +INSERT INTO `statistic_affdistribute` VALUES ('99', 'University of Colorado at Boulder', 'United States', '1'); +INSERT INTO `statistic_affdistribute` VALUES ('100', 'Bloomberg LP', 'United States', '1'); +INSERT INTO `statistic_affdistribute` VALUES ('101', 'Yale University', 'United States', '1'); +INSERT INTO `statistic_affdistribute` VALUES ('102', 'University of Utah', 'United States', '1'); +INSERT INTO `statistic_affdistribute` VALUES ('103', 'University of Oregon', 'United States', '1'); +INSERT INTO `statistic_affdistribute` VALUES ('104', 'University of Colorado, Boulder', 'United States', '1'); +INSERT INTO `statistic_affdistribute` VALUES ('105', 'Clemson University', 'United States', '1'); +INSERT INTO `statistic_affdistribute` VALUES ('106', 'UC Irvine', 'United States', '1'); +INSERT INTO `statistic_affdistribute` VALUES ('107', 'The University of Memphis', 'United States', '1'); +INSERT INTO `statistic_affdistribute` VALUES ('108', 'Colorado School of Mines', 'United States', '1'); +INSERT INTO `statistic_affdistribute` VALUES ('109', 'University of Marylandaltimore County', 'United States', '1'); +INSERT INTO `statistic_affdistribute` VALUES ('110', 'University of Central Florida', 'United States', '1'); +INSERT INTO `statistic_affdistribute` VALUES ('111', 'The University of Texas at Austin', 'United States', '1'); +INSERT INTO `statistic_affdistribute` VALUES ('112', 'VMware Research', 'United States', '1'); +INSERT INTO `statistic_affdistribute` VALUES ('113', 'Georgia Tech', 'United States', '1'); +INSERT INTO `statistic_affdistribute` VALUES ('114', 'New York University Tandon School of Engineering', 'United States', '1'); +INSERT INTO `statistic_affdistribute` VALUES ('115', 'Amazon', 'United States', '1'); +INSERT INTO `statistic_affdistribute` VALUES ('116', 'Chinese Academy of Sciences', 'China', '40'); +INSERT INTO `statistic_affdistribute` VALUES ('117', 'Tsinghua University', 'China', '38'); +INSERT INTO `statistic_affdistribute` VALUES ('118', 'Shanghai Jiao Tong University', 'China', '21'); +INSERT INTO `statistic_affdistribute` VALUES ('119', 'Peking University', 'China', '20'); +INSERT INTO `statistic_affdistribute` VALUES ('120', 'Beihang University', 'China', '14'); +INSERT INTO `statistic_affdistribute` VALUES ('121', 'Zhejiang University', 'China', '12'); +INSERT INTO `statistic_affdistribute` VALUES ('122', 'University of Science and Technology of China', 'China', '12'); +INSERT INTO `statistic_affdistribute` VALUES ('123', 'Nanjing University', 'China', '11'); +INSERT INTO `statistic_affdistribute` VALUES ('124', 'Fudan University', 'China', '9'); +INSERT INTO `statistic_affdistribute` VALUES ('125', 'Sun Yat-sen University', 'China', '9'); +INSERT INTO `statistic_affdistribute` VALUES ('126', 'Northeastern University', 'China', '7'); +INSERT INTO `statistic_affdistribute` VALUES ('127', 'Tianjin University', 'China', '7'); +INSERT INTO `statistic_affdistribute` VALUES ('128', 'Xidian University', 'China', '7'); +INSERT INTO `statistic_affdistribute` VALUES ('129', 'Harbin Institute of Technology', 'China', '6'); +INSERT INTO `statistic_affdistribute` VALUES ('130', 'Beijing Institute of Technology', 'China', '6'); +INSERT INTO `statistic_affdistribute` VALUES ('131', 'East China Normal University', 'China', '5'); +INSERT INTO `statistic_affdistribute` VALUES ('132', 'University of Electronic Science and Technology of China', 'China', '5'); +INSERT INTO `statistic_affdistribute` VALUES ('133', 'Nankai University', 'China', '5'); +INSERT INTO `statistic_affdistribute` VALUES ('134', 'Tencent', 'China', '5'); +INSERT INTO `statistic_affdistribute` VALUES ('135', 'Alibaba Group', 'China', '5'); +INSERT INTO `statistic_affdistribute` VALUES ('136', 'Southeast University', 'China', '4'); +INSERT INTO `statistic_affdistribute` VALUES ('137', 'Xiamen University', 'China', '4'); +INSERT INTO `statistic_affdistribute` VALUES ('138', 'National University of Defense Technology', 'China', '4'); +INSERT INTO `statistic_affdistribute` VALUES ('139', 'Soochow University', 'China', '3'); +INSERT INTO `statistic_affdistribute` VALUES ('140', 'Dalian University of Technology', 'China', '3'); +INSERT INTO `statistic_affdistribute` VALUES ('141', 'Nanjing University of Science and Technology', 'China', '3'); +INSERT INTO `statistic_affdistribute` VALUES ('142', 'Beijing University of Posts and Telecommunications', 'China', '2'); +INSERT INTO `statistic_affdistribute` VALUES ('143', 'Wuhan University', 'China', '2'); +INSERT INTO `statistic_affdistribute` VALUES ('144', 'Anhui University', 'China', '2'); +INSERT INTO `statistic_affdistribute` VALUES ('145', 'South China University of Technology', 'China', '2'); +INSERT INTO `statistic_affdistribute` VALUES ('146', 'Huazhong University of Science and Technology', 'China', '2'); +INSERT INTO `statistic_affdistribute` VALUES ('147', 'Beijing Etrol Technologies Co., Ltd.', 'China', '2'); +INSERT INTO `statistic_affdistribute` VALUES ('148', 'Beijing Electronic Science and Technology Institute', 'China', '1'); +INSERT INTO `statistic_affdistribute` VALUES ('149', 'Ant Financial Services Group', 'China', '1'); +INSERT INTO `statistic_affdistribute` VALUES ('150', 'Shandong University', 'China', '1'); +INSERT INTO `statistic_affdistribute` VALUES ('151', 'iDST', 'China', '1'); +INSERT INTO `statistic_affdistribute` VALUES ('152', 'JD.com', 'China', '1'); +INSERT INTO `statistic_affdistribute` VALUES ('153', 'Hebei University of Technology', 'China', '1'); +INSERT INTO `statistic_affdistribute` VALUES ('154', 'South China Normal University', 'China', '1'); +INSERT INTO `statistic_affdistribute` VALUES ('155', 'Jilin University', 'China', '1'); +INSERT INTO `statistic_affdistribute` VALUES ('156', 'Beijing University of Technology', 'China', '1'); +INSERT INTO `statistic_affdistribute` VALUES ('157', 'Jianghan University', 'China', '1'); +INSERT INTO `statistic_affdistribute` VALUES ('158', 'Guangdong University of Technology', 'China', '1'); +INSERT INTO `statistic_affdistribute` VALUES ('159', 'Jinan University', 'China', '1'); +INSERT INTO `statistic_affdistribute` VALUES ('160', 'ShanghaiTech University', 'China', '1'); +INSERT INTO `statistic_affdistribute` VALUES ('161', 'University of Macau', 'China', '1'); +INSERT INTO `statistic_affdistribute` VALUES ('162', 'Tianjin University of Technology', 'China', '1'); +INSERT INTO `statistic_affdistribute` VALUES ('163', 'Nanjing University of Posts and Telecommunications', 'China', '1'); +INSERT INTO `statistic_affdistribute` VALUES ('164', 'Nanjing University of Aeronautics and Astronautics', 'China', '1'); +INSERT INTO `statistic_affdistribute` VALUES ('165', 'Chongqing University', 'China', '1'); +INSERT INTO `statistic_affdistribute` VALUES ('166', 'Baidu', 'China', '1'); +INSERT INTO `statistic_affdistribute` VALUES ('167', 'UESTC', 'China', '1'); +INSERT INTO `statistic_affdistribute` VALUES ('168', 'School of Automation, Northwestern Polytechnical University', 'China', '1'); +INSERT INTO `statistic_affdistribute` VALUES ('169', 'Hefei University of Technology', 'China', '1'); +INSERT INTO `statistic_affdistribute` VALUES ('170', 'Beijing Samsung Telecommunication', 'China', '1'); +INSERT INTO `statistic_affdistribute` VALUES ('171', 'SenseTime Group Limited', 'China', '1'); +INSERT INTO `statistic_affdistribute` VALUES ('172', 'Center for Research on Intelligent Perception and Computing', 'China', '1'); +INSERT INTO `statistic_affdistribute` VALUES ('173', 'Nanyang Technological University', 'Singapore', '21'); +INSERT INTO `statistic_affdistribute` VALUES ('174', 'National University of Singapore', 'Singapore', '6'); +INSERT INTO `statistic_affdistribute` VALUES ('175', 'Singapore Management University', 'Singapore', '4'); +INSERT INTO `statistic_affdistribute` VALUES ('176', 'Singapore University of Technology and Design', 'Singapore', '3'); +INSERT INTO `statistic_affdistribute` VALUES ('177', 'Institute of High Performance Computing, A*STAR', 'Singapore', '1'); +INSERT INTO `statistic_affdistribute` VALUES ('178', 'The University of Hong Kong', 'Hong Kong', '12'); +INSERT INTO `statistic_affdistribute` VALUES ('179', 'The Hong Kong Polytechnic University', 'Hong Kong', '7'); +INSERT INTO `statistic_affdistribute` VALUES ('180', 'Hong Kong University of Science and Technology', 'Hong Kong', '6'); +INSERT INTO `statistic_affdistribute` VALUES ('181', 'Hong Kong Baptist University', 'Hong Kong', '4'); +INSERT INTO `statistic_affdistribute` VALUES ('182', 'City University of Hong Kong', 'Hong Kong', '1'); +INSERT INTO `statistic_affdistribute` VALUES ('183', 'The University of Technology Sydney', 'Australia', '8'); +INSERT INTO `statistic_affdistribute` VALUES ('184', 'The University of New South Wales', 'Australia', '4'); +INSERT INTO `statistic_affdistribute` VALUES ('185', 'Data61', 'Australia', '4'); +INSERT INTO `statistic_affdistribute` VALUES ('186', 'Australian National University', 'Australia', '3'); +INSERT INTO `statistic_affdistribute` VALUES ('187', 'The University of Sydney', 'Australia', '3'); +INSERT INTO `statistic_affdistribute` VALUES ('188', 'The University of Melbourne', 'Australia', '3'); +INSERT INTO `statistic_affdistribute` VALUES ('189', 'UNSW Sydney', 'Australia', '3'); +INSERT INTO `statistic_affdistribute` VALUES ('190', 'CSIRO', 'Australia', '3'); +INSERT INTO `statistic_affdistribute` VALUES ('191', 'The University of Adelaide', 'Australia', '2'); +INSERT INTO `statistic_affdistribute` VALUES ('192', 'University of Wollongong', 'Australia', '2'); +INSERT INTO `statistic_affdistribute` VALUES ('193', 'Griffith University', 'Australia', '2'); +INSERT INTO `statistic_affdistribute` VALUES ('194', 'Monash University', 'Australia', '1'); +INSERT INTO `statistic_affdistribute` VALUES ('195', 'The University of Queensland', 'Australia', '1'); +INSERT INTO `statistic_affdistribute` VALUES ('196', 'Gold Coast Campus', 'Australia', '1'); +INSERT INTO `statistic_affdistribute` VALUES ('197', 'University of Oxford', 'United Kingdom', '10'); +INSERT INTO `statistic_affdistribute` VALUES ('198', 'Imperial College London', 'United Kingdom', '3'); +INSERT INTO `statistic_affdistribute` VALUES ('199', 'University College London', 'United Kingdom', '3'); +INSERT INTO `statistic_affdistribute` VALUES ('200', 'Cardiff University', 'United Kingdom', '2'); +INSERT INTO `statistic_affdistribute` VALUES ('201', 'University of Edinburgh', 'United Kingdom', '2'); +INSERT INTO `statistic_affdistribute` VALUES ('202', 'DeepMind', 'United Kingdom', '2'); +INSERT INTO `statistic_affdistribute` VALUES ('203', 'University of Southampton', 'United Kingdom', '1'); +INSERT INTO `statistic_affdistribute` VALUES ('204', 'University of Sheffield', 'United Kingdom', '1'); +INSERT INTO `statistic_affdistribute` VALUES ('205', 'Oxford University', 'United Kingdom', '1'); +INSERT INTO `statistic_affdistribute` VALUES ('206', 'Queen Mary University of London', 'United Kingdom', '1'); +INSERT INTO `statistic_affdistribute` VALUES ('207', 'PROWLER.io', 'United Kingdom', '1'); +INSERT INTO `statistic_affdistribute` VALUES ('208', 'The University of Liverpool', 'United Kingdom', '1'); +INSERT INTO `statistic_affdistribute` VALUES ('209', 'University of Kent, UK', 'United Kingdom', '1'); +INSERT INTO `statistic_affdistribute` VALUES ('210', 'University of East Anglia', 'United Kingdom', '1'); +INSERT INTO `statistic_affdistribute` VALUES ('211', 'University of Cambridge', 'United Kingdom', '1'); +INSERT INTO `statistic_affdistribute` VALUES ('212', 'Northwestern Polytechnical University', 'United Kingdom', '1'); +INSERT INTO `statistic_affdistribute` VALUES ('213', 'The University of Tokyo', 'Japan', '10'); +INSERT INTO `statistic_affdistribute` VALUES ('214', 'Nara Institute of Science and Technology', 'Japan', '3'); +INSERT INTO `statistic_affdistribute` VALUES ('215', 'Nippon Telegraph and Telephone Corporation', 'Japan', '2'); +INSERT INTO `statistic_affdistribute` VALUES ('216', 'Advanced Telecommunications Research Institute International (ATR)', 'Japan', '1'); +INSERT INTO `statistic_affdistribute` VALUES ('217', 'Tokyo Institute of Technology', 'Japan', '1'); +INSERT INTO `statistic_affdistribute` VALUES ('218', 'Nagoya Institute of Technology', 'Japan', '1'); +INSERT INTO `statistic_affdistribute` VALUES ('219', 'RIKEN AIP', 'Japan', '1'); +INSERT INTO `statistic_affdistribute` VALUES ('220', 'Hokkaido University', 'Japan', '1'); +INSERT INTO `statistic_affdistribute` VALUES ('221', 'scouty Inc.', 'Japan', '1'); +INSERT INTO `statistic_affdistribute` VALUES ('222', 'SOKENDAI (The Graduate University for Advanced Studies)', 'Japan', '1'); +INSERT INTO `statistic_affdistribute` VALUES ('223', 'National Institute of Advanced Industrial Science and Technology', 'Japan', '1'); +INSERT INTO `statistic_affdistribute` VALUES ('224', 'Keio University', 'Japan', '1'); +INSERT INTO `statistic_affdistribute` VALUES ('225', 'R&D Group, Hitachi', 'Japan', '1'); +INSERT INTO `statistic_affdistribute` VALUES ('226', 'Osaka University', 'Japan', '1'); +INSERT INTO `statistic_affdistribute` VALUES ('227', 'Fujitsu Laboratories Ltd.', 'Japan', '1'); +INSERT INTO `statistic_affdistribute` VALUES ('228', 'Tohoku University', 'Japan', '1'); +INSERT INTO `statistic_affdistribute` VALUES ('229', 'Yokohama National University', 'Japan', '1'); +INSERT INTO `statistic_affdistribute` VALUES ('230', 'National Institute of Information and Communications Technology', 'Japan', '1'); +INSERT INTO `statistic_affdistribute` VALUES ('231', 'TU Dortmund University', 'Germany', '3'); +INSERT INTO `statistic_affdistribute` VALUES ('232', 'University of Freiburg', 'Germany', '2'); +INSERT INTO `statistic_affdistribute` VALUES ('233', 'Leipzig University', 'Germany', '2'); +INSERT INTO `statistic_affdistribute` VALUES ('234', 'TU Darmstadt', 'Germany', '2'); +INSERT INTO `statistic_affdistribute` VALUES ('235', 'Max Planck Institute for Software Systems (MPI-SWS)', 'Germany', '1'); +INSERT INTO `statistic_affdistribute` VALUES ('236', 'TU Berlin', 'Germany', '1'); +INSERT INTO `statistic_affdistribute` VALUES ('237', 'University of Tübingen', 'Germany', '1'); +INSERT INTO `statistic_affdistribute` VALUES ('238', 'Heinrich-Heine-Universität Düsseldorf', 'Germany', '1'); +INSERT INTO `statistic_affdistribute` VALUES ('239', 'University of Bremen', 'Germany', '1'); +INSERT INTO `statistic_affdistribute` VALUES ('240', 'Max Planck Institute for Informatics', 'Germany', '1'); +INSERT INTO `statistic_affdistribute` VALUES ('241', 'Technical University of Munich', 'Germany', '1'); +INSERT INTO `statistic_affdistribute` VALUES ('242', 'Paderborn University', 'Germany', '1'); +INSERT INTO `statistic_affdistribute` VALUES ('243', 'MPI-SWS', 'Germany', '1'); +INSERT INTO `statistic_affdistribute` VALUES ('244', 'University of Mannheim', 'Germany', '1'); +INSERT INTO `statistic_affdistribute` VALUES ('245', 'Technische Universität Darmstadt', 'Germany', '1'); +INSERT INTO `statistic_affdistribute` VALUES ('246', 'University of Passau', 'Germany', '1'); +INSERT INTO `statistic_affdistribute` VALUES ('247', 'Bielefeld University', 'Germany', '1'); +INSERT INTO `statistic_affdistribute` VALUES ('248', 'Max Planck Institute Informatics', 'Germany', '1'); +INSERT INTO `statistic_affdistribute` VALUES ('249', 'Ulm University', 'Germany', '1'); +INSERT INTO `statistic_affdistribute` VALUES ('250', 'JMU Würzburg', 'Germany', '1'); +INSERT INTO `statistic_affdistribute` VALUES ('251', 'CISPA, Saarland University', 'Germany', '1'); +INSERT INTO `statistic_affdistribute` VALUES ('252', 'University of Heidelberg', 'Germany', '1'); +INSERT INTO `statistic_affdistribute` VALUES ('253', 'Hasso Plattner Institute', 'Germany', '1'); +INSERT INTO `statistic_affdistribute` VALUES ('254', 'Indian Institute of Science', 'India', '3'); +INSERT INTO `statistic_affdistribute` VALUES ('255', 'IIT Bombay', 'India', '3'); +INSERT INTO `statistic_affdistribute` VALUES ('256', 'IIIT Delhi', 'India', '3'); +INSERT INTO `statistic_affdistribute` VALUES ('257', 'Tata Institute of Fundamental Research, Mumbai', 'India', '2'); +INSERT INTO `statistic_affdistribute` VALUES ('258', 'Indian Institute of Technology Madras', 'India', '2'); +INSERT INTO `statistic_affdistribute` VALUES ('259', 'Indian Institute of Science (IISc), Bangalore', 'India', '2'); +INSERT INTO `statistic_affdistribute` VALUES ('260', 'Tata Consultancy Services', 'India', '1'); +INSERT INTO `statistic_affdistribute` VALUES ('261', 'University of Toronto', 'Canada', '3'); +INSERT INTO `statistic_affdistribute` VALUES ('262', 'University of Alberta', 'Canada', '3'); +INSERT INTO `statistic_affdistribute` VALUES ('263', 'University of British Columbia', 'Canada', '3'); +INSERT INTO `statistic_affdistribute` VALUES ('264', 'McGill University', 'Canada', '3'); +INSERT INTO `statistic_affdistribute` VALUES ('265', 'University of Waterloo', 'Canada', '2'); +INSERT INTO `statistic_affdistribute` VALUES ('266', 'York University', 'Canada', '1'); +INSERT INTO `statistic_affdistribute` VALUES ('267', 'National Research Council of Canada', 'Canada', '1'); +INSERT INTO `statistic_affdistribute` VALUES ('268', 'Dalhousie University', 'Canada', '1'); +INSERT INTO `statistic_affdistribute` VALUES ('269', 'Quest University Canada', 'Canada', '1'); + +-- ---------------------------- +-- Table structure for `users_emailverifyrecord` +-- ---------------------------- +DROP TABLE IF EXISTS `users_emailverifyrecord`; +CREATE TABLE `users_emailverifyrecord` ( + `id` int(11) NOT NULL AUTO_INCREMENT, + `code` varchar(20) NOT NULL, + `email` varchar(50) NOT NULL, + `send_type` varchar(10) NOT NULL, + `send_time` datetime(6) NOT NULL, + PRIMARY KEY (`id`) +) ENGINE=InnoDB AUTO_INCREMENT=31 DEFAULT CHARSET=utf8; + +-- ---------------------------- +-- Records of users_emailverifyrecord +-- ---------------------------- +INSERT INTO `users_emailverifyrecord` VALUES ('4', 'NbmzFV1MSXnPAV8b', '806990106@qq.com', 'register', '2019-03-06 13:39:56.466363'); +INSERT INTO `users_emailverifyrecord` VALUES ('5', 'ijFhcTd1fOiSJK3q', '806990106@qq.com', 'register', '2019-03-06 13:48:06.554412'); +INSERT INTO `users_emailverifyrecord` VALUES ('6', 'bbt7XrpH3Oj2R9zH', '806990106@qq.com', 'register', '2019-03-06 14:01:24.030501'); +INSERT INTO `users_emailverifyrecord` VALUES ('7', 'HyiAn8BndikeqPxP', '806990106@qq.com', 'register', '2019-03-06 14:09:05.418572'); +INSERT INTO `users_emailverifyrecord` VALUES ('8', '5sW8pnzyz4NwHDO6', '806990106@qq.com', 'register', '2019-03-06 14:14:25.121324'); +INSERT INTO `users_emailverifyrecord` VALUES ('9', 'q4SVVpGqKcZudWoP', '806990106@qq.com', 'register', '2019-03-06 14:15:46.893148'); +INSERT INTO `users_emailverifyrecord` VALUES ('10', 'oUriLp3ysQAcyxkL', 'lin@foxmail.com', 'register', '2019-04-17 11:50:51.878253'); +INSERT INTO `users_emailverifyrecord` VALUES ('11', 'Zrcq6VdhOhROxkwA', 'ling@foxmail.com', 'register', '2019-04-17 11:51:49.940044'); +INSERT INTO `users_emailverifyrecord` VALUES ('12', 'C28ag3s7ksDgYhkm', '806990106@qq.com', 'register', '2019-04-22 21:42:40.577705'); +INSERT INTO `users_emailverifyrecord` VALUES ('13', 'vVbUvREwWCyTjb7e', '806990106@qq.com', 'register', '2019-04-22 21:54:00.721263'); +INSERT INTO `users_emailverifyrecord` VALUES ('14', '4B2iONYOZN0dLpTj', '806990106@qq.com', 'register', '2019-04-22 22:00:19.811988'); +INSERT INTO `users_emailverifyrecord` VALUES ('15', 'KWPckEO9ptd9qCyk', '806990106@qq.com', 'register', '2019-04-22 22:08:49.692400'); +INSERT INTO `users_emailverifyrecord` VALUES ('16', 'ZxXKmTf2N7SX88bP', '806990106@qq.com', 'register', '2019-04-22 22:10:35.841870'); +INSERT INTO `users_emailverifyrecord` VALUES ('17', 'aGLoLJhwK8C3gNOA', '806990106@qq.com', 'register', '2019-04-22 22:23:52.197163'); +INSERT INTO `users_emailverifyrecord` VALUES ('18', 'PDrtNzfwNrFWTWYT', '806990106@qq.com', 'forget', '2019-04-22 22:25:38.313401'); +INSERT INTO `users_emailverifyrecord` VALUES ('19', 'OIEXYNcMWiRSuNH1', '8888888@qq.com', 'register', '2019-04-24 12:08:09.121799'); +INSERT INTO `users_emailverifyrecord` VALUES ('20', 'fA7CZyy5C6a5IVWn', 'shiliang5804@foxmail.com', 'register', '2019-04-24 18:48:53.967293'); +INSERT INTO `users_emailverifyrecord` VALUES ('21', 'ptLLhXw0gbhx7q57', 'shiliang6402@foxmail.com', 'register', '2019-04-30 23:23:39.132007'); +INSERT INTO `users_emailverifyrecord` VALUES ('22', 'l8udEP48k7kuaGqX', 'shiliang6402@foxmail.com', 'forget', '2019-05-01 10:30:21.312610'); +INSERT INTO `users_emailverifyrecord` VALUES ('23', 'LjIWJ7M8fhQ8GIxT', 'shiliang6402@foxmail.com', 'forget', '2019-05-01 10:31:42.848339'); +INSERT INTO `users_emailverifyrecord` VALUES ('24', 'FJczm9lvWWuTkQPJ', '2313696922@qq.com', 'register', '2019-05-03 14:01:11.246533'); +INSERT INTO `users_emailverifyrecord` VALUES ('25', 'QBkqoMOiSm7c7RJ1', '540378302@qq.com', 'register', '2019-05-16 23:22:52.000000'); +INSERT INTO `users_emailverifyrecord` VALUES ('26', 'QSPNk40Xr4zh5coh', '540378302@qq.com', 'register', '2019-05-16 23:41:22.000000'); +INSERT INTO `users_emailverifyrecord` VALUES ('27', '6ncahDBqirBbRZGN', '540378302@qq.com', 'register', '2019-05-16 23:44:41.000000'); +INSERT INTO `users_emailverifyrecord` VALUES ('28', 'iMvmTREIoDGDImvF', '540378302@qq.com', 'register', '2019-05-16 23:48:27.000000'); +INSERT INTO `users_emailverifyrecord` VALUES ('29', 'hzqyfZMSVPfo3bKo', '540378302@qq.com', 'forget', '2019-05-17 00:37:04.000000'); +INSERT INTO `users_emailverifyrecord` VALUES ('30', 'ZoI4KpqWULGDaGrG', '540378302@qq.com', 'register', '2019-05-17 17:27:11.000000'); + +-- ---------------------------- +-- Table structure for `users_userprofile` +-- ---------------------------- +DROP TABLE IF EXISTS `users_userprofile`; +CREATE TABLE `users_userprofile` ( + `id` int(11) NOT NULL AUTO_INCREMENT, + `password` varchar(128) NOT NULL, + `last_login` datetime(6) DEFAULT NULL, + `is_superuser` tinyint(1) NOT NULL, + `username` varchar(150) NOT NULL, + `first_name` varchar(30) NOT NULL, + `last_name` varchar(150) NOT NULL, + `email` varchar(254) NOT NULL, + `is_staff` tinyint(1) NOT NULL, + `is_active` tinyint(1) NOT NULL, + `date_joined` datetime(6) NOT NULL, + `nick_name` varchar(50) NOT NULL, + `birthday` date DEFAULT NULL, + `gender` varchar(6) NOT NULL, + `address` varchar(100) DEFAULT NULL, + `mobile` varchar(11) DEFAULT NULL, + `image` varchar(100) NOT NULL, + PRIMARY KEY (`id`), + UNIQUE KEY `username` (`username`) USING BTREE +) ENGINE=InnoDB AUTO_INCREMENT=28 DEFAULT CHARSET=utf8; + +-- ---------------------------- +-- Records of users_userprofile +-- ---------------------------- +INSERT INTO `users_userprofile` VALUES ('1', 'pbkdf2_sha256$100000$8rDr0bxCFsBp$eIqDRI+qk0dJ4JRxwoPFUNjW22WogK+EgSaFpzWCQYI=', '2019-04-17 12:25:01.573290', '1', 'shiliang@foxmail.com', '', '', 'shiliang@foxmail.com', '1', '1', '2019-03-06 13:07:19.133721', '', null, 'male', '', null, 'media/image/default/Entity/user_default.png'); +INSERT INTO `users_userprofile` VALUES ('18', 'pbkdf2_sha256$100000$vGSDGDU3qYR9$3PuaiB+bB1+7tsKCf9JoTCHsSvN1MIHjstcqUl68F2M=', '2019-06-01 11:44:21.000000', '1', '806990106@qq.com', '', '若水', '806990106@qq.com', '1', '1', '2019-04-03 10:52:00.000000', 'Sparks_fly', '2018-04-23', 'male', '北京市海淀区中关村', '13811112222', 'image/2019/06/default_middile_7.png'); +INSERT INTO `users_userprofile` VALUES ('20', 'pbkdf2_sha256$100000$p58RjT0A44YY$GozgqZMp9Ufks9aaJP/xI9qiVxzrvChY742Qm+xeRwk=', '2019-04-24 18:51:00.000000', '1', 'shiliang5804@foxmail.com', '', '', 'shiliang5804@foxmail.com', '1', '1', '2019-04-24 18:48:00.000000', '池里的鱼', '2019-04-10', 'female', '贵州', null, 'image/2019/04/default_middile_8_yBrSeed.png'); +INSERT INTO `users_userprofile` VALUES ('21', 'pbkdf2_sha256$100000$xQ0tzL2LU0cu$AV6HKJcl2bPuo9RJ057FVgMCASMb8g/N9gKc2KsZta4=', '2019-06-01 11:43:44.000000', '0', 'shiliang6402@foxmail.com', '', '', 'shiliang6402@foxmail.com', '0', '1', '2019-04-30 23:23:38.869160', '', null, 'male', null, null, 'image/default/Entity/user_default.png'); +INSERT INTO `users_userprofile` VALUES ('22', 'pbkdf2_sha256$100000$9cKHzhYx2kk4$vsDbIl4UoYgLb1Dl0O2kpBQsOwW59Y9Z916l8XDILk0=', null, '0', '2313696922@qq.com', '', '', '2313696922@qq.com', '0', '0', '2019-05-03 14:01:00.000000', 'mtb', null, 'male', null, null, 'image/2019/05/default_middile_2.png'); +INSERT INTO `users_userprofile` VALUES ('27', 'pbkdf2_sha256$100000$jzeyTMf61f6G$R+v00CUqO/TOIkXbsxnILk+Pi5uxmkUT69yGa8pwVaQ=', '2019-05-17 17:27:41.000000', '0', '540378302@qq.com', '', '', '540378302@qq.com', '0', '1', '2019-05-17 17:27:11.000000', '', null, 'male', null, null, 'image/default/Entity/user_default.png'); + +-- ---------------------------- +-- Table structure for `users_userprofile_groups` +-- ---------------------------- +DROP TABLE IF EXISTS `users_userprofile_groups`; +CREATE TABLE `users_userprofile_groups` ( + `id` int(11) NOT NULL AUTO_INCREMENT, + `userprofile_id` int(11) NOT NULL, + `group_id` int(11) NOT NULL, + PRIMARY KEY (`id`), + UNIQUE KEY `users_userprofile_groups_userprofile_id_group_id_823cf2fc_uniq` (`userprofile_id`,`group_id`) USING BTREE, + KEY `users_userprofile_groups_group_id_3de53dbf_fk_auth_group_id` (`group_id`) USING BTREE, + CONSTRAINT `users_userprofile_groups_ibfk_1` FOREIGN KEY (`userprofile_id`) REFERENCES `users_userprofile` (`id`), + CONSTRAINT `users_userprofile_groups_ibfk_2` FOREIGN KEY (`group_id`) REFERENCES `auth_group` (`id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; + +-- ---------------------------- +-- Records of users_userprofile_groups +-- ---------------------------- + +-- ---------------------------- +-- Table structure for `users_userprofile_user_permissions` +-- ---------------------------- +DROP TABLE IF EXISTS `users_userprofile_user_permissions`; +CREATE TABLE `users_userprofile_user_permissions` ( + `id` int(11) NOT NULL AUTO_INCREMENT, + `userprofile_id` int(11) NOT NULL, + `permission_id` int(11) NOT NULL, + PRIMARY KEY (`id`), + UNIQUE KEY `users_userprofile_user_p_userprofile_id_permissio_d0215190_uniq` (`userprofile_id`,`permission_id`) USING BTREE, + KEY `users_userprofile_us_permission_id_393136b6_fk_auth_perm` (`permission_id`) USING BTREE, + CONSTRAINT `users_userprofile_user_permissions_ibfk_1` FOREIGN KEY (`permission_id`) REFERENCES `auth_permission` (`id`), + CONSTRAINT `users_userprofile_user_permissions_ibfk_2` FOREIGN KEY (`userprofile_id`) REFERENCES `users_userprofile` (`id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; + +-- ---------------------------- +-- Records of users_userprofile_user_permissions +-- ---------------------------- + +-- ---------------------------- +-- Table structure for `xadmin_bookmark` +-- ---------------------------- +DROP TABLE IF EXISTS `xadmin_bookmark`; +CREATE TABLE `xadmin_bookmark` ( + `id` int(11) NOT NULL AUTO_INCREMENT, + `title` varchar(128) NOT NULL, + `url_name` varchar(64) NOT NULL, + `query` varchar(1000) NOT NULL, + `is_share` tinyint(1) NOT NULL, + `content_type_id` int(11) NOT NULL, + `user_id` int(11) DEFAULT NULL, + PRIMARY KEY (`id`), + KEY `xadmin_bookmark_content_type_id_60941679_fk_django_co` (`content_type_id`) USING BTREE, + KEY `xadmin_bookmark_user_id_42d307fc_fk_users_userprofile_id` (`user_id`) USING BTREE, + CONSTRAINT `xadmin_bookmark_ibfk_1` FOREIGN KEY (`content_type_id`) REFERENCES `django_content_type` (`id`), + CONSTRAINT `xadmin_bookmark_ibfk_2` FOREIGN KEY (`user_id`) REFERENCES `users_userprofile` (`id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; + +-- ---------------------------- +-- Records of xadmin_bookmark +-- ---------------------------- + +-- ---------------------------- +-- Table structure for `xadmin_log` +-- ---------------------------- +DROP TABLE IF EXISTS `xadmin_log`; +CREATE TABLE `xadmin_log` ( + `id` int(11) NOT NULL AUTO_INCREMENT, + `action_time` datetime(6) NOT NULL, + `ip_addr` char(39) DEFAULT NULL, + `object_id` longtext, + `object_repr` varchar(200) NOT NULL, + `action_flag` varchar(32) NOT NULL, + `message` longtext NOT NULL, + `content_type_id` int(11) DEFAULT NULL, + `user_id` int(11) NOT NULL, + PRIMARY KEY (`id`), + KEY `xadmin_log_content_type_id_2a6cb852_fk_django_content_type_id` (`content_type_id`) USING BTREE, + KEY `xadmin_log_user_id_bb16a176_fk_users_userprofile_id` (`user_id`) USING BTREE, + CONSTRAINT `xadmin_log_ibfk_1` FOREIGN KEY (`content_type_id`) REFERENCES `django_content_type` (`id`), + CONSTRAINT `xadmin_log_ibfk_2` FOREIGN KEY (`user_id`) REFERENCES `users_userprofile` (`id`) +) ENGINE=InnoDB AUTO_INCREMENT=9 DEFAULT CHARSET=utf8; + +-- ---------------------------- +-- Records of xadmin_log +-- ---------------------------- +INSERT INTO `xadmin_log` VALUES ('1', '2019-04-24 11:12:20.303653', '127.0.0.1', '18', '806990106@qq.com', 'change', '修改 last_login,nick_name,address 和 image', '6', '18'); +INSERT INTO `xadmin_log` VALUES ('2', '2019-04-24 11:26:01.159742', '127.0.0.1', '18', '806990106@qq.com', 'change', '修改 last_login,nick_name,address 和 image', '6', '18'); +INSERT INTO `xadmin_log` VALUES ('3', '2019-04-24 12:01:51.052403', '127.0.0.1', '18', '806990106@qq.com', 'change', '修改 last_login,last_name,email,date_joined,nick_name,birthday,address,mobile 和 image', '6', '18'); +INSERT INTO `xadmin_log` VALUES ('4', '2019-04-24 18:58:37.665413', '127.0.0.1', '20', 'shiliang5804@foxmail.com', 'change', '修改 last_login,is_superuser,is_staff 和 image', '6', '18'); +INSERT INTO `xadmin_log` VALUES ('5', '2019-05-01 15:36:54.113557', '127.0.0.1', '18', '806990106@qq.com', 'change', '修改 last_login,last_name 和 image', '6', '18'); +INSERT INTO `xadmin_log` VALUES ('6', '2019-05-01 15:38:19.139602', '127.0.0.1', null, '', 'delete', '批量删除 3 个 用户信息', null, '18'); +INSERT INTO `xadmin_log` VALUES ('7', '2019-05-01 15:46:12.758166', '127.0.0.1', null, '', 'delete', '批量删除 3 个 邮箱验证码', null, '18'); +INSERT INTO `xadmin_log` VALUES ('8', '2019-05-03 14:26:20.247919', '127.0.0.1', '22', '2313696922@qq.com', 'change', '修改 nick_name 和 image', '6', '18'); + +-- ---------------------------- +-- Table structure for `xadmin_usersettings` +-- ---------------------------- +DROP TABLE IF EXISTS `xadmin_usersettings`; +CREATE TABLE `xadmin_usersettings` ( + `id` int(11) NOT NULL AUTO_INCREMENT, + `key` varchar(256) NOT NULL, + `value` longtext NOT NULL, + `user_id` int(11) NOT NULL, + PRIMARY KEY (`id`), + KEY `xadmin_usersettings_user_id_edeabe4a_fk_users_userprofile_id` (`user_id`) USING BTREE, + CONSTRAINT `xadmin_usersettings_ibfk_1` FOREIGN KEY (`user_id`) REFERENCES `users_userprofile` (`id`) +) ENGINE=InnoDB AUTO_INCREMENT=4 DEFAULT CHARSET=utf8; + +-- ---------------------------- +-- Records of xadmin_usersettings +-- ---------------------------- +INSERT INTO `xadmin_usersettings` VALUES ('1', 'dashboard:home:pos', '', '1'); +INSERT INTO `xadmin_usersettings` VALUES ('2', 'dashboard:home:pos', '', '18'); +INSERT INTO `xadmin_usersettings` VALUES ('3', 'site-theme', 'https://bootswatch.com/3/cerulean/bootstrap.min.css', '18'); + +-- ---------------------------- +-- Table structure for `xadmin_userwidget` +-- ---------------------------- +DROP TABLE IF EXISTS `xadmin_userwidget`; +CREATE TABLE `xadmin_userwidget` ( + `id` int(11) NOT NULL AUTO_INCREMENT, + `page_id` varchar(256) NOT NULL, + `widget_type` varchar(50) NOT NULL, + `value` longtext NOT NULL, + `user_id` int(11) NOT NULL, + PRIMARY KEY (`id`), + KEY `xadmin_userwidget_user_id_c159233a_fk_users_userprofile_id` (`user_id`) USING BTREE, + CONSTRAINT `xadmin_userwidget_ibfk_1` FOREIGN KEY (`user_id`) REFERENCES `users_userprofile` (`id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; + +-- ---------------------------- +-- Records of xadmin_userwidget +-- ---------------------------- diff --git "a/8\343\200\201\346\226\207\347\214\256\346\225\260\346\215\256\346\214\226\346\216\230\347\263\273\347\273\237(\351\231\204\346\272\220\347\240\201)/extra_apps/__init__.py" "b/8\343\200\201\346\226\207\347\214\256\346\225\260\346\215\256\346\214\226\346\216\230\347\263\273\347\273\237(\351\231\204\346\272\220\347\240\201)/extra_apps/__init__.py" new file mode 100644 index 0000000..e69de29 diff --git "a/8\343\200\201\346\226\207\347\214\256\346\225\260\346\215\256\346\214\226\346\216\230\347\263\273\347\273\237(\351\231\204\346\272\220\347\240\201)/extra_apps/xadmin/.tx/config" "b/8\343\200\201\346\226\207\347\214\256\346\225\260\346\215\256\346\214\226\346\216\230\347\263\273\347\273\237(\351\231\204\346\272\220\347\240\201)/extra_apps/xadmin/.tx/config" new file mode 100644 index 0000000..4a783a2 --- /dev/null +++ "b/8\343\200\201\346\226\207\347\214\256\346\225\260\346\215\256\346\214\226\346\216\230\347\263\273\347\273\237(\351\231\204\346\272\220\347\240\201)/extra_apps/xadmin/.tx/config" @@ -0,0 +1,14 @@ +[main] +host = https://www.transifex.com + +[xadmin-core.django] +file_filter = locale//LC_MESSAGES/django.po +source_file = locale/en/LC_MESSAGES/django.po +source_lang = en +type = PO + +[xadmin-core.djangojs] +file_filter = locale//LC_MESSAGES/djangojs.po +source_file = locale/en/LC_MESSAGES/djangojs.po +source_lang = en +type = PO \ No newline at end of file diff --git "a/8\343\200\201\346\226\207\347\214\256\346\225\260\346\215\256\346\214\226\346\216\230\347\263\273\347\273\237(\351\231\204\346\272\220\347\240\201)/extra_apps/xadmin/__init__.py" "b/8\343\200\201\346\226\207\347\214\256\346\225\260\346\215\256\346\214\226\346\216\230\347\263\273\347\273\237(\351\231\204\346\272\220\347\240\201)/extra_apps/xadmin/__init__.py" new file mode 100644 index 0000000..3e1a052 --- /dev/null +++ "b/8\343\200\201\346\226\207\347\214\256\346\225\260\346\215\256\346\214\226\346\216\230\347\263\273\347\273\237(\351\231\204\346\272\220\347\240\201)/extra_apps/xadmin/__init__.py" @@ -0,0 +1,70 @@ + +VERSION = (0,6,0) + +from xadmin.sites import AdminSite, site + +class Settings(object): + pass + + +def autodiscover(): + """ + Auto-discover INSTALLED_APPS admin.py modules and fail silently when + not present. This forces an import on them to register any admin bits they + may want. + """ + + from importlib import import_module + from django.conf import settings + from django.utils.module_loading import module_has_submodule + from django.apps import apps + + setattr(settings, 'CRISPY_TEMPLATE_PACK', 'bootstrap3') + setattr(settings, 'CRISPY_CLASS_CONVERTERS', { + "textinput": "textinput textInput form-control", + "fileinput": "fileinput fileUpload form-control", + "passwordinput": "textinput textInput form-control", + }) + + from xadmin.views import register_builtin_views + register_builtin_views(site) + + # load xadmin settings from XADMIN_CONF module + try: + xadmin_conf = getattr(settings, 'XADMIN_CONF', 'xadmin_conf.py') + conf_mod = import_module(xadmin_conf) + except Exception: + conf_mod = None + + if conf_mod: + for key in dir(conf_mod): + setting = getattr(conf_mod, key) + try: + if issubclass(setting, Settings): + site.register_settings(setting.__name__, setting) + except Exception: + pass + + from xadmin.plugins import register_builtin_plugins + register_builtin_plugins(site) + + for app_config in apps.get_app_configs(): + mod = import_module(app_config.name) + # Attempt to import the app's admin module. + try: + before_import_registry = site.copy_registry() + import_module('%s.adminx' % app_config.name) + except: + # Reset the model registry to the state before the last import as + # this import will have to reoccur on the next request and this + # could raise NotRegistered and AlreadyRegistered exceptions + # (see #8245). + site.restore_registry(before_import_registry) + + # Decide whether to bubble up this error. If the app just + # doesn't have an admin module, we can ignore the error + # attempting to import it, otherwise we want it to bubble up. + if module_has_submodule(mod, 'adminx'): + raise + +default_app_config = 'xadmin.apps.XAdminConfig' diff --git "a/8\343\200\201\346\226\207\347\214\256\346\225\260\346\215\256\346\214\226\346\216\230\347\263\273\347\273\237(\351\231\204\346\272\220\347\240\201)/extra_apps/xadmin/adminx.py" "b/8\343\200\201\346\226\207\347\214\256\346\225\260\346\215\256\346\214\226\346\216\230\347\263\273\347\273\237(\351\231\204\346\272\220\347\240\201)/extra_apps/xadmin/adminx.py" new file mode 100644 index 0000000..e7a66e0 --- /dev/null +++ "b/8\343\200\201\346\226\207\347\214\256\346\225\260\346\215\256\346\214\226\346\216\230\347\263\273\347\273\237(\351\231\204\346\272\220\347\240\201)/extra_apps/xadmin/adminx.py" @@ -0,0 +1,32 @@ +from __future__ import absolute_import +import xadmin +from .models import UserSettings, Log +from xadmin.layout import * + +from django.utils.translation import ugettext_lazy as _, ugettext + +class UserSettingsAdmin(object): + model_icon = 'fa fa-cog' + hidden_menu = True + +xadmin.site.register(UserSettings, UserSettingsAdmin) + +class LogAdmin(object): + + def link(self, instance): + if instance.content_type and instance.object_id and instance.action_flag != 'delete': + admin_url = self.get_admin_url('%s_%s_change' % (instance.content_type.app_label, instance.content_type.model), + instance.object_id) + return "%s" % (admin_url, _('Admin Object')) + else: + return '' + link.short_description = "" + link.allow_tags = True + link.is_column = False + + list_display = ('action_time', 'user', 'ip_addr', '__str__', 'link') + list_filter = ['user', 'action_time'] + search_fields = ['ip_addr', 'message'] + model_icon = 'fa fa-cog' + +xadmin.site.register(Log, LogAdmin) diff --git "a/8\343\200\201\346\226\207\347\214\256\346\225\260\346\215\256\346\214\226\346\216\230\347\263\273\347\273\237(\351\231\204\346\272\220\347\240\201)/extra_apps/xadmin/apps.py" "b/8\343\200\201\346\226\207\347\214\256\346\225\260\346\215\256\346\214\226\346\216\230\347\263\273\347\273\237(\351\231\204\346\272\220\347\240\201)/extra_apps/xadmin/apps.py" new file mode 100644 index 0000000..6bae500 --- /dev/null +++ "b/8\343\200\201\346\226\207\347\214\256\346\225\260\346\215\256\346\214\226\346\216\230\347\263\273\347\273\237(\351\231\204\346\272\220\347\240\201)/extra_apps/xadmin/apps.py" @@ -0,0 +1,15 @@ +from django.apps import AppConfig +from django.core import checks +from django.utils.translation import ugettext_lazy as _ +import xadmin + + +class XAdminConfig(AppConfig): + """Simple AppConfig which does not do automatic discovery.""" + + name = 'xadmin' + verbose_name = _("Administration") + + def ready(self): + self.module.autodiscover() + setattr(xadmin,'site',xadmin.site) diff --git "a/8\343\200\201\346\226\207\347\214\256\346\225\260\346\215\256\346\214\226\346\216\230\347\263\273\347\273\237(\351\231\204\346\272\220\347\240\201)/extra_apps/xadmin/filters.py" "b/8\343\200\201\346\226\207\347\214\256\346\225\260\346\215\256\346\214\226\346\216\230\347\263\273\347\273\237(\351\231\204\346\272\220\347\240\201)/extra_apps/xadmin/filters.py" new file mode 100644 index 0000000..9ab977a --- /dev/null +++ "b/8\343\200\201\346\226\207\347\214\256\346\225\260\346\215\256\346\214\226\346\216\230\347\263\273\347\273\237(\351\231\204\346\272\220\347\240\201)/extra_apps/xadmin/filters.py" @@ -0,0 +1,573 @@ +from __future__ import absolute_import +from django.db import models +from django.core.exceptions import ImproperlyConfigured +from django.utils.encoding import smart_text +from django.utils.translation import ugettext_lazy as _ +from django.utils import timezone +from django.template.loader import get_template +from django.template.context import Context +from django.utils import six +from django.utils.safestring import mark_safe +from django.utils.html import escape, format_html +from django.utils.text import Truncator +from django.core.cache import cache, caches + +from xadmin.views.list import EMPTY_CHANGELIST_VALUE +from xadmin.util import is_related_field, is_related_field2 +import datetime + +FILTER_PREFIX = '_p_' +SEARCH_VAR = '_q_' + +from .util import (get_model_from_relation, + reverse_field_path, get_limit_choices_to_from_path, prepare_lookup_value) + + +class BaseFilter(object): + title = None + template = 'xadmin/filters/list.html' + + @classmethod + def test(cls, field, request, params, model, admin_view, field_path): + pass + + def __init__(self, request, params, model, admin_view): + self.used_params = {} + self.request = request + self.params = params + self.model = model + self.admin_view = admin_view + + if self.title is None: + raise ImproperlyConfigured( + "The filter '%s' does not specify " + "a 'title'." % self.__class__.__name__) + + def query_string(self, new_params=None, remove=None): + return self.admin_view.get_query_string(new_params, remove) + + def form_params(self): + arr = map(lambda k: FILTER_PREFIX + k, self.used_params.keys()) + if six.PY3: + arr = list(arr) + return self.admin_view.get_form_params(remove=arr) + + def has_output(self): + """ + Returns True if some choices would be output for this filter. + """ + raise NotImplementedError + + @property + def is_used(self): + return len(self.used_params) > 0 + + def do_filte(self, queryset): + """ + Returns the filtered queryset. + """ + raise NotImplementedError + + def get_context(self): + return {'title': self.title, 'spec': self, 'form_params': self.form_params()} + + def __str__(self): + tpl = get_template(self.template) + return mark_safe(tpl.render(context=self.get_context())) + + +class FieldFilterManager(object): + _field_list_filters = [] + _take_priority_index = 0 + + def register(self, list_filter_class, take_priority=False): + if take_priority: + # This is to allow overriding the default filters for certain types + # of fields with some custom filters. The first found in the list + # is used in priority. + self._field_list_filters.insert( + self._take_priority_index, list_filter_class) + self._take_priority_index += 1 + else: + self._field_list_filters.append(list_filter_class) + return list_filter_class + + def create(self, field, request, params, model, admin_view, field_path): + for list_filter_class in self._field_list_filters: + if not list_filter_class.test(field, request, params, model, admin_view, field_path): + continue + return list_filter_class(field, request, params, + model, admin_view, field_path=field_path) + +manager = FieldFilterManager() + + +class FieldFilter(BaseFilter): + + lookup_formats = {} + + def __init__(self, field, request, params, model, admin_view, field_path): + self.field = field + self.field_path = field_path + self.title = getattr(field, 'verbose_name', field_path) + self.context_params = {} + + super(FieldFilter, self).__init__(request, params, model, admin_view) + + for name, format in self.lookup_formats.items(): + p = format % field_path + self.context_params["%s_name" % name] = FILTER_PREFIX + p + if p in params: + value = prepare_lookup_value(p, params.pop(p)) + self.used_params[p] = value + self.context_params["%s_val" % name] = value + else: + self.context_params["%s_val" % name] = '' + + arr = map( + lambda kv: setattr(self, 'lookup_' + kv[0], kv[1]), + self.context_params.items() + ) + if six.PY3: + list(arr) + + def get_context(self): + context = super(FieldFilter, self).get_context() + context.update(self.context_params) + obj = map(lambda k: FILTER_PREFIX + k, self.used_params.keys()) + if six.PY3: + obj = list(obj) + context['remove_url'] = self.query_string({}, obj) + return context + + def has_output(self): + return True + + def do_filte(self, queryset): + return queryset.filter(**self.used_params) + + +class ListFieldFilter(FieldFilter): + template = 'xadmin/filters/list.html' + + def get_context(self): + context = super(ListFieldFilter, self).get_context() + context['choices'] = list(self.choices()) + return context + + +@manager.register +class BooleanFieldListFilter(ListFieldFilter): + lookup_formats = {'exact': '%s__exact', 'isnull': '%s__isnull'} + + @classmethod + def test(cls, field, request, params, model, admin_view, field_path): + return isinstance(field, (models.BooleanField, models.NullBooleanField)) + + def choices(self): + for lookup, title in ( + ('', _('All')), + ('1', _('Yes')), + ('0', _('No')), + ): + yield { + 'selected': ( + self.lookup_exact_val == lookup + and not self.lookup_isnull_val + ), + 'query_string': self.query_string( + {self.lookup_exact_name: lookup}, + [self.lookup_isnull_name], + ), + 'display': title, + } + if isinstance(self.field, models.NullBooleanField): + yield { + 'selected': self.lookup_isnull_val == 'True', + 'query_string': self.query_string( + {self.lookup_isnull_name: 'True'}, + [self.lookup_exact_name], + ), + 'display': _('Unknown'), + } + + +@manager.register +class ChoicesFieldListFilter(ListFieldFilter): + lookup_formats = {'exact': '%s__exact'} + + @classmethod + def test(cls, field, request, params, model, admin_view, field_path): + return bool(field.choices) + + def choices(self): + yield { + 'selected': self.lookup_exact_val is '', + 'query_string': self.query_string({}, [self.lookup_exact_name]), + 'display': _('All') + } + for lookup, title in self.field.flatchoices: + yield { + 'selected': smart_text(lookup) == self.lookup_exact_val, + 'query_string': self.query_string({self.lookup_exact_name: lookup}), + 'display': title, + } + + +@manager.register +class TextFieldListFilter(FieldFilter): + template = 'xadmin/filters/char.html' + lookup_formats = {'in': '%s__in', 'search': '%s__contains'} + + @classmethod + def test(cls, field, request, params, model, admin_view, field_path): + return ( + isinstance(field, models.CharField) + and field.max_length > 20 + or isinstance(field, models.TextField) + ) + + +@manager.register +class NumberFieldListFilter(FieldFilter): + template = 'xadmin/filters/number.html' + lookup_formats = {'equal': '%s__exact', 'lt': '%s__lt', 'gt': '%s__gt', + 'ne': '%s__ne', 'lte': '%s__lte', 'gte': '%s__gte', + } + + @classmethod + def test(cls, field, request, params, model, admin_view, field_path): + return isinstance(field, (models.DecimalField, models.FloatField, models.IntegerField)) + + def do_filte(self, queryset): + params = self.used_params.copy() + ne_key = '%s__ne' % self.field_path + if ne_key in params: + queryset = queryset.exclude( + **{self.field_path: params.pop(ne_key)}) + return queryset.filter(**params) + + +@manager.register +class DateFieldListFilter(ListFieldFilter): + template = 'xadmin/filters/date.html' + lookup_formats = {'since': '%s__gte', 'until': '%s__lt', + 'year': '%s__year', 'month': '%s__month', 'day': '%s__day', + 'isnull': '%s__isnull'} + + @classmethod + def test(cls, field, request, params, model, admin_view, field_path): + return isinstance(field, models.DateField) + + def __init__(self, field, request, params, model, admin_view, field_path): + self.field_generic = '%s__' % field_path + self.date_params = dict([(FILTER_PREFIX + k, v) for k, v in params.items() + if k.startswith(self.field_generic)]) + + super(DateFieldListFilter, self).__init__( + field, request, params, model, admin_view, field_path) + + now = timezone.now() + # When time zone support is enabled, convert "now" to the user's time + # zone so Django's definition of "Today" matches what the user expects. + if now.tzinfo is not None: + current_tz = timezone.get_current_timezone() + now = now.astimezone(current_tz) + if hasattr(current_tz, 'normalize'): + # available for pytz time zones + now = current_tz.normalize(now) + + if isinstance(field, models.DateTimeField): + today = now.replace(hour=0, minute=0, second=0, microsecond=0) + else: # field is a models.DateField + today = now.date() + tomorrow = today + datetime.timedelta(days=1) + + self.links = ( + (_('Any date'), {}), + (_('Has date'), { + self.lookup_isnull_name: False + }), + (_('Has no date'), { + self.lookup_isnull_name: 'True' + }), + (_('Today'), { + self.lookup_since_name: str(today), + self.lookup_until_name: str(tomorrow), + }), + (_('Past 7 days'), { + self.lookup_since_name: str(today - datetime.timedelta(days=7)), + self.lookup_until_name: str(tomorrow), + }), + (_('This month'), { + self.lookup_since_name: str(today.replace(day=1)), + self.lookup_until_name: str(tomorrow), + }), + (_('This year'), { + self.lookup_since_name: str(today.replace(month=1, day=1)), + self.lookup_until_name: str(tomorrow), + }), + ) + + def get_context(self): + context = super(DateFieldListFilter, self).get_context() + context['choice_selected'] = bool(self.lookup_year_val) or bool(self.lookup_month_val) \ + or bool(self.lookup_day_val) + return context + + def choices(self): + for title, param_dict in self.links: + yield { + 'selected': self.date_params == param_dict, + 'query_string': self.query_string( + param_dict, [FILTER_PREFIX + self.field_generic]), + 'display': title, + } + + +@manager.register +class RelatedFieldSearchFilter(FieldFilter): + template = 'xadmin/filters/fk_search.html' + + @classmethod + def test(cls, field, request, params, model, admin_view, field_path): + if not is_related_field2(field): + return False + related_modeladmin = admin_view.admin_site._registry.get( + get_model_from_relation(field)) + return related_modeladmin and getattr(related_modeladmin, 'relfield_style', None) in ('fk-ajax', 'fk-select') + + def __init__(self, field, request, params, model, model_admin, field_path): + other_model = get_model_from_relation(field) + if hasattr(field, 'remote_field'): + rel_name = field.remote_field.get_related_field().name + else: + rel_name = other_model._meta.pk.name + + self.lookup_formats = {'in': '%%s__%s__in' % rel_name, 'exact': '%%s__%s__exact' % rel_name} + super(RelatedFieldSearchFilter, self).__init__( + field, request, params, model, model_admin, field_path) + + related_modeladmin = self.admin_view.admin_site._registry.get(other_model) + self.relfield_style = related_modeladmin.relfield_style + + if hasattr(field, 'verbose_name'): + self.lookup_title = field.verbose_name + else: + self.lookup_title = other_model._meta.verbose_name + self.title = self.lookup_title + self.search_url = model_admin.get_admin_url('%s_%s_changelist' % ( + other_model._meta.app_label, other_model._meta.model_name)) + self.label = self.label_for_value(other_model, rel_name, self.lookup_exact_val) if self.lookup_exact_val else "" + self.choices = '?' + if field.remote_field.limit_choices_to: + for i in list(field.remote_field.limit_choices_to): + self.choices += "&_p_%s=%s" % (i, field.remote_field.limit_choices_to[i]) + self.choices = format_html(self.choices) + + def label_for_value(self, other_model, rel_name, value): + try: + obj = other_model._default_manager.get(**{rel_name: value}) + return '%s' % escape(Truncator(obj).words(14, truncate='...')) + except (ValueError, other_model.DoesNotExist): + return "" + + def get_context(self): + context = super(RelatedFieldSearchFilter, self).get_context() + context['search_url'] = self.search_url + context['label'] = self.label + context['choices'] = self.choices + context['relfield_style'] = self.relfield_style + return context + + +@manager.register +class RelatedFieldListFilter(ListFieldFilter): + + @classmethod + def test(cls, field, request, params, model, admin_view, field_path): + return is_related_field2(field) + + def __init__(self, field, request, params, model, model_admin, field_path): + other_model = get_model_from_relation(field) + if hasattr(field, 'remote_field'): + rel_name = field.remote_field.get_related_field().name + else: + rel_name = other_model._meta.pk.name + + self.lookup_formats = {'in': '%%s__%s__in' % rel_name, 'exact': '%%s__%s__exact' % + rel_name, 'isnull': '%s__isnull'} + self.lookup_choices = field.get_choices(include_blank=False) + super(RelatedFieldListFilter, self).__init__( + field, request, params, model, model_admin, field_path) + + if hasattr(field, 'verbose_name'): + self.lookup_title = field.verbose_name + else: + self.lookup_title = other_model._meta.verbose_name + self.title = self.lookup_title + + def has_output(self): + if (is_related_field(self.field) + and self.field.field.null or hasattr(self.field, 'remote_field') + and self.field.null): + extra = 1 + else: + extra = 0 + return len(self.lookup_choices) + extra > 1 + + def expected_parameters(self): + return [self.lookup_kwarg, self.lookup_kwarg_isnull] + + def choices(self): + yield { + 'selected': self.lookup_exact_val == '' and not self.lookup_isnull_val, + 'query_string': self.query_string({}, + [self.lookup_exact_name, self.lookup_isnull_name]), + 'display': _('All'), + } + for pk_val, val in self.lookup_choices: + yield { + 'selected': self.lookup_exact_val == smart_text(pk_val), + 'query_string': self.query_string({ + self.lookup_exact_name: pk_val, + }, [self.lookup_isnull_name]), + 'display': val, + } + if (is_related_field(self.field) + and self.field.field.null or hasattr(self.field, 'remote_field') + and self.field.null): + yield { + 'selected': bool(self.lookup_isnull_val), + 'query_string': self.query_string({ + self.lookup_isnull_name: 'True', + }, [self.lookup_exact_name]), + 'display': EMPTY_CHANGELIST_VALUE, + } + + +@manager.register +class MultiSelectFieldListFilter(ListFieldFilter): + """ Delegates the filter to the default filter and ors the results of each + + Lists the distinct values of each field as a checkbox + Uses the default spec for each + + """ + template = 'xadmin/filters/checklist.html' + lookup_formats = {'in': '%s__in'} + cache_config = {'enabled': False, 'key': 'quickfilter_%s', 'timeout': 3600, 'cache': 'default'} + + @classmethod + def test(cls, field, request, params, model, admin_view, field_path): + return True + + def get_cached_choices(self): + if not self.cache_config['enabled']: + return None + c = caches(self.cache_config['cache']) + return c.get(self.cache_config['key'] % self.field_path) + + def set_cached_choices(self, choices): + if not self.cache_config['enabled']: + return + c = caches(self.cache_config['cache']) + return c.set(self.cache_config['key'] % self.field_path, choices) + + def __init__(self, field, request, params, model, model_admin, field_path, field_order_by=None, field_limit=None, sort_key=None, cache_config=None): + super(MultiSelectFieldListFilter, self).__init__(field, request, params, model, model_admin, field_path) + + # Check for it in the cachce + if cache_config is not None and type(cache_config) == dict: + self.cache_config.update(cache_config) + + if self.cache_config['enabled']: + self.field_path = field_path + choices = self.get_cached_choices() + if choices: + self.lookup_choices = choices + return + + # Else rebuild it + queryset = self.admin_view.queryset().exclude(**{"%s__isnull" % field_path: True}).values_list(field_path, flat=True).distinct() + #queryset = self.admin_view.queryset().distinct(field_path).exclude(**{"%s__isnull"%field_path:True}) + + if field_order_by is not None: + # Do a subquery to order the distinct set + queryset = self.admin_view.queryset().filter(id__in=queryset).order_by(field_order_by) + + if field_limit is not None and type(field_limit) == int and queryset.count() > field_limit: + queryset = queryset[:field_limit] + + self.lookup_choices = [str(it) for it in queryset.values_list(field_path, flat=True) if str(it).strip() != ""] + if sort_key is not None: + self.lookup_choices = sorted(self.lookup_choices, key=sort_key) + + if self.cache_config['enabled']: + self.set_cached_choices(self.lookup_choices) + + def choices(self): + self.lookup_in_val = (type(self.lookup_in_val) in (tuple, list)) and self.lookup_in_val or list(self.lookup_in_val) + yield { + 'selected': len(self.lookup_in_val) == 0, + 'query_string': self.query_string({}, [self.lookup_in_name]), + 'display': _('All'), + } + for val in self.lookup_choices: + yield { + 'selected': smart_text(val) in self.lookup_in_val, + 'query_string': self.query_string({self.lookup_in_name: ",".join([val] + self.lookup_in_val), }), + 'remove_query_string': self.query_string({self.lookup_in_name: ",".join([v for v in self.lookup_in_val if v != val]), }), + 'display': val, + } + + +@manager.register +class AllValuesFieldListFilter(ListFieldFilter): + lookup_formats = {'exact': '%s__exact', 'isnull': '%s__isnull'} + + @classmethod + def test(cls, field, request, params, model, admin_view, field_path): + return True + + def __init__(self, field, request, params, model, admin_view, field_path): + parent_model, reverse_path = reverse_field_path(model, field_path) + queryset = parent_model._default_manager.all() + # optional feature: limit choices base on existing relationships + # queryset = queryset.complex_filter( + # {'%s__isnull' % reverse_path: False}) + limit_choices_to = get_limit_choices_to_from_path(model, field_path) + queryset = queryset.filter(limit_choices_to) + + self.lookup_choices = (queryset + .distinct() + .order_by(field.name) + .values_list(field.name, flat=True)) + super(AllValuesFieldListFilter, self).__init__( + field, request, params, model, admin_view, field_path) + + def choices(self): + yield { + 'selected': (self.lookup_exact_val is '' and self.lookup_isnull_val is ''), + 'query_string': self.query_string({}, [self.lookup_exact_name, self.lookup_isnull_name]), + 'display': _('All'), + } + include_none = False + for val in self.lookup_choices: + if val is None: + include_none = True + continue + val = smart_text(val) + yield { + 'selected': self.lookup_exact_val == val, + 'query_string': self.query_string({self.lookup_exact_name: val}, + [self.lookup_isnull_name]), + 'display': val, + } + if include_none: + yield { + 'selected': bool(self.lookup_isnull_val), + 'query_string': self.query_string({self.lookup_isnull_name: 'True'}, + [self.lookup_exact_name]), + 'display': EMPTY_CHANGELIST_VALUE, + } diff --git "a/8\343\200\201\346\226\207\347\214\256\346\225\260\346\215\256\346\214\226\346\216\230\347\263\273\347\273\237(\351\231\204\346\272\220\347\240\201)/extra_apps/xadmin/forms.py" "b/8\343\200\201\346\226\207\347\214\256\346\225\260\346\215\256\346\214\226\346\216\230\347\263\273\347\273\237(\351\231\204\346\272\220\347\240\201)/extra_apps/xadmin/forms.py" new file mode 100644 index 0000000..512de10 --- /dev/null +++ "b/8\343\200\201\346\226\207\347\214\256\346\225\260\346\215\256\346\214\226\346\216\230\347\263\273\347\273\237(\351\231\204\346\272\220\347\240\201)/extra_apps/xadmin/forms.py" @@ -0,0 +1,47 @@ +from django import forms + +from django.contrib.auth import authenticate +from django.contrib.auth.forms import AuthenticationForm + +from django.utils.translation import ugettext_lazy, ugettext as _ + +from django.contrib.auth import get_user_model + +ERROR_MESSAGE = ugettext_lazy("Please enter the correct username and password " + "for a staff account. Note that both fields are case-sensitive.") + + +class AdminAuthenticationForm(AuthenticationForm): + """ + A custom authentication form used in the admin app. + + """ + this_is_the_login_form = forms.BooleanField( + widget=forms.HiddenInput, initial=1, + error_messages={'required': ugettext_lazy("Please log in again, because your session has expired.")}) + + def clean(self): + username = self.cleaned_data.get('username') + password = self.cleaned_data.get('password') + message = ERROR_MESSAGE + + if username and password: + self.user_cache = authenticate( + username=username, password=password) + if self.user_cache is None: + if u'@' in username: + User = get_user_model() + # Mistakenly entered e-mail address instead of username? Look it up. + try: + user = User.objects.get(email=username) + except (User.DoesNotExist, User.MultipleObjectsReturned): + # Nothing to do here, moving along. + pass + else: + if user.check_password(password): + message = _("Your e-mail address is not your username." + " Try '%s' instead.") % user.username + raise forms.ValidationError(message) + elif not self.user_cache.is_active or not self.user_cache.is_staff: + raise forms.ValidationError(message) + return self.cleaned_data diff --git "a/8\343\200\201\346\226\207\347\214\256\346\225\260\346\215\256\346\214\226\346\216\230\347\263\273\347\273\237(\351\231\204\346\272\220\347\240\201)/extra_apps/xadmin/layout.py" "b/8\343\200\201\346\226\207\347\214\256\346\225\260\346\215\256\346\214\226\346\216\230\347\263\273\347\273\237(\351\231\204\346\272\220\347\240\201)/extra_apps/xadmin/layout.py" new file mode 100644 index 0000000..1d3c7a9 --- /dev/null +++ "b/8\343\200\201\346\226\207\347\214\256\346\225\260\346\215\256\346\214\226\346\216\230\347\263\273\347\273\237(\351\231\204\346\272\220\347\240\201)/extra_apps/xadmin/layout.py" @@ -0,0 +1,113 @@ +from crispy_forms.helper import FormHelper +from crispy_forms.layout import * +from crispy_forms.bootstrap import * +from crispy_forms.utils import render_field, flatatt, TEMPLATE_PACK + +from crispy_forms import layout +from crispy_forms import bootstrap + +import math + + +class Fieldset(layout.Fieldset): + template = "xadmin/layout/fieldset.html" + + def __init__(self, legend, *fields, **kwargs): + self.description = kwargs.pop('description', None) + self.collapsed = kwargs.pop('collapsed', None) + super(Fieldset, self).__init__(legend, *fields, **kwargs) + + +class Row(layout.Div): + + def __init__(self, *fields, **kwargs): + css_class = 'form-inline form-group' + new_fields = [self.convert_field(f, len(fields)) for f in fields] + super(Row, self).__init__(css_class=css_class, *new_fields, **kwargs) + + def convert_field(self, f, counts): + col_class = "col-sm-%d" % int(math.ceil(12 / counts)) + if not (isinstance(f, Field) or issubclass(f.__class__, Field)): + f = layout.Field(f) + if f.wrapper_class: + f.wrapper_class += " %s" % col_class + else: + f.wrapper_class = col_class + return f + + +class Col(layout.Column): + + def __init__(self, id, *fields, **kwargs): + css_class = ['column', 'form-column', id, 'col col-sm-%d' % + kwargs.get('span', 6)] + if kwargs.get('horizontal'): + css_class.append('form-horizontal') + super(Col, self).__init__(css_class=' '.join(css_class), * + fields, **kwargs) + + +class Main(layout.Column): + css_class = "column form-column main col col-sm-9 form-horizontal" + + +class Side(layout.Column): + css_class = "column form-column sidebar col col-sm-3" + + +class Container(layout.Div): + css_class = "form-container row clearfix" + + +# Override bootstrap3 +class InputGroup(layout.Field): + + template = "xadmin/layout/input_group.html" + + def __init__(self, field, *args, **kwargs): + self.field = field + self.inputs = list(args) + if '@@' not in args: + self.inputs.append('@@') + + self.input_size = None + css_class = kwargs.get('css_class', '') + if 'input-lg' in css_class: + self.input_size = 'input-lg' + if 'input-sm' in css_class: + self.input_size = 'input-sm' + + super(InputGroup, self).__init__(field, **kwargs) + + def render(self, form, form_style, context, template_pack=TEMPLATE_PACK, **kwargs): + classes = form.fields[self.field].widget.attrs.get('class', '') + extra_context = { + 'inputs': self.inputs, + 'input_size': self.input_size, + 'classes': classes.replace('form-control', '') + } + if hasattr(self, 'wrapper_class'): + extra_context['wrapper_class'] = self.wrapper_class + + return render_field( + self.field, form, form_style, context, template=self.template, + attrs=self.attrs, template_pack=template_pack, extra_context=extra_context, **kwargs) + + +class PrependedText(InputGroup): + + def __init__(self, field, text, **kwargs): + super(PrependedText, self).__init__(field, text, '@@', **kwargs) + + +class AppendedText(InputGroup): + + def __init__(self, field, text, **kwargs): + super(AppendedText, self).__init__(field, '@@', text, **kwargs) + + +class PrependedAppendedText(InputGroup): + + def __init__(self, field, prepended_text=None, appended_text=None, *args, **kwargs): + super(PrependedAppendedText, self).__init__( + field, prepended_text, '@@', appended_text, **kwargs) diff --git "a/8\343\200\201\346\226\207\347\214\256\346\225\260\346\215\256\346\214\226\346\216\230\347\263\273\347\273\237(\351\231\204\346\272\220\347\240\201)/extra_apps/xadmin/locale/de_DE/LC_MESSAGES/django.mo" "b/8\343\200\201\346\226\207\347\214\256\346\225\260\346\215\256\346\214\226\346\216\230\347\263\273\347\273\237(\351\231\204\346\272\220\347\240\201)/extra_apps/xadmin/locale/de_DE/LC_MESSAGES/django.mo" new file mode 100644 index 0000000..e594acb Binary files /dev/null and "b/8\343\200\201\346\226\207\347\214\256\346\225\260\346\215\256\346\214\226\346\216\230\347\263\273\347\273\237(\351\231\204\346\272\220\347\240\201)/extra_apps/xadmin/locale/de_DE/LC_MESSAGES/django.mo" differ diff --git "a/8\343\200\201\346\226\207\347\214\256\346\225\260\346\215\256\346\214\226\346\216\230\347\263\273\347\273\237(\351\231\204\346\272\220\347\240\201)/extra_apps/xadmin/locale/de_DE/LC_MESSAGES/django.po" "b/8\343\200\201\346\226\207\347\214\256\346\225\260\346\215\256\346\214\226\346\216\230\347\263\273\347\273\237(\351\231\204\346\272\220\347\240\201)/extra_apps/xadmin/locale/de_DE/LC_MESSAGES/django.po" new file mode 100644 index 0000000..65ab472 --- /dev/null +++ "b/8\343\200\201\346\226\207\347\214\256\346\225\260\346\215\256\346\214\226\346\216\230\347\263\273\347\273\237(\351\231\204\346\272\220\347\240\201)/extra_apps/xadmin/locale/de_DE/LC_MESSAGES/django.po" @@ -0,0 +1,1454 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER +# This file is distributed under the same license as the PACKAGE package. +# +# Translators: +# p3n15h34d , 2013 +# Sebastian Morkisch , 2013 +# Azd325 , 2013 +msgid "" +msgstr "" +"Project-Id-Version: xadmin-core\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2016-07-20 13:28+0800\n" +"PO-Revision-Date: 2013-12-19 11:06+0000\n" +"Last-Translator: Sebastian Morkisch \n" +"Language-Team: German (Germany) (http://www.transifex.com/projects/p/xadmin/" +"language/de_DE/)\n" +"Language: de_DE\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +#: adminx.py:19 +msgid "Admin Object" +msgstr "" + +#: apps.py:11 +msgid "Administration" +msgstr "" + +#: filters.py:159 filters.py:191 filters.py:407 filters.py:493 filters.py:531 +msgid "All" +msgstr "Alle" + +#: filters.py:160 plugins/export.py:165 +msgid "Yes" +msgstr "Ja" + +#: filters.py:161 plugins/export.py:165 +msgid "No" +msgstr "Nein" + +#: filters.py:175 +msgid "Unknown" +msgstr "Unbekannt" + +#: filters.py:267 +msgid "Any date" +msgstr "Beliebiges Datum" + +#: filters.py:268 +msgid "Has date" +msgstr "Hat ein Datum" + +#: filters.py:271 +msgid "Has no date" +msgstr "Hat kein Datum" + +#: filters.py:274 widgets.py:30 +msgid "Today" +msgstr "Heute" + +#: filters.py:278 +msgid "Past 7 days" +msgstr "Letzten 7 Tage" + +#: filters.py:282 +msgid "This month" +msgstr "Diesen Monat" + +#: filters.py:286 +msgid "This year" +msgstr "Dieses Jahr" + +#: forms.py:10 +msgid "" +"Please enter the correct username and password for a staff account. Note " +"that both fields are case-sensitive." +msgstr "" +"Bitte geben Sie den richtigen Benutzernamen und das Kennwort für ein " +"Mitarbeiter Konto an. Beachten Sie die Groß-und Kleinschreibung in den " +"beiden Feldern." + +#: forms.py:21 +msgid "Please log in again, because your session has expired." +msgstr "Ihre Sitzung ist abgelaufen - bitte melden Sie sich erneut an." + +#: forms.py:41 +#, python-format +msgid "Your e-mail address is not your username. Try '%s' instead." +msgstr "Ihre Email ist nicht ihr Benutzername. Probieren sie anstelle %s." + +#: models.py:48 +msgid "Title" +msgstr "Titel" + +#: models.py:49 models.py:88 models.py:107 models.py:149 +msgid "user" +msgstr "Benutzer" + +#: models.py:50 +msgid "Url Name" +msgstr "URL Name" + +#: models.py:52 +msgid "Query String" +msgstr "Abfrage String" + +#: models.py:53 +msgid "Is Shared" +msgstr "Wird geteilt" + +#: models.py:66 plugins/bookmark.py:50 plugins/bookmark.py:180 +msgid "Bookmark" +msgstr "Lesezeichen" + +#: models.py:67 +msgid "Bookmarks" +msgstr "Lesezeichen" + +#: models.py:89 +msgid "Settings Key" +msgstr "Einstellungsschlüssel" + +#: models.py:90 +msgid "Settings Content" +msgstr "Einstellungsinhalt" + +#: models.py:102 +msgid "User Setting" +msgstr "Benutzereinstellung" + +#: models.py:103 +msgid "User Settings" +msgstr "Benutzereinstelllungen" + +#: models.py:108 +msgid "Page" +msgstr "Seite" + +#: models.py:109 views/dashboard.py:82 views/dashboard.py:92 +msgid "Widget Type" +msgstr "Widget Typ" + +#: models.py:110 views/dashboard.py:83 +msgid "Widget Params" +msgstr "Widget Parameter" + +#: models.py:137 +msgid "User Widget" +msgstr "Benutzer Widget" + +#: models.py:138 +msgid "User Widgets" +msgstr "Benutzer Widgets" + +#: models.py:142 +#, fuzzy +#| msgid "Date/time" +msgid "action time" +msgstr "Datum/Uhrzeit" + +#: models.py:151 +msgid "action ip" +msgstr "" + +#: models.py:155 +msgid "content type" +msgstr "" + +#: models.py:158 +msgid "object id" +msgstr "" + +#: models.py:159 +msgid "object repr" +msgstr "" + +#: models.py:160 +msgid "action flag" +msgstr "" + +#: models.py:161 +#, fuzzy +#| msgid "Change %s" +msgid "change message" +msgstr "Ändern %s" + +#: models.py:164 +#, fuzzy +#| msgid "log in" +msgid "log entry" +msgstr "einloggen" + +#: models.py:165 +msgid "log entries" +msgstr "" + +#: models.py:173 +#, python-format +msgid "Added \"%(object)s\"." +msgstr "" + +#: models.py:175 +#, fuzzy, python-format +#| msgid "Change one %(objects_name)s" +#| msgid_plural "Batch change %(counter)s %(objects_name)s" +msgid "Changed \"%(object)s\" - %(changes)s" +msgstr "Anpassung von %(objects_name)s" + +#: models.py:180 +#, fuzzy, python-format +#| msgid "Related Objects" +msgid "Deleted \"%(object)s.\"" +msgstr "Abhängige Objekte" + +#: plugins/actions.py:57 +#, python-format +msgid "Delete selected %(verbose_name_plural)s" +msgstr "Lösche ausgewählte %(verbose_name_plural)s" + +#: plugins/actions.py:72 +#, fuzzy, python-format +#| msgid "Successfully deleted %(count)d %(items)s." +msgid "Batch delete %(count)d %(items)s." +msgstr "Erfolgreich gelöscht %(count)d %(items)s." + +#: plugins/actions.py:78 +#, python-format +msgid "Successfully deleted %(count)d %(items)s." +msgstr "Erfolgreich gelöscht %(count)d %(items)s." + +#: plugins/actions.py:110 views/delete.py:70 +#, python-format +msgid "Cannot delete %(name)s" +msgstr "Kann nicht gelöscht werden %(name)s" + +#: plugins/actions.py:112 views/delete.py:73 +msgid "Are you sure?" +msgstr "Sind Sie sicher?" + +#: plugins/actions.py:158 +#, python-format +msgid "%(total_count)s selected" +msgid_plural "All %(total_count)s selected" +msgstr[0] "%(total_count)s ausgewählt" +msgstr[1] "Alle %(total_count)s ausgewählt" + +#: plugins/actions.py:162 +#, python-format +msgid "0 of %(cnt)s selected" +msgstr "0 von %(cnt)s ausgewählt" + +#: plugins/actions.py:179 plugins/actions.py:189 +msgid "" +"Items must be selected in order to perform actions on them. No items have " +"been changed." +msgstr "" + +#: plugins/aggregation.py:14 +msgid "Min" +msgstr "Min" + +#: plugins/aggregation.py:14 +msgid "Max" +msgstr "Max" + +#: plugins/aggregation.py:14 +msgid "Avg" +msgstr "Durchschnitt" + +#: plugins/aggregation.py:14 +msgid "Sum" +msgstr "Summe" + +#: plugins/aggregation.py:14 +msgid "Count" +msgstr "Anzahl" + +#: plugins/auth.py:21 +#, fuzzy, python-format +msgid "Can add %s" +msgstr "Kann %s betrachten" + +#: plugins/auth.py:22 +#, fuzzy, python-format +msgid "Can change %s" +msgstr "Ändern %s" + +#: plugins/auth.py:23 +#, fuzzy, python-format +msgid "Can edit %s" +msgstr "Kann %s betrachten" + +#: plugins/auth.py:24 +#, fuzzy, python-format +msgid "Can delete %s" +msgstr "Kann nicht gelöscht werden %(name)s" + +#: plugins/auth.py:25 +#, python-format +msgid "Can view %s" +msgstr "Kann %s betrachten" + +#: plugins/auth.py:87 +msgid "Personal info" +msgstr "Persönliche Informationen" + +#: plugins/auth.py:91 +msgid "Permissions" +msgstr "Berechtigungen" + +#: plugins/auth.py:94 +msgid "Important dates" +msgstr "Wichtige Termine" + +#: plugins/auth.py:99 +msgid "Status" +msgstr "Status" + +#: plugins/auth.py:111 +#, fuzzy +msgid "Permission Name" +msgstr "Berechtigungen" + +#: plugins/auth.py:167 +msgid "Change Password" +msgstr "Passwort ändern" + +#: plugins/auth.py:198 +#, python-format +msgid "Change password: %s" +msgstr "Passwort ändern: %s" + +#: plugins/auth.py:223 plugins/auth.py:255 +msgid "Password changed successfully." +msgstr "Passwort erfolgreich geändert." + +#: plugins/auth.py:242 templates/xadmin/auth/user/change_password.html:11 +#: templates/xadmin/auth/user/change_password.html:22 +#: templates/xadmin/auth/user/change_password.html:55 +msgid "Change password" +msgstr "Passwort ändern" + +#: plugins/batch.py:44 +msgid "Change this field" +msgstr "Änderung des Feldes" + +#: plugins/batch.py:65 +#, python-format +msgid "Batch Change selected %(verbose_name_plural)s" +msgstr "Anpassung aller gewählten %(verbose_name_plural)s" + +#: plugins/batch.py:89 +#, python-format +msgid "Successfully change %(count)d %(items)s." +msgstr "Es wurden %(count)d %(items)s erfolgreich geändert." + +#: plugins/batch.py:138 +#, python-format +msgid "Batch change %s" +msgstr "" + +#: plugins/bookmark.py:173 +msgid "bookmark" +msgstr "Als Lesezeichen abspeichern" + +#: plugins/bookmark.py:176 +msgid "Bookmark Widget, can show user's bookmark list data in widget." +msgstr "" + +#: plugins/chart.py:25 +msgid "Show models simple chart." +msgstr "Einfaches Diagramm der Modelle anzeigen." + +#: plugins/chart.py:51 +#, python-format +msgid "%s Charts" +msgstr "%s Diagramme" + +#: plugins/comments.py:33 +msgid "Metadata" +msgstr "" + +#: plugins/comments.py:60 +msgid "flagged" +msgid_plural "flagged" +msgstr[0] "" +msgstr[1] "" + +#: plugins/comments.py:61 +msgid "Flag selected comments" +msgstr "" + +#: plugins/comments.py:66 +msgid "approved" +msgid_plural "approved" +msgstr[0] "" +msgstr[1] "" + +#: plugins/comments.py:67 +msgid "Approve selected comments" +msgstr "" + +#: plugins/comments.py:72 +#, fuzzy +msgid "removed" +msgid_plural "removed" +msgstr[0] "Entferne" +msgstr[1] "Entferne" + +#: plugins/comments.py:73 +#, fuzzy +msgid "Remove selected comments" +msgstr "Gelöschte %(name)s wiederherstellen" + +#: plugins/comments.py:86 +#, python-format +msgid "1 comment was successfully %(action)s." +msgid_plural "%(count)s comments were successfully %(action)s." +msgstr[0] "" +msgstr[1] "" + +#: plugins/details.py:52 views/list.py:578 +#, python-format +msgid "Details of %s" +msgstr "Einzelheiten von %s" + +#: plugins/editable.py:46 +#, python-format +msgid "Enter %s" +msgstr "Eingabe %s" + +#: plugins/editable.py:73 views/dashboard.py:649 views/delete.py:27 +#: views/detail.py:145 views/edit.py:454 +#, python-format +msgid "%(name)s object with primary key %(key)r does not exist." +msgstr "" +"%(name)s bezeichnetes Objekt mit dem Primärschlüssel %(key)r existiert nicht." + +#: plugins/export.py:98 plugins/export.py:135 +msgid "Sheet" +msgstr "Seite" + +#: plugins/filters.py:133 plugins/quickfilter.py:141 +#, python-format +msgid "Filtering error: %s" +msgstr "Fehlerhaftes Filtern: %s" + +#: plugins/images.py:29 +msgid "Previous" +msgstr "Vorherige" + +#: plugins/images.py:29 +msgid "Next" +msgstr "Nächste" + +#: plugins/images.py:29 +msgid "Slideshow" +msgstr "Slideshow" + +#: plugins/images.py:29 +msgid "Download" +msgstr "Download" + +#: plugins/images.py:50 +msgid "Change:" +msgstr "Änderung:" + +#: plugins/layout.py:16 +msgid "Table" +msgstr "Tabelle" + +#: plugins/layout.py:22 +msgid "Thumbnails" +msgstr "Thumbnails" + +#: plugins/passwords.py:64 +msgid "Forgotten your password or username?" +msgstr "Haben Sie Ihr Passwort oder den Benutzernamen vergessen?" + +#: plugins/quickform.py:79 +#, python-format +msgid "Create New %s" +msgstr "Erstelle %s neu" + +#: plugins/relate.py:104 +msgid "Related Objects" +msgstr "Abhängige Objekte" + +#: plugins/relfield.py:29 plugins/topnav.py:38 +#, python-format +msgid "Search %s" +msgstr "Suche %s" + +#: plugins/relfield.py:67 +#, fuzzy, python-format +#| msgid "Select Date" +msgid "Select %s" +msgstr "Datum wählen" + +#: plugins/themes.py:47 +msgid "Default" +msgstr "Standard" + +#: plugins/themes.py:48 +msgid "Default bootstrap theme" +msgstr "Standard Bootstrap Thema" + +#: plugins/themes.py:49 +msgid "Bootstrap2" +msgstr "Bootstrap2" + +#: plugins/themes.py:49 +msgid "Bootstrap 2.x theme" +msgstr "Bootstrap 2.x Thema" + +#: plugins/topnav.py:62 views/dashboard.py:465 views/edit.py:387 +#: views/edit.py:396 +#, python-format +msgid "Add %s" +msgstr "Hinzufügen %s" + +#: plugins/xversion.py:106 +msgid "Initial version." +msgstr "Erste Version." + +#: plugins/xversion.py:108 +msgid "Change version." +msgstr "Version ändern." + +#: plugins/xversion.py:110 +msgid "Revert version." +msgstr "Version zurückfallen." + +#: plugins/xversion.py:112 +msgid "Rercover version." +msgstr "Version wiederherstellen." + +#: plugins/xversion.py:114 +#, python-format +msgid "Deleted %(verbose_name)s." +msgstr "Gelöschte %(verbose_name)s." + +#: plugins/xversion.py:127 templates/xadmin/views/recover_form.html:26 +msgid "Recover" +msgstr "" + +#: plugins/xversion.py:143 templates/xadmin/views/model_history.html:11 +#: templates/xadmin/views/revision_diff.html:11 +#: templates/xadmin/views/revision_form.html:15 +msgid "History" +msgstr "Verlauf" + +#: plugins/xversion.py:194 templates/xadmin/views/recover_form.html:14 +#: templates/xadmin/views/recover_list.html:10 +#, python-format +msgid "Recover deleted %(name)s" +msgstr "Gelöschte %(name)s wiederherstellen" + +#: plugins/xversion.py:238 +#, python-format +msgid "Change history: %s" +msgstr "Änderungen: %s" + +#: plugins/xversion.py:288 +msgid "Must select two versions." +msgstr "Es müssen zwei Versionen ausgewählt sein." + +#: plugins/xversion.py:296 +msgid "Please select two different versions." +msgstr "Bitte wählen Sie zwei unterschiedliche Versionen aus." + +#: plugins/xversion.py:383 plugins/xversion.py:500 +#, python-format +msgid "Current: %s" +msgstr "Aktuell: %s" + +#: plugins/xversion.py:424 +#, python-format +msgid "Revert %s" +msgstr "Auf %s zurückfallen" + +#: plugins/xversion.py:440 +#, python-format +msgid "" +"The %(model)s \"%(name)s\" was reverted successfully. You may edit it again " +"below." +msgstr "" + +#: plugins/xversion.py:461 +#, python-format +msgid "Recover %s" +msgstr "Stelle %s wieder her" + +#: plugins/xversion.py:477 +#, python-format +msgid "" +"The %(model)s \"%(name)s\" was recovered successfully. You may edit it again " +"below." +msgstr "" + +#: templates/xadmin/404.html:4 templates/xadmin/404.html:8 +msgid "Page not found" +msgstr "Seite konnte nicht gefunden werden" + +#: templates/xadmin/404.html:10 +msgid "We're sorry, but the requested page could not be found." +msgstr "" +"Es tut uns leid, aber die angeforderte Seite konnte nicht gefunden werden." + +#: templates/xadmin/500.html:7 +#: templates/xadmin/auth/user/change_password.html:10 +#: templates/xadmin/auth/user/change_password.html:15 +#: templates/xadmin/base_site.html:53 +#: templates/xadmin/includes/sitemenu_default.html:7 +#: templates/xadmin/views/app_index.html:9 +#: templates/xadmin/views/batch_change_form.html:9 +#: templates/xadmin/views/invalid_setup.html:7 +#: templates/xadmin/views/model_dashboard.html:7 +#: templates/xadmin/views/model_delete_selected_confirm.html:8 +#: templates/xadmin/views/model_history.html:8 +#: templates/xadmin/views/recover_form.html:8 +#: templates/xadmin/views/recover_list.html:8 +#: templates/xadmin/views/revision_diff.html:8 +#: templates/xadmin/views/revision_form.html:8 views/base.py:473 +msgid "Home" +msgstr "Startseite" + +#: templates/xadmin/500.html:8 +msgid "Server error" +msgstr "Serverfehler" + +#: templates/xadmin/500.html:12 +msgid "Server error (500)" +msgstr "Serverfehler (500)" + +#: templates/xadmin/500.html:15 +msgid "Server Error (500)" +msgstr "Server Fehler (500)" + +#: templates/xadmin/500.html:16 +msgid "" +"There's been an error. It's been reported to the site administrators via e-" +"mail and should be fixed shortly. Thanks for your patience." +msgstr "" +"Es ist ein Fehler aufgetreten. Der Siteadmin wurde via E-Mail informiert und " +"wird sich in Kürze um die Behebung des Fehlers kümmern. Wir danken für Ihre " +"Geduld." + +#: templates/xadmin/auth/password_reset/complete.html:11 +#: templates/xadmin/auth/password_reset/done.html:11 +msgid "Password reset successful" +msgstr "Passwort erfolgreich zurückgesetzt" + +#: templates/xadmin/auth/password_reset/complete.html:14 +msgid "Your password has been set. You may go ahead and log in now." +msgstr "Ihr Passwort wurde gesetzt. Sie können fortfahren und sich einloggen." + +#: templates/xadmin/auth/password_reset/complete.html:15 +msgid "Log in" +msgstr "Einloggen" + +#: templates/xadmin/auth/password_reset/confirm.html:12 +msgid "Enter new password" +msgstr "Geben Sie Ihr neues Passwort ein." + +#: templates/xadmin/auth/password_reset/confirm.html:17 +msgid "" +"Please enter your new password twice so we can verify you typed it in " +"correctly." +msgstr "" +"Bitte geben Sie Ihr neues Passwort zweimal ein, damit die Identität " +"festgestellt werden kann." + +#: templates/xadmin/auth/password_reset/confirm.html:19 +msgid "Change my password" +msgstr "Passwort ändern" + +#: templates/xadmin/auth/password_reset/confirm.html:24 +msgid "Password reset unsuccessful" +msgstr "Passwort zurücksetzen fehlgeschlagen" + +#: templates/xadmin/auth/password_reset/confirm.html:27 +msgid "" +"The password reset link was invalid, possibly because it has already been " +"used. Please request a new password reset." +msgstr "" +"Der Passwort-zurücksetzen Link war ungültig, weil dieser möglicherweise " +"schon verwendet wurde. Bitte fordern Sie einen neuen Link an." + +#: templates/xadmin/auth/password_reset/done.html:14 +msgid "" +"We've e-mailed you instructions for setting your password to the e-mail " +"address you submitted. You should be receiving it shortly." +msgstr "" +"Wir haben Ihnen eine E-Mail mit Anweisungen zum Zurücksetzen Ihres " +"Passwortes an die Adresse geschickt, die Sie uns übermittelt haben. Sie " +"sollten sie in Kürze erhalten." + +#: templates/xadmin/auth/password_reset/email.html:2 +#, python-format +msgid "" +"You're receiving this e-mail because you requested a password reset for your " +"user account at %(site_name)s." +msgstr "" + +#: templates/xadmin/auth/password_reset/email.html:4 +msgid "Please go to the following page and choose a new password:" +msgstr "Bitte gehen Sie auf folgende Seite und erstellen ein neues Passwort." + +#: templates/xadmin/auth/password_reset/email.html:8 +msgid "Your username, in case you've forgotten:" +msgstr "Ihr Benutzername, falls Sie ihn vergessen sollten:" + +#: templates/xadmin/auth/password_reset/email.html:10 +msgid "Thanks for using our site!" +msgstr "Danke, dass Sie uns besucht haben!" + +#: templates/xadmin/auth/password_reset/email.html:12 +#, python-format +msgid "The %(site_name)s team" +msgstr "Das %(site_name)s Team" + +#: templates/xadmin/auth/password_reset/form.html:13 +msgid "Password reset" +msgstr "Passwort zurücksetzen" + +#: templates/xadmin/auth/password_reset/form.html:17 +msgid "" +"Forgotten your password? Enter your e-mail address below, and we'll e-mail " +"instructions for setting a new one." +msgstr "" +"Haben Sie Ihr Passwort vergessen? Geben Sie unten Ihre E-Mail Adresse ein " +"und wir werden Ihnen eine Nachricht mit Anweisungen schicken, wie ein Neues " +"erstellt wird." + +#: templates/xadmin/auth/password_reset/form.html:25 +msgid "E-mail address:" +msgstr "E-Mail Adresse:" + +#: templates/xadmin/auth/password_reset/form.html:33 +msgid "Reset my password" +msgstr "Passwort zurücksetzen" + +#: templates/xadmin/auth/user/add_form.html:6 +msgid "" +"First, enter a username and password. Then, you'll be able to edit more user " +"options." +msgstr "" +"Bitte tragen Sie einen Benutzernamen und Passwort ein. Anschließend können " +"Sie weitere Benutzerinformationen bearbeiten." + +#: templates/xadmin/auth/user/add_form.html:8 +msgid "Enter a username and password." +msgstr "Bitte geben Sie Benutzernamen und Passwort ein." + +#: templates/xadmin/auth/user/change_password.html:31 +#: templates/xadmin/views/batch_change_form.html:24 +#: templates/xadmin/views/form.html:18 +#: templates/xadmin/views/model_form.html:20 +msgid "Please correct the error below." +msgid_plural "Please correct the errors below." +msgstr[0] "Bitte korrigieren Sie den folgenden Fehler." +msgstr[1] "Bitte korrigieren Sie die folgenden Fehler." + +#: templates/xadmin/auth/user/change_password.html:38 +msgid "Enter your new password." +msgstr "Geben Sie Ihr neues Passwort ein." + +#: templates/xadmin/auth/user/change_password.html:40 +#, python-format +msgid "Enter a new password for the user %(username)s." +msgstr "" +"Vergeben Sie ein neues Passwort für den Benutzer %(username)s." + +#: templates/xadmin/base_site.html:18 +msgid "Welcome," +msgstr "Willkommen," + +#: templates/xadmin/base_site.html:24 +msgid "Log out" +msgstr "Abmelden" + +#: templates/xadmin/base_site.html:36 +msgid "You don't have permission to edit anything." +msgstr "Sie haben nicht die notwendige Berechtigung etwas zu ändern." + +#: templates/xadmin/blocks/comm.top.theme.html:4 +msgid "Themes" +msgstr "Themeneinstellungen" + +#: templates/xadmin/blocks/comm.top.topnav.html:9 +#: templates/xadmin/blocks/model_list.nav_form.search_form.html:8 +#: templates/xadmin/filters/char.html:7 +#: templates/xadmin/filters/fk_search.html:7 +#: templates/xadmin/filters/fk_search.html:16 +#: templates/xadmin/filters/number.html:7 +msgid "Search" +msgstr "Suchen" + +#: templates/xadmin/blocks/comm.top.topnav.html:23 +msgid "Add" +msgstr "Hinzufügen" + +#: templates/xadmin/blocks/model_form.submit_line.wizard.html:9 +#: templates/xadmin/blocks/model_form.submit_line.wizard.html:26 +msgid "Prev step" +msgstr "Zurück" + +#: templates/xadmin/blocks/model_form.submit_line.wizard.html:13 +#: templates/xadmin/blocks/model_form.submit_line.wizard.html:29 +msgid "Next step" +msgstr "Nächstes" + +#: templates/xadmin/blocks/model_form.submit_line.wizard.html:15 +#: templates/xadmin/blocks/model_form.submit_line.wizard.html:31 +#: templates/xadmin/includes/submit_line.html:10 +#: templates/xadmin/includes/submit_line.html:13 +#: templates/xadmin/views/form.html:30 templates/xadmin/views/form.html:31 +msgid "Save" +msgstr "Speichern" + +#: templates/xadmin/blocks/model_list.nav_menu.bookmarks.html:7 +msgid "Clean Bookmarks" +msgstr "Bereinige Lesezeichen" + +#: templates/xadmin/blocks/model_list.nav_menu.bookmarks.html:18 +msgid "No Bookmarks" +msgstr "Keine Lesezeichen" + +#: templates/xadmin/blocks/model_list.nav_menu.bookmarks.html:22 +msgid "New Bookmark" +msgstr "Neues Lesezeichen" + +#: templates/xadmin/blocks/model_list.nav_menu.bookmarks.html:26 +msgid "Save current page as Bookmark" +msgstr "Lesezeichen hinzufügen" + +#: templates/xadmin/blocks/model_list.nav_menu.bookmarks.html:32 +msgid "Enter bookmark title" +msgstr "Lesezeichenname" + +#: templates/xadmin/blocks/model_list.nav_menu.bookmarks.html:33 +msgid "Waiting" +msgstr "Warte" + +#: templates/xadmin/blocks/model_list.nav_menu.bookmarks.html:33 +msgid "Save Bookmark" +msgstr "Speichere Lesezeichen" + +#: templates/xadmin/blocks/model_list.nav_menu.filters.html:4 +msgid "Filters" +msgstr "Filter" + +#: templates/xadmin/blocks/model_list.nav_menu.filters.html:8 +msgid "Clean Filters" +msgstr "Bereinige Filter" + +#: templates/xadmin/blocks/model_list.results_bottom.actions.html:19 +msgid "Click here to select the objects across all pages" +msgstr "Klicken Sie hier, um alle Objekte über alle Seiten hinweg auszuwählen." + +#: templates/xadmin/blocks/model_list.results_bottom.actions.html:19 +#, python-format +msgid "Select all %(total_count)s %(model_name)s" +msgstr "Alles auswählen %(total_count)s %(model_name)s" + +#: templates/xadmin/blocks/model_list.results_bottom.actions.html:20 +msgid "Clear selection" +msgstr "Auswahl abwählen" + +#: templates/xadmin/blocks/model_list.results_top.charts.html:4 +msgid "Charts" +msgstr "Diagramme" + +#: templates/xadmin/blocks/model_list.top_toolbar.exports.html:4 +#: templates/xadmin/blocks/model_list.top_toolbar.exports.html:8 +#: templates/xadmin/blocks/model_list.top_toolbar.exports.html:19 +#: templates/xadmin/blocks/model_list.top_toolbar.exports.html:47 +msgid "Export" +msgstr "Exportieren" + +#: templates/xadmin/blocks/model_list.top_toolbar.exports.html:26 +#: templates/xadmin/blocks/model_list.top_toolbar.exports.html:29 +#: templates/xadmin/blocks/model_list.top_toolbar.exports.html:32 +msgid "Export with table header." +msgstr "Export mit Tabellenkopf." + +#: templates/xadmin/blocks/model_list.top_toolbar.exports.html:35 +#: templates/xadmin/blocks/model_list.top_toolbar.exports.html:38 +msgid "Export with format." +msgstr "Exportieren mit Formatierung." + +#: templates/xadmin/blocks/model_list.top_toolbar.exports.html:42 +msgid "Export all data." +msgstr "Komplette Daten exportieren." + +#: templates/xadmin/blocks/model_list.top_toolbar.exports.html:46 +#: templates/xadmin/widgets/base.html:41 +msgid "Close" +msgstr "Schließen" + +#: templates/xadmin/blocks/model_list.top_toolbar.layouts.html:4 +msgid "Layout" +msgstr "Layout" + +#: templates/xadmin/blocks/model_list.top_toolbar.refresh.html:8 +msgid "Clean Refresh" +msgstr "Säubern" + +#: templates/xadmin/blocks/model_list.top_toolbar.refresh.html:14 +#, python-format +msgid "Every %(t)s seconds" +msgstr "Alle %(t)s Sekunden" + +#: templates/xadmin/blocks/model_list.top_toolbar.saveorder.html:4 +msgid "Save Order" +msgstr "" + +#: templates/xadmin/edit_inline/blank.html:5 views/detail.py:23 +#: views/edit.py:102 views/list.py:29 +msgid "Null" +msgstr "Null" + +#: templates/xadmin/filters/char.html:13 +msgid "Enter" +msgstr "Eingabe" + +#: templates/xadmin/filters/date.html:10 templates/xadmin/filters/date.html:13 +msgid "Choice Date" +msgstr "Auswahldatum" + +#: templates/xadmin/filters/date.html:18 +msgid "YY" +msgstr "YY" + +#: templates/xadmin/filters/date.html:19 +msgid "year" +msgstr "Jahr" + +#: templates/xadmin/filters/date.html:22 +msgid "MM" +msgstr "MM" + +#: templates/xadmin/filters/date.html:23 +msgid "month" +msgstr "Monat" + +#: templates/xadmin/filters/date.html:26 +msgid "DD" +msgstr "DD" + +#: templates/xadmin/filters/date.html:27 +msgid "day" +msgstr "Tag" + +#: templates/xadmin/filters/date.html:29 templates/xadmin/filters/date.html:46 +#: templates/xadmin/filters/date.html:54 +#: templates/xadmin/filters/fk_search.html:24 +#: templates/xadmin/filters/number.html:37 +msgid "Apply" +msgstr "Anwenden" + +#: templates/xadmin/filters/date.html:34 +msgid "Date Range" +msgstr "Datumsintervall" + +#: templates/xadmin/filters/date.html:41 +msgid "Select Date" +msgstr "Datum wählen" + +#: templates/xadmin/filters/date.html:42 +msgid "From" +msgstr "Von" + +#: templates/xadmin/filters/date.html:44 +msgid "To" +msgstr "Bis" + +#: templates/xadmin/filters/fk_search.html:14 +#, fuzzy +#| msgid "Select Date" +msgid "Select" +msgstr "Datum wählen" + +#: templates/xadmin/filters/fk_search.html:26 +#: templates/xadmin/filters/number.html:39 +msgid "Clean" +msgstr "Entfernen" + +#: templates/xadmin/filters/number.html:17 +#: templates/xadmin/filters/number.html:25 +#: templates/xadmin/filters/number.html:33 +msgid "Enter Number" +msgstr "Zahl eingeben" + +#: templates/xadmin/filters/rel.html:3 +#, python-format +msgid " By %(filter_title)s " +msgstr "Mittels %(filter_title)s" + +#: templates/xadmin/forms/transfer.html:4 +msgid "Available" +msgstr "Verfügbar" + +#: templates/xadmin/forms/transfer.html:12 +msgid "Click to choose all at once." +msgstr "Klicken um alles auf einmal auszuwählen." + +#: templates/xadmin/forms/transfer.html:12 +msgid "Choose all" +msgstr "Alles auswählen" + +#: templates/xadmin/forms/transfer.html:16 +msgid "Choose" +msgstr "Wähle" + +#: templates/xadmin/forms/transfer.html:19 +#: templates/xadmin/widgets/base.html:40 +msgid "Remove" +msgstr "Entferne" + +#: templates/xadmin/forms/transfer.html:23 +msgid "Chosen" +msgstr "Gewählt" + +#: templates/xadmin/forms/transfer.html:27 +msgid "Click to remove all chosen at once." +msgstr "Klicken um alles Ausgewählte sofort zu löschen." + +#: templates/xadmin/forms/transfer.html:27 +msgid "Remove all" +msgstr "Alles entfernen" + +#: templates/xadmin/includes/pagination.html:9 +msgid "Show all" +msgstr "Alles anzeigen" + +#: templates/xadmin/includes/submit_line.html:10 +#: templates/xadmin/includes/submit_line.html:13 +#: templates/xadmin/views/form.html:30 templates/xadmin/views/form.html:31 +msgid "Saving.." +msgstr "Speichern..." + +#: templates/xadmin/includes/submit_line.html:17 +msgid "Save as new" +msgstr "Als neu abspeichern" + +#: templates/xadmin/includes/submit_line.html:18 +msgid "Save and add another" +msgstr "Speichern und neu hinzufügen" + +#: templates/xadmin/includes/submit_line.html:19 +msgid "Save and continue editing" +msgstr "Speichern und weiter bearbeiten" + +#: templates/xadmin/includes/submit_line.html:24 +#: templates/xadmin/views/model_detail.html:28 views/delete.py:93 +msgid "Delete" +msgstr "Löschen" + +#: templates/xadmin/views/app_index.html:13 +#, python-format +msgid "%(name)s" +msgstr "%(name)s" + +#: templates/xadmin/views/batch_change_form.html:11 +msgid "Change multiple objects" +msgstr "Mehrere Objekte ändern" + +#: templates/xadmin/views/batch_change_form.html:16 +#, python-format +msgid "Change one %(objects_name)s" +msgid_plural "Batch change %(counter)s %(objects_name)s" +msgstr[0] "Anpassung von %(objects_name)s" +msgstr[1] "Anpassung aller %(counter)s %(objects_name)s" + +#: templates/xadmin/views/batch_change_form.html:38 +msgid "Change Multiple" +msgstr "Mehrere andern" + +#: templates/xadmin/views/dashboard.html:15 +#: templates/xadmin/views/dashboard.html:22 +#: templates/xadmin/views/dashboard.html:23 +msgid "Add Widget" +msgstr "Widget hinzufügen" + +#: templates/xadmin/views/invalid_setup.html:13 +msgid "" +"Something's wrong with your database installation. Make sure the appropriate " +"database tables have been created, and make sure the database is readable by " +"the appropriate user." +msgstr "" + +#: templates/xadmin/views/logged_out.html:16 +msgid "Logout Success" +msgstr "Logout erfolgreich" + +#: templates/xadmin/views/logged_out.html:17 +msgid "Thanks for spending some quality time with the Web site today." +msgstr "Danke, dass Sie ein paar nette Minuten hier verbracht haben." + +#: templates/xadmin/views/logged_out.html:19 +msgid "Close Window" +msgstr "Fenster schließen" + +#: templates/xadmin/views/logged_out.html:20 +msgid "Log in again" +msgstr "Wieder einloggen" + +#: templates/xadmin/views/login.html:39 views/website.py:38 +msgid "Please Login" +msgstr "Bitte loggen Sie sich ein" + +#: templates/xadmin/views/login.html:52 +msgid "Username" +msgstr "Benutzername" + +#: templates/xadmin/views/login.html:64 +msgid "Password" +msgstr "Passwort" + +#: templates/xadmin/views/login.html:75 +msgid "log in" +msgstr "einloggen" + +#: templates/xadmin/views/model_dashboard.html:26 +#: templates/xadmin/views/model_detail.html:25 +msgid "Edit" +msgstr "Bearbeiten" + +#: templates/xadmin/views/model_delete_confirm.html:11 +#, python-format +msgid "" +"Deleting the %(verbose_name)s '%(escaped_object)s' would result in deleting " +"related objects, but your account doesn't have permission to delete the " +"following types of objects:" +msgstr "" + +#: templates/xadmin/views/model_delete_confirm.html:19 +#, python-format +msgid "" +"Deleting the %(verbose_name)s '%(escaped_object)s' would require deleting " +"the following protected related objects:" +msgstr "" + +#: templates/xadmin/views/model_delete_confirm.html:27 +#, python-format +msgid "" +"Are you sure you want to delete the %(verbose_name)s \"%(escaped_object)s\"? " +"All of the following related items will be deleted:" +msgstr "" + +#: templates/xadmin/views/model_delete_confirm.html:34 +#: templates/xadmin/views/model_delete_selected_confirm.html:49 +msgid "Yes, I'm sure" +msgstr "Ja, na klar!" + +#: templates/xadmin/views/model_delete_confirm.html:35 +#: templates/xadmin/views/model_delete_selected_confirm.html:50 +msgid "Cancel" +msgstr "Abbruch" + +#: templates/xadmin/views/model_delete_selected_confirm.html:10 +msgid "Delete multiple objects" +msgstr "Mehrere Objekte löschen" + +#: templates/xadmin/views/model_delete_selected_confirm.html:18 +#, python-format +msgid "" +"Deleting the selected %(objects_name)s would result in deleting related " +"objects, but your account doesn't have permission to delete the following " +"types of objects:" +msgstr "" + +#: templates/xadmin/views/model_delete_selected_confirm.html:26 +#, python-format +msgid "" +"Deleting the selected %(objects_name)s would require deleting the following " +"protected related objects:" +msgstr "" + +#: templates/xadmin/views/model_delete_selected_confirm.html:34 +#, python-format +msgid "" +"Are you sure you want to delete the selected %(objects_name)s? All of the " +"following objects and their related items will be deleted:" +msgstr "" + +#: templates/xadmin/views/model_history.html:26 +msgid "Diff" +msgstr "Delta" + +#: templates/xadmin/views/model_history.html:27 +#: templates/xadmin/views/recover_list.html:25 +msgid "Date/time" +msgstr "Datum/Uhrzeit" + +#: templates/xadmin/views/model_history.html:28 +msgid "User" +msgstr "Benutzer" + +#: templates/xadmin/views/model_history.html:29 +msgid "Comment" +msgstr "Kommentar" + +#: templates/xadmin/views/model_history.html:54 +msgid "Diff Select Versions" +msgstr "" + +#: templates/xadmin/views/model_history.html:58 +msgid "" +"This object doesn't have a change history. It probably wasn't added via this " +"admin site." +msgstr "" + +#: templates/xadmin/views/model_list.html:29 +#, python-format +msgid "Add %(name)s" +msgstr "%(name)s hinzufügen" + +#: templates/xadmin/views/model_list.html:39 +#, fuzzy +msgid "Columns" +msgstr "Spalten" + +#: templates/xadmin/views/model_list.html:42 +msgid "Restore Selected" +msgstr "Gewähltes wiederherstellen" + +#: templates/xadmin/views/model_list.html:147 +#: templates/xadmin/widgets/list.html:33 +msgid "Empty list" +msgstr "Leere Liste" + +#: templates/xadmin/views/recover_form.html:20 +msgid "Press the recover button below to recover this version of the object." +msgstr "" + +#: templates/xadmin/views/recover_list.html:19 +msgid "" +"Choose a date from the list below to recover a deleted version of an object." +msgstr "" + +#: templates/xadmin/views/recover_list.html:39 +msgid "There are no deleted objects to recover." +msgstr "Es gibt keine gelöschten Objekte wiederherzustellen." + +#: templates/xadmin/views/revision_diff.html:12 +#: templates/xadmin/views/revision_diff.html:17 +#, python-format +msgid "Diff %(verbose_name)s" +msgstr "Delta zwischen %(verbose_name)s" + +#: templates/xadmin/views/revision_diff.html:25 +msgid "Field" +msgstr "Feld" + +#: templates/xadmin/views/revision_diff.html:26 +msgid "Version A" +msgstr "Version A" + +#: templates/xadmin/views/revision_diff.html:27 +msgid "Version B" +msgstr "Version B" + +#: templates/xadmin/views/revision_diff.html:39 +msgid "Revert to" +msgstr "" + +#: templates/xadmin/views/revision_diff.html:40 +#: templates/xadmin/views/revision_diff.html:41 +msgid "Revert" +msgstr "" + +#: templates/xadmin/views/revision_form.html:16 +#, python-format +msgid "Revert %(verbose_name)s" +msgstr "" + +#: templates/xadmin/views/revision_form.html:21 +msgid "Press the revert button below to revert to this version of the object." +msgstr "" + +#: templates/xadmin/views/revision_form.html:27 +msgid "Revert this revision" +msgstr "Diese Überarbeitung umkehren." + +#: templates/xadmin/widgets/addform.html:14 +msgid "Success" +msgstr "Erfolg" + +#: templates/xadmin/widgets/addform.html:14 +msgid "Add success, click edit to edit." +msgstr "" + +#: templates/xadmin/widgets/addform.html:17 +msgid "Quick Add" +msgstr "Schnelles Hinzufügen" + +#: templates/xadmin/widgets/base.html:31 +msgid "Widget Options" +msgstr "Widget Optionen" + +#: templates/xadmin/widgets/base.html:42 +msgid "Save changes" +msgstr "Änderungen speichern" + +#: views/base.py:315 +msgid "Django Xadmin" +msgstr "Django Xadmin" + +#: views/base.py:316 +msgid "my-company.inc" +msgstr "" + +#: views/dashboard.py:186 +msgid "Widget ID" +msgstr "Widget ID" + +#: views/dashboard.py:187 +msgid "Widget Title" +msgstr "Widget Titel" + +#: views/dashboard.py:252 +msgid "Html Content Widget, can write any html content in widget." +msgstr "" + +#: views/dashboard.py:255 +msgid "Html Content" +msgstr "Html Inhalt" + +#: views/dashboard.py:318 +msgid "Target Model" +msgstr "Zielmodell" + +#: views/dashboard.py:369 +msgid "Quick button Widget, quickly open any page." +msgstr "" +"Schnellauswahlbutton Widget, zum schnellen Öffnen einer beliebigen Seite." + +#: views/dashboard.py:371 +msgid "Quick Buttons" +msgstr "Schnellauswahl Buttons" + +#: views/dashboard.py:416 +msgid "Any Objects list Widget." +msgstr "Beliebige Objektliste Widget." + +#: views/dashboard.py:456 +msgid "Add any model object Widget." +msgstr "Fügen Sie ein beliebiges Modell Objekt Widget hinzu." + +#: views/dashboard.py:492 +msgid "Dashboard" +msgstr "Armaturentafel" + +#: views/dashboard.py:633 +#, python-format +msgid "%s Dashboard" +msgstr "%s Armaturentafel" + +#: views/delete.py:103 +#, python-format +msgid "The %(name)s \"%(obj)s\" was deleted successfully." +msgstr "" + +#: views/detail.py:173 views/edit.py:211 views/form.py:72 +msgid "Other Fields" +msgstr "Andere Felder" + +#: views/detail.py:235 +#, python-format +msgid "%s Detail" +msgstr "%s Einzelheiten" + +#: views/edit.py:253 +msgid "Added." +msgstr "" + +#: views/edit.py:255 +#, fuzzy, python-format +#| msgid "Change %s" +msgid "Changed %s." +msgstr "Ändern %s" + +#: views/edit.py:255 +msgid "and" +msgstr "" + +#: views/edit.py:258 +msgid "No fields changed." +msgstr "" + +#: views/edit.py:420 +#, python-format +msgid "The %(name)s \"%(obj)s\" was added successfully." +msgstr "%(name)s \"%(obj)s\" wurde erfolgreich hinzugefügt." + +#: views/edit.py:425 views/edit.py:520 +msgid "You may edit it again below." +msgstr "Sie können es trotzdem nochmals bearbeiten." + +#: views/edit.py:429 views/edit.py:523 +#, python-format +msgid "You may add another %s below." +msgstr "Sie können unten ein weiteres %s hinzufügen." + +#: views/edit.py:471 +#, python-format +msgid "Change %s" +msgstr "Ändern %s" + +#: views/edit.py:516 +#, python-format +msgid "The %(name)s \"%(obj)s\" was changed successfully." +msgstr "" + +#: views/form.py:165 +#, fuzzy, python-format +msgid "The %s was changed successfully." +msgstr "Passwort erfolgreich geändert." + +#: views/list.py:199 +msgid "Database error" +msgstr "Datenbankfehler" + +#: views/list.py:373 +#, python-format +msgid "%s List" +msgstr "%s Liste" + +#: views/list.py:499 +msgid "Sort ASC" +msgstr "Aufsteigend sortieren" + +#: views/list.py:500 +msgid "Sort DESC" +msgstr "Absteigend sortieren" + +#: views/list.py:504 +msgid "Cancel Sort" +msgstr "Sortierung abbrechen" + +#: views/website.py:16 +msgid "Main Dashboard" +msgstr "Hauptübersicht" + +#: widgets.py:48 +msgid "Now" +msgstr "Jetzt" diff --git "a/8\343\200\201\346\226\207\347\214\256\346\225\260\346\215\256\346\214\226\346\216\230\347\263\273\347\273\237(\351\231\204\346\272\220\347\240\201)/extra_apps/xadmin/locale/de_DE/LC_MESSAGES/djangojs.mo" "b/8\343\200\201\346\226\207\347\214\256\346\225\260\346\215\256\346\214\226\346\216\230\347\263\273\347\273\237(\351\231\204\346\272\220\347\240\201)/extra_apps/xadmin/locale/de_DE/LC_MESSAGES/djangojs.mo" new file mode 100644 index 0000000..effeda4 Binary files /dev/null and "b/8\343\200\201\346\226\207\347\214\256\346\225\260\346\215\256\346\214\226\346\216\230\347\263\273\347\273\237(\351\231\204\346\272\220\347\240\201)/extra_apps/xadmin/locale/de_DE/LC_MESSAGES/djangojs.mo" differ diff --git "a/8\343\200\201\346\226\207\347\214\256\346\225\260\346\215\256\346\214\226\346\216\230\347\263\273\347\273\237(\351\231\204\346\272\220\347\240\201)/extra_apps/xadmin/locale/de_DE/LC_MESSAGES/djangojs.po" "b/8\343\200\201\346\226\207\347\214\256\346\225\260\346\215\256\346\214\226\346\216\230\347\263\273\347\273\237(\351\231\204\346\272\220\347\240\201)/extra_apps/xadmin/locale/de_DE/LC_MESSAGES/djangojs.po" new file mode 100644 index 0000000..11bd775 --- /dev/null +++ "b/8\343\200\201\346\226\207\347\214\256\346\225\260\346\215\256\346\214\226\346\216\230\347\263\273\347\273\237(\351\231\204\346\272\220\347\240\201)/extra_apps/xadmin/locale/de_DE/LC_MESSAGES/djangojs.po" @@ -0,0 +1,72 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER +# This file is distributed under the same license as the PACKAGE package. +# +# Translators: +# Azd325 , 2013 +# Azd325 , 2013 +msgid "" +msgstr "" +"Project-Id-Version: xadmin-core\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2013-04-30 23:11+0800\n" +"PO-Revision-Date: 2013-11-20 12:41+0000\n" +"Last-Translator: Azd325 \n" +"Language-Team: German (Germany) (http://www.transifex.com/projects/p/xadmin/language/de_DE/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: de_DE\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +#: static/xadmin/js/xadmin.plugin.actions.js:20 +msgid "%(sel)s of %(cnt)s selected" +msgid_plural "%(sel)s of %(cnt)s selected" +msgstr[0] "%(sel)s von %(cnt)s markiert" +msgstr[1] "%(sel)s von %(cnt)s markiert" + +#: static/xadmin/js/xadmin.plugin.revision.js:25 +msgid "New Item" +msgstr "Neues Element" + +#: static/xadmin/js/xadmin.widget.datetime.js:32 +msgid "Sunday Monday Tuesday Wednesday Thursday Friday Saturday Sunday" +msgstr "Sonntag Montag Dienstag Mittwoch Donnerstag Freitag Samstag Sonntag" + +#: static/xadmin/js/xadmin.widget.datetime.js:33 +msgid "Sun Mon Tue Wed Thu Fri Sat Sun" +msgstr "So Mo Di Mi Do Fr Sa So" + +#: static/xadmin/js/xadmin.widget.datetime.js:34 +msgid "Su Mo Tu We Th Fr Sa Su" +msgstr "So Mo Di Mi Do Fr Sa So" + +#: static/xadmin/js/xadmin.widget.datetime.js:35 +msgid "" +"January February March April May June July August September October November" +" December" +msgstr "Januar Februar März April Mai Juni Juli August September Oktober November Dezember" + +#: static/xadmin/js/xadmin.widget.datetime.js:36 +msgid "Jan Feb Mar Apr May Jun Jul Aug Sep Oct Nov Dec" +msgstr "Jan Feb Mär Apr Mai Jun Jul Aug Sep Okt Nov Dez" + +#: static/xadmin/js/xadmin.widget.datetime.js:37 +msgid "Today" +msgstr "Heute" + +#: static/xadmin/js/xadmin.widget.datetime.js:38 +msgid "%a %d %b %Y %T %Z" +msgstr "%a %d %b %Y %T %Z" + +#: static/xadmin/js/xadmin.widget.datetime.js:39 +msgid "AM PM" +msgstr "vorm nachm" + +#: static/xadmin/js/xadmin.widget.datetime.js:40 +msgid "am pm" +msgstr "vorm nachm" + +#: static/xadmin/js/xadmin.widget.datetime.js:43 +msgid "%T" +msgstr "%T" diff --git "a/8\343\200\201\346\226\207\347\214\256\346\225\260\346\215\256\346\214\226\346\216\230\347\263\273\347\273\237(\351\231\204\346\272\220\347\240\201)/extra_apps/xadmin/locale/en/LC_MESSAGES/django.mo" "b/8\343\200\201\346\226\207\347\214\256\346\225\260\346\215\256\346\214\226\346\216\230\347\263\273\347\273\237(\351\231\204\346\272\220\347\240\201)/extra_apps/xadmin/locale/en/LC_MESSAGES/django.mo" new file mode 100644 index 0000000..46394b0 Binary files /dev/null and "b/8\343\200\201\346\226\207\347\214\256\346\225\260\346\215\256\346\214\226\346\216\230\347\263\273\347\273\237(\351\231\204\346\272\220\347\240\201)/extra_apps/xadmin/locale/en/LC_MESSAGES/django.mo" differ diff --git "a/8\343\200\201\346\226\207\347\214\256\346\225\260\346\215\256\346\214\226\346\216\230\347\263\273\347\273\237(\351\231\204\346\272\220\347\240\201)/extra_apps/xadmin/locale/en/LC_MESSAGES/django.po" "b/8\343\200\201\346\226\207\347\214\256\346\225\260\346\215\256\346\214\226\346\216\230\347\263\273\347\273\237(\351\231\204\346\272\220\347\240\201)/extra_apps/xadmin/locale/en/LC_MESSAGES/django.po" new file mode 100644 index 0000000..8f291d5 --- /dev/null +++ "b/8\343\200\201\346\226\207\347\214\256\346\225\260\346\215\256\346\214\226\346\216\230\347\263\273\347\273\237(\351\231\204\346\272\220\347\240\201)/extra_apps/xadmin/locale/en/LC_MESSAGES/django.po" @@ -0,0 +1,1411 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER +# This file is distributed under the same license as the PACKAGE package. +# FIRST AUTHOR , YEAR. +# +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: PACKAGE VERSION\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2016-07-20 13:28+0800\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: FULL NAME \n" +"Language-Team: LANGUAGE \n" +"Language: \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=2; plural=1;\n" + +#: adminx.py:19 +msgid "Admin Object" +msgstr "" + +#: apps.py:11 +msgid "Administration" +msgstr "" + +#: filters.py:159 filters.py:191 filters.py:407 filters.py:493 filters.py:531 +msgid "All" +msgstr "" + +#: filters.py:160 plugins/export.py:165 +msgid "Yes" +msgstr "" + +#: filters.py:161 plugins/export.py:165 +msgid "No" +msgstr "" + +#: filters.py:175 +msgid "Unknown" +msgstr "" + +#: filters.py:267 +msgid "Any date" +msgstr "" + +#: filters.py:268 +msgid "Has date" +msgstr "" + +#: filters.py:271 +msgid "Has no date" +msgstr "" + +#: filters.py:274 widgets.py:30 +msgid "Today" +msgstr "" + +#: filters.py:278 +msgid "Past 7 days" +msgstr "" + +#: filters.py:282 +msgid "This month" +msgstr "" + +#: filters.py:286 +msgid "This year" +msgstr "" + +#: forms.py:10 +msgid "" +"Please enter the correct username and password for a staff account. Note " +"that both fields are case-sensitive." +msgstr "" + +#: forms.py:21 +msgid "Please log in again, because your session has expired." +msgstr "" + +#: forms.py:41 +#, python-format +msgid "Your e-mail address is not your username. Try '%s' instead." +msgstr "" + +#: models.py:48 +msgid "Title" +msgstr "" + +#: models.py:49 models.py:88 models.py:107 models.py:149 +msgid "user" +msgstr "" + +#: models.py:50 +msgid "Url Name" +msgstr "" + +#: models.py:52 +msgid "Query String" +msgstr "" + +#: models.py:53 +msgid "Is Shared" +msgstr "" + +#: models.py:66 plugins/bookmark.py:50 plugins/bookmark.py:180 +msgid "Bookmark" +msgstr "" + +#: models.py:67 +msgid "Bookmarks" +msgstr "" + +#: models.py:89 +msgid "Settings Key" +msgstr "" + +#: models.py:90 +msgid "Settings Content" +msgstr "" + +#: models.py:102 +msgid "User Setting" +msgstr "" + +#: models.py:103 +msgid "User Settings" +msgstr "" + +#: models.py:108 +msgid "Page" +msgstr "" + +#: models.py:109 views/dashboard.py:82 views/dashboard.py:92 +msgid "Widget Type" +msgstr "" + +#: models.py:110 views/dashboard.py:83 +msgid "Widget Params" +msgstr "" + +#: models.py:137 +msgid "User Widget" +msgstr "" + +#: models.py:138 +msgid "User Widgets" +msgstr "" + +#: models.py:142 +msgid "action time" +msgstr "" + +#: models.py:151 +msgid "action ip" +msgstr "" + +#: models.py:155 +msgid "content type" +msgstr "" + +#: models.py:158 +msgid "object id" +msgstr "" + +#: models.py:159 +msgid "object repr" +msgstr "" + +#: models.py:160 +msgid "action flag" +msgstr "" + +#: models.py:161 +msgid "change message" +msgstr "" + +#: models.py:164 +msgid "log entry" +msgstr "" + +#: models.py:165 +msgid "log entries" +msgstr "" + +#: models.py:173 +#, python-format +msgid "Added \"%(object)s\"." +msgstr "" + +#: models.py:175 +#, python-format +msgid "Changed \"%(object)s\" - %(changes)s" +msgstr "" + +#: models.py:180 +#, python-format +msgid "Deleted \"%(object)s.\"" +msgstr "" + +#: plugins/actions.py:57 +#, python-format +msgid "Delete selected %(verbose_name_plural)s" +msgstr "" + +#: plugins/actions.py:72 +#, python-format +msgid "Batch delete %(count)d %(items)s." +msgstr "" + +#: plugins/actions.py:78 +#, python-format +msgid "Successfully deleted %(count)d %(items)s." +msgstr "" + +#: plugins/actions.py:110 views/delete.py:70 +#, python-format +msgid "Cannot delete %(name)s" +msgstr "" + +#: plugins/actions.py:112 views/delete.py:73 +msgid "Are you sure?" +msgstr "" + +#: plugins/actions.py:158 +#, python-format +msgid "%(total_count)s selected" +msgid_plural "All %(total_count)s selected" +msgstr[0] "" +msgstr[1] "" + +#: plugins/actions.py:162 +#, python-format +msgid "0 of %(cnt)s selected" +msgstr "" + +#: plugins/actions.py:179 plugins/actions.py:189 +msgid "" +"Items must be selected in order to perform actions on them. No items have " +"been changed." +msgstr "" + +#: plugins/aggregation.py:14 +msgid "Min" +msgstr "" + +#: plugins/aggregation.py:14 +msgid "Max" +msgstr "" + +#: plugins/aggregation.py:14 +msgid "Avg" +msgstr "" + +#: plugins/aggregation.py:14 +msgid "Sum" +msgstr "" + +#: plugins/aggregation.py:14 +msgid "Count" +msgstr "" + +#: plugins/auth.py:21 +#, python-format +msgid "Can add %s" +msgstr "" + +#: plugins/auth.py:22 +#, python-format +msgid "Can change %s" +msgstr "" + +#: plugins/auth.py:23 +#, python-format +msgid "Can edit %s" +msgstr "" + +#: plugins/auth.py:24 +#, python-format +msgid "Can delete %s" +msgstr "" + +#: plugins/auth.py:25 +#, python-format +msgid "Can view %s" +msgstr "" + +#: plugins/auth.py:87 +msgid "Personal info" +msgstr "" + +#: plugins/auth.py:91 +msgid "Permissions" +msgstr "" + +#: plugins/auth.py:94 +msgid "Important dates" +msgstr "" + +#: plugins/auth.py:99 +msgid "Status" +msgstr "" + +#: plugins/auth.py:111 +msgid "Permission Name" +msgstr "" + +#: plugins/auth.py:167 +#, fuzzy +msgid "Change Password" +msgstr "Changed Password" + +#: plugins/auth.py:198 +#, python-format +msgid "Change password: %s" +msgstr "" + +#: plugins/auth.py:223 plugins/auth.py:255 +msgid "Password changed successfully." +msgstr "" + +#: plugins/auth.py:242 templates/xadmin/auth/user/change_password.html:11 +#: templates/xadmin/auth/user/change_password.html:22 +#: templates/xadmin/auth/user/change_password.html:55 +msgid "Change password" +msgstr "" + +#: plugins/batch.py:44 +msgid "Change this field" +msgstr "" + +#: plugins/batch.py:65 +#, python-format +msgid "Batch Change selected %(verbose_name_plural)s" +msgstr "" + +#: plugins/batch.py:89 +#, python-format +msgid "Successfully change %(count)d %(items)s." +msgstr "" + +#: plugins/batch.py:138 +#, python-format +msgid "Batch change %s" +msgstr "" + +#: plugins/bookmark.py:173 +msgid "bookmark" +msgstr "" + +#: plugins/bookmark.py:176 +msgid "Bookmark Widget, can show user's bookmark list data in widget." +msgstr "" + +#: plugins/chart.py:25 +msgid "Show models simple chart." +msgstr "" + +#: plugins/chart.py:51 +#, python-format +msgid "%s Charts" +msgstr "" + +#: plugins/comments.py:33 +msgid "Metadata" +msgstr "" + +#: plugins/comments.py:60 +msgid "flagged" +msgid_plural "flagged" +msgstr[0] "" +msgstr[1] "" + +#: plugins/comments.py:61 +msgid "Flag selected comments" +msgstr "" + +#: plugins/comments.py:66 +msgid "approved" +msgid_plural "approved" +msgstr[0] "" +msgstr[1] "" + +#: plugins/comments.py:67 +msgid "Approve selected comments" +msgstr "" + +#: plugins/comments.py:72 +msgid "removed" +msgid_plural "removed" +msgstr[0] "" +msgstr[1] "" + +#: plugins/comments.py:73 +msgid "Remove selected comments" +msgstr "" + +#: plugins/comments.py:86 +#, python-format +msgid "1 comment was successfully %(action)s." +msgid_plural "%(count)s comments were successfully %(action)s." +msgstr[0] "" +msgstr[1] "" + +#: plugins/details.py:52 views/list.py:578 +#, python-format +msgid "Details of %s" +msgstr "" + +#: plugins/editable.py:46 +#, python-format +msgid "Enter %s" +msgstr "" + +#: plugins/editable.py:73 views/dashboard.py:649 views/delete.py:27 +#: views/detail.py:145 views/edit.py:454 +#, python-format +msgid "%(name)s object with primary key %(key)r does not exist." +msgstr "" + +#: plugins/export.py:98 plugins/export.py:135 +msgid "Sheet" +msgstr "" + +#: plugins/filters.py:133 plugins/quickfilter.py:141 +#, python-format +msgid "Filtering error: %s" +msgstr "" + +#: plugins/images.py:29 +msgid "Previous" +msgstr "" + +#: plugins/images.py:29 +msgid "Next" +msgstr "" + +#: plugins/images.py:29 +msgid "Slideshow" +msgstr "" + +#: plugins/images.py:29 +msgid "Download" +msgstr "" + +#: plugins/images.py:50 +msgid "Change:" +msgstr "" + +#: plugins/layout.py:16 +msgid "Table" +msgstr "" + +#: plugins/layout.py:22 +msgid "Thumbnails" +msgstr "" + +#: plugins/passwords.py:64 +msgid "Forgotten your password or username?" +msgstr "" + +#: plugins/quickform.py:79 +#, python-format +msgid "Create New %s" +msgstr "" + +#: plugins/relate.py:104 +msgid "Related Objects" +msgstr "" + +#: plugins/relfield.py:29 plugins/topnav.py:38 +#, python-format +msgid "Search %s" +msgstr "" + +#: plugins/relfield.py:67 +#, python-format +msgid "Select %s" +msgstr "" + +#: plugins/themes.py:47 +msgid "Default" +msgstr "" + +#: plugins/themes.py:48 +msgid "Default bootstrap theme" +msgstr "" + +#: plugins/themes.py:49 +msgid "Bootstrap2" +msgstr "" + +#: plugins/themes.py:49 +msgid "Bootstrap 2.x theme" +msgstr "" + +#: plugins/topnav.py:62 views/dashboard.py:465 views/edit.py:387 +#: views/edit.py:396 +#, python-format +msgid "Add %s" +msgstr "" + +#: plugins/xversion.py:106 +msgid "Initial version." +msgstr "" + +#: plugins/xversion.py:108 +msgid "Change version." +msgstr "" + +#: plugins/xversion.py:110 +msgid "Revert version." +msgstr "" + +#: plugins/xversion.py:112 +msgid "Rercover version." +msgstr "" + +#: plugins/xversion.py:114 +#, python-format +msgid "Deleted %(verbose_name)s." +msgstr "" + +#: plugins/xversion.py:127 templates/xadmin/views/recover_form.html:26 +msgid "Recover" +msgstr "" + +#: plugins/xversion.py:143 templates/xadmin/views/model_history.html:11 +#: templates/xadmin/views/revision_diff.html:11 +#: templates/xadmin/views/revision_form.html:15 +msgid "History" +msgstr "" + +#: plugins/xversion.py:194 templates/xadmin/views/recover_form.html:14 +#: templates/xadmin/views/recover_list.html:10 +#, python-format +msgid "Recover deleted %(name)s" +msgstr "" + +#: plugins/xversion.py:238 +#, python-format +msgid "Change history: %s" +msgstr "" + +#: plugins/xversion.py:288 +msgid "Must select two versions." +msgstr "" + +#: plugins/xversion.py:296 +msgid "Please select two different versions." +msgstr "" + +#: plugins/xversion.py:383 plugins/xversion.py:500 +#, python-format +msgid "Current: %s" +msgstr "" + +#: plugins/xversion.py:424 +#, python-format +msgid "Revert %s" +msgstr "" + +#: plugins/xversion.py:440 +#, python-format +msgid "" +"The %(model)s \"%(name)s\" was reverted successfully. You may edit it again " +"below." +msgstr "" + +#: plugins/xversion.py:461 +#, python-format +msgid "Recover %s" +msgstr "" + +#: plugins/xversion.py:477 +#, python-format +msgid "" +"The %(model)s \"%(name)s\" was recovered successfully. You may edit it again " +"below." +msgstr "" + +#: templates/xadmin/404.html:4 templates/xadmin/404.html:8 +msgid "Page not found" +msgstr "" + +#: templates/xadmin/404.html:10 +msgid "We're sorry, but the requested page could not be found." +msgstr "" + +#: templates/xadmin/500.html:7 +#: templates/xadmin/auth/user/change_password.html:10 +#: templates/xadmin/auth/user/change_password.html:15 +#: templates/xadmin/base_site.html:53 +#: templates/xadmin/includes/sitemenu_default.html:7 +#: templates/xadmin/views/app_index.html:9 +#: templates/xadmin/views/batch_change_form.html:9 +#: templates/xadmin/views/invalid_setup.html:7 +#: templates/xadmin/views/model_dashboard.html:7 +#: templates/xadmin/views/model_delete_selected_confirm.html:8 +#: templates/xadmin/views/model_history.html:8 +#: templates/xadmin/views/recover_form.html:8 +#: templates/xadmin/views/recover_list.html:8 +#: templates/xadmin/views/revision_diff.html:8 +#: templates/xadmin/views/revision_form.html:8 views/base.py:473 +msgid "Home" +msgstr "" + +#: templates/xadmin/500.html:8 +msgid "Server error" +msgstr "" + +#: templates/xadmin/500.html:12 +msgid "Server error (500)" +msgstr "" + +#: templates/xadmin/500.html:15 +msgid "Server Error (500)" +msgstr "" + +#: templates/xadmin/500.html:16 +msgid "" +"There's been an error. It's been reported to the site administrators via e-" +"mail and should be fixed shortly. Thanks for your patience." +msgstr "" + +#: templates/xadmin/auth/password_reset/complete.html:11 +#: templates/xadmin/auth/password_reset/done.html:11 +msgid "Password reset successful" +msgstr "" + +#: templates/xadmin/auth/password_reset/complete.html:14 +msgid "Your password has been set. You may go ahead and log in now." +msgstr "" + +#: templates/xadmin/auth/password_reset/complete.html:15 +msgid "Log in" +msgstr "" + +#: templates/xadmin/auth/password_reset/confirm.html:12 +msgid "Enter new password" +msgstr "" + +#: templates/xadmin/auth/password_reset/confirm.html:17 +msgid "" +"Please enter your new password twice so we can verify you typed it in " +"correctly." +msgstr "" + +#: templates/xadmin/auth/password_reset/confirm.html:19 +msgid "Change my password" +msgstr "" + +#: templates/xadmin/auth/password_reset/confirm.html:24 +msgid "Password reset unsuccessful" +msgstr "" + +#: templates/xadmin/auth/password_reset/confirm.html:27 +msgid "" +"The password reset link was invalid, possibly because it has already been " +"used. Please request a new password reset." +msgstr "" + +#: templates/xadmin/auth/password_reset/done.html:14 +msgid "" +"We've e-mailed you instructions for setting your password to the e-mail " +"address you submitted. You should be receiving it shortly." +msgstr "" + +#: templates/xadmin/auth/password_reset/email.html:2 +#, python-format +msgid "" +"You're receiving this e-mail because you requested a password reset for your " +"user account at %(site_name)s." +msgstr "" + +#: templates/xadmin/auth/password_reset/email.html:4 +msgid "Please go to the following page and choose a new password:" +msgstr "" + +#: templates/xadmin/auth/password_reset/email.html:8 +msgid "Your username, in case you've forgotten:" +msgstr "" + +#: templates/xadmin/auth/password_reset/email.html:10 +msgid "Thanks for using our site!" +msgstr "" + +#: templates/xadmin/auth/password_reset/email.html:12 +#, python-format +msgid "The %(site_name)s team" +msgstr "" + +#: templates/xadmin/auth/password_reset/form.html:13 +msgid "Password reset" +msgstr "" + +#: templates/xadmin/auth/password_reset/form.html:17 +msgid "" +"Forgotten your password? Enter your e-mail address below, and we'll e-mail " +"instructions for setting a new one." +msgstr "" + +#: templates/xadmin/auth/password_reset/form.html:25 +msgid "E-mail address:" +msgstr "" + +#: templates/xadmin/auth/password_reset/form.html:33 +msgid "Reset my password" +msgstr "" + +#: templates/xadmin/auth/user/add_form.html:6 +msgid "" +"First, enter a username and password. Then, you'll be able to edit more user " +"options." +msgstr "" + +#: templates/xadmin/auth/user/add_form.html:8 +msgid "Enter a username and password." +msgstr "" + +#: templates/xadmin/auth/user/change_password.html:31 +#: templates/xadmin/views/batch_change_form.html:24 +#: templates/xadmin/views/form.html:18 +#: templates/xadmin/views/model_form.html:20 +msgid "Please correct the error below." +msgid_plural "Please correct the errors below." +msgstr[0] "" +msgstr[1] "" + +#: templates/xadmin/auth/user/change_password.html:38 +msgid "Enter your new password." +msgstr "" + +#: templates/xadmin/auth/user/change_password.html:40 +#, python-format +msgid "Enter a new password for the user %(username)s." +msgstr "" + +#: templates/xadmin/base_site.html:18 +msgid "Welcome," +msgstr "" + +#: templates/xadmin/base_site.html:24 +msgid "Log out" +msgstr "" + +#: templates/xadmin/base_site.html:36 +msgid "You don't have permission to edit anything." +msgstr "" + +#: templates/xadmin/blocks/comm.top.theme.html:4 +msgid "Themes" +msgstr "" + +#: templates/xadmin/blocks/comm.top.topnav.html:9 +#: templates/xadmin/blocks/model_list.nav_form.search_form.html:8 +#: templates/xadmin/filters/char.html:7 +#: templates/xadmin/filters/fk_search.html:7 +#: templates/xadmin/filters/fk_search.html:16 +#: templates/xadmin/filters/number.html:7 +msgid "Search" +msgstr "" + +#: templates/xadmin/blocks/comm.top.topnav.html:23 +msgid "Add" +msgstr "" + +#: templates/xadmin/blocks/model_form.submit_line.wizard.html:9 +#: templates/xadmin/blocks/model_form.submit_line.wizard.html:26 +msgid "Prev step" +msgstr "" + +#: templates/xadmin/blocks/model_form.submit_line.wizard.html:13 +#: templates/xadmin/blocks/model_form.submit_line.wizard.html:29 +msgid "Next step" +msgstr "" + +#: templates/xadmin/blocks/model_form.submit_line.wizard.html:15 +#: templates/xadmin/blocks/model_form.submit_line.wizard.html:31 +#: templates/xadmin/includes/submit_line.html:10 +#: templates/xadmin/includes/submit_line.html:13 +#: templates/xadmin/views/form.html:30 templates/xadmin/views/form.html:31 +msgid "Save" +msgstr "" + +#: templates/xadmin/blocks/model_list.nav_menu.bookmarks.html:7 +msgid "Clean Bookmarks" +msgstr "" + +#: templates/xadmin/blocks/model_list.nav_menu.bookmarks.html:18 +msgid "No Bookmarks" +msgstr "" + +#: templates/xadmin/blocks/model_list.nav_menu.bookmarks.html:22 +msgid "New Bookmark" +msgstr "" + +#: templates/xadmin/blocks/model_list.nav_menu.bookmarks.html:26 +msgid "Save current page as Bookmark" +msgstr "" + +#: templates/xadmin/blocks/model_list.nav_menu.bookmarks.html:32 +msgid "Enter bookmark title" +msgstr "" + +#: templates/xadmin/blocks/model_list.nav_menu.bookmarks.html:33 +msgid "Waiting" +msgstr "" + +#: templates/xadmin/blocks/model_list.nav_menu.bookmarks.html:33 +msgid "Save Bookmark" +msgstr "" + +#: templates/xadmin/blocks/model_list.nav_menu.filters.html:4 +msgid "Filters" +msgstr "" + +#: templates/xadmin/blocks/model_list.nav_menu.filters.html:8 +msgid "Clean Filters" +msgstr "" + +#: templates/xadmin/blocks/model_list.results_bottom.actions.html:19 +msgid "Click here to select the objects across all pages" +msgstr "" + +#: templates/xadmin/blocks/model_list.results_bottom.actions.html:19 +#, python-format +msgid "Select all %(total_count)s %(model_name)s" +msgstr "" + +#: templates/xadmin/blocks/model_list.results_bottom.actions.html:20 +msgid "Clear selection" +msgstr "" + +#: templates/xadmin/blocks/model_list.results_top.charts.html:4 +msgid "Charts" +msgstr "" + +#: templates/xadmin/blocks/model_list.top_toolbar.exports.html:4 +#: templates/xadmin/blocks/model_list.top_toolbar.exports.html:8 +#: templates/xadmin/blocks/model_list.top_toolbar.exports.html:19 +#: templates/xadmin/blocks/model_list.top_toolbar.exports.html:47 +msgid "Export" +msgstr "" + +#: templates/xadmin/blocks/model_list.top_toolbar.exports.html:26 +#: templates/xadmin/blocks/model_list.top_toolbar.exports.html:29 +#: templates/xadmin/blocks/model_list.top_toolbar.exports.html:32 +msgid "Export with table header." +msgstr "" + +#: templates/xadmin/blocks/model_list.top_toolbar.exports.html:35 +#: templates/xadmin/blocks/model_list.top_toolbar.exports.html:38 +msgid "Export with format." +msgstr "" + +#: templates/xadmin/blocks/model_list.top_toolbar.exports.html:42 +msgid "Export all data." +msgstr "" + +#: templates/xadmin/blocks/model_list.top_toolbar.exports.html:46 +#: templates/xadmin/widgets/base.html:41 +msgid "Close" +msgstr "" + +#: templates/xadmin/blocks/model_list.top_toolbar.layouts.html:4 +msgid "Layout" +msgstr "" + +#: templates/xadmin/blocks/model_list.top_toolbar.refresh.html:8 +msgid "Clean Refresh" +msgstr "" + +#: templates/xadmin/blocks/model_list.top_toolbar.refresh.html:14 +#, python-format +msgid "Every %(t)s seconds" +msgstr "" + +#: templates/xadmin/blocks/model_list.top_toolbar.saveorder.html:4 +msgid "Save Order" +msgstr "" + +#: templates/xadmin/edit_inline/blank.html:5 views/detail.py:23 +#: views/edit.py:102 views/list.py:29 +msgid "Null" +msgstr "" + +#: templates/xadmin/filters/char.html:13 +msgid "Enter" +msgstr "" + +#: templates/xadmin/filters/date.html:10 templates/xadmin/filters/date.html:13 +msgid "Choice Date" +msgstr "" + +#: templates/xadmin/filters/date.html:18 +msgid "YY" +msgstr "" + +#: templates/xadmin/filters/date.html:19 +msgid "year" +msgstr "" + +#: templates/xadmin/filters/date.html:22 +msgid "MM" +msgstr "" + +#: templates/xadmin/filters/date.html:23 +msgid "month" +msgstr "" + +#: templates/xadmin/filters/date.html:26 +msgid "DD" +msgstr "" + +#: templates/xadmin/filters/date.html:27 +msgid "day" +msgstr "" + +#: templates/xadmin/filters/date.html:29 templates/xadmin/filters/date.html:46 +#: templates/xadmin/filters/date.html:54 +#: templates/xadmin/filters/fk_search.html:24 +#: templates/xadmin/filters/number.html:37 +msgid "Apply" +msgstr "" + +#: templates/xadmin/filters/date.html:34 +msgid "Date Range" +msgstr "" + +#: templates/xadmin/filters/date.html:41 +msgid "Select Date" +msgstr "" + +#: templates/xadmin/filters/date.html:42 +msgid "From" +msgstr "" + +#: templates/xadmin/filters/date.html:44 +msgid "To" +msgstr "" + +#: templates/xadmin/filters/fk_search.html:14 +msgid "Select" +msgstr "" + +#: templates/xadmin/filters/fk_search.html:26 +#: templates/xadmin/filters/number.html:39 +msgid "Clean" +msgstr "" + +#: templates/xadmin/filters/number.html:17 +#: templates/xadmin/filters/number.html:25 +#: templates/xadmin/filters/number.html:33 +msgid "Enter Number" +msgstr "" + +#: templates/xadmin/filters/rel.html:3 +#, python-format +msgid " By %(filter_title)s " +msgstr "" + +#: templates/xadmin/forms/transfer.html:4 +msgid "Available" +msgstr "" + +#: templates/xadmin/forms/transfer.html:12 +msgid "Click to choose all at once." +msgstr "" + +#: templates/xadmin/forms/transfer.html:12 +msgid "Choose all" +msgstr "" + +#: templates/xadmin/forms/transfer.html:16 +msgid "Choose" +msgstr "" + +#: templates/xadmin/forms/transfer.html:19 +#: templates/xadmin/widgets/base.html:40 +msgid "Remove" +msgstr "" + +#: templates/xadmin/forms/transfer.html:23 +msgid "Chosen" +msgstr "" + +#: templates/xadmin/forms/transfer.html:27 +msgid "Click to remove all chosen at once." +msgstr "" + +#: templates/xadmin/forms/transfer.html:27 +msgid "Remove all" +msgstr "" + +#: templates/xadmin/includes/pagination.html:9 +msgid "Show all" +msgstr "" + +#: templates/xadmin/includes/submit_line.html:10 +#: templates/xadmin/includes/submit_line.html:13 +#: templates/xadmin/views/form.html:30 templates/xadmin/views/form.html:31 +msgid "Saving.." +msgstr "" + +#: templates/xadmin/includes/submit_line.html:17 +msgid "Save as new" +msgstr "" + +#: templates/xadmin/includes/submit_line.html:18 +msgid "Save and add another" +msgstr "" + +#: templates/xadmin/includes/submit_line.html:19 +msgid "Save and continue editing" +msgstr "" + +#: templates/xadmin/includes/submit_line.html:24 +#: templates/xadmin/views/model_detail.html:28 views/delete.py:93 +msgid "Delete" +msgstr "" + +#: templates/xadmin/views/app_index.html:13 +#, python-format +msgid "%(name)s" +msgstr "" + +#: templates/xadmin/views/batch_change_form.html:11 +msgid "Change multiple objects" +msgstr "" + +#: templates/xadmin/views/batch_change_form.html:16 +#, python-format +msgid "Change one %(objects_name)s" +msgid_plural "Batch change %(counter)s %(objects_name)s" +msgstr[0] "" +msgstr[1] "" + +#: templates/xadmin/views/batch_change_form.html:38 +msgid "Change Multiple" +msgstr "" + +#: templates/xadmin/views/dashboard.html:15 +#: templates/xadmin/views/dashboard.html:22 +#: templates/xadmin/views/dashboard.html:23 +msgid "Add Widget" +msgstr "" + +#: templates/xadmin/views/invalid_setup.html:13 +msgid "" +"Something's wrong with your database installation. Make sure the appropriate " +"database tables have been created, and make sure the database is readable by " +"the appropriate user." +msgstr "" + +#: templates/xadmin/views/logged_out.html:16 +msgid "Logout Success" +msgstr "" + +#: templates/xadmin/views/logged_out.html:17 +msgid "Thanks for spending some quality time with the Web site today." +msgstr "" + +#: templates/xadmin/views/logged_out.html:19 +msgid "Close Window" +msgstr "" + +#: templates/xadmin/views/logged_out.html:20 +msgid "Log in again" +msgstr "" + +#: templates/xadmin/views/login.html:39 views/website.py:38 +msgid "Please Login" +msgstr "" + +#: templates/xadmin/views/login.html:52 +msgid "Username" +msgstr "" + +#: templates/xadmin/views/login.html:64 +msgid "Password" +msgstr "" + +#: templates/xadmin/views/login.html:75 +msgid "log in" +msgstr "" + +#: templates/xadmin/views/model_dashboard.html:26 +#: templates/xadmin/views/model_detail.html:25 +msgid "Edit" +msgstr "" + +#: templates/xadmin/views/model_delete_confirm.html:11 +#, python-format +msgid "" +"Deleting the %(verbose_name)s '%(escaped_object)s' would result in deleting " +"related objects, but your account doesn't have permission to delete the " +"following types of objects:" +msgstr "" + +#: templates/xadmin/views/model_delete_confirm.html:19 +#, python-format +msgid "" +"Deleting the %(verbose_name)s '%(escaped_object)s' would require deleting " +"the following protected related objects:" +msgstr "" + +#: templates/xadmin/views/model_delete_confirm.html:27 +#, python-format +msgid "" +"Are you sure you want to delete the %(verbose_name)s \"%(escaped_object)s\"? " +"All of the following related items will be deleted:" +msgstr "" + +#: templates/xadmin/views/model_delete_confirm.html:34 +#: templates/xadmin/views/model_delete_selected_confirm.html:49 +msgid "Yes, I'm sure" +msgstr "" + +#: templates/xadmin/views/model_delete_confirm.html:35 +#: templates/xadmin/views/model_delete_selected_confirm.html:50 +msgid "Cancel" +msgstr "" + +#: templates/xadmin/views/model_delete_selected_confirm.html:10 +msgid "Delete multiple objects" +msgstr "" + +#: templates/xadmin/views/model_delete_selected_confirm.html:18 +#, python-format +msgid "" +"Deleting the selected %(objects_name)s would result in deleting related " +"objects, but your account doesn't have permission to delete the following " +"types of objects:" +msgstr "" + +#: templates/xadmin/views/model_delete_selected_confirm.html:26 +#, python-format +msgid "" +"Deleting the selected %(objects_name)s would require deleting the following " +"protected related objects:" +msgstr "" + +#: templates/xadmin/views/model_delete_selected_confirm.html:34 +#, python-format +msgid "" +"Are you sure you want to delete the selected %(objects_name)s? All of the " +"following objects and their related items will be deleted:" +msgstr "" + +#: templates/xadmin/views/model_history.html:26 +msgid "Diff" +msgstr "" + +#: templates/xadmin/views/model_history.html:27 +#: templates/xadmin/views/recover_list.html:25 +msgid "Date/time" +msgstr "" + +#: templates/xadmin/views/model_history.html:28 +msgid "User" +msgstr "" + +#: templates/xadmin/views/model_history.html:29 +msgid "Comment" +msgstr "" + +#: templates/xadmin/views/model_history.html:54 +msgid "Diff Select Versions" +msgstr "" + +#: templates/xadmin/views/model_history.html:58 +msgid "" +"This object doesn't have a change history. It probably wasn't added via this " +"admin site." +msgstr "" + +#: templates/xadmin/views/model_list.html:29 +#, python-format +msgid "Add %(name)s" +msgstr "" + +#: templates/xadmin/views/model_list.html:39 +msgid "Columns" +msgstr "" + +#: templates/xadmin/views/model_list.html:42 +msgid "Restore Selected" +msgstr "" + +#: templates/xadmin/views/model_list.html:147 +#: templates/xadmin/widgets/list.html:33 +msgid "Empty list" +msgstr "" + +#: templates/xadmin/views/recover_form.html:20 +msgid "Press the recover button below to recover this version of the object." +msgstr "" + +#: templates/xadmin/views/recover_list.html:19 +msgid "" +"Choose a date from the list below to recover a deleted version of an object." +msgstr "" + +#: templates/xadmin/views/recover_list.html:39 +msgid "There are no deleted objects to recover." +msgstr "" + +#: templates/xadmin/views/revision_diff.html:12 +#: templates/xadmin/views/revision_diff.html:17 +#, python-format +msgid "Diff %(verbose_name)s" +msgstr "" + +#: templates/xadmin/views/revision_diff.html:25 +msgid "Field" +msgstr "" + +#: templates/xadmin/views/revision_diff.html:26 +msgid "Version A" +msgstr "" + +#: templates/xadmin/views/revision_diff.html:27 +msgid "Version B" +msgstr "" + +#: templates/xadmin/views/revision_diff.html:39 +msgid "Revert to" +msgstr "" + +#: templates/xadmin/views/revision_diff.html:40 +#: templates/xadmin/views/revision_diff.html:41 +msgid "Revert" +msgstr "" + +#: templates/xadmin/views/revision_form.html:16 +#, python-format +msgid "Revert %(verbose_name)s" +msgstr "" + +#: templates/xadmin/views/revision_form.html:21 +msgid "Press the revert button below to revert to this version of the object." +msgstr "" + +#: templates/xadmin/views/revision_form.html:27 +msgid "Revert this revision" +msgstr "" + +#: templates/xadmin/widgets/addform.html:14 +msgid "Success" +msgstr "" + +#: templates/xadmin/widgets/addform.html:14 +msgid "Add success, click edit to edit." +msgstr "" + +#: templates/xadmin/widgets/addform.html:17 +msgid "Quick Add" +msgstr "" + +#: templates/xadmin/widgets/base.html:31 +msgid "Widget Options" +msgstr "" + +#: templates/xadmin/widgets/base.html:42 +msgid "Save changes" +msgstr "" + +#: views/base.py:315 +msgid "Django Xadmin" +msgstr "" + +#: views/base.py:316 +msgid "my-company.inc" +msgstr "" + +#: views/dashboard.py:186 +msgid "Widget ID" +msgstr "" + +#: views/dashboard.py:187 +msgid "Widget Title" +msgstr "" + +#: views/dashboard.py:252 +msgid "Html Content Widget, can write any html content in widget." +msgstr "" + +#: views/dashboard.py:255 +msgid "Html Content" +msgstr "" + +#: views/dashboard.py:318 +msgid "Target Model" +msgstr "" + +#: views/dashboard.py:369 +msgid "Quick button Widget, quickly open any page." +msgstr "" + +#: views/dashboard.py:371 +msgid "Quick Buttons" +msgstr "" + +#: views/dashboard.py:416 +msgid "Any Objects list Widget." +msgstr "" + +#: views/dashboard.py:456 +msgid "Add any model object Widget." +msgstr "" + +#: views/dashboard.py:492 +msgid "Dashboard" +msgstr "" + +#: views/dashboard.py:633 +#, python-format +msgid "%s Dashboard" +msgstr "" + +#: views/delete.py:103 +#, python-format +msgid "The %(name)s \"%(obj)s\" was deleted successfully." +msgstr "" + +#: views/detail.py:173 views/edit.py:211 views/form.py:72 +msgid "Other Fields" +msgstr "" + +#: views/detail.py:235 +#, python-format +msgid "%s Detail" +msgstr "" + +#: views/edit.py:253 +msgid "Added." +msgstr "" + +#: views/edit.py:255 +#, fuzzy, python-format +msgid "Changed %s." +msgstr "Changed Password" + +#: views/edit.py:255 +msgid "and" +msgstr "" + +#: views/edit.py:258 +msgid "No fields changed." +msgstr "" + +#: views/edit.py:420 +#, python-format +msgid "The %(name)s \"%(obj)s\" was added successfully." +msgstr "" + +#: views/edit.py:425 views/edit.py:520 +msgid "You may edit it again below." +msgstr "" + +#: views/edit.py:429 views/edit.py:523 +#, python-format +msgid "You may add another %s below." +msgstr "" + +#: views/edit.py:471 +#, python-format +msgid "Change %s" +msgstr "" + +#: views/edit.py:516 +#, python-format +msgid "The %(name)s \"%(obj)s\" was changed successfully." +msgstr "" + +#: views/form.py:165 +#, python-format +msgid "The %s was changed successfully." +msgstr "" + +#: views/list.py:199 +msgid "Database error" +msgstr "" + +#: views/list.py:373 +#, python-format +msgid "%s List" +msgstr "" + +#: views/list.py:499 +msgid "Sort ASC" +msgstr "" + +#: views/list.py:500 +msgid "Sort DESC" +msgstr "" + +#: views/list.py:504 +msgid "Cancel Sort" +msgstr "" + +#: views/website.py:16 +msgid "Main Dashboard" +msgstr "" + +#: widgets.py:48 +msgid "Now" +msgstr "" diff --git "a/8\343\200\201\346\226\207\347\214\256\346\225\260\346\215\256\346\214\226\346\216\230\347\263\273\347\273\237(\351\231\204\346\272\220\347\240\201)/extra_apps/xadmin/locale/en/LC_MESSAGES/djangojs.mo" "b/8\343\200\201\346\226\207\347\214\256\346\225\260\346\215\256\346\214\226\346\216\230\347\263\273\347\273\237(\351\231\204\346\272\220\347\240\201)/extra_apps/xadmin/locale/en/LC_MESSAGES/djangojs.mo" new file mode 100644 index 0000000..9702706 Binary files /dev/null and "b/8\343\200\201\346\226\207\347\214\256\346\225\260\346\215\256\346\214\226\346\216\230\347\263\273\347\273\237(\351\231\204\346\272\220\347\240\201)/extra_apps/xadmin/locale/en/LC_MESSAGES/djangojs.mo" differ diff --git "a/8\343\200\201\346\226\207\347\214\256\346\225\260\346\215\256\346\214\226\346\216\230\347\263\273\347\273\237(\351\231\204\346\272\220\347\240\201)/extra_apps/xadmin/locale/en/LC_MESSAGES/djangojs.po" "b/8\343\200\201\346\226\207\347\214\256\346\225\260\346\215\256\346\214\226\346\216\230\347\263\273\347\273\237(\351\231\204\346\272\220\347\240\201)/extra_apps/xadmin/locale/en/LC_MESSAGES/djangojs.po" new file mode 100644 index 0000000..2cbb726 --- /dev/null +++ "b/8\343\200\201\346\226\207\347\214\256\346\225\260\346\215\256\346\214\226\346\216\230\347\263\273\347\273\237(\351\231\204\346\272\220\347\240\201)/extra_apps/xadmin/locale/en/LC_MESSAGES/djangojs.po" @@ -0,0 +1,69 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER +# This file is distributed under the same license as the PACKAGE package. +# FIRST AUTHOR , YEAR. +# +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: PACKAGE VERSION\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2013-04-30 23:11+0800\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: FULL NAME \n" +"Language: \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" + +#: static/xadmin/js/xadmin.plugin.actions.js:20 +msgid "%(sel)s of %(cnt)s selected" +msgid_plural "%(sel)s of %(cnt)s selected" +msgstr[0] "" +msgstr[1] "" + +#: static/xadmin/js/xadmin.plugin.revision.js:25 +msgid "New Item" +msgstr "" + +#: static/xadmin/js/xadmin.widget.datetime.js:32 +msgid "Sunday Monday Tuesday Wednesday Thursday Friday Saturday Sunday" +msgstr "" + +#: static/xadmin/js/xadmin.widget.datetime.js:33 +msgid "Sun Mon Tue Wed Thu Fri Sat Sun" +msgstr "" + +#: static/xadmin/js/xadmin.widget.datetime.js:34 +msgid "Su Mo Tu We Th Fr Sa Su" +msgstr "" + +#: static/xadmin/js/xadmin.widget.datetime.js:35 +msgid "" +"January February March April May June July August September October November " +"December" +msgstr "" + +#: static/xadmin/js/xadmin.widget.datetime.js:36 +msgid "Jan Feb Mar Apr May Jun Jul Aug Sep Oct Nov Dec" +msgstr "" + +#: static/xadmin/js/xadmin.widget.datetime.js:37 +msgid "Today" +msgstr "" + +#: static/xadmin/js/xadmin.widget.datetime.js:38 +msgid "%a %d %b %Y %T %Z" +msgstr "" + +#: static/xadmin/js/xadmin.widget.datetime.js:39 +msgid "AM PM" +msgstr "" + +#: static/xadmin/js/xadmin.widget.datetime.js:40 +msgid "am pm" +msgstr "" + +#: static/xadmin/js/xadmin.widget.datetime.js:43 +msgid "%T" +msgstr "" diff --git "a/8\343\200\201\346\226\207\347\214\256\346\225\260\346\215\256\346\214\226\346\216\230\347\263\273\347\273\237(\351\231\204\346\272\220\347\240\201)/extra_apps/xadmin/locale/es_MX/LC_MESSAGES/django.mo" "b/8\343\200\201\346\226\207\347\214\256\346\225\260\346\215\256\346\214\226\346\216\230\347\263\273\347\273\237(\351\231\204\346\272\220\347\240\201)/extra_apps/xadmin/locale/es_MX/LC_MESSAGES/django.mo" new file mode 100644 index 0000000..4044840 Binary files /dev/null and "b/8\343\200\201\346\226\207\347\214\256\346\225\260\346\215\256\346\214\226\346\216\230\347\263\273\347\273\237(\351\231\204\346\272\220\347\240\201)/extra_apps/xadmin/locale/es_MX/LC_MESSAGES/django.mo" differ diff --git "a/8\343\200\201\346\226\207\347\214\256\346\225\260\346\215\256\346\214\226\346\216\230\347\263\273\347\273\237(\351\231\204\346\272\220\347\240\201)/extra_apps/xadmin/locale/es_MX/LC_MESSAGES/django.po" "b/8\343\200\201\346\226\207\347\214\256\346\225\260\346\215\256\346\214\226\346\216\230\347\263\273\347\273\237(\351\231\204\346\272\220\347\240\201)/extra_apps/xadmin/locale/es_MX/LC_MESSAGES/django.po" new file mode 100644 index 0000000..62ed011 --- /dev/null +++ "b/8\343\200\201\346\226\207\347\214\256\346\225\260\346\215\256\346\214\226\346\216\230\347\263\273\347\273\237(\351\231\204\346\272\220\347\240\201)/extra_apps/xadmin/locale/es_MX/LC_MESSAGES/django.po" @@ -0,0 +1,1556 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER +# This file is distributed under the same license as the PACKAGE package. +# +# Translators: +# byroncorrales , 2013 +# charlieweb , 2013 +# sacrac , 2013 +# netoxico , 2013 +# abelthf , 2013 +# laoska , 2013 +# VerurteiltKind , 2013 +msgid "" +msgstr "" +"Project-Id-Version: xadmin-core\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2016-07-20 13:28+0800\n" +"PO-Revision-Date: 2013-05-12 18:45+0000\n" +"Last-Translator: sacrac \n" +"Language-Team: Spanish (Mexico) (http://www.transifex.com/projects/p/xadmin/" +"language/es_MX/)\n" +"Language: es_MX\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +#: adminx.py:19 +msgid "Admin Object" +msgstr "" + +#: apps.py:11 +msgid "Administration" +msgstr "" + +#: filters.py:159 filters.py:191 filters.py:407 filters.py:493 filters.py:531 +msgid "All" +msgstr "Todo" + +#: filters.py:160 plugins/export.py:165 +msgid "Yes" +msgstr "Sí" + +#: filters.py:161 plugins/export.py:165 +msgid "No" +msgstr "No" + +#: filters.py:175 +msgid "Unknown" +msgstr "Desconocido" + +#: filters.py:267 +msgid "Any date" +msgstr "Cualquier fecha" + +#: filters.py:268 +#, fuzzy +msgid "Has date" +msgstr "Cualquier fecha" + +#: filters.py:271 +#, fuzzy +msgid "Has no date" +msgstr "Cualquier fecha" + +#: filters.py:274 widgets.py:30 +msgid "Today" +msgstr "Hoy" + +#: filters.py:278 +msgid "Past 7 days" +msgstr "Pasados ​​7 días" + +#: filters.py:282 +msgid "This month" +msgstr "Este mes" + +#: filters.py:286 +msgid "This year" +msgstr "Este año" + +#: forms.py:10 +msgid "" +"Please enter the correct username and password for a staff account. Note " +"that both fields are case-sensitive." +msgstr "" +"Por favor, introduzca el nombre de usuario y contraseña correctos de su " +"cuenta. Note que ambos campos son sensibles a mayúsculas y minúsculas." + +#: forms.py:21 +msgid "Please log in again, because your session has expired." +msgstr "Por favor, ingrese de nuevo, debido a que su sesión ha caducado." + +#: forms.py:41 +#, python-format +msgid "Your e-mail address is not your username. Try '%s' instead." +msgstr "" +"Tu dirección de correo no es tu nombre de usuario. Prueba '%s' nuevamente." + +#: models.py:48 +msgid "Title" +msgstr "Titulo" + +#: models.py:49 models.py:88 models.py:107 models.py:149 +msgid "user" +msgstr "" + +#: models.py:50 +msgid "Url Name" +msgstr "Nombre de Url" + +#: models.py:52 +msgid "Query String" +msgstr "Cadena de consulta" + +#: models.py:53 +msgid "Is Shared" +msgstr "Es compartido" + +#: models.py:66 plugins/bookmark.py:50 plugins/bookmark.py:180 +msgid "Bookmark" +msgstr "Marcador" + +#: models.py:67 +msgid "Bookmarks" +msgstr "Marcadores" + +#: models.py:89 +msgid "Settings Key" +msgstr "Configuración llave" + +#: models.py:90 +msgid "Settings Content" +msgstr "Configuración de contenidos" + +#: models.py:102 +msgid "User Setting" +msgstr "Configuración del usuario" + +#: models.py:103 +msgid "User Settings" +msgstr "Configuraciones de los usuarios" + +#: models.py:108 +msgid "Page" +msgstr "Página" + +#: models.py:109 views/dashboard.py:82 views/dashboard.py:92 +msgid "Widget Type" +msgstr "Tipo de Widget" + +#: models.py:110 views/dashboard.py:83 +msgid "Widget Params" +msgstr "Parametros del Widget" + +#: models.py:137 +msgid "User Widget" +msgstr "Widget del Usuario" + +#: models.py:138 +msgid "User Widgets" +msgstr "Widgets del Usuario" + +#: models.py:142 +#, fuzzy +#| msgid "Date/time" +msgid "action time" +msgstr "Fecha/hora" + +#: models.py:151 +msgid "action ip" +msgstr "" + +#: models.py:155 +msgid "content type" +msgstr "" + +#: models.py:158 +msgid "object id" +msgstr "" + +#: models.py:159 +msgid "object repr" +msgstr "" + +#: models.py:160 +msgid "action flag" +msgstr "" + +#: models.py:161 +#, fuzzy +#| msgid "Change %s" +msgid "change message" +msgstr "Cambiar %s" + +#: models.py:164 +#, fuzzy +#| msgid "log in" +msgid "log entry" +msgstr "Iniciar sesión" + +#: models.py:165 +msgid "log entries" +msgstr "" + +#: models.py:173 +#, python-format +msgid "Added \"%(object)s\"." +msgstr "" + +#: models.py:175 +#, fuzzy, python-format +msgid "Changed \"%(object)s\" - %(changes)s" +msgstr "Cambiar multiples objetos" + +#: models.py:180 +#, fuzzy, python-format +#| msgid "Related Objects" +msgid "Deleted \"%(object)s.\"" +msgstr "Objetos relacionados" + +#: plugins/actions.py:57 +#, python-format +msgid "Delete selected %(verbose_name_plural)s" +msgstr "Borrar selección %(verbose_name_plural)s" + +#: plugins/actions.py:72 +#, fuzzy, python-format +#| msgid "Successfully deleted %(count)d %(items)s." +msgid "Batch delete %(count)d %(items)s." +msgstr "Correctamente eliminado %(count)d %(items)s." + +#: plugins/actions.py:78 +#, python-format +msgid "Successfully deleted %(count)d %(items)s." +msgstr "Correctamente eliminado %(count)d %(items)s." + +#: plugins/actions.py:110 views/delete.py:70 +#, python-format +msgid "Cannot delete %(name)s" +msgstr "No se puede eliminar %(name)s" + +#: plugins/actions.py:112 views/delete.py:73 +msgid "Are you sure?" +msgstr "Esta seguro?" + +#: plugins/actions.py:158 +#, python-format +msgid "%(total_count)s selected" +msgid_plural "All %(total_count)s selected" +msgstr[0] "%(total_count)s seleccionados" +msgstr[1] "Todos los %(total_count)s seleccionados" + +#: plugins/actions.py:162 +#, python-format +msgid "0 of %(cnt)s selected" +msgstr "0 de %(cnt)s seleccionado" + +#: plugins/actions.py:179 plugins/actions.py:189 +msgid "" +"Items must be selected in order to perform actions on them. No items have " +"been changed." +msgstr "" +"Los articulos deben de ser seleccionados en orden para realizar la acción. " +"No existen artículos que han cambiado" + +#: plugins/aggregation.py:14 +msgid "Min" +msgstr "Minimo" + +#: plugins/aggregation.py:14 +msgid "Max" +msgstr "Maximo" + +#: plugins/aggregation.py:14 +msgid "Avg" +msgstr "Promedio" + +#: plugins/aggregation.py:14 +msgid "Sum" +msgstr "Suma" + +#: plugins/aggregation.py:14 +msgid "Count" +msgstr "Conteo" + +#: plugins/auth.py:21 +#, fuzzy, python-format +msgid "Can add %s" +msgstr "Añadir %s" + +#: plugins/auth.py:22 +#, fuzzy, python-format +msgid "Can change %s" +msgstr "Cambiar %s" + +#: plugins/auth.py:23 +#, python-format +msgid "Can edit %s" +msgstr "" + +#: plugins/auth.py:24 +#, fuzzy, python-format +msgid "Can delete %s" +msgstr "No se puede eliminar %(name)s" + +#: plugins/auth.py:25 +#, python-format +msgid "Can view %s" +msgstr "" + +#: plugins/auth.py:87 +msgid "Personal info" +msgstr "Información personal" + +#: plugins/auth.py:91 +msgid "Permissions" +msgstr "Permisos" + +#: plugins/auth.py:94 +msgid "Important dates" +msgstr "Fechas importantes" + +#: plugins/auth.py:99 +msgid "Status" +msgstr "Estados" + +#: plugins/auth.py:111 +#, fuzzy +msgid "Permission Name" +msgstr "Permisos" + +#: plugins/auth.py:167 +#, fuzzy +msgid "Change Password" +msgstr "Cambiar Contraseña" + +#: plugins/auth.py:198 +#, python-format +msgid "Change password: %s" +msgstr "Cambiar contraseña: %s" + +#: plugins/auth.py:223 plugins/auth.py:255 +msgid "Password changed successfully." +msgstr "Contraseña cambiada correctamente" + +#: plugins/auth.py:242 templates/xadmin/auth/user/change_password.html:11 +#: templates/xadmin/auth/user/change_password.html:22 +#: templates/xadmin/auth/user/change_password.html:55 +msgid "Change password" +msgstr "Cambiar contraseña" + +#: plugins/batch.py:44 +#, fuzzy +msgid "Change this field" +msgstr "Historial de cambios: %s" + +#: plugins/batch.py:65 +#, python-format +msgid "Batch Change selected %(verbose_name_plural)s" +msgstr "Cambio de grupo seleccionado %(verbose_name_plural)s" + +#: plugins/batch.py:89 +#, fuzzy, python-format +msgid "Successfully change %(count)d %(items)s." +msgstr "Correctamente eliminado %(count)d %(items)s." + +#: plugins/batch.py:138 +#, fuzzy, python-format +msgid "Batch change %s" +msgstr "Cambiar %s" + +#: plugins/bookmark.py:173 +#, fuzzy +msgid "bookmark" +msgstr "Marcador" + +#: plugins/bookmark.py:176 +msgid "Bookmark Widget, can show user's bookmark list data in widget." +msgstr "" +"Widget de marcador, puede mostrar datos de la lista de favoritos del usuario " +"en el widget." + +#: plugins/chart.py:25 +msgid "Show models simple chart." +msgstr "Mostrar simple grafos para los modelos" + +#: plugins/chart.py:51 +#, python-format +msgid "%s Charts" +msgstr "%s Graficos" + +#: plugins/comments.py:33 +msgid "Metadata" +msgstr "" + +#: plugins/comments.py:60 +msgid "flagged" +msgid_plural "flagged" +msgstr[0] "" +msgstr[1] "" + +#: plugins/comments.py:61 +msgid "Flag selected comments" +msgstr "" + +#: plugins/comments.py:66 +msgid "approved" +msgid_plural "approved" +msgstr[0] "" +msgstr[1] "" + +#: plugins/comments.py:67 +msgid "Approve selected comments" +msgstr "" + +#: plugins/comments.py:72 +#, fuzzy +msgid "removed" +msgid_plural "removed" +msgstr[0] "Eliminar" +msgstr[1] "Eliminar" + +#: plugins/comments.py:73 +#, fuzzy +msgid "Remove selected comments" +msgstr "Recuperar borrado %(name)s" + +#: plugins/comments.py:86 +#, python-format +msgid "1 comment was successfully %(action)s." +msgid_plural "%(count)s comments were successfully %(action)s." +msgstr[0] "" +msgstr[1] "" + +#: plugins/details.py:52 views/list.py:578 +#, python-format +msgid "Details of %s" +msgstr "Detalles de %s" + +#: plugins/editable.py:46 +#, python-format +msgid "Enter %s" +msgstr "Entre %s" + +#: plugins/editable.py:73 views/dashboard.py:649 views/delete.py:27 +#: views/detail.py:145 views/edit.py:454 +#, python-format +msgid "%(name)s object with primary key %(key)r does not exist." +msgstr "%(name)s el objeto con la llave primaria %(key)r no existe." + +#: plugins/export.py:98 plugins/export.py:135 +msgid "Sheet" +msgstr "Hoja" + +#: plugins/filters.py:133 plugins/quickfilter.py:141 +#, python-format +msgid "Filtering error: %s" +msgstr "" + +#: plugins/images.py:29 +msgid "Previous" +msgstr "Previo" + +#: plugins/images.py:29 +msgid "Next" +msgstr "Próximo " + +#: plugins/images.py:29 +msgid "Slideshow" +msgstr "presentación" + +#: plugins/images.py:29 +msgid "Download" +msgstr "Descargar" + +#: plugins/images.py:50 +msgid "Change:" +msgstr "Cambiar:" + +#: plugins/layout.py:16 +msgid "Table" +msgstr "" + +#: plugins/layout.py:22 +msgid "Thumbnails" +msgstr "" + +#: plugins/passwords.py:64 +msgid "Forgotten your password or username?" +msgstr "¿Olvidó su contraseña o nombre de usuario?" + +#: plugins/quickform.py:79 +#, python-format +msgid "Create New %s" +msgstr "" + +#: plugins/relate.py:104 +msgid "Related Objects" +msgstr "Objetos relacionados" + +#: plugins/relfield.py:29 plugins/topnav.py:38 +#, python-format +msgid "Search %s" +msgstr "Buscar %s" + +#: plugins/relfield.py:67 +#, fuzzy, python-format +#| msgid "Select Date" +msgid "Select %s" +msgstr "Seleccionar Fecha" + +#: plugins/themes.py:47 +#, fuzzy +msgid "Default" +msgstr "Tema por defecto" + +#: plugins/themes.py:48 +#, fuzzy +msgid "Default bootstrap theme" +msgstr "Tema bootstrap por defecto" + +#: plugins/themes.py:49 +msgid "Bootstrap2" +msgstr "" + +#: plugins/themes.py:49 +#, fuzzy +msgid "Bootstrap 2.x theme" +msgstr "Tema bootstrap por defecto" + +#: plugins/topnav.py:62 views/dashboard.py:465 views/edit.py:387 +#: views/edit.py:396 +#, python-format +msgid "Add %s" +msgstr "Añadir %s" + +#: plugins/xversion.py:106 +msgid "Initial version." +msgstr "Versión inicial." + +#: plugins/xversion.py:108 +msgid "Change version." +msgstr "Cambiar la versión." + +#: plugins/xversion.py:110 +msgid "Revert version." +msgstr "Revertir la versión." + +#: plugins/xversion.py:112 +msgid "Rercover version." +msgstr "Recuperar versión" + +#: plugins/xversion.py:114 +#, python-format +msgid "Deleted %(verbose_name)s." +msgstr "Borrado %(verbose_name)s." + +#: plugins/xversion.py:127 templates/xadmin/views/recover_form.html:26 +msgid "Recover" +msgstr "Recuperar" + +#: plugins/xversion.py:143 templates/xadmin/views/model_history.html:11 +#: templates/xadmin/views/revision_diff.html:11 +#: templates/xadmin/views/revision_form.html:15 +msgid "History" +msgstr "Historico" + +#: plugins/xversion.py:194 templates/xadmin/views/recover_form.html:14 +#: templates/xadmin/views/recover_list.html:10 +#, python-format +msgid "Recover deleted %(name)s" +msgstr "Recuperar borrado %(name)s" + +#: plugins/xversion.py:238 +#, python-format +msgid "Change history: %s" +msgstr "Historial de cambios: %s" + +#: plugins/xversion.py:288 +msgid "Must select two versions." +msgstr "Debe seleccionar dos versiones." + +#: plugins/xversion.py:296 +msgid "Please select two different versions." +msgstr "Por favor seleccione dos versiones diferente." + +#: plugins/xversion.py:383 plugins/xversion.py:500 +#, python-format +msgid "Current: %s" +msgstr "Actual: %s" + +#: plugins/xversion.py:424 +#, python-format +msgid "Revert %s" +msgstr "Revertir %s" + +#: plugins/xversion.py:440 +#, python-format +msgid "" +"The %(model)s \"%(name)s\" was reverted successfully. You may edit it again " +"below." +msgstr "" +"El %(model)s \"%(name)s\" se revirtió con éxito. Puede editarlo de nuevo a " +"continuación." + +#: plugins/xversion.py:461 +#, python-format +msgid "Recover %s" +msgstr "Recuperar %s" + +#: plugins/xversion.py:477 +#, python-format +msgid "" +"The %(model)s \"%(name)s\" was recovered successfully. You may edit it again " +"below." +msgstr "" +"El %(model)s \"%(name) s\" se recuperó con éxito. Puede editarlo de nuevo a " +"continuación." + +#: templates/xadmin/404.html:4 templates/xadmin/404.html:8 +msgid "Page not found" +msgstr "Pagina no encontrada" + +#: templates/xadmin/404.html:10 +msgid "We're sorry, but the requested page could not be found." +msgstr "Lo sentimos pero la pagina que usted solicita no se encuentra." + +#: templates/xadmin/500.html:7 +#: templates/xadmin/auth/user/change_password.html:10 +#: templates/xadmin/auth/user/change_password.html:15 +#: templates/xadmin/base_site.html:53 +#: templates/xadmin/includes/sitemenu_default.html:7 +#: templates/xadmin/views/app_index.html:9 +#: templates/xadmin/views/batch_change_form.html:9 +#: templates/xadmin/views/invalid_setup.html:7 +#: templates/xadmin/views/model_dashboard.html:7 +#: templates/xadmin/views/model_delete_selected_confirm.html:8 +#: templates/xadmin/views/model_history.html:8 +#: templates/xadmin/views/recover_form.html:8 +#: templates/xadmin/views/recover_list.html:8 +#: templates/xadmin/views/revision_diff.html:8 +#: templates/xadmin/views/revision_form.html:8 views/base.py:473 +msgid "Home" +msgstr "Inicio" + +#: templates/xadmin/500.html:8 +msgid "Server error" +msgstr "Error en el servidor" + +#: templates/xadmin/500.html:12 +msgid "Server error (500)" +msgstr "Error en el servidor (500)" + +#: templates/xadmin/500.html:15 +msgid "Server Error (500)" +msgstr "Error en el servidor (500)" + +#: templates/xadmin/500.html:16 +msgid "" +"There's been an error. It's been reported to the site administrators via e-" +"mail and should be fixed shortly. Thanks for your patience." +msgstr "" +"Ha habido un error. Se nos ha informado a los administradores del sitio a " +"través de un correo electrónico y debe repararse en la breve. Gracias por su " +"paciencia." + +#: templates/xadmin/auth/password_reset/complete.html:11 +#: templates/xadmin/auth/password_reset/done.html:11 +msgid "Password reset successful" +msgstr "Restablecimiento de contraseña con éxito" + +#: templates/xadmin/auth/password_reset/complete.html:14 +msgid "Your password has been set. You may go ahead and log in now." +msgstr "Se ha establecido su contraseña. Usted puede acceder ahora mismo." + +#: templates/xadmin/auth/password_reset/complete.html:15 +msgid "Log in" +msgstr "Entrar" + +#: templates/xadmin/auth/password_reset/confirm.html:12 +msgid "Enter new password" +msgstr "Escriba la nueva contraseña" + +#: templates/xadmin/auth/password_reset/confirm.html:17 +msgid "" +"Please enter your new password twice so we can verify you typed it in " +"correctly." +msgstr "" +"Introduzca su nueva contraseña dos veces para que podamos verificar que la " +"ha escrito correctamente." + +#: templates/xadmin/auth/password_reset/confirm.html:19 +msgid "Change my password" +msgstr "Cambiar mi contraseña" + +#: templates/xadmin/auth/password_reset/confirm.html:24 +msgid "Password reset unsuccessful" +msgstr "Restablecimiento de contraseña sin éxito" + +#: templates/xadmin/auth/password_reset/confirm.html:27 +msgid "" +"The password reset link was invalid, possibly because it has already been " +"used. Please request a new password reset." +msgstr "" +"El enlace de restablecimiento de contraseña no es válida, posiblemente " +"debido a que ya se ha utilizado. Por favor, solicite un nuevo " +"restablecimiento de contraseña." + +#: templates/xadmin/auth/password_reset/done.html:14 +msgid "" +"We've e-mailed you instructions for setting your password to the e-mail " +"address you submitted. You should be receiving it shortly." +msgstr "" +"Nosotro te hemos enviado por correo electrónico las instrucciones para " +"configurar la contraseña a la dirección de correo electrónico que ha " +"enviado. Usted debe recibirlo en breve momento." + +#: templates/xadmin/auth/password_reset/email.html:2 +#, python-format +msgid "" +"You're receiving this e-mail because you requested a password reset for your " +"user account at %(site_name)s." +msgstr "" +"Tu has recibido este correo debido a que has solicitado restablecimiento de " +"contraseña para tu cuenta de usuario en %(site_name)s." + +#: templates/xadmin/auth/password_reset/email.html:4 +msgid "Please go to the following page and choose a new password:" +msgstr "Por favor ir a la siguiente pagina y selecciona una nueva contraseña" + +#: templates/xadmin/auth/password_reset/email.html:8 +msgid "Your username, in case you've forgotten:" +msgstr "Tu usuario, en caso de que lo hayas olvidado" + +#: templates/xadmin/auth/password_reset/email.html:10 +msgid "Thanks for using our site!" +msgstr "Gracias por usar nuestro sitio web!" + +#: templates/xadmin/auth/password_reset/email.html:12 +#, python-format +msgid "The %(site_name)s team" +msgstr "El equipo de %(site_name)s" + +#: templates/xadmin/auth/password_reset/form.html:13 +msgid "Password reset" +msgstr "restablecimiento de contraseña" + +#: templates/xadmin/auth/password_reset/form.html:17 +msgid "" +"Forgotten your password? Enter your e-mail address below, and we'll e-mail " +"instructions for setting a new one." +msgstr "" +"¿Olvidaste tu contraseña? Escribe tu dirección de e-mail debajo, y le " +"enviaremos un e-mail para el establecimiento de una nueva." + +#: templates/xadmin/auth/password_reset/form.html:25 +msgid "E-mail address:" +msgstr "Dirección de correo:" + +#: templates/xadmin/auth/password_reset/form.html:33 +msgid "Reset my password" +msgstr "Cambiar contraseña" + +#: templates/xadmin/auth/user/add_form.html:6 +msgid "" +"First, enter a username and password. Then, you'll be able to edit more user " +"options." +msgstr "" +"Primero, ingrese usuario y contraseña. Luego, sera capaz de editar mas " +"opciones de usuario." + +#: templates/xadmin/auth/user/add_form.html:8 +msgid "Enter a username and password." +msgstr "Ingresa nombre de usuario y contraseña" + +#: templates/xadmin/auth/user/change_password.html:31 +#: templates/xadmin/views/batch_change_form.html:24 +#: templates/xadmin/views/form.html:18 +#: templates/xadmin/views/model_form.html:20 +msgid "Please correct the error below." +msgid_plural "Please correct the errors below." +msgstr[0] "Por favor corrija el error abajo." +msgstr[1] "Por favor corrija los errores abajo." + +#: templates/xadmin/auth/user/change_password.html:38 +msgid "Enter your new password." +msgstr "Ingresa una nueva contraseña" + +#: templates/xadmin/auth/user/change_password.html:40 +#, python-format +msgid "Enter a new password for the user %(username)s." +msgstr "" +"Introduzca una nueva contraseña para el usuario %(username)s" + +#: templates/xadmin/base_site.html:18 +msgid "Welcome," +msgstr "Bienvenidos," + +#: templates/xadmin/base_site.html:24 +msgid "Log out" +msgstr "Salir" + +#: templates/xadmin/base_site.html:36 +msgid "You don't have permission to edit anything." +msgstr "No tiene permiso para editar nada. " + +#: templates/xadmin/blocks/comm.top.theme.html:4 +msgid "Themes" +msgstr "Temas" + +#: templates/xadmin/blocks/comm.top.topnav.html:9 +#: templates/xadmin/blocks/model_list.nav_form.search_form.html:8 +#: templates/xadmin/filters/char.html:7 +#: templates/xadmin/filters/fk_search.html:7 +#: templates/xadmin/filters/fk_search.html:16 +#: templates/xadmin/filters/number.html:7 +msgid "Search" +msgstr "Buscar" + +#: templates/xadmin/blocks/comm.top.topnav.html:23 +msgid "Add" +msgstr "Agregar" + +#: templates/xadmin/blocks/model_form.submit_line.wizard.html:9 +#: templates/xadmin/blocks/model_form.submit_line.wizard.html:26 +msgid "Prev step" +msgstr "Paso previo" + +#: templates/xadmin/blocks/model_form.submit_line.wizard.html:13 +#: templates/xadmin/blocks/model_form.submit_line.wizard.html:29 +msgid "Next step" +msgstr "Próximo paso" + +#: templates/xadmin/blocks/model_form.submit_line.wizard.html:15 +#: templates/xadmin/blocks/model_form.submit_line.wizard.html:31 +#: templates/xadmin/includes/submit_line.html:10 +#: templates/xadmin/includes/submit_line.html:13 +#: templates/xadmin/views/form.html:30 templates/xadmin/views/form.html:31 +msgid "Save" +msgstr "Guardar" + +#: templates/xadmin/blocks/model_list.nav_menu.bookmarks.html:7 +msgid "Clean Bookmarks" +msgstr "Limpiar marcadores" + +#: templates/xadmin/blocks/model_list.nav_menu.bookmarks.html:18 +msgid "No Bookmarks" +msgstr "No hay marcadores" + +#: templates/xadmin/blocks/model_list.nav_menu.bookmarks.html:22 +msgid "New Bookmark" +msgstr "Nuevo marcador" + +#: templates/xadmin/blocks/model_list.nav_menu.bookmarks.html:26 +msgid "Save current page as Bookmark" +msgstr "Guardar actual pagino como Marcador" + +#: templates/xadmin/blocks/model_list.nav_menu.bookmarks.html:32 +msgid "Enter bookmark title" +msgstr "Ingrese titulo de marcador" + +#: templates/xadmin/blocks/model_list.nav_menu.bookmarks.html:33 +msgid "Waiting" +msgstr "Espera un momento" + +#: templates/xadmin/blocks/model_list.nav_menu.bookmarks.html:33 +msgid "Save Bookmark" +msgstr "Guardar marcador" + +#: templates/xadmin/blocks/model_list.nav_menu.filters.html:4 +msgid "Filters" +msgstr "Filtros" + +#: templates/xadmin/blocks/model_list.nav_menu.filters.html:8 +msgid "Clean Filters" +msgstr "Limpiar Filtros" + +#: templates/xadmin/blocks/model_list.results_bottom.actions.html:19 +msgid "Click here to select the objects across all pages" +msgstr "" +"Haz clic aquí para seleccionar los objetos a través de todas las páginas" + +#: templates/xadmin/blocks/model_list.results_bottom.actions.html:19 +#, python-format +msgid "Select all %(total_count)s %(model_name)s" +msgstr "Seleccionar todo %(total_count)s %(model_name)s" + +#: templates/xadmin/blocks/model_list.results_bottom.actions.html:20 +msgid "Clear selection" +msgstr "Limpiar seleccion" + +#: templates/xadmin/blocks/model_list.results_top.charts.html:4 +msgid "Charts" +msgstr "Graficos" + +#: templates/xadmin/blocks/model_list.top_toolbar.exports.html:4 +#: templates/xadmin/blocks/model_list.top_toolbar.exports.html:8 +#: templates/xadmin/blocks/model_list.top_toolbar.exports.html:19 +#: templates/xadmin/blocks/model_list.top_toolbar.exports.html:47 +msgid "Export" +msgstr "Exportar" + +#: templates/xadmin/blocks/model_list.top_toolbar.exports.html:26 +#: templates/xadmin/blocks/model_list.top_toolbar.exports.html:29 +#: templates/xadmin/blocks/model_list.top_toolbar.exports.html:32 +msgid "Export with table header." +msgstr "Exportar con la cabecera de la tabla." + +#: templates/xadmin/blocks/model_list.top_toolbar.exports.html:35 +#: templates/xadmin/blocks/model_list.top_toolbar.exports.html:38 +msgid "Export with format." +msgstr "Exportar con formato" + +#: templates/xadmin/blocks/model_list.top_toolbar.exports.html:42 +msgid "Export all data." +msgstr "Exportar todos los datos." + +#: templates/xadmin/blocks/model_list.top_toolbar.exports.html:46 +#: templates/xadmin/widgets/base.html:41 +msgid "Close" +msgstr "Cerrar" + +#: templates/xadmin/blocks/model_list.top_toolbar.layouts.html:4 +msgid "Layout" +msgstr "" + +#: templates/xadmin/blocks/model_list.top_toolbar.refresh.html:8 +msgid "Clean Refresh" +msgstr "Limpiar Refrescar" + +#: templates/xadmin/blocks/model_list.top_toolbar.refresh.html:14 +#, fuzzy, python-format +msgid "Every %(t)s seconds" +msgstr "Por %(t)s segundos" + +#: templates/xadmin/blocks/model_list.top_toolbar.saveorder.html:4 +msgid "Save Order" +msgstr "" + +#: templates/xadmin/edit_inline/blank.html:5 views/detail.py:23 +#: views/edit.py:102 views/list.py:29 +msgid "Null" +msgstr "Nulo" + +#: templates/xadmin/filters/char.html:13 +msgid "Enter" +msgstr "Introducir" + +#: templates/xadmin/filters/date.html:10 templates/xadmin/filters/date.html:13 +msgid "Choice Date" +msgstr "Elija Fecha" + +#: templates/xadmin/filters/date.html:18 +msgid "YY" +msgstr "" + +#: templates/xadmin/filters/date.html:19 +msgid "year" +msgstr "año" + +#: templates/xadmin/filters/date.html:22 +msgid "MM" +msgstr "" + +#: templates/xadmin/filters/date.html:23 +msgid "month" +msgstr "Mes" + +#: templates/xadmin/filters/date.html:26 +msgid "DD" +msgstr "" + +#: templates/xadmin/filters/date.html:27 +msgid "day" +msgstr "día" + +#: templates/xadmin/filters/date.html:29 templates/xadmin/filters/date.html:46 +#: templates/xadmin/filters/date.html:54 +#: templates/xadmin/filters/fk_search.html:24 +#: templates/xadmin/filters/number.html:37 +msgid "Apply" +msgstr "Aplicar" + +#: templates/xadmin/filters/date.html:34 +msgid "Date Range" +msgstr "Rangos de fechas" + +#: templates/xadmin/filters/date.html:41 +msgid "Select Date" +msgstr "Seleccionar Fecha" + +#: templates/xadmin/filters/date.html:42 +msgid "From" +msgstr "De" + +#: templates/xadmin/filters/date.html:44 +msgid "To" +msgstr "Para" + +#: templates/xadmin/filters/fk_search.html:14 +#, fuzzy +#| msgid "Select Date" +msgid "Select" +msgstr "Seleccionar Fecha" + +#: templates/xadmin/filters/fk_search.html:26 +#: templates/xadmin/filters/number.html:39 +msgid "Clean" +msgstr "Limpiar" + +#: templates/xadmin/filters/number.html:17 +#: templates/xadmin/filters/number.html:25 +#: templates/xadmin/filters/number.html:33 +msgid "Enter Number" +msgstr "Ingrese el numero" + +#: templates/xadmin/filters/rel.html:3 +#, python-format +msgid " By %(filter_title)s " +msgstr "Por %(filter_title)s" + +#: templates/xadmin/forms/transfer.html:4 +msgid "Available" +msgstr "Disponible" + +#: templates/xadmin/forms/transfer.html:12 +msgid "Click to choose all at once." +msgstr "Click para elegir todos" + +#: templates/xadmin/forms/transfer.html:12 +msgid "Choose all" +msgstr "Seleccionar todos" + +#: templates/xadmin/forms/transfer.html:16 +msgid "Choose" +msgstr "Elegir" + +#: templates/xadmin/forms/transfer.html:19 +#: templates/xadmin/widgets/base.html:40 +msgid "Remove" +msgstr "Eliminar" + +#: templates/xadmin/forms/transfer.html:23 +msgid "Chosen" +msgstr "Preferido" + +#: templates/xadmin/forms/transfer.html:27 +msgid "Click to remove all chosen at once." +msgstr "Click para remover todos los preferidos" + +#: templates/xadmin/forms/transfer.html:27 +msgid "Remove all" +msgstr "Remover todos" + +#: templates/xadmin/includes/pagination.html:9 +msgid "Show all" +msgstr "Mostrar todos" + +#: templates/xadmin/includes/submit_line.html:10 +#: templates/xadmin/includes/submit_line.html:13 +#: templates/xadmin/views/form.html:30 templates/xadmin/views/form.html:31 +msgid "Saving.." +msgstr "" + +#: templates/xadmin/includes/submit_line.html:17 +msgid "Save as new" +msgstr "Guardar como nuevo" + +#: templates/xadmin/includes/submit_line.html:18 +msgid "Save and add another" +msgstr "Guardar y añadir otro" + +#: templates/xadmin/includes/submit_line.html:19 +msgid "Save and continue editing" +msgstr "Guardar y continuar editando" + +#: templates/xadmin/includes/submit_line.html:24 +#: templates/xadmin/views/model_detail.html:28 views/delete.py:93 +msgid "Delete" +msgstr "Borrar" + +#: templates/xadmin/views/app_index.html:13 +#, python-format +msgid "%(name)s" +msgstr "%(name)s" + +#: templates/xadmin/views/batch_change_form.html:11 +msgid "Change multiple objects" +msgstr "Cambiar multiples objetos" + +#: templates/xadmin/views/batch_change_form.html:16 +#, fuzzy, python-format +msgid "Change one %(objects_name)s" +msgid_plural "Batch change %(counter)s %(objects_name)s" +msgstr[0] "Cambiar multiples objetos" +msgstr[1] "Cambiar multiples objetos" + +#: templates/xadmin/views/batch_change_form.html:38 +msgid "Change Multiple" +msgstr "Cambios multiples" + +#: templates/xadmin/views/dashboard.html:15 +#: templates/xadmin/views/dashboard.html:22 +#: templates/xadmin/views/dashboard.html:23 +msgid "Add Widget" +msgstr "Añadir Widget" + +#: templates/xadmin/views/invalid_setup.html:13 +msgid "" +"Something's wrong with your database installation. Make sure the appropriate " +"database tables have been created, and make sure the database is readable by " +"the appropriate user." +msgstr "" +"Algo está mal con tu instalación de base de datos. Asegúrese de que las " +"tablas de la bases de datos se han creado apropiadamente, y asegúrese de que " +"la base de datos puede ser leído por el usuario apropiado" + +#: templates/xadmin/views/logged_out.html:16 +msgid "Logout Success" +msgstr "Salio con éxito " + +#: templates/xadmin/views/logged_out.html:17 +msgid "Thanks for spending some quality time with the Web site today." +msgstr "Gracias por pasar tiempo de calidad con el sitio web hoy." + +#: templates/xadmin/views/logged_out.html:19 +msgid "Close Window" +msgstr "Cerrar ventana" + +#: templates/xadmin/views/logged_out.html:20 +msgid "Log in again" +msgstr "Entrar nuevamente" + +#: templates/xadmin/views/login.html:39 views/website.py:38 +msgid "Please Login" +msgstr "Por favor, inicia sesión" + +#: templates/xadmin/views/login.html:52 +#, fuzzy +msgid "Username" +msgstr "Usuario:" + +#: templates/xadmin/views/login.html:64 +#, fuzzy +msgid "Password" +msgstr "Contraseña:" + +#: templates/xadmin/views/login.html:75 +msgid "log in" +msgstr "Iniciar sesión" + +#: templates/xadmin/views/model_dashboard.html:26 +#: templates/xadmin/views/model_detail.html:25 +msgid "Edit" +msgstr "Editar." + +#: templates/xadmin/views/model_delete_confirm.html:11 +#, python-format +msgid "" +"Deleting the %(verbose_name)s '%(escaped_object)s' would result in deleting " +"related objects, but your account doesn't have permission to delete the " +"following types of objects:" +msgstr "" +"Eliminando los %(verbose_name)s '%(escaped_object)s terminaría eliminando " +"objetos relacionados, pero su cuenta no tiene permisos para eliminar los " +"siguientes tipo de objetos:" + +#: templates/xadmin/views/model_delete_confirm.html:19 +#, python-format +msgid "" +"Deleting the %(verbose_name)s '%(escaped_object)s' would require deleting " +"the following protected related objects:" +msgstr "" +"Eliminando los %(verbose_name)s '%(escaped_object)s requeriría eliminar los " +"siguientes objetos relacionas protegidos:" + +#: templates/xadmin/views/model_delete_confirm.html:27 +#, python-format +msgid "" +"Are you sure you want to delete the %(verbose_name)s \"%(escaped_object)s\"? " +"All of the following related items will be deleted:" +msgstr "" +"¿Estas seguro de querer eliminar los %(verbose_name)s \"%(escaped_object)s" +"\" ? Todos los siguientes artículos relacionados serán eliminados:" + +#: templates/xadmin/views/model_delete_confirm.html:34 +#: templates/xadmin/views/model_delete_selected_confirm.html:49 +msgid "Yes, I'm sure" +msgstr "Si, estoy seguro" + +#: templates/xadmin/views/model_delete_confirm.html:35 +#: templates/xadmin/views/model_delete_selected_confirm.html:50 +#, fuzzy +msgid "Cancel" +msgstr "Cancelar ordenación" + +#: templates/xadmin/views/model_delete_selected_confirm.html:10 +msgid "Delete multiple objects" +msgstr "Eliminar múltiples objetos." + +#: templates/xadmin/views/model_delete_selected_confirm.html:18 +#, python-format +msgid "" +"Deleting the selected %(objects_name)s would result in deleting related " +"objects, but your account doesn't have permission to delete the following " +"types of objects:" +msgstr "" +"Eliminando los %(objects_name)s terminaría eliminando objetos relacionados, " +"pero su cuenta no tiene permisos para eliminar los siguientes tipo de " +"objetos:" + +#: templates/xadmin/views/model_delete_selected_confirm.html:26 +#, python-format +msgid "" +"Deleting the selected %(objects_name)s would require deleting the following " +"protected related objects:" +msgstr "" +"Eliminando los %(objects_name)s seleccionados terminaria emilinando los " +"siguientes objetos relacionados protegidos:" + +#: templates/xadmin/views/model_delete_selected_confirm.html:34 +#, python-format +msgid "" +"Are you sure you want to delete the selected %(objects_name)s? All of the " +"following objects and their related items will be deleted:" +msgstr "" +"¿Estas seguro de querer borrar los %(objects_name)s seleccionados? Todos los " +"siguientes objetos y sus artículos relacionados serán eliminados:" + +#: templates/xadmin/views/model_history.html:26 +msgid "Diff" +msgstr "Differencia" + +#: templates/xadmin/views/model_history.html:27 +#: templates/xadmin/views/recover_list.html:25 +msgid "Date/time" +msgstr "Fecha/hora" + +#: templates/xadmin/views/model_history.html:28 +msgid "User" +msgstr "Usuario" + +#: templates/xadmin/views/model_history.html:29 +msgid "Comment" +msgstr "Comentario" + +#: templates/xadmin/views/model_history.html:54 +msgid "Diff Select Versions" +msgstr "Seleccionar diferentes versiones" + +#: templates/xadmin/views/model_history.html:58 +msgid "" +"This object doesn't have a change history. It probably wasn't added via this " +"admin site." +msgstr "" +"Este objeto no tiene un historial de cambios, Es probable que no se haya " +"añadido a través de este sitio de admin.|" + +#: templates/xadmin/views/model_list.html:29 +#, python-format +msgid "Add %(name)s" +msgstr "Agregar %(name)s" + +#: templates/xadmin/views/model_list.html:39 +#, fuzzy +msgid "Columns" +msgstr "Seleccionar columns." + +#: templates/xadmin/views/model_list.html:42 +msgid "Restore Selected" +msgstr "Restaurar seleccionados." + +#: templates/xadmin/views/model_list.html:147 +#: templates/xadmin/widgets/list.html:33 +msgid "Empty list" +msgstr "Lista vacia" + +#: templates/xadmin/views/recover_form.html:20 +msgid "Press the recover button below to recover this version of the object." +msgstr "" +"Presione el botón de recuperación abajo para recuperar esta versión del " +"objeto." + +#: templates/xadmin/views/recover_list.html:19 +msgid "" +"Choose a date from the list below to recover a deleted version of an object." +msgstr "" +"Selecciona una fecha de la lista de abajo para recuperar una versión " +"eliminada de un objeto." + +#: templates/xadmin/views/recover_list.html:39 +msgid "There are no deleted objects to recover." +msgstr "No hay objetos eliminados para recuperar." + +#: templates/xadmin/views/revision_diff.html:12 +#: templates/xadmin/views/revision_diff.html:17 +#, python-format +msgid "Diff %(verbose_name)s" +msgstr "Diferentes %(verbose_name)s" + +#: templates/xadmin/views/revision_diff.html:25 +msgid "Field" +msgstr "Campo" + +#: templates/xadmin/views/revision_diff.html:26 +msgid "Version A" +msgstr "Versión A" + +#: templates/xadmin/views/revision_diff.html:27 +msgid "Version B" +msgstr "Versión B" + +#: templates/xadmin/views/revision_diff.html:39 +msgid "Revert to" +msgstr "Revertir a" + +#: templates/xadmin/views/revision_diff.html:40 +#: templates/xadmin/views/revision_diff.html:41 +msgid "Revert" +msgstr "Revertir" + +#: templates/xadmin/views/revision_form.html:16 +#, python-format +msgid "Revert %(verbose_name)s" +msgstr "Revertir %(verbose_name)s" + +#: templates/xadmin/views/revision_form.html:21 +msgid "Press the revert button below to revert to this version of the object." +msgstr "" +"Presiona el botón revertir de abajo para revertir a esta versión del objeto." + +#: templates/xadmin/views/revision_form.html:27 +msgid "Revert this revision" +msgstr "Revertir esta revisión" + +#: templates/xadmin/widgets/addform.html:14 +msgid "Success" +msgstr "Éxito" + +#: templates/xadmin/widgets/addform.html:14 +msgid "Add success, click edit to edit." +msgstr "" +"Agregado exitosa mente, presiona edit para editar." + +#: templates/xadmin/widgets/addform.html:17 +msgid "Quick Add" +msgstr "Agregar rápidamente." + +#: templates/xadmin/widgets/base.html:31 +msgid "Widget Options" +msgstr "Opciones del Widget" + +#: templates/xadmin/widgets/base.html:42 +msgid "Save changes" +msgstr "Guardar cambios" + +#: views/base.py:315 +msgid "Django Xadmin" +msgstr "Django Xadmin" + +#: views/base.py:316 +msgid "my-company.inc" +msgstr "" + +#: views/dashboard.py:186 +msgid "Widget ID" +msgstr "ID del Widget" + +#: views/dashboard.py:187 +msgid "Widget Title" +msgstr "Titulo del Widget" + +#: views/dashboard.py:252 +msgid "Html Content Widget, can write any html content in widget." +msgstr "" +"Contenido html del Widget, puede escribir cualquier contenido del widget." + +#: views/dashboard.py:255 +msgid "Html Content" +msgstr "Contenido HTML" + +#: views/dashboard.py:318 +msgid "Target Model" +msgstr "Modelo objeto" + +#: views/dashboard.py:369 +msgid "Quick button Widget, quickly open any page." +msgstr "botón rapido del widget, abrir rápidamente cualquier página." + +#: views/dashboard.py:371 +msgid "Quick Buttons" +msgstr "Botones rapidos" + +#: views/dashboard.py:416 +msgid "Any Objects list Widget." +msgstr "Cualquier objeto listado en el widget" + +#: views/dashboard.py:456 +msgid "Add any model object Widget." +msgstr "Añadir cualquier modelo de objeto al Widget." + +#: views/dashboard.py:492 +msgid "Dashboard" +msgstr "Panel de control" + +#: views/dashboard.py:633 +#, fuzzy, python-format +msgid "%s Dashboard" +msgstr "Panel de control" + +#: views/delete.py:103 +#, python-format +msgid "The %(name)s \"%(obj)s\" was deleted successfully." +msgstr "El %(name)s \"%(obj)s\" fue eliminado exitosa mente." + +#: views/detail.py:173 views/edit.py:211 views/form.py:72 +msgid "Other Fields" +msgstr "Otros campos" + +#: views/detail.py:235 +#, python-format +msgid "%s Detail" +msgstr "%s Detalles" + +#: views/edit.py:253 +msgid "Added." +msgstr "" + +#: views/edit.py:255 +#, fuzzy, python-format +#| msgid "Change %s" +msgid "Changed %s." +msgstr "Cambiar %s" + +#: views/edit.py:255 +msgid "and" +msgstr "" + +#: views/edit.py:258 +msgid "No fields changed." +msgstr "" + +#: views/edit.py:420 +#, python-format +msgid "The %(name)s \"%(obj)s\" was added successfully." +msgstr "El %(name)s \"%(obj)s\" fue agregado exitosa mente." + +#: views/edit.py:425 views/edit.py:520 +msgid "You may edit it again below." +msgstr "Puedes editarlo de nuevo abajo." + +#: views/edit.py:429 views/edit.py:523 +#, python-format +msgid "You may add another %s below." +msgstr "Puedes agregar otro %s debajo." + +#: views/edit.py:471 +#, python-format +msgid "Change %s" +msgstr "Cambiar %s" + +#: views/edit.py:516 +#, python-format +msgid "The %(name)s \"%(obj)s\" was changed successfully." +msgstr "El %(name)s \"%(obj)s\" fue editado exitosa mente." + +#: views/form.py:165 +#, fuzzy, python-format +msgid "The %s was changed successfully." +msgstr "El %(name)s \"%(obj)s\" fue editado exitosa mente." + +#: views/list.py:199 +msgid "Database error" +msgstr "Error de base de datos" + +#: views/list.py:373 +#, python-format +msgid "%s List" +msgstr "%s Lista" + +#: views/list.py:499 +msgid "Sort ASC" +msgstr "Ordenar ascendente mente." + +#: views/list.py:500 +msgid "Sort DESC" +msgstr "Ordenar descendente mente" + +#: views/list.py:504 +msgid "Cancel Sort" +msgstr "Cancelar ordenación" + +#: views/website.py:16 +msgid "Main Dashboard" +msgstr "Dashboard principal." + +#: widgets.py:48 +msgid "Now" +msgstr "Ahora" + +#~ msgid "Add Other %s" +#~ msgstr "Añadir otro %s" + +#~ msgid "Recover deleted" +#~ msgstr "Recuperar borrado" + +#~ msgid "Documentation" +#~ msgstr "Documentación" + +#~ msgid "Password change" +#~ msgstr "Cambiar contraseña" + +#~ msgid "Password change successful" +#~ msgstr "Contraseña cambio con exito " + +#~ msgid "Your password was changed." +#~ msgstr "Tu contraseña fue cambiada." + +#~ msgid "" +#~ "Please enter your old password, for security's sake, and then enter your " +#~ "new password twice so we can verify you typed it in correctly." +#~ msgstr "" +#~ "Introduzca su antigua contraseña, por el bien de la seguridad, y luego " +#~ "ingrese su nueva contraseña dos veces para que podamos verificar que la " +#~ "ha escrito correctamente." + +#~ msgid "Old password" +#~ msgstr "Vieja contraseña" + +#~ msgid "New password" +#~ msgstr "Nueva contraseña" + +#~ msgid "Password (again)" +#~ msgstr "Contraseña (nuevamente)" + +#~ msgid "Password reset complete" +#~ msgstr "restablecimiento de contraseña completo" + +#~ msgid "Password reset confirmation" +#~ msgstr "Confirmación de restablecimiento de contraseña" + +#~ msgid "New password:" +#~ msgstr "Nueva contraseña:" + +#~ msgid "Confirm password:" +#~ msgstr "Confirmar contraseña:" + +#~ msgid "Search By" +#~ msgstr "Buscar por" + +#~ msgid "None" +#~ msgstr "Ninguno" + +#~ msgid "Cacnel" +#~ msgstr "Cancelar" diff --git "a/8\343\200\201\346\226\207\347\214\256\346\225\260\346\215\256\346\214\226\346\216\230\347\263\273\347\273\237(\351\231\204\346\272\220\347\240\201)/extra_apps/xadmin/locale/es_MX/LC_MESSAGES/djangojs.mo" "b/8\343\200\201\346\226\207\347\214\256\346\225\260\346\215\256\346\214\226\346\216\230\347\263\273\347\273\237(\351\231\204\346\272\220\347\240\201)/extra_apps/xadmin/locale/es_MX/LC_MESSAGES/djangojs.mo" new file mode 100644 index 0000000..81c3f49 Binary files /dev/null and "b/8\343\200\201\346\226\207\347\214\256\346\225\260\346\215\256\346\214\226\346\216\230\347\263\273\347\273\237(\351\231\204\346\272\220\347\240\201)/extra_apps/xadmin/locale/es_MX/LC_MESSAGES/djangojs.mo" differ diff --git "a/8\343\200\201\346\226\207\347\214\256\346\225\260\346\215\256\346\214\226\346\216\230\347\263\273\347\273\237(\351\231\204\346\272\220\347\240\201)/extra_apps/xadmin/locale/es_MX/LC_MESSAGES/djangojs.po" "b/8\343\200\201\346\226\207\347\214\256\346\225\260\346\215\256\346\214\226\346\216\230\347\263\273\347\273\237(\351\231\204\346\272\220\347\240\201)/extra_apps/xadmin/locale/es_MX/LC_MESSAGES/djangojs.po" new file mode 100644 index 0000000..ec4f2a6 --- /dev/null +++ "b/8\343\200\201\346\226\207\347\214\256\346\225\260\346\215\256\346\214\226\346\216\230\347\263\273\347\273\237(\351\231\204\346\272\220\347\240\201)/extra_apps/xadmin/locale/es_MX/LC_MESSAGES/djangojs.po" @@ -0,0 +1,76 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER +# This file is distributed under the same license as the PACKAGE package. +# +# Translators: +# byroncorrales , 2013 +# byroncorrales , 2013 +# sacrac , 2013 +# netoxico , 2013 +# netoxico , 2013 +# sacrac , 2013 +msgid "" +msgstr "" +"Project-Id-Version: xadmin-core\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2013-04-30 23:11+0800\n" +"PO-Revision-Date: 2013-11-20 12:41+0000\n" +"Last-Translator: sacrac \n" +"Language-Team: Spanish (Mexico) (http://www.transifex.com/projects/p/xadmin/language/es_MX/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: es_MX\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +#: static/xadmin/js/xadmin.plugin.actions.js:20 +msgid "%(sel)s of %(cnt)s selected" +msgid_plural "%(sel)s of %(cnt)s selected" +msgstr[0] "%(sel)s de %(cnt)s seleccionado." +msgstr[1] "%(sel)s de %(cnt)s seleccionado " + +#: static/xadmin/js/xadmin.plugin.revision.js:25 +msgid "New Item" +msgstr "Nuevo elemento" + +#: static/xadmin/js/xadmin.widget.datetime.js:32 +msgid "Sunday Monday Tuesday Wednesday Thursday Friday Saturday Sunday" +msgstr "Domingo Lunes Martes Miércoles Jueves Viernes Sábado Domingo" + +#: static/xadmin/js/xadmin.widget.datetime.js:33 +msgid "Sun Mon Tue Wed Thu Fri Sat Sun" +msgstr "Dom Lun Mar Mié Jue Vie Sáb Dom" + +#: static/xadmin/js/xadmin.widget.datetime.js:34 +msgid "Su Mo Tu We Th Fr Sa Su" +msgstr "Do Lu Ma Mi Ju Vi Sá Do" + +#: static/xadmin/js/xadmin.widget.datetime.js:35 +msgid "" +"January February March April May June July August September October November" +" December" +msgstr "Enero Febrero Marzo Abril Mayo Junio ​​Julio Agosto Septiembre Octubre Noviembre Diciembre" + +#: static/xadmin/js/xadmin.widget.datetime.js:36 +msgid "Jan Feb Mar Apr May Jun Jul Aug Sep Oct Nov Dec" +msgstr "Ene Feb Mar Abr May Jun Jul Ago Sep Oct Nov Dic" + +#: static/xadmin/js/xadmin.widget.datetime.js:37 +msgid "Today" +msgstr "Hoy" + +#: static/xadmin/js/xadmin.widget.datetime.js:38 +msgid "%a %d %b %Y %T %Z" +msgstr "%a %d %b %Y %T %Z" + +#: static/xadmin/js/xadmin.widget.datetime.js:39 +msgid "AM PM" +msgstr "AM PM" + +#: static/xadmin/js/xadmin.widget.datetime.js:40 +msgid "am pm" +msgstr "am pm" + +#: static/xadmin/js/xadmin.widget.datetime.js:43 +msgid "%T" +msgstr "%T" diff --git "a/8\343\200\201\346\226\207\347\214\256\346\225\260\346\215\256\346\214\226\346\216\230\347\263\273\347\273\237(\351\231\204\346\272\220\347\240\201)/extra_apps/xadmin/locale/eu/LC_MESSAGES/django.mo" "b/8\343\200\201\346\226\207\347\214\256\346\225\260\346\215\256\346\214\226\346\216\230\347\263\273\347\273\237(\351\231\204\346\272\220\347\240\201)/extra_apps/xadmin/locale/eu/LC_MESSAGES/django.mo" new file mode 100644 index 0000000..f6c51c6 Binary files /dev/null and "b/8\343\200\201\346\226\207\347\214\256\346\225\260\346\215\256\346\214\226\346\216\230\347\263\273\347\273\237(\351\231\204\346\272\220\347\240\201)/extra_apps/xadmin/locale/eu/LC_MESSAGES/django.mo" differ diff --git "a/8\343\200\201\346\226\207\347\214\256\346\225\260\346\215\256\346\214\226\346\216\230\347\263\273\347\273\237(\351\231\204\346\272\220\347\240\201)/extra_apps/xadmin/locale/eu/LC_MESSAGES/django.po" "b/8\343\200\201\346\226\207\347\214\256\346\225\260\346\215\256\346\214\226\346\216\230\347\263\273\347\273\237(\351\231\204\346\272\220\347\240\201)/extra_apps/xadmin/locale/eu/LC_MESSAGES/django.po" new file mode 100644 index 0000000..61f5e85 --- /dev/null +++ "b/8\343\200\201\346\226\207\347\214\256\346\225\260\346\215\256\346\214\226\346\216\230\347\263\273\347\273\237(\351\231\204\346\272\220\347\240\201)/extra_apps/xadmin/locale/eu/LC_MESSAGES/django.po" @@ -0,0 +1,1475 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER +# This file is distributed under the same license as the PACKAGE package. +# +# Translators: +# unaizalakain , 2013 +msgid "" +msgstr "" +"Project-Id-Version: xadmin-core\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2016-07-20 13:28+0800\n" +"PO-Revision-Date: 2013-11-20 10:21+0000\n" +"Last-Translator: sshwsfc \n" +"Language-Team: Basque (http://www.transifex.com/projects/p/xadmin/language/" +"eu/)\n" +"Language: eu\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +#: adminx.py:19 +msgid "Admin Object" +msgstr "" + +#: apps.py:11 +msgid "Administration" +msgstr "" + +#: filters.py:159 filters.py:191 filters.py:407 filters.py:493 filters.py:531 +msgid "All" +msgstr "Guztia" + +#: filters.py:160 plugins/export.py:165 +msgid "Yes" +msgstr "Bai" + +#: filters.py:161 plugins/export.py:165 +msgid "No" +msgstr "Ez" + +#: filters.py:175 +msgid "Unknown" +msgstr "Ezezaguna" + +#: filters.py:267 +msgid "Any date" +msgstr "Edozein data" + +#: filters.py:268 +msgid "Has date" +msgstr "" + +#: filters.py:271 +msgid "Has no date" +msgstr "" + +#: filters.py:274 widgets.py:30 +msgid "Today" +msgstr "Gaur" + +#: filters.py:278 +msgid "Past 7 days" +msgstr "Duela 7 egun" + +#: filters.py:282 +msgid "This month" +msgstr "Hilabete hau" + +#: filters.py:286 +msgid "This year" +msgstr "Urte hau" + +#: forms.py:10 +msgid "" +"Please enter the correct username and password for a staff account. Note " +"that both fields are case-sensitive." +msgstr "" +"Mesedez sartu langile kontu baten erabiltzaile eta pasahitz egokiak. Kontuan " +"hartu bi eremuek maiuskula eta minuskulak bereizten dituztela." + +#: forms.py:21 +msgid "Please log in again, because your session has expired." +msgstr "Mesedez hasi berriro saioa, zure uneko saioa iraungi da eta." + +#: forms.py:41 +#, python-format +msgid "Your e-mail address is not your username. Try '%s' instead." +msgstr "" +"Zure e-posta helbidea ez da zure erabiltzaile izena. Horren ordez saiatu " +"'%s'." + +#: models.py:48 +msgid "Title" +msgstr "Izenburua" + +#: models.py:49 models.py:88 models.py:107 models.py:149 +msgid "user" +msgstr "" + +#: models.py:50 +msgid "Url Name" +msgstr "Url Izena" + +#: models.py:52 +msgid "Query String" +msgstr "Kontsulta Katea" + +#: models.py:53 +msgid "Is Shared" +msgstr "Partekatua da." + +#: models.py:66 plugins/bookmark.py:50 plugins/bookmark.py:180 +msgid "Bookmark" +msgstr "Laster-marketara gehitu" + +#: models.py:67 +msgid "Bookmarks" +msgstr "Laster-markak" + +#: models.py:89 +msgid "Settings Key" +msgstr "Ezarpenen Gakoa" + +#: models.py:90 +msgid "Settings Content" +msgstr "Ezarpenen Edukia" + +#: models.py:102 +msgid "User Setting" +msgstr "Erabiltzaile Ezarpenak" + +#: models.py:103 +msgid "User Settings" +msgstr "Erabiltzaile Ezarpenak" + +#: models.py:108 +msgid "Page" +msgstr "Orrialdea" + +#: models.py:109 views/dashboard.py:82 views/dashboard.py:92 +msgid "Widget Type" +msgstr "Widget Mota" + +#: models.py:110 views/dashboard.py:83 +msgid "Widget Params" +msgstr "Widget Parametroak" + +#: models.py:137 +msgid "User Widget" +msgstr "Erabiltzaile Widgeta" + +#: models.py:138 +msgid "User Widgets" +msgstr "Erabiltzaile Widgetak" + +#: models.py:142 +#, fuzzy +#| msgid "Date/time" +msgid "action time" +msgstr "Data/ordua" + +#: models.py:151 +msgid "action ip" +msgstr "" + +#: models.py:155 +msgid "content type" +msgstr "" + +#: models.py:158 +msgid "object id" +msgstr "" + +#: models.py:159 +msgid "object repr" +msgstr "" + +#: models.py:160 +msgid "action flag" +msgstr "" + +#: models.py:161 +#, fuzzy +#| msgid "Change %s" +msgid "change message" +msgstr "Aldaketa %s" + +#: models.py:164 +#, fuzzy +#| msgid "log in" +msgid "log entry" +msgstr "hasi saioa" + +#: models.py:165 +msgid "log entries" +msgstr "" + +#: models.py:173 +#, python-format +msgid "Added \"%(object)s\"." +msgstr "" + +#: models.py:175 +#, python-format +msgid "Changed \"%(object)s\" - %(changes)s" +msgstr "" + +#: models.py:180 +#, fuzzy, python-format +#| msgid "Related Objects" +msgid "Deleted \"%(object)s.\"" +msgstr "Erlazionatutako Objetuak" + +#: plugins/actions.py:57 +#, python-format +msgid "Delete selected %(verbose_name_plural)s" +msgstr "Aukeratutako %(verbose_name_plural)s ezabatu" + +#: plugins/actions.py:72 +#, fuzzy, python-format +#| msgid "Successfully deleted %(count)d %(items)s." +msgid "Batch delete %(count)d %(items)s." +msgstr "Aukeratutako %(count)d %(items)s arrakastaz ezabatuak." + +#: plugins/actions.py:78 +#, python-format +msgid "Successfully deleted %(count)d %(items)s." +msgstr "Aukeratutako %(count)d %(items)s arrakastaz ezabatuak." + +#: plugins/actions.py:110 views/delete.py:70 +#, python-format +msgid "Cannot delete %(name)s" +msgstr "Ezin izan da %(name)s ezabatu" + +#: plugins/actions.py:112 views/delete.py:73 +msgid "Are you sure?" +msgstr "Ziur al zaude?" + +#: plugins/actions.py:158 +#, python-format +msgid "%(total_count)s selected" +msgid_plural "All %(total_count)s selected" +msgstr[0] "%(total_count)s aukeratua" +msgstr[1] "%(total_count)s guztiak aukeratuak" + +#: plugins/actions.py:162 +#, python-format +msgid "0 of %(cnt)s selected" +msgstr "%(cnt)stik 0 aukeratuak" + +#: plugins/actions.py:179 plugins/actions.py:189 +msgid "" +"Items must be selected in order to perform actions on them. No items have " +"been changed." +msgstr "" +"Elementuren bat aukeratzea beharrezkoa da ekintza bat burutzeko. Ez da " +"elementurik aldatu." + +#: plugins/aggregation.py:14 +msgid "Min" +msgstr "Min" + +#: plugins/aggregation.py:14 +msgid "Max" +msgstr "Max" + +#: plugins/aggregation.py:14 +msgid "Avg" +msgstr "Btz-bst" + +#: plugins/aggregation.py:14 +msgid "Sum" +msgstr "Batura" + +#: plugins/aggregation.py:14 +msgid "Count" +msgstr "Kontaketa" + +#: plugins/auth.py:21 +#, fuzzy, python-format +msgid "Can add %s" +msgstr "%s gehitu" + +#: plugins/auth.py:22 +#, fuzzy, python-format +msgid "Can change %s" +msgstr "Aldaketa %s" + +#: plugins/auth.py:23 +#, python-format +msgid "Can edit %s" +msgstr "" + +#: plugins/auth.py:24 +#, fuzzy, python-format +msgid "Can delete %s" +msgstr "Ezin izan da %(name)s ezabatu" + +#: plugins/auth.py:25 +#, python-format +msgid "Can view %s" +msgstr "" + +#: plugins/auth.py:87 +msgid "Personal info" +msgstr "Info pertsonala" + +#: plugins/auth.py:91 +msgid "Permissions" +msgstr "Baimenak" + +#: plugins/auth.py:94 +msgid "Important dates" +msgstr "Data garrantzitsuak" + +#: plugins/auth.py:99 +msgid "Status" +msgstr "Egoera" + +#: plugins/auth.py:111 +#, fuzzy +msgid "Permission Name" +msgstr "Baimenak" + +#: plugins/auth.py:167 +msgid "Change Password" +msgstr "Pasahitza Aldatu" + +#: plugins/auth.py:198 +#, python-format +msgid "Change password: %s" +msgstr "Pasahitza aldatu: %s" + +#: plugins/auth.py:223 plugins/auth.py:255 +msgid "Password changed successfully." +msgstr "Pasahitza arrakastaz aldatua." + +#: plugins/auth.py:242 templates/xadmin/auth/user/change_password.html:11 +#: templates/xadmin/auth/user/change_password.html:22 +#: templates/xadmin/auth/user/change_password.html:55 +msgid "Change password" +msgstr "Pasahitza aldatu" + +#: plugins/batch.py:44 +msgid "Change this field" +msgstr "" + +#: plugins/batch.py:65 +#, python-format +msgid "Batch Change selected %(verbose_name_plural)s" +msgstr "Sorta moduko Aldaketa aukeratua %(verbose_name_plural)s" + +#: plugins/batch.py:89 +#, python-format +msgid "Successfully change %(count)d %(items)s." +msgstr "" + +#: plugins/batch.py:138 +#, python-format +msgid "Batch change %s" +msgstr "" + +#: plugins/bookmark.py:173 +msgid "bookmark" +msgstr "" + +#: plugins/bookmark.py:176 +msgid "Bookmark Widget, can show user's bookmark list data in widget." +msgstr "" +"Laster-marken Widgeta, erabiltzailearen laster-marka zerrenda widgetean " +"erakutsi dezake." + +#: plugins/chart.py:25 +msgid "Show models simple chart." +msgstr "Erabili modeluen diagrama sinplea." + +#: plugins/chart.py:51 +#, python-format +msgid "%s Charts" +msgstr "%s Diagrama" + +#: plugins/comments.py:33 +msgid "Metadata" +msgstr "" + +#: plugins/comments.py:60 +msgid "flagged" +msgid_plural "flagged" +msgstr[0] "" +msgstr[1] "" + +#: plugins/comments.py:61 +msgid "Flag selected comments" +msgstr "" + +#: plugins/comments.py:66 +msgid "approved" +msgid_plural "approved" +msgstr[0] "" +msgstr[1] "" + +#: plugins/comments.py:67 +msgid "Approve selected comments" +msgstr "" + +#: plugins/comments.py:72 +#, fuzzy +msgid "removed" +msgid_plural "removed" +msgstr[0] "Ezabatu" +msgstr[1] "Ezabatu" + +#: plugins/comments.py:73 +#, fuzzy +msgid "Remove selected comments" +msgstr "Ezabatutako %(name)sa berreskuratu" + +#: plugins/comments.py:86 +#, python-format +msgid "1 comment was successfully %(action)s." +msgid_plural "%(count)s comments were successfully %(action)s." +msgstr[0] "" +msgstr[1] "" + +#: plugins/details.py:52 views/list.py:578 +#, python-format +msgid "Details of %s" +msgstr "%sren xehetasunak" + +#: plugins/editable.py:46 +#, python-format +msgid "Enter %s" +msgstr "Sartu %s" + +#: plugins/editable.py:73 views/dashboard.py:649 views/delete.py:27 +#: views/detail.py:145 views/edit.py:454 +#, python-format +msgid "%(name)s object with primary key %(key)r does not exist." +msgstr "Ez da %(key)r eremua nagusitzat duen %(name)srik." + +#: plugins/export.py:98 plugins/export.py:135 +msgid "Sheet" +msgstr "Xafla" + +#: plugins/filters.py:133 plugins/quickfilter.py:141 +#, python-format +msgid "Filtering error: %s" +msgstr "" + +#: plugins/images.py:29 +msgid "Previous" +msgstr "Aurrekoa" + +#: plugins/images.py:29 +msgid "Next" +msgstr "Hurrengoa" + +#: plugins/images.py:29 +msgid "Slideshow" +msgstr "Aurkezpena" + +#: plugins/images.py:29 +msgid "Download" +msgstr "Deskargatu" + +#: plugins/images.py:50 +msgid "Change:" +msgstr "Aldatu:" + +#: plugins/layout.py:16 +msgid "Table" +msgstr "" + +#: plugins/layout.py:22 +msgid "Thumbnails" +msgstr "" + +#: plugins/passwords.py:64 +msgid "Forgotten your password or username?" +msgstr "Zure pasahitza edo erabiltzailea ahaztu duzu?" + +#: plugins/quickform.py:79 +#, python-format +msgid "Create New %s" +msgstr "" + +#: plugins/relate.py:104 +msgid "Related Objects" +msgstr "Erlazionatutako Objetuak" + +#: plugins/relfield.py:29 plugins/topnav.py:38 +#, python-format +msgid "Search %s" +msgstr "Bilatu %s" + +#: plugins/relfield.py:67 +#, fuzzy, python-format +#| msgid "Select Date" +msgid "Select %s" +msgstr "Data Aukeratu" + +#: plugins/themes.py:47 +msgid "Default" +msgstr "" + +#: plugins/themes.py:48 +msgid "Default bootstrap theme" +msgstr "" + +#: plugins/themes.py:49 +msgid "Bootstrap2" +msgstr "" + +#: plugins/themes.py:49 +msgid "Bootstrap 2.x theme" +msgstr "" + +#: plugins/topnav.py:62 views/dashboard.py:465 views/edit.py:387 +#: views/edit.py:396 +#, python-format +msgid "Add %s" +msgstr "%s gehitu" + +#: plugins/xversion.py:106 +msgid "Initial version." +msgstr "Hasierako bertsioa." + +#: plugins/xversion.py:108 +msgid "Change version." +msgstr "Bertsioa aldatu." + +#: plugins/xversion.py:110 +msgid "Revert version." +msgstr "Aurreko bertsiora itzuli." + +#: plugins/xversion.py:112 +msgid "Rercover version." +msgstr "Bertsioa berreskuratu." + +#: plugins/xversion.py:114 +#, python-format +msgid "Deleted %(verbose_name)s." +msgstr "%(verbose_name)s ezabatua." + +#: plugins/xversion.py:127 templates/xadmin/views/recover_form.html:26 +msgid "Recover" +msgstr "Berreskuratu" + +#: plugins/xversion.py:143 templates/xadmin/views/model_history.html:11 +#: templates/xadmin/views/revision_diff.html:11 +#: templates/xadmin/views/revision_form.html:15 +msgid "History" +msgstr "Historiala" + +#: plugins/xversion.py:194 templates/xadmin/views/recover_form.html:14 +#: templates/xadmin/views/recover_list.html:10 +#, python-format +msgid "Recover deleted %(name)s" +msgstr "Ezabatutako %(name)sa berreskuratu" + +#: plugins/xversion.py:238 +#, python-format +msgid "Change history: %s" +msgstr "Historiala aldatu: %s" + +#: plugins/xversion.py:288 +msgid "Must select two versions." +msgstr "Bi bertsio aukeratu behar dira." + +#: plugins/xversion.py:296 +msgid "Please select two different versions." +msgstr "Mesedez aukeratu bi bertsio ezberdin." + +#: plugins/xversion.py:383 plugins/xversion.py:500 +#, python-format +msgid "Current: %s" +msgstr "Unekoa: %s" + +#: plugins/xversion.py:424 +#, python-format +msgid "Revert %s" +msgstr "%s aurreko bertsiora itzuli" + +#: plugins/xversion.py:440 +#, python-format +msgid "" +"The %(model)s \"%(name)s\" was reverted successfully. You may edit it again " +"below." +msgstr "" +"\"%(name)s\" %(model)sa aurreko bertsiora arrakastaz itzularazi da. Azpian " +"berriro editatu dezakezu." + +#: plugins/xversion.py:461 +#, python-format +msgid "Recover %s" +msgstr "%s berreskuratu" + +#: plugins/xversion.py:477 +#, python-format +msgid "" +"The %(model)s \"%(name)s\" was recovered successfully. You may edit it again " +"below." +msgstr "" +"\"%(name)s\" %(model)sa arrakastaz berreskuratu da. Azpian berriro editatu " +"dezakezu." + +#: templates/xadmin/404.html:4 templates/xadmin/404.html:8 +msgid "Page not found" +msgstr "Orria ez da aurkitu" + +#: templates/xadmin/404.html:10 +msgid "We're sorry, but the requested page could not be found." +msgstr "Sentitzen dugu baina eskatutako orria ezin izan da aurkitu." + +#: templates/xadmin/500.html:7 +#: templates/xadmin/auth/user/change_password.html:10 +#: templates/xadmin/auth/user/change_password.html:15 +#: templates/xadmin/base_site.html:53 +#: templates/xadmin/includes/sitemenu_default.html:7 +#: templates/xadmin/views/app_index.html:9 +#: templates/xadmin/views/batch_change_form.html:9 +#: templates/xadmin/views/invalid_setup.html:7 +#: templates/xadmin/views/model_dashboard.html:7 +#: templates/xadmin/views/model_delete_selected_confirm.html:8 +#: templates/xadmin/views/model_history.html:8 +#: templates/xadmin/views/recover_form.html:8 +#: templates/xadmin/views/recover_list.html:8 +#: templates/xadmin/views/revision_diff.html:8 +#: templates/xadmin/views/revision_form.html:8 views/base.py:473 +msgid "Home" +msgstr "Hasiera" + +#: templates/xadmin/500.html:8 +msgid "Server error" +msgstr "Zerbitzariaren errorea" + +#: templates/xadmin/500.html:12 +msgid "Server error (500)" +msgstr "Zerbitzariaren errorea (500)" + +#: templates/xadmin/500.html:15 +msgid "Server Error (500)" +msgstr "Zerbitzariaren errorea " + +#: templates/xadmin/500.html:16 +msgid "" +"There's been an error. It's been reported to the site administrators via e-" +"mail and should be fixed shortly. Thanks for your patience." +msgstr "" +"Errore bat egon da. Eposta bidez bidali zaio webgunearen kudeatzaileari eta " +"laister konpondu beharko litzake. Milesker zure pazientziagatik." + +#: templates/xadmin/auth/password_reset/complete.html:11 +#: templates/xadmin/auth/password_reset/done.html:11 +msgid "Password reset successful" +msgstr "Pasahitzaren berrezartze arrakastatsua" + +#: templates/xadmin/auth/password_reset/complete.html:14 +msgid "Your password has been set. You may go ahead and log in now." +msgstr "Zure pasahitza ezarria izan da. Orain saioa hasi dezakezu." + +#: templates/xadmin/auth/password_reset/complete.html:15 +msgid "Log in" +msgstr "Sarioa hasi" + +#: templates/xadmin/auth/password_reset/confirm.html:12 +msgid "Enter new password" +msgstr "Pasahitz berria idatzi" + +#: templates/xadmin/auth/password_reset/confirm.html:17 +msgid "" +"Please enter your new password twice so we can verify you typed it in " +"correctly." +msgstr "" +"Mesedez idatzi zure pasahitz berria bi aldiz ongi idatzi duzun egiaztatzeko." + +#: templates/xadmin/auth/password_reset/confirm.html:19 +msgid "Change my password" +msgstr "Nire pasahitza aldatu" + +#: templates/xadmin/auth/password_reset/confirm.html:24 +msgid "Password reset unsuccessful" +msgstr "Pasahitzaren berrezartzea gaizki joan da" + +#: templates/xadmin/auth/password_reset/confirm.html:27 +msgid "" +"The password reset link was invalid, possibly because it has already been " +"used. Please request a new password reset." +msgstr "" +"Pasahitzaren berrezartze esteka baliogabea zen, ziur aski iadanik erabilia " +"izan delak. Mesedez, eskatu pasahitzaren berrezartze berri bat." + +#: templates/xadmin/auth/password_reset/done.html:14 +msgid "" +"We've e-mailed you instructions for setting your password to the e-mail " +"address you submitted. You should be receiving it shortly." +msgstr "" +"Eposta biez zure pasahitza ezartzeko argibideak bidali dizkizugu eman " +"diguzun eposta helbidera. Laister jaso beharko zenituzke." + +#: templates/xadmin/auth/password_reset/email.html:2 +#, python-format +msgid "" +"You're receiving this e-mail because you requested a password reset for your " +"user account at %(site_name)s." +msgstr "" +"%(site_name)sen zure erabiltzailearen pasahitzaren berrezarpen bat eskatu " +"duzulako ari zera eposta hau jasotzen." + +#: templates/xadmin/auth/password_reset/email.html:4 +msgid "Please go to the following page and choose a new password:" +msgstr "Mesedez, joan ondorengo orrira eta pasahitz berri bat aukeratu:" + +#: templates/xadmin/auth/password_reset/email.html:8 +msgid "Your username, in case you've forgotten:" +msgstr "Zure erabiltzailea, ahaztu baduzu:" + +#: templates/xadmin/auth/password_reset/email.html:10 +msgid "Thanks for using our site!" +msgstr "Eskerrik asko gunea erabiltzaileagatik!" + +#: templates/xadmin/auth/password_reset/email.html:12 +#, python-format +msgid "The %(site_name)s team" +msgstr "%(site_name)sko taldea" + +#: templates/xadmin/auth/password_reset/form.html:13 +msgid "Password reset" +msgstr "Pasahitza berrezarri" + +#: templates/xadmin/auth/password_reset/form.html:17 +msgid "" +"Forgotten your password? Enter your e-mail address below, and we'll e-mail " +"instructions for setting a new one." +msgstr "" +"Pasahitza ahaztu duzu? Idatzi zure eposta helbidea behean eta berri bat " +"ezartzeko argibideak bidaliko dizkizugu." + +#: templates/xadmin/auth/password_reset/form.html:25 +msgid "E-mail address:" +msgstr "Eposta helbidea:" + +#: templates/xadmin/auth/password_reset/form.html:33 +msgid "Reset my password" +msgstr "Nire pasahitza berrezarri" + +#: templates/xadmin/auth/user/add_form.html:6 +msgid "" +"First, enter a username and password. Then, you'll be able to edit more user " +"options." +msgstr "" +"Lehendabizi, erabiltzaile eta pasahitz bat sartu. Ondoren, erabiltzaile " +"aukera gehiago editatzeko gai izango zara." + +#: templates/xadmin/auth/user/add_form.html:8 +msgid "Enter a username and password." +msgstr "Erabiltzaile eta pasahitz bat sartu." + +#: templates/xadmin/auth/user/change_password.html:31 +#: templates/xadmin/views/batch_change_form.html:24 +#: templates/xadmin/views/form.html:18 +#: templates/xadmin/views/model_form.html:20 +msgid "Please correct the error below." +msgid_plural "Please correct the errors below." +msgstr[0] "Beheko errorea zuzendu mesedez." +msgstr[1] "Beheko erroreak zuzendu mesedez." + +#: templates/xadmin/auth/user/change_password.html:38 +msgid "Enter your new password." +msgstr "Zure pasahitz berria sartu." + +#: templates/xadmin/auth/user/change_password.html:40 +#, python-format +msgid "Enter a new password for the user %(username)s." +msgstr "" +"%(username)s erabiltzailearentzat pasahitz berri bat sartu." + +#: templates/xadmin/base_site.html:18 +msgid "Welcome," +msgstr "Ongietorri," + +#: templates/xadmin/base_site.html:24 +msgid "Log out" +msgstr "Saioa amaitu" + +#: templates/xadmin/base_site.html:36 +msgid "You don't have permission to edit anything." +msgstr "Ez daukazu ezer editatzeko baimenik." + +#: templates/xadmin/blocks/comm.top.theme.html:4 +msgid "Themes" +msgstr "Itsura-gaiak" + +#: templates/xadmin/blocks/comm.top.topnav.html:9 +#: templates/xadmin/blocks/model_list.nav_form.search_form.html:8 +#: templates/xadmin/filters/char.html:7 +#: templates/xadmin/filters/fk_search.html:7 +#: templates/xadmin/filters/fk_search.html:16 +#: templates/xadmin/filters/number.html:7 +msgid "Search" +msgstr "Bilatu" + +#: templates/xadmin/blocks/comm.top.topnav.html:23 +msgid "Add" +msgstr "Gehitu" + +#: templates/xadmin/blocks/model_form.submit_line.wizard.html:9 +#: templates/xadmin/blocks/model_form.submit_line.wizard.html:26 +msgid "Prev step" +msgstr "Aurr pausua" + +#: templates/xadmin/blocks/model_form.submit_line.wizard.html:13 +#: templates/xadmin/blocks/model_form.submit_line.wizard.html:29 +msgid "Next step" +msgstr "Ondo pausua" + +#: templates/xadmin/blocks/model_form.submit_line.wizard.html:15 +#: templates/xadmin/blocks/model_form.submit_line.wizard.html:31 +#: templates/xadmin/includes/submit_line.html:10 +#: templates/xadmin/includes/submit_line.html:13 +#: templates/xadmin/views/form.html:30 templates/xadmin/views/form.html:31 +msgid "Save" +msgstr "Gorde" + +#: templates/xadmin/blocks/model_list.nav_menu.bookmarks.html:7 +msgid "Clean Bookmarks" +msgstr "Laster-markak Garbitu" + +#: templates/xadmin/blocks/model_list.nav_menu.bookmarks.html:18 +msgid "No Bookmarks" +msgstr "Ez dago Laster-markarik" + +#: templates/xadmin/blocks/model_list.nav_menu.bookmarks.html:22 +msgid "New Bookmark" +msgstr "Laster-marka Berria" + +#: templates/xadmin/blocks/model_list.nav_menu.bookmarks.html:26 +msgid "Save current page as Bookmark" +msgstr "Uneko orria Laster-marka bezala gorde" + +#: templates/xadmin/blocks/model_list.nav_menu.bookmarks.html:32 +msgid "Enter bookmark title" +msgstr "Laster-markaren izenburua idatzi" + +#: templates/xadmin/blocks/model_list.nav_menu.bookmarks.html:33 +msgid "Waiting" +msgstr "Itxoiten" + +#: templates/xadmin/blocks/model_list.nav_menu.bookmarks.html:33 +msgid "Save Bookmark" +msgstr "Laster-marka gorde" + +#: templates/xadmin/blocks/model_list.nav_menu.filters.html:4 +msgid "Filters" +msgstr "Filtroak" + +#: templates/xadmin/blocks/model_list.nav_menu.filters.html:8 +msgid "Clean Filters" +msgstr "Filtroak garbitu" + +#: templates/xadmin/blocks/model_list.results_bottom.actions.html:19 +msgid "Click here to select the objects across all pages" +msgstr "Klikatu hemen orrialde guztiko objetuak aukeratzeko" + +#: templates/xadmin/blocks/model_list.results_bottom.actions.html:19 +#, python-format +msgid "Select all %(total_count)s %(model_name)s" +msgstr "Aukeratu %(total_count)s %(model_name)sak" + +#: templates/xadmin/blocks/model_list.results_bottom.actions.html:20 +msgid "Clear selection" +msgstr "Aukeraketa garbitu" + +#: templates/xadmin/blocks/model_list.results_top.charts.html:4 +msgid "Charts" +msgstr "Diagramak" + +#: templates/xadmin/blocks/model_list.top_toolbar.exports.html:4 +#: templates/xadmin/blocks/model_list.top_toolbar.exports.html:8 +#: templates/xadmin/blocks/model_list.top_toolbar.exports.html:19 +#: templates/xadmin/blocks/model_list.top_toolbar.exports.html:47 +msgid "Export" +msgstr "Esportatu" + +#: templates/xadmin/blocks/model_list.top_toolbar.exports.html:26 +#: templates/xadmin/blocks/model_list.top_toolbar.exports.html:29 +#: templates/xadmin/blocks/model_list.top_toolbar.exports.html:32 +msgid "Export with table header." +msgstr "Esportatu taularen goiburuarekin." + +#: templates/xadmin/blocks/model_list.top_toolbar.exports.html:35 +#: templates/xadmin/blocks/model_list.top_toolbar.exports.html:38 +msgid "Export with format." +msgstr "Formatuarekin esportatu." + +#: templates/xadmin/blocks/model_list.top_toolbar.exports.html:42 +msgid "Export all data." +msgstr "Data guztiak esportatu." + +#: templates/xadmin/blocks/model_list.top_toolbar.exports.html:46 +#: templates/xadmin/widgets/base.html:41 +msgid "Close" +msgstr "Itxi" + +#: templates/xadmin/blocks/model_list.top_toolbar.layouts.html:4 +msgid "Layout" +msgstr "" + +#: templates/xadmin/blocks/model_list.top_toolbar.refresh.html:8 +msgid "Clean Refresh" +msgstr "Garbitu Freskatzea" + +#: templates/xadmin/blocks/model_list.top_toolbar.refresh.html:14 +#, python-format +msgid "Every %(t)s seconds" +msgstr "" + +#: templates/xadmin/blocks/model_list.top_toolbar.saveorder.html:4 +msgid "Save Order" +msgstr "" + +#: templates/xadmin/edit_inline/blank.html:5 views/detail.py:23 +#: views/edit.py:102 views/list.py:29 +msgid "Null" +msgstr "Null" + +#: templates/xadmin/filters/char.html:13 +msgid "Enter" +msgstr "Sartu" + +#: templates/xadmin/filters/date.html:10 templates/xadmin/filters/date.html:13 +msgid "Choice Date" +msgstr "Aukeraketa Data" + +#: templates/xadmin/filters/date.html:18 +msgid "YY" +msgstr "" + +#: templates/xadmin/filters/date.html:19 +msgid "year" +msgstr "urtea" + +#: templates/xadmin/filters/date.html:22 +msgid "MM" +msgstr "" + +#: templates/xadmin/filters/date.html:23 +msgid "month" +msgstr "hilabetea" + +#: templates/xadmin/filters/date.html:26 +msgid "DD" +msgstr "" + +#: templates/xadmin/filters/date.html:27 +msgid "day" +msgstr "eguna" + +#: templates/xadmin/filters/date.html:29 templates/xadmin/filters/date.html:46 +#: templates/xadmin/filters/date.html:54 +#: templates/xadmin/filters/fk_search.html:24 +#: templates/xadmin/filters/number.html:37 +msgid "Apply" +msgstr "Aplikatu" + +#: templates/xadmin/filters/date.html:34 +msgid "Date Range" +msgstr "Data Tartea" + +#: templates/xadmin/filters/date.html:41 +msgid "Select Date" +msgstr "Data Aukeratu" + +#: templates/xadmin/filters/date.html:42 +msgid "From" +msgstr "Nork" + +#: templates/xadmin/filters/date.html:44 +msgid "To" +msgstr "Nori" + +#: templates/xadmin/filters/fk_search.html:14 +#, fuzzy +#| msgid "Select Date" +msgid "Select" +msgstr "Data Aukeratu" + +#: templates/xadmin/filters/fk_search.html:26 +#: templates/xadmin/filters/number.html:39 +msgid "Clean" +msgstr "Garbitu" + +#: templates/xadmin/filters/number.html:17 +#: templates/xadmin/filters/number.html:25 +#: templates/xadmin/filters/number.html:33 +msgid "Enter Number" +msgstr "Zenbakia Sartu" + +#: templates/xadmin/filters/rel.html:3 +#, python-format +msgid " By %(filter_title)s " +msgstr "%(filter_title)sgatik" + +#: templates/xadmin/forms/transfer.html:4 +msgid "Available" +msgstr "Eskuragarri" + +#: templates/xadmin/forms/transfer.html:12 +msgid "Click to choose all at once." +msgstr "Klikatu guztia aukeratzeko." + +#: templates/xadmin/forms/transfer.html:12 +msgid "Choose all" +msgstr "Guztia aukeratu" + +#: templates/xadmin/forms/transfer.html:16 +msgid "Choose" +msgstr "Aukeratu" + +#: templates/xadmin/forms/transfer.html:19 +#: templates/xadmin/widgets/base.html:40 +msgid "Remove" +msgstr "Ezabatu" + +#: templates/xadmin/forms/transfer.html:23 +msgid "Chosen" +msgstr "Aukeratua" + +#: templates/xadmin/forms/transfer.html:27 +msgid "Click to remove all chosen at once." +msgstr "Klikatu aukeraketa guztia ezabatzeko" + +#: templates/xadmin/forms/transfer.html:27 +msgid "Remove all" +msgstr "Guztia ezabatu" + +#: templates/xadmin/includes/pagination.html:9 +msgid "Show all" +msgstr "Guztia erakutsi" + +#: templates/xadmin/includes/submit_line.html:10 +#: templates/xadmin/includes/submit_line.html:13 +#: templates/xadmin/views/form.html:30 templates/xadmin/views/form.html:31 +msgid "Saving.." +msgstr "" + +#: templates/xadmin/includes/submit_line.html:17 +msgid "Save as new" +msgstr "Berri bezala gorde" + +#: templates/xadmin/includes/submit_line.html:18 +msgid "Save and add another" +msgstr "Gorde eta beste bat gehitu" + +#: templates/xadmin/includes/submit_line.html:19 +msgid "Save and continue editing" +msgstr "Gorde eta editatzen jarraitu" + +#: templates/xadmin/includes/submit_line.html:24 +#: templates/xadmin/views/model_detail.html:28 views/delete.py:93 +msgid "Delete" +msgstr "Ezabatu" + +#: templates/xadmin/views/app_index.html:13 +#, python-format +msgid "%(name)s" +msgstr "%(name)s" + +#: templates/xadmin/views/batch_change_form.html:11 +msgid "Change multiple objects" +msgstr "Objetu anitz aldatu" + +#: templates/xadmin/views/batch_change_form.html:16 +#, python-format +msgid "Change one %(objects_name)s" +msgid_plural "Batch change %(counter)s %(objects_name)s" +msgstr[0] "" +msgstr[1] "" + +#: templates/xadmin/views/batch_change_form.html:38 +msgid "Change Multiple" +msgstr "Bizpahiru Aldatu" + +#: templates/xadmin/views/dashboard.html:15 +#: templates/xadmin/views/dashboard.html:22 +#: templates/xadmin/views/dashboard.html:23 +msgid "Add Widget" +msgstr "Widgeta Gehitu" + +#: templates/xadmin/views/invalid_setup.html:13 +msgid "" +"Something's wrong with your database installation. Make sure the appropriate " +"database tables have been created, and make sure the database is readable by " +"the appropriate user." +msgstr "" +"Zerbait txarto dago zure datubasearen instalazioarekin. Ziurtatu beharrezko " +"datubase taulak sortuak izan direla eta datubasea erabiltzaile egokiak " +"irakurri dezakela." + +#: templates/xadmin/views/logged_out.html:16 +msgid "Logout Success" +msgstr "Saioa Arrakastaz Amaitua" + +#: templates/xadmin/views/logged_out.html:17 +msgid "Thanks for spending some quality time with the Web site today." +msgstr "Eskerrikasko Web gunean zure denbora sartzeagatik." + +#: templates/xadmin/views/logged_out.html:19 +msgid "Close Window" +msgstr "Lehioa Itxi" + +#: templates/xadmin/views/logged_out.html:20 +msgid "Log in again" +msgstr "Saioa hasi berriro" + +#: templates/xadmin/views/login.html:39 views/website.py:38 +msgid "Please Login" +msgstr "Hasi Saioa mesedez" + +#: templates/xadmin/views/login.html:52 +msgid "Username" +msgstr "" + +#: templates/xadmin/views/login.html:64 +msgid "Password" +msgstr "" + +#: templates/xadmin/views/login.html:75 +msgid "log in" +msgstr "hasi saioa" + +#: templates/xadmin/views/model_dashboard.html:26 +#: templates/xadmin/views/model_detail.html:25 +msgid "Edit" +msgstr "Editatu" + +#: templates/xadmin/views/model_delete_confirm.html:11 +#, python-format +msgid "" +"Deleting the %(verbose_name)s '%(escaped_object)s' would result in deleting " +"related objects, but your account doesn't have permission to delete the " +"following types of objects:" +msgstr "" +"'%(escaped_object)s' %(verbose_name)sa ezabatzeak erlazionatutako beste " +"objetu batzuk ezabatuzko lituzke baina zure kontuak ez dauzka ondorengo " +"objetu motak ezabatzeko baimenik:" + +#: templates/xadmin/views/model_delete_confirm.html:19 +#, python-format +msgid "" +"Deleting the %(verbose_name)s '%(escaped_object)s' would require deleting " +"the following protected related objects:" +msgstr "" +"'%(escaped_object)s' %(verbose_name)sa ezabatzeak ondorengo babestutako " +"erlazionatutako objetuak ezabatuko lituzke:" + +#: templates/xadmin/views/model_delete_confirm.html:27 +#, python-format +msgid "" +"Are you sure you want to delete the %(verbose_name)s \"%(escaped_object)s\"? " +"All of the following related items will be deleted:" +msgstr "" +"Ziur al zaude \"%(escaped_object)s\" %(verbose_name)sa ezabatu nahi duzula? " +"Ondorengo erlazionatutako objetuak ezabatuko lirateke:" + +#: templates/xadmin/views/model_delete_confirm.html:34 +#: templates/xadmin/views/model_delete_selected_confirm.html:49 +msgid "Yes, I'm sure" +msgstr "Bai, ziur nago" + +#: templates/xadmin/views/model_delete_confirm.html:35 +#: templates/xadmin/views/model_delete_selected_confirm.html:50 +msgid "Cancel" +msgstr "" + +#: templates/xadmin/views/model_delete_selected_confirm.html:10 +msgid "Delete multiple objects" +msgstr "Bizpahiru objetu ezabatu" + +#: templates/xadmin/views/model_delete_selected_confirm.html:18 +#, python-format +msgid "" +"Deleting the selected %(objects_name)s would result in deleting related " +"objects, but your account doesn't have permission to delete the following " +"types of objects:" +msgstr "" +"Aukeratutako %(objects_name)s objetua ezabatzeak erlazionatutako objetuak " +"ezabatuko lituzke, baina zure kontuak ez dauzka ondorengo objetu motak " +"ezabatzeko baimenik:" + +#: templates/xadmin/views/model_delete_selected_confirm.html:26 +#, python-format +msgid "" +"Deleting the selected %(objects_name)s would require deleting the following " +"protected related objects:" +msgstr "" +"Aukeratutako %(objects_name)s objetua ezabatzeak ondorengo objetuak " +"ezabatuko lituzke:" + +#: templates/xadmin/views/model_delete_selected_confirm.html:34 +#, python-format +msgid "" +"Are you sure you want to delete the selected %(objects_name)s? All of the " +"following objects and their related items will be deleted:" +msgstr "" +"Ziur zaude aukeratutako %(objects_name)s ezabatu nahi duzula? Ondorengo " +"objetuak eta haiekin erlazionatuta daudenak ezabatuak izango dira:" + +#: templates/xadmin/views/model_history.html:26 +msgid "Diff" +msgstr "Diferentzia" + +#: templates/xadmin/views/model_history.html:27 +#: templates/xadmin/views/recover_list.html:25 +msgid "Date/time" +msgstr "Data/ordua" + +#: templates/xadmin/views/model_history.html:28 +msgid "User" +msgstr "Erabiltzailea" + +#: templates/xadmin/views/model_history.html:29 +msgid "Comment" +msgstr "Iruzkina" + +#: templates/xadmin/views/model_history.html:54 +msgid "Diff Select Versions" +msgstr "Aukeratutako Bertsioen Ezberdintasunak" + +#: templates/xadmin/views/model_history.html:58 +msgid "" +"This object doesn't have a change history. It probably wasn't added via this " +"admin site." +msgstr "" +"Objetu honek ez dauka aldaketa historialik. Ziurrenik ez zen kudeaketa gune " +"honen bitartez gehitua izango." + +#: templates/xadmin/views/model_list.html:29 +#, python-format +msgid "Add %(name)s" +msgstr "%(name)s gehitu" + +#: templates/xadmin/views/model_list.html:39 +msgid "Columns" +msgstr "" + +#: templates/xadmin/views/model_list.html:42 +msgid "Restore Selected" +msgstr "Aukeratutakoa berrezarri" + +#: templates/xadmin/views/model_list.html:147 +#: templates/xadmin/widgets/list.html:33 +msgid "Empty list" +msgstr "Zerrenda hustu" + +#: templates/xadmin/views/recover_form.html:20 +msgid "Press the recover button below to recover this version of the object." +msgstr "" +"Sakatu beheko berreskuratze botoia objetuaren bertsio hau berreskuratzeko." + +#: templates/xadmin/views/recover_list.html:19 +msgid "" +"Choose a date from the list below to recover a deleted version of an object." +msgstr "" +"Aukeratu beheko zerrendatik data bat objetu baten ezabatutako bertsioa " +"berreskuratzeko." + +#: templates/xadmin/views/recover_list.html:39 +msgid "There are no deleted objects to recover." +msgstr "Ez dago berreskuratu daitekeen ezabatutako objeturik." + +#: templates/xadmin/views/revision_diff.html:12 +#: templates/xadmin/views/revision_diff.html:17 +#, python-format +msgid "Diff %(verbose_name)s" +msgstr "%(verbose_name)s ezberdintasunak" + +#: templates/xadmin/views/revision_diff.html:25 +msgid "Field" +msgstr "Eremua" + +#: templates/xadmin/views/revision_diff.html:26 +msgid "Version A" +msgstr "A bertsioa" + +#: templates/xadmin/views/revision_diff.html:27 +msgid "Version B" +msgstr "B bertsioa" + +#: templates/xadmin/views/revision_diff.html:39 +msgid "Revert to" +msgstr "Hona itzularazi" + +#: templates/xadmin/views/revision_diff.html:40 +#: templates/xadmin/views/revision_diff.html:41 +msgid "Revert" +msgstr "Itzularazi" + +#: templates/xadmin/views/revision_form.html:16 +#, python-format +msgid "Revert %(verbose_name)s" +msgstr "%(verbose_name)s itzularazi" + +#: templates/xadmin/views/revision_form.html:21 +msgid "Press the revert button below to revert to this version of the object." +msgstr "Beheko itzularatze botoia sakatu objetua bertsio hontara itzultzeko." + +#: templates/xadmin/views/revision_form.html:27 +msgid "Revert this revision" +msgstr "Bertsio hau itzularazi" + +#: templates/xadmin/widgets/addform.html:14 +msgid "Success" +msgstr "Arrakasta" + +#: templates/xadmin/widgets/addform.html:14 +msgid "Add success, click edit to edit." +msgstr "" +"Gehitze arrakastatsua, klikatu editatu editatzeko." + +#: templates/xadmin/widgets/addform.html:17 +msgid "Quick Add" +msgstr "Gehitze Azkarra" + +#: templates/xadmin/widgets/base.html:31 +msgid "Widget Options" +msgstr "Widget Aukerak" + +#: templates/xadmin/widgets/base.html:42 +msgid "Save changes" +msgstr "Aldaketak gorde" + +#: views/base.py:315 +msgid "Django Xadmin" +msgstr "Django Xadmin" + +#: views/base.py:316 +msgid "my-company.inc" +msgstr "" + +#: views/dashboard.py:186 +msgid "Widget ID" +msgstr "Widget IDa" + +#: views/dashboard.py:187 +msgid "Widget Title" +msgstr "Widget Izenburua" + +#: views/dashboard.py:252 +msgid "Html Content Widget, can write any html content in widget." +msgstr "Html Eduki Widgeta, edozein html eduki idatzi daiteke widgetan." + +#: views/dashboard.py:255 +msgid "Html Content" +msgstr "Html Edukia" + +#: views/dashboard.py:318 +msgid "Target Model" +msgstr "Helburu den Modelua" + +#: views/dashboard.py:369 +msgid "Quick button Widget, quickly open any page." +msgstr "Botoi azkarra Widgeta, edozein orri azkar ireki." + +#: views/dashboard.py:371 +msgid "Quick Buttons" +msgstr "Botoi Azkarrak" + +#: views/dashboard.py:416 +msgid "Any Objects list Widget." +msgstr "Edozein Objetu zerrenda Widgeta." + +#: views/dashboard.py:456 +msgid "Add any model object Widget." +msgstr "Edozein objetu gehitu Widgeta." + +#: views/dashboard.py:492 +msgid "Dashboard" +msgstr "Arbela" + +#: views/dashboard.py:633 +#, python-format +msgid "%s Dashboard" +msgstr "" + +#: views/delete.py:103 +#, python-format +msgid "The %(name)s \"%(obj)s\" was deleted successfully." +msgstr "\"%(obj)s\" %(name)sa arrakastaz ezabatua izan da." + +#: views/detail.py:173 views/edit.py:211 views/form.py:72 +msgid "Other Fields" +msgstr "Beste Eremuak" + +#: views/detail.py:235 +#, python-format +msgid "%s Detail" +msgstr "%s Xehetasunak" + +#: views/edit.py:253 +msgid "Added." +msgstr "" + +#: views/edit.py:255 +#, fuzzy, python-format +#| msgid "Change %s" +msgid "Changed %s." +msgstr "Aldaketa %s" + +#: views/edit.py:255 +msgid "and" +msgstr "" + +#: views/edit.py:258 +msgid "No fields changed." +msgstr "" + +#: views/edit.py:420 +#, python-format +msgid "The %(name)s \"%(obj)s\" was added successfully." +msgstr "\"%(obj)s\" %(name)sa arrakastaz gehitua izan da." + +#: views/edit.py:425 views/edit.py:520 +msgid "You may edit it again below." +msgstr "Behean editatu dezakezu berriro." + +#: views/edit.py:429 views/edit.py:523 +#, python-format +msgid "You may add another %s below." +msgstr "Behean beste %s bat gehitu dezakezu." + +#: views/edit.py:471 +#, python-format +msgid "Change %s" +msgstr "Aldaketa %s" + +#: views/edit.py:516 +#, python-format +msgid "The %(name)s \"%(obj)s\" was changed successfully." +msgstr "\"%(obj)s\" %(name)sa arrakastaz gehitua izan da." + +#: views/form.py:165 +#, fuzzy, python-format +msgid "The %s was changed successfully." +msgstr "\"%(obj)s\" %(name)sa arrakastaz gehitua izan da." + +#: views/list.py:199 +msgid "Database error" +msgstr "Datubase errorea" + +#: views/list.py:373 +#, python-format +msgid "%s List" +msgstr "%s Zerrenda" + +#: views/list.py:499 +msgid "Sort ASC" +msgstr "GOR Ordenatu" + +#: views/list.py:500 +msgid "Sort DESC" +msgstr "BEH Ordenatu" + +#: views/list.py:504 +msgid "Cancel Sort" +msgstr "Ezeztatu Ordenaketa" + +#: views/website.py:16 +msgid "Main Dashboard" +msgstr "Arbela Nagusia" + +#: widgets.py:48 +msgid "Now" +msgstr "Orain" diff --git "a/8\343\200\201\346\226\207\347\214\256\346\225\260\346\215\256\346\214\226\346\216\230\347\263\273\347\273\237(\351\231\204\346\272\220\347\240\201)/extra_apps/xadmin/locale/eu/LC_MESSAGES/djangojs.mo" "b/8\343\200\201\346\226\207\347\214\256\346\225\260\346\215\256\346\214\226\346\216\230\347\263\273\347\273\237(\351\231\204\346\272\220\347\240\201)/extra_apps/xadmin/locale/eu/LC_MESSAGES/djangojs.mo" new file mode 100644 index 0000000..601a8bd Binary files /dev/null and "b/8\343\200\201\346\226\207\347\214\256\346\225\260\346\215\256\346\214\226\346\216\230\347\263\273\347\273\237(\351\231\204\346\272\220\347\240\201)/extra_apps/xadmin/locale/eu/LC_MESSAGES/djangojs.mo" differ diff --git "a/8\343\200\201\346\226\207\347\214\256\346\225\260\346\215\256\346\214\226\346\216\230\347\263\273\347\273\237(\351\231\204\346\272\220\347\240\201)/extra_apps/xadmin/locale/eu/LC_MESSAGES/djangojs.po" "b/8\343\200\201\346\226\207\347\214\256\346\225\260\346\215\256\346\214\226\346\216\230\347\263\273\347\273\237(\351\231\204\346\272\220\347\240\201)/extra_apps/xadmin/locale/eu/LC_MESSAGES/djangojs.po" new file mode 100644 index 0000000..609c60f --- /dev/null +++ "b/8\343\200\201\346\226\207\347\214\256\346\225\260\346\215\256\346\214\226\346\216\230\347\263\273\347\273\237(\351\231\204\346\272\220\347\240\201)/extra_apps/xadmin/locale/eu/LC_MESSAGES/djangojs.po" @@ -0,0 +1,71 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER +# This file is distributed under the same license as the PACKAGE package. +# +# Translators: +# unaizalakain , 2013 +msgid "" +msgstr "" +"Project-Id-Version: xadmin-core\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2013-04-30 23:11+0800\n" +"PO-Revision-Date: 2013-11-20 12:41+0000\n" +"Last-Translator: unaizalakain \n" +"Language-Team: Basque (http://www.transifex.com/projects/p/xadmin/language/eu/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: eu\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +#: static/xadmin/js/xadmin.plugin.actions.js:20 +msgid "%(sel)s of %(cnt)s selected" +msgid_plural "%(sel)s of %(cnt)s selected" +msgstr[0] "%(cnt)stik %(sel)s aukeratua" +msgstr[1] "%(cnt)stik %(sel)s aukeratuak" + +#: static/xadmin/js/xadmin.plugin.revision.js:25 +msgid "New Item" +msgstr "Elementu Berria" + +#: static/xadmin/js/xadmin.widget.datetime.js:32 +msgid "Sunday Monday Tuesday Wednesday Thursday Friday Saturday Sunday" +msgstr "Igandea Astelehena Asteartea Asteazkena Osteguna Ostirala Larunbata Igandea" + +#: static/xadmin/js/xadmin.widget.datetime.js:33 +msgid "Sun Mon Tue Wed Thu Fri Sat Sun" +msgstr "Iga Atl Atr Atz Otg Otr Lar Iga" + +#: static/xadmin/js/xadmin.widget.datetime.js:34 +msgid "Su Mo Tu We Th Fr Sa Su" +msgstr "Ig At Ar Az Og Or La Ig" + +#: static/xadmin/js/xadmin.widget.datetime.js:35 +msgid "" +"January February March April May June July August September October November" +" December" +msgstr "Urtarrila Otsaila Martxoa Apirila Maiatza Ekaina Uztaila Abuztua Iraila Urria Azaroa Abendua" + +#: static/xadmin/js/xadmin.widget.datetime.js:36 +msgid "Jan Feb Mar Apr May Jun Jul Aug Sep Oct Nov Dec" +msgstr "Urt Ots Mar Api Mai Eka Uzt Abu Ira Urr Aza Abe" + +#: static/xadmin/js/xadmin.widget.datetime.js:37 +msgid "Today" +msgstr "Gaur" + +#: static/xadmin/js/xadmin.widget.datetime.js:38 +msgid "%a %d %b %Y %T %Z" +msgstr "%a %d %b %Y %T %Z" + +#: static/xadmin/js/xadmin.widget.datetime.js:39 +msgid "AM PM" +msgstr "AM PM" + +#: static/xadmin/js/xadmin.widget.datetime.js:40 +msgid "am pm" +msgstr "am pm" + +#: static/xadmin/js/xadmin.widget.datetime.js:43 +msgid "%T" +msgstr "%T" diff --git "a/8\343\200\201\346\226\207\347\214\256\346\225\260\346\215\256\346\214\226\346\216\230\347\263\273\347\273\237(\351\231\204\346\272\220\347\240\201)/extra_apps/xadmin/locale/id_ID/LC_MESSAGES/django.mo" "b/8\343\200\201\346\226\207\347\214\256\346\225\260\346\215\256\346\214\226\346\216\230\347\263\273\347\273\237(\351\231\204\346\272\220\347\240\201)/extra_apps/xadmin/locale/id_ID/LC_MESSAGES/django.mo" new file mode 100644 index 0000000..434b645 Binary files /dev/null and "b/8\343\200\201\346\226\207\347\214\256\346\225\260\346\215\256\346\214\226\346\216\230\347\263\273\347\273\237(\351\231\204\346\272\220\347\240\201)/extra_apps/xadmin/locale/id_ID/LC_MESSAGES/django.mo" differ diff --git "a/8\343\200\201\346\226\207\347\214\256\346\225\260\346\215\256\346\214\226\346\216\230\347\263\273\347\273\237(\351\231\204\346\272\220\347\240\201)/extra_apps/xadmin/locale/id_ID/LC_MESSAGES/django.po" "b/8\343\200\201\346\226\207\347\214\256\346\225\260\346\215\256\346\214\226\346\216\230\347\263\273\347\273\237(\351\231\204\346\272\220\347\240\201)/extra_apps/xadmin/locale/id_ID/LC_MESSAGES/django.po" new file mode 100644 index 0000000..1cc66c5 --- /dev/null +++ "b/8\343\200\201\346\226\207\347\214\256\346\225\260\346\215\256\346\214\226\346\216\230\347\263\273\347\273\237(\351\231\204\346\272\220\347\240\201)/extra_apps/xadmin/locale/id_ID/LC_MESSAGES/django.po" @@ -0,0 +1,1403 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER +# This file is distributed under the same license as the PACKAGE package. +# +# Translators: +msgid "" +msgstr "" +"Project-Id-Version: xadmin-core\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2016-07-20 13:28+0800\n" +"PO-Revision-Date: 2013-11-20 10:21+0000\n" +"Last-Translator: sshwsfc \n" +"Language-Team: Indonesian (Indonesia) (http://www.transifex.com/projects/p/" +"xadmin/language/id_ID/)\n" +"Language: id_ID\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=1; plural=0;\n" + +#: adminx.py:19 +msgid "Admin Object" +msgstr "" + +#: apps.py:11 +msgid "Administration" +msgstr "" + +#: filters.py:159 filters.py:191 filters.py:407 filters.py:493 filters.py:531 +msgid "All" +msgstr "" + +#: filters.py:160 plugins/export.py:165 +msgid "Yes" +msgstr "" + +#: filters.py:161 plugins/export.py:165 +msgid "No" +msgstr "" + +#: filters.py:175 +msgid "Unknown" +msgstr "" + +#: filters.py:267 +msgid "Any date" +msgstr "" + +#: filters.py:268 +msgid "Has date" +msgstr "" + +#: filters.py:271 +msgid "Has no date" +msgstr "" + +#: filters.py:274 widgets.py:30 +msgid "Today" +msgstr "" + +#: filters.py:278 +msgid "Past 7 days" +msgstr "" + +#: filters.py:282 +msgid "This month" +msgstr "" + +#: filters.py:286 +msgid "This year" +msgstr "" + +#: forms.py:10 +msgid "" +"Please enter the correct username and password for a staff account. Note " +"that both fields are case-sensitive." +msgstr "" + +#: forms.py:21 +msgid "Please log in again, because your session has expired." +msgstr "" + +#: forms.py:41 +#, python-format +msgid "Your e-mail address is not your username. Try '%s' instead." +msgstr "" + +#: models.py:48 +msgid "Title" +msgstr "" + +#: models.py:49 models.py:88 models.py:107 models.py:149 +msgid "user" +msgstr "" + +#: models.py:50 +msgid "Url Name" +msgstr "" + +#: models.py:52 +msgid "Query String" +msgstr "" + +#: models.py:53 +msgid "Is Shared" +msgstr "" + +#: models.py:66 plugins/bookmark.py:50 plugins/bookmark.py:180 +msgid "Bookmark" +msgstr "" + +#: models.py:67 +msgid "Bookmarks" +msgstr "" + +#: models.py:89 +msgid "Settings Key" +msgstr "" + +#: models.py:90 +msgid "Settings Content" +msgstr "" + +#: models.py:102 +msgid "User Setting" +msgstr "" + +#: models.py:103 +msgid "User Settings" +msgstr "" + +#: models.py:108 +msgid "Page" +msgstr "" + +#: models.py:109 views/dashboard.py:82 views/dashboard.py:92 +msgid "Widget Type" +msgstr "" + +#: models.py:110 views/dashboard.py:83 +msgid "Widget Params" +msgstr "" + +#: models.py:137 +msgid "User Widget" +msgstr "" + +#: models.py:138 +msgid "User Widgets" +msgstr "" + +#: models.py:142 +msgid "action time" +msgstr "" + +#: models.py:151 +msgid "action ip" +msgstr "" + +#: models.py:155 +msgid "content type" +msgstr "" + +#: models.py:158 +msgid "object id" +msgstr "" + +#: models.py:159 +msgid "object repr" +msgstr "" + +#: models.py:160 +msgid "action flag" +msgstr "" + +#: models.py:161 +msgid "change message" +msgstr "" + +#: models.py:164 +msgid "log entry" +msgstr "" + +#: models.py:165 +msgid "log entries" +msgstr "" + +#: models.py:173 +#, python-format +msgid "Added \"%(object)s\"." +msgstr "" + +#: models.py:175 +#, python-format +msgid "Changed \"%(object)s\" - %(changes)s" +msgstr "" + +#: models.py:180 +#, python-format +msgid "Deleted \"%(object)s.\"" +msgstr "" + +#: plugins/actions.py:57 +#, python-format +msgid "Delete selected %(verbose_name_plural)s" +msgstr "" + +#: plugins/actions.py:72 +#, python-format +msgid "Batch delete %(count)d %(items)s." +msgstr "" + +#: plugins/actions.py:78 +#, python-format +msgid "Successfully deleted %(count)d %(items)s." +msgstr "" + +#: plugins/actions.py:110 views/delete.py:70 +#, python-format +msgid "Cannot delete %(name)s" +msgstr "" + +#: plugins/actions.py:112 views/delete.py:73 +msgid "Are you sure?" +msgstr "" + +#: plugins/actions.py:158 +#, python-format +msgid "%(total_count)s selected" +msgid_plural "All %(total_count)s selected" +msgstr[0] "" + +#: plugins/actions.py:162 +#, python-format +msgid "0 of %(cnt)s selected" +msgstr "" + +#: plugins/actions.py:179 plugins/actions.py:189 +msgid "" +"Items must be selected in order to perform actions on them. No items have " +"been changed." +msgstr "" + +#: plugins/aggregation.py:14 +msgid "Min" +msgstr "" + +#: plugins/aggregation.py:14 +msgid "Max" +msgstr "" + +#: plugins/aggregation.py:14 +msgid "Avg" +msgstr "" + +#: plugins/aggregation.py:14 +msgid "Sum" +msgstr "" + +#: plugins/aggregation.py:14 +msgid "Count" +msgstr "" + +#: plugins/auth.py:21 +#, python-format +msgid "Can add %s" +msgstr "" + +#: plugins/auth.py:22 +#, python-format +msgid "Can change %s" +msgstr "" + +#: plugins/auth.py:23 +#, python-format +msgid "Can edit %s" +msgstr "" + +#: plugins/auth.py:24 +#, python-format +msgid "Can delete %s" +msgstr "" + +#: plugins/auth.py:25 +#, python-format +msgid "Can view %s" +msgstr "" + +#: plugins/auth.py:87 +msgid "Personal info" +msgstr "" + +#: plugins/auth.py:91 +msgid "Permissions" +msgstr "" + +#: plugins/auth.py:94 +msgid "Important dates" +msgstr "" + +#: plugins/auth.py:99 +msgid "Status" +msgstr "" + +#: plugins/auth.py:111 +msgid "Permission Name" +msgstr "" + +#: plugins/auth.py:167 +msgid "Change Password" +msgstr "" + +#: plugins/auth.py:198 +#, python-format +msgid "Change password: %s" +msgstr "" + +#: plugins/auth.py:223 plugins/auth.py:255 +msgid "Password changed successfully." +msgstr "" + +#: plugins/auth.py:242 templates/xadmin/auth/user/change_password.html:11 +#: templates/xadmin/auth/user/change_password.html:22 +#: templates/xadmin/auth/user/change_password.html:55 +msgid "Change password" +msgstr "" + +#: plugins/batch.py:44 +msgid "Change this field" +msgstr "" + +#: plugins/batch.py:65 +#, python-format +msgid "Batch Change selected %(verbose_name_plural)s" +msgstr "" + +#: plugins/batch.py:89 +#, python-format +msgid "Successfully change %(count)d %(items)s." +msgstr "" + +#: plugins/batch.py:138 +#, python-format +msgid "Batch change %s" +msgstr "" + +#: plugins/bookmark.py:173 +msgid "bookmark" +msgstr "" + +#: plugins/bookmark.py:176 +msgid "Bookmark Widget, can show user's bookmark list data in widget." +msgstr "" + +#: plugins/chart.py:25 +msgid "Show models simple chart." +msgstr "" + +#: plugins/chart.py:51 +#, python-format +msgid "%s Charts" +msgstr "" + +#: plugins/comments.py:33 +msgid "Metadata" +msgstr "" + +#: plugins/comments.py:60 +msgid "flagged" +msgid_plural "flagged" +msgstr[0] "" + +#: plugins/comments.py:61 +msgid "Flag selected comments" +msgstr "" + +#: plugins/comments.py:66 +msgid "approved" +msgid_plural "approved" +msgstr[0] "" + +#: plugins/comments.py:67 +msgid "Approve selected comments" +msgstr "" + +#: plugins/comments.py:72 +msgid "removed" +msgid_plural "removed" +msgstr[0] "" + +#: plugins/comments.py:73 +msgid "Remove selected comments" +msgstr "" + +#: plugins/comments.py:86 +#, python-format +msgid "1 comment was successfully %(action)s." +msgid_plural "%(count)s comments were successfully %(action)s." +msgstr[0] "" + +#: plugins/details.py:52 views/list.py:578 +#, python-format +msgid "Details of %s" +msgstr "" + +#: plugins/editable.py:46 +#, python-format +msgid "Enter %s" +msgstr "" + +#: plugins/editable.py:73 views/dashboard.py:649 views/delete.py:27 +#: views/detail.py:145 views/edit.py:454 +#, python-format +msgid "%(name)s object with primary key %(key)r does not exist." +msgstr "" + +#: plugins/export.py:98 plugins/export.py:135 +msgid "Sheet" +msgstr "" + +#: plugins/filters.py:133 plugins/quickfilter.py:141 +#, python-format +msgid "Filtering error: %s" +msgstr "" + +#: plugins/images.py:29 +msgid "Previous" +msgstr "" + +#: plugins/images.py:29 +msgid "Next" +msgstr "" + +#: plugins/images.py:29 +msgid "Slideshow" +msgstr "" + +#: plugins/images.py:29 +msgid "Download" +msgstr "" + +#: plugins/images.py:50 +msgid "Change:" +msgstr "" + +#: plugins/layout.py:16 +msgid "Table" +msgstr "" + +#: plugins/layout.py:22 +msgid "Thumbnails" +msgstr "" + +#: plugins/passwords.py:64 +msgid "Forgotten your password or username?" +msgstr "" + +#: plugins/quickform.py:79 +#, python-format +msgid "Create New %s" +msgstr "" + +#: plugins/relate.py:104 +msgid "Related Objects" +msgstr "" + +#: plugins/relfield.py:29 plugins/topnav.py:38 +#, python-format +msgid "Search %s" +msgstr "" + +#: plugins/relfield.py:67 +#, python-format +msgid "Select %s" +msgstr "" + +#: plugins/themes.py:47 +msgid "Default" +msgstr "" + +#: plugins/themes.py:48 +msgid "Default bootstrap theme" +msgstr "" + +#: plugins/themes.py:49 +msgid "Bootstrap2" +msgstr "" + +#: plugins/themes.py:49 +msgid "Bootstrap 2.x theme" +msgstr "" + +#: plugins/topnav.py:62 views/dashboard.py:465 views/edit.py:387 +#: views/edit.py:396 +#, python-format +msgid "Add %s" +msgstr "" + +#: plugins/xversion.py:106 +msgid "Initial version." +msgstr "" + +#: plugins/xversion.py:108 +msgid "Change version." +msgstr "" + +#: plugins/xversion.py:110 +msgid "Revert version." +msgstr "" + +#: plugins/xversion.py:112 +msgid "Rercover version." +msgstr "" + +#: plugins/xversion.py:114 +#, python-format +msgid "Deleted %(verbose_name)s." +msgstr "" + +#: plugins/xversion.py:127 templates/xadmin/views/recover_form.html:26 +msgid "Recover" +msgstr "" + +#: plugins/xversion.py:143 templates/xadmin/views/model_history.html:11 +#: templates/xadmin/views/revision_diff.html:11 +#: templates/xadmin/views/revision_form.html:15 +msgid "History" +msgstr "" + +#: plugins/xversion.py:194 templates/xadmin/views/recover_form.html:14 +#: templates/xadmin/views/recover_list.html:10 +#, python-format +msgid "Recover deleted %(name)s" +msgstr "" + +#: plugins/xversion.py:238 +#, python-format +msgid "Change history: %s" +msgstr "" + +#: plugins/xversion.py:288 +msgid "Must select two versions." +msgstr "" + +#: plugins/xversion.py:296 +msgid "Please select two different versions." +msgstr "" + +#: plugins/xversion.py:383 plugins/xversion.py:500 +#, python-format +msgid "Current: %s" +msgstr "" + +#: plugins/xversion.py:424 +#, python-format +msgid "Revert %s" +msgstr "" + +#: plugins/xversion.py:440 +#, python-format +msgid "" +"The %(model)s \"%(name)s\" was reverted successfully. You may edit it again " +"below." +msgstr "" + +#: plugins/xversion.py:461 +#, python-format +msgid "Recover %s" +msgstr "" + +#: plugins/xversion.py:477 +#, python-format +msgid "" +"The %(model)s \"%(name)s\" was recovered successfully. You may edit it again " +"below." +msgstr "" + +#: templates/xadmin/404.html:4 templates/xadmin/404.html:8 +msgid "Page not found" +msgstr "" + +#: templates/xadmin/404.html:10 +msgid "We're sorry, but the requested page could not be found." +msgstr "" + +#: templates/xadmin/500.html:7 +#: templates/xadmin/auth/user/change_password.html:10 +#: templates/xadmin/auth/user/change_password.html:15 +#: templates/xadmin/base_site.html:53 +#: templates/xadmin/includes/sitemenu_default.html:7 +#: templates/xadmin/views/app_index.html:9 +#: templates/xadmin/views/batch_change_form.html:9 +#: templates/xadmin/views/invalid_setup.html:7 +#: templates/xadmin/views/model_dashboard.html:7 +#: templates/xadmin/views/model_delete_selected_confirm.html:8 +#: templates/xadmin/views/model_history.html:8 +#: templates/xadmin/views/recover_form.html:8 +#: templates/xadmin/views/recover_list.html:8 +#: templates/xadmin/views/revision_diff.html:8 +#: templates/xadmin/views/revision_form.html:8 views/base.py:473 +msgid "Home" +msgstr "" + +#: templates/xadmin/500.html:8 +msgid "Server error" +msgstr "" + +#: templates/xadmin/500.html:12 +msgid "Server error (500)" +msgstr "" + +#: templates/xadmin/500.html:15 +msgid "Server Error (500)" +msgstr "" + +#: templates/xadmin/500.html:16 +msgid "" +"There's been an error. It's been reported to the site administrators via e-" +"mail and should be fixed shortly. Thanks for your patience." +msgstr "" + +#: templates/xadmin/auth/password_reset/complete.html:11 +#: templates/xadmin/auth/password_reset/done.html:11 +msgid "Password reset successful" +msgstr "" + +#: templates/xadmin/auth/password_reset/complete.html:14 +msgid "Your password has been set. You may go ahead and log in now." +msgstr "" + +#: templates/xadmin/auth/password_reset/complete.html:15 +msgid "Log in" +msgstr "" + +#: templates/xadmin/auth/password_reset/confirm.html:12 +msgid "Enter new password" +msgstr "" + +#: templates/xadmin/auth/password_reset/confirm.html:17 +msgid "" +"Please enter your new password twice so we can verify you typed it in " +"correctly." +msgstr "" + +#: templates/xadmin/auth/password_reset/confirm.html:19 +msgid "Change my password" +msgstr "" + +#: templates/xadmin/auth/password_reset/confirm.html:24 +msgid "Password reset unsuccessful" +msgstr "" + +#: templates/xadmin/auth/password_reset/confirm.html:27 +msgid "" +"The password reset link was invalid, possibly because it has already been " +"used. Please request a new password reset." +msgstr "" + +#: templates/xadmin/auth/password_reset/done.html:14 +msgid "" +"We've e-mailed you instructions for setting your password to the e-mail " +"address you submitted. You should be receiving it shortly." +msgstr "" + +#: templates/xadmin/auth/password_reset/email.html:2 +#, python-format +msgid "" +"You're receiving this e-mail because you requested a password reset for your " +"user account at %(site_name)s." +msgstr "" + +#: templates/xadmin/auth/password_reset/email.html:4 +msgid "Please go to the following page and choose a new password:" +msgstr "" + +#: templates/xadmin/auth/password_reset/email.html:8 +msgid "Your username, in case you've forgotten:" +msgstr "" + +#: templates/xadmin/auth/password_reset/email.html:10 +msgid "Thanks for using our site!" +msgstr "" + +#: templates/xadmin/auth/password_reset/email.html:12 +#, python-format +msgid "The %(site_name)s team" +msgstr "" + +#: templates/xadmin/auth/password_reset/form.html:13 +msgid "Password reset" +msgstr "" + +#: templates/xadmin/auth/password_reset/form.html:17 +msgid "" +"Forgotten your password? Enter your e-mail address below, and we'll e-mail " +"instructions for setting a new one." +msgstr "" + +#: templates/xadmin/auth/password_reset/form.html:25 +msgid "E-mail address:" +msgstr "" + +#: templates/xadmin/auth/password_reset/form.html:33 +msgid "Reset my password" +msgstr "" + +#: templates/xadmin/auth/user/add_form.html:6 +msgid "" +"First, enter a username and password. Then, you'll be able to edit more user " +"options." +msgstr "" + +#: templates/xadmin/auth/user/add_form.html:8 +msgid "Enter a username and password." +msgstr "" + +#: templates/xadmin/auth/user/change_password.html:31 +#: templates/xadmin/views/batch_change_form.html:24 +#: templates/xadmin/views/form.html:18 +#: templates/xadmin/views/model_form.html:20 +msgid "Please correct the error below." +msgid_plural "Please correct the errors below." +msgstr[0] "" + +#: templates/xadmin/auth/user/change_password.html:38 +msgid "Enter your new password." +msgstr "" + +#: templates/xadmin/auth/user/change_password.html:40 +#, python-format +msgid "Enter a new password for the user %(username)s." +msgstr "" + +#: templates/xadmin/base_site.html:18 +msgid "Welcome," +msgstr "" + +#: templates/xadmin/base_site.html:24 +msgid "Log out" +msgstr "" + +#: templates/xadmin/base_site.html:36 +msgid "You don't have permission to edit anything." +msgstr "" + +#: templates/xadmin/blocks/comm.top.theme.html:4 +msgid "Themes" +msgstr "" + +#: templates/xadmin/blocks/comm.top.topnav.html:9 +#: templates/xadmin/blocks/model_list.nav_form.search_form.html:8 +#: templates/xadmin/filters/char.html:7 +#: templates/xadmin/filters/fk_search.html:7 +#: templates/xadmin/filters/fk_search.html:16 +#: templates/xadmin/filters/number.html:7 +msgid "Search" +msgstr "" + +#: templates/xadmin/blocks/comm.top.topnav.html:23 +msgid "Add" +msgstr "" + +#: templates/xadmin/blocks/model_form.submit_line.wizard.html:9 +#: templates/xadmin/blocks/model_form.submit_line.wizard.html:26 +msgid "Prev step" +msgstr "" + +#: templates/xadmin/blocks/model_form.submit_line.wizard.html:13 +#: templates/xadmin/blocks/model_form.submit_line.wizard.html:29 +msgid "Next step" +msgstr "" + +#: templates/xadmin/blocks/model_form.submit_line.wizard.html:15 +#: templates/xadmin/blocks/model_form.submit_line.wizard.html:31 +#: templates/xadmin/includes/submit_line.html:10 +#: templates/xadmin/includes/submit_line.html:13 +#: templates/xadmin/views/form.html:30 templates/xadmin/views/form.html:31 +msgid "Save" +msgstr "" + +#: templates/xadmin/blocks/model_list.nav_menu.bookmarks.html:7 +msgid "Clean Bookmarks" +msgstr "" + +#: templates/xadmin/blocks/model_list.nav_menu.bookmarks.html:18 +msgid "No Bookmarks" +msgstr "" + +#: templates/xadmin/blocks/model_list.nav_menu.bookmarks.html:22 +msgid "New Bookmark" +msgstr "" + +#: templates/xadmin/blocks/model_list.nav_menu.bookmarks.html:26 +msgid "Save current page as Bookmark" +msgstr "" + +#: templates/xadmin/blocks/model_list.nav_menu.bookmarks.html:32 +msgid "Enter bookmark title" +msgstr "" + +#: templates/xadmin/blocks/model_list.nav_menu.bookmarks.html:33 +msgid "Waiting" +msgstr "" + +#: templates/xadmin/blocks/model_list.nav_menu.bookmarks.html:33 +msgid "Save Bookmark" +msgstr "" + +#: templates/xadmin/blocks/model_list.nav_menu.filters.html:4 +msgid "Filters" +msgstr "" + +#: templates/xadmin/blocks/model_list.nav_menu.filters.html:8 +msgid "Clean Filters" +msgstr "" + +#: templates/xadmin/blocks/model_list.results_bottom.actions.html:19 +msgid "Click here to select the objects across all pages" +msgstr "" + +#: templates/xadmin/blocks/model_list.results_bottom.actions.html:19 +#, python-format +msgid "Select all %(total_count)s %(model_name)s" +msgstr "" + +#: templates/xadmin/blocks/model_list.results_bottom.actions.html:20 +msgid "Clear selection" +msgstr "" + +#: templates/xadmin/blocks/model_list.results_top.charts.html:4 +msgid "Charts" +msgstr "" + +#: templates/xadmin/blocks/model_list.top_toolbar.exports.html:4 +#: templates/xadmin/blocks/model_list.top_toolbar.exports.html:8 +#: templates/xadmin/blocks/model_list.top_toolbar.exports.html:19 +#: templates/xadmin/blocks/model_list.top_toolbar.exports.html:47 +msgid "Export" +msgstr "" + +#: templates/xadmin/blocks/model_list.top_toolbar.exports.html:26 +#: templates/xadmin/blocks/model_list.top_toolbar.exports.html:29 +#: templates/xadmin/blocks/model_list.top_toolbar.exports.html:32 +msgid "Export with table header." +msgstr "" + +#: templates/xadmin/blocks/model_list.top_toolbar.exports.html:35 +#: templates/xadmin/blocks/model_list.top_toolbar.exports.html:38 +msgid "Export with format." +msgstr "" + +#: templates/xadmin/blocks/model_list.top_toolbar.exports.html:42 +msgid "Export all data." +msgstr "" + +#: templates/xadmin/blocks/model_list.top_toolbar.exports.html:46 +#: templates/xadmin/widgets/base.html:41 +msgid "Close" +msgstr "" + +#: templates/xadmin/blocks/model_list.top_toolbar.layouts.html:4 +msgid "Layout" +msgstr "" + +#: templates/xadmin/blocks/model_list.top_toolbar.refresh.html:8 +msgid "Clean Refresh" +msgstr "" + +#: templates/xadmin/blocks/model_list.top_toolbar.refresh.html:14 +#, python-format +msgid "Every %(t)s seconds" +msgstr "" + +#: templates/xadmin/blocks/model_list.top_toolbar.saveorder.html:4 +msgid "Save Order" +msgstr "" + +#: templates/xadmin/edit_inline/blank.html:5 views/detail.py:23 +#: views/edit.py:102 views/list.py:29 +msgid "Null" +msgstr "" + +#: templates/xadmin/filters/char.html:13 +msgid "Enter" +msgstr "" + +#: templates/xadmin/filters/date.html:10 templates/xadmin/filters/date.html:13 +msgid "Choice Date" +msgstr "" + +#: templates/xadmin/filters/date.html:18 +msgid "YY" +msgstr "" + +#: templates/xadmin/filters/date.html:19 +msgid "year" +msgstr "" + +#: templates/xadmin/filters/date.html:22 +msgid "MM" +msgstr "" + +#: templates/xadmin/filters/date.html:23 +msgid "month" +msgstr "" + +#: templates/xadmin/filters/date.html:26 +msgid "DD" +msgstr "" + +#: templates/xadmin/filters/date.html:27 +msgid "day" +msgstr "" + +#: templates/xadmin/filters/date.html:29 templates/xadmin/filters/date.html:46 +#: templates/xadmin/filters/date.html:54 +#: templates/xadmin/filters/fk_search.html:24 +#: templates/xadmin/filters/number.html:37 +msgid "Apply" +msgstr "" + +#: templates/xadmin/filters/date.html:34 +msgid "Date Range" +msgstr "" + +#: templates/xadmin/filters/date.html:41 +msgid "Select Date" +msgstr "" + +#: templates/xadmin/filters/date.html:42 +msgid "From" +msgstr "" + +#: templates/xadmin/filters/date.html:44 +msgid "To" +msgstr "" + +#: templates/xadmin/filters/fk_search.html:14 +msgid "Select" +msgstr "" + +#: templates/xadmin/filters/fk_search.html:26 +#: templates/xadmin/filters/number.html:39 +msgid "Clean" +msgstr "" + +#: templates/xadmin/filters/number.html:17 +#: templates/xadmin/filters/number.html:25 +#: templates/xadmin/filters/number.html:33 +msgid "Enter Number" +msgstr "" + +#: templates/xadmin/filters/rel.html:3 +#, python-format +msgid " By %(filter_title)s " +msgstr "" + +#: templates/xadmin/forms/transfer.html:4 +msgid "Available" +msgstr "" + +#: templates/xadmin/forms/transfer.html:12 +msgid "Click to choose all at once." +msgstr "" + +#: templates/xadmin/forms/transfer.html:12 +msgid "Choose all" +msgstr "" + +#: templates/xadmin/forms/transfer.html:16 +msgid "Choose" +msgstr "" + +#: templates/xadmin/forms/transfer.html:19 +#: templates/xadmin/widgets/base.html:40 +msgid "Remove" +msgstr "" + +#: templates/xadmin/forms/transfer.html:23 +msgid "Chosen" +msgstr "" + +#: templates/xadmin/forms/transfer.html:27 +msgid "Click to remove all chosen at once." +msgstr "" + +#: templates/xadmin/forms/transfer.html:27 +msgid "Remove all" +msgstr "" + +#: templates/xadmin/includes/pagination.html:9 +msgid "Show all" +msgstr "" + +#: templates/xadmin/includes/submit_line.html:10 +#: templates/xadmin/includes/submit_line.html:13 +#: templates/xadmin/views/form.html:30 templates/xadmin/views/form.html:31 +msgid "Saving.." +msgstr "" + +#: templates/xadmin/includes/submit_line.html:17 +msgid "Save as new" +msgstr "" + +#: templates/xadmin/includes/submit_line.html:18 +msgid "Save and add another" +msgstr "" + +#: templates/xadmin/includes/submit_line.html:19 +msgid "Save and continue editing" +msgstr "" + +#: templates/xadmin/includes/submit_line.html:24 +#: templates/xadmin/views/model_detail.html:28 views/delete.py:93 +msgid "Delete" +msgstr "" + +#: templates/xadmin/views/app_index.html:13 +#, python-format +msgid "%(name)s" +msgstr "" + +#: templates/xadmin/views/batch_change_form.html:11 +msgid "Change multiple objects" +msgstr "" + +#: templates/xadmin/views/batch_change_form.html:16 +#, python-format +msgid "Change one %(objects_name)s" +msgid_plural "Batch change %(counter)s %(objects_name)s" +msgstr[0] "" + +#: templates/xadmin/views/batch_change_form.html:38 +msgid "Change Multiple" +msgstr "" + +#: templates/xadmin/views/dashboard.html:15 +#: templates/xadmin/views/dashboard.html:22 +#: templates/xadmin/views/dashboard.html:23 +msgid "Add Widget" +msgstr "" + +#: templates/xadmin/views/invalid_setup.html:13 +msgid "" +"Something's wrong with your database installation. Make sure the appropriate " +"database tables have been created, and make sure the database is readable by " +"the appropriate user." +msgstr "" + +#: templates/xadmin/views/logged_out.html:16 +msgid "Logout Success" +msgstr "" + +#: templates/xadmin/views/logged_out.html:17 +msgid "Thanks for spending some quality time with the Web site today." +msgstr "" + +#: templates/xadmin/views/logged_out.html:19 +msgid "Close Window" +msgstr "" + +#: templates/xadmin/views/logged_out.html:20 +msgid "Log in again" +msgstr "" + +#: templates/xadmin/views/login.html:39 views/website.py:38 +msgid "Please Login" +msgstr "" + +#: templates/xadmin/views/login.html:52 +msgid "Username" +msgstr "" + +#: templates/xadmin/views/login.html:64 +msgid "Password" +msgstr "" + +#: templates/xadmin/views/login.html:75 +msgid "log in" +msgstr "" + +#: templates/xadmin/views/model_dashboard.html:26 +#: templates/xadmin/views/model_detail.html:25 +msgid "Edit" +msgstr "" + +#: templates/xadmin/views/model_delete_confirm.html:11 +#, python-format +msgid "" +"Deleting the %(verbose_name)s '%(escaped_object)s' would result in deleting " +"related objects, but your account doesn't have permission to delete the " +"following types of objects:" +msgstr "" + +#: templates/xadmin/views/model_delete_confirm.html:19 +#, python-format +msgid "" +"Deleting the %(verbose_name)s '%(escaped_object)s' would require deleting " +"the following protected related objects:" +msgstr "" + +#: templates/xadmin/views/model_delete_confirm.html:27 +#, python-format +msgid "" +"Are you sure you want to delete the %(verbose_name)s \"%(escaped_object)s\"? " +"All of the following related items will be deleted:" +msgstr "" + +#: templates/xadmin/views/model_delete_confirm.html:34 +#: templates/xadmin/views/model_delete_selected_confirm.html:49 +msgid "Yes, I'm sure" +msgstr "" + +#: templates/xadmin/views/model_delete_confirm.html:35 +#: templates/xadmin/views/model_delete_selected_confirm.html:50 +msgid "Cancel" +msgstr "" + +#: templates/xadmin/views/model_delete_selected_confirm.html:10 +msgid "Delete multiple objects" +msgstr "" + +#: templates/xadmin/views/model_delete_selected_confirm.html:18 +#, python-format +msgid "" +"Deleting the selected %(objects_name)s would result in deleting related " +"objects, but your account doesn't have permission to delete the following " +"types of objects:" +msgstr "" + +#: templates/xadmin/views/model_delete_selected_confirm.html:26 +#, python-format +msgid "" +"Deleting the selected %(objects_name)s would require deleting the following " +"protected related objects:" +msgstr "" + +#: templates/xadmin/views/model_delete_selected_confirm.html:34 +#, python-format +msgid "" +"Are you sure you want to delete the selected %(objects_name)s? All of the " +"following objects and their related items will be deleted:" +msgstr "" + +#: templates/xadmin/views/model_history.html:26 +msgid "Diff" +msgstr "" + +#: templates/xadmin/views/model_history.html:27 +#: templates/xadmin/views/recover_list.html:25 +msgid "Date/time" +msgstr "" + +#: templates/xadmin/views/model_history.html:28 +msgid "User" +msgstr "" + +#: templates/xadmin/views/model_history.html:29 +msgid "Comment" +msgstr "" + +#: templates/xadmin/views/model_history.html:54 +msgid "Diff Select Versions" +msgstr "" + +#: templates/xadmin/views/model_history.html:58 +msgid "" +"This object doesn't have a change history. It probably wasn't added via this " +"admin site." +msgstr "" + +#: templates/xadmin/views/model_list.html:29 +#, python-format +msgid "Add %(name)s" +msgstr "" + +#: templates/xadmin/views/model_list.html:39 +msgid "Columns" +msgstr "" + +#: templates/xadmin/views/model_list.html:42 +msgid "Restore Selected" +msgstr "" + +#: templates/xadmin/views/model_list.html:147 +#: templates/xadmin/widgets/list.html:33 +msgid "Empty list" +msgstr "" + +#: templates/xadmin/views/recover_form.html:20 +msgid "Press the recover button below to recover this version of the object." +msgstr "" + +#: templates/xadmin/views/recover_list.html:19 +msgid "" +"Choose a date from the list below to recover a deleted version of an object." +msgstr "" + +#: templates/xadmin/views/recover_list.html:39 +msgid "There are no deleted objects to recover." +msgstr "" + +#: templates/xadmin/views/revision_diff.html:12 +#: templates/xadmin/views/revision_diff.html:17 +#, python-format +msgid "Diff %(verbose_name)s" +msgstr "" + +#: templates/xadmin/views/revision_diff.html:25 +msgid "Field" +msgstr "" + +#: templates/xadmin/views/revision_diff.html:26 +msgid "Version A" +msgstr "" + +#: templates/xadmin/views/revision_diff.html:27 +msgid "Version B" +msgstr "" + +#: templates/xadmin/views/revision_diff.html:39 +msgid "Revert to" +msgstr "" + +#: templates/xadmin/views/revision_diff.html:40 +#: templates/xadmin/views/revision_diff.html:41 +msgid "Revert" +msgstr "" + +#: templates/xadmin/views/revision_form.html:16 +#, python-format +msgid "Revert %(verbose_name)s" +msgstr "" + +#: templates/xadmin/views/revision_form.html:21 +msgid "Press the revert button below to revert to this version of the object." +msgstr "" + +#: templates/xadmin/views/revision_form.html:27 +msgid "Revert this revision" +msgstr "" + +#: templates/xadmin/widgets/addform.html:14 +msgid "Success" +msgstr "" + +#: templates/xadmin/widgets/addform.html:14 +msgid "Add success, click edit to edit." +msgstr "" + +#: templates/xadmin/widgets/addform.html:17 +msgid "Quick Add" +msgstr "" + +#: templates/xadmin/widgets/base.html:31 +msgid "Widget Options" +msgstr "" + +#: templates/xadmin/widgets/base.html:42 +msgid "Save changes" +msgstr "" + +#: views/base.py:315 +msgid "Django Xadmin" +msgstr "" + +#: views/base.py:316 +msgid "my-company.inc" +msgstr "" + +#: views/dashboard.py:186 +msgid "Widget ID" +msgstr "" + +#: views/dashboard.py:187 +msgid "Widget Title" +msgstr "" + +#: views/dashboard.py:252 +msgid "Html Content Widget, can write any html content in widget." +msgstr "" + +#: views/dashboard.py:255 +msgid "Html Content" +msgstr "" + +#: views/dashboard.py:318 +msgid "Target Model" +msgstr "" + +#: views/dashboard.py:369 +msgid "Quick button Widget, quickly open any page." +msgstr "" + +#: views/dashboard.py:371 +msgid "Quick Buttons" +msgstr "" + +#: views/dashboard.py:416 +msgid "Any Objects list Widget." +msgstr "" + +#: views/dashboard.py:456 +msgid "Add any model object Widget." +msgstr "" + +#: views/dashboard.py:492 +msgid "Dashboard" +msgstr "" + +#: views/dashboard.py:633 +#, python-format +msgid "%s Dashboard" +msgstr "" + +#: views/delete.py:103 +#, python-format +msgid "The %(name)s \"%(obj)s\" was deleted successfully." +msgstr "" + +#: views/detail.py:173 views/edit.py:211 views/form.py:72 +msgid "Other Fields" +msgstr "" + +#: views/detail.py:235 +#, python-format +msgid "%s Detail" +msgstr "" + +#: views/edit.py:253 +msgid "Added." +msgstr "" + +#: views/edit.py:255 +#, python-format +msgid "Changed %s." +msgstr "" + +#: views/edit.py:255 +msgid "and" +msgstr "" + +#: views/edit.py:258 +msgid "No fields changed." +msgstr "" + +#: views/edit.py:420 +#, python-format +msgid "The %(name)s \"%(obj)s\" was added successfully." +msgstr "" + +#: views/edit.py:425 views/edit.py:520 +msgid "You may edit it again below." +msgstr "" + +#: views/edit.py:429 views/edit.py:523 +#, python-format +msgid "You may add another %s below." +msgstr "" + +#: views/edit.py:471 +#, python-format +msgid "Change %s" +msgstr "" + +#: views/edit.py:516 +#, python-format +msgid "The %(name)s \"%(obj)s\" was changed successfully." +msgstr "" + +#: views/form.py:165 +#, python-format +msgid "The %s was changed successfully." +msgstr "" + +#: views/list.py:199 +msgid "Database error" +msgstr "" + +#: views/list.py:373 +#, python-format +msgid "%s List" +msgstr "" + +#: views/list.py:499 +msgid "Sort ASC" +msgstr "" + +#: views/list.py:500 +msgid "Sort DESC" +msgstr "" + +#: views/list.py:504 +msgid "Cancel Sort" +msgstr "" + +#: views/website.py:16 +msgid "Main Dashboard" +msgstr "" + +#: widgets.py:48 +msgid "Now" +msgstr "" diff --git "a/8\343\200\201\346\226\207\347\214\256\346\225\260\346\215\256\346\214\226\346\216\230\347\263\273\347\273\237(\351\231\204\346\272\220\347\240\201)/extra_apps/xadmin/locale/id_ID/LC_MESSAGES/djangojs.mo" "b/8\343\200\201\346\226\207\347\214\256\346\225\260\346\215\256\346\214\226\346\216\230\347\263\273\347\273\237(\351\231\204\346\272\220\347\240\201)/extra_apps/xadmin/locale/id_ID/LC_MESSAGES/djangojs.mo" new file mode 100644 index 0000000..225de83 Binary files /dev/null and "b/8\343\200\201\346\226\207\347\214\256\346\225\260\346\215\256\346\214\226\346\216\230\347\263\273\347\273\237(\351\231\204\346\272\220\347\240\201)/extra_apps/xadmin/locale/id_ID/LC_MESSAGES/djangojs.mo" differ diff --git "a/8\343\200\201\346\226\207\347\214\256\346\225\260\346\215\256\346\214\226\346\216\230\347\263\273\347\273\237(\351\231\204\346\272\220\347\240\201)/extra_apps/xadmin/locale/id_ID/LC_MESSAGES/djangojs.po" "b/8\343\200\201\346\226\207\347\214\256\346\225\260\346\215\256\346\214\226\346\216\230\347\263\273\347\273\237(\351\231\204\346\272\220\347\240\201)/extra_apps/xadmin/locale/id_ID/LC_MESSAGES/djangojs.po" new file mode 100644 index 0000000..9136f01 --- /dev/null +++ "b/8\343\200\201\346\226\207\347\214\256\346\225\260\346\215\256\346\214\226\346\216\230\347\263\273\347\273\237(\351\231\204\346\272\220\347\240\201)/extra_apps/xadmin/locale/id_ID/LC_MESSAGES/djangojs.po" @@ -0,0 +1,69 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER +# This file is distributed under the same license as the PACKAGE package. +# +# Translators: +msgid "" +msgstr "" +"Project-Id-Version: xadmin-core\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2013-04-30 23:11+0800\n" +"PO-Revision-Date: 2013-11-20 12:41+0000\n" +"Last-Translator: sshwsfc \n" +"Language-Team: Indonesian (Indonesia) (http://www.transifex.com/projects/p/xadmin/language/id_ID/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: id_ID\n" +"Plural-Forms: nplurals=1; plural=0;\n" + +#: static/xadmin/js/xadmin.plugin.actions.js:20 +msgid "%(sel)s of %(cnt)s selected" +msgid_plural "%(sel)s of %(cnt)s selected" +msgstr[0] "" + +#: static/xadmin/js/xadmin.plugin.revision.js:25 +msgid "New Item" +msgstr "" + +#: static/xadmin/js/xadmin.widget.datetime.js:32 +msgid "Sunday Monday Tuesday Wednesday Thursday Friday Saturday Sunday" +msgstr "" + +#: static/xadmin/js/xadmin.widget.datetime.js:33 +msgid "Sun Mon Tue Wed Thu Fri Sat Sun" +msgstr "" + +#: static/xadmin/js/xadmin.widget.datetime.js:34 +msgid "Su Mo Tu We Th Fr Sa Su" +msgstr "" + +#: static/xadmin/js/xadmin.widget.datetime.js:35 +msgid "" +"January February March April May June July August September October November" +" December" +msgstr "" + +#: static/xadmin/js/xadmin.widget.datetime.js:36 +msgid "Jan Feb Mar Apr May Jun Jul Aug Sep Oct Nov Dec" +msgstr "" + +#: static/xadmin/js/xadmin.widget.datetime.js:37 +msgid "Today" +msgstr "" + +#: static/xadmin/js/xadmin.widget.datetime.js:38 +msgid "%a %d %b %Y %T %Z" +msgstr "" + +#: static/xadmin/js/xadmin.widget.datetime.js:39 +msgid "AM PM" +msgstr "" + +#: static/xadmin/js/xadmin.widget.datetime.js:40 +msgid "am pm" +msgstr "" + +#: static/xadmin/js/xadmin.widget.datetime.js:43 +msgid "%T" +msgstr "" diff --git "a/8\343\200\201\346\226\207\347\214\256\346\225\260\346\215\256\346\214\226\346\216\230\347\263\273\347\273\237(\351\231\204\346\272\220\347\240\201)/extra_apps/xadmin/locale/ja/LC_MESSAGES/django.mo" "b/8\343\200\201\346\226\207\347\214\256\346\225\260\346\215\256\346\214\226\346\216\230\347\263\273\347\273\237(\351\231\204\346\272\220\347\240\201)/extra_apps/xadmin/locale/ja/LC_MESSAGES/django.mo" new file mode 100644 index 0000000..42bffc0 Binary files /dev/null and "b/8\343\200\201\346\226\207\347\214\256\346\225\260\346\215\256\346\214\226\346\216\230\347\263\273\347\273\237(\351\231\204\346\272\220\347\240\201)/extra_apps/xadmin/locale/ja/LC_MESSAGES/django.mo" differ diff --git "a/8\343\200\201\346\226\207\347\214\256\346\225\260\346\215\256\346\214\226\346\216\230\347\263\273\347\273\237(\351\231\204\346\272\220\347\240\201)/extra_apps/xadmin/locale/ja/LC_MESSAGES/django.po" "b/8\343\200\201\346\226\207\347\214\256\346\225\260\346\215\256\346\214\226\346\216\230\347\263\273\347\273\237(\351\231\204\346\272\220\347\240\201)/extra_apps/xadmin/locale/ja/LC_MESSAGES/django.po" new file mode 100644 index 0000000..1d716b0 --- /dev/null +++ "b/8\343\200\201\346\226\207\347\214\256\346\225\260\346\215\256\346\214\226\346\216\230\347\263\273\347\273\237(\351\231\204\346\272\220\347\240\201)/extra_apps/xadmin/locale/ja/LC_MESSAGES/django.po" @@ -0,0 +1,1403 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER +# This file is distributed under the same license as the PACKAGE package. +# +# Translators: +msgid "" +msgstr "" +"Project-Id-Version: xadmin-core\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2016-07-20 13:28+0800\n" +"PO-Revision-Date: 2013-11-20 10:21+0000\n" +"Last-Translator: sshwsfc \n" +"Language-Team: Japanese (http://www.transifex.com/projects/p/xadmin/language/" +"ja/)\n" +"Language: ja\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=1; plural=0;\n" + +#: adminx.py:19 +msgid "Admin Object" +msgstr "" + +#: apps.py:11 +msgid "Administration" +msgstr "" + +#: filters.py:159 filters.py:191 filters.py:407 filters.py:493 filters.py:531 +msgid "All" +msgstr "" + +#: filters.py:160 plugins/export.py:165 +msgid "Yes" +msgstr "" + +#: filters.py:161 plugins/export.py:165 +msgid "No" +msgstr "" + +#: filters.py:175 +msgid "Unknown" +msgstr "" + +#: filters.py:267 +msgid "Any date" +msgstr "" + +#: filters.py:268 +msgid "Has date" +msgstr "" + +#: filters.py:271 +msgid "Has no date" +msgstr "" + +#: filters.py:274 widgets.py:30 +msgid "Today" +msgstr "" + +#: filters.py:278 +msgid "Past 7 days" +msgstr "" + +#: filters.py:282 +msgid "This month" +msgstr "" + +#: filters.py:286 +msgid "This year" +msgstr "" + +#: forms.py:10 +msgid "" +"Please enter the correct username and password for a staff account. Note " +"that both fields are case-sensitive." +msgstr "" + +#: forms.py:21 +msgid "Please log in again, because your session has expired." +msgstr "" + +#: forms.py:41 +#, python-format +msgid "Your e-mail address is not your username. Try '%s' instead." +msgstr "" + +#: models.py:48 +msgid "Title" +msgstr "" + +#: models.py:49 models.py:88 models.py:107 models.py:149 +msgid "user" +msgstr "" + +#: models.py:50 +msgid "Url Name" +msgstr "" + +#: models.py:52 +msgid "Query String" +msgstr "" + +#: models.py:53 +msgid "Is Shared" +msgstr "" + +#: models.py:66 plugins/bookmark.py:50 plugins/bookmark.py:180 +msgid "Bookmark" +msgstr "" + +#: models.py:67 +msgid "Bookmarks" +msgstr "" + +#: models.py:89 +msgid "Settings Key" +msgstr "" + +#: models.py:90 +msgid "Settings Content" +msgstr "" + +#: models.py:102 +msgid "User Setting" +msgstr "" + +#: models.py:103 +msgid "User Settings" +msgstr "" + +#: models.py:108 +msgid "Page" +msgstr "" + +#: models.py:109 views/dashboard.py:82 views/dashboard.py:92 +msgid "Widget Type" +msgstr "" + +#: models.py:110 views/dashboard.py:83 +msgid "Widget Params" +msgstr "" + +#: models.py:137 +msgid "User Widget" +msgstr "" + +#: models.py:138 +msgid "User Widgets" +msgstr "" + +#: models.py:142 +msgid "action time" +msgstr "" + +#: models.py:151 +msgid "action ip" +msgstr "" + +#: models.py:155 +msgid "content type" +msgstr "" + +#: models.py:158 +msgid "object id" +msgstr "" + +#: models.py:159 +msgid "object repr" +msgstr "" + +#: models.py:160 +msgid "action flag" +msgstr "" + +#: models.py:161 +msgid "change message" +msgstr "" + +#: models.py:164 +msgid "log entry" +msgstr "" + +#: models.py:165 +msgid "log entries" +msgstr "" + +#: models.py:173 +#, python-format +msgid "Added \"%(object)s\"." +msgstr "" + +#: models.py:175 +#, python-format +msgid "Changed \"%(object)s\" - %(changes)s" +msgstr "" + +#: models.py:180 +#, python-format +msgid "Deleted \"%(object)s.\"" +msgstr "" + +#: plugins/actions.py:57 +#, python-format +msgid "Delete selected %(verbose_name_plural)s" +msgstr "" + +#: plugins/actions.py:72 +#, python-format +msgid "Batch delete %(count)d %(items)s." +msgstr "" + +#: plugins/actions.py:78 +#, python-format +msgid "Successfully deleted %(count)d %(items)s." +msgstr "" + +#: plugins/actions.py:110 views/delete.py:70 +#, python-format +msgid "Cannot delete %(name)s" +msgstr "" + +#: plugins/actions.py:112 views/delete.py:73 +msgid "Are you sure?" +msgstr "" + +#: plugins/actions.py:158 +#, python-format +msgid "%(total_count)s selected" +msgid_plural "All %(total_count)s selected" +msgstr[0] "" + +#: plugins/actions.py:162 +#, python-format +msgid "0 of %(cnt)s selected" +msgstr "" + +#: plugins/actions.py:179 plugins/actions.py:189 +msgid "" +"Items must be selected in order to perform actions on them. No items have " +"been changed." +msgstr "" + +#: plugins/aggregation.py:14 +msgid "Min" +msgstr "" + +#: plugins/aggregation.py:14 +msgid "Max" +msgstr "" + +#: plugins/aggregation.py:14 +msgid "Avg" +msgstr "" + +#: plugins/aggregation.py:14 +msgid "Sum" +msgstr "" + +#: plugins/aggregation.py:14 +msgid "Count" +msgstr "" + +#: plugins/auth.py:21 +#, python-format +msgid "Can add %s" +msgstr "" + +#: plugins/auth.py:22 +#, python-format +msgid "Can change %s" +msgstr "" + +#: plugins/auth.py:23 +#, python-format +msgid "Can edit %s" +msgstr "" + +#: plugins/auth.py:24 +#, python-format +msgid "Can delete %s" +msgstr "" + +#: plugins/auth.py:25 +#, python-format +msgid "Can view %s" +msgstr "" + +#: plugins/auth.py:87 +msgid "Personal info" +msgstr "" + +#: plugins/auth.py:91 +msgid "Permissions" +msgstr "" + +#: plugins/auth.py:94 +msgid "Important dates" +msgstr "" + +#: plugins/auth.py:99 +msgid "Status" +msgstr "" + +#: plugins/auth.py:111 +msgid "Permission Name" +msgstr "" + +#: plugins/auth.py:167 +msgid "Change Password" +msgstr "" + +#: plugins/auth.py:198 +#, python-format +msgid "Change password: %s" +msgstr "" + +#: plugins/auth.py:223 plugins/auth.py:255 +msgid "Password changed successfully." +msgstr "" + +#: plugins/auth.py:242 templates/xadmin/auth/user/change_password.html:11 +#: templates/xadmin/auth/user/change_password.html:22 +#: templates/xadmin/auth/user/change_password.html:55 +msgid "Change password" +msgstr "" + +#: plugins/batch.py:44 +msgid "Change this field" +msgstr "" + +#: plugins/batch.py:65 +#, python-format +msgid "Batch Change selected %(verbose_name_plural)s" +msgstr "" + +#: plugins/batch.py:89 +#, python-format +msgid "Successfully change %(count)d %(items)s." +msgstr "" + +#: plugins/batch.py:138 +#, python-format +msgid "Batch change %s" +msgstr "" + +#: plugins/bookmark.py:173 +msgid "bookmark" +msgstr "" + +#: plugins/bookmark.py:176 +msgid "Bookmark Widget, can show user's bookmark list data in widget." +msgstr "" + +#: plugins/chart.py:25 +msgid "Show models simple chart." +msgstr "" + +#: plugins/chart.py:51 +#, python-format +msgid "%s Charts" +msgstr "" + +#: plugins/comments.py:33 +msgid "Metadata" +msgstr "" + +#: plugins/comments.py:60 +msgid "flagged" +msgid_plural "flagged" +msgstr[0] "" + +#: plugins/comments.py:61 +msgid "Flag selected comments" +msgstr "" + +#: plugins/comments.py:66 +msgid "approved" +msgid_plural "approved" +msgstr[0] "" + +#: plugins/comments.py:67 +msgid "Approve selected comments" +msgstr "" + +#: plugins/comments.py:72 +msgid "removed" +msgid_plural "removed" +msgstr[0] "" + +#: plugins/comments.py:73 +msgid "Remove selected comments" +msgstr "" + +#: plugins/comments.py:86 +#, python-format +msgid "1 comment was successfully %(action)s." +msgid_plural "%(count)s comments were successfully %(action)s." +msgstr[0] "" + +#: plugins/details.py:52 views/list.py:578 +#, python-format +msgid "Details of %s" +msgstr "" + +#: plugins/editable.py:46 +#, python-format +msgid "Enter %s" +msgstr "" + +#: plugins/editable.py:73 views/dashboard.py:649 views/delete.py:27 +#: views/detail.py:145 views/edit.py:454 +#, python-format +msgid "%(name)s object with primary key %(key)r does not exist." +msgstr "" + +#: plugins/export.py:98 plugins/export.py:135 +msgid "Sheet" +msgstr "" + +#: plugins/filters.py:133 plugins/quickfilter.py:141 +#, python-format +msgid "Filtering error: %s" +msgstr "" + +#: plugins/images.py:29 +msgid "Previous" +msgstr "" + +#: plugins/images.py:29 +msgid "Next" +msgstr "" + +#: plugins/images.py:29 +msgid "Slideshow" +msgstr "" + +#: plugins/images.py:29 +msgid "Download" +msgstr "" + +#: plugins/images.py:50 +msgid "Change:" +msgstr "" + +#: plugins/layout.py:16 +msgid "Table" +msgstr "" + +#: plugins/layout.py:22 +msgid "Thumbnails" +msgstr "" + +#: plugins/passwords.py:64 +msgid "Forgotten your password or username?" +msgstr "" + +#: plugins/quickform.py:79 +#, python-format +msgid "Create New %s" +msgstr "" + +#: plugins/relate.py:104 +msgid "Related Objects" +msgstr "" + +#: plugins/relfield.py:29 plugins/topnav.py:38 +#, python-format +msgid "Search %s" +msgstr "" + +#: plugins/relfield.py:67 +#, python-format +msgid "Select %s" +msgstr "" + +#: plugins/themes.py:47 +msgid "Default" +msgstr "" + +#: plugins/themes.py:48 +msgid "Default bootstrap theme" +msgstr "" + +#: plugins/themes.py:49 +msgid "Bootstrap2" +msgstr "" + +#: plugins/themes.py:49 +msgid "Bootstrap 2.x theme" +msgstr "" + +#: plugins/topnav.py:62 views/dashboard.py:465 views/edit.py:387 +#: views/edit.py:396 +#, python-format +msgid "Add %s" +msgstr "" + +#: plugins/xversion.py:106 +msgid "Initial version." +msgstr "" + +#: plugins/xversion.py:108 +msgid "Change version." +msgstr "" + +#: plugins/xversion.py:110 +msgid "Revert version." +msgstr "" + +#: plugins/xversion.py:112 +msgid "Rercover version." +msgstr "" + +#: plugins/xversion.py:114 +#, python-format +msgid "Deleted %(verbose_name)s." +msgstr "" + +#: plugins/xversion.py:127 templates/xadmin/views/recover_form.html:26 +msgid "Recover" +msgstr "" + +#: plugins/xversion.py:143 templates/xadmin/views/model_history.html:11 +#: templates/xadmin/views/revision_diff.html:11 +#: templates/xadmin/views/revision_form.html:15 +msgid "History" +msgstr "" + +#: plugins/xversion.py:194 templates/xadmin/views/recover_form.html:14 +#: templates/xadmin/views/recover_list.html:10 +#, python-format +msgid "Recover deleted %(name)s" +msgstr "" + +#: plugins/xversion.py:238 +#, python-format +msgid "Change history: %s" +msgstr "" + +#: plugins/xversion.py:288 +msgid "Must select two versions." +msgstr "" + +#: plugins/xversion.py:296 +msgid "Please select two different versions." +msgstr "" + +#: plugins/xversion.py:383 plugins/xversion.py:500 +#, python-format +msgid "Current: %s" +msgstr "" + +#: plugins/xversion.py:424 +#, python-format +msgid "Revert %s" +msgstr "" + +#: plugins/xversion.py:440 +#, python-format +msgid "" +"The %(model)s \"%(name)s\" was reverted successfully. You may edit it again " +"below." +msgstr "" + +#: plugins/xversion.py:461 +#, python-format +msgid "Recover %s" +msgstr "" + +#: plugins/xversion.py:477 +#, python-format +msgid "" +"The %(model)s \"%(name)s\" was recovered successfully. You may edit it again " +"below." +msgstr "" + +#: templates/xadmin/404.html:4 templates/xadmin/404.html:8 +msgid "Page not found" +msgstr "" + +#: templates/xadmin/404.html:10 +msgid "We're sorry, but the requested page could not be found." +msgstr "" + +#: templates/xadmin/500.html:7 +#: templates/xadmin/auth/user/change_password.html:10 +#: templates/xadmin/auth/user/change_password.html:15 +#: templates/xadmin/base_site.html:53 +#: templates/xadmin/includes/sitemenu_default.html:7 +#: templates/xadmin/views/app_index.html:9 +#: templates/xadmin/views/batch_change_form.html:9 +#: templates/xadmin/views/invalid_setup.html:7 +#: templates/xadmin/views/model_dashboard.html:7 +#: templates/xadmin/views/model_delete_selected_confirm.html:8 +#: templates/xadmin/views/model_history.html:8 +#: templates/xadmin/views/recover_form.html:8 +#: templates/xadmin/views/recover_list.html:8 +#: templates/xadmin/views/revision_diff.html:8 +#: templates/xadmin/views/revision_form.html:8 views/base.py:473 +msgid "Home" +msgstr "" + +#: templates/xadmin/500.html:8 +msgid "Server error" +msgstr "" + +#: templates/xadmin/500.html:12 +msgid "Server error (500)" +msgstr "" + +#: templates/xadmin/500.html:15 +msgid "Server Error (500)" +msgstr "" + +#: templates/xadmin/500.html:16 +msgid "" +"There's been an error. It's been reported to the site administrators via e-" +"mail and should be fixed shortly. Thanks for your patience." +msgstr "" + +#: templates/xadmin/auth/password_reset/complete.html:11 +#: templates/xadmin/auth/password_reset/done.html:11 +msgid "Password reset successful" +msgstr "" + +#: templates/xadmin/auth/password_reset/complete.html:14 +msgid "Your password has been set. You may go ahead and log in now." +msgstr "" + +#: templates/xadmin/auth/password_reset/complete.html:15 +msgid "Log in" +msgstr "" + +#: templates/xadmin/auth/password_reset/confirm.html:12 +msgid "Enter new password" +msgstr "" + +#: templates/xadmin/auth/password_reset/confirm.html:17 +msgid "" +"Please enter your new password twice so we can verify you typed it in " +"correctly." +msgstr "" + +#: templates/xadmin/auth/password_reset/confirm.html:19 +msgid "Change my password" +msgstr "" + +#: templates/xadmin/auth/password_reset/confirm.html:24 +msgid "Password reset unsuccessful" +msgstr "" + +#: templates/xadmin/auth/password_reset/confirm.html:27 +msgid "" +"The password reset link was invalid, possibly because it has already been " +"used. Please request a new password reset." +msgstr "" + +#: templates/xadmin/auth/password_reset/done.html:14 +msgid "" +"We've e-mailed you instructions for setting your password to the e-mail " +"address you submitted. You should be receiving it shortly." +msgstr "" + +#: templates/xadmin/auth/password_reset/email.html:2 +#, python-format +msgid "" +"You're receiving this e-mail because you requested a password reset for your " +"user account at %(site_name)s." +msgstr "" + +#: templates/xadmin/auth/password_reset/email.html:4 +msgid "Please go to the following page and choose a new password:" +msgstr "" + +#: templates/xadmin/auth/password_reset/email.html:8 +msgid "Your username, in case you've forgotten:" +msgstr "" + +#: templates/xadmin/auth/password_reset/email.html:10 +msgid "Thanks for using our site!" +msgstr "" + +#: templates/xadmin/auth/password_reset/email.html:12 +#, python-format +msgid "The %(site_name)s team" +msgstr "" + +#: templates/xadmin/auth/password_reset/form.html:13 +msgid "Password reset" +msgstr "" + +#: templates/xadmin/auth/password_reset/form.html:17 +msgid "" +"Forgotten your password? Enter your e-mail address below, and we'll e-mail " +"instructions for setting a new one." +msgstr "" + +#: templates/xadmin/auth/password_reset/form.html:25 +msgid "E-mail address:" +msgstr "" + +#: templates/xadmin/auth/password_reset/form.html:33 +msgid "Reset my password" +msgstr "" + +#: templates/xadmin/auth/user/add_form.html:6 +msgid "" +"First, enter a username and password. Then, you'll be able to edit more user " +"options." +msgstr "" + +#: templates/xadmin/auth/user/add_form.html:8 +msgid "Enter a username and password." +msgstr "" + +#: templates/xadmin/auth/user/change_password.html:31 +#: templates/xadmin/views/batch_change_form.html:24 +#: templates/xadmin/views/form.html:18 +#: templates/xadmin/views/model_form.html:20 +msgid "Please correct the error below." +msgid_plural "Please correct the errors below." +msgstr[0] "" + +#: templates/xadmin/auth/user/change_password.html:38 +msgid "Enter your new password." +msgstr "" + +#: templates/xadmin/auth/user/change_password.html:40 +#, python-format +msgid "Enter a new password for the user %(username)s." +msgstr "" + +#: templates/xadmin/base_site.html:18 +msgid "Welcome," +msgstr "" + +#: templates/xadmin/base_site.html:24 +msgid "Log out" +msgstr "" + +#: templates/xadmin/base_site.html:36 +msgid "You don't have permission to edit anything." +msgstr "" + +#: templates/xadmin/blocks/comm.top.theme.html:4 +msgid "Themes" +msgstr "" + +#: templates/xadmin/blocks/comm.top.topnav.html:9 +#: templates/xadmin/blocks/model_list.nav_form.search_form.html:8 +#: templates/xadmin/filters/char.html:7 +#: templates/xadmin/filters/fk_search.html:7 +#: templates/xadmin/filters/fk_search.html:16 +#: templates/xadmin/filters/number.html:7 +msgid "Search" +msgstr "" + +#: templates/xadmin/blocks/comm.top.topnav.html:23 +msgid "Add" +msgstr "" + +#: templates/xadmin/blocks/model_form.submit_line.wizard.html:9 +#: templates/xadmin/blocks/model_form.submit_line.wizard.html:26 +msgid "Prev step" +msgstr "" + +#: templates/xadmin/blocks/model_form.submit_line.wizard.html:13 +#: templates/xadmin/blocks/model_form.submit_line.wizard.html:29 +msgid "Next step" +msgstr "" + +#: templates/xadmin/blocks/model_form.submit_line.wizard.html:15 +#: templates/xadmin/blocks/model_form.submit_line.wizard.html:31 +#: templates/xadmin/includes/submit_line.html:10 +#: templates/xadmin/includes/submit_line.html:13 +#: templates/xadmin/views/form.html:30 templates/xadmin/views/form.html:31 +msgid "Save" +msgstr "" + +#: templates/xadmin/blocks/model_list.nav_menu.bookmarks.html:7 +msgid "Clean Bookmarks" +msgstr "" + +#: templates/xadmin/blocks/model_list.nav_menu.bookmarks.html:18 +msgid "No Bookmarks" +msgstr "" + +#: templates/xadmin/blocks/model_list.nav_menu.bookmarks.html:22 +msgid "New Bookmark" +msgstr "" + +#: templates/xadmin/blocks/model_list.nav_menu.bookmarks.html:26 +msgid "Save current page as Bookmark" +msgstr "" + +#: templates/xadmin/blocks/model_list.nav_menu.bookmarks.html:32 +msgid "Enter bookmark title" +msgstr "" + +#: templates/xadmin/blocks/model_list.nav_menu.bookmarks.html:33 +msgid "Waiting" +msgstr "" + +#: templates/xadmin/blocks/model_list.nav_menu.bookmarks.html:33 +msgid "Save Bookmark" +msgstr "" + +#: templates/xadmin/blocks/model_list.nav_menu.filters.html:4 +msgid "Filters" +msgstr "" + +#: templates/xadmin/blocks/model_list.nav_menu.filters.html:8 +msgid "Clean Filters" +msgstr "" + +#: templates/xadmin/blocks/model_list.results_bottom.actions.html:19 +msgid "Click here to select the objects across all pages" +msgstr "" + +#: templates/xadmin/blocks/model_list.results_bottom.actions.html:19 +#, python-format +msgid "Select all %(total_count)s %(model_name)s" +msgstr "" + +#: templates/xadmin/blocks/model_list.results_bottom.actions.html:20 +msgid "Clear selection" +msgstr "" + +#: templates/xadmin/blocks/model_list.results_top.charts.html:4 +msgid "Charts" +msgstr "" + +#: templates/xadmin/blocks/model_list.top_toolbar.exports.html:4 +#: templates/xadmin/blocks/model_list.top_toolbar.exports.html:8 +#: templates/xadmin/blocks/model_list.top_toolbar.exports.html:19 +#: templates/xadmin/blocks/model_list.top_toolbar.exports.html:47 +msgid "Export" +msgstr "" + +#: templates/xadmin/blocks/model_list.top_toolbar.exports.html:26 +#: templates/xadmin/blocks/model_list.top_toolbar.exports.html:29 +#: templates/xadmin/blocks/model_list.top_toolbar.exports.html:32 +msgid "Export with table header." +msgstr "" + +#: templates/xadmin/blocks/model_list.top_toolbar.exports.html:35 +#: templates/xadmin/blocks/model_list.top_toolbar.exports.html:38 +msgid "Export with format." +msgstr "" + +#: templates/xadmin/blocks/model_list.top_toolbar.exports.html:42 +msgid "Export all data." +msgstr "" + +#: templates/xadmin/blocks/model_list.top_toolbar.exports.html:46 +#: templates/xadmin/widgets/base.html:41 +msgid "Close" +msgstr "" + +#: templates/xadmin/blocks/model_list.top_toolbar.layouts.html:4 +msgid "Layout" +msgstr "" + +#: templates/xadmin/blocks/model_list.top_toolbar.refresh.html:8 +msgid "Clean Refresh" +msgstr "" + +#: templates/xadmin/blocks/model_list.top_toolbar.refresh.html:14 +#, python-format +msgid "Every %(t)s seconds" +msgstr "" + +#: templates/xadmin/blocks/model_list.top_toolbar.saveorder.html:4 +msgid "Save Order" +msgstr "" + +#: templates/xadmin/edit_inline/blank.html:5 views/detail.py:23 +#: views/edit.py:102 views/list.py:29 +msgid "Null" +msgstr "" + +#: templates/xadmin/filters/char.html:13 +msgid "Enter" +msgstr "" + +#: templates/xadmin/filters/date.html:10 templates/xadmin/filters/date.html:13 +msgid "Choice Date" +msgstr "" + +#: templates/xadmin/filters/date.html:18 +msgid "YY" +msgstr "" + +#: templates/xadmin/filters/date.html:19 +msgid "year" +msgstr "" + +#: templates/xadmin/filters/date.html:22 +msgid "MM" +msgstr "" + +#: templates/xadmin/filters/date.html:23 +msgid "month" +msgstr "" + +#: templates/xadmin/filters/date.html:26 +msgid "DD" +msgstr "" + +#: templates/xadmin/filters/date.html:27 +msgid "day" +msgstr "" + +#: templates/xadmin/filters/date.html:29 templates/xadmin/filters/date.html:46 +#: templates/xadmin/filters/date.html:54 +#: templates/xadmin/filters/fk_search.html:24 +#: templates/xadmin/filters/number.html:37 +msgid "Apply" +msgstr "" + +#: templates/xadmin/filters/date.html:34 +msgid "Date Range" +msgstr "" + +#: templates/xadmin/filters/date.html:41 +msgid "Select Date" +msgstr "" + +#: templates/xadmin/filters/date.html:42 +msgid "From" +msgstr "" + +#: templates/xadmin/filters/date.html:44 +msgid "To" +msgstr "" + +#: templates/xadmin/filters/fk_search.html:14 +msgid "Select" +msgstr "" + +#: templates/xadmin/filters/fk_search.html:26 +#: templates/xadmin/filters/number.html:39 +msgid "Clean" +msgstr "" + +#: templates/xadmin/filters/number.html:17 +#: templates/xadmin/filters/number.html:25 +#: templates/xadmin/filters/number.html:33 +msgid "Enter Number" +msgstr "" + +#: templates/xadmin/filters/rel.html:3 +#, python-format +msgid " By %(filter_title)s " +msgstr "" + +#: templates/xadmin/forms/transfer.html:4 +msgid "Available" +msgstr "" + +#: templates/xadmin/forms/transfer.html:12 +msgid "Click to choose all at once." +msgstr "" + +#: templates/xadmin/forms/transfer.html:12 +msgid "Choose all" +msgstr "" + +#: templates/xadmin/forms/transfer.html:16 +msgid "Choose" +msgstr "" + +#: templates/xadmin/forms/transfer.html:19 +#: templates/xadmin/widgets/base.html:40 +msgid "Remove" +msgstr "" + +#: templates/xadmin/forms/transfer.html:23 +msgid "Chosen" +msgstr "" + +#: templates/xadmin/forms/transfer.html:27 +msgid "Click to remove all chosen at once." +msgstr "" + +#: templates/xadmin/forms/transfer.html:27 +msgid "Remove all" +msgstr "" + +#: templates/xadmin/includes/pagination.html:9 +msgid "Show all" +msgstr "" + +#: templates/xadmin/includes/submit_line.html:10 +#: templates/xadmin/includes/submit_line.html:13 +#: templates/xadmin/views/form.html:30 templates/xadmin/views/form.html:31 +msgid "Saving.." +msgstr "" + +#: templates/xadmin/includes/submit_line.html:17 +msgid "Save as new" +msgstr "" + +#: templates/xadmin/includes/submit_line.html:18 +msgid "Save and add another" +msgstr "" + +#: templates/xadmin/includes/submit_line.html:19 +msgid "Save and continue editing" +msgstr "" + +#: templates/xadmin/includes/submit_line.html:24 +#: templates/xadmin/views/model_detail.html:28 views/delete.py:93 +msgid "Delete" +msgstr "" + +#: templates/xadmin/views/app_index.html:13 +#, python-format +msgid "%(name)s" +msgstr "" + +#: templates/xadmin/views/batch_change_form.html:11 +msgid "Change multiple objects" +msgstr "" + +#: templates/xadmin/views/batch_change_form.html:16 +#, python-format +msgid "Change one %(objects_name)s" +msgid_plural "Batch change %(counter)s %(objects_name)s" +msgstr[0] "" + +#: templates/xadmin/views/batch_change_form.html:38 +msgid "Change Multiple" +msgstr "" + +#: templates/xadmin/views/dashboard.html:15 +#: templates/xadmin/views/dashboard.html:22 +#: templates/xadmin/views/dashboard.html:23 +msgid "Add Widget" +msgstr "" + +#: templates/xadmin/views/invalid_setup.html:13 +msgid "" +"Something's wrong with your database installation. Make sure the appropriate " +"database tables have been created, and make sure the database is readable by " +"the appropriate user." +msgstr "" + +#: templates/xadmin/views/logged_out.html:16 +msgid "Logout Success" +msgstr "" + +#: templates/xadmin/views/logged_out.html:17 +msgid "Thanks for spending some quality time with the Web site today." +msgstr "" + +#: templates/xadmin/views/logged_out.html:19 +msgid "Close Window" +msgstr "" + +#: templates/xadmin/views/logged_out.html:20 +msgid "Log in again" +msgstr "" + +#: templates/xadmin/views/login.html:39 views/website.py:38 +msgid "Please Login" +msgstr "" + +#: templates/xadmin/views/login.html:52 +msgid "Username" +msgstr "" + +#: templates/xadmin/views/login.html:64 +msgid "Password" +msgstr "" + +#: templates/xadmin/views/login.html:75 +msgid "log in" +msgstr "" + +#: templates/xadmin/views/model_dashboard.html:26 +#: templates/xadmin/views/model_detail.html:25 +msgid "Edit" +msgstr "" + +#: templates/xadmin/views/model_delete_confirm.html:11 +#, python-format +msgid "" +"Deleting the %(verbose_name)s '%(escaped_object)s' would result in deleting " +"related objects, but your account doesn't have permission to delete the " +"following types of objects:" +msgstr "" + +#: templates/xadmin/views/model_delete_confirm.html:19 +#, python-format +msgid "" +"Deleting the %(verbose_name)s '%(escaped_object)s' would require deleting " +"the following protected related objects:" +msgstr "" + +#: templates/xadmin/views/model_delete_confirm.html:27 +#, python-format +msgid "" +"Are you sure you want to delete the %(verbose_name)s \"%(escaped_object)s\"? " +"All of the following related items will be deleted:" +msgstr "" + +#: templates/xadmin/views/model_delete_confirm.html:34 +#: templates/xadmin/views/model_delete_selected_confirm.html:49 +msgid "Yes, I'm sure" +msgstr "" + +#: templates/xadmin/views/model_delete_confirm.html:35 +#: templates/xadmin/views/model_delete_selected_confirm.html:50 +msgid "Cancel" +msgstr "" + +#: templates/xadmin/views/model_delete_selected_confirm.html:10 +msgid "Delete multiple objects" +msgstr "" + +#: templates/xadmin/views/model_delete_selected_confirm.html:18 +#, python-format +msgid "" +"Deleting the selected %(objects_name)s would result in deleting related " +"objects, but your account doesn't have permission to delete the following " +"types of objects:" +msgstr "" + +#: templates/xadmin/views/model_delete_selected_confirm.html:26 +#, python-format +msgid "" +"Deleting the selected %(objects_name)s would require deleting the following " +"protected related objects:" +msgstr "" + +#: templates/xadmin/views/model_delete_selected_confirm.html:34 +#, python-format +msgid "" +"Are you sure you want to delete the selected %(objects_name)s? All of the " +"following objects and their related items will be deleted:" +msgstr "" + +#: templates/xadmin/views/model_history.html:26 +msgid "Diff" +msgstr "" + +#: templates/xadmin/views/model_history.html:27 +#: templates/xadmin/views/recover_list.html:25 +msgid "Date/time" +msgstr "" + +#: templates/xadmin/views/model_history.html:28 +msgid "User" +msgstr "" + +#: templates/xadmin/views/model_history.html:29 +msgid "Comment" +msgstr "" + +#: templates/xadmin/views/model_history.html:54 +msgid "Diff Select Versions" +msgstr "" + +#: templates/xadmin/views/model_history.html:58 +msgid "" +"This object doesn't have a change history. It probably wasn't added via this " +"admin site." +msgstr "" + +#: templates/xadmin/views/model_list.html:29 +#, python-format +msgid "Add %(name)s" +msgstr "" + +#: templates/xadmin/views/model_list.html:39 +msgid "Columns" +msgstr "" + +#: templates/xadmin/views/model_list.html:42 +msgid "Restore Selected" +msgstr "" + +#: templates/xadmin/views/model_list.html:147 +#: templates/xadmin/widgets/list.html:33 +msgid "Empty list" +msgstr "" + +#: templates/xadmin/views/recover_form.html:20 +msgid "Press the recover button below to recover this version of the object." +msgstr "" + +#: templates/xadmin/views/recover_list.html:19 +msgid "" +"Choose a date from the list below to recover a deleted version of an object." +msgstr "" + +#: templates/xadmin/views/recover_list.html:39 +msgid "There are no deleted objects to recover." +msgstr "" + +#: templates/xadmin/views/revision_diff.html:12 +#: templates/xadmin/views/revision_diff.html:17 +#, python-format +msgid "Diff %(verbose_name)s" +msgstr "" + +#: templates/xadmin/views/revision_diff.html:25 +msgid "Field" +msgstr "" + +#: templates/xadmin/views/revision_diff.html:26 +msgid "Version A" +msgstr "" + +#: templates/xadmin/views/revision_diff.html:27 +msgid "Version B" +msgstr "" + +#: templates/xadmin/views/revision_diff.html:39 +msgid "Revert to" +msgstr "" + +#: templates/xadmin/views/revision_diff.html:40 +#: templates/xadmin/views/revision_diff.html:41 +msgid "Revert" +msgstr "" + +#: templates/xadmin/views/revision_form.html:16 +#, python-format +msgid "Revert %(verbose_name)s" +msgstr "" + +#: templates/xadmin/views/revision_form.html:21 +msgid "Press the revert button below to revert to this version of the object." +msgstr "" + +#: templates/xadmin/views/revision_form.html:27 +msgid "Revert this revision" +msgstr "" + +#: templates/xadmin/widgets/addform.html:14 +msgid "Success" +msgstr "" + +#: templates/xadmin/widgets/addform.html:14 +msgid "Add success, click edit to edit." +msgstr "" + +#: templates/xadmin/widgets/addform.html:17 +msgid "Quick Add" +msgstr "" + +#: templates/xadmin/widgets/base.html:31 +msgid "Widget Options" +msgstr "" + +#: templates/xadmin/widgets/base.html:42 +msgid "Save changes" +msgstr "" + +#: views/base.py:315 +msgid "Django Xadmin" +msgstr "" + +#: views/base.py:316 +msgid "my-company.inc" +msgstr "" + +#: views/dashboard.py:186 +msgid "Widget ID" +msgstr "" + +#: views/dashboard.py:187 +msgid "Widget Title" +msgstr "" + +#: views/dashboard.py:252 +msgid "Html Content Widget, can write any html content in widget." +msgstr "" + +#: views/dashboard.py:255 +msgid "Html Content" +msgstr "" + +#: views/dashboard.py:318 +msgid "Target Model" +msgstr "" + +#: views/dashboard.py:369 +msgid "Quick button Widget, quickly open any page." +msgstr "" + +#: views/dashboard.py:371 +msgid "Quick Buttons" +msgstr "" + +#: views/dashboard.py:416 +msgid "Any Objects list Widget." +msgstr "" + +#: views/dashboard.py:456 +msgid "Add any model object Widget." +msgstr "" + +#: views/dashboard.py:492 +msgid "Dashboard" +msgstr "" + +#: views/dashboard.py:633 +#, python-format +msgid "%s Dashboard" +msgstr "" + +#: views/delete.py:103 +#, python-format +msgid "The %(name)s \"%(obj)s\" was deleted successfully." +msgstr "" + +#: views/detail.py:173 views/edit.py:211 views/form.py:72 +msgid "Other Fields" +msgstr "" + +#: views/detail.py:235 +#, python-format +msgid "%s Detail" +msgstr "" + +#: views/edit.py:253 +msgid "Added." +msgstr "" + +#: views/edit.py:255 +#, python-format +msgid "Changed %s." +msgstr "" + +#: views/edit.py:255 +msgid "and" +msgstr "" + +#: views/edit.py:258 +msgid "No fields changed." +msgstr "" + +#: views/edit.py:420 +#, python-format +msgid "The %(name)s \"%(obj)s\" was added successfully." +msgstr "" + +#: views/edit.py:425 views/edit.py:520 +msgid "You may edit it again below." +msgstr "" + +#: views/edit.py:429 views/edit.py:523 +#, python-format +msgid "You may add another %s below." +msgstr "" + +#: views/edit.py:471 +#, python-format +msgid "Change %s" +msgstr "" + +#: views/edit.py:516 +#, python-format +msgid "The %(name)s \"%(obj)s\" was changed successfully." +msgstr "" + +#: views/form.py:165 +#, python-format +msgid "The %s was changed successfully." +msgstr "" + +#: views/list.py:199 +msgid "Database error" +msgstr "" + +#: views/list.py:373 +#, python-format +msgid "%s List" +msgstr "" + +#: views/list.py:499 +msgid "Sort ASC" +msgstr "" + +#: views/list.py:500 +msgid "Sort DESC" +msgstr "" + +#: views/list.py:504 +msgid "Cancel Sort" +msgstr "" + +#: views/website.py:16 +msgid "Main Dashboard" +msgstr "" + +#: widgets.py:48 +msgid "Now" +msgstr "" diff --git "a/8\343\200\201\346\226\207\347\214\256\346\225\260\346\215\256\346\214\226\346\216\230\347\263\273\347\273\237(\351\231\204\346\272\220\347\240\201)/extra_apps/xadmin/locale/ja/LC_MESSAGES/djangojs.mo" "b/8\343\200\201\346\226\207\347\214\256\346\225\260\346\215\256\346\214\226\346\216\230\347\263\273\347\273\237(\351\231\204\346\272\220\347\240\201)/extra_apps/xadmin/locale/ja/LC_MESSAGES/djangojs.mo" new file mode 100644 index 0000000..e0da039 Binary files /dev/null and "b/8\343\200\201\346\226\207\347\214\256\346\225\260\346\215\256\346\214\226\346\216\230\347\263\273\347\273\237(\351\231\204\346\272\220\347\240\201)/extra_apps/xadmin/locale/ja/LC_MESSAGES/djangojs.mo" differ diff --git "a/8\343\200\201\346\226\207\347\214\256\346\225\260\346\215\256\346\214\226\346\216\230\347\263\273\347\273\237(\351\231\204\346\272\220\347\240\201)/extra_apps/xadmin/locale/ja/LC_MESSAGES/djangojs.po" "b/8\343\200\201\346\226\207\347\214\256\346\225\260\346\215\256\346\214\226\346\216\230\347\263\273\347\273\237(\351\231\204\346\272\220\347\240\201)/extra_apps/xadmin/locale/ja/LC_MESSAGES/djangojs.po" new file mode 100644 index 0000000..dc0c9c2 --- /dev/null +++ "b/8\343\200\201\346\226\207\347\214\256\346\225\260\346\215\256\346\214\226\346\216\230\347\263\273\347\273\237(\351\231\204\346\272\220\347\240\201)/extra_apps/xadmin/locale/ja/LC_MESSAGES/djangojs.po" @@ -0,0 +1,69 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER +# This file is distributed under the same license as the PACKAGE package. +# +# Translators: +msgid "" +msgstr "" +"Project-Id-Version: xadmin-core\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2013-04-30 23:11+0800\n" +"PO-Revision-Date: 2013-11-20 12:41+0000\n" +"Last-Translator: sshwsfc \n" +"Language-Team: Japanese (http://www.transifex.com/projects/p/xadmin/language/ja/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: ja\n" +"Plural-Forms: nplurals=1; plural=0;\n" + +#: static/xadmin/js/xadmin.plugin.actions.js:20 +msgid "%(sel)s of %(cnt)s selected" +msgid_plural "%(sel)s of %(cnt)s selected" +msgstr[0] "" + +#: static/xadmin/js/xadmin.plugin.revision.js:25 +msgid "New Item" +msgstr "" + +#: static/xadmin/js/xadmin.widget.datetime.js:32 +msgid "Sunday Monday Tuesday Wednesday Thursday Friday Saturday Sunday" +msgstr "" + +#: static/xadmin/js/xadmin.widget.datetime.js:33 +msgid "Sun Mon Tue Wed Thu Fri Sat Sun" +msgstr "" + +#: static/xadmin/js/xadmin.widget.datetime.js:34 +msgid "Su Mo Tu We Th Fr Sa Su" +msgstr "" + +#: static/xadmin/js/xadmin.widget.datetime.js:35 +msgid "" +"January February March April May June July August September October November" +" December" +msgstr "" + +#: static/xadmin/js/xadmin.widget.datetime.js:36 +msgid "Jan Feb Mar Apr May Jun Jul Aug Sep Oct Nov Dec" +msgstr "" + +#: static/xadmin/js/xadmin.widget.datetime.js:37 +msgid "Today" +msgstr "" + +#: static/xadmin/js/xadmin.widget.datetime.js:38 +msgid "%a %d %b %Y %T %Z" +msgstr "" + +#: static/xadmin/js/xadmin.widget.datetime.js:39 +msgid "AM PM" +msgstr "" + +#: static/xadmin/js/xadmin.widget.datetime.js:40 +msgid "am pm" +msgstr "" + +#: static/xadmin/js/xadmin.widget.datetime.js:43 +msgid "%T" +msgstr "" diff --git "a/8\343\200\201\346\226\207\347\214\256\346\225\260\346\215\256\346\214\226\346\216\230\347\263\273\347\273\237(\351\231\204\346\272\220\347\240\201)/extra_apps/xadmin/locale/lt/LC_MESSAGES/django.mo" "b/8\343\200\201\346\226\207\347\214\256\346\225\260\346\215\256\346\214\226\346\216\230\347\263\273\347\273\237(\351\231\204\346\272\220\347\240\201)/extra_apps/xadmin/locale/lt/LC_MESSAGES/django.mo" new file mode 100644 index 0000000..7a23b22 Binary files /dev/null and "b/8\343\200\201\346\226\207\347\214\256\346\225\260\346\215\256\346\214\226\346\216\230\347\263\273\347\273\237(\351\231\204\346\272\220\347\240\201)/extra_apps/xadmin/locale/lt/LC_MESSAGES/django.mo" differ diff --git "a/8\343\200\201\346\226\207\347\214\256\346\225\260\346\215\256\346\214\226\346\216\230\347\263\273\347\273\237(\351\231\204\346\272\220\347\240\201)/extra_apps/xadmin/locale/lt/LC_MESSAGES/django.po" "b/8\343\200\201\346\226\207\347\214\256\346\225\260\346\215\256\346\214\226\346\216\230\347\263\273\347\273\237(\351\231\204\346\272\220\347\240\201)/extra_apps/xadmin/locale/lt/LC_MESSAGES/django.po" new file mode 100644 index 0000000..1e7dcbf --- /dev/null +++ "b/8\343\200\201\346\226\207\347\214\256\346\225\260\346\215\256\346\214\226\346\216\230\347\263\273\347\273\237(\351\231\204\346\272\220\347\240\201)/extra_apps/xadmin/locale/lt/LC_MESSAGES/django.po" @@ -0,0 +1,1418 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER +# This file is distributed under the same license as the PACKAGE package. +# +# Translators: +msgid "" +msgstr "" +"Project-Id-Version: xadmin-core\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2016-07-20 13:28+0800\n" +"PO-Revision-Date: 2013-11-20 10:21+0000\n" +"Last-Translator: sshwsfc \n" +"Language-Team: Lithuanian (http://www.transifex.com/projects/p/xadmin/" +"language/lt/)\n" +"Language: lt\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && (n" +"%100<10 || n%100>=20) ? 1 : 2);\n" + +#: adminx.py:19 +msgid "Admin Object" +msgstr "" + +#: apps.py:11 +msgid "Administration" +msgstr "" + +#: filters.py:159 filters.py:191 filters.py:407 filters.py:493 filters.py:531 +msgid "All" +msgstr "" + +#: filters.py:160 plugins/export.py:165 +msgid "Yes" +msgstr "" + +#: filters.py:161 plugins/export.py:165 +msgid "No" +msgstr "" + +#: filters.py:175 +msgid "Unknown" +msgstr "" + +#: filters.py:267 +msgid "Any date" +msgstr "" + +#: filters.py:268 +msgid "Has date" +msgstr "" + +#: filters.py:271 +msgid "Has no date" +msgstr "" + +#: filters.py:274 widgets.py:30 +msgid "Today" +msgstr "" + +#: filters.py:278 +msgid "Past 7 days" +msgstr "" + +#: filters.py:282 +msgid "This month" +msgstr "" + +#: filters.py:286 +msgid "This year" +msgstr "" + +#: forms.py:10 +msgid "" +"Please enter the correct username and password for a staff account. Note " +"that both fields are case-sensitive." +msgstr "" + +#: forms.py:21 +msgid "Please log in again, because your session has expired." +msgstr "" + +#: forms.py:41 +#, python-format +msgid "Your e-mail address is not your username. Try '%s' instead." +msgstr "" + +#: models.py:48 +msgid "Title" +msgstr "" + +#: models.py:49 models.py:88 models.py:107 models.py:149 +msgid "user" +msgstr "" + +#: models.py:50 +msgid "Url Name" +msgstr "" + +#: models.py:52 +msgid "Query String" +msgstr "" + +#: models.py:53 +msgid "Is Shared" +msgstr "" + +#: models.py:66 plugins/bookmark.py:50 plugins/bookmark.py:180 +msgid "Bookmark" +msgstr "" + +#: models.py:67 +msgid "Bookmarks" +msgstr "" + +#: models.py:89 +msgid "Settings Key" +msgstr "" + +#: models.py:90 +msgid "Settings Content" +msgstr "" + +#: models.py:102 +msgid "User Setting" +msgstr "" + +#: models.py:103 +msgid "User Settings" +msgstr "" + +#: models.py:108 +msgid "Page" +msgstr "" + +#: models.py:109 views/dashboard.py:82 views/dashboard.py:92 +msgid "Widget Type" +msgstr "" + +#: models.py:110 views/dashboard.py:83 +msgid "Widget Params" +msgstr "" + +#: models.py:137 +msgid "User Widget" +msgstr "" + +#: models.py:138 +msgid "User Widgets" +msgstr "" + +#: models.py:142 +msgid "action time" +msgstr "" + +#: models.py:151 +msgid "action ip" +msgstr "" + +#: models.py:155 +msgid "content type" +msgstr "" + +#: models.py:158 +msgid "object id" +msgstr "" + +#: models.py:159 +msgid "object repr" +msgstr "" + +#: models.py:160 +msgid "action flag" +msgstr "" + +#: models.py:161 +msgid "change message" +msgstr "" + +#: models.py:164 +msgid "log entry" +msgstr "" + +#: models.py:165 +msgid "log entries" +msgstr "" + +#: models.py:173 +#, python-format +msgid "Added \"%(object)s\"." +msgstr "" + +#: models.py:175 +#, python-format +msgid "Changed \"%(object)s\" - %(changes)s" +msgstr "" + +#: models.py:180 +#, python-format +msgid "Deleted \"%(object)s.\"" +msgstr "" + +#: plugins/actions.py:57 +#, python-format +msgid "Delete selected %(verbose_name_plural)s" +msgstr "" + +#: plugins/actions.py:72 +#, python-format +msgid "Batch delete %(count)d %(items)s." +msgstr "" + +#: plugins/actions.py:78 +#, python-format +msgid "Successfully deleted %(count)d %(items)s." +msgstr "" + +#: plugins/actions.py:110 views/delete.py:70 +#, python-format +msgid "Cannot delete %(name)s" +msgstr "" + +#: plugins/actions.py:112 views/delete.py:73 +msgid "Are you sure?" +msgstr "" + +#: plugins/actions.py:158 +#, python-format +msgid "%(total_count)s selected" +msgid_plural "All %(total_count)s selected" +msgstr[0] "" +msgstr[1] "" +msgstr[2] "" + +#: plugins/actions.py:162 +#, python-format +msgid "0 of %(cnt)s selected" +msgstr "" + +#: plugins/actions.py:179 plugins/actions.py:189 +msgid "" +"Items must be selected in order to perform actions on them. No items have " +"been changed." +msgstr "" + +#: plugins/aggregation.py:14 +msgid "Min" +msgstr "" + +#: plugins/aggregation.py:14 +msgid "Max" +msgstr "" + +#: plugins/aggregation.py:14 +msgid "Avg" +msgstr "" + +#: plugins/aggregation.py:14 +msgid "Sum" +msgstr "" + +#: plugins/aggregation.py:14 +msgid "Count" +msgstr "" + +#: plugins/auth.py:21 +#, python-format +msgid "Can add %s" +msgstr "" + +#: plugins/auth.py:22 +#, python-format +msgid "Can change %s" +msgstr "" + +#: plugins/auth.py:23 +#, python-format +msgid "Can edit %s" +msgstr "" + +#: plugins/auth.py:24 +#, python-format +msgid "Can delete %s" +msgstr "" + +#: plugins/auth.py:25 +#, python-format +msgid "Can view %s" +msgstr "" + +#: plugins/auth.py:87 +msgid "Personal info" +msgstr "" + +#: plugins/auth.py:91 +msgid "Permissions" +msgstr "" + +#: plugins/auth.py:94 +msgid "Important dates" +msgstr "" + +#: plugins/auth.py:99 +msgid "Status" +msgstr "" + +#: plugins/auth.py:111 +msgid "Permission Name" +msgstr "" + +#: plugins/auth.py:167 +msgid "Change Password" +msgstr "" + +#: plugins/auth.py:198 +#, python-format +msgid "Change password: %s" +msgstr "" + +#: plugins/auth.py:223 plugins/auth.py:255 +msgid "Password changed successfully." +msgstr "" + +#: plugins/auth.py:242 templates/xadmin/auth/user/change_password.html:11 +#: templates/xadmin/auth/user/change_password.html:22 +#: templates/xadmin/auth/user/change_password.html:55 +msgid "Change password" +msgstr "" + +#: plugins/batch.py:44 +msgid "Change this field" +msgstr "" + +#: plugins/batch.py:65 +#, python-format +msgid "Batch Change selected %(verbose_name_plural)s" +msgstr "" + +#: plugins/batch.py:89 +#, python-format +msgid "Successfully change %(count)d %(items)s." +msgstr "" + +#: plugins/batch.py:138 +#, python-format +msgid "Batch change %s" +msgstr "" + +#: plugins/bookmark.py:173 +msgid "bookmark" +msgstr "" + +#: plugins/bookmark.py:176 +msgid "Bookmark Widget, can show user's bookmark list data in widget." +msgstr "" + +#: plugins/chart.py:25 +msgid "Show models simple chart." +msgstr "" + +#: plugins/chart.py:51 +#, python-format +msgid "%s Charts" +msgstr "" + +#: plugins/comments.py:33 +msgid "Metadata" +msgstr "" + +#: plugins/comments.py:60 +msgid "flagged" +msgid_plural "flagged" +msgstr[0] "" +msgstr[1] "" +msgstr[2] "" + +#: plugins/comments.py:61 +msgid "Flag selected comments" +msgstr "" + +#: plugins/comments.py:66 +msgid "approved" +msgid_plural "approved" +msgstr[0] "" +msgstr[1] "" +msgstr[2] "" + +#: plugins/comments.py:67 +msgid "Approve selected comments" +msgstr "" + +#: plugins/comments.py:72 +msgid "removed" +msgid_plural "removed" +msgstr[0] "" +msgstr[1] "" +msgstr[2] "" + +#: plugins/comments.py:73 +msgid "Remove selected comments" +msgstr "" + +#: plugins/comments.py:86 +#, python-format +msgid "1 comment was successfully %(action)s." +msgid_plural "%(count)s comments were successfully %(action)s." +msgstr[0] "" +msgstr[1] "" +msgstr[2] "" + +#: plugins/details.py:52 views/list.py:578 +#, python-format +msgid "Details of %s" +msgstr "" + +#: plugins/editable.py:46 +#, python-format +msgid "Enter %s" +msgstr "" + +#: plugins/editable.py:73 views/dashboard.py:649 views/delete.py:27 +#: views/detail.py:145 views/edit.py:454 +#, python-format +msgid "%(name)s object with primary key %(key)r does not exist." +msgstr "" + +#: plugins/export.py:98 plugins/export.py:135 +msgid "Sheet" +msgstr "" + +#: plugins/filters.py:133 plugins/quickfilter.py:141 +#, python-format +msgid "Filtering error: %s" +msgstr "" + +#: plugins/images.py:29 +msgid "Previous" +msgstr "" + +#: plugins/images.py:29 +msgid "Next" +msgstr "" + +#: plugins/images.py:29 +msgid "Slideshow" +msgstr "" + +#: plugins/images.py:29 +msgid "Download" +msgstr "" + +#: plugins/images.py:50 +msgid "Change:" +msgstr "" + +#: plugins/layout.py:16 +msgid "Table" +msgstr "" + +#: plugins/layout.py:22 +msgid "Thumbnails" +msgstr "" + +#: plugins/passwords.py:64 +msgid "Forgotten your password or username?" +msgstr "" + +#: plugins/quickform.py:79 +#, python-format +msgid "Create New %s" +msgstr "" + +#: plugins/relate.py:104 +msgid "Related Objects" +msgstr "" + +#: plugins/relfield.py:29 plugins/topnav.py:38 +#, python-format +msgid "Search %s" +msgstr "" + +#: plugins/relfield.py:67 +#, python-format +msgid "Select %s" +msgstr "" + +#: plugins/themes.py:47 +msgid "Default" +msgstr "" + +#: plugins/themes.py:48 +msgid "Default bootstrap theme" +msgstr "" + +#: plugins/themes.py:49 +msgid "Bootstrap2" +msgstr "" + +#: plugins/themes.py:49 +msgid "Bootstrap 2.x theme" +msgstr "" + +#: plugins/topnav.py:62 views/dashboard.py:465 views/edit.py:387 +#: views/edit.py:396 +#, python-format +msgid "Add %s" +msgstr "" + +#: plugins/xversion.py:106 +msgid "Initial version." +msgstr "" + +#: plugins/xversion.py:108 +msgid "Change version." +msgstr "" + +#: plugins/xversion.py:110 +msgid "Revert version." +msgstr "" + +#: plugins/xversion.py:112 +msgid "Rercover version." +msgstr "" + +#: plugins/xversion.py:114 +#, python-format +msgid "Deleted %(verbose_name)s." +msgstr "" + +#: plugins/xversion.py:127 templates/xadmin/views/recover_form.html:26 +msgid "Recover" +msgstr "" + +#: plugins/xversion.py:143 templates/xadmin/views/model_history.html:11 +#: templates/xadmin/views/revision_diff.html:11 +#: templates/xadmin/views/revision_form.html:15 +msgid "History" +msgstr "" + +#: plugins/xversion.py:194 templates/xadmin/views/recover_form.html:14 +#: templates/xadmin/views/recover_list.html:10 +#, python-format +msgid "Recover deleted %(name)s" +msgstr "" + +#: plugins/xversion.py:238 +#, python-format +msgid "Change history: %s" +msgstr "" + +#: plugins/xversion.py:288 +msgid "Must select two versions." +msgstr "" + +#: plugins/xversion.py:296 +msgid "Please select two different versions." +msgstr "" + +#: plugins/xversion.py:383 plugins/xversion.py:500 +#, python-format +msgid "Current: %s" +msgstr "" + +#: plugins/xversion.py:424 +#, python-format +msgid "Revert %s" +msgstr "" + +#: plugins/xversion.py:440 +#, python-format +msgid "" +"The %(model)s \"%(name)s\" was reverted successfully. You may edit it again " +"below." +msgstr "" + +#: plugins/xversion.py:461 +#, python-format +msgid "Recover %s" +msgstr "" + +#: plugins/xversion.py:477 +#, python-format +msgid "" +"The %(model)s \"%(name)s\" was recovered successfully. You may edit it again " +"below." +msgstr "" + +#: templates/xadmin/404.html:4 templates/xadmin/404.html:8 +msgid "Page not found" +msgstr "" + +#: templates/xadmin/404.html:10 +msgid "We're sorry, but the requested page could not be found." +msgstr "" + +#: templates/xadmin/500.html:7 +#: templates/xadmin/auth/user/change_password.html:10 +#: templates/xadmin/auth/user/change_password.html:15 +#: templates/xadmin/base_site.html:53 +#: templates/xadmin/includes/sitemenu_default.html:7 +#: templates/xadmin/views/app_index.html:9 +#: templates/xadmin/views/batch_change_form.html:9 +#: templates/xadmin/views/invalid_setup.html:7 +#: templates/xadmin/views/model_dashboard.html:7 +#: templates/xadmin/views/model_delete_selected_confirm.html:8 +#: templates/xadmin/views/model_history.html:8 +#: templates/xadmin/views/recover_form.html:8 +#: templates/xadmin/views/recover_list.html:8 +#: templates/xadmin/views/revision_diff.html:8 +#: templates/xadmin/views/revision_form.html:8 views/base.py:473 +msgid "Home" +msgstr "" + +#: templates/xadmin/500.html:8 +msgid "Server error" +msgstr "" + +#: templates/xadmin/500.html:12 +msgid "Server error (500)" +msgstr "" + +#: templates/xadmin/500.html:15 +msgid "Server Error (500)" +msgstr "" + +#: templates/xadmin/500.html:16 +msgid "" +"There's been an error. It's been reported to the site administrators via e-" +"mail and should be fixed shortly. Thanks for your patience." +msgstr "" + +#: templates/xadmin/auth/password_reset/complete.html:11 +#: templates/xadmin/auth/password_reset/done.html:11 +msgid "Password reset successful" +msgstr "" + +#: templates/xadmin/auth/password_reset/complete.html:14 +msgid "Your password has been set. You may go ahead and log in now." +msgstr "" + +#: templates/xadmin/auth/password_reset/complete.html:15 +msgid "Log in" +msgstr "" + +#: templates/xadmin/auth/password_reset/confirm.html:12 +msgid "Enter new password" +msgstr "" + +#: templates/xadmin/auth/password_reset/confirm.html:17 +msgid "" +"Please enter your new password twice so we can verify you typed it in " +"correctly." +msgstr "" + +#: templates/xadmin/auth/password_reset/confirm.html:19 +msgid "Change my password" +msgstr "" + +#: templates/xadmin/auth/password_reset/confirm.html:24 +msgid "Password reset unsuccessful" +msgstr "" + +#: templates/xadmin/auth/password_reset/confirm.html:27 +msgid "" +"The password reset link was invalid, possibly because it has already been " +"used. Please request a new password reset." +msgstr "" + +#: templates/xadmin/auth/password_reset/done.html:14 +msgid "" +"We've e-mailed you instructions for setting your password to the e-mail " +"address you submitted. You should be receiving it shortly." +msgstr "" + +#: templates/xadmin/auth/password_reset/email.html:2 +#, python-format +msgid "" +"You're receiving this e-mail because you requested a password reset for your " +"user account at %(site_name)s." +msgstr "" + +#: templates/xadmin/auth/password_reset/email.html:4 +msgid "Please go to the following page and choose a new password:" +msgstr "" + +#: templates/xadmin/auth/password_reset/email.html:8 +msgid "Your username, in case you've forgotten:" +msgstr "" + +#: templates/xadmin/auth/password_reset/email.html:10 +msgid "Thanks for using our site!" +msgstr "" + +#: templates/xadmin/auth/password_reset/email.html:12 +#, python-format +msgid "The %(site_name)s team" +msgstr "" + +#: templates/xadmin/auth/password_reset/form.html:13 +msgid "Password reset" +msgstr "" + +#: templates/xadmin/auth/password_reset/form.html:17 +msgid "" +"Forgotten your password? Enter your e-mail address below, and we'll e-mail " +"instructions for setting a new one." +msgstr "" + +#: templates/xadmin/auth/password_reset/form.html:25 +msgid "E-mail address:" +msgstr "" + +#: templates/xadmin/auth/password_reset/form.html:33 +msgid "Reset my password" +msgstr "" + +#: templates/xadmin/auth/user/add_form.html:6 +msgid "" +"First, enter a username and password. Then, you'll be able to edit more user " +"options." +msgstr "" + +#: templates/xadmin/auth/user/add_form.html:8 +msgid "Enter a username and password." +msgstr "" + +#: templates/xadmin/auth/user/change_password.html:31 +#: templates/xadmin/views/batch_change_form.html:24 +#: templates/xadmin/views/form.html:18 +#: templates/xadmin/views/model_form.html:20 +msgid "Please correct the error below." +msgid_plural "Please correct the errors below." +msgstr[0] "" +msgstr[1] "" +msgstr[2] "" + +#: templates/xadmin/auth/user/change_password.html:38 +msgid "Enter your new password." +msgstr "" + +#: templates/xadmin/auth/user/change_password.html:40 +#, python-format +msgid "Enter a new password for the user %(username)s." +msgstr "" + +#: templates/xadmin/base_site.html:18 +msgid "Welcome," +msgstr "" + +#: templates/xadmin/base_site.html:24 +msgid "Log out" +msgstr "" + +#: templates/xadmin/base_site.html:36 +msgid "You don't have permission to edit anything." +msgstr "" + +#: templates/xadmin/blocks/comm.top.theme.html:4 +msgid "Themes" +msgstr "" + +#: templates/xadmin/blocks/comm.top.topnav.html:9 +#: templates/xadmin/blocks/model_list.nav_form.search_form.html:8 +#: templates/xadmin/filters/char.html:7 +#: templates/xadmin/filters/fk_search.html:7 +#: templates/xadmin/filters/fk_search.html:16 +#: templates/xadmin/filters/number.html:7 +msgid "Search" +msgstr "" + +#: templates/xadmin/blocks/comm.top.topnav.html:23 +msgid "Add" +msgstr "" + +#: templates/xadmin/blocks/model_form.submit_line.wizard.html:9 +#: templates/xadmin/blocks/model_form.submit_line.wizard.html:26 +msgid "Prev step" +msgstr "" + +#: templates/xadmin/blocks/model_form.submit_line.wizard.html:13 +#: templates/xadmin/blocks/model_form.submit_line.wizard.html:29 +msgid "Next step" +msgstr "" + +#: templates/xadmin/blocks/model_form.submit_line.wizard.html:15 +#: templates/xadmin/blocks/model_form.submit_line.wizard.html:31 +#: templates/xadmin/includes/submit_line.html:10 +#: templates/xadmin/includes/submit_line.html:13 +#: templates/xadmin/views/form.html:30 templates/xadmin/views/form.html:31 +msgid "Save" +msgstr "" + +#: templates/xadmin/blocks/model_list.nav_menu.bookmarks.html:7 +msgid "Clean Bookmarks" +msgstr "" + +#: templates/xadmin/blocks/model_list.nav_menu.bookmarks.html:18 +msgid "No Bookmarks" +msgstr "" + +#: templates/xadmin/blocks/model_list.nav_menu.bookmarks.html:22 +msgid "New Bookmark" +msgstr "" + +#: templates/xadmin/blocks/model_list.nav_menu.bookmarks.html:26 +msgid "Save current page as Bookmark" +msgstr "" + +#: templates/xadmin/blocks/model_list.nav_menu.bookmarks.html:32 +msgid "Enter bookmark title" +msgstr "" + +#: templates/xadmin/blocks/model_list.nav_menu.bookmarks.html:33 +msgid "Waiting" +msgstr "" + +#: templates/xadmin/blocks/model_list.nav_menu.bookmarks.html:33 +msgid "Save Bookmark" +msgstr "" + +#: templates/xadmin/blocks/model_list.nav_menu.filters.html:4 +msgid "Filters" +msgstr "" + +#: templates/xadmin/blocks/model_list.nav_menu.filters.html:8 +msgid "Clean Filters" +msgstr "" + +#: templates/xadmin/blocks/model_list.results_bottom.actions.html:19 +msgid "Click here to select the objects across all pages" +msgstr "" + +#: templates/xadmin/blocks/model_list.results_bottom.actions.html:19 +#, python-format +msgid "Select all %(total_count)s %(model_name)s" +msgstr "" + +#: templates/xadmin/blocks/model_list.results_bottom.actions.html:20 +msgid "Clear selection" +msgstr "" + +#: templates/xadmin/blocks/model_list.results_top.charts.html:4 +msgid "Charts" +msgstr "" + +#: templates/xadmin/blocks/model_list.top_toolbar.exports.html:4 +#: templates/xadmin/blocks/model_list.top_toolbar.exports.html:8 +#: templates/xadmin/blocks/model_list.top_toolbar.exports.html:19 +#: templates/xadmin/blocks/model_list.top_toolbar.exports.html:47 +msgid "Export" +msgstr "" + +#: templates/xadmin/blocks/model_list.top_toolbar.exports.html:26 +#: templates/xadmin/blocks/model_list.top_toolbar.exports.html:29 +#: templates/xadmin/blocks/model_list.top_toolbar.exports.html:32 +msgid "Export with table header." +msgstr "" + +#: templates/xadmin/blocks/model_list.top_toolbar.exports.html:35 +#: templates/xadmin/blocks/model_list.top_toolbar.exports.html:38 +msgid "Export with format." +msgstr "" + +#: templates/xadmin/blocks/model_list.top_toolbar.exports.html:42 +msgid "Export all data." +msgstr "" + +#: templates/xadmin/blocks/model_list.top_toolbar.exports.html:46 +#: templates/xadmin/widgets/base.html:41 +msgid "Close" +msgstr "" + +#: templates/xadmin/blocks/model_list.top_toolbar.layouts.html:4 +msgid "Layout" +msgstr "" + +#: templates/xadmin/blocks/model_list.top_toolbar.refresh.html:8 +msgid "Clean Refresh" +msgstr "" + +#: templates/xadmin/blocks/model_list.top_toolbar.refresh.html:14 +#, python-format +msgid "Every %(t)s seconds" +msgstr "" + +#: templates/xadmin/blocks/model_list.top_toolbar.saveorder.html:4 +msgid "Save Order" +msgstr "" + +#: templates/xadmin/edit_inline/blank.html:5 views/detail.py:23 +#: views/edit.py:102 views/list.py:29 +msgid "Null" +msgstr "" + +#: templates/xadmin/filters/char.html:13 +msgid "Enter" +msgstr "" + +#: templates/xadmin/filters/date.html:10 templates/xadmin/filters/date.html:13 +msgid "Choice Date" +msgstr "" + +#: templates/xadmin/filters/date.html:18 +msgid "YY" +msgstr "" + +#: templates/xadmin/filters/date.html:19 +msgid "year" +msgstr "" + +#: templates/xadmin/filters/date.html:22 +msgid "MM" +msgstr "" + +#: templates/xadmin/filters/date.html:23 +msgid "month" +msgstr "" + +#: templates/xadmin/filters/date.html:26 +msgid "DD" +msgstr "" + +#: templates/xadmin/filters/date.html:27 +msgid "day" +msgstr "" + +#: templates/xadmin/filters/date.html:29 templates/xadmin/filters/date.html:46 +#: templates/xadmin/filters/date.html:54 +#: templates/xadmin/filters/fk_search.html:24 +#: templates/xadmin/filters/number.html:37 +msgid "Apply" +msgstr "" + +#: templates/xadmin/filters/date.html:34 +msgid "Date Range" +msgstr "" + +#: templates/xadmin/filters/date.html:41 +msgid "Select Date" +msgstr "" + +#: templates/xadmin/filters/date.html:42 +msgid "From" +msgstr "" + +#: templates/xadmin/filters/date.html:44 +msgid "To" +msgstr "" + +#: templates/xadmin/filters/fk_search.html:14 +msgid "Select" +msgstr "" + +#: templates/xadmin/filters/fk_search.html:26 +#: templates/xadmin/filters/number.html:39 +msgid "Clean" +msgstr "" + +#: templates/xadmin/filters/number.html:17 +#: templates/xadmin/filters/number.html:25 +#: templates/xadmin/filters/number.html:33 +msgid "Enter Number" +msgstr "" + +#: templates/xadmin/filters/rel.html:3 +#, python-format +msgid " By %(filter_title)s " +msgstr "" + +#: templates/xadmin/forms/transfer.html:4 +msgid "Available" +msgstr "" + +#: templates/xadmin/forms/transfer.html:12 +msgid "Click to choose all at once." +msgstr "" + +#: templates/xadmin/forms/transfer.html:12 +msgid "Choose all" +msgstr "" + +#: templates/xadmin/forms/transfer.html:16 +msgid "Choose" +msgstr "" + +#: templates/xadmin/forms/transfer.html:19 +#: templates/xadmin/widgets/base.html:40 +msgid "Remove" +msgstr "" + +#: templates/xadmin/forms/transfer.html:23 +msgid "Chosen" +msgstr "" + +#: templates/xadmin/forms/transfer.html:27 +msgid "Click to remove all chosen at once." +msgstr "" + +#: templates/xadmin/forms/transfer.html:27 +msgid "Remove all" +msgstr "" + +#: templates/xadmin/includes/pagination.html:9 +msgid "Show all" +msgstr "" + +#: templates/xadmin/includes/submit_line.html:10 +#: templates/xadmin/includes/submit_line.html:13 +#: templates/xadmin/views/form.html:30 templates/xadmin/views/form.html:31 +msgid "Saving.." +msgstr "" + +#: templates/xadmin/includes/submit_line.html:17 +msgid "Save as new" +msgstr "" + +#: templates/xadmin/includes/submit_line.html:18 +msgid "Save and add another" +msgstr "" + +#: templates/xadmin/includes/submit_line.html:19 +msgid "Save and continue editing" +msgstr "" + +#: templates/xadmin/includes/submit_line.html:24 +#: templates/xadmin/views/model_detail.html:28 views/delete.py:93 +msgid "Delete" +msgstr "" + +#: templates/xadmin/views/app_index.html:13 +#, python-format +msgid "%(name)s" +msgstr "" + +#: templates/xadmin/views/batch_change_form.html:11 +msgid "Change multiple objects" +msgstr "" + +#: templates/xadmin/views/batch_change_form.html:16 +#, python-format +msgid "Change one %(objects_name)s" +msgid_plural "Batch change %(counter)s %(objects_name)s" +msgstr[0] "" +msgstr[1] "" +msgstr[2] "" + +#: templates/xadmin/views/batch_change_form.html:38 +msgid "Change Multiple" +msgstr "" + +#: templates/xadmin/views/dashboard.html:15 +#: templates/xadmin/views/dashboard.html:22 +#: templates/xadmin/views/dashboard.html:23 +msgid "Add Widget" +msgstr "" + +#: templates/xadmin/views/invalid_setup.html:13 +msgid "" +"Something's wrong with your database installation. Make sure the appropriate " +"database tables have been created, and make sure the database is readable by " +"the appropriate user." +msgstr "" + +#: templates/xadmin/views/logged_out.html:16 +msgid "Logout Success" +msgstr "" + +#: templates/xadmin/views/logged_out.html:17 +msgid "Thanks for spending some quality time with the Web site today." +msgstr "" + +#: templates/xadmin/views/logged_out.html:19 +msgid "Close Window" +msgstr "" + +#: templates/xadmin/views/logged_out.html:20 +msgid "Log in again" +msgstr "" + +#: templates/xadmin/views/login.html:39 views/website.py:38 +msgid "Please Login" +msgstr "" + +#: templates/xadmin/views/login.html:52 +msgid "Username" +msgstr "" + +#: templates/xadmin/views/login.html:64 +msgid "Password" +msgstr "" + +#: templates/xadmin/views/login.html:75 +msgid "log in" +msgstr "" + +#: templates/xadmin/views/model_dashboard.html:26 +#: templates/xadmin/views/model_detail.html:25 +msgid "Edit" +msgstr "" + +#: templates/xadmin/views/model_delete_confirm.html:11 +#, python-format +msgid "" +"Deleting the %(verbose_name)s '%(escaped_object)s' would result in deleting " +"related objects, but your account doesn't have permission to delete the " +"following types of objects:" +msgstr "" + +#: templates/xadmin/views/model_delete_confirm.html:19 +#, python-format +msgid "" +"Deleting the %(verbose_name)s '%(escaped_object)s' would require deleting " +"the following protected related objects:" +msgstr "" + +#: templates/xadmin/views/model_delete_confirm.html:27 +#, python-format +msgid "" +"Are you sure you want to delete the %(verbose_name)s \"%(escaped_object)s\"? " +"All of the following related items will be deleted:" +msgstr "" + +#: templates/xadmin/views/model_delete_confirm.html:34 +#: templates/xadmin/views/model_delete_selected_confirm.html:49 +msgid "Yes, I'm sure" +msgstr "" + +#: templates/xadmin/views/model_delete_confirm.html:35 +#: templates/xadmin/views/model_delete_selected_confirm.html:50 +msgid "Cancel" +msgstr "" + +#: templates/xadmin/views/model_delete_selected_confirm.html:10 +msgid "Delete multiple objects" +msgstr "" + +#: templates/xadmin/views/model_delete_selected_confirm.html:18 +#, python-format +msgid "" +"Deleting the selected %(objects_name)s would result in deleting related " +"objects, but your account doesn't have permission to delete the following " +"types of objects:" +msgstr "" + +#: templates/xadmin/views/model_delete_selected_confirm.html:26 +#, python-format +msgid "" +"Deleting the selected %(objects_name)s would require deleting the following " +"protected related objects:" +msgstr "" + +#: templates/xadmin/views/model_delete_selected_confirm.html:34 +#, python-format +msgid "" +"Are you sure you want to delete the selected %(objects_name)s? All of the " +"following objects and their related items will be deleted:" +msgstr "" + +#: templates/xadmin/views/model_history.html:26 +msgid "Diff" +msgstr "" + +#: templates/xadmin/views/model_history.html:27 +#: templates/xadmin/views/recover_list.html:25 +msgid "Date/time" +msgstr "" + +#: templates/xadmin/views/model_history.html:28 +msgid "User" +msgstr "" + +#: templates/xadmin/views/model_history.html:29 +msgid "Comment" +msgstr "" + +#: templates/xadmin/views/model_history.html:54 +msgid "Diff Select Versions" +msgstr "" + +#: templates/xadmin/views/model_history.html:58 +msgid "" +"This object doesn't have a change history. It probably wasn't added via this " +"admin site." +msgstr "" + +#: templates/xadmin/views/model_list.html:29 +#, python-format +msgid "Add %(name)s" +msgstr "" + +#: templates/xadmin/views/model_list.html:39 +msgid "Columns" +msgstr "" + +#: templates/xadmin/views/model_list.html:42 +msgid "Restore Selected" +msgstr "" + +#: templates/xadmin/views/model_list.html:147 +#: templates/xadmin/widgets/list.html:33 +msgid "Empty list" +msgstr "" + +#: templates/xadmin/views/recover_form.html:20 +msgid "Press the recover button below to recover this version of the object." +msgstr "" + +#: templates/xadmin/views/recover_list.html:19 +msgid "" +"Choose a date from the list below to recover a deleted version of an object." +msgstr "" + +#: templates/xadmin/views/recover_list.html:39 +msgid "There are no deleted objects to recover." +msgstr "" + +#: templates/xadmin/views/revision_diff.html:12 +#: templates/xadmin/views/revision_diff.html:17 +#, python-format +msgid "Diff %(verbose_name)s" +msgstr "" + +#: templates/xadmin/views/revision_diff.html:25 +msgid "Field" +msgstr "" + +#: templates/xadmin/views/revision_diff.html:26 +msgid "Version A" +msgstr "" + +#: templates/xadmin/views/revision_diff.html:27 +msgid "Version B" +msgstr "" + +#: templates/xadmin/views/revision_diff.html:39 +msgid "Revert to" +msgstr "" + +#: templates/xadmin/views/revision_diff.html:40 +#: templates/xadmin/views/revision_diff.html:41 +msgid "Revert" +msgstr "" + +#: templates/xadmin/views/revision_form.html:16 +#, python-format +msgid "Revert %(verbose_name)s" +msgstr "" + +#: templates/xadmin/views/revision_form.html:21 +msgid "Press the revert button below to revert to this version of the object." +msgstr "" + +#: templates/xadmin/views/revision_form.html:27 +msgid "Revert this revision" +msgstr "" + +#: templates/xadmin/widgets/addform.html:14 +msgid "Success" +msgstr "" + +#: templates/xadmin/widgets/addform.html:14 +msgid "Add success, click edit to edit." +msgstr "" + +#: templates/xadmin/widgets/addform.html:17 +msgid "Quick Add" +msgstr "" + +#: templates/xadmin/widgets/base.html:31 +msgid "Widget Options" +msgstr "" + +#: templates/xadmin/widgets/base.html:42 +msgid "Save changes" +msgstr "" + +#: views/base.py:315 +msgid "Django Xadmin" +msgstr "" + +#: views/base.py:316 +msgid "my-company.inc" +msgstr "" + +#: views/dashboard.py:186 +msgid "Widget ID" +msgstr "" + +#: views/dashboard.py:187 +msgid "Widget Title" +msgstr "" + +#: views/dashboard.py:252 +msgid "Html Content Widget, can write any html content in widget." +msgstr "" + +#: views/dashboard.py:255 +msgid "Html Content" +msgstr "" + +#: views/dashboard.py:318 +msgid "Target Model" +msgstr "" + +#: views/dashboard.py:369 +msgid "Quick button Widget, quickly open any page." +msgstr "" + +#: views/dashboard.py:371 +msgid "Quick Buttons" +msgstr "" + +#: views/dashboard.py:416 +msgid "Any Objects list Widget." +msgstr "" + +#: views/dashboard.py:456 +msgid "Add any model object Widget." +msgstr "" + +#: views/dashboard.py:492 +msgid "Dashboard" +msgstr "" + +#: views/dashboard.py:633 +#, python-format +msgid "%s Dashboard" +msgstr "" + +#: views/delete.py:103 +#, python-format +msgid "The %(name)s \"%(obj)s\" was deleted successfully." +msgstr "" + +#: views/detail.py:173 views/edit.py:211 views/form.py:72 +msgid "Other Fields" +msgstr "" + +#: views/detail.py:235 +#, python-format +msgid "%s Detail" +msgstr "" + +#: views/edit.py:253 +msgid "Added." +msgstr "" + +#: views/edit.py:255 +#, python-format +msgid "Changed %s." +msgstr "" + +#: views/edit.py:255 +msgid "and" +msgstr "" + +#: views/edit.py:258 +msgid "No fields changed." +msgstr "" + +#: views/edit.py:420 +#, python-format +msgid "The %(name)s \"%(obj)s\" was added successfully." +msgstr "" + +#: views/edit.py:425 views/edit.py:520 +msgid "You may edit it again below." +msgstr "" + +#: views/edit.py:429 views/edit.py:523 +#, python-format +msgid "You may add another %s below." +msgstr "" + +#: views/edit.py:471 +#, python-format +msgid "Change %s" +msgstr "" + +#: views/edit.py:516 +#, python-format +msgid "The %(name)s \"%(obj)s\" was changed successfully." +msgstr "" + +#: views/form.py:165 +#, python-format +msgid "The %s was changed successfully." +msgstr "" + +#: views/list.py:199 +msgid "Database error" +msgstr "" + +#: views/list.py:373 +#, python-format +msgid "%s List" +msgstr "" + +#: views/list.py:499 +msgid "Sort ASC" +msgstr "" + +#: views/list.py:500 +msgid "Sort DESC" +msgstr "" + +#: views/list.py:504 +msgid "Cancel Sort" +msgstr "" + +#: views/website.py:16 +msgid "Main Dashboard" +msgstr "" + +#: widgets.py:48 +msgid "Now" +msgstr "" diff --git "a/8\343\200\201\346\226\207\347\214\256\346\225\260\346\215\256\346\214\226\346\216\230\347\263\273\347\273\237(\351\231\204\346\272\220\347\240\201)/extra_apps/xadmin/locale/lt/LC_MESSAGES/djangojs.mo" "b/8\343\200\201\346\226\207\347\214\256\346\225\260\346\215\256\346\214\226\346\216\230\347\263\273\347\273\237(\351\231\204\346\272\220\347\240\201)/extra_apps/xadmin/locale/lt/LC_MESSAGES/djangojs.mo" new file mode 100644 index 0000000..6b387a7 Binary files /dev/null and "b/8\343\200\201\346\226\207\347\214\256\346\225\260\346\215\256\346\214\226\346\216\230\347\263\273\347\273\237(\351\231\204\346\272\220\347\240\201)/extra_apps/xadmin/locale/lt/LC_MESSAGES/djangojs.mo" differ diff --git "a/8\343\200\201\346\226\207\347\214\256\346\225\260\346\215\256\346\214\226\346\216\230\347\263\273\347\273\237(\351\231\204\346\272\220\347\240\201)/extra_apps/xadmin/locale/lt/LC_MESSAGES/djangojs.po" "b/8\343\200\201\346\226\207\347\214\256\346\225\260\346\215\256\346\214\226\346\216\230\347\263\273\347\273\237(\351\231\204\346\272\220\347\240\201)/extra_apps/xadmin/locale/lt/LC_MESSAGES/djangojs.po" new file mode 100644 index 0000000..6e691a6 --- /dev/null +++ "b/8\343\200\201\346\226\207\347\214\256\346\225\260\346\215\256\346\214\226\346\216\230\347\263\273\347\273\237(\351\231\204\346\272\220\347\240\201)/extra_apps/xadmin/locale/lt/LC_MESSAGES/djangojs.po" @@ -0,0 +1,71 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER +# This file is distributed under the same license as the PACKAGE package. +# +# Translators: +msgid "" +msgstr "" +"Project-Id-Version: xadmin-core\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2013-04-30 23:11+0800\n" +"PO-Revision-Date: 2013-11-20 12:41+0000\n" +"Last-Translator: sshwsfc \n" +"Language-Team: Lithuanian (http://www.transifex.com/projects/p/xadmin/language/lt/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: lt\n" +"Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && (n%100<10 || n%100>=20) ? 1 : 2);\n" + +#: static/xadmin/js/xadmin.plugin.actions.js:20 +msgid "%(sel)s of %(cnt)s selected" +msgid_plural "%(sel)s of %(cnt)s selected" +msgstr[0] "" +msgstr[1] "" +msgstr[2] "" + +#: static/xadmin/js/xadmin.plugin.revision.js:25 +msgid "New Item" +msgstr "" + +#: static/xadmin/js/xadmin.widget.datetime.js:32 +msgid "Sunday Monday Tuesday Wednesday Thursday Friday Saturday Sunday" +msgstr "" + +#: static/xadmin/js/xadmin.widget.datetime.js:33 +msgid "Sun Mon Tue Wed Thu Fri Sat Sun" +msgstr "" + +#: static/xadmin/js/xadmin.widget.datetime.js:34 +msgid "Su Mo Tu We Th Fr Sa Su" +msgstr "" + +#: static/xadmin/js/xadmin.widget.datetime.js:35 +msgid "" +"January February March April May June July August September October November" +" December" +msgstr "" + +#: static/xadmin/js/xadmin.widget.datetime.js:36 +msgid "Jan Feb Mar Apr May Jun Jul Aug Sep Oct Nov Dec" +msgstr "" + +#: static/xadmin/js/xadmin.widget.datetime.js:37 +msgid "Today" +msgstr "" + +#: static/xadmin/js/xadmin.widget.datetime.js:38 +msgid "%a %d %b %Y %T %Z" +msgstr "" + +#: static/xadmin/js/xadmin.widget.datetime.js:39 +msgid "AM PM" +msgstr "" + +#: static/xadmin/js/xadmin.widget.datetime.js:40 +msgid "am pm" +msgstr "" + +#: static/xadmin/js/xadmin.widget.datetime.js:43 +msgid "%T" +msgstr "" diff --git "a/8\343\200\201\346\226\207\347\214\256\346\225\260\346\215\256\346\214\226\346\216\230\347\263\273\347\273\237(\351\231\204\346\272\220\347\240\201)/extra_apps/xadmin/locale/nl_NL/LC_MESSAGES/django.mo" "b/8\343\200\201\346\226\207\347\214\256\346\225\260\346\215\256\346\214\226\346\216\230\347\263\273\347\273\237(\351\231\204\346\272\220\347\240\201)/extra_apps/xadmin/locale/nl_NL/LC_MESSAGES/django.mo" new file mode 100644 index 0000000..f197a00 Binary files /dev/null and "b/8\343\200\201\346\226\207\347\214\256\346\225\260\346\215\256\346\214\226\346\216\230\347\263\273\347\273\237(\351\231\204\346\272\220\347\240\201)/extra_apps/xadmin/locale/nl_NL/LC_MESSAGES/django.mo" differ diff --git "a/8\343\200\201\346\226\207\347\214\256\346\225\260\346\215\256\346\214\226\346\216\230\347\263\273\347\273\237(\351\231\204\346\272\220\347\240\201)/extra_apps/xadmin/locale/nl_NL/LC_MESSAGES/django.po" "b/8\343\200\201\346\226\207\347\214\256\346\225\260\346\215\256\346\214\226\346\216\230\347\263\273\347\273\237(\351\231\204\346\272\220\347\240\201)/extra_apps/xadmin/locale/nl_NL/LC_MESSAGES/django.po" new file mode 100644 index 0000000..b783286 --- /dev/null +++ "b/8\343\200\201\346\226\207\347\214\256\346\225\260\346\215\256\346\214\226\346\216\230\347\263\273\347\273\237(\351\231\204\346\272\220\347\240\201)/extra_apps/xadmin/locale/nl_NL/LC_MESSAGES/django.po" @@ -0,0 +1,1410 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER +# This file is distributed under the same license as the PACKAGE package. +# +# Translators: +msgid "" +msgstr "" +"Project-Id-Version: xadmin-core\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2016-07-20 13:28+0800\n" +"PO-Revision-Date: 2013-11-20 10:21+0000\n" +"Last-Translator: sshwsfc \n" +"Language-Team: Dutch (Netherlands) (http://www.transifex.com/projects/p/" +"xadmin/language/nl_NL/)\n" +"Language: nl_NL\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +#: adminx.py:19 +msgid "Admin Object" +msgstr "" + +#: apps.py:11 +msgid "Administration" +msgstr "" + +#: filters.py:159 filters.py:191 filters.py:407 filters.py:493 filters.py:531 +msgid "All" +msgstr "" + +#: filters.py:160 plugins/export.py:165 +msgid "Yes" +msgstr "" + +#: filters.py:161 plugins/export.py:165 +msgid "No" +msgstr "" + +#: filters.py:175 +msgid "Unknown" +msgstr "" + +#: filters.py:267 +msgid "Any date" +msgstr "" + +#: filters.py:268 +msgid "Has date" +msgstr "" + +#: filters.py:271 +msgid "Has no date" +msgstr "" + +#: filters.py:274 widgets.py:30 +msgid "Today" +msgstr "" + +#: filters.py:278 +msgid "Past 7 days" +msgstr "" + +#: filters.py:282 +msgid "This month" +msgstr "" + +#: filters.py:286 +msgid "This year" +msgstr "" + +#: forms.py:10 +msgid "" +"Please enter the correct username and password for a staff account. Note " +"that both fields are case-sensitive." +msgstr "" + +#: forms.py:21 +msgid "Please log in again, because your session has expired." +msgstr "" + +#: forms.py:41 +#, python-format +msgid "Your e-mail address is not your username. Try '%s' instead." +msgstr "" + +#: models.py:48 +msgid "Title" +msgstr "" + +#: models.py:49 models.py:88 models.py:107 models.py:149 +msgid "user" +msgstr "" + +#: models.py:50 +msgid "Url Name" +msgstr "" + +#: models.py:52 +msgid "Query String" +msgstr "" + +#: models.py:53 +msgid "Is Shared" +msgstr "" + +#: models.py:66 plugins/bookmark.py:50 plugins/bookmark.py:180 +msgid "Bookmark" +msgstr "" + +#: models.py:67 +msgid "Bookmarks" +msgstr "" + +#: models.py:89 +msgid "Settings Key" +msgstr "" + +#: models.py:90 +msgid "Settings Content" +msgstr "" + +#: models.py:102 +msgid "User Setting" +msgstr "" + +#: models.py:103 +msgid "User Settings" +msgstr "" + +#: models.py:108 +msgid "Page" +msgstr "" + +#: models.py:109 views/dashboard.py:82 views/dashboard.py:92 +msgid "Widget Type" +msgstr "" + +#: models.py:110 views/dashboard.py:83 +msgid "Widget Params" +msgstr "" + +#: models.py:137 +msgid "User Widget" +msgstr "" + +#: models.py:138 +msgid "User Widgets" +msgstr "" + +#: models.py:142 +msgid "action time" +msgstr "" + +#: models.py:151 +msgid "action ip" +msgstr "" + +#: models.py:155 +msgid "content type" +msgstr "" + +#: models.py:158 +msgid "object id" +msgstr "" + +#: models.py:159 +msgid "object repr" +msgstr "" + +#: models.py:160 +msgid "action flag" +msgstr "" + +#: models.py:161 +msgid "change message" +msgstr "" + +#: models.py:164 +msgid "log entry" +msgstr "" + +#: models.py:165 +msgid "log entries" +msgstr "" + +#: models.py:173 +#, python-format +msgid "Added \"%(object)s\"." +msgstr "" + +#: models.py:175 +#, python-format +msgid "Changed \"%(object)s\" - %(changes)s" +msgstr "" + +#: models.py:180 +#, python-format +msgid "Deleted \"%(object)s.\"" +msgstr "" + +#: plugins/actions.py:57 +#, python-format +msgid "Delete selected %(verbose_name_plural)s" +msgstr "" + +#: plugins/actions.py:72 +#, python-format +msgid "Batch delete %(count)d %(items)s." +msgstr "" + +#: plugins/actions.py:78 +#, python-format +msgid "Successfully deleted %(count)d %(items)s." +msgstr "" + +#: plugins/actions.py:110 views/delete.py:70 +#, python-format +msgid "Cannot delete %(name)s" +msgstr "" + +#: plugins/actions.py:112 views/delete.py:73 +msgid "Are you sure?" +msgstr "" + +#: plugins/actions.py:158 +#, python-format +msgid "%(total_count)s selected" +msgid_plural "All %(total_count)s selected" +msgstr[0] "" +msgstr[1] "" + +#: plugins/actions.py:162 +#, python-format +msgid "0 of %(cnt)s selected" +msgstr "" + +#: plugins/actions.py:179 plugins/actions.py:189 +msgid "" +"Items must be selected in order to perform actions on them. No items have " +"been changed." +msgstr "" + +#: plugins/aggregation.py:14 +msgid "Min" +msgstr "" + +#: plugins/aggregation.py:14 +msgid "Max" +msgstr "" + +#: plugins/aggregation.py:14 +msgid "Avg" +msgstr "" + +#: plugins/aggregation.py:14 +msgid "Sum" +msgstr "" + +#: plugins/aggregation.py:14 +msgid "Count" +msgstr "" + +#: plugins/auth.py:21 +#, python-format +msgid "Can add %s" +msgstr "" + +#: plugins/auth.py:22 +#, python-format +msgid "Can change %s" +msgstr "" + +#: plugins/auth.py:23 +#, python-format +msgid "Can edit %s" +msgstr "" + +#: plugins/auth.py:24 +#, python-format +msgid "Can delete %s" +msgstr "" + +#: plugins/auth.py:25 +#, python-format +msgid "Can view %s" +msgstr "" + +#: plugins/auth.py:87 +msgid "Personal info" +msgstr "" + +#: plugins/auth.py:91 +msgid "Permissions" +msgstr "" + +#: plugins/auth.py:94 +msgid "Important dates" +msgstr "" + +#: plugins/auth.py:99 +msgid "Status" +msgstr "" + +#: plugins/auth.py:111 +msgid "Permission Name" +msgstr "" + +#: plugins/auth.py:167 +msgid "Change Password" +msgstr "" + +#: plugins/auth.py:198 +#, python-format +msgid "Change password: %s" +msgstr "" + +#: plugins/auth.py:223 plugins/auth.py:255 +msgid "Password changed successfully." +msgstr "" + +#: plugins/auth.py:242 templates/xadmin/auth/user/change_password.html:11 +#: templates/xadmin/auth/user/change_password.html:22 +#: templates/xadmin/auth/user/change_password.html:55 +msgid "Change password" +msgstr "" + +#: plugins/batch.py:44 +msgid "Change this field" +msgstr "" + +#: plugins/batch.py:65 +#, python-format +msgid "Batch Change selected %(verbose_name_plural)s" +msgstr "" + +#: plugins/batch.py:89 +#, python-format +msgid "Successfully change %(count)d %(items)s." +msgstr "" + +#: plugins/batch.py:138 +#, python-format +msgid "Batch change %s" +msgstr "" + +#: plugins/bookmark.py:173 +msgid "bookmark" +msgstr "" + +#: plugins/bookmark.py:176 +msgid "Bookmark Widget, can show user's bookmark list data in widget." +msgstr "" + +#: plugins/chart.py:25 +msgid "Show models simple chart." +msgstr "" + +#: plugins/chart.py:51 +#, python-format +msgid "%s Charts" +msgstr "" + +#: plugins/comments.py:33 +msgid "Metadata" +msgstr "" + +#: plugins/comments.py:60 +msgid "flagged" +msgid_plural "flagged" +msgstr[0] "" +msgstr[1] "" + +#: plugins/comments.py:61 +msgid "Flag selected comments" +msgstr "" + +#: plugins/comments.py:66 +msgid "approved" +msgid_plural "approved" +msgstr[0] "" +msgstr[1] "" + +#: plugins/comments.py:67 +msgid "Approve selected comments" +msgstr "" + +#: plugins/comments.py:72 +msgid "removed" +msgid_plural "removed" +msgstr[0] "" +msgstr[1] "" + +#: plugins/comments.py:73 +msgid "Remove selected comments" +msgstr "" + +#: plugins/comments.py:86 +#, python-format +msgid "1 comment was successfully %(action)s." +msgid_plural "%(count)s comments were successfully %(action)s." +msgstr[0] "" +msgstr[1] "" + +#: plugins/details.py:52 views/list.py:578 +#, python-format +msgid "Details of %s" +msgstr "" + +#: plugins/editable.py:46 +#, python-format +msgid "Enter %s" +msgstr "" + +#: plugins/editable.py:73 views/dashboard.py:649 views/delete.py:27 +#: views/detail.py:145 views/edit.py:454 +#, python-format +msgid "%(name)s object with primary key %(key)r does not exist." +msgstr "" + +#: plugins/export.py:98 plugins/export.py:135 +msgid "Sheet" +msgstr "" + +#: plugins/filters.py:133 plugins/quickfilter.py:141 +#, python-format +msgid "Filtering error: %s" +msgstr "" + +#: plugins/images.py:29 +msgid "Previous" +msgstr "" + +#: plugins/images.py:29 +msgid "Next" +msgstr "" + +#: plugins/images.py:29 +msgid "Slideshow" +msgstr "" + +#: plugins/images.py:29 +msgid "Download" +msgstr "" + +#: plugins/images.py:50 +msgid "Change:" +msgstr "" + +#: plugins/layout.py:16 +msgid "Table" +msgstr "" + +#: plugins/layout.py:22 +msgid "Thumbnails" +msgstr "" + +#: plugins/passwords.py:64 +msgid "Forgotten your password or username?" +msgstr "" + +#: plugins/quickform.py:79 +#, python-format +msgid "Create New %s" +msgstr "" + +#: plugins/relate.py:104 +msgid "Related Objects" +msgstr "" + +#: plugins/relfield.py:29 plugins/topnav.py:38 +#, python-format +msgid "Search %s" +msgstr "" + +#: plugins/relfield.py:67 +#, python-format +msgid "Select %s" +msgstr "" + +#: plugins/themes.py:47 +msgid "Default" +msgstr "" + +#: plugins/themes.py:48 +msgid "Default bootstrap theme" +msgstr "" + +#: plugins/themes.py:49 +msgid "Bootstrap2" +msgstr "" + +#: plugins/themes.py:49 +msgid "Bootstrap 2.x theme" +msgstr "" + +#: plugins/topnav.py:62 views/dashboard.py:465 views/edit.py:387 +#: views/edit.py:396 +#, python-format +msgid "Add %s" +msgstr "" + +#: plugins/xversion.py:106 +msgid "Initial version." +msgstr "" + +#: plugins/xversion.py:108 +msgid "Change version." +msgstr "" + +#: plugins/xversion.py:110 +msgid "Revert version." +msgstr "" + +#: plugins/xversion.py:112 +msgid "Rercover version." +msgstr "" + +#: plugins/xversion.py:114 +#, python-format +msgid "Deleted %(verbose_name)s." +msgstr "" + +#: plugins/xversion.py:127 templates/xadmin/views/recover_form.html:26 +msgid "Recover" +msgstr "" + +#: plugins/xversion.py:143 templates/xadmin/views/model_history.html:11 +#: templates/xadmin/views/revision_diff.html:11 +#: templates/xadmin/views/revision_form.html:15 +msgid "History" +msgstr "" + +#: plugins/xversion.py:194 templates/xadmin/views/recover_form.html:14 +#: templates/xadmin/views/recover_list.html:10 +#, python-format +msgid "Recover deleted %(name)s" +msgstr "" + +#: plugins/xversion.py:238 +#, python-format +msgid "Change history: %s" +msgstr "" + +#: plugins/xversion.py:288 +msgid "Must select two versions." +msgstr "" + +#: plugins/xversion.py:296 +msgid "Please select two different versions." +msgstr "" + +#: plugins/xversion.py:383 plugins/xversion.py:500 +#, python-format +msgid "Current: %s" +msgstr "" + +#: plugins/xversion.py:424 +#, python-format +msgid "Revert %s" +msgstr "" + +#: plugins/xversion.py:440 +#, python-format +msgid "" +"The %(model)s \"%(name)s\" was reverted successfully. You may edit it again " +"below." +msgstr "" + +#: plugins/xversion.py:461 +#, python-format +msgid "Recover %s" +msgstr "" + +#: plugins/xversion.py:477 +#, python-format +msgid "" +"The %(model)s \"%(name)s\" was recovered successfully. You may edit it again " +"below." +msgstr "" + +#: templates/xadmin/404.html:4 templates/xadmin/404.html:8 +msgid "Page not found" +msgstr "" + +#: templates/xadmin/404.html:10 +msgid "We're sorry, but the requested page could not be found." +msgstr "" + +#: templates/xadmin/500.html:7 +#: templates/xadmin/auth/user/change_password.html:10 +#: templates/xadmin/auth/user/change_password.html:15 +#: templates/xadmin/base_site.html:53 +#: templates/xadmin/includes/sitemenu_default.html:7 +#: templates/xadmin/views/app_index.html:9 +#: templates/xadmin/views/batch_change_form.html:9 +#: templates/xadmin/views/invalid_setup.html:7 +#: templates/xadmin/views/model_dashboard.html:7 +#: templates/xadmin/views/model_delete_selected_confirm.html:8 +#: templates/xadmin/views/model_history.html:8 +#: templates/xadmin/views/recover_form.html:8 +#: templates/xadmin/views/recover_list.html:8 +#: templates/xadmin/views/revision_diff.html:8 +#: templates/xadmin/views/revision_form.html:8 views/base.py:473 +msgid "Home" +msgstr "" + +#: templates/xadmin/500.html:8 +msgid "Server error" +msgstr "" + +#: templates/xadmin/500.html:12 +msgid "Server error (500)" +msgstr "" + +#: templates/xadmin/500.html:15 +msgid "Server Error (500)" +msgstr "" + +#: templates/xadmin/500.html:16 +msgid "" +"There's been an error. It's been reported to the site administrators via e-" +"mail and should be fixed shortly. Thanks for your patience." +msgstr "" + +#: templates/xadmin/auth/password_reset/complete.html:11 +#: templates/xadmin/auth/password_reset/done.html:11 +msgid "Password reset successful" +msgstr "" + +#: templates/xadmin/auth/password_reset/complete.html:14 +msgid "Your password has been set. You may go ahead and log in now." +msgstr "" + +#: templates/xadmin/auth/password_reset/complete.html:15 +msgid "Log in" +msgstr "" + +#: templates/xadmin/auth/password_reset/confirm.html:12 +msgid "Enter new password" +msgstr "" + +#: templates/xadmin/auth/password_reset/confirm.html:17 +msgid "" +"Please enter your new password twice so we can verify you typed it in " +"correctly." +msgstr "" + +#: templates/xadmin/auth/password_reset/confirm.html:19 +msgid "Change my password" +msgstr "" + +#: templates/xadmin/auth/password_reset/confirm.html:24 +msgid "Password reset unsuccessful" +msgstr "" + +#: templates/xadmin/auth/password_reset/confirm.html:27 +msgid "" +"The password reset link was invalid, possibly because it has already been " +"used. Please request a new password reset." +msgstr "" + +#: templates/xadmin/auth/password_reset/done.html:14 +msgid "" +"We've e-mailed you instructions for setting your password to the e-mail " +"address you submitted. You should be receiving it shortly." +msgstr "" + +#: templates/xadmin/auth/password_reset/email.html:2 +#, python-format +msgid "" +"You're receiving this e-mail because you requested a password reset for your " +"user account at %(site_name)s." +msgstr "" + +#: templates/xadmin/auth/password_reset/email.html:4 +msgid "Please go to the following page and choose a new password:" +msgstr "" + +#: templates/xadmin/auth/password_reset/email.html:8 +msgid "Your username, in case you've forgotten:" +msgstr "" + +#: templates/xadmin/auth/password_reset/email.html:10 +msgid "Thanks for using our site!" +msgstr "" + +#: templates/xadmin/auth/password_reset/email.html:12 +#, python-format +msgid "The %(site_name)s team" +msgstr "" + +#: templates/xadmin/auth/password_reset/form.html:13 +msgid "Password reset" +msgstr "" + +#: templates/xadmin/auth/password_reset/form.html:17 +msgid "" +"Forgotten your password? Enter your e-mail address below, and we'll e-mail " +"instructions for setting a new one." +msgstr "" + +#: templates/xadmin/auth/password_reset/form.html:25 +msgid "E-mail address:" +msgstr "" + +#: templates/xadmin/auth/password_reset/form.html:33 +msgid "Reset my password" +msgstr "" + +#: templates/xadmin/auth/user/add_form.html:6 +msgid "" +"First, enter a username and password. Then, you'll be able to edit more user " +"options." +msgstr "" + +#: templates/xadmin/auth/user/add_form.html:8 +msgid "Enter a username and password." +msgstr "" + +#: templates/xadmin/auth/user/change_password.html:31 +#: templates/xadmin/views/batch_change_form.html:24 +#: templates/xadmin/views/form.html:18 +#: templates/xadmin/views/model_form.html:20 +msgid "Please correct the error below." +msgid_plural "Please correct the errors below." +msgstr[0] "" +msgstr[1] "" + +#: templates/xadmin/auth/user/change_password.html:38 +msgid "Enter your new password." +msgstr "" + +#: templates/xadmin/auth/user/change_password.html:40 +#, python-format +msgid "Enter a new password for the user %(username)s." +msgstr "" + +#: templates/xadmin/base_site.html:18 +msgid "Welcome," +msgstr "" + +#: templates/xadmin/base_site.html:24 +msgid "Log out" +msgstr "" + +#: templates/xadmin/base_site.html:36 +msgid "You don't have permission to edit anything." +msgstr "" + +#: templates/xadmin/blocks/comm.top.theme.html:4 +msgid "Themes" +msgstr "" + +#: templates/xadmin/blocks/comm.top.topnav.html:9 +#: templates/xadmin/blocks/model_list.nav_form.search_form.html:8 +#: templates/xadmin/filters/char.html:7 +#: templates/xadmin/filters/fk_search.html:7 +#: templates/xadmin/filters/fk_search.html:16 +#: templates/xadmin/filters/number.html:7 +msgid "Search" +msgstr "" + +#: templates/xadmin/blocks/comm.top.topnav.html:23 +msgid "Add" +msgstr "" + +#: templates/xadmin/blocks/model_form.submit_line.wizard.html:9 +#: templates/xadmin/blocks/model_form.submit_line.wizard.html:26 +msgid "Prev step" +msgstr "" + +#: templates/xadmin/blocks/model_form.submit_line.wizard.html:13 +#: templates/xadmin/blocks/model_form.submit_line.wizard.html:29 +msgid "Next step" +msgstr "" + +#: templates/xadmin/blocks/model_form.submit_line.wizard.html:15 +#: templates/xadmin/blocks/model_form.submit_line.wizard.html:31 +#: templates/xadmin/includes/submit_line.html:10 +#: templates/xadmin/includes/submit_line.html:13 +#: templates/xadmin/views/form.html:30 templates/xadmin/views/form.html:31 +msgid "Save" +msgstr "" + +#: templates/xadmin/blocks/model_list.nav_menu.bookmarks.html:7 +msgid "Clean Bookmarks" +msgstr "" + +#: templates/xadmin/blocks/model_list.nav_menu.bookmarks.html:18 +msgid "No Bookmarks" +msgstr "" + +#: templates/xadmin/blocks/model_list.nav_menu.bookmarks.html:22 +msgid "New Bookmark" +msgstr "" + +#: templates/xadmin/blocks/model_list.nav_menu.bookmarks.html:26 +msgid "Save current page as Bookmark" +msgstr "" + +#: templates/xadmin/blocks/model_list.nav_menu.bookmarks.html:32 +msgid "Enter bookmark title" +msgstr "" + +#: templates/xadmin/blocks/model_list.nav_menu.bookmarks.html:33 +msgid "Waiting" +msgstr "" + +#: templates/xadmin/blocks/model_list.nav_menu.bookmarks.html:33 +msgid "Save Bookmark" +msgstr "" + +#: templates/xadmin/blocks/model_list.nav_menu.filters.html:4 +msgid "Filters" +msgstr "" + +#: templates/xadmin/blocks/model_list.nav_menu.filters.html:8 +msgid "Clean Filters" +msgstr "" + +#: templates/xadmin/blocks/model_list.results_bottom.actions.html:19 +msgid "Click here to select the objects across all pages" +msgstr "" + +#: templates/xadmin/blocks/model_list.results_bottom.actions.html:19 +#, python-format +msgid "Select all %(total_count)s %(model_name)s" +msgstr "" + +#: templates/xadmin/blocks/model_list.results_bottom.actions.html:20 +msgid "Clear selection" +msgstr "" + +#: templates/xadmin/blocks/model_list.results_top.charts.html:4 +msgid "Charts" +msgstr "" + +#: templates/xadmin/blocks/model_list.top_toolbar.exports.html:4 +#: templates/xadmin/blocks/model_list.top_toolbar.exports.html:8 +#: templates/xadmin/blocks/model_list.top_toolbar.exports.html:19 +#: templates/xadmin/blocks/model_list.top_toolbar.exports.html:47 +msgid "Export" +msgstr "" + +#: templates/xadmin/blocks/model_list.top_toolbar.exports.html:26 +#: templates/xadmin/blocks/model_list.top_toolbar.exports.html:29 +#: templates/xadmin/blocks/model_list.top_toolbar.exports.html:32 +msgid "Export with table header." +msgstr "" + +#: templates/xadmin/blocks/model_list.top_toolbar.exports.html:35 +#: templates/xadmin/blocks/model_list.top_toolbar.exports.html:38 +msgid "Export with format." +msgstr "" + +#: templates/xadmin/blocks/model_list.top_toolbar.exports.html:42 +msgid "Export all data." +msgstr "" + +#: templates/xadmin/blocks/model_list.top_toolbar.exports.html:46 +#: templates/xadmin/widgets/base.html:41 +msgid "Close" +msgstr "" + +#: templates/xadmin/blocks/model_list.top_toolbar.layouts.html:4 +msgid "Layout" +msgstr "" + +#: templates/xadmin/blocks/model_list.top_toolbar.refresh.html:8 +msgid "Clean Refresh" +msgstr "" + +#: templates/xadmin/blocks/model_list.top_toolbar.refresh.html:14 +#, python-format +msgid "Every %(t)s seconds" +msgstr "" + +#: templates/xadmin/blocks/model_list.top_toolbar.saveorder.html:4 +msgid "Save Order" +msgstr "" + +#: templates/xadmin/edit_inline/blank.html:5 views/detail.py:23 +#: views/edit.py:102 views/list.py:29 +msgid "Null" +msgstr "" + +#: templates/xadmin/filters/char.html:13 +msgid "Enter" +msgstr "" + +#: templates/xadmin/filters/date.html:10 templates/xadmin/filters/date.html:13 +msgid "Choice Date" +msgstr "" + +#: templates/xadmin/filters/date.html:18 +msgid "YY" +msgstr "" + +#: templates/xadmin/filters/date.html:19 +msgid "year" +msgstr "" + +#: templates/xadmin/filters/date.html:22 +msgid "MM" +msgstr "" + +#: templates/xadmin/filters/date.html:23 +msgid "month" +msgstr "" + +#: templates/xadmin/filters/date.html:26 +msgid "DD" +msgstr "" + +#: templates/xadmin/filters/date.html:27 +msgid "day" +msgstr "" + +#: templates/xadmin/filters/date.html:29 templates/xadmin/filters/date.html:46 +#: templates/xadmin/filters/date.html:54 +#: templates/xadmin/filters/fk_search.html:24 +#: templates/xadmin/filters/number.html:37 +msgid "Apply" +msgstr "" + +#: templates/xadmin/filters/date.html:34 +msgid "Date Range" +msgstr "" + +#: templates/xadmin/filters/date.html:41 +msgid "Select Date" +msgstr "" + +#: templates/xadmin/filters/date.html:42 +msgid "From" +msgstr "" + +#: templates/xadmin/filters/date.html:44 +msgid "To" +msgstr "" + +#: templates/xadmin/filters/fk_search.html:14 +msgid "Select" +msgstr "" + +#: templates/xadmin/filters/fk_search.html:26 +#: templates/xadmin/filters/number.html:39 +msgid "Clean" +msgstr "" + +#: templates/xadmin/filters/number.html:17 +#: templates/xadmin/filters/number.html:25 +#: templates/xadmin/filters/number.html:33 +msgid "Enter Number" +msgstr "" + +#: templates/xadmin/filters/rel.html:3 +#, python-format +msgid " By %(filter_title)s " +msgstr "" + +#: templates/xadmin/forms/transfer.html:4 +msgid "Available" +msgstr "" + +#: templates/xadmin/forms/transfer.html:12 +msgid "Click to choose all at once." +msgstr "" + +#: templates/xadmin/forms/transfer.html:12 +msgid "Choose all" +msgstr "" + +#: templates/xadmin/forms/transfer.html:16 +msgid "Choose" +msgstr "" + +#: templates/xadmin/forms/transfer.html:19 +#: templates/xadmin/widgets/base.html:40 +msgid "Remove" +msgstr "" + +#: templates/xadmin/forms/transfer.html:23 +msgid "Chosen" +msgstr "" + +#: templates/xadmin/forms/transfer.html:27 +msgid "Click to remove all chosen at once." +msgstr "" + +#: templates/xadmin/forms/transfer.html:27 +msgid "Remove all" +msgstr "" + +#: templates/xadmin/includes/pagination.html:9 +msgid "Show all" +msgstr "" + +#: templates/xadmin/includes/submit_line.html:10 +#: templates/xadmin/includes/submit_line.html:13 +#: templates/xadmin/views/form.html:30 templates/xadmin/views/form.html:31 +msgid "Saving.." +msgstr "" + +#: templates/xadmin/includes/submit_line.html:17 +msgid "Save as new" +msgstr "" + +#: templates/xadmin/includes/submit_line.html:18 +msgid "Save and add another" +msgstr "" + +#: templates/xadmin/includes/submit_line.html:19 +msgid "Save and continue editing" +msgstr "" + +#: templates/xadmin/includes/submit_line.html:24 +#: templates/xadmin/views/model_detail.html:28 views/delete.py:93 +msgid "Delete" +msgstr "" + +#: templates/xadmin/views/app_index.html:13 +#, python-format +msgid "%(name)s" +msgstr "" + +#: templates/xadmin/views/batch_change_form.html:11 +msgid "Change multiple objects" +msgstr "" + +#: templates/xadmin/views/batch_change_form.html:16 +#, python-format +msgid "Change one %(objects_name)s" +msgid_plural "Batch change %(counter)s %(objects_name)s" +msgstr[0] "" +msgstr[1] "" + +#: templates/xadmin/views/batch_change_form.html:38 +msgid "Change Multiple" +msgstr "" + +#: templates/xadmin/views/dashboard.html:15 +#: templates/xadmin/views/dashboard.html:22 +#: templates/xadmin/views/dashboard.html:23 +msgid "Add Widget" +msgstr "" + +#: templates/xadmin/views/invalid_setup.html:13 +msgid "" +"Something's wrong with your database installation. Make sure the appropriate " +"database tables have been created, and make sure the database is readable by " +"the appropriate user." +msgstr "" + +#: templates/xadmin/views/logged_out.html:16 +msgid "Logout Success" +msgstr "" + +#: templates/xadmin/views/logged_out.html:17 +msgid "Thanks for spending some quality time with the Web site today." +msgstr "" + +#: templates/xadmin/views/logged_out.html:19 +msgid "Close Window" +msgstr "" + +#: templates/xadmin/views/logged_out.html:20 +msgid "Log in again" +msgstr "" + +#: templates/xadmin/views/login.html:39 views/website.py:38 +msgid "Please Login" +msgstr "" + +#: templates/xadmin/views/login.html:52 +msgid "Username" +msgstr "" + +#: templates/xadmin/views/login.html:64 +msgid "Password" +msgstr "" + +#: templates/xadmin/views/login.html:75 +msgid "log in" +msgstr "" + +#: templates/xadmin/views/model_dashboard.html:26 +#: templates/xadmin/views/model_detail.html:25 +msgid "Edit" +msgstr "" + +#: templates/xadmin/views/model_delete_confirm.html:11 +#, python-format +msgid "" +"Deleting the %(verbose_name)s '%(escaped_object)s' would result in deleting " +"related objects, but your account doesn't have permission to delete the " +"following types of objects:" +msgstr "" + +#: templates/xadmin/views/model_delete_confirm.html:19 +#, python-format +msgid "" +"Deleting the %(verbose_name)s '%(escaped_object)s' would require deleting " +"the following protected related objects:" +msgstr "" + +#: templates/xadmin/views/model_delete_confirm.html:27 +#, python-format +msgid "" +"Are you sure you want to delete the %(verbose_name)s \"%(escaped_object)s\"? " +"All of the following related items will be deleted:" +msgstr "" + +#: templates/xadmin/views/model_delete_confirm.html:34 +#: templates/xadmin/views/model_delete_selected_confirm.html:49 +msgid "Yes, I'm sure" +msgstr "" + +#: templates/xadmin/views/model_delete_confirm.html:35 +#: templates/xadmin/views/model_delete_selected_confirm.html:50 +msgid "Cancel" +msgstr "" + +#: templates/xadmin/views/model_delete_selected_confirm.html:10 +msgid "Delete multiple objects" +msgstr "" + +#: templates/xadmin/views/model_delete_selected_confirm.html:18 +#, python-format +msgid "" +"Deleting the selected %(objects_name)s would result in deleting related " +"objects, but your account doesn't have permission to delete the following " +"types of objects:" +msgstr "" + +#: templates/xadmin/views/model_delete_selected_confirm.html:26 +#, python-format +msgid "" +"Deleting the selected %(objects_name)s would require deleting the following " +"protected related objects:" +msgstr "" + +#: templates/xadmin/views/model_delete_selected_confirm.html:34 +#, python-format +msgid "" +"Are you sure you want to delete the selected %(objects_name)s? All of the " +"following objects and their related items will be deleted:" +msgstr "" + +#: templates/xadmin/views/model_history.html:26 +msgid "Diff" +msgstr "" + +#: templates/xadmin/views/model_history.html:27 +#: templates/xadmin/views/recover_list.html:25 +msgid "Date/time" +msgstr "" + +#: templates/xadmin/views/model_history.html:28 +msgid "User" +msgstr "" + +#: templates/xadmin/views/model_history.html:29 +msgid "Comment" +msgstr "" + +#: templates/xadmin/views/model_history.html:54 +msgid "Diff Select Versions" +msgstr "" + +#: templates/xadmin/views/model_history.html:58 +msgid "" +"This object doesn't have a change history. It probably wasn't added via this " +"admin site." +msgstr "" + +#: templates/xadmin/views/model_list.html:29 +#, python-format +msgid "Add %(name)s" +msgstr "" + +#: templates/xadmin/views/model_list.html:39 +msgid "Columns" +msgstr "" + +#: templates/xadmin/views/model_list.html:42 +msgid "Restore Selected" +msgstr "" + +#: templates/xadmin/views/model_list.html:147 +#: templates/xadmin/widgets/list.html:33 +msgid "Empty list" +msgstr "" + +#: templates/xadmin/views/recover_form.html:20 +msgid "Press the recover button below to recover this version of the object." +msgstr "" + +#: templates/xadmin/views/recover_list.html:19 +msgid "" +"Choose a date from the list below to recover a deleted version of an object." +msgstr "" + +#: templates/xadmin/views/recover_list.html:39 +msgid "There are no deleted objects to recover." +msgstr "" + +#: templates/xadmin/views/revision_diff.html:12 +#: templates/xadmin/views/revision_diff.html:17 +#, python-format +msgid "Diff %(verbose_name)s" +msgstr "" + +#: templates/xadmin/views/revision_diff.html:25 +msgid "Field" +msgstr "" + +#: templates/xadmin/views/revision_diff.html:26 +msgid "Version A" +msgstr "" + +#: templates/xadmin/views/revision_diff.html:27 +msgid "Version B" +msgstr "" + +#: templates/xadmin/views/revision_diff.html:39 +msgid "Revert to" +msgstr "" + +#: templates/xadmin/views/revision_diff.html:40 +#: templates/xadmin/views/revision_diff.html:41 +msgid "Revert" +msgstr "" + +#: templates/xadmin/views/revision_form.html:16 +#, python-format +msgid "Revert %(verbose_name)s" +msgstr "" + +#: templates/xadmin/views/revision_form.html:21 +msgid "Press the revert button below to revert to this version of the object." +msgstr "" + +#: templates/xadmin/views/revision_form.html:27 +msgid "Revert this revision" +msgstr "" + +#: templates/xadmin/widgets/addform.html:14 +msgid "Success" +msgstr "" + +#: templates/xadmin/widgets/addform.html:14 +msgid "Add success, click edit to edit." +msgstr "" + +#: templates/xadmin/widgets/addform.html:17 +msgid "Quick Add" +msgstr "" + +#: templates/xadmin/widgets/base.html:31 +msgid "Widget Options" +msgstr "" + +#: templates/xadmin/widgets/base.html:42 +msgid "Save changes" +msgstr "" + +#: views/base.py:315 +msgid "Django Xadmin" +msgstr "" + +#: views/base.py:316 +msgid "my-company.inc" +msgstr "" + +#: views/dashboard.py:186 +msgid "Widget ID" +msgstr "" + +#: views/dashboard.py:187 +msgid "Widget Title" +msgstr "" + +#: views/dashboard.py:252 +msgid "Html Content Widget, can write any html content in widget." +msgstr "" + +#: views/dashboard.py:255 +msgid "Html Content" +msgstr "" + +#: views/dashboard.py:318 +msgid "Target Model" +msgstr "" + +#: views/dashboard.py:369 +msgid "Quick button Widget, quickly open any page." +msgstr "" + +#: views/dashboard.py:371 +msgid "Quick Buttons" +msgstr "" + +#: views/dashboard.py:416 +msgid "Any Objects list Widget." +msgstr "" + +#: views/dashboard.py:456 +msgid "Add any model object Widget." +msgstr "" + +#: views/dashboard.py:492 +msgid "Dashboard" +msgstr "" + +#: views/dashboard.py:633 +#, python-format +msgid "%s Dashboard" +msgstr "" + +#: views/delete.py:103 +#, python-format +msgid "The %(name)s \"%(obj)s\" was deleted successfully." +msgstr "" + +#: views/detail.py:173 views/edit.py:211 views/form.py:72 +msgid "Other Fields" +msgstr "" + +#: views/detail.py:235 +#, python-format +msgid "%s Detail" +msgstr "" + +#: views/edit.py:253 +msgid "Added." +msgstr "" + +#: views/edit.py:255 +#, python-format +msgid "Changed %s." +msgstr "" + +#: views/edit.py:255 +msgid "and" +msgstr "" + +#: views/edit.py:258 +msgid "No fields changed." +msgstr "" + +#: views/edit.py:420 +#, python-format +msgid "The %(name)s \"%(obj)s\" was added successfully." +msgstr "" + +#: views/edit.py:425 views/edit.py:520 +msgid "You may edit it again below." +msgstr "" + +#: views/edit.py:429 views/edit.py:523 +#, python-format +msgid "You may add another %s below." +msgstr "" + +#: views/edit.py:471 +#, python-format +msgid "Change %s" +msgstr "" + +#: views/edit.py:516 +#, python-format +msgid "The %(name)s \"%(obj)s\" was changed successfully." +msgstr "" + +#: views/form.py:165 +#, python-format +msgid "The %s was changed successfully." +msgstr "" + +#: views/list.py:199 +msgid "Database error" +msgstr "" + +#: views/list.py:373 +#, python-format +msgid "%s List" +msgstr "" + +#: views/list.py:499 +msgid "Sort ASC" +msgstr "" + +#: views/list.py:500 +msgid "Sort DESC" +msgstr "" + +#: views/list.py:504 +msgid "Cancel Sort" +msgstr "" + +#: views/website.py:16 +msgid "Main Dashboard" +msgstr "" + +#: widgets.py:48 +msgid "Now" +msgstr "" diff --git "a/8\343\200\201\346\226\207\347\214\256\346\225\260\346\215\256\346\214\226\346\216\230\347\263\273\347\273\237(\351\231\204\346\272\220\347\240\201)/extra_apps/xadmin/locale/nl_NL/LC_MESSAGES/djangojs.mo" "b/8\343\200\201\346\226\207\347\214\256\346\225\260\346\215\256\346\214\226\346\216\230\347\263\273\347\273\237(\351\231\204\346\272\220\347\240\201)/extra_apps/xadmin/locale/nl_NL/LC_MESSAGES/djangojs.mo" new file mode 100644 index 0000000..7783a99 Binary files /dev/null and "b/8\343\200\201\346\226\207\347\214\256\346\225\260\346\215\256\346\214\226\346\216\230\347\263\273\347\273\237(\351\231\204\346\272\220\347\240\201)/extra_apps/xadmin/locale/nl_NL/LC_MESSAGES/djangojs.mo" differ diff --git "a/8\343\200\201\346\226\207\347\214\256\346\225\260\346\215\256\346\214\226\346\216\230\347\263\273\347\273\237(\351\231\204\346\272\220\347\240\201)/extra_apps/xadmin/locale/nl_NL/LC_MESSAGES/djangojs.po" "b/8\343\200\201\346\226\207\347\214\256\346\225\260\346\215\256\346\214\226\346\216\230\347\263\273\347\273\237(\351\231\204\346\272\220\347\240\201)/extra_apps/xadmin/locale/nl_NL/LC_MESSAGES/djangojs.po" new file mode 100644 index 0000000..4edf57c --- /dev/null +++ "b/8\343\200\201\346\226\207\347\214\256\346\225\260\346\215\256\346\214\226\346\216\230\347\263\273\347\273\237(\351\231\204\346\272\220\347\240\201)/extra_apps/xadmin/locale/nl_NL/LC_MESSAGES/djangojs.po" @@ -0,0 +1,70 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER +# This file is distributed under the same license as the PACKAGE package. +# +# Translators: +msgid "" +msgstr "" +"Project-Id-Version: xadmin-core\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2013-04-30 23:11+0800\n" +"PO-Revision-Date: 2013-11-20 12:41+0000\n" +"Last-Translator: sshwsfc \n" +"Language-Team: Dutch (Netherlands) (http://www.transifex.com/projects/p/xadmin/language/nl_NL/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: nl_NL\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +#: static/xadmin/js/xadmin.plugin.actions.js:20 +msgid "%(sel)s of %(cnt)s selected" +msgid_plural "%(sel)s of %(cnt)s selected" +msgstr[0] "" +msgstr[1] "" + +#: static/xadmin/js/xadmin.plugin.revision.js:25 +msgid "New Item" +msgstr "" + +#: static/xadmin/js/xadmin.widget.datetime.js:32 +msgid "Sunday Monday Tuesday Wednesday Thursday Friday Saturday Sunday" +msgstr "" + +#: static/xadmin/js/xadmin.widget.datetime.js:33 +msgid "Sun Mon Tue Wed Thu Fri Sat Sun" +msgstr "" + +#: static/xadmin/js/xadmin.widget.datetime.js:34 +msgid "Su Mo Tu We Th Fr Sa Su" +msgstr "" + +#: static/xadmin/js/xadmin.widget.datetime.js:35 +msgid "" +"January February March April May June July August September October November" +" December" +msgstr "" + +#: static/xadmin/js/xadmin.widget.datetime.js:36 +msgid "Jan Feb Mar Apr May Jun Jul Aug Sep Oct Nov Dec" +msgstr "" + +#: static/xadmin/js/xadmin.widget.datetime.js:37 +msgid "Today" +msgstr "" + +#: static/xadmin/js/xadmin.widget.datetime.js:38 +msgid "%a %d %b %Y %T %Z" +msgstr "" + +#: static/xadmin/js/xadmin.widget.datetime.js:39 +msgid "AM PM" +msgstr "" + +#: static/xadmin/js/xadmin.widget.datetime.js:40 +msgid "am pm" +msgstr "" + +#: static/xadmin/js/xadmin.widget.datetime.js:43 +msgid "%T" +msgstr "" diff --git "a/8\343\200\201\346\226\207\347\214\256\346\225\260\346\215\256\346\214\226\346\216\230\347\263\273\347\273\237(\351\231\204\346\272\220\347\240\201)/extra_apps/xadmin/locale/pl/LC_MESSAGES/django.mo" "b/8\343\200\201\346\226\207\347\214\256\346\225\260\346\215\256\346\214\226\346\216\230\347\263\273\347\273\237(\351\231\204\346\272\220\347\240\201)/extra_apps/xadmin/locale/pl/LC_MESSAGES/django.mo" new file mode 100644 index 0000000..c9b8381 Binary files /dev/null and "b/8\343\200\201\346\226\207\347\214\256\346\225\260\346\215\256\346\214\226\346\216\230\347\263\273\347\273\237(\351\231\204\346\272\220\347\240\201)/extra_apps/xadmin/locale/pl/LC_MESSAGES/django.mo" differ diff --git "a/8\343\200\201\346\226\207\347\214\256\346\225\260\346\215\256\346\214\226\346\216\230\347\263\273\347\273\237(\351\231\204\346\272\220\347\240\201)/extra_apps/xadmin/locale/pl/LC_MESSAGES/django.po" "b/8\343\200\201\346\226\207\347\214\256\346\225\260\346\215\256\346\214\226\346\216\230\347\263\273\347\273\237(\351\231\204\346\272\220\347\240\201)/extra_apps/xadmin/locale/pl/LC_MESSAGES/django.po" new file mode 100644 index 0000000..5f5751b --- /dev/null +++ "b/8\343\200\201\346\226\207\347\214\256\346\225\260\346\215\256\346\214\226\346\216\230\347\263\273\347\273\237(\351\231\204\346\272\220\347\240\201)/extra_apps/xadmin/locale/pl/LC_MESSAGES/django.po" @@ -0,0 +1,1481 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER +# This file is distributed under the same license as the PACKAGE package. +# FIRST AUTHOR , YEAR. +# +msgid "" +msgstr "" +"Project-Id-Version: django-xadmin\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2016-07-20 13:28+0800\n" +"PO-Revision-Date: 2014-08-12 21:08+0100\n" +"Last-Translator: Michał Szpadzik \n" +"Language-Team: Polish translators \n" +"Language: pl\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=3; plural=(n==1 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 " +"|| n%100>=20) ? 1 : 2);\n" +"X-Generator: Poedit 1.5.4\n" + +#: adminx.py:19 +msgid "Admin Object" +msgstr "" + +#: apps.py:11 +msgid "Administration" +msgstr "" + +#: filters.py:159 filters.py:191 filters.py:407 filters.py:493 filters.py:531 +msgid "All" +msgstr "Wszystko" + +#: filters.py:160 plugins/export.py:165 +msgid "Yes" +msgstr "Tak" + +#: filters.py:161 plugins/export.py:165 +msgid "No" +msgstr "Nie" + +#: filters.py:175 +msgid "Unknown" +msgstr "Nieznany" + +#: filters.py:267 +msgid "Any date" +msgstr "Dowolna data" + +#: filters.py:268 +msgid "Has date" +msgstr "Ma datę" + +#: filters.py:271 +msgid "Has no date" +msgstr "Nie ma daty" + +#: filters.py:274 widgets.py:30 +msgid "Today" +msgstr "Dzisiaj" + +#: filters.py:278 +msgid "Past 7 days" +msgstr "Ostatnie 7 dni" + +#: filters.py:282 +msgid "This month" +msgstr "Ten miesiąc" + +#: filters.py:286 +msgid "This year" +msgstr "Ten rok" + +#: forms.py:10 +msgid "" +"Please enter the correct username and password for a staff account. Note " +"that both fields are case-sensitive." +msgstr "" +"Proszę wpisz prawidłową nazwę użytkownika i hasło do konta. Pamiętaj, że oba " +"pola są wrażliwe na wielkość znaków." + +#: forms.py:21 +msgid "Please log in again, because your session has expired." +msgstr "Proszę, zaloguj się ponownie, ponieważ Twoja sesja wygasła." + +#: forms.py:41 +#, python-format +msgid "Your e-mail address is not your username. Try '%s' instead." +msgstr "" +"Twój adres e-mail nie jest Twoją nazwą użytkownika. Zamiast tego spróbuj " +"'%s'." + +#: models.py:48 +msgid "Title" +msgstr "Tytuł" + +#: models.py:49 models.py:88 models.py:107 models.py:149 +msgid "user" +msgstr "użytkownik" + +#: models.py:50 +msgid "Url Name" +msgstr "Nazwa Url" + +#: models.py:52 +msgid "Query String" +msgstr "Tekst wyszukiwania" + +#: models.py:53 +msgid "Is Shared" +msgstr "Jest współdzielony" + +#: models.py:66 plugins/bookmark.py:50 plugins/bookmark.py:180 +msgid "Bookmark" +msgstr "Zakładka" + +#: models.py:67 +msgid "Bookmarks" +msgstr "Zakładki" + +#: models.py:89 +msgid "Settings Key" +msgstr "Klucz ustawień" + +#: models.py:90 +msgid "Settings Content" +msgstr "Treść ustawień" + +#: models.py:102 +msgid "User Setting" +msgstr "Ustawienie użytkownika" + +#: models.py:103 +msgid "User Settings" +msgstr "Ustawienia użytkownika" + +#: models.py:108 +msgid "Page" +msgstr "Strona" + +#: models.py:109 views/dashboard.py:82 views/dashboard.py:92 +msgid "Widget Type" +msgstr "Typ Widgetu" + +#: models.py:110 views/dashboard.py:83 +msgid "Widget Params" +msgstr "Parametry Widgetu" + +#: models.py:137 +msgid "User Widget" +msgstr "Widget użytkownika" + +#: models.py:138 +msgid "User Widgets" +msgstr "Widgety użytkownika" + +#: models.py:142 +#, fuzzy +#| msgid "Date/time" +msgid "action time" +msgstr "Data/czas" + +#: models.py:151 +msgid "action ip" +msgstr "" + +#: models.py:155 +msgid "content type" +msgstr "" + +#: models.py:158 +msgid "object id" +msgstr "" + +#: models.py:159 +msgid "object repr" +msgstr "" + +#: models.py:160 +msgid "action flag" +msgstr "" + +#: models.py:161 +#, fuzzy +#| msgid "Change %s" +msgid "change message" +msgstr "Zmień %s" + +#: models.py:164 +#, fuzzy +#| msgid "log in" +msgid "log entry" +msgstr "zaloguj się" + +#: models.py:165 +msgid "log entries" +msgstr "" + +#: models.py:173 +#, python-format +msgid "Added \"%(object)s\"." +msgstr "" + +#: models.py:175 +#, fuzzy, python-format +#| msgid "Change one %(objects_name)s" +#| msgid_plural "Batch change %(counter)s %(objects_name)s" +msgid "Changed \"%(object)s\" - %(changes)s" +msgstr "Zmień %(objects_name)s" + +#: models.py:180 +#, fuzzy, python-format +#| msgid "Related Objects" +msgid "Deleted \"%(object)s.\"" +msgstr "Powiązane obiekty" + +#: plugins/actions.py:57 +#, python-format +msgid "Delete selected %(verbose_name_plural)s" +msgstr "Usuń zaznaczone %(verbose_name_plural)s" + +#: plugins/actions.py:72 +#, fuzzy, python-format +#| msgid "Successfully deleted %(count)d %(items)s." +msgid "Batch delete %(count)d %(items)s." +msgstr "Z powodzieniem usunięto %(count)d %(items)s." + +#: plugins/actions.py:78 +#, python-format +msgid "Successfully deleted %(count)d %(items)s." +msgstr "Z powodzieniem usunięto %(count)d %(items)s." + +#: plugins/actions.py:110 views/delete.py:70 +#, python-format +msgid "Cannot delete %(name)s" +msgstr "Nie można usunąć %(name)s" + +#: plugins/actions.py:112 views/delete.py:73 +msgid "Are you sure?" +msgstr "Jesteś pewny ?" + +#: plugins/actions.py:158 +#, python-format +msgid "%(total_count)s selected" +msgid_plural "All %(total_count)s selected" +msgstr[0] "%(total_count)s zaznaczony" +msgstr[1] "%(total_count)s zaznaczone" +msgstr[2] "%(total_count)s zaznaczonych" + +#: plugins/actions.py:162 +#, python-format +msgid "0 of %(cnt)s selected" +msgstr "0 z %(cnt)s zaznaczonych" + +#: plugins/actions.py:179 plugins/actions.py:189 +msgid "" +"Items must be selected in order to perform actions on them. No items have " +"been changed." +msgstr "" +"Elementy muszą być zaznaczone, by wykonać akcję na nich. Żaden element nie " +"został zmienony." + +#: plugins/aggregation.py:14 +msgid "Min" +msgstr "Min" + +#: plugins/aggregation.py:14 +msgid "Max" +msgstr "Max" + +#: plugins/aggregation.py:14 +msgid "Avg" +msgstr "Śred" + +#: plugins/aggregation.py:14 +msgid "Sum" +msgstr "Sum" + +#: plugins/aggregation.py:14 +msgid "Count" +msgstr "Liczba" + +#: plugins/auth.py:21 +#, python-format +msgid "Can add %s" +msgstr "Może dodawać %s" + +#: plugins/auth.py:22 +#, python-format +msgid "Can change %s" +msgstr "Może zmieniać %s" + +#: plugins/auth.py:23 +#, python-format +msgid "Can edit %s" +msgstr "Może edytować %s" + +#: plugins/auth.py:24 +#, python-format +msgid "Can delete %s" +msgstr "Może usuwać %s" + +#: plugins/auth.py:25 +#, python-format +msgid "Can view %s" +msgstr "Może oglądać %s" + +#: plugins/auth.py:87 +msgid "Personal info" +msgstr "Informacje osobiste" + +#: plugins/auth.py:91 +msgid "Permissions" +msgstr "Uprawnienia" + +#: plugins/auth.py:94 +msgid "Important dates" +msgstr "Ważne daty" + +#: plugins/auth.py:99 +msgid "Status" +msgstr "Status" + +#: plugins/auth.py:111 +msgid "Permission Name" +msgstr "Nazwa uprawnienia" + +#: plugins/auth.py:167 +msgid "Change Password" +msgstr "Zmień hasło" + +#: plugins/auth.py:198 +#, python-format +msgid "Change password: %s" +msgstr "Zmień hasło: %s" + +#: plugins/auth.py:223 plugins/auth.py:255 +msgid "Password changed successfully." +msgstr "Zmiana hasła zakończona powodzieniem" + +#: plugins/auth.py:242 templates/xadmin/auth/user/change_password.html:11 +#: templates/xadmin/auth/user/change_password.html:22 +#: templates/xadmin/auth/user/change_password.html:55 +msgid "Change password" +msgstr "Zmień hasło" + +#: plugins/batch.py:44 +msgid "Change this field" +msgstr "Zmień to pole" + +#: plugins/batch.py:65 +#, python-format +msgid "Batch Change selected %(verbose_name_plural)s" +msgstr "Zmiana grupowa wybrana %(verbose_name_plural)s" + +#: plugins/batch.py:89 +#, python-format +msgid "Successfully change %(count)d %(items)s." +msgstr "Z powodzeniem zmieniono %(count)d %(items)s." + +#: plugins/batch.py:138 +#, python-format +msgid "Batch change %s" +msgstr "Zmiana grupowa %s" + +#: plugins/bookmark.py:173 +msgid "bookmark" +msgstr "zakładka" + +#: plugins/bookmark.py:176 +msgid "Bookmark Widget, can show user's bookmark list data in widget." +msgstr "Widget zakładek, pozwala pokazać dane dla zakładki w widgecie." + +#: plugins/chart.py:25 +msgid "Show models simple chart." +msgstr "Pokaż prosty wykres dla modelu." + +#: plugins/chart.py:51 +#, python-format +msgid "%s Charts" +msgstr "%s Wykresy" + +#: plugins/comments.py:33 +msgid "Metadata" +msgstr "Metadane" + +#: plugins/comments.py:60 +msgid "flagged" +msgid_plural "flagged" +msgstr[0] "oflagowany" +msgstr[1] "oflagowane" +msgstr[2] "oflagowanych" + +#: plugins/comments.py:61 +msgid "Flag selected comments" +msgstr "Oflaguj zaznaczony komentarz" + +#: plugins/comments.py:66 +msgid "approved" +msgid_plural "approved" +msgstr[0] "zatwierdzony" +msgstr[1] "zatwierdzone" +msgstr[2] "zatwierdzonych" + +#: plugins/comments.py:67 +msgid "Approve selected comments" +msgstr "Zatwierdź zaznaczony komentarz" + +#: plugins/comments.py:72 +msgid "removed" +msgid_plural "removed" +msgstr[0] "usunięty" +msgstr[1] "usunięte" +msgstr[2] "usuniętych" + +#: plugins/comments.py:73 +msgid "Remove selected comments" +msgstr "Usuń zaznaczone komentarze" + +#: plugins/comments.py:86 +#, python-format +msgid "1 comment was successfully %(action)s." +msgid_plural "%(count)s comments were successfully %(action)s." +msgstr[0] "1 komentarz został z powodzeniem %(action)s." +msgstr[1] "%(count)s komentarze zostało z powodzeniem %(action)s." +msgstr[2] "%(count)s komentarzy zostało z powodzeniem %(action)s." + +#: plugins/details.py:52 views/list.py:578 +#, python-format +msgid "Details of %s" +msgstr "Szczegóły %s" + +#: plugins/editable.py:46 +#, python-format +msgid "Enter %s" +msgstr "Wejdz w %s" + +#: plugins/editable.py:73 views/dashboard.py:649 views/delete.py:27 +#: views/detail.py:145 views/edit.py:454 +#, python-format +msgid "%(name)s object with primary key %(key)r does not exist." +msgstr "Obiekt %(name)s z kluczem głównym %(key)r nie istnieje." + +#: plugins/export.py:98 plugins/export.py:135 +msgid "Sheet" +msgstr "Arkusz" + +#: plugins/filters.py:133 plugins/quickfilter.py:141 +#, python-format +msgid "Filtering error: %s" +msgstr "Błąd filtracji: %s" + +#: plugins/images.py:29 +msgid "Previous" +msgstr "Poprzedni" + +#: plugins/images.py:29 +msgid "Next" +msgstr "Następny" + +#: plugins/images.py:29 +msgid "Slideshow" +msgstr "Pokaz slajdów" + +#: plugins/images.py:29 +msgid "Download" +msgstr "Ściągnij" + +#: plugins/images.py:50 +msgid "Change:" +msgstr "Zmień:" + +#: plugins/layout.py:16 +msgid "Table" +msgstr "Tabela" + +#: plugins/layout.py:22 +msgid "Thumbnails" +msgstr "Miniaturki" + +#: plugins/passwords.py:64 +msgid "Forgotten your password or username?" +msgstr "Zapomniałeś swojego hasła lub loginu ?" + +#: plugins/quickform.py:79 +#, python-format +msgid "Create New %s" +msgstr "Utwórz nowy %s" + +#: plugins/relate.py:104 +msgid "Related Objects" +msgstr "Powiązane obiekty" + +#: plugins/relfield.py:29 plugins/topnav.py:38 +#, python-format +msgid "Search %s" +msgstr "Szukaj %s" + +#: plugins/relfield.py:67 +#, fuzzy, python-format +#| msgid "Select Date" +msgid "Select %s" +msgstr "Wybierz datę" + +#: plugins/themes.py:47 +msgid "Default" +msgstr "Domyślny" + +#: plugins/themes.py:48 +msgid "Default bootstrap theme" +msgstr "Domyślny temat bootstrapa" + +#: plugins/themes.py:49 +msgid "Bootstrap2" +msgstr "Bootstrap2" + +#: plugins/themes.py:49 +msgid "Bootstrap 2.x theme" +msgstr "Tematy Bootstrap 2.x" + +#: plugins/topnav.py:62 views/dashboard.py:465 views/edit.py:387 +#: views/edit.py:396 +#, python-format +msgid "Add %s" +msgstr "Dodaj %s" + +#: plugins/xversion.py:106 +msgid "Initial version." +msgstr "Wersja startowa." + +#: plugins/xversion.py:108 +msgid "Change version." +msgstr "Zmień wersję." + +#: plugins/xversion.py:110 +msgid "Revert version." +msgstr "Przywróć wersję." + +#: plugins/xversion.py:112 +msgid "Rercover version." +msgstr "Odzyskaj wersję." + +#: plugins/xversion.py:114 +#, python-format +msgid "Deleted %(verbose_name)s." +msgstr "Usunięte %(verbose_name)s." + +#: plugins/xversion.py:127 templates/xadmin/views/recover_form.html:26 +msgid "Recover" +msgstr "Odzyskaj" + +#: plugins/xversion.py:143 templates/xadmin/views/model_history.html:11 +#: templates/xadmin/views/revision_diff.html:11 +#: templates/xadmin/views/revision_form.html:15 +msgid "History" +msgstr "Historia" + +#: plugins/xversion.py:194 templates/xadmin/views/recover_form.html:14 +#: templates/xadmin/views/recover_list.html:10 +#, python-format +msgid "Recover deleted %(name)s" +msgstr "Odzyskaj usunięte %(name)s" + +#: plugins/xversion.py:238 +#, python-format +msgid "Change history: %s" +msgstr "Zmień historię: %s" + +#: plugins/xversion.py:288 +msgid "Must select two versions." +msgstr "Musisz wybrać dwie wersje." + +#: plugins/xversion.py:296 +msgid "Please select two different versions." +msgstr "Proszę, wybierz dwie różne wersje." + +#: plugins/xversion.py:383 plugins/xversion.py:500 +#, python-format +msgid "Current: %s" +msgstr "Obecny: %s" + +#: plugins/xversion.py:424 +#, python-format +msgid "Revert %s" +msgstr "Przywróć %s" + +#: plugins/xversion.py:440 +#, python-format +msgid "" +"The %(model)s \"%(name)s\" was reverted successfully. You may edit it again " +"below." +msgstr "" +"%(model)s \"%(name)s\" został przywrócony z powodzeniem. Możesz edytować go " +"ponownie poniżej." + +#: plugins/xversion.py:461 +#, python-format +msgid "Recover %s" +msgstr "Odzyskaj %s" + +#: plugins/xversion.py:477 +#, python-format +msgid "" +"The %(model)s \"%(name)s\" was recovered successfully. You may edit it again " +"below." +msgstr "" +"%(model)s \"%(name)s\" został z powodzeniem odzyskany. Możesz edytować go " +"ponownie poniżej." + +#: templates/xadmin/404.html:4 templates/xadmin/404.html:8 +msgid "Page not found" +msgstr "Strona nie została odnaleziona" + +#: templates/xadmin/404.html:10 +msgid "We're sorry, but the requested page could not be found." +msgstr "Przepraszamy, ale żądana strona nie została odnaleziona." + +#: templates/xadmin/500.html:7 +#: templates/xadmin/auth/user/change_password.html:10 +#: templates/xadmin/auth/user/change_password.html:15 +#: templates/xadmin/base_site.html:53 +#: templates/xadmin/includes/sitemenu_default.html:7 +#: templates/xadmin/views/app_index.html:9 +#: templates/xadmin/views/batch_change_form.html:9 +#: templates/xadmin/views/invalid_setup.html:7 +#: templates/xadmin/views/model_dashboard.html:7 +#: templates/xadmin/views/model_delete_selected_confirm.html:8 +#: templates/xadmin/views/model_history.html:8 +#: templates/xadmin/views/recover_form.html:8 +#: templates/xadmin/views/recover_list.html:8 +#: templates/xadmin/views/revision_diff.html:8 +#: templates/xadmin/views/revision_form.html:8 views/base.py:473 +msgid "Home" +msgstr "Home" + +#: templates/xadmin/500.html:8 +msgid "Server error" +msgstr "Błąd serwera" + +#: templates/xadmin/500.html:12 +msgid "Server error (500)" +msgstr "Błąd serwera (500)" + +#: templates/xadmin/500.html:15 +msgid "Server Error (500)" +msgstr "Błąd Serwera (500)" + +#: templates/xadmin/500.html:16 +msgid "" +"There's been an error. It's been reported to the site administrators via e-" +"mail and should be fixed shortly. Thanks for your patience." +msgstr "" +"Wystąpił błąd. Został zaraportowany do administratorów strony przez e-mail i " +"wkrótce powienien zostać naprawiony. Dziękujemy za wyrozumiałość i " +"cierpliwość." + +#: templates/xadmin/auth/password_reset/complete.html:11 +#: templates/xadmin/auth/password_reset/done.html:11 +msgid "Password reset successful" +msgstr "Reset hasła zakończony powodzeniem" + +#: templates/xadmin/auth/password_reset/complete.html:14 +msgid "Your password has been set. You may go ahead and log in now." +msgstr "" +"Twoje hasło zostało ustawione. Możesz teraz przejść dalej i zalogować się." + +#: templates/xadmin/auth/password_reset/complete.html:15 +msgid "Log in" +msgstr "Zaloguj się" + +#: templates/xadmin/auth/password_reset/confirm.html:12 +msgid "Enter new password" +msgstr "Wpisz nowe hasło" + +#: templates/xadmin/auth/password_reset/confirm.html:17 +msgid "" +"Please enter your new password twice so we can verify you typed it in " +"correctly." +msgstr "" +"Proszę wpisać Twoje nowe hasło dwukrotnie, aby zweryfikować, czy wpisałeś je " +"poprawnie." + +#: templates/xadmin/auth/password_reset/confirm.html:19 +msgid "Change my password" +msgstr "Zmień moje hasło" + +#: templates/xadmin/auth/password_reset/confirm.html:24 +msgid "Password reset unsuccessful" +msgstr "Resetowanie hasło zakończone niepowodzeniem" + +#: templates/xadmin/auth/password_reset/confirm.html:27 +msgid "" +"The password reset link was invalid, possibly because it has already been " +"used. Please request a new password reset." +msgstr "" +"Twój link do resetowania hasła jest niepoprawny, prawdopodobnie został już " +"użyty. Proszę, zażądaj nowego linku (wykonaj raz jeszcze reset hasła)." + +#: templates/xadmin/auth/password_reset/done.html:14 +msgid "" +"We've e-mailed you instructions for setting your password to the e-mail " +"address you submitted. You should be receiving it shortly." +msgstr "" +"Wysłaliśmy Ci e-mailem instrukcję ustawienia Twojego hasła na adres, który " +"podałeś. Powinieneś go wkrótce otrzymać." + +#: templates/xadmin/auth/password_reset/email.html:2 +#, python-format +msgid "" +"You're receiving this e-mail because you requested a password reset for your " +"user account at %(site_name)s." +msgstr "" +"Otrzymałeś tego e-maila, ponieważ zarządałeś zresetowania hasła do twojego " +"konta na maszynie %(site_name)s." + +#: templates/xadmin/auth/password_reset/email.html:4 +msgid "Please go to the following page and choose a new password:" +msgstr "Przejdź proszę do podanej strony i wybierz nowe hasło: " + +#: templates/xadmin/auth/password_reset/email.html:8 +msgid "Your username, in case you've forgotten:" +msgstr "Twoja nazwa użytkownika, gdybyś ją zapomniał: " + +#: templates/xadmin/auth/password_reset/email.html:10 +msgid "Thanks for using our site!" +msgstr "Dziękujemy za skorzystanie z naszej strony !" + +#: templates/xadmin/auth/password_reset/email.html:12 +#, python-format +msgid "The %(site_name)s team" +msgstr "%(site_name)s team" + +#: templates/xadmin/auth/password_reset/form.html:13 +msgid "Password reset" +msgstr "Reset hasła" + +#: templates/xadmin/auth/password_reset/form.html:17 +msgid "" +"Forgotten your password? Enter your e-mail address below, and we'll e-mail " +"instructions for setting a new one." +msgstr "" +"Zapomiałeś swoje hasło ? Wpisz Twój adres e-mail poniżej, a my prześlemy Ci " +"maila z instrukcjami, jak ustawić nowe." + +#: templates/xadmin/auth/password_reset/form.html:25 +msgid "E-mail address:" +msgstr "Adres e-mail:" + +#: templates/xadmin/auth/password_reset/form.html:33 +msgid "Reset my password" +msgstr "Zresetuj moje hasło" + +#: templates/xadmin/auth/user/add_form.html:6 +msgid "" +"First, enter a username and password. Then, you'll be able to edit more user " +"options." +msgstr "" +"Po pierwsze, wpisz nazwę użytkownika i hasło. Potem bedziesz mógł edytować " +"pozostałe opcje użytkownika." + +#: templates/xadmin/auth/user/add_form.html:8 +msgid "Enter a username and password." +msgstr "Wpisz nazwę użytkownika i hasło." + +#: templates/xadmin/auth/user/change_password.html:31 +#: templates/xadmin/views/batch_change_form.html:24 +#: templates/xadmin/views/form.html:18 +#: templates/xadmin/views/model_form.html:20 +msgid "Please correct the error below." +msgid_plural "Please correct the errors below." +msgstr[0] "Proszę napraw poniższy błąd." +msgstr[1] "Proszę napraw poniższe błędy." +msgstr[2] "Proszę napraw poniższe błędy." + +#: templates/xadmin/auth/user/change_password.html:38 +msgid "Enter your new password." +msgstr "Wpisz Twoje nowe hasło." + +#: templates/xadmin/auth/user/change_password.html:40 +#, python-format +msgid "Enter a new password for the user %(username)s." +msgstr "Wpisz nowe hasło dla użytkownika %(username)s." + +#: templates/xadmin/base_site.html:18 +msgid "Welcome," +msgstr "Witaj, " + +#: templates/xadmin/base_site.html:24 +msgid "Log out" +msgstr "Wyloguj" + +#: templates/xadmin/base_site.html:36 +msgid "You don't have permission to edit anything." +msgstr "Nie masz uprawnień by edytować cokolwiek." + +#: templates/xadmin/blocks/comm.top.theme.html:4 +msgid "Themes" +msgstr "Tematy" + +#: templates/xadmin/blocks/comm.top.topnav.html:9 +#: templates/xadmin/blocks/model_list.nav_form.search_form.html:8 +#: templates/xadmin/filters/char.html:7 +#: templates/xadmin/filters/fk_search.html:7 +#: templates/xadmin/filters/fk_search.html:16 +#: templates/xadmin/filters/number.html:7 +msgid "Search" +msgstr "Szukaj" + +#: templates/xadmin/blocks/comm.top.topnav.html:23 +msgid "Add" +msgstr "Dodaj" + +#: templates/xadmin/blocks/model_form.submit_line.wizard.html:9 +#: templates/xadmin/blocks/model_form.submit_line.wizard.html:26 +msgid "Prev step" +msgstr "Poprzedni krok" + +#: templates/xadmin/blocks/model_form.submit_line.wizard.html:13 +#: templates/xadmin/blocks/model_form.submit_line.wizard.html:29 +msgid "Next step" +msgstr "Następny krok" + +#: templates/xadmin/blocks/model_form.submit_line.wizard.html:15 +#: templates/xadmin/blocks/model_form.submit_line.wizard.html:31 +#: templates/xadmin/includes/submit_line.html:10 +#: templates/xadmin/includes/submit_line.html:13 +#: templates/xadmin/views/form.html:30 templates/xadmin/views/form.html:31 +msgid "Save" +msgstr "Zapisz" + +#: templates/xadmin/blocks/model_list.nav_menu.bookmarks.html:7 +msgid "Clean Bookmarks" +msgstr "Wyczyść zakłądki" + +#: templates/xadmin/blocks/model_list.nav_menu.bookmarks.html:18 +msgid "No Bookmarks" +msgstr "Brak zakładek" + +#: templates/xadmin/blocks/model_list.nav_menu.bookmarks.html:22 +msgid "New Bookmark" +msgstr "Nowa zakładka" + +#: templates/xadmin/blocks/model_list.nav_menu.bookmarks.html:26 +msgid "Save current page as Bookmark" +msgstr "Zapisz obecną stronę jako zakładkę" + +#: templates/xadmin/blocks/model_list.nav_menu.bookmarks.html:32 +msgid "Enter bookmark title" +msgstr "Wprowadź tytuł zakładki" + +#: templates/xadmin/blocks/model_list.nav_menu.bookmarks.html:33 +msgid "Waiting" +msgstr "Oczekuje" + +#: templates/xadmin/blocks/model_list.nav_menu.bookmarks.html:33 +msgid "Save Bookmark" +msgstr "Zapisz zakładkę" + +#: templates/xadmin/blocks/model_list.nav_menu.filters.html:4 +msgid "Filters" +msgstr "Filtry" + +#: templates/xadmin/blocks/model_list.nav_menu.filters.html:8 +msgid "Clean Filters" +msgstr "Wyczyść filtry" + +#: templates/xadmin/blocks/model_list.results_bottom.actions.html:19 +msgid "Click here to select the objects across all pages" +msgstr "Kliknij tutaj, aby wybrać wszystkie obiekty na wszystkich stronach" + +#: templates/xadmin/blocks/model_list.results_bottom.actions.html:19 +#, python-format +msgid "Select all %(total_count)s %(model_name)s" +msgstr "Wybierz wszystkie %(total_count)s %(model_name)s" + +#: templates/xadmin/blocks/model_list.results_bottom.actions.html:20 +msgid "Clear selection" +msgstr "Wyczyść wybór" + +#: templates/xadmin/blocks/model_list.results_top.charts.html:4 +msgid "Charts" +msgstr "Wykresy" + +#: templates/xadmin/blocks/model_list.top_toolbar.exports.html:4 +#: templates/xadmin/blocks/model_list.top_toolbar.exports.html:8 +#: templates/xadmin/blocks/model_list.top_toolbar.exports.html:19 +#: templates/xadmin/blocks/model_list.top_toolbar.exports.html:47 +msgid "Export" +msgstr "Eksportuj" + +#: templates/xadmin/blocks/model_list.top_toolbar.exports.html:26 +#: templates/xadmin/blocks/model_list.top_toolbar.exports.html:29 +#: templates/xadmin/blocks/model_list.top_toolbar.exports.html:32 +msgid "Export with table header." +msgstr "Eksportuj wraz z nagłówkiem tabeli." + +#: templates/xadmin/blocks/model_list.top_toolbar.exports.html:35 +#: templates/xadmin/blocks/model_list.top_toolbar.exports.html:38 +msgid "Export with format." +msgstr "Exportuj do formatu." + +#: templates/xadmin/blocks/model_list.top_toolbar.exports.html:42 +msgid "Export all data." +msgstr "Eksportuj wszystkie dane." + +#: templates/xadmin/blocks/model_list.top_toolbar.exports.html:46 +#: templates/xadmin/widgets/base.html:41 +msgid "Close" +msgstr "Zamknij" + +#: templates/xadmin/blocks/model_list.top_toolbar.layouts.html:4 +msgid "Layout" +msgstr "Układ graficzny" + +#: templates/xadmin/blocks/model_list.top_toolbar.refresh.html:8 +msgid "Clean Refresh" +msgstr "Wyczyść odświeżanie" + +#: templates/xadmin/blocks/model_list.top_toolbar.refresh.html:14 +#, python-format +msgid "Every %(t)s seconds" +msgstr "Co każde %(t)s sekund" + +#: templates/xadmin/blocks/model_list.top_toolbar.saveorder.html:4 +msgid "Save Order" +msgstr "" + +#: templates/xadmin/edit_inline/blank.html:5 views/detail.py:23 +#: views/edit.py:102 views/list.py:29 +msgid "Null" +msgstr "Null" + +#: templates/xadmin/filters/char.html:13 +msgid "Enter" +msgstr "Wejdź" + +#: templates/xadmin/filters/date.html:10 templates/xadmin/filters/date.html:13 +msgid "Choice Date" +msgstr "Data wyboru" + +#: templates/xadmin/filters/date.html:18 +msgid "YY" +msgstr "YY" + +#: templates/xadmin/filters/date.html:19 +msgid "year" +msgstr "rok" + +#: templates/xadmin/filters/date.html:22 +msgid "MM" +msgstr "MM" + +#: templates/xadmin/filters/date.html:23 +msgid "month" +msgstr "miesiąc" + +#: templates/xadmin/filters/date.html:26 +msgid "DD" +msgstr "DD" + +#: templates/xadmin/filters/date.html:27 +msgid "day" +msgstr "dzień" + +#: templates/xadmin/filters/date.html:29 templates/xadmin/filters/date.html:46 +#: templates/xadmin/filters/date.html:54 +#: templates/xadmin/filters/fk_search.html:24 +#: templates/xadmin/filters/number.html:37 +msgid "Apply" +msgstr "Zatwierdź" + +#: templates/xadmin/filters/date.html:34 +msgid "Date Range" +msgstr "Zakres dat" + +#: templates/xadmin/filters/date.html:41 +msgid "Select Date" +msgstr "Wybierz datę" + +#: templates/xadmin/filters/date.html:42 +msgid "From" +msgstr "Od" + +#: templates/xadmin/filters/date.html:44 +msgid "To" +msgstr "Do" + +#: templates/xadmin/filters/fk_search.html:14 +#, fuzzy +#| msgid "Select Date" +msgid "Select" +msgstr "Wybierz datę" + +#: templates/xadmin/filters/fk_search.html:26 +#: templates/xadmin/filters/number.html:39 +msgid "Clean" +msgstr "Wyczyść" + +#: templates/xadmin/filters/number.html:17 +#: templates/xadmin/filters/number.html:25 +#: templates/xadmin/filters/number.html:33 +msgid "Enter Number" +msgstr "Wpisz numer" + +#: templates/xadmin/filters/rel.html:3 +#, python-format +msgid " By %(filter_title)s " +msgstr " po %(filter_title)s" + +#: templates/xadmin/forms/transfer.html:4 +msgid "Available" +msgstr "Dostępny" + +#: templates/xadmin/forms/transfer.html:12 +msgid "Click to choose all at once." +msgstr "Kliknij by wybrać wszystkie za jednym razem." + +#: templates/xadmin/forms/transfer.html:12 +msgid "Choose all" +msgstr "Wybierz wszystkie" + +#: templates/xadmin/forms/transfer.html:16 +msgid "Choose" +msgstr "Wybierz" + +#: templates/xadmin/forms/transfer.html:19 +#: templates/xadmin/widgets/base.html:40 +msgid "Remove" +msgstr "Usuń" + +#: templates/xadmin/forms/transfer.html:23 +msgid "Chosen" +msgstr "Wybrane" + +#: templates/xadmin/forms/transfer.html:27 +msgid "Click to remove all chosen at once." +msgstr "Kliknij, by usunąć za jednym razem wszystkie wybrane." + +#: templates/xadmin/forms/transfer.html:27 +msgid "Remove all" +msgstr "Usuń wszystkie" + +#: templates/xadmin/includes/pagination.html:9 +msgid "Show all" +msgstr "Pokaż wszystkie" + +#: templates/xadmin/includes/submit_line.html:10 +#: templates/xadmin/includes/submit_line.html:13 +#: templates/xadmin/views/form.html:30 templates/xadmin/views/form.html:31 +msgid "Saving.." +msgstr "Zapisuję.." + +#: templates/xadmin/includes/submit_line.html:17 +msgid "Save as new" +msgstr "Zapisz jako nowe" + +#: templates/xadmin/includes/submit_line.html:18 +msgid "Save and add another" +msgstr "Zapisz i dodaj kolejne" + +#: templates/xadmin/includes/submit_line.html:19 +msgid "Save and continue editing" +msgstr "Zapisz i kontynuuj edycję" + +#: templates/xadmin/includes/submit_line.html:24 +#: templates/xadmin/views/model_detail.html:28 views/delete.py:93 +msgid "Delete" +msgstr "Usuń" + +#: templates/xadmin/views/app_index.html:13 +#, python-format +msgid "%(name)s" +msgstr "%(name)s" + +#: templates/xadmin/views/batch_change_form.html:11 +msgid "Change multiple objects" +msgstr "Zmień wiele obiektów" + +#: templates/xadmin/views/batch_change_form.html:16 +#, python-format +msgid "Change one %(objects_name)s" +msgid_plural "Batch change %(counter)s %(objects_name)s" +msgstr[0] "Zmień %(objects_name)s" +msgstr[1] "Grupowa zmiana %(counter)s %(objects_name)s" +msgstr[2] "Grupowa zmiana %(counter)s %(objects_name)s" + +#: templates/xadmin/views/batch_change_form.html:38 +msgid "Change Multiple" +msgstr "Zmień wiele" + +#: templates/xadmin/views/dashboard.html:15 +#: templates/xadmin/views/dashboard.html:22 +#: templates/xadmin/views/dashboard.html:23 +msgid "Add Widget" +msgstr "Dodaj widget" + +#: templates/xadmin/views/invalid_setup.html:13 +msgid "" +"Something's wrong with your database installation. Make sure the appropriate " +"database tables have been created, and make sure the database is readable by " +"the appropriate user." +msgstr "" +"Coś złego dzieje się z Twoją bazą danych. Upewnij się, że konieczne tabele w " +"Twojej bazie danych zostały skreowane i mogą być czytane przez właściwych " +"użytkowników." + +#: templates/xadmin/views/logged_out.html:16 +msgid "Logout Success" +msgstr "Wylogowanie zakończone sukcesem" + +#: templates/xadmin/views/logged_out.html:17 +msgid "Thanks for spending some quality time with the Web site today." +msgstr "Dzięki za spędzenie dzisiaj cennego czasu na naszej stronie." + +#: templates/xadmin/views/logged_out.html:19 +msgid "Close Window" +msgstr "Zamknij okno" + +#: templates/xadmin/views/logged_out.html:20 +msgid "Log in again" +msgstr "Zaloguj się ponownie" + +#: templates/xadmin/views/login.html:39 views/website.py:38 +msgid "Please Login" +msgstr "Proszę, zaloguj się" + +#: templates/xadmin/views/login.html:52 +msgid "Username" +msgstr "Nazwa użytkownika" + +#: templates/xadmin/views/login.html:64 +msgid "Password" +msgstr "Hasło" + +#: templates/xadmin/views/login.html:75 +msgid "log in" +msgstr "zaloguj się" + +#: templates/xadmin/views/model_dashboard.html:26 +#: templates/xadmin/views/model_detail.html:25 +msgid "Edit" +msgstr "Edytuj" + +#: templates/xadmin/views/model_delete_confirm.html:11 +#, python-format +msgid "" +"Deleting the %(verbose_name)s '%(escaped_object)s' would result in deleting " +"related objects, but your account doesn't have permission to delete the " +"following types of objects:" +msgstr "" +"Usunięcie %(verbose_name)s '%(escaped_object)s' spowoduje usunięcie " +"powiązanych obiektów, ale Twoje konto nie ma uprawnień do usunięcia " +"następujących typów obiektów:" + +#: templates/xadmin/views/model_delete_confirm.html:19 +#, python-format +msgid "" +"Deleting the %(verbose_name)s '%(escaped_object)s' would require deleting " +"the following protected related objects:" +msgstr "" +"Usunięcie %(verbose_name)s '%(escaped_object)s' będzie wymagać usunięcia " +"następujących, chronionych obiektów powiązanych:" + +#: templates/xadmin/views/model_delete_confirm.html:27 +#, python-format +msgid "" +"Are you sure you want to delete the %(verbose_name)s \"%(escaped_object)s\"? " +"All of the following related items will be deleted:" +msgstr "" +"Czy jesteś pewien, że chcesz usunąć %(verbose_name)s \"%(escaped_object)s" +"\" ? Wszystkie następujące powiązane obiekty zostaną usunięte:" + +#: templates/xadmin/views/model_delete_confirm.html:34 +#: templates/xadmin/views/model_delete_selected_confirm.html:49 +msgid "Yes, I'm sure" +msgstr "Tak, jestem pewny" + +#: templates/xadmin/views/model_delete_confirm.html:35 +#: templates/xadmin/views/model_delete_selected_confirm.html:50 +msgid "Cancel" +msgstr "Anuluj" + +#: templates/xadmin/views/model_delete_selected_confirm.html:10 +msgid "Delete multiple objects" +msgstr "Usuń wiele obiektów" + +#: templates/xadmin/views/model_delete_selected_confirm.html:18 +#, python-format +msgid "" +"Deleting the selected %(objects_name)s would result in deleting related " +"objects, but your account doesn't have permission to delete the following " +"types of objects:" +msgstr "" +"Usunięcie wybranego obiektów %(objects_name)s będzie skutkowało usunięciem " +"powiązanych obiektów, ale Twoje konto nie posiada uprawnień do usunięcia " +"następujących obiektów:" + +#: templates/xadmin/views/model_delete_selected_confirm.html:26 +#, python-format +msgid "" +"Deleting the selected %(objects_name)s would require deleting the following " +"protected related objects:" +msgstr "" +"Usunięcie zaznaczonych obiektów %(objects_name)s będzie wymagało usunięcia " +"następujących zabezpieczonych powiązanych obiektów:" + +#: templates/xadmin/views/model_delete_selected_confirm.html:34 +#, python-format +msgid "" +"Are you sure you want to delete the selected %(objects_name)s? All of the " +"following objects and their related items will be deleted:" +msgstr "" +"Jesteś pewny, że chcesz usunąc zaznaczone obiekty %(objects_name)s ? " +"Wszystkie następujące obiekty i ich powiązania zostaną usunięte:" + +#: templates/xadmin/views/model_history.html:26 +msgid "Diff" +msgstr "Różnica" + +#: templates/xadmin/views/model_history.html:27 +#: templates/xadmin/views/recover_list.html:25 +msgid "Date/time" +msgstr "Data/czas" + +#: templates/xadmin/views/model_history.html:28 +msgid "User" +msgstr "Użytkownik" + +#: templates/xadmin/views/model_history.html:29 +msgid "Comment" +msgstr "Komentarz" + +#: templates/xadmin/views/model_history.html:54 +msgid "Diff Select Versions" +msgstr "Róznica w wybranych wersjach" + +#: templates/xadmin/views/model_history.html:58 +msgid "" +"This object doesn't have a change history. It probably wasn't added via this " +"admin site." +msgstr "" +"Ten obiekt nie posiada historii zmian. Prawdopodobnie nie został on dodany " +"przez panel administratora." + +#: templates/xadmin/views/model_list.html:29 +#, python-format +msgid "Add %(name)s" +msgstr "Dodaj %(name)s" + +#: templates/xadmin/views/model_list.html:39 +msgid "Columns" +msgstr "Kolumny" + +#: templates/xadmin/views/model_list.html:42 +msgid "Restore Selected" +msgstr "Odzyskaj wybrane" + +#: templates/xadmin/views/model_list.html:147 +#: templates/xadmin/widgets/list.html:33 +msgid "Empty list" +msgstr "Pusta lista" + +#: templates/xadmin/views/recover_form.html:20 +msgid "Press the recover button below to recover this version of the object." +msgstr "Naciśnij przycisk odzyskiwania poniżej, by odzyskać tę wersję obiektu." + +#: templates/xadmin/views/recover_list.html:19 +msgid "" +"Choose a date from the list below to recover a deleted version of an object." +msgstr "" +"Wybierz datę z poniższej listy aby odzyskać usuniętą wersję danego obiektu." + +#: templates/xadmin/views/recover_list.html:39 +msgid "There are no deleted objects to recover." +msgstr "Nie ma usuniętych obiektów, które można odzyskać." + +#: templates/xadmin/views/revision_diff.html:12 +#: templates/xadmin/views/revision_diff.html:17 +#, python-format +msgid "Diff %(verbose_name)s" +msgstr "Róznice %(verbose_name)s" + +#: templates/xadmin/views/revision_diff.html:25 +msgid "Field" +msgstr "Pole" + +#: templates/xadmin/views/revision_diff.html:26 +msgid "Version A" +msgstr "Wersja A" + +#: templates/xadmin/views/revision_diff.html:27 +msgid "Version B" +msgstr "Wersja B" + +#: templates/xadmin/views/revision_diff.html:39 +msgid "Revert to" +msgstr "Przywróć do" + +#: templates/xadmin/views/revision_diff.html:40 +#: templates/xadmin/views/revision_diff.html:41 +msgid "Revert" +msgstr "Przywróć" + +#: templates/xadmin/views/revision_form.html:16 +#, python-format +msgid "Revert %(verbose_name)s" +msgstr "Przywróć %(verbose_name)s" + +#: templates/xadmin/views/revision_form.html:21 +msgid "Press the revert button below to revert to this version of the object." +msgstr "" +"Naciśnij przycisk przywracania poniżej, aby przywrócić obiekt do tej wersji." + +#: templates/xadmin/views/revision_form.html:27 +msgid "Revert this revision" +msgstr "Przywróć tę rewizję" + +#: templates/xadmin/widgets/addform.html:14 +msgid "Success" +msgstr "Sukces" + +#: templates/xadmin/widgets/addform.html:14 +msgid "Add success, click edit to edit." +msgstr "Dodawanie udane, kliknij edytuj aby edytować." + +#: templates/xadmin/widgets/addform.html:17 +msgid "Quick Add" +msgstr "Szybkie dodaj" + +#: templates/xadmin/widgets/base.html:31 +msgid "Widget Options" +msgstr "Opcje widgetów" + +#: templates/xadmin/widgets/base.html:42 +msgid "Save changes" +msgstr "Zapisz zmiany" + +#: views/base.py:315 +msgid "Django Xadmin" +msgstr "Django Xadmin" + +#: views/base.py:316 +#, fuzzy +#| msgid "my-company.inc 2013" +msgid "my-company.inc" +msgstr "moja-firma.inc 2013" + +#: views/dashboard.py:186 +msgid "Widget ID" +msgstr "ID widgetu" + +#: views/dashboard.py:187 +msgid "Widget Title" +msgstr "Tytuł widgetu" + +#: views/dashboard.py:252 +msgid "Html Content Widget, can write any html content in widget." +msgstr "Widget treści HTML, możesz wpisać dowolną treść HTMLową w ten widget." + +#: views/dashboard.py:255 +msgid "Html Content" +msgstr "Treść HTML" + +#: views/dashboard.py:318 +msgid "Target Model" +msgstr "Model docelowy" + +#: views/dashboard.py:369 +msgid "Quick button Widget, quickly open any page." +msgstr "Widget szybkich przycisków, pozwala szybko otworzyć dowolna stronę." + +#: views/dashboard.py:371 +msgid "Quick Buttons" +msgstr "Szybkie przyciski" + +#: views/dashboard.py:416 +msgid "Any Objects list Widget." +msgstr "Dowolny widget listy obiektów." + +#: views/dashboard.py:456 +msgid "Add any model object Widget." +msgstr "Dodaj dowolny widget modelu obiektu." + +#: views/dashboard.py:492 +msgid "Dashboard" +msgstr "Dashboard" + +#: views/dashboard.py:633 +#, python-format +msgid "%s Dashboard" +msgstr "%s Dashboard" + +#: views/delete.py:103 +#, python-format +msgid "The %(name)s \"%(obj)s\" was deleted successfully." +msgstr "%(name)s \"%(obj)s\" został usunięty z powodzeniem." + +#: views/detail.py:173 views/edit.py:211 views/form.py:72 +msgid "Other Fields" +msgstr "Inne pola" + +#: views/detail.py:235 +#, python-format +msgid "%s Detail" +msgstr "Szczegóły %s" + +#: views/edit.py:253 +msgid "Added." +msgstr "" + +#: views/edit.py:255 +#, fuzzy, python-format +#| msgid "Change %s" +msgid "Changed %s." +msgstr "Zmień %s" + +#: views/edit.py:255 +msgid "and" +msgstr "" + +#: views/edit.py:258 +msgid "No fields changed." +msgstr "" + +#: views/edit.py:420 +#, python-format +msgid "The %(name)s \"%(obj)s\" was added successfully." +msgstr "%(name)s \"%(obj)s\" został dodany z sukcesem." + +#: views/edit.py:425 views/edit.py:520 +msgid "You may edit it again below." +msgstr "Możesz edytować to powtórnie poniżej." + +#: views/edit.py:429 views/edit.py:523 +#, python-format +msgid "You may add another %s below." +msgstr "Możesz dodać kolejny %s poniżej." + +#: views/edit.py:471 +#, python-format +msgid "Change %s" +msgstr "Zmień %s" + +#: views/edit.py:516 +#, python-format +msgid "The %(name)s \"%(obj)s\" was changed successfully." +msgstr "%(name)s \"%(obj)s\" został zmieniony z powodzeniem." + +#: views/form.py:165 +#, python-format +msgid "The %s was changed successfully." +msgstr "%s został z sukcesem zmieniony." + +#: views/list.py:199 +msgid "Database error" +msgstr "Błąd bazy danych" + +#: views/list.py:373 +#, python-format +msgid "%s List" +msgstr "Lista %s" + +#: views/list.py:499 +msgid "Sort ASC" +msgstr "Sortuj ASC" + +#: views/list.py:500 +msgid "Sort DESC" +msgstr "Sortuj DESC" + +#: views/list.py:504 +msgid "Cancel Sort" +msgstr "Anuluj sortowanie" + +#: views/website.py:16 +msgid "Main Dashboard" +msgstr "Główny Dashboard" + +#: widgets.py:48 +msgid "Now" +msgstr "Teraz" diff --git "a/8\343\200\201\346\226\207\347\214\256\346\225\260\346\215\256\346\214\226\346\216\230\347\263\273\347\273\237(\351\231\204\346\272\220\347\240\201)/extra_apps/xadmin/locale/pl/LC_MESSAGES/djangojs.mo" "b/8\343\200\201\346\226\207\347\214\256\346\225\260\346\215\256\346\214\226\346\216\230\347\263\273\347\273\237(\351\231\204\346\272\220\347\240\201)/extra_apps/xadmin/locale/pl/LC_MESSAGES/djangojs.mo" new file mode 100644 index 0000000..9bfc00a Binary files /dev/null and "b/8\343\200\201\346\226\207\347\214\256\346\225\260\346\215\256\346\214\226\346\216\230\347\263\273\347\273\237(\351\231\204\346\272\220\347\240\201)/extra_apps/xadmin/locale/pl/LC_MESSAGES/djangojs.mo" differ diff --git "a/8\343\200\201\346\226\207\347\214\256\346\225\260\346\215\256\346\214\226\346\216\230\347\263\273\347\273\237(\351\231\204\346\272\220\347\240\201)/extra_apps/xadmin/locale/pl/LC_MESSAGES/djangojs.po" "b/8\343\200\201\346\226\207\347\214\256\346\225\260\346\215\256\346\214\226\346\216\230\347\263\273\347\273\237(\351\231\204\346\272\220\347\240\201)/extra_apps/xadmin/locale/pl/LC_MESSAGES/djangojs.po" new file mode 100644 index 0000000..b087169 --- /dev/null +++ "b/8\343\200\201\346\226\207\347\214\256\346\225\260\346\215\256\346\214\226\346\216\230\347\263\273\347\273\237(\351\231\204\346\272\220\347\240\201)/extra_apps/xadmin/locale/pl/LC_MESSAGES/djangojs.po" @@ -0,0 +1,83 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER +# This file is distributed under the same license as the PACKAGE package. +# FIRST AUTHOR , YEAR. +# +msgid "" +msgstr "" +"Project-Id-Version: django-xadmin\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2014-08-12 21:07+0200\n" +"PO-Revision-Date: 2014-08-12 21:23+0100\n" +"Last-Translator: Michał Szpadzik \n" +"Language-Team: Polish translators \n" +"Language: pl\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=3; plural=(n==1 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 " +"|| n%100>=20) ? 1 : 2);\n" +"X-Generator: Poedit 1.5.4\n" + +#: static/xadmin/js/xadmin.plugin.actions.js:11 +msgid "%(sel)s of %(cnt)s selected" +msgid_plural "%(sel)s of %(cnt)s selected" +msgstr[0] "%(sel)s z %(cnt)s wybranych" +msgstr[1] "%(sel)s z %(cnt)s wybranych" +msgstr[2] "%(sel)s z %(cnt)s wybranych" + +#: static/xadmin/js/xadmin.plugin.quick-form.js:172 +msgid "Close" +msgstr "Zamknij" + +#: static/xadmin/js/xadmin.plugin.quick-form.js:173 +msgid "Add" +msgstr "Dodaj" + +#: static/xadmin/js/xadmin.plugin.revision.js:25 +msgid "New Item" +msgstr "Nowy obiekt" + +#: static/xadmin/js/xadmin.widget.datetime.js:32 +msgid "Sunday Monday Tuesday Wednesday Thursday Friday Saturday Sunday" +msgstr "niedziela poniedziałek wtorek środa czwartek piątek sobota niedziela" + +#: static/xadmin/js/xadmin.widget.datetime.js:33 +msgid "Sun Mon Tue Wed Thu Fri Sat Sun" +msgstr "niedz. pon. wt. śr. czw. pt. sob. niedz." + +#: static/xadmin/js/xadmin.widget.datetime.js:34 +msgid "Su Mo Tu We Th Fr Sa Su" +msgstr "niedz. pn. wt. śr. czw. pt. sob. niedz." + +#: static/xadmin/js/xadmin.widget.datetime.js:35 +msgid "" +"January February March April May June July August September October November " +"December" +msgstr "" +"styczeń luty marzec kwiecień maj czerwiec lipiec sierpień wrzesień " +"październik " + +#: static/xadmin/js/xadmin.widget.datetime.js:36 +msgid "Jan Feb Mar Apr May Jun Jul Aug Sep Oct Nov Dec" +msgstr "sty. lut. marz. kwie. maj czerw. lip. sier. wrze. paź. list. grudz." + +#: static/xadmin/js/xadmin.widget.datetime.js:37 +msgid "Today" +msgstr "Dzisiaj" + +#: static/xadmin/js/xadmin.widget.datetime.js:38 +msgid "%a %d %b %Y %T %Z" +msgstr "%a %d %b %Y %T %Z" + +#: static/xadmin/js/xadmin.widget.datetime.js:39 +msgid "AM PM" +msgstr "AM PM" + +#: static/xadmin/js/xadmin.widget.datetime.js:40 +msgid "am pm" +msgstr "am pm" + +#: static/xadmin/js/xadmin.widget.datetime.js:43 +msgid "%T" +msgstr "%T" diff --git "a/8\343\200\201\346\226\207\347\214\256\346\225\260\346\215\256\346\214\226\346\216\230\347\263\273\347\273\237(\351\231\204\346\272\220\347\240\201)/extra_apps/xadmin/locale/pt_BR/LC_MESSAGES/django.mo" "b/8\343\200\201\346\226\207\347\214\256\346\225\260\346\215\256\346\214\226\346\216\230\347\263\273\347\273\237(\351\231\204\346\272\220\347\240\201)/extra_apps/xadmin/locale/pt_BR/LC_MESSAGES/django.mo" new file mode 100644 index 0000000..0187836 Binary files /dev/null and "b/8\343\200\201\346\226\207\347\214\256\346\225\260\346\215\256\346\214\226\346\216\230\347\263\273\347\273\237(\351\231\204\346\272\220\347\240\201)/extra_apps/xadmin/locale/pt_BR/LC_MESSAGES/django.mo" differ diff --git "a/8\343\200\201\346\226\207\347\214\256\346\225\260\346\215\256\346\214\226\346\216\230\347\263\273\347\273\237(\351\231\204\346\272\220\347\240\201)/extra_apps/xadmin/locale/pt_BR/LC_MESSAGES/django.po" "b/8\343\200\201\346\226\207\347\214\256\346\225\260\346\215\256\346\214\226\346\216\230\347\263\273\347\273\237(\351\231\204\346\272\220\347\240\201)/extra_apps/xadmin/locale/pt_BR/LC_MESSAGES/django.po" new file mode 100644 index 0000000..31d6ed0 --- /dev/null +++ "b/8\343\200\201\346\226\207\347\214\256\346\225\260\346\215\256\346\214\226\346\216\230\347\263\273\347\273\237(\351\231\204\346\272\220\347\240\201)/extra_apps/xadmin/locale/pt_BR/LC_MESSAGES/django.po" @@ -0,0 +1,1479 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER +# This file is distributed under the same license as the PACKAGE package. +# +# Translators: +# korndorfer , 2013 +# Ellison Leão, 2013 +# Gladson Simplício Brito , 2013 +# gladson , 2013 +msgid "" +msgstr "" +"Project-Id-Version: xadmin-core\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2016-07-20 13:28+0800\n" +"PO-Revision-Date: 2013-11-20 10:21+0000\n" +"Last-Translator: gladson \n" +"Language-Team: Portuguese (Brazil) (http://www.transifex.com/projects/p/" +"xadmin/language/pt_BR/)\n" +"Language: pt_BR\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=2; plural=(n > 1);\n" + +#: adminx.py:19 +msgid "Admin Object" +msgstr "" + +#: apps.py:11 +msgid "Administration" +msgstr "" + +#: filters.py:159 filters.py:191 filters.py:407 filters.py:493 filters.py:531 +msgid "All" +msgstr "Tudo" + +#: filters.py:160 plugins/export.py:165 +msgid "Yes" +msgstr "Sim" + +#: filters.py:161 plugins/export.py:165 +msgid "No" +msgstr "Não" + +#: filters.py:175 +msgid "Unknown" +msgstr "Desconhecido" + +#: filters.py:267 +msgid "Any date" +msgstr "Qualquer data" + +#: filters.py:268 +msgid "Has date" +msgstr "Tem data" + +#: filters.py:271 +msgid "Has no date" +msgstr "Não tem data" + +#: filters.py:274 widgets.py:30 +msgid "Today" +msgstr "Hoje" + +#: filters.py:278 +msgid "Past 7 days" +msgstr "Passados 7 dias" + +#: filters.py:282 +msgid "This month" +msgstr "Este mês" + +#: filters.py:286 +msgid "This year" +msgstr "Este ano" + +#: forms.py:10 +msgid "" +"Please enter the correct username and password for a staff account. Note " +"that both fields are case-sensitive." +msgstr "" +"Por favor, insira o nome de usuário e a senha corretamente para sua conta " +"pessoal. Perceba que ambos os campos são case-sensitive." + +#: forms.py:21 +msgid "Please log in again, because your session has expired." +msgstr "Por favor faça login novamente, porque a sua sessão expirou." + +#: forms.py:41 +#, python-format +msgid "Your e-mail address is not your username. Try '%s' instead." +msgstr "" +"O seu endereço de e-mail não é seu nome de usuário. Tente '% s' em seu lugar." + +#: models.py:48 +msgid "Title" +msgstr "Título" + +#: models.py:49 models.py:88 models.py:107 models.py:149 +msgid "user" +msgstr "Usuário" + +#: models.py:50 +msgid "Url Name" +msgstr "Nome da Url" + +#: models.py:52 +msgid "Query String" +msgstr "String de Consulta" + +#: models.py:53 +msgid "Is Shared" +msgstr "É Compartilhada" + +#: models.py:66 plugins/bookmark.py:50 plugins/bookmark.py:180 +msgid "Bookmark" +msgstr "Favorito" + +#: models.py:67 +msgid "Bookmarks" +msgstr "Favoritos" + +#: models.py:89 +msgid "Settings Key" +msgstr "Configuração da chave" + +#: models.py:90 +msgid "Settings Content" +msgstr "Configurações de conteúdo" + +#: models.py:102 +msgid "User Setting" +msgstr "Configuração de usuário" + +#: models.py:103 +msgid "User Settings" +msgstr "Configurações do Usuário" + +#: models.py:108 +msgid "Page" +msgstr "Página" + +#: models.py:109 views/dashboard.py:82 views/dashboard.py:92 +msgid "Widget Type" +msgstr "Tipo de Widget" + +#: models.py:110 views/dashboard.py:83 +msgid "Widget Params" +msgstr "Parâmetros do Widget" + +#: models.py:137 +msgid "User Widget" +msgstr "Widget do Usuário" + +#: models.py:138 +msgid "User Widgets" +msgstr "Widgets do Usuário" + +#: models.py:142 +#, fuzzy +#| msgid "Date/time" +msgid "action time" +msgstr "Data/Hora" + +#: models.py:151 +msgid "action ip" +msgstr "" + +#: models.py:155 +msgid "content type" +msgstr "" + +#: models.py:158 +msgid "object id" +msgstr "" + +#: models.py:159 +msgid "object repr" +msgstr "" + +#: models.py:160 +msgid "action flag" +msgstr "" + +#: models.py:161 +#, fuzzy +#| msgid "Change %s" +msgid "change message" +msgstr "Alterar %s" + +#: models.py:164 +#, fuzzy +#| msgid "log in" +msgid "log entry" +msgstr "Entrar" + +#: models.py:165 +msgid "log entries" +msgstr "" + +#: models.py:173 +#, python-format +msgid "Added \"%(object)s\"." +msgstr "" + +#: models.py:175 +#, fuzzy, python-format +#| msgid "Change one %(objects_name)s" +#| msgid_plural "Batch change %(counter)s %(objects_name)s" +msgid "Changed \"%(object)s\" - %(changes)s" +msgstr "Alterar um %(objects_name)s" + +#: models.py:180 +#, fuzzy, python-format +#| msgid "Related Objects" +msgid "Deleted \"%(object)s.\"" +msgstr "Objetos Relacionados" + +#: plugins/actions.py:57 +#, python-format +msgid "Delete selected %(verbose_name_plural)s" +msgstr "Excluir selecionado %(verbose_name_plural)s" + +#: plugins/actions.py:72 +#, fuzzy, python-format +#| msgid "Successfully deleted %(count)d %(items)s." +msgid "Batch delete %(count)d %(items)s." +msgstr "Excluído com sucesso %(count)d %(items)s." + +#: plugins/actions.py:78 +#, python-format +msgid "Successfully deleted %(count)d %(items)s." +msgstr "Excluído com sucesso %(count)d %(items)s." + +#: plugins/actions.py:110 views/delete.py:70 +#, python-format +msgid "Cannot delete %(name)s" +msgstr "Não é possível excluir %(name)s" + +#: plugins/actions.py:112 views/delete.py:73 +msgid "Are you sure?" +msgstr "Você tem certeza?" + +#: plugins/actions.py:158 +#, python-format +msgid "%(total_count)s selected" +msgid_plural "All %(total_count)s selected" +msgstr[0] "Todos %(total_count)s selecionados" +msgstr[1] "Todos %(total_count)s selecionados" + +#: plugins/actions.py:162 +#, python-format +msgid "0 of %(cnt)s selected" +msgstr "0 de %(cnt)s selecionados" + +#: plugins/actions.py:179 plugins/actions.py:189 +msgid "" +"Items must be selected in order to perform actions on them. No items have " +"been changed." +msgstr "" +"Os itens devem ser selecionados, a fim de executar ações sobre eles. Não há " +"itens alterados." + +#: plugins/aggregation.py:14 +msgid "Min" +msgstr "Min" + +#: plugins/aggregation.py:14 +msgid "Max" +msgstr "Max" + +#: plugins/aggregation.py:14 +msgid "Avg" +msgstr "Médio" + +#: plugins/aggregation.py:14 +msgid "Sum" +msgstr "Soma" + +#: plugins/aggregation.py:14 +msgid "Count" +msgstr "Contar" + +#: plugins/auth.py:21 +#, fuzzy, python-format +msgid "Can add %s" +msgstr "Pode ver %s" + +#: plugins/auth.py:22 +#, fuzzy, python-format +msgid "Can change %s" +msgstr "Alterar %s" + +#: plugins/auth.py:23 +#, fuzzy, python-format +msgid "Can edit %s" +msgstr "Pode ver %s" + +#: plugins/auth.py:24 +#, fuzzy, python-format +msgid "Can delete %s" +msgstr "Não é possível excluir %(name)s" + +#: plugins/auth.py:25 +#, python-format +msgid "Can view %s" +msgstr "Pode ver %s" + +#: plugins/auth.py:87 +msgid "Personal info" +msgstr "Informações pessoais" + +#: plugins/auth.py:91 +msgid "Permissions" +msgstr "Permissões" + +#: plugins/auth.py:94 +msgid "Important dates" +msgstr "Datas importantes" + +#: plugins/auth.py:99 +msgid "Status" +msgstr "Status" + +#: plugins/auth.py:111 +#, fuzzy +msgid "Permission Name" +msgstr "Permissões" + +#: plugins/auth.py:167 +msgid "Change Password" +msgstr "Alterar Senha" + +#: plugins/auth.py:198 +#, python-format +msgid "Change password: %s" +msgstr "Alterar senha: %s" + +#: plugins/auth.py:223 plugins/auth.py:255 +msgid "Password changed successfully." +msgstr "Senha alterada com sucesso." + +#: plugins/auth.py:242 templates/xadmin/auth/user/change_password.html:11 +#: templates/xadmin/auth/user/change_password.html:22 +#: templates/xadmin/auth/user/change_password.html:55 +msgid "Change password" +msgstr "Alterar a senha" + +#: plugins/batch.py:44 +msgid "Change this field" +msgstr "Alterar este campo" + +#: plugins/batch.py:65 +#, python-format +msgid "Batch Change selected %(verbose_name_plural)s" +msgstr "Alterar lote selecionado %(verbose_name_plural)s" + +#: plugins/batch.py:89 +#, python-format +msgid "Successfully change %(count)d %(items)s." +msgstr "Alterado com sucesso %(count)d %(items)s." + +#: plugins/batch.py:138 +#, python-format +msgid "Batch change %s" +msgstr "Lote alterado %s" + +#: plugins/bookmark.py:173 +msgid "bookmark" +msgstr "Favorito" + +#: plugins/bookmark.py:176 +msgid "Bookmark Widget, can show user's bookmark list data in widget." +msgstr "" +"Widget de Marcador, pode mostrar a lista de marcadores do usuário no widget" + +#: plugins/chart.py:25 +msgid "Show models simple chart." +msgstr "Mostrar modelos gráfico simples." + +#: plugins/chart.py:51 +#, python-format +msgid "%s Charts" +msgstr "%s Gráficos" + +#: plugins/comments.py:33 +msgid "Metadata" +msgstr "" + +#: plugins/comments.py:60 +msgid "flagged" +msgid_plural "flagged" +msgstr[0] "" +msgstr[1] "" + +#: plugins/comments.py:61 +msgid "Flag selected comments" +msgstr "" + +#: plugins/comments.py:66 +msgid "approved" +msgid_plural "approved" +msgstr[0] "" +msgstr[1] "" + +#: plugins/comments.py:67 +msgid "Approve selected comments" +msgstr "" + +#: plugins/comments.py:72 +#, fuzzy +msgid "removed" +msgid_plural "removed" +msgstr[0] "Remover" +msgstr[1] "Remover" + +#: plugins/comments.py:73 +#, fuzzy +msgid "Remove selected comments" +msgstr "Recuperar deletado %(name)s" + +#: plugins/comments.py:86 +#, python-format +msgid "1 comment was successfully %(action)s." +msgid_plural "%(count)s comments were successfully %(action)s." +msgstr[0] "" +msgstr[1] "" + +#: plugins/details.py:52 views/list.py:578 +#, python-format +msgid "Details of %s" +msgstr "Detalhes de %s" + +#: plugins/editable.py:46 +#, python-format +msgid "Enter %s" +msgstr "Entrar %s" + +#: plugins/editable.py:73 views/dashboard.py:649 views/delete.py:27 +#: views/detail.py:145 views/edit.py:454 +#, python-format +msgid "%(name)s object with primary key %(key)r does not exist." +msgstr "%(name)s objeto com chave primária %(key)r não existe." + +#: plugins/export.py:98 plugins/export.py:135 +msgid "Sheet" +msgstr "Planilha" + +#: plugins/filters.py:133 plugins/quickfilter.py:141 +#, python-format +msgid "Filtering error: %s" +msgstr "Filtrar erro: %s" + +#: plugins/images.py:29 +msgid "Previous" +msgstr "Anterior" + +#: plugins/images.py:29 +msgid "Next" +msgstr "Próximo" + +#: plugins/images.py:29 +msgid "Slideshow" +msgstr "Slideshow" + +#: plugins/images.py:29 +msgid "Download" +msgstr "Baixar" + +#: plugins/images.py:50 +msgid "Change:" +msgstr "Alterar:" + +#: plugins/layout.py:16 +msgid "Table" +msgstr "Tabela" + +#: plugins/layout.py:22 +msgid "Thumbnails" +msgstr "Miniaturas" + +#: plugins/passwords.py:64 +msgid "Forgotten your password or username?" +msgstr "Esqueceu seu nome de usuário ou senha?" + +#: plugins/quickform.py:79 +#, python-format +msgid "Create New %s" +msgstr "Criar novo %s" + +#: plugins/relate.py:104 +msgid "Related Objects" +msgstr "Objetos Relacionados" + +#: plugins/relfield.py:29 plugins/topnav.py:38 +#, python-format +msgid "Search %s" +msgstr "Pesquisar %s" + +#: plugins/relfield.py:67 +#, fuzzy, python-format +#| msgid "Select Date" +msgid "Select %s" +msgstr "Selecionar Data" + +#: plugins/themes.py:47 +msgid "Default" +msgstr "Padrão" + +#: plugins/themes.py:48 +msgid "Default bootstrap theme" +msgstr "Tema padrão bootstrap" + +#: plugins/themes.py:49 +msgid "Bootstrap2" +msgstr "Bootstrap2" + +#: plugins/themes.py:49 +msgid "Bootstrap 2.x theme" +msgstr "Tema Bootstrap 2.x" + +#: plugins/topnav.py:62 views/dashboard.py:465 views/edit.py:387 +#: views/edit.py:396 +#, python-format +msgid "Add %s" +msgstr "Adicionar %s" + +#: plugins/xversion.py:106 +msgid "Initial version." +msgstr "Versão inicial." + +#: plugins/xversion.py:108 +msgid "Change version." +msgstr "Alterar versão." + +#: plugins/xversion.py:110 +msgid "Revert version." +msgstr "Reverter versão." + +#: plugins/xversion.py:112 +msgid "Rercover version." +msgstr "Recuperar versão." + +#: plugins/xversion.py:114 +#, python-format +msgid "Deleted %(verbose_name)s." +msgstr "Excluídos %(verbose_name)s." + +#: plugins/xversion.py:127 templates/xadmin/views/recover_form.html:26 +msgid "Recover" +msgstr "Recuperar" + +#: plugins/xversion.py:143 templates/xadmin/views/model_history.html:11 +#: templates/xadmin/views/revision_diff.html:11 +#: templates/xadmin/views/revision_form.html:15 +msgid "History" +msgstr "Histórico" + +#: plugins/xversion.py:194 templates/xadmin/views/recover_form.html:14 +#: templates/xadmin/views/recover_list.html:10 +#, python-format +msgid "Recover deleted %(name)s" +msgstr "Recuperar deletado %(name)s" + +#: plugins/xversion.py:238 +#, python-format +msgid "Change history: %s" +msgstr "Alterar histórico: %s" + +#: plugins/xversion.py:288 +msgid "Must select two versions." +msgstr "É necessário selecionar 2 versões" + +#: plugins/xversion.py:296 +msgid "Please select two different versions." +msgstr "Por favor selecione duas versões diferentes." + +#: plugins/xversion.py:383 plugins/xversion.py:500 +#, python-format +msgid "Current: %s" +msgstr "Atual: %s" + +#: plugins/xversion.py:424 +#, python-format +msgid "Revert %s" +msgstr "Revertido: %s" + +#: plugins/xversion.py:440 +#, python-format +msgid "" +"The %(model)s \"%(name)s\" was reverted successfully. You may edit it again " +"below." +msgstr "" +"%(model)s \"%(name)s\" foi revertido(a) com sucesso. Você pode editá-lo(a) " +"novamente abaixo." + +#: plugins/xversion.py:461 +#, python-format +msgid "Recover %s" +msgstr "Recuperar %s" + +#: plugins/xversion.py:477 +#, python-format +msgid "" +"The %(model)s \"%(name)s\" was recovered successfully. You may edit it again " +"below." +msgstr "" +"%(model)s \"%(name)s\" foi recuperado(a) com sucesso. Você pode editá-lo(a) " +"novamente abaixo." + +#: templates/xadmin/404.html:4 templates/xadmin/404.html:8 +msgid "Page not found" +msgstr "Página não encontrada" + +#: templates/xadmin/404.html:10 +msgid "We're sorry, but the requested page could not be found." +msgstr "Pedimos desculpas, mas a página solicitada não foi encontrada." + +#: templates/xadmin/500.html:7 +#: templates/xadmin/auth/user/change_password.html:10 +#: templates/xadmin/auth/user/change_password.html:15 +#: templates/xadmin/base_site.html:53 +#: templates/xadmin/includes/sitemenu_default.html:7 +#: templates/xadmin/views/app_index.html:9 +#: templates/xadmin/views/batch_change_form.html:9 +#: templates/xadmin/views/invalid_setup.html:7 +#: templates/xadmin/views/model_dashboard.html:7 +#: templates/xadmin/views/model_delete_selected_confirm.html:8 +#: templates/xadmin/views/model_history.html:8 +#: templates/xadmin/views/recover_form.html:8 +#: templates/xadmin/views/recover_list.html:8 +#: templates/xadmin/views/revision_diff.html:8 +#: templates/xadmin/views/revision_form.html:8 views/base.py:473 +msgid "Home" +msgstr "Início" + +#: templates/xadmin/500.html:8 +msgid "Server error" +msgstr "Erro do servidor" + +#: templates/xadmin/500.html:12 +msgid "Server error (500)" +msgstr "Erro do servidor (500)" + +#: templates/xadmin/500.html:15 +msgid "Server Error (500)" +msgstr "Erro do Servidor (500)" + +#: templates/xadmin/500.html:16 +msgid "" +"There's been an error. It's been reported to the site administrators via e-" +"mail and should be fixed shortly. Thanks for your patience." +msgstr "" +"Ocorreu um erro. E foi relatado aos administradores do site via e-mail e " +"deve ser corrigido em breve. Obrigado por sua paciência." + +#: templates/xadmin/auth/password_reset/complete.html:11 +#: templates/xadmin/auth/password_reset/done.html:11 +msgid "Password reset successful" +msgstr "Redefinição de senha completada." + +#: templates/xadmin/auth/password_reset/complete.html:14 +msgid "Your password has been set. You may go ahead and log in now." +msgstr "Sua senha foi definida. Você pode seguir e entrar agora." + +#: templates/xadmin/auth/password_reset/complete.html:15 +msgid "Log in" +msgstr "Entrar" + +#: templates/xadmin/auth/password_reset/confirm.html:12 +msgid "Enter new password" +msgstr "Digite a nova senha" + +#: templates/xadmin/auth/password_reset/confirm.html:17 +msgid "" +"Please enter your new password twice so we can verify you typed it in " +"correctly." +msgstr "" +"Por favor forneça sua nova senha 2 vezes para que possamos verificar se a " +"mesma foi digitada corretamente." + +#: templates/xadmin/auth/password_reset/confirm.html:19 +msgid "Change my password" +msgstr "Alterar minha senha" + +#: templates/xadmin/auth/password_reset/confirm.html:24 +msgid "Password reset unsuccessful" +msgstr "A senha foi redefinida com sucesso" + +#: templates/xadmin/auth/password_reset/confirm.html:27 +msgid "" +"The password reset link was invalid, possibly because it has already been " +"used. Please request a new password reset." +msgstr "" +"O link de redefinição de senha era inválida, possivelmente porque ele já foi " +"usado. Por favor, solicite uma nova redefinição de senha." + +#: templates/xadmin/auth/password_reset/done.html:14 +msgid "" +"We've e-mailed you instructions for setting your password to the e-mail " +"address you submitted. You should be receiving it shortly." +msgstr "" +"Nós enviamos um e-mail com instruções para configurar sua senha para o " +"endereço de e-mail que você solicitou. Você deve recebê-lo em breve." + +#: templates/xadmin/auth/password_reset/email.html:2 +#, python-format +msgid "" +"You're receiving this e-mail because you requested a password reset for your " +"user account at %(site_name)s." +msgstr "" +"Você está recebendo este e-mail porque você pediu uma redefinição de senha " +"para sua conta de usuário em %(site_name)s." + +#: templates/xadmin/auth/password_reset/email.html:4 +msgid "Please go to the following page and choose a new password:" +msgstr "Por favor, vá para a página seguinte e escolha uma nova senha:" + +#: templates/xadmin/auth/password_reset/email.html:8 +msgid "Your username, in case you've forgotten:" +msgstr "Seu nome de usuário, para o caso de ter esquecido:" + +#: templates/xadmin/auth/password_reset/email.html:10 +msgid "Thanks for using our site!" +msgstr "Obrigado por utilizar o nosso site!" + +#: templates/xadmin/auth/password_reset/email.html:12 +#, python-format +msgid "The %(site_name)s team" +msgstr "A equipe %(site_name)s" + +#: templates/xadmin/auth/password_reset/form.html:13 +msgid "Password reset" +msgstr "Redefinição de senha" + +#: templates/xadmin/auth/password_reset/form.html:17 +msgid "" +"Forgotten your password? Enter your e-mail address below, and we'll e-mail " +"instructions for setting a new one." +msgstr "" +"Esqueceu sua senha? Forneça seu endereço de e-mail abaixo, e nós lhe " +"enviaremos instruções para definir uma nova." + +#: templates/xadmin/auth/password_reset/form.html:25 +msgid "E-mail address:" +msgstr "Endereço de e-mail:" + +#: templates/xadmin/auth/password_reset/form.html:33 +msgid "Reset my password" +msgstr "Redefinir minha senha" + +#: templates/xadmin/auth/user/add_form.html:6 +msgid "" +"First, enter a username and password. Then, you'll be able to edit more user " +"options." +msgstr "" +"Primeiro, insira um nome de usuário e senha. Então, você vai ser capaz de " +"editar mais opções do usuário." + +#: templates/xadmin/auth/user/add_form.html:8 +msgid "Enter a username and password." +msgstr "Forneça um nome de usuário e uma senha." + +#: templates/xadmin/auth/user/change_password.html:31 +#: templates/xadmin/views/batch_change_form.html:24 +#: templates/xadmin/views/form.html:18 +#: templates/xadmin/views/model_form.html:20 +msgid "Please correct the error below." +msgid_plural "Please correct the errors below." +msgstr[0] "Por favor corrija o erro abaixo." +msgstr[1] "Por favor corrija os erros abaixo." + +#: templates/xadmin/auth/user/change_password.html:38 +msgid "Enter your new password." +msgstr "Digite sua nova senha." + +#: templates/xadmin/auth/user/change_password.html:40 +#, python-format +msgid "Enter a new password for the user %(username)s." +msgstr "Digite uma nova senha para o usuário %(username)s." + +#: templates/xadmin/base_site.html:18 +msgid "Welcome," +msgstr "Bem-Vindo," + +#: templates/xadmin/base_site.html:24 +msgid "Log out" +msgstr "Sair" + +#: templates/xadmin/base_site.html:36 +msgid "You don't have permission to edit anything." +msgstr "Você não tem permissão para editar nada." + +#: templates/xadmin/blocks/comm.top.theme.html:4 +msgid "Themes" +msgstr "Temas" + +#: templates/xadmin/blocks/comm.top.topnav.html:9 +#: templates/xadmin/blocks/model_list.nav_form.search_form.html:8 +#: templates/xadmin/filters/char.html:7 +#: templates/xadmin/filters/fk_search.html:7 +#: templates/xadmin/filters/fk_search.html:16 +#: templates/xadmin/filters/number.html:7 +msgid "Search" +msgstr "Pesquisar" + +#: templates/xadmin/blocks/comm.top.topnav.html:23 +msgid "Add" +msgstr "Adicionar" + +#: templates/xadmin/blocks/model_form.submit_line.wizard.html:9 +#: templates/xadmin/blocks/model_form.submit_line.wizard.html:26 +msgid "Prev step" +msgstr "Passo anterior" + +#: templates/xadmin/blocks/model_form.submit_line.wizard.html:13 +#: templates/xadmin/blocks/model_form.submit_line.wizard.html:29 +msgid "Next step" +msgstr "Próximo passo" + +#: templates/xadmin/blocks/model_form.submit_line.wizard.html:15 +#: templates/xadmin/blocks/model_form.submit_line.wizard.html:31 +#: templates/xadmin/includes/submit_line.html:10 +#: templates/xadmin/includes/submit_line.html:13 +#: templates/xadmin/views/form.html:30 templates/xadmin/views/form.html:31 +msgid "Save" +msgstr "Gravar" + +#: templates/xadmin/blocks/model_list.nav_menu.bookmarks.html:7 +msgid "Clean Bookmarks" +msgstr "Limpar Favoritos" + +#: templates/xadmin/blocks/model_list.nav_menu.bookmarks.html:18 +msgid "No Bookmarks" +msgstr "Sem Favoritos" + +#: templates/xadmin/blocks/model_list.nav_menu.bookmarks.html:22 +msgid "New Bookmark" +msgstr "Novo Favorito" + +#: templates/xadmin/blocks/model_list.nav_menu.bookmarks.html:26 +msgid "Save current page as Bookmark" +msgstr "Marcar a página atual como favorito" + +#: templates/xadmin/blocks/model_list.nav_menu.bookmarks.html:32 +msgid "Enter bookmark title" +msgstr "Digite o título do favorito" + +#: templates/xadmin/blocks/model_list.nav_menu.bookmarks.html:33 +msgid "Waiting" +msgstr "Aguardando" + +#: templates/xadmin/blocks/model_list.nav_menu.bookmarks.html:33 +msgid "Save Bookmark" +msgstr "Marcar Favorito" + +#: templates/xadmin/blocks/model_list.nav_menu.filters.html:4 +msgid "Filters" +msgstr "Filtros" + +#: templates/xadmin/blocks/model_list.nav_menu.filters.html:8 +msgid "Clean Filters" +msgstr "Limpar Filtros" + +#: templates/xadmin/blocks/model_list.results_bottom.actions.html:19 +msgid "Click here to select the objects across all pages" +msgstr "Clique aqui para selecionar os objetos através de todas as páginas" + +#: templates/xadmin/blocks/model_list.results_bottom.actions.html:19 +#, python-format +msgid "Select all %(total_count)s %(model_name)s" +msgstr "Selecionar todos %(total_count)s %(model_name)s" + +#: templates/xadmin/blocks/model_list.results_bottom.actions.html:20 +msgid "Clear selection" +msgstr "Limpar Seleção" + +#: templates/xadmin/blocks/model_list.results_top.charts.html:4 +msgid "Charts" +msgstr "Gráficos" + +#: templates/xadmin/blocks/model_list.top_toolbar.exports.html:4 +#: templates/xadmin/blocks/model_list.top_toolbar.exports.html:8 +#: templates/xadmin/blocks/model_list.top_toolbar.exports.html:19 +#: templates/xadmin/blocks/model_list.top_toolbar.exports.html:47 +msgid "Export" +msgstr "Exportar" + +#: templates/xadmin/blocks/model_list.top_toolbar.exports.html:26 +#: templates/xadmin/blocks/model_list.top_toolbar.exports.html:29 +#: templates/xadmin/blocks/model_list.top_toolbar.exports.html:32 +msgid "Export with table header." +msgstr "Exportar com cabeçalho da tabela" + +#: templates/xadmin/blocks/model_list.top_toolbar.exports.html:35 +#: templates/xadmin/blocks/model_list.top_toolbar.exports.html:38 +msgid "Export with format." +msgstr "Exportar com o formato." + +#: templates/xadmin/blocks/model_list.top_toolbar.exports.html:42 +msgid "Export all data." +msgstr "Exportar todos os dados." + +#: templates/xadmin/blocks/model_list.top_toolbar.exports.html:46 +#: templates/xadmin/widgets/base.html:41 +msgid "Close" +msgstr "Fechar" + +#: templates/xadmin/blocks/model_list.top_toolbar.layouts.html:4 +msgid "Layout" +msgstr "Layout" + +#: templates/xadmin/blocks/model_list.top_toolbar.refresh.html:8 +msgid "Clean Refresh" +msgstr "Atualização Limpa" + +#: templates/xadmin/blocks/model_list.top_toolbar.refresh.html:14 +#, python-format +msgid "Every %(t)s seconds" +msgstr "A cada %(t)s segundos" + +#: templates/xadmin/blocks/model_list.top_toolbar.saveorder.html:4 +msgid "Save Order" +msgstr "" + +#: templates/xadmin/edit_inline/blank.html:5 views/detail.py:23 +#: views/edit.py:102 views/list.py:29 +msgid "Null" +msgstr "Nulo" + +#: templates/xadmin/filters/char.html:13 +msgid "Enter" +msgstr "Entrar" + +#: templates/xadmin/filters/date.html:10 templates/xadmin/filters/date.html:13 +msgid "Choice Date" +msgstr "Data Escolhida" + +#: templates/xadmin/filters/date.html:18 +msgid "YY" +msgstr "YY" + +#: templates/xadmin/filters/date.html:19 +msgid "year" +msgstr "ano" + +#: templates/xadmin/filters/date.html:22 +msgid "MM" +msgstr "MM" + +#: templates/xadmin/filters/date.html:23 +msgid "month" +msgstr "mês" + +#: templates/xadmin/filters/date.html:26 +msgid "DD" +msgstr "DD" + +#: templates/xadmin/filters/date.html:27 +msgid "day" +msgstr "dia" + +#: templates/xadmin/filters/date.html:29 templates/xadmin/filters/date.html:46 +#: templates/xadmin/filters/date.html:54 +#: templates/xadmin/filters/fk_search.html:24 +#: templates/xadmin/filters/number.html:37 +msgid "Apply" +msgstr "Aplicar" + +#: templates/xadmin/filters/date.html:34 +msgid "Date Range" +msgstr "Intervalo de Datas" + +#: templates/xadmin/filters/date.html:41 +msgid "Select Date" +msgstr "Selecionar Data" + +#: templates/xadmin/filters/date.html:42 +msgid "From" +msgstr "De" + +#: templates/xadmin/filters/date.html:44 +msgid "To" +msgstr "Para" + +#: templates/xadmin/filters/fk_search.html:14 +#, fuzzy +#| msgid "Select Date" +msgid "Select" +msgstr "Selecionar Data" + +#: templates/xadmin/filters/fk_search.html:26 +#: templates/xadmin/filters/number.html:39 +msgid "Clean" +msgstr "Limpar" + +#: templates/xadmin/filters/number.html:17 +#: templates/xadmin/filters/number.html:25 +#: templates/xadmin/filters/number.html:33 +msgid "Enter Number" +msgstr "Digite o Número" + +#: templates/xadmin/filters/rel.html:3 +#, python-format +msgid " By %(filter_title)s " +msgstr " Por %(filter_title)s " + +#: templates/xadmin/forms/transfer.html:4 +msgid "Available" +msgstr "Disponível" + +#: templates/xadmin/forms/transfer.html:12 +msgid "Click to choose all at once." +msgstr "Clique para selecionar tudo de uma só vez." + +#: templates/xadmin/forms/transfer.html:12 +msgid "Choose all" +msgstr "Escolher tudo" + +#: templates/xadmin/forms/transfer.html:16 +msgid "Choose" +msgstr "Escolher" + +#: templates/xadmin/forms/transfer.html:19 +#: templates/xadmin/widgets/base.html:40 +msgid "Remove" +msgstr "Remover" + +#: templates/xadmin/forms/transfer.html:23 +msgid "Chosen" +msgstr "Escolhido" + +#: templates/xadmin/forms/transfer.html:27 +msgid "Click to remove all chosen at once." +msgstr "Clique para remover todos os escolhidos de uma vez." + +#: templates/xadmin/forms/transfer.html:27 +msgid "Remove all" +msgstr "Remover tudo" + +#: templates/xadmin/includes/pagination.html:9 +msgid "Show all" +msgstr "Mostrar Tudo" + +#: templates/xadmin/includes/submit_line.html:10 +#: templates/xadmin/includes/submit_line.html:13 +#: templates/xadmin/views/form.html:30 templates/xadmin/views/form.html:31 +msgid "Saving.." +msgstr "Salvando..." + +#: templates/xadmin/includes/submit_line.html:17 +msgid "Save as new" +msgstr "Gravar como novo" + +#: templates/xadmin/includes/submit_line.html:18 +msgid "Save and add another" +msgstr "Gravar e adicionar outro" + +#: templates/xadmin/includes/submit_line.html:19 +msgid "Save and continue editing" +msgstr "Gravar e continuar editando" + +#: templates/xadmin/includes/submit_line.html:24 +#: templates/xadmin/views/model_detail.html:28 views/delete.py:93 +msgid "Delete" +msgstr "Excluir" + +#: templates/xadmin/views/app_index.html:13 +#, python-format +msgid "%(name)s" +msgstr "%(name)s" + +#: templates/xadmin/views/batch_change_form.html:11 +msgid "Change multiple objects" +msgstr "Alterar múltiplos objetos" + +#: templates/xadmin/views/batch_change_form.html:16 +#, python-format +msgid "Change one %(objects_name)s" +msgid_plural "Batch change %(counter)s %(objects_name)s" +msgstr[0] "Alterar um %(objects_name)s" +msgstr[1] "Alterar lote %(counter)s %(objects_name)s" + +#: templates/xadmin/views/batch_change_form.html:38 +msgid "Change Multiple" +msgstr "Alterar Múltiplos" + +#: templates/xadmin/views/dashboard.html:15 +#: templates/xadmin/views/dashboard.html:22 +#: templates/xadmin/views/dashboard.html:23 +msgid "Add Widget" +msgstr "Adicionar Widget" + +#: templates/xadmin/views/invalid_setup.html:13 +msgid "" +"Something's wrong with your database installation. Make sure the appropriate " +"database tables have been created, and make sure the database is readable by " +"the appropriate user." +msgstr "" +"Algo está errado com a instalação do banco de dados. Certifique-se que as " +"tabelas foram criadas apropriadamente, e certifique-se que o banco de dados " +"pode ser lido pelo usuário apropriado." + +#: templates/xadmin/views/logged_out.html:16 +msgid "Logout Success" +msgstr "Saída com Sucesso" + +#: templates/xadmin/views/logged_out.html:17 +msgid "Thanks for spending some quality time with the Web site today." +msgstr "Obrigado por gastar algum tempo de qualidade com o site hoje." + +#: templates/xadmin/views/logged_out.html:19 +msgid "Close Window" +msgstr "Fechar Janela" + +#: templates/xadmin/views/logged_out.html:20 +msgid "Log in again" +msgstr "Entrar novamente" + +#: templates/xadmin/views/login.html:39 views/website.py:38 +msgid "Please Login" +msgstr "Por Favor Autentique-se" + +#: templates/xadmin/views/login.html:52 +msgid "Username" +msgstr "Nome de Usuário" + +#: templates/xadmin/views/login.html:64 +msgid "Password" +msgstr "Senha" + +#: templates/xadmin/views/login.html:75 +msgid "log in" +msgstr "Entrar" + +#: templates/xadmin/views/model_dashboard.html:26 +#: templates/xadmin/views/model_detail.html:25 +msgid "Edit" +msgstr "Editar" + +#: templates/xadmin/views/model_delete_confirm.html:11 +#, python-format +msgid "" +"Deleting the %(verbose_name)s '%(escaped_object)s' would result in deleting " +"related objects, but your account doesn't have permission to delete the " +"following types of objects:" +msgstr "" +"Excluir o %(verbose_name)s '%(escaped_object)s' resultaria na exclusão dos " +"objetos relacionados, mas a sua conta não tem permissão para excluir os " +"seguintes tipos de objetos:" + +#: templates/xadmin/views/model_delete_confirm.html:19 +#, python-format +msgid "" +"Deleting the %(verbose_name)s '%(escaped_object)s' would require deleting " +"the following protected related objects:" +msgstr "" +"Excluir o %(verbose_name)s '%(escaped_object)s' exigiria exclusão dos " +"seguintes objetos protegidos relacionados:" + +#: templates/xadmin/views/model_delete_confirm.html:27 +#, python-format +msgid "" +"Are you sure you want to delete the %(verbose_name)s \"%(escaped_object)s\"? " +"All of the following related items will be deleted:" +msgstr "" +"Tem certeza de que deseja excluir %(verbose_name)s \"%(escaped_object)s\"? " +"Todos os seguintes itens relacionados serão excluídos:" + +#: templates/xadmin/views/model_delete_confirm.html:34 +#: templates/xadmin/views/model_delete_selected_confirm.html:49 +msgid "Yes, I'm sure" +msgstr "Sim, tenho certeza" + +#: templates/xadmin/views/model_delete_confirm.html:35 +#: templates/xadmin/views/model_delete_selected_confirm.html:50 +msgid "Cancel" +msgstr "Cancelar" + +#: templates/xadmin/views/model_delete_selected_confirm.html:10 +msgid "Delete multiple objects" +msgstr "Excluir múltiplos objetos" + +#: templates/xadmin/views/model_delete_selected_confirm.html:18 +#, python-format +msgid "" +"Deleting the selected %(objects_name)s would result in deleting related " +"objects, but your account doesn't have permission to delete the following " +"types of objects:" +msgstr "" +"Excluir o %(objects_name)s selecionado resultaria na exclusão de objetos " +"relacionados, mas a sua conta não tem permissão para excluir os seguintes " +"tipos de objetos:" + +#: templates/xadmin/views/model_delete_selected_confirm.html:26 +#, python-format +msgid "" +"Deleting the selected %(objects_name)s would require deleting the following " +"protected related objects:" +msgstr "" +"Excluir o %(objects_name)s selecionado exigiria eliminar os seguintes " +"objetos protegidos relacionados:" + +#: templates/xadmin/views/model_delete_selected_confirm.html:34 +#, python-format +msgid "" +"Are you sure you want to delete the selected %(objects_name)s? All of the " +"following objects and their related items will be deleted:" +msgstr "" +"Tem certeza de que deseja excluir o %(objects_name)s selecionado? Todos os " +"seguintes objetos e seus itens relacionados serão excluídos:" + +#: templates/xadmin/views/model_history.html:26 +msgid "Diff" +msgstr "Comparar" + +#: templates/xadmin/views/model_history.html:27 +#: templates/xadmin/views/recover_list.html:25 +msgid "Date/time" +msgstr "Data/Hora" + +#: templates/xadmin/views/model_history.html:28 +msgid "User" +msgstr "Usuário" + +#: templates/xadmin/views/model_history.html:29 +msgid "Comment" +msgstr "Comentário" + +#: templates/xadmin/views/model_history.html:54 +msgid "Diff Select Versions" +msgstr "Comparar Versões Selecionadas" + +#: templates/xadmin/views/model_history.html:58 +msgid "" +"This object doesn't have a change history. It probably wasn't added via this " +"admin site." +msgstr "" +"Este objeto não possui um histórico de mudança. Provavelmente não foi " +"adicionado pelo site de administração." + +#: templates/xadmin/views/model_list.html:29 +#, python-format +msgid "Add %(name)s" +msgstr "Adicionar %(name)s" + +#: templates/xadmin/views/model_list.html:39 +#, fuzzy +msgid "Columns" +msgstr "Colunas" + +#: templates/xadmin/views/model_list.html:42 +msgid "Restore Selected" +msgstr "Restaurar Selecionados" + +#: templates/xadmin/views/model_list.html:147 +#: templates/xadmin/widgets/list.html:33 +msgid "Empty list" +msgstr "Limpar lista" + +#: templates/xadmin/views/recover_form.html:20 +msgid "Press the recover button below to recover this version of the object." +msgstr "Clique no botão recuperar abaixo para recuperar esta versão do objeto." + +#: templates/xadmin/views/recover_list.html:19 +msgid "" +"Choose a date from the list below to recover a deleted version of an object." +msgstr "" +"Escolha a data a partir da lista abaixo para recuperar a versão excluída do " +"objeto." + +#: templates/xadmin/views/recover_list.html:39 +msgid "There are no deleted objects to recover." +msgstr "Não há objetos excluídos para recuperar." + +#: templates/xadmin/views/revision_diff.html:12 +#: templates/xadmin/views/revision_diff.html:17 +#, python-format +msgid "Diff %(verbose_name)s" +msgstr "Comparar %(verbose_name)s" + +#: templates/xadmin/views/revision_diff.html:25 +msgid "Field" +msgstr "Campo" + +#: templates/xadmin/views/revision_diff.html:26 +msgid "Version A" +msgstr "Versão A" + +#: templates/xadmin/views/revision_diff.html:27 +msgid "Version B" +msgstr "Versão B" + +#: templates/xadmin/views/revision_diff.html:39 +msgid "Revert to" +msgstr "Reverter para" + +#: templates/xadmin/views/revision_diff.html:40 +#: templates/xadmin/views/revision_diff.html:41 +msgid "Revert" +msgstr "Reverter" + +#: templates/xadmin/views/revision_form.html:16 +#, python-format +msgid "Revert %(verbose_name)s" +msgstr "Reverter %(verbose_name)s" + +#: templates/xadmin/views/revision_form.html:21 +msgid "Press the revert button below to revert to this version of the object." +msgstr "" +"Clique no botão reverter abaixo para reverter para esta versão do objeto." + +#: templates/xadmin/views/revision_form.html:27 +msgid "Revert this revision" +msgstr "Reverter esta revisão" + +#: templates/xadmin/widgets/addform.html:14 +msgid "Success" +msgstr "Sucesso" + +#: templates/xadmin/widgets/addform.html:14 +msgid "Add success, click edit to edit." +msgstr "Sucesso na adição, clique editar para editar." + +#: templates/xadmin/widgets/addform.html:17 +msgid "Quick Add" +msgstr "Adição Rápida" + +#: templates/xadmin/widgets/base.html:31 +msgid "Widget Options" +msgstr "Opções do Widget" + +#: templates/xadmin/widgets/base.html:42 +msgid "Save changes" +msgstr "Gravar alterações" + +#: views/base.py:315 +msgid "Django Xadmin" +msgstr "Django Xadmin" + +#: views/base.py:316 +msgid "my-company.inc" +msgstr "" + +#: views/dashboard.py:186 +msgid "Widget ID" +msgstr "ID do Widget" + +#: views/dashboard.py:187 +msgid "Widget Title" +msgstr "Título do Widget" + +#: views/dashboard.py:252 +msgid "Html Content Widget, can write any html content in widget." +msgstr "" +"Widget de Conteúdo HTML, pode-se escrever qualquer conteúdo html no widget." + +#: views/dashboard.py:255 +msgid "Html Content" +msgstr "Conteúdo HTML" + +#: views/dashboard.py:318 +msgid "Target Model" +msgstr "Modelo Alvo" + +#: views/dashboard.py:369 +msgid "Quick button Widget, quickly open any page." +msgstr "Widget de Botão Rápido, abre rapidamente qualquer página." + +#: views/dashboard.py:371 +msgid "Quick Buttons" +msgstr "Botões Rápidos" + +#: views/dashboard.py:416 +msgid "Any Objects list Widget." +msgstr "Widget de listagem de Qualquer Objeto" + +#: views/dashboard.py:456 +msgid "Add any model object Widget." +msgstr "Widget de adição de qualquer objeto." + +#: views/dashboard.py:492 +msgid "Dashboard" +msgstr "Painel" + +#: views/dashboard.py:633 +#, python-format +msgid "%s Dashboard" +msgstr "%s Painel" + +#: views/delete.py:103 +#, python-format +msgid "The %(name)s \"%(obj)s\" was deleted successfully." +msgstr "%(name)s \"%(obj)s\" excluído(a) com sucesso." + +#: views/detail.py:173 views/edit.py:211 views/form.py:72 +msgid "Other Fields" +msgstr "Outros Campos" + +#: views/detail.py:235 +#, python-format +msgid "%s Detail" +msgstr "%s Detalhes" + +#: views/edit.py:253 +msgid "Added." +msgstr "" + +#: views/edit.py:255 +#, fuzzy, python-format +#| msgid "Change %s" +msgid "Changed %s." +msgstr "Alterar %s" + +#: views/edit.py:255 +msgid "and" +msgstr "" + +#: views/edit.py:258 +msgid "No fields changed." +msgstr "" + +#: views/edit.py:420 +#, python-format +msgid "The %(name)s \"%(obj)s\" was added successfully." +msgstr "%(name)s \"%(obj)s\" adicionado(a) com sucesso." + +#: views/edit.py:425 views/edit.py:520 +msgid "You may edit it again below." +msgstr "Você pode editar novamente abaixo." + +#: views/edit.py:429 views/edit.py:523 +#, python-format +msgid "You may add another %s below." +msgstr "Você pode adicionar outro(a) %s abaixo." + +#: views/edit.py:471 +#, python-format +msgid "Change %s" +msgstr "Alterar %s" + +#: views/edit.py:516 +#, python-format +msgid "The %(name)s \"%(obj)s\" was changed successfully." +msgstr "%(name)s \"%(obj)s\" alterado(a) com sucesso." + +#: views/form.py:165 +#, fuzzy, python-format +msgid "The %s was changed successfully." +msgstr "%(name)s \"%(obj)s\" alterado(a) com sucesso." + +#: views/list.py:199 +msgid "Database error" +msgstr "Erro da base de dados" + +#: views/list.py:373 +#, python-format +msgid "%s List" +msgstr "Lista %s" + +#: views/list.py:499 +msgid "Sort ASC" +msgstr "Classificação Ascendente" + +#: views/list.py:500 +msgid "Sort DESC" +msgstr "Classificação Descendente" + +#: views/list.py:504 +msgid "Cancel Sort" +msgstr "Cancelar Classificação" + +#: views/website.py:16 +msgid "Main Dashboard" +msgstr "Painel Principal" + +#: widgets.py:48 +msgid "Now" +msgstr "Agora" diff --git "a/8\343\200\201\346\226\207\347\214\256\346\225\260\346\215\256\346\214\226\346\216\230\347\263\273\347\273\237(\351\231\204\346\272\220\347\240\201)/extra_apps/xadmin/locale/pt_BR/LC_MESSAGES/djangojs.mo" "b/8\343\200\201\346\226\207\347\214\256\346\225\260\346\215\256\346\214\226\346\216\230\347\263\273\347\273\237(\351\231\204\346\272\220\347\240\201)/extra_apps/xadmin/locale/pt_BR/LC_MESSAGES/djangojs.mo" new file mode 100644 index 0000000..31666c0 Binary files /dev/null and "b/8\343\200\201\346\226\207\347\214\256\346\225\260\346\215\256\346\214\226\346\216\230\347\263\273\347\273\237(\351\231\204\346\272\220\347\240\201)/extra_apps/xadmin/locale/pt_BR/LC_MESSAGES/djangojs.mo" differ diff --git "a/8\343\200\201\346\226\207\347\214\256\346\225\260\346\215\256\346\214\226\346\216\230\347\263\273\347\273\237(\351\231\204\346\272\220\347\240\201)/extra_apps/xadmin/locale/pt_BR/LC_MESSAGES/djangojs.po" "b/8\343\200\201\346\226\207\347\214\256\346\225\260\346\215\256\346\214\226\346\216\230\347\263\273\347\273\237(\351\231\204\346\272\220\347\240\201)/extra_apps/xadmin/locale/pt_BR/LC_MESSAGES/djangojs.po" new file mode 100644 index 0000000..8441f0a --- /dev/null +++ "b/8\343\200\201\346\226\207\347\214\256\346\225\260\346\215\256\346\214\226\346\216\230\347\263\273\347\273\237(\351\231\204\346\272\220\347\240\201)/extra_apps/xadmin/locale/pt_BR/LC_MESSAGES/djangojs.po" @@ -0,0 +1,71 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER +# This file is distributed under the same license as the PACKAGE package. +# +# Translators: +# korndorfer , 2013 +msgid "" +msgstr "" +"Project-Id-Version: xadmin-core\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2013-04-30 23:11+0800\n" +"PO-Revision-Date: 2013-11-20 12:41+0000\n" +"Last-Translator: korndorfer \n" +"Language-Team: Portuguese (Brazil) (http://www.transifex.com/projects/p/xadmin/language/pt_BR/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: pt_BR\n" +"Plural-Forms: nplurals=2; plural=(n > 1);\n" + +#: static/xadmin/js/xadmin.plugin.actions.js:20 +msgid "%(sel)s of %(cnt)s selected" +msgid_plural "%(sel)s of %(cnt)s selected" +msgstr[0] "%(sel)s de %(cnt)s selecionado" +msgstr[1] "%(sel)s de %(cnt)s selecionados" + +#: static/xadmin/js/xadmin.plugin.revision.js:25 +msgid "New Item" +msgstr "Novo Item" + +#: static/xadmin/js/xadmin.widget.datetime.js:32 +msgid "Sunday Monday Tuesday Wednesday Thursday Friday Saturday Sunday" +msgstr "Domingo Segunda Terça Quarta Quinta Sexta Sábado Domingo" + +#: static/xadmin/js/xadmin.widget.datetime.js:33 +msgid "Sun Mon Tue Wed Thu Fri Sat Sun" +msgstr "Dom Seg Ter Qua Qui Sex Sáb Dom" + +#: static/xadmin/js/xadmin.widget.datetime.js:34 +msgid "Su Mo Tu We Th Fr Sa Su" +msgstr "Do Sg Te Qa Qi Sx Sa Do" + +#: static/xadmin/js/xadmin.widget.datetime.js:35 +msgid "" +"January February March April May June July August September October November" +" December" +msgstr "Janeiro Fevereiro Março Abril Maio Junho Julho Agosto Setembro Outubro Novembro Dezembro" + +#: static/xadmin/js/xadmin.widget.datetime.js:36 +msgid "Jan Feb Mar Apr May Jun Jul Aug Sep Oct Nov Dec" +msgstr "Jan Fev Mar Abr Mai Jun Jul Ago Set Out Nov Dez" + +#: static/xadmin/js/xadmin.widget.datetime.js:37 +msgid "Today" +msgstr "Hoje" + +#: static/xadmin/js/xadmin.widget.datetime.js:38 +msgid "%a %d %b %Y %T %Z" +msgstr "%a %d %b %Y %T %Z" + +#: static/xadmin/js/xadmin.widget.datetime.js:39 +msgid "AM PM" +msgstr "AM PM" + +#: static/xadmin/js/xadmin.widget.datetime.js:40 +msgid "am pm" +msgstr "am pm" + +#: static/xadmin/js/xadmin.widget.datetime.js:43 +msgid "%T" +msgstr "%T" diff --git "a/8\343\200\201\346\226\207\347\214\256\346\225\260\346\215\256\346\214\226\346\216\230\347\263\273\347\273\237(\351\231\204\346\272\220\347\240\201)/extra_apps/xadmin/locale/ru_RU/LC_MESSAGES/django.mo" "b/8\343\200\201\346\226\207\347\214\256\346\225\260\346\215\256\346\214\226\346\216\230\347\263\273\347\273\237(\351\231\204\346\272\220\347\240\201)/extra_apps/xadmin/locale/ru_RU/LC_MESSAGES/django.mo" new file mode 100644 index 0000000..58d8e71 Binary files /dev/null and "b/8\343\200\201\346\226\207\347\214\256\346\225\260\346\215\256\346\214\226\346\216\230\347\263\273\347\273\237(\351\231\204\346\272\220\347\240\201)/extra_apps/xadmin/locale/ru_RU/LC_MESSAGES/django.mo" differ diff --git "a/8\343\200\201\346\226\207\347\214\256\346\225\260\346\215\256\346\214\226\346\216\230\347\263\273\347\273\237(\351\231\204\346\272\220\347\240\201)/extra_apps/xadmin/locale/ru_RU/LC_MESSAGES/django.po" "b/8\343\200\201\346\226\207\347\214\256\346\225\260\346\215\256\346\214\226\346\216\230\347\263\273\347\273\237(\351\231\204\346\272\220\347\240\201)/extra_apps/xadmin/locale/ru_RU/LC_MESSAGES/django.po" new file mode 100644 index 0000000..6bdc794 --- /dev/null +++ "b/8\343\200\201\346\226\207\347\214\256\346\225\260\346\215\256\346\214\226\346\216\230\347\263\273\347\273\237(\351\231\204\346\272\220\347\240\201)/extra_apps/xadmin/locale/ru_RU/LC_MESSAGES/django.po" @@ -0,0 +1,1438 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER +# This file is distributed under the same license as the PACKAGE package. +# +# Translators: +# crazyzubr , 2013 +msgid "" +msgstr "" +"Project-Id-Version: xadmin-core\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2016-07-20 13:28+0800\n" +"PO-Revision-Date: 2013-12-28 19:36+0000\n" +"Last-Translator: crazyzubr \n" +"Language-Team: Russian (Russia) (http://www.transifex.com/projects/p/xadmin/" +"language/ru_RU/)\n" +"Language: ru_RU\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n" +"%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n" + +#: adminx.py:19 +msgid "Admin Object" +msgstr "" + +#: apps.py:11 +msgid "Administration" +msgstr "" + +#: filters.py:159 filters.py:191 filters.py:407 filters.py:493 filters.py:531 +msgid "All" +msgstr "Все" + +#: filters.py:160 plugins/export.py:165 +msgid "Yes" +msgstr "Да" + +#: filters.py:161 plugins/export.py:165 +msgid "No" +msgstr "Нет" + +#: filters.py:175 +msgid "Unknown" +msgstr "Неизвестно" + +#: filters.py:267 +msgid "Any date" +msgstr "Любая дата" + +#: filters.py:268 +msgid "Has date" +msgstr "" + +#: filters.py:271 +msgid "Has no date" +msgstr "" + +#: filters.py:274 widgets.py:30 +msgid "Today" +msgstr "Сегодня" + +#: filters.py:278 +msgid "Past 7 days" +msgstr "За последние 7 дней" + +#: filters.py:282 +msgid "This month" +msgstr "В этом месяце" + +#: filters.py:286 +msgid "This year" +msgstr "В этом году" + +#: forms.py:10 +msgid "" +"Please enter the correct username and password for a staff account. Note " +"that both fields are case-sensitive." +msgstr "" +"Пожалуйста, введите корректные имя пользователя и пароль для аккаунта. Оба " +"поля могут быть чувствительны к регистру." + +#: forms.py:21 +msgid "Please log in again, because your session has expired." +msgstr "Пожалуйста, войдите снова, поскольку ваша сессия устарела." + +#: forms.py:41 +#, python-format +msgid "Your e-mail address is not your username. Try '%s' instead." +msgstr "" + +#: models.py:48 +msgid "Title" +msgstr "Заголовок" + +#: models.py:49 models.py:88 models.py:107 models.py:149 +msgid "user" +msgstr "" + +#: models.py:50 +msgid "Url Name" +msgstr "" + +#: models.py:52 +msgid "Query String" +msgstr "Строка запроса" + +#: models.py:53 +msgid "Is Shared" +msgstr "" + +#: models.py:66 plugins/bookmark.py:50 plugins/bookmark.py:180 +msgid "Bookmark" +msgstr "Закладка" + +#: models.py:67 +msgid "Bookmarks" +msgstr "Закладки" + +#: models.py:89 +msgid "Settings Key" +msgstr "" + +#: models.py:90 +msgid "Settings Content" +msgstr "" + +#: models.py:102 +msgid "User Setting" +msgstr "" + +#: models.py:103 +msgid "User Settings" +msgstr "" + +#: models.py:108 +msgid "Page" +msgstr "Страница" + +#: models.py:109 views/dashboard.py:82 views/dashboard.py:92 +msgid "Widget Type" +msgstr "Тип виджета" + +#: models.py:110 views/dashboard.py:83 +msgid "Widget Params" +msgstr "Параметры виджета" + +#: models.py:137 +msgid "User Widget" +msgstr "" + +#: models.py:138 +msgid "User Widgets" +msgstr "" + +#: models.py:142 +msgid "action time" +msgstr "" + +#: models.py:151 +msgid "action ip" +msgstr "" + +#: models.py:155 +msgid "content type" +msgstr "" + +#: models.py:158 +msgid "object id" +msgstr "" + +#: models.py:159 +msgid "object repr" +msgstr "" + +#: models.py:160 +msgid "action flag" +msgstr "" + +#: models.py:161 +#, fuzzy +#| msgid "Change %s" +msgid "change message" +msgstr "Изменить %s" + +#: models.py:164 +msgid "log entry" +msgstr "" + +#: models.py:165 +msgid "log entries" +msgstr "" + +#: models.py:173 +#, python-format +msgid "Added \"%(object)s\"." +msgstr "" + +#: models.py:175 +#, python-format +msgid "Changed \"%(object)s\" - %(changes)s" +msgstr "" + +#: models.py:180 +#, fuzzy, python-format +#| msgid "Related Objects" +msgid "Deleted \"%(object)s.\"" +msgstr "Связанные объекты" + +#: plugins/actions.py:57 +#, python-format +msgid "Delete selected %(verbose_name_plural)s" +msgstr "Удалить выбранные %(verbose_name_plural)s" + +#: plugins/actions.py:72 +#, fuzzy, python-format +#| msgid "Successfully deleted %(count)d %(items)s." +msgid "Batch delete %(count)d %(items)s." +msgstr "Успешно удалены %(count)d %(items)s." + +#: plugins/actions.py:78 +#, python-format +msgid "Successfully deleted %(count)d %(items)s." +msgstr "Успешно удалены %(count)d %(items)s." + +#: plugins/actions.py:110 views/delete.py:70 +#, python-format +msgid "Cannot delete %(name)s" +msgstr "Не удается удалить %(name)s" + +#: plugins/actions.py:112 views/delete.py:73 +msgid "Are you sure?" +msgstr "Вы уверены?" + +#: plugins/actions.py:158 +#, python-format +msgid "%(total_count)s selected" +msgid_plural "All %(total_count)s selected" +msgstr[0] "Выбран %(total_count)s" +msgstr[1] "Выбраны все %(total_count)s" +msgstr[2] "Выбраны все %(total_count)s" + +#: plugins/actions.py:162 +#, python-format +msgid "0 of %(cnt)s selected" +msgstr "Выбрано 0 объектов из %(cnt)s " + +#: plugins/actions.py:179 plugins/actions.py:189 +msgid "" +"Items must be selected in order to perform actions on them. No items have " +"been changed." +msgstr "" +"Чтобы произвести действия над объектами, необходимо их выбрать. Объекты не " +"были изменены." + +#: plugins/aggregation.py:14 +msgid "Min" +msgstr "" + +#: plugins/aggregation.py:14 +msgid "Max" +msgstr "" + +#: plugins/aggregation.py:14 +msgid "Avg" +msgstr "" + +#: plugins/aggregation.py:14 +msgid "Sum" +msgstr "" + +#: plugins/aggregation.py:14 +msgid "Count" +msgstr "" + +#: plugins/auth.py:21 +#, fuzzy, python-format +msgid "Can add %s" +msgstr "Добавить %s" + +#: plugins/auth.py:22 +#, fuzzy, python-format +msgid "Can change %s" +msgstr "Изменить %s" + +#: plugins/auth.py:23 +#, python-format +msgid "Can edit %s" +msgstr "" + +#: plugins/auth.py:24 +#, fuzzy, python-format +msgid "Can delete %s" +msgstr "Не удается удалить %(name)s" + +#: plugins/auth.py:25 +#, python-format +msgid "Can view %s" +msgstr "" + +#: plugins/auth.py:87 +msgid "Personal info" +msgstr "Персональная информация" + +#: plugins/auth.py:91 +msgid "Permissions" +msgstr "Права" + +#: plugins/auth.py:94 +msgid "Important dates" +msgstr "Важные даты" + +#: plugins/auth.py:99 +msgid "Status" +msgstr "Статус" + +#: plugins/auth.py:111 +#, fuzzy +msgid "Permission Name" +msgstr "Права" + +#: plugins/auth.py:167 +msgid "Change Password" +msgstr "Изменить пароль" + +#: plugins/auth.py:198 +#, python-format +msgid "Change password: %s" +msgstr "Изменить пароль: %s" + +#: plugins/auth.py:223 plugins/auth.py:255 +msgid "Password changed successfully." +msgstr "Пароль успешно изменен" + +#: plugins/auth.py:242 templates/xadmin/auth/user/change_password.html:11 +#: templates/xadmin/auth/user/change_password.html:22 +#: templates/xadmin/auth/user/change_password.html:55 +msgid "Change password" +msgstr "Изменить пароль" + +#: plugins/batch.py:44 +msgid "Change this field" +msgstr "" + +#: plugins/batch.py:65 +#, python-format +msgid "Batch Change selected %(verbose_name_plural)s" +msgstr "" + +#: plugins/batch.py:89 +#, python-format +msgid "Successfully change %(count)d %(items)s." +msgstr "" + +#: plugins/batch.py:138 +#, python-format +msgid "Batch change %s" +msgstr "" + +#: plugins/bookmark.py:173 +msgid "bookmark" +msgstr "" + +#: plugins/bookmark.py:176 +msgid "Bookmark Widget, can show user's bookmark list data in widget." +msgstr "" + +#: plugins/chart.py:25 +msgid "Show models simple chart." +msgstr "" + +#: plugins/chart.py:51 +#, python-format +msgid "%s Charts" +msgstr "" + +#: plugins/comments.py:33 +msgid "Metadata" +msgstr "" + +#: plugins/comments.py:60 +msgid "flagged" +msgid_plural "flagged" +msgstr[0] "" +msgstr[1] "" +msgstr[2] "" + +#: plugins/comments.py:61 +msgid "Flag selected comments" +msgstr "" + +#: plugins/comments.py:66 +msgid "approved" +msgid_plural "approved" +msgstr[0] "" +msgstr[1] "" +msgstr[2] "" + +#: plugins/comments.py:67 +msgid "Approve selected comments" +msgstr "" + +#: plugins/comments.py:72 +msgid "removed" +msgid_plural "removed" +msgstr[0] "" +msgstr[1] "" +msgstr[2] "" + +#: plugins/comments.py:73 +msgid "Remove selected comments" +msgstr "" + +#: plugins/comments.py:86 +#, python-format +msgid "1 comment was successfully %(action)s." +msgid_plural "%(count)s comments were successfully %(action)s." +msgstr[0] "" +msgstr[1] "" +msgstr[2] "" + +#: plugins/details.py:52 views/list.py:578 +#, python-format +msgid "Details of %s" +msgstr "Детали %s" + +#: plugins/editable.py:46 +#, python-format +msgid "Enter %s" +msgstr "" + +#: plugins/editable.py:73 views/dashboard.py:649 views/delete.py:27 +#: views/detail.py:145 views/edit.py:454 +#, python-format +msgid "%(name)s object with primary key %(key)r does not exist." +msgstr "" + +#: plugins/export.py:98 plugins/export.py:135 +msgid "Sheet" +msgstr "Лист" + +#: plugins/filters.py:133 plugins/quickfilter.py:141 +#, python-format +msgid "Filtering error: %s" +msgstr "" + +#: plugins/images.py:29 +msgid "Previous" +msgstr "" + +#: plugins/images.py:29 +msgid "Next" +msgstr "" + +#: plugins/images.py:29 +msgid "Slideshow" +msgstr "Слайдшоу" + +#: plugins/images.py:29 +msgid "Download" +msgstr "Загрузить" + +#: plugins/images.py:50 +msgid "Change:" +msgstr "Изменить:" + +#: plugins/layout.py:16 +msgid "Table" +msgstr "" + +#: plugins/layout.py:22 +msgid "Thumbnails" +msgstr "" + +#: plugins/passwords.py:64 +msgid "Forgotten your password or username?" +msgstr "" + +#: plugins/quickform.py:79 +#, python-format +msgid "Create New %s" +msgstr "" + +#: plugins/relate.py:104 +msgid "Related Objects" +msgstr "Связанные объекты" + +#: plugins/relfield.py:29 plugins/topnav.py:38 +#, python-format +msgid "Search %s" +msgstr "Поиск %s" + +#: plugins/relfield.py:67 +#, python-format +msgid "Select %s" +msgstr "" + +#: plugins/themes.py:47 +msgid "Default" +msgstr "" + +#: plugins/themes.py:48 +msgid "Default bootstrap theme" +msgstr "" + +#: plugins/themes.py:49 +msgid "Bootstrap2" +msgstr "" + +#: plugins/themes.py:49 +msgid "Bootstrap 2.x theme" +msgstr "" + +#: plugins/topnav.py:62 views/dashboard.py:465 views/edit.py:387 +#: views/edit.py:396 +#, python-format +msgid "Add %s" +msgstr "Добавить %s" + +#: plugins/xversion.py:106 +msgid "Initial version." +msgstr "" + +#: plugins/xversion.py:108 +msgid "Change version." +msgstr "" + +#: plugins/xversion.py:110 +msgid "Revert version." +msgstr "" + +#: plugins/xversion.py:112 +msgid "Rercover version." +msgstr "" + +#: plugins/xversion.py:114 +#, python-format +msgid "Deleted %(verbose_name)s." +msgstr "" + +#: plugins/xversion.py:127 templates/xadmin/views/recover_form.html:26 +msgid "Recover" +msgstr "" + +#: plugins/xversion.py:143 templates/xadmin/views/model_history.html:11 +#: templates/xadmin/views/revision_diff.html:11 +#: templates/xadmin/views/revision_form.html:15 +msgid "History" +msgstr "История" + +#: plugins/xversion.py:194 templates/xadmin/views/recover_form.html:14 +#: templates/xadmin/views/recover_list.html:10 +#, python-format +msgid "Recover deleted %(name)s" +msgstr "" + +#: plugins/xversion.py:238 +#, python-format +msgid "Change history: %s" +msgstr "" + +#: plugins/xversion.py:288 +msgid "Must select two versions." +msgstr "Необходимо выбрать две версии." + +#: plugins/xversion.py:296 +msgid "Please select two different versions." +msgstr "Пожалуйста, выберите две различные версии." + +#: plugins/xversion.py:383 plugins/xversion.py:500 +#, python-format +msgid "Current: %s" +msgstr "" + +#: plugins/xversion.py:424 +#, python-format +msgid "Revert %s" +msgstr "" + +#: plugins/xversion.py:440 +#, python-format +msgid "" +"The %(model)s \"%(name)s\" was reverted successfully. You may edit it again " +"below." +msgstr "" + +#: plugins/xversion.py:461 +#, python-format +msgid "Recover %s" +msgstr "" + +#: plugins/xversion.py:477 +#, python-format +msgid "" +"The %(model)s \"%(name)s\" was recovered successfully. You may edit it again " +"below." +msgstr "" + +#: templates/xadmin/404.html:4 templates/xadmin/404.html:8 +msgid "Page not found" +msgstr "Страница не найдена" + +#: templates/xadmin/404.html:10 +msgid "We're sorry, but the requested page could not be found." +msgstr "" + +#: templates/xadmin/500.html:7 +#: templates/xadmin/auth/user/change_password.html:10 +#: templates/xadmin/auth/user/change_password.html:15 +#: templates/xadmin/base_site.html:53 +#: templates/xadmin/includes/sitemenu_default.html:7 +#: templates/xadmin/views/app_index.html:9 +#: templates/xadmin/views/batch_change_form.html:9 +#: templates/xadmin/views/invalid_setup.html:7 +#: templates/xadmin/views/model_dashboard.html:7 +#: templates/xadmin/views/model_delete_selected_confirm.html:8 +#: templates/xadmin/views/model_history.html:8 +#: templates/xadmin/views/recover_form.html:8 +#: templates/xadmin/views/recover_list.html:8 +#: templates/xadmin/views/revision_diff.html:8 +#: templates/xadmin/views/revision_form.html:8 views/base.py:473 +msgid "Home" +msgstr "Главная" + +#: templates/xadmin/500.html:8 +msgid "Server error" +msgstr "" + +#: templates/xadmin/500.html:12 +msgid "Server error (500)" +msgstr "" + +#: templates/xadmin/500.html:15 +msgid "Server Error (500)" +msgstr "" + +#: templates/xadmin/500.html:16 +msgid "" +"There's been an error. It's been reported to the site administrators via e-" +"mail and should be fixed shortly. Thanks for your patience." +msgstr "" + +#: templates/xadmin/auth/password_reset/complete.html:11 +#: templates/xadmin/auth/password_reset/done.html:11 +msgid "Password reset successful" +msgstr "Пароль успешно восстановлен" + +#: templates/xadmin/auth/password_reset/complete.html:14 +msgid "Your password has been set. You may go ahead and log in now." +msgstr "" + +#: templates/xadmin/auth/password_reset/complete.html:15 +msgid "Log in" +msgstr "Войти" + +#: templates/xadmin/auth/password_reset/confirm.html:12 +msgid "Enter new password" +msgstr "Введите новый пароль:" + +#: templates/xadmin/auth/password_reset/confirm.html:17 +msgid "" +"Please enter your new password twice so we can verify you typed it in " +"correctly." +msgstr "" +"Пожалуйста, введите новый пароль дважды, чтобы мы могли убедиться в " +"правильности написания." + +#: templates/xadmin/auth/password_reset/confirm.html:19 +msgid "Change my password" +msgstr "" + +#: templates/xadmin/auth/password_reset/confirm.html:24 +msgid "Password reset unsuccessful" +msgstr "Ошибка восстановления пароля" + +#: templates/xadmin/auth/password_reset/confirm.html:27 +msgid "" +"The password reset link was invalid, possibly because it has already been " +"used. Please request a new password reset." +msgstr "" +"Неверная ссылка для восстановления пароля. Возможно, ей уже воспользовались. " +"Пожалуйста, попробуйте восстановить пароль еще раз." + +#: templates/xadmin/auth/password_reset/done.html:14 +msgid "" +"We've e-mailed you instructions for setting your password to the e-mail " +"address you submitted. You should be receiving it shortly." +msgstr "" +"Мы отправили инструкцию по восстановлению пароля на указанный вами адрес " +"электронной почты. Вы должны её вскоре получить." + +#: templates/xadmin/auth/password_reset/email.html:2 +#, python-format +msgid "" +"You're receiving this e-mail because you requested a password reset for your " +"user account at %(site_name)s." +msgstr "" +"Вы получили это письмо, потому что вы (или кто-то другой) запросили " +"восстановление пароля от учётной записи на сайте %(site_name)s, которая " +"связана с этим адресом электронной почты." + +#: templates/xadmin/auth/password_reset/email.html:4 +msgid "Please go to the following page and choose a new password:" +msgstr "Пожалуйста, перейдите на эту страницу и введите новый пароль:" + +#: templates/xadmin/auth/password_reset/email.html:8 +msgid "Your username, in case you've forgotten:" +msgstr "" + +#: templates/xadmin/auth/password_reset/email.html:10 +msgid "Thanks for using our site!" +msgstr "" + +#: templates/xadmin/auth/password_reset/email.html:12 +#, python-format +msgid "The %(site_name)s team" +msgstr "" + +#: templates/xadmin/auth/password_reset/form.html:13 +msgid "Password reset" +msgstr "Восстановление пароля" + +#: templates/xadmin/auth/password_reset/form.html:17 +msgid "" +"Forgotten your password? Enter your e-mail address below, and we'll e-mail " +"instructions for setting a new one." +msgstr "" + +#: templates/xadmin/auth/password_reset/form.html:25 +msgid "E-mail address:" +msgstr "" + +#: templates/xadmin/auth/password_reset/form.html:33 +msgid "Reset my password" +msgstr "" + +#: templates/xadmin/auth/user/add_form.html:6 +msgid "" +"First, enter a username and password. Then, you'll be able to edit more user " +"options." +msgstr "" + +#: templates/xadmin/auth/user/add_form.html:8 +msgid "Enter a username and password." +msgstr "" + +#: templates/xadmin/auth/user/change_password.html:31 +#: templates/xadmin/views/batch_change_form.html:24 +#: templates/xadmin/views/form.html:18 +#: templates/xadmin/views/model_form.html:20 +msgid "Please correct the error below." +msgid_plural "Please correct the errors below." +msgstr[0] "Пожалуйста, исправьте ошибку ниже." +msgstr[1] "Пожалуйста, исправьте ошибки ниже." +msgstr[2] "Пожалуйста, исправьте ошибки ниже." + +#: templates/xadmin/auth/user/change_password.html:38 +msgid "Enter your new password." +msgstr "" + +#: templates/xadmin/auth/user/change_password.html:40 +#, python-format +msgid "Enter a new password for the user %(username)s." +msgstr "" + +#: templates/xadmin/base_site.html:18 +msgid "Welcome," +msgstr "" + +#: templates/xadmin/base_site.html:24 +msgid "Log out" +msgstr "Выйти" + +#: templates/xadmin/base_site.html:36 +msgid "You don't have permission to edit anything." +msgstr "" + +#: templates/xadmin/blocks/comm.top.theme.html:4 +msgid "Themes" +msgstr "" + +#: templates/xadmin/blocks/comm.top.topnav.html:9 +#: templates/xadmin/blocks/model_list.nav_form.search_form.html:8 +#: templates/xadmin/filters/char.html:7 +#: templates/xadmin/filters/fk_search.html:7 +#: templates/xadmin/filters/fk_search.html:16 +#: templates/xadmin/filters/number.html:7 +msgid "Search" +msgstr "" + +#: templates/xadmin/blocks/comm.top.topnav.html:23 +msgid "Add" +msgstr "" + +#: templates/xadmin/blocks/model_form.submit_line.wizard.html:9 +#: templates/xadmin/blocks/model_form.submit_line.wizard.html:26 +msgid "Prev step" +msgstr "" + +#: templates/xadmin/blocks/model_form.submit_line.wizard.html:13 +#: templates/xadmin/blocks/model_form.submit_line.wizard.html:29 +msgid "Next step" +msgstr "" + +#: templates/xadmin/blocks/model_form.submit_line.wizard.html:15 +#: templates/xadmin/blocks/model_form.submit_line.wizard.html:31 +#: templates/xadmin/includes/submit_line.html:10 +#: templates/xadmin/includes/submit_line.html:13 +#: templates/xadmin/views/form.html:30 templates/xadmin/views/form.html:31 +msgid "Save" +msgstr "" + +#: templates/xadmin/blocks/model_list.nav_menu.bookmarks.html:7 +msgid "Clean Bookmarks" +msgstr "" + +#: templates/xadmin/blocks/model_list.nav_menu.bookmarks.html:18 +msgid "No Bookmarks" +msgstr "" + +#: templates/xadmin/blocks/model_list.nav_menu.bookmarks.html:22 +msgid "New Bookmark" +msgstr "" + +#: templates/xadmin/blocks/model_list.nav_menu.bookmarks.html:26 +msgid "Save current page as Bookmark" +msgstr "" + +#: templates/xadmin/blocks/model_list.nav_menu.bookmarks.html:32 +msgid "Enter bookmark title" +msgstr "" + +#: templates/xadmin/blocks/model_list.nav_menu.bookmarks.html:33 +msgid "Waiting" +msgstr "" + +#: templates/xadmin/blocks/model_list.nav_menu.bookmarks.html:33 +msgid "Save Bookmark" +msgstr "" + +#: templates/xadmin/blocks/model_list.nav_menu.filters.html:4 +msgid "Filters" +msgstr "" + +#: templates/xadmin/blocks/model_list.nav_menu.filters.html:8 +msgid "Clean Filters" +msgstr "" + +#: templates/xadmin/blocks/model_list.results_bottom.actions.html:19 +msgid "Click here to select the objects across all pages" +msgstr "" + +#: templates/xadmin/blocks/model_list.results_bottom.actions.html:19 +#, python-format +msgid "Select all %(total_count)s %(model_name)s" +msgstr "" + +#: templates/xadmin/blocks/model_list.results_bottom.actions.html:20 +msgid "Clear selection" +msgstr "" + +#: templates/xadmin/blocks/model_list.results_top.charts.html:4 +msgid "Charts" +msgstr "" + +#: templates/xadmin/blocks/model_list.top_toolbar.exports.html:4 +#: templates/xadmin/blocks/model_list.top_toolbar.exports.html:8 +#: templates/xadmin/blocks/model_list.top_toolbar.exports.html:19 +#: templates/xadmin/blocks/model_list.top_toolbar.exports.html:47 +msgid "Export" +msgstr "" + +#: templates/xadmin/blocks/model_list.top_toolbar.exports.html:26 +#: templates/xadmin/blocks/model_list.top_toolbar.exports.html:29 +#: templates/xadmin/blocks/model_list.top_toolbar.exports.html:32 +msgid "Export with table header." +msgstr "" + +#: templates/xadmin/blocks/model_list.top_toolbar.exports.html:35 +#: templates/xadmin/blocks/model_list.top_toolbar.exports.html:38 +msgid "Export with format." +msgstr "" + +#: templates/xadmin/blocks/model_list.top_toolbar.exports.html:42 +msgid "Export all data." +msgstr "" + +#: templates/xadmin/blocks/model_list.top_toolbar.exports.html:46 +#: templates/xadmin/widgets/base.html:41 +msgid "Close" +msgstr "" + +#: templates/xadmin/blocks/model_list.top_toolbar.layouts.html:4 +msgid "Layout" +msgstr "" + +#: templates/xadmin/blocks/model_list.top_toolbar.refresh.html:8 +msgid "Clean Refresh" +msgstr "" + +#: templates/xadmin/blocks/model_list.top_toolbar.refresh.html:14 +#, python-format +msgid "Every %(t)s seconds" +msgstr "" + +#: templates/xadmin/blocks/model_list.top_toolbar.saveorder.html:4 +msgid "Save Order" +msgstr "" + +#: templates/xadmin/edit_inline/blank.html:5 views/detail.py:23 +#: views/edit.py:102 views/list.py:29 +msgid "Null" +msgstr "" + +#: templates/xadmin/filters/char.html:13 +msgid "Enter" +msgstr "" + +#: templates/xadmin/filters/date.html:10 templates/xadmin/filters/date.html:13 +msgid "Choice Date" +msgstr "" + +#: templates/xadmin/filters/date.html:18 +msgid "YY" +msgstr "" + +#: templates/xadmin/filters/date.html:19 +msgid "year" +msgstr "" + +#: templates/xadmin/filters/date.html:22 +msgid "MM" +msgstr "" + +#: templates/xadmin/filters/date.html:23 +msgid "month" +msgstr "" + +#: templates/xadmin/filters/date.html:26 +msgid "DD" +msgstr "" + +#: templates/xadmin/filters/date.html:27 +msgid "day" +msgstr "" + +#: templates/xadmin/filters/date.html:29 templates/xadmin/filters/date.html:46 +#: templates/xadmin/filters/date.html:54 +#: templates/xadmin/filters/fk_search.html:24 +#: templates/xadmin/filters/number.html:37 +msgid "Apply" +msgstr "" + +#: templates/xadmin/filters/date.html:34 +msgid "Date Range" +msgstr "" + +#: templates/xadmin/filters/date.html:41 +msgid "Select Date" +msgstr "" + +#: templates/xadmin/filters/date.html:42 +msgid "From" +msgstr "" + +#: templates/xadmin/filters/date.html:44 +msgid "To" +msgstr "" + +#: templates/xadmin/filters/fk_search.html:14 +msgid "Select" +msgstr "" + +#: templates/xadmin/filters/fk_search.html:26 +#: templates/xadmin/filters/number.html:39 +msgid "Clean" +msgstr "" + +#: templates/xadmin/filters/number.html:17 +#: templates/xadmin/filters/number.html:25 +#: templates/xadmin/filters/number.html:33 +msgid "Enter Number" +msgstr "" + +#: templates/xadmin/filters/rel.html:3 +#, python-format +msgid " By %(filter_title)s " +msgstr "" + +#: templates/xadmin/forms/transfer.html:4 +msgid "Available" +msgstr "" + +#: templates/xadmin/forms/transfer.html:12 +msgid "Click to choose all at once." +msgstr "" + +#: templates/xadmin/forms/transfer.html:12 +msgid "Choose all" +msgstr "" + +#: templates/xadmin/forms/transfer.html:16 +msgid "Choose" +msgstr "" + +#: templates/xadmin/forms/transfer.html:19 +#: templates/xadmin/widgets/base.html:40 +msgid "Remove" +msgstr "" + +#: templates/xadmin/forms/transfer.html:23 +msgid "Chosen" +msgstr "" + +#: templates/xadmin/forms/transfer.html:27 +msgid "Click to remove all chosen at once." +msgstr "" + +#: templates/xadmin/forms/transfer.html:27 +msgid "Remove all" +msgstr "" + +#: templates/xadmin/includes/pagination.html:9 +msgid "Show all" +msgstr "" + +#: templates/xadmin/includes/submit_line.html:10 +#: templates/xadmin/includes/submit_line.html:13 +#: templates/xadmin/views/form.html:30 templates/xadmin/views/form.html:31 +msgid "Saving.." +msgstr "" + +#: templates/xadmin/includes/submit_line.html:17 +msgid "Save as new" +msgstr "" + +#: templates/xadmin/includes/submit_line.html:18 +msgid "Save and add another" +msgstr "" + +#: templates/xadmin/includes/submit_line.html:19 +msgid "Save and continue editing" +msgstr "" + +#: templates/xadmin/includes/submit_line.html:24 +#: templates/xadmin/views/model_detail.html:28 views/delete.py:93 +msgid "Delete" +msgstr "" + +#: templates/xadmin/views/app_index.html:13 +#, python-format +msgid "%(name)s" +msgstr "" + +#: templates/xadmin/views/batch_change_form.html:11 +msgid "Change multiple objects" +msgstr "" + +#: templates/xadmin/views/batch_change_form.html:16 +#, python-format +msgid "Change one %(objects_name)s" +msgid_plural "Batch change %(counter)s %(objects_name)s" +msgstr[0] "" +msgstr[1] "" +msgstr[2] "" + +#: templates/xadmin/views/batch_change_form.html:38 +msgid "Change Multiple" +msgstr "" + +#: templates/xadmin/views/dashboard.html:15 +#: templates/xadmin/views/dashboard.html:22 +#: templates/xadmin/views/dashboard.html:23 +msgid "Add Widget" +msgstr "" + +#: templates/xadmin/views/invalid_setup.html:13 +msgid "" +"Something's wrong with your database installation. Make sure the appropriate " +"database tables have been created, and make sure the database is readable by " +"the appropriate user." +msgstr "" + +#: templates/xadmin/views/logged_out.html:16 +msgid "Logout Success" +msgstr "" + +#: templates/xadmin/views/logged_out.html:17 +msgid "Thanks for spending some quality time with the Web site today." +msgstr "" + +#: templates/xadmin/views/logged_out.html:19 +msgid "Close Window" +msgstr "Закрыть окно" + +#: templates/xadmin/views/logged_out.html:20 +msgid "Log in again" +msgstr "Войти заново" + +#: templates/xadmin/views/login.html:39 views/website.py:38 +msgid "Please Login" +msgstr "" + +#: templates/xadmin/views/login.html:52 +msgid "Username" +msgstr "" + +#: templates/xadmin/views/login.html:64 +msgid "Password" +msgstr "" + +#: templates/xadmin/views/login.html:75 +msgid "log in" +msgstr "" + +#: templates/xadmin/views/model_dashboard.html:26 +#: templates/xadmin/views/model_detail.html:25 +msgid "Edit" +msgstr "" + +#: templates/xadmin/views/model_delete_confirm.html:11 +#, python-format +msgid "" +"Deleting the %(verbose_name)s '%(escaped_object)s' would result in deleting " +"related objects, but your account doesn't have permission to delete the " +"following types of objects:" +msgstr "" + +#: templates/xadmin/views/model_delete_confirm.html:19 +#, python-format +msgid "" +"Deleting the %(verbose_name)s '%(escaped_object)s' would require deleting " +"the following protected related objects:" +msgstr "" + +#: templates/xadmin/views/model_delete_confirm.html:27 +#, python-format +msgid "" +"Are you sure you want to delete the %(verbose_name)s \"%(escaped_object)s\"? " +"All of the following related items will be deleted:" +msgstr "" + +#: templates/xadmin/views/model_delete_confirm.html:34 +#: templates/xadmin/views/model_delete_selected_confirm.html:49 +msgid "Yes, I'm sure" +msgstr "" + +#: templates/xadmin/views/model_delete_confirm.html:35 +#: templates/xadmin/views/model_delete_selected_confirm.html:50 +msgid "Cancel" +msgstr "" + +#: templates/xadmin/views/model_delete_selected_confirm.html:10 +msgid "Delete multiple objects" +msgstr "" + +#: templates/xadmin/views/model_delete_selected_confirm.html:18 +#, python-format +msgid "" +"Deleting the selected %(objects_name)s would result in deleting related " +"objects, but your account doesn't have permission to delete the following " +"types of objects:" +msgstr "" + +#: templates/xadmin/views/model_delete_selected_confirm.html:26 +#, python-format +msgid "" +"Deleting the selected %(objects_name)s would require deleting the following " +"protected related objects:" +msgstr "" + +#: templates/xadmin/views/model_delete_selected_confirm.html:34 +#, python-format +msgid "" +"Are you sure you want to delete the selected %(objects_name)s? All of the " +"following objects and their related items will be deleted:" +msgstr "" + +#: templates/xadmin/views/model_history.html:26 +msgid "Diff" +msgstr "" + +#: templates/xadmin/views/model_history.html:27 +#: templates/xadmin/views/recover_list.html:25 +msgid "Date/time" +msgstr "" + +#: templates/xadmin/views/model_history.html:28 +msgid "User" +msgstr "" + +#: templates/xadmin/views/model_history.html:29 +msgid "Comment" +msgstr "" + +#: templates/xadmin/views/model_history.html:54 +msgid "Diff Select Versions" +msgstr "" + +#: templates/xadmin/views/model_history.html:58 +msgid "" +"This object doesn't have a change history. It probably wasn't added via this " +"admin site." +msgstr "" + +#: templates/xadmin/views/model_list.html:29 +#, python-format +msgid "Add %(name)s" +msgstr "" + +#: templates/xadmin/views/model_list.html:39 +msgid "Columns" +msgstr "" + +#: templates/xadmin/views/model_list.html:42 +msgid "Restore Selected" +msgstr "" + +#: templates/xadmin/views/model_list.html:147 +#: templates/xadmin/widgets/list.html:33 +msgid "Empty list" +msgstr "" + +#: templates/xadmin/views/recover_form.html:20 +msgid "Press the recover button below to recover this version of the object." +msgstr "" + +#: templates/xadmin/views/recover_list.html:19 +msgid "" +"Choose a date from the list below to recover a deleted version of an object." +msgstr "" + +#: templates/xadmin/views/recover_list.html:39 +msgid "There are no deleted objects to recover." +msgstr "" + +#: templates/xadmin/views/revision_diff.html:12 +#: templates/xadmin/views/revision_diff.html:17 +#, python-format +msgid "Diff %(verbose_name)s" +msgstr "" + +#: templates/xadmin/views/revision_diff.html:25 +msgid "Field" +msgstr "" + +#: templates/xadmin/views/revision_diff.html:26 +msgid "Version A" +msgstr "" + +#: templates/xadmin/views/revision_diff.html:27 +msgid "Version B" +msgstr "" + +#: templates/xadmin/views/revision_diff.html:39 +msgid "Revert to" +msgstr "" + +#: templates/xadmin/views/revision_diff.html:40 +#: templates/xadmin/views/revision_diff.html:41 +msgid "Revert" +msgstr "" + +#: templates/xadmin/views/revision_form.html:16 +#, python-format +msgid "Revert %(verbose_name)s" +msgstr "" + +#: templates/xadmin/views/revision_form.html:21 +msgid "Press the revert button below to revert to this version of the object." +msgstr "" + +#: templates/xadmin/views/revision_form.html:27 +msgid "Revert this revision" +msgstr "" + +#: templates/xadmin/widgets/addform.html:14 +msgid "Success" +msgstr "" + +#: templates/xadmin/widgets/addform.html:14 +msgid "Add success, click edit to edit." +msgstr "" + +#: templates/xadmin/widgets/addform.html:17 +msgid "Quick Add" +msgstr "" + +#: templates/xadmin/widgets/base.html:31 +msgid "Widget Options" +msgstr "" + +#: templates/xadmin/widgets/base.html:42 +msgid "Save changes" +msgstr "" + +#: views/base.py:315 +msgid "Django Xadmin" +msgstr "" + +#: views/base.py:316 +msgid "my-company.inc" +msgstr "" + +#: views/dashboard.py:186 +msgid "Widget ID" +msgstr "" + +#: views/dashboard.py:187 +msgid "Widget Title" +msgstr "" + +#: views/dashboard.py:252 +msgid "Html Content Widget, can write any html content in widget." +msgstr "" + +#: views/dashboard.py:255 +msgid "Html Content" +msgstr "" + +#: views/dashboard.py:318 +msgid "Target Model" +msgstr "" + +#: views/dashboard.py:369 +msgid "Quick button Widget, quickly open any page." +msgstr "" + +#: views/dashboard.py:371 +msgid "Quick Buttons" +msgstr "" + +#: views/dashboard.py:416 +msgid "Any Objects list Widget." +msgstr "" + +#: views/dashboard.py:456 +msgid "Add any model object Widget." +msgstr "" + +#: views/dashboard.py:492 +msgid "Dashboard" +msgstr "" + +#: views/dashboard.py:633 +#, python-format +msgid "%s Dashboard" +msgstr "" + +#: views/delete.py:103 +#, python-format +msgid "The %(name)s \"%(obj)s\" was deleted successfully." +msgstr "" + +#: views/detail.py:173 views/edit.py:211 views/form.py:72 +msgid "Other Fields" +msgstr "" + +#: views/detail.py:235 +#, python-format +msgid "%s Detail" +msgstr "" + +#: views/edit.py:253 +msgid "Added." +msgstr "" + +#: views/edit.py:255 +#, fuzzy, python-format +#| msgid "Change %s" +msgid "Changed %s." +msgstr "Изменить %s" + +#: views/edit.py:255 +msgid "and" +msgstr "" + +#: views/edit.py:258 +msgid "No fields changed." +msgstr "" + +#: views/edit.py:420 +#, python-format +msgid "The %(name)s \"%(obj)s\" was added successfully." +msgstr "" + +#: views/edit.py:425 views/edit.py:520 +msgid "You may edit it again below." +msgstr "" + +#: views/edit.py:429 views/edit.py:523 +#, python-format +msgid "You may add another %s below." +msgstr "" + +#: views/edit.py:471 +#, python-format +msgid "Change %s" +msgstr "Изменить %s" + +#: views/edit.py:516 +#, python-format +msgid "The %(name)s \"%(obj)s\" was changed successfully." +msgstr "" + +#: views/form.py:165 +#, fuzzy, python-format +msgid "The %s was changed successfully." +msgstr "Пароль успешно изменен" + +#: views/list.py:199 +msgid "Database error" +msgstr "" + +#: views/list.py:373 +#, python-format +msgid "%s List" +msgstr "" + +#: views/list.py:499 +msgid "Sort ASC" +msgstr "" + +#: views/list.py:500 +msgid "Sort DESC" +msgstr "" + +#: views/list.py:504 +msgid "Cancel Sort" +msgstr "" + +#: views/website.py:16 +msgid "Main Dashboard" +msgstr "" + +#: widgets.py:48 +msgid "Now" +msgstr "Сейчас" diff --git "a/8\343\200\201\346\226\207\347\214\256\346\225\260\346\215\256\346\214\226\346\216\230\347\263\273\347\273\237(\351\231\204\346\272\220\347\240\201)/extra_apps/xadmin/locale/ru_RU/LC_MESSAGES/djangojs.mo" "b/8\343\200\201\346\226\207\347\214\256\346\225\260\346\215\256\346\214\226\346\216\230\347\263\273\347\273\237(\351\231\204\346\272\220\347\240\201)/extra_apps/xadmin/locale/ru_RU/LC_MESSAGES/djangojs.mo" new file mode 100644 index 0000000..801ea7b Binary files /dev/null and "b/8\343\200\201\346\226\207\347\214\256\346\225\260\346\215\256\346\214\226\346\216\230\347\263\273\347\273\237(\351\231\204\346\272\220\347\240\201)/extra_apps/xadmin/locale/ru_RU/LC_MESSAGES/djangojs.mo" differ diff --git "a/8\343\200\201\346\226\207\347\214\256\346\225\260\346\215\256\346\214\226\346\216\230\347\263\273\347\273\237(\351\231\204\346\272\220\347\240\201)/extra_apps/xadmin/locale/ru_RU/LC_MESSAGES/djangojs.po" "b/8\343\200\201\346\226\207\347\214\256\346\225\260\346\215\256\346\214\226\346\216\230\347\263\273\347\273\237(\351\231\204\346\272\220\347\240\201)/extra_apps/xadmin/locale/ru_RU/LC_MESSAGES/djangojs.po" new file mode 100644 index 0000000..baa8343 --- /dev/null +++ "b/8\343\200\201\346\226\207\347\214\256\346\225\260\346\215\256\346\214\226\346\216\230\347\263\273\347\273\237(\351\231\204\346\272\220\347\240\201)/extra_apps/xadmin/locale/ru_RU/LC_MESSAGES/djangojs.po" @@ -0,0 +1,71 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER +# This file is distributed under the same license as the PACKAGE package. +# +# Translators: +msgid "" +msgstr "" +"Project-Id-Version: xadmin-core\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2013-04-30 23:11+0800\n" +"PO-Revision-Date: 2013-11-20 12:41+0000\n" +"Last-Translator: sshwsfc \n" +"Language-Team: Russian (Russia) (http://www.transifex.com/projects/p/xadmin/language/ru_RU/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: ru_RU\n" +"Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n" + +#: static/xadmin/js/xadmin.plugin.actions.js:20 +msgid "%(sel)s of %(cnt)s selected" +msgid_plural "%(sel)s of %(cnt)s selected" +msgstr[0] "" +msgstr[1] "" +msgstr[2] "" + +#: static/xadmin/js/xadmin.plugin.revision.js:25 +msgid "New Item" +msgstr "" + +#: static/xadmin/js/xadmin.widget.datetime.js:32 +msgid "Sunday Monday Tuesday Wednesday Thursday Friday Saturday Sunday" +msgstr "" + +#: static/xadmin/js/xadmin.widget.datetime.js:33 +msgid "Sun Mon Tue Wed Thu Fri Sat Sun" +msgstr "" + +#: static/xadmin/js/xadmin.widget.datetime.js:34 +msgid "Su Mo Tu We Th Fr Sa Su" +msgstr "" + +#: static/xadmin/js/xadmin.widget.datetime.js:35 +msgid "" +"January February March April May June July August September October November" +" December" +msgstr "" + +#: static/xadmin/js/xadmin.widget.datetime.js:36 +msgid "Jan Feb Mar Apr May Jun Jul Aug Sep Oct Nov Dec" +msgstr "" + +#: static/xadmin/js/xadmin.widget.datetime.js:37 +msgid "Today" +msgstr "" + +#: static/xadmin/js/xadmin.widget.datetime.js:38 +msgid "%a %d %b %Y %T %Z" +msgstr "" + +#: static/xadmin/js/xadmin.widget.datetime.js:39 +msgid "AM PM" +msgstr "" + +#: static/xadmin/js/xadmin.widget.datetime.js:40 +msgid "am pm" +msgstr "" + +#: static/xadmin/js/xadmin.widget.datetime.js:43 +msgid "%T" +msgstr "" diff --git "a/8\343\200\201\346\226\207\347\214\256\346\225\260\346\215\256\346\214\226\346\216\230\347\263\273\347\273\237(\351\231\204\346\272\220\347\240\201)/extra_apps/xadmin/locale/zh_Hans/LC_MESSAGES/django.mo" "b/8\343\200\201\346\226\207\347\214\256\346\225\260\346\215\256\346\214\226\346\216\230\347\263\273\347\273\237(\351\231\204\346\272\220\347\240\201)/extra_apps/xadmin/locale/zh_Hans/LC_MESSAGES/django.mo" new file mode 100644 index 0000000..2107c5b Binary files /dev/null and "b/8\343\200\201\346\226\207\347\214\256\346\225\260\346\215\256\346\214\226\346\216\230\347\263\273\347\273\237(\351\231\204\346\272\220\347\240\201)/extra_apps/xadmin/locale/zh_Hans/LC_MESSAGES/django.mo" differ diff --git "a/8\343\200\201\346\226\207\347\214\256\346\225\260\346\215\256\346\214\226\346\216\230\347\263\273\347\273\237(\351\231\204\346\272\220\347\240\201)/extra_apps/xadmin/locale/zh_Hans/LC_MESSAGES/django.po" "b/8\343\200\201\346\226\207\347\214\256\346\225\260\346\215\256\346\214\226\346\216\230\347\263\273\347\273\237(\351\231\204\346\272\220\347\240\201)/extra_apps/xadmin/locale/zh_Hans/LC_MESSAGES/django.po" new file mode 100644 index 0000000..cd41423 --- /dev/null +++ "b/8\343\200\201\346\226\207\347\214\256\346\225\260\346\215\256\346\214\226\346\216\230\347\263\273\347\273\237(\351\231\204\346\272\220\347\240\201)/extra_apps/xadmin/locale/zh_Hans/LC_MESSAGES/django.po" @@ -0,0 +1,1528 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER +# This file is distributed under the same license as the PACKAGE package. +# +# Translators: +# sshwsfc , 2013 +# sshwsfc , 2013 +msgid "" +msgstr "" +"Project-Id-Version: xadmin-core\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2017-09-04 15:12+0800\n" +"PO-Revision-Date: 2013-11-20 10:21+0000\n" +"Last-Translator: sshwsfc \n" +"Language-Team: Chinese (China) (http://www.transifex.com/projects/p/xadmin/" +"language/zh_CN/)\n" +"Language: zh_CN\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=1; plural=0;\n" + +#: .\adminx.py:20 +msgid "Admin Object" +msgstr "管理对象" + +#: .\apps.py:11 +msgid "Administration" +msgstr "管理" + +#: .\filters.py:169 .\filters.py:207 .\filters.py:427 .\filters.py:513 +#: .\filters.py:551 +msgid "All" +msgstr "全部" + +#: .\filters.py:170 .\plugins\export.py:167 +msgid "Yes" +msgstr "是" + +#: .\filters.py:171 .\plugins\export.py:167 +msgid "No" +msgstr "否" + +#: .\filters.py:191 +msgid "Unknown" +msgstr "未知" + +#: .\filters.py:287 +msgid "Any date" +msgstr "任意日期" + +#: .\filters.py:288 +msgid "Has date" +msgstr "有日期" + +#: .\filters.py:291 +msgid "Has no date" +msgstr "无日期" + +#: .\filters.py:294 .\widgets.py:35 .\widgets.py:81 +msgid "Today" +msgstr "今天" + +#: .\filters.py:298 +msgid "Past 7 days" +msgstr "过去7天" + +#: .\filters.py:302 +msgid "This month" +msgstr "本月" + +#: .\filters.py:306 +msgid "This year" +msgstr "今年" + +#: .\forms.py:10 +msgid "" +"Please enter the correct username and password for a staff account. Note " +"that both fields are case-sensitive." +msgstr "" +"请输入正确的用户名和密码来登陆您的管理账户。请注意用户名和密码均为大小写相" +"关。" + +#: .\forms.py:21 +msgid "Please log in again, because your session has expired." +msgstr "请重新登录,因为你的会话已经过期。" + +#: .\forms.py:42 +#, python-format +msgid "Your e-mail address is not your username. Try '%s' instead." +msgstr "你的 e-mail 地址不是你的用户名。换 '%s' 试试。" + +#: .\models.py:46 +msgid "Title" +msgstr "标题" + +#: .\models.py:47 .\models.py:87 .\models.py:107 .\models.py:151 +msgid "user" +msgstr "用户" + +#: .\models.py:48 +msgid "Url Name" +msgstr "URL名字" + +#: .\models.py:50 +msgid "Query String" +msgstr "Query参数" + +#: .\models.py:51 +msgid "Is Shared" +msgstr "是否共享" + +#: .\models.py:64 .\plugins\bookmark.py:59 .\plugins\bookmark.py:194 +msgid "Bookmark" +msgstr "书签" + +#: .\models.py:65 +msgid "Bookmarks" +msgstr "书签" + +#: .\models.py:88 +msgid "Settings Key" +msgstr "设置KEY" + +#: .\models.py:89 +msgid "Settings Content" +msgstr "设置内容" + +#: .\models.py:101 +msgid "User Setting" +msgstr "用户设置" + +#: .\models.py:102 +msgid "User Settings" +msgstr "用户设置" + +#: .\models.py:108 +msgid "Page" +msgstr "页面" + +#: .\models.py:109 .\views\dashboard.py:85 .\views\dashboard.py:95 +msgid "Widget Type" +msgstr "Widget类型" + +#: .\models.py:110 .\views\dashboard.py:86 +msgid "Widget Params" +msgstr "Widget参数" + +#: .\models.py:137 +msgid "User Widget" +msgstr "用户小组件" + +#: .\models.py:138 +msgid "User Widgets" +msgstr "用户小组件" + +#: .\models.py:144 +msgid "action time" +msgstr "记录时间" + +#: .\models.py:153 +msgid "action ip" +msgstr "操作IP" + +#: .\models.py:157 +msgid "content type" +msgstr "数据类型" + +#: .\models.py:160 +msgid "object id" +msgstr "数据ID" + +#: .\models.py:161 +msgid "object repr" +msgstr "数据描述" + +#: .\models.py:162 +msgid "action flag" +msgstr "操作标示" + +#: .\models.py:163 +msgid "change message" +msgstr "修改信息" + +#: .\models.py:166 +msgid "log entry" +msgstr "日志" + +#: .\models.py:167 +msgid "log entries" +msgstr "日志" + +#: .\models.py:175 +#, python-format +msgid "Added \"%(object)s\"." +msgstr "添加 \"%(object)s\"。" + +#: .\models.py:177 +#, python-format +msgid "Changed \"%(object)s\" - %(changes)s" +msgstr "修改 \"%(object)s\" - %(changes)s" + +#: .\models.py:182 +#, python-format +msgid "Deleted \"%(object)s.\"" +msgstr "删除 \"%(object)s.\"" + +#: .\plugins\actions.py:58 +#, python-format +msgid "Delete selected %(verbose_name_plural)s" +msgstr "删除所选的 %(verbose_name_plural)s" + +#: .\plugins\actions.py:73 +#, python-format +msgid "Batch delete %(count)d %(items)s." +msgstr "批量删除 %(count)d 个 %(items)s" + +#: .\plugins\actions.py:79 +#, python-format +msgid "Successfully deleted %(count)d %(items)s." +msgstr "成功删除了 %(count)d 个 %(items)s" + +#: .\plugins\actions.py:111 .\views\delete.py:71 +#, python-format +msgid "Cannot delete %(name)s" +msgstr "无法删除 %(name)s" + +#: .\plugins\actions.py:113 .\views\delete.py:74 +msgid "Are you sure?" +msgstr "你确定吗?" + +#: .\plugins\actions.py:159 +#, python-format +msgid "%(total_count)s selected" +msgid_plural "All %(total_count)s selected" +msgstr[0] "选中了 %(total_count)s 个" + +#: .\plugins\actions.py:163 +#, python-format +msgid "0 of %(cnt)s selected" +msgstr "%(cnt)s 个中 0 个被选" + +#: .\plugins\actions.py:180 .\plugins\actions.py:190 +msgid "" +"Items must be selected in order to perform actions on them. No items have " +"been changed." +msgstr "条目必须选中以对其进行操作。没有任何条目被更改。" + +#: .\plugins\aggregation.py:14 +msgid "Min" +msgstr "最小" + +#: .\plugins\aggregation.py:14 +msgid "Max" +msgstr "最大" + +#: .\plugins\aggregation.py:14 +msgid "Avg" +msgstr "平均" + +#: .\plugins\aggregation.py:14 +msgid "Sum" +msgstr "总和" + +#: .\plugins\aggregation.py:14 +msgid "Count" +msgstr "总数" + +#: .\plugins\auth.py:25 +#, python-format +msgid "Can add %s" +msgstr "添加:%s" + +#: .\plugins\auth.py:26 +#, python-format +msgid "Can change %s" +msgstr "修改:%s" + +#: .\plugins\auth.py:27 +#, python-format +msgid "Can edit %s" +msgstr "编辑:%s" + +#: .\plugins\auth.py:28 +#, python-format +msgid "Can delete %s" +msgstr "删除:%s" + +#: .\plugins\auth.py:29 +#, python-format +msgid "Can view %s" +msgstr "查看:%s" + +#: .\plugins\auth.py:91 +msgid "Personal info" +msgstr "个人信息" + +#: .\plugins\auth.py:95 +msgid "Permissions" +msgstr "权限" + +#: .\plugins\auth.py:98 +msgid "Important dates" +msgstr "重要日期" + +#: .\plugins\auth.py:103 +msgid "Status" +msgstr "状态" + +#: .\plugins\auth.py:115 +msgid "Permission Name" +msgstr "权限" + +#: .\plugins\auth.py:171 +msgid "Change Password" +msgstr "更改密码" + +#: .\plugins\auth.py:202 +#, python-format +msgid "Change password: %s" +msgstr "更改密码:%s" + +#: .\plugins\auth.py:227 .\plugins\auth.py:259 +msgid "Password changed successfully." +msgstr "密码更改成功" + +#: .\plugins\auth.py:246 .\templates\xadmin\auth\user\change_password.html:11 +#: .\templates\xadmin\auth\user\change_password.html:22 +#: .\templates\xadmin\auth\user\change_password.html:55 +msgid "Change password" +msgstr "修改密码" + +#: .\plugins\batch.py:44 +msgid "Change this field" +msgstr "修改该字段" + +#: .\plugins\batch.py:65 +#, python-format +msgid "Batch Change selected %(verbose_name_plural)s" +msgstr "批量修改选择的%(verbose_name_plural)s" + +#: .\plugins\batch.py:89 +#, python-format +msgid "Successfully change %(count)d %(items)s." +msgstr "成功修改了 %(count)d 个 %(items)s" + +#: .\plugins\batch.py:138 +#, python-format +msgid "Batch change %s" +msgstr "批量修改 %s" + +#: .\plugins\bookmark.py:187 +msgid "bookmark" +msgstr "书签" + +#: .\plugins\bookmark.py:190 +msgid "Bookmark Widget, can show user's bookmark list data in widget." +msgstr "书签组件,展示用户书签页内容。" + +#: .\plugins\chart.py:24 +msgid "Show models simple chart." +msgstr "展示简单数据图表" + +#: .\plugins\chart.py:50 +#, python-format +msgid "%s Charts" +msgstr "%s图表" + +#: .\plugins\comments.py:33 +msgid "Metadata" +msgstr "" + +#: .\plugins\comments.py:60 +msgid "flagged" +msgid_plural "flagged" +msgstr[0] "" + +#: .\plugins\comments.py:61 +msgid "Flag selected comments" +msgstr "" + +#: .\plugins\comments.py:66 +msgid "approved" +msgid_plural "approved" +msgstr[0] "" + +#: .\plugins\comments.py:67 +msgid "Approve selected comments" +msgstr "" + +#: .\plugins\comments.py:72 +msgid "removed" +msgid_plural "removed" +msgstr[0] "删除" + +#: .\plugins\comments.py:73 +msgid "Remove selected comments" +msgstr "恢复删除的%(name)s" + +#: .\plugins\comments.py:86 +#, python-format +msgid "1 comment was successfully %(action)s." +msgid_plural "%(count)s comments were successfully %(action)s." +msgstr[0] "" + +#: .\plugins\details.py:52 .\views\list.py:577 +#, python-format +msgid "Details of %s" +msgstr "%s详情" + +#: .\plugins\editable.py:46 +#, python-format +msgid "Enter %s" +msgstr "输入%s" + +#: .\plugins\editable.py:73 .\views\dashboard.py:652 .\views\delete.py:28 +#: .\views\detail.py:145 .\views\edit.py:460 +#, python-format +msgid "%(name)s object with primary key %(key)r does not exist." +msgstr "具有主键 %(key)r 的对象 %(name)s 不存在。" + +#: .\plugins\export.py:100 .\plugins\export.py:137 +msgid "Sheet" +msgstr "表" + +#: .\plugins\filters.py:137 .\plugins\quickfilter.py:143 +#, python-format +msgid "Filtering error: %s" +msgstr "过滤器错误: %s" + +#: .\plugins\images.py:29 +msgid "Previous" +msgstr "上一个" + +#: .\plugins\images.py:29 +msgid "Next" +msgstr "下一个" + +#: .\plugins\images.py:29 +msgid "Slideshow" +msgstr "幻灯片" + +#: .\plugins\images.py:29 +msgid "Download" +msgstr "下载" + +#: .\plugins\images.py:50 +msgid "Change:" +msgstr "修改:" + +#: .\plugins\importexport.py:174 .\plugins\importexport.py:244 +#: .\templates\xadmin\blocks\model_list.top_toolbar.importexport.import.html:4 +#: .\templates\xadmin\import_export\import.html:6 +#: .\templates\xadmin\import_export\import.html:13 +#, fuzzy +#| msgid "Export" +msgid "Import" +msgstr "导出" + +#: .\plugins\importexport.py:227 +#, python-format +msgid "

    Imported file has a wrong encoding: %s

    " +msgstr "

    导入文件编码错误: %s

    " + +#: .\plugins\importexport.py:229 +#, python-format +msgid "

    %s encountered while trying to read file: %s

    " +msgstr "

    %s读取文件是发生错误: %s

    " + +#: .\plugins\importexport.py:300 +msgid "Import finished" +msgstr "导入完成" + +#: .\plugins\importexport.py:300 +#: .\templates\xadmin\blocks\comm.top.topnav.html:23 +msgid "Add" +msgstr "增加" + +#: .\plugins\importexport.py:301 +#: .\templates\xadmin\import_export\import.html:109 +msgid "Update" +msgstr "更新" + +#: .\plugins\importexport.py:435 +msgid "You must select an export format." +msgstr "必须选择一种导入格式" + +#: .\plugins\layout.py:16 +msgid "Table" +msgstr "表格" + +#: .\plugins\layout.py:22 +msgid "Thumbnails" +msgstr "图标" + +#: .\plugins\passwords.py:62 +msgid "Forgotten your password or username?" +msgstr "忘记了您的密码或用户名?" + +#: .\plugins\quickform.py:80 +#, python-format +msgid "Create New %s" +msgstr "创建新的 %s" + +#: .\plugins\relate.py:105 +msgid "Related Objects" +msgstr "关联数据" + +#: .\plugins\relfield.py:29 .\plugins\topnav.py:38 +#, python-format +msgid "Search %s" +msgstr "搜索%s" + +#: .\plugins\relfield.py:77 +#, python-format +msgid "Select %s" +msgstr "选择%s" + +#: .\plugins\themes.py:59 +msgid "Default" +msgstr "默认" + +#: .\plugins\themes.py:59 +msgid "Default bootstrap theme" +msgstr "默认Bootstrap主题" + +#: .\plugins\themes.py:60 +msgid "Bootstrap2" +msgstr "Bootstrap2" + +#: .\plugins\themes.py:60 +msgid "Bootstrap 2.x theme" +msgstr "Bootstrap2主题" + +#: .\plugins\topnav.py:62 .\views\dashboard.py:468 .\views\edit.py:393 +#: .\views\edit.py:402 +#, python-format +msgid "Add %s" +msgstr "增加 %s" + +#: .\plugins\xversion.py:107 +msgid "Initial version." +msgstr "初始化版本" + +#: .\plugins\xversion.py:109 +msgid "Change version." +msgstr "修改版本" + +#: .\plugins\xversion.py:111 +msgid "Revert version." +msgstr "还原版本" + +#: .\plugins\xversion.py:113 +msgid "Rercover version." +msgstr "恢复版本" + +#: .\plugins\xversion.py:115 +#, python-format +msgid "Deleted %(verbose_name)s." +msgstr "删除%(verbose_name)s。" + +#: .\plugins\xversion.py:128 .\templates\xadmin\views\recover_form.html:26 +msgid "Recover" +msgstr "还原" + +#: .\plugins\xversion.py:144 .\templates\xadmin\views\model_history.html:11 +#: .\templates\xadmin\views\revision_diff.html:11 +#: .\templates\xadmin\views\revision_form.html:15 +msgid "History" +msgstr "历史" + +#: .\plugins\xversion.py:195 .\templates\xadmin\views\recover_form.html:14 +#: .\templates\xadmin\views\recover_list.html:10 +#, python-format +msgid "Recover deleted %(name)s" +msgstr "恢复删除的%(name)s" + +#: .\plugins\xversion.py:239 +#, python-format +msgid "Change history: %s" +msgstr "变更历史: %s" + +#: .\plugins\xversion.py:289 +msgid "Must select two versions." +msgstr "必须选择两个版本。" + +#: .\plugins\xversion.py:297 +msgid "Please select two different versions." +msgstr "请选择两个不同的版本。" + +#: .\plugins\xversion.py:384 .\plugins\xversion.py:501 +#, python-format +msgid "Current: %s" +msgstr "当前:%s" + +#: .\plugins\xversion.py:425 +#, python-format +msgid "Revert %s" +msgstr "还原%s" + +#: .\plugins\xversion.py:441 +#, python-format +msgid "" +"The %(model)s \"%(name)s\" was reverted successfully. You may edit it again " +"below." +msgstr "%(model)s “%(name)s”成功还原,您可以继续编辑。" + +#: .\plugins\xversion.py:462 +#, python-format +msgid "Recover %s" +msgstr "恢复%s" + +#: .\plugins\xversion.py:478 +#, python-format +msgid "" +"The %(model)s \"%(name)s\" was recovered successfully. You may edit it again " +"below." +msgstr "%(model)s “%(name)s”成功恢复,您可以继续编辑。" + +#: .\templates\xadmin\404.html:4 .\templates\xadmin\404.html:8 +msgid "Page not found" +msgstr "页面没有找到" + +#: .\templates\xadmin\404.html:10 +msgid "We're sorry, but the requested page could not be found." +msgstr "很报歉,请求页面无法找到。" + +#: .\templates\xadmin\500.html:7 +#: .\templates\xadmin\auth\user\change_password.html:10 +#: .\templates\xadmin\auth\user\change_password.html:15 +#: .\templates\xadmin\base_site.html:53 +#: .\templates\xadmin\import_export\export_action.html:13 +#: .\templates\xadmin\import_export\import.html:11 +#: .\templates\xadmin\includes\sitemenu_default.html:7 +#: .\templates\xadmin\views\app_index.html:9 +#: .\templates\xadmin\views\batch_change_form.html:9 +#: .\templates\xadmin\views\invalid_setup.html:7 +#: .\templates\xadmin\views\model_dashboard.html:7 +#: .\templates\xadmin\views\model_delete_selected_confirm.html:8 +#: .\templates\xadmin\views\model_history.html:8 +#: .\templates\xadmin\views\recover_form.html:8 +#: .\templates\xadmin\views\recover_list.html:8 +#: .\templates\xadmin\views\revision_diff.html:8 +#: .\templates\xadmin\views\revision_form.html:8 .\views\base.py:478 +msgid "Home" +msgstr "首页" + +#: .\templates\xadmin\500.html:8 +msgid "Server error" +msgstr "服务器错误" + +#: .\templates\xadmin\500.html:12 +msgid "Server error (500)" +msgstr "服务器错误(500)" + +#: .\templates\xadmin\500.html:15 +msgid "Server Error (500)" +msgstr "服务器错误 (500)" + +#: .\templates\xadmin\500.html:16 +msgid "" +"There's been an error. It's been reported to the site administrators via e-" +"mail and should be fixed shortly. Thanks for your patience." +msgstr "" +"发生了一个错误。系统已将错误通过电子邮件报告给了站点管理员,相信问题应该会很" +"快得到解决。感谢您的耐心。" + +#: .\templates\xadmin\auth\password_reset\complete.html:11 +#: .\templates\xadmin\auth\password_reset\done.html:11 +msgid "Password reset successful" +msgstr "密码重设成功" + +#: .\templates\xadmin\auth\password_reset\complete.html:14 +msgid "Your password has been set. You may go ahead and log in now." +msgstr "你的口令己经设置。现在你可以继续进行登录。" + +#: .\templates\xadmin\auth\password_reset\complete.html:15 +msgid "Log in" +msgstr "登录" + +#: .\templates\xadmin\auth\password_reset\confirm.html:12 +msgid "Enter new password" +msgstr "输入新密码" + +#: .\templates\xadmin\auth\password_reset\confirm.html:17 +msgid "" +"Please enter your new password twice so we can verify you typed it in " +"correctly." +msgstr "请输入两遍新密码,以便我们校验你输入的是否正确。" + +#: .\templates\xadmin\auth\password_reset\confirm.html:19 +msgid "Change my password" +msgstr "修改我的密码" + +#: .\templates\xadmin\auth\password_reset\confirm.html:24 +msgid "Password reset unsuccessful" +msgstr "密码重设失败" + +#: .\templates\xadmin\auth\password_reset\confirm.html:27 +msgid "" +"The password reset link was invalid, possibly because it has already been " +"used. Please request a new password reset." +msgstr "密码重置链接无效,可能是因为它已使用。可以请求一次新的密码重置。" + +#: .\templates\xadmin\auth\password_reset\done.html:14 +msgid "" +"We've e-mailed you instructions for setting your password to the e-mail " +"address you submitted. You should be receiving it shortly." +msgstr "" +"我们已经按你所提交的电子邮箱地址发送了密码设置说明。你应该很快就能收到这封邮" +"件。" + +#: .\templates\xadmin\auth\password_reset\email.html:2 +#, python-format +msgid "" +"You're receiving this e-mail because you requested a password reset for your " +"user account at %(site_name)s." +msgstr "因为你要求重置 %(site_name)s 上的账户密码, 所以收到了这封邮件." + +#: .\templates\xadmin\auth\password_reset\email.html:4 +msgid "Please go to the following page and choose a new password:" +msgstr "请访问该页面并选择一个新密码:" + +#: .\templates\xadmin\auth\password_reset\email.html:8 +msgid "Your username, in case you've forgotten:" +msgstr "你的用户名,如果已忘记的话:" + +#: .\templates\xadmin\auth\password_reset\email.html:10 +msgid "Thanks for using our site!" +msgstr "感谢使用我们的站点!" + +#: .\templates\xadmin\auth\password_reset\email.html:12 +#, python-format +msgid "The %(site_name)s team" +msgstr "%(site_name)s 团队" + +#: .\templates\xadmin\auth\password_reset\form.html:13 +msgid "Password reset" +msgstr "密码重设" + +#: .\templates\xadmin\auth\password_reset\form.html:17 +msgid "" +"Forgotten your password? Enter your e-mail address below, and we'll e-mail " +"instructions for setting a new one." +msgstr "" +"忘记了你的密码?请在下面输入你的 e-mail 地址,我们将把新密码设置说明通过邮件" +"发送给你。" + +#: .\templates\xadmin\auth\password_reset\form.html:25 +msgid "E-mail address:" +msgstr "E-mail 地址:" + +#: .\templates\xadmin\auth\password_reset\form.html:33 +msgid "Reset my password" +msgstr "重设我的密码" + +#: .\templates\xadmin\auth\user\add_form.html:6 +msgid "" +"First, enter a username and password. Then, you'll be able to edit more user " +"options." +msgstr "首先,输入一个用户名和密码。然后,你就可以编辑更多的用户选项。" + +#: .\templates\xadmin\auth\user\add_form.html:8 +msgid "Enter a username and password." +msgstr "输入用户名和" + +#: .\templates\xadmin\auth\user\change_password.html:31 +#: .\templates\xadmin\views\batch_change_form.html:24 +#: .\templates\xadmin\views\form.html:18 +#: .\templates\xadmin\views\model_form.html:20 +msgid "Please correct the error below." +msgid_plural "Please correct the errors below." +msgstr[0] "请修正下面的错误。" + +#: .\templates\xadmin\auth\user\change_password.html:38 +msgid "Enter your new password." +msgstr "输入你的新密码" + +#: .\templates\xadmin\auth\user\change_password.html:40 +#, python-format +msgid "Enter a new password for the user %(username)s." +msgstr "为用户 %(username)s 输入一个新的密码。" + +#: .\templates\xadmin\base_site.html:18 +msgid "Welcome," +msgstr "欢迎," + +#: .\templates\xadmin\base_site.html:24 +msgid "Log out" +msgstr "注销" + +#: .\templates\xadmin\base_site.html:36 +msgid "You don't have permission to edit anything." +msgstr "你无权修改任何东西。" + +#: .\templates\xadmin\blocks\comm.top.theme.html:4 +msgid "Themes" +msgstr "主题" + +#: .\templates\xadmin\blocks\comm.top.topnav.html:9 +#: .\templates\xadmin\blocks\model_list.nav_form.search_form.html:8 +#: .\templates\xadmin\filters\char.html:7 +#: .\templates\xadmin\filters\fk_search.html:7 +#: .\templates\xadmin\filters\fk_search.html:16 +#: .\templates\xadmin\filters\number.html:7 +msgid "Search" +msgstr "搜索" + +#: .\templates\xadmin\blocks\model_form.submit_line.wizard.html:9 +#: .\templates\xadmin\blocks\model_form.submit_line.wizard.html:26 +msgid "Prev step" +msgstr "上一步" + +#: .\templates\xadmin\blocks\model_form.submit_line.wizard.html:13 +#: .\templates\xadmin\blocks\model_form.submit_line.wizard.html:29 +msgid "Next step" +msgstr "下一步" + +#: .\templates\xadmin\blocks\model_form.submit_line.wizard.html:15 +#: .\templates\xadmin\blocks\model_form.submit_line.wizard.html:31 +#: .\templates\xadmin\includes\submit_line.html:10 +#: .\templates\xadmin\includes\submit_line.html:13 +#: .\templates\xadmin\views\form.html:30 .\templates\xadmin\views\form.html:31 +msgid "Save" +msgstr "保存" + +#: .\templates\xadmin\blocks\model_list.nav_menu.bookmarks.html:7 +msgid "Clean Bookmarks" +msgstr "清除书签" + +#: .\templates\xadmin\blocks\model_list.nav_menu.bookmarks.html:18 +msgid "No Bookmarks" +msgstr "没有书签" + +#: .\templates\xadmin\blocks\model_list.nav_menu.bookmarks.html:22 +msgid "New Bookmark" +msgstr "新建书签" + +#: .\templates\xadmin\blocks\model_list.nav_menu.bookmarks.html:26 +msgid "Save current page as Bookmark" +msgstr "将当前页面保存为书签" + +#: .\templates\xadmin\blocks\model_list.nav_menu.bookmarks.html:32 +msgid "Enter bookmark title" +msgstr "输入书签标题" + +#: .\templates\xadmin\blocks\model_list.nav_menu.bookmarks.html:33 +msgid "Waiting" +msgstr "请稍侯" + +#: .\templates\xadmin\blocks\model_list.nav_menu.bookmarks.html:33 +msgid "Save Bookmark" +msgstr "保存书签" + +#: .\templates\xadmin\blocks\model_list.nav_menu.filters.html:4 +msgid "Filters" +msgstr "过滤器" + +#: .\templates\xadmin\blocks\model_list.nav_menu.filters.html:8 +msgid "Clean Filters" +msgstr "清除过滤器" + +#: .\templates\xadmin\blocks\model_list.results_bottom.actions.html:19 +msgid "Click here to select the objects across all pages" +msgstr "点击此处选择所有页面中包含的对象。" + +#: .\templates\xadmin\blocks\model_list.results_bottom.actions.html:19 +#, python-format +msgid "Select all %(total_count)s %(model_name)s" +msgstr "选中所有的 %(total_count)s 个 %(model_name)s" + +#: .\templates\xadmin\blocks\model_list.results_bottom.actions.html:20 +msgid "Clear selection" +msgstr "清除选中" + +#: .\templates\xadmin\blocks\model_list.results_top.charts.html:4 +msgid "Charts" +msgstr "图表" + +#: .\templates\xadmin\blocks\model_list.top_toolbar.exports.html:4 +#: .\templates\xadmin\blocks\model_list.top_toolbar.exports.html:8 +#: .\templates\xadmin\blocks\model_list.top_toolbar.exports.html:19 +#: .\templates\xadmin\blocks\model_list.top_toolbar.exports.html:47 +#: .\templates\xadmin\blocks\model_list.top_toolbar.importexport.export.html:4 +#: .\templates\xadmin\blocks\model_list.top_toolbar.importexport.export.html:12 +#: .\templates\xadmin\blocks\model_list.top_toolbar.importexport.export.html:41 +#: .\templates\xadmin\import_export\export_action.html:7 +#: .\templates\xadmin\import_export\export_action.html:15 +msgid "Export" +msgstr "导出" + +#: .\templates\xadmin\blocks\model_list.top_toolbar.exports.html:26 +#: .\templates\xadmin\blocks\model_list.top_toolbar.exports.html:29 +#: .\templates\xadmin\blocks\model_list.top_toolbar.exports.html:32 +msgid "Export with table header." +msgstr "导出表头" + +#: .\templates\xadmin\blocks\model_list.top_toolbar.exports.html:35 +#: .\templates\xadmin\blocks\model_list.top_toolbar.exports.html:38 +msgid "Export with format." +msgstr "导出格式" + +#: .\templates\xadmin\blocks\model_list.top_toolbar.exports.html:42 +#: .\templates\xadmin\blocks\model_list.top_toolbar.importexport.export.html:35 +msgid "Export all data." +msgstr "导出全部数据" + +#: .\templates\xadmin\blocks\model_list.top_toolbar.exports.html:46 +#: .\templates\xadmin\blocks\model_list.top_toolbar.importexport.export.html:39 +#: .\templates\xadmin\widgets\base.html:41 +msgid "Close" +msgstr "关闭" + +#: .\templates\xadmin\blocks\model_list.top_toolbar.importexport.export.html:33 +msgid "Export current page data." +msgstr "导出当前页数据" + +#: .\templates\xadmin\blocks\model_list.top_toolbar.importexport.export.html:34 +msgid "Export selected data." +msgstr "导出所选择数据" + +#: .\templates\xadmin\blocks\model_list.top_toolbar.importexport.export.html:36 +msgid "Export header only." +msgstr "仅导出表头" + +#: .\templates\xadmin\blocks\model_list.top_toolbar.layouts.html:4 +msgid "Layout" +msgstr "布局" + +#: .\templates\xadmin\blocks\model_list.top_toolbar.refresh.html:8 +msgid "Clean Refresh" +msgstr "清除自动刷新" + +#: .\templates\xadmin\blocks\model_list.top_toolbar.refresh.html:14 +#, python-format +msgid "Every %(t)s seconds" +msgstr "每 %(t)s 秒" + +#: .\templates\xadmin\blocks\model_list.top_toolbar.saveorder.html:4 +msgid "Save Order" +msgstr "保存排序" + +#: .\templates\xadmin\edit_inline\blank.html:5 .\views\detail.py:25 +#: .\views\edit.py:104 .\views\list.py:31 +msgid "Null" +msgstr "空" + +#: .\templates\xadmin\filters\char.html:13 +msgid "Enter" +msgstr "输入" + +#: .\templates\xadmin\filters\date.html:10 +#: .\templates\xadmin\filters\date.html:13 +msgid "Choice Date" +msgstr "选择日期" + +#: .\templates\xadmin\filters\date.html:18 +msgid "YY" +msgstr "年" + +#: .\templates\xadmin\filters\date.html:19 +msgid "year" +msgstr "年" + +#: .\templates\xadmin\filters\date.html:22 +msgid "MM" +msgstr "月" + +#: .\templates\xadmin\filters\date.html:23 +msgid "month" +msgstr "月" + +#: .\templates\xadmin\filters\date.html:26 +msgid "DD" +msgstr "日" + +#: .\templates\xadmin\filters\date.html:27 +msgid "day" +msgstr "日" + +#: .\templates\xadmin\filters\date.html:29 +#: .\templates\xadmin\filters\date.html:46 +#: .\templates\xadmin\filters\date.html:54 +#: .\templates\xadmin\filters\fk_search.html:24 +#: .\templates\xadmin\filters\number.html:37 +msgid "Apply" +msgstr "应用" + +#: .\templates\xadmin\filters\date.html:34 +msgid "Date Range" +msgstr "日期范围" + +#: .\templates\xadmin\filters\date.html:41 +msgid "Select Date" +msgstr "选择日期" + +#: .\templates\xadmin\filters\date.html:42 +msgid "From" +msgstr "从" + +#: .\templates\xadmin\filters\date.html:44 +msgid "To" +msgstr "到" + +#: .\templates\xadmin\filters\fk_search.html:14 +msgid "Select" +msgstr "选择" + +#: .\templates\xadmin\filters\fk_search.html:26 +#: .\templates\xadmin\filters\number.html:39 +msgid "Clean" +msgstr "清除" + +#: .\templates\xadmin\filters\number.html:17 +#: .\templates\xadmin\filters\number.html:25 +#: .\templates\xadmin\filters\number.html:33 +msgid "Enter Number" +msgstr "输入数字" + +#: .\templates\xadmin\filters\rel.html:3 +#, python-format +msgid " By %(filter_title)s " +msgstr " 以 %(filter_title)s" + +#: .\templates\xadmin\forms\transfer.html:4 +msgid "Available" +msgstr "可用项" + +#: .\templates\xadmin\forms\transfer.html:12 +msgid "Click to choose all at once." +msgstr "点击一次性选择全部" + +#: .\templates\xadmin\forms\transfer.html:12 +msgid "Choose all" +msgstr "选择全部" + +#: .\templates\xadmin\forms\transfer.html:16 +msgid "Choose" +msgstr "选择" + +#: .\templates\xadmin\forms\transfer.html:19 +#: .\templates\xadmin\widgets\base.html:40 +msgid "Remove" +msgstr "删除" + +#: .\templates\xadmin\forms\transfer.html:23 +msgid "Chosen" +msgstr "已选项" + +#: .\templates\xadmin\forms\transfer.html:27 +msgid "Click to remove all chosen at once." +msgstr "点击一次性删除全部" + +#: .\templates\xadmin\forms\transfer.html:27 +msgid "Remove all" +msgstr "删除全部" + +#: .\templates\xadmin\import_export\export_action.html:43 +#: .\templates\xadmin\import_export\import.html:59 +msgid "Submit" +msgstr "" + +#: .\templates\xadmin\import_export\import.html:26 +msgid "" +"Below is a preview of data to be imported. If you are satisfied with the " +"results, click 'Confirm import'" +msgstr "" + +#: .\templates\xadmin\import_export\import.html:29 +msgid "Confirm import" +msgstr "" + +#: .\templates\xadmin\import_export\import.html:38 +msgid "This importer will import the following fields: " +msgstr "" + +#: .\templates\xadmin\import_export\import.html:67 +msgid "Errors" +msgstr "" + +#: .\templates\xadmin\import_export\import.html:78 +#, fuzzy +#| msgid "Enter Number" +msgid "Line number" +msgstr "输入数字" + +#: .\templates\xadmin\import_export\import.html:88 +#, fuzzy +#| msgid "Previous" +msgid "Preview" +msgstr "上一个" + +#: .\templates\xadmin\import_export\import.html:103 +#, fuzzy +#| msgid "Now" +msgid "New" +msgstr "现在" + +#: .\templates\xadmin\import_export\import.html:105 +msgid "Skipped" +msgstr "" + +#: .\templates\xadmin\import_export\import.html:107 +#: .\templates\xadmin\includes\submit_line.html:24 +#: .\templates\xadmin\views\model_detail.html:28 .\views\delete.py:94 +msgid "Delete" +msgstr "删除" + +#: .\templates\xadmin\includes\pagination.html:9 +msgid "Show all" +msgstr "显示全部" + +#: .\templates\xadmin\includes\submit_line.html:10 +#: .\templates\xadmin\includes\submit_line.html:13 +#: .\templates\xadmin\views\form.html:30 .\templates\xadmin\views\form.html:31 +msgid "Saving.." +msgstr "保存中.." + +#: .\templates\xadmin\includes\submit_line.html:17 +msgid "Save as new" +msgstr "保存为新的" + +#: .\templates\xadmin\includes\submit_line.html:18 +msgid "Save and add another" +msgstr "保存并增加另一个" + +#: .\templates\xadmin\includes\submit_line.html:19 +msgid "Save and continue editing" +msgstr "保存并继续编辑" + +#: .\templates\xadmin\views\app_index.html:13 +#, python-format +msgid "%(name)s" +msgstr "%(name)s" + +#: .\templates\xadmin\views\batch_change_form.html:11 +msgid "Change multiple objects" +msgstr "修改多个数据" + +#: .\templates\xadmin\views\batch_change_form.html:16 +#, python-format +msgid "Change one %(objects_name)s" +msgid_plural "Batch change %(counter)s %(objects_name)s" +msgstr[0] "批量修改 %(counter)s 个 %(objects_name)s" + +#: .\templates\xadmin\views\batch_change_form.html:38 +msgid "Change Multiple" +msgstr "修改多个数据" + +#: .\templates\xadmin\views\dashboard.html:15 +#: .\templates\xadmin\views\dashboard.html:22 +#: .\templates\xadmin\views\dashboard.html:23 +msgid "Add Widget" +msgstr "添加小组件" + +#: .\templates\xadmin\views\invalid_setup.html:13 +msgid "" +"Something's wrong with your database installation. Make sure the appropriate " +"database tables have been created, and make sure the database is readable by " +"the appropriate user." +msgstr "" +"你的数据库安装有误。确保已经创建了相应的数据库表,并确保数据库可被相关的用户" +"读取。" + +#: .\templates\xadmin\views\logged_out.html:16 +msgid "Logout Success" +msgstr "成功退出" + +#: .\templates\xadmin\views\logged_out.html:17 +msgid "Thanks for spending some quality time with the Web site today." +msgstr "感谢您今天在本站花费了一些宝贵时间。" + +#: .\templates\xadmin\views\logged_out.html:19 +msgid "Close Window" +msgstr "关闭窗口" + +#: .\templates\xadmin\views\logged_out.html:20 +msgid "Log in again" +msgstr "重新登录" + +#: .\templates\xadmin\views\login.html:39 .\views\website.py:39 +msgid "Please Login" +msgstr "请登录" + +#: .\templates\xadmin\views\login.html:52 +msgid "Username" +msgstr "用户名" + +#: .\templates\xadmin\views\login.html:64 +msgid "Password" +msgstr "密码" + +#: .\templates\xadmin\views\login.html:75 +msgid "log in" +msgstr "登录" + +#: .\templates\xadmin\views\model_dashboard.html:26 +#: .\templates\xadmin\views\model_detail.html:25 +msgid "Edit" +msgstr "编辑" + +#: .\templates\xadmin\views\model_delete_confirm.html:11 +#, python-format +msgid "" +"Deleting the %(verbose_name)s '%(escaped_object)s' would result in deleting " +"related objects, but your account doesn't have permission to delete the " +"following types of objects:" +msgstr "" +"要删除所选的%(verbose_name)s '%(escaped_object)s' 结果会删除相关对象, 但你的" +"账户没有权限删除这类对象:" + +#: .\templates\xadmin\views\model_delete_confirm.html:19 +#, python-format +msgid "" +"Deleting the %(verbose_name)s '%(escaped_object)s' would require deleting " +"the following protected related objects:" +msgstr "" +"要删除所选的%(verbose_name)s '%(escaped_object)s' 将要求删除以下受保护的相关" +"对象:" + +#: .\templates\xadmin\views\model_delete_confirm.html:27 +#, python-format +msgid "" +"Are you sure you want to delete the %(verbose_name)s \"%(escaped_object)s\"? " +"All of the following related items will be deleted:" +msgstr "" +"请确认要删除选中的%(verbose_name)s \"%(escaped_object)s\"吗?以下所有对象和余" +"它们相关的条目将都会被删除:" + +#: .\templates\xadmin\views\model_delete_confirm.html:34 +#: .\templates\xadmin\views\model_delete_selected_confirm.html:49 +msgid "Yes, I'm sure" +msgstr "是的,我确定" + +#: .\templates\xadmin\views\model_delete_confirm.html:35 +#: .\templates\xadmin\views\model_delete_selected_confirm.html:50 +msgid "Cancel" +msgstr "取消" + +#: .\templates\xadmin\views\model_delete_selected_confirm.html:10 +msgid "Delete multiple objects" +msgstr "删除多个对象" + +#: .\templates\xadmin\views\model_delete_selected_confirm.html:18 +#, python-format +msgid "" +"Deleting the selected %(objects_name)s would result in deleting related " +"objects, but your account doesn't have permission to delete the following " +"types of objects:" +msgstr "" +"要删除所选的 %(objects_name)s 结果会删除相关对象, 但你的账户没有权限删除这类" +"对象:" + +#: .\templates\xadmin\views\model_delete_selected_confirm.html:26 +#, python-format +msgid "" +"Deleting the selected %(objects_name)s would require deleting the following " +"protected related objects:" +msgstr "要删除所选的 %(objects_name)s, 将要求删除以下受保护的相关对象:" + +#: .\templates\xadmin\views\model_delete_selected_confirm.html:34 +#, python-format +msgid "" +"Are you sure you want to delete the selected %(objects_name)s? All of the " +"following objects and their related items will be deleted:" +msgstr "" +"请确认要删除选中的 %(objects_name)s 吗?以下所有对象和余它们相关的条目将都会" +"被删除:" + +#: .\templates\xadmin\views\model_history.html:26 +msgid "Diff" +msgstr "不同" + +#: .\templates\xadmin\views\model_history.html:27 +#: .\templates\xadmin\views\recover_list.html:25 +msgid "Date/time" +msgstr "日期/时间" + +#: .\templates\xadmin\views\model_history.html:28 +msgid "User" +msgstr "用户" + +#: .\templates\xadmin\views\model_history.html:29 +msgid "Comment" +msgstr "注释" + +#: .\templates\xadmin\views\model_history.html:54 +msgid "Diff Select Versions" +msgstr "查看所选版本的不同" + +#: .\templates\xadmin\views\model_history.html:58 +msgid "" +"This object doesn't have a change history. It probably wasn't added via this " +"admin site." +msgstr "该对象没有变更历史记录。可能从未通过这个管理站点添加。" + +#: .\templates\xadmin\views\model_list.html:29 +#, python-format +msgid "Add %(name)s" +msgstr "增加 %(name)s" + +#: .\templates\xadmin\views\model_list.html:39 +msgid "Columns" +msgstr "显示列" + +#: .\templates\xadmin\views\model_list.html:42 +msgid "Restore Selected" +msgstr "恢复显示列" + +#: .\templates\xadmin\views\model_list.html:147 +#: .\templates\xadmin\widgets\list.html:33 +msgid "Empty list" +msgstr "空列表" + +#: .\templates\xadmin\views\recover_form.html:20 +msgid "Press the recover button below to recover this version of the object." +msgstr "点击下方的“还原”按钮还原到该版本。" + +#: .\templates\xadmin\views\recover_list.html:19 +msgid "" +"Choose a date from the list below to recover a deleted version of an object." +msgstr "从以下列表中选择一个日期来恢复删除掉的数据。" + +#: .\templates\xadmin\views\recover_list.html:39 +msgid "There are no deleted objects to recover." +msgstr "没有已删除的数据。" + +#: .\templates\xadmin\views\revision_diff.html:12 +#: .\templates\xadmin\views\revision_diff.html:17 +#, python-format +msgid "Diff %(verbose_name)s" +msgstr "%(verbose_name)s的不同" + +#: .\templates\xadmin\views\revision_diff.html:25 +msgid "Field" +msgstr "字段" + +#: .\templates\xadmin\views\revision_diff.html:26 +msgid "Version A" +msgstr "版本A" + +#: .\templates\xadmin\views\revision_diff.html:27 +msgid "Version B" +msgstr "版本B" + +#: .\templates\xadmin\views\revision_diff.html:39 +msgid "Revert to" +msgstr "还原到" + +#: .\templates\xadmin\views\revision_diff.html:40 +#: .\templates\xadmin\views\revision_diff.html:41 +msgid "Revert" +msgstr "还原" + +#: .\templates\xadmin\views\revision_form.html:16 +#, python-format +msgid "Revert %(verbose_name)s" +msgstr "还原%(verbose_name)s" + +#: .\templates\xadmin\views\revision_form.html:21 +msgid "Press the revert button below to revert to this version of the object." +msgstr "点击下方的“还原”按钮还原数据到该版本。" + +#: .\templates\xadmin\views\revision_form.html:27 +msgid "Revert this revision" +msgstr "还原该版本" + +#: .\templates\xadmin\widgets\addform.html:14 +msgid "Success" +msgstr "成功" + +#: .\templates\xadmin\widgets\addform.html:14 +msgid "Add success, click edit to edit." +msgstr "添加成功,点击 编辑 可以继续修改该数据。" + +#: .\templates\xadmin\widgets\addform.html:17 +msgid "Quick Add" +msgstr "快速添加" + +#: .\templates\xadmin\widgets\base.html:31 +msgid "Widget Options" +msgstr "小组件设置项" + +#: .\templates\xadmin\widgets\base.html:42 +msgid "Save changes" +msgstr "保存变更" + +#: .\views\base.py:320 +msgid "Django Xadmin" +msgstr "Django Xadmin" + +#: .\views\base.py:321 +msgid "my-company.inc" +msgstr "我的公司" + +#: .\views\dashboard.py:189 +msgid "Widget ID" +msgstr "小组件ID" + +#: .\views\dashboard.py:190 +msgid "Widget Title" +msgstr "小组件标题" + +#: .\views\dashboard.py:255 +msgid "Html Content Widget, can write any html content in widget." +msgstr "HTML内容小组件,可以编写任意HTML内容。" + +#: .\views\dashboard.py:258 +msgid "Html Content" +msgstr "HTML内容" + +#: .\views\dashboard.py:321 +msgid "Target Model" +msgstr "目标数据" + +#: .\views\dashboard.py:372 +msgid "Quick button Widget, quickly open any page." +msgstr "快捷按钮小组件,可以快速打开任意页面。" + +#: .\views\dashboard.py:374 +msgid "Quick Buttons" +msgstr "快速按钮" + +#: .\views\dashboard.py:419 +msgid "Any Objects list Widget." +msgstr "数据列表小组件" + +#: .\views\dashboard.py:459 +msgid "Add any model object Widget." +msgstr "添加任意数据的小组件" + +#: .\views\dashboard.py:495 +msgid "Dashboard" +msgstr "仪表盘" + +#: .\views\dashboard.py:636 +#, python-format +msgid "%s Dashboard" +msgstr "%s 主页" + +#: .\views\delete.py:104 +#, python-format +msgid "The %(name)s \"%(obj)s\" was deleted successfully." +msgstr "%(name)s \"%(obj)s\" 删除成功。" + +#: .\views\detail.py:173 .\views\edit.py:216 .\views\form.py:74 +msgid "Other Fields" +msgstr "其它字段" + +#: .\views\detail.py:235 +#, python-format +msgid "%s Detail" +msgstr "%s详情" + +#: .\views\edit.py:258 +msgid "Added." +msgstr "已添加" + +#: .\views\edit.py:260 +#, python-format +msgid "Changed %s." +msgstr "修改 %s" + +#: .\views\edit.py:260 +msgid "and" +msgstr "和" + +#: .\views\edit.py:263 +msgid "No fields changed." +msgstr "没有数据变化" + +#: .\views\edit.py:426 +#, python-format +msgid "The %(name)s \"%(obj)s\" was added successfully." +msgstr "%(name)s \"%(obj)s\" 添加成功。" + +#: .\views\edit.py:431 .\views\edit.py:526 +msgid "You may edit it again below." +msgstr "你可以在下面再次编辑它。" + +#: .\views\edit.py:435 .\views\edit.py:529 +#, python-format +msgid "You may add another %s below." +msgstr "你可以在下面增加另一个 %s 。" + +#: .\views\edit.py:477 +#, python-format +msgid "Change %s" +msgstr "修改 %s" + +#: .\views\edit.py:522 +#, python-format +msgid "The %(name)s \"%(obj)s\" was changed successfully." +msgstr "%(name)s \"%(obj)s\" 修改成功。" + +#: .\views\form.py:168 +#, python-format +msgid "The %s was changed successfully." +msgstr "%s 修改成功。" + +#: .\views\list.py:192 +msgid "Database error" +msgstr "数据库错误" + +#: .\views\list.py:369 +#, python-format +msgid "%s List" +msgstr "%s列表" + +#: .\views\list.py:498 +msgid "Sort ASC" +msgstr "正序" + +#: .\views\list.py:499 +msgid "Sort DESC" +msgstr "倒序" + +#: .\views\list.py:503 +msgid "Cancel Sort" +msgstr "取消排序" + +#: .\views\website.py:17 +msgid "Main Dashboard" +msgstr "主页面" + +#: .\widgets.py:53 .\widgets.py:81 +msgid "Now" +msgstr "现在" diff --git "a/8\343\200\201\346\226\207\347\214\256\346\225\260\346\215\256\346\214\226\346\216\230\347\263\273\347\273\237(\351\231\204\346\272\220\347\240\201)/extra_apps/xadmin/locale/zh_Hans/LC_MESSAGES/djangojs.mo" "b/8\343\200\201\346\226\207\347\214\256\346\225\260\346\215\256\346\214\226\346\216\230\347\263\273\347\273\237(\351\231\204\346\272\220\347\240\201)/extra_apps/xadmin/locale/zh_Hans/LC_MESSAGES/djangojs.mo" new file mode 100644 index 0000000..dea0231 Binary files /dev/null and "b/8\343\200\201\346\226\207\347\214\256\346\225\260\346\215\256\346\214\226\346\216\230\347\263\273\347\273\237(\351\231\204\346\272\220\347\240\201)/extra_apps/xadmin/locale/zh_Hans/LC_MESSAGES/djangojs.mo" differ diff --git "a/8\343\200\201\346\226\207\347\214\256\346\225\260\346\215\256\346\214\226\346\216\230\347\263\273\347\273\237(\351\231\204\346\272\220\347\240\201)/extra_apps/xadmin/locale/zh_Hans/LC_MESSAGES/djangojs.po" "b/8\343\200\201\346\226\207\347\214\256\346\225\260\346\215\256\346\214\226\346\216\230\347\263\273\347\273\237(\351\231\204\346\272\220\347\240\201)/extra_apps/xadmin/locale/zh_Hans/LC_MESSAGES/djangojs.po" new file mode 100644 index 0000000..65fb767 --- /dev/null +++ "b/8\343\200\201\346\226\207\347\214\256\346\225\260\346\215\256\346\214\226\346\216\230\347\263\273\347\273\237(\351\231\204\346\272\220\347\240\201)/extra_apps/xadmin/locale/zh_Hans/LC_MESSAGES/djangojs.po" @@ -0,0 +1,87 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER +# This file is distributed under the same license as the PACKAGE package. +# +# Translators: +# sshwsfc , 2013 +msgid "" +msgstr "" +"Project-Id-Version: xadmin-core\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2015-05-22 16:02+0800\n" +"PO-Revision-Date: 2013-11-20 12:41+0000\n" +"Last-Translator: sshwsfc \n" +"Language-Team: Chinese (China) (http://www.transifex.com/projects/p/xadmin/language/zh_CN/)\n" +"Language: zh_CN\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=1; plural=0;\n" + +#: static/xadmin/js/xadmin.page.dashboard.js:14 +#: static/xadmin/js/xadmin.plugin.details.js:24 +#: static/xadmin/js/xadmin.plugin.quick-form.js:172 +msgid "Close" +msgstr "关闭" + +#: static/xadmin/js/xadmin.page.dashboard.js:15 +msgid "Save changes" +msgstr "保存修改" + +#: static/xadmin/js/xadmin.plugin.actions.js:11 +msgid "%(sel)s of %(cnt)s selected" +msgid_plural "%(sel)s of %(cnt)s selected" +msgstr[0] "选中了 %(cnt)s 个中的 %(sel)s 个" +msgstr[1] "选中了 %(cnt)s 个中的 %(sel)s 个" + +#: static/xadmin/js/xadmin.plugin.details.js:25 +msgid "Edit" +msgstr "编辑" + +#: static/xadmin/js/xadmin.plugin.quick-form.js:173 +msgid "Add" +msgstr "添加" + +#: static/xadmin/js/xadmin.plugin.revision.js:25 +msgid "New Item" +msgstr "新项目" + +#: static/xadmin/js/xadmin.widget.datetime.js:32 +msgid "Sunday Monday Tuesday Wednesday Thursday Friday Saturday Sunday" +msgstr "星期日 星期一 星期二 星期三 星期四 星期五 星期六" + +#: static/xadmin/js/xadmin.widget.datetime.js:33 +msgid "Sun Mon Tue Wed Thu Fri Sat Sun" +msgstr "日 一 二 三 四 五 六" + +#: static/xadmin/js/xadmin.widget.datetime.js:34 +msgid "Su Mo Tu We Th Fr Sa Su" +msgstr "日 一 二 三 四 五 六" + +#: static/xadmin/js/xadmin.widget.datetime.js:35 +msgid "January February March April May June July August September October November December" +msgstr "一月 二月 三月 四月 五月 六月 七月 八月 九月 十月 十一月 十二月" + +#: static/xadmin/js/xadmin.widget.datetime.js:36 +msgid "Jan Feb Mar Apr May Jun Jul Aug Sep Oct Nov Dec" +msgstr "一月 二月 三月 四月 五月 六月 七月 八月 九月 十月 十一 十二" + +#: static/xadmin/js/xadmin.widget.datetime.js:37 +msgid "Today" +msgstr "今天" + +#: static/xadmin/js/xadmin.widget.datetime.js:38 +msgid "%a %d %b %Y %T %Z" +msgstr "" + +#: static/xadmin/js/xadmin.widget.datetime.js:39 +msgid "AM PM" +msgstr "上午 下午" + +#: static/xadmin/js/xadmin.widget.datetime.js:40 +msgid "am pm" +msgstr "上午 下午" + +#: static/xadmin/js/xadmin.widget.datetime.js:43 +msgid "%T" +msgstr "%T" diff --git "a/8\343\200\201\346\226\207\347\214\256\346\225\260\346\215\256\346\214\226\346\216\230\347\263\273\347\273\237(\351\231\204\346\272\220\347\240\201)/extra_apps/xadmin/migrations/0001_initial.py" "b/8\343\200\201\346\226\207\347\214\256\346\225\260\346\215\256\346\214\226\346\216\230\347\263\273\347\273\237(\351\231\204\346\272\220\347\240\201)/extra_apps/xadmin/migrations/0001_initial.py" new file mode 100644 index 0000000..1eeee38 --- /dev/null +++ "b/8\343\200\201\346\226\207\347\214\256\346\225\260\346\215\256\346\214\226\346\216\230\347\263\273\347\273\237(\351\231\204\346\272\220\347\240\201)/extra_apps/xadmin/migrations/0001_initial.py" @@ -0,0 +1,62 @@ +# -*- coding: utf-8 -*- +# Generated by Django 1.9.2 on 2016-03-20 13:46 +from __future__ import unicode_literals + +from django.conf import settings +from django.db import migrations, models +import django.db.models.deletion + + +class Migration(migrations.Migration): + + initial = True + + dependencies = [ + migrations.swappable_dependency(settings.AUTH_USER_MODEL) + ] + + operations = [ + migrations.CreateModel( + name='Bookmark', + fields=[ + ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('title', models.CharField(max_length=128, verbose_name='Title')), + ('url_name', models.CharField(max_length=64, verbose_name='Url Name')), + ('query', models.CharField(blank=True, max_length=1000, verbose_name='Query String')), + ('is_share', models.BooleanField(default=False, verbose_name='Is Shared')), + ('content_type', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='contenttypes.ContentType')), + ('user', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, to=settings.AUTH_USER_MODEL, verbose_name='user')), + ], + options={ + 'verbose_name': 'Bookmark', + 'verbose_name_plural': 'Bookmarks', + }, + ), + migrations.CreateModel( + name='UserSettings', + fields=[ + ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('key', models.CharField(max_length=256, verbose_name='Settings Key')), + ('value', models.TextField(verbose_name='Settings Content')), + ('user', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to=settings.AUTH_USER_MODEL, verbose_name='user')), + ], + options={ + 'verbose_name': 'User Setting', + 'verbose_name_plural': 'User Settings', + }, + ), + migrations.CreateModel( + name='UserWidget', + fields=[ + ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('page_id', models.CharField(max_length=256, verbose_name='Page')), + ('widget_type', models.CharField(max_length=50, verbose_name='Widget Type')), + ('value', models.TextField(verbose_name='Widget Params')), + ('user', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to=settings.AUTH_USER_MODEL, verbose_name='user')), + ], + options={ + 'verbose_name': 'User Widget', + 'verbose_name_plural': 'User Widgets', + }, + ), + ] diff --git "a/8\343\200\201\346\226\207\347\214\256\346\225\260\346\215\256\346\214\226\346\216\230\347\263\273\347\273\237(\351\231\204\346\272\220\347\240\201)/extra_apps/xadmin/migrations/0002_log.py" "b/8\343\200\201\346\226\207\347\214\256\346\225\260\346\215\256\346\214\226\346\216\230\347\263\273\347\273\237(\351\231\204\346\272\220\347\240\201)/extra_apps/xadmin/migrations/0002_log.py" new file mode 100644 index 0000000..3153bee --- /dev/null +++ "b/8\343\200\201\346\226\207\347\214\256\346\225\260\346\215\256\346\214\226\346\216\230\347\263\273\347\273\237(\351\231\204\346\272\220\347\240\201)/extra_apps/xadmin/migrations/0002_log.py" @@ -0,0 +1,39 @@ +# -*- coding: utf-8 -*- +# Generated by Django 1.9.7 on 2016-07-15 05:50 +from __future__ import unicode_literals + +from django.conf import settings +from django.db import migrations, models +import django.db.models.deletion +import django.utils.timezone + + +class Migration(migrations.Migration): + + dependencies = [ + ('contenttypes', '0002_remove_content_type_name'), + migrations.swappable_dependency(settings.AUTH_USER_MODEL), + ('xadmin', '0001_initial'), + ] + + operations = [ + migrations.CreateModel( + name='Log', + fields=[ + ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('action_time', models.DateTimeField(default=django.utils.timezone.now, editable=False, verbose_name='action time')), + ('ip_addr', models.GenericIPAddressField(blank=True, null=True, verbose_name='action ip')), + ('object_id', models.TextField(blank=True, null=True, verbose_name='object id')), + ('object_repr', models.CharField(max_length=200, verbose_name='object repr')), + ('action_flag', models.PositiveSmallIntegerField(verbose_name='action flag')), + ('message', models.TextField(blank=True, verbose_name='change message')), + ('content_type', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, to='contenttypes.ContentType', verbose_name='content type')), + ('user', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to=settings.AUTH_USER_MODEL, verbose_name='user')), + ], + options={ + 'ordering': ('-action_time',), + 'verbose_name': 'log entry', + 'verbose_name_plural': 'log entries', + }, + ), + ] diff --git "a/8\343\200\201\346\226\207\347\214\256\346\225\260\346\215\256\346\214\226\346\216\230\347\263\273\347\273\237(\351\231\204\346\272\220\347\240\201)/extra_apps/xadmin/migrations/0003_auto_20160715_0100.py" "b/8\343\200\201\346\226\207\347\214\256\346\225\260\346\215\256\346\214\226\346\216\230\347\263\273\347\273\237(\351\231\204\346\272\220\347\240\201)/extra_apps/xadmin/migrations/0003_auto_20160715_0100.py" new file mode 100644 index 0000000..073f5b4 --- /dev/null +++ "b/8\343\200\201\346\226\207\347\214\256\346\225\260\346\215\256\346\214\226\346\216\230\347\263\273\347\273\237(\351\231\204\346\272\220\347\240\201)/extra_apps/xadmin/migrations/0003_auto_20160715_0100.py" @@ -0,0 +1,20 @@ +# -*- coding: utf-8 -*- +# Generated by Django 1.9.7 on 2016-07-15 06:00 +from __future__ import unicode_literals + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('xadmin', '0002_log'), + ] + + operations = [ + migrations.AlterField( + model_name='log', + name='action_flag', + field=models.CharField(max_length=32, verbose_name='action flag'), + ), + ] diff --git "a/8\343\200\201\346\226\207\347\214\256\346\225\260\346\215\256\346\214\226\346\216\230\347\263\273\347\273\237(\351\231\204\346\272\220\347\240\201)/extra_apps/xadmin/migrations/__init__.py" "b/8\343\200\201\346\226\207\347\214\256\346\225\260\346\215\256\346\214\226\346\216\230\347\263\273\347\273\237(\351\231\204\346\272\220\347\240\201)/extra_apps/xadmin/migrations/__init__.py" new file mode 100644 index 0000000..e69de29 diff --git "a/8\343\200\201\346\226\207\347\214\256\346\225\260\346\215\256\346\214\226\346\216\230\347\263\273\347\273\237(\351\231\204\346\272\220\347\240\201)/extra_apps/xadmin/models.py" "b/8\343\200\201\346\226\207\347\214\256\346\225\260\346\215\256\346\214\226\346\216\230\347\263\273\347\273\237(\351\231\204\346\272\220\347\240\201)/extra_apps/xadmin/models.py" new file mode 100644 index 0000000..f389fd3 --- /dev/null +++ "b/8\343\200\201\346\226\207\347\214\256\346\225\260\346\215\256\346\214\226\346\216\230\347\263\273\347\273\237(\351\231\204\346\272\220\347\240\201)/extra_apps/xadmin/models.py" @@ -0,0 +1,190 @@ +import json +import django +from django.db import models +from django.utils import timezone +from django.conf import settings +from django.contrib.contenttypes.models import ContentType +from django.utils.translation import ugettext_lazy as _, ugettext +from django.urls.base import reverse +from django.core.serializers.json import DjangoJSONEncoder +from django.db.models.base import ModelBase +from django.utils.encoding import python_2_unicode_compatible, smart_text + +from django.db.models.signals import post_migrate +from django.contrib.auth.models import Permission + +import datetime +import decimal +from xadmin.util import quote + +AUTH_USER_MODEL = getattr(settings, 'AUTH_USER_MODEL', 'auth.User') + + +def add_view_permissions(sender, **kwargs): + """ + This syncdb hooks takes care of adding a view permission too all our + content types. + """ + # for each of our content types + for content_type in ContentType.objects.all(): + # build our permission slug + codename = "view_%s" % content_type.model + + # if it doesn't exist.. + if not Permission.objects.filter(content_type=content_type, codename=codename): + # add it + Permission.objects.create(content_type=content_type, + codename=codename, + name="Can view %s" % content_type.name) + # print "Added view permission for %s" % content_type.name + +# check for all our view permissions after a syncdb +post_migrate.connect(add_view_permissions) + + +@python_2_unicode_compatible +class Bookmark(models.Model): + title = models.CharField(_(u'Title'), max_length=128) + user = models.ForeignKey(AUTH_USER_MODEL, on_delete=models.CASCADE, verbose_name=_(u"user"), blank=True, null=True) + url_name = models.CharField(_(u'Url Name'), max_length=64) + content_type = models.ForeignKey(ContentType, on_delete=models.CASCADE) + query = models.CharField(_(u'Query String'), max_length=1000, blank=True) + is_share = models.BooleanField(_(u'Is Shared'), default=False) + + @property + def url(self): + base_url = reverse(self.url_name) + if self.query: + base_url = base_url + '?' + self.query + return base_url + + def __str__(self): + return self.title + + class Meta: + verbose_name = _(u'Bookmark') + verbose_name_plural = _('Bookmarks') + + +class JSONEncoder(DjangoJSONEncoder): + + def default(self, o): + if isinstance(o, datetime.datetime): + return o.strftime('%Y-%m-%d %H:%M:%S') + elif isinstance(o, datetime.date): + return o.strftime('%Y-%m-%d') + elif isinstance(o, decimal.Decimal): + return str(o) + elif isinstance(o, ModelBase): + return '%s.%s' % (o._meta.app_label, o._meta.model_name) + else: + try: + return super(JSONEncoder, self).default(o) + except Exception: + return smart_text(o) + + +@python_2_unicode_compatible +class UserSettings(models.Model): + user = models.ForeignKey(AUTH_USER_MODEL, on_delete=models.CASCADE, verbose_name=_(u"user")) + key = models.CharField(_('Settings Key'), max_length=256) + value = models.TextField(_('Settings Content')) + + def json_value(self): + return json.loads(self.value) + + def set_json(self, obj): + self.value = json.dumps(obj, cls=JSONEncoder, ensure_ascii=False) + + def __str__(self): + return "%s %s" % (self.user, self.key) + + class Meta: + verbose_name = _(u'User Setting') + verbose_name_plural = _('User Settings') + + +@python_2_unicode_compatible +class UserWidget(models.Model): + user = models.ForeignKey(AUTH_USER_MODEL, on_delete=models.CASCADE, verbose_name=_(u"user")) + page_id = models.CharField(_(u"Page"), max_length=256) + widget_type = models.CharField(_(u"Widget Type"), max_length=50) + value = models.TextField(_(u"Widget Params")) + + def get_value(self): + value = json.loads(self.value) + value['id'] = self.id + value['type'] = self.widget_type + return value + + def set_value(self, obj): + self.value = json.dumps(obj, cls=JSONEncoder, ensure_ascii=False) + + def save(self, *args, **kwargs): + created = self.pk is None + super(UserWidget, self).save(*args, **kwargs) + if created: + try: + portal_pos = UserSettings.objects.get( + user=self.user, key="dashboard:%s:pos" % self.page_id) + portal_pos.value = "%s,%s" % (self.pk, portal_pos.value) if portal_pos.value else self.pk + portal_pos.save() + except Exception: + pass + + def __str__(self): + return "%s %s widget" % (self.user, self.widget_type) + + class Meta: + verbose_name = _(u'User Widget') + verbose_name_plural = _('User Widgets') + + +@python_2_unicode_compatible +class Log(models.Model): + action_time = models.DateTimeField( + _('action time'), + default=timezone.now, + editable=False, + ) + user = models.ForeignKey( + AUTH_USER_MODEL, + models.CASCADE, + verbose_name=_('user'), + ) + ip_addr = models.GenericIPAddressField(_('action ip'), blank=True, null=True) + content_type = models.ForeignKey( + ContentType, + models.SET_NULL, + verbose_name=_('content type'), + blank=True, null=True, + ) + object_id = models.TextField(_('object id'), blank=True, null=True) + object_repr = models.CharField(_('object repr'), max_length=200) + action_flag = models.CharField(_('action flag'), max_length=32) + message = models.TextField(_('change message'), blank=True) + + class Meta: + verbose_name = _('log entry') + verbose_name_plural = _('log entries') + ordering = ('-action_time',) + + def __repr__(self): + return smart_text(self.action_time) + + def __str__(self): + if self.action_flag == 'create': + return ugettext('Added "%(object)s".') % {'object': self.object_repr} + elif self.action_flag == 'change': + return ugettext('Changed "%(object)s" - %(changes)s') % { + 'object': self.object_repr, + 'changes': self.message, + } + elif self.action_flag == 'delete' and self.object_repr: + return ugettext('Deleted "%(object)s."') % {'object': self.object_repr} + + return self.message + + def get_edited_object(self): + "Returns the edited object represented by this log entry" + return self.content_type.get_object_for_this_type(pk=self.object_id) diff --git "a/8\343\200\201\346\226\207\347\214\256\346\225\260\346\215\256\346\214\226\346\216\230\347\263\273\347\273\237(\351\231\204\346\272\220\347\240\201)/extra_apps/xadmin/plugins/__init__.py" "b/8\343\200\201\346\226\207\347\214\256\346\225\260\346\215\256\346\214\226\346\216\230\347\263\273\347\273\237(\351\231\204\346\272\220\347\240\201)/extra_apps/xadmin/plugins/__init__.py" new file mode 100644 index 0000000..d061165 --- /dev/null +++ "b/8\343\200\201\346\226\207\347\214\256\346\225\260\346\215\256\346\214\226\346\216\230\347\263\273\347\273\237(\351\231\204\346\272\220\347\240\201)/extra_apps/xadmin/plugins/__init__.py" @@ -0,0 +1,41 @@ + +PLUGINS = ( + 'actions', + 'filters', + 'bookmark', + 'export', + 'layout', + 'refresh', + 'details', + 'editable', + 'relate', + 'chart', + 'ajax', + 'relfield', + 'inline', + 'topnav', + 'portal', + 'quickform', + 'wizard', + 'images', + 'auth', + 'multiselect', + 'themes', + 'aggregation', + # 'mobile', + 'passwords', + 'sitemenu', + 'language', + 'quickfilter', + 'sortablelist', + 'importexport' +) + + +def register_builtin_plugins(site): + from importlib import import_module + from django.conf import settings + + exclude_plugins = getattr(settings, 'XADMIN_EXCLUDE_PLUGINS', []) + + [import_module('xadmin.plugins.%s' % plugin) for plugin in PLUGINS if plugin not in exclude_plugins] diff --git "a/8\343\200\201\346\226\207\347\214\256\346\225\260\346\215\256\346\214\226\346\216\230\347\263\273\347\273\237(\351\231\204\346\272\220\347\240\201)/extra_apps/xadmin/plugins/actions.py" "b/8\343\200\201\346\226\207\347\214\256\346\225\260\346\215\256\346\214\226\346\216\230\347\263\273\347\273\237(\351\231\204\346\272\220\347\240\201)/extra_apps/xadmin/plugins/actions.py" new file mode 100644 index 0000000..d3c2440 --- /dev/null +++ "b/8\343\200\201\346\226\207\347\214\256\346\225\260\346\215\256\346\214\226\346\216\230\347\263\273\347\273\237(\351\231\204\346\272\220\347\240\201)/extra_apps/xadmin/plugins/actions.py" @@ -0,0 +1,316 @@ +from collections import OrderedDict +from django import forms, VERSION as django_version +from django.core.exceptions import PermissionDenied +from django.db import router +from django.http import HttpResponse, HttpResponseRedirect +from django.template import loader +from django.template.response import TemplateResponse +from django.utils import six +from django.utils.encoding import force_text +from django.utils.safestring import mark_safe +from django.utils.translation import ugettext as _, ungettext +from django.utils.text import capfirst + +from django.contrib.admin.utils import get_deleted_objects + +from xadmin.plugins.utils import get_context_dict +from xadmin.sites import site +from xadmin.util import model_format_dict, model_ngettext +from xadmin.views import BaseAdminPlugin, ListAdminView +from xadmin.views.base import filter_hook, ModelAdminView + +from xadmin import views + +ACTION_CHECKBOX_NAME = '_selected_action' +checkbox = forms.CheckboxInput({'class': 'action-select'}, lambda value: False) + + +def action_checkbox(obj): + return checkbox.render(ACTION_CHECKBOX_NAME, force_text(obj.pk)) + + +action_checkbox.short_description = mark_safe( + '') +action_checkbox.allow_tags = True +action_checkbox.allow_export = False +action_checkbox.is_column = False + + +class BaseActionView(ModelAdminView): + action_name = None + description = None + icon = 'fa fa-tasks' + + model_perm = 'change' + + @classmethod + def has_perm(cls, list_view): + return list_view.get_model_perms()[cls.model_perm] + + def init_action(self, list_view): + self.list_view = list_view + self.admin_site = list_view.admin_site + + @filter_hook + def do_action(self, queryset): + pass + + def __init__(self, request, *args, **kwargs): + super().__init__(request, *args, **kwargs) + if django_version > (2, 0): + for model in self.admin_site._registry: + if not hasattr(self.admin_site._registry[model], 'has_delete_permission'): + setattr(self.admin_site._registry[model], 'has_delete_permission', self.has_delete_permission) + + +class DeleteSelectedAction(BaseActionView): + + action_name = "delete_selected" + description = _(u'Delete selected %(verbose_name_plural)s') + + delete_confirmation_template = None + delete_selected_confirmation_template = None + + delete_models_batch = True + + model_perm = 'delete' + icon = 'fa fa-times' + + @filter_hook + def delete_models(self, queryset): + n = queryset.count() + if n: + if self.delete_models_batch: + self.log('delete', _('Batch delete %(count)d %(items)s.') % {"count": n, "items": model_ngettext(self.opts, n)}) + queryset.delete() + else: + for obj in queryset: + self.log('delete', '', obj) + obj.delete() + self.message_user(_("Successfully deleted %(count)d %(items)s.") % { + "count": n, "items": model_ngettext(self.opts, n) + }, 'success') + + @filter_hook + def do_action(self, queryset): + # Check that the user has delete permission for the actual model + if not self.has_delete_permission(): + raise PermissionDenied + + # Populate deletable_objects, a data structure of all related objects that + # will also be deleted. + + if django_version > (2, 1): + deletable_objects, model_count, perms_needed, protected = get_deleted_objects( + queryset, self.opts, self.admin_site) + else: + using = router.db_for_write(self.model) + deletable_objects, model_count, perms_needed, protected = get_deleted_objects( + queryset, self.opts, self.user, self.admin_site, using) + + + # The user has already confirmed the deletion. + # Do the deletion and return a None to display the change list view again. + if self.request.POST.get('post'): + if perms_needed: + raise PermissionDenied + self.delete_models(queryset) + # Return None to display the change list page again. + return None + + if len(queryset) == 1: + objects_name = force_text(self.opts.verbose_name) + else: + objects_name = force_text(self.opts.verbose_name_plural) + + if perms_needed or protected: + title = _("Cannot delete %(name)s") % {"name": objects_name} + else: + title = _("Are you sure?") + + context = self.get_context() + context.update({ + "title": title, + "objects_name": objects_name, + "deletable_objects": [deletable_objects], + 'queryset': queryset, + "perms_lacking": perms_needed, + "protected": protected, + "opts": self.opts, + "app_label": self.app_label, + 'action_checkbox_name': ACTION_CHECKBOX_NAME, + }) + + # Display the confirmation page + return TemplateResponse(self.request, self.delete_selected_confirmation_template or + self.get_template_list('views/model_delete_selected_confirm.html'), context) + + +class ActionPlugin(BaseAdminPlugin): + + # Actions + actions = [] + actions_selection_counter = True + global_actions = [DeleteSelectedAction] + + def init_request(self, *args, **kwargs): + self.actions = self.get_actions() + return bool(self.actions) + + def get_list_display(self, list_display): + if self.actions: + list_display.insert(0, 'action_checkbox') + self.admin_view.action_checkbox = action_checkbox + return list_display + + def get_list_display_links(self, list_display_links): + if self.actions: + if len(list_display_links) == 1 and list_display_links[0] == 'action_checkbox': + return list(self.admin_view.list_display[1:2]) + return list_display_links + + def get_context(self, context): + if self.actions and self.admin_view.result_count: + av = self.admin_view + selection_note_all = ungettext('%(total_count)s selected', + 'All %(total_count)s selected', av.result_count) + + new_context = { + 'selection_note': _('0 of %(cnt)s selected') % {'cnt': len(av.result_list)}, + 'selection_note_all': selection_note_all % {'total_count': av.result_count}, + 'action_choices': self.get_action_choices(), + 'actions_selection_counter': self.actions_selection_counter, + } + context.update(new_context) + return context + + def post_response(self, response, *args, **kwargs): + request = self.admin_view.request + av = self.admin_view + + # Actions with no confirmation + if self.actions and 'action' in request.POST: + action = request.POST['action'] + + if action not in self.actions: + msg = _("Items must be selected in order to perform " + "actions on them. No items have been changed.") + av.message_user(msg) + else: + ac, name, description, icon = self.actions[action] + select_across = request.POST.get('select_across', False) == '1' + selected = request.POST.getlist(ACTION_CHECKBOX_NAME) + + if not selected and not select_across: + # Reminder that something needs to be selected or nothing will happen + msg = _("Items must be selected in order to perform " + "actions on them. No items have been changed.") + av.message_user(msg) + else: + queryset = av.list_queryset._clone() + if not select_across: + # Perform the action only on the selected objects + queryset = av.list_queryset.filter(pk__in=selected) + response = self.response_action(ac, queryset) + # Actions may return an HttpResponse, which will be used as the + # response from the POST. If not, we'll be a good little HTTP + # citizen and redirect back to the changelist page. + if isinstance(response, HttpResponse): + return response + else: + return HttpResponseRedirect(request.get_full_path()) + return response + + def response_action(self, ac, queryset): + if isinstance(ac, type) and issubclass(ac, BaseActionView): + action_view = self.get_model_view(ac, self.admin_view.model) + action_view.init_action(self.admin_view) + return action_view.do_action(queryset) + else: + return ac(self.admin_view, self.request, queryset) + + def get_actions(self): + if self.actions is None: + return OrderedDict() + + actions = [self.get_action(action) for action in self.global_actions] + + for klass in self.admin_view.__class__.mro()[::-1]: + class_actions = getattr(klass, 'actions', []) + if not class_actions: + continue + actions.extend( + [self.get_action(action) for action in class_actions]) + + # get_action might have returned None, so filter any of those out. + actions = filter(None, actions) + if six.PY3: + actions = list(actions) + + # Convert the actions into a OrderedDict keyed by name. + actions = OrderedDict([ + (name, (ac, name, desc, icon)) + for ac, name, desc, icon in actions + ]) + + return actions + + def get_action_choices(self): + """ + Return a list of choices for use in a form object. Each choice is a + tuple (name, description). + """ + choices = [] + for ac, name, description, icon in self.actions.values(): + choice = (name, description % model_format_dict(self.opts), icon) + choices.append(choice) + return choices + + def get_action(self, action): + if isinstance(action, type) and issubclass(action, BaseActionView): + if not action.has_perm(self.admin_view): + return None + return action, getattr(action, 'action_name'), getattr(action, 'description'), getattr(action, 'icon') + + elif callable(action): + func = action + action = action.__name__ + + elif hasattr(self.admin_view.__class__, action): + func = getattr(self.admin_view.__class__, action) + + else: + return None + + if hasattr(func, 'short_description'): + description = func.short_description + else: + description = capfirst(action.replace('_', ' ')) + + return func, action, description, getattr(func, 'icon', 'tasks') + + # View Methods + def result_header(self, item, field_name, row): + if item.attr and field_name == 'action_checkbox': + item.classes.append("action-checkbox-column") + return item + + def result_item(self, item, obj, field_name, row): + if item.field is None and field_name == u'action_checkbox': + item.classes.append("action-checkbox") + return item + + # Media + def get_media(self, media): + if self.actions and self.admin_view.result_count: + media = media + self.vendor('xadmin.plugin.actions.js', 'xadmin.plugins.css') + return media + + # Block Views + def block_results_bottom(self, context, nodes): + if self.actions and self.admin_view.result_count: + nodes.append(loader.render_to_string('xadmin/blocks/model_list.results_bottom.actions.html', + context=get_context_dict(context))) + + +site.register_plugin(ActionPlugin, ListAdminView) diff --git "a/8\343\200\201\346\226\207\347\214\256\346\225\260\346\215\256\346\214\226\346\216\230\347\263\273\347\273\237(\351\231\204\346\272\220\347\240\201)/extra_apps/xadmin/plugins/aggregation.py" "b/8\343\200\201\346\226\207\347\214\256\346\225\260\346\215\256\346\214\226\346\216\230\347\263\273\347\273\237(\351\231\204\346\272\220\347\240\201)/extra_apps/xadmin/plugins/aggregation.py" new file mode 100644 index 0000000..1e7553f --- /dev/null +++ "b/8\343\200\201\346\226\207\347\214\256\346\225\260\346\215\256\346\214\226\346\216\230\347\263\273\347\273\237(\351\231\204\346\272\220\347\240\201)/extra_apps/xadmin/plugins/aggregation.py" @@ -0,0 +1,68 @@ +from django.db.models import FieldDoesNotExist, Avg, Max, Min, Count, Sum +from django.utils.translation import ugettext as _ +from django.forms import Media + +from xadmin.sites import site +from xadmin.views import BaseAdminPlugin, ListAdminView + +from xadmin.views.list import ResultRow, ResultItem +from xadmin.util import display_for_field + +AGGREGATE_METHODS = { + 'min': Min, 'max': Max, 'avg': Avg, 'sum': Sum, 'count': Count +} +AGGREGATE_TITLE = { + 'min': _('Min'), 'max': _('Max'), 'avg': _('Avg'), 'sum': _('Sum'), 'count': _('Count') +} + + +class AggregationPlugin(BaseAdminPlugin): + + aggregate_fields = {} + + def init_request(self, *args, **kwargs): + return bool(self.aggregate_fields) + + def _get_field_aggregate(self, field_name, obj, row): + item = ResultItem(field_name, row) + item.classes = ['aggregate', ] + if field_name not in self.aggregate_fields: + item.text = "" + else: + try: + f = self.opts.get_field(field_name) + agg_method = self.aggregate_fields[field_name] + key = '%s__%s' % (field_name, agg_method) + if key not in obj: + item.text = "" + else: + item.text = display_for_field(obj[key], f) + item.wraps.append('%%s%s' % AGGREGATE_TITLE[agg_method]) + item.classes.append(agg_method) + except FieldDoesNotExist: + item.text = "" + + return item + + def _get_aggregate_row(self): + queryset = self.admin_view.list_queryset._clone() + obj = queryset.aggregate(*[AGGREGATE_METHODS[method](field_name) for field_name, method in + self.aggregate_fields.items() if method in AGGREGATE_METHODS]) + + row = ResultRow() + row['is_display_first'] = False + row.cells = [self._get_field_aggregate(field_name, obj, row) for field_name in self.admin_view.list_display] + row.css_class = 'info aggregate' + return row + + def results(self, rows): + if rows: + rows.append(self._get_aggregate_row()) + return rows + + # Media + def get_media(self, media): + return media + Media(css={'screen': [self.static('xadmin/css/xadmin.plugin.aggregation.css'), ]}) + + +site.register_plugin(AggregationPlugin, ListAdminView) diff --git "a/8\343\200\201\346\226\207\347\214\256\346\225\260\346\215\256\346\214\226\346\216\230\347\263\273\347\273\237(\351\231\204\346\272\220\347\240\201)/extra_apps/xadmin/plugins/ajax.py" "b/8\343\200\201\346\226\207\347\214\256\346\225\260\346\215\256\346\214\226\346\216\230\347\263\273\347\273\237(\351\231\204\346\272\220\347\240\201)/extra_apps/xadmin/plugins/ajax.py" new file mode 100644 index 0000000..b09bea2 --- /dev/null +++ "b/8\343\200\201\346\226\207\347\214\256\346\225\260\346\215\256\346\214\226\346\216\230\347\263\273\347\273\237(\351\231\204\346\272\220\347\240\201)/extra_apps/xadmin/plugins/ajax.py" @@ -0,0 +1,99 @@ +from collections import OrderedDict +from django.forms.utils import ErrorDict +from django.utils.html import escape +from django.utils.encoding import force_text +from xadmin.sites import site +from xadmin.views import BaseAdminPlugin, ListAdminView, ModelFormAdminView, DetailAdminView + + +NON_FIELD_ERRORS = '__all__' + + +class BaseAjaxPlugin(BaseAdminPlugin): + + def init_request(self, *args, **kwargs): + return bool(self.request.is_ajax() or self.request.GET.get('_ajax')) + + +class AjaxListPlugin(BaseAjaxPlugin): + + def get_list_display(self,list_display): + list_fields = [field for field in self.request.GET.get('_fields',"").split(",") + if field.strip() != ""] + if list_fields: + return list_fields + return list_display + + def get_result_list(self, response): + av = self.admin_view + base_fields = self.get_list_display(av.base_list_display) + headers = dict([(c.field_name, force_text(c.text)) for c in av.result_headers( + ).cells if c.field_name in base_fields]) + + objects = [dict([(o.field_name, escape(str(o.value))) for i, o in + enumerate(filter(lambda c:c.field_name in base_fields, r.cells))]) + for r in av.results()] + + return self.render_response({'headers': headers, 'objects': objects, 'total_count': av.result_count, 'has_more': av.has_more}) + + +class JsonErrorDict(ErrorDict): + + def __init__(self, errors, form): + super(JsonErrorDict, self).__init__(errors) + self.form = form + + def as_json(self): + if not self: + return u'' + return [{'id': self.form[k].auto_id if k != NON_FIELD_ERRORS else NON_FIELD_ERRORS, 'name': k, 'errors': v} for k, v in self.items()] + + +class AjaxFormPlugin(BaseAjaxPlugin): + + def post_response(self, __): + new_obj = self.admin_view.new_obj + return self.render_response({ + 'result': 'success', + 'obj_id': new_obj.pk, + 'obj_repr': str(new_obj), + 'change_url': self.admin_view.model_admin_url('change', new_obj.pk), + 'detail_url': self.admin_view.model_admin_url('detail', new_obj.pk) + }) + + def get_response(self, __): + if self.request.method.lower() != 'post': + return __() + + result = {} + form = self.admin_view.form_obj + if form.is_valid(): + result['result'] = 'success' + else: + result['result'] = 'error' + result['errors'] = JsonErrorDict(form.errors, form).as_json() + + return self.render_response(result) + + +class AjaxDetailPlugin(BaseAjaxPlugin): + + def get_response(self, __): + if self.request.GET.get('_format') == 'html': + self.admin_view.detail_template = 'xadmin/views/quick_detail.html' + return __() + + form = self.admin_view.form_obj + layout = form.helper.layout + + results = [] + + for p, f in layout.get_field_names(): + result = self.admin_view.get_field_result(f) + results.append((result.label, result.val)) + + return self.render_response(OrderedDict(results)) + +site.register_plugin(AjaxListPlugin, ListAdminView) +site.register_plugin(AjaxFormPlugin, ModelFormAdminView) +site.register_plugin(AjaxDetailPlugin, DetailAdminView) diff --git "a/8\343\200\201\346\226\207\347\214\256\346\225\260\346\215\256\346\214\226\346\216\230\347\263\273\347\273\237(\351\231\204\346\272\220\347\240\201)/extra_apps/xadmin/plugins/auth.py" "b/8\343\200\201\346\226\207\347\214\256\346\225\260\346\215\256\346\214\226\346\216\230\347\263\273\347\273\237(\351\231\204\346\272\220\347\240\201)/extra_apps/xadmin/plugins/auth.py" new file mode 100644 index 0000000..1ab6f61 --- /dev/null +++ "b/8\343\200\201\346\226\207\347\214\256\346\225\260\346\215\256\346\214\226\346\216\230\347\263\273\347\273\237(\351\231\204\346\272\220\347\240\201)/extra_apps/xadmin/plugins/auth.py" @@ -0,0 +1,269 @@ +# coding=utf-8 +from django import forms +from django.contrib.auth.forms import (UserCreationForm, UserChangeForm, + AdminPasswordChangeForm, PasswordChangeForm) +from django.contrib.auth.models import Group, Permission +from django.core.exceptions import PermissionDenied +from django.conf import settings +from django.template.response import TemplateResponse +from django.utils.decorators import method_decorator +from django.http import HttpResponseRedirect +from django.utils.html import escape +from django.utils.encoding import smart_text +from django.utils.translation import ugettext as _ +from django.views.decorators.debug import sensitive_post_parameters +from django.forms import ModelMultipleChoiceField +from django.contrib.auth import get_user_model +from xadmin.layout import Fieldset, Main, Side, Row, FormHelper +from xadmin.sites import site +from xadmin.util import unquote +from xadmin.views import BaseAdminPlugin, ModelFormAdminView, ModelAdminView, CommAdminView, csrf_protect_m + +User = get_user_model() + +ACTION_NAME = { + 'add': _('Can add %s'), + 'change': _('Can change %s'), + 'edit': _('Can edit %s'), + 'delete': _('Can delete %s'), + 'view': _('Can view %s'), +} + + +def get_permission_name(p): + action = p.codename.split('_')[0] + if action in ACTION_NAME: + return ACTION_NAME[action] % str(p.content_type) + else: + return p.name + + +class PermissionModelMultipleChoiceField(ModelMultipleChoiceField): + + def label_from_instance(self, p): + return get_permission_name(p) + + +class GroupAdmin(object): + search_fields = ('name',) + ordering = ('name',) + style_fields = {'permissions': 'm2m_transfer'} + model_icon = 'fa fa-group' + + def get_field_attrs(self, db_field, **kwargs): + attrs = super(GroupAdmin, self).get_field_attrs(db_field, **kwargs) + if db_field.name == 'permissions': + attrs['form_class'] = PermissionModelMultipleChoiceField + return attrs + + +class UserAdmin(object): + change_user_password_template = None + list_display = ('username', 'email', 'first_name', 'last_name', 'is_staff') + list_filter = ('is_staff', 'is_superuser', 'is_active') + search_fields = ('username', 'first_name', 'last_name', 'email') + ordering = ('username',) + style_fields = {'user_permissions': 'm2m_transfer'} + model_icon = 'fa fa-user' + relfield_style = 'fk-ajax' + + def get_field_attrs(self, db_field, **kwargs): + attrs = super(UserAdmin, self).get_field_attrs(db_field, **kwargs) + if db_field.name == 'user_permissions': + attrs['form_class'] = PermissionModelMultipleChoiceField + return attrs + + def get_model_form(self, **kwargs): + if self.org_obj is None: + self.form = UserCreationForm + else: + self.form = UserChangeForm + return super(UserAdmin, self).get_model_form(**kwargs) + + def get_form_layout(self): + if self.org_obj: + self.form_layout = ( + Main( + Fieldset('', + 'username', 'password', + css_class='unsort no_title' + ), + Fieldset(_('Personal info'), + Row('first_name', 'last_name'), + 'email' + ), + Fieldset(_('Permissions'), + 'groups', 'user_permissions' + ), + Fieldset(_('Important dates'), + 'last_login', 'date_joined' + ), + ), + Side( + Fieldset(_('Status'), + 'is_active', 'is_staff', 'is_superuser', + ), + ) + ) + return super(UserAdmin, self).get_form_layout() + + +class PermissionAdmin(object): + + def show_name(self, p): + return get_permission_name(p) + show_name.short_description = _('Permission Name') + show_name.is_column = True + + model_icon = 'fa fa-lock' + list_display = ('show_name', ) + +site.register(Group, GroupAdmin) +site.register(User, UserAdmin) +site.register(Permission, PermissionAdmin) + + +class UserFieldPlugin(BaseAdminPlugin): + + user_fields = [] + + def get_field_attrs(self, __, db_field, **kwargs): + if self.user_fields and db_field.name in self.user_fields: + return {'widget': forms.HiddenInput} + return __() + + def get_form_datas(self, datas): + if self.user_fields and 'data' in datas: + if hasattr(datas['data'],'_mutable') and not datas['data']._mutable: + datas['data'] = datas['data'].copy() + for f in self.user_fields: + datas['data'][f] = self.user.id + return datas + +site.register_plugin(UserFieldPlugin, ModelFormAdminView) + + +class ModelPermissionPlugin(BaseAdminPlugin): + + user_can_access_owned_objects_only = False + user_owned_objects_field = 'user' + + def queryset(self, qs): + if self.user_can_access_owned_objects_only and \ + not self.user.is_superuser: + filters = {self.user_owned_objects_field: self.user} + qs = qs.filter(**filters) + return qs + + def get_list_display(self, list_display): + if self.user_can_access_owned_objects_only and \ + not self.user.is_superuser and \ + self.user_owned_objects_field in list_display: + list_display.remove(self.user_owned_objects_field) + return list_display + +site.register_plugin(ModelPermissionPlugin, ModelAdminView) + + +class AccountMenuPlugin(BaseAdminPlugin): + + def block_top_account_menu(self, context, nodes): + return '
  • %s
  • ' % (self.get_admin_url('account_password'), _('Change Password')) + +site.register_plugin(AccountMenuPlugin, CommAdminView) + + +class ChangePasswordView(ModelAdminView): + model = User + change_password_form = AdminPasswordChangeForm + change_user_password_template = None + + @csrf_protect_m + def get(self, request, object_id): + if not self.has_change_permission(request): + raise PermissionDenied + self.obj = self.get_object(unquote(object_id)) + self.form = self.change_password_form(self.obj) + + return self.get_response() + + def get_media(self): + media = super(ChangePasswordView, self).get_media() + media = media + self.vendor('xadmin.form.css', 'xadmin.page.form.js') + self.form.media + return media + + def get_context(self): + context = super(ChangePasswordView, self).get_context() + helper = FormHelper() + helper.form_tag = False + helper.include_media = False + self.form.helper = helper + context.update({ + 'title': _('Change password: %s') % escape(smart_text(self.obj)), + 'form': self.form, + 'has_delete_permission': False, + 'has_change_permission': True, + 'has_view_permission': True, + 'original': self.obj, + }) + return context + + def get_response(self): + return TemplateResponse(self.request, [ + self.change_user_password_template or + 'xadmin/auth/user/change_password.html' + ], self.get_context()) + + @method_decorator(sensitive_post_parameters()) + @csrf_protect_m + def post(self, request, object_id): + if not self.has_change_permission(request): + raise PermissionDenied + self.obj = self.get_object(unquote(object_id)) + self.form = self.change_password_form(self.obj, request.POST) + + if self.form.is_valid(): + self.form.save() + self.message_user(_('Password changed successfully.'), 'success') + return HttpResponseRedirect(self.model_admin_url('change', self.obj.pk)) + else: + return self.get_response() + + +class ChangeAccountPasswordView(ChangePasswordView): + change_password_form = PasswordChangeForm + + @csrf_protect_m + def get(self, request): + self.obj = self.user + self.form = self.change_password_form(self.obj) + + return self.get_response() + + def get_context(self): + context = super(ChangeAccountPasswordView, self).get_context() + context.update({ + 'title': _('Change password'), + 'account_view': True, + }) + return context + + @method_decorator(sensitive_post_parameters()) + @csrf_protect_m + def post(self, request): + self.obj = self.user + self.form = self.change_password_form(self.obj, request.POST) + + if self.form.is_valid(): + self.form.save() + self.message_user(_('Password changed successfully.'), 'success') + return HttpResponseRedirect(self.get_admin_url('index')) + else: + return self.get_response() + + +user_model = settings.AUTH_USER_MODEL.lower().replace('.','/') +site.register_view(r'^%s/(.+)/password/$' % user_model, + ChangePasswordView, name='user_change_password') +site.register_view(r'^account/password/$', ChangeAccountPasswordView, + name='account_password') diff --git "a/8\343\200\201\346\226\207\347\214\256\346\225\260\346\215\256\346\214\226\346\216\230\347\263\273\347\273\237(\351\231\204\346\272\220\347\240\201)/extra_apps/xadmin/plugins/batch.py" "b/8\343\200\201\346\226\207\347\214\256\346\225\260\346\215\256\346\214\226\346\216\230\347\263\273\347\273\237(\351\231\204\346\272\220\347\240\201)/extra_apps/xadmin/plugins/batch.py" new file mode 100644 index 0000000..b322af9 --- /dev/null +++ "b/8\343\200\201\346\226\207\347\214\256\346\225\260\346\215\256\346\214\226\346\216\230\347\263\273\347\273\237(\351\231\204\346\272\220\347\240\201)/extra_apps/xadmin/plugins/batch.py" @@ -0,0 +1,156 @@ + +import copy +from django import forms +from django.db import models +from django.core.exceptions import PermissionDenied +from django.forms.models import modelform_factory +from django.template.response import TemplateResponse +from django.utils.encoding import force_text +from django.utils.safestring import mark_safe +from django.utils.translation import ugettext as _, ugettext_lazy +from xadmin.layout import FormHelper, Layout, Fieldset, Container, Col +from xadmin.plugins.actions import BaseActionView, ACTION_CHECKBOX_NAME +from xadmin.util import model_ngettext, vendor +from xadmin.views.base import filter_hook +from xadmin.views.edit import ModelFormAdminView + +BATCH_CHECKBOX_NAME = '_batch_change_fields' + + +class ChangeFieldWidgetWrapper(forms.Widget): + + def __init__(self, widget): + self.needs_multipart_form = widget.needs_multipart_form + self.attrs = widget.attrs + self.widget = widget + + def __deepcopy__(self, memo): + obj = copy.copy(self) + obj.widget = copy.deepcopy(self.widget, memo) + obj.attrs = self.widget.attrs + memo[id(self)] = obj + return obj + + @property + def media(self): + media = self.widget.media + vendor('xadmin.plugin.batch.js') + return media + + def render(self, name, value, attrs=None): + output = [] + is_required = self.widget.is_required + output.append(u'' % + (BATCH_CHECKBOX_NAME, name, (is_required and ' checked="checked"' or ''), _('Change this field'))) + output.extend([('
    ' % + ((not is_required and 'display: none;' or ''), name)), + self.widget.render(name, value, attrs), '
    ']) + return mark_safe(u''.join(output)) + + def build_attrs(self, extra_attrs=None, **kwargs): + "Helper function for building an attribute dictionary." + self.attrs = self.widget.build_attrs(extra_attrs=None, **kwargs) + return self.attrs + + def value_from_datadict(self, data, files, name): + return self.widget.value_from_datadict(data, files, name) + + def id_for_label(self, id_): + return self.widget.id_for_label(id_) + +class BatchChangeAction(BaseActionView): + + action_name = "change_selected" + description = ugettext_lazy( + u'Batch Change selected %(verbose_name_plural)s') + + batch_change_form_template = None + + model_perm = 'change' + + batch_fields = [] + + def change_models(self, queryset, cleaned_data): + n = queryset.count() + + data = {} + fields = self.opts.fields + self.opts.many_to_many + for f in fields: + if not f.editable or isinstance(f, models.AutoField) \ + or not f.name in cleaned_data: + continue + data[f] = cleaned_data[f.name] + + if n: + for obj in queryset: + for f, v in data.items(): + f.save_form_data(obj, v) + obj.save() + self.message_user(_("Successfully change %(count)d %(items)s.") % { + "count": n, "items": model_ngettext(self.opts, n) + }, 'success') + + def get_change_form(self, is_post, fields): + edit_view = self.get_model_view(ModelFormAdminView, self.model) + + def formfield_for_dbfield(db_field, **kwargs): + formfield = edit_view.formfield_for_dbfield(db_field, required=is_post, **kwargs) + formfield.widget = ChangeFieldWidgetWrapper(formfield.widget) + return formfield + + defaults = { + "form": edit_view.form, + "fields": fields, + "formfield_callback": formfield_for_dbfield, + } + return modelform_factory(self.model, **defaults) + + def do_action(self, queryset): + if not self.has_change_permission(): + raise PermissionDenied + + change_fields = [f for f in self.request.POST.getlist(BATCH_CHECKBOX_NAME) if f in self.batch_fields] + + if change_fields and self.request.POST.get('post'): + self.form_obj = self.get_change_form(True, change_fields)( + data=self.request.POST, files=self.request.FILES) + if self.form_obj.is_valid(): + self.change_models(queryset, self.form_obj.cleaned_data) + return None + else: + self.form_obj = self.get_change_form(False, self.batch_fields)() + + helper = FormHelper() + helper.form_tag = False + helper.include_media = False + helper.add_layout(Layout(Container(Col('full', + Fieldset("", *self.form_obj.fields.keys(), css_class="unsort no_title"), horizontal=True, span=12) + ))) + self.form_obj.helper = helper + count = len(queryset) + if count == 1: + objects_name = force_text(self.opts.verbose_name) + else: + objects_name = force_text(self.opts.verbose_name_plural) + + context = self.get_context() + context.update({ + "title": _("Batch change %s") % objects_name, + 'objects_name': objects_name, + 'form': self.form_obj, + 'queryset': queryset, + 'count': count, + "opts": self.opts, + "app_label": self.app_label, + 'action_checkbox_name': ACTION_CHECKBOX_NAME, + }) + + return TemplateResponse(self.request, self.batch_change_form_template or + self.get_template_list('views/batch_change_form.html'), context) + + @filter_hook + def get_media(self): + media = super(BatchChangeAction, self).get_media() + media = media + self.form_obj.media + self.vendor( + 'xadmin.page.form.js', 'xadmin.form.css') + return media diff --git "a/8\343\200\201\346\226\207\347\214\256\346\225\260\346\215\256\346\214\226\346\216\230\347\263\273\347\273\237(\351\231\204\346\272\220\347\240\201)/extra_apps/xadmin/plugins/bookmark.py" "b/8\343\200\201\346\226\207\347\214\256\346\225\260\346\215\256\346\214\226\346\216\230\347\263\273\347\273\237(\351\231\204\346\272\220\347\240\201)/extra_apps/xadmin/plugins/bookmark.py" new file mode 100644 index 0000000..f6e0708 --- /dev/null +++ "b/8\343\200\201\346\226\207\347\214\256\346\225\260\346\215\256\346\214\226\346\216\230\347\263\273\347\273\237(\351\231\204\346\272\220\347\240\201)/extra_apps/xadmin/plugins/bookmark.py" @@ -0,0 +1,236 @@ + +from django.contrib.contenttypes.models import ContentType +from django.urls.base import reverse +from django.db import transaction +from django.db.models import Q +from django.forms import ModelChoiceField +from django.http import QueryDict +from django.template import loader +from django.utils.decorators import method_decorator +from django.utils.encoding import smart_text +from django.utils.translation import ugettext_lazy as _ +from django.views.decorators.csrf import csrf_protect + +from xadmin.filters import FILTER_PREFIX, SEARCH_VAR +from xadmin.plugins.relate import RELATE_PREFIX +from xadmin.plugins.utils import get_context_dict +from xadmin.sites import site +from xadmin.views import ModelAdminView, BaseAdminPlugin, ListAdminView +from xadmin.views.list import COL_LIST_VAR, ORDER_VAR +from xadmin.views.dashboard import widget_manager, BaseWidget, PartialBaseWidget + +from xadmin.models import Bookmark + +csrf_protect_m = method_decorator(csrf_protect) + + +class BookmarkPlugin(BaseAdminPlugin): + + # [{'title': "Female", 'query': {'gender': True}, 'order': ('-age'), 'cols': ('first_name', 'age', 'phones'), 'search': 'Tom'}] + list_bookmarks = [] + show_bookmarks = True + + def has_change_permission(self, obj=None): + if not obj or self.user.is_superuser: + return True + else: + return obj.user == self.user + + def get_context(self, context): + if not self.show_bookmarks: + return context + + bookmarks = [] + + current_qs = '&'.join([ + '%s=%s' % (k, v) + for k, v in sorted(filter( + lambda i: bool(i[1] and ( + i[0] in (COL_LIST_VAR, ORDER_VAR, SEARCH_VAR) + or i[0].startswith(FILTER_PREFIX) + or i[0].startswith(RELATE_PREFIX) + )), + self.request.GET.items() + )) + ]) + + model_info = (self.opts.app_label, self.opts.model_name) + has_selected = False + menu_title = _(u"Bookmark") + list_base_url = reverse('xadmin:%s_%s_changelist' % + model_info, current_app=self.admin_site.name) + + # local bookmarks + for bk in self.list_bookmarks: + title = bk['title'] + params = dict([ + (FILTER_PREFIX + k, v) + for (k, v) in bk['query'].items() + ]) + if 'order' in bk: + params[ORDER_VAR] = '.'.join(bk['order']) + if 'cols' in bk: + params[COL_LIST_VAR] = '.'.join(bk['cols']) + if 'search' in bk: + params[SEARCH_VAR] = bk['search'] + + def check_item(i): + return bool(i[1]) or i[1] == False + bk_qs = '&'.join([ + '%s=%s' % (k, v) + for k, v in sorted(filter(check_item, params.items())) + ]) + + url = list_base_url + '?' + bk_qs + selected = (current_qs == bk_qs) + + bookmarks.append( + {'title': title, 'selected': selected, 'url': url}) + if selected: + menu_title = title + has_selected = True + + content_type = ContentType.objects.get_for_model(self.model) + bk_model_info = (Bookmark._meta.app_label, Bookmark._meta.model_name) + bookmarks_queryset = Bookmark.objects.filter( + content_type=content_type, + url_name='xadmin:%s_%s_changelist' % model_info + ).filter(Q(user=self.user) | Q(is_share=True)) + + for bk in bookmarks_queryset: + selected = (current_qs == bk.query) + + if self.has_change_permission(bk): + change_or_detail = 'change' + else: + change_or_detail = 'detail' + + bookmarks.append({'title': bk.title, 'selected': selected, 'url': bk.url, 'edit_url': + reverse('xadmin:%s_%s_%s' % (bk_model_info[0], bk_model_info[1], change_or_detail), + args=(bk.id,))}) + if selected: + menu_title = bk.title + has_selected = True + + post_url = reverse('xadmin:%s_%s_bookmark' % model_info, + current_app=self.admin_site.name) + + new_context = { + 'bk_menu_title': menu_title, + 'bk_bookmarks': bookmarks, + 'bk_current_qs': current_qs, + 'bk_has_selected': has_selected, + 'bk_list_base_url': list_base_url, + 'bk_post_url': post_url, + 'has_add_permission_bookmark': self.admin_view.request.user.has_perm('xadmin.add_bookmark'), + 'has_change_permission_bookmark': self.admin_view.request.user.has_perm('xadmin.change_bookmark') + } + context.update(new_context) + return context + + # Media + def get_media(self, media): + return media + self.vendor('xadmin.plugin.bookmark.js') + + # Block Views + def block_nav_menu(self, context, nodes): + if self.show_bookmarks: + nodes.insert(0, loader.render_to_string('xadmin/blocks/model_list.nav_menu.bookmarks.html', + context=get_context_dict(context))) + + +class BookmarkView(ModelAdminView): + + @csrf_protect_m + @transaction.atomic + def post(self, request): + model_info = (self.opts.app_label, self.opts.model_name) + url_name = 'xadmin:%s_%s_changelist' % model_info + bookmark = Bookmark( + content_type=ContentType.objects.get_for_model(self.model), + title=request.POST[ + 'title'], user=self.user, query=request.POST.get('query', ''), + is_share=request.POST.get('is_share', 0), url_name=url_name) + bookmark.save() + content = {'title': bookmark.title, 'url': bookmark.url} + return self.render_response(content) + + +class BookmarkAdmin(object): + + model_icon = 'fa fa-book' + list_display = ('title', 'user', 'url_name', 'query') + list_display_links = ('title',) + user_fields = ['user'] + hidden_menu = True + + def queryset(self): + if self.user.is_superuser: + return Bookmark.objects.all() + return Bookmark.objects.filter(Q(user=self.user) | Q(is_share=True)) + + def get_list_display(self): + list_display = super(BookmarkAdmin, self).get_list_display() + if not self.user.is_superuser: + list_display.remove('user') + return list_display + + def has_change_permission(self, obj=None): + if not obj or self.user.is_superuser: + return True + else: + return obj.user == self.user + + +@widget_manager.register +class BookmarkWidget(PartialBaseWidget): + widget_type = _('bookmark') + widget_icon = 'fa fa-bookmark' + description = _( + 'Bookmark Widget, can show user\'s bookmark list data in widget.') + template = "xadmin/widgets/list.html" + + bookmark = ModelChoiceField( + label=_('Bookmark'), queryset=Bookmark.objects.all(), required=False) + + def setup(self): + BaseWidget.setup(self) + + bookmark = self.cleaned_data['bookmark'] + model = bookmark.content_type.model_class() + data = QueryDict(bookmark.query) + self.bookmark = bookmark + + if not self.title: + self.title = smart_text(bookmark) + + req = self.make_get_request("", data.items()) + self.list_view = self.get_view_class( + ListAdminView, model, list_per_page=10, list_editable=[])(req) + + def has_perm(self): + return True + + def context(self, context): + list_view = self.list_view + list_view.make_result_list() + + base_fields = list_view.base_list_display + if len(base_fields) > 5: + base_fields = base_fields[0:5] + + context['result_headers'] = [c for c in list_view.result_headers( + ).cells if c.field_name in base_fields] + context['results'] = [ + [o for i, o in enumerate(filter( + lambda c: c.field_name in base_fields, + r.cells + ))] + for r in list_view.results() + ] + context['result_count'] = list_view.result_count + context['page_url'] = self.bookmark.url + +site.register(Bookmark, BookmarkAdmin) +site.register_plugin(BookmarkPlugin, ListAdminView) +site.register_modelview(r'^bookmark/$', BookmarkView, name='%s_%s_bookmark') diff --git "a/8\343\200\201\346\226\207\347\214\256\346\225\260\346\215\256\346\214\226\346\216\230\347\263\273\347\273\237(\351\231\204\346\272\220\347\240\201)/extra_apps/xadmin/plugins/chart.py" "b/8\343\200\201\346\226\207\347\214\256\346\225\260\346\215\256\346\214\226\346\216\230\347\263\273\347\273\237(\351\231\204\346\272\220\347\240\201)/extra_apps/xadmin/plugins/chart.py" new file mode 100644 index 0000000..e2b0a64 --- /dev/null +++ "b/8\343\200\201\346\226\207\347\214\256\346\225\260\346\215\256\346\214\226\346\216\230\347\263\273\347\273\237(\351\231\204\346\272\220\347\240\201)/extra_apps/xadmin/plugins/chart.py" @@ -0,0 +1,160 @@ + +import calendar +import datetime +import decimal + +from django.core.serializers.json import DjangoJSONEncoder +from django.db import models +from django.http import HttpResponse, HttpResponseNotFound +from django.template import loader +from django.utils.http import urlencode +from django.utils.encoding import force_text, smart_text +from django.utils.translation import ugettext_lazy as _, ugettext + +from xadmin.plugins.utils import get_context_dict +from xadmin.sites import site +from xadmin.views import BaseAdminPlugin, ListAdminView +from xadmin.views.dashboard import ModelBaseWidget, widget_manager +from xadmin.util import lookup_field, label_for_field, json + + +@widget_manager.register +class ChartWidget(ModelBaseWidget): + widget_type = 'chart' + description = _('Show models simple chart.') + template = 'xadmin/widgets/chart.html' + widget_icon = 'fa fa-bar-chart-o' + + def convert(self, data): + self.list_params = data.pop('params', {}) + self.chart = data.pop('chart', None) + + def setup(self): + super(ChartWidget, self).setup() + + self.charts = {} + self.one_chart = False + model_admin = self.admin_site._registry[self.model] + chart = self.chart + + if hasattr(model_admin, 'data_charts'): + if chart and chart in model_admin.data_charts: + self.charts = {chart: model_admin.data_charts[chart]} + self.one_chart = True + if self.title is None: + self.title = model_admin.data_charts[chart].get('title') + else: + self.charts = model_admin.data_charts + if self.title is None: + self.title = ugettext( + "%s Charts") % self.model._meta.verbose_name_plural + + def filte_choices_model(self, model, modeladmin): + return bool(getattr(modeladmin, 'data_charts', None)) and \ + super(ChartWidget, self).filte_choices_model(model, modeladmin) + + def get_chart_url(self, name, v): + return self.model_admin_url('chart', name) + "?" + urlencode(self.list_params) + + def context(self, context): + context.update({ + 'charts': [{"name": name, "title": v['title'], 'url': self.get_chart_url(name, v)} for name, v in self.charts.items()], + }) + + # Media + def media(self): + return self.vendor('flot.js', 'xadmin.plugin.charts.js') + + +class JSONEncoder(DjangoJSONEncoder): + def default(self, o): + if isinstance(o, (datetime.date, datetime.datetime)): + return calendar.timegm(o.timetuple()) * 1000 + elif isinstance(o, decimal.Decimal): + return str(o) + else: + try: + return super(JSONEncoder, self).default(o) + except Exception: + return smart_text(o) + + +class ChartsPlugin(BaseAdminPlugin): + + data_charts = {} + + def init_request(self, *args, **kwargs): + return bool(self.data_charts) + + def get_chart_url(self, name, v): + return self.admin_view.model_admin_url('chart', name) + self.admin_view.get_query_string() + + # Media + def get_media(self, media): + return media + self.vendor('flot.js', 'xadmin.plugin.charts.js') + + # Block Views + def block_results_top(self, context, nodes): + context.update({ + 'charts': [{"name": name, "title": v['title'], 'url': self.get_chart_url(name, v)} for name, v in self.data_charts.items()], + }) + nodes.append(loader.render_to_string('xadmin/blocks/model_list.results_top.charts.html', + context=get_context_dict(context))) + + +class ChartsView(ListAdminView): + + data_charts = {} + + def get_ordering(self): + if 'order' in self.chart: + return self.chart['order'] + else: + return super(ChartsView, self).get_ordering() + + def get(self, request, name): + if name not in self.data_charts: + return HttpResponseNotFound() + + self.chart = self.data_charts[name] + + self.x_field = self.chart['x-field'] + y_fields = self.chart['y-field'] + self.y_fields = ( + y_fields,) if type(y_fields) not in (list, tuple) else y_fields + + datas = [{"data":[], "label": force_text(label_for_field( + i, self.model, model_admin=self))} for i in self.y_fields] + + self.make_result_list() + + for obj in self.result_list: + xf, attrs, value = lookup_field(self.x_field, obj, self) + for i, yfname in enumerate(self.y_fields): + yf, yattrs, yv = lookup_field(yfname, obj, self) + datas[i]["data"].append((value, yv)) + + option = {'series': {'lines': {'show': True}, 'points': {'show': False}}, + 'grid': {'hoverable': True, 'clickable': True}} + try: + xfield = self.opts.get_field(self.x_field) + if type(xfield) in (models.DateTimeField, models.DateField, models.TimeField): + option['xaxis'] = {'mode': "time", 'tickLength': 5} + if type(xfield) is models.DateField: + option['xaxis']['timeformat'] = "%y/%m/%d" + elif type(xfield) is models.TimeField: + option['xaxis']['timeformat'] = "%H:%M:%S" + else: + option['xaxis']['timeformat'] = "%y/%m/%d %H:%M:%S" + except Exception: + pass + + option.update(self.chart.get('option', {})) + + content = {'data': datas, 'option': option} + result = json.dumps(content, cls=JSONEncoder, ensure_ascii=False) + + return HttpResponse(result) + +site.register_plugin(ChartsPlugin, ListAdminView) +site.register_modelview(r'^chart/(.+)/$', ChartsView, name='%s_%s_chart') diff --git "a/8\343\200\201\346\226\207\347\214\256\346\225\260\346\215\256\346\214\226\346\216\230\347\263\273\347\273\237(\351\231\204\346\272\220\347\240\201)/extra_apps/xadmin/plugins/comments.py" "b/8\343\200\201\346\226\207\347\214\256\346\225\260\346\215\256\346\214\226\346\216\230\347\263\273\347\273\237(\351\231\204\346\272\220\347\240\201)/extra_apps/xadmin/plugins/comments.py" new file mode 100644 index 0000000..0e90462 --- /dev/null +++ "b/8\343\200\201\346\226\207\347\214\256\346\225\260\346\215\256\346\214\226\346\216\230\347\263\273\347\273\237(\351\231\204\346\272\220\347\240\201)/extra_apps/xadmin/plugins/comments.py" @@ -0,0 +1,94 @@ +import xadmin + +from xadmin.layout import * +from xadmin.util import username_field + +from django.conf import settings +from django.contrib.comments.models import Comment +from django.utils.translation import ugettext_lazy as _, ungettext +from django.contrib.comments import get_model +from django.contrib.comments.views.moderation import perform_flag, perform_approve, perform_delete + +class UsernameSearch(object): + """The User object may not be auth.User, so we need to provide + a mechanism for issuing the equivalent of a .filter(user__username=...) + search in CommentAdmin. + """ + def __str__(self): + return 'user__%s' % username_field + + +class CommentsAdmin(object): + form_layout = ( + Main( + Fieldset(None, + 'content_type', 'object_pk', 'site', + css_class='unsort no_title' + ), + Fieldset('Content', + 'user', 'user_name', 'user_email', 'user_url', 'comment' + ), + ), + Side( + Fieldset(_('Metadata'), + 'submit_date', 'ip_address', 'is_public', 'is_removed' + ), + ) + ) + + list_display = ('name', 'content_type', 'object_pk', 'ip_address', 'submit_date', 'is_public', 'is_removed') + list_filter = ('submit_date', 'site', 'is_public', 'is_removed') + ordering = ('-submit_date',) + search_fields = ('comment', UsernameSearch(), 'user_name', 'user_email', 'user_url', 'ip_address') + actions = ["flag_comments", "approve_comments", "remove_comments"] + model_icon = 'fa fa-comment' + + def get_actions(self): + actions = super(CommentsAdmin, self).get_actions() + # Only superusers should be able to delete the comments from the DB. + if not self.user.is_superuser and 'delete_selected' in actions: + actions.pop('delete_selected') + if not self.user.has_perm('comments.can_moderate'): + if 'approve_comments' in actions: + actions.pop('approve_comments') + if 'remove_comments' in actions: + actions.pop('remove_comments') + return actions + + def flag_comments(self, request, queryset): + self._bulk_flag(queryset, perform_flag, + lambda n: ungettext('flagged', 'flagged', n)) + flag_comments.short_description = _("Flag selected comments") + flag_comments.icon = 'flag' + + def approve_comments(self, request, queryset): + self._bulk_flag(queryset, perform_approve, + lambda n: ungettext('approved', 'approved', n)) + approve_comments.short_description = _("Approve selected comments") + approve_comments.icon = 'ok' + + def remove_comments(self, request, queryset): + self._bulk_flag(queryset, perform_delete, + lambda n: ungettext('removed', 'removed', n)) + remove_comments.short_description = _("Remove selected comments") + remove_comments.icon = 'remove-circle' + + def _bulk_flag(self, queryset, action, done_message): + """ + Flag, approve, or remove some comments from an admin action. Actually + calls the `action` argument to perform the heavy lifting. + """ + n_comments = 0 + for comment in queryset: + action(self.request, comment) + n_comments += 1 + + msg = ungettext('1 comment was successfully %(action)s.', + '%(count)s comments were successfully %(action)s.', + n_comments) + self.message_user(msg % {'count': n_comments, 'action': done_message(n_comments)}, 'success') + +# Only register the default admin if the model is the built-in comment model +# (this won't be true if there's a custom comment app). +if 'django.contrib.comments' in settings.INSTALLED_APPS and (get_model() is Comment): + xadmin.site.register(Comment, CommentsAdmin) diff --git "a/8\343\200\201\346\226\207\347\214\256\346\225\260\346\215\256\346\214\226\346\216\230\347\263\273\347\273\237(\351\231\204\346\272\220\347\240\201)/extra_apps/xadmin/plugins/details.py" "b/8\343\200\201\346\226\207\347\214\256\346\225\260\346\215\256\346\214\226\346\216\230\347\263\273\347\273\237(\351\231\204\346\272\220\347\240\201)/extra_apps/xadmin/plugins/details.py" new file mode 100644 index 0000000..0ce45f9 --- /dev/null +++ "b/8\343\200\201\346\226\207\347\214\256\346\225\260\346\215\256\346\214\226\346\216\230\347\263\273\347\273\237(\351\231\204\346\272\220\347\240\201)/extra_apps/xadmin/plugins/details.py" @@ -0,0 +1,63 @@ + + +from django.utils.translation import ugettext as _ +from django.urls.base import reverse, NoReverseMatch +from django.db import models + +from xadmin.sites import site +from xadmin.views import BaseAdminPlugin, ListAdminView + + +class DetailsPlugin(BaseAdminPlugin): + + show_detail_fields = [] + show_all_rel_details = True + + def result_item(self, item, obj, field_name, row): + if (self.show_all_rel_details or (field_name in self.show_detail_fields)): + rel_obj = None + if hasattr(item.field, 'remote_field') and isinstance(item.field.remote_field, models.ManyToOneRel): + rel_obj = getattr(obj, field_name) + elif field_name in self.show_detail_fields: + rel_obj = obj + + if rel_obj: + if rel_obj.__class__ in site._registry: + try: + model_admin = site._registry[rel_obj.__class__] + has_view_perm = model_admin(self.admin_view.request).has_view_permission(rel_obj) + has_change_perm = model_admin(self.admin_view.request).has_change_permission(rel_obj) + except: + has_view_perm = self.admin_view.has_model_perm(rel_obj.__class__, 'view') + has_change_perm = self.has_model_perm(rel_obj.__class__, 'change') + else: + has_view_perm = self.admin_view.has_model_perm(rel_obj.__class__, 'view') + has_change_perm = self.has_model_perm(rel_obj.__class__, 'change') + + if rel_obj and has_view_perm: + opts = rel_obj._meta + try: + item_res_uri = reverse( + '%s:%s_%s_detail' % (self.admin_site.app_name, + opts.app_label, opts.model_name), + args=(getattr(rel_obj, opts.pk.attname),)) + if item_res_uri: + if has_change_perm: + edit_url = reverse( + '%s:%s_%s_change' % (self.admin_site.app_name, opts.app_label, opts.model_name), + args=(getattr(rel_obj, opts.pk.attname),)) + else: + edit_url = '' + item.btns.append('' + % (item_res_uri, edit_url, _(u'Details of %s') % str(rel_obj))) + except NoReverseMatch: + pass + return item + + # Media + def get_media(self, media): + if self.show_all_rel_details or self.show_detail_fields: + media = media + self.vendor('xadmin.plugin.details.js', 'xadmin.form.css') + return media + +site.register_plugin(DetailsPlugin, ListAdminView) diff --git "a/8\343\200\201\346\226\207\347\214\256\346\225\260\346\215\256\346\214\226\346\216\230\347\263\273\347\273\237(\351\231\204\346\272\220\347\240\201)/extra_apps/xadmin/plugins/editable.py" "b/8\343\200\201\346\226\207\347\214\256\346\225\260\346\215\256\346\214\226\346\216\230\347\263\273\347\273\237(\351\231\204\346\272\220\347\240\201)/extra_apps/xadmin/plugins/editable.py" new file mode 100644 index 0000000..68a5960 --- /dev/null +++ "b/8\343\200\201\346\226\207\347\214\256\346\225\260\346\215\256\346\214\226\346\216\230\347\263\273\347\273\237(\351\231\204\346\272\220\347\240\201)/extra_apps/xadmin/plugins/editable.py" @@ -0,0 +1,167 @@ +from django import template +from django.core.exceptions import PermissionDenied, ObjectDoesNotExist +from django.db import models, transaction +from django.forms.models import modelform_factory +from django.forms import Media +from django.http import Http404, HttpResponse +from django.utils.encoding import force_text, smart_text +from django.utils.html import escape, conditional_escape +from django.utils.safestring import mark_safe +from django.utils.translation import ugettext as _ +from xadmin.plugins.ajax import JsonErrorDict +from xadmin.sites import site +from xadmin.util import lookup_field, display_for_field, label_for_field, unquote, boolean_icon +from xadmin.views import BaseAdminPlugin, ModelFormAdminView, ListAdminView +from xadmin.views.base import csrf_protect_m, filter_hook +from xadmin.views.edit import ModelFormAdminUtil +from xadmin.views.list import EMPTY_CHANGELIST_VALUE +from xadmin.layout import FormHelper + + +class EditablePlugin(BaseAdminPlugin): + + list_editable = [] + + def __init__(self, admin_view): + super(EditablePlugin, self).__init__(admin_view) + self.editable_need_fields = {} + + def init_request(self, *args, **kwargs): + active = bool(self.request.method == 'GET' and self.admin_view.has_change_permission() and self.list_editable) + if active: + self.model_form = self.get_model_view(ModelFormAdminUtil, self.model).form_obj + return active + + def result_item(self, item, obj, field_name, row): + if self.list_editable and item.field and item.field.editable and (field_name in self.list_editable): + pk = getattr(obj, obj._meta.pk.attname) + field_label = label_for_field(field_name, obj, + model_admin=self.admin_view, + return_attr=False + ) + + item.wraps.insert(0, '%s') + item.btns.append(( + '' + + '') % + (_(u"Enter %s") % field_label, field_name, self.admin_view.model_admin_url('patch', pk) + '?fields=' + field_name)) + + if field_name not in self.editable_need_fields: + self.editable_need_fields[field_name] = item.field + return item + + # Media + def get_media(self, media): + if self.editable_need_fields: + + try: + m = self.model_form.media + except: + m = Media() + media = media + m +\ + self.vendor( + 'xadmin.plugin.editable.js', 'xadmin.widget.editable.css') + return media + + +class EditPatchView(ModelFormAdminView, ListAdminView): + + def init_request(self, object_id, *args, **kwargs): + self.org_obj = self.get_object(unquote(object_id)) + + # For list view get new field display html + self.pk_attname = self.opts.pk.attname + + if not self.has_change_permission(self.org_obj): + raise PermissionDenied + + if self.org_obj is None: + raise Http404(_('%(name)s object with primary key %(key)r does not exist.') % + {'name': force_text(self.opts.verbose_name), 'key': escape(object_id)}) + + def get_new_field_html(self, f): + result = self.result_item(self.org_obj, f, {'is_display_first': + False, 'object': self.org_obj}) + return mark_safe(result.text) if result.allow_tags else conditional_escape(result.text) + + def _get_new_field_html(self, field_name): + try: + f, attr, value = lookup_field(field_name, self.org_obj, self) + except (AttributeError, ObjectDoesNotExist): + return EMPTY_CHANGELIST_VALUE + else: + allow_tags = False + if f is None: + allow_tags = getattr(attr, 'allow_tags', False) + boolean = getattr(attr, 'boolean', False) + if boolean: + allow_tags = True + text = boolean_icon(value) + else: + text = smart_text(value) + else: + if isinstance(f.rel, models.ManyToOneRel): + field_val = getattr(self.org_obj, f.name) + if field_val is None: + text = EMPTY_CHANGELIST_VALUE + else: + text = field_val + else: + text = display_for_field(value, f) + return mark_safe(text) if allow_tags else conditional_escape(text) + + @filter_hook + def get(self, request, object_id): + model_fields = [f.name for f in self.opts.fields] + fields = [f for f in request.GET['fields'].split(',') if f in model_fields] + defaults = { + "form": self.form, + "fields": fields, + "formfield_callback": self.formfield_for_dbfield, + } + form_class = modelform_factory(self.model, **defaults) + form = form_class(instance=self.org_obj) + + helper = FormHelper() + helper.form_tag = False + helper.include_media = False + form.helper = helper + + s = '{% load i18n crispy_forms_tags %}
    {% crispy form %}' + \ + '
    ' + t = template.Template(s) + c = template.Context({'form': form, 'action_url': self.model_admin_url('patch', self.org_obj.pk)}) + + return HttpResponse(t.render(c)) + + @filter_hook + @csrf_protect_m + @transaction.atomic + def post(self, request, object_id): + model_fields = [f.name for f in self.opts.fields] + fields = [f for f in request.POST.keys() if f in model_fields] + defaults = { + "form": self.form, + "fields": fields, + "formfield_callback": self.formfield_for_dbfield, + } + form_class = modelform_factory(self.model, **defaults) + form = form_class( + instance=self.org_obj, data=request.POST, files=request.FILES) + + result = {} + if form.is_valid(): + form.save(commit=True) + result['result'] = 'success' + result['new_data'] = form.cleaned_data + result['new_html'] = dict( + [(f, self.get_new_field_html(f)) for f in fields]) + else: + result['result'] = 'error' + result['errors'] = JsonErrorDict(form.errors, form).as_json() + + return self.render_response(result) + + +site.register_plugin(EditablePlugin, ListAdminView) +site.register_modelview(r'^(.+)/patch/$', EditPatchView, name='%s_%s_patch') diff --git "a/8\343\200\201\346\226\207\347\214\256\346\225\260\346\215\256\346\214\226\346\216\230\347\263\273\347\273\237(\351\231\204\346\272\220\347\240\201)/extra_apps/xadmin/plugins/export.py" "b/8\343\200\201\346\226\207\347\214\256\346\225\260\346\215\256\346\214\226\346\216\230\347\263\273\347\273\237(\351\231\204\346\272\220\347\240\201)/extra_apps/xadmin/plugins/export.py" new file mode 100644 index 0000000..e5c1807 --- /dev/null +++ "b/8\343\200\201\346\226\207\347\214\256\346\225\260\346\215\256\346\214\226\346\216\230\347\263\273\347\273\237(\351\231\204\346\272\220\347\240\201)/extra_apps/xadmin/plugins/export.py" @@ -0,0 +1,249 @@ +import io +import datetime +import sys +from future.utils import iteritems + +from django.http import HttpResponse +from django.template import loader +from django.utils import six +from django.utils.encoding import force_text, smart_text +from django.utils.html import escape +from django.utils.translation import ugettext as _ +from django.utils.xmlutils import SimplerXMLGenerator +from django.db.models import BooleanField, NullBooleanField + +from xadmin.plugins.utils import get_context_dict +from xadmin.sites import site +from xadmin.views import BaseAdminPlugin, ListAdminView +from xadmin.util import json +from xadmin.views.list import ALL_VAR + +try: + import xlwt + has_xlwt = True +except: + has_xlwt = False + +try: + import xlsxwriter + has_xlsxwriter = True +except: + has_xlsxwriter = False + + +class ExportMenuPlugin(BaseAdminPlugin): + + list_export = ('xlsx', 'xls', 'csv', 'xml', 'json') + export_names = {'xlsx': 'Excel 2007', 'xls': 'Excel', 'csv': 'CSV', + 'xml': 'XML', 'json': 'JSON'} + + def init_request(self, *args, **kwargs): + self.list_export = [ + f for f in self.list_export + if (f != 'xlsx' or has_xlsxwriter) and (f != 'xls' or has_xlwt)] + + def block_top_toolbar(self, context, nodes): + if self.list_export: + context.update({ + 'show_export_all': self.admin_view.paginator.count > self.admin_view.list_per_page and not ALL_VAR in self.admin_view.request.GET, + 'form_params': self.admin_view.get_form_params({'_do_': 'export'}, ('export_type',)), + 'export_types': [{'type': et, 'name': self.export_names[et]} for et in self.list_export], + }) + nodes.append(loader.render_to_string('xadmin/blocks/model_list.top_toolbar.exports.html', + context=get_context_dict(context))) + + +class ExportPlugin(BaseAdminPlugin): + + export_mimes = {'xlsx': 'application/vnd.ms-excel', + 'xls': 'application/vnd.ms-excel', 'csv': 'text/csv', + 'xml': 'application/xhtml+xml', 'json': 'application/json'} + + def init_request(self, *args, **kwargs): + return self.request.GET.get('_do_') == 'export' + + def _format_value(self, o): + if (o.field is None and getattr(o.attr, 'boolean', False)) or \ + (o.field and isinstance(o.field, (BooleanField, NullBooleanField))): + value = o.value + elif str(o.text).startswith(""): + value = escape(str(o.text)[25:-7]) + else: + value = escape(str(o.text)) + return value + + def _get_objects(self, context): + headers = [c for c in context['result_headers'].cells if c.export] + rows = context['results'] + + return [dict([ + (force_text(headers[i].text), self._format_value(o)) for i, o in + enumerate(filter(lambda c:getattr(c, 'export', False), r.cells))]) for r in rows] + + def _get_datas(self, context): + rows = context['results'] + + new_rows = [[self._format_value(o) for o in + filter(lambda c:getattr(c, 'export', False), r.cells)] for r in rows] + new_rows.insert(0, [force_text(c.text) for c in context['result_headers'].cells if c.export]) + return new_rows + + def get_xlsx_export(self, context): + datas = self._get_datas(context) + output = io.BytesIO() + export_header = ( + self.request.GET.get('export_xlsx_header', 'off') == 'on') + + model_name = self.opts.verbose_name + book = xlsxwriter.Workbook(output) + sheet = book.add_worksheet( + u"%s %s" % (_(u'Sheet'), force_text(model_name))) + styles = {'datetime': book.add_format({'num_format': 'yyyy-mm-dd hh:mm:ss'}), + 'date': book.add_format({'num_format': 'yyyy-mm-dd'}), + 'time': book.add_format({'num_format': 'hh:mm:ss'}), + 'header': book.add_format({'font': 'name Times New Roman', 'color': 'red', 'bold': 'on', 'num_format': '#,##0.00'}), + 'default': book.add_format()} + + if not export_header: + datas = datas[1:] + for rowx, row in enumerate(datas): + for colx, value in enumerate(row): + if export_header and rowx == 0: + cell_style = styles['header'] + else: + if isinstance(value, datetime.datetime): + cell_style = styles['datetime'] + elif isinstance(value, datetime.date): + cell_style = styles['date'] + elif isinstance(value, datetime.time): + cell_style = styles['time'] + else: + cell_style = styles['default'] + sheet.write(rowx, colx, value, cell_style) + book.close() + + output.seek(0) + return output.getvalue() + + def get_xls_export(self, context): + datas = self._get_datas(context) + output = io.BytesIO() + export_header = ( + self.request.GET.get('export_xls_header', 'off') == 'on') + + model_name = self.opts.verbose_name + book = xlwt.Workbook(encoding='utf8') + sheet = book.add_sheet( + u"%s %s" % (_(u'Sheet'), force_text(model_name))) + styles = {'datetime': xlwt.easyxf(num_format_str='yyyy-mm-dd hh:mm:ss'), + 'date': xlwt.easyxf(num_format_str='yyyy-mm-dd'), + 'time': xlwt.easyxf(num_format_str='hh:mm:ss'), + 'header': xlwt.easyxf('font: name Times New Roman, color-index red, bold on', num_format_str='#,##0.00'), + 'default': xlwt.Style.default_style} + + if not export_header: + datas = datas[1:] + for rowx, row in enumerate(datas): + for colx, value in enumerate(row): + if export_header and rowx == 0: + cell_style = styles['header'] + else: + if isinstance(value, datetime.datetime): + cell_style = styles['datetime'] + elif isinstance(value, datetime.date): + cell_style = styles['date'] + elif isinstance(value, datetime.time): + cell_style = styles['time'] + else: + cell_style = styles['default'] + sheet.write(rowx, colx, value, style=cell_style) + book.save(output) + + output.seek(0) + return output.getvalue() + + def _format_csv_text(self, t): + if isinstance(t, bool): + return _('Yes') if t else _('No') + t = t.replace('"', '""').replace(',', '\,') + cls_str = str if six.PY3 else basestring + if isinstance(t, cls_str): + t = '"%s"' % t + return t + + def get_csv_export(self, context): + datas = self._get_datas(context) + stream = [] + + if self.request.GET.get('export_csv_header', 'off') != 'on': + datas = datas[1:] + + for row in datas: + stream.append(','.join(map(self._format_csv_text, row))) + + return '\r\n'.join(stream) + + def _to_xml(self, xml, data): + if isinstance(data, (list, tuple)): + for item in data: + xml.startElement("row", {}) + self._to_xml(xml, item) + xml.endElement("row") + elif isinstance(data, dict): + for key, value in iteritems(data): + key = key.replace(' ', '_') + xml.startElement(key, {}) + self._to_xml(xml, value) + xml.endElement(key) + else: + xml.characters(smart_text(data)) + + def get_xml_export(self, context): + results = self._get_objects(context) + stream = io.StringIO() + + xml = SimplerXMLGenerator(stream, "utf-8") + xml.startDocument() + xml.startElement("objects", {}) + + self._to_xml(xml, results) + + xml.endElement("objects") + xml.endDocument() + + return stream.getvalue().split('\n')[1] + + def get_json_export(self, context): + results = self._get_objects(context) + return json.dumps({'objects': results}, ensure_ascii=False, + indent=(self.request.GET.get('export_json_format', 'off') == 'on') and 4 or None) + + def get_response(self, response, context, *args, **kwargs): + file_type = self.request.GET.get('export_type', 'csv') + response = HttpResponse( + content_type="%s; charset=gbk" % self.export_mimes[file_type]) + + file_name = self.opts.verbose_name.replace(' ', '_') + response['Content-Disposition'] = ('attachment; filename=%s.%s' % ( + file_name, file_type)).encode('utf-8') + + response.write(getattr(self, 'get_%s_export' % file_type)(context)) + return response + + # View Methods + def get_result_list(self, __): + if self.request.GET.get('all', 'off') == 'on': + self.admin_view.list_per_page = sys.maxsize + return __() + + def result_header(self, item, field_name, row): + item.export = not item.attr or field_name == '__str__' or getattr(item.attr, 'allow_export', True) + return item + + def result_item(self, item, obj, field_name, row): + item.export = item.field or field_name == '__str__' or getattr(item.attr, 'allow_export', True) + return item + + +site.register_plugin(ExportMenuPlugin, ListAdminView) +site.register_plugin(ExportPlugin, ListAdminView) diff --git "a/8\343\200\201\346\226\207\347\214\256\346\225\260\346\215\256\346\214\226\346\216\230\347\263\273\347\273\237(\351\231\204\346\272\220\347\240\201)/extra_apps/xadmin/plugins/filters.py" "b/8\343\200\201\346\226\207\347\214\256\346\225\260\346\215\256\346\214\226\346\216\230\347\263\273\347\273\237(\351\231\204\346\272\220\347\240\201)/extra_apps/xadmin/plugins/filters.py" new file mode 100644 index 0000000..a17777f --- /dev/null +++ "b/8\343\200\201\346\226\207\347\214\256\346\225\260\346\215\256\346\214\226\346\216\230\347\263\273\347\273\237(\351\231\204\346\272\220\347\240\201)/extra_apps/xadmin/plugins/filters.py" @@ -0,0 +1,246 @@ +import operator +from future.utils import iteritems +from xadmin import widgets +from xadmin.plugins.utils import get_context_dict + +from django.contrib.admin.utils import get_fields_from_path, lookup_needs_distinct +from django.core.exceptions import SuspiciousOperation, ImproperlyConfigured, ValidationError +from django.db import models +from django.db.models.fields import FieldDoesNotExist +from django.db.models.constants import LOOKUP_SEP +# from django.db.models.sql.constants import QUERY_TERMS +from django.template import loader +from django.utils import six +from django.utils.encoding import smart_str +from django.utils.translation import ugettext as _ + +from xadmin.filters import manager as filter_manager, FILTER_PREFIX, SEARCH_VAR, DateFieldListFilter, \ + RelatedFieldSearchFilter +from xadmin.sites import site +from xadmin.views import BaseAdminPlugin, ListAdminView +from xadmin.util import is_related_field +from functools import reduce + + +class IncorrectLookupParameters(Exception): + pass + + +class FilterPlugin(BaseAdminPlugin): + list_filter = () + search_fields = () + free_query_filter = True + + def lookup_allowed(self, lookup, value): + model = self.model + # Check FKey lookups that are allowed, so that popups produced by + # ForeignKeyRawIdWidget, on the basis of ForeignKey.limit_choices_to, + # are allowed to work. + for l in model._meta.related_fkey_lookups: + for k, v in widgets.url_params_from_lookup_dict(l).items(): + if k == lookup and v == value: + return True + + parts = lookup.split(LOOKUP_SEP) + + # Last term in lookup is a query term (__exact, __startswith etc) + # This term can be ignored. + # if len(parts) > 1 and parts[-1] in QUERY_TERMS: + # parts.pop() + + # Special case -- foo__id__exact and foo__id queries are implied + # if foo has been specificially included in the lookup list; so + # drop __id if it is the last part. However, first we need to find + # the pk attribute name. + rel_name = None + for part in parts[:-1]: + try: + field = model._meta.get_field(part) + except FieldDoesNotExist: + # Lookups on non-existants fields are ok, since they're ignored + # later. + return True + if hasattr(field, 'remote_field'): + model = field.remote_field.to + rel_name = field.remote_field.get_related_field().name + elif is_related_field(field): + model = field.model + rel_name = model._meta.pk.name + else: + rel_name = None + if rel_name and len(parts) > 1 and parts[-1] == rel_name: + parts.pop() + + if len(parts) == 1: + return True + clean_lookup = LOOKUP_SEP.join(parts) + return clean_lookup in self.list_filter + + def get_list_queryset(self, queryset): + lookup_params = dict([(smart_str(k)[len(FILTER_PREFIX):], v) for k, v in self.admin_view.params.items() + if smart_str(k).startswith(FILTER_PREFIX) and v != '']) + for p_key, p_val in iteritems(lookup_params): + if p_val == "False": + lookup_params[p_key] = False + use_distinct = False + + # for clean filters + self.admin_view.has_query_param = bool(lookup_params) + self.admin_view.clean_query_url = self.admin_view.get_query_string(remove=[k for k in self.request.GET.keys() if + k.startswith(FILTER_PREFIX)]) + + # Normalize the types of keys + if not self.free_query_filter: + for key, value in lookup_params.items(): + if not self.lookup_allowed(key, value): + raise SuspiciousOperation( + "Filtering by %s not allowed" % key) + + self.filter_specs = [] + if self.list_filter: + for list_filter in self.list_filter: + if callable(list_filter): + # This is simply a custom list filter class. + spec = list_filter(self.request, lookup_params, + self.model, self) + else: + field_path = None + field_parts = [] + if isinstance(list_filter, (tuple, list)): + # This is a custom FieldListFilter class for a given field. + field, field_list_filter_class = list_filter + else: + # This is simply a field name, so use the default + # FieldListFilter class that has been registered for + # the type of the given field. + field, field_list_filter_class = list_filter, filter_manager.create + if not isinstance(field, models.Field): + field_path = field + field_parts = get_fields_from_path( + self.model, field_path) + field = field_parts[-1] + spec = field_list_filter_class( + field, self.request, lookup_params, + self.model, self.admin_view, field_path=field_path) + + if len(field_parts) > 1: + # Add related model name to title + spec.title = "%s %s" % (field_parts[-2].name, spec.title) + + # Check if we need to use distinct() + use_distinct = (use_distinct or + lookup_needs_distinct(self.opts, field_path)) + if spec and spec.has_output(): + try: + new_qs = spec.do_filte(queryset) + except ValidationError as e: + new_qs = None + self.admin_view.message_user(_("Filtering error: %s") % e.messages[0], 'error') + if new_qs is not None: + queryset = new_qs + + self.filter_specs.append(spec) + + self.has_filters = bool(self.filter_specs) + self.admin_view.filter_specs = self.filter_specs + obj = filter(lambda f: f.is_used, self.filter_specs) + if six.PY3: + obj = list(obj) + self.admin_view.used_filter_num = len(obj) + + try: + for key, value in lookup_params.items(): + use_distinct = ( + use_distinct or lookup_needs_distinct(self.opts, key)) + except FieldDoesNotExist as e: + raise IncorrectLookupParameters(e) + + try: + # fix a bug by david: In demo, quick filter by IDC Name() cannot be used. + if isinstance(queryset, models.query.QuerySet) and lookup_params: + new_lookup_parames = dict() + for k, v in lookup_params.items(): + list_v = v.split(',') + if len(list_v) > 0: + new_lookup_parames.update({k: list_v}) + else: + new_lookup_parames.update({k: v}) + queryset = queryset.filter(**new_lookup_parames) + except (SuspiciousOperation, ImproperlyConfigured): + raise + except Exception as e: + raise IncorrectLookupParameters(e) + else: + if not isinstance(queryset, models.query.QuerySet): + pass + + query = self.request.GET.get(SEARCH_VAR, '') + + # Apply keyword searches. + def construct_search(field_name): + if field_name.startswith('^'): + return "%s__istartswith" % field_name[1:] + elif field_name.startswith('='): + return "%s__iexact" % field_name[1:] + elif field_name.startswith('@'): + return "%s__search" % field_name[1:] + else: + return "%s__icontains" % field_name + + if self.search_fields and query: + orm_lookups = [construct_search(str(search_field)) + for search_field in self.search_fields] + for bit in query.split(): + or_queries = [models.Q(**{orm_lookup: bit}) + for orm_lookup in orm_lookups] + queryset = queryset.filter(reduce(operator.or_, or_queries)) + if not use_distinct: + for search_spec in orm_lookups: + if lookup_needs_distinct(self.opts, search_spec): + use_distinct = True + break + self.admin_view.search_query = query + + if use_distinct: + return queryset.distinct() + else: + return queryset + + # Media + def get_media(self, media): + arr = filter(lambda s: isinstance(s, DateFieldListFilter), self.filter_specs) + if six.PY3: + arr = list(arr) + if bool(arr): + media = media + self.vendor('datepicker.css', 'datepicker.js', + 'xadmin.widget.datetime.js') + arr = filter(lambda s: isinstance(s, RelatedFieldSearchFilter), self.filter_specs) + if six.PY3: + arr = list(arr) + if bool(arr): + media = media + self.vendor( + 'select.js', 'select.css', 'xadmin.widget.select.js') + return media + self.vendor('xadmin.plugin.filters.js') + + # Block Views + def block_nav_menu(self, context, nodes): + if self.has_filters: + nodes.append(loader.render_to_string('xadmin/blocks/model_list.nav_menu.filters.html', + context=get_context_dict(context))) + + def block_nav_form(self, context, nodes): + if self.search_fields: + context = get_context_dict(context or {}) # no error! + context.update({ + 'search_var': SEARCH_VAR, + 'remove_search_url': self.admin_view.get_query_string(remove=[SEARCH_VAR]), + 'search_form_params': self.admin_view.get_form_params(remove=[SEARCH_VAR]) + }) + nodes.append( + loader.render_to_string( + 'xadmin/blocks/model_list.nav_form.search_form.html', + context=context) + ) + + +site.register_plugin(FilterPlugin, ListAdminView) diff --git "a/8\343\200\201\346\226\207\347\214\256\346\225\260\346\215\256\346\214\226\346\216\230\347\263\273\347\273\237(\351\231\204\346\272\220\347\240\201)/extra_apps/xadmin/plugins/images.py" "b/8\343\200\201\346\226\207\347\214\256\346\225\260\346\215\256\346\214\226\346\216\230\347\263\273\347\273\237(\351\231\204\346\272\220\347\240\201)/extra_apps/xadmin/plugins/images.py" new file mode 100644 index 0000000..7fea2b3 --- /dev/null +++ "b/8\343\200\201\346\226\207\347\214\256\346\225\260\346\215\256\346\214\226\346\216\230\347\263\273\347\273\237(\351\231\204\346\272\220\347\240\201)/extra_apps/xadmin/plugins/images.py" @@ -0,0 +1,119 @@ +from django.db import models +from django import forms +from django.utils.translation import ugettext as _ +from django.utils.safestring import mark_safe +from xadmin.sites import site +from xadmin.views import BaseAdminPlugin, ModelFormAdminView, DetailAdminView, ListAdminView + + +def get_gallery_modal(): + return """ + + + """ % (_('Previous'), _('Next'), _('Slideshow'), _('Download')) + + +class AdminImageField(forms.ImageField): + + def widget_attrs(self, widget): + return {'label': self.label} + + +class AdminImageWidget(forms.FileInput): + """ + A ImageField Widget that shows its current value if it has one. + """ + def __init__(self, attrs={}): + super(AdminImageWidget, self).__init__(attrs) + + def render(self, name, value, attrs=None, renderer=None): + output = [] + if value and hasattr(value, "url"): + label = self.attrs.get('label', name) + output.append('
    %s ' % + (value.url, label, value.url, _('Change:'))) + output.append(super(AdminImageWidget, self).render(name, value, attrs, renderer)) + return mark_safe(u''.join(output)) + + +class ModelDetailPlugin(BaseAdminPlugin): + + def __init__(self, admin_view): + super(ModelDetailPlugin, self).__init__(admin_view) + self.include_image = False + + def get_field_attrs(self, attrs, db_field, **kwargs): + if isinstance(db_field, models.ImageField): + attrs['widget'] = AdminImageWidget + attrs['form_class'] = AdminImageField + self.include_image = True + return attrs + + def get_field_result(self, result, field_name): + if isinstance(result.field, models.ImageField): + if result.value: + img = getattr(result.obj, field_name) + result.text = mark_safe('' % (img.url, result.label, img.url)) + self.include_image = True + return result + + # Media + def get_media(self, media): + if self.include_image: + media = media + self.vendor('image-gallery.js', + 'image-gallery.css') + return media + + def block_before_fieldsets(self, context, node): + if self.include_image: + return '" + + def block_extrabody(self, context, node): + if self.include_image: + return get_gallery_modal() + + +class ModelListPlugin(BaseAdminPlugin): + + list_gallery = False + + def init_request(self, *args, **kwargs): + return bool(self.list_gallery) + + # Media + def get_media(self, media): + return media + self.vendor('image-gallery.js', 'image-gallery.css') + + def block_results_top(self, context, node): + return '" + + def block_extrabody(self, context, node): + return get_gallery_modal() + + +site.register_plugin(ModelDetailPlugin, DetailAdminView) +site.register_plugin(ModelDetailPlugin, ModelFormAdminView) +site.register_plugin(ModelListPlugin, ListAdminView) diff --git "a/8\343\200\201\346\226\207\347\214\256\346\225\260\346\215\256\346\214\226\346\216\230\347\263\273\347\273\237(\351\231\204\346\272\220\347\240\201)/extra_apps/xadmin/plugins/importexport.py" "b/8\343\200\201\346\226\207\347\214\256\346\225\260\346\215\256\346\214\226\346\216\230\347\263\273\347\273\237(\351\231\204\346\272\220\347\240\201)/extra_apps/xadmin/plugins/importexport.py" new file mode 100644 index 0000000..507ae5e --- /dev/null +++ "b/8\343\200\201\346\226\207\347\214\256\346\225\260\346\215\256\346\214\226\346\216\230\347\263\273\347\273\237(\351\231\204\346\272\220\347\240\201)/extra_apps/xadmin/plugins/importexport.py" @@ -0,0 +1,462 @@ +#!/usr/bin/env python +# encoding=utf-8 +""" +Author:zcyuefan +Topic:django-import-export plugin for xadmin to help importing and exporting data using .csv/.xls/.../.json files + +Use: ++++ settings.py +++ +INSTALLED_APPS = ( + ... + 'import_export', +) + ++++ model.py +++ +from django.db import models + +class Foo(models.Model): + name = models.CharField(max_length=64) + description = models.TextField() + ++++ adminx.py +++ +import xadmin +from import_export import resources +from .models import Foo + +class FooResource(resources.ModelResource): + + class Meta: + model = Foo + # fields = ('name', 'description',) + # exclude = () + + +@xadmin.sites.register(Foo) +class FooAdmin(object): + import_export_args = {'import_resource_class': FooResource, 'export_resource_class': FooResource} + +++++++++++++++++ +More info about django-import-export please refer https://github.com/django-import-export/django-import-export +""" +from datetime import datetime +from django.template import loader +from xadmin.plugins.utils import get_context_dict +from xadmin.sites import site +from xadmin.views import BaseAdminPlugin, ListAdminView, ModelAdminView +from xadmin.views.base import csrf_protect_m, filter_hook +from django.db import transaction +from import_export.admin import DEFAULT_FORMATS, SKIP_ADMIN_LOG, TMP_STORAGE_CLASS +from import_export.resources import modelresource_factory +from import_export.forms import ( + ImportForm, + ConfirmImportForm, + ExportForm, +) +from import_export.results import RowResult +from import_export.signals import post_export, post_import +try: + from django.utils.encoding import force_text +except ImportError: + from django.utils.encoding import force_unicode as force_text +from django.utils.translation import ugettext_lazy as _ +from django.template.response import TemplateResponse +from django.contrib.admin.models import LogEntry, ADDITION, CHANGE, DELETION +from django.contrib.contenttypes.models import ContentType +from django.contrib import messages +from django.urls.base import reverse +from django.core.exceptions import PermissionDenied +from django.http import HttpResponseRedirect, HttpResponse + + +class ImportMenuPlugin(BaseAdminPlugin): + import_export_args = {} + + def init_request(self, *args, **kwargs): + return bool(self.import_export_args.get('import_resource_class')) + + def block_top_toolbar(self, context, nodes): + has_change_perm = self.has_model_perm(self.model, 'change') + has_add_perm = self.has_model_perm(self.model, 'add') + if has_change_perm and has_add_perm: + model_info = (self.opts.app_label, self.opts.model_name) + import_url = reverse('xadmin:%s_%s_import' % model_info, current_app=self.admin_site.name) + context = get_context_dict(context or {}) # no error! + context.update({ + 'import_url': import_url, + }) + nodes.append(loader.render_to_string('xadmin/blocks/model_list.top_toolbar.importexport.import.html', + context=context)) + + +class ImportBaseView(ModelAdminView): + """ + """ + resource_class = None + import_export_args = {} + #: template for import view + import_template_name = 'xadmin/import_export/import.html' + #: resource class + #: available import formats + formats = DEFAULT_FORMATS + #: import data encoding + from_encoding = "utf-8" + skip_admin_log = None + # storage class for saving temporary files + tmp_storage_class = None + + def get_skip_admin_log(self): + if self.skip_admin_log is None: + return SKIP_ADMIN_LOG + else: + return self.skip_admin_log + + def get_tmp_storage_class(self): + if self.tmp_storage_class is None: + return TMP_STORAGE_CLASS + else: + return self.tmp_storage_class + + def get_resource_kwargs(self, request, *args, **kwargs): + return {} + + def get_import_resource_kwargs(self, request, *args, **kwargs): + return self.get_resource_kwargs(request, *args, **kwargs) + + def get_resource_class(self, usage): + if usage == 'import': + return self.import_export_args.get('import_resource_class') if self.import_export_args.get( + 'import_resource_class') else modelresource_factory(self.model) + elif usage == 'export': + return self.import_export_args.get('export_resource_class') if self.import_export_args.get( + 'export_resource_class') else modelresource_factory(self.model) + else: + return modelresource_factory(self.model) + + def get_import_resource_class(self): + """ + Returns ResourceClass to use for import. + """ + return self.process_import_resource(self.get_resource_class(usage='import')) + + def process_import_resource(self, resource): + """ + Returns processed ResourceClass to use for import. + Override to custom your own process + """ + return resource + + def get_import_formats(self): + """ + Returns available import formats. + """ + return [f for f in self.formats if f().can_import()] + + +class ImportView(ImportBaseView): + + def get_media(self): + media = super(ImportView, self).get_media() + media = media + self.vendor('xadmin.plugin.importexport.css') + return media + + @filter_hook + def get(self, request, *args, **kwargs): + if not (self.has_change_permission() and self.has_add_permission()): + raise PermissionDenied + + resource = self.get_import_resource_class()(**self.get_import_resource_kwargs(request, *args, **kwargs)) + + context = super(ImportView, self).get_context() + + import_formats = self.get_import_formats() + form = ImportForm(import_formats, + request.POST or None, + request.FILES or None) + + context['title'] = _("Import") + ' ' + self.opts.verbose_name + context['form'] = form + context['opts'] = self.model._meta + context['fields'] = [f.column_name for f in resource.get_user_visible_fields()] + + request.current_app = self.admin_site.name + return TemplateResponse(request, [self.import_template_name], + context) + + @filter_hook + @csrf_protect_m + @transaction.atomic + def post(self, request, *args, **kwargs): + """ + Perform a dry_run of the import to make sure the import will not + result in errors. If there where no error, save the user + uploaded file to a local temp file that will be used by + 'process_import' for the actual import. + """ + if not (self.has_change_permission() and self.has_add_permission()): + raise PermissionDenied + + resource = self.get_import_resource_class()(**self.get_import_resource_kwargs(request, *args, **kwargs)) + + context = super(ImportView, self).get_context() + + import_formats = self.get_import_formats() + form = ImportForm(import_formats, + request.POST or None, + request.FILES or None) + + if request.POST and form.is_valid(): + input_format = import_formats[ + int(form.cleaned_data['input_format']) + ]() + import_file = form.cleaned_data['import_file'] + # first always write the uploaded file to disk as it may be a + # memory file or else based on settings upload handlers + tmp_storage = self.get_tmp_storage_class()() + data = bytes() + for chunk in import_file.chunks(): + data += chunk + + tmp_storage.save(data, input_format.get_read_mode()) + + # then read the file, using the proper format-specific mode + # warning, big files may exceed memory + try: + data = tmp_storage.read(input_format.get_read_mode()) + if not input_format.is_binary() and self.from_encoding: + data = force_text(data, self.from_encoding) + dataset = input_format.create_dataset(data) + except UnicodeDecodeError as e: + return HttpResponse(_(u"

    Imported file has a wrong encoding: %s

    " % e)) + except Exception as e: + return HttpResponse(_(u"

    %s encountered while trying to read file: %s

    " % (type(e).__name__, + import_file.name))) + result = resource.import_data(dataset, dry_run=True, + raise_errors=False, + file_name=import_file.name, + user=request.user) + + context['result'] = result + + if not result.has_errors(): + context['confirm_form'] = ConfirmImportForm(initial={ + 'import_file_name': tmp_storage.name, + 'original_file_name': import_file.name, + 'input_format': form.cleaned_data['input_format'], + }) + + context['title'] = _("Import") + ' ' + self.opts.verbose_name + context['form'] = form + context['opts'] = self.model._meta + context['fields'] = [f.column_name for f in resource.get_user_visible_fields()] + + request.current_app = self.admin_site.name + return TemplateResponse(request, [self.import_template_name], + context) + + +class ImportProcessView(ImportBaseView): + + @filter_hook + @csrf_protect_m + @transaction.atomic + def post(self, request, *args, **kwargs): + """ + Perform the actual import action (after the user has confirmed he + wishes to import) + """ + resource = self.get_import_resource_class()(**self.get_import_resource_kwargs(request, *args, **kwargs)) + + confirm_form = ConfirmImportForm(request.POST) + if confirm_form.is_valid(): + import_formats = self.get_import_formats() + input_format = import_formats[ + int(confirm_form.cleaned_data['input_format']) + ]() + tmp_storage = self.get_tmp_storage_class()(name=confirm_form.cleaned_data['import_file_name']) + data = tmp_storage.read(input_format.get_read_mode()) + if not input_format.is_binary() and self.from_encoding: + data = force_text(data, self.from_encoding) + dataset = input_format.create_dataset(data) + + result = resource.import_data(dataset, dry_run=False, + raise_errors=True, + file_name=confirm_form.cleaned_data['original_file_name'], + user=request.user) + + if not self.get_skip_admin_log(): + # Add imported objects to LogEntry + logentry_map = { + RowResult.IMPORT_TYPE_NEW: ADDITION, + RowResult.IMPORT_TYPE_UPDATE: CHANGE, + RowResult.IMPORT_TYPE_DELETE: DELETION, + } + content_type_id = ContentType.objects.get_for_model(self.model).pk + for row in result: + if row.import_type != row.IMPORT_TYPE_ERROR and row.import_type != row.IMPORT_TYPE_SKIP: + LogEntry.objects.log_action( + user_id=request.user.pk, + content_type_id=content_type_id, + object_id=row.object_id, + object_repr=row.object_repr, + action_flag=logentry_map[row.import_type], + change_message="%s through import_export" % row.import_type, + ) + success_message = str(_(u'Import finished')) + ' , ' + str(_(u'Add')) + ' : %d' % result.totals[ + RowResult.IMPORT_TYPE_NEW] + ' , ' + str(_(u'Update')) + ' : %d' % result.totals[ + RowResult.IMPORT_TYPE_UPDATE] + + messages.success(request, success_message) + tmp_storage.remove() + + post_import.send(sender=None, model=self.model) + model_info = (self.opts.app_label, self.opts.model_name) + url = reverse('xadmin:%s_%s_changelist' % model_info, + current_app=self.admin_site.name) + return HttpResponseRedirect(url) + + +class ExportMixin(object): + #: resource class + resource_class = None + #: template for change_list view + change_list_template = None + import_export_args = {} + #: template for export view + # export_template_name = 'xadmin/import_export/export.html' + #: available export formats + formats = DEFAULT_FORMATS + #: export data encoding + to_encoding = "utf-8" + list_select_related = None + + def get_resource_kwargs(self, request, *args, **kwargs): + return {} + + def get_export_resource_kwargs(self, request, *args, **kwargs): + return self.get_resource_kwargs(request, *args, **kwargs) + + def get_resource_class(self, usage): + if usage == 'import': + return self.import_export_args.get('import_resource_class') if self.import_export_args.get( + 'import_resource_class') else modelresource_factory(self.model) + elif usage == 'export': + return self.import_export_args.get('export_resource_class') if self.import_export_args.get( + 'export_resource_class') else modelresource_factory(self.model) + else: + return modelresource_factory(self.model) + + def get_export_resource_class(self): + """ + Returns ResourceClass to use for export. + """ + return self.get_resource_class(usage='export') + + def get_export_formats(self): + """ + Returns available export formats. + """ + return [f for f in self.formats if f().can_export()] + + def get_export_filename(self, file_format): + date_str = datetime.now().strftime('%Y-%m-%d-%H%M%S') + filename = "%s-%s.%s" % (self.opts.verbose_name.encode('utf-8'), + date_str, + file_format.get_extension()) + return filename + + def get_export_queryset(self, request, context): + """ + Returns export queryset. + + Default implementation respects applied search and filters. + """ + # scope = self.request.POST.get('_select_across', False) == '1' + scope = request.GET.get('scope') + select_across = request.GET.get('_select_across', False) == '1' + selected = request.GET.get('_selected_actions', '') + if scope == 'all': + queryset = self.admin_view.queryset() + elif scope == 'header_only': + queryset = [] + elif scope == 'selected': + if not select_across: + selected_pk = selected.split(',') + queryset = self.admin_view.queryset().filter(pk__in=selected_pk) + else: + queryset = self.admin_view.queryset() + else: + queryset = [r['object'] for r in context['results']] + return queryset + + def get_export_data(self, file_format, queryset, *args, **kwargs): + """ + Returns file_format representation for given queryset. + """ + request = kwargs.pop("request") + resource_class = self.get_export_resource_class() + data = resource_class(**self.get_export_resource_kwargs(request)).export(queryset, *args, **kwargs) + export_data = file_format.export_data(data) + return export_data + + +class ExportMenuPlugin(ExportMixin, BaseAdminPlugin): + import_export_args = {} + + # Media + def get_media(self, media): + return media + self.vendor('xadmin.plugin.importexport.css', 'xadmin.plugin.importexport.js') + + def init_request(self, *args, **kwargs): + return bool(self.import_export_args.get('export_resource_class')) + + def block_top_toolbar(self, context, nodes): + formats = self.get_export_formats() + form = ExportForm(formats) + + context = get_context_dict(context or {}) # no error! + context.update({ + 'form': form, + 'opts': self.opts, + 'form_params': self.admin_view.get_form_params({'_action_': 'export'}), + }) + nodes.append(loader.render_to_string('xadmin/blocks/model_list.top_toolbar.importexport.export.html', + context=context)) + + +class ExportPlugin(ExportMixin, BaseAdminPlugin): + + def init_request(self, *args, **kwargs): + return self.request.GET.get('_action_') == 'export' + + def get_response(self, response, context, *args, **kwargs): + has_view_perm = self.has_model_perm(self.model, 'view') + if not has_view_perm: + raise PermissionDenied + + export_format = self.request.GET.get('file_format') + + if not export_format: + messages.warning(self.request, _('You must select an export format.')) + else: + formats = self.get_export_formats() + file_format = formats[int(export_format)]() + queryset = self.get_export_queryset(self.request, context) + export_data = self.get_export_data(file_format, queryset, request=self.request) + content_type = file_format.get_content_type() + # Django 1.7 uses the content_type kwarg instead of mimetype + try: + response = HttpResponse(export_data, content_type=content_type) + except TypeError: + response = HttpResponse(export_data, mimetype=content_type) + response['Content-Disposition'] = 'attachment; filename=%s' % ( + self.get_export_filename(file_format), + ) + post_export.send(sender=None, model=self.model) + return response + + +site.register_modelview(r'^import/$', ImportView, name='%s_%s_import') +site.register_modelview(r'^process_import/$', ImportProcessView, name='%s_%s_process_import') +site.register_plugin(ImportMenuPlugin, ListAdminView) +site.register_plugin(ExportMenuPlugin, ListAdminView) +site.register_plugin(ExportPlugin, ListAdminView) diff --git "a/8\343\200\201\346\226\207\347\214\256\346\225\260\346\215\256\346\214\226\346\216\230\347\263\273\347\273\237(\351\231\204\346\272\220\347\240\201)/extra_apps/xadmin/plugins/inline.py" "b/8\343\200\201\346\226\207\347\214\256\346\225\260\346\215\256\346\214\226\346\216\230\347\263\273\347\273\237(\351\231\204\346\272\220\347\240\201)/extra_apps/xadmin/plugins/inline.py" new file mode 100644 index 0000000..c959285 --- /dev/null +++ "b/8\343\200\201\346\226\207\347\214\256\346\225\260\346\215\256\346\214\226\346\216\230\347\263\273\347\273\237(\351\231\204\346\272\220\347\240\201)/extra_apps/xadmin/plugins/inline.py" @@ -0,0 +1,491 @@ +import copy +import inspect +from django import forms +from django.forms.formsets import all_valid, DELETION_FIELD_NAME +from django.forms.models import inlineformset_factory, BaseInlineFormSet, modelform_defines_fields +from django.contrib.contenttypes.forms import BaseGenericInlineFormSet, generic_inlineformset_factory +from django.template import loader +from django.template.loader import render_to_string +from django.contrib.auth import get_permission_codename +from django.utils import six +from django.utils.encoding import smart_text +from crispy_forms.utils import TEMPLATE_PACK + +from xadmin.layout import FormHelper, Layout, flatatt, Container, Column, Field, Fieldset +from xadmin.plugins.utils import get_context_dict +from xadmin.sites import site +from xadmin.views import BaseAdminPlugin, ModelFormAdminView, DetailAdminView, filter_hook + + +class ShowField(Field): + template = "xadmin/layout/field_value.html" + + def __init__(self, admin_view, *args, **kwargs): + super(ShowField, self).__init__(*args, **kwargs) + self.admin_view = admin_view + if admin_view.style == 'table': + self.template = "xadmin/layout/field_value_td.html" + + def render(self, form, form_style, context, template_pack=TEMPLATE_PACK, **kwargs): + html = '' + detail = form.detail + for field in self.fields: + if not isinstance(form.fields[field].widget, forms.HiddenInput): + result = detail.get_field_result(field) + html += loader.render_to_string( + self.template, context={'field': form[field], 'result': result}) + return html + + +class DeleteField(Field): + + def render(self, form, form_style, context, template_pack=TEMPLATE_PACK, **kwargs): + if form.instance.pk: + self.attrs['type'] = 'hidden' + return super(DeleteField, self).render(form, form_style, context, template_pack=TEMPLATE_PACK, **kwargs) + else: + return "" + + +class TDField(Field): + template = "xadmin/layout/td-field.html" + + +class InlineStyleManager(object): + inline_styles = {} + + def register_style(self, name, style): + self.inline_styles[name] = style + + def get_style(self, name='stacked'): + return self.inline_styles.get(name) + +style_manager = InlineStyleManager() + + +class InlineStyle(object): + template = 'xadmin/edit_inline/stacked.html' + + def __init__(self, view, formset): + self.view = view + self.formset = formset + + def update_layout(self, helper): + pass + + def get_attrs(self): + return {} +style_manager.register_style('stacked', InlineStyle) + + +class OneInlineStyle(InlineStyle): + template = 'xadmin/edit_inline/one.html' +style_manager.register_style("one", OneInlineStyle) + + +class AccInlineStyle(InlineStyle): + template = 'xadmin/edit_inline/accordion.html' +style_manager.register_style("accordion", AccInlineStyle) + + +class TabInlineStyle(InlineStyle): + template = 'xadmin/edit_inline/tab.html' +style_manager.register_style("tab", TabInlineStyle) + + +class TableInlineStyle(InlineStyle): + template = 'xadmin/edit_inline/tabular.html' + + def update_layout(self, helper): + helper.add_layout( + Layout(*[TDField(f) for f in self.formset[0].fields.keys()])) + + def get_attrs(self): + fields = [] + readonly_fields = [] + if len(self.formset): + fields = [f for k, f in self.formset[0].fields.items() if k != DELETION_FIELD_NAME] + readonly_fields = [f for f in getattr(self.formset[0], 'readonly_fields', [])] + return { + 'fields': fields, + 'readonly_fields': readonly_fields + } +style_manager.register_style("table", TableInlineStyle) + + +def replace_field_to_value(layout, av): + if layout: + cls_str = str if six.PY3 else basestring + for i, lo in enumerate(layout.fields): + if isinstance(lo, Field) or issubclass(lo.__class__, Field): + layout.fields[i] = ShowField(av, *lo.fields, **lo.attrs) + elif isinstance(lo, cls_str): + layout.fields[i] = ShowField(av, lo) + elif hasattr(lo, 'get_field_names'): + replace_field_to_value(lo, av) + + +class InlineModelAdmin(ModelFormAdminView): + + fk_name = None + formset = BaseInlineFormSet + extra = 3 + max_num = None + can_delete = True + fields = [] + admin_view = None + style = 'stacked' + + def init(self, admin_view): + self.admin_view = admin_view + self.parent_model = admin_view.model + self.org_obj = getattr(admin_view, 'org_obj', None) + self.model_instance = self.org_obj or admin_view.model() + + return self + + @filter_hook + def get_formset(self, **kwargs): + """Returns a BaseInlineFormSet class for use in admin add/change views.""" + if self.exclude is None: + exclude = [] + else: + exclude = list(self.exclude) + exclude.extend(self.get_readonly_fields()) + if self.exclude is None and hasattr(self.form, '_meta') and self.form._meta.exclude: + # Take the custom ModelForm's Meta.exclude into account only if the + # InlineModelAdmin doesn't define its own. + exclude.extend(self.form._meta.exclude) + # if exclude is an empty list we use None, since that's the actual + # default + exclude = exclude or None + can_delete = self.can_delete and self.has_delete_permission() + defaults = { + "form": self.form, + "formset": self.formset, + "fk_name": self.fk_name, + 'fields': forms.ALL_FIELDS, + "exclude": exclude, + "formfield_callback": self.formfield_for_dbfield, + "extra": self.extra, + "max_num": self.max_num, + "can_delete": can_delete, + } + defaults.update(kwargs) + + return inlineformset_factory(self.parent_model, self.model, **defaults) + + @filter_hook + def instance_form(self, **kwargs): + formset = self.get_formset(**kwargs) + attrs = { + 'instance': self.model_instance, + 'queryset': self.queryset() + } + if self.request_method == 'post': + attrs.update({ + 'data': self.request.POST, 'files': self.request.FILES, + 'save_as_new': "_saveasnew" in self.request.POST + }) + instance = formset(**attrs) + instance.view = self + + helper = FormHelper() + helper.form_tag = False + helper.include_media = False + # override form method to prevent render csrf_token in inline forms, see template 'bootstrap/whole_uni_form.html' + helper.form_method = 'get' + + style = style_manager.get_style( + 'one' if self.max_num == 1 else self.style)(self, instance) + style.name = self.style + + if len(instance): + layout = copy.deepcopy(self.form_layout) + + if layout is None: + layout = Layout(*instance[0].fields.keys()) + elif type(layout) in (list, tuple) and len(layout) > 0: + layout = Layout(*layout) + + rendered_fields = [i[1] for i in layout.get_field_names()] + layout.extend([f for f in instance[0] + .fields.keys() if f not in rendered_fields]) + + helper.add_layout(layout) + style.update_layout(helper) + + # replace delete field with Dynamic field, for hidden delete field when instance is NEW. + helper[DELETION_FIELD_NAME].wrap(DeleteField) + + instance.helper = helper + instance.style = style + + readonly_fields = self.get_readonly_fields() + if readonly_fields: + for form in instance: + form.readonly_fields = [] + inst = form.save(commit=False) + if inst: + meta_field_names = [field.name for field in inst._meta.get_fields()] + for readonly_field in readonly_fields: + value = None + label = None + if readonly_field in meta_field_names: + label = inst._meta.get_field(readonly_field).verbose_name + value = smart_text(getattr(inst, readonly_field)) + elif inspect.ismethod(getattr(inst, readonly_field, None)): + value = getattr(inst, readonly_field)() + label = getattr(getattr(inst, readonly_field), 'short_description', readonly_field) + elif inspect.ismethod(getattr(self, readonly_field, None)): + value = getattr(self, readonly_field)(inst) + label = getattr(getattr(self, readonly_field), 'short_description', readonly_field) + if value: + form.readonly_fields.append({'label': label, 'contents': value}) + return instance + + def has_auto_field(self, form): + if form._meta.model._meta.has_auto_field: + return True + for parent in form._meta.model._meta.get_parent_list(): + if parent._meta.has_auto_field: + return True + return False + + def queryset(self): + queryset = super(InlineModelAdmin, self).queryset() + if not self.has_change_permission() and not self.has_view_permission(): + queryset = queryset.none() + return queryset + + def has_add_permission(self): + if self.opts.auto_created: + return self.has_change_permission() + + codename = get_permission_codename('add', self.opts) + return self.user.has_perm("%s.%s" % (self.opts.app_label, codename)) + + def has_change_permission(self): + opts = self.opts + if opts.auto_created: + for field in opts.fields: + if field.remote_field and field.remote_field.model != self.parent_model: + opts = field.remote_field.model._meta + break + + codename = get_permission_codename('change', opts) + return self.user.has_perm("%s.%s" % (opts.app_label, codename)) + + def has_delete_permission(self): + if self.opts.auto_created: + return self.has_change_permission() + + codename = get_permission_codename('delete', self.opts) + return self.user.has_perm("%s.%s" % (self.opts.app_label, codename)) + + +class GenericInlineModelAdmin(InlineModelAdmin): + ct_field = "content_type" + ct_fk_field = "object_id" + + formset = BaseGenericInlineFormSet + + def get_formset(self, **kwargs): + if self.exclude is None: + exclude = [] + else: + exclude = list(self.exclude) + exclude.extend(self.get_readonly_fields()) + if self.exclude is None and hasattr(self.form, '_meta') and self.form._meta.exclude: + # Take the custom ModelForm's Meta.exclude into account only if the + # GenericInlineModelAdmin doesn't define its own. + exclude.extend(self.form._meta.exclude) + exclude = exclude or None + can_delete = self.can_delete and self.has_delete_permission() + defaults = { + "ct_field": self.ct_field, + "fk_field": self.ct_fk_field, + "form": self.form, + "formfield_callback": self.formfield_for_dbfield, + "formset": self.formset, + "extra": self.extra, + "can_delete": can_delete, + "can_order": False, + "max_num": self.max_num, + "exclude": exclude, + 'fields': forms.ALL_FIELDS + } + defaults.update(kwargs) + + return generic_inlineformset_factory(self.model, **defaults) + + +class InlineFormset(Fieldset): + + def __init__(self, formset, allow_blank=False, **kwargs): + self.fields = [] + self.css_class = kwargs.pop('css_class', '') + self.css_id = "%s-group" % formset.prefix + self.template = formset.style.template + self.inline_style = formset.style.name + if allow_blank and len(formset) == 0: + self.template = 'xadmin/edit_inline/blank.html' + self.inline_style = 'blank' + self.formset = formset + self.model = formset.model + self.opts = formset.model._meta + self.flat_attrs = flatatt(kwargs) + self.extra_attrs = formset.style.get_attrs() + + def render(self, form, form_style, context, template_pack=TEMPLATE_PACK, **kwargs): + context = get_context_dict(context) + context.update(dict( + formset=self, + prefix=self.formset.prefix, + inline_style=self.inline_style, + **self.extra_attrs + )) + return render_to_string(self.template, context) + + +class Inline(Fieldset): + + def __init__(self, rel_model): + self.model = rel_model + self.fields = [] + super(Inline, self).__init__(legend="") + + def render(self, form, form_style, context, template_pack=TEMPLATE_PACK, **kwargs): + return "" + + +def get_first_field(layout, clz): + for layout_object in layout.fields: + if issubclass(layout_object.__class__, clz): + return layout_object + elif hasattr(layout_object, 'get_field_names'): + gf = get_first_field(layout_object, clz) + if gf: + return gf + + +def replace_inline_objects(layout, fs): + if not fs: + return + for i, layout_object in enumerate(layout.fields): + if isinstance(layout_object, Inline) and layout_object.model in fs: + layout.fields[i] = fs.pop(layout_object.model) + elif hasattr(layout_object, 'get_field_names'): + replace_inline_objects(layout_object, fs) + + +class InlineFormsetPlugin(BaseAdminPlugin): + inlines = [] + + @property + def inline_instances(self): + if not hasattr(self, '_inline_instances'): + inline_instances = [] + for inline_class in self.inlines: + inline = self.admin_view.get_view( + (getattr(inline_class, 'generic_inline', False) and GenericInlineModelAdmin or InlineModelAdmin), + inline_class).init(self.admin_view) + if not (inline.has_add_permission() or + inline.has_change_permission() or + inline.has_delete_permission() or + inline.has_view_permission()): + continue + if not inline.has_add_permission(): + inline.max_num = 0 + inline_instances.append(inline) + self._inline_instances = inline_instances + + return self._inline_instances + + def instance_forms(self, ret): + self.formsets = [] + for inline in self.inline_instances: + if inline.has_change_permission(): + self.formsets.append(inline.instance_form()) + else: + self.formsets.append(self._get_detail_formset_instance(inline)) + self.admin_view.formsets = self.formsets + + def valid_forms(self, result): + return all_valid(self.formsets) and result + + def save_related(self): + for formset in self.formsets: + formset.instance = self.admin_view.new_obj + formset.save() + + def get_context(self, context): + context['inline_formsets'] = self.formsets + return context + + def get_error_list(self, errors): + for fs in self.formsets: + errors.extend(fs.non_form_errors()) + for errors_in_inline_form in fs.errors: + errors.extend(errors_in_inline_form.values()) + return errors + + def get_form_layout(self, layout): + allow_blank = isinstance(self.admin_view, DetailAdminView) + # fixed #176 bug, change dict to list + fs = [(f.model, InlineFormset(f, allow_blank)) for f in self.formsets] + replace_inline_objects(layout, fs) + + if fs: + container = get_first_field(layout, Column) + if not container: + container = get_first_field(layout, Container) + if not container: + container = layout + + # fixed #176 bug, change dict to list + for key, value in fs: + container.append(value) + + return layout + + def get_media(self, media): + for fs in self.formsets: + media = media + fs.media + if self.formsets: + media = media + self.vendor( + 'xadmin.plugin.formset.js', 'xadmin.plugin.formset.css') + return media + + def _get_detail_formset_instance(self, inline): + formset = inline.instance_form(extra=0, max_num=0, can_delete=0) + formset.detail_page = True + if True: + replace_field_to_value(formset.helper.layout, inline) + model = inline.model + opts = model._meta + fake_admin_class = type(str('%s%sFakeAdmin' % (opts.app_label, opts.model_name)), (object, ), {'model': model}) + for form in formset.forms: + instance = form.instance + if instance.pk: + form.detail = self.get_view( + DetailAdminUtil, fake_admin_class, instance) + return formset + + +class DetailAdminUtil(DetailAdminView): + + def init_request(self, obj): + self.obj = obj + self.org_obj = obj + + +class DetailInlineFormsetPlugin(InlineFormsetPlugin): + + def get_model_form(self, form, **kwargs): + self.formsets = [self._get_detail_formset_instance( + inline) for inline in self.inline_instances] + return form + +site.register_plugin(InlineFormsetPlugin, ModelFormAdminView) +site.register_plugin(DetailInlineFormsetPlugin, DetailAdminView) diff --git "a/8\343\200\201\346\226\207\347\214\256\346\225\260\346\215\256\346\214\226\346\216\230\347\263\273\347\273\237(\351\231\204\346\272\220\347\240\201)/extra_apps/xadmin/plugins/language.py" "b/8\343\200\201\346\226\207\347\214\256\346\225\260\346\215\256\346\214\226\346\216\230\347\263\273\347\273\237(\351\231\204\346\272\220\347\240\201)/extra_apps/xadmin/plugins/language.py" new file mode 100644 index 0000000..7c73b9d --- /dev/null +++ "b/8\343\200\201\346\226\207\347\214\256\346\225\260\346\215\256\346\214\226\346\216\230\347\263\273\347\273\237(\351\231\204\346\272\220\347\240\201)/extra_apps/xadmin/plugins/language.py" @@ -0,0 +1,27 @@ + +from django.conf import settings +from django.template import loader +from django.views.i18n import set_language +from xadmin.plugins.utils import get_context_dict +from xadmin.sites import site +from xadmin.views import BaseAdminPlugin, CommAdminView, BaseAdminView + + +class SetLangNavPlugin(BaseAdminPlugin): + + def block_top_navmenu(self, context, nodes): + context = get_context_dict(context) + context['redirect_to'] = self.request.get_full_path() + nodes.append(loader.render_to_string('xadmin/blocks/comm.top.setlang.html', context=context)) + + +class SetLangView(BaseAdminView): + + def post(self, request, *args, **kwargs): + if 'nav_menu' in request.session: + del request.session['nav_menu'] + return set_language(request) + +if settings.LANGUAGES and 'django.middleware.locale.LocaleMiddleware' in settings.MIDDLEWARE: + site.register_plugin(SetLangNavPlugin, CommAdminView) + site.register_view(r'^i18n/setlang/$', SetLangView, 'set_language') diff --git "a/8\343\200\201\346\226\207\347\214\256\346\225\260\346\215\256\346\214\226\346\216\230\347\263\273\347\273\237(\351\231\204\346\272\220\347\240\201)/extra_apps/xadmin/plugins/layout.py" "b/8\343\200\201\346\226\207\347\214\256\346\225\260\346\215\256\346\214\226\346\216\230\347\263\273\347\273\237(\351\231\204\346\272\220\347\240\201)/extra_apps/xadmin/plugins/layout.py" new file mode 100644 index 0000000..dd4f566 --- /dev/null +++ "b/8\343\200\201\346\226\207\347\214\256\346\225\260\346\215\256\346\214\226\346\216\230\347\263\273\347\273\237(\351\231\204\346\272\220\347\240\201)/extra_apps/xadmin/plugins/layout.py" @@ -0,0 +1,81 @@ +# coding=utf-8 +from django.template import loader +from django.utils.translation import ugettext_lazy as _ + +from xadmin.plugins.utils import get_context_dict +from xadmin.sites import site +from xadmin.views import BaseAdminPlugin, ListAdminView +from xadmin.util import label_for_field + +LAYOUT_VAR = '_layout' + +DEFAULT_LAYOUTS = { + 'table': { + 'key': 'table', + 'icon': 'fa fa-table', + 'name': _(u'Table'), + 'template': 'views/model_list.html', + }, + 'thumbnails': { + 'key': 'thumbnails', + 'icon': 'fa fa-th-large', + 'name': _(u'Thumbnails'), + 'template': 'grids/thumbnails.html', + }, +} + + +class GridLayoutPlugin(BaseAdminPlugin): + + grid_layouts = [] + + _active_layouts = [] + _current_layout = None + _current_icon = 'table' + + def get_layout(self, l): + item = (type(l) is dict) and l or DEFAULT_LAYOUTS[l] + return dict({'url': self.admin_view.get_query_string({LAYOUT_VAR: item['key']}), 'selected': False}, **item) + + def init_request(self, *args, **kwargs): + active = bool(self.request.method == 'GET' and self.grid_layouts) + if active: + layouts = (type(self.grid_layouts) in (list, tuple)) and self.grid_layouts or (self.grid_layouts,) + self._active_layouts = [self.get_layout(l) for l in layouts] + self._current_layout = self.request.GET.get(LAYOUT_VAR, self._active_layouts[0]['key']) + for layout in self._active_layouts: + if self._current_layout == layout['key']: + self._current_icon = layout['icon'] + layout['selected'] = True + self.admin_view.object_list_template = self.admin_view.get_template_list(layout['template']) + return active + + def result_item(self, item, obj, field_name, row): + if self._current_layout == 'thumbnails': + if getattr(item.attr, 'is_column', True): + item.field_label = label_for_field( + field_name, self.model, + model_admin=self.admin_view, + return_attr=False + ) + if getattr(item.attr, 'thumbnail_img', False): + setattr(item, 'thumbnail_hidden', True) + row['thumbnail_img'] = item + elif item.is_display_link: + setattr(item, 'thumbnail_hidden', True) + row['thumbnail_label'] = item + + return item + + # Block Views + def block_top_toolbar(self, context, nodes): + if len(self._active_layouts) > 1: + context.update({ + 'layouts': self._active_layouts, + 'current_icon': self._current_icon, + }) + nodes.append(loader.render_to_string('xadmin/blocks/model_list.top_toolbar.layouts.html', + context=get_context_dict(context))) + + +site.register_plugin(GridLayoutPlugin, ListAdminView) diff --git "a/8\343\200\201\346\226\207\347\214\256\346\225\260\346\215\256\346\214\226\346\216\230\347\263\273\347\273\237(\351\231\204\346\272\220\347\240\201)/extra_apps/xadmin/plugins/mobile.py" "b/8\343\200\201\346\226\207\347\214\256\346\225\260\346\215\256\346\214\226\346\216\230\347\263\273\347\273\237(\351\231\204\346\272\220\347\240\201)/extra_apps/xadmin/plugins/mobile.py" new file mode 100644 index 0000000..4c6a566 --- /dev/null +++ "b/8\343\200\201\346\226\207\347\214\256\346\225\260\346\215\256\346\214\226\346\216\230\347\263\273\347\273\237(\351\231\204\346\272\220\347\240\201)/extra_apps/xadmin/plugins/mobile.py" @@ -0,0 +1,30 @@ +#coding:utf-8 +from xadmin.sites import site +from xadmin.views import BaseAdminPlugin, CommAdminView + + +class MobilePlugin(BaseAdminPlugin): + + def _test_mobile(self): + try: + return self.request.META['HTTP_USER_AGENT'].find('Android') >= 0 or \ + self.request.META['HTTP_USER_AGENT'].find('iPhone') >= 0 + except Exception: + return False + + def init_request(self, *args, **kwargs): + return self._test_mobile() + + def get_context(self, context): + #context['base_template'] = 'xadmin/base_mobile.html' + context['is_mob'] = True + return context + + # Media + # def get_media(self, media): + # return media + self.vendor('xadmin.mobile.css', ) + + def block_extrahead(self, context, nodes): + nodes.append('') + +site.register_plugin(MobilePlugin, CommAdminView) diff --git "a/8\343\200\201\346\226\207\347\214\256\346\225\260\346\215\256\346\214\226\346\216\230\347\263\273\347\273\237(\351\231\204\346\272\220\347\240\201)/extra_apps/xadmin/plugins/multiselect.py" "b/8\343\200\201\346\226\207\347\214\256\346\225\260\346\215\256\346\214\226\346\216\230\347\263\273\347\273\237(\351\231\204\346\272\220\347\240\201)/extra_apps/xadmin/plugins/multiselect.py" new file mode 100644 index 0000000..0681af8 --- /dev/null +++ "b/8\343\200\201\346\226\207\347\214\256\346\225\260\346\215\256\346\214\226\346\216\230\347\263\273\347\273\237(\351\231\204\346\272\220\347\240\201)/extra_apps/xadmin/plugins/multiselect.py" @@ -0,0 +1,107 @@ +# coding:utf-8 +from itertools import chain + +import xadmin +from django import forms +from django.db.models import ManyToManyField +from django.forms.utils import flatatt +from django.template import loader +from django.utils.encoding import force_text +from django.utils.html import escape, conditional_escape +from django.utils.safestring import mark_safe +from xadmin.util import vendor +from xadmin.views import BaseAdminPlugin, ModelFormAdminView + + +class SelectMultipleTransfer(forms.SelectMultiple): + + @property + def media(self): + return vendor('xadmin.widget.select-transfer.js', 'xadmin.widget.select-transfer.css') + + def __init__(self, verbose_name, is_stacked, attrs=None, choices=()): + self.verbose_name = verbose_name + self.is_stacked = is_stacked + super(SelectMultipleTransfer, self).__init__(attrs, choices) + + def render_opt(self, selected_choices, option_value, option_label): + option_value = force_text(option_value) + return u'' % ( + escape(option_value), conditional_escape(force_text(option_label))), bool(option_value in selected_choices) + + def render(self, name, value, attrs=None, choices=()): + if attrs is None: + attrs = {} + attrs['class'] = '' + if self.is_stacked: + attrs['class'] += 'stacked' + if value is None: + value = [] + final_attrs = self.build_attrs(attrs, extra_attrs={'name': name}) + + selected_choices = set(force_text(v) for v in value) + available_output = [] + chosen_output = [] + + for option_value, option_label in chain(self.choices, choices): + if isinstance(option_label, (list, tuple)): + available_output.append(u'' % + escape(force_text(option_value))) + for option in option_label: + output, selected = self.render_opt( + selected_choices, *option) + if selected: + chosen_output.append(output) + else: + available_output.append(output) + available_output.append(u'') + else: + output, selected = self.render_opt( + selected_choices, option_value, option_label) + if selected: + chosen_output.append(output) + else: + available_output.append(output) + + context = { + 'verbose_name': self.verbose_name, + 'attrs': attrs, + 'field_id': attrs['id'], + 'flatatts': flatatt(final_attrs), + 'available_options': u'\n'.join(available_output), + 'chosen_options': u'\n'.join(chosen_output), + } + return mark_safe(loader.render_to_string('xadmin/forms/transfer.html', context)) + + +class SelectMultipleDropdown(forms.SelectMultiple): + + @property + def media(self): + return vendor('multiselect.js', 'multiselect.css', 'xadmin.widget.multiselect.js') + + def render(self, name, value, attrs=None, choices=()): + if attrs is None: + attrs = {} + attrs['class'] = 'selectmultiple selectdropdown' + return super(SelectMultipleDropdown, self).render(name, value, attrs, choices) + + +class M2MSelectPlugin(BaseAdminPlugin): + + def init_request(self, *args, **kwargs): + return hasattr(self.admin_view, 'style_fields') and \ + ( + 'm2m_transfer' in self.admin_view.style_fields.values() or + 'm2m_dropdown' in self.admin_view.style_fields.values() + ) + + def get_field_style(self, attrs, db_field, style, **kwargs): + if style == 'm2m_transfer' and isinstance(db_field, ManyToManyField): + return {'widget': SelectMultipleTransfer(db_field.verbose_name, False), 'help_text': ''} + if style == 'm2m_dropdown' and isinstance(db_field, ManyToManyField): + return {'widget': SelectMultipleDropdown, 'help_text': ''} + return attrs + + +xadmin.site.register_plugin(M2MSelectPlugin, ModelFormAdminView) diff --git "a/8\343\200\201\346\226\207\347\214\256\346\225\260\346\215\256\346\214\226\346\216\230\347\263\273\347\273\237(\351\231\204\346\272\220\347\240\201)/extra_apps/xadmin/plugins/passwords.py" "b/8\343\200\201\346\226\207\347\214\256\346\225\260\346\215\256\346\214\226\346\216\230\347\263\273\347\273\237(\351\231\204\346\272\220\347\240\201)/extra_apps/xadmin/plugins/passwords.py" new file mode 100644 index 0000000..a5f3eeb --- /dev/null +++ "b/8\343\200\201\346\226\207\347\214\256\346\225\260\346\215\256\346\214\226\346\216\230\347\263\273\347\273\237(\351\231\204\346\272\220\347\240\201)/extra_apps/xadmin/plugins/passwords.py" @@ -0,0 +1,115 @@ +# coding=utf-8 +from django.contrib.auth.forms import PasswordResetForm, SetPasswordForm +from django.contrib.auth.tokens import default_token_generator +from django.contrib.auth.views import PasswordResetConfirmView as password_reset_confirm +from django.template.response import TemplateResponse +from django.utils.translation import ugettext as _ + +from xadmin.sites import site +from xadmin.views.base import BaseAdminPlugin, BaseAdminView, csrf_protect_m +from xadmin.views.website import LoginView + + +class ResetPasswordSendView(BaseAdminView): + + need_site_permission = False + + password_reset_form = PasswordResetForm + password_reset_template = 'xadmin/auth/password_reset/form.html' + password_reset_done_template = 'xadmin/auth/password_reset/done.html' + password_reset_token_generator = default_token_generator + + password_reset_from_email = None + password_reset_email_template = 'xadmin/auth/password_reset/email.html' + password_reset_subject_template = None + + def get(self, request, *args, **kwargs): + context = super(ResetPasswordSendView, self).get_context() + context['form'] = kwargs.get('form', self.password_reset_form()) + + return TemplateResponse(request, self.password_reset_template, context) + + @csrf_protect_m + def post(self, request, *args, **kwargs): + form = self.password_reset_form(request.POST) + + if form.is_valid(): + opts = { + 'use_https': request.is_secure(), + 'token_generator': self.password_reset_token_generator, + 'email_template_name': self.password_reset_email_template, + 'request': request, + 'domain_override': request.get_host() + } + + if self.password_reset_from_email: + opts['from_email'] = self.password_reset_from_email + if self.password_reset_subject_template: + opts['subject_template_name'] = self.password_reset_subject_template + + form.save(**opts) + context = super(ResetPasswordSendView, self).get_context() + return TemplateResponse(request, self.password_reset_done_template, context) + else: + return self.get(request, form=form) + + +site.register_view(r'^xadmin/password_reset/$', ResetPasswordSendView, name='xadmin_password_reset') + + +class ResetLinkPlugin(BaseAdminPlugin): + + def block_form_bottom(self, context, nodes): + reset_link = self.get_admin_url('xadmin_password_reset') + return '' % (reset_link, _('Forgotten your password or username?')) + + +site.register_plugin(ResetLinkPlugin, LoginView) + + +class ResetPasswordComfirmView(BaseAdminView): + + need_site_permission = False + + password_reset_set_form = SetPasswordForm + password_reset_confirm_template = 'xadmin/auth/password_reset/confirm.html' + password_reset_token_generator = default_token_generator + + def do_view(self, request, uidb36, token, *args, **kwargs): + context = super(ResetPasswordComfirmView, self).get_context() + return password_reset_confirm(request, uidb36, token, + template_name=self.password_reset_confirm_template, + token_generator=self.password_reset_token_generator, + set_password_form=self.password_reset_set_form, + post_reset_redirect=self.get_admin_url('xadmin_password_reset_complete'), + current_app=self.admin_site.name, extra_context=context) + + def get(self, request, uidb36, token, *args, **kwargs): + return self.do_view(request, uidb36, token) + + def post(self, request, uidb36, token, *args, **kwargs): + return self.do_view(request, uidb36, token) + + def get_media(self): + return super(ResetPasswordComfirmView, self).get_media() + \ + self.vendor('xadmin.page.form.js', 'xadmin.form.css') + + +site.register_view(r'^xadmin/password_reset/(?P[0-9A-Za-z]{1,13})-(?P[0-9A-Za-z]{1,13}-[0-9A-Za-z]{1,20})/$', + ResetPasswordComfirmView, name='xadmin_password_reset_confirm') + + +class ResetPasswordCompleteView(BaseAdminView): + + need_site_permission = False + + password_reset_complete_template = 'xadmin/auth/password_reset/complete.html' + + def get(self, request, *args, **kwargs): + context = super(ResetPasswordCompleteView, self).get_context() + context['login_url'] = self.get_admin_url('index') + + return TemplateResponse(request, self.password_reset_complete_template, context) + + +site.register_view(r'^xadmin/password_reset/complete/$', ResetPasswordCompleteView, name='xadmin_password_reset_complete') diff --git "a/8\343\200\201\346\226\207\347\214\256\346\225\260\346\215\256\346\214\226\346\216\230\347\263\273\347\273\237(\351\231\204\346\272\220\347\240\201)/extra_apps/xadmin/plugins/portal.py" "b/8\343\200\201\346\226\207\347\214\256\346\225\260\346\215\256\346\214\226\346\216\230\347\263\273\347\273\237(\351\231\204\346\272\220\347\240\201)/extra_apps/xadmin/plugins/portal.py" new file mode 100644 index 0000000..40199a2 --- /dev/null +++ "b/8\343\200\201\346\226\207\347\214\256\346\225\260\346\215\256\346\214\226\346\216\230\347\263\273\347\273\237(\351\231\204\346\272\220\347\240\201)/extra_apps/xadmin/plugins/portal.py" @@ -0,0 +1,74 @@ +#coding:utf-8 +from xadmin.sites import site +from xadmin.models import UserSettings +from xadmin.views import BaseAdminPlugin, ModelFormAdminView, DetailAdminView +from xadmin.layout import Fieldset, Column + + +class BasePortalPlugin(BaseAdminPlugin): + + # Media + def get_media(self, media): + return media + self.vendor('xadmin.plugin.portal.js') + + +def get_layout_objects(layout, clz, objects): + for i, layout_object in enumerate(layout.fields): + if layout_object.__class__ is clz or issubclass(layout_object.__class__, clz): + objects.append(layout_object) + elif hasattr(layout_object, 'get_field_names'): + get_layout_objects(layout_object, clz, objects) + + +class ModelFormPlugin(BasePortalPlugin): + + def _portal_key(self): + return '%s_%s_editform_portal' % (self.opts.app_label, self.opts.model_name) + + def get_form_helper(self, helper): + cs = [] + layout = helper.layout + get_layout_objects(layout, Column, cs) + for i, c in enumerate(cs): + if not getattr(c, 'css_id', None): + c.css_id = 'column-%d' % i + + # make fieldset index + fs = [] + get_layout_objects(layout, Fieldset, fs) + fs_map = {} + for i, f in enumerate(fs): + if not getattr(f, 'css_id', None): + f.css_id = 'box-%d' % i + fs_map[f.css_id] = f + + try: + layout_pos = UserSettings.objects.get( + user=self.user, key=self._portal_key()).value + layout_cs = layout_pos.split('|') + for i, c in enumerate(cs): + c.fields = [fs_map.pop(j) for j in layout_cs[i].split( + ',') if j in fs_map] if len(layout_cs) > i else [] + if fs_map and cs: + cs[0].fields.extend(fs_map.values()) + except Exception: + pass + + return helper + + def block_form_top(self, context, node): + # put portal key and submit url to page + return "" % self._portal_key() + + +class ModelDetailPlugin(ModelFormPlugin): + + def _portal_key(self): + return '%s_%s_detail_portal' % (self.opts.app_label, self.opts.model_name) + + def block_after_fieldsets(self, context, node): + # put portal key and submit url to page + return "" % self._portal_key() + +site.register_plugin(ModelFormPlugin, ModelFormAdminView) +site.register_plugin(ModelDetailPlugin, DetailAdminView) diff --git "a/8\343\200\201\346\226\207\347\214\256\346\225\260\346\215\256\346\214\226\346\216\230\347\263\273\347\273\237(\351\231\204\346\272\220\347\240\201)/extra_apps/xadmin/plugins/quickfilter.py" "b/8\343\200\201\346\226\207\347\214\256\346\225\260\346\215\256\346\214\226\346\216\230\347\263\273\347\273\237(\351\231\204\346\272\220\347\240\201)/extra_apps/xadmin/plugins/quickfilter.py" new file mode 100644 index 0000000..59b3ecc --- /dev/null +++ "b/8\343\200\201\346\226\207\347\214\256\346\225\260\346\215\256\346\214\226\346\216\230\347\263\273\347\273\237(\351\231\204\346\272\220\347\240\201)/extra_apps/xadmin/plugins/quickfilter.py" @@ -0,0 +1,168 @@ +''' +Created on Mar 26, 2014 + +@author: LAB_ADM +''' +from future.utils import iteritems +from django.utils import six +from django.utils.translation import ugettext_lazy as _ +from xadmin.filters import manager, MultiSelectFieldListFilter +from xadmin.plugins.filters import * +from xadmin.util import is_related_field + + +@manager.register +class QuickFilterMultiSelectFieldListFilter(MultiSelectFieldListFilter): + """ Delegates the filter to the default filter and ors the results of each + + Lists the distinct values of each field as a checkbox + Uses the default spec for each + + """ + template = 'xadmin/filters/quickfilter.html' + + +class QuickFilterPlugin(BaseAdminPlugin): + """ Add a filter menu to the left column of the page """ + list_quick_filter = () # these must be a subset of list_filter to work + quickfilter = {} + search_fields = () + free_query_filter = True + + def init_request(self, *args, **kwargs): + menu_style_accordian = hasattr(self.admin_view, 'menu_style') and self.admin_view.menu_style == 'accordion' + return bool(self.list_quick_filter) and not menu_style_accordian + + # Media + def get_media(self, media): + return media + self.vendor('xadmin.plugin.quickfilter.js', 'xadmin.plugin.quickfilter.css') + + def lookup_allowed(self, lookup, value): + model = self.model + # Check FKey lookups that are allowed, so that popups produced by + # ForeignKeyRawIdWidget, on the basis of ForeignKey.limit_choices_to, + # are allowed to work. + for l in model._meta.related_fkey_lookups: + for k, v in widgets.url_params_from_lookup_dict(l).items(): + if k == lookup and v == value: + return True + + parts = lookup.split(LOOKUP_SEP) + + # Last term in lookup is a query term (__exact, __startswith etc) + # This term can be ignored. + if len(parts) > 1 and parts[-1] in QUERY_TERMS: + parts.pop() + + # Special case -- foo__id__exact and foo__id queries are implied + # if foo has been specificially included in the lookup list; so + # drop __id if it is the last part. However, first we need to find + # the pk attribute name. + rel_name = None + for part in parts[:-1]: + try: + field = model._meta.get_field(part) + except FieldDoesNotExist: + # Lookups on non-existants fields are ok, since they're ignored + # later. + return True + if hasattr(field, 'remote_field'): + model = field.remote_field.model + rel_name = field.remote_field.get_related_field().name + elif is_related_field(field): + model = field.model + rel_name = model._meta.pk.name + else: + rel_name = None + if rel_name and len(parts) > 1 and parts[-1] == rel_name: + parts.pop() + + if len(parts) == 1: + return True + clean_lookup = LOOKUP_SEP.join(parts) + return clean_lookup in self.list_quick_filter + + def get_list_queryset(self, queryset): + lookup_params = dict([(smart_str(k)[len(FILTER_PREFIX):], v) for k, v in self.admin_view.params.items() if smart_str(k).startswith(FILTER_PREFIX) and v != '']) + for p_key, p_val in iteritems(lookup_params): + if p_val == "False": + lookup_params[p_key] = False + use_distinct = False + + if not hasattr(self.admin_view, 'quickfilter'): + self.admin_view.quickfilter = {} + + # for clean filters + self.admin_view.quickfilter['has_query_param'] = bool(lookup_params) + self.admin_view.quickfilter['clean_query_url'] = self.admin_view.get_query_string(remove=[k for k in self.request.GET.keys() if k.startswith(FILTER_PREFIX)]) + + # Normalize the types of keys + if not self.free_query_filter: + for key, value in lookup_params.items(): + if not self.lookup_allowed(key, value): + raise SuspiciousOperation("Filtering by %s not allowed" % key) + + self.filter_specs = [] + if self.list_quick_filter: + for list_quick_filter in self.list_quick_filter: + field_path = None + field_order_by = None + field_limit = None + field_parts = [] + sort_key = None + cache_config = None + + if type(list_quick_filter) == dict and 'field' in list_quick_filter: + field = list_quick_filter['field'] + if 'order_by' in list_quick_filter: + field_order_by = list_quick_filter['order_by'] + if 'limit' in list_quick_filter: + field_limit = list_quick_filter['limit'] + if 'sort' in list_quick_filter and callable(list_quick_filter['sort']): + sort_key = list_quick_filter['sort'] + if 'cache' in list_quick_filter and type(list_quick_filter) == dict: + cache_config = list_quick_filter['cache'] + + else: + field = list_quick_filter # This plugin only uses MultiselectFieldListFilter + + if not isinstance(field, models.Field): + field_path = field + field_parts = get_fields_from_path(self.model, field_path) + field = field_parts[-1] + spec = QuickFilterMultiSelectFieldListFilter(field, self.request, lookup_params, self.model, self.admin_view, field_path=field_path, + field_order_by=field_order_by, field_limit=field_limit, sort_key=sort_key, cache_config=cache_config) + + if len(field_parts) > 1: + spec.title = "%s %s" % (field_parts[-2].name, spec.title) + + # Check if we need to use distinct() + use_distinct = True # (use_distinct orlookup_needs_distinct(self.opts, field_path)) + if spec and spec.has_output(): + try: + new_qs = spec.do_filte(queryset) + except ValidationError as e: + new_qs = None + self.admin_view.message_user(_("Filtering error: %s") % e.messages[0], 'error') + if new_qs is not None: + queryset = new_qs + + self.filter_specs.append(spec) + + self.has_filters = bool(self.filter_specs) + self.admin_view.quickfilter['filter_specs'] = self.filter_specs + obj = filter(lambda f: f.is_used, self.filter_specs) + if six.PY3: + obj = list(obj) + self.admin_view.quickfilter['used_filter_num'] = len(obj) + + if use_distinct: + return queryset.distinct() + else: + return queryset + + def block_left_navbar(self, context, nodes): + nodes.append(loader.render_to_string('xadmin/blocks/modal_list.left_navbar.quickfilter.html', + get_context_dict(context))) + +site.register_plugin(QuickFilterPlugin, ListAdminView) diff --git "a/8\343\200\201\346\226\207\347\214\256\346\225\260\346\215\256\346\214\226\346\216\230\347\263\273\347\273\237(\351\231\204\346\272\220\347\240\201)/extra_apps/xadmin/plugins/quickform.py" "b/8\343\200\201\346\226\207\347\214\256\346\225\260\346\215\256\346\214\226\346\216\230\347\263\273\347\273\237(\351\231\204\346\272\220\347\240\201)/extra_apps/xadmin/plugins/quickform.py" new file mode 100644 index 0000000..7516f68 --- /dev/null +++ "b/8\343\200\201\346\226\207\347\214\256\346\225\260\346\215\256\346\214\226\346\216\230\347\263\273\347\273\237(\351\231\204\346\272\220\347\240\201)/extra_apps/xadmin/plugins/quickform.py" @@ -0,0 +1,110 @@ +from django.db import models +from django import forms +from django.utils.safestring import mark_safe +from django.utils.translation import ugettext as _ +from django.forms.models import modelform_factory +import copy +from xadmin.sites import site +from xadmin.util import get_model_from_relation, vendor +from xadmin.views import BaseAdminPlugin, ModelFormAdminView +from xadmin.layout import Layout + + +class QuickFormPlugin(BaseAdminPlugin): + + def init_request(self, *args, **kwargs): + if self.request.method == 'GET' and self.request.is_ajax() or self.request.GET.get('_ajax'): + self.admin_view.add_form_template = 'xadmin/views/quick_form.html' + self.admin_view.change_form_template = 'xadmin/views/quick_form.html' + return True + return False + + def get_model_form(self, __, **kwargs): + if '_field' in self.request.GET: + defaults = { + "form": self.admin_view.form, + "fields": self.request.GET['_field'].split(','), + "formfield_callback": self.admin_view.formfield_for_dbfield, + } + return modelform_factory(self.model, **defaults) + return __() + + def get_form_layout(self, __): + if '_field' in self.request.GET: + return Layout(*self.request.GET['_field'].split(',')) + return __() + + def get_context(self, context): + context['form_url'] = self.request.path + return context + + +class RelatedFieldWidgetWrapper(forms.Widget): + """ + This class is a wrapper to a given widget to add the add icon for the + admin interface. + """ + + def __init__(self, widget, rel, add_url, rel_add_url): + self.needs_multipart_form = widget.needs_multipart_form + self.attrs = widget.attrs + self.choices = widget.choices + self.is_required = widget.is_required + self.widget = widget + self.rel = rel + + self.add_url = add_url + self.rel_add_url = rel_add_url + + if hasattr(self, 'input_type'): + self.input_type = widget.input_type + + def __deepcopy__(self, memo): + obj = copy.copy(self) + obj.widget = copy.deepcopy(self.widget, memo) + obj.attrs = self.widget.attrs + memo[id(self)] = obj + return obj + + @property + def media(self): + media = self.widget.media + vendor('xadmin.plugin.quick-form.js') + return media + + def render(self, name, value, renderer=None, *args, **kwargs): + self.widget.choices = self.choices + output = [] + if self.add_url: + output.append(u'' + % ( + self.add_url, (_('Create New %s') % self.rel.model._meta.verbose_name), name, + "%s?_field=%s&%s=" % (self.rel_add_url, name, name))) + output.extend(['
    ' % name, + self.widget.render(name, value, *args, **kwargs), '
    ']) + return mark_safe(u''.join(output)) + + def build_attrs(self, extra_attrs=None, **kwargs): + "Helper function for building an attribute dictionary." + self.attrs = self.widget.build_attrs(extra_attrs=None, **kwargs) + return self.attrs + + def value_from_datadict(self, data, files, name): + return self.widget.value_from_datadict(data, files, name) + + def id_for_label(self, id_): + return self.widget.id_for_label(id_) + + +class QuickAddBtnPlugin(BaseAdminPlugin): + + def formfield_for_dbfield(self, formfield, db_field, **kwargs): + if formfield and self.model in self.admin_site._registry and isinstance(db_field, (models.ForeignKey, models.ManyToManyField)): + rel_model = get_model_from_relation(db_field) + if rel_model in self.admin_site._registry and self.has_model_perm(rel_model, 'add'): + add_url = self.get_model_url(rel_model, 'add') + formfield.widget = RelatedFieldWidgetWrapper( + formfield.widget, db_field.remote_field, add_url, self.get_model_url(self.model, 'add')) + return formfield + +site.register_plugin(QuickFormPlugin, ModelFormAdminView) +site.register_plugin(QuickAddBtnPlugin, ModelFormAdminView) diff --git "a/8\343\200\201\346\226\207\347\214\256\346\225\260\346\215\256\346\214\226\346\216\230\347\263\273\347\273\237(\351\231\204\346\272\220\347\240\201)/extra_apps/xadmin/plugins/refresh.py" "b/8\343\200\201\346\226\207\347\214\256\346\225\260\346\215\256\346\214\226\346\216\230\347\263\273\347\273\237(\351\231\204\346\272\220\347\240\201)/extra_apps/xadmin/plugins/refresh.py" new file mode 100644 index 0000000..a1341a2 --- /dev/null +++ "b/8\343\200\201\346\226\207\347\214\256\346\225\260\346\215\256\346\214\226\346\216\230\347\263\273\347\273\237(\351\231\204\346\272\220\347\240\201)/extra_apps/xadmin/plugins/refresh.py" @@ -0,0 +1,39 @@ +# coding=utf-8 +from django.template import loader + +from xadmin.plugins.utils import get_context_dict +from xadmin.sites import site +from xadmin.views import BaseAdminPlugin, ListAdminView + +REFRESH_VAR = '_refresh' + + +class RefreshPlugin(BaseAdminPlugin): + + refresh_times = [] + + # Media + def get_media(self, media): + if self.refresh_times and self.request.GET.get(REFRESH_VAR): + media = media + self.vendor('xadmin.plugin.refresh.js') + return media + + # Block Views + def block_top_toolbar(self, context, nodes): + if self.refresh_times: + current_refresh = self.request.GET.get(REFRESH_VAR) + context.update({ + 'has_refresh': bool(current_refresh), + 'clean_refresh_url': self.admin_view.get_query_string(remove=(REFRESH_VAR,)), + 'current_refresh': current_refresh, + 'refresh_times': [{ + 'time': r, + 'url': self.admin_view.get_query_string({REFRESH_VAR: r}), + 'selected': str(r) == current_refresh, + } for r in self.refresh_times], + }) + nodes.append(loader.render_to_string('xadmin/blocks/model_list.top_toolbar.refresh.html', + get_context_dict(context))) + + +site.register_plugin(RefreshPlugin, ListAdminView) diff --git "a/8\343\200\201\346\226\207\347\214\256\346\225\260\346\215\256\346\214\226\346\216\230\347\263\273\347\273\237(\351\231\204\346\272\220\347\240\201)/extra_apps/xadmin/plugins/relate.py" "b/8\343\200\201\346\226\207\347\214\256\346\225\260\346\215\256\346\214\226\346\216\230\347\263\273\347\273\237(\351\231\204\346\272\220\347\240\201)/extra_apps/xadmin/plugins/relate.py" new file mode 100644 index 0000000..3164275 --- /dev/null +++ "b/8\343\200\201\346\226\207\347\214\256\346\225\260\346\215\256\346\214\226\346\216\230\347\263\273\347\273\237(\351\231\204\346\272\220\347\240\201)/extra_apps/xadmin/plugins/relate.py" @@ -0,0 +1,240 @@ +# coding=UTF-8 +from itertools import chain + +from django.urls.base import reverse +from django.db.models.options import PROXY_PARENTS +from django.utils import six +from django.utils.encoding import force_text +from django.utils.encoding import smart_str +from django.utils.safestring import mark_safe +from django.db.models.sql.query import LOOKUP_SEP +from django.utils.translation import ugettext as _ +from django.db import models + + +from xadmin.sites import site +from xadmin.views import BaseAdminPlugin, ListAdminView, CreateAdminView, UpdateAdminView, DeleteAdminView +from xadmin.util import is_related_field2 + +RELATE_PREFIX = '_rel_' + + +class RelateMenuPlugin(BaseAdminPlugin): + + related_list = [] + use_related_menu = True + + def _get_all_related_objects(self, local_only=False, include_hidden=False, + include_proxy_eq=False): + """ + Returns a list of related fields (also many to many) + :param local_only: + :param include_hidden: + :return: list + """ + include_parents = True if local_only is False else PROXY_PARENTS + fields = self.opts._get_fields( + forward=False, reverse=True, + include_parents=include_parents, + include_hidden=include_hidden + ) + if include_proxy_eq: + children = chain.from_iterable(c._relation_tree + for c in self.opts.concrete_model._meta.proxied_children + if c is not self.opts) + relations = (f.remote_field for f in children + if include_hidden or not f.remote_field.field.remote_field.is_hidden()) + fields = chain(fields, relations) + return list(fields) + + def get_related_list(self): + if hasattr(self, '_related_acts'): + return self._related_acts + + _related_acts = [] + for rel in self._get_all_related_objects(): + if self.related_list and (rel.get_accessor_name() not in self.related_list): + continue + if rel.related_model not in self.admin_site._registry.keys(): + continue + has_view_perm = self.has_model_perm(rel.related_model, 'view') + has_add_perm = self.has_model_perm(rel.related_model, 'add') + if not (has_view_perm or has_add_perm): + continue + + _related_acts.append((rel, has_view_perm, has_add_perm)) + + self._related_acts = _related_acts + return self._related_acts + + def related_link(self, instance): + links = [] + for rel, view_perm, add_perm in self.get_related_list(): + opts = rel.related_model._meta + + label = opts.app_label + model_name = opts.model_name + + field = rel.field + rel_name = rel.get_related_field().name + + verbose_name = force_text(opts.verbose_name) + lookup_name = '%s__%s__exact' % (field.name, rel_name) + + link = ''.join(('
  • ', + + ' %s' % + ( + reverse('%s:%s_%s_changelist' % ( + self.admin_site.app_name, label, model_name)), + RELATE_PREFIX + lookup_name, str(instance.pk), verbose_name, verbose_name) if view_perm else + ' %s' % verbose_name, + + '' % + ( + reverse('%s:%s_%s_add' % ( + self.admin_site.app_name, label, model_name)), + RELATE_PREFIX + lookup_name, str( + instance.pk)) if add_perm else "", + + '
  • ')) + links.append(link) + ul_html = '' % ''.join( + links) + return '' % (_('Related Objects'), ul_html) + related_link.short_description = ' ' + related_link.allow_tags = True + related_link.allow_export = False + related_link.is_column = False + + def get_list_display(self, list_display): + if self.use_related_menu and len(self.get_related_list()): + list_display.append('related_link') + self.admin_view.related_link = self.related_link + return list_display + + +class RelateObject(object): + + def __init__(self, admin_view, lookup, value): + self.admin_view = admin_view + self.org_model = admin_view.model + self.opts = admin_view.opts + self.lookup = lookup + self.value = value + + parts = lookup.split(LOOKUP_SEP) + field = self.opts.get_field(parts[0]) + + if not is_related_field2(field): + raise Exception(u'Relate Lookup field must a related field') + + self.to_model = field.related_model + self.rel_name = '__'.join(parts[1:]) + self.is_m2m = bool(field.many_to_many) + + to_qs = self.to_model._default_manager.get_queryset() + self.to_objs = to_qs.filter(**{self.rel_name: value}).all() + + self.field = field + + def filter(self, queryset): + return queryset.filter(**{self.lookup: self.value}) + + def get_brand_name(self): + if len(self.to_objs) == 1: + to_model_name = str(self.to_objs[0]) + else: + to_model_name = force_text(self.to_model._meta.verbose_name) + + return mark_safe(u"%s %s" % (to_model_name, force_text(self.opts.verbose_name_plural))) + + +class BaseRelateDisplayPlugin(BaseAdminPlugin): + + def init_request(self, *args, **kwargs): + self.relate_obj = None + for k, v in self.request.GET.items(): + if smart_str(k).startswith(RELATE_PREFIX): + self.relate_obj = RelateObject( + self.admin_view, smart_str(k)[len(RELATE_PREFIX):], v) + break + return bool(self.relate_obj) + + def _get_relate_params(self): + return RELATE_PREFIX + self.relate_obj.lookup, self.relate_obj.value + + def _get_input(self): + return '' % self._get_relate_params() + + def _get_url(self, url): + return url + ('&' if url.find('?') > 0 else '?') + ('%s=%s' % self._get_relate_params()) + + +class ListRelateDisplayPlugin(BaseRelateDisplayPlugin): + + def get_list_queryset(self, queryset): + if self.relate_obj: + queryset = self.relate_obj.filter(queryset) + return queryset + + def url_for_result(self, url, result): + return self._get_url(url) + + def get_context(self, context): + context['brand_name'] = self.relate_obj.get_brand_name() + context['rel_objs'] = self.relate_obj.to_objs + if len(self.relate_obj.to_objs) == 1: + context['rel_obj'] = self.relate_obj.to_objs[0] + if 'add_url' in context: + context['add_url'] = self._get_url(context['add_url']) + return context + + def get_list_display(self, list_display): + if not self.relate_obj.is_m2m: + try: + list_display.remove(self.relate_obj.field.name) + except Exception: + pass + return list_display + + +class EditRelateDisplayPlugin(BaseRelateDisplayPlugin): + + def get_form_datas(self, datas): + if self.admin_view.org_obj is None and self.admin_view.request_method == 'get': + datas['initial'][ + self.relate_obj.field.name] = self.relate_obj.value + return datas + + def post_response(self, response): + cls_str = str if six.PY3 else basestring + if isinstance(response, cls_str) and response != self.get_admin_url('index'): + return self._get_url(response) + return response + + def get_context(self, context): + if 'delete_url' in context: + context['delete_url'] = self._get_url(context['delete_url']) + return context + + def block_after_fieldsets(self, context, nodes): + return self._get_input() + + +class DeleteRelateDisplayPlugin(BaseRelateDisplayPlugin): + + def post_response(self, response): + cls_str = str if six.PY3 else basestring + if isinstance(response, cls_str) and response != self.get_admin_url('index'): + return self._get_url(response) + return response + + def block_form_fields(self, context, nodes): + return self._get_input() + +site.register_plugin(RelateMenuPlugin, ListAdminView) +site.register_plugin(ListRelateDisplayPlugin, ListAdminView) +site.register_plugin(EditRelateDisplayPlugin, CreateAdminView) +site.register_plugin(EditRelateDisplayPlugin, UpdateAdminView) +site.register_plugin(DeleteRelateDisplayPlugin, DeleteAdminView) diff --git "a/8\343\200\201\346\226\207\347\214\256\346\225\260\346\215\256\346\214\226\346\216\230\347\263\273\347\273\237(\351\231\204\346\272\220\347\240\201)/extra_apps/xadmin/plugins/relfield.py" "b/8\343\200\201\346\226\207\347\214\256\346\225\260\346\215\256\346\214\226\346\216\230\347\263\273\347\273\237(\351\231\204\346\272\220\347\240\201)/extra_apps/xadmin/plugins/relfield.py" new file mode 100644 index 0000000..19b403e --- /dev/null +++ "b/8\343\200\201\346\226\207\347\214\256\346\225\260\346\215\256\346\214\226\346\216\230\347\263\273\347\273\237(\351\231\204\346\272\220\347\240\201)/extra_apps/xadmin/plugins/relfield.py" @@ -0,0 +1,84 @@ +from django.db import models +from django.forms.utils import flatatt +from django.utils.html import escape, format_html +from django.utils.safestring import mark_safe +from django.utils.text import Truncator +from django.utils.translation import ugettext as _ +from django import forms +from xadmin.sites import site +from xadmin.views import BaseAdminPlugin, ModelFormAdminView +from xadmin.util import vendor + + +class ForeignKeySearchWidget(forms.Widget): + + def __init__(self, rel, admin_view, attrs=None, using=None): + self.rel = rel + self.admin_view = admin_view + self.db = using + super(ForeignKeySearchWidget, self).__init__(attrs) + + def build_attrs(self, attrs={}, extra_attrs=None, **kwargs): + to_opts = self.rel.model._meta + if "class" not in attrs: + attrs['class'] = 'select-search' + else: + attrs['class'] = attrs['class'] + ' select-search' + attrs['data-search-url'] = self.admin_view.get_admin_url( + '%s_%s_changelist' % (to_opts.app_label, to_opts.model_name)) + attrs['data-placeholder'] = _('Search %s') % to_opts.verbose_name + attrs['data-choices'] = '?' + if self.rel.limit_choices_to: + for i in list(self.rel.limit_choices_to): + attrs['data-choices'] += "&_p_%s=%s" % (i, self.rel.limit_choices_to[i]) + attrs['data-choices'] = format_html(attrs['data-choices']) + attrs.update(kwargs) + return super(ForeignKeySearchWidget, self).build_attrs(attrs, extra_attrs=extra_attrs) + + def render(self, name, value, attrs=None): + final_attrs = self.build_attrs(attrs, extra_attrs={'name': name}) + output = [format_html('', flatatt(final_attrs))] + if value: + output.append(format_html('', value, self.label_for_value(value))) + output.append('') + return mark_safe('\n'.join(output)) + + def label_for_value(self, value): + key = self.rel.get_related_field().name + try: + obj = self.rel.to._default_manager.using( + self.db).get(**{key: value}) + return '%s' % escape(Truncator(obj).words(14, truncate='...')) + except (ValueError, self.rel.to.DoesNotExist): + return "" + + @property + def media(self): + return vendor('select.js', 'select.css', 'xadmin.widget.select.js') + + +class ForeignKeySelectWidget(ForeignKeySearchWidget): + + def build_attrs(self, attrs={}, **kwargs): + attrs = super(ForeignKeySelectWidget, self).build_attrs(attrs, **kwargs) + if "class" not in attrs: + attrs['class'] = 'select-preload' + else: + attrs['class'] = attrs['class'] + ' select-preload' + attrs['data-placeholder'] = _('Select %s') % self.rel.model._meta.verbose_name + return attrs + + +class RelateFieldPlugin(BaseAdminPlugin): + + def get_field_style(self, attrs, db_field, style, **kwargs): + # search able fk field + if style in ('fk-ajax', 'fk-select') and isinstance(db_field, models.ForeignKey): + if (db_field.remote_field.to in self.admin_view.admin_site._registry) and \ + self.has_model_perm(db_field.remote_field.to, 'view'): + db = kwargs.get('using') + return dict(attrs or {}, + widget=(style == 'fk-ajax' and ForeignKeySearchWidget or ForeignKeySelectWidget)(db_field.remote_field, self.admin_view, using=db)) + return attrs + +site.register_plugin(RelateFieldPlugin, ModelFormAdminView) diff --git "a/8\343\200\201\346\226\207\347\214\256\346\225\260\346\215\256\346\214\226\346\216\230\347\263\273\347\273\237(\351\231\204\346\272\220\347\240\201)/extra_apps/xadmin/plugins/sitemenu.py" "b/8\343\200\201\346\226\207\347\214\256\346\225\260\346\215\256\346\214\226\346\216\230\347\263\273\347\273\237(\351\231\204\346\272\220\347\240\201)/extra_apps/xadmin/plugins/sitemenu.py" new file mode 100644 index 0000000..02acdd1 --- /dev/null +++ "b/8\343\200\201\346\226\207\347\214\256\346\225\260\346\215\256\346\214\226\346\216\230\347\263\273\347\273\237(\351\231\204\346\272\220\347\240\201)/extra_apps/xadmin/plugins/sitemenu.py" @@ -0,0 +1,22 @@ + +from xadmin.sites import site +from xadmin.views import BaseAdminPlugin, CommAdminView + +BUILDIN_STYLES = { + 'default': 'xadmin/includes/sitemenu_default.html', + 'accordion': 'xadmin/includes/sitemenu_accordion.html', +} + + +class SiteMenuStylePlugin(BaseAdminPlugin): + + menu_style = None + + def init_request(self, *args, **kwargs): + return bool(self.menu_style) and self.menu_style in BUILDIN_STYLES + + def get_context(self, context): + context['menu_template'] = BUILDIN_STYLES[self.menu_style] + return context + +site.register_plugin(SiteMenuStylePlugin, CommAdminView) diff --git "a/8\343\200\201\346\226\207\347\214\256\346\225\260\346\215\256\346\214\226\346\216\230\347\263\273\347\273\237(\351\231\204\346\272\220\347\240\201)/extra_apps/xadmin/plugins/sortablelist.py" "b/8\343\200\201\346\226\207\347\214\256\346\225\260\346\215\256\346\214\226\346\216\230\347\263\273\347\273\237(\351\231\204\346\272\220\347\240\201)/extra_apps/xadmin/plugins/sortablelist.py" new file mode 100644 index 0000000..17d34b6 --- /dev/null +++ "b/8\343\200\201\346\226\207\347\214\256\346\225\260\346\215\256\346\214\226\346\216\230\347\263\273\347\273\237(\351\231\204\346\272\220\347\240\201)/extra_apps/xadmin/plugins/sortablelist.py" @@ -0,0 +1,81 @@ +# coding: utf-8 +""" +Make items sortable by drag-drop in list view. Diffierent from +builtin plugin sortable, it touches model field indeed intead +of only for display. +""" + +from __future__ import unicode_literals + +from django.template.loader import render_to_string +from django.urls.base import reverse +from django.db import transaction + +from xadmin.views import ( + BaseAdminPlugin, ModelAdminView, ListAdminView +) +from xadmin.sites import site +from xadmin.views.base import csrf_protect_m + + +class SortableListPlugin(BaseAdminPlugin): + + list_order_field = None + + def init_request(self, *args, **kwargs): + return bool(self.list_order_field) + + @property + def is_list_sortable(self): + return True + + def result_row(self, __, obj): + row = __() + row.update({ + "tagattrs": "order-key=order_{}".format(obj.pk) + }) + return row + + def result_item(self, item, obj, field_name, row): + if self.is_list_sortable and field_name == self.list_order_field: + item.btns.append('') + return item + + def get_context(self, context): + context['save_order_url'] = self.get_model_url(self.admin_view.model, 'save_order') + return context + + def block_top_toolbar(self, context, nodes): + save_node = render_to_string( + 'xadmin/blocks/model_list.top_toolbar.saveorder.html', context_instance=context + ) + nodes.append(save_node) + + def get_media(self, media): + if self.is_list_sortable: + media = media + self.vendor('xadmin.plugin.sortablelist.js') + return media + + +class SaveOrderView(ModelAdminView): + + @csrf_protect_m + @transaction.atomic + def post(self, request): + order_objs = request.POST.getlist("order[]") + for order_value, pk in enumerate(order_objs, start=1): + self.save_order(pk, order_value) + return self.render_response({}) + + def save_order(self, pk, order_value): + obj = self.model.objects.get(pk=pk) + order_field = self.list_order_field + is_order_changed = lambda x: getattr(x, order_field) != order_value + + if is_order_changed(obj): + setattr(obj, order_field, order_value) + obj.save() + + +site.register_plugin(SortableListPlugin, ListAdminView) +site.register_modelview(r'^save-order/$', SaveOrderView, name='%s_%s_save_order') diff --git "a/8\343\200\201\346\226\207\347\214\256\346\225\260\346\215\256\346\214\226\346\216\230\347\263\273\347\273\237(\351\231\204\346\272\220\347\240\201)/extra_apps/xadmin/plugins/themes.py" "b/8\343\200\201\346\226\207\347\214\256\346\225\260\346\215\256\346\214\226\346\216\230\347\263\273\347\273\237(\351\231\204\346\272\220\347\240\201)/extra_apps/xadmin/plugins/themes.py" new file mode 100644 index 0000000..fca1e45 --- /dev/null +++ "b/8\343\200\201\346\226\207\347\214\256\346\225\260\346\215\256\346\214\226\346\216\230\347\263\273\347\273\237(\351\231\204\346\272\220\347\240\201)/extra_apps/xadmin/plugins/themes.py" @@ -0,0 +1,93 @@ +# coding:utf-8 +from __future__ import print_function +import httplib2 +from django.template import loader +from django.core.cache import cache +from django.utils import six +from django.utils.translation import ugettext as _ +from xadmin.sites import site +from xadmin.models import UserSettings +from xadmin.views import BaseAdminPlugin, BaseAdminView +from xadmin.util import static, json +import six +if six.PY2: + import urllib +else: + import urllib.parse + +THEME_CACHE_KEY = 'xadmin_themes' + + +class ThemePlugin(BaseAdminPlugin): + + enable_themes = False + # {'name': 'Blank Theme', 'description': '...', 'css': 'http://...', 'thumbnail': '...'} + user_themes = None + use_bootswatch = False + default_theme = static('xadmin/css/themes/bootstrap-xadmin.css') + bootstrap2_theme = static('xadmin/css/themes/bootstrap-theme.css') + + def init_request(self, *args, **kwargs): + return self.enable_themes + + def _get_theme(self): + if self.user: + try: + return UserSettings.objects.get(user=self.user, key="site-theme").value + except Exception: + pass + if '_theme' in self.request.COOKIES: + if six.PY2: + func = urllib.unquote + else: + func = urllib.parse.unquote + return func(self.request.COOKIES['_theme']) + return self.default_theme + + def get_context(self, context): + context['site_theme'] = self._get_theme() + return context + + # Media + def get_media(self, media): + return media + self.vendor('jquery-ui-effect.js', 'xadmin.plugin.themes.js') + + # Block Views + def block_top_navmenu(self, context, nodes): + + themes = [ + {'name': _(u"Default"), 'description': _(u"Default bootstrap theme"), 'css': self.default_theme}, + {'name': _(u"Bootstrap2"), 'description': _(u"Bootstrap 2.x theme"), 'css': self.bootstrap2_theme}, + ] + select_css = context.get('site_theme', self.default_theme) + + if self.user_themes: + themes.extend(self.user_themes) + + if self.use_bootswatch: + ex_themes = cache.get(THEME_CACHE_KEY) + if ex_themes: + themes.extend(json.loads(ex_themes)) + else: + ex_themes = [] + try: + h = httplib2.Http() + resp, content = h.request("https://bootswatch.com/api/3.json", 'GET', '', + headers={"Accept": "application/json", "User-Agent": self.request.META['HTTP_USER_AGENT']}) + if six.PY3: + content = content.decode() + watch_themes = json.loads(content)['themes'] + ex_themes.extend([ + {'name': t['name'], 'description': t['description'], + 'css': t['cssMin'], 'thumbnail': t['thumbnail']} + for t in watch_themes]) + except Exception as e: + print(e) + + cache.set(THEME_CACHE_KEY, json.dumps(ex_themes), 24 * 3600) + themes.extend(ex_themes) + + nodes.append(loader.render_to_string('xadmin/blocks/comm.top.theme.html', {'themes': themes, 'select_css': select_css})) + + +site.register_plugin(ThemePlugin, BaseAdminView) diff --git "a/8\343\200\201\346\226\207\347\214\256\346\225\260\346\215\256\346\214\226\346\216\230\347\263\273\347\273\237(\351\231\204\346\272\220\347\240\201)/extra_apps/xadmin/plugins/topnav.py" "b/8\343\200\201\346\226\207\347\214\256\346\225\260\346\215\256\346\214\226\346\216\230\347\263\273\347\273\237(\351\231\204\346\272\220\347\240\201)/extra_apps/xadmin/plugins/topnav.py" new file mode 100644 index 0000000..fdf458b --- /dev/null +++ "b/8\343\200\201\346\226\207\347\214\256\346\225\260\346\215\256\346\214\226\346\216\230\347\263\273\347\273\237(\351\231\204\346\272\220\347\240\201)/extra_apps/xadmin/plugins/topnav.py" @@ -0,0 +1,73 @@ + +from django.template import loader +from django.utils.text import capfirst +from django.urls.base import reverse, NoReverseMatch +from django.utils.translation import ugettext as _ + +from xadmin.sites import site +from xadmin.filters import SEARCH_VAR +from xadmin.views import BaseAdminPlugin, CommAdminView + + +class TopNavPlugin(BaseAdminPlugin): + + global_search_models = None + global_add_models = None + + def get_context(self, context): + return context + + # Block Views + def block_top_navbar(self, context, nodes): + search_models = [] + + site_name = self.admin_site.name + if self.global_search_models == None: + models = self.admin_site._registry.keys() + else: + models = self.global_search_models + + for model in models: + app_label = model._meta.app_label + + if self.has_model_perm(model, "view"): + info = (app_label, model._meta.model_name) + if getattr(self.admin_site._registry[model], 'search_fields', None): + try: + search_models.append({ + 'title': _('Search %s') % capfirst(model._meta.verbose_name_plural), + 'url': reverse('xadmin:%s_%s_changelist' % info, current_app=site_name), + 'model': model + }) + except NoReverseMatch: + pass + return nodes.append(loader.render_to_string('xadmin/blocks/comm.top.topnav.html', {'search_models': search_models, 'search_name': SEARCH_VAR})) + + def block_top_navmenu(self, context, nodes): + add_models = [] + + site_name = self.admin_site.name + + if self.global_add_models == None: + models = self.admin_site._registry.keys() + else: + models = self.global_add_models + for model in models: + app_label = model._meta.app_label + + if self.has_model_perm(model, "add"): + info = (app_label, model._meta.model_name) + try: + add_models.append({ + 'title': _('Add %s') % capfirst(model._meta.verbose_name), + 'url': reverse('xadmin:%s_%s_add' % info, current_app=site_name), + 'model': model + }) + except NoReverseMatch: + pass + + nodes.append( + loader.render_to_string('xadmin/blocks/comm.top.topnav.html', {'add_models': add_models})) + + +site.register_plugin(TopNavPlugin, CommAdminView) diff --git "a/8\343\200\201\346\226\207\347\214\256\346\225\260\346\215\256\346\214\226\346\216\230\347\263\273\347\273\237(\351\231\204\346\272\220\347\240\201)/extra_apps/xadmin/plugins/utils.py" "b/8\343\200\201\346\226\207\347\214\256\346\225\260\346\215\256\346\214\226\346\216\230\347\263\273\347\273\237(\351\231\204\346\272\220\347\240\201)/extra_apps/xadmin/plugins/utils.py" new file mode 100644 index 0000000..6bc7e79 --- /dev/null +++ "b/8\343\200\201\346\226\207\347\214\256\346\225\260\346\215\256\346\214\226\346\216\230\347\263\273\347\273\237(\351\231\204\346\272\220\347\240\201)/extra_apps/xadmin/plugins/utils.py" @@ -0,0 +1,15 @@ +from django.template.context import RequestContext + + +def get_context_dict(context): + """ + Contexts in django version 1.9+ must be dictionaries. As xadmin has a legacy with older versions of django, + the function helps the transition by converting the [RequestContext] object to the dictionary when necessary. + :param context: RequestContext + :return: dict + """ + if isinstance(context, RequestContext): + ctx = context.flatten() + else: + ctx = context + return ctx diff --git "a/8\343\200\201\346\226\207\347\214\256\346\225\260\346\215\256\346\214\226\346\216\230\347\263\273\347\273\237(\351\231\204\346\272\220\347\240\201)/extra_apps/xadmin/plugins/wizard.py" "b/8\343\200\201\346\226\207\347\214\256\346\225\260\346\215\256\346\214\226\346\216\230\347\263\273\347\273\237(\351\231\204\346\272\220\347\240\201)/extra_apps/xadmin/plugins/wizard.py" new file mode 100644 index 0000000..84c46fd --- /dev/null +++ "b/8\343\200\201\346\226\207\347\214\256\346\225\260\346\215\256\346\214\226\346\216\230\347\263\273\347\273\237(\351\231\204\346\272\220\347\240\201)/extra_apps/xadmin/plugins/wizard.py" @@ -0,0 +1,343 @@ +import re +from collections import OrderedDict +from django import forms +from django.db import models +from django.template import loader +try: + from formtools.wizard.storage import get_storage + from formtools.wizard.forms import ManagementForm + from formtools.wizard.views import StepsHelper +except: + # work for django<1.8 + from django.contrib.formtools.wizard.storage import get_storage + from django.contrib.formtools.wizard.forms import ManagementForm + from django.contrib.formtools.wizard.views import StepsHelper + +from django.utils import six +from django.utils.encoding import smart_text +from django.utils.module_loading import import_string +from django.forms import ValidationError +from django.forms.models import modelform_factory + +from xadmin.sites import site +from xadmin.views import BaseAdminPlugin, ModelFormAdminView + + +def normalize_name(name): + new = re.sub('(((?<=[a-z])[A-Z])|([A-Z](?![A-Z]|$)))', '_\\1', name) + return new.lower().strip('_') + + +class WizardFormPlugin(BaseAdminPlugin): + + wizard_form_list = None + wizard_for_update = False + + storage_name = 'formtools.wizard.storage.session.SessionStorage' + form_list = None + initial_dict = None + instance_dict = None + condition_dict = None + file_storage = None + + def _get_form_prefix(self, step=None): + if step is None: + step = self.steps.current + obj = self.get_form_list().keys() + if six.PY3: + obj = [s for s in obj] + return 'step_%d' % obj.index(step) + + def get_form_list(self): + if not hasattr(self, '_form_list'): + init_form_list = OrderedDict() + + assert len( + self.wizard_form_list) > 0, 'at least one form is needed' + + for i, form in enumerate(self.wizard_form_list): + init_form_list[smart_text(form[0])] = form[1] + + self._form_list = init_form_list + + return self._form_list + + # Plugin replace methods + def init_request(self, *args, **kwargs): + if self.request.is_ajax() or ("_ajax" in self.request.GET) or not hasattr(self.request, 'session') or (args and not self.wizard_for_update): + # update view + return False + return bool(self.wizard_form_list) + + def prepare_form(self, __): + # init storage and step helper + self.prefix = normalize_name(self.__class__.__name__) + self.storage = get_storage( + self.storage_name, self.prefix, self.request, + getattr(self, 'file_storage', None)) + self.steps = StepsHelper(self) + self.wizard_goto_step = False + + if self.request.method == 'GET': + self.storage.reset() + self.storage.current_step = self.steps.first + + self.admin_view.model_form = self.get_step_form() + else: + # Look for a wizard_goto_step element in the posted data which + # contains a valid step name. If one was found, render the requested + # form. (This makes stepping back a lot easier). + wizard_goto_step = self.request.POST.get('wizard_goto_step', None) + if wizard_goto_step and int(wizard_goto_step) < len(self.get_form_list()): + obj = self.get_form_list().keys() + if six.PY3: + obj = [s for s in obj] + self.storage.current_step = obj[int(wizard_goto_step)] + self.admin_view.model_form = self.get_step_form() + self.wizard_goto_step = True + return + + # Check if form was refreshed + management_form = ManagementForm( + self.request.POST, prefix=self.prefix) + + if not management_form.is_valid(): + raise ValidationError( + 'ManagementForm data is missing or has been tampered.') + + form_current_step = management_form.cleaned_data['current_step'] + if (form_current_step != self.steps.current and + self.storage.current_step is not None): + # form refreshed, change current step + self.storage.current_step = form_current_step + + # get the form for the current step + self.admin_view.model_form = self.get_step_form() + + def get_form_layout(self, __): + attrs = self.get_form_list()[self.steps.current] + if type(attrs) is dict and 'layout' in attrs: + self.admin_view.form_layout = attrs['layout'] + else: + self.admin_view.form_layout = None + return __() + + def get_step_form(self, step=None): + if step is None: + step = self.steps.current + attrs = self.get_form_list()[step] + if type(attrs) in (list, tuple): + return modelform_factory(self.model, form=forms.ModelForm, + fields=attrs, formfield_callback=self.admin_view.formfield_for_dbfield) + elif type(attrs) is dict: + if attrs.get('fields', None): + return modelform_factory(self.model, form=forms.ModelForm, + fields=attrs['fields'], formfield_callback=self.admin_view.formfield_for_dbfield) + if attrs.get('callback', None): + callback = attrs['callback'] + if callable(callback): + return callback(self) + elif hasattr(self.admin_view, str(callback)): + return getattr(self.admin_view, str(callback))(self) + elif issubclass(attrs, forms.BaseForm): + return attrs + return None + + def get_step_form_obj(self, step=None): + if step is None: + step = self.steps.current + form = self.get_step_form(step) + return form(prefix=self._get_form_prefix(step), + data=self.storage.get_step_data(step), + files=self.storage.get_step_files(step)) + + def get_form_datas(self, datas): + datas['prefix'] = self._get_form_prefix() + if self.request.method == 'POST' and self.wizard_goto_step: + datas.update({ + 'data': self.storage.get_step_data(self.steps.current), + 'files': self.storage.get_step_files(self.steps.current) + }) + return datas + + def valid_forms(self, __): + if self.wizard_goto_step: + # goto get_response directly + return False + return __() + + def _done(self): + cleaned_data = self.get_all_cleaned_data() + exclude = self.admin_view.exclude + + opts = self.admin_view.opts + instance = self.admin_view.org_obj or self.admin_view.model() + + file_field_list = [] + for f in opts.fields: + if not f.editable or isinstance(f, models.AutoField) \ + or not f.name in cleaned_data: + continue + if exclude and f.name in exclude: + continue + # Defer saving file-type fields until after the other fields, so a + # callable upload_to can use the values from other fields. + if isinstance(f, models.FileField): + file_field_list.append(f) + else: + f.save_form_data(instance, cleaned_data[f.name]) + + for f in file_field_list: + f.save_form_data(instance, cleaned_data[f.name]) + + instance.save() + + for f in opts.many_to_many: + if f.name in cleaned_data: + f.save_form_data(instance, cleaned_data[f.name]) + + self.admin_view.new_obj = instance + + def save_forms(self, __): + # if the form is valid, store the cleaned data and files. + form_obj = self.admin_view.form_obj + self.storage.set_step_data(self.steps.current, form_obj.data) + self.storage.set_step_files(self.steps.current, form_obj.files) + + # check if the current step is the last step + if self.steps.current == self.steps.last: + # no more steps, render done view + return self._done() + + def save_models(self, __): + pass + + def save_related(self, __): + pass + + def get_context(self, context): + context.update({ + "show_save": False, + "show_save_as_new": False, + "show_save_and_add_another": False, + "show_save_and_continue": False, + }) + return context + + def get_response(self, response): + self.storage.update_response(response) + return response + + def post_response(self, __): + if self.steps.current == self.steps.last: + self.storage.reset() + return __() + + # change the stored current step + self.storage.current_step = self.steps.next + + self.admin_view.form_obj = self.get_step_form_obj() + self.admin_view.setup_forms() + + return self.admin_view.get_response() + + def get_all_cleaned_data(self): + """ + Returns a merged dictionary of all step cleaned_data dictionaries. + If a step contains a `FormSet`, the key will be prefixed with formset + and contain a list of the formset cleaned_data dictionaries. + """ + cleaned_data = {} + for form_key, attrs in self.get_form_list().items(): + form_obj = self.get_step_form_obj(form_key) + if form_obj.is_valid(): + if type(attrs) is dict and 'convert' in attrs: + callback = attrs['convert'] + if callable(callback): + callback(self, cleaned_data, form_obj) + elif hasattr(self.admin_view, str(callback)): + getattr(self.admin_view, + str(callback))(self, cleaned_data, form_obj) + elif isinstance(form_obj.cleaned_data, (tuple, list)): + cleaned_data.update({ + 'formset-%s' % form_key: form_obj.cleaned_data + }) + else: + cleaned_data.update(form_obj.cleaned_data) + return cleaned_data + + def get_cleaned_data_for_step(self, step): + """ + Returns the cleaned data for a given `step`. Before returning the + cleaned data, the stored values are being revalidated through the + form. If the data doesn't validate, None will be returned. + """ + if step in self.get_form_list(): + form_obj = self.get_step_form_obj(step) + if form_obj.is_valid(): + return form_obj.cleaned_data + return None + + def get_next_step(self, step=None): + """ + Returns the next step after the given `step`. If no more steps are + available, None will be returned. If the `step` argument is None, the + current step will be determined automatically. + """ + if step is None: + step = self.steps.current + obj = self.get_form_list().keys() + if six.PY3: + obj = [s for s in obj] + key = obj.index(step) + 1 + if len(obj) > key: + return obj[key] + return None + + def get_prev_step(self, step=None): + """ + Returns the previous step before the given `step`. If there are no + steps available, None will be returned. If the `step` argument is + None, the current step will be determined automatically. + """ + if step is None: + step = self.steps.current + obj = self.get_form_list().keys() + if six.PY3: + obj = [s for s in obj] + key = obj.index(step) - 1 + if key >= 0: + return obj[key] + return None + + def get_step_index(self, step=None): + """ + Returns the index for the given `step` name. If no step is given, + the current step will be used to get the index. + """ + if step is None: + step = self.steps.current + obj = self.get_form_list().keys() + if six.PY3: + obj = [s for s in obj] + return obj.index(step) + + def block_before_fieldsets(self, context, nodes): + context = context.update(dict(self.storage.extra_data)) + context['wizard'] = { + 'steps': self.steps, + 'management_form': ManagementForm(prefix=self.prefix, initial={ + 'current_step': self.steps.current, + }), + } + nodes.append(loader.render_to_string('xadmin/blocks/model_form.before_fieldsets.wizard.html', context)) + + def block_submit_line(self, context, nodes): + context = context.update(dict(self.storage.extra_data)) + context['wizard'] = { + 'steps': self.steps + } + + nodes.append(loader.render_to_string('xadmin/blocks/model_form.submit_line.wizard.html', context)) + +site.register_plugin(WizardFormPlugin, ModelFormAdminView) diff --git "a/8\343\200\201\346\226\207\347\214\256\346\225\260\346\215\256\346\214\226\346\216\230\347\263\273\347\273\237(\351\231\204\346\272\220\347\240\201)/extra_apps/xadmin/plugins/xversion.py" "b/8\343\200\201\346\226\207\347\214\256\346\225\260\346\215\256\346\214\226\346\216\230\347\263\273\347\273\237(\351\231\204\346\272\220\347\240\201)/extra_apps/xadmin/plugins/xversion.py" new file mode 100644 index 0000000..a0f6107 --- /dev/null +++ "b/8\343\200\201\346\226\207\347\214\256\346\225\260\346\215\256\346\214\226\346\216\230\347\263\273\347\273\237(\351\231\204\346\272\220\347\240\201)/extra_apps/xadmin/plugins/xversion.py" @@ -0,0 +1,618 @@ +from crispy_forms.utils import TEMPLATE_PACK +from django.contrib.contenttypes.fields import GenericRelation +from django.contrib.contenttypes.models import ContentType +from django.core.exceptions import PermissionDenied +from django.db import models +from django.db.models.query import QuerySet +from django.forms.models import model_to_dict +from django.http import HttpResponseRedirect +from django.shortcuts import get_object_or_404 +from django.template.response import TemplateResponse +from django.utils import six +from django.utils.encoding import force_text, smart_text +from django.utils.safestring import mark_safe +from django.utils.text import capfirst +from django.utils.translation import ugettext as _ +from xadmin.layout import Field, render_field +from xadmin.plugins.inline import Inline +from xadmin.plugins.actions import BaseActionView +from xadmin.plugins.inline import InlineModelAdmin +from xadmin.sites import site +from xadmin.util import unquote, quote, model_format_dict, is_related_field2 +from xadmin.views import BaseAdminPlugin, ModelAdminView, CreateAdminView, UpdateAdminView, DetailAdminView, ModelFormAdminView, DeleteAdminView, ListAdminView +from xadmin.views.base import csrf_protect_m, filter_hook +from xadmin.views.detail import DetailAdminUtil +from reversion.models import Revision, Version +from reversion.revisions import is_active, register, is_registered, set_comment, create_revision, set_user +from contextlib import contextmanager +from functools import partial + + +def _autoregister(admin, model, follow=None): + """Registers a model with reversion, if required.""" + if model._meta.proxy: + raise RegistrationError("Proxy models cannot be used with django-reversion, register the parent class instead") + if not is_registered(model): + follow = follow or [] + for parent_cls, field in model._meta.parents.items(): + follow.append(field.name) + _autoregister(admin, parent_cls) + register(model, follow=follow, format=admin.reversion_format) + + +def _register_model(admin, model): + if not hasattr(admin, 'reversion_format'): + admin.reversion_format = 'json' + + if not is_registered(model): + inline_fields = [] + for inline in getattr(admin, 'inlines', []): + inline_model = inline.model + if getattr(inline, 'generic_inline', False): + ct_field = getattr(inline, 'ct_field', 'content_type') + ct_fk_field = getattr(inline, 'ct_fk_field', 'object_id') + for field in model._meta.many_to_many: + if isinstance(field, GenericRelation) \ + and field.rel.to == inline_model \ + and field.object_id_field_name == ct_fk_field \ + and field.content_type_field_name == ct_field: + inline_fields.append(field.name) + _autoregister(admin, inline_model) + else: + fk_name = getattr(inline, 'fk_name', None) + if not fk_name: + for field in inline_model._meta.fields: + if isinstance(field, (models.ForeignKey, models.OneToOneField)) and issubclass(model, field.remote_field.model): + fk_name = field.name + _autoregister(admin, inline_model, follow=[fk_name]) + if not inline_model._meta.get_field(fk_name).remote_field.is_hidden(): + accessor = inline_model._meta.get_field(fk_name).remote_field.get_accessor_name() + inline_fields.append(accessor) + _autoregister(admin, model, inline_fields) + + +def register_models(admin_site=None): + if admin_site is None: + admin_site = site + + for model, admin in admin_site._registry.items(): + if getattr(admin, 'reversion_enable', False): + _register_model(admin, model) + + +@contextmanager +def do_create_revision(request): + with create_revision(): + set_user(request.user) + yield + + +class ReversionPlugin(BaseAdminPlugin): + + # The serialization format to use when registering models with reversion. + reversion_format = "json" + + # Whether to ignore duplicate revision data. + ignore_duplicate_revisions = False + + reversion_enable = False + + def init_request(self, *args, **kwargs): + return self.reversion_enable + + def do_post(self, __): + def _method(): + self.revision_context_manager.set_user(self.user) + comment = '' + admin_view = self.admin_view + if isinstance(admin_view, CreateAdminView): + comment = _(u"Initial version.") + elif isinstance(admin_view, UpdateAdminView): + comment = _(u"Change version.") + elif isinstance(admin_view, RevisionView): + comment = _(u"Revert version.") + elif isinstance(admin_view, RecoverView): + comment = _(u"Rercover version.") + elif isinstance(admin_view, DeleteAdminView): + comment = _(u"Deleted %(verbose_name)s.") % { + "verbose_name": self.opts.verbose_name} + self.revision_context_manager.set_comment(comment) + return __() + return _method + + def post(self, __, request, *args, **kwargs): + with do_create_revision(request): + return __() + + # Block Views + def block_top_toolbar(self, context, nodes): + recoverlist_url = self.admin_view.model_admin_url('recoverlist') + nodes.append(mark_safe('' % (recoverlist_url, _(u"Recover")))) + + def block_nav_toggles(self, context, nodes): + obj = getattr( + self.admin_view, 'org_obj', getattr(self.admin_view, 'obj', None)) + if obj: + revisionlist_url = self.admin_view.model_admin_url( + 'revisionlist', quote(obj.pk)) + nodes.append(mark_safe('' % revisionlist_url)) + + def block_nav_btns(self, context, nodes): + obj = getattr( + self.admin_view, 'org_obj', getattr(self.admin_view, 'obj', None)) + if obj: + revisionlist_url = self.admin_view.model_admin_url( + 'revisionlist', quote(obj.pk)) + nodes.append(mark_safe(' %s' % (revisionlist_url, _(u'History')))) + +# action revision + + +class ActionRevisionPlugin(BaseAdminPlugin): + + reversion_enable = False + + def init_request(self, *args, **kwargs): + return self.reversion_enable + + def do_action(self, __, queryset): + with do_create_revision(self.request): + return __() + + +class BaseReversionView(ModelAdminView): + + # The serialization format to use when registering models with reversion. + reversion_format = "json" + + # Whether to ignore duplicate revision data. + ignore_duplicate_revisions = False + + # If True, then the default ordering of object_history and recover lists will be reversed. + history_latest_first = False + + reversion_enable = False + + def init_request(self, *args, **kwargs): + if not self.has_change_permission() and not self.has_add_permission(): + raise PermissionDenied + + def _order_version_queryset(self, queryset): + """Applies the correct ordering to the given version queryset.""" + if self.history_latest_first: + return queryset.order_by("-pk") + return queryset.order_by("pk") + + +class RecoverListView(BaseReversionView): + + recover_list_template = None + + def get_context(self): + context = super(RecoverListView, self).get_context() + opts = self.opts + deleted = self._order_version_queryset(Version.objects.get_deleted(self.model)) + context.update({ + "opts": opts, + "app_label": opts.app_label, + "model_name": capfirst(opts.verbose_name), + "title": _("Recover deleted %(name)s") % {"name": force_text(opts.verbose_name_plural)}, + "deleted": deleted, + "changelist_url": self.model_admin_url("changelist"), + }) + return context + + @csrf_protect_m + def get(self, request, *args, **kwargs): + context = self.get_context() + + return TemplateResponse( + request, self.recover_list_template or self.get_template_list( + "views/recover_list.html"), + context) + + +class RevisionListView(BaseReversionView): + + object_history_template = None + revision_diff_template = None + + def _reversion_order_version_queryset(self, queryset): + """Applies the correct ordering to the given version queryset.""" + if not self.history_latest_first: + queryset = queryset.order_by("pk") + return queryset + + def get_context(self): + context = super(RevisionListView, self).get_context() + + opts = self.opts + action_list = [ + { + "revision": version.revision, + "url": self.model_admin_url('revision', quote(version.object_id), version.id), + "version": version + } + for version + in self._reversion_order_version_queryset(Version.objects.get_for_object_reference( + self.model, + self.obj.pk, + ).select_related("revision__user")) + ] + context.update({ + 'title': _('Change history: %s') % force_text(self.obj), + 'action_list': action_list, + 'model_name': capfirst(force_text(opts.verbose_name_plural)), + 'object': self.obj, + 'app_label': opts.app_label, + "changelist_url": self.model_admin_url("changelist"), + "update_url": self.model_admin_url("change", self.obj.pk), + 'opts': opts, + }) + return context + + def get(self, request, object_id, *args, **kwargs): + object_id = unquote(object_id) + self.obj = self.get_object(object_id) + + if not self.has_change_permission(self.obj): + raise PermissionDenied + + return self.get_response() + + def get_response(self): + context = self.get_context() + + return TemplateResponse(self.request, self.object_history_template or + self.get_template_list('views/model_history.html'), context) + + def get_version_object(self, version): + obj_version = version._object_version + obj = obj_version.object + obj._state.db = self.obj._state.db + + for field_name, pks in obj_version.m2m_data.items(): + f = self.opts.get_field(field_name) + if f.rel and isinstance(f.rel, models.ManyToManyRel): + setattr(obj, f.name, f.rel.to._default_manager.get_query_set( + ).filter(pk__in=pks).all()) + + detail = self.get_model_view(DetailAdminUtil, self.model, obj) + + return obj, detail + + def post(self, request, object_id, *args, **kwargs): + object_id = unquote(object_id) + self.obj = self.get_object(object_id) + + if not self.has_change_permission(self.obj): + raise PermissionDenied + + params = self.request.POST + if 'version_a' not in params or 'version_b' not in params: + self.message_user(_("Must select two versions."), 'error') + return self.get_response() + + version_a_id = params['version_a'] + version_b_id = params['version_b'] + + if version_a_id == version_b_id: + self.message_user( + _("Please select two different versions."), 'error') + return self.get_response() + + version_a = get_object_or_404(Version, pk=version_a_id) + version_b = get_object_or_404(Version, pk=version_b_id) + + diffs = [] + + obj_a, detail_a = self.get_version_object(version_a) + obj_b, detail_b = self.get_version_object(version_b) + + for f in (self.opts.fields + self.opts.many_to_many): + if is_related_field2(f): + label = f.opts.verbose_name + else: + label = f.verbose_name + + value_a = f.value_from_object(obj_a) + value_b = f.value_from_object(obj_b) + is_diff = value_a != value_b + + if type(value_a) in (list, tuple) and type(value_b) in (list, tuple) \ + and len(value_a) == len(value_b) and is_diff: + is_diff = False + for i in xrange(len(value_a)): + if value_a[i] != value_a[i]: + is_diff = True + break + if type(value_a) is QuerySet and type(value_b) is QuerySet: + is_diff = list(value_a) != list(value_b) + + diffs.append((label, detail_a.get_field_result( + f.name).val, detail_b.get_field_result(f.name).val, is_diff)) + + context = super(RevisionListView, self).get_context() + context.update({ + 'object': self.obj, + 'opts': self.opts, + 'version_a': version_a, + 'version_b': version_b, + 'revision_a_url': self.model_admin_url('revision', quote(version_a.object_id), version_a.id), + 'revision_b_url': self.model_admin_url('revision', quote(version_b.object_id), version_b.id), + 'diffs': diffs + }) + + return TemplateResponse( + self.request, self.revision_diff_template or self.get_template_list('views/revision_diff.html'), + context) + + @filter_hook + def get_media(self): + return super(RevisionListView, self).get_media() + self.vendor('xadmin.plugin.revision.js', 'xadmin.form.css') + + +class BaseRevisionView(ModelFormAdminView): + + @filter_hook + def get_revision(self): + return self.version.field_dict + + @filter_hook + def get_form_datas(self): + datas = {"instance": self.org_obj, "initial": self.get_revision()} + if self.request_method == 'post': + datas.update( + {'data': self.request.POST, 'files': self.request.FILES}) + return datas + + @filter_hook + def get_context(self): + context = super(BaseRevisionView, self).get_context() + context.update({ + 'object': self.org_obj + }) + return context + + @filter_hook + def get_media(self): + return super(BaseRevisionView, self).get_media() + self.vendor('xadmin.plugin.revision.js') + + +class DiffField(Field): + + def render(self, form, form_style, context, template_pack=TEMPLATE_PACK, **kwargs): + html = '' + for field in self.fields: + html += ('
    %s
    ' % + (_('Current: %s') % self.attrs.pop('orgdata', ''), render_field(field, form, form_style, context, template_pack=template_pack, attrs=self.attrs))) + return html + + +class RevisionView(BaseRevisionView): + + revision_form_template = None + + def init_request(self, object_id, version_id): + self.detail = self.get_model_view( + DetailAdminView, self.model, object_id) + self.org_obj = self.detail.obj + self.version = get_object_or_404( + Version, pk=version_id, object_id=smart_text(self.org_obj.pk)) + + self.prepare_form() + + def get_form_helper(self): + helper = super(RevisionView, self).get_form_helper() + diff_fields = {} + version_data = self.version.field_dict + + for f in self.opts.fields: + fvalue = f.value_from_object(self.org_obj) + vvalue = version_data.get(f.name, None) + + if fvalue is None and vvalue == '': + vvalue = None + if is_related_field2(f): + vvalue = version_data.get(f.name + '_' + f.rel.get_related_field().name, None) + + if fvalue != vvalue: + diff_fields[f.name] = self.detail.get_field_result(f.name).val + for k, v in diff_fields.items(): + helper[k].wrap(DiffField, orgdata=v) + return helper + + @filter_hook + def get_context(self): + context = super(RevisionView, self).get_context() + context["title"] = _( + "Revert %s") % force_text(self.model._meta.verbose_name) + return context + + @filter_hook + def get_response(self): + context = self.get_context() + context.update(self.kwargs or {}) + + form_template = self.revision_form_template + return TemplateResponse( + self.request, form_template or self.get_template_list( + 'views/revision_form.html'), + context) + + @filter_hook + def post_response(self): + self.message_user(_('The %(model)s "%(name)s" was reverted successfully. You may edit it again below.') % + {"model": force_text(self.opts.verbose_name), "name": smart_text(self.new_obj)}, 'success') + return HttpResponseRedirect(self.model_admin_url('change', self.new_obj.pk)) + + +class RecoverView(BaseRevisionView): + + recover_form_template = None + + def init_request(self, version_id): + if not self.has_change_permission() and not self.has_add_permission(): + raise PermissionDenied + + self.version = get_object_or_404(Version, pk=version_id) + self.org_obj = self.version._object_version.object + + self.prepare_form() + + @filter_hook + def get_context(self): + context = super(RecoverView, self).get_context() + context["title"] = _("Recover %s") % self.version.object_repr + return context + + @filter_hook + def get_response(self): + context = self.get_context() + context.update(self.kwargs or {}) + + form_template = self.recover_form_template + return TemplateResponse( + self.request, form_template or self.get_template_list( + 'views/recover_form.html'), + context) + + @filter_hook + def post_response(self): + self.message_user(_('The %(model)s "%(name)s" was recovered successfully. You may edit it again below.') % + {"model": force_text(self.opts.verbose_name), "name": smart_text(self.new_obj)}, 'success') + return HttpResponseRedirect(self.model_admin_url('change', self.new_obj.pk)) + + +class InlineDiffField(Field): + + def render(self, form, form_style, context, template_pack=TEMPLATE_PACK, **kwargs): + html = '' + instance = form.instance + if not instance.pk: + return super(InlineDiffField, self).render(form, form_style, context) + + initial = form.initial + opts = instance._meta + detail = form.detail + for field in self.fields: + f = opts.get_field(field) + f_html = render_field(field, form, form_style, context, + template_pack=template_pack, attrs=self.attrs) + if f.value_from_object(instance) != initial.get(field, None): + current_val = detail.get_field_result(f.name).val + html += ('
    %s
    ' + % (_('Current: %s') % current_val, f_html)) + else: + html += f_html + return html + +# inline hack plugin + + +class InlineRevisionPlugin(BaseAdminPlugin): + + def get_related_versions(self, obj, version, formset): + """Retreives all the related Version objects for the given FormSet.""" + object_id = obj.pk + # Get the fk name. + try: + fk_name = formset.fk.name + '_' + formset.fk.rel.get_related_field().name + except AttributeError: + # This is a GenericInlineFormset, or similar. + fk_name = formset.ct_fk_field.name + # Look up the revision data. + revision_versions = version.revision.version_set.all() + related_versions = dict([(related_version.object_id, related_version) + for related_version in revision_versions + if ContentType.objects.get_for_id(related_version.content_type_id).model_class() == formset.model + and smart_text(related_version.field_dict[fk_name]) == smart_text(object_id)]) + return related_versions + + def _hack_inline_formset_initial(self, revision_view, formset): + """Hacks the given formset to contain the correct initial data.""" + # Now we hack it to push in the data from the revision! + initial = [] + related_versions = self.get_related_versions( + revision_view.org_obj, revision_view.version, formset) + formset.related_versions = related_versions + for related_obj in formset.queryset: + if smart_text(related_obj.pk) in related_versions: + initial.append( + related_versions.pop(smart_text(related_obj.pk)).field_dict) + else: + initial_data = model_to_dict(related_obj) + initial_data["DELETE"] = True + initial.append(initial_data) + for related_version in related_versions.values(): + initial_row = related_version.field_dict + pk_name = ContentType.objects.get_for_id( + related_version.content_type_id).model_class()._meta.pk.name + del initial_row[pk_name] + initial.append(initial_row) + # Reconstruct the forms with the new revision data. + formset.initial = initial + formset.forms = [formset._construct_form( + n) for n in xrange(len(initial))] + # Hack the formset to force a save of everything. + + def get_changed_data(form): + return [field.name for field in form.fields] + for form in formset.forms: + form.has_changed = lambda: True + form._get_changed_data = partial(get_changed_data, form=form) + + def total_form_count_hack(count): + return lambda: count + formset.total_form_count = total_form_count_hack(len(initial)) + + if self.request.method == 'GET' and formset.helper and formset.helper.layout: + helper = formset.helper + cls_str = str if six.PY3 else basestring + helper.filter(cls_str).wrap(InlineDiffField) + fake_admin_class = type(str('%s%sFakeAdmin' % (self.opts.app_label, self.opts.model_name)), (object, ), {'model': self.model}) + for form in formset.forms: + instance = form.instance + if instance.pk: + form.detail = self.get_view( + DetailAdminUtil, fake_admin_class, instance) + + def instance_form(self, formset, **kwargs): + admin_view = self.admin_view.admin_view + if hasattr(admin_view, 'version') and hasattr(admin_view, 'org_obj'): + self._hack_inline_formset_initial(admin_view, formset) + return formset + + +class VersionInline(object): + model = Version + extra = 0 + style = 'accordion' + + +class ReversionAdmin(object): + model_icon = 'fa fa-exchange' + + list_display = ('__str__', 'date_created', 'user', 'comment') + list_display_links = ('__str__',) + + list_filter = ('date_created', 'user') + inlines = [VersionInline] + +site.register(Revision, ReversionAdmin) + +site.register_modelview( + r'^recover/$', RecoverListView, name='%s_%s_recoverlist') +site.register_modelview( + r'^recover/([^/]+)/$', RecoverView, name='%s_%s_recover') +site.register_modelview( + r'^([^/]+)/revision/$', RevisionListView, name='%s_%s_revisionlist') +site.register_modelview( + r'^([^/]+)/revision/([^/]+)/$', RevisionView, name='%s_%s_revision') + +site.register_plugin(ReversionPlugin, ListAdminView) +site.register_plugin(ReversionPlugin, ModelFormAdminView) +site.register_plugin(ReversionPlugin, DeleteAdminView) + +site.register_plugin(InlineRevisionPlugin, InlineModelAdmin) +site.register_plugin(ActionRevisionPlugin, BaseActionView) diff --git "a/8\343\200\201\346\226\207\347\214\256\346\225\260\346\215\256\346\214\226\346\216\230\347\263\273\347\273\237(\351\231\204\346\272\220\347\240\201)/extra_apps/xadmin/sites.py" "b/8\343\200\201\346\226\207\347\214\256\346\225\260\346\215\256\346\214\226\346\216\230\347\263\273\347\273\237(\351\231\204\346\272\220\347\240\201)/extra_apps/xadmin/sites.py" new file mode 100644 index 0000000..fe5f4da --- /dev/null +++ "b/8\343\200\201\346\226\207\347\214\256\346\225\260\346\215\256\346\214\226\346\216\230\347\263\273\347\273\237(\351\231\204\346\272\220\347\240\201)/extra_apps/xadmin/sites.py" @@ -0,0 +1,361 @@ +import sys +from functools import update_wrapper +from future.utils import iteritems +from django.conf import settings +from django.core.exceptions import ImproperlyConfigured +from django.db.models.base import ModelBase +from django.utils import six +from django.views.decorators.cache import never_cache +from django.template.engine import Engine +import inspect + +if six.PY2 and sys.getdefaultencoding() == 'ascii': + import imp + imp.reload(sys) + sys.setdefaultencoding("utf-8") + + +class AlreadyRegistered(Exception): + pass + + +class NotRegistered(Exception): + pass + + +class MergeAdminMetaclass(type): + + def __new__(cls, name, bases, attrs): + return type.__new__(cls, str(name), bases, attrs) + + +class AdminSite(object): + + def __init__(self, name='xadmin'): + self.name = name + self.app_name = 'xadmin' + + self._registry = {} # model_class class -> admin_class class + self._registry_avs = {} # admin_view_class class -> admin_class class + self._registry_settings = {} # settings name -> admin_class class + self._registry_views = [] + # url instance contains (path, admin_view class, name) + self._registry_modelviews = [] + # url instance contains (path, admin_view class, name) + self._registry_plugins = {} # view_class class -> plugin_class class + + self._admin_view_cache = {} + + # self.check_dependencies() + + self.model_admins_order = 0 + + def copy_registry(self): + import copy + return { + 'models': copy.copy(self._registry), + 'avs': copy.copy(self._registry_avs), + 'views': copy.copy(self._registry_views), + 'settings': copy.copy(self._registry_settings), + 'modelviews': copy.copy(self._registry_modelviews), + 'plugins': copy.copy(self._registry_plugins), + } + + def restore_registry(self, data): + self._registry = data['models'] + self._registry_avs = data['avs'] + self._registry_views = data['views'] + self._registry_settings = data['settings'] + self._registry_modelviews = data['modelviews'] + self._registry_plugins = data['plugins'] + + def register_modelview(self, path, admin_view_class, name): + from xadmin.views.base import BaseAdminView + if issubclass(admin_view_class, BaseAdminView): + self._registry_modelviews.append((path, admin_view_class, name)) + else: + raise ImproperlyConfigured(u'The registered view class %s isn\'t subclass of %s' % + (admin_view_class.__name__, BaseAdminView.__name__)) + + def register_view(self, path, admin_view_class, name): + self._registry_views.append((path, admin_view_class, name)) + + def register_plugin(self, plugin_class, admin_view_class): + from xadmin.views.base import BaseAdminPlugin + if issubclass(plugin_class, BaseAdminPlugin): + self._registry_plugins.setdefault( + admin_view_class, []).append(plugin_class) + else: + raise ImproperlyConfigured(u'The registered plugin class %s isn\'t subclass of %s' % + (plugin_class.__name__, BaseAdminPlugin.__name__)) + + def register_settings(self, name, admin_class): + self._registry_settings[name.lower()] = admin_class + + def register(self, model_or_iterable, admin_class=object, **options): + from xadmin.views.base import BaseAdminView + if isinstance(model_or_iterable, ModelBase) or issubclass(model_or_iterable, BaseAdminView): + model_or_iterable = [model_or_iterable] + for model in model_or_iterable: + if isinstance(model, ModelBase): + if model._meta.abstract: + raise ImproperlyConfigured('The model %s is abstract, so it ' + 'cannot be registered with admin.' % model.__name__) + + if model in self._registry: + raise AlreadyRegistered( + 'The model %s is already registered' % model.__name__) + + # If we got **options then dynamically construct a subclass of + # admin_class with those **options. + if options: + # For reasons I don't quite understand, without a __module__ + # the created class appears to "live" in the wrong place, + # which causes issues later on. + options['__module__'] = __name__ + + admin_class = type(str("%s%sAdmin" % (model._meta.app_label, model._meta.model_name)), (admin_class,), options or {}) + admin_class.model = model + admin_class.order = self.model_admins_order + self.model_admins_order += 1 + self._registry[model] = admin_class + else: + if model in self._registry_avs: + raise AlreadyRegistered('The admin_view_class %s is already registered' % model.__name__) + if options: + options['__module__'] = __name__ + admin_class = type(str( + "%sAdmin" % model.__name__), (admin_class,), options) + + # Instantiate the admin class to save in the registry + self._registry_avs[model] = admin_class + + def unregister(self, model_or_iterable): + """ + Unregisters the given model(s). + + If a model isn't already registered, this will raise NotRegistered. + """ + from xadmin.views.base import BaseAdminView + if isinstance(model_or_iterable, (ModelBase, BaseAdminView)): + model_or_iterable = [model_or_iterable] + for model in model_or_iterable: + if isinstance(model, ModelBase): + if model not in self._registry: + raise NotRegistered( + 'The model %s is not registered' % model.__name__) + del self._registry[model] + else: + if model not in self._registry_avs: + raise NotRegistered('The admin_view_class %s is not registered' % model.__name__) + del self._registry_avs[model] + + def set_loginview(self, login_view): + self.login_view = login_view + + def has_permission(self, request): + """ + Returns True if the given HttpRequest has permission to view + *at least one* page in the admin site. + """ + return request.user.is_active and request.user.is_staff + + def check_dependencies(self): + """ + Check that all things needed to run the admin have been correctly installed. + + The default implementation checks that LogEntry, ContentType and the + auth context processor are installed. + """ + from django.contrib.contenttypes.models import ContentType + + if not ContentType._meta.installed: + raise ImproperlyConfigured("Put 'django.contrib.contenttypes' in " + "your INSTALLED_APPS setting in order to use the admin application.") + + default_template_engine = Engine.get_default() + if not ('django.contrib.auth.context_processors.auth' in default_template_engine.context_processors or + 'django.core.context_processors.auth' in default_template_engine.context_processors): + raise ImproperlyConfigured("Put 'django.contrib.auth.context_processors.auth' " + "in your TEMPLATE_CONTEXT_PROCESSORS setting in order to use the admin application.") + + def admin_view(self, view, cacheable=False): + """ + Decorator to create an admin view attached to this ``AdminSite``. This + wraps the view and provides permission checking by calling + ``self.has_permission``. + + You'll want to use this from within ``AdminSite.get_urls()``: + + class MyAdminSite(AdminSite): + + def get_urls(self): + from django.conf.urls import url + + urls = super(MyAdminSite, self).get_urls() + urls += [ + url(r'^my_view/$', self.admin_view(some_view)) + ] + return urls + + By default, admin_views are marked non-cacheable using the + ``never_cache`` decorator. If the view can be safely cached, set + cacheable=True. + """ + def inner(request, *args, **kwargs): + if not self.has_permission(request) and getattr(view, 'need_site_permission', True): + return self.create_admin_view(self.login_view)(request, *args, **kwargs) + return view(request, *args, **kwargs) + if not cacheable: + inner = never_cache(inner) + return update_wrapper(inner, view) + + def _get_merge_attrs(self, option_class, plugin_class): + return dict([(name, getattr(option_class, name)) for name in dir(option_class) + if name[0] != '_' and not callable(getattr(option_class, name)) and hasattr(plugin_class, name)]) + + def _get_settings_class(self, admin_view_class): + name = admin_view_class.__name__.lower() + + if name in self._registry_settings: + return self._registry_settings[name] + elif name.endswith('admin') and name[0:-5] in self._registry_settings: + return self._registry_settings[name[0:-5]] + elif name.endswith('adminview') and name[0:-9] in self._registry_settings: + return self._registry_settings[name[0:-9]] + + return None + + def _create_plugin(self, option_classes): + def merge_class(plugin_class): + if option_classes: + attrs = {} + bases = [plugin_class] + for oc in option_classes: + attrs.update(self._get_merge_attrs(oc, plugin_class)) + meta_class = getattr(oc, plugin_class.__name__, getattr(oc, plugin_class.__name__.replace('Plugin', ''), None)) + if meta_class: + bases.insert(0, meta_class) + if attrs: + plugin_class = MergeAdminMetaclass( + '%s%s' % (''.join([oc.__name__ for oc in option_classes]), plugin_class.__name__), + tuple(bases), attrs) + return plugin_class + return merge_class + + def get_plugins(self, admin_view_class, *option_classes): + from xadmin.views import BaseAdminView + plugins = [] + opts = [oc for oc in option_classes if oc] + for klass in admin_view_class.mro(): + if klass == BaseAdminView or issubclass(klass, BaseAdminView): + merge_opts = [] + reg_class = self._registry_avs.get(klass) + if reg_class: + merge_opts.append(reg_class) + settings_class = self._get_settings_class(klass) + if settings_class: + merge_opts.append(settings_class) + merge_opts.extend(opts) + ps = self._registry_plugins.get(klass, []) + plugins.extend(map(self._create_plugin( + merge_opts), ps) if merge_opts else ps) + return plugins + + def get_view_class(self, view_class, option_class=None, **opts): + merges = [option_class] if option_class else [] + for klass in view_class.mro(): + reg_class = self._registry_avs.get(klass) + if reg_class: + merges.append(reg_class) + settings_class = self._get_settings_class(klass) + if settings_class: + merges.append(settings_class) + merges.append(klass) + new_class_name = ''.join([c.__name__ for c in merges]) + + if new_class_name not in self._admin_view_cache: + plugins = self.get_plugins(view_class, option_class) + self._admin_view_cache[new_class_name] = MergeAdminMetaclass( + new_class_name, tuple(merges), + dict({'plugin_classes': plugins, 'admin_site': self}, **opts)) + + return self._admin_view_cache[new_class_name] + + def create_admin_view(self, admin_view_class): + return self.get_view_class(admin_view_class).as_view() + + def create_model_admin_view(self, admin_view_class, model, option_class): + return self.get_view_class(admin_view_class, option_class).as_view() + + def get_urls(self): + from django.urls import include, path, re_path + from xadmin.views.base import BaseAdminView + + if settings.DEBUG: + self.check_dependencies() + + def wrap(view, cacheable=False): + def wrapper(*args, **kwargs): + return self.admin_view(view, cacheable)(*args, **kwargs) + wrapper.admin_site = self + return update_wrapper(wrapper, view) + + # Admin-site-wide views. + urlpatterns = [ + path('jsi18n/', wrap(self.i18n_javascript, cacheable=True), name='jsi18n') + ] + + # Registed admin views + # inspect[isclass]: Only checks if the object is a class. With it lets you create an custom view that + # inherits from multiple views and have more of a metaclass. + urlpatterns += [ + re_path( + _path, + wrap(self.create_admin_view(clz_or_func)) + if inspect.isclass(clz_or_func) and issubclass(clz_or_func, BaseAdminView) + else include(clz_or_func(self)), + name=name + ) + for _path, clz_or_func, name in self._registry_views + ] + + # Add in each model's views. + for model, admin_class in iteritems(self._registry): + view_urls = [ + re_path( + _path, + wrap(self.create_model_admin_view(clz, model, admin_class)), + name=name % (model._meta.app_label, model._meta.model_name) + ) + for _path, clz, name in self._registry_modelviews + ] + urlpatterns += [ + re_path(r'^%s/%s/' % (model._meta.app_label, model._meta.model_name), include(view_urls)) + ] + return urlpatterns + + @property + def urls(self): + return self.get_urls(), self.name, self.app_name + + def i18n_javascript(self, request): + from django.views.i18n import JavaScriptCatalog + """ + Displays the i18n JavaScript that the Django admin requires. + + This takes into account the USE_I18N setting. If it's set to False, the + generated JavaScript will be leaner and faster. + """ + return JavaScriptCatalog.as_view(packages=['django.contrib.admin'])(request) + +# This global object represents the default admin site, for the common case. +# You can instantiate AdminSite in your own code to create a custom admin site. +site = AdminSite() + + +def register(models, **kwargs): + + def _model_admin_wrapper(admin_class): + site.register(models, admin_class) + return _model_admin_wrapper diff --git "a/8\343\200\201\346\226\207\347\214\256\346\225\260\346\215\256\346\214\226\346\216\230\347\263\273\347\273\237(\351\231\204\346\272\220\347\240\201)/extra_apps/xadmin/static/xadmin/component.json" "b/8\343\200\201\346\226\207\347\214\256\346\225\260\346\215\256\346\214\226\346\216\230\347\263\273\347\273\237(\351\231\204\346\272\220\347\240\201)/extra_apps/xadmin/static/xadmin/component.json" new file mode 100644 index 0000000..a81adb9 --- /dev/null +++ "b/8\343\200\201\346\226\207\347\214\256\346\225\260\346\215\256\346\214\226\346\216\230\347\263\273\347\273\237(\351\231\204\346\272\220\347\240\201)/extra_apps/xadmin/static/xadmin/component.json" @@ -0,0 +1,20 @@ +{ + "name": "xadmin", + "version": "0.1.0", + "dependencies": { + "jquery": ">=1.8.3", + "jquery-ui": ">=1.10.0", + "bootstrap": "http://twitter.github.io/bootstrap/assets/bootstrap.zip", + "bootstrap-timepicker": ">=0.2.3", + "bootstrap-datepicker": ">=1.0.0", + "bootstrap-modal": ">=2.1", + "flot": ">=0.8", + "font-awesome": ">=3.0.2", + "load-image": "blueimp/JavaScript-Load-Image", + "bootstrap-image-gallery": "blueimp/Bootstrap-Image-Gallery", + "select2": ">=3.3.2", + "selectize": ">=0.8.4", + "datejs": "datejs/Datejs", + "bootstrap-multiselect": "davidstutz/bootstrap-multiselect" + } +} \ No newline at end of file diff --git "a/8\343\200\201\346\226\207\347\214\256\346\225\260\346\215\256\346\214\226\346\216\230\347\263\273\347\273\237(\351\231\204\346\272\220\347\240\201)/extra_apps/xadmin/static/xadmin/css/themes/bootstrap-theme.css" "b/8\343\200\201\346\226\207\347\214\256\346\225\260\346\215\256\346\214\226\346\216\230\347\263\273\347\273\237(\351\231\204\346\272\220\347\240\201)/extra_apps/xadmin/static/xadmin/css/themes/bootstrap-theme.css" new file mode 100644 index 0000000..c9c347e --- /dev/null +++ "b/8\343\200\201\346\226\207\347\214\256\346\225\260\346\215\256\346\214\226\346\216\230\347\263\273\347\273\237(\351\231\204\346\272\220\347\240\201)/extra_apps/xadmin/static/xadmin/css/themes/bootstrap-theme.css" @@ -0,0 +1,459 @@ +/*! + * Bootstrap v3.0.2 by @fat and @mdo + * Copyright 2013 Twitter, Inc. + * Licensed under http://www.apache.org/licenses/LICENSE-2.0 + * + * Designed and built with all the love in the world by @mdo and @fat. + */ + +.btn-default, +.btn-primary, +.btn-success, +.btn-info, +.btn-warning, +.btn-danger { + text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.2); + -webkit-box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.15), 0 1px 1px rgba(0, 0, 0, 0.075); + box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.15), 0 1px 1px rgba(0, 0, 0, 0.075); +} + +.btn-default:active, +.btn-primary:active, +.btn-success:active, +.btn-info:active, +.btn-warning:active, +.btn-danger:active, +.btn-default.active, +.btn-primary.active, +.btn-success.active, +.btn-info.active, +.btn-warning.active, +.btn-danger.active { + -webkit-box-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125); + box-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125); +} + +.btn:active, +.btn.active { + background-image: none; +} + +.btn-default { + text-shadow: 0 1px 0 #fff; + background-image: -webkit-gradient(linear, left 0%, left 100%, from(#ffffff), to(#e0e0e0)); + background-image: -webkit-linear-gradient(top, #ffffff 0%, #e0e0e0 100%); + background-image: -moz-linear-gradient(top, #ffffff 0%, #e0e0e0 100%); + background-image: linear-gradient(to bottom, #ffffff 0%, #e0e0e0 100%); + background-repeat: repeat-x; + border-color: #dbdbdb; + border-color: #ccc; + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffffffff', endColorstr='#ffe0e0e0', GradientType=0); + filter: progid:DXImageTransform.Microsoft.gradient(enabled=false); +} + +.btn-default:hover, +.btn-default:focus { + background-color: #e0e0e0; + background-position: 0 -15px; +} + +.btn-default:active, +.btn-default.active { + background-color: #e0e0e0; + border-color: #dbdbdb; +} + +.btn-primary { + background-image: -webkit-gradient(linear, left 0%, left 100%, from(#428bca), to(#2d6ca2)); + background-image: -webkit-linear-gradient(top, #428bca 0%, #2d6ca2 100%); + background-image: -moz-linear-gradient(top, #428bca 0%, #2d6ca2 100%); + background-image: linear-gradient(to bottom, #428bca 0%, #2d6ca2 100%); + background-repeat: repeat-x; + border-color: #2b669a; + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff428bca', endColorstr='#ff2d6ca2', GradientType=0); + filter: progid:DXImageTransform.Microsoft.gradient(enabled=false); +} + +.btn-primary:hover, +.btn-primary:focus { + background-color: #2d6ca2; + background-position: 0 -15px; +} + +.btn-primary:active, +.btn-primary.active { + background-color: #2d6ca2; + border-color: #2b669a; +} + +.btn-success { + background-image: -webkit-gradient(linear, left 0%, left 100%, from(#5cb85c), to(#419641)); + background-image: -webkit-linear-gradient(top, #5cb85c 0%, #419641 100%); + background-image: -moz-linear-gradient(top, #5cb85c 0%, #419641 100%); + background-image: linear-gradient(to bottom, #5cb85c 0%, #419641 100%); + background-repeat: repeat-x; + border-color: #3e8f3e; + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5cb85c', endColorstr='#ff419641', GradientType=0); + filter: progid:DXImageTransform.Microsoft.gradient(enabled=false); +} + +.btn-success:hover, +.btn-success:focus { + background-color: #419641; + background-position: 0 -15px; +} + +.btn-success:active, +.btn-success.active { + background-color: #419641; + border-color: #3e8f3e; +} + +.btn-warning { + background-image: -webkit-gradient(linear, left 0%, left 100%, from(#f0ad4e), to(#eb9316)); + background-image: -webkit-linear-gradient(top, #f0ad4e 0%, #eb9316 100%); + background-image: -moz-linear-gradient(top, #f0ad4e 0%, #eb9316 100%); + background-image: linear-gradient(to bottom, #f0ad4e 0%, #eb9316 100%); + background-repeat: repeat-x; + border-color: #e38d13; + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff0ad4e', endColorstr='#ffeb9316', GradientType=0); + filter: progid:DXImageTransform.Microsoft.gradient(enabled=false); +} + +.btn-warning:hover, +.btn-warning:focus { + background-color: #eb9316; + background-position: 0 -15px; +} + +.btn-warning:active, +.btn-warning.active { + background-color: #eb9316; + border-color: #e38d13; +} + +.btn-danger { + background-image: -webkit-gradient(linear, left 0%, left 100%, from(#d9534f), to(#c12e2a)); + background-image: -webkit-linear-gradient(top, #d9534f 0%, #c12e2a 100%); + background-image: -moz-linear-gradient(top, #d9534f 0%, #c12e2a 100%); + background-image: linear-gradient(to bottom, #d9534f 0%, #c12e2a 100%); + background-repeat: repeat-x; + border-color: #b92c28; + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffd9534f', endColorstr='#ffc12e2a', GradientType=0); + filter: progid:DXImageTransform.Microsoft.gradient(enabled=false); +} + +.btn-danger:hover, +.btn-danger:focus { + background-color: #c12e2a; + background-position: 0 -15px; +} + +.btn-danger:active, +.btn-danger.active { + background-color: #c12e2a; + border-color: #b92c28; +} + +.btn-info { + background-image: -webkit-gradient(linear, left 0%, left 100%, from(#5bc0de), to(#2aabd2)); + background-image: -webkit-linear-gradient(top, #5bc0de 0%, #2aabd2 100%); + background-image: -moz-linear-gradient(top, #5bc0de 0%, #2aabd2 100%); + background-image: linear-gradient(to bottom, #5bc0de 0%, #2aabd2 100%); + background-repeat: repeat-x; + border-color: #28a4c9; + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5bc0de', endColorstr='#ff2aabd2', GradientType=0); + filter: progid:DXImageTransform.Microsoft.gradient(enabled=false); +} + +.btn-info:hover, +.btn-info:focus { + background-color: #2aabd2; + background-position: 0 -15px; +} + +.btn-info:active, +.btn-info.active { + background-color: #2aabd2; + border-color: #28a4c9; +} + +.thumbnail, +.img-thumbnail { + -webkit-box-shadow: 0 1px 2px rgba(0, 0, 0, 0.075); + box-shadow: 0 1px 2px rgba(0, 0, 0, 0.075); +} + +.dropdown-menu > li > a:hover, +.dropdown-menu > li > a:focus { + background-color: #e8e8e8; + background-image: -webkit-gradient(linear, left 0%, left 100%, from(#f5f5f5), to(#e8e8e8)); + background-image: -webkit-linear-gradient(top, #f5f5f5 0%, #e8e8e8 100%); + background-image: -moz-linear-gradient(top, #f5f5f5 0%, #e8e8e8 100%); + background-image: linear-gradient(to bottom, #f5f5f5 0%, #e8e8e8 100%); + background-repeat: repeat-x; + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff5f5f5', endColorstr='#ffe8e8e8', GradientType=0); +} + +.dropdown-menu > .active > a, +.dropdown-menu > .active > a:hover, +.dropdown-menu > .active > a:focus { + background-color: #357ebd; + background-image: -webkit-gradient(linear, left 0%, left 100%, from(#428bca), to(#357ebd)); + background-image: -webkit-linear-gradient(top, #428bca 0%, #357ebd 100%); + background-image: -moz-linear-gradient(top, #428bca 0%, #357ebd 100%); + background-image: linear-gradient(to bottom, #428bca 0%, #357ebd 100%); + background-repeat: repeat-x; + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff428bca', endColorstr='#ff357ebd', GradientType=0); +} + +.navbar-default { + background-image: -webkit-gradient(linear, left 0%, left 100%, from(#ffffff), to(#f8f8f8)); + background-image: -webkit-linear-gradient(top, #ffffff 0%, #f8f8f8 100%); + background-image: -moz-linear-gradient(top, #ffffff 0%, #f8f8f8 100%); + background-image: linear-gradient(to bottom, #ffffff 0%, #f8f8f8 100%); + background-repeat: repeat-x; + border-radius: 4px; + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffffffff', endColorstr='#fff8f8f8', GradientType=0); + filter: progid:DXImageTransform.Microsoft.gradient(enabled=false); + -webkit-box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.15), 0 1px 5px rgba(0, 0, 0, 0.075); + box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.15), 0 1px 5px rgba(0, 0, 0, 0.075); +} + +.navbar-default .navbar-nav > .active > a { + background-image: -webkit-gradient(linear, left 0%, left 100%, from(#ebebeb), to(#f3f3f3)); + background-image: -webkit-linear-gradient(top, #ebebeb 0%, #f3f3f3 100%); + background-image: -moz-linear-gradient(top, #ebebeb 0%, #f3f3f3 100%); + background-image: linear-gradient(to bottom, #ebebeb 0%, #f3f3f3 100%); + background-repeat: repeat-x; + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffebebeb', endColorstr='#fff3f3f3', GradientType=0); + -webkit-box-shadow: inset 0 3px 9px rgba(0, 0, 0, 0.075); + box-shadow: inset 0 3px 9px rgba(0, 0, 0, 0.075); +} + +.navbar-brand, +.navbar-nav > li > a { + text-shadow: 0 1px 0 rgba(255, 255, 255, 0.25); +} + +.navbar-inverse { + background-image: -webkit-gradient(linear, left 0%, left 100%, from(#3c3c3c), to(#222222)); + background-image: -webkit-linear-gradient(top, #3c3c3c 0%, #222222 100%); + background-image: -moz-linear-gradient(top, #3c3c3c 0%, #222222 100%); + background-image: linear-gradient(to bottom, #3c3c3c 0%, #222222 100%); + background-repeat: repeat-x; + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff3c3c3c', endColorstr='#ff222222', GradientType=0); + filter: progid:DXImageTransform.Microsoft.gradient(enabled=false); +} + +.navbar-inverse .navbar-nav > .active > a { + background-image: -webkit-gradient(linear, left 0%, left 100%, from(#222222), to(#282828)); + background-image: -webkit-linear-gradient(top, #222222 0%, #282828 100%); + background-image: -moz-linear-gradient(top, #222222 0%, #282828 100%); + background-image: linear-gradient(to bottom, #222222 0%, #282828 100%); + background-repeat: repeat-x; + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff222222', endColorstr='#ff282828', GradientType=0); + -webkit-box-shadow: inset 0 3px 9px rgba(0, 0, 0, 0.25); + box-shadow: inset 0 3px 9px rgba(0, 0, 0, 0.25); +} + +.navbar-inverse .navbar-brand, +.navbar-inverse .navbar-nav > li > a { + text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25); +} + +.navbar-static-top, +.navbar-fixed-top, +.navbar-fixed-bottom { + border-radius: 0; +} + +.alert { + text-shadow: 0 1px 0 rgba(255, 255, 255, 0.2); + -webkit-box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.25), 0 1px 2px rgba(0, 0, 0, 0.05); + box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.25), 0 1px 2px rgba(0, 0, 0, 0.05); +} + +.alert-success { + background-image: -webkit-gradient(linear, left 0%, left 100%, from(#dff0d8), to(#c8e5bc)); + background-image: -webkit-linear-gradient(top, #dff0d8 0%, #c8e5bc 100%); + background-image: -moz-linear-gradient(top, #dff0d8 0%, #c8e5bc 100%); + background-image: linear-gradient(to bottom, #dff0d8 0%, #c8e5bc 100%); + background-repeat: repeat-x; + border-color: #b2dba1; + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffdff0d8', endColorstr='#ffc8e5bc', GradientType=0); +} + +.alert-info { + background-image: -webkit-gradient(linear, left 0%, left 100%, from(#d9edf7), to(#b9def0)); + background-image: -webkit-linear-gradient(top, #d9edf7 0%, #b9def0 100%); + background-image: -moz-linear-gradient(top, #d9edf7 0%, #b9def0 100%); + background-image: linear-gradient(to bottom, #d9edf7 0%, #b9def0 100%); + background-repeat: repeat-x; + border-color: #9acfea; + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffd9edf7', endColorstr='#ffb9def0', GradientType=0); +} + +.alert-warning { + background-image: -webkit-gradient(linear, left 0%, left 100%, from(#fcf8e3), to(#f8efc0)); + background-image: -webkit-linear-gradient(top, #fcf8e3 0%, #f8efc0 100%); + background-image: -moz-linear-gradient(top, #fcf8e3 0%, #f8efc0 100%); + background-image: linear-gradient(to bottom, #fcf8e3 0%, #f8efc0 100%); + background-repeat: repeat-x; + border-color: #f5e79e; + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fffcf8e3', endColorstr='#fff8efc0', GradientType=0); +} + +.alert-danger { + background-image: -webkit-gradient(linear, left 0%, left 100%, from(#f2dede), to(#e7c3c3)); + background-image: -webkit-linear-gradient(top, #f2dede 0%, #e7c3c3 100%); + background-image: -moz-linear-gradient(top, #f2dede 0%, #e7c3c3 100%); + background-image: linear-gradient(to bottom, #f2dede 0%, #e7c3c3 100%); + background-repeat: repeat-x; + border-color: #dca7a7; + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff2dede', endColorstr='#ffe7c3c3', GradientType=0); +} + +.progress { + background-image: -webkit-gradient(linear, left 0%, left 100%, from(#ebebeb), to(#f5f5f5)); + background-image: -webkit-linear-gradient(top, #ebebeb 0%, #f5f5f5 100%); + background-image: -moz-linear-gradient(top, #ebebeb 0%, #f5f5f5 100%); + background-image: linear-gradient(to bottom, #ebebeb 0%, #f5f5f5 100%); + background-repeat: repeat-x; + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffebebeb', endColorstr='#fff5f5f5', GradientType=0); +} + +.progress-bar { + background-image: -webkit-gradient(linear, left 0%, left 100%, from(#428bca), to(#3071a9)); + background-image: -webkit-linear-gradient(top, #428bca 0%, #3071a9 100%); + background-image: -moz-linear-gradient(top, #428bca 0%, #3071a9 100%); + background-image: linear-gradient(to bottom, #428bca 0%, #3071a9 100%); + background-repeat: repeat-x; + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff428bca', endColorstr='#ff3071a9', GradientType=0); +} + +.progress-bar-success { + background-image: -webkit-gradient(linear, left 0%, left 100%, from(#5cb85c), to(#449d44)); + background-image: -webkit-linear-gradient(top, #5cb85c 0%, #449d44 100%); + background-image: -moz-linear-gradient(top, #5cb85c 0%, #449d44 100%); + background-image: linear-gradient(to bottom, #5cb85c 0%, #449d44 100%); + background-repeat: repeat-x; + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5cb85c', endColorstr='#ff449d44', GradientType=0); +} + +.progress-bar-info { + background-image: -webkit-gradient(linear, left 0%, left 100%, from(#5bc0de), to(#31b0d5)); + background-image: -webkit-linear-gradient(top, #5bc0de 0%, #31b0d5 100%); + background-image: -moz-linear-gradient(top, #5bc0de 0%, #31b0d5 100%); + background-image: linear-gradient(to bottom, #5bc0de 0%, #31b0d5 100%); + background-repeat: repeat-x; + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5bc0de', endColorstr='#ff31b0d5', GradientType=0); +} + +.progress-bar-warning { + background-image: -webkit-gradient(linear, left 0%, left 100%, from(#f0ad4e), to(#ec971f)); + background-image: -webkit-linear-gradient(top, #f0ad4e 0%, #ec971f 100%); + background-image: -moz-linear-gradient(top, #f0ad4e 0%, #ec971f 100%); + background-image: linear-gradient(to bottom, #f0ad4e 0%, #ec971f 100%); + background-repeat: repeat-x; + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff0ad4e', endColorstr='#ffec971f', GradientType=0); +} + +.progress-bar-danger { + background-image: -webkit-gradient(linear, left 0%, left 100%, from(#d9534f), to(#c9302c)); + background-image: -webkit-linear-gradient(top, #d9534f 0%, #c9302c 100%); + background-image: -moz-linear-gradient(top, #d9534f 0%, #c9302c 100%); + background-image: linear-gradient(to bottom, #d9534f 0%, #c9302c 100%); + background-repeat: repeat-x; + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffd9534f', endColorstr='#ffc9302c', GradientType=0); +} + +.list-group { + border-radius: 4px; + -webkit-box-shadow: 0 1px 2px rgba(0, 0, 0, 0.075); + box-shadow: 0 1px 2px rgba(0, 0, 0, 0.075); +} + +.list-group-item.active, +.list-group-item.active:hover, +.list-group-item.active:focus { + text-shadow: 0 -1px 0 #3071a9; + background-image: -webkit-gradient(linear, left 0%, left 100%, from(#428bca), to(#3278b3)); + background-image: -webkit-linear-gradient(top, #428bca 0%, #3278b3 100%); + background-image: -moz-linear-gradient(top, #428bca 0%, #3278b3 100%); + background-image: linear-gradient(to bottom, #428bca 0%, #3278b3 100%); + background-repeat: repeat-x; + border-color: #3278b3; + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff428bca', endColorstr='#ff3278b3', GradientType=0); +} + +.panel { + -webkit-box-shadow: 0 1px 2px rgba(0, 0, 0, 0.05); + box-shadow: 0 1px 2px rgba(0, 0, 0, 0.05); +} + +.panel-default > .panel-heading { + background-image: -webkit-gradient(linear, left 0%, left 100%, from(#f5f5f5), to(#e8e8e8)); + background-image: -webkit-linear-gradient(top, #f5f5f5 0%, #e8e8e8 100%); + background-image: -moz-linear-gradient(top, #f5f5f5 0%, #e8e8e8 100%); + background-image: linear-gradient(to bottom, #f5f5f5 0%, #e8e8e8 100%); + background-repeat: repeat-x; + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff5f5f5', endColorstr='#ffe8e8e8', GradientType=0); +} + +.panel-primary > .panel-heading { + background-image: -webkit-gradient(linear, left 0%, left 100%, from(#428bca), to(#357ebd)); + background-image: -webkit-linear-gradient(top, #428bca 0%, #357ebd 100%); + background-image: -moz-linear-gradient(top, #428bca 0%, #357ebd 100%); + background-image: linear-gradient(to bottom, #428bca 0%, #357ebd 100%); + background-repeat: repeat-x; + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff428bca', endColorstr='#ff357ebd', GradientType=0); +} + +.panel-success > .panel-heading { + background-image: -webkit-gradient(linear, left 0%, left 100%, from(#dff0d8), to(#d0e9c6)); + background-image: -webkit-linear-gradient(top, #dff0d8 0%, #d0e9c6 100%); + background-image: -moz-linear-gradient(top, #dff0d8 0%, #d0e9c6 100%); + background-image: linear-gradient(to bottom, #dff0d8 0%, #d0e9c6 100%); + background-repeat: repeat-x; + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffdff0d8', endColorstr='#ffd0e9c6', GradientType=0); +} + +.panel-info > .panel-heading { + background-image: -webkit-gradient(linear, left 0%, left 100%, from(#d9edf7), to(#c4e3f3)); + background-image: -webkit-linear-gradient(top, #d9edf7 0%, #c4e3f3 100%); + background-image: -moz-linear-gradient(top, #d9edf7 0%, #c4e3f3 100%); + background-image: linear-gradient(to bottom, #d9edf7 0%, #c4e3f3 100%); + background-repeat: repeat-x; + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffd9edf7', endColorstr='#ffc4e3f3', GradientType=0); +} + +.panel-warning > .panel-heading { + background-image: -webkit-gradient(linear, left 0%, left 100%, from(#fcf8e3), to(#faf2cc)); + background-image: -webkit-linear-gradient(top, #fcf8e3 0%, #faf2cc 100%); + background-image: -moz-linear-gradient(top, #fcf8e3 0%, #faf2cc 100%); + background-image: linear-gradient(to bottom, #fcf8e3 0%, #faf2cc 100%); + background-repeat: repeat-x; + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fffcf8e3', endColorstr='#fffaf2cc', GradientType=0); +} + +.panel-danger > .panel-heading { + background-image: -webkit-gradient(linear, left 0%, left 100%, from(#f2dede), to(#ebcccc)); + background-image: -webkit-linear-gradient(top, #f2dede 0%, #ebcccc 100%); + background-image: -moz-linear-gradient(top, #f2dede 0%, #ebcccc 100%); + background-image: linear-gradient(to bottom, #f2dede 0%, #ebcccc 100%); + background-repeat: repeat-x; + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff2dede', endColorstr='#ffebcccc', GradientType=0); +} + +.well { + background-image: -webkit-gradient(linear, left 0%, left 100%, from(#e8e8e8), to(#f5f5f5)); + background-image: -webkit-linear-gradient(top, #e8e8e8 0%, #f5f5f5 100%); + background-image: -moz-linear-gradient(top, #e8e8e8 0%, #f5f5f5 100%); + background-image: linear-gradient(to bottom, #e8e8e8 0%, #f5f5f5 100%); + background-repeat: repeat-x; + border-color: #dcdcdc; + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffe8e8e8', endColorstr='#fff5f5f5', GradientType=0); + -webkit-box-shadow: inset 0 1px 3px rgba(0, 0, 0, 0.05), 0 1px 0 rgba(255, 255, 255, 0.1); + box-shadow: inset 0 1px 3px rgba(0, 0, 0, 0.05), 0 1px 0 rgba(255, 255, 255, 0.1); +} \ No newline at end of file diff --git "a/8\343\200\201\346\226\207\347\214\256\346\225\260\346\215\256\346\214\226\346\216\230\347\263\273\347\273\237(\351\231\204\346\272\220\347\240\201)/extra_apps/xadmin/static/xadmin/css/themes/bootstrap-theme.min.css" "b/8\343\200\201\346\226\207\347\214\256\346\225\260\346\215\256\346\214\226\346\216\230\347\263\273\347\273\237(\351\231\204\346\272\220\347\240\201)/extra_apps/xadmin/static/xadmin/css/themes/bootstrap-theme.min.css" new file mode 100644 index 0000000..9164277 --- /dev/null +++ "b/8\343\200\201\346\226\207\347\214\256\346\225\260\346\215\256\346\214\226\346\216\230\347\263\273\347\273\237(\351\231\204\346\272\220\347\240\201)/extra_apps/xadmin/static/xadmin/css/themes/bootstrap-theme.min.css" @@ -0,0 +1,9 @@ +/*! + * Bootstrap v3.0.2 by @fat and @mdo + * Copyright 2013 Twitter, Inc. + * Licensed under http://www.apache.org/licenses/LICENSE-2.0 + * + * Designed and built with all the love in the world by @mdo and @fat. + */ + +.btn-default,.btn-primary,.btn-success,.btn-info,.btn-warning,.btn-danger{text-shadow:0 -1px 0 rgba(0,0,0,0.2);-webkit-box-shadow:inset 0 1px 0 rgba(255,255,255,0.15),0 1px 1px rgba(0,0,0,0.075);box-shadow:inset 0 1px 0 rgba(255,255,255,0.15),0 1px 1px rgba(0,0,0,0.075)}.btn-default:active,.btn-primary:active,.btn-success:active,.btn-info:active,.btn-warning:active,.btn-danger:active,.btn-default.active,.btn-primary.active,.btn-success.active,.btn-info.active,.btn-warning.active,.btn-danger.active{-webkit-box-shadow:inset 0 3px 5px rgba(0,0,0,0.125);box-shadow:inset 0 3px 5px rgba(0,0,0,0.125)}.btn:active,.btn.active{background-image:none}.btn-default{text-shadow:0 1px 0 #fff;background-image:-webkit-gradient(linear,left 0,left 100%,from(#fff),to(#e0e0e0));background-image:-webkit-linear-gradient(top,#fff 0,#e0e0e0 100%);background-image:-moz-linear-gradient(top,#fff 0,#e0e0e0 100%);background-image:linear-gradient(to bottom,#fff 0,#e0e0e0 100%);background-repeat:repeat-x;border-color:#dbdbdb;border-color:#ccc;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffffffff',endColorstr='#ffe0e0e0',GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false)}.btn-default:hover,.btn-default:focus{background-color:#e0e0e0;background-position:0 -15px}.btn-default:active,.btn-default.active{background-color:#e0e0e0;border-color:#dbdbdb}.btn-primary{background-image:-webkit-gradient(linear,left 0,left 100%,from(#428bca),to(#2d6ca2));background-image:-webkit-linear-gradient(top,#428bca 0,#2d6ca2 100%);background-image:-moz-linear-gradient(top,#428bca 0,#2d6ca2 100%);background-image:linear-gradient(to bottom,#428bca 0,#2d6ca2 100%);background-repeat:repeat-x;border-color:#2b669a;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff428bca',endColorstr='#ff2d6ca2',GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false)}.btn-primary:hover,.btn-primary:focus{background-color:#2d6ca2;background-position:0 -15px}.btn-primary:active,.btn-primary.active{background-color:#2d6ca2;border-color:#2b669a}.btn-success{background-image:-webkit-gradient(linear,left 0,left 100%,from(#5cb85c),to(#419641));background-image:-webkit-linear-gradient(top,#5cb85c 0,#419641 100%);background-image:-moz-linear-gradient(top,#5cb85c 0,#419641 100%);background-image:linear-gradient(to bottom,#5cb85c 0,#419641 100%);background-repeat:repeat-x;border-color:#3e8f3e;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5cb85c',endColorstr='#ff419641',GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false)}.btn-success:hover,.btn-success:focus{background-color:#419641;background-position:0 -15px}.btn-success:active,.btn-success.active{background-color:#419641;border-color:#3e8f3e}.btn-warning{background-image:-webkit-gradient(linear,left 0,left 100%,from(#f0ad4e),to(#eb9316));background-image:-webkit-linear-gradient(top,#f0ad4e 0,#eb9316 100%);background-image:-moz-linear-gradient(top,#f0ad4e 0,#eb9316 100%);background-image:linear-gradient(to bottom,#f0ad4e 0,#eb9316 100%);background-repeat:repeat-x;border-color:#e38d13;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff0ad4e',endColorstr='#ffeb9316',GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false)}.btn-warning:hover,.btn-warning:focus{background-color:#eb9316;background-position:0 -15px}.btn-warning:active,.btn-warning.active{background-color:#eb9316;border-color:#e38d13}.btn-danger{background-image:-webkit-gradient(linear,left 0,left 100%,from(#d9534f),to(#c12e2a));background-image:-webkit-linear-gradient(top,#d9534f 0,#c12e2a 100%);background-image:-moz-linear-gradient(top,#d9534f 0,#c12e2a 100%);background-image:linear-gradient(to bottom,#d9534f 0,#c12e2a 100%);background-repeat:repeat-x;border-color:#b92c28;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffd9534f',endColorstr='#ffc12e2a',GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false)}.btn-danger:hover,.btn-danger:focus{background-color:#c12e2a;background-position:0 -15px}.btn-danger:active,.btn-danger.active{background-color:#c12e2a;border-color:#b92c28}.btn-info{background-image:-webkit-gradient(linear,left 0,left 100%,from(#5bc0de),to(#2aabd2));background-image:-webkit-linear-gradient(top,#5bc0de 0,#2aabd2 100%);background-image:-moz-linear-gradient(top,#5bc0de 0,#2aabd2 100%);background-image:linear-gradient(to bottom,#5bc0de 0,#2aabd2 100%);background-repeat:repeat-x;border-color:#28a4c9;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5bc0de',endColorstr='#ff2aabd2',GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false)}.btn-info:hover,.btn-info:focus{background-color:#2aabd2;background-position:0 -15px}.btn-info:active,.btn-info.active{background-color:#2aabd2;border-color:#28a4c9}.thumbnail,.img-thumbnail{-webkit-box-shadow:0 1px 2px rgba(0,0,0,0.075);box-shadow:0 1px 2px rgba(0,0,0,0.075)}.dropdown-menu>li>a:hover,.dropdown-menu>li>a:focus{background-color:#e8e8e8;background-image:-webkit-gradient(linear,left 0,left 100%,from(#f5f5f5),to(#e8e8e8));background-image:-webkit-linear-gradient(top,#f5f5f5 0,#e8e8e8 100%);background-image:-moz-linear-gradient(top,#f5f5f5 0,#e8e8e8 100%);background-image:linear-gradient(to bottom,#f5f5f5 0,#e8e8e8 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff5f5f5',endColorstr='#ffe8e8e8',GradientType=0)}.dropdown-menu>.active>a,.dropdown-menu>.active>a:hover,.dropdown-menu>.active>a:focus{background-color:#357ebd;background-image:-webkit-gradient(linear,left 0,left 100%,from(#428bca),to(#357ebd));background-image:-webkit-linear-gradient(top,#428bca 0,#357ebd 100%);background-image:-moz-linear-gradient(top,#428bca 0,#357ebd 100%);background-image:linear-gradient(to bottom,#428bca 0,#357ebd 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff428bca',endColorstr='#ff357ebd',GradientType=0)}.navbar-default{background-image:-webkit-gradient(linear,left 0,left 100%,from(#fff),to(#f8f8f8));background-image:-webkit-linear-gradient(top,#fff 0,#f8f8f8 100%);background-image:-moz-linear-gradient(top,#fff 0,#f8f8f8 100%);background-image:linear-gradient(to bottom,#fff 0,#f8f8f8 100%);background-repeat:repeat-x;border-radius:4px;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffffffff',endColorstr='#fff8f8f8',GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false);-webkit-box-shadow:inset 0 1px 0 rgba(255,255,255,0.15),0 1px 5px rgba(0,0,0,0.075);box-shadow:inset 0 1px 0 rgba(255,255,255,0.15),0 1px 5px rgba(0,0,0,0.075)}.navbar-default .navbar-nav>.active>a{background-image:-webkit-gradient(linear,left 0,left 100%,from(#ebebeb),to(#f3f3f3));background-image:-webkit-linear-gradient(top,#ebebeb 0,#f3f3f3 100%);background-image:-moz-linear-gradient(top,#ebebeb 0,#f3f3f3 100%);background-image:linear-gradient(to bottom,#ebebeb 0,#f3f3f3 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffebebeb',endColorstr='#fff3f3f3',GradientType=0);-webkit-box-shadow:inset 0 3px 9px rgba(0,0,0,0.075);box-shadow:inset 0 3px 9px rgba(0,0,0,0.075)}.navbar-brand,.navbar-nav>li>a{text-shadow:0 1px 0 rgba(255,255,255,0.25)}.navbar-inverse{background-image:-webkit-gradient(linear,left 0,left 100%,from(#3c3c3c),to(#222));background-image:-webkit-linear-gradient(top,#3c3c3c 0,#222 100%);background-image:-moz-linear-gradient(top,#3c3c3c 0,#222 100%);background-image:linear-gradient(to bottom,#3c3c3c 0,#222 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff3c3c3c',endColorstr='#ff222222',GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false)}.navbar-inverse .navbar-nav>.active>a{background-image:-webkit-gradient(linear,left 0,left 100%,from(#222),to(#282828));background-image:-webkit-linear-gradient(top,#222 0,#282828 100%);background-image:-moz-linear-gradient(top,#222 0,#282828 100%);background-image:linear-gradient(to bottom,#222 0,#282828 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff222222',endColorstr='#ff282828',GradientType=0);-webkit-box-shadow:inset 0 3px 9px rgba(0,0,0,0.25);box-shadow:inset 0 3px 9px rgba(0,0,0,0.25)}.navbar-inverse .navbar-brand,.navbar-inverse .navbar-nav>li>a{text-shadow:0 -1px 0 rgba(0,0,0,0.25)}.navbar-static-top,.navbar-fixed-top,.navbar-fixed-bottom{border-radius:0}.alert{text-shadow:0 1px 0 rgba(255,255,255,0.2);-webkit-box-shadow:inset 0 1px 0 rgba(255,255,255,0.25),0 1px 2px rgba(0,0,0,0.05);box-shadow:inset 0 1px 0 rgba(255,255,255,0.25),0 1px 2px rgba(0,0,0,0.05)}.alert-success{background-image:-webkit-gradient(linear,left 0,left 100%,from(#dff0d8),to(#c8e5bc));background-image:-webkit-linear-gradient(top,#dff0d8 0,#c8e5bc 100%);background-image:-moz-linear-gradient(top,#dff0d8 0,#c8e5bc 100%);background-image:linear-gradient(to bottom,#dff0d8 0,#c8e5bc 100%);background-repeat:repeat-x;border-color:#b2dba1;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffdff0d8',endColorstr='#ffc8e5bc',GradientType=0)}.alert-info{background-image:-webkit-gradient(linear,left 0,left 100%,from(#d9edf7),to(#b9def0));background-image:-webkit-linear-gradient(top,#d9edf7 0,#b9def0 100%);background-image:-moz-linear-gradient(top,#d9edf7 0,#b9def0 100%);background-image:linear-gradient(to bottom,#d9edf7 0,#b9def0 100%);background-repeat:repeat-x;border-color:#9acfea;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffd9edf7',endColorstr='#ffb9def0',GradientType=0)}.alert-warning{background-image:-webkit-gradient(linear,left 0,left 100%,from(#fcf8e3),to(#f8efc0));background-image:-webkit-linear-gradient(top,#fcf8e3 0,#f8efc0 100%);background-image:-moz-linear-gradient(top,#fcf8e3 0,#f8efc0 100%);background-image:linear-gradient(to bottom,#fcf8e3 0,#f8efc0 100%);background-repeat:repeat-x;border-color:#f5e79e;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fffcf8e3',endColorstr='#fff8efc0',GradientType=0)}.alert-danger{background-image:-webkit-gradient(linear,left 0,left 100%,from(#f2dede),to(#e7c3c3));background-image:-webkit-linear-gradient(top,#f2dede 0,#e7c3c3 100%);background-image:-moz-linear-gradient(top,#f2dede 0,#e7c3c3 100%);background-image:linear-gradient(to bottom,#f2dede 0,#e7c3c3 100%);background-repeat:repeat-x;border-color:#dca7a7;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff2dede',endColorstr='#ffe7c3c3',GradientType=0)}.progress{background-image:-webkit-gradient(linear,left 0,left 100%,from(#ebebeb),to(#f5f5f5));background-image:-webkit-linear-gradient(top,#ebebeb 0,#f5f5f5 100%);background-image:-moz-linear-gradient(top,#ebebeb 0,#f5f5f5 100%);background-image:linear-gradient(to bottom,#ebebeb 0,#f5f5f5 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffebebeb',endColorstr='#fff5f5f5',GradientType=0)}.progress-bar{background-image:-webkit-gradient(linear,left 0,left 100%,from(#428bca),to(#3071a9));background-image:-webkit-linear-gradient(top,#428bca 0,#3071a9 100%);background-image:-moz-linear-gradient(top,#428bca 0,#3071a9 100%);background-image:linear-gradient(to bottom,#428bca 0,#3071a9 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff428bca',endColorstr='#ff3071a9',GradientType=0)}.progress-bar-success{background-image:-webkit-gradient(linear,left 0,left 100%,from(#5cb85c),to(#449d44));background-image:-webkit-linear-gradient(top,#5cb85c 0,#449d44 100%);background-image:-moz-linear-gradient(top,#5cb85c 0,#449d44 100%);background-image:linear-gradient(to bottom,#5cb85c 0,#449d44 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5cb85c',endColorstr='#ff449d44',GradientType=0)}.progress-bar-info{background-image:-webkit-gradient(linear,left 0,left 100%,from(#5bc0de),to(#31b0d5));background-image:-webkit-linear-gradient(top,#5bc0de 0,#31b0d5 100%);background-image:-moz-linear-gradient(top,#5bc0de 0,#31b0d5 100%);background-image:linear-gradient(to bottom,#5bc0de 0,#31b0d5 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5bc0de',endColorstr='#ff31b0d5',GradientType=0)}.progress-bar-warning{background-image:-webkit-gradient(linear,left 0,left 100%,from(#f0ad4e),to(#ec971f));background-image:-webkit-linear-gradient(top,#f0ad4e 0,#ec971f 100%);background-image:-moz-linear-gradient(top,#f0ad4e 0,#ec971f 100%);background-image:linear-gradient(to bottom,#f0ad4e 0,#ec971f 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff0ad4e',endColorstr='#ffec971f',GradientType=0)}.progress-bar-danger{background-image:-webkit-gradient(linear,left 0,left 100%,from(#d9534f),to(#c9302c));background-image:-webkit-linear-gradient(top,#d9534f 0,#c9302c 100%);background-image:-moz-linear-gradient(top,#d9534f 0,#c9302c 100%);background-image:linear-gradient(to bottom,#d9534f 0,#c9302c 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffd9534f',endColorstr='#ffc9302c',GradientType=0)}.list-group{border-radius:4px;-webkit-box-shadow:0 1px 2px rgba(0,0,0,0.075);box-shadow:0 1px 2px rgba(0,0,0,0.075)}.list-group-item.active,.list-group-item.active:hover,.list-group-item.active:focus{text-shadow:0 -1px 0 #3071a9;background-image:-webkit-gradient(linear,left 0,left 100%,from(#428bca),to(#3278b3));background-image:-webkit-linear-gradient(top,#428bca 0,#3278b3 100%);background-image:-moz-linear-gradient(top,#428bca 0,#3278b3 100%);background-image:linear-gradient(to bottom,#428bca 0,#3278b3 100%);background-repeat:repeat-x;border-color:#3278b3;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff428bca',endColorstr='#ff3278b3',GradientType=0)}.panel{-webkit-box-shadow:0 1px 2px rgba(0,0,0,0.05);box-shadow:0 1px 2px rgba(0,0,0,0.05)}.panel-default>.panel-heading{background-image:-webkit-gradient(linear,left 0,left 100%,from(#f5f5f5),to(#e8e8e8));background-image:-webkit-linear-gradient(top,#f5f5f5 0,#e8e8e8 100%);background-image:-moz-linear-gradient(top,#f5f5f5 0,#e8e8e8 100%);background-image:linear-gradient(to bottom,#f5f5f5 0,#e8e8e8 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff5f5f5',endColorstr='#ffe8e8e8',GradientType=0)}.panel-primary>.panel-heading{background-image:-webkit-gradient(linear,left 0,left 100%,from(#428bca),to(#357ebd));background-image:-webkit-linear-gradient(top,#428bca 0,#357ebd 100%);background-image:-moz-linear-gradient(top,#428bca 0,#357ebd 100%);background-image:linear-gradient(to bottom,#428bca 0,#357ebd 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff428bca',endColorstr='#ff357ebd',GradientType=0)}.panel-success>.panel-heading{background-image:-webkit-gradient(linear,left 0,left 100%,from(#dff0d8),to(#d0e9c6));background-image:-webkit-linear-gradient(top,#dff0d8 0,#d0e9c6 100%);background-image:-moz-linear-gradient(top,#dff0d8 0,#d0e9c6 100%);background-image:linear-gradient(to bottom,#dff0d8 0,#d0e9c6 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffdff0d8',endColorstr='#ffd0e9c6',GradientType=0)}.panel-info>.panel-heading{background-image:-webkit-gradient(linear,left 0,left 100%,from(#d9edf7),to(#c4e3f3));background-image:-webkit-linear-gradient(top,#d9edf7 0,#c4e3f3 100%);background-image:-moz-linear-gradient(top,#d9edf7 0,#c4e3f3 100%);background-image:linear-gradient(to bottom,#d9edf7 0,#c4e3f3 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffd9edf7',endColorstr='#ffc4e3f3',GradientType=0)}.panel-warning>.panel-heading{background-image:-webkit-gradient(linear,left 0,left 100%,from(#fcf8e3),to(#faf2cc));background-image:-webkit-linear-gradient(top,#fcf8e3 0,#faf2cc 100%);background-image:-moz-linear-gradient(top,#fcf8e3 0,#faf2cc 100%);background-image:linear-gradient(to bottom,#fcf8e3 0,#faf2cc 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fffcf8e3',endColorstr='#fffaf2cc',GradientType=0)}.panel-danger>.panel-heading{background-image:-webkit-gradient(linear,left 0,left 100%,from(#f2dede),to(#ebcccc));background-image:-webkit-linear-gradient(top,#f2dede 0,#ebcccc 100%);background-image:-moz-linear-gradient(top,#f2dede 0,#ebcccc 100%);background-image:linear-gradient(to bottom,#f2dede 0,#ebcccc 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff2dede',endColorstr='#ffebcccc',GradientType=0)}.well{background-image:-webkit-gradient(linear,left 0,left 100%,from(#e8e8e8),to(#f5f5f5));background-image:-webkit-linear-gradient(top,#e8e8e8 0,#f5f5f5 100%);background-image:-moz-linear-gradient(top,#e8e8e8 0,#f5f5f5 100%);background-image:linear-gradient(to bottom,#e8e8e8 0,#f5f5f5 100%);background-repeat:repeat-x;border-color:#dcdcdc;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffe8e8e8',endColorstr='#fff5f5f5',GradientType=0);-webkit-box-shadow:inset 0 1px 3px rgba(0,0,0,0.05),0 1px 0 rgba(255,255,255,0.1);box-shadow:inset 0 1px 3px rgba(0,0,0,0.05),0 1px 0 rgba(255,255,255,0.1)} \ No newline at end of file diff --git "a/8\343\200\201\346\226\207\347\214\256\346\225\260\346\215\256\346\214\226\346\216\230\347\263\273\347\273\237(\351\231\204\346\272\220\347\240\201)/extra_apps/xadmin/static/xadmin/css/themes/bootstrap-xadmin.css" "b/8\343\200\201\346\226\207\347\214\256\346\225\260\346\215\256\346\214\226\346\216\230\347\263\273\347\273\237(\351\231\204\346\272\220\347\240\201)/extra_apps/xadmin/static/xadmin/css/themes/bootstrap-xadmin.css" new file mode 100644 index 0000000..4f98d57 --- /dev/null +++ "b/8\343\200\201\346\226\207\347\214\256\346\225\260\346\215\256\346\214\226\346\216\230\347\263\273\347\273\237(\351\231\204\346\272\220\347\240\201)/extra_apps/xadmin/static/xadmin/css/themes/bootstrap-xadmin.css" @@ -0,0 +1,62 @@ + +/* results table */ +.table th { + background-color: #FAFAFA; + background-image: -moz-linear-gradient(top, white, #F2F2F2); + background-image: -webkit-gradient(linear, 0 0, 0 100%, from(white), to(#F2F2F2)); + background-image: -webkit-linear-gradient(top, white, #F2F2F2); + background-image: -o-linear-gradient(top, white, #F2F2F2); + background-image: linear-gradient(to bottom, white, #F2F2F2); + background-repeat: repeat-x; + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffffffff', endColorstr='#fff2f2f2', GradientType=0); + -webkit-box-shadow: 0 1px 4px rgba(0, 0, 0, 0.065); + -moz-box-shadow: 0 1px 4px rgba(0, 0, 0, 0.065); + box-shadow: 0 1px 4px rgba(0, 0, 0, 0.065); + border-bottom-width: 1px !important; +} + +/** panel **/ +.panel-default { + border-radius: 2px; +} +.panel-default > .panel-heading { + background-color: #F8F8F8; + background-image: -moz-linear-gradient(top, #FDFDFD, #F6F6F6); + background-image: -ms-linear-gradient(top, #FDFDFD, #F6F6F6); + background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#FDFDFD), to(#F6F6F6)); + background-image: -webkit-linear-gradient(top, #FDFDFD, #F6F6F6); + background-image: -o-linear-gradient(top, #FDFDFD, #F6F6F6); + background-image: linear-gradient(top, #FDFDFD, #F6F6F6); +} + +.form-group { + border-bottom: 1px solid #EEE; + background-color: #FBFBFB; + margin-top: 0px !important; + margin-bottom: 0px !important; +} +.controls { + background-color: white; + padding: 15px !important; +} +.control-label { + margin-bottom: 0px !important; +} +.fieldset .panel-body { + padding-top: 0px !important; + padding-bottom: 0px !important; +} +.form-inline .form-group { + background: transparent; + border: none; +} + +/** fieldset **/ +@media (min-width: 768px) { + .form-horizontal .controls{ + border-left: 1px solid #EEE; + } + .form-horizontal .control-label { + padding-top: 22px !important; + } +} \ No newline at end of file diff --git "a/8\343\200\201\346\226\207\347\214\256\346\225\260\346\215\256\346\214\226\346\216\230\347\263\273\347\273\237(\351\231\204\346\272\220\347\240\201)/extra_apps/xadmin/static/xadmin/css/xadmin.form.css" "b/8\343\200\201\346\226\207\347\214\256\346\225\260\346\215\256\346\214\226\346\216\230\347\263\273\347\273\237(\351\231\204\346\272\220\347\240\201)/extra_apps/xadmin/static/xadmin/css/xadmin.form.css" new file mode 100644 index 0000000..689788f --- /dev/null +++ "b/8\343\200\201\346\226\207\347\214\256\346\225\260\346\215\256\346\214\226\346\216\230\347\263\273\347\273\237(\351\231\204\346\272\220\347\240\201)/extra_apps/xadmin/static/xadmin/css/xadmin.form.css" @@ -0,0 +1,195 @@ + +/* CUSTOM FORM FIELDS */ +select.selectmultiple { + width: 100%; + height: 120px; +} +.select2-container{ + width: 100%; +} +.select2-container.form-control{ + padding: 0px; + border: 0px; +} +.select2-container .select2-choice { + height: 35px; + padding-top: 3px; +} + +/* form css */ +.form-container .column{ + min-height: 60px; +} +.form-group { + margin-right: -15px; + margin-left: -15px; +} +.control-label { + padding: 7px 10px; + font-weight: bold; +} +.form-horizontal .control-label { + margin-bottom: 5px; +} +.controls { + padding: 0px 15px 0px 15px; +} +.controls:before, +.controls:after { + display: table; + content: " "; +} +.controls:after { + clear: both; +} +.control-wrap { + display: block; + width: 100%; + padding-right: 45px; +} +.asteriskField, .asterisk-field { + color: red; +} +.controls > .radio:first-child, +.controls > .checkbox:first-child, +.control-wrap > .radio:first-child, +.control-wrap > .checkbox:first-child { + margin-top: -7px; +} +.controls > span { + padding: 5px 0; + display: inline-block; +} + +.help-block { + margin-bottom: 0px; +} + +.form-row .row { + margin: 0px !important; +} + +.fieldset .panel-body { + padding-bottom: 0px; +} + +@media (min-width: 768px) { + + .text-field, + .textinput, + .url-field, + select, + .input-group ~ .text-field, + .input-group ~ .textinput, + .input-group ~ .url-field + { + max-width: 300px; + } + .input-group.date{ max-width: 300px;} + .input-group.time{ max-width: 180px;} + .int-field { + max-width: 100px; + } + .datetime > .input-group { + float: left; + margin-right: 5px; + } + .datetime > .input-group:last-child { + margin-right: 0px; + } + select.selectmultiple { + max-width: 350px; + } + .select2-container, .selectize-control{ + max-width: 300px; + } + + .form-actions.fixed{ + position:fixed; + _position:absolute; + bottom:0px; + z-index:295; + margin-left: -10px; + -webkit-box-shadow: 2px 2px 16px rgba(0, 0, 0, 0.5); + -moz-box-shadow: 2px 2px 16px rgba(0, 0, 0, 0.5); + box-shadow: 2px 2px 16px rgba(0, 0, 0, 0.5); + right: 10px; + } + + .form-actions.fixed .pull-right{ + float: none !important; + margin-left: 10px; + } + + .form-horizontal .control-label { + width: 170px; + float: left; + } + .form-horizontal .controls { + margin-left: 175px; + } + .form-horizontal.short_label .control-label, + .form-horizontal .short_label .control-label { + width: 120px; + } + .form-horizontal.short_label .controls, + .form-horizontal .short_label .controls { + margin-left: 120px; + } + .form-horizontal .form-group { + margin-bottom: 24px; + } + .form-horizontal .form-inline .form-group { + margin: 0px; + padding-left: 0px; + padding-right: 0px; + } + .form-horizontal .fieldset .panel-body { + padding-top: 24px; + } +} +@media (min-width: 768px) and (max-width: 991px) { + .form-horizontal .control-label { + width: 150px; + } + .form-horizontal .controls { + margin-left: 155px; + } + .form-horizontal.short_label .control-label, + .form-horizontal .short_label .control-label { + width: 100px; + } + .form-horizontal.short_label .controls, + .form-horizontal .short_label .controls { + margin-left: 100px; + } +} +@media (max-width: 767px) { + .btn-toolbar.top-toolbar { + margin: 0 10px 10px; + text-align: right; + } +} + +/** detail page **/ +img.field_img { + max-height: 100px; +} + +/** revision form **/ +.diff_field .control-label { + color: #FF8040; +} +.diff_field .controls{ + background-color: #FCF8E3; +} + +/** tabs **/ +.nav.nav-tabs { + margin-bottom: 15px; +} + +/** selectize **/ +.selectize-input { + vertical-align: bottom; +} \ No newline at end of file diff --git "a/8\343\200\201\346\226\207\347\214\256\346\225\260\346\215\256\346\214\226\346\216\230\347\263\273\347\273\237(\351\231\204\346\272\220\347\240\201)/extra_apps/xadmin/static/xadmin/css/xadmin.main.css" "b/8\343\200\201\346\226\207\347\214\256\346\225\260\346\215\256\346\214\226\346\216\230\347\263\273\347\273\237(\351\231\204\346\272\220\347\240\201)/extra_apps/xadmin/static/xadmin/css/xadmin.main.css" new file mode 100644 index 0000000..66f8916 --- /dev/null +++ "b/8\343\200\201\346\226\207\347\214\256\346\225\260\346\215\256\346\214\226\346\216\230\347\263\273\347\273\237(\351\231\204\346\272\220\347\240\201)/extra_apps/xadmin/static/xadmin/css/xadmin.main.css" @@ -0,0 +1,429 @@ + +a { cursor: pointer;} + +#body-content { + margin-top: 65px; + margin-left: 0px; + margin-right: 0px; +} + +.popover{ + width: auto; +} +.dropdown-submenu .popover { + padding: 0px; + max-width: none; + left: 100%; +} +.dropdown-submenu .popover.right { + margin-top: -35px; + margin-left: -10px; +} +.dropdown-submenu .popover.left { + margin-top: -35px; +} +.dropdown-submenu .popover.right .arrow, .dropdown-submenu .popover.left .arrow{ + top: 47px; +} +.dropdown-submenu .popover form{ + margin: 6px 0; +} +.dropdown-submenu .popover form input { + min-width: 120px; +} +.dropdown-submenu .popover form > .input-group { + width: 100%; +} +.dropdown-submenu .popover form > .btn { + margin-top: 10px; +} +.dropdown-submenu .popover form > .input-group + .input-group { + margin-top: 5px; +} + +.filter-date .menu-choice-date .input-group-addon { + width: 50px; + text-align: right; +} +.filter-date .menu-date-range .ranges .btn{ + margin-top: 10px; +} +@media (min-width: 768px) { + .filter-date .menu-date-range .popover { + width: 600px; + left: 10px; + top: 35px; + margin-top: -2px; + margin-left: -40px; + } + .filter-date .menu-date-range .popover .arrow { + left: 60px; + } + .top-search-form { + margin-top: 6px; + margin-bottom: 0px; + } + .top-search-form .input-group { + width: 240px; + } +} +@media (max-width: 767px) { + .filter-date .menu-date-range .datepicker-inline{ + width: auto; + } + .filter-date .menu-date-range .table-condensed{ + width: 100%; + } +} + +.filter-fk-search .select-search{ + min-width: 160px; +} +.filter-char form input.input-char{ + min-width: 180px; +} +.filter-number form .input-group-btn > .btn { + width: 34px; + text-align: center; +} + + +.panel .panel-heading .icon{ + float: right; + top: 50%; + margin-left: 10px; + cursor: pointer; + font-size: 15px; + margin-top: 2px; +} +.panel .panel-heading .badge { float: right; top: 50%; margin-left: 10px;} +.panel.no_title .panel-heading{ + display: none; +} + +.panel .panel-body.nopadding{ + padding: 0px; +} +.ui-sortable-placeholder { border: 1px dotted #CCC; visibility: visible !important; } +.ui-sortable-placeholder * { visibility: hidden; } + +/* dropdowns */ +.dropdown-menu li.with_menu_btn > a:first-child { + padding-right: 35px; +} +.dropdown-menu .dropdown-menu-btn { + float: right; + margin-top: -26px; + height: 26px; + padding: 6px 8px 6px 5px; + margin-right: 7px; + -webkit-border-radius: 4px; + -moz-border-radius: 4px; + border-radius: 4px; +} +.dropdown-menu .dropdown-menu-btn:hover { + -webkit-box-shadow: 0 1px 4px rgba(0, 0, 0, 0.065); + -moz-box-shadow: 0 1px 4px rgba(0, 0, 0, 0.065); + box-shadow: 0 1px 4px rgba(0, 0, 0, 0.065); +} + +/* mask */ +.mask { + display: none; + position: absolute; + left: 0px; + top: 8px; + width: 100%; + z-index: 9999; + margin-top: -8px; + background-color: rgba(255,255,255,.6); + height: 100%; + padding-top: 24px; +} +.mask .progress{ + position: absolute; + width: 80%; + top: 50%; + margin-top: -8px; + left: 10%; +} +.mask .progress .bar{ + width: 100%; +} + +/* export */ +.export .dropdown-submenu .popover{ + width: 240px; + margin-left: -80px; +} + +/* search form */ +.input-group.search-group{ + width: 220px; +} + +/* results table */ +.table th { + white-space: nowrap; + text-overflow: ellipsis; +} + +.table td .btn-group { + font-size: 13px; +} + +.content-toolbar, .steps-nav { + margin-bottom: 10px; +} + +/* details dl */ +.data-details dl.dl-horizontal dt{ + width: 80px; +} +.data-details dl.dl-horizontal dd{ + margin-left: 90px; +} +.data-details .btn{ + float: right; + margin-bottom: 10px; +} + +/* related menu */ +.dropdown.related_menu .dropdown-menu { + width: 200px; +} +.dropdown.related_menu .dropdown-menu > li > a { + white-space: nowrap; + text-overflow: ellipsis; + overflow: hidden; +} + +.rel-brand { + font-size: .8em; + color: #a10000; +} + +/* list overflow */ +.x-scroll { + overflow-x: auto; +} + +/* nav sitemenu */ +ul.nav-sitemenu { + padding: 10px; +} +ul.nav-sitemenu li a { + padding: 6px 10px; +} +.panel-group.nav-sitemenu .panel .accordion-toggle{ + text-decoration: none; +} +.panel-group.nav-sitemenu .panel:not(:first-child) { + border-radius: 0px; + border-top: 0px; + margin-top: 0px; +} +.panel-group.nav-sitemenu .panel:not(:first-child) .panel-heading { + border-radius: 0px; +} +.panel-group.nav-sitemenu .panel:first-child { + border-bottom-left-radius: 0px; + border-bottom-right-radius: 0px; +} +.panel-group.nav-sitemenu .panel .list-group { + border-radius: 0px; +} +.panel-group.nav-sitemenu .panel .list-group .list-group-item:first-child { + border-top-width: 1px; +} +.panel-group.nav-sitemenu .panel .list-group .list-group-item:last-child { + border-bottom-right-radius: 0px; + border-bottom-left-radius: 0px; +} + +@media (min-width: 768px) { + .panel-group.nav-sitemenu { + top: 65px; + bottom: 0; + overflow-y: auto; + position: fixed; + margin-left: -15px; + } + .panel-group.nav-sitemenu .panel .list-group.in{ + max-height: 500px; + overflow-y: auto; + } +} +@media (max-width: 767px) { + .panel-group.nav-sitemenu { + padding: 0px; + } +} + +/* models list */ +ul.model_ul{ + margin-bottom: 20px; +} +ul.model_ul, ul.model_ul ul{ + padding-left: 20px; + list-style: none; +} +ul.model_ul li{ + line-height: 20px; + margin: 8px 0px; +} +ul.model_ul li span { + padding: 3px 6px; + min-width: auto; + min-height: auto; +} + +/* icon */ +*[class^="icon-"] sub, +*[class^="icon-"] sup{ + font-size: 0.5em; + margin-left: -6px; +} + +/* ajax btn */ +.btn-ajax { + margin-left: 10px; +} + +/* g-search */ +#g-search .btn-group{ + margin: 0px; + padding: 0px; +} + +/** Font Icons **/ +a[class^="icon-"]:before, a[class*=" icon-"]:before { + margin-right: 0.3em; +} +.btn[class^="icon-"]:before, .btn[class*=" icon-"]:before { + margin-right: 0.3em; +} + +/** fix navbar input-append and input-prepend margin **/ +.navbar .navbar-brand { + max-width: 400px; +} + +/** import for bp3.0 */ +.pagination.pagination-inline{margin-top: 0px; margin-bottom: 10px;} +.modal { overflow-y: auto;} +.dropdown {position: relative;} +.input-group-btn:not(:first-child):not(:last-child) > .btn{ + border-radius: 0px; +} + +.dropdown-submenu { + position: relative; +} + +.dropdown-submenu > .dropdown-menu { + top: 0; + left: 100%; + margin-top: -6px; + margin-left: -1px; + border-top-left-radius: 0; +} + +.dropup .dropdown-submenu > .dropdown-menu { + top: auto; + bottom: 0; + margin-top: 0; + margin-bottom: -2px; + border-bottom-left-radius: 0; +} + +.dropdown-submenu > a:after { + display: block; + float: right; + width: 0; + height: 0; + margin-top: 5px; + margin-right: -10px; + border-color: transparent; + border-left-color: #cccccc; + border-style: solid; + border-width: 5px 0 5px 5px; + content: " "; +} + +.dropdown-submenu:hover > a:after { + border-left-color: #ffffff; +} + +.dropdown-submenu.pull-left { + float: none; +} + +.dropdown-submenu.pull-left > .dropdown-menu { + left: -100%; + margin-left: 10px; + border-top-right-radius: 0; +} + +.dropdown .dropdown-menu .nav-header { + padding-right: 20px; + padding-left: 20px; +} + +.dropdown-submenu:hover > .dropdown-menu, +.dropdown-submenu:hover > .popover { + display: none; +} +.dropdown-submenu.open > .dropdown-menu, +.dropdown-submenu.open > .popover { + display: block; +} + +/** nav-header **/ +.navbar-collapse {max-height: none !important;} +.nav-header { + display: block; + padding: 3px 15px; + font-size: 11px; + font-weight: bold; + line-height: 1.428571429; + color: #999999; + text-shadow: 0 1px 0 rgba(255, 255, 255, 0.5); + text-transform: uppercase; +} +.nav > li + .nav-header { + margin-top: 9px; +} + +/** table in panel **/ +.panel .panel-body > .table { + margin-bottom: 0px; +} + +/** thumbnail **/ +.thumbnail-panel.panel .panel-body { padding-bottom: 0px;} +.thumbnail-panel .thumbnail{margin-bottom: 15px;} +.thumbnail-panel .thumbnail:hover { background-color: #efefef; } +.thumbnail > h1 { margin: 0px; } +.thumbnail.warning { + background-color: #fcf8e3; + border-color: #fbeed5; +} +.thumbnail .action-select {position: absolute; top: 0px; left: 20px;} +.thumbnail .dropdown.related_menu {position: absolute; top: 0px; right: 20px;} + +/* panel single **/ +.panel-single { + margin: 50px auto 20px; + -webkit-border-radius: 5px; + -moz-border-radius: 5px; + border-radius: 5px; + -webkit-box-shadow: 0 0 40px rgba(0,0,0,.3); + -moz-box-shadow: 0 0 40px rgba(0,0,0,.3); + box-shadow: 0 0 40px rgba(0,0,0,.3); +} + +/* change list */ +form#changelist-form + .pagination { + margin-top: 0px; +} diff --git "a/8\343\200\201\346\226\207\347\214\256\346\225\260\346\215\256\346\214\226\346\216\230\347\263\273\347\273\237(\351\231\204\346\272\220\347\240\201)/extra_apps/xadmin/static/xadmin/css/xadmin.mobile.css" "b/8\343\200\201\346\226\207\347\214\256\346\225\260\346\215\256\346\214\226\346\216\230\347\263\273\347\273\237(\351\231\204\346\272\220\347\240\201)/extra_apps/xadmin/static/xadmin/css/xadmin.mobile.css" new file mode 100644 index 0000000..03246de --- /dev/null +++ "b/8\343\200\201\346\226\207\347\214\256\346\225\260\346\215\256\346\214\226\346\216\230\347\263\273\347\273\237(\351\231\204\346\272\220\347\240\201)/extra_apps/xadmin/static/xadmin/css/xadmin.mobile.css" @@ -0,0 +1,106 @@ +#body-content { + margin-top: 50px; + padding-top: 10px; +} +#top-nav, #footer, .breadcrumb { + display: none; +} + +#top-nav .breadcrumb { + margin-top: 20px; +} +#left-side { + min-height: 0px; + position: fixed; + padding: 0px; + top: 50px; + left: 0px; + right: 0px; + bottom: 0px; + background: #FFF; + z-index: 999; + overflow: auto; +} +#left-side .well { + border: 0px; +} +#changelist-form { + clear: both; +} +.navbar-brand { + max-width: 300px; +} + +.panel-content.nopadding { + margin: -15px; +} + +.panel-content.nopadding .table { + margin-bottom: 0; +} + +.col { + padding-right: 10px; + padding-left: 10px; +} +.row { + margin-right: -10px; + margin-left: -10px; +} + +.results { + width: 100%; + overflow-x: auto; +} + +.form-actions { + margin-bottom: 0px; + padding: 10px; + position:fixed; + bottom:0px; + z-index:295; + width: 100%; + margin-right: -10px; + margin-left: -10px; +} +.form-actions .more-btns input:first-child{ + margin-top: 10px; +} +.change-form #body-content { + padding-bottom: 60px; +} +.model_ul { + margin-left: 0px; + margin-right: 0px; +} + +.navbar-inverse .navbar-toggle{ + color: white; + top: 7px; + padding: 7px 12px; +} +.navbar.tools-navbar { + height: 50px; + margin-top: -10px; + text-align: right; +} +.navbar-btns .btn span{ + display: none; +} +.navbar-btns { + position: absolute; + top: 1px; + right: 10px; +} +.nav-back { + left: 10px; + right: auto; +} + +.layout-btns { + display: none; +} +.pagination.pagination-small{ + display: none; +} + diff --git "a/8\343\200\201\346\226\207\347\214\256\346\225\260\346\215\256\346\214\226\346\216\230\347\263\273\347\273\237(\351\231\204\346\272\220\347\240\201)/extra_apps/xadmin/static/xadmin/css/xadmin.page.dashboard.css" "b/8\343\200\201\346\226\207\347\214\256\346\225\260\346\215\256\346\214\226\346\216\230\347\263\273\347\273\237(\351\231\204\346\272\220\347\240\201)/extra_apps/xadmin/static/xadmin/css/xadmin.page.dashboard.css" new file mode 100644 index 0000000..7b7dd7e --- /dev/null +++ "b/8\343\200\201\346\226\207\347\214\256\346\225\260\346\215\256\346\214\226\346\216\230\347\263\273\347\273\237(\351\231\204\346\272\220\347\240\201)/extra_apps/xadmin/static/xadmin/css/xadmin.page.dashboard.css" @@ -0,0 +1,47 @@ + +.dashboard.container-fluid { + padding-left: 0px; +} +.dashboard .column{ + min-height: 60px; +} + +.widget { +} +.widget_options { +} + +/* Quick Buttons +=================================================================== */ +.qbutton .panel-body { + padding-top: 5px; +} +.btn-quick { + margin-top: 10px; + padding: 20px 0px 0px 0px; + font-size: 15px; + display:block; + text-align: center; + cursor: pointer; + position: relative; +} +.btn-quick i { + font-size: 32px; +} + +/* Quick Buttons Small +=================================================================== */ + +.btn-quick-small { + border-radius: 3px; + padding: 15px 0px 0px 0px; + font-size: 10px; + display:block; + text-align: center; + cursor: pointer; + position: relative; +} + +.btn-quick-small i { + font-size: 20px; +} \ No newline at end of file diff --git "a/8\343\200\201\346\226\207\347\214\256\346\225\260\346\215\256\346\214\226\346\216\230\347\263\273\347\273\237(\351\231\204\346\272\220\347\240\201)/extra_apps/xadmin/static/xadmin/css/xadmin.plugin.aggregation.css" "b/8\343\200\201\346\226\207\347\214\256\346\225\260\346\215\256\346\214\226\346\216\230\347\263\273\347\273\237(\351\231\204\346\272\220\347\240\201)/extra_apps/xadmin/static/xadmin/css/xadmin.plugin.aggregation.css" new file mode 100644 index 0000000..3a28909 --- /dev/null +++ "b/8\343\200\201\346\226\207\347\214\256\346\225\260\346\215\256\346\214\226\346\216\230\347\263\273\347\273\237(\351\231\204\346\272\220\347\240\201)/extra_apps/xadmin/static/xadmin/css/xadmin.plugin.aggregation.css" @@ -0,0 +1,6 @@ +td.aggregate { + font-weight: bold; +} +td.aggregate span.aggregate_title { + float: right; +} \ No newline at end of file diff --git "a/8\343\200\201\346\226\207\347\214\256\346\225\260\346\215\256\346\214\226\346\216\230\347\263\273\347\273\237(\351\231\204\346\272\220\347\240\201)/extra_apps/xadmin/static/xadmin/css/xadmin.plugin.formset.css" "b/8\343\200\201\346\226\207\347\214\256\346\225\260\346\215\256\346\214\226\346\216\230\347\263\273\347\273\237(\351\231\204\346\272\220\347\240\201)/extra_apps/xadmin/static/xadmin/css/xadmin.plugin.formset.css" new file mode 100644 index 0000000..60aa065 --- /dev/null +++ "b/8\343\200\201\346\226\207\347\214\256\346\225\260\346\215\256\346\214\226\346\216\230\347\263\273\347\273\237(\351\231\204\346\272\220\347\240\201)/extra_apps/xadmin/static/xadmin/css/xadmin.plugin.formset.css" @@ -0,0 +1,63 @@ + +.empty-form { + display: none; +} +.formset:not(.one) > .panel-body { + padding-top: 0px !important; +} +.formset .row-deleted{ + background: #fff0f0 !important; +} +.formset .row-added { + background: #d1ffdd !important; +} +.formset .formset-heading{ + padding: 10px; + border-bottom: 1px solid #EEE; +} +.formset .row-deleted .formset-form { + display: none; +} +.formset .box-content.accordion { + margin: 0px; + padding: 5px 5px 3px; +} +.formset .formset-form { + padding-left: 15px; + padding-right: 15px; +} +.formset .accordion-heading .delete-row { + float: right; + margin: 8px; +} +.formset .nav{ + margin-bottom: 5px; +} +.formset .nav.nav-tabs{ + padding: 10px 10px 0px; +} +.formset .panel-body.tabs { + padding-left: 0px; + padding-right: 0px; +} +.formset .box-content.tabs{ + padding: 5px 0px 0px; +} +.formset .tabs .tab-content{ + overflow: hidden; +} +.formset .tabs .delete-row{ + float: right; + margin: 8px 8px; +} +.formset .table{ + margin-bottom: 0px; +} +.formset .table td{ + padding: 4px; +} + +.formset .table td .delete-row{ + margin-top: 4px; + display: block; +} diff --git "a/8\343\200\201\346\226\207\347\214\256\346\225\260\346\215\256\346\214\226\346\216\230\347\263\273\347\273\237(\351\231\204\346\272\220\347\240\201)/extra_apps/xadmin/static/xadmin/css/xadmin.plugin.importexport.css" "b/8\343\200\201\346\226\207\347\214\256\346\225\260\346\215\256\346\214\226\346\216\230\347\263\273\347\273\237(\351\231\204\346\272\220\347\240\201)/extra_apps/xadmin/static/xadmin/css/xadmin.plugin.importexport.css" new file mode 100644 index 0000000..72d8cd6 --- /dev/null +++ "b/8\343\200\201\346\226\207\347\214\256\346\225\260\346\215\256\346\214\226\346\216\230\347\263\273\347\273\237(\351\231\204\346\272\220\347\240\201)/extra_apps/xadmin/static/xadmin/css/xadmin.plugin.importexport.css" @@ -0,0 +1,21 @@ +/* FORM ROWS */ + +.form-row { + overflow: hidden; + padding: 10px; + font-size: 13px; + border-bottom: 1px solid #eee; +} + +.form-row img, .form-row input { + vertical-align: middle; +} + +.form-row label input[type="checkbox"] { + margin-top: 0; + vertical-align: 0; +} + +form .form-row p { + padding-left: 0; +} diff --git "a/8\343\200\201\346\226\207\347\214\256\346\225\260\346\215\256\346\214\226\346\216\230\347\263\273\347\273\237(\351\231\204\346\272\220\347\240\201)/extra_apps/xadmin/static/xadmin/css/xadmin.plugin.quickfilter.css" "b/8\343\200\201\346\226\207\347\214\256\346\225\260\346\215\256\346\214\226\346\216\230\347\263\273\347\273\237(\351\231\204\346\272\220\347\240\201)/extra_apps/xadmin/static/xadmin/css/xadmin.plugin.quickfilter.css" new file mode 100644 index 0000000..9d55909 --- /dev/null +++ "b/8\343\200\201\346\226\207\347\214\256\346\225\260\346\215\256\346\214\226\346\216\230\347\263\273\347\273\237(\351\231\204\346\272\220\347\240\201)/extra_apps/xadmin/static/xadmin/css/xadmin.plugin.quickfilter.css" @@ -0,0 +1,17 @@ +.nav-quickfilter .filter-item { + white-space: nowrap; + overflow: hidden; + padding: 5px; +} + +.nav-quickfilter .filter-col-1 { + margin: 3px 2px 0 -2px; + float: left; +} + +.nav-quickfilter .filter-col-2 { +} + +.nav-quickfilter .nav-expand { + z-index:100; +} \ No newline at end of file diff --git "a/8\343\200\201\346\226\207\347\214\256\346\225\260\346\215\256\346\214\226\346\216\230\347\263\273\347\273\237(\351\231\204\346\272\220\347\240\201)/extra_apps/xadmin/static/xadmin/css/xadmin.plugins.css" "b/8\343\200\201\346\226\207\347\214\256\346\225\260\346\215\256\346\214\226\346\216\230\347\263\273\347\273\237(\351\231\204\346\272\220\347\240\201)/extra_apps/xadmin/static/xadmin/css/xadmin.plugins.css" new file mode 100644 index 0000000..324eba7 --- /dev/null +++ "b/8\343\200\201\346\226\207\347\214\256\346\225\260\346\215\256\346\214\226\346\216\230\347\263\273\347\273\237(\351\231\204\346\272\220\347\240\201)/extra_apps/xadmin/static/xadmin/css/xadmin.plugins.css" @@ -0,0 +1,12 @@ +/** Action **/ +.action-checkbox-column { + width: 14px; +} + +/** quick-form **/ +.quick-form .modal-body { + padding-bottom: 0px; +} +.quick-form .modal-footer { + margin-top: 0px; +} \ No newline at end of file diff --git "a/8\343\200\201\346\226\207\347\214\256\346\225\260\346\215\256\346\214\226\346\216\230\347\263\273\347\273\237(\351\231\204\346\272\220\347\240\201)/extra_apps/xadmin/static/xadmin/css/xadmin.responsive.css" "b/8\343\200\201\346\226\207\347\214\256\346\225\260\346\215\256\346\214\226\346\216\230\347\263\273\347\273\237(\351\231\204\346\272\220\347\240\201)/extra_apps/xadmin/static/xadmin/css/xadmin.responsive.css" new file mode 100644 index 0000000..6fad0a9 --- /dev/null +++ "b/8\343\200\201\346\226\207\347\214\256\346\225\260\346\215\256\346\214\226\346\216\230\347\263\273\347\273\237(\351\231\204\346\272\220\347\240\201)/extra_apps/xadmin/static/xadmin/css/xadmin.responsive.css" @@ -0,0 +1,249 @@ + + +@media (min-width: 768px) and (max-width: 991px) { + ul.nav-sitemenu{ + padding: 0px; + } + ul.nav-sitemenu > li.app_menu>a{ + padding: 3px 0px; + margin: 0px; + text-align: center; + } + ul.nav-sitemenu .dropdown-menu{ + z-index: 1100; + } + ul.nav-sitemenu > li.app_menu>a:after{ + display: none; + } + ul.nav-sitemenu > li.app_menu>hr{ margin: 0px;} + ul.nav-sitemenu > li.app_menu>a>i.icon{ + font-size: 20px; + line-height: 1.7em; + } + ul.nav-sitemenu > li.app_menu li { + + } +} + +@media (min-width: 768px) { + #content-block:not(.full-content) { + padding-left: 5px; + min-height: 450px; + } + .form-actions .more-btns{ + display: inline-block !important; + } + .form-actions .hidden-sm{ + display: inline-block !important; + } + .form-actions .col-1, + .form-actions .col-2, + .form-actions .col-3, + .form-actions .col-4, + .form-actions .col-5, + .form-actions .col-6, + .form-actions .col-7, + .form-actions .col-8, + .form-actions .col-9, + .form-actions .col-10, + .form-actions .col-11, + .form-actions .col-12 + { + width: auto !important; + } + + .quick-form .modal-dialog { + width: auto; + } + .detail-modal .modal-dialog { + width: 80%; + } +} + +@media (max-width: 767px) { +#body-content { + margin-top: 50px; + padding-top: 10px; +} +#body-content.show_menu{ + width: 100%; + overflow-x: hidden; +} +#footer, .breadcrumb { + display: none; +} +#top-nav .navbar-nav { + float: none; +} +#left-side { + min-height: 0px; + position: fixed; + top: 65px; + left: 0px; + bottom: 0px; + background: #FFF; + z-index: 999; + overflow: auto; + display: none; + width: 70%; +} +#body-content.show_menu #left-side { + display: block; +} +#body-content.show_menu #content-block{ + margin-left: 70%; + width: 100%; +} +#left-side .well { + border: 0px; +} +#changelist-form { + clear: both; +} +.popover.dropdown-menu form > .btn { + width: 100%; +} +.navbar .navbar-brand { + max-width: 260px; + white-space: nowrap; + text-overflow: ellipsis; + overflow: hidden; +} + +.panel-content.nopadding { + margin: -15px; +} + +.panel-content.nopadding .table { + margin-bottom: 0; +} + +.form-actions { + margin-bottom: 0px; + padding: 10px; + position:fixed; + bottom:0px; + z-index:295; + width: 100%; + margin-right: -15px; + margin-left: -15px; + border: 0px; + border-radius: 0px; +} +.form-actions .btn-group { + padding-left: 10px; + padding-right: 0px; +} +.form-actions .more-btns{ + clear: both; + overflow: hidden; +} +.form-actions .more-btns .btn:first-child{ +} +.form-actions .more-btns .btn, .form-actions .more-btns .btn-group { + display: block; + width: 100%; + padding-right: 0; + padding-left: 0; +} +.form-actions .more-btns .btn, +.form-actions .more-btns .btn-group { + margin-top: 5px; +} + +#body-content { + padding-bottom: 60px; +} +.model_ul { + margin-left: 0px; + margin-right: 0px; +} +.navbar.content-navbar { + position: fixed; + right: 0; + left: 0; + top: 0px; + z-index: 1030; + border-radius: 0; +} +.content-navbar .navbar-toggle{ + padding: 3px 10px; + font-size: 20px; + color: white; + width: auto; + height: auto; +} +.navbar-toggle.pull-left{ + margin-left: 15px; + margin-right: 0px; +} +.btn span{ + display: none; +} +.navbar-btn { + position: absolute; + top: 0px; + right: 10px; +} +.navbar-nav > .dropdown > .dropdown-menu{ + position: relative; + float: none; + max-height: 400px; + overflow: auto; +} +.navbar-nav > .dropdown > .dropdown-menu li>a{ + padding: 8px 20px; +} +.navbar-nav > .dropdown .dropdown-submenu > .dropdown-menu, +.navbar-nav > .dropdown .dropdown-submenu > .popover{ + position: relative; + top: 0px; + left: 0px; + margin: 10px; + float: none; +} +.navbar-nav .dropdown-submenu .popover { + max-width: none; +} +.navbar-nav .dropdown-submenu .popover .arrow { + display: none; +} + +.layout-btns { + display: none; +} +.pagination.pagination-small{ + display: none; +} + +/* search form */ +.input-group.search-group{ + max-width: none; + width: auto; +} + +} + +@media (max-width: 767px) { + .show-sm, .show-md, .show-lg, .hide-xs{ + display: none !important; + } +} + +@media (min-width: 768px) and (max-width: 991px) { + .show-xs, .show-md, .show-lg, .hide-sm{ + display: none !important; + } +} + +@media (min-width: 992px) and (max-width: 1199px) { + .show-xs, .show-sm, .show-lg, .hide-md{ + display: none !important; + } +} + +@media (min-width: 1200px) { + .show-xs, .show-sm, .show-md, .hide-lg{ + display: none !important; + } +} diff --git "a/8\343\200\201\346\226\207\347\214\256\346\225\260\346\215\256\346\214\226\346\216\230\347\263\273\347\273\237(\351\231\204\346\272\220\347\240\201)/extra_apps/xadmin/static/xadmin/css/xadmin.widget.editable.css" "b/8\343\200\201\346\226\207\347\214\256\346\225\260\346\215\256\346\214\226\346\216\230\347\263\273\347\273\237(\351\231\204\346\272\220\347\240\201)/extra_apps/xadmin/static/xadmin/css/xadmin.widget.editable.css" new file mode 100644 index 0000000..4eded86 --- /dev/null +++ "b/8\343\200\201\346\226\207\347\214\256\346\225\260\346\215\256\346\214\226\346\216\230\347\263\273\347\273\237(\351\231\204\346\272\220\347\240\201)/extra_apps/xadmin/static/xadmin/css/xadmin.widget.editable.css" @@ -0,0 +1,63 @@ +.editable-handler .popover{ + width: auto; +} +.editable .popover-title{ + white-space:nowrap; +} +.editable .popover-title .close { + margin: -4px 0px 0px 10px; +} +.editable form .btn-ajax{ + display: none; +} +.editable form .control-wrap{ + padding-right: 0px; +} +.editable form{ + margin-bottom: 0px; +} +.editable form .controls{ + margin: 0px; + padding: 0px !important; + border: 0px; +} +.editable form .form-group { + margin: 0px 0px 10px !important; +} +.editable form .control-label{ + display: none; +} +.editable form .controls label { + white-space:nowrap; +} + +@media (min-width: 768px) { +.editable form .text-field, +.editable form .textinput { + width: 200px; +} +.editable form .int-field { + width: 150px; +} +.editable form .textarea-field{ + width: 250px; + height: 50px; +} + +.editable form select, +.editable form .select2-container { + max-width: 200px; + min-width: 100px; + width: 100%; +} +} +@media (max-width: 767px) { + .popover.editpop{ + position: fixed; + top: 30px !important; + left: 10px !important; + right: 10px !important; + z-index: 1040; + max-width: none; + } +} diff --git "a/8\343\200\201\346\226\207\347\214\256\346\225\260\346\215\256\346\214\226\346\216\230\347\263\273\347\273\237(\351\231\204\346\272\220\347\240\201)/extra_apps/xadmin/static/xadmin/css/xadmin.widget.select-transfer.css" "b/8\343\200\201\346\226\207\347\214\256\346\225\260\346\215\256\346\214\226\346\216\230\347\263\273\347\273\237(\351\231\204\346\272\220\347\240\201)/extra_apps/xadmin/static/xadmin/css/xadmin.widget.select-transfer.css" new file mode 100644 index 0000000..46e60e7 --- /dev/null +++ "b/8\343\200\201\346\226\207\347\214\256\346\225\260\346\215\256\346\214\226\346\216\230\347\263\273\347\273\237(\351\231\204\346\272\220\347\240\201)/extra_apps/xadmin/static/xadmin/css/xadmin.widget.select-transfer.css" @@ -0,0 +1,101 @@ + +.selector { + position: relative; + float: left; + overflow: hidden; + width: 100%; +} +.selector-available, .selector-chosen { + float: left; + width: 45%; +} +.selector.stacked .selector-available, .selector.stacked .selector-chosen { + width: 756px; +} +.selector p.title { + padding: 7px 5px 0px 7px; + font-size: 14px; + line-height: 13px; + font-weight: bold; +} + +.selector .selector-filter { + width: 100%; +} +.selector .selector-available .selector-filter { +} +.selector .selector-chosen .selector-filter { +} +.selector.stacked .selector-filter input[type=text] { + width: 716px !important; + max-width: 716px !important; +} +.selector select[multiple=multiple] { + margin: 0; + padding-left: 3px; + width: 100%; + height: 200px; + display: block; + max-width: none !important; +} +.selector .selector-chosen select[multiple=multiple] { + height: 230px; +} +.selector.stacked select[multiple=multiple] { + width: 757px !important; + max-width: 757px !important; +} +.selector ul.selector-chooser { + float: left; + margin: 100px 2px 0; + padding: 0; + width: 31px; + list-style: none; +} +.selector ul.selector-chooser li { + margin-top: 10px; +} +.selector.stacked ul.selector-chooser { + margin: 4px 0 0 356px; + width: 36px; +} +.selector.stacked ul.selector-chooser li { + float: left; +} +a.selector-chooseall, a.selector-clearall { + display: block; + margin: 0; + padding: 2px 7px; + font-size: 11px; + line-height: 20px; + font-weight: bold; +} +.selector-available, .selector-chosen { + border: 1px solid #ddd; + border-radius: 5px; -moz-border-radius: 5px; -webkit-border-radius: 5px; + background: #eee; +} +.selector h3, .inline-group .selector h3, +.inline-related fieldset .selector-available h3, .inline-related fieldset .selector-chosen h3 { + border: 0; + border-bottom: 1px solid #d0d0d0; + background: transparent; +} +.selector select[multiple=multiple] { + border-left: 0; + border-top: 1px solid #d0d0d0; + border-bottom: 1px solid #d0d0d0; + border-radius: 0; -moz-border-radius: 0; -webkit-border-radius: 0; +} + +a.selector-chooseall, a.selector-clearall { + border-top: 1px solid #e4e4e4; +} + +.selector h3 + select { + border-top: 0; +} + +a.selector-chooseall, a.selector-clearall { + border-top: 1px solid #e4e4e4; +} diff --git "a/8\343\200\201\346\226\207\347\214\256\346\225\260\346\215\256\346\214\226\346\216\230\347\263\273\347\273\237(\351\231\204\346\272\220\347\240\201)/extra_apps/xadmin/static/xadmin/js/xadmin.main.js" "b/8\343\200\201\346\226\207\347\214\256\346\225\260\346\215\256\346\214\226\346\216\230\347\263\273\347\273\237(\351\231\204\346\272\220\347\240\201)/extra_apps/xadmin/static/xadmin/js/xadmin.main.js" new file mode 100644 index 0000000..a06a5af --- /dev/null +++ "b/8\343\200\201\346\226\207\347\214\256\346\225\260\346\215\256\346\214\226\346\216\230\347\263\273\347\273\237(\351\231\204\346\272\220\347\240\201)/extra_apps/xadmin/static/xadmin/js/xadmin.main.js" @@ -0,0 +1,108 @@ +;(function($){ + + $.fn.exform = function(){ + this.each(function () { + var form = $(this); + for (var i = $.fn.exform.renders.length - 1; i >= 0; i--) { + $.fn.exform.renders[i](form) + }; + form.addClass('rended'); + }) + } + $.fn.exform.renders = []; + $(function() { + $('.exform:not(.rended)').exform(); + }); + + $.getCookie = function(name) { + var cookieValue = null; + if (document.cookie && document.cookie != '') { + var cookies = document.cookie.split(';'); + for (var i = 0; i < cookies.length; i++) { + var cookie = jQuery.trim(cookies[i]); + // Does this cookie string begin with the name we want? + if (cookie.substring(0, name.length + 1) == (name + '=')) { + cookieValue = decodeURIComponent(cookie.substring(name.length + 1)); + break; + } + } + } + return cookieValue; + } + + //dropdown submenu plugin + $(document) + .on('click.xa.dropdown.data-api touchstart.xa.dropdown.data-api', '.dropdown-submenu', function (e) { e.stopPropagation(); }) + .on('click.xa.dropdown.data-api', function(e){ + $('.dropdown-submenu.open').removeClass('open'); + }); + + if ('ontouchstart' in document.documentElement) { + $('.dropdown-submenu a').on('click.xa.dropdown.data-api', function(e){ + $(this).parent().toggleClass('open'); + }); + } else{ + $('.dropdown-submenu').on('click.xa.dropdown.data-api mouseover.xa.dropdown.data-api', function(e){ + $(this).parent().find('>.dropdown-submenu.open').removeClass('open'); + $(this).addClass('open'); + }); + } + + //toggle class button + $('body').on('click.xa.togglebtn.data-api', '[data-toggle=class]', function (e) { + var $this = $(this), href + var target = $this.attr('data-target') + || e.preventDefault() + || (href = $this.attr('href')) && href.replace(/.*(?=#[^\s]+$)/, '') //strip for ie7 + var className = $this.attr('data-class-name') + $(target).toggleClass(className) + }) + + // loading btn + // $('.btn.btn-loading,.btn[type=submit]') + // .click(function () { + // var btn = $(this) + // btn.button('loading') + // }) + + //.nav-content bar nav-menu + $('.navbar-xs .navbar-nav > li') + .on('shown.bs.dropdown', function(e){ + $(this).find('>.dropdown-menu').css('max-height', $(window).height()-120); + $(this).parent().find('>li').addClass('hidden-xs'); + $(this).removeClass('hidden-xs'); + }) + .on('hidden.bs.dropdown', function(e){ + $(this).parent().find('>li').removeClass('hidden-xs'); + }); + + // dashboard widget + $('.widget-form').each(function(e){ + var el = $(this); + el.find('.btn-remove').click(function(){ + el.find('input[name=_delete]').val('on'); + el.submit(); + }); + }); + + // g-search + $('#g-search .dropdown-menu a').click(function(){ + $('#g-search').attr('action', $(this).data('action')).submit(); + }) + + // save settings + $.save_user_settings = function(key, value, success, error){ + var csrftoken = $.getCookie('csrftoken'); + $.ajax({ + type: 'POST', + url: window.__admin_path_prefix__ + 'settings/user', + data: {'key': key, 'value': value}, + success: success, + error: error, + beforeSend: function(xhr, settings) { + xhr.setRequestHeader("X-CSRFToken", csrftoken); + } + }); + } + +})(jQuery) \ No newline at end of file diff --git "a/8\343\200\201\346\226\207\347\214\256\346\225\260\346\215\256\346\214\226\346\216\230\347\263\273\347\273\237(\351\231\204\346\272\220\347\240\201)/extra_apps/xadmin/static/xadmin/js/xadmin.page.dashboard.js" "b/8\343\200\201\346\226\207\347\214\256\346\225\260\346\215\256\346\214\226\346\216\230\347\263\273\347\273\237(\351\231\204\346\272\220\347\240\201)/extra_apps/xadmin/static/xadmin/js/xadmin.page.dashboard.js" new file mode 100644 index 0000000..520fe5d --- /dev/null +++ "b/8\343\200\201\346\226\207\347\214\256\346\225\260\346\215\256\346\214\226\346\216\230\347\263\273\347\273\237(\351\231\204\346\272\220\347\240\201)/extra_apps/xadmin/static/xadmin/js/xadmin.page.dashboard.js" @@ -0,0 +1,78 @@ +jQuery(function() { + $( ".btn-quick-form" ).click(function(){ + var btn = $(this), + form_url; + if(btn.is('a')){ + form_url = btn.attr('href'); + } + if(form_url == undefined){ + form_url = btn.data('form-url'); + } + if(!btn.data('form-modal')){ + var modal = $(''); + $('body').append(modal); + btn.data('form-modal', modal); + modal.find('.modal-body').load(form_url, function(form_html, status, xhr){ + var form = $(this).find('form'); + form.exform(); + modal.find('.btn-submit').click(function(){ + var csrftoken = $.getCookie('csrftoken'); + //clean form errors + form.find('.text-error,.help-inline.error').remove(); + form.find('.control-group').removeClass('error'); + $.ajax({ + type: 'POST', + url: form.attr('action'), + data: form.serialize(), + success: function(data){ + if(data['result'] != 'success' && data['errors']){ + var non_fields_errors = []; + for (var i = data['errors'].length - 1; i >= 0; i--) { + var e = data['errors'][i]; + var errdiv = form.find('#div_' + e['id']); + if(errdiv.length){ + errdiv.addClass('error'); + var err_html = []; + for (var i = e['errors'].length - 1; i >= 0; i--) { + err_html.push(''+e['errors'][i]+''); + }; + errdiv.find('.controls').append(err_html.join('\n')); + } else { + non_fields_errors = non_fields_errors.concat(e['errors']); + } + }; + if(non_fields_errors.length){ + var err_html = []; + for (var i = non_fields_errors.length - 1; i >= 0; i--) { + err_html.push('

    '+e['errors'][i]+'

    '); + }; + form.prepend(err_html.join('\n')); + } + } else { + btn.trigger('post-success'); + } + }, + dataType: 'json', + beforeSend: function(xhr, settings) { + xhr.setRequestHeader("X-CSRFToken", csrftoken); + } + }); + }) + }); + } + btn.data('form-modal').modal().css( + { + 'margin-top': function () { + return window.pageYOffset; + } + }); + return false; + }); + + $('.btn-quick-form').on('post-success', function(e){ + window.location.reload(); + }); +}); \ No newline at end of file diff --git "a/8\343\200\201\346\226\207\347\214\256\346\225\260\346\215\256\346\214\226\346\216\230\347\263\273\347\273\237(\351\231\204\346\272\220\347\240\201)/extra_apps/xadmin/static/xadmin/js/xadmin.page.form.js" "b/8\343\200\201\346\226\207\347\214\256\346\225\260\346\215\256\346\214\226\346\216\230\347\263\273\347\273\237(\351\231\204\346\272\220\347\240\201)/extra_apps/xadmin/static/xadmin/js/xadmin.page.form.js" new file mode 100644 index 0000000..9fdb85f --- /dev/null +++ "b/8\343\200\201\346\226\207\347\214\256\346\225\260\346\215\256\346\214\226\346\216\230\347\263\273\347\273\237(\351\231\204\346\272\220\347\240\201)/extra_apps/xadmin/static/xadmin/js/xadmin.page.form.js" @@ -0,0 +1,51 @@ +;(function($){ + $(function() { + var action_bar = $('.form-actions'); + if(action_bar.length){ + var height=action_bar[0].offsetTop + action_bar.outerHeight(); + var onchange = function(){ + var s=(document.body.scrollTop||document.documentElement.scrollTop) + window.innerHeight; + if(s 0){ + var first_activated = false; + exform.find('.error').each(function(){ + if (!first_activated){ + var parent = $(this); + while (!(parent.html() == exform.html())){ + if (parent.hasClass('tab-pane')){ + parent.addClass('active'); + parent.siblings().removeClass('active'); + var menu_tab = $('a[href="#' + parent.attr('id') + '"]'); + menu_tab.parent().addClass('active'); + menu_tab.parent().siblings().removeClass('active'); + first_activated = true; + + } + if (parent.hasClass('box-content')){ + parent.show(); + } + parent = parent.parent(); + } + } + }); + } +})(jQuery) + diff --git "a/8\343\200\201\346\226\207\347\214\256\346\225\260\346\215\256\346\214\226\346\216\230\347\263\273\347\273\237(\351\231\204\346\272\220\347\240\201)/extra_apps/xadmin/static/xadmin/js/xadmin.page.list.js" "b/8\343\200\201\346\226\207\347\214\256\346\225\260\346\215\256\346\214\226\346\216\230\347\263\273\347\273\237(\351\231\204\346\272\220\347\240\201)/extra_apps/xadmin/static/xadmin/js/xadmin.page.list.js" new file mode 100644 index 0000000..4d8bd78 --- /dev/null +++ "b/8\343\200\201\346\226\207\347\214\256\346\225\260\346\215\256\346\214\226\346\216\230\347\263\273\347\273\237(\351\231\204\346\272\220\347\240\201)/extra_apps/xadmin/static/xadmin/js/xadmin.page.list.js" @@ -0,0 +1,29 @@ +jQuery(function($){ + //full screen btn + $('.layout-btns .layout-full').click(function(e){ + var icon = $(this).find('i') + if($(this).hasClass('active')){ + // reset + $('#left-side, ul.breadcrumb').show('fast'); + $('#content-block').removeClass('col-md-12 col-sm-12 full-content').addClass('col-sm-11 col-md-10'); + icon.removeClass('fa-compress').addClass('fa-expand'); + $(window).trigger('resize'); + } else { + // full screen + $('#left-side, ul.breadcrumb').hide('fast', function(){ + $('#content-block').removeClass('col-sm-11 col-md-10').addClass('col-md-12 col-sm-12 full-content'); + icon.removeClass('fa-expand').addClass('fa-compress'); + $(window).trigger('resize'); + }); + } + }); + + $('.layout-btns .layout-normal').click(function(e){ + $('.results table').removeClass('table-condensed'); + }); + + $('.layout-btns .layout-condensed').click(function(e){ + $('.results table').addClass('table-condensed'); + }); + +}); \ No newline at end of file diff --git "a/8\343\200\201\346\226\207\347\214\256\346\225\260\346\215\256\346\214\226\346\216\230\347\263\273\347\273\237(\351\231\204\346\272\220\347\240\201)/extra_apps/xadmin/static/xadmin/js/xadmin.plugin.actions.js" "b/8\343\200\201\346\226\207\347\214\256\346\225\260\346\215\256\346\214\226\346\216\230\347\263\273\347\273\237(\351\231\204\346\272\220\347\240\201)/extra_apps/xadmin/static/xadmin/js/xadmin.plugin.actions.js" new file mode 100644 index 0000000..f307d0a --- /dev/null +++ "b/8\343\200\201\346\226\207\347\214\256\346\225\260\346\215\256\346\214\226\346\216\230\347\263\273\347\273\237(\351\231\204\346\272\220\347\240\201)/extra_apps/xadmin/static/xadmin/js/xadmin.plugin.actions.js" @@ -0,0 +1,118 @@ +(function($) { + + $.fn.actions = function(opts) { + var options = $.extend({}, $.fn.actions.defaults, opts); + var actionCheckboxes = $(this); + + updateCounter = function() { + var sel = $(actionCheckboxes).filter(":checked").length; + + $(options.counterContainer).html(interpolate( + ngettext('%(sel)s of %(cnt)s selected', '%(sel)s of %(cnt)s selected', sel), { + sel: sel, + cnt: _actions_icnt + }, true)); + + if (sel == actionCheckboxes.length) { + showQuestion(); + $(options.allToggle).prop('checked', true); + } else { + clearAcross(); + $(options.allToggle).prop('checked', false); + } + } + showQuestion = function() { + $(options.acrossClears).hide(); + $(options.acrossQuestions).show(); + $(options.allContainer).hide(); + } + showClear = function() { + $(options.acrossClears).show(); + $(options.acrossQuestions).hide(); + $(options.allContainer).show(); + $(options.counterContainer).hide(); + } + reset = function() { + $(options.acrossClears).hide(); + $(options.acrossQuestions).hide(); + $(options.allContainer).hide(); + $(options.counterContainer).show(); + } + clearAcross = function() { + reset(); + $(options.acrossInput).val(0); + } + + // Show counter by default + $(options.counterContainer).show(); + $(options.allToggle).show().click(function() { + $(actionCheckboxes).trigger('checker', $(this).is(":checked")); + }); + + $("div.form-actions .question").click(function(event) { + event.preventDefault(); + $(options.acrossInput).val(1); + showClear(); + }); + $("div.form-actions .clear").click(function(event) { + event.preventDefault(); + $(options.allToggle).prop("checked", false); + $(actionCheckboxes).trigger('checker', false); + clearAcross(); + }); + + $(actionCheckboxes).bind('checker', function(e, checked){ + $(this).prop("checked", checked) + .parentsUntil('.grid-item').parent().toggleClass(options.selectedClass, checked); + updateCounter(); + }); + + lastChecked = null; + $(actionCheckboxes).click(function(event) { + if (!event) { var event = window.event; } + var target = event.target ? event.target : event.srcElement; + + if (lastChecked && $.data(lastChecked) != $.data(target) && event.shiftKey == true) { + var inrange = false; + $(lastChecked).trigger('checker', target.checked); + $(actionCheckboxes).each(function() { + if ($.data(this) == $.data(lastChecked) || $.data(this) == $.data(target)) { + inrange = (inrange) ? false : true; + } + if (inrange) { + $(this).trigger('checker', target.checked); + } + }); + } + + $(target).trigger('checker', target.checked); + lastChecked = target; + }); + + // Check state of checkboxes and reinit state if needed + $(this).filter(":checked").trigger('checker', true); + updateCounter(); + if ($(options.acrossInput).val() == 1) { + showClear(); + } + } + /* Setup plugin defaults */ + $.fn.actions.defaults = { + counterContainer: "div.form-actions .action-counter", + allContainer: "div.form-actions .all", + acrossInput: "div.form-actions #select-across", + acrossQuestions: "div.form-actions .question", + acrossClears: "div.form-actions .clear", + allToggle: "#action-toggle", + selectedClass: "warning" + } + + $.do_action = function(name){ + $('#action').val(name); + $('#changelist-form').submit(); + } + + $(document).ready(function($) { + $(".results input.action-select").actions(); + }); +})(jQuery); diff --git "a/8\343\200\201\346\226\207\347\214\256\346\225\260\346\215\256\346\214\226\346\216\230\347\263\273\347\273\237(\351\231\204\346\272\220\347\240\201)/extra_apps/xadmin/static/xadmin/js/xadmin.plugin.batch.js" "b/8\343\200\201\346\226\207\347\214\256\346\225\260\346\215\256\346\214\226\346\216\230\347\263\273\347\273\237(\351\231\204\346\272\220\347\240\201)/extra_apps/xadmin/static/xadmin/js/xadmin.plugin.batch.js" new file mode 100644 index 0000000..9917224 --- /dev/null +++ "b/8\343\200\201\346\226\207\347\214\256\346\225\260\346\215\256\346\214\226\346\216\230\347\263\273\347\273\237(\351\231\204\346\272\220\347\240\201)/extra_apps/xadmin/static/xadmin/js/xadmin.plugin.batch.js" @@ -0,0 +1,16 @@ + +;(function($){ + + $('.batch-field-checkbox').bind('click', function(event){ + if (!event) { var event = window.event; } + var target = event.target ? event.target : event.srcElement; + + var wrap = $(this).parent().parent().find('.control-wrap'); + if(target.checked){ + wrap.show('fast'); + } else { + wrap.hide('fast'); + } + }); + +})(jQuery) diff --git "a/8\343\200\201\346\226\207\347\214\256\346\225\260\346\215\256\346\214\226\346\216\230\347\263\273\347\273\237(\351\231\204\346\272\220\347\240\201)/extra_apps/xadmin/static/xadmin/js/xadmin.plugin.bookmark.js" "b/8\343\200\201\346\226\207\347\214\256\346\225\260\346\215\256\346\214\226\346\216\230\347\263\273\347\273\237(\351\231\204\346\272\220\347\240\201)/extra_apps/xadmin/static/xadmin/js/xadmin.plugin.bookmark.js" new file mode 100644 index 0000000..8af6f0d --- /dev/null +++ "b/8\343\200\201\346\226\207\347\214\256\346\225\260\346\215\256\346\214\226\346\216\230\347\263\273\347\273\237(\351\231\204\346\272\220\347\240\201)/extra_apps/xadmin/static/xadmin/js/xadmin.plugin.bookmark.js" @@ -0,0 +1,17 @@ +(function($) { + + $(function(){ + $('#bookmark_form').each(function(){ + var f = $(this); + f.submit(function(e){ + f.find('button[type=submit]').button('loading'); + $.post(f.attr('action'), f.serialize(), function(data){ + $('#bookmark-menu .add-bookmark').remove(); + $('#bookmark-menu').append('
  • '+ data.title +'
  • '); + }, 'json'); + return false; + }); + }); + }); + +})(jQuery); \ No newline at end of file diff --git "a/8\343\200\201\346\226\207\347\214\256\346\225\260\346\215\256\346\214\226\346\216\230\347\263\273\347\273\237(\351\231\204\346\272\220\347\240\201)/extra_apps/xadmin/static/xadmin/js/xadmin.plugin.charts.js" "b/8\343\200\201\346\226\207\347\214\256\346\225\260\346\215\256\346\214\226\346\216\230\347\263\273\347\273\237(\351\231\204\346\272\220\347\240\201)/extra_apps/xadmin/static/xadmin/js/xadmin.plugin.charts.js" new file mode 100644 index 0000000..66f18e0 --- /dev/null +++ "b/8\343\200\201\346\226\207\347\214\256\346\225\260\346\215\256\346\214\226\346\216\230\347\263\273\347\273\237(\351\231\204\346\272\220\347\240\201)/extra_apps/xadmin/static/xadmin/js/xadmin.plugin.charts.js" @@ -0,0 +1,58 @@ +$(document).ready(function(){ + + function showTooltip(x, y, contents) { + $('
    ' + contents + '
    ').css( { + position: 'absolute', + display: 'none', + top: y + 5, + left: x + 5 + }).appendTo("body").fadeIn(200); + } + + $.fn.chart = function(){ + $(this).each(function(){ + var $chart = $(this); + + if($chart.data('chart-obj')) return; + + $chart.html(' Loading chart...'); + + $.getJSON($chart.data('chart-url'), function(data){ + var chart = $.plot($chart, data.data, data.option); + var previousPoint = null; + $chart.bind("plothover", function (event, pos, item) { + if (item) { + if (previousPoint != item.dataIndex) { + previousPoint = item.dataIndex; + + $("#chart-tooltip").remove(); + var x = item.series.xaxis.tickFormatter(item.datapoint[0], item.series.xaxis), + y = item.series.yaxis.tickFormatter(item.datapoint[1], item.series.yaxis); + if (item.series.xaxis.options.mode=="categories") { + x = item.series.data[item.dataIndex][0]; + } + if (item.series.yaxis.options.mode=="categories") { + y = item.series.data[item.dataIndex][1]; + } + showTooltip(item.pageX, item.pageY, + item.series.label + " :
    (" + x + " , " + y+")"); + } + } else { + $("#chart-tooltip").remove(); + previousPoint = null; + } + }); + $chart.data('chart-obj', chart); + }); + }) + } + + $('.chart-tab a').click(function(e){ + e.preventDefault(); + $(this).tab('show'); + + $($(this).attr('href')).chart(); + }); + $('.chart-tab a:first').click(); + $('.chart.init').chart(); +}); \ No newline at end of file diff --git "a/8\343\200\201\346\226\207\347\214\256\346\225\260\346\215\256\346\214\226\346\216\230\347\263\273\347\273\237(\351\231\204\346\272\220\347\240\201)/extra_apps/xadmin/static/xadmin/js/xadmin.plugin.details.js" "b/8\343\200\201\346\226\207\347\214\256\346\225\260\346\215\256\346\214\226\346\216\230\347\263\273\347\273\237(\351\231\204\346\272\220\347\240\201)/extra_apps/xadmin/static/xadmin/js/xadmin.plugin.details.js" new file mode 100644 index 0000000..12b4a0b --- /dev/null +++ "b/8\343\200\201\346\226\207\347\214\256\346\225\260\346\215\256\346\214\226\346\216\230\347\263\273\347\273\237(\351\231\204\346\272\220\347\240\201)/extra_apps/xadmin/static/xadmin/js/xadmin.plugin.details.js" @@ -0,0 +1,61 @@ +(function($){ + + var DetailsPop = function(element){ + this.$element = $(element); + this.res_uri = this.$element.data('res-uri'); + this.edit_uri = this.$element.data('edit-uri'); + this.obj_data = null; + + this.$element.on('click', $.proxy(this.click, this)); + }; + + DetailsPop.prototype = { + constructor: DetailsPop, + + click: function(e){ + e.stopPropagation(); + e.preventDefault(); + var modal = $('#detail-modal-id'); + var el = this.$element; + if(!modal.length){ + modal = $(''); + $('body').append(modal); + } + modal.find('.modal-title').html(el.attr('title')); + var edit_btn = modal.find('.edit-btn'); + if(this.edit_uri != ""){ + edit_btn.attr('href', this.edit_uri); + }else{ + edit_btn.remove(); + } + modal.find('.modal-body').html('

    '); + modal.find('.modal-body').load(this.res_uri + '?_format=html', function(response, status, xhr) { + if (status == "error") { + var msg = "Sorry but there was an error: "; + modal.find('.modal-body').html(msg + xhr.status + " " + (typeof xhr === 'string' ? xhr : xhr.responseText || xhr.statusText || 'Unknown error!')); + } + }); + modal.modal(); + } + }; + + $.fn.details = function () { + return this.each(function () { + var $this = $(this), data = $this.data('details'); + if (!data) { + $this.data('details', (data = new DetailsPop(this))); + } + }); + }; + + $(function(){ + $('.details-handler').details(); + }); + +})(jQuery); + + diff --git "a/8\343\200\201\346\226\207\347\214\256\346\225\260\346\215\256\346\214\226\346\216\230\347\263\273\347\273\237(\351\231\204\346\272\220\347\240\201)/extra_apps/xadmin/static/xadmin/js/xadmin.plugin.editable.js" "b/8\343\200\201\346\226\207\347\214\256\346\225\260\346\215\256\346\214\226\346\216\230\347\263\273\347\273\237(\351\231\204\346\272\220\347\240\201)/extra_apps/xadmin/static/xadmin/js/xadmin.plugin.editable.js" new file mode 100644 index 0000000..2518613 --- /dev/null +++ "b/8\343\200\201\346\226\207\347\214\256\346\225\260\346\215\256\346\214\226\346\216\230\347\263\273\347\273\237(\351\231\204\346\272\220\347\240\201)/extra_apps/xadmin/static/xadmin/js/xadmin.plugin.editable.js" @@ -0,0 +1,208 @@ + ++function ($) { "use strict"; + + // POPOVER PUBLIC CLASS DEFINITION + // =============================== + + var Editpop = function (element, options) { + this.einit('editpop', element, options) + } + + Editpop.DEFAULTS = $.extend({} , $.fn.popover.Constructor.DEFAULTS, { + container: 'body' + , trigger: 'manual' + , placement: function(tip, el) { + var $tip = $(tip) + var $el = $(el) + + var tip_width = $tip.width(), + tip_height = $tip.height(), + el_width = $el.width(), + el_height = $el.height(), + client_width = document.body.clientWidth, + gap = 20 + + var top_gap = $el.offset().top - $("body").scrollTop() - 40, + left_gap = $el.offset().left - $("body").scrollLeft(), + right_gap = client_width - left_gap - el_width + + if(top_gap > tip_height + gap && left_gap > tip_width/2 + gap && right_gap > tip_width/2 + gap){ + return 'top' + } + if(top_gap > tip_height/2){ + if(right_gap > tip_width + gap){ + return 'right' + } else if(left_gap > tip_width + gap) { + return 'left' + } + } + return 'bottom' + } + , template: '

    ' + }) + + + // NOTE: POPOVER EXTENDS tooltip.js + // ================================ + + Editpop.prototype = $.extend({}, $.fn.popover.Constructor.prototype) + + Editpop.prototype.constructor = Editpop + + Editpop.prototype.einit = function (type, element, options) { + this.init(type, element, options) + this.content = null + this.$element.on('click.' + this.type, $.proxy(this.beforeToggle, this)) + + this.$text = this.$element.parent().parent().find('.editable-field') + this.field = this.$element.data('editable-field') + } + + Editpop.prototype.getDefaults = function () { + return Editpop.DEFAULTS + } + + Editpop.prototype.beforeToggle = function() { + var $el = this.$element + + if(this.content == null){ + var that = this + $el.find('>i').removeClass('fa fa-edit').addClass('fa fa-spinner fa-spin') + $.ajax({ + url: $el.data('editable-loadurl'), + success: function(content){ + $el.find('>i').removeClass('fa fa-spinner fa-spin').addClass('fa fa-edit') + that.content = content + that.toggle() + }, + dataType: 'html' + }) + } else { + this.toggle() + } + } + + Editpop.prototype.setContent = function () { + var $tip = this.tip() + var title = this.getTitle() + + $tip.find('.popover-title').html('' + title) + $tip.find('.popover-content').html(this.content) + + var $form = $tip.find('.popover-content > form') + $form.exform() + $form.submit($.proxy(this.submit, this)) + + this.$form = $form + this.$mask = $('

    ') + $tip.find('.popover-content').prepend(this.$mask) + + $tip.removeClass('fade top bottom left right in') + + //bind events + $tip.find('[data-dismiss=editpop]').on('click.' + this.type, $.proxy(this.leave, this, this)) + + var me = ((Math.random() * 10) + "").replace(/\D/g, '') + var click_event_ns = "click." + me + " touchstart." + me + var that = this + + // $('body').on(click_event_ns, function(e) { + // if ( !$tip.has(e.target).length ) { that.hide() } + // }) + + $(document).bind('keyup.editpop', function(e) { + if (e.keyCode == 27) { that.leave(that) } + return + }) + } + + Editpop.prototype.hasContent = function () { + return this.getTitle() || this.content + } + + Editpop.prototype.submit = function(e) { + e.stopPropagation() + e.preventDefault() + + $.when(this.save()) + .done($.proxy(function(data) { + this.$mask.hide() + this.$mask.parents('.popover').hide() + if(data['result'] != 'success' && data['errors']){ + var err_html = [] + for (var i = data['errors'].length - 1; i >= 0; i--) { + var e = data['errors'][i] + for (var j = e['errors'].length - 1; j >= 0; j--) { + err_html.push(''+e['errors'][j]+'') + } + } + this.$form.find(".control-group").addClass('has-error') + this.$form.find('.controls').append(err_html.join('\n')) + } else { + this.$text.html(data['new_html'][this.field]) + this.leave(this) + } + }, this)) + .fail($.proxy(function(xhr) { + this.$mask.hide() + this.$mask.parents('.popover').hide() + alert(typeof xhr === 'string' ? xhr : xhr.responseText || xhr.statusText || 'Unknown error!'); + }, this)) + } + + Editpop.prototype.save = function(newValue) { + this.$form.find('.control-group').removeClass('has-error') + this.$form.find('.controls .help-block.error').remove() + + this.$mask.show() + + var off_check_box = Object(); + this.$form.find('input[type=checkbox]').each(function(){ + if(!$(this).is(':checked')){ + off_check_box[$(this).attr('name')] = '' + } + }) + + return $.ajax({ + data: [this.$form.serialize(), $.param(off_check_box)].join('&'), + url: this.$form.attr('action'), + type: "POST", + dataType: 'json', + beforeSend: function(xhr, settings) { + xhr.setRequestHeader("X-CSRFToken", $.getCookie('csrftoken')) + } + }) + } + + // POPOVER PLUGIN DEFINITION + // ========================= + + var old = $.fn.editpop + + $.fn.editpop = function (option) { + return this.each(function () { + var $this = $(this) + var data = $this.data('bs.editpop') + var options = typeof option == 'object' && options + + if (!data) $this.data('bs.editpop', (data = new Editpop(this, options))) + if (typeof option == 'string') data[option]() + }) + } + + $.fn.editpop.Constructor = Editpop + + + // POPOVER NO CONFLICT + // =================== + + $.fn.editpop.noConflict = function () { + $.fn.editpop = old + return this + } + + $(function(){ + $('.editable-handler').editpop(); + }) + +}(window.jQuery); diff --git "a/8\343\200\201\346\226\207\347\214\256\346\225\260\346\215\256\346\214\226\346\216\230\347\263\273\347\273\237(\351\231\204\346\272\220\347\240\201)/extra_apps/xadmin/static/xadmin/js/xadmin.plugin.filters.js" "b/8\343\200\201\346\226\207\347\214\256\346\225\260\346\215\256\346\214\226\346\216\230\347\263\273\347\273\237(\351\231\204\346\272\220\347\240\201)/extra_apps/xadmin/static/xadmin/js/xadmin.plugin.filters.js" new file mode 100644 index 0000000..2d77cd6 --- /dev/null +++ "b/8\343\200\201\346\226\207\347\214\256\346\225\260\346\215\256\346\214\226\346\216\230\347\263\273\347\273\237(\351\231\204\346\272\220\347\240\201)/extra_apps/xadmin/static/xadmin/js/xadmin.plugin.filters.js" @@ -0,0 +1,57 @@ +(function($) { + + $(function(){ + + // filter + $('.filter-multiselect input[type=checkbox]').click(function(e){ + window.location.href = $(this).parent().attr('href'); + }); + + // menber filter + $('.filter-number .remove').click(function(e){ + $(this).parent().parent().find('input[type="number"]').val(''); + }); + + $('.filter-number .toggle').click(function(e){ + var new_name = $(this).hasClass('active') ? $(this).attr('data-off-name') : $(this).attr('data-on-name'); + $(this).parent().parent().find('input[type="number"]').attr('name', new_name); + }); + + $('#filter-menu form').submit(function(){ + $(this).find('input[type="text"],input[type="number"]').each(function(e){ + if(!$(this).val()) $(this).attr('name', ''); + }); + return true; + }); + + $('.menu-date-range form').each(function(){ + var el = $(this); + var start_date = el.find('.calendar.date-start').datepicker({format: 'yyyy-mm-dd', language: 'xadmin'}); + var end_date = el.find('.calendar.date-end').datepicker({format: 'yyyy-mm-dd', language: 'xadmin'}); + + var checkAvailable = function(){ + if(start_date.data('datepicker').getDate().valueOf() <= end_date.data('datepicker').getDate().valueOf()){ + el.find('button[type=submit]').removeAttr('disabled'); + } else { + el.find('button[type=submit]').attr('disabled', 'disabled'); + } + } + + start_date.on('changeDate', function(ev){ + var startdate = start_date.data('date'); + el.find('.start_input').val(startdate); + end_date.data('datepicker').setStartDate(startdate); + checkAvailable(); + }); + end_date.on('changeDate', function(ev){ + var enddate = end_date.data('date'); + el.find('.end_input').val(enddate); + start_date.data('datepicker').setEndDate(enddate); + checkAvailable(); + }); + + checkAvailable(); + }); + }); + +})(jQuery); \ No newline at end of file diff --git "a/8\343\200\201\346\226\207\347\214\256\346\225\260\346\215\256\346\214\226\346\216\230\347\263\273\347\273\237(\351\231\204\346\272\220\347\240\201)/extra_apps/xadmin/static/xadmin/js/xadmin.plugin.formset.js" "b/8\343\200\201\346\226\207\347\214\256\346\225\260\346\215\256\346\214\226\346\216\230\347\263\273\347\273\237(\351\231\204\346\272\220\347\240\201)/extra_apps/xadmin/static/xadmin/js/xadmin.plugin.formset.js" new file mode 100644 index 0000000..3c30dae --- /dev/null +++ "b/8\343\200\201\346\226\207\347\214\256\346\225\260\346\215\256\346\214\226\346\216\230\347\263\273\347\273\237(\351\231\204\346\272\220\347\240\201)/extra_apps/xadmin/static/xadmin/js/xadmin.plugin.formset.js" @@ -0,0 +1,145 @@ +;(function($) { + $.fn.formset = function(opts){ + var $$ = $(this); + + var options = $.extend({ + prefix: $$.data('prefix') + }, $.fn.formset.styles[$$.data('style')], opts), + + updateElementIndex = function(elem, prefix, ndx) { + var idRegex = new RegExp(prefix + '-(\\d+|__prefix__)-'), + replacement = prefix + '-' + ndx + '-'; + if (elem.attr("for")) elem.attr("for", elem.attr("for").replace(idRegex, replacement)); + if (elem.attr('id')) elem.attr('id', elem.attr('id').replace(idRegex, replacement)); + if (elem.attr('name')) elem.attr('name', elem.attr('name').replace(idRegex, replacement)); + if (elem.attr('href')) elem.attr('href', elem.attr('href').replace(idRegex, replacement)); + elem.find('.formset-num').html(ndx + 1); + }, + + hasChildElements = function(row) { + return row.find('input,select,textarea,label,div,a').length > 0; + }, + + updateRowIndex = function(row, i){ + if (options.update) options.update(row, (function(elem){ + updateElementIndex(elem, options.prefix, i); + })); + updateElementIndex(row, options.prefix, i); + row.find('input,select,textarea,label,div,a').each(function() { + updateElementIndex($(this), options.prefix, i); + }); + row.data('row-index', i); + }, + + insertDeleteLink = function(row) { + row.find('a.delete-row').click(function() { + var row = $(this).parents(".formset-row"), + del = row.find('input[id $= "-DELETE"]'); + + if (options.removed) options.removed(row, del, $$); + + if (del.length) { + if(del.val() == 'on'){ + row.removeClass('row-deleted'); + } else { + row.addClass('row-deleted'); + } + del.val(del.val() == 'on'?'':'on'); + } else { + var parent = row.parent(); + row.remove(); + var forms = parent.find('.formset-row'); + $('#id_' + options.prefix + '-TOTAL_FORMS').val(forms.length); + for (var i=0, formCount=forms.length; i#'+ (row.data('row-index') + 1) +''); + $$.parent().find('.nav-tabs').append(new_tab); + new_tab.find('a').tab('show'); + }, + update: function(row, update){ + var rowId = row.attr('id'); + if(rowId){ + $('a[href=#'+rowId+']').each(function(){ + update($(this)); + }) + } + }, + removed: function(row, del, $$){ + var rowId = row.attr('id'); + if(rowId){ + var tab = $('a[href=#'+rowId+']'); + if (del.length) { + if(del.val() == 'on'){ + tab.removeClass('row-deleted'); + } else { + tab.addClass('row-deleted'); + } + } else { + if(tab.parent().next().length){ + tab.parent().next().find('a').tab('show'); + } else { + tab.parent().prev().find('a').tab('show'); + } + tab.parent().remove(); + } + } + } + } + }; + + $(function(){ + $('.formset-content').each(function(){ + $(this).formset(); + }); + }); +})(jQuery); diff --git "a/8\343\200\201\346\226\207\347\214\256\346\225\260\346\215\256\346\214\226\346\216\230\347\263\273\347\273\237(\351\231\204\346\272\220\347\240\201)/extra_apps/xadmin/static/xadmin/js/xadmin.plugin.importexport.js" "b/8\343\200\201\346\226\207\347\214\256\346\225\260\346\215\256\346\214\226\346\216\230\347\263\273\347\273\237(\351\231\204\346\272\220\347\240\201)/extra_apps/xadmin/static/xadmin/js/xadmin.plugin.importexport.js" new file mode 100644 index 0000000..4f76c4d --- /dev/null +++ "b/8\343\200\201\346\226\207\347\214\256\346\225\260\346\215\256\346\214\226\346\216\230\347\263\273\347\273\237(\351\231\204\346\272\220\347\240\201)/extra_apps/xadmin/static/xadmin/js/xadmin.plugin.importexport.js" @@ -0,0 +1,12 @@ +$("#export-menu").click(function () { + $("input[name='_select_across']").val($("input[name='select_across']").val()); + if (0 == $("input[name='select_across']").val()) { + var selectedRecords = []; + $.each($('.action-select'), function () { + if (true == $(this).prop('checked')) { + selectedRecords.push($(this).val()); + } + }); + $("input[name='_selected_actions']").val(selectedRecords.join(',')); + } +}); diff --git "a/8\343\200\201\346\226\207\347\214\256\346\225\260\346\215\256\346\214\226\346\216\230\347\263\273\347\273\237(\351\231\204\346\272\220\347\240\201)/extra_apps/xadmin/static/xadmin/js/xadmin.plugin.portal.js" "b/8\343\200\201\346\226\207\347\214\256\346\225\260\346\215\256\346\214\226\346\216\230\347\263\273\347\273\237(\351\231\204\346\272\220\347\240\201)/extra_apps/xadmin/static/xadmin/js/xadmin.plugin.portal.js" new file mode 100644 index 0000000..18d04bd --- /dev/null +++ "b/8\343\200\201\346\226\207\347\214\256\346\225\260\346\215\256\346\214\226\346\216\230\347\263\273\347\273\237(\351\231\204\346\272\220\347\240\201)/extra_apps/xadmin/static/xadmin/js/xadmin.plugin.portal.js" @@ -0,0 +1,30 @@ +jQuery(function() { + $( ".column" ).sortable({ + connectWith: ".column", + handle: '.panel-heading', + forcePlaceholderSize: true, + cursor: "move", + cancel: ".unsort, .tab-content", + stop: function( event, ui ) { + var pos = []; + $('.column').each(function(){ + var col = []; + $(this).find('.panel').each(function(){ + col.push($(this).attr('id')); + }); + pos.push(col.join(',')); + }); + var pos_val = pos.join('|'); + var key = $('#_portal_key').val(); + $.save_user_settings(key, pos_val, function(){ + //alert('success'); + }); + } + }); + + $( ".panel-heading .icon.chevron" ).click(function() { + $( this ).toggleClass( "fa fa-chevron-up" ).toggleClass( "fa fa-chevron-down" ); + $( this ).parents( ".panel:first" ).find( ".panel-body" ).toggle('fast'); + }); + +}); \ No newline at end of file diff --git "a/8\343\200\201\346\226\207\347\214\256\346\225\260\346\215\256\346\214\226\346\216\230\347\263\273\347\273\237(\351\231\204\346\272\220\347\240\201)/extra_apps/xadmin/static/xadmin/js/xadmin.plugin.quick-form.js" "b/8\343\200\201\346\226\207\347\214\256\346\225\260\346\215\256\346\214\226\346\216\230\347\263\273\347\273\237(\351\231\204\346\272\220\347\240\201)/extra_apps/xadmin/static/xadmin/js/xadmin.plugin.quick-form.js" new file mode 100644 index 0000000..779300d --- /dev/null +++ "b/8\343\200\201\346\226\207\347\214\256\346\225\260\346\215\256\346\214\226\346\216\230\347\263\273\347\273\237(\351\231\204\346\272\220\347\240\201)/extra_apps/xadmin/static/xadmin/js/xadmin.plugin.quick-form.js" @@ -0,0 +1,231 @@ + +;(function($){ + + $('form.widget-form').on('post-success', function(e, data){ + $(this).data('ajaxform').clean() + $('.alert-success #change-link').attr('href', data['change_url']) + $('.alert-success').show() + }) + + var AjaxForm = function(element, options) { + var that = this + + this.$form = $(element) + this.ainit() + } + + AjaxForm.prototype = { + + constructor: AjaxForm + + , ainit: function(){ + this.$mask = $('

    ') + + this.$form.prepend(this.$mask) + this.$form.submit($.proxy(this.submit, this)) + + this.$form.find('input, select, textarea').each(function(){ + var el = $(this) + if (el.is("[type=checkbox]")) { + el.data('init-value', el.attr('checked')) + } else if (el.is("select")) { + el.data('init-value', el[0].selectedIndex) + } else { + el.data('init-value', el.val()) + } + }) + } + + , clean: function(){ + this.$form.find('input, select, textarea').each(function(){ + var el = $(this) + if (el.is("[type=checkbox]")) { + el.removeAttr('checked') + } else if (el.is("select")) { + el[0].selectedIndex = el.data('init-value')||0 + } else { + el.val(el.data('init-value')||'') + } + el.change() + }) + } + + , submit: function(e) { + e.stopPropagation(); + e.preventDefault(); + + $.when(this.save()) + .done($.proxy(function(data) { + this.$mask.hide(); + + this.$form.find('submit, button[type=submit], input[type=submit]').removeClass('disabled'); + this.$form.find('.alert-success').hide() + + if(data['result'] != 'success' && data['errors']){ + var non_fields_errors = [] + for (var i = data['errors'].length - 1; i >= 0; i--) { + var e = data['errors'][i] + var errdiv = this.$form.find('#div_' + e['id']) + if(errdiv.length){ + errdiv.addClass('has-error') + var err_html = [] + for (var j = e['errors'].length - 1; j >= 0; j--) { + err_html.push(''+e['errors'][j]+'') + } + errdiv.find('.controls').append(err_html.join('\n')) + } else { + non_fields_errors = non_fields_errors.concat(e['errors']) + } + } + if(non_fields_errors.length){ + var err_html = [] + for (var i = non_fields_errors.length - 1; i >= 0; i--) { + err_html.push('

    '+e['errors'][i]+'

    ') + } + this.$form.prepend(err_html.join('\n')) + } + } else { + this.$form.trigger('post-success', data); + } + }, this)) + .fail($.proxy(function(xhr) { + this.$mask.hide(); + alert(typeof xhr === 'string' ? xhr : xhr.responseText || xhr.statusText || 'Unknown error!'); + }, this)); + } + , save: function(newValue) { + + this.$form.find('.text-error, .help-inline.error').remove(); + this.$form.find('.control-group').removeClass('error'); + + this.$mask.show(); + this.$form.find('submit, button[type=submit], input[type=submit]').addClass('disabled'); + + var off_check_box = Object(); + // this.$form.find('input[type=checkbox]').each(function(){ + // if(!$(this).attr('checked')){ + // off_check_box[$(this).attr('name')] = ''; + // } + // }) + + return $.ajax({ + data: [this.$form.serialize(), $.param(off_check_box)].join('&'), + url: this.$form.attr('action'), + type: "POST", + dataType: 'json', + beforeSend: function(xhr, settings) { + xhr.setRequestHeader("X-CSRFToken", $.getCookie('csrftoken')); + } + }) + }, + } + + $.fn.ajaxform = function ( option ) { + var args = Array.apply(null, arguments); + args.shift(); + return this.each(function () { + var $this = $(this), + data = $this.data('ajaxform'), + options = typeof option == 'object' && option; + if (!data) { + $this.data('ajaxform', (data = new AjaxForm(this))); + } + }); + }; + + $.fn.ajaxform.Constructor = AjaxForm + + $.fn.exform.renders.push(function(f){ + if (f.is('.quick-form')) { + f.ajaxform() + } + }) + + var QuickAddBtn = function(element, options) { + var that = this; + + this.$btn = $(element) + this.add_url = this.$btn.attr('href') + this.$for_input = $('#' + this.$btn.data('for-id')) + this.$for_wrap = $('#' + this.$btn.data('for-id') + '_wrap_container') + this.refresh_url = this.$btn.data('refresh-url') + this.rendered_form = false + + this.binit(element, options); + } + + QuickAddBtn.prototype = { + + constructor: QuickAddBtn + + , binit: function(element, options){ + this.$btn.click($.proxy(this.click, this)) + } + , click: function(e) { + e.stopPropagation() + e.preventDefault() + + if(!this.modal){ + var modal = $('') + $('body').append(modal) + + var self = this + modal.find('.modal-body').html('

    ') + modal.find('.modal-body').load(this.add_url, function(form_html, status, xhr){ + var form = $(this).find('form') + form.addClass('quick-form') + form.on('post-success', $.proxy(self.post, self)) + form.exform() + + modal.find('.modal-footer').show() + modal.find('.btn-submit').click(function(){form.submit()}) + + self.$form = form + }) + this.modal = modal + } + this.modal.modal(); + + return false + } + , post: function(e, data){ + this.$form.data('ajaxform').clean(); + var wrap = this.$for_wrap; + var input = this.$for_input; + var selected = [data['obj_id']]; + if (input.attr('multiple')){ + var opt = 'option'; + if (input.hasClass('selectdropdown') || input.hasClass('select-multi')){ + opt = 'option:selected'; + } + selected.push($.map(input.find(opt) ,function(opt) { return opt.value; })); + } + $.get(this.refresh_url + selected.join() ,function(form_html, status, xhr){ + wrap.html($('' + form_html + '').find('#' + wrap.attr('id')).html()); + wrap.exform(); + }); + this.modal.modal('hide'); + } + + } + + $.fn.ajax_addbtn = function ( option ) { + return this.each(function () { + var $this = $(this), data = $this.data('ajax_addbtn'); + if (!data) { + $this.data('ajax_addbtn', (data = new QuickAddBtn(this))); + } + }); + }; + + $.fn.ajax_addbtn.Constructor = QuickAddBtn + + $.fn.exform.renders.push(function(f){ + f.find('a.btn-ajax').ajax_addbtn() + }) + +})(jQuery) diff --git "a/8\343\200\201\346\226\207\347\214\256\346\225\260\346\215\256\346\214\226\346\216\230\347\263\273\347\273\237(\351\231\204\346\272\220\347\240\201)/extra_apps/xadmin/static/xadmin/js/xadmin.plugin.quickfilter.js" "b/8\343\200\201\346\226\207\347\214\256\346\225\260\346\215\256\346\214\226\346\216\230\347\263\273\347\273\237(\351\231\204\346\272\220\347\240\201)/extra_apps/xadmin/static/xadmin/js/xadmin.plugin.quickfilter.js" new file mode 100644 index 0000000..6caaf79 --- /dev/null +++ "b/8\343\200\201\346\226\207\347\214\256\346\225\260\346\215\256\346\214\226\346\216\230\347\263\273\347\273\237(\351\231\204\346\272\220\347\240\201)/extra_apps/xadmin/static/xadmin/js/xadmin.plugin.quickfilter.js" @@ -0,0 +1,49 @@ +;(function($){ + $('[data-toggle=tooltip]').tooltip(); + var max=10; + + function addShowMore($,v){ + $(v).nextUntil('li.nav-header').last().after( + $('
  • Show more
  • ').click(function(e){ + e.preventDefault(); + e.stopPropagation(); + $(v).nextUntil('li.nav-header').show(); + $(v).nextUntil('li.nav-header').last().remove(); + addShowLess($,v); + }) + ); + $(v).nextUntil('li.nav-header').last().show(); + } + + function addShowLess($,v){ + $(v).nextUntil('li.nav-header').last().after( + $('
  • Show less
  • ').click(function(e){ + e.preventDefault(); + e.stopPropagation(); + $(v).nextUntil('li.nav-header').filter(function(i){return !$(this).find('input').is(':checked');}).slice(max).hide(); + $(v).nextUntil('li.nav-header').last().remove(); + $(v).scrollMinimal(3000); + addShowMore($,v); + }) + ); + $(v).nextUntil('li.nav-header').last().show(); + } + + $.each($('.nav-quickfilter li.nav-header'),function(i,v){ + if ($(v).nextUntil('li.nav-header').size()>max) { + $(v).nextUntil('li.nav-header').filter(function(i){return !$(this).find('input').is(':checked');}).slice(max).hide(); + addShowMore($,v); + } + }); + + $('.nav-quickfilter li.nav-header').on('click',function(e) { + e.preventDefault(); + e.stopPropagation(); + $('.nav-quickfilter li.nav-header i').toggleClass('icon-chevron-right'); + $('.nav-quickfilter li.nav-header i').toggleClass('icon-chevron-left'); + $('#left-side').toggleClass('col-md-2'); + $('#left-side').toggleClass('col-md-4'); + $('#content-block').toggleClass('col-md-10'); + $('#content-block').toggleClass('col-md-8'); + }); +})(jQuery) \ No newline at end of file diff --git "a/8\343\200\201\346\226\207\347\214\256\346\225\260\346\215\256\346\214\226\346\216\230\347\263\273\347\273\237(\351\231\204\346\272\220\347\240\201)/extra_apps/xadmin/static/xadmin/js/xadmin.plugin.refresh.js" "b/8\343\200\201\346\226\207\347\214\256\346\225\260\346\215\256\346\214\226\346\216\230\347\263\273\347\273\237(\351\231\204\346\272\220\347\240\201)/extra_apps/xadmin/static/xadmin/js/xadmin.plugin.refresh.js" new file mode 100644 index 0000000..0b0a19f --- /dev/null +++ "b/8\343\200\201\346\226\207\347\214\256\346\225\260\346\215\256\346\214\226\346\216\230\347\263\273\347\273\237(\351\231\204\346\272\220\347\240\201)/extra_apps/xadmin/static/xadmin/js/xadmin.plugin.refresh.js" @@ -0,0 +1,22 @@ +(function($) { + + $.dofresh = function(){ + var refresh_el = $('#refresh_time'); + var time = parseInt(refresh_el.text()); + if(time == 1){ + refresh_el.text(0); + window.location.reload(); + } else { + refresh_el.text(time-1); + setTimeout("$.dofresh()",1000) + } + }; + + $(function(){ + var refresh_el = $('#refresh_time'); + if(refresh_el){ + setTimeout("$.dofresh()",1000) + } + }); + +})(jQuery); \ No newline at end of file diff --git "a/8\343\200\201\346\226\207\347\214\256\346\225\260\346\215\256\346\214\226\346\216\230\347\263\273\347\273\237(\351\231\204\346\272\220\347\240\201)/extra_apps/xadmin/static/xadmin/js/xadmin.plugin.revision.js" "b/8\343\200\201\346\226\207\347\214\256\346\225\260\346\215\256\346\214\226\346\216\230\347\263\273\347\273\237(\351\231\204\346\272\220\347\240\201)/extra_apps/xadmin/static/xadmin/js/xadmin.plugin.revision.js" new file mode 100644 index 0000000..4ff6a37 --- /dev/null +++ "b/8\343\200\201\346\226\207\347\214\256\346\225\260\346\215\256\346\214\226\346\216\230\347\263\273\347\273\237(\351\231\204\346\272\220\347\240\201)/extra_apps/xadmin/static/xadmin/js/xadmin.plugin.revision.js" @@ -0,0 +1,28 @@ +jQuery(function($){ + $('.diff_field').each(function(){ + var el = $(this); + var textarea = el.find('textarea.org-data'); + var title = el.data('org-data') || el.attr('title'); + if(textarea.length){ + title = textarea.val(); + } + el.find('.controls').tooltip({ + title: title, + html: true + }) + }); + + $('.formset-content .formset-row').each(function(){ + var row = $(this); + var del = row.find('input[id $= "-DELETE"]'); + if(del.val() == 'on' || del.val() == 'True'){ + row.addClass('row-deleted'); + del.val('on'); + } + var idinput = row.find('input[id $= "-id"]'); + if(idinput.val() == '' || idinput.val() == undefined){ + row.addClass('row-added'); + row.find('.formset-num').html(gettext('New Item')); + } + }); +}); \ No newline at end of file diff --git "a/8\343\200\201\346\226\207\347\214\256\346\225\260\346\215\256\346\214\226\346\216\230\347\263\273\347\273\237(\351\231\204\346\272\220\347\240\201)/extra_apps/xadmin/static/xadmin/js/xadmin.plugin.sortablelist.js" "b/8\343\200\201\346\226\207\347\214\256\346\225\260\346\215\256\346\214\226\346\216\230\347\263\273\347\273\237(\351\231\204\346\272\220\347\240\201)/extra_apps/xadmin/static/xadmin/js/xadmin.plugin.sortablelist.js" new file mode 100644 index 0000000..0f78e10 --- /dev/null +++ "b/8\343\200\201\346\226\207\347\214\256\346\225\260\346\215\256\346\214\226\346\216\230\347\263\273\347\273\237(\351\231\204\346\272\220\347\240\201)/extra_apps/xadmin/static/xadmin/js/xadmin.plugin.sortablelist.js" @@ -0,0 +1,49 @@ +(function($) { + $(function() { + $.ajaxSetup({ + beforeSend: function(xhr, settings) { + function getCookie(name) { + var cookieValue = null; + if (document.cookie && document.cookie != '') { + var cookies = document.cookie.split(';'); + for (var i = 0; i < cookies.length; i++) { + var cookie = jQuery.trim(cookies[i]); + // Does this cookie string begin with the name we want? + if (cookie.substring(0, name.length + 1) == (name + '=')) { + cookieValue = decodeURIComponent(cookie.substring(name.length + 1)); + break; + } + } + } + return cookieValue; + } + if (!(/^http:.*/.test(settings.url) || /^https:.*/.test(settings.url))) { + // Only send the token to relative URLs i.e. locally. + xhr.setRequestHeader("X-CSRFToken", getCookie('csrftoken')); + } + } + }); + + $(".results table tbody").sortable({ + axis: 'y', + items: 'tr', + cursor: 'move', + opacity: 0.8, + update: function(event, ui) { + var $rows = $(this); + $("#save-order").on("click", function(e) { + $.ajax({ + url: $(this).attr('post-url'), + method: 'POST', + data: $rows.sortable('serialize', { + attribute: 'order-key', + expression: (/(.+)_(.+)/), + }) + }); + location.reload(); + }).show(); + } + }); + }); + +})(jQuery); diff --git "a/8\343\200\201\346\226\207\347\214\256\346\225\260\346\215\256\346\214\226\346\216\230\347\263\273\347\273\237(\351\231\204\346\272\220\347\240\201)/extra_apps/xadmin/static/xadmin/js/xadmin.plugin.themes.js" "b/8\343\200\201\346\226\207\347\214\256\346\225\260\346\215\256\346\214\226\346\216\230\347\263\273\347\273\237(\351\231\204\346\272\220\347\240\201)/extra_apps/xadmin/static/xadmin/js/xadmin.plugin.themes.js" new file mode 100644 index 0000000..fcd7158 --- /dev/null +++ "b/8\343\200\201\346\226\207\347\214\256\346\225\260\346\215\256\346\214\226\346\216\230\347\263\273\347\273\237(\351\231\204\346\272\220\347\240\201)/extra_apps/xadmin/static/xadmin/js/xadmin.plugin.themes.js" @@ -0,0 +1,95 @@ +(function($) { + + $.setCookie = function(name, value, options){ + options = options || {}; + if (value === null) { + value = ''; + options.expires = -1; + } + var expires = ''; + if (options.expires && (typeof options.expires == 'number' || options.expires.toUTCString)) { + var date; + if (typeof options.expires == 'number') { + date = new Date(); + date.setTime(date.getTime() + (options.expires * 24 * 60 * 60 * 1000)); + } else { + date = options.expires; + } + expires = '; expires=' + date.toUTCString(); // use expires attribute, max-age is not supported by IE + } + var path = options.path ? '; path=' + options.path : ''; + var domain = options.domain ? '; domain=' + options.domain : ''; + var secure = options.secure ? '; secure' : ''; + document.cookie = [name, '=', encodeURIComponent(value), expires, path, domain, secure].join(''); + } + + $(function(){ + var top_nav = $('#top-nav'); + $('#body-content').css('margin-top', (top_nav.height() + 15) + 'px'); + + if($("#g-theme-menu")){ + $('#g-theme-menu li>a').click(function(){ + var $el = $(this); + var themeHref = $el.data('css-href'); + + var topmenu = $('#top-nav .navbar-collapse'); + if(topmenu.data('bs.collapse')) topmenu.collapse('hide'); + + var modal = $(''); + $('body').append(modal); + + modal.on('shown.bs.modal', function(){ + $.save_user_settings("site-theme", themeHref, function(){ + $.setCookie('_theme', themeHref); + + var iframe = document.createElement("IFRAME"); + iframe.style.display = 'none'; + document.body.appendChild(iframe); + + modal.on('hidden', function(e){ + if(iframe){ + $(iframe).unbind('load'); + iframe.parentNode.removeChild(iframe); + iframe = null; + } + modal.remove(); + }); + + $(iframe).load(function () { + $('#site-theme').attr('href', themeHref); + + setTimeout(function(){ + var nav_height = $('#top-nav').height(); + $('#body-content').animate({'margin-top': (nav_height + 15)}, 500, 'easeOutBounce'); + }, 500); + + modal.modal('hide'); + iframe.parentNode.removeChild(iframe); + iframe = null; + }) + + var ifmDoc = iframe.contentDocument || iframe.contentWindow.document; + ifmDoc.open(); + ifmDoc.write(''); + ifmDoc.write(''); + ifmDoc.write(''); + ifmDoc.close(); + + + $('#g-theme-menu li').removeClass('active'); + $el.parent().addClass('active'); + }); + }) + + modal.modal().css( + { + 'margin-top': function () { + return window.pageYOffset; + } + }); + }) + } + }); + +})(jQuery); \ No newline at end of file diff --git "a/8\343\200\201\346\226\207\347\214\256\346\225\260\346\215\256\346\214\226\346\216\230\347\263\273\347\273\237(\351\231\204\346\272\220\347\240\201)/extra_apps/xadmin/static/xadmin/js/xadmin.responsive.js" "b/8\343\200\201\346\226\207\347\214\256\346\225\260\346\215\256\346\214\226\346\216\230\347\263\273\347\273\237(\351\231\204\346\272\220\347\240\201)/extra_apps/xadmin/static/xadmin/js/xadmin.responsive.js" new file mode 100644 index 0000000..5478467 --- /dev/null +++ "b/8\343\200\201\346\226\207\347\214\256\346\225\260\346\215\256\346\214\226\346\216\230\347\263\273\347\273\237(\351\231\204\346\272\220\347\240\201)/extra_apps/xadmin/static/xadmin/js/xadmin.responsive.js" @@ -0,0 +1,132 @@ +/* include breakpoints.js + Breakpoints.js + version 1.0 + + Creates handy events for your responsive design breakpoints + + Copyright 2011 XOXCO, Inc + http://xoxco.com/ + + Documentation for this plugin lives here: + http://xoxco.com/projects/code/breakpoints + + Licensed under the MIT license: + http://www.opensource.org/licenses/mit-license.php + +*/ +(function($) { + + var lastSize = 0; + var interval = null; + + $.fn.resetBreakpoints = function() { + $(window).unbind('resize'); + if (interval) { + clearInterval(interval); + } + lastSize = 0; + }; + + $.fn.setBreakpoints = function(settings) { + var options = jQuery.extend({ + distinct: true, + breakpoints: new Array(320,480,768,1024) + },settings); + + + interval = setInterval(function() { + + var w = $(window).width(); + var done = false; + + for (var bp in options.breakpoints.sort(function(a,b) { return (b-a) })) { + + // fire onEnter when a browser expands into a new breakpoint + // if in distinct mode, remove all other breakpoints first. + if (!done && w >= options.breakpoints[bp] && lastSize < options.breakpoints[bp]) { + if (options.distinct) { + for (var x in options.breakpoints.sort(function(a,b) { return (b-a) })) { + if ($('body').hasClass('breakpoint-' + options.breakpoints[x])) { + $('body').removeClass('breakpoint-' + options.breakpoints[x]); + $(window).trigger('exitBreakpoint' + options.breakpoints[x]); + } + } + done = true; + } + $('body').addClass('breakpoint-' + options.breakpoints[bp]); + $(window).trigger('enterBreakpoint' + options.breakpoints[bp]); + + } + + // fire onExit when browser contracts out of a larger breakpoint + if (w < options.breakpoints[bp] && lastSize >= options.breakpoints[bp]) { + $('body').removeClass('breakpoint-' + options.breakpoints[bp]); + $(window).trigger('exitBreakpoint' + options.breakpoints[bp]); + + } + + // if in distinct mode, fire onEnter when browser contracts into a smaller breakpoint + if ( + options.distinct && // only one breakpoint at a time + w >= options.breakpoints[bp] && // and we are in this one + w < options.breakpoints[bp-1] && // and smaller than the bigger one + lastSize > w && // and we contracted + lastSize >0 && // and this is not the first time + !$('body').hasClass('breakpoint-' + options.breakpoints[bp]) // and we aren't already in this breakpoint + ) { + $('body').addClass('breakpoint-' + options.breakpoints[bp]); + $(window).trigger('enterBreakpoint' + options.breakpoints[bp]); + + } + } + + // set up for next call + if (lastSize != w) { + lastSize = w; + } + },250); + }; + + var enterPhone = function(){ + $('.content-navbar .navbar-brand').html("sm-" + $(window).width()); + } + + var exitPhone = function(){ + $('.content-navbar .navbar-brand').html("lg-" + $(window).width()); + } + + $(function(){ + $(window).bind('enterBreakpoint768',function() { + enterPhone(); + }); + $(window).bind('exitBreakpoint768',function() { + exitPhone(); + }); + //$(window).setBreakpoints(); + var lastMode = 'lg'; + $(window).bind('resize', function(e){ + var width = $(window).width(); + var mode = 'lg'; + if(width < 768){ mode = 'xs'; } + else if(width < 992){ mode = 'sm'; } + else if(width < 1200){ mode = 'md'; } + if(lastMode != mode){ + $('[data-toggle=breakpoint]').each(function(){ + if(newClass = $(this).data('class-' + mode)){ + $(this)[0].className = newClass; + } else { + $(this)[0].className = $(this).data('class-org'); + } + }) + lastMode = mode; + } + }); + $('[data-toggle=breakpoint]').each(function(){ + $(this).data('class-org', $(this)[0].className); + }) + $(window).trigger('resize'); + }) + +})(jQuery); + + diff --git "a/8\343\200\201\346\226\207\347\214\256\346\225\260\346\215\256\346\214\226\346\216\230\347\263\273\347\273\237(\351\231\204\346\272\220\347\240\201)/extra_apps/xadmin/static/xadmin/js/xadmin.widget.datetime.js" "b/8\343\200\201\346\226\207\347\214\256\346\225\260\346\215\256\346\214\226\346\216\230\347\263\273\347\273\237(\351\231\204\346\272\220\347\240\201)/extra_apps/xadmin/static/xadmin/js/xadmin.widget.datetime.js" new file mode 100644 index 0000000..b0eb9cb --- /dev/null +++ "b/8\343\200\201\346\226\207\347\214\256\346\225\260\346\215\256\346\214\226\346\216\230\347\263\273\347\273\237(\351\231\204\346\272\220\347\240\201)/extra_apps/xadmin/static/xadmin/js/xadmin.widget.datetime.js" @@ -0,0 +1,90 @@ +;(function($){ + $.convert_format = function(format){ + var fields = { + d: 'dd', + H: 'hh', + I: "HH", + m: 'mm', + M: 'MM', + p: 'PM/AM', + S: 'ss', + w: 'w', + y: 'yy', + Y: 'yyyy', + '%' : '%' + }; + var result = '', i = 0; + while (i < format.length) { + if (format.charAt(i) === '%') { + if(f = fields[format.charAt(i + 1)]){ + result = result + f; + } + ++i; + } else { + result = result + format.charAt(i); + } + ++i; + } + return result; + } + + $.date_local = { + days: gettext("Sunday Monday Tuesday Wednesday Thursday Friday Saturday Sunday").split(' '), + daysShort: gettext("Sun Mon Tue Wed Thu Fri Sat Sun").split(' '), + daysMin: gettext("Su Mo Tu We Th Fr Sa Su").split(' '), + months: gettext('January February March April May June July August September October November December').split(' '), + monthsShort: gettext("Jan Feb Mar Apr May Jun Jul Aug Sep Oct Nov Dec").split(' '), + today: gettext("Today"), + date_string: gettext('%a %d %b %Y %T %Z'), + ampm: gettext("AM PM").split(' '), + ampmLower: gettext("am pm").split(' '), + dateFormat: get_format('DATE_INPUT_FORMATS')[0], + dateJSFormat: $.convert_format(get_format('DATE_INPUT_FORMATS')[0]), + timeRepr: gettext('%T') + } + + $.fn.datepicker.dates['xadmin'] = $.date_local; + + $.fn.exform.renders.push(function(f){ + f.find('.input-group.date input').each(function(e){ + var dp = $(this).datepicker({format: $.date_local.dateJSFormat, language: 'xadmin', todayBtn: "linked", autoclose: true}) + .data('datepicker'); + $(this).parent().find('button').click(function(e){ + dp.update(new Date()); + }) + }) + if($.fn.clockpicker){ + f.find('.input-group.bootstrap-clockpicker').each(function(e){ + var el = $(this).find('input'); + var tp = el.clockpicker({ + autoclose: true, + 'default': 'now' + }); + + $(this).find('button').click(function(e){ + var now = new Date() + , value = now.getHours() + ':' + now.getMinutes(); + el.attr('value', value); + }) + }) + } + if($.fn.timepicker){ + f.find('.input-group.bootstrap-timepicker').each(function(e){ + var el = $(this).find('input'); + var value = el.val(); + var tp = el.timepicker({ + minuteStep: 1, + showSeconds: true, + showMeridian: false, + defaultTime: false + }).data('timepicker'); + $(this).find('button').click(function(e){ + tp.$element.val(""); + tp.setDefaultTime('current'); + tp.update(); + }) + }) + } + }); + +})(jQuery) diff --git "a/8\343\200\201\346\226\207\347\214\256\346\225\260\346\215\256\346\214\226\346\216\230\347\263\273\347\273\237(\351\231\204\346\272\220\347\240\201)/extra_apps/xadmin/static/xadmin/js/xadmin.widget.multiselect.js" "b/8\343\200\201\346\226\207\347\214\256\346\225\260\346\215\256\346\214\226\346\216\230\347\263\273\347\273\237(\351\231\204\346\272\220\347\240\201)/extra_apps/xadmin/static/xadmin/js/xadmin.widget.multiselect.js" new file mode 100644 index 0000000..3e7d88e --- /dev/null +++ "b/8\343\200\201\346\226\207\347\214\256\346\225\260\346\215\256\346\214\226\346\216\230\347\263\273\347\273\237(\351\231\204\346\272\220\347\240\201)/extra_apps/xadmin/static/xadmin/js/xadmin.widget.multiselect.js" @@ -0,0 +1,12 @@ + +;(function($){ + + $.fn.exform.renders.push(function(f){ + if($.fn.multiselect){ + f.find('.selectmultiple.selectdropdown').multiselect({ + + }); + } + }); + +})(jQuery) \ No newline at end of file diff --git "a/8\343\200\201\346\226\207\347\214\256\346\225\260\346\215\256\346\214\226\346\216\230\347\263\273\347\273\237(\351\231\204\346\272\220\347\240\201)/extra_apps/xadmin/static/xadmin/js/xadmin.widget.select-transfer.js" "b/8\343\200\201\346\226\207\347\214\256\346\225\260\346\215\256\346\214\226\346\216\230\347\263\273\347\273\237(\351\231\204\346\272\220\347\240\201)/extra_apps/xadmin/static/xadmin/js/xadmin.widget.select-transfer.js" new file mode 100644 index 0000000..0741600 --- /dev/null +++ "b/8\343\200\201\346\226\207\347\214\256\346\225\260\346\215\256\346\214\226\346\216\230\347\263\273\347\273\237(\351\231\204\346\272\220\347\240\201)/extra_apps/xadmin/static/xadmin/js/xadmin.widget.select-transfer.js" @@ -0,0 +1,241 @@ + +;(function($){ + + var SelectBox = function(element, options) { + var that = this; + + this.el = $(element); + var el = this.el; + + this.filter_input = el.find('.selector-filter input'); + this.from_box = el.find('.selector-available select'); + this.to_box = el.find('.selector-chosen select'); + + var findForm = function(node) { + if (node.tagName.toLowerCase() != 'form') { + return findForm(node.parentNode); + } + return node; + } + this.form = $(findForm(element)); + + // link + this.btn_add_all = el.find(".btn.selector-chooseall"); + this.btn_remove_all = el.find(".btn.selector-clearall"); + this.btn_add = el.find(".btn.selector-add"); + this.btn_remove = el.find(".btn.selector-remove"); + + // setup event + this.filter_input.keyup($.proxy(this.filter_key_up, this)); + this.filter_input.keydown($.proxy(this.filter_key_down, this)); + + this.from_box.on('change', $.proxy(this.refresh_icons, this)); + this.to_box.on('change', $.proxy(this.refresh_icons, this)); + + this.from_box.on('dblclick', $.proxy(this.move, this)); + this.to_box.on('dblclick', $.proxy(this.remove, this)); + + this.btn_add.on('click', $.proxy(this.move, this)); + this.btn_remove.on('click', $.proxy(this.remove, this)); + + this.btn_add_all.on('click', $.proxy(this.move_all, this)); + this.btn_remove_all.on('click', $.proxy(this.remove_all, this)); + + this.form.submit($.proxy(this.select_all, this)); + + // init cache + var from_cache = new Array(); + for (var i = 0; (node = this.from_box[0].options[i]); i++) { + from_cache.push({value: node.value, text: node.text, displayed: 1}); + } + this.from_box.data('cache', from_cache); + + var to_cache = new Array(); + for (var i = 0; (node = this.to_box[0].options[i]); i++) { + to_cache.push({value: node.value, text: node.text, displayed: 1}); + } + this.to_box.data('cache', to_cache); + + this.refresh_icons(); + } + + SelectBox.prototype = { + constructor: SelectBox, + redisplay : function(box){ + var select = box[0]; + var cache = box.data('cache'); + select.options.length = 0; // clear all options + for (var i = 0, j = cache.length; i < j; i++) { + var node = cache[i]; + if (node.displayed) { + select.options[select.options.length] = new Option(node.text, node.value, false, false); + } + } + }, + filter: function(text) { + // Redisplay the HTML select box, displaying only the choices containing ALL + // the words in text. (It's an AND search.) + var tokens = text.toLowerCase().split(/\s+/); + var node, token; + for (var i = 0; (node = this.from_box.data('cache')[i]); i++) { + node.displayed = 1; + for (var j = 0; (token = tokens[j]); j++) { + if (node.text.toLowerCase().indexOf(token) == -1) { + node.displayed = 0; + } + } + } + this.redisplay(this.from_box); + }, + remove: function(){ + this.trans(this.to_box, this.from_box); + }, + move: function(){ + this.trans(this.from_box, this.to_box); + }, + delete_from_cache: function(box, value) { + var node, delete_index = null; + var cache = box.data('cache'); + for (var i = 0; (node = cache[i]); i++) { + if (node.value == value) { + delete_index = i; + break; + } + } + var j = cache.length - 1; + for (var i = delete_index; i < j; i++) { + cache[i] = cache[i+1]; + } + cache.length--; + }, + add_to_cache: function(box, option) { + box.data('cache').push({value: option.value, text: option.text, displayed: 1}); + }, + cache_contains: function(box, value) { + // Check if an item is contained in the cache + var node; + for (var i = 0; (node = box.data('cache')[i]); i++) { + if (node.value == value) { + return true; + } + } + return false; + }, + trans: function(from, to){ + for (var i = 0; (option = from[0].options[i]); i++) { + if (option.selected && this.cache_contains(from, option.value)) { + this.add_to_cache(to, {value: option.value, text: option.text, displayed: 1}); + this.delete_from_cache(from, option.value); + } + } + this.redisplay(from); + this.redisplay(to); + + this.refresh_icons(); + }, + move_all : function(){ + this.trans_all(this.from_box, this.to_box); + }, + remove_all: function(){ + this.trans_all(this.to_box, this.from_box); + }, + trans_all: function(from, to) { + var option; + for (var i = 0; (option = from[0].options[i]); i++) { + if (this.cache_contains(from, option.value)) { + this.add_to_cache(to, {value: option.value, text: option.text, displayed: 1}); + this.delete_from_cache(from, option.value); + } + } + this.redisplay(from); + this.redisplay(to); + + this.refresh_icons(); + }, + sort: function(box) { + box.data('cache').sort( function(a, b) { + a = a.text.toLowerCase(); + b = b.text.toLowerCase(); + try { + if (a > b) return 1; + if (a < b) return -1; + } + catch (e) { + // silently fail on IE 'unknown' exception + } + return 0; + } ); + }, + select_all: function() { + var box = this.to_box[0]; + for (var i = 0; i < box.options.length; i++) { + box.options[i].selected = 'selected'; + } + }, + refresh_icons: function() { + var is_from_selected = this.from_box.find('option:selected').length > 0; + var is_to_selected = this.to_box.find('option:selected').length > 0; + // Active if at least one item is selected + this.btn_add.toggleClass('disabled', !is_from_selected); + this.btn_remove.toggleClass('disabled', !is_to_selected); + // Active if the corresponding box isn't empty + this.btn_add_all.toggleClass('disabled', this.from_box.find('option').length == 0); + this.btn_remove_all.toggleClass('disabled', this.to_box.find('option').length == 0); + }, + filter_key_up: function(event) { + var from = this.from_box[0]; + // don't submit form if user pressed Enter + if ((event.which && event.which == 13) || (event.keyCode && event.keyCode == 13)) { + var temp = from.selectedIndex; + this.move(); + from.selectedIndex = temp; + return false; + } + var temp = from.selectedIndex; + this.filter(this.filter_input.val()); + from.selectedIndex = temp; + return true; + }, + filter_key_down: function(event) { + var from = this.from_box[0]; + if ((event.which && event.which == 13) || (event.keyCode && event.keyCode == 13)) { + return false; + } + // right arrow -- move across + if ((event.which && event.which == 39) || (event.keyCode && event.keyCode == 39)) { + var old_index = from.selectedIndex; + this.move(); + from.selectedIndex = (old_index == from.length) ? from.length - 1 : old_index; + return false; + } + // down arrow -- wrap around + if ((event.which && event.which == 40) || (event.keyCode && event.keyCode == 40)) { + from.selectedIndex = (from.length == from.selectedIndex + 1) ? 0 : from.selectedIndex + 1; + } + // up arrow -- wrap around + if ((event.which && event.which == 38) || (event.keyCode && event.keyCode == 38)) { + from.selectedIndex = (from.selectedIndex == 0) ? from.length - 1 : from.selectedIndex - 1; + } + return true; + } + + } + + $.fn.select_transfer = function ( option ) { + var args = Array.apply(null, arguments); + args.shift(); + return this.each(function () { + var $this = $(this), + data = $this.data('transfer'), + options = typeof option == 'object' && option; + if (!data) { + $this.data('transfer', (data = new SelectBox(this))); + } + }); + }; + + $.fn.exform.renders.push(function(f){ + f.find('.select-transfer').select_transfer(); + }); + +})(jQuery) diff --git "a/8\343\200\201\346\226\207\347\214\256\346\225\260\346\215\256\346\214\226\346\216\230\347\263\273\347\273\237(\351\231\204\346\272\220\347\240\201)/extra_apps/xadmin/static/xadmin/js/xadmin.widget.select.js" "b/8\343\200\201\346\226\207\347\214\256\346\225\260\346\215\256\346\214\226\346\216\230\347\263\273\347\273\237(\351\231\204\346\272\220\347\240\201)/extra_apps/xadmin/static/xadmin/js/xadmin.widget.select.js" new file mode 100644 index 0000000..1dd9a38 --- /dev/null +++ "b/8\343\200\201\346\226\207\347\214\256\346\225\260\346\215\256\346\214\226\346\216\230\347\263\273\347\273\237(\351\231\204\346\272\220\347\240\201)/extra_apps/xadmin/static/xadmin/js/xadmin.widget.select.js" @@ -0,0 +1,38 @@ +;(function($){ + // add select render + $.fn.exform.renders.push(function(f){ + if($.fn.selectize){ + f.find('select:not(.select-search):not([multiple=multiple])').selectize(); + f.find('.select-search').each(function(){ + var $el = $(this); + var preload = $el.hasClass('select-preload'); + $el.selectize({ + valueField: 'id', + labelField: '__str__', + searchField: '__str__', + create: false, + maxItems: 1, + preload: preload, + load: function(query, callback) { + if(!preload && !query.length) return callback(); + $.ajax({ + url: $el.data('search-url')+$el.data('choices'), + dataType: 'json', + data: { + '_q_' : query, + '_cols': 'id.__str__' + }, + type: 'GET', + error: function() { + callback(); + }, + success: function(res) { + callback(res.objects); + } + }); + } + }); + }) + }}); +})(jQuery) + diff --git "a/8\343\200\201\346\226\207\347\214\256\346\225\260\346\215\256\346\214\226\346\216\230\347\263\273\347\273\237(\351\231\204\346\272\220\347\240\201)/extra_apps/xadmin/static/xadmin/vendor/autotype/index.js" "b/8\343\200\201\346\226\207\347\214\256\346\225\260\346\215\256\346\214\226\346\216\230\347\263\273\347\273\237(\351\231\204\346\272\220\347\240\201)/extra_apps/xadmin/static/xadmin/vendor/autotype/index.js" new file mode 100644 index 0000000..4fc86fb --- /dev/null +++ "b/8\343\200\201\346\226\207\347\214\256\346\225\260\346\215\256\346\214\226\346\216\230\347\263\273\347\273\237(\351\231\204\346\272\220\347\240\201)/extra_apps/xadmin/static/xadmin/vendor/autotype/index.js" @@ -0,0 +1,283 @@ +/** + * jQuery.autotype - Simple, accurate, typing simulation for jQuery + * + * version 0.5.0 + * + * http://michaelmonteleone.net/projects/autotype + * http://github.com/mmonteleone/jquery.autotype + * + * Copyright (c) 2009 Michael Monteleone + * Licensed under terms of the MIT License (README.markdown) + */ +(function($){ + + // code type constants + var CHARACTER = 1, + NON_CHARACTER = 2, + MODIFIER_BEGIN = 3, + MODIFIER_END = 4, + isNullOrEmpty = function(val) { return val === null || val.length === 0; }, + isUpper = function(char) { return char.toUpperCase() === char; }, + isLower = function(char) { return char.toLowerCase() === char; }, + areDifferentlyCased = function(char1,char2) { + return (isUpper(char1) && isLower(char2)) || + (isLower(char1) && isUpper(char2)); + }, + convertCase = function(char) { + return isUpper(char) ? char.toLowerCase() : char.toUpperCase(); + }, + parseCodes = function(value, codeMap) { + // buffer to hold a collection of key/char code pairs corresponding to input string value + var codes = [], + // buffer to hold the name of a control key as it's being parsed + definingControlKey = false, + // hold a collection of currently pushed modifier keys + activeModifiers = { + alt: false, + meta: false, + shift: false, + ctrl: false + }, + explicitModifiers = $.extend({}, activeModifiers), + // buffer to hold construction of current control key + currentControlKey = '', + previousChar = '', + pushCode = function(opts) { + codes.push($.extend({}, opts, activeModifiers)); + }, + pushModifierBeginCode = function(modifierName) { + activeModifiers[modifierName] = true; + pushCode({ + keyCode: codeMap[modifierName], + charCode: 0, + char: '', + type: MODIFIER_BEGIN + }); + }, + pushModifierEndCode = function(modifierName) { + activeModifiers[modifierName] = false; + pushCode({ + keyCode: codeMap[modifierName], + charCode: 0, + char: '', + type: MODIFIER_END + }); + }; + + for(var i=0;i 0) { + codes = codes.reverse(); + var keyInterval = global.setInterval(function(){ + var code = codes.pop(); + triggerCodeOnField(code, field); + if(codes.length === 0) { + global.clearInterval(keyInterval); + field.trigger('autotyped'); + } + }, delay); + } else { + $.each(codes,function(){ + triggerCodeOnField(this, field); + }); + field.trigger('autotyped'); + } + }; + + $.fn.autotype = function(value, options) { + if(value === undefined || value === null) { throw("Value is required by jQuery.autotype plugin"); } + var settings = $.extend({}, $.fn.autotype.defaults, options); + + // 1st Pass + // step through the input string and convert it into + // a logical sequence of steps, key, and charcodes to apply to the inputs + var codes = parseCodes(value, settings.keyCodes[settings.keyBoard]); + + // 2nd Pass + // Run the translated codes against each input through a realistic + // and cancelable series of key down/press/up events + return this.each(function(){ triggerCodesOnField(codes, $(this), settings.delay, settings.global); }); + }; + + $.fn.autotype.defaults = { + version: '0.5.0', + keyBoard: 'enUs', + delay: 0, + global: window, + keyCodes: { + enUs: { 'back':8,'ins':45,'del':46,'enter':13,'shift':16,'ctrl':17,'meta':224, + 'alt':18,'pause':19,'caps':20,'esc':27,'pgup':33,'pgdn':34, + 'end':35,'home':36,'left':37,'up':38,'right':39,'down':40, + 'printscr':44,'num0':96,'num1':97,'num2':98,'num3':99,'num4':100, + 'num5':101,'num6':102,'num7':103,'num8':104,'num9':105, + 'multiply':106,'add':107,'subtract':109,'decimal':110, + 'divide':111,'f1':112,'f2':113,'f3':114,'f4':115,'f5':116, + 'f6':117,'f7':118,'f8':119,'f9':120,'f10':121,'f11':122, + 'f12':123,'numlock':144,'scrolllock':145,' ':9,' ':32, + 'tab':9,'space':32,'0':48,'1':49,'2':50,'3':51,'4':52, + '5':53,'6':54,'7':55,'8':56,'9':57,')':48,'!':49,'@':50, + '#':51,'$':52,'%':53,'^':54,'&':55,'*':56,'(':57,';':186, + '=':187,',':188,'-':189,'.':190,'/':191,'[':219,'\\':220, + ']':221,"'":222,':':186,'+':187,'<':188,'_':189,'>':190, + '?':191,'{':219,'|':220,'}':221,'"':222,'a':65,'b':66,'c':67, + 'd':68,'e':69,'f':70,'g':71,'h':72,'i':73,'j':74,'k':75, + 'l':76,'m':77,'n':78,'o':79,'p':80,'q':81,'r':82,'s':83, + 't':84,'u':85,'v':86,'w':87,'x':88,'y':89,'z':90,'A':65, + 'B':66,'C':67,'D':68,'E':69,'F':70,'G':71,'H':72,'I':73, + 'J':74,'K':75,'L':76,'M':77,'N':78,'O':79,'P':80,'Q':81, + 'R':82,'S':83,'T':84,'U':85,'V':86,'W':87,'X':88,'Y':89,'Z':90 } + } + }; + +})(jQuery); diff --git "a/8\343\200\201\346\226\207\347\214\256\346\225\260\346\215\256\346\214\226\346\216\230\347\263\273\347\273\237(\351\231\204\346\272\220\347\240\201)/extra_apps/xadmin/static/xadmin/vendor/bootstrap-clockpicker/bootstrap-clockpicker.css" "b/8\343\200\201\346\226\207\347\214\256\346\225\260\346\215\256\346\214\226\346\216\230\347\263\273\347\273\237(\351\231\204\346\272\220\347\240\201)/extra_apps/xadmin/static/xadmin/vendor/bootstrap-clockpicker/bootstrap-clockpicker.css" new file mode 100644 index 0000000..67d2dc3 --- /dev/null +++ "b/8\343\200\201\346\226\207\347\214\256\346\225\260\346\215\256\346\214\226\346\216\230\347\263\273\347\273\237(\351\231\204\346\272\220\347\240\201)/extra_apps/xadmin/static/xadmin/vendor/bootstrap-clockpicker/bootstrap-clockpicker.css" @@ -0,0 +1,168 @@ +/*! + * ClockPicker v0.0.7 for Bootstrap (http://weareoutman.github.io/clockpicker/) + * Copyright 2014 Wang Shenwei. + * Licensed under MIT (https://github.com/weareoutman/clockpicker/blob/gh-pages/LICENSE) + */ + +.clockpicker .input-group-addon { + cursor: pointer; +} +.clockpicker-moving { + cursor: move; +} +.clockpicker-align-left.popover > .arrow { + left: 25px; +} +.clockpicker-align-top.popover > .arrow { + top: 17px; +} +.clockpicker-align-right.popover > .arrow { + left: auto; + right: 25px; +} +.clockpicker-align-bottom.popover > .arrow { + top: auto; + bottom: 6px; +} +.clockpicker-popover .popover-title { + background-color: #fff; + color: #999; + font-size: 24px; + font-weight: bold; + line-height: 30px; + text-align: center; +} +.clockpicker-popover .popover-title span { + cursor: pointer; +} +.clockpicker-popover .popover-content { + background-color: #f8f8f8; + padding: 12px; +} +.popover-content:last-child { + border-bottom-left-radius: 5px; + border-bottom-right-radius: 5px; +} +.clockpicker-plate { + background-color: #fff; + border: 1px solid #ccc; + border-radius: 50%; + width: 200px; + height: 200px; + overflow: visible; + position: relative; + /* Disable text selection highlighting. Thanks to Hermanya */ + -webkit-touch-callout: none; + -webkit-user-select: none; + -khtml-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; +} +.clockpicker-canvas, +.clockpicker-dial { + width: 200px; + height: 200px; + position: absolute; + left: -1px; + top: -1px; +} +.clockpicker-minutes { + visibility: hidden; +} +.clockpicker-tick { + border-radius: 50%; + color: #666; + line-height: 26px; + text-align: center; + width: 26px; + height: 26px; + position: absolute; + cursor: pointer; +} +.clockpicker-tick.active, +.clockpicker-tick:hover { + background-color: rgb(192, 229, 247); + background-color: rgba(0, 149, 221, .25); +} +.clockpicker-button { + background-image: none; + background-color: #fff; + border-width: 1px 0 0; + border-top-left-radius: 0; + border-top-right-radius: 0; + margin: 0; + padding: 10px 0; +} +.clockpicker-button:hover { + background-image: none; + background-color: #ebebeb; +} +.clockpicker-button:focus { + outline: none!important; +} +.clockpicker-dial { + -webkit-transition: -webkit-transform 350ms, opacity 350ms; + -moz-transition: -moz-transform 350ms, opacity 350ms; + -ms-transition: -ms-transform 350ms, opacity 350ms; + -o-transition: -o-transform 350ms, opacity 350ms; + transition: transform 350ms, opacity 350ms; +} +.clockpicker-dial-out { + opacity: 0; +} +.clockpicker-hours.clockpicker-dial-out { + -webkit-transform: scale(1.2, 1.2); + -moz-transform: scale(1.2, 1.2); + -ms-transform: scale(1.2, 1.2); + -o-transform: scale(1.2, 1.2); + transform: scale(1.2, 1.2); +} +.clockpicker-minutes.clockpicker-dial-out { + -webkit-transform: scale(.8, .8); + -moz-transform: scale(.8, .8); + -ms-transform: scale(.8, .8); + -o-transform: scale(.8, .8); + transform: scale(.8, .8); +} +.clockpicker-canvas { + -webkit-transition: opacity 175ms; + -moz-transition: opacity 175ms; + -ms-transition: opacity 175ms; + -o-transition: opacity 175ms; + transition: opacity 175ms; +} +.clockpicker-canvas-out { + opacity: 0.25; +} +.clockpicker-canvas-bearing, +.clockpicker-canvas-fg { + stroke: none; + fill: rgb(0, 149, 221); +} +.clockpicker-canvas-bg { + stroke: none; + fill: rgb(192, 229, 247); +} +.clockpicker-canvas-bg-trans { + fill: rgba(0, 149, 221, .25); +} +.clockpicker-canvas line { + stroke: rgb(0, 149, 221); + stroke-width: 1; + stroke-linecap: round; + /*shape-rendering: crispEdges;*/ +} +.clockpicker-button.am-button { + margin: 1px; + padding: 5px; + border: 1px solid rgba(0, 0, 0, .2); + border-radius: 4px; + +} +.clockpicker-button.pm-button { + margin: 1px 1px 1px 136px; + padding: 5px; + border: 1px solid rgba(0, 0, 0, .2); + border-radius: 4px; +} diff --git "a/8\343\200\201\346\226\207\347\214\256\346\225\260\346\215\256\346\214\226\346\216\230\347\263\273\347\273\237(\351\231\204\346\272\220\347\240\201)/extra_apps/xadmin/static/xadmin/vendor/bootstrap-clockpicker/bootstrap-clockpicker.js" "b/8\343\200\201\346\226\207\347\214\256\346\225\260\346\215\256\346\214\226\346\216\230\347\263\273\347\273\237(\351\231\204\346\272\220\347\240\201)/extra_apps/xadmin/static/xadmin/vendor/bootstrap-clockpicker/bootstrap-clockpicker.js" new file mode 100644 index 0000000..e930b4f --- /dev/null +++ "b/8\343\200\201\346\226\207\347\214\256\346\225\260\346\215\256\346\214\226\346\216\230\347\263\273\347\273\237(\351\231\204\346\272\220\347\240\201)/extra_apps/xadmin/static/xadmin/vendor/bootstrap-clockpicker/bootstrap-clockpicker.js" @@ -0,0 +1,729 @@ +/*! + * ClockPicker v0.0.7 (http://weareoutman.github.io/clockpicker/) + * Copyright 2014 Wang Shenwei. + * Licensed under MIT (https://github.com/weareoutman/clockpicker/blob/gh-pages/LICENSE) + */ + +;(function(){ + var $ = window.jQuery, + $win = $(window), + $doc = $(document), + $body; + + // Can I use inline svg ? + var svgNS = 'http://www.w3.org/2000/svg', + svgSupported = 'SVGAngle' in window && (function(){ + var supported, + el = document.createElement('div'); + el.innerHTML = ''; + supported = (el.firstChild && el.firstChild.namespaceURI) == svgNS; + el.innerHTML = ''; + return supported; + })(); + + // Can I use transition ? + var transitionSupported = (function(){ + var style = document.createElement('div').style; + return 'transition' in style || + 'WebkitTransition' in style || + 'MozTransition' in style || + 'msTransition' in style || + 'OTransition' in style; + })(); + + // Listen touch events in touch screen device, instead of mouse events in desktop. + var touchSupported = 'ontouchstart' in window, + mousedownEvent = 'mousedown' + ( touchSupported ? ' touchstart' : ''), + mousemoveEvent = 'mousemove.clockpicker' + ( touchSupported ? ' touchmove.clockpicker' : ''), + mouseupEvent = 'mouseup.clockpicker' + ( touchSupported ? ' touchend.clockpicker' : ''); + + // Vibrate the device if supported + var vibrate = navigator.vibrate ? 'vibrate' : navigator.webkitVibrate ? 'webkitVibrate' : null; + + function createSvgElement(name) { + return document.createElementNS(svgNS, name); + } + + function leadingZero(num) { + return (num < 10 ? '0' : '') + num; + } + + // Get a unique id + var idCounter = 0; + function uniqueId(prefix) { + var id = ++idCounter + ''; + return prefix ? prefix + id : id; + } + + // Clock size + var dialRadius = 100, + outerRadius = 80, + // innerRadius = 80 on 12 hour clock + innerRadius = 54, + tickRadius = 13, + diameter = dialRadius * 2, + duration = transitionSupported ? 350 : 1; + + // Popover template + var tpl = [ + '
    ', + '
    ', + '
    ', + '', + ' : ', + '', + '', + '
    ', + '
    ', + '
    ', + '
    ', + '
    ', + '
    ', + '
    ', + '', + '', + '
    ', + '
    ' + ].join(''); + + // ClockPicker + function ClockPicker(element, options) { + var popover = $(tpl), + plate = popover.find('.clockpicker-plate'), + hoursView = popover.find('.clockpicker-hours'), + minutesView = popover.find('.clockpicker-minutes'), + amPmBlock = popover.find('.clockpicker-am-pm-block'), + isInput = element.prop('tagName') === 'INPUT', + input = isInput ? element : element.find('input'), + addon = element.find('.input-group-addon'), + self = this, + timer; + + this.id = uniqueId('cp'); + this.element = element; + this.options = options; + this.isAppended = false; + this.isShown = false; + this.currentView = 'hours'; + this.isInput = isInput; + this.input = input; + this.addon = addon; + this.popover = popover; + this.plate = plate; + this.hoursView = hoursView; + this.minutesView = minutesView; + this.amPmBlock = amPmBlock; + this.spanHours = popover.find('.clockpicker-span-hours'); + this.spanMinutes = popover.find('.clockpicker-span-minutes'); + this.spanAmPm = popover.find('.clockpicker-span-am-pm'); + this.amOrPm = "PM"; + + // Setup for for 12 hour clock if option is selected + if (options.twelvehour) { + + var amPmButtonsTemplate = ['
    ', + '', + '', + '
    '].join(''); + + var amPmButtons = $(amPmButtonsTemplate); + //amPmButtons.appendTo(plate); + + ////Not working b/c they are not shown when this runs + //$('clockpicker-am-button') + // .on("click", function() { + // self.amOrPm = "AM"; + // $('.clockpicker-span-am-pm').empty().append('AM'); + // }); + // + //$('clockpicker-pm-button') + // .on("click", function() { + // self.amOrPm = "PM"; + // $('.clockpicker-span-am-pm').empty().append('PM'); + // }); + + $('') + .on("click", function() { + self.amOrPm = "AM"; + $('.clockpicker-span-am-pm').empty().append('AM'); + }).appendTo(this.amPmBlock); + + + $('') + .on("click", function() { + self.amOrPm = 'PM'; + $('.clockpicker-span-am-pm').empty().append('PM'); + }).appendTo(this.amPmBlock); + + } + + if (! options.autoclose) { + // If autoclose is not setted, append a button + $('') + .click($.proxy(this.done, this)) + .appendTo(popover); + } + + // Placement and arrow align - make sure they make sense. + if ((options.placement === 'top' || options.placement === 'bottom') && (options.align === 'top' || options.align === 'bottom')) options.align = 'left'; + if ((options.placement === 'left' || options.placement === 'right') && (options.align === 'left' || options.align === 'right')) options.align = 'top'; + + popover.addClass(options.placement); + popover.addClass('clockpicker-align-' + options.align); + + this.spanHours.click($.proxy(this.toggleView, this, 'hours')); + this.spanMinutes.click($.proxy(this.toggleView, this, 'minutes')); + + // Show or toggle + input.on('focus.clockpicker click.clockpicker', $.proxy(this.show, this)); + addon.on('click.clockpicker', $.proxy(this.toggle, this)); + + // Build ticks + var tickTpl = $('
    '), + i, tick, radian, radius; + + // Hours view + if (options.twelvehour) { + for (i = 1; i < 13; i += 1) { + tick = tickTpl.clone(); + radian = i / 6 * Math.PI; + radius = outerRadius; + tick.css('font-size', '120%'); + tick.css({ + left: dialRadius + Math.sin(radian) * radius - tickRadius, + top: dialRadius - Math.cos(radian) * radius - tickRadius + }); + tick.html(i === 0 ? '00' : i); + hoursView.append(tick); + tick.on(mousedownEvent, mousedown); + } + } else { + for (i = 0; i < 24; i += 1) { + tick = tickTpl.clone(); + radian = i / 6 * Math.PI; + var inner = i > 0 && i < 13; + radius = inner ? innerRadius : outerRadius; + tick.css({ + left: dialRadius + Math.sin(radian) * radius - tickRadius, + top: dialRadius - Math.cos(radian) * radius - tickRadius + }); + if (inner) { + tick.css('font-size', '120%'); + } + tick.html(i === 0 ? '00' : i); + hoursView.append(tick); + tick.on(mousedownEvent, mousedown); + } + } + + // Minutes view + for (i = 0; i < 60; i += 5) { + tick = tickTpl.clone(); + radian = i / 30 * Math.PI; + tick.css({ + left: dialRadius + Math.sin(radian) * outerRadius - tickRadius, + top: dialRadius - Math.cos(radian) * outerRadius - tickRadius + }); + tick.css('font-size', '120%'); + tick.html(leadingZero(i)); + minutesView.append(tick); + tick.on(mousedownEvent, mousedown); + } + + // Clicking on minutes view space + plate.on(mousedownEvent, function(e){ + if ($(e.target).closest('.clockpicker-tick').length === 0) { + mousedown(e, true); + } + }); + + // Mousedown or touchstart + function mousedown(e, space) { + var offset = plate.offset(), + isTouch = /^touch/.test(e.type), + x0 = offset.left + dialRadius, + y0 = offset.top + dialRadius, + dx = (isTouch ? e.originalEvent.touches[0] : e).pageX - x0, + dy = (isTouch ? e.originalEvent.touches[0] : e).pageY - y0, + z = Math.sqrt(dx * dx + dy * dy), + moved = false; + + // When clicking on minutes view space, check the mouse position + if (space && (z < outerRadius - tickRadius || z > outerRadius + tickRadius)) { + return; + } + e.preventDefault(); + + // Set cursor style of body after 200ms + var movingTimer = setTimeout(function(){ + $body.addClass('clockpicker-moving'); + }, 200); + + // Place the canvas to top + if (svgSupported) { + plate.append(self.canvas); + } + + // Clock + self.setHand(dx, dy, ! space, true); + + // Mousemove on document + $doc.off(mousemoveEvent).on(mousemoveEvent, function(e){ + e.preventDefault(); + var isTouch = /^touch/.test(e.type), + x = (isTouch ? e.originalEvent.touches[0] : e).pageX - x0, + y = (isTouch ? e.originalEvent.touches[0] : e).pageY - y0; + if (! moved && x === dx && y === dy) { + // Clicking in chrome on windows will trigger a mousemove event + return; + } + moved = true; + self.setHand(x, y, false, true); + }); + + // Mouseup on document + $doc.off(mouseupEvent).on(mouseupEvent, function(e){ + $doc.off(mouseupEvent); + e.preventDefault(); + var isTouch = /^touch/.test(e.type), + x = (isTouch ? e.originalEvent.changedTouches[0] : e).pageX - x0, + y = (isTouch ? e.originalEvent.changedTouches[0] : e).pageY - y0; + if ((space || moved) && x === dx && y === dy) { + self.setHand(x, y); + } + if (self.currentView === 'hours') { + self.toggleView('minutes', duration / 2); + } else { + if (options.autoclose) { + self.minutesView.addClass('clockpicker-dial-out'); + setTimeout(function(){ + self.done(); + }, duration / 2); + } + } + plate.prepend(canvas); + + // Reset cursor style of body + clearTimeout(movingTimer); + $body.removeClass('clockpicker-moving'); + + // Unbind mousemove event + $doc.off(mousemoveEvent); + }); + } + + if (svgSupported) { + // Draw clock hands and others + var canvas = popover.find('.clockpicker-canvas'), + svg = createSvgElement('svg'); + svg.setAttribute('class', 'clockpicker-svg'); + svg.setAttribute('width', diameter); + svg.setAttribute('height', diameter); + var g = createSvgElement('g'); + g.setAttribute('transform', 'translate(' + dialRadius + ',' + dialRadius + ')'); + var bearing = createSvgElement('circle'); + bearing.setAttribute('class', 'clockpicker-canvas-bearing'); + bearing.setAttribute('cx', 0); + bearing.setAttribute('cy', 0); + bearing.setAttribute('r', 2); + var hand = createSvgElement('line'); + hand.setAttribute('x1', 0); + hand.setAttribute('y1', 0); + var bg = createSvgElement('circle'); + bg.setAttribute('class', 'clockpicker-canvas-bg'); + bg.setAttribute('r', tickRadius); + var fg = createSvgElement('circle'); + fg.setAttribute('class', 'clockpicker-canvas-fg'); + fg.setAttribute('r', 3.5); + g.appendChild(hand); + g.appendChild(bg); + g.appendChild(fg); + g.appendChild(bearing); + svg.appendChild(g); + canvas.append(svg); + + this.hand = hand; + this.bg = bg; + this.fg = fg; + this.bearing = bearing; + this.g = g; + this.canvas = canvas; + } + + raiseCallback(this.options.init); + } + + function raiseCallback(callbackFunction) { + if (callbackFunction && typeof callbackFunction === "function") { + callbackFunction(); + } + } + + // Default options + ClockPicker.DEFAULTS = { + 'default': '', // default time, 'now' or '13:14' e.g. + fromnow: 0, // set default time to * milliseconds from now (using with default = 'now') + placement: 'bottom', // clock popover placement + align: 'left', // popover arrow align + donetext: '完成', // done button text + autoclose: false, // auto close when minute is selected + twelvehour: false, // change to 12 hour AM/PM clock from 24 hour + vibrate: true // vibrate the device when dragging clock hand + }; + + // Show or hide popover + ClockPicker.prototype.toggle = function(){ + this[this.isShown ? 'hide' : 'show'](); + }; + + // Set popover position + ClockPicker.prototype.locate = function(){ + var element = this.element, + popover = this.popover, + offset = element.offset(), + width = element.outerWidth(), + height = element.outerHeight(), + placement = this.options.placement, + align = this.options.align, + styles = {}, + self = this; + + popover.show(); + + // Place the popover + switch (placement) { + case 'bottom': + styles.top = offset.top + height; + break; + case 'right': + styles.left = offset.left + width; + break; + case 'top': + styles.top = offset.top - popover.outerHeight(); + break; + case 'left': + styles.left = offset.left - popover.outerWidth(); + break; + } + + // Align the popover arrow + switch (align) { + case 'left': + styles.left = offset.left; + break; + case 'right': + styles.left = offset.left + width - popover.outerWidth(); + break; + case 'top': + styles.top = offset.top; + break; + case 'bottom': + styles.top = offset.top + height - popover.outerHeight(); + break; + } + + popover.css(styles); + }; + + // Show popover + ClockPicker.prototype.show = function(e){ + // Not show again + if (this.isShown) { + return; + } + + raiseCallback(this.options.beforeShow); + + var self = this; + + // Initialize + if (! this.isAppended) { + // Append popover to body + $body = $(document.body).append(this.popover); + + // Reset position when resize + $win.on('resize.clockpicker' + this.id, function(){ + if (self.isShown) { + self.locate(); + } + }); + + this.isAppended = true; + } + + // Get the time + var value = ((this.input.prop('value') || this.options['default'] || '') + '').split(':'); + if (value[0] === 'now') { + var now = new Date(+ new Date() + this.options.fromnow); + value = [ + now.getHours(), + now.getMinutes() + ]; + } + this.hours = + value[0] || 0; + this.minutes = + value[1] || 0; + this.spanHours.html(leadingZero(this.hours)); + this.spanMinutes.html(leadingZero(this.minutes)); + + // Toggle to hours view + this.toggleView('hours'); + + // Set position + this.locate(); + + this.isShown = true; + + // Hide when clicking or tabbing on any element except the clock, input and addon + $doc.on('click.clockpicker.' + this.id + ' focusin.clockpicker.' + this.id, function(e){ + var target = $(e.target); + if (target.closest(self.popover).length === 0 && + target.closest(self.addon).length === 0 && + target.closest(self.input).length === 0) { + self.hide(); + } + }); + + // Hide when ESC is pressed + $doc.on('keyup.clockpicker.' + this.id, function(e){ + if (e.keyCode === 27) { + self.hide(); + } + }); + + raiseCallback(this.options.afterShow); + }; + + // Hide popover + ClockPicker.prototype.hide = function(){ + raiseCallback(this.options.beforeHide); + + this.isShown = false; + + // Unbinding events on document + $doc.off('click.clockpicker.' + this.id + ' focusin.clockpicker.' + this.id); + $doc.off('keyup.clockpicker.' + this.id); + + this.popover.hide(); + + raiseCallback(this.options.afterHide); + }; + + // Toggle to hours or minutes view + ClockPicker.prototype.toggleView = function(view, delay){ + var raiseAfterHourSelect = false; + if (view === 'minutes' && $(this.hoursView).css("visibility") === "visible") { + raiseCallback(this.options.beforeHourSelect); + raiseAfterHourSelect = true; + } + var isHours = view === 'hours', + nextView = isHours ? this.hoursView : this.minutesView, + hideView = isHours ? this.minutesView : this.hoursView; + + this.currentView = view; + + this.spanHours.toggleClass('text-primary', isHours); + this.spanMinutes.toggleClass('text-primary', ! isHours); + + // Let's make transitions + hideView.addClass('clockpicker-dial-out'); + nextView.css('visibility', 'visible').removeClass('clockpicker-dial-out'); + + // Reset clock hand + this.resetClock(delay); + + // After transitions ended + clearTimeout(this.toggleViewTimer); + this.toggleViewTimer = setTimeout(function(){ + hideView.css('visibility', 'hidden'); + }, duration); + + if (raiseAfterHourSelect) { + raiseCallback(this.options.afterHourSelect); + } + }; + + // Reset clock hand + ClockPicker.prototype.resetClock = function(delay){ + var view = this.currentView, + value = this[view], + isHours = view === 'hours', + unit = Math.PI / (isHours ? 6 : 30), + radian = value * unit, + radius = isHours && value > 0 && value < 13 ? innerRadius : outerRadius, + x = Math.sin(radian) * radius, + y = - Math.cos(radian) * radius, + self = this; + if (svgSupported && delay) { + self.canvas.addClass('clockpicker-canvas-out'); + setTimeout(function(){ + self.canvas.removeClass('clockpicker-canvas-out'); + self.setHand(x, y); + }, delay); + } else { + this.setHand(x, y); + } + }; + + // Set clock hand to (x, y) + ClockPicker.prototype.setHand = function(x, y, roundBy5, dragging){ + var radian = Math.atan2(x, - y), + isHours = this.currentView === 'hours', + unit = Math.PI / (isHours || roundBy5 ? 6 : 30), + z = Math.sqrt(x * x + y * y), + options = this.options, + inner = isHours && z < (outerRadius + innerRadius) / 2, + radius = inner ? innerRadius : outerRadius, + value; + + if (options.twelvehour) { + radius = outerRadius; + } + + // Radian should in range [0, 2PI] + if (radian < 0) { + radian = Math.PI * 2 + radian; + } + + // Get the round value + value = Math.round(radian / unit); + + // Get the round radian + radian = value * unit; + + // Correct the hours or minutes + if (options.twelvehour) { + if (isHours) { + if (value === 0) { + value = 12; + } + } else { + if (roundBy5) { + value *= 5; + } + if (value === 60) { + value = 0; + } + } + } else { + if (isHours) { + if (value === 12) { + value = 0; + } + value = inner ? (value === 0 ? 12 : value) : value === 0 ? 0 : value + 12; + } else { + if (roundBy5) { + value *= 5; + } + if (value === 60) { + value = 0; + } + } + } + + // Once hours or minutes changed, vibrate the device + if (this[this.currentView] !== value) { + if (vibrate && this.options.vibrate) { + // Do not vibrate too frequently + if (! this.vibrateTimer) { + navigator[vibrate](10); + this.vibrateTimer = setTimeout($.proxy(function(){ + this.vibrateTimer = null; + }, this), 100); + } + } + } + + this[this.currentView] = value; + this[isHours ? 'spanHours' : 'spanMinutes'].html(leadingZero(value)); + + // If svg is not supported, just add an active class to the tick + if (! svgSupported) { + this[isHours ? 'hoursView' : 'minutesView'].find('.clockpicker-tick').each(function(){ + var tick = $(this); + tick.toggleClass('active', value === + tick.html()); + }); + return; + } + + // Place clock hand at the top when dragging + if (dragging || (! isHours && value % 5)) { + this.g.insertBefore(this.hand, this.bearing); + this.g.insertBefore(this.bg, this.fg); + this.bg.setAttribute('class', 'clockpicker-canvas-bg clockpicker-canvas-bg-trans'); + } else { + // Or place it at the bottom + this.g.insertBefore(this.hand, this.bg); + this.g.insertBefore(this.fg, this.bg); + this.bg.setAttribute('class', 'clockpicker-canvas-bg'); + } + + // Set clock hand and others' position + var cx = Math.sin(radian) * radius, + cy = - Math.cos(radian) * radius; + this.hand.setAttribute('x2', cx); + this.hand.setAttribute('y2', cy); + this.bg.setAttribute('cx', cx); + this.bg.setAttribute('cy', cy); + this.fg.setAttribute('cx', cx); + this.fg.setAttribute('cy', cy); + }; + + // Hours and minutes are selected + ClockPicker.prototype.done = function() { + raiseCallback(this.options.beforeDone); + this.hide(); + var last = this.input.prop('value'), + value = leadingZero(this.hours) + ':' + leadingZero(this.minutes); + if (this.options.twelvehour) { + value = value + this.amOrPm; + } + + this.input.prop('value', value); + if (value !== last) { + this.input.triggerHandler('change'); + if (! this.isInput) { + this.element.trigger('change'); + } + } + + if (this.options.autoclose) { + this.input.trigger('blur'); + } + + raiseCallback(this.options.afterDone); + }; + + // Remove clockpicker from input + ClockPicker.prototype.remove = function() { + this.element.removeData('clockpicker'); + this.input.off('focus.clockpicker click.clockpicker'); + this.addon.off('click.clockpicker'); + if (this.isShown) { + this.hide(); + } + if (this.isAppended) { + $win.off('resize.clockpicker' + this.id); + this.popover.remove(); + } + }; + + // Extends $.fn.clockpicker + $.fn.clockpicker = function(option){ + var args = Array.prototype.slice.call(arguments, 1); + return this.each(function(){ + var $this = $(this), + data = $this.data('clockpicker'); + if (! data) { + var options = $.extend({}, ClockPicker.DEFAULTS, $this.data(), typeof option == 'object' && option); + $this.data('clockpicker', new ClockPicker($this, options)); + } else { + // Manual operatsions. show, hide, remove, e.g. + if (typeof data[option] === 'function') { + data[option].apply(data, args); + } + } + }); + }; +}()); diff --git "a/8\343\200\201\346\226\207\347\214\256\346\225\260\346\215\256\346\214\226\346\216\230\347\263\273\347\273\237(\351\231\204\346\272\220\347\240\201)/extra_apps/xadmin/static/xadmin/vendor/bootstrap-clockpicker/bootstrap-clockpicker.min.css" "b/8\343\200\201\346\226\207\347\214\256\346\225\260\346\215\256\346\214\226\346\216\230\347\263\273\347\273\237(\351\231\204\346\272\220\347\240\201)/extra_apps/xadmin/static/xadmin/vendor/bootstrap-clockpicker/bootstrap-clockpicker.min.css" new file mode 100644 index 0000000..cf15078 --- /dev/null +++ "b/8\343\200\201\346\226\207\347\214\256\346\225\260\346\215\256\346\214\226\346\216\230\347\263\273\347\273\237(\351\231\204\346\272\220\347\240\201)/extra_apps/xadmin/static/xadmin/vendor/bootstrap-clockpicker/bootstrap-clockpicker.min.css" @@ -0,0 +1,5 @@ +/*! + * ClockPicker v0.0.7 for Bootstrap (http://weareoutman.github.io/clockpicker/) + * Copyright 2014 Wang Shenwei. + * Licensed under MIT (https://github.com/weareoutman/clockpicker/blob/gh-pages/LICENSE) + */.clockpicker .input-group-addon{cursor:pointer}.clockpicker-moving{cursor:move}.clockpicker-align-left.popover>.arrow{left:25px}.clockpicker-align-top.popover>.arrow{top:17px}.clockpicker-align-right.popover>.arrow{left:auto;right:25px}.clockpicker-align-bottom.popover>.arrow{top:auto;bottom:6px}.clockpicker-popover .popover-title{background-color:#fff;color:#999;font-size:24px;font-weight:700;line-height:30px;text-align:center}.clockpicker-popover .popover-title span{cursor:pointer}.clockpicker-popover .popover-content{background-color:#f8f8f8;padding:12px}.popover-content:last-child{border-bottom-left-radius:5px;border-bottom-right-radius:5px}.clockpicker-plate{background-color:#fff;border:1px solid #ccc;border-radius:50%;width:200px;height:200px;overflow:visible;position:relative;-webkit-touch-callout:none;-webkit-user-select:none;-khtml-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.clockpicker-canvas,.clockpicker-dial{width:200px;height:200px;position:absolute;left:-1px;top:-1px}.clockpicker-minutes{visibility:hidden}.clockpicker-tick{border-radius:50%;color:#666;line-height:26px;text-align:center;width:26px;height:26px;position:absolute;cursor:pointer}.clockpicker-tick.active,.clockpicker-tick:hover{background-color:#c0e5f7;background-color:rgba(0,149,221,.25)}.clockpicker-button{background-image:none;background-color:#fff;border-width:1px 0 0;border-top-left-radius:0;border-top-right-radius:0;margin:0;padding:10px 0}.clockpicker-button:hover{background-image:none;background-color:#ebebeb}.clockpicker-button:focus{outline:0!important}.clockpicker-dial{-webkit-transition:-webkit-transform 350ms,opacity 350ms;-moz-transition:-moz-transform 350ms,opacity 350ms;-ms-transition:-ms-transform 350ms,opacity 350ms;-o-transition:-o-transform 350ms,opacity 350ms;transition:transform 350ms,opacity 350ms}.clockpicker-dial-out{opacity:0}.clockpicker-hours.clockpicker-dial-out{-webkit-transform:scale(1.2,1.2);-moz-transform:scale(1.2,1.2);-ms-transform:scale(1.2,1.2);-o-transform:scale(1.2,1.2);transform:scale(1.2,1.2)}.clockpicker-minutes.clockpicker-dial-out{-webkit-transform:scale(.8,.8);-moz-transform:scale(.8,.8);-ms-transform:scale(.8,.8);-o-transform:scale(.8,.8);transform:scale(.8,.8)}.clockpicker-canvas{-webkit-transition:opacity 175ms;-moz-transition:opacity 175ms;-ms-transition:opacity 175ms;-o-transition:opacity 175ms;transition:opacity 175ms}.clockpicker-canvas-out{opacity:.25}.clockpicker-canvas-bearing,.clockpicker-canvas-fg{stroke:none;fill:#0095dd}.clockpicker-canvas-bg{stroke:none;fill:#c0e5f7}.clockpicker-canvas-bg-trans{fill:rgba(0,149,221,.25)}.clockpicker-canvas line{stroke:#0095dd;stroke-width:1;stroke-linecap:round}.clockpicker-button.am-button{margin:1px;padding:5px;border:1px solid rgba(0,0,0,.2);border-radius:4px}.clockpicker-button.pm-button{margin:1px 1px 1px 136px;padding:5px;border:1px solid rgba(0,0,0,.2);border-radius:4px} \ No newline at end of file diff --git "a/8\343\200\201\346\226\207\347\214\256\346\225\260\346\215\256\346\214\226\346\216\230\347\263\273\347\273\237(\351\231\204\346\272\220\347\240\201)/extra_apps/xadmin/static/xadmin/vendor/bootstrap-clockpicker/bootstrap-clockpicker.min.js" "b/8\343\200\201\346\226\207\347\214\256\346\225\260\346\215\256\346\214\226\346\216\230\347\263\273\347\273\237(\351\231\204\346\272\220\347\240\201)/extra_apps/xadmin/static/xadmin/vendor/bootstrap-clockpicker/bootstrap-clockpicker.min.js" new file mode 100644 index 0000000..c8006a3 --- /dev/null +++ "b/8\343\200\201\346\226\207\347\214\256\346\225\260\346\215\256\346\214\226\346\216\230\347\263\273\347\273\237(\351\231\204\346\272\220\347\240\201)/extra_apps/xadmin/static/xadmin/vendor/bootstrap-clockpicker/bootstrap-clockpicker.min.js" @@ -0,0 +1,6 @@ +/*! + * ClockPicker v0.0.7 (http://weareoutman.github.io/clockpicker/) + * Copyright 2014 Wang Shenwei. + * Licensed under MIT (https://github.com/weareoutman/clockpicker/blob/gh-pages/LICENSE) + */ +!function(){function t(t){return document.createElementNS(p,t)}function i(t){return(10>t?"0":"")+t}function e(t){var i=++m+"";return t?t+i:i}function s(s,r){function p(t,i){var e=u.offset(),s=/^touch/.test(t.type),o=e.left+b,n=e.top+b,p=(s?t.originalEvent.touches[0]:t).pageX-o,h=(s?t.originalEvent.touches[0]:t).pageY-n,k=Math.sqrt(p*p+h*h),v=!1;if(!i||!(g-y>k||k>g+y)){t.preventDefault();var m=setTimeout(function(){c.addClass("clockpicker-moving")},200);l&&u.append(x.canvas),x.setHand(p,h,!i,!0),a.off(d).on(d,function(t){t.preventDefault();var i=/^touch/.test(t.type),e=(i?t.originalEvent.touches[0]:t).pageX-o,s=(i?t.originalEvent.touches[0]:t).pageY-n;(v||e!==p||s!==h)&&(v=!0,x.setHand(e,s,!1,!0))}),a.off(f).on(f,function(t){a.off(f),t.preventDefault();var e=/^touch/.test(t.type),s=(e?t.originalEvent.changedTouches[0]:t).pageX-o,l=(e?t.originalEvent.changedTouches[0]:t).pageY-n;(i||v)&&s===p&&l===h&&x.setHand(s,l),"hours"===x.currentView?x.toggleView("minutes",A/2):r.autoclose&&(x.minutesView.addClass("clockpicker-dial-out"),setTimeout(function(){x.done()},A/2)),u.prepend(j),clearTimeout(m),c.removeClass("clockpicker-moving"),a.off(d)})}}var h=n(V),u=h.find(".clockpicker-plate"),v=h.find(".clockpicker-hours"),m=h.find(".clockpicker-minutes"),T=h.find(".clockpicker-am-pm-block"),C="INPUT"===s.prop("tagName"),H=C?s:s.find("input"),P=s.find(".input-group-addon"),x=this;if(this.id=e("cp"),this.element=s,this.options=r,this.isAppended=!1,this.isShown=!1,this.currentView="hours",this.isInput=C,this.input=H,this.addon=P,this.popover=h,this.plate=u,this.hoursView=v,this.minutesView=m,this.amPmBlock=T,this.spanHours=h.find(".clockpicker-span-hours"),this.spanMinutes=h.find(".clockpicker-span-minutes"),this.spanAmPm=h.find(".clockpicker-span-am-pm"),this.amOrPm="PM",r.twelvehour){{var S=['
    ','",'","
    "].join("");n(S)}n('').on("click",function(){x.amOrPm="AM",n(".clockpicker-span-am-pm").empty().append("AM")}).appendTo(this.amPmBlock),n('').on("click",function(){x.amOrPm="PM",n(".clockpicker-span-am-pm").empty().append("PM")}).appendTo(this.amPmBlock)}r.autoclose||n('").click(n.proxy(this.done,this)).appendTo(h),"top"!==r.placement&&"bottom"!==r.placement||"top"!==r.align&&"bottom"!==r.align||(r.align="left"),"left"!==r.placement&&"right"!==r.placement||"left"!==r.align&&"right"!==r.align||(r.align="top"),h.addClass(r.placement),h.addClass("clockpicker-align-"+r.align),this.spanHours.click(n.proxy(this.toggleView,this,"hours")),this.spanMinutes.click(n.proxy(this.toggleView,this,"minutes")),H.on("focus.clockpicker click.clockpicker",n.proxy(this.show,this)),P.on("click.clockpicker",n.proxy(this.toggle,this));var E,D,I,B,z=n('
    ');if(r.twelvehour)for(E=1;13>E;E+=1)D=z.clone(),I=E/6*Math.PI,B=g,D.css("font-size","120%"),D.css({left:b+Math.sin(I)*B-y,top:b-Math.cos(I)*B-y}),D.html(0===E?"00":E),v.append(D),D.on(k,p);else for(E=0;24>E;E+=1){D=z.clone(),I=E/6*Math.PI;var O=E>0&&13>E;B=O?w:g,D.css({left:b+Math.sin(I)*B-y,top:b-Math.cos(I)*B-y}),O&&D.css("font-size","120%"),D.html(0===E?"00":E),v.append(D),D.on(k,p)}for(E=0;60>E;E+=5)D=z.clone(),I=E/30*Math.PI,D.css({left:b+Math.sin(I)*g-y,top:b-Math.cos(I)*g-y}),D.css("font-size","120%"),D.html(i(E)),m.append(D),D.on(k,p);if(u.on(k,function(t){0===n(t.target).closest(".clockpicker-tick").length&&p(t,!0)}),l){var j=h.find(".clockpicker-canvas"),L=t("svg");L.setAttribute("class","clockpicker-svg"),L.setAttribute("width",M),L.setAttribute("height",M);var U=t("g");U.setAttribute("transform","translate("+b+","+b+")");var W=t("circle");W.setAttribute("class","clockpicker-canvas-bearing"),W.setAttribute("cx",0),W.setAttribute("cy",0),W.setAttribute("r",2);var N=t("line");N.setAttribute("x1",0),N.setAttribute("y1",0);var X=t("circle");X.setAttribute("class","clockpicker-canvas-bg"),X.setAttribute("r",y);var Y=t("circle");Y.setAttribute("class","clockpicker-canvas-fg"),Y.setAttribute("r",3.5),U.appendChild(N),U.appendChild(X),U.appendChild(Y),U.appendChild(W),L.appendChild(U),j.append(L),this.hand=N,this.bg=X,this.fg=Y,this.bearing=W,this.g=U,this.canvas=j}o(this.options.init)}function o(t){t&&"function"==typeof t&&t()}var c,n=window.jQuery,r=n(window),a=n(document),p="http://www.w3.org/2000/svg",l="SVGAngle"in window&&function(){var t,i=document.createElement("div");return i.innerHTML="",t=(i.firstChild&&i.firstChild.namespaceURI)==p,i.innerHTML="",t}(),h=function(){var t=document.createElement("div").style;return"transition"in t||"WebkitTransition"in t||"MozTransition"in t||"msTransition"in t||"OTransition"in t}(),u="ontouchstart"in window,k="mousedown"+(u?" touchstart":""),d="mousemove.clockpicker"+(u?" touchmove.clockpicker":""),f="mouseup.clockpicker"+(u?" touchend.clockpicker":""),v=navigator.vibrate?"vibrate":navigator.webkitVibrate?"webkitVibrate":null,m=0,b=100,g=80,w=54,y=13,M=2*b,A=h?350:1,V=['
    ','
    ','
    ',''," : ",'','',"
    ",'
    ','
    ','
    ','
    ','
    ',"
    ",'',"","
    ","
    "].join("");s.DEFAULTS={"default":"",fromnow:0,placement:"bottom",align:"left",donetext:"完成",autoclose:!1,twelvehour:!1,vibrate:!0},s.prototype.toggle=function(){this[this.isShown?"hide":"show"]()},s.prototype.locate=function(){var t=this.element,i=this.popover,e=t.offset(),s=t.outerWidth(),o=t.outerHeight(),c=this.options.placement,n=this.options.align,r={};switch(i.show(),c){case"bottom":r.top=e.top+o;break;case"right":r.left=e.left+s;break;case"top":r.top=e.top-i.outerHeight();break;case"left":r.left=e.left-i.outerWidth()}switch(n){case"left":r.left=e.left;break;case"right":r.left=e.left+s-i.outerWidth();break;case"top":r.top=e.top;break;case"bottom":r.top=e.top+o-i.outerHeight()}i.css(r)},s.prototype.show=function(){if(!this.isShown){o(this.options.beforeShow);var t=this;this.isAppended||(c=n(document.body).append(this.popover),r.on("resize.clockpicker"+this.id,function(){t.isShown&&t.locate()}),this.isAppended=!0);var e=((this.input.prop("value")||this.options["default"]||"")+"").split(":");if("now"===e[0]){var s=new Date(+new Date+this.options.fromnow);e=[s.getHours(),s.getMinutes()]}this.hours=+e[0]||0,this.minutes=+e[1]||0,this.spanHours.html(i(this.hours)),this.spanMinutes.html(i(this.minutes)),this.toggleView("hours"),this.locate(),this.isShown=!0,a.on("click.clockpicker."+this.id+" focusin.clockpicker."+this.id,function(i){var e=n(i.target);0===e.closest(t.popover).length&&0===e.closest(t.addon).length&&0===e.closest(t.input).length&&t.hide()}),a.on("keyup.clockpicker."+this.id,function(i){27===i.keyCode&&t.hide()}),o(this.options.afterShow)}},s.prototype.hide=function(){o(this.options.beforeHide),this.isShown=!1,a.off("click.clockpicker."+this.id+" focusin.clockpicker."+this.id),a.off("keyup.clockpicker."+this.id),this.popover.hide(),o(this.options.afterHide)},s.prototype.toggleView=function(t,i){var e=!1;"minutes"===t&&"visible"===n(this.hoursView).css("visibility")&&(o(this.options.beforeHourSelect),e=!0);var s="hours"===t,c=s?this.hoursView:this.minutesView,r=s?this.minutesView:this.hoursView;this.currentView=t,this.spanHours.toggleClass("text-primary",s),this.spanMinutes.toggleClass("text-primary",!s),r.addClass("clockpicker-dial-out"),c.css("visibility","visible").removeClass("clockpicker-dial-out"),this.resetClock(i),clearTimeout(this.toggleViewTimer),this.toggleViewTimer=setTimeout(function(){r.css("visibility","hidden")},A),e&&o(this.options.afterHourSelect)},s.prototype.resetClock=function(t){var i=this.currentView,e=this[i],s="hours"===i,o=Math.PI/(s?6:30),c=e*o,n=s&&e>0&&13>e?w:g,r=Math.sin(c)*n,a=-Math.cos(c)*n,p=this;l&&t?(p.canvas.addClass("clockpicker-canvas-out"),setTimeout(function(){p.canvas.removeClass("clockpicker-canvas-out"),p.setHand(r,a)},t)):this.setHand(r,a)},s.prototype.setHand=function(t,e,s,o){var c,r=Math.atan2(t,-e),a="hours"===this.currentView,p=Math.PI/(a||s?6:30),h=Math.sqrt(t*t+e*e),u=this.options,k=a&&(g+w)/2>h,d=k?w:g;if(u.twelvehour&&(d=g),0>r&&(r=2*Math.PI+r),c=Math.round(r/p),r=c*p,u.twelvehour?a?0===c&&(c=12):(s&&(c*=5),60===c&&(c=0)):a?(12===c&&(c=0),c=k?0===c?12:c:0===c?0:c+12):(s&&(c*=5),60===c&&(c=0)),this[this.currentView]!==c&&v&&this.options.vibrate&&(this.vibrateTimer||(navigator[v](10),this.vibrateTimer=setTimeout(n.proxy(function(){this.vibrateTimer=null},this),100))),this[this.currentView]=c,this[a?"spanHours":"spanMinutes"].html(i(c)),!l)return void this[a?"hoursView":"minutesView"].find(".clockpicker-tick").each(function(){var t=n(this);t.toggleClass("active",c===+t.html())});o||!a&&c%5?(this.g.insertBefore(this.hand,this.bearing),this.g.insertBefore(this.bg,this.fg),this.bg.setAttribute("class","clockpicker-canvas-bg clockpicker-canvas-bg-trans")):(this.g.insertBefore(this.hand,this.bg),this.g.insertBefore(this.fg,this.bg),this.bg.setAttribute("class","clockpicker-canvas-bg"));var f=Math.sin(r)*d,m=-Math.cos(r)*d;this.hand.setAttribute("x2",f),this.hand.setAttribute("y2",m),this.bg.setAttribute("cx",f),this.bg.setAttribute("cy",m),this.fg.setAttribute("cx",f),this.fg.setAttribute("cy",m)},s.prototype.done=function(){o(this.options.beforeDone),this.hide();var t=this.input.prop("value"),e=i(this.hours)+":"+i(this.minutes);this.options.twelvehour&&(e+=this.amOrPm),this.input.prop("value",e),e!==t&&(this.input.triggerHandler("change"),this.isInput||this.element.trigger("change")),this.options.autoclose&&this.input.trigger("blur"),o(this.options.afterDone)},s.prototype.remove=function(){this.element.removeData("clockpicker"),this.input.off("focus.clockpicker click.clockpicker"),this.addon.off("click.clockpicker"),this.isShown&&this.hide(),this.isAppended&&(r.off("resize.clockpicker"+this.id),this.popover.remove())},n.fn.clockpicker=function(t){var i=Array.prototype.slice.call(arguments,1);return this.each(function(){var e=n(this),o=e.data("clockpicker");if(o)"function"==typeof o[t]&&o[t].apply(o,i);else{var c=n.extend({},s.DEFAULTS,e.data(),"object"==typeof t&&t);e.data("clockpicker",new s(e,c))}})}}(); \ No newline at end of file diff --git "a/8\343\200\201\346\226\207\347\214\256\346\225\260\346\215\256\346\214\226\346\216\230\347\263\273\347\273\237(\351\231\204\346\272\220\347\240\201)/extra_apps/xadmin/static/xadmin/vendor/bootstrap-datepicker/css/datepicker.css" "b/8\343\200\201\346\226\207\347\214\256\346\225\260\346\215\256\346\214\226\346\216\230\347\263\273\347\273\237(\351\231\204\346\272\220\347\240\201)/extra_apps/xadmin/static/xadmin/vendor/bootstrap-datepicker/css/datepicker.css" new file mode 100644 index 0000000..5ecec5d --- /dev/null +++ "b/8\343\200\201\346\226\207\347\214\256\346\225\260\346\215\256\346\214\226\346\216\230\347\263\273\347\273\237(\351\231\204\346\272\220\347\240\201)/extra_apps/xadmin/static/xadmin/vendor/bootstrap-datepicker/css/datepicker.css" @@ -0,0 +1,301 @@ +/*! + * Datepicker for Bootstrap + * + * Copyright 2012 Stefan Petre + * Improvements by Andrew Rowls + * Licensed under the Apache License v2.0 + * http://www.apache.org/licenses/LICENSE-2.0 + * + */ +.datepicker { + padding: 4px; + -webkit-border-radius: 4px; + -moz-border-radius: 4px; + border-radius: 4px; + direction: ltr; + /*.dow { + border-top: 1px solid #ddd !important; + }*/ + +} +.datepicker-inline { + width: 220px; +} +.datepicker.datepicker-rtl { + direction: rtl; +} +.datepicker.datepicker-rtl table tr td span { + float: right; +} +.datepicker-dropdown { + top: 0; + left: 0; +} +.datepicker-dropdown:before { + content: ''; + display: inline-block; + border-left: 7px solid transparent; + border-right: 7px solid transparent; + border-bottom: 7px solid #ccc; + border-bottom-color: rgba(0, 0, 0, 0.2); + position: absolute; + top: -7px; + left: 6px; +} +.datepicker-dropdown:after { + content: ''; + display: inline-block; + border-left: 6px solid transparent; + border-right: 6px solid transparent; + border-bottom: 6px solid #ffffff; + position: absolute; + top: -6px; + left: 7px; +} +.datepicker > div { + display: none; +} +.datepicker.days div.datepicker-days { + display: block; +} +.datepicker.months div.datepicker-months { + display: block; +} +.datepicker.years div.datepicker-years { + display: block; +} +.datepicker table { + margin: 0; +} +.datepicker td, +.datepicker th { + text-align: center; + width: 20px; + height: 20px; + -webkit-border-radius: 4px; + -moz-border-radius: 4px; + border-radius: 4px; + border: none; +} +.table-striped .datepicker table tr td, +.table-striped .datepicker table tr th { + background-color: transparent; +} +.datepicker table tr td.day:hover { + background: #eeeeee; + cursor: pointer; +} +.datepicker table tr td.old, +.datepicker table tr td.new { + color: #999999; +} +.datepicker table tr td.disabled, +.datepicker table tr td.disabled:hover { + background: none; + color: #999999; + cursor: default; +} +.datepicker table tr td.today, +.datepicker table tr td.today:hover, +.datepicker table tr td.today.disabled, +.datepicker table tr td.today.disabled:hover { + background-color: #fde19a; + background-image: -moz-linear-gradient(top, #fdd49a, #fdf59a); + background-image: -ms-linear-gradient(top, #fdd49a, #fdf59a); + background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#fdd49a), to(#fdf59a)); + background-image: -webkit-linear-gradient(top, #fdd49a, #fdf59a); + background-image: -o-linear-gradient(top, #fdd49a, #fdf59a); + background-image: linear-gradient(top, #fdd49a, #fdf59a); + background-repeat: repeat-x; + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fdd49a', endColorstr='#fdf59a', GradientType=0); + border-color: #fdf59a #fdf59a #fbed50; + border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25); + filter: progid:DXImageTransform.Microsoft.gradient(enabled=false); + color: #000 !important; +} +.datepicker table tr td.today:hover, +.datepicker table tr td.today:hover:hover, +.datepicker table tr td.today.disabled:hover, +.datepicker table tr td.today.disabled:hover:hover, +.datepicker table tr td.today:active, +.datepicker table tr td.today:hover:active, +.datepicker table tr td.today.disabled:active, +.datepicker table tr td.today.disabled:hover:active, +.datepicker table tr td.today.active, +.datepicker table tr td.today:hover.active, +.datepicker table tr td.today.disabled.active, +.datepicker table tr td.today.disabled:hover.active, +.datepicker table tr td.today.disabled, +.datepicker table tr td.today:hover.disabled, +.datepicker table tr td.today.disabled.disabled, +.datepicker table tr td.today.disabled:hover.disabled, +.datepicker table tr td.today[disabled], +.datepicker table tr td.today:hover[disabled], +.datepicker table tr td.today.disabled[disabled], +.datepicker table tr td.today.disabled:hover[disabled] { + background-color: #fdf59a; +} +.datepicker table tr td.today:active, +.datepicker table tr td.today:hover:active, +.datepicker table tr td.today.disabled:active, +.datepicker table tr td.today.disabled:hover:active, +.datepicker table tr td.today.active, +.datepicker table tr td.today:hover.active, +.datepicker table tr td.today.disabled.active, +.datepicker table tr td.today.disabled:hover.active { + background-color: #fbf069 \9; +} +.datepicker table tr td.active, +.datepicker table tr td.active:hover, +.datepicker table tr td.active.disabled, +.datepicker table tr td.active.disabled:hover { + background-color: #006dcc; + background-image: -moz-linear-gradient(top, #0088cc, #0044cc); + background-image: -ms-linear-gradient(top, #0088cc, #0044cc); + background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#0088cc), to(#0044cc)); + background-image: -webkit-linear-gradient(top, #0088cc, #0044cc); + background-image: -o-linear-gradient(top, #0088cc, #0044cc); + background-image: linear-gradient(top, #0088cc, #0044cc); + background-repeat: repeat-x; + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#0088cc', endColorstr='#0044cc', GradientType=0); + border-color: #0044cc #0044cc #002a80; + border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25); + filter: progid:DXImageTransform.Microsoft.gradient(enabled=false); + color: #fff; + text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25); +} +.datepicker table tr td.active:hover, +.datepicker table tr td.active:hover:hover, +.datepicker table tr td.active.disabled:hover, +.datepicker table tr td.active.disabled:hover:hover, +.datepicker table tr td.active:active, +.datepicker table tr td.active:hover:active, +.datepicker table tr td.active.disabled:active, +.datepicker table tr td.active.disabled:hover:active, +.datepicker table tr td.active.active, +.datepicker table tr td.active:hover.active, +.datepicker table tr td.active.disabled.active, +.datepicker table tr td.active.disabled:hover.active, +.datepicker table tr td.active.disabled, +.datepicker table tr td.active:hover.disabled, +.datepicker table tr td.active.disabled.disabled, +.datepicker table tr td.active.disabled:hover.disabled, +.datepicker table tr td.active[disabled], +.datepicker table tr td.active:hover[disabled], +.datepicker table tr td.active.disabled[disabled], +.datepicker table tr td.active.disabled:hover[disabled] { + background-color: #0044cc; +} +.datepicker table tr td.active:active, +.datepicker table tr td.active:hover:active, +.datepicker table tr td.active.disabled:active, +.datepicker table tr td.active.disabled:hover:active, +.datepicker table tr td.active.active, +.datepicker table tr td.active:hover.active, +.datepicker table tr td.active.disabled.active, +.datepicker table tr td.active.disabled:hover.active { + background-color: #003399 \9; +} +.datepicker table tr td span { + display: block; + width: 23%; + height: 54px; + line-height: 54px; + float: left; + margin: 1%; + cursor: pointer; + -webkit-border-radius: 4px; + -moz-border-radius: 4px; + border-radius: 4px; +} +.datepicker table tr td span:hover { + background: #eeeeee; +} +.datepicker table tr td span.disabled, +.datepicker table tr td span.disabled:hover { + background: none; + color: #999999; + cursor: default; +} +.datepicker table tr td span.active, +.datepicker table tr td span.active:hover, +.datepicker table tr td span.active.disabled, +.datepicker table tr td span.active.disabled:hover { + background-color: #006dcc; + background-image: -moz-linear-gradient(top, #0088cc, #0044cc); + background-image: -ms-linear-gradient(top, #0088cc, #0044cc); + background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#0088cc), to(#0044cc)); + background-image: -webkit-linear-gradient(top, #0088cc, #0044cc); + background-image: -o-linear-gradient(top, #0088cc, #0044cc); + background-image: linear-gradient(top, #0088cc, #0044cc); + background-repeat: repeat-x; + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#0088cc', endColorstr='#0044cc', GradientType=0); + border-color: #0044cc #0044cc #002a80; + border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25); + filter: progid:DXImageTransform.Microsoft.gradient(enabled=false); + color: #fff; + text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25); +} +.datepicker table tr td span.active:hover, +.datepicker table tr td span.active:hover:hover, +.datepicker table tr td span.active.disabled:hover, +.datepicker table tr td span.active.disabled:hover:hover, +.datepicker table tr td span.active:active, +.datepicker table tr td span.active:hover:active, +.datepicker table tr td span.active.disabled:active, +.datepicker table tr td span.active.disabled:hover:active, +.datepicker table tr td span.active.active, +.datepicker table tr td span.active:hover.active, +.datepicker table tr td span.active.disabled.active, +.datepicker table tr td span.active.disabled:hover.active, +.datepicker table tr td span.active.disabled, +.datepicker table tr td span.active:hover.disabled, +.datepicker table tr td span.active.disabled.disabled, +.datepicker table tr td span.active.disabled:hover.disabled, +.datepicker table tr td span.active[disabled], +.datepicker table tr td span.active:hover[disabled], +.datepicker table tr td span.active.disabled[disabled], +.datepicker table tr td span.active.disabled:hover[disabled] { + background-color: #0044cc; +} +.datepicker table tr td span.active:active, +.datepicker table tr td span.active:hover:active, +.datepicker table tr td span.active.disabled:active, +.datepicker table tr td span.active.disabled:hover:active, +.datepicker table tr td span.active.active, +.datepicker table tr td span.active:hover.active, +.datepicker table tr td span.active.disabled.active, +.datepicker table tr td span.active.disabled:hover.active { + background-color: #003399 \9; +} +.datepicker table tr td span.old { + color: #999999; +} +.datepicker th.switch { + width: 145px; +} +.datepicker thead tr:first-child th, +.datepicker tfoot tr:first-child th { + cursor: pointer; +} +.datepicker thead tr:first-child th:hover, +.datepicker tfoot tr:first-child th:hover { + background: #eeeeee; +} +.datepicker .cw { + font-size: 10px; + width: 12px; + padding: 0 2px 0 5px; + vertical-align: middle; +} +.datepicker thead tr:first-child th.cw { + cursor: default; + background-color: transparent; +} +.input-append.date .add-on i, +.input-prepend.date .add-on i { + display: block; + cursor: pointer; + width: 16px; + height: 16px; +} diff --git "a/8\343\200\201\346\226\207\347\214\256\346\225\260\346\215\256\346\214\226\346\216\230\347\263\273\347\273\237(\351\231\204\346\272\220\347\240\201)/extra_apps/xadmin/static/xadmin/vendor/bootstrap-datepicker/js/bootstrap-datepicker.js" "b/8\343\200\201\346\226\207\347\214\256\346\225\260\346\215\256\346\214\226\346\216\230\347\263\273\347\273\237(\351\231\204\346\272\220\347\240\201)/extra_apps/xadmin/static/xadmin/vendor/bootstrap-datepicker/js/bootstrap-datepicker.js" new file mode 100644 index 0000000..da25ad2 --- /dev/null +++ "b/8\343\200\201\346\226\207\347\214\256\346\225\260\346\215\256\346\214\226\346\216\230\347\263\273\347\273\237(\351\231\204\346\272\220\347\240\201)/extra_apps/xadmin/static/xadmin/vendor/bootstrap-datepicker/js/bootstrap-datepicker.js" @@ -0,0 +1,1047 @@ +/* ========================================================= + * bootstrap-datepicker.js + * http://www.eyecon.ro/bootstrap-datepicker + * ========================================================= + * Copyright 2012 Stefan Petre + * Improvements by Andrew Rowls + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ========================================================= */ + +!function( $ ) { + + function UTCDate(){ + return new Date(Date.UTC.apply(Date, arguments)); + } + function UTCToday(){ + var today = new Date(); + return UTCDate(today.getUTCFullYear(), today.getUTCMonth(), today.getUTCDate()); + } + + // Picker object + + var Datepicker = function(element, options) { + var that = this; + + this.element = $(element); + this.language = options.language||this.element.data('date-language')||"en"; + this.language = this.language in dates ? this.language : this.language.split('-')[0]; //Check if "de-DE" style date is available, if not language should fallback to 2 letter code eg "de" + this.language = this.language in dates ? this.language : "en"; + this.isRTL = dates[this.language].rtl||false; + this.format = DPGlobal.parseFormat(options.format||this.element.data('date-format')||dates[this.language].format||'mm/dd/yyyy'); + this.isInline = false; + this.isInput = this.element.is('input'); + this.component = this.element.is('.date') ? this.element.find('.add-on, .btn') : false; + this.hasInput = this.component && this.element.find('input').length; + if(this.component && this.component.length === 0) + this.component = false; + + this.forceParse = true; + if ('forceParse' in options) { + this.forceParse = options.forceParse; + } else if ('dateForceParse' in this.element.data()) { + this.forceParse = this.element.data('date-force-parse'); + } + + this.picker = $(DPGlobal.template); + this._buildEvents(); + this._attachEvents(); + + if(this.isInline) { + this.picker.addClass('datepicker-inline').appendTo(this.element); + } else { + this.picker.addClass('datepicker-dropdown dropdown-menu'); + } + if (this.isRTL){ + this.picker.addClass('datepicker-rtl'); + this.picker.find('.prev i, .next i') + .toggleClass('fa fa-arrow-left fa-arrow-right'); + } + + this.autoclose = false; + if ('autoclose' in options) { + this.autoclose = options.autoclose; + } else if ('dateAutoclose' in this.element.data()) { + this.autoclose = this.element.data('date-autoclose'); + } + + this.keyboardNavigation = true; + if ('keyboardNavigation' in options) { + this.keyboardNavigation = options.keyboardNavigation; + } else if ('dateKeyboardNavigation' in this.element.data()) { + this.keyboardNavigation = this.element.data('date-keyboard-navigation'); + } + + this.viewMode = this.startViewMode = 0; + switch(options.startView || this.element.data('date-start-view')){ + case 2: + case 'decade': + this.viewMode = this.startViewMode = 2; + break; + case 1: + case 'year': + this.viewMode = this.startViewMode = 1; + break; + } + + this.minViewMode = options.minViewMode||this.element.data('date-min-view-mode')||0; + if (typeof this.minViewMode === 'string') { + switch (this.minViewMode) { + case 'months': + this.minViewMode = 1; + break; + case 'years': + this.minViewMode = 2; + break; + default: + this.minViewMode = 0; + break; + } + } + + this.viewMode = this.startViewMode = Math.max(this.startViewMode, this.minViewMode); + + this.todayBtn = (options.todayBtn||this.element.data('date-today-btn')||false); + this.todayHighlight = (options.todayHighlight||this.element.data('date-today-highlight')||false); + + this.calendarWeeks = false; + if ('calendarWeeks' in options) { + this.calendarWeeks = options.calendarWeeks; + } else if ('dateCalendarWeeks' in this.element.data()) { + this.calendarWeeks = this.element.data('date-calendar-weeks'); + } + if (this.calendarWeeks) + this.picker.find('tfoot th.today') + .attr('colspan', function(i, val){ + return parseInt(val) + 1; + }); + + this._allow_update = false; + + this.weekStart = ((options.weekStart||this.element.data('date-weekstart')||dates[this.language].weekStart||0) % 7); + this.weekEnd = ((this.weekStart + 6) % 7); + this.startDate = -Infinity; + this.endDate = Infinity; + this.daysOfWeekDisabled = []; + this.setStartDate(options.startDate||this.element.data('date-startdate')); + this.setEndDate(options.endDate||this.element.data('date-enddate')); + this.setDaysOfWeekDisabled(options.daysOfWeekDisabled||this.element.data('date-days-of-week-disabled')); + this.fillDow(); + this.fillMonths(); + + this._allow_update = true; + + this.update(); + this.showMode(); + + if(this.isInline) { + this.show(); + } + }; + + Datepicker.prototype = { + constructor: Datepicker, + + _events: [], + _secondaryEvents: [], + _applyEvents: function(evs){ + for (var i=0, el, ev; i this.endDate) { + this.viewDate = new Date(this.endDate); + } else { + this.viewDate = new Date(this.date); + } + this.fill(); + }, + + fillDow: function(){ + var dowCnt = this.weekStart, + html = ''; + if(this.calendarWeeks){ + var cell = ' '; + html += cell; + this.picker.find('.datepicker-days thead tr:first-child').prepend(cell); + } + while (dowCnt < this.weekStart + 7) { + html += ''+dates[this.language].daysMin[(dowCnt++)%7]+''; + } + html += ''; + this.picker.find('.datepicker-days thead').append(html); + }, + + fillMonths: function(){ + var html = '', + i = 0; + while (i < 12) { + html += ''+dates[this.language].monthsShort[i++]+''; + } + this.picker.find('.datepicker-months td').html(html); + }, + + fill: function() { + var d = new Date(this.viewDate), + year = d.getUTCFullYear(), + month = d.getUTCMonth(), + startYear = this.startDate !== -Infinity ? this.startDate.getUTCFullYear() : -Infinity, + startMonth = this.startDate !== -Infinity ? this.startDate.getUTCMonth() : -Infinity, + endYear = this.endDate !== Infinity ? this.endDate.getUTCFullYear() : Infinity, + endMonth = this.endDate !== Infinity ? this.endDate.getUTCMonth() : Infinity, + currentDate = this.date && this.date.valueOf(), + today = new Date(); + this.picker.find('.datepicker-days thead th.switch') + .text(dates[this.language].months[month]+' '+year); + this.picker.find('tfoot th.today') + .text(dates[this.language].today) + .toggle(this.todayBtn !== false); + this.updateNavArrows(); + this.fillMonths(); + var prevMonth = UTCDate(year, month-1, 28,0,0,0,0), + day = DPGlobal.getDaysInMonth(prevMonth.getUTCFullYear(), prevMonth.getUTCMonth()); + prevMonth.setUTCDate(day); + prevMonth.setUTCDate(day - (prevMonth.getUTCDay() - this.weekStart + 7)%7); + var nextMonth = new Date(prevMonth); + nextMonth.setUTCDate(nextMonth.getUTCDate() + 42); + nextMonth = nextMonth.valueOf(); + var html = []; + var clsName; + while(prevMonth.valueOf() < nextMonth) { + if (prevMonth.getUTCDay() == this.weekStart) { + html.push(''); + if(this.calendarWeeks){ + // ISO 8601: First week contains first thursday. + // ISO also states week starts on Monday, but we can be more abstract here. + var + // Start of current week: based on weekstart/current date + ws = new Date(+prevMonth + (this.weekStart - prevMonth.getUTCDay() - 7) % 7 * 864e5), + // Thursday of this week + th = new Date(+ws + (7 + 4 - ws.getUTCDay()) % 7 * 864e5), + // First Thursday of year, year from thursday + yth = new Date(+(yth = UTCDate(th.getUTCFullYear(), 0, 1)) + (7 + 4 - yth.getUTCDay())%7*864e5), + // Calendar week: ms between thursdays, div ms per day, div 7 days + calWeek = (th - yth) / 864e5 / 7 + 1; + html.push(''+ calWeek +''); + + } + } + clsName = ''; + if (prevMonth.getUTCFullYear() < year || (prevMonth.getUTCFullYear() == year && prevMonth.getUTCMonth() < month)) { + clsName += ' old'; + } else if (prevMonth.getUTCFullYear() > year || (prevMonth.getUTCFullYear() == year && prevMonth.getUTCMonth() > month)) { + clsName += ' new'; + } + // Compare internal UTC date with local today, not UTC today + if (this.todayHighlight && + prevMonth.getUTCFullYear() == today.getFullYear() && + prevMonth.getUTCMonth() == today.getMonth() && + prevMonth.getUTCDate() == today.getDate()) { + clsName += ' today'; + } + if (currentDate && prevMonth.valueOf() == currentDate) { + clsName += ' active'; + } + if (prevMonth.valueOf() < this.startDate || prevMonth.valueOf() > this.endDate || + $.inArray(prevMonth.getUTCDay(), this.daysOfWeekDisabled) !== -1) { + clsName += ' disabled'; + } + html.push(''+prevMonth.getUTCDate() + ''); + if (prevMonth.getUTCDay() == this.weekEnd) { + html.push(''); + } + prevMonth.setUTCDate(prevMonth.getUTCDate()+1); + } + this.picker.find('.datepicker-days tbody').empty().append(html.join('')); + var currentYear = this.date && this.date.getUTCFullYear(); + + var months = this.picker.find('.datepicker-months') + .find('th:eq(1)') + .text(year) + .end() + .find('span').removeClass('active'); + if (currentYear && currentYear == year) { + months.eq(this.date.getUTCMonth()).addClass('active'); + } + if (year < startYear || year > endYear) { + months.addClass('disabled'); + } + if (year == startYear) { + months.slice(0, startMonth).addClass('disabled'); + } + if (year == endYear) { + months.slice(endMonth+1).addClass('disabled'); + } + + html = ''; + year = parseInt(year/10, 10) * 10; + var yearCont = this.picker.find('.datepicker-years') + .find('th:eq(1)') + .text(year + '-' + (year + 9)) + .end() + .find('td'); + year -= 1; + for (var i = -1; i < 11; i++) { + html += ''+year+''; + year += 1; + } + yearCont.html(html); + }, + + updateNavArrows: function() { + if (!this._allow_update) return; + + var d = new Date(this.viewDate), + year = d.getUTCFullYear(), + month = d.getUTCMonth(); + switch (this.viewMode) { + case 0: + if (this.startDate !== -Infinity && year <= this.startDate.getUTCFullYear() && month <= this.startDate.getUTCMonth()) { + this.picker.find('.prev').css({visibility: 'hidden'}); + } else { + this.picker.find('.prev').css({visibility: 'visible'}); + } + if (this.endDate !== Infinity && year >= this.endDate.getUTCFullYear() && month >= this.endDate.getUTCMonth()) { + this.picker.find('.next').css({visibility: 'hidden'}); + } else { + this.picker.find('.next').css({visibility: 'visible'}); + } + break; + case 1: + case 2: + if (this.startDate !== -Infinity && year <= this.startDate.getUTCFullYear()) { + this.picker.find('.prev').css({visibility: 'hidden'}); + } else { + this.picker.find('.prev').css({visibility: 'visible'}); + } + if (this.endDate !== Infinity && year >= this.endDate.getUTCFullYear()) { + this.picker.find('.next').css({visibility: 'hidden'}); + } else { + this.picker.find('.next').css({visibility: 'visible'}); + } + break; + } + }, + + click: function(e) { + e.stopPropagation(); + e.preventDefault(); + var target = $(e.target).closest('span, td, th'); + if (target.length == 1) { + switch(target[0].nodeName.toLowerCase()) { + case 'th': + switch(target[0].className) { + case 'switch': + this.showMode(1); + break; + case 'prev': + case 'next': + var dir = DPGlobal.modes[this.viewMode].navStep * (target[0].className == 'prev' ? -1 : 1); + switch(this.viewMode){ + case 0: + this.viewDate = this.moveMonth(this.viewDate, dir); + break; + case 1: + case 2: + this.viewDate = this.moveYear(this.viewDate, dir); + break; + } + this.fill(); + break; + case 'today': + var date = new Date(); + date = UTCDate(date.getFullYear(), date.getMonth(), date.getDate(), 0, 0, 0); + + this.showMode(-2); + var which = this.todayBtn == 'linked' ? null : 'view'; + this._setDate(date, which); + break; + } + break; + case 'span': + if (!target.is('.disabled')) { + this.viewDate.setUTCDate(1); + if (target.is('.month')) { + var day = 1; + var month = target.parent().find('span').index(target); + var year = this.viewDate.getUTCFullYear(); + this.viewDate.setUTCMonth(month); + this.element.trigger({ + type: 'changeMonth', + date: this.viewDate + }); + if ( this.minViewMode == 1 ) { + this._setDate(UTCDate(year, month, day,0,0,0,0)); + } + } else { + var year = parseInt(target.text(), 10)||0; + var day = 1; + var month = 0; + this.viewDate.setUTCFullYear(year); + this.element.trigger({ + type: 'changeYear', + date: this.viewDate + }); + if ( this.minViewMode == 2 ) { + this._setDate(UTCDate(year, month, day,0,0,0,0)); + } + } + this.showMode(-1); + this.fill(); + } + break; + case 'td': + if (target.is('.day') && !target.is('.disabled')){ + var day = parseInt(target.text(), 10)||1; + var year = this.viewDate.getUTCFullYear(), + month = this.viewDate.getUTCMonth(); + if (target.is('.old')) { + if (month === 0) { + month = 11; + year -= 1; + } else { + month -= 1; + } + } else if (target.is('.new')) { + if (month == 11) { + month = 0; + year += 1; + } else { + month += 1; + } + } + this._setDate(UTCDate(year, month, day,0,0,0,0)); + } + break; + } + } + }, + + _setDate: function(date, which){ + if (!which || which == 'date') + this.date = date; + if (!which || which == 'view') + this.viewDate = date; + this.fill(); + this.setValue(); + this.element.trigger({ + type: 'changeDate', + date: this.date + }); + var element; + if (this.isInput) { + element = this.element; + } else if (this.component){ + element = this.element.find('input'); + } + if (element) { + element.change(); + if (this.autoclose && (!which || which == 'date')) { + this.hide(); + } + } + }, + + moveMonth: function(date, dir){ + if (!dir) return date; + var new_date = new Date(date.valueOf()), + day = new_date.getUTCDate(), + month = new_date.getUTCMonth(), + mag = Math.abs(dir), + new_month, test; + dir = dir > 0 ? 1 : -1; + if (mag == 1){ + test = dir == -1 + // If going back one month, make sure month is not current month + // (eg, Mar 31 -> Feb 31 == Feb 28, not Mar 02) + ? function(){ return new_date.getUTCMonth() == month; } + // If going forward one month, make sure month is as expected + // (eg, Jan 31 -> Feb 31 == Feb 28, not Mar 02) + : function(){ return new_date.getUTCMonth() != new_month; }; + new_month = month + dir; + new_date.setUTCMonth(new_month); + // Dec -> Jan (12) or Jan -> Dec (-1) -- limit expected date to 0-11 + if (new_month < 0 || new_month > 11) + new_month = (new_month + 12) % 12; + } else { + // For magnitudes >1, move one month at a time... + for (var i=0; i= this.startDate && date <= this.endDate; + }, + + keydown: function(e){ + if (this.picker.is(':not(:visible)')){ + if (e.keyCode == 27) // allow escape to hide and re-show picker + this.show(); + return; + } + var dateChanged = false, + dir, day, month, + newDate, newViewDate; + switch(e.keyCode){ + case 27: // escape + this.hide(); + e.preventDefault(); + break; + case 37: // left + case 39: // right + if (!this.keyboardNavigation) break; + dir = e.keyCode == 37 ? -1 : 1; + if (e.ctrlKey){ + newDate = this.moveYear(this.date, dir); + newViewDate = this.moveYear(this.viewDate, dir); + } else if (e.shiftKey){ + newDate = this.moveMonth(this.date, dir); + newViewDate = this.moveMonth(this.viewDate, dir); + } else { + newDate = new Date(this.date); + newDate.setUTCDate(this.date.getUTCDate() + dir); + newViewDate = new Date(this.viewDate); + newViewDate.setUTCDate(this.viewDate.getUTCDate() + dir); + } + if (this.dateWithinRange(newDate)){ + this.date = newDate; + this.viewDate = newViewDate; + this.setValue(); + this.update(); + e.preventDefault(); + dateChanged = true; + } + break; + case 38: // up + case 40: // down + if (!this.keyboardNavigation) break; + dir = e.keyCode == 38 ? -1 : 1; + if (e.ctrlKey){ + newDate = this.moveYear(this.date, dir); + newViewDate = this.moveYear(this.viewDate, dir); + } else if (e.shiftKey){ + newDate = this.moveMonth(this.date, dir); + newViewDate = this.moveMonth(this.viewDate, dir); + } else { + newDate = new Date(this.date); + newDate.setUTCDate(this.date.getUTCDate() + dir * 7); + newViewDate = new Date(this.viewDate); + newViewDate.setUTCDate(this.viewDate.getUTCDate() + dir * 7); + } + if (this.dateWithinRange(newDate)){ + this.date = newDate; + this.viewDate = newViewDate; + this.setValue(); + this.update(); + e.preventDefault(); + dateChanged = true; + } + break; + case 13: // enter + this.hide(); + e.preventDefault(); + break; + case 9: // tab + this.hide(); + break; + } + if (dateChanged){ + this.element.trigger({ + type: 'changeDate', + date: this.date + }); + var element; + if (this.isInput) { + element = this.element; + } else if (this.component){ + element = this.element.find('input'); + } + if (element) { + element.change(); + } + } + }, + + showMode: function(dir) { + if (dir) { + this.viewMode = Math.max(this.minViewMode, Math.min(2, this.viewMode + dir)); + } + /* + vitalets: fixing bug of very special conditions: + jquery 1.7.1 + webkit + show inline datepicker in bootstrap popover. + Method show() does not set display css correctly and datepicker is not shown. + Changed to .css('display', 'block') solve the problem. + See https://github.com/vitalets/x-editable/issues/37 + + In jquery 1.7.2+ everything works fine. + */ + //this.picker.find('>div').hide().filter('.datepicker-'+DPGlobal.modes[this.viewMode].clsName).show(); + this.picker.find('>div').hide().filter('.datepicker-'+DPGlobal.modes[this.viewMode].clsName).css('display', 'block'); + this.updateNavArrows(); + } + }; + + $.fn.datepicker = function ( option ) { + var args = Array.apply(null, arguments); + args.shift(); + return this.each(function () { + var $this = $(this), + data = $this.data('datepicker'), + options = typeof option == 'object' && option; + if (!data) { + $this.data('datepicker', (data = new Datepicker(this, $.extend({}, $.fn.datepicker.defaults,options)))); + } + if (typeof option == 'string' && typeof data[option] == 'function') { + data[option].apply(data, args); + } + }); + }; + + $.fn.datepicker.defaults = { + }; + $.fn.datepicker.Constructor = Datepicker; + var dates = $.fn.datepicker.dates = { + en: { + days: ["Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday", "Sunday"], + daysShort: ["Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat", "Sun"], + daysMin: ["Su", "Mo", "Tu", "We", "Th", "Fr", "Sa", "Su"], + months: ["January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December"], + monthsShort: ["Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"], + today: "Today" + } + }; + + var DPGlobal = { + modes: [ + { + clsName: 'days', + navFnc: 'Month', + navStep: 1 + }, + { + clsName: 'months', + navFnc: 'FullYear', + navStep: 1 + }, + { + clsName: 'years', + navFnc: 'FullYear', + navStep: 10 + }], + isLeapYear: function (year) { + return (((year % 4 === 0) && (year % 100 !== 0)) || (year % 400 === 0)); + }, + getDaysInMonth: function (year, month) { + return [31, (DPGlobal.isLeapYear(year) ? 29 : 28), 31, 30, 31, 30, 31, 31, 30, 31, 30, 31][month]; + }, + validParts: /dd?|DD?|mm?|MM?|yy(?:yy)?/g, + nonpunctuation: /[^ -\/:-@\[\u3400-\u9fff-`{-~\t\n\r]+/g, + parseFormat: function(format){ + // IE treats \0 as a string end in inputs (truncating the value), + // so it's a bad format delimiter, anyway + var separators = format.replace(this.validParts, '\0').split('\0'), + parts = format.match(this.validParts); + if (!separators || !separators.length || !parts || parts.length === 0){ + throw new Error("Invalid date format."); + } + return {separators: separators, parts: parts}; + }, + parseDate: function(date, format, language) { + if (date instanceof Date) return date; + if (/^[\-+]\d+[dmwy]([\s,]+[\-+]\d+[dmwy])*$/.test(date)) { + var part_re = /([\-+]\d+)([dmwy])/, + parts = date.match(/([\-+]\d+)([dmwy])/g), + part, dir; + date = new Date(); + for (var i=0; i'+ + ''+ + ''+ + ''+ + ''+ + ''+ + '', + contTemplate: '', + footTemplate: '' + }; + DPGlobal.template = '
    '+ + '
    '+ + ''+ + DPGlobal.headTemplate+ + ''+ + DPGlobal.footTemplate+ + '
    '+ + '
    '+ + '
    '+ + ''+ + DPGlobal.headTemplate+ + DPGlobal.contTemplate+ + DPGlobal.footTemplate+ + '
    '+ + '
    '+ + '
    '+ + ''+ + DPGlobal.headTemplate+ + DPGlobal.contTemplate+ + DPGlobal.footTemplate+ + '
    '+ + '
    '+ + '
    '; + + $.fn.datepicker.DPGlobal = DPGlobal; + +}( window.jQuery ); diff --git "a/8\343\200\201\346\226\207\347\214\256\346\225\260\346\215\256\346\214\226\346\216\230\347\263\273\347\273\237(\351\231\204\346\272\220\347\240\201)/extra_apps/xadmin/static/xadmin/vendor/bootstrap-datepicker/js/locales/bootstrap-datepicker.bg.js" "b/8\343\200\201\346\226\207\347\214\256\346\225\260\346\215\256\346\214\226\346\216\230\347\263\273\347\273\237(\351\231\204\346\272\220\347\240\201)/extra_apps/xadmin/static/xadmin/vendor/bootstrap-datepicker/js/locales/bootstrap-datepicker.bg.js" new file mode 100644 index 0000000..6837afd --- /dev/null +++ "b/8\343\200\201\346\226\207\347\214\256\346\225\260\346\215\256\346\214\226\346\216\230\347\263\273\347\273\237(\351\231\204\346\272\220\347\240\201)/extra_apps/xadmin/static/xadmin/vendor/bootstrap-datepicker/js/locales/bootstrap-datepicker.bg.js" @@ -0,0 +1,14 @@ +/** + * Bulgarian translation for bootstrap-datepicker + * Apostol Apostolov + */ +;(function($){ + $.fn.datepicker.dates['bg'] = { + days: ["Неделя", "Понеделник", "Вторник", "Сряда", "Четвъртък", "Петък", "Събота", "Неделя"], + daysShort: ["Нед", "Пон", "Вто", "Сря", "Чет", "Пет", "Съб", "Нед"], + daysMin: ["Н", "П", "В", "С", "Ч", "П", "С", "Н"], + months: ["Януари", "Февруари", "Март", "Април", "Май", "Юни", "Юли", "Август", "Септември", "Октомври", "Ноември", "Декември"], + monthsShort: ["Ян", "Фев", "Мар", "Апр", "Май", "Юни", "Юли", "Авг", "Сеп", "Окт", "Ное", "Дек"], + today: "днес" + }; +}(jQuery)); diff --git "a/8\343\200\201\346\226\207\347\214\256\346\225\260\346\215\256\346\214\226\346\216\230\347\263\273\347\273\237(\351\231\204\346\272\220\347\240\201)/extra_apps/xadmin/static/xadmin/vendor/bootstrap-datepicker/js/locales/bootstrap-datepicker.ca.js" "b/8\343\200\201\346\226\207\347\214\256\346\225\260\346\215\256\346\214\226\346\216\230\347\263\273\347\273\237(\351\231\204\346\272\220\347\240\201)/extra_apps/xadmin/static/xadmin/vendor/bootstrap-datepicker/js/locales/bootstrap-datepicker.ca.js" new file mode 100644 index 0000000..3fc4d84 --- /dev/null +++ "b/8\343\200\201\346\226\207\347\214\256\346\225\260\346\215\256\346\214\226\346\216\230\347\263\273\347\273\237(\351\231\204\346\272\220\347\240\201)/extra_apps/xadmin/static/xadmin/vendor/bootstrap-datepicker/js/locales/bootstrap-datepicker.ca.js" @@ -0,0 +1,14 @@ +/** + * Catalan translation for bootstrap-datepicker + * J. Garcia + */ +;(function($){ + $.fn.datepicker.dates['ca'] = { + days: ["Diumenge", "Dilluns", "Dimarts", "Dimecres", "Dijous", "Divendres", "Dissabte", "Diumenge"], + daysShort: ["Diu", "Dil", "Dmt", "Dmc", "Dij", "Div", "Dis", "Diu"], + daysMin: ["dg", "dl", "dt", "dc", "dj", "dv", "ds", "dg"], + months: ["Gener", "Febrer", "Març", "Abril", "Maig", "Juny", "Juliol", "Agost", "Setembre", "Octubre", "Novembre", "Desembre"], + monthsShort: ["Gen", "Feb", "Mar", "Abr", "Mai", "Jun", "Jul", "Ago", "Set", "Oct", "Nov", "Des"], + today: "Avui" + }; +}(jQuery)); diff --git "a/8\343\200\201\346\226\207\347\214\256\346\225\260\346\215\256\346\214\226\346\216\230\347\263\273\347\273\237(\351\231\204\346\272\220\347\240\201)/extra_apps/xadmin/static/xadmin/vendor/bootstrap-datepicker/js/locales/bootstrap-datepicker.cs.js" "b/8\343\200\201\346\226\207\347\214\256\346\225\260\346\215\256\346\214\226\346\216\230\347\263\273\347\273\237(\351\231\204\346\272\220\347\240\201)/extra_apps/xadmin/static/xadmin/vendor/bootstrap-datepicker/js/locales/bootstrap-datepicker.cs.js" new file mode 100644 index 0000000..f76a2c0 --- /dev/null +++ "b/8\343\200\201\346\226\207\347\214\256\346\225\260\346\215\256\346\214\226\346\216\230\347\263\273\347\273\237(\351\231\204\346\272\220\347\240\201)/extra_apps/xadmin/static/xadmin/vendor/bootstrap-datepicker/js/locales/bootstrap-datepicker.cs.js" @@ -0,0 +1,15 @@ +/** + * Czech translation for bootstrap-datepicker + * Matěj Koubík + * Fixes by Michal Remiš + */ +;(function($){ + $.fn.datepicker.dates['cs'] = { + days: ["Neděle", "Pondělí", "Úterý", "Středa", "Čtvrtek", "Pátek", "Sobota", "Neděle"], + daysShort: ["Ned", "Pon", "Úte", "Stř", "Čtv", "Pát", "Sob", "Ned"], + daysMin: ["Ne", "Po", "Út", "St", "Čt", "Pá", "So", "Ne"], + months: ["Leden", "Únor", "Březen", "Duben", "Květen", "Červen", "Červenec", "Srpen", "Září", "Říjen", "Listopad", "Prosinec"], + monthsShort: ["Led", "Úno", "Bře", "Dub", "Kvě", "Čer", "Čnc", "Srp", "Zář", "Říj", "Lis", "Pro"], + today: "Dnes" + }; +}(jQuery)); diff --git "a/8\343\200\201\346\226\207\347\214\256\346\225\260\346\215\256\346\214\226\346\216\230\347\263\273\347\273\237(\351\231\204\346\272\220\347\240\201)/extra_apps/xadmin/static/xadmin/vendor/bootstrap-datepicker/js/locales/bootstrap-datepicker.da.js" "b/8\343\200\201\346\226\207\347\214\256\346\225\260\346\215\256\346\214\226\346\216\230\347\263\273\347\273\237(\351\231\204\346\272\220\347\240\201)/extra_apps/xadmin/static/xadmin/vendor/bootstrap-datepicker/js/locales/bootstrap-datepicker.da.js" new file mode 100644 index 0000000..6307be5 --- /dev/null +++ "b/8\343\200\201\346\226\207\347\214\256\346\225\260\346\215\256\346\214\226\346\216\230\347\263\273\347\273\237(\351\231\204\346\272\220\347\240\201)/extra_apps/xadmin/static/xadmin/vendor/bootstrap-datepicker/js/locales/bootstrap-datepicker.da.js" @@ -0,0 +1,14 @@ +/** + * Danish translation for bootstrap-datepicker + * Christian Pedersen + */ +;(function($){ + $.fn.datepicker.dates['da'] = { + days: ["Søndag", "Mandag", "Tirsdag", "Onsdag", "Torsdag", "Fredag", "Lørdag", "Søndag"], + daysShort: ["Søn", "Man", "Tir", "Ons", "Tor", "Fre", "Lør", "Søn"], + daysMin: ["Sø", "Ma", "Ti", "On", "To", "Fr", "Lø", "Sø"], + months: ["Januar", "Februar", "Marts", "April", "Maj", "Juni", "Juli", "August", "September", "Oktober", "November", "December"], + monthsShort: ["Jan", "Feb", "Mar", "Apr", "Maj", "Jun", "Jul", "Aug", "Sep", "Okt", "Nov", "Dec"], + today: "I Dag" + }; +}(jQuery)); \ No newline at end of file diff --git "a/8\343\200\201\346\226\207\347\214\256\346\225\260\346\215\256\346\214\226\346\216\230\347\263\273\347\273\237(\351\231\204\346\272\220\347\240\201)/extra_apps/xadmin/static/xadmin/vendor/bootstrap-datepicker/js/locales/bootstrap-datepicker.de.js" "b/8\343\200\201\346\226\207\347\214\256\346\225\260\346\215\256\346\214\226\346\216\230\347\263\273\347\273\237(\351\231\204\346\272\220\347\240\201)/extra_apps/xadmin/static/xadmin/vendor/bootstrap-datepicker/js/locales/bootstrap-datepicker.de.js" new file mode 100644 index 0000000..3d491a2 --- /dev/null +++ "b/8\343\200\201\346\226\207\347\214\256\346\225\260\346\215\256\346\214\226\346\216\230\347\263\273\347\273\237(\351\231\204\346\272\220\347\240\201)/extra_apps/xadmin/static/xadmin/vendor/bootstrap-datepicker/js/locales/bootstrap-datepicker.de.js" @@ -0,0 +1,16 @@ +/** + * German translation for bootstrap-datepicker + * Sam Zurcher + */ +;(function($){ + $.fn.datepicker.dates['de'] = { + days: ["Sonntag", "Montag", "Dienstag", "Mittwoch", "Donnerstag", "Freitag", "Samstag", "Sonntag"], + daysShort: ["Son", "Mon", "Die", "Mit", "Don", "Fre", "Sam", "Son"], + daysMin: ["So", "Mo", "Di", "Mi", "Do", "Fr", "Sa", "So"], + months: ["Januar", "Februar", "März", "April", "Mai", "Juni", "Juli", "August", "September", "Oktober", "November", "Dezember"], + monthsShort: ["Jan", "Feb", "Mär", "Apr", "Mai", "Jun", "Jul", "Aug", "Sep", "Okt", "Nov", "Dez"], + today: "Heute", + weekStart: 1, + format: "dd.mm.yyyy" + }; +}(jQuery)); diff --git "a/8\343\200\201\346\226\207\347\214\256\346\225\260\346\215\256\346\214\226\346\216\230\347\263\273\347\273\237(\351\231\204\346\272\220\347\240\201)/extra_apps/xadmin/static/xadmin/vendor/bootstrap-datepicker/js/locales/bootstrap-datepicker.el.js" "b/8\343\200\201\346\226\207\347\214\256\346\225\260\346\215\256\346\214\226\346\216\230\347\263\273\347\273\237(\351\231\204\346\272\220\347\240\201)/extra_apps/xadmin/static/xadmin/vendor/bootstrap-datepicker/js/locales/bootstrap-datepicker.el.js" new file mode 100644 index 0000000..6de26bc --- /dev/null +++ "b/8\343\200\201\346\226\207\347\214\256\346\225\260\346\215\256\346\214\226\346\216\230\347\263\273\347\273\237(\351\231\204\346\272\220\347\240\201)/extra_apps/xadmin/static/xadmin/vendor/bootstrap-datepicker/js/locales/bootstrap-datepicker.el.js" @@ -0,0 +1,13 @@ +/** +* Greek translation for bootstrap-datepicker +*/ +;(function($){ + $.fn.datepicker.dates['el'] = { + days: ["Κυριακή", "Δευτέρα", "Τρίτη", "Τετάρτη", "Πέμπτη", "Παρασκευή", "Σάββατο", "Κυριακή"], + daysShort: ["Κυρ", "Δευ", "Τρι", "Τετ", "Πεμ", "Παρ", "Σαβ", "Κυρ"], + daysMin: ["Κυ", "Δε", "Τρ", "Τε", "Πε", "Πα", "Σα", "Κυ"], + months: ["Ιανουάριος", "Φεβρουάριος", "Μάρτιος", "Απρίλιος", "Μάιος", "Ιούνιος", "Ιούλιος", "Αύγουστος", "Σεπτέμβριος", "Οκτώβριος", "Νοέμβριος", "Δεκέμβριος"], + monthsShort: ["Ιαν", "Φεβ", "Μαρ", "Απρ", "Μάι", "Ιουν", "Ιουλ", "Αυγ", "Σεπ", "Οκτ", "Νοε", "Δεκ"], + today: "Σήμερα" + }; +}(jQuery)); \ No newline at end of file diff --git "a/8\343\200\201\346\226\207\347\214\256\346\225\260\346\215\256\346\214\226\346\216\230\347\263\273\347\273\237(\351\231\204\346\272\220\347\240\201)/extra_apps/xadmin/static/xadmin/vendor/bootstrap-datepicker/js/locales/bootstrap-datepicker.es.js" "b/8\343\200\201\346\226\207\347\214\256\346\225\260\346\215\256\346\214\226\346\216\230\347\263\273\347\273\237(\351\231\204\346\272\220\347\240\201)/extra_apps/xadmin/static/xadmin/vendor/bootstrap-datepicker/js/locales/bootstrap-datepicker.es.js" new file mode 100644 index 0000000..7217690 --- /dev/null +++ "b/8\343\200\201\346\226\207\347\214\256\346\225\260\346\215\256\346\214\226\346\216\230\347\263\273\347\273\237(\351\231\204\346\272\220\347\240\201)/extra_apps/xadmin/static/xadmin/vendor/bootstrap-datepicker/js/locales/bootstrap-datepicker.es.js" @@ -0,0 +1,14 @@ +/** + * Spanish translation for bootstrap-datepicker + * Bruno Bonamin + */ +;(function($){ + $.fn.datepicker.dates['es'] = { + days: ["Domingo", "Lunes", "Martes", "Miércoles", "Jueves", "Viernes", "Sábado", "Domingo"], + daysShort: ["Dom", "Lun", "Mar", "Mié", "Jue", "Vie", "Sáb", "Dom"], + daysMin: ["Do", "Lu", "Ma", "Mi", "Ju", "Vi", "Sa", "Do"], + months: ["Enero", "Febrero", "Marzo", "Abril", "Mayo", "Junio", "Julio", "Agosto", "Septiembre", "Octubre", "Noviembre", "Diciembre"], + monthsShort: ["Ene", "Feb", "Mar", "Abr", "May", "Jun", "Jul", "Ago", "Sep", "Oct", "Nov", "Dic"], + today: "Hoy" + }; +}(jQuery)); diff --git "a/8\343\200\201\346\226\207\347\214\256\346\225\260\346\215\256\346\214\226\346\216\230\347\263\273\347\273\237(\351\231\204\346\272\220\347\240\201)/extra_apps/xadmin/static/xadmin/vendor/bootstrap-datepicker/js/locales/bootstrap-datepicker.fi.js" "b/8\343\200\201\346\226\207\347\214\256\346\225\260\346\215\256\346\214\226\346\216\230\347\263\273\347\273\237(\351\231\204\346\272\220\347\240\201)/extra_apps/xadmin/static/xadmin/vendor/bootstrap-datepicker/js/locales/bootstrap-datepicker.fi.js" new file mode 100644 index 0000000..e13e6b9 --- /dev/null +++ "b/8\343\200\201\346\226\207\347\214\256\346\225\260\346\215\256\346\214\226\346\216\230\347\263\273\347\273\237(\351\231\204\346\272\220\347\240\201)/extra_apps/xadmin/static/xadmin/vendor/bootstrap-datepicker/js/locales/bootstrap-datepicker.fi.js" @@ -0,0 +1,14 @@ +/** + * Finnish translation for bootstrap-datepicker + * Jaakko Salonen + */ +;(function($){ + $.fn.datepicker.dates['fi'] = { + days: ["sunnuntai", "maanantai", "tiistai", "keskiviikko", "torstai", "perjantai", "lauantai", "sunnuntai"], + daysShort: ["sun", "maa", "tii", "kes", "tor", "per", "lau", "sun"], + daysMin: ["su", "ma", "ti", "ke", "to", "pe", "la", "su"], + months: ["tammikuu", "helmikuu", "maaliskuu", "huhtikuu", "toukokuu", "kesäkuu", "heinäkuu", "elokuu", "syyskuu", "lokakuu", "marraskuu", "joulukuu"], + monthsShort: ["tam", "hel", "maa", "huh", "tou", "kes", "hei", "elo", "syy", "lok", "mar", "jou"], + today: "tänään" + }; +}(jQuery)); diff --git "a/8\343\200\201\346\226\207\347\214\256\346\225\260\346\215\256\346\214\226\346\216\230\347\263\273\347\273\237(\351\231\204\346\272\220\347\240\201)/extra_apps/xadmin/static/xadmin/vendor/bootstrap-datepicker/js/locales/bootstrap-datepicker.fr.js" "b/8\343\200\201\346\226\207\347\214\256\346\225\260\346\215\256\346\214\226\346\216\230\347\263\273\347\273\237(\351\231\204\346\272\220\347\240\201)/extra_apps/xadmin/static/xadmin/vendor/bootstrap-datepicker/js/locales/bootstrap-datepicker.fr.js" new file mode 100644 index 0000000..498babe --- /dev/null +++ "b/8\343\200\201\346\226\207\347\214\256\346\225\260\346\215\256\346\214\226\346\216\230\347\263\273\347\273\237(\351\231\204\346\272\220\347\240\201)/extra_apps/xadmin/static/xadmin/vendor/bootstrap-datepicker/js/locales/bootstrap-datepicker.fr.js" @@ -0,0 +1,16 @@ +/** + * French translation for bootstrap-datepicker + * Nico Mollet + */ +;(function($){ + $.fn.datepicker.dates['fr'] = { + days: ["Dimanche", "Lundi", "Mardi", "Mercredi", "Jeudi", "Vendredi", "Samedi", "Dimanche"], + daysShort: ["Dim", "Lun", "Mar", "Mer", "Jeu", "Ven", "Sam", "Dim"], + daysMin: ["D", "L", "Ma", "Me", "J", "V", "S", "D"], + months: ["Janvier", "Février", "Mars", "Avril", "Mai", "Juin", "Juillet", "Août", "Septembre", "Octobre", "Novembre", "Décembre"], + monthsShort: ["Jan", "Fev", "Mar", "Avr", "Mai", "Jui", "Jul", "Aou", "Sep", "Oct", "Nov", "Dec"], + today: "Aujourd'hui", + weekStart: 1, + format: "dd/mm/yyyy" + }; +}(jQuery)); diff --git "a/8\343\200\201\346\226\207\347\214\256\346\225\260\346\215\256\346\214\226\346\216\230\347\263\273\347\273\237(\351\231\204\346\272\220\347\240\201)/extra_apps/xadmin/static/xadmin/vendor/bootstrap-datepicker/js/locales/bootstrap-datepicker.he.js" "b/8\343\200\201\346\226\207\347\214\256\346\225\260\346\215\256\346\214\226\346\216\230\347\263\273\347\273\237(\351\231\204\346\272\220\347\240\201)/extra_apps/xadmin/static/xadmin/vendor/bootstrap-datepicker/js/locales/bootstrap-datepicker.he.js" new file mode 100644 index 0000000..2e17393 --- /dev/null +++ "b/8\343\200\201\346\226\207\347\214\256\346\225\260\346\215\256\346\214\226\346\216\230\347\263\273\347\273\237(\351\231\204\346\272\220\347\240\201)/extra_apps/xadmin/static/xadmin/vendor/bootstrap-datepicker/js/locales/bootstrap-datepicker.he.js" @@ -0,0 +1,15 @@ +/** + * Hebrew translation for bootstrap-datepicker + * Sagie Maoz + */ +;(function($){ + $.fn.datepicker.dates['he'] = { + days: ["ראשון", "שני", "שלישי", "רביעי", "חמישי", "שישי", "שבת", "ראשון"], + daysShort: ["א", "ב", "ג", "ד", "ה", "ו", "ש", "א"], + daysMin: ["א", "ב", "ג", "ד", "ה", "ו", "ש", "א"], + months: ["ינואר", "פברואר", "מרץ", "אפריל", "מאי", "יוני", "יולי", "אוגוסט", "ספטמבר", "אוקטובר", "נובמבר", "דצמבר"], + monthsShort: ["ינו", "פבר", "מרץ", "אפר", "מאי", "יונ", "יול", "אוג", "ספט", "אוק", "נוב", "דצמ"], + today: "היום", + rtl: true + }; +}(jQuery)); diff --git "a/8\343\200\201\346\226\207\347\214\256\346\225\260\346\215\256\346\214\226\346\216\230\347\263\273\347\273\237(\351\231\204\346\272\220\347\240\201)/extra_apps/xadmin/static/xadmin/vendor/bootstrap-datepicker/js/locales/bootstrap-datepicker.hr.js" "b/8\343\200\201\346\226\207\347\214\256\346\225\260\346\215\256\346\214\226\346\216\230\347\263\273\347\273\237(\351\231\204\346\272\220\347\240\201)/extra_apps/xadmin/static/xadmin/vendor/bootstrap-datepicker/js/locales/bootstrap-datepicker.hr.js" new file mode 100644 index 0000000..8d13d11 --- /dev/null +++ "b/8\343\200\201\346\226\207\347\214\256\346\225\260\346\215\256\346\214\226\346\216\230\347\263\273\347\273\237(\351\231\204\346\272\220\347\240\201)/extra_apps/xadmin/static/xadmin/vendor/bootstrap-datepicker/js/locales/bootstrap-datepicker.hr.js" @@ -0,0 +1,13 @@ +/** + * Croatian localisation + */ +;(function($){ + $.fn.datepicker.dates['hr'] = { + days: ["Nedjelja", "Ponedjelja", "Utorak", "Srijeda", "Četrtak", "Petak", "Subota", "Nedjelja"], + daysShort: ["Ned", "Pon", "Uto", "Srr", "Čet", "Pet", "Sub", "Ned"], + daysMin: ["Ne", "Po", "Ut", "Sr", "Če", "Pe", "Su", "Ne"], + months: ["Siječanj", "Veljača", "Ožujak", "Travanj", "Svibanj", "Lipanj", "Srpanj", "Kolovoz", "Rujan", "Listopad", "Studeni", "Prosinac"], + monthsShort: ["Sije", "Velj", "Ožu", "Tra", "Svi", "Lip", "Jul", "Kol", "Ruj", "Lis", "Stu", "Pro"], + today: "Danas" + }; +}(jQuery)); diff --git "a/8\343\200\201\346\226\207\347\214\256\346\225\260\346\215\256\346\214\226\346\216\230\347\263\273\347\273\237(\351\231\204\346\272\220\347\240\201)/extra_apps/xadmin/static/xadmin/vendor/bootstrap-datepicker/js/locales/bootstrap-datepicker.hu.js" "b/8\343\200\201\346\226\207\347\214\256\346\225\260\346\215\256\346\214\226\346\216\230\347\263\273\347\273\237(\351\231\204\346\272\220\347\240\201)/extra_apps/xadmin/static/xadmin/vendor/bootstrap-datepicker/js/locales/bootstrap-datepicker.hu.js" new file mode 100644 index 0000000..bf5308a --- /dev/null +++ "b/8\343\200\201\346\226\207\347\214\256\346\225\260\346\215\256\346\214\226\346\216\230\347\263\273\347\273\237(\351\231\204\346\272\220\347\240\201)/extra_apps/xadmin/static/xadmin/vendor/bootstrap-datepicker/js/locales/bootstrap-datepicker.hu.js" @@ -0,0 +1,16 @@ +/** + * Hungarian translation for bootstrap-datepicker + * Sotus László + */ +;(function($){ + $.fn.datepicker.dates['hu'] = { + days: ["Vasárnap", "Hétfő", "Kedd", "Szerda", "Csütörtök", "Péntek", "Szombat", "Vasárnap"], + daysShort: ["Vas", "Hét", "Ked", "Sze", "Csü", "Pén", "Szo", "Vas"], + daysMin: ["Va", "Hé", "Ke", "Sz", "Cs", "Pé", "Sz", "Va"], + months: ["Január", "Február", "Március", "Április", "Május", "Június", "Július", "Augusztus", "Szeptember", "Október", "November", "December"], + monthsShort: ["Jan", "Feb", "Már", "Ápr", "Máj", "Jún", "Júl", "Aug", "Sze", "Okt", "Nov", "Dec"], + today: "Ma", + weekStart: 1, + format: "yyyy.mm.dd" + }; +}(jQuery)); diff --git "a/8\343\200\201\346\226\207\347\214\256\346\225\260\346\215\256\346\214\226\346\216\230\347\263\273\347\273\237(\351\231\204\346\272\220\347\240\201)/extra_apps/xadmin/static/xadmin/vendor/bootstrap-datepicker/js/locales/bootstrap-datepicker.id.js" "b/8\343\200\201\346\226\207\347\214\256\346\225\260\346\215\256\346\214\226\346\216\230\347\263\273\347\273\237(\351\231\204\346\272\220\347\240\201)/extra_apps/xadmin/static/xadmin/vendor/bootstrap-datepicker/js/locales/bootstrap-datepicker.id.js" new file mode 100644 index 0000000..d48aa48 --- /dev/null +++ "b/8\343\200\201\346\226\207\347\214\256\346\225\260\346\215\256\346\214\226\346\216\230\347\263\273\347\273\237(\351\231\204\346\272\220\347\240\201)/extra_apps/xadmin/static/xadmin/vendor/bootstrap-datepicker/js/locales/bootstrap-datepicker.id.js" @@ -0,0 +1,13 @@ +/** + * Bahasa translation for bootstrap-datepicker + * Azwar Akbar + */ +;(function($){ + $.fn.datepicker.dates['id'] = { + days: ["Minggu", "Senin", "Selasa", "Rabu", "Kamis", "Jumat", "Sabtu", "Minggu"], + daysShort: ["Mgu", "Sen", "Sel", "Rab", "Kam", "Jum", "Sab", "Mgu"], + daysMin: ["Mg", "Sn", "Sl", "Ra", "Ka", "Ju", "Sa", "Mg"], + months: ["Januari", "Februari", "Maret", "April", "Mei", "Juni", "Juli", "Agustus", "September", "Oktober", "November", "Desember"], + monthsShort: ["Jan", "Feb", "Mar", "Apr", "Mei", "Jun", "Jul", "Ags", "Sep", "Okt", "Nov", "Des"] + }; +}(jQuery)); diff --git "a/8\343\200\201\346\226\207\347\214\256\346\225\260\346\215\256\346\214\226\346\216\230\347\263\273\347\273\237(\351\231\204\346\272\220\347\240\201)/extra_apps/xadmin/static/xadmin/vendor/bootstrap-datepicker/js/locales/bootstrap-datepicker.is.js" "b/8\343\200\201\346\226\207\347\214\256\346\225\260\346\215\256\346\214\226\346\216\230\347\263\273\347\273\237(\351\231\204\346\272\220\347\240\201)/extra_apps/xadmin/static/xadmin/vendor/bootstrap-datepicker/js/locales/bootstrap-datepicker.is.js" new file mode 100644 index 0000000..0e57a91 --- /dev/null +++ "b/8\343\200\201\346\226\207\347\214\256\346\225\260\346\215\256\346\214\226\346\216\230\347\263\273\347\273\237(\351\231\204\346\272\220\347\240\201)/extra_apps/xadmin/static/xadmin/vendor/bootstrap-datepicker/js/locales/bootstrap-datepicker.is.js" @@ -0,0 +1,14 @@ +/** + * Icelandic translation for bootstrap-datepicker + * Hinrik Örn Sigurðsson + */ +;(function($){ + $.fn.datepicker.dates['is'] = { + days: ["Sunnudagur", "Mánudagur", "Þriðjudagur", "Miðvikudagur", "Fimmtudagur", "Föstudagur", "Laugardagur", "Sunnudagur"], + daysShort: ["Sun", "Mán", "Þri", "Mið", "Fim", "Fös", "Lau", "Sun"], + daysMin: ["Su", "Má", "Þr", "Mi", "Fi", "Fö", "La", "Su"], + months: ["Janúar", "Febrúar", "Mars", "Apríl", "Maí", "Júní", "Júlí", "Ágúst", "September", "Október", "Nóvember", "Desember"], + monthsShort: ["Jan", "Feb", "Mar", "Apr", "Maí", "Jún", "Júl", "Ágú", "Sep", "Okt", "Nóv", "Des"], + today: "Í Dag" + }; +}(jQuery)); diff --git "a/8\343\200\201\346\226\207\347\214\256\346\225\260\346\215\256\346\214\226\346\216\230\347\263\273\347\273\237(\351\231\204\346\272\220\347\240\201)/extra_apps/xadmin/static/xadmin/vendor/bootstrap-datepicker/js/locales/bootstrap-datepicker.it.js" "b/8\343\200\201\346\226\207\347\214\256\346\225\260\346\215\256\346\214\226\346\216\230\347\263\273\347\273\237(\351\231\204\346\272\220\347\240\201)/extra_apps/xadmin/static/xadmin/vendor/bootstrap-datepicker/js/locales/bootstrap-datepicker.it.js" new file mode 100644 index 0000000..8209f2a --- /dev/null +++ "b/8\343\200\201\346\226\207\347\214\256\346\225\260\346\215\256\346\214\226\346\216\230\347\263\273\347\273\237(\351\231\204\346\272\220\347\240\201)/extra_apps/xadmin/static/xadmin/vendor/bootstrap-datepicker/js/locales/bootstrap-datepicker.it.js" @@ -0,0 +1,16 @@ +/** + * Italian translation for bootstrap-datepicker + * Enrico Rubboli + */ +;(function($){ + $.fn.datepicker.dates['it'] = { + days: ["Domenica", "Lunedì", "Martedì", "Mercoledì", "Giovedì", "Venerdì", "Sabato", "Domenica"], + daysShort: ["Dom", "Lun", "Mar", "Mer", "Gio", "Ven", "Sab", "Dom"], + daysMin: ["Do", "Lu", "Ma", "Me", "Gi", "Ve", "Sa", "Do"], + months: ["Gennaio", "Febbraio", "Marzo", "Aprile", "Maggio", "Giugno", "Luglio", "Agosto", "Settembre", "Ottobre", "Novembre", "Dicembre"], + monthsShort: ["Gen", "Feb", "Mar", "Apr", "Mag", "Giu", "Lug", "Ago", "Set", "Ott", "Nov", "Dic"], + today: "Oggi", + weekStart: 1, + format: "dd/mm/yyyy" + }; +}(jQuery)); diff --git "a/8\343\200\201\346\226\207\347\214\256\346\225\260\346\215\256\346\214\226\346\216\230\347\263\273\347\273\237(\351\231\204\346\272\220\347\240\201)/extra_apps/xadmin/static/xadmin/vendor/bootstrap-datepicker/js/locales/bootstrap-datepicker.ja.js" "b/8\343\200\201\346\226\207\347\214\256\346\225\260\346\215\256\346\214\226\346\216\230\347\263\273\347\273\237(\351\231\204\346\272\220\347\240\201)/extra_apps/xadmin/static/xadmin/vendor/bootstrap-datepicker/js/locales/bootstrap-datepicker.ja.js" new file mode 100644 index 0000000..ed0bc0f --- /dev/null +++ "b/8\343\200\201\346\226\207\347\214\256\346\225\260\346\215\256\346\214\226\346\216\230\347\263\273\347\273\237(\351\231\204\346\272\220\347\240\201)/extra_apps/xadmin/static/xadmin/vendor/bootstrap-datepicker/js/locales/bootstrap-datepicker.ja.js" @@ -0,0 +1,15 @@ +/** + * Japanese translation for bootstrap-datepicker + * Norio Suzuki + */ +;(function($){ + $.fn.datepicker.dates['ja'] = { + days: ["日曜", "月曜", "火曜", "水曜", "木曜", "金曜", "土曜", "日曜"], + daysShort: ["日", "月", "火", "水", "木", "金", "土", "日"], + daysMin: ["日", "月", "火", "水", "木", "金", "土", "日"], + months: ["1月", "2月", "3月", "4月", "5月", "6月", "7月", "8月", "9月", "10月", "11月", "12月"], + monthsShort: ["1月", "2月", "3月", "4月", "5月", "6月", "7月", "8月", "9月", "10月", "11月", "12月"], + today: "今日", + format: "yyyy/mm/dd" + }; +}(jQuery)); diff --git "a/8\343\200\201\346\226\207\347\214\256\346\225\260\346\215\256\346\214\226\346\216\230\347\263\273\347\273\237(\351\231\204\346\272\220\347\240\201)/extra_apps/xadmin/static/xadmin/vendor/bootstrap-datepicker/js/locales/bootstrap-datepicker.kr.js" "b/8\343\200\201\346\226\207\347\214\256\346\225\260\346\215\256\346\214\226\346\216\230\347\263\273\347\273\237(\351\231\204\346\272\220\347\240\201)/extra_apps/xadmin/static/xadmin/vendor/bootstrap-datepicker/js/locales/bootstrap-datepicker.kr.js" new file mode 100644 index 0000000..183a88d --- /dev/null +++ "b/8\343\200\201\346\226\207\347\214\256\346\225\260\346\215\256\346\214\226\346\216\230\347\263\273\347\273\237(\351\231\204\346\272\220\347\240\201)/extra_apps/xadmin/static/xadmin/vendor/bootstrap-datepicker/js/locales/bootstrap-datepicker.kr.js" @@ -0,0 +1,13 @@ +/** + * Korean translation for bootstrap-datepicker + * Gu Youn + */ +;(function($){ + $.fn.datepicker.dates['kr'] = { + days: ["일요일", "월요일", "화요일", "수요일", "목요일", "금요일", "토요일", "일요일"], + daysShort: ["일", "월", "화", "수", "목", "금", "토", "일"], + daysMin: ["일", "월", "화", "수", "목", "금", "토", "일"], + months: ["1월", "2월", "3월", "4월", "5월", "6월", "7월", "8월", "9월", "10월", "11월", "12월"], + monthsShort: ["1월", "2월", "3월", "4월", "5월", "6월", "7월", "8월", "9월", "10월", "11월", "12월"] + }; +}(jQuery)); diff --git "a/8\343\200\201\346\226\207\347\214\256\346\225\260\346\215\256\346\214\226\346\216\230\347\263\273\347\273\237(\351\231\204\346\272\220\347\240\201)/extra_apps/xadmin/static/xadmin/vendor/bootstrap-datepicker/js/locales/bootstrap-datepicker.lt.js" "b/8\343\200\201\346\226\207\347\214\256\346\225\260\346\215\256\346\214\226\346\216\230\347\263\273\347\273\237(\351\231\204\346\272\220\347\240\201)/extra_apps/xadmin/static/xadmin/vendor/bootstrap-datepicker/js/locales/bootstrap-datepicker.lt.js" new file mode 100644 index 0000000..11c1b3a --- /dev/null +++ "b/8\343\200\201\346\226\207\347\214\256\346\225\260\346\215\256\346\214\226\346\216\230\347\263\273\347\273\237(\351\231\204\346\272\220\347\240\201)/extra_apps/xadmin/static/xadmin/vendor/bootstrap-datepicker/js/locales/bootstrap-datepicker.lt.js" @@ -0,0 +1,16 @@ +/** + * Lithuanian translation for bootstrap-datepicker + * Šarūnas Gliebus + */ + +;(function($){ + $.fn.datepicker.dates['lt'] = { + days: ["Sekmadienis", "Pirmadienis", "Antradienis", "Trečiadienis", "Ketvirtadienis", "Penktadienis", "Šeštadienis", "Sekmadienis"], + daysShort: ["S", "Pr", "A", "T", "K", "Pn", "Š", "S"], + daysMin: ["Sk", "Pr", "An", "Tr", "Ke", "Pn", "Št", "Sk"], + months: ["Sausis", "Vasaris", "Kovas", "Balandis", "Gegužė", "Birželis", "Liepa", "Rugpjūtis", "Rugsėjis", "Spalis", "Lapkritis", "Gruodis"], + monthsShort: ["Sau", "Vas", "Kov", "Bal", "Geg", "Bir", "Lie", "Rugp", "Rugs", "Spa", "Lap", "Gru"], + today: "Šiandien", + weekStart: 1 + }; +}(jQuery)); diff --git "a/8\343\200\201\346\226\207\347\214\256\346\225\260\346\215\256\346\214\226\346\216\230\347\263\273\347\273\237(\351\231\204\346\272\220\347\240\201)/extra_apps/xadmin/static/xadmin/vendor/bootstrap-datepicker/js/locales/bootstrap-datepicker.lv.js" "b/8\343\200\201\346\226\207\347\214\256\346\225\260\346\215\256\346\214\226\346\216\230\347\263\273\347\273\237(\351\231\204\346\272\220\347\240\201)/extra_apps/xadmin/static/xadmin/vendor/bootstrap-datepicker/js/locales/bootstrap-datepicker.lv.js" new file mode 100644 index 0000000..cc75fe0 --- /dev/null +++ "b/8\343\200\201\346\226\207\347\214\256\346\225\260\346\215\256\346\214\226\346\216\230\347\263\273\347\273\237(\351\231\204\346\272\220\347\240\201)/extra_apps/xadmin/static/xadmin/vendor/bootstrap-datepicker/js/locales/bootstrap-datepicker.lv.js" @@ -0,0 +1,16 @@ +/** + * Latvian translation for bootstrap-datepicker + * Artis Avotins + */ + +;(function($){ + $.fn.datepicker.dates['lv'] = { + days: ["Svētdiena", "Pirmdiena", "Otrdiena", "Trešdiena", "Ceturtdiena", "Piektdiena", "Sestdiena", "Svētdiena"], + daysShort: ["Sv", "P", "O", "T", "C", "Pk", "S", "Sv"], + daysMin: ["Sv", "Pr", "Ot", "Tr", "Ce", "Pk", "St", "Sv"], + months: ["Janvāris", "Februāris", "Marts", "Aprīlis", "Maijs", "Jūnijs", "Jūlijs", "Augusts", "Septembris", "Oktobris", "Novembris", "Decembris"], + monthsShort: ["Jan", "Feb", "Mar", "Apr", "Mai", "Jūn", "Jūl", "Aug", "Sep", "Okt", "Nov", "Dec."], + today: "Šodien", + weekStart: 1 + }; +}(jQuery)); \ No newline at end of file diff --git "a/8\343\200\201\346\226\207\347\214\256\346\225\260\346\215\256\346\214\226\346\216\230\347\263\273\347\273\237(\351\231\204\346\272\220\347\240\201)/extra_apps/xadmin/static/xadmin/vendor/bootstrap-datepicker/js/locales/bootstrap-datepicker.ms.js" "b/8\343\200\201\346\226\207\347\214\256\346\225\260\346\215\256\346\214\226\346\216\230\347\263\273\347\273\237(\351\231\204\346\272\220\347\240\201)/extra_apps/xadmin/static/xadmin/vendor/bootstrap-datepicker/js/locales/bootstrap-datepicker.ms.js" new file mode 100644 index 0000000..fa3a21a --- /dev/null +++ "b/8\343\200\201\346\226\207\347\214\256\346\225\260\346\215\256\346\214\226\346\216\230\347\263\273\347\273\237(\351\231\204\346\272\220\347\240\201)/extra_apps/xadmin/static/xadmin/vendor/bootstrap-datepicker/js/locales/bootstrap-datepicker.ms.js" @@ -0,0 +1,14 @@ +/** + * Malay translation for bootstrap-datepicker + * Ateman Faiz + */ +;(function($){ + $.fn.datepicker.dates['ms'] = { + days: ["Ahad", "Isnin", "Selasa", "Rabu", "Khamis", "Jumaat", "Sabtu", "Ahad"], + daysShort: ["Aha", "Isn", "Sel", "Rab", "Kha", "Jum", "Sab", "Aha"], + daysMin: ["Ah", "Is", "Se", "Ra", "Kh", "Ju", "Sa", "Ah"], + months: ["Januari", "Februari", "Mac", "April", "Mei", "Jun", "Julai", "Ogos", "September", "Oktober", "November", "Disember"], + monthsShort: ["Jan", "Feb", "Mar", "Apr", "Mei", "Jun", "Jul", "Ogo", "Sep", "Okt", "Nov", "Dis"], + today: "Hari Ini" + }; +}(jQuery)); diff --git "a/8\343\200\201\346\226\207\347\214\256\346\225\260\346\215\256\346\214\226\346\216\230\347\263\273\347\273\237(\351\231\204\346\272\220\347\240\201)/extra_apps/xadmin/static/xadmin/vendor/bootstrap-datepicker/js/locales/bootstrap-datepicker.nb.js" "b/8\343\200\201\346\226\207\347\214\256\346\225\260\346\215\256\346\214\226\346\216\230\347\263\273\347\273\237(\351\231\204\346\272\220\347\240\201)/extra_apps/xadmin/static/xadmin/vendor/bootstrap-datepicker/js/locales/bootstrap-datepicker.nb.js" new file mode 100644 index 0000000..fb9fe2a --- /dev/null +++ "b/8\343\200\201\346\226\207\347\214\256\346\225\260\346\215\256\346\214\226\346\216\230\347\263\273\347\273\237(\351\231\204\346\272\220\347\240\201)/extra_apps/xadmin/static/xadmin/vendor/bootstrap-datepicker/js/locales/bootstrap-datepicker.nb.js" @@ -0,0 +1,14 @@ +/** + * Norwegian (bokmål) translation for bootstrap-datepicker + * Fredrik Sundmyhr + */ +;(function($){ + $.fn.datepicker.dates['nb'] = { + days: ["Søndag", "Mandag", "Tirsdag", "Onsdag", "Torsdag", "Fredag", "Lørdag", "Søndag"], + daysShort: ["Søn", "Man", "Tir", "Ons", "Tor", "Fre", "Lør", "Søn"], + daysMin: ["Sø", "Ma", "Ti", "On", "To", "Fr", "Lø", "Sø"], + months: ["Januar", "Februar", "Mars", "April", "Mai", "Juni", "Juli", "August", "September", "Oktober", "November", "Desember"], + monthsShort: ["Jan", "Feb", "Mar", "Apr", "Mai", "Jun", "Jul", "Aug", "Sep", "Okt", "Nov", "Des"], + today: "I Dag" + }; +}(jQuery)); \ No newline at end of file diff --git "a/8\343\200\201\346\226\207\347\214\256\346\225\260\346\215\256\346\214\226\346\216\230\347\263\273\347\273\237(\351\231\204\346\272\220\347\240\201)/extra_apps/xadmin/static/xadmin/vendor/bootstrap-datepicker/js/locales/bootstrap-datepicker.nl.js" "b/8\343\200\201\346\226\207\347\214\256\346\225\260\346\215\256\346\214\226\346\216\230\347\263\273\347\273\237(\351\231\204\346\272\220\347\240\201)/extra_apps/xadmin/static/xadmin/vendor/bootstrap-datepicker/js/locales/bootstrap-datepicker.nl.js" new file mode 100644 index 0000000..13a2f1a --- /dev/null +++ "b/8\343\200\201\346\226\207\347\214\256\346\225\260\346\215\256\346\214\226\346\216\230\347\263\273\347\273\237(\351\231\204\346\272\220\347\240\201)/extra_apps/xadmin/static/xadmin/vendor/bootstrap-datepicker/js/locales/bootstrap-datepicker.nl.js" @@ -0,0 +1,14 @@ +/** + * Dutch translation for bootstrap-datepicker + * Reinier Goltstein + */ +;(function($){ + $.fn.datepicker.dates['nl'] = { + days: ["Zondag", "Maandag", "Dinsdag", "Woensdag", "Donderdag", "Vrijdag", "Zaterdag", "Zondag"], + daysShort: ["Zo", "Ma", "Di", "Wo", "Do", "Vr", "Za", "Zo"], + daysMin: ["Zo", "Ma", "Di", "Wo", "Do", "Vr", "Za", "Zo"], + months: ["Januari", "Februari", "Maart", "April", "Mei", "Juni", "Juli", "Augustus", "September", "Oktober", "November", "December"], + monthsShort: ["Jan", "Feb", "Mrt", "Apr", "Mei", "Jun", "Jul", "Aug", "Sep", "Okt", "Nov", "Dec"], + today: "Vandaag" + }; +}(jQuery)); diff --git "a/8\343\200\201\346\226\207\347\214\256\346\225\260\346\215\256\346\214\226\346\216\230\347\263\273\347\273\237(\351\231\204\346\272\220\347\240\201)/extra_apps/xadmin/static/xadmin/vendor/bootstrap-datepicker/js/locales/bootstrap-datepicker.pl.js" "b/8\343\200\201\346\226\207\347\214\256\346\225\260\346\215\256\346\214\226\346\216\230\347\263\273\347\273\237(\351\231\204\346\272\220\347\240\201)/extra_apps/xadmin/static/xadmin/vendor/bootstrap-datepicker/js/locales/bootstrap-datepicker.pl.js" new file mode 100644 index 0000000..f3fff8c --- /dev/null +++ "b/8\343\200\201\346\226\207\347\214\256\346\225\260\346\215\256\346\214\226\346\216\230\347\263\273\347\273\237(\351\231\204\346\272\220\347\240\201)/extra_apps/xadmin/static/xadmin/vendor/bootstrap-datepicker/js/locales/bootstrap-datepicker.pl.js" @@ -0,0 +1,15 @@ +/** + * Polish translation for bootstrap-datepicker + * Robert + */ +;(function($){ + $.fn.datepicker.dates['pl'] = { + days: ["Niedziela", "Poniedziałek", "Wtorek", "Środa", "Czwartek", "Piątek", "Sobota", "Niedziela"], + daysShort: ["Nie", "Pn", "Wt", "Śr", "Czw", "Pt", "So", "Nie"], + daysMin: ["N", "Pn", "Wt", "Śr", "Cz", "Pt", "So", "N"], + months: ["Styczeń", "Luty", "Marzec", "Kwiecień", "Maj", "Czerwiec", "Lipiec", "Sierpień", "Wrzesień", "Październik", "Listopad", "Grudzień"], + monthsShort: ["Sty", "Lu", "Mar", "Kw", "Maj", "Cze", "Lip", "Sie", "Wrz", "Pa", "Lis", "Gru"], + today: "Dzisiaj", + weekStart: 1 + }; +}(jQuery)); diff --git "a/8\343\200\201\346\226\207\347\214\256\346\225\260\346\215\256\346\214\226\346\216\230\347\263\273\347\273\237(\351\231\204\346\272\220\347\240\201)/extra_apps/xadmin/static/xadmin/vendor/bootstrap-datepicker/js/locales/bootstrap-datepicker.pt-BR.js" "b/8\343\200\201\346\226\207\347\214\256\346\225\260\346\215\256\346\214\226\346\216\230\347\263\273\347\273\237(\351\231\204\346\272\220\347\240\201)/extra_apps/xadmin/static/xadmin/vendor/bootstrap-datepicker/js/locales/bootstrap-datepicker.pt-BR.js" new file mode 100644 index 0000000..8d1fc27 --- /dev/null +++ "b/8\343\200\201\346\226\207\347\214\256\346\225\260\346\215\256\346\214\226\346\216\230\347\263\273\347\273\237(\351\231\204\346\272\220\347\240\201)/extra_apps/xadmin/static/xadmin/vendor/bootstrap-datepicker/js/locales/bootstrap-datepicker.pt-BR.js" @@ -0,0 +1,14 @@ +/** + * Brazilian translation for bootstrap-datepicker + * Cauan Cabral + */ +;(function($){ + $.fn.datepicker.dates['pt-BR'] = { + days: ["Domingo", "Segunda", "Terça", "Quarta", "Quinta", "Sexta", "Sábado", "Domingo"], + daysShort: ["Dom", "Seg", "Ter", "Qua", "Qui", "Sex", "Sáb", "Dom"], + daysMin: ["Do", "Se", "Te", "Qu", "Qu", "Se", "Sa", "Do"], + months: ["Janeiro", "Fevereiro", "Março", "Abril", "Maio", "Junho", "Julho", "Agosto", "Setembro", "Outubro", "Novembro", "Dezembro"], + monthsShort: ["Jan", "Fev", "Mar", "Abr", "Mai", "Jun", "Jul", "Ago", "Set", "Out", "Nov", "Dez"], + today: "Hoje" + }; +}(jQuery)); diff --git "a/8\343\200\201\346\226\207\347\214\256\346\225\260\346\215\256\346\214\226\346\216\230\347\263\273\347\273\237(\351\231\204\346\272\220\347\240\201)/extra_apps/xadmin/static/xadmin/vendor/bootstrap-datepicker/js/locales/bootstrap-datepicker.pt.js" "b/8\343\200\201\346\226\207\347\214\256\346\225\260\346\215\256\346\214\226\346\216\230\347\263\273\347\273\237(\351\231\204\346\272\220\347\240\201)/extra_apps/xadmin/static/xadmin/vendor/bootstrap-datepicker/js/locales/bootstrap-datepicker.pt.js" new file mode 100644 index 0000000..64179e8 --- /dev/null +++ "b/8\343\200\201\346\226\207\347\214\256\346\225\260\346\215\256\346\214\226\346\216\230\347\263\273\347\273\237(\351\231\204\346\272\220\347\240\201)/extra_apps/xadmin/static/xadmin/vendor/bootstrap-datepicker/js/locales/bootstrap-datepicker.pt.js" @@ -0,0 +1,14 @@ +/** + * Portuguese translation for bootstrap-datepicker + * Original code: Cauan Cabral + * Tiago Melo + */ +;(function($){ + $.fn.datepicker.dates['pt'] = { + days: ["Domingo", "Segunda", "Terça", "Quarta", "Quinta", "Sexta", "Sábado", "Domingo"], + daysShort: ["Dom", "Seg", "Ter", "Qua", "Qui", "Sex", "Sáb", "Dom"], + daysMin: ["Do", "Se", "Te", "Qu", "Qu", "Se", "Sa", "Do"], + months: ["Janeiro", "Fevereiro", "Março", "Abril", "Maio", "Junho", "Julho", "Agosto", "Setembro", "Outubro", "Novembro", "Dezembro"], + monthsShort: ["Jan", "Fev", "Mar", "Abr", "Mai", "Jun", "Jul", "Ago", "Set", "Out", "Nov", "Dez"] + }; +}(jQuery)); diff --git "a/8\343\200\201\346\226\207\347\214\256\346\225\260\346\215\256\346\214\226\346\216\230\347\263\273\347\273\237(\351\231\204\346\272\220\347\240\201)/extra_apps/xadmin/static/xadmin/vendor/bootstrap-datepicker/js/locales/bootstrap-datepicker.ro.js" "b/8\343\200\201\346\226\207\347\214\256\346\225\260\346\215\256\346\214\226\346\216\230\347\263\273\347\273\237(\351\231\204\346\272\220\347\240\201)/extra_apps/xadmin/static/xadmin/vendor/bootstrap-datepicker/js/locales/bootstrap-datepicker.ro.js" new file mode 100644 index 0000000..03c1a47 --- /dev/null +++ "b/8\343\200\201\346\226\207\347\214\256\346\225\260\346\215\256\346\214\226\346\216\230\347\263\273\347\273\237(\351\231\204\346\272\220\347\240\201)/extra_apps/xadmin/static/xadmin/vendor/bootstrap-datepicker/js/locales/bootstrap-datepicker.ro.js" @@ -0,0 +1,15 @@ +/** + * Romanian translation for bootstrap-datepicker + * Cristian Vasile + */ +;(function($){ + $.fn.datepicker.dates['ro'] = { + days: ["Duminică", "Luni", "Marţi", "Miercuri", "Joi", "Vineri", "Sâmbătă", "Duminică"], + daysShort: ["Dum", "Lun", "Mar", "Mie", "Joi", "Vin", "Sâm", "Dum"], + daysMin: ["Du", "Lu", "Ma", "Mi", "Jo", "Vi", "Sâ", "Du"], + months: ["Ianuarie", "Februarie", "Martie", "Aprilie", "Mai", "Iunie", "Iulie", "August", "Septembrie", "Octombrie", "Noiembrie", "Decembrie"], + monthsShort: ["Ian", "Feb", "Mar", "Apr", "Mai", "Iun", "Iul", "Aug", "Sep", "Oct", "Nov", "Dec"], + today: "Astăzi", + weekStart: 1 + }; +}(jQuery)); diff --git "a/8\343\200\201\346\226\207\347\214\256\346\225\260\346\215\256\346\214\226\346\216\230\347\263\273\347\273\237(\351\231\204\346\272\220\347\240\201)/extra_apps/xadmin/static/xadmin/vendor/bootstrap-datepicker/js/locales/bootstrap-datepicker.rs-latin.js" "b/8\343\200\201\346\226\207\347\214\256\346\225\260\346\215\256\346\214\226\346\216\230\347\263\273\347\273\237(\351\231\204\346\272\220\347\240\201)/extra_apps/xadmin/static/xadmin/vendor/bootstrap-datepicker/js/locales/bootstrap-datepicker.rs-latin.js" new file mode 100644 index 0000000..1e0523d --- /dev/null +++ "b/8\343\200\201\346\226\207\347\214\256\346\225\260\346\215\256\346\214\226\346\216\230\347\263\273\347\273\237(\351\231\204\346\272\220\347\240\201)/extra_apps/xadmin/static/xadmin/vendor/bootstrap-datepicker/js/locales/bootstrap-datepicker.rs-latin.js" @@ -0,0 +1,14 @@ +/** + * Serbian latin translation for bootstrap-datepicker + * Bojan Milosavlević + */ +;(function($){ + $.fn.datepicker.dates['rs'] = { + days: ["Nedelja","Ponedeljak", "Utorak", "Sreda", "Četvrtak", "Petak", "Subota", "Nedelja"], + daysShort: ["Ned", "Pon", "Uto", "Sre", "Čet", "Pet", "Sub", "Ned"], + daysMin: ["N", "Po", "U", "Sr", "Č", "Pe", "Su", "N"], + months: ["Januar", "Februar", "Mart", "April", "Maj", "Jun", "Jul", "Avgust", "Septembar", "Oktobar", "Novembar", "Decembar"], + monthsShort: ["Jan", "Feb", "Mar", "Apr", "Maj", "Jun", "Jul", "Avg", "Sep", "Okt", "Nov", "Dec"], + today: "Danas" + }; +}(jQuery)); diff --git "a/8\343\200\201\346\226\207\347\214\256\346\225\260\346\215\256\346\214\226\346\216\230\347\263\273\347\273\237(\351\231\204\346\272\220\347\240\201)/extra_apps/xadmin/static/xadmin/vendor/bootstrap-datepicker/js/locales/bootstrap-datepicker.rs.js" "b/8\343\200\201\346\226\207\347\214\256\346\225\260\346\215\256\346\214\226\346\216\230\347\263\273\347\273\237(\351\231\204\346\272\220\347\240\201)/extra_apps/xadmin/static/xadmin/vendor/bootstrap-datepicker/js/locales/bootstrap-datepicker.rs.js" new file mode 100644 index 0000000..6b65747 --- /dev/null +++ "b/8\343\200\201\346\226\207\347\214\256\346\225\260\346\215\256\346\214\226\346\216\230\347\263\273\347\273\237(\351\231\204\346\272\220\347\240\201)/extra_apps/xadmin/static/xadmin/vendor/bootstrap-datepicker/js/locales/bootstrap-datepicker.rs.js" @@ -0,0 +1,14 @@ +/** + * Serbian cyrillic translation for bootstrap-datepicker + * Bojan Milosavlević + */ +;(function($){ + $.fn.datepicker.dates['rs'] = { + days: ["Недеља","Понедељак", "Уторак", "Среда", "Четвртак", "Петак", "Субота", "Недеља"], + daysShort: ["Нед", "Пон", "Уто", "Сре", "Чет", "Пет", "Суб", "Нед"], + daysMin: ["Н", "По", "У", "Ср", "Ч", "Пе", "Су", "Н"], + months: ["Јануар", "Фебруар", "Март", "Април", "Мај", "Јун", "Јул", "Август", "Септембар", "Октобар", "Новембар", "Децембар"], + monthsShort: ["Јан", "Феб", "Мар", "Апр", "Мај", "Јун", "Јул", "Авг", "Сеп", "Окт", "Нов", "Дец"], + today: "Данас" + }; +}(jQuery)); diff --git "a/8\343\200\201\346\226\207\347\214\256\346\225\260\346\215\256\346\214\226\346\216\230\347\263\273\347\273\237(\351\231\204\346\272\220\347\240\201)/extra_apps/xadmin/static/xadmin/vendor/bootstrap-datepicker/js/locales/bootstrap-datepicker.ru.js" "b/8\343\200\201\346\226\207\347\214\256\346\225\260\346\215\256\346\214\226\346\216\230\347\263\273\347\273\237(\351\231\204\346\272\220\347\240\201)/extra_apps/xadmin/static/xadmin/vendor/bootstrap-datepicker/js/locales/bootstrap-datepicker.ru.js" new file mode 100644 index 0000000..9404cff --- /dev/null +++ "b/8\343\200\201\346\226\207\347\214\256\346\225\260\346\215\256\346\214\226\346\216\230\347\263\273\347\273\237(\351\231\204\346\272\220\347\240\201)/extra_apps/xadmin/static/xadmin/vendor/bootstrap-datepicker/js/locales/bootstrap-datepicker.ru.js" @@ -0,0 +1,14 @@ +/** + * Russian translation for bootstrap-datepicker + * Victor Taranenko + */ +;(function($){ + $.fn.datepicker.dates['ru'] = { + days: ["Воскресенье", "Понедельник", "Вторник", "Среда", "Четверг", "Пятница", "Суббота", "Воскресенье"], + daysShort: ["Вск", "Пнд", "Втр", "Срд", "Чтв", "Птн", "Суб", "Вск"], + daysMin: ["Вс", "Пн", "Вт", "Ср", "Чт", "Пт", "Сб", "Вс"], + months: ["Январь", "Февраль", "Март", "Апрель", "Май", "Июнь", "Июль", "Август", "Сентябрь", "Октябрь", "Ноябрь", "Декабрь"], + monthsShort: ["Янв", "Фев", "Мар", "Апр", "Май", "Июн", "Июл", "Авг", "Сен", "Окт", "Ноя", "Дек"], + today: "Сегодня" + }; +}(jQuery)); \ No newline at end of file diff --git "a/8\343\200\201\346\226\207\347\214\256\346\225\260\346\215\256\346\214\226\346\216\230\347\263\273\347\273\237(\351\231\204\346\272\220\347\240\201)/extra_apps/xadmin/static/xadmin/vendor/bootstrap-datepicker/js/locales/bootstrap-datepicker.sk.js" "b/8\343\200\201\346\226\207\347\214\256\346\225\260\346\215\256\346\214\226\346\216\230\347\263\273\347\273\237(\351\231\204\346\272\220\347\240\201)/extra_apps/xadmin/static/xadmin/vendor/bootstrap-datepicker/js/locales/bootstrap-datepicker.sk.js" new file mode 100644 index 0000000..c48032a --- /dev/null +++ "b/8\343\200\201\346\226\207\347\214\256\346\225\260\346\215\256\346\214\226\346\216\230\347\263\273\347\273\237(\351\231\204\346\272\220\347\240\201)/extra_apps/xadmin/static/xadmin/vendor/bootstrap-datepicker/js/locales/bootstrap-datepicker.sk.js" @@ -0,0 +1,15 @@ +/** + * Slovak translation for bootstrap-datepicker + * Marek Lichtner + * Fixes by Michal Remiš + */ +;(function($){ + $.fn.datepicker.dates["sk"] = { + days: ["Nedeľa", "Pondelok", "Utorok", "Streda", "Štvrtok", "Piatok", "Sobota", "Nedeľa"], + daysShort: ["Ned", "Pon", "Uto", "Str", "Štv", "Pia", "Sob", "Ned"], + daysMin: ["Ne", "Po", "Ut", "St", "Št", "Pia", "So", "Ne"], + months: ["Január", "Február", "Marec", "Apríl", "Máj", "Jún", "Júl", "August", "September", "Október", "November", "December"], + monthsShort: ["Jan", "Feb", "Mar", "Apr", "Máj", "Jún", "Júl", "Aug", "Sep", "Okt", "Nov", "Dec"], + today: "Dnes" + }; +}(jQuery)); diff --git "a/8\343\200\201\346\226\207\347\214\256\346\225\260\346\215\256\346\214\226\346\216\230\347\263\273\347\273\237(\351\231\204\346\272\220\347\240\201)/extra_apps/xadmin/static/xadmin/vendor/bootstrap-datepicker/js/locales/bootstrap-datepicker.sl.js" "b/8\343\200\201\346\226\207\347\214\256\346\225\260\346\215\256\346\214\226\346\216\230\347\263\273\347\273\237(\351\231\204\346\272\220\347\240\201)/extra_apps/xadmin/static/xadmin/vendor/bootstrap-datepicker/js/locales/bootstrap-datepicker.sl.js" new file mode 100644 index 0000000..41b0e06 --- /dev/null +++ "b/8\343\200\201\346\226\207\347\214\256\346\225\260\346\215\256\346\214\226\346\216\230\347\263\273\347\273\237(\351\231\204\346\272\220\347\240\201)/extra_apps/xadmin/static/xadmin/vendor/bootstrap-datepicker/js/locales/bootstrap-datepicker.sl.js" @@ -0,0 +1,14 @@ +/** + * Slovene translation for bootstrap-datepicker + * Gregor Rudolf + */ +;(function($){ + $.fn.datepicker.dates['sl'] = { + days: ["Nedelja", "Ponedeljek", "Torek", "Sreda", "Četrtek", "Petek", "Sobota", "Nedelja"], + daysShort: ["Ned", "Pon", "Tor", "Sre", "Čet", "Pet", "Sob", "Ned"], + daysMin: ["Ne", "Po", "To", "Sr", "Če", "Pe", "So", "Ne"], + months: ["Januar", "Februar", "Marec", "April", "Maj", "Junij", "Julij", "Avgust", "September", "Oktober", "November", "December"], + monthsShort: ["Jan", "Feb", "Mar", "Apr", "Maj", "Jun", "Jul", "Avg", "Sep", "Okt", "Nov", "Dec"], + today: "Danes" + }; +}(jQuery)); diff --git "a/8\343\200\201\346\226\207\347\214\256\346\225\260\346\215\256\346\214\226\346\216\230\347\263\273\347\273\237(\351\231\204\346\272\220\347\240\201)/extra_apps/xadmin/static/xadmin/vendor/bootstrap-datepicker/js/locales/bootstrap-datepicker.sv.js" "b/8\343\200\201\346\226\207\347\214\256\346\225\260\346\215\256\346\214\226\346\216\230\347\263\273\347\273\237(\351\231\204\346\272\220\347\240\201)/extra_apps/xadmin/static/xadmin/vendor/bootstrap-datepicker/js/locales/bootstrap-datepicker.sv.js" new file mode 100644 index 0000000..5cb1d0c --- /dev/null +++ "b/8\343\200\201\346\226\207\347\214\256\346\225\260\346\215\256\346\214\226\346\216\230\347\263\273\347\273\237(\351\231\204\346\272\220\347\240\201)/extra_apps/xadmin/static/xadmin/vendor/bootstrap-datepicker/js/locales/bootstrap-datepicker.sv.js" @@ -0,0 +1,14 @@ +/** + * Swedish translation for bootstrap-datepicker + * Patrik Ragnarsson + */ +;(function($){ + $.fn.datepicker.dates['sv'] = { + days: ["Söndag", "Måndag", "Tisdag", "Onsdag", "Torsdag", "Fredag", "Lördag", "Söndag"], + daysShort: ["Sön", "Mån", "Tis", "Ons", "Tor", "Fre", "Lör", "Sön"], + daysMin: ["Sö", "Må", "Ti", "On", "To", "Fr", "Lö", "Sö"], + months: ["Januari", "Februari", "Mars", "April", "Maj", "Juni", "Juli", "Augusti", "September", "Oktober", "November", "December"], + monthsShort: ["Jan", "Feb", "Mar", "Apr", "Maj", "Jun", "Jul", "Aug", "Sep", "Okt", "Nov", "Dec"], + today: "I Dag" + }; +}(jQuery)); diff --git "a/8\343\200\201\346\226\207\347\214\256\346\225\260\346\215\256\346\214\226\346\216\230\347\263\273\347\273\237(\351\231\204\346\272\220\347\240\201)/extra_apps/xadmin/static/xadmin/vendor/bootstrap-datepicker/js/locales/bootstrap-datepicker.sw.js" "b/8\343\200\201\346\226\207\347\214\256\346\225\260\346\215\256\346\214\226\346\216\230\347\263\273\347\273\237(\351\231\204\346\272\220\347\240\201)/extra_apps/xadmin/static/xadmin/vendor/bootstrap-datepicker/js/locales/bootstrap-datepicker.sw.js" new file mode 100644 index 0000000..622e0ef --- /dev/null +++ "b/8\343\200\201\346\226\207\347\214\256\346\225\260\346\215\256\346\214\226\346\216\230\347\263\273\347\273\237(\351\231\204\346\272\220\347\240\201)/extra_apps/xadmin/static/xadmin/vendor/bootstrap-datepicker/js/locales/bootstrap-datepicker.sw.js" @@ -0,0 +1,15 @@ +/** + * Swahili translation for bootstrap-datepicker + * Edwin Mugendi + * Source: http://scriptsource.org/cms/scripts/page.php?item_id=entry_detail&uid=xnfaqyzcku + */ +;(function($){ + $.fn.datepicker.dates['sw'] = { + days: ["Jumapili", "Jumatatu", "Jumanne", "Jumatano", "Alhamisi", "Ijumaa", "Jumamosi", "Jumapili"], + daysShort: ["J2", "J3", "J4", "J5", "Alh", "Ij", "J1", "J2"], + daysMin: ["2", "3", "4", "5", "A", "I", "1", "2"], + months: ["Januari", "Februari", "Machi", "Aprili", "Mei", "Juni", "Julai", "Agosti", "Septemba", "Oktoba", "Novemba", "Desemba"], + monthsShort: ["Jan", "Feb", "Mac", "Apr", "Mei", "Jun", "Jul", "Ago", "Sep", "Okt", "Nov", "Des"], + today: "Leo" + }; +}(jQuery)); diff --git "a/8\343\200\201\346\226\207\347\214\256\346\225\260\346\215\256\346\214\226\346\216\230\347\263\273\347\273\237(\351\231\204\346\272\220\347\240\201)/extra_apps/xadmin/static/xadmin/vendor/bootstrap-datepicker/js/locales/bootstrap-datepicker.th.js" "b/8\343\200\201\346\226\207\347\214\256\346\225\260\346\215\256\346\214\226\346\216\230\347\263\273\347\273\237(\351\231\204\346\272\220\347\240\201)/extra_apps/xadmin/static/xadmin/vendor/bootstrap-datepicker/js/locales/bootstrap-datepicker.th.js" new file mode 100644 index 0000000..562b063 --- /dev/null +++ "b/8\343\200\201\346\226\207\347\214\256\346\225\260\346\215\256\346\214\226\346\216\230\347\263\273\347\273\237(\351\231\204\346\272\220\347\240\201)/extra_apps/xadmin/static/xadmin/vendor/bootstrap-datepicker/js/locales/bootstrap-datepicker.th.js" @@ -0,0 +1,14 @@ +/** + * Thai translation for bootstrap-datepicker + * Suchau Jiraprapot + */ +;(function($){ + $.fn.datepicker.dates['th'] = { + days: ["อาทิตย์", "จันทร์", "อังคาร", "พุธ", "พฤหัส", "ศุกร์", "เสาร์", "อาทิตย์"], + daysShort: ["อา", "จ", "อ", "พ", "พฤ", "ศ", "ส", "อา"], + daysMin: ["อา", "จ", "อ", "พ", "พฤ", "ศ", "ส", "อา"], + months: ["มกราคม", "กุมภาพันธ์", "มีนาคม", "เมษายน", "พฤษภาคม", "มิถุนายน", "กรกฎาคม", "สิงหาคม", "กันยายน", "ตุลาคม", "พฤศจิกายน", "ธันวาคม"], + monthsShort: ["ม.ค.", "ก.พ.", "มี.ค.", "เม.ย.", "พ.ค.", "มิ.ย.", "ก.ค.", "ส.ค.", "ก.ย.", "ต.ค.", "พ.ย.", "ธ.ค."], + today: "วันนี้" + }; +}(jQuery)); diff --git "a/8\343\200\201\346\226\207\347\214\256\346\225\260\346\215\256\346\214\226\346\216\230\347\263\273\347\273\237(\351\231\204\346\272\220\347\240\201)/extra_apps/xadmin/static/xadmin/vendor/bootstrap-datepicker/js/locales/bootstrap-datepicker.tr.js" "b/8\343\200\201\346\226\207\347\214\256\346\225\260\346\215\256\346\214\226\346\216\230\347\263\273\347\273\237(\351\231\204\346\272\220\347\240\201)/extra_apps/xadmin/static/xadmin/vendor/bootstrap-datepicker/js/locales/bootstrap-datepicker.tr.js" new file mode 100644 index 0000000..e46eced --- /dev/null +++ "b/8\343\200\201\346\226\207\347\214\256\346\225\260\346\215\256\346\214\226\346\216\230\347\263\273\347\273\237(\351\231\204\346\272\220\347\240\201)/extra_apps/xadmin/static/xadmin/vendor/bootstrap-datepicker/js/locales/bootstrap-datepicker.tr.js" @@ -0,0 +1,15 @@ +/** + * Turkish translation for bootstrap-datepicker + * Serkan Algur + */ +;(function($){ + $.fn.datepicker.dates['tr'] = { + days: ["Pazar", "Pazartesi", "Salı", "Çarşamba", "Perşembe", "Cuma", "Cumartesi", "Pazar"], + daysShort: ["Pz", "Pzt", "Sal", "Çrş", "Prş", "Cu", "Cts", "Pz"], + daysMin: ["Pz", "Pzt", "Sa", "Çr", "Pr", "Cu", "Ct", "Pz"], + months: ["Ocak", "Şubat", "Mart", "Nisan", "Mayıs", "Haziran", "Temmuz", "Ağustos", "Eylül", "Ekim", "Kasım", "Aralık"], + monthsShort: ["Oca", "Şub", "Mar", "Nis", "May", "Haz", "Tem", "Ağu", "Eyl", "Eki", "Kas", "Ara"], + today: "Bugün" + }; +}(jQuery)); + diff --git "a/8\343\200\201\346\226\207\347\214\256\346\225\260\346\215\256\346\214\226\346\216\230\347\263\273\347\273\237(\351\231\204\346\272\220\347\240\201)/extra_apps/xadmin/static/xadmin/vendor/bootstrap-datepicker/js/locales/bootstrap-datepicker.uk.js" "b/8\343\200\201\346\226\207\347\214\256\346\225\260\346\215\256\346\214\226\346\216\230\347\263\273\347\273\237(\351\231\204\346\272\220\347\240\201)/extra_apps/xadmin/static/xadmin/vendor/bootstrap-datepicker/js/locales/bootstrap-datepicker.uk.js" new file mode 100644 index 0000000..bbd0c73 --- /dev/null +++ "b/8\343\200\201\346\226\207\347\214\256\346\225\260\346\215\256\346\214\226\346\216\230\347\263\273\347\273\237(\351\231\204\346\272\220\347\240\201)/extra_apps/xadmin/static/xadmin/vendor/bootstrap-datepicker/js/locales/bootstrap-datepicker.uk.js" @@ -0,0 +1,14 @@ +/** + * Ukrainian translation for bootstrap-datepicker + * Andrey Vityuk + */ +;(function($){ + $.fn.datepicker.dates['uk'] = { + days: ["Неділя", "Понеділок", "Вівторок", "Середа", "Четвер", "П'ятниця", "Субота", "Неділя"], + daysShort: ["Нед", "Пнд", "Втр", "Срд", "Чтв", "Птн", "Суб", "Нед"], + daysMin: ["Нд", "Пн", "Вт", "Ср", "Чт", "Пт", "Сб", "Нд"], + months: ["Січень", "Лютий", "Березень", "Квітень", "Травень", "Червень", "Липень", "Серпень", "Вересень", "Жовтень", "Листопад", "Грудень"], + monthsShort: ["Січ", "Лют", "Бер", "Кві", "Тра", "Чер", "Лип", "Сер", "Вер", "Жов", "Лис", "Гру"], + today: "Сьогодні" + }; +}(jQuery)); \ No newline at end of file diff --git "a/8\343\200\201\346\226\207\347\214\256\346\225\260\346\215\256\346\214\226\346\216\230\347\263\273\347\273\237(\351\231\204\346\272\220\347\240\201)/extra_apps/xadmin/static/xadmin/vendor/bootstrap-datepicker/js/locales/bootstrap-datepicker.zh-CN.js" "b/8\343\200\201\346\226\207\347\214\256\346\225\260\346\215\256\346\214\226\346\216\230\347\263\273\347\273\237(\351\231\204\346\272\220\347\240\201)/extra_apps/xadmin/static/xadmin/vendor/bootstrap-datepicker/js/locales/bootstrap-datepicker.zh-CN.js" new file mode 100644 index 0000000..7cdcd03 --- /dev/null +++ "b/8\343\200\201\346\226\207\347\214\256\346\225\260\346\215\256\346\214\226\346\216\230\347\263\273\347\273\237(\351\231\204\346\272\220\347\240\201)/extra_apps/xadmin/static/xadmin/vendor/bootstrap-datepicker/js/locales/bootstrap-datepicker.zh-CN.js" @@ -0,0 +1,14 @@ +/** + * Simplified Chinese translation for bootstrap-datepicker + * Yuan Cheung + */ +;(function($){ + $.fn.datepicker.dates['zh-CN'] = { + days: ["星期日", "星期一", "星期二", "星期三", "星期四", "星期五", "星期六", "星期日"], + daysShort: ["周日", "周一", "周二", "周三", "周四", "周五", "周六", "周日"], + daysMin: ["日", "一", "二", "三", "四", "五", "六", "日"], + months: ["一月", "二月", "三月", "四月", "五月", "六月", "七月", "八月", "九月", "十月", "十一月", "十二月"], + monthsShort: ["一月", "二月", "三月", "四月", "五月", "六月", "七月", "八月", "九月", "十月", "十一月", "十二月"], + today: "今日" + }; +}(jQuery)); diff --git "a/8\343\200\201\346\226\207\347\214\256\346\225\260\346\215\256\346\214\226\346\216\230\347\263\273\347\273\237(\351\231\204\346\272\220\347\240\201)/extra_apps/xadmin/static/xadmin/vendor/bootstrap-datepicker/js/locales/bootstrap-datepicker.zh-TW.js" "b/8\343\200\201\346\226\207\347\214\256\346\225\260\346\215\256\346\214\226\346\216\230\347\263\273\347\273\237(\351\231\204\346\272\220\347\240\201)/extra_apps/xadmin/static/xadmin/vendor/bootstrap-datepicker/js/locales/bootstrap-datepicker.zh-TW.js" new file mode 100644 index 0000000..d21afc1 --- /dev/null +++ "b/8\343\200\201\346\226\207\347\214\256\346\225\260\346\215\256\346\214\226\346\216\230\347\263\273\347\273\237(\351\231\204\346\272\220\347\240\201)/extra_apps/xadmin/static/xadmin/vendor/bootstrap-datepicker/js/locales/bootstrap-datepicker.zh-TW.js" @@ -0,0 +1,13 @@ +/** + * Traditional Chinese translation for bootstrap-datepicker + * Rung-Sheng Jang + */ +;(function($){ + $.fn.datepicker.dates['zh-TW'] = { + days: ["星期日", "星期一", "星期二", "星期三", "星期四", "星期五", "星期六", "星期日"], + daysShort: ["周日", "周一", "周二", "周三", "周四", "周五", "周六", "周日"], + daysMin: ["日", "一", "二", "三", "四", "五", "六", "日"], + months: ["一月", "二月", "三月", "四月", "五月", "六月", "七月", "八月", "九月", "十月", "十一月", "十二月"], + monthsShort: ["一月", "二月", "三月", "四月", "五月", "六月", "七月", "八月", "九月", "十月", "十一月", "十二月"] + }; +}(jQuery)); diff --git "a/8\343\200\201\346\226\207\347\214\256\346\225\260\346\215\256\346\214\226\346\216\230\347\263\273\347\273\237(\351\231\204\346\272\220\347\240\201)/extra_apps/xadmin/static/xadmin/vendor/bootstrap-image-gallery/css/bootstrap-image-gallery.css" "b/8\343\200\201\346\226\207\347\214\256\346\225\260\346\215\256\346\214\226\346\216\230\347\263\273\347\273\237(\351\231\204\346\272\220\347\240\201)/extra_apps/xadmin/static/xadmin/vendor/bootstrap-image-gallery/css/bootstrap-image-gallery.css" new file mode 100644 index 0000000..02aa7cf --- /dev/null +++ "b/8\343\200\201\346\226\207\347\214\256\346\225\260\346\215\256\346\214\226\346\216\230\347\263\273\347\273\237(\351\231\204\346\272\220\347\240\201)/extra_apps/xadmin/static/xadmin/vendor/bootstrap-image-gallery/css/bootstrap-image-gallery.css" @@ -0,0 +1,153 @@ +@charset 'UTF-8'; +/* + * Bootstrap Image Gallery CSS 2.5.3 + * https://github.com/blueimp/Bootstrap-Image-Gallery + * + * Copyright 2011, Sebastian Tschan + * https://blueimp.net + * + * Licensed under the MIT license: + * http://www.opensource.org/licenses/MIT + */ + +.modal-gallery { +} +.modal-gallery.fade.in { +} +.modal-gallery .modal-body { +} +.modal-gallery .modal-title { +} +.modal-gallery .modal-image { + position: relative; + margin: auto; + min-width: 128px; + min-height: 128px; + overflow: hidden; + cursor: pointer; +} +.modal-gallery .modal-footer { + margin-top: 0px; +} +.modal-gallery .modal-image:hover:before, +.modal-gallery .modal-image:hover:after { + content: '\2039'; + position: absolute; + top: 50%; + left: 15px; + width: 40px; + height: 40px; + margin-top: -20px; + font-size: 60px; + font-weight: 100; + line-height: 24px; + color: #ffffff; + text-align: center; + background: #222222; + border: 3px solid #ffffff; + -webkit-border-radius: 23px; + -moz-border-radius: 23px; + border-radius: 23px; + opacity: 0.5; + filter: alpha(opacity=50); + z-index: 1; +} +.modal-gallery .modal-image:hover:after { + content: '\203A'; + left: auto; + right: 15px; +} +.modal-single .modal-image:hover:before, +.modal-single .modal-image:hover:after { + display: none; +} +.modal-gallery.fade .modal-image, .modal-gallery.fade .modal-dialog { + -webkit-transition: width 0.15s ease, height 0.15s ease; + -moz-transition: width 0.15s ease, height 0.15s ease; + -ms-transition: width 0.15s ease, height 0.15s ease; + -o-transition: width 0.15s ease, height 0.15s ease; + transition: width 0.15s ease, height 0.15s ease; +} +.modal-gallery .modal-image *:not(.loader) { + position: absolute; + top: 0; +} +.modal-gallery .modal-image *:not(.loader) { + opacity: 0; + filter: alpha(opacity=0); +} +.modal-gallery .modal-image h1.loader { + height: 50%; + width: 100%; + text-align: center; + font-size: 4em; + display: none; +} +.modal-loading.modal-gallery .modal-image h1.loader { + display: block; +} +.modal-gallery.fade .modal-image * { + -webkit-transition: opacity 0.5s linear; + -moz-transition: opacity 0.5s linear; + -ms-transition: opacity 0.5s linear; + -o-transition: opacity 0.5s linear; + transition: opacity 0.5s linear; +} +.modal-gallery .modal-image *.in { + opacity: 1; + filter: alpha(opacity=100); +} +.modal-fullscreen { + border: none; + -webkit-border-radius: 0; + -moz-border-radius: 0; + border-radius: 0; + background: transparent; + overflow: hidden; +} +.modal-fullscreen.modal-loading { + border: 0; + -webkit-box-shadow: none; + -moz-box-shadow: none; + box-shadow: none; +} +.modal-fullscreen .modal-body { + padding: 0; +} +.modal-fullscreen .modal-header, +.modal-fullscreen .modal-footer { + position: absolute; + top: 0; + right: 0; + left: 0; + background: transparent; + border: 0; + -webkit-box-shadow: none; + -moz-box-shadow: none; + box-shadow: none; + opacity: 0; + z-index: 2000; +} +.modal-fullscreen .modal-footer { + top: auto; + bottom: 0; +} +.modal-fullscreen .close, +.modal-fullscreen .modal-title { + color: #fff; + text-shadow: 0 0 2px rgba(33, 33, 33, 0.8); +} +.modal-fullscreen .modal-header:hover, +.modal-fullscreen .modal-footer:hover { + opacity: 1; +} + +@media (max-width: 767px) { + .modal-gallery .btn span { + display: none; + } + .modal-fullscreen { + right: 0; + left: 0; + } +} diff --git "a/8\343\200\201\346\226\207\347\214\256\346\225\260\346\215\256\346\214\226\346\216\230\347\263\273\347\273\237(\351\231\204\346\272\220\347\240\201)/extra_apps/xadmin/static/xadmin/vendor/bootstrap-image-gallery/css/bootstrap-image-gallery.min.css" "b/8\343\200\201\346\226\207\347\214\256\346\225\260\346\215\256\346\214\226\346\216\230\347\263\273\347\273\237(\351\231\204\346\272\220\347\240\201)/extra_apps/xadmin/static/xadmin/vendor/bootstrap-image-gallery/css/bootstrap-image-gallery.min.css" new file mode 100644 index 0000000..4b7366b --- /dev/null +++ "b/8\343\200\201\346\226\207\347\214\256\346\225\260\346\215\256\346\214\226\346\216\230\347\263\273\347\273\237(\351\231\204\346\272\220\347\240\201)/extra_apps/xadmin/static/xadmin/vendor/bootstrap-image-gallery/css/bootstrap-image-gallery.min.css" @@ -0,0 +1,22 @@ +@charset 'UTF-8'; +.modal-gallery{width:auto;max-height:none;outline:none;} +.modal-gallery.fade.in{top:50%;} +.modal-gallery .modal-body{max-height:none;} +.modal-gallery .modal-title{display:inline-block;max-height:54px;overflow:hidden;} +.modal-gallery .modal-image{position:relative;margin:auto;min-width:128px;min-height:128px;overflow:hidden;cursor:pointer;} +.modal-gallery .modal-image:hover:before,.modal-gallery .modal-image:hover:after{content:'\2039';position:absolute;top:50%;left:15px;width:40px;height:40px;margin-top:-20px;font-size:60px;font-weight:100;line-height:30px;color:#ffffff;text-align:center;background:#222222;border:3px solid #ffffff;-webkit-border-radius:23px;-moz-border-radius:23px;border-radius:23px;opacity:0.5;filter:alpha(opacity=50);z-index:1;} +.modal-gallery .modal-image:hover:after{content:'\203A';left:auto;right:15px;} +.modal-single .modal-image:hover:before,.modal-single .modal-image:hover:after{display:none;} +.modal-loading .modal-image{background:url(../img/loading.gif) center no-repeat;} +.modal-gallery.fade .modal-image{-webkit-transition:width 0.15s ease, height 0.15s ease;-moz-transition:width 0.15s ease, height 0.15s ease;-ms-transition:width 0.15s ease, height 0.15s ease;-o-transition:width 0.15s ease, height 0.15s ease;transition:width 0.15s ease, height 0.15s ease;} +.modal-gallery .modal-image *{position:absolute;top:0;opacity:0;filter:alpha(opacity=0);} +.modal-gallery.fade .modal-image *{-webkit-transition:opacity 0.5s linear;-moz-transition:opacity 0.5s linear;-ms-transition:opacity 0.5s linear;-o-transition:opacity 0.5s linear;transition:opacity 0.5s linear;} +.modal-gallery .modal-image *.in{opacity:1;filter:alpha(opacity=100);} +.modal-fullscreen{border:none;-webkit-border-radius:0;-moz-border-radius:0;border-radius:0;background:transparent;overflow:hidden;} +.modal-fullscreen.modal-loading{border:0;-webkit-box-shadow:none;-moz-box-shadow:none;box-shadow:none;} +.modal-fullscreen .modal-body{padding:0;} +.modal-fullscreen .modal-header,.modal-fullscreen .modal-footer{position:absolute;top:0;right:0;left:0;background:transparent;border:0;-webkit-box-shadow:none;-moz-box-shadow:none;box-shadow:none;opacity:0;z-index:2000;} +.modal-fullscreen .modal-footer{top:auto;bottom:0;} +.modal-fullscreen .close,.modal-fullscreen .modal-title{color:#fff;text-shadow:0 0 2px rgba(33, 33, 33, 0.8);} +.modal-fullscreen .modal-header:hover,.modal-fullscreen .modal-footer:hover{opacity:1;} +@media (max-width:767px){.modal-gallery .btn span{display:none;} .modal-fullscreen{right:0;left:0;}} diff --git "a/8\343\200\201\346\226\207\347\214\256\346\225\260\346\215\256\346\214\226\346\216\230\347\263\273\347\273\237(\351\231\204\346\272\220\347\240\201)/extra_apps/xadmin/static/xadmin/vendor/bootstrap-image-gallery/img/loading.gif" "b/8\343\200\201\346\226\207\347\214\256\346\225\260\346\215\256\346\214\226\346\216\230\347\263\273\347\273\237(\351\231\204\346\272\220\347\240\201)/extra_apps/xadmin/static/xadmin/vendor/bootstrap-image-gallery/img/loading.gif" new file mode 100644 index 0000000..90f28cb Binary files /dev/null and "b/8\343\200\201\346\226\207\347\214\256\346\225\260\346\215\256\346\214\226\346\216\230\347\263\273\347\273\237(\351\231\204\346\272\220\347\240\201)/extra_apps/xadmin/static/xadmin/vendor/bootstrap-image-gallery/img/loading.gif" differ diff --git "a/8\343\200\201\346\226\207\347\214\256\346\225\260\346\215\256\346\214\226\346\216\230\347\263\273\347\273\237(\351\231\204\346\272\220\347\240\201)/extra_apps/xadmin/static/xadmin/vendor/bootstrap-image-gallery/js/bootstrap-image-gallery.js" "b/8\343\200\201\346\226\207\347\214\256\346\225\260\346\215\256\346\214\226\346\216\230\347\263\273\347\273\237(\351\231\204\346\272\220\347\240\201)/extra_apps/xadmin/static/xadmin/vendor/bootstrap-image-gallery/js/bootstrap-image-gallery.js" new file mode 100644 index 0000000..32bb4ad --- /dev/null +++ "b/8\343\200\201\346\226\207\347\214\256\346\225\260\346\215\256\346\214\226\346\216\230\347\263\273\347\273\237(\351\231\204\346\272\220\347\240\201)/extra_apps/xadmin/static/xadmin/vendor/bootstrap-image-gallery/js/bootstrap-image-gallery.js" @@ -0,0 +1,402 @@ +/* + * Bootstrap Image Gallery 2.10 + * https://github.com/blueimp/Bootstrap-Image-Gallery + * + * Copyright 2011, Sebastian Tschan + * https://blueimp.net + * + * Licensed under the MIT license: + * http://www.opensource.org/licenses/MIT + */ + +/*jslint nomen: true, regexp: true */ +/*global define, window, document, jQuery */ + +(function (factory) { + 'use strict'; + if (typeof define === 'function' && define.amd) { + // Register as an anonymous AMD module: + define([ + 'jquery', + 'load-image', + 'bootstrap' + ], factory); + } else { + // Browser globals: + factory( + window.jQuery, + window.loadImage + ); + } +}(function ($, loadImage) { + 'use strict'; + // Bootstrap Image Gallery is an extension to the Modal dialog of Twitter's + // Bootstrap toolkit, to ease navigation between a set of gallery images. + // It features transition effects, fullscreen mode and slideshow functionality. + $.extend($.fn.modal.Constructor.DEFAULTS, { + // Delegate to search gallery links from, can be anything that + // is accepted as parameter for $(): + delegate: document, + // Selector for gallery links: + selector: null, + // The filter for the selected gallery links (e.g. set to ":odd" to + // filter out label and thumbnail linking twice to the same image): + filter: '*', + // The index of the first gallery image to show: + index: 0, + // The href of the first gallery image to show (overrides index): + href: null, + // The range of images around the current one to preload: + preloadRange: 2, + // Offset of image width to viewport width: + offsetWidth: 100, + // Offset of image height to viewport height: + offsetHeight: 230, + // Set to true to display images as canvas elements: + canvas: false, + // Shows the next image after the given time in ms (0 = disabled): + slideshow: 0, + // Defines the image division for previous/next clicks: + imageClickDivision: 0.5 + }); + var originalShow = $.fn.modal.Constructor.prototype.show, + originalHide = $.fn.modal.Constructor.prototype.hide; + $.extend($.fn.modal.Constructor.prototype, { + initLinks: function () { + var $this = this, + options = this.options, + selector = options.selector || + 'a[data-target=' + options.target + ']'; + this.$links = $(options.delegate).find(selector) + .each(function (index) { + if ($this.getUrl(this) === options.href) { + options.index = index; + } + }); + if (!this.$links[options.index]) { + options.index = 0; + } + }, + getUrl: function (element) { + return element.href || $(element).data('href'); + }, + getDownloadUrl: function (element) { + return $(element).data('download'); + }, + startSlideShow: function () { + var $this = this; + if (this.options.slideshow) { + this._slideShow = window.setTimeout( + function () { + $this.next(); + }, + this.options.slideshow + ); + } + }, + stopSlideShow: function () { + window.clearTimeout(this._slideShow); + }, + toggleSlideShow: function () { + var node = this.$element.find('.modal-slideshow'); + if (this.options.slideshow) { + this.options.slideshow = 0; + this.stopSlideShow(); + } else { + this.options.slideshow = node.data('slideshow') || 5000; + this.startSlideShow(); + } + node.find('i').toggleClass('icon-play icon-pause'); + }, + preloadImages: function () { + var options = this.options, + range = options.index + options.preloadRange + 1, + link, + i; + for (i = options.index - options.preloadRange; i < range; i += 1) { + link = this.$links[i]; + if (link && i !== options.index) { + $('').prop('src', this.getUrl(link)); + } + } + }, + loadImage: function () { + var $this = this, + modal = this.$element, + index = this.options.index, + url = this.getUrl(this.$links[index]), + download = this.getDownloadUrl(this.$links[index]), + oldImg; + this.abortLoad(); + this.stopSlideShow(); + modal.trigger('beforeLoad'); + // The timeout prevents displaying a loading status, + // if the image has already been loaded: + this._loadingTimeout = window.setTimeout(function () { + modal.addClass('modal-loading'); + }, 100); + oldImg = modal.find('.modal-image').children('img').removeClass('in'); + // The timeout allows transition effects to finish: + window.setTimeout(function () { + oldImg.remove(); + }, 3000); + modal.find('.modal-title').text(this.$links[index].title); + modal.find('.modal-download').prop( + 'href', + download || url + ); + this._loadingImage = loadImage( + url, + function (img) { + $this.img = img; + window.clearTimeout($this._loadingTimeout); + modal.removeClass('modal-loading'); + modal.trigger('load'); + $this.showImage(img); + $this.startSlideShow(); + }, + this._loadImageOptions + ); + this.preloadImages(); + }, + showImage: function (img) { + var modal = this.$element, + transition = $.support.transition && modal.hasClass('fade'), + method = transition ? modal.animate : modal.css, + modalImage = modal.find('.modal-image'), + clone, + forceReflow; + modalImage.css({ + width: img.width, + height: img.height + }); + if ($(window).width() > 767) { + modal.find('.modal-dialog').css({width: Math.max(img.width + 60, 450)}); + } + // modal.find('.modal-title').css({ width: Math.max(img.width, 380) }); + // if (transition) { + // clone = modal.clone().hide().appendTo(document.body); + // } + // // if ($(window).width() > 767) { + // // method.call(modal.stop(), { + // // 'margin-top': -((clone || modal).outerHeight() / 2), + // // 'margin-left': -((clone || modal).outerWidth() / 2) + // // }); + // // } else { + // // modal.css({ + // // top: ($(window).height() - (clone || modal).outerHeight()) / 2 + // // }); + // // } + // if (clone) { + // clone.remove(); + // } + modalImage.append(img); + forceReflow = img.offsetWidth; + modal.trigger('display'); + if (transition) { + if (modal.is(':visible')) { + $(img).on( + $.support.transition.end, + function (e) { + // Make sure we don't respond to other transitions events + // in the container element, e.g. from button elements: + if (e.target === img) { + $(img).off($.support.transition.end); + modal.trigger('displayed'); + } + } + ).addClass('in'); + } else { + $(img).addClass('in'); + modal.one('shown', function () { + modal.trigger('displayed'); + }); + } + } else { + $(img).addClass('in'); + modal.trigger('displayed'); + } + }, + abortLoad: function () { + if (this._loadingImage) { + this._loadingImage.onload = this._loadingImage.onerror = null; + } + window.clearTimeout(this._loadingTimeout); + }, + prev: function () { + var options = this.options; + options.index -= 1; + if (options.index < 0) { + options.index = this.$links.length - 1; + } + this.loadImage(); + }, + next: function () { + var options = this.options; + options.index += 1; + if (options.index > this.$links.length - 1) { + options.index = 0; + } + this.loadImage(); + }, + keyHandler: function (e) { + switch (e.which) { + case 37: // left + case 38: // up + e.preventDefault(); + this.prev(); + break; + case 39: // right + case 40: // down + e.preventDefault(); + this.next(); + break; + } + }, + wheelHandler: function (e) { + e.preventDefault(); + e = e.originalEvent; + this._wheelCounter = this._wheelCounter || 0; + this._wheelCounter += (e.wheelDelta || e.detail || 0); + if ((e.wheelDelta && this._wheelCounter >= 120) || + (!e.wheelDelta && this._wheelCounter < 0)) { + this.prev(); + this._wheelCounter = 0; + } else if ((e.wheelDelta && this._wheelCounter <= -120) || + (!e.wheelDelta && this._wheelCounter > 0)) { + this.next(); + this._wheelCounter = 0; + } + }, + initGalleryEvents: function () { + var $this = this, + modal = this.$element; + modal.find('.modal-image').on('click.modal-gallery', function (e) { + var modalImage = $(this); + if ($this.$links.length === 1) { + $this.hide(); + } else { + if ((e.pageX - modalImage.offset().left) / modalImage.width() < + $this.options.imageClickDivision) { + $this.prev(e); + } else { + $this.next(e); + } + } + }); + modal.find('.modal-prev').on('click.modal-gallery', function (e) { + $this.prev(e); + }); + modal.find('.modal-next').on('click.modal-gallery', function (e) { + $this.next(e); + }); + modal.find('.modal-slideshow').on('click.modal-gallery', function (e) { + $this.toggleSlideShow(e); + }); + $(document) + .on('keydown.modal-gallery', function (e) { + $this.keyHandler(e); + }) + .on( + 'mousewheel.modal-gallery, DOMMouseScroll.modal-gallery', + function (e) { + $this.wheelHandler(e); + } + ); + }, + destroyGalleryEvents: function () { + var modal = this.$element; + this.abortLoad(); + this.stopSlideShow(); + modal.find('.modal-image, .modal-prev, .modal-next, .modal-slideshow') + .off('click.modal-gallery'); + $(document) + .off('keydown.modal-gallery') + .off('mousewheel.modal-gallery, DOMMouseScroll.modal-gallery'); + }, + show: function () { + if (!this.isShown && this.$element.hasClass('modal-gallery')) { + var modal = this.$element, + options = this.options, + windowWidth = $(window).width(), + windowHeight = $(window).height(); + if (modal.hasClass('modal-fullscreen')) { + this._loadImageOptions = { + maxWidth: windowWidth, + maxHeight: windowHeight, + canvas: options.canvas + }; + if (modal.hasClass('modal-fullscreen-stretch')) { + this._loadImageOptions.minWidth = windowWidth; + this._loadImageOptions.minHeight = windowHeight; + } + } else { + this._loadImageOptions = { + maxWidth: windowWidth - options.offsetWidth, + maxHeight: windowHeight - options.offsetHeight, + canvas: options.canvas + }; + } + // if (windowWidth > 767) { + // modal.css({ + // 'margin-top': -(modal.outerHeight() / 2), + // 'margin-left': -(modal.outerWidth() / 2) + // }); + // } else { + // modal.css({ + // top: ($(window).height() - modal.outerHeight()) / 2 + // }); + // } + this.initGalleryEvents(); + this.initLinks(); + if (this.$links.length) { + modal.find('.modal-slideshow, .modal-prev, .modal-next') + .toggle(this.$links.length !== 1); + modal.toggleClass( + 'modal-single', + this.$links.length === 1 + ); + this.loadImage(); + } + } + originalShow.apply(this, arguments); + }, + hide: function () { + if (this.isShown && this.$element.hasClass('modal-gallery')) { + this.options.delegate = document; + this.options.href = null; + this.destroyGalleryEvents(); + } + originalHide.apply(this, arguments); + } + }); + $(function () { + $(document.body).on( + 'click.modal-gallery.data-api', + '[data-toggle="modal-gallery"]', + function (e) { + var $this = $(this), + options = $this.data(), + modal = $(options.target), + data = modal.data('bs.modal'), + link; + if (!data) { + options = $.extend(modal.data(), options); + } + if (!options.selector) { + options.selector = 'a[data-gallery=gallery]'; + } + link = $(e.target).closest(options.selector); + if (link.length && modal.length) { + e.preventDefault(); + options.href = link.prop('href') || link.data('href'); + options.delegate = link[0] !== this ? this : document; + if (data) { + $.extend(data.options, options); + } + modal.modal(options); + } + } + ); + }); +})); diff --git "a/8\343\200\201\346\226\207\347\214\256\346\225\260\346\215\256\346\214\226\346\216\230\347\263\273\347\273\237(\351\231\204\346\272\220\347\240\201)/extra_apps/xadmin/static/xadmin/vendor/bootstrap-image-gallery/js/bootstrap-image-gallery.min.js" "b/8\343\200\201\346\226\207\347\214\256\346\225\260\346\215\256\346\214\226\346\216\230\347\263\273\347\273\237(\351\231\204\346\272\220\347\240\201)/extra_apps/xadmin/static/xadmin/vendor/bootstrap-image-gallery/js/bootstrap-image-gallery.min.js" new file mode 100644 index 0000000..e8662f0 --- /dev/null +++ "b/8\343\200\201\346\226\207\347\214\256\346\225\260\346\215\256\346\214\226\346\216\230\347\263\273\347\273\237(\351\231\204\346\272\220\347\240\201)/extra_apps/xadmin/static/xadmin/vendor/bootstrap-image-gallery/js/bootstrap-image-gallery.min.js" @@ -0,0 +1 @@ +(function(a){"use strict",typeof define=="function"&&define.amd?define(["jquery","load-image","bootstrap"],a):a(window.jQuery,window.loadImage)})(function(a,b){"use strict",a.extend(a.fn.modal.defaults,{delegate:document,selector:null,filter:"*",index:0,href:null,preloadRange:2,offsetWidth:100,offsetHeight:200,canvas:!1,slideshow:0,imageClickDivision:.5});var c=a.fn.modal.Constructor.prototype.show,d=a.fn.modal.Constructor.prototype.hide;a.extend(a.fn.modal.Constructor.prototype,{initLinks:function(){var b=this,c=this.options,d=c.selector||"a[data-target="+c.target+"]";this.$links=a(c.delegate).find(d).filter(c.filter).each(function(a){b.getUrl(this)===c.href&&(c.index=a)}),this.$links[c.index]||(c.index=0)},getUrl:function(b){return b.href||a(b).data("href")},getDownloadUrl:function(b){return a(b).data("download")},startSlideShow:function(){var a=this;this.options.slideshow&&(this._slideShow=window.setTimeout(function(){a.next()},this.options.slideshow))},stopSlideShow:function(){window.clearTimeout(this._slideShow)},toggleSlideShow:function(){var a=this.$element.find(".modal-slideshow");this.options.slideshow?(this.options.slideshow=0,this.stopSlideShow()):(this.options.slideshow=a.data("slideshow")||5e3,this.startSlideShow()),a.find("i").toggleClass("icon-play icon-pause")},preloadImages:function(){var b=this.options,c=b.index+b.preloadRange+1,d,e;for(e=b.index-b.preloadRange;e").prop("src",this.getUrl(d))},loadImage:function(){var a=this,c=this.$element,d=this.options.index,e=this.getUrl(this.$links[d]),f=this.getDownloadUrl(this.$links[d]),g;this.abortLoad(),this.stopSlideShow(),c.trigger("beforeLoad"),this._loadingTimeout=window.setTimeout(function(){c.addClass("modal-loading")},100),g=c.find(".modal-image").children().removeClass("in"),window.setTimeout(function(){g.remove()},3e3),c.find(".modal-title").text(this.$links[d].title),c.find(".modal-download").prop("href",f||e),this._loadingImage=b(e,function(b){a.img=b,window.clearTimeout(a._loadingTimeout),c.removeClass("modal-loading"),c.trigger("load"),a.showImage(b),a.startSlideShow()},this._loadImageOptions),this.preloadImages()},showImage:function(b){var c=this.$element,d=a.support.transition&&c.hasClass("fade"),e=d?c.animate:c.css,f=c.find(".modal-image"),g,h;f.css({width:b.width,height:b.height}),c.find(".modal-title").css({width:Math.max(b.width,380)}),d&&(g=c.clone().hide().appendTo(document.body)),a(window).width()>767?e.call(c.stop(),{"margin-top":-((g||c).outerHeight()/2),"margin-left":-((g||c).outerWidth()/2)}):c.css({top:(a(window).height()-(g||c).outerHeight())/2}),g&&g.remove(),f.append(b),h=b.offsetWidth,c.trigger("display"),d?c.is(":visible")?a(b).on(a.support.transition.end,function(d){d.target===b&&(a(b).off(a.support.transition.end),c.trigger("displayed"))}).addClass("in"):(a(b).addClass("in"),c.one("shown",function(){c.trigger("displayed")})):(a(b).addClass("in"),c.trigger("displayed"))},abortLoad:function(){this._loadingImage&&(this._loadingImage.onload=this._loadingImage.onerror=null),window.clearTimeout(this._loadingTimeout)},prev:function(){var a=this.options;a.index-=1,a.index<0&&(a.index=this.$links.length-1),this.loadImage()},next:function(){var a=this.options;a.index+=1,a.index>this.$links.length-1&&(a.index=0),this.loadImage()},keyHandler:function(a){switch(a.which){case 37:case 38:a.preventDefault(),this.prev();break;case 39:case 40:a.preventDefault(),this.next()}},wheelHandler:function(a){a.preventDefault(),a=a.originalEvent,this._wheelCounter=this._wheelCounter||0,this._wheelCounter+=a.wheelDelta||a.detail||0;if(a.wheelDelta&&this._wheelCounter>=120||!a.wheelDelta&&this._wheelCounter<0)this.prev(),this._wheelCounter=0;else if(a.wheelDelta&&this._wheelCounter<=-120||!a.wheelDelta&&this._wheelCounter>0)this.next(),this._wheelCounter=0},initGalleryEvents:function(){var b=this,c=this.$element;c.find(".modal-image").on("click.modal-gallery",function(c){var d=a(this);b.$links.length===1?b.hide():(c.pageX-d.offset().left)/d.width()767?b.css({"margin-top":-(b.outerHeight()/2),"margin-left":-(b.outerWidth()/2)}):b.css({top:(a(window).height()-b.outerHeight())/2}),this.initGalleryEvents(),this.initLinks(),this.$links.length&&(b.find(".modal-slideshow, .modal-prev, .modal-next").toggle(this.$links.length!==1),b.toggleClass("modal-single",this.$links.length===1),this.loadImage())}c.apply(this,arguments)},hide:function(){this.isShown&&this.$element.hasClass("modal-gallery")&&(this.options.delegate=document,this.options.href=null,this.destroyGalleryEvents()),d.apply(this,arguments)}}),a(function(){a(document.body).on("click.modal-gallery.data-api",'[data-toggle="modal-gallery"]',function(b){var c=a(this),d=c.data(),e=a(d.target),f=e.data("modal"),g;f||(d=a.extend(e.data(),d)),d.selector||(d.selector="a[data-gallery=gallery]"),g=a(b.target).closest(d.selector),g.length&&e.length&&(b.preventDefault(),d.href=g.prop("href")||g.data("href"),d.delegate=g[0]!==this?this:document,f&&a.extend(f.options,d),e.modal(d))})})}); \ No newline at end of file diff --git "a/8\343\200\201\346\226\207\347\214\256\346\225\260\346\215\256\346\214\226\346\216\230\347\263\273\347\273\237(\351\231\204\346\272\220\347\240\201)/extra_apps/xadmin/static/xadmin/vendor/bootstrap-modal/css/bootstrap-modal.css" "b/8\343\200\201\346\226\207\347\214\256\346\225\260\346\215\256\346\214\226\346\216\230\347\263\273\347\273\237(\351\231\204\346\272\220\347\240\201)/extra_apps/xadmin/static/xadmin/vendor/bootstrap-modal/css/bootstrap-modal.css" new file mode 100644 index 0000000..76e3be2 --- /dev/null +++ "b/8\343\200\201\346\226\207\347\214\256\346\225\260\346\215\256\346\214\226\346\216\230\347\263\273\347\273\237(\351\231\204\346\272\220\347\240\201)/extra_apps/xadmin/static/xadmin/vendor/bootstrap-modal/css/bootstrap-modal.css" @@ -0,0 +1,214 @@ +/*! + * Bootstrap Modal + * + * Copyright Jordan Schroter + * Licensed under the Apache License v2.0 + * http://www.apache.org/licenses/LICENSE-2.0 + * + */ + +.modal-open { + overflow: hidden; +} + + +/* add a scroll bar to stop page from jerking around */ +.modal-open.page-overflow .page-container, +.modal-open.page-overflow .page-container .navbar-fixed-top, +.modal-open.page-overflow .page-container .navbar-fixed-bottom, +.modal-open.page-overflow .modal-scrollable { + overflow-y: scroll; +} + +@media (max-width: 979px) { + .modal-open.page-overflow .page-container .navbar-fixed-top, + .modal-open.page-overflow .page-container .navbar-fixed-bottom { + overflow-y: visible; + } +} + + +.modal-scrollable { + position: fixed; + top: 0; + bottom: 0; + left: 0; + right: 0; + overflow: auto; +} + +.modal { + outline: none; + position: absolute; + margin-top: 0; + top: 50%; + overflow: visible; /* allow content to popup out (i.e tooltips) */ +} + +.modal.fade { + top: -100%; + -webkit-transition: opacity 0.3s linear, top 0.3s ease-out, bottom 0.3s ease-out, margin-top 0.3s ease-out; + -moz-transition: opacity 0.3s linear, top 0.3s ease-out, bottom 0.3s ease-out, margin-top 0.3s ease-out; + -o-transition: opacity 0.3s linear, top 0.3s ease-out, bottom 0.3s ease-out, margin-top 0.3s ease-out; + transition: opacity 0.3s linear, top 0.3s ease-out, bottom 0.3s ease-out, margin-top 0.3s ease-out; +} + +.modal.fade.in { + top: 50%; +} + +.modal-body { + max-height: none; + overflow: visible; +} + +.modal.modal-absolute { + position: absolute; + z-index: 950; +} + +.modal .loading-mask { + position: absolute; + top: 0; + bottom: 0; + left: 0; + right: 0; + background: #fff; + border-radius: 6px; +} + +.modal-backdrop.modal-absolute{ + position: absolute; + z-index: 940; +} + +.modal-backdrop, +.modal-backdrop.fade.in{ + opacity: 0.7; + filter: alpha(opacity=70); + background: #fff; +} + +.modal.container { + width: 940px; + margin-left: -470px; +} + +/* Modal Overflow */ + +.modal-overflow.modal { + top: 1%; +} + +.modal-overflow.modal.fade { + top: -100%; +} + +.modal-overflow.modal.fade.in { + top: 1%; +} + +.modal-overflow .modal-body { + overflow: auto; + -webkit-overflow-scrolling: touch; +} + +/* Responsive */ + +@media (min-width: 1200px) { + .modal.container { + width: 1170px; + margin-left: -585px; + } +} + +@media (max-width: 979px) { + .modal, + .modal.container, + .modal.modal-overflow { + top: 1%; + right: 1%; + left: 1%; + bottom: auto; + width: auto !important; + height: auto !important; + margin: 0 !important; + padding: 0 !important; + } + + .modal.fade.in, + .modal.container.fade.in, + .modal.modal-overflow.fade.in { + top: 1%; + bottom: auto; + } + + .modal-body, + .modal-overflow .modal-body { + position: static; + margin: 0; + height: auto !important; + max-height: none !important; + overflow: visible !important; + } + + .modal-footer, + .modal-overflow .modal-footer { + position: static; + } +} + +.loading-spinner { + position: absolute; + top: 50%; + left: 50%; + margin: -12px 0 0 -12px; +} + +/* +Animate.css - http://daneden.me/animate +Licensed under the ☺ license (http://licence.visualidiot.com/) + +Copyright (c) 2012 Dan Eden*/ + +.animated { + -webkit-animation-duration: 1s; + -moz-animation-duration: 1s; + -o-animation-duration: 1s; + animation-duration: 1s; + -webkit-animation-fill-mode: both; + -moz-animation-fill-mode: both; + -o-animation-fill-mode: both; + animation-fill-mode: both; +} + +@-webkit-keyframes shake { + 0%, 100% {-webkit-transform: translateX(0);} + 10%, 30%, 50%, 70%, 90% {-webkit-transform: translateX(-10px);} + 20%, 40%, 60%, 80% {-webkit-transform: translateX(10px);} +} + +@-moz-keyframes shake { + 0%, 100% {-moz-transform: translateX(0);} + 10%, 30%, 50%, 70%, 90% {-moz-transform: translateX(-10px);} + 20%, 40%, 60%, 80% {-moz-transform: translateX(10px);} +} + +@-o-keyframes shake { + 0%, 100% {-o-transform: translateX(0);} + 10%, 30%, 50%, 70%, 90% {-o-transform: translateX(-10px);} + 20%, 40%, 60%, 80% {-o-transform: translateX(10px);} +} + +@keyframes shake { + 0%, 100% {transform: translateX(0);} + 10%, 30%, 50%, 70%, 90% {transform: translateX(-10px);} + 20%, 40%, 60%, 80% {transform: translateX(10px);} +} + +.shake { + -webkit-animation-name: shake; + -moz-animation-name: shake; + -o-animation-name: shake; + animation-name: shake; +} diff --git "a/8\343\200\201\346\226\207\347\214\256\346\225\260\346\215\256\346\214\226\346\216\230\347\263\273\347\273\237(\351\231\204\346\272\220\347\240\201)/extra_apps/xadmin/static/xadmin/vendor/bootstrap-modal/img/ajax-loader.gif" "b/8\343\200\201\346\226\207\347\214\256\346\225\260\346\215\256\346\214\226\346\216\230\347\263\273\347\273\237(\351\231\204\346\272\220\347\240\201)/extra_apps/xadmin/static/xadmin/vendor/bootstrap-modal/img/ajax-loader.gif" new file mode 100644 index 0000000..4e651ed Binary files /dev/null and "b/8\343\200\201\346\226\207\347\214\256\346\225\260\346\215\256\346\214\226\346\216\230\347\263\273\347\273\237(\351\231\204\346\272\220\347\240\201)/extra_apps/xadmin/static/xadmin/vendor/bootstrap-modal/img/ajax-loader.gif" differ diff --git "a/8\343\200\201\346\226\207\347\214\256\346\225\260\346\215\256\346\214\226\346\216\230\347\263\273\347\273\237(\351\231\204\346\272\220\347\240\201)/extra_apps/xadmin/static/xadmin/vendor/bootstrap-modal/js/bootstrap-modal.js" "b/8\343\200\201\346\226\207\347\214\256\346\225\260\346\215\256\346\214\226\346\216\230\347\263\273\347\273\237(\351\231\204\346\272\220\347\240\201)/extra_apps/xadmin/static/xadmin/vendor/bootstrap-modal/js/bootstrap-modal.js" new file mode 100644 index 0000000..0e39e9b --- /dev/null +++ "b/8\343\200\201\346\226\207\347\214\256\346\225\260\346\215\256\346\214\226\346\216\230\347\263\273\347\273\237(\351\231\204\346\272\220\347\240\201)/extra_apps/xadmin/static/xadmin/vendor/bootstrap-modal/js/bootstrap-modal.js" @@ -0,0 +1,374 @@ +/* =========================================================== + * bootstrap-modal.js v2.1 + * =========================================================== + * Copyright 2012 Jordan Schroter + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ========================================================== */ + + +!function ($) { + + "use strict"; // jshint ;_; + + /* MODAL CLASS DEFINITION + * ====================== */ + + var Modal = function (element, options) { + this.init(element, options); + }; + + Modal.prototype = { + + constructor: Modal, + + init: function (element, options) { + this.options = options; + + this.$element = $(element) + .delegate('[data-dismiss="modal"]', 'click.dismiss.modal', $.proxy(this.hide, this)); + + this.options.remote && this.$element.find('.modal-body').load(this.options.remote); + + var manager = typeof this.options.manager === 'function' ? + this.options.manager.call(this) : this.options.manager; + + manager = manager.appendModal ? + manager : $(manager).modalmanager().data('modalmanager'); + + manager.appendModal(this); + }, + + toggle: function () { + return this[!this.isShown ? 'show' : 'hide'](); + }, + + show: function () { + var e = $.Event('show'); + + if (this.isShown) return; + + this.$element.triggerHandler(e); + + if (e.isDefaultPrevented()) return; + + this.escape(); + + this.tab(); + + this.options.loading && this.loading(); + }, + + hide: function (e) { + e && e.preventDefault(); + + e = $.Event('hide'); + + this.$element.triggerHandler(e); + + if (!this.isShown || e.isDefaultPrevented()) return (this.isShown = false); + + this.isShown = false; + + this.escape(); + + this.tab(); + + this.isLoading && this.loading(); + + $(document).off('focusin.modal'); + + this.$element + .removeClass('in') + .removeClass('animated') + .removeClass(this.options.attentionAnimation) + .removeClass('modal-overflow') + .attr('aria-hidden', true); + + $.support.transition && this.$element.hasClass('fade') ? + this.hideWithTransition() : + this.hideModal(); + }, + + layout: function () { + var prop = this.options.height ? 'height' : 'max-height', + value = this.options.height || this.options.maxHeight; + + if (this.options.width){ + this.$element.css('width', this.options.width); + + var that = this; + this.$element.css('margin-left', function () { + if (/%/ig.test(that.options.width)){ + return -(parseInt(that.options.width) / 2) + '%'; + } else { + return -($(this).width() / 2) + 'px'; + } + }); + } else { + this.$element.css('width', ''); + this.$element.css('margin-left', ''); + } + + this.$element.find('.modal-body') + .css('overflow', '') + .css(prop, ''); + + var modalOverflow = $(window).height() - 10 < this.$element.height(); + + if (value){ + this.$element.find('.modal-body') + .css('overflow', 'auto') + .css(prop, value); + } + + if (modalOverflow || this.options.modalOverflow) { + this.$element + .css('margin-top', 0) + .addClass('modal-overflow'); + } else { + this.$element + .css('margin-top', 0 - this.$element.height() / 2) + .removeClass('modal-overflow'); + } + }, + + tab: function () { + var that = this; + + if (this.isShown && this.options.consumeTab) { + this.$element.on('keydown.tabindex.modal', '[data-tabindex]', function (e) { + if (e.keyCode && e.keyCode == 9){ + var $next = $(this), + $rollover = $(this); + + that.$element.find('[data-tabindex]:enabled:not([readonly])').each(function (e) { + if (!e.shiftKey){ + $next = $next.data('tabindex') < $(this).data('tabindex') ? + $next = $(this) : + $rollover = $(this); + } else { + $next = $next.data('tabindex') > $(this).data('tabindex') ? + $next = $(this) : + $rollover = $(this); + } + }); + + $next[0] !== $(this)[0] ? + $next.focus() : $rollover.focus(); + + e.preventDefault(); + } + }); + } else if (!this.isShown) { + this.$element.off('keydown.tabindex.modal'); + } + }, + + escape: function () { + var that = this; + if (this.isShown && this.options.keyboard) { + if (!this.$element.attr('tabindex')) this.$element.attr('tabindex', -1); + + this.$element.on('keyup.dismiss.modal', function (e) { + e.which == 27 && that.hide(); + }); + } else if (!this.isShown) { + this.$element.off('keyup.dismiss.modal') + } + }, + + hideWithTransition: function () { + var that = this + , timeout = setTimeout(function () { + that.$element.off($.support.transition.end); + that.hideModal(); + }, 500); + + this.$element.one($.support.transition.end, function () { + clearTimeout(timeout); + that.hideModal(); + }); + }, + + hideModal: function () { + this.$element + .hide() + .triggerHandler('hidden'); + + var prop = this.options.height ? 'height' : 'max-height'; + var value = this.options.height || this.options.maxHeight; + + if (value){ + this.$element.find('.modal-body') + .css('overflow', '') + .css(prop, ''); + } + + }, + + removeLoading: function () { + this.$loading.remove(); + this.$loading = null; + this.isLoading = false; + }, + + loading: function (callback) { + callback = callback || function () {}; + + var animate = this.$element.hasClass('fade') ? 'fade' : ''; + + if (!this.isLoading) { + var doAnimate = $.support.transition && animate; + + this.$loading = $('
    ') + .append(this.options.spinner) + .appendTo(this.$element); + + if (doAnimate) this.$loading[0].offsetWidth; // force reflow + + this.$loading.addClass('in'); + + this.isLoading = true; + + doAnimate ? + this.$loading.one($.support.transition.end, callback) : + callback(); + + } else if (this.isLoading && this.$loading) { + this.$loading.removeClass('in'); + + var that = this; + $.support.transition && this.$element.hasClass('fade')? + this.$loading.one($.support.transition.end, function () { that.removeLoading() }) : + that.removeLoading(); + + } else if (callback) { + callback(this.isLoading); + } + }, + + focus: function () { + var $focusElem = this.$element.find(this.options.focusOn); + + $focusElem = $focusElem.length ? $focusElem : this.$element; + + $focusElem.focus(); + }, + + attention: function (){ + // NOTE: transitionEnd with keyframes causes odd behaviour + + if (this.options.attentionAnimation){ + this.$element + .removeClass('animated') + .removeClass(this.options.attentionAnimation); + + var that = this; + + setTimeout(function () { + that.$element + .addClass('animated') + .addClass(that.options.attentionAnimation); + }, 0); + } + + + this.focus(); + }, + + + destroy: function () { + var e = $.Event('destroy'); + this.$element.triggerHandler(e); + if (e.isDefaultPrevented()) return; + + this.teardown(); + }, + + teardown: function () { + if (!this.$parent.length){ + this.$element.remove(); + this.$element = null; + return; + } + + if (this.$parent !== this.$element.parent()){ + this.$element.appendTo(this.$parent); + } + + this.$element.off('.modal'); + this.$element.removeData('modal'); + this.$element + .removeClass('in') + .attr('aria-hidden', true); + } + }; + + + /* MODAL PLUGIN DEFINITION + * ======================= */ + + $.fn.modal = function (option, args) { + return this.each(function () { + var $this = $(this), + data = $this.data('modal'), + options = $.extend({}, $.fn.modal.defaults, $this.data(), typeof option == 'object' && option); + + if (!data) $this.data('modal', (data = new Modal(this, options))); + if (typeof option == 'string') data[option].apply(data, [].concat(args)); + else if (options.show) data.show() + }) + }; + + $.fn.modal.defaults = { + keyboard: true, + backdrop: true, + loading: false, + show: true, + width: null, + height: null, + maxHeight: null, + modalOverflow: false, + consumeTab: true, + focusOn: null, + replace: false, + resize: false, + attentionAnimation: 'shake', + manager: 'body', + spinner: '
    ' + }; + + $.fn.modal.Constructor = Modal; + + + /* MODAL DATA-API + * ============== */ + + $(function () { + $(document).off('.modal').on('click.modal.data-api', '[data-toggle="modal"]', function ( e ) { + var $this = $(this), + href = $this.attr('href'), + $target = $($this.attr('data-target') || (href && href.replace(/.*(?=#[^\s]+$)/, ''))), //strip for ie7 + option = $target.data('modal') ? 'toggle' : $.extend({ remote: !/#/.test(href) && href }, $target.data(), $this.data()); + + e.preventDefault(); + $target + .modal(option) + .one('hide', function () { + $this.focus(); + }) + }); + }); + +}(window.jQuery); diff --git "a/8\343\200\201\346\226\207\347\214\256\346\225\260\346\215\256\346\214\226\346\216\230\347\263\273\347\273\237(\351\231\204\346\272\220\347\240\201)/extra_apps/xadmin/static/xadmin/vendor/bootstrap-modal/js/bootstrap-modalmanager.js" "b/8\343\200\201\346\226\207\347\214\256\346\225\260\346\215\256\346\214\226\346\216\230\347\263\273\347\273\237(\351\231\204\346\272\220\347\240\201)/extra_apps/xadmin/static/xadmin/vendor/bootstrap-modal/js/bootstrap-modalmanager.js" new file mode 100644 index 0000000..1373a47 --- /dev/null +++ "b/8\343\200\201\346\226\207\347\214\256\346\225\260\346\215\256\346\214\226\346\216\230\347\263\273\347\273\237(\351\231\204\346\272\220\347\240\201)/extra_apps/xadmin/static/xadmin/vendor/bootstrap-modal/js/bootstrap-modalmanager.js" @@ -0,0 +1,412 @@ +/* =========================================================== + * bootstrap-modalmanager.js v2.1 + * =========================================================== + * Copyright 2012 Jordan Schroter. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ========================================================== */ + +!function ($) { + + "use strict"; // jshint ;_; + + /* MODAL MANAGER CLASS DEFINITION + * ====================== */ + + var ModalManager = function (element, options) { + this.init(element, options); + }; + + ModalManager.prototype = { + + constructor: ModalManager, + + init: function (element, options) { + this.$element = $(element); + this.options = $.extend({}, $.fn.modalmanager.defaults, this.$element.data(), typeof options == 'object' && options); + this.stack = []; + this.backdropCount = 0; + + if (this.options.resize) { + var resizeTimeout, + that = this; + + $(window).on('resize.modal', function(){ + resizeTimeout && clearTimeout(resizeTimeout); + resizeTimeout = setTimeout(function(){ + for (var i = 0; i < that.stack.length; i++){ + that.stack[i].isShown && that.stack[i].layout(); + } + }, 10); + }); + } + }, + + createModal: function (element, options) { + $(element).modal($.extend({ manager: this }, options)); + }, + + appendModal: function (modal) { + this.stack.push(modal); + + var that = this; + + modal.$element.on('show.modalmanager', targetIsSelf(function (e) { + + var showModal = function(){ + modal.isShown = true; + + var transition = $.support.transition && modal.$element.hasClass('fade'); + + that.$element + .toggleClass('modal-open', that.hasOpenModal()) + .toggleClass('page-overflow', $(window).height() < that.$element.height()); + + modal.$parent = modal.$element.parent(); + + modal.$container = that.createContainer(modal); + + modal.$element.appendTo(modal.$container); + + that.backdrop(modal, function () { + + modal.$element.show(); + + if (transition) { + //modal.$element[0].style.display = 'run-in'; + modal.$element[0].offsetWidth; + //modal.$element.one($.support.transition.end, function () { modal.$element[0].style.display = 'block' }); + } + + modal.layout(); + + modal.$element + .addClass('in') + .attr('aria-hidden', false); + + var complete = function () { + that.setFocus(); + modal.$element.triggerHandler('shown'); + }; + + transition ? + modal.$element.one($.support.transition.end, complete) : + complete(); + }); + }; + + modal.options.replace ? + that.replace(showModal) : + showModal(); + })); + + modal.$element.on('hidden.modalmanager', targetIsSelf(function (e) { + + that.backdrop(modal); + + if (modal.$backdrop){ + $.support.transition && modal.$element.hasClass('fade') ? + modal.$backdrop.one($.support.transition.end, function () { that.destroyModal(modal) }) : + that.destroyModal(modal); + } else { + that.destroyModal(modal); + } + + })); + + modal.$element.on('destroy.modalmanager', targetIsSelf(function (e) { + that.removeModal(modal); + })); + + }, + + destroyModal: function (modal) { + + modal.destroy(); + + var hasOpenModal = this.hasOpenModal(); + + this.$element.toggleClass('modal-open', hasOpenModal); + + if (!hasOpenModal){ + this.$element.removeClass('page-overflow'); + } + + this.removeContainer(modal); + + this.setFocus(); + }, + + hasOpenModal: function () { + for (var i = 0; i < this.stack.length; i++){ + if (this.stack[i].isShown) return true; + } + + return false; + }, + + setFocus: function () { + var topModal; + + for (var i = 0; i < this.stack.length; i++){ + if (this.stack[i].isShown) topModal = this.stack[i]; + } + + if (!topModal) return; + + topModal.focus(); + + }, + + removeModal: function (modal) { + modal.$element.off('.modalmanager'); + if (modal.$backdrop) this.removeBackdrop.call(modal); + this.stack.splice(this.getIndexOfModal(modal), 1); + }, + + getModalAt: function (index) { + return this.stack[index]; + }, + + getIndexOfModal: function (modal) { + for (var i = 0; i < this.stack.length; i++){ + if (modal === this.stack[i]) return i; + } + }, + + replace: function (callback) { + var topModal; + + for (var i = 0; i < this.stack.length; i++){ + if (this.stack[i].isShown) topModal = this.stack[i]; + } + + if (topModal) { + this.$backdropHandle = topModal.$backdrop; + topModal.$backdrop = null; + + callback && topModal.$element.one('hidden', + targetIsSelf( $.proxy(callback, this) )); + + topModal.hide(); + } else if (callback) { + callback(); + } + }, + + removeBackdrop: function (modal) { + modal.$backdrop.remove(); + modal.$backdrop = null; + }, + + createBackdrop: function (animate) { + var $backdrop; + + if (!this.$backdropHandle) { + $backdrop = $('