From 36feb6451497bc31d7474e91609ec2352efc4a27 Mon Sep 17 00:00:00 2001 From: Gearkey Date: Sun, 12 Dec 2021 19:37:27 +0800 Subject: [PATCH] =?UTF-8?q?=E9=A6=96=E6=AC=A1=E6=8F=90=E4=BA=A4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .gitignore | 2 + LICENSE | 674 ++++++++++++++++++++++ app.js | 107 ++++ control/app_conf.js | 5 + control/app_init.js | 178 ++++++ control/app_login.js | 9 + control/app_router.js | 41 ++ control/main_material.js | 30 + control/main_material_area.js | 5 + control/main_material_detail.js | 5 + control/main_material_operation_button.js | 5 + control/main_material_operation_form.js | 5 + control/main_material_table.js | 5 + control/mine_group_info.js | 5 + control/mine_uaer_info.js | 5 + module/ex/main.js | 2 + package.json | 20 + readme.md | 50 ++ theme/default/index.html | 60 ++ theme/default/index_preview.html | 136 +++++ theme/default/login.html | 28 + theme/default/login_preview.html | 28 + theme/default/main.js | 65 +++ theme/default/res/icon.jpg | Bin 0 -> 16996 bytes theme/default/style.css | 462 +++++++++++++++ 25 files changed, 1932 insertions(+) create mode 100644 .gitignore create mode 100644 LICENSE create mode 100644 app.js create mode 100644 control/app_conf.js create mode 100644 control/app_init.js create mode 100644 control/app_login.js create mode 100644 control/app_router.js create mode 100644 control/main_material.js create mode 100644 control/main_material_area.js create mode 100644 control/main_material_detail.js create mode 100644 control/main_material_operation_button.js create mode 100644 control/main_material_operation_form.js create mode 100644 control/main_material_table.js create mode 100644 control/mine_group_info.js create mode 100644 control/mine_uaer_info.js create mode 100644 module/ex/main.js create mode 100644 package.json create mode 100644 readme.md create mode 100644 theme/default/index.html create mode 100644 theme/default/index_preview.html create mode 100644 theme/default/login.html create mode 100644 theme/default/login_preview.html create mode 100644 theme/default/main.js create mode 100644 theme/default/res/icon.jpg create mode 100644 theme/default/style.css diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..d5f19d8 --- /dev/null +++ b/.gitignore @@ -0,0 +1,2 @@ +node_modules +package-lock.json diff --git a/LICENSE b/LICENSE new file mode 100644 index 0000000..f288702 --- /dev/null +++ b/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/app.js b/app.js new file mode 100644 index 0000000..ecffff2 --- /dev/null +++ b/app.js @@ -0,0 +1,107 @@ +const http = require("http"); +const host = "localhost"; +const port = "8888"; +const server = http.createServer(app); +const template = require("art-template"); +const cookie_parser = require("cookie-parser"); + +const app = require("./control/app_router"); // 软件的路由基础 +const app_init = require("./control/app_init"); // 建立初始数据表及数据库相关操作 +const app_login = require("./control/app_ogin"); // 登录/注册的逻辑 +const app_conf = require("./control/app_conf"); // 软件配置项的操作逻辑 +const main_material = require("./control/main_material"); // 任务卡片的操作逻辑 +const main_material_area = require("./control/main_material_area"); // 任务卡片区域的操作逻辑 +const main_material_detail = require("./control/main_material_detail"); // 任务详情的操作逻辑 +const main_material_operation_button = require("./control/main_material_operation_button"); // 任务详情按钮的操作逻辑 +const main_material_operation_form = require("./control/main_material_operation_form"); // 任务详情表单的操作逻辑 +const main_material_table = require("./control/main_material_table"); // 任务详情表格的操作逻辑 +const mine_uaer_info = require("./control/mine_uaer_info"); // 用户资料信息卡的操作逻辑 +const mine_group_info = require("./control/mine_group_info"); // 团队资料信息卡的操作逻辑 +const theme_path = __dirname + "/theme/default/"; + +app.get("/", (req, res) => { + let app_login_obj = new app_login; + + /* 判断是否未登录,已登录继续,未登录跳转到 login */ + if (app_login_obj.is_not_login()){ + // todo + } + + // fixme + let app_init_obj = new app_init(); + connection = app_init_obj.get_database_connection(); + //materials = get_all_material(); + + // 通过 art-template 拼合模板内容 + html = template( + theme_path + "index.html",{ + app_title: "Bluebook", + app_link: "https://github.com/gearkey/bluebook", + app_licence_link: "https://github.com/gearkey/bluebook/blob/master/LICENSE", + app_header_home: "首页", + app_header_outside: "外部", + app_header_mine: "我的", + material_area_title_opened: "已开启的任务", + material_area_title_voting: "表决中的任务", + material_area_title_doing: "进行中的任务", + material_area_title_feedback_in_progress: "反馈中的任务", + material_area_title_finished: "已完成的任务", + material_title: "任务标题", + material_content: "任务内容", + material_desc: "任务预览内容", + material_desc_time: "任务预览时间", + material_detail_sub_title: "任务详情子标题", + material_detail_connection_tree: "物料/任务关系表", + material_detail_material_info: "物料/任务属性表", + material_detail_vote_info: "物料/任务投票信息表", + material_detail_trigger_process : "任务触发流程表", + material_detail_operation_history: "任务操作历史记录表", + group_detail_flow_info: "团队资金流水表", + material_operation_support: "▲", + material_operation_oppose: "▼", + material_operation_split: "拆解", + material_operation_automate: "自动化", + material_operation_modify: "修改", + material_operation_finish: "完成", + material_operation_cancel: "x", + material_operation_form_title: "操作表单标题", + material_operation_form_content: "操作表单内容" + } + ) + + res.write(html); + res.end() +}); + +app.get("/login", (req, res) => { + html = template( + theme_path + "login.html",{ + login_title: "登录到 Bluebook", + login_desc: "欢迎来到 Bluebook 的世界,从此开始愉悦生活", + login_input_username: "用户名/邮箱/电话", + login_input_password: "输入密码", + login_input_password_again: "再次输入密码", + login_input_referee: "推荐人用户名/邮箱/电话", + login_button_text: "登录", + login_i_want_register: "我要注册" + }, + ) + res.write(html); + res.end() +}); + +app.get("/style.css", (req, res) => { + css = template(theme_path + "style.css", {}) + res.write(css); + res.end() +}); + +app.get("/main.js", (req, res) => { + css = template(theme_path + "main.js", {}) + res.write(css); + res.end() +}); + +server.listen(port, host, () => { + console.log(`Server running at http://${host}:${port}`); +}); \ No newline at end of file diff --git a/control/app_conf.js b/control/app_conf.js new file mode 100644 index 0000000..4e0fda1 --- /dev/null +++ b/control/app_conf.js @@ -0,0 +1,5 @@ +function app_conf(){ + // todo +} + +module.exports = app_conf(); diff --git a/control/app_init.js b/control/app_init.js new file mode 100644 index 0000000..c742b13 --- /dev/null +++ b/control/app_init.js @@ -0,0 +1,178 @@ +function app_init(){ + this.get_database_connection = function (){ + let mysql = require("mysql"); + let connection = mysql.createConnection({ + host: "localhost:3306", + user: "root", + password: "root", + database: "bluebook" + }); + connection.connect(); + console.log("ok") + + return connection; + }; + + this.creat_database_init = function (){ + connection = this.get_database_connection() + + let sqls = [ + "create database bluebook;", + + /* 团队对象信息表 */ + "create table group_info (" + + "group_id uuid, " + // 团队/用户id + "group_tel varchar, " + // 团队/用户电话 + "group_email varchar, " + // 团队/用户邮箱 + "group_password varchar, " + // 团队/用户密码(加盐非对称加密储存) + "group_name varchar, " + // 团队/用户名称 + "group_desc varchar, " + // 团队/用户简介 + "group_avatar varchar, " + // 团队/用户头像(储存uri) + "group_realname varchar, " + // 团队全名/用户实名(加盐对称加密储存) + "group_identity_no varchar, " + // 团队社会认证号码/用户身份证号(加盐对称加密储存) + "group_default_vote_pass_percent tinyint, " + // 团队默认投票自动通过的百分比阈值 + "group_default_vote_power_percent tinyint, " + // 团队默认投票自动通过的百分比阈值(group_default_vote_pass_percent,int) + "group_surplus decimal(14,4), " + // 团队节余/用户余额(精确到厘位) + "group_state tinyint, " + // 团队/用户状态(0-正常,1-关闭,2-封禁,3-死亡,4-注销) + "group_for_parent_status varchar" + // 用户/团队相对父团队的身份 + ");", + + /* 用户/子团队与父团队,多对多关系表 */ + "create table group_connection (" + + "group_connection_id uuid, " + // 关系id + "group_id uuid, " + // 用户/子团队id + "group_parent uuid, " + // 父团队id + ");", + + /* 团队物料/任务表 */ + "create table group_material (" + + "material_id uuid, " + // 物料/任务 id + "material_name varchar, " + // 物料名称/任务标题 + "material_desc varchar, " + // 物料/任务简介 + "material_unit varchar, " + // 物料/任务单位 + "material_unit_production_time decimal(13,3), " + // 物料/任务单位生产时间(秒数,精确到毫秒,以100年计算,整数部分需要10位,可以支持到最多300年) + "material_unit_cluster int, " + // 物料/任务单位簇,以此大单位加减数量 + "material_estimated_count int, " + // 物料/任务预估数量 + "material_need_count int, " + //物料/任务需求数量 + "material_plan_count int, " + //物料/任务计划数量 + "material_real_count int, " + // 物料/任务实际数量 + "material_surplus_count int, " + // 物料/任务剩余数量 + "material_group_need varchar, " + // 物料/任务的需求团队 + "material_group_made varchar, " + // 物料/任务的生产团队 + "material_group_manage varchar, " + // 物料管理员/任务队长 + "material_is_rejected_by_one_vote boolean, " + // 物料/任务是否已被一票否决 + "material_state tinyint, " + // 物料/任务状态(0-草稿,1-触发,2-开启,3-需选,4-产选,5-生产,6-分配,7-反馈,8-完成,9-倾销,10-已销,11-取消,12-暂停) + "material_priority tinyint, " + // 物料/任务优先级(0-中,1-高,2-低) + "material_vote_pass_percent tinyint, " + // 物料/任务自动投票通过的百分比阈值 + "material_vote_power_percent tinyint, " + // 物料/任务可否决一票否决的百分比阈值(反否阈值) + "material_harvest_percent tinyint, " + // 物料/任务过剩成果保留给生产团队集体的百分比值 + "material_is_outside boolean" + // 是否团队外部物料/任务(可能可以化简) + "material_for_parent_status varchar, " + // 物料/任务相对父物料/任务的身份 + ");", + + /* 物料任务多对多关系表 */ + "create table group_material_connection (" + + "material_connection_id uuid, " + // 物料任务对应id + "material_id varchar uuid, " + // 物料/任务id + "material_parent uuid, " + // 父物料/任务id + ");", + + /* 团队投票决策表 */ + "create table group_vote (" + + "vote_id uuid, " + // 选票id + "vote_material uuid, " + // 选票对应物料/任务 + "vote_group uuid, " + // 投票对象id + "vote_is_support boolean, " + // 投票对象是否支持此任务(false 反对,true 支持) + "vote_desc varchar, " + // 投票原因表述 + "vote_need_count int, " + // 投票对象需要的物料/任务数量 + "vote_is_vote_power boolean, " + // 是否行使一票否决权(false 不行使,true 行使) + "vote_is_feedback boolean, " + // 投票对象是否需要在获得结果后反馈(false 不需要,true 需要) + "vote_feedback_is_satisfied boolean, " + // 投票对象对此物料/任务的结果是否满意(false 不满意,true 满意) + "vote_feedback_desc varchar, " + // 投票对象对此选票的反馈内容 + ");", + + /* 触发/操作信息表 */ + "create table group_operation_info (" + + "operation_id uuid, " + // 操作id + "operation_target varchar, " + // 操作对象(group_id / material_id / vote_id) + "operation_state_change tinyint, " + // 将物料/任务的状态变更为(对应到对象的状态代码) + "operation_touch_off_reach_time timestamp, " + // 触发条件:到达某个时间 + "operation_touch_off_reach_material_state tinyint, " + // 触发条件:物料/任务到达某个状态(reach_material_state,int,对应到 material_state) + "operation_time timestamp, " + // 操作时间 + "operation_group uuid, " + // 操作人 + "operation_ip varchar, " + // 操作ip + "operation_ua varchar, " + // 操作ua + "operation_remark varchar, " + // 操作备注 + ");", + + /* 软件配置表 */ + "create table app_conf (" + + "conf_key varchar, " + // 配置项id + "conf_value varchar, " + // 配置项值 + ");", + + /* 团队资金流水表 */ + "create table group_flow (" + + "flow_id uuid, " + // 流水id + "flow_material uuid, " + // 流水对应的物料/任务id + "flow_inside_group uuid, " + // 内部交易对象 + "flow_outside_group uuid, " + // 外部交易对象 + "flow_pay_type tinyint, " + // 流水支付方式(0-现金,1-信用卡,2-储蓄卡,3-云闪付,4-支付宝,5-微信) + "flow_pay_card_number varchar, " + // 外部交易对象银行卡号/支付软件id + "flow_pay_amount decimal(14,4), " + // 流水支付金额(精确到厘) + "flow_serial_no varchar, " + // 外部交易支付方式提供的流水号 + "flow_invoice_no varchar, " + // 外部交易的发票号 + ");", + + /* 外部交易对象表 */ + "create table outside_group (" + + "outside_group_id uuid, " + // 外部交易对象id + "outside_group_tel varchar, " + // 外部交易对象电话 + "outside_group_email varchar, " + // 外部交易对象邮箱 + "outside_group_name varchar, " + // 外部交易对象名称 + "outside_group_desc varchar, " + // 外部交易对象简介 + "outside_group_realname varchar, " + // 外部交易对象全名 + "outside_group_identity_no varchar, " + // 外部交易对象社会认证号码/身份证号 + "outside_group_surplus decimal(14,4), " + // 预估其货币价值 + "outside_group_state tinyint, " + // 外部交易对象状态(0-正常,1-关闭,2-黑名单) + "outside_group_for_parent_state varchar, " + // 子交易对象相对父交易对象的身份(,varchar) + ");", + + /* 外部交易对象关系表 */ + "create table outside_group_connection (" + + "outside_group_connection_id uuid, " + // 关系id + "outside_group_id uuid, " + // 子交易对象id + "outside_group_parent uuid, " + // 父交易对象id + ");", + + /* 外部对象操作信息表 */ + "create table outside_group_operation_info (" + + "operation_id uuid, " + // 操作id + "operation_target varchar, " + // 操作对象(group_id / material_id / vote_id) + "operation_state_change tinyint, " + // 将物料/任务的状态变更为(对应到对象的状态代码) + "operation_touch_off_reach_time timestamp, " + // 触发条件:到达某个时间 + "operation_touch_off_reach_material_state tinyint, " + // 触发条件:物料/任务到达某个状态(reach_material_state,int,对应到 material_state) + "operation_time timestamp, " + // 操作时间 + "operation_group uuid, " + // 操作人 + "operation_ip varchar, " + // 操作ip + "operation_ua varchar, " + // 操作ua + "operation_remark varchar, " + // 操作备注 + ");", + ] + + // fixme:因为模块的连接问题,不知道它能不能正常执行,之后应该测试并修复它 + for (i=0; ;i++){ + connection.query(sqls[i], function (result){ + console.log("sql_execute_success: " + result) + + connection.end(); + }); + } + }; + + this.creat_ex_database_init = function (){ + // todo:建立软件的基础扩展表 + }; +} + +module.exports = app_init(); \ No newline at end of file diff --git a/control/app_login.js b/control/app_login.js new file mode 100644 index 0000000..5e41fe4 --- /dev/null +++ b/control/app_login.js @@ -0,0 +1,9 @@ +function app_login(){ + /* 判断当前是否未登录 */ + this.is_not_login = function (){ + // todo:填写逻辑,通过是否存在 cookie 判定 + return true; + }; +} + +module.exports = app_login(); \ No newline at end of file diff --git a/control/app_router.js b/control/app_router.js new file mode 100644 index 0000000..8ce8562 --- /dev/null +++ b/control/app_router.js @@ -0,0 +1,41 @@ +const url = require("url"); + +function create_application(){ + this.get = {}; + this.post = {}; + + const app = (req, res) => { + let pathname = url.parse(req.url).pathname; + let method = req.method.toLowerCase(); + + if (this[method][pathname]){ + if (method === "get"){ + this[method][pathname](req, res); + } + else { + let params = ""; + req.on("data", chunk => { + params += chunk; + }); + req.on("end", () => { + req.body = params; + this[method][pathname](req, res); + }) + } + } + else { + res.end("404"); + } + }; + + app.get = (url, cb) => { + this.get[url] = cb; + }; + app.post = (url, cb) => { + this.post[url] = cb; + }; + + return app; +} + +module.exports = create_application(); \ No newline at end of file diff --git a/control/main_material.js b/control/main_material.js new file mode 100644 index 0000000..50445aa --- /dev/null +++ b/control/main_material.js @@ -0,0 +1,30 @@ +function main_material(){ + /* 获取所有任务卡片的 json 信息 */ + /* materials = [ + {material_name: "", material_desc:"", material_state:""}, + ... + ]*/ + let get_all_material = function (){ + // 连接数据库 + connection = get_database_connection(); + + // 获取用户所有任务的名称、简介和状态 + connection.query( + "select material_name, material_desc, material_state from group_material" + + "where need_material_group = or made_material_group = ", + + function (error, results, fields){ + if (error) throw error; + + console.log('The solution is: ', results[0].solution); + + connection.end(); + } + ); + + return materials; + }; +} + +module.exports = main_material(); + diff --git a/control/main_material_area.js b/control/main_material_area.js new file mode 100644 index 0000000..d2a3496 --- /dev/null +++ b/control/main_material_area.js @@ -0,0 +1,5 @@ +function main_material_area(){ + // todo +} + +module.exports = main_material_area(); \ No newline at end of file diff --git a/control/main_material_detail.js b/control/main_material_detail.js new file mode 100644 index 0000000..591b964 --- /dev/null +++ b/control/main_material_detail.js @@ -0,0 +1,5 @@ +function main_material_detail(){ + // todo +} + +module.exports = main_material_detail(); diff --git a/control/main_material_operation_button.js b/control/main_material_operation_button.js new file mode 100644 index 0000000..3179c4e --- /dev/null +++ b/control/main_material_operation_button.js @@ -0,0 +1,5 @@ +function main_material_operation_button(){ + // todo +} + +module.exports = main_material_operation_button(); diff --git a/control/main_material_operation_form.js b/control/main_material_operation_form.js new file mode 100644 index 0000000..e1002d0 --- /dev/null +++ b/control/main_material_operation_form.js @@ -0,0 +1,5 @@ +function main_material_operation_form(){ + // todo +} + +module.exports = main_material_operation_form(); diff --git a/control/main_material_table.js b/control/main_material_table.js new file mode 100644 index 0000000..76a5cb1 --- /dev/null +++ b/control/main_material_table.js @@ -0,0 +1,5 @@ +function main_material_table(){ + // todo +} + +module.exports = main_material_table(); diff --git a/control/mine_group_info.js b/control/mine_group_info.js new file mode 100644 index 0000000..73742d4 --- /dev/null +++ b/control/mine_group_info.js @@ -0,0 +1,5 @@ +function mine_group_info(){ + // todo +} + +module.exports = mine_group_info(); diff --git a/control/mine_uaer_info.js b/control/mine_uaer_info.js new file mode 100644 index 0000000..b711452 --- /dev/null +++ b/control/mine_uaer_info.js @@ -0,0 +1,5 @@ +function mine_uaer_info(){ + // todo +} + +module.exports = mine_uaer_info(); diff --git a/module/ex/main.js b/module/ex/main.js new file mode 100644 index 0000000..139597f --- /dev/null +++ b/module/ex/main.js @@ -0,0 +1,2 @@ + + diff --git a/package.json b/package.json new file mode 100644 index 0000000..cfbcc57 --- /dev/null +++ b/package.json @@ -0,0 +1,20 @@ +{ + "name": "bluebook", + "version": "0.1.0", + "description": "一款自由的协作管理工具", + "main": "app.js", + "scripts": { + "mysql": "npm install mysql --save", + "art-template": "npm install art-template --save", + "cookie-parser": "npm install cookie-parser --save" + }, + "private": true, + "author": "Gaerkey (https://github.com/gearkey)", + "homepage": "https://github.com/gearkey/bluebook", + "bugs": "https://github.com/gearkey/bluebook/issues", + "license": "GPL", + "dependencies": { + "art-template": "^4.13.2", + "mysql": "^2.18.1" + } +} diff --git a/readme.md b/readme.md new file mode 100644 index 0000000..51e0e6f --- /dev/null +++ b/readme.md @@ -0,0 +1,50 @@ +# Bluebook(蓝宝书) + +Bluebook 是一款开源自由的协作管理工具,采用 Node.js 开发。 +数据表设计精简,内部核心7张表,外部核心4张表,代码优美简洁,易拆分,扩展性强。 + +对内采用计划经济,投票决定事项,按需分配。 +对外保留市场经济的接口,允许生产团队对外倾销和购买生产资料。 + +基本操作流程是: + ++ 需求团队/个人发起任务单,填写预估数量 ++ 需求团队进行投票表决,填写需求数量 ++ 生产团队进行投票表决,填写计划数量 ++ 物料生产/任务进行中,完成后填写实际数量 ++ 物料分配中,用户领取并填写反馈信息 ++ 任务结束,有生产剩余的部分进入外部倾销阶段 ++ 系统随机在生产团队内选取至少两名用户进行销售工作 ++ 销售货款打入生产团队账户 ++ 销售货款平均分配给生产团队成员,按团队设定的数值确定保留在团队内的比例(默认是 0) ++ 任务结束 + +关于投票,团队可以设置任务自动通过的百分比值,默认是 50%。 +团队管理员具有一票否决权,保证了任务的科学性,然后同时也加入了排除管理员重新表决,达到 90%(也可以设置)则继续进行的民主机制(称为反否阈值)。 + +目前项目还在初始阶段,只有基础框架,但已经可以轻松愉悦地搬砖了。 +关于数据表的信息,可以在[这里](control/app_init.js)查看,有完善的注释。 + +目前 ui 还不完善,但已经实现了基本可看的响应式设计,从宽屏到手机列丝滑切换,从5列到两列都有合适的显示和操作逻辑。 +可以下载模板单页以进行操作预览:[首页](theme/default/index_preview.html) / [登录页](theme/default/login_preview.html),图片预览和详细流程在[这里](https://github.com/gearkey/bluebook_doc)可以查阅。 + +## 软件依赖模块 + +涉及到数据库的基本操作、主题模板的渲染,和 cookie 的存取,所以需要以下依赖: + +``` +npm install mysql --save +npm install art-template --save +npm install cookie-parser --save +``` + +最后,祝玩得开心。 + +## 更新日志 + +采用 npm 推荐的版本号形式。 + +``` +v0.1.0-20211212:基本框架的建立 +``` + diff --git a/theme/default/index.html b/theme/default/index.html new file mode 100644 index 0000000..8121647 --- /dev/null +++ b/theme/default/index.html @@ -0,0 +1,60 @@ + + + +{{app_title}} + + + + + + + +
+ +
+
+
+

{{material_area_title_opened}}

+
+
+

{{material_title}}

+

{{material_desc}}

+

{{material_desc_time}}

+
+
+
    +
  • {{material_operation_support}}
  • +
  • {{material_operation_oppose}}
  • +
  • {{material_operation_split}}
  • +
  • {{material_operation_automate}}
  • +
  • {{material_operation_modify}}
  • +
  • {{material_operation_finish}}
  • +
  • {{material_operation_cancel}}
  • +
+
+
{{material_operation_form_title}}
+
{{material_operation_form_content}}
+
+ +
{{material_content}}
+
{{material_detail_connection_tree}}
+
{{material_detail_material_info}}
+
{{material_detail_vote_info}}
+
{{material_detail_trigger_process}}
+
{{material_detail_operation_history}}
+
{{group_detail_flow_info}}
+
+
+
+
+
+ +
+ + \ No newline at end of file diff --git a/theme/default/index_preview.html b/theme/default/index_preview.html new file mode 100644 index 0000000..4e5a943 --- /dev/null +++ b/theme/default/index_preview.html @@ -0,0 +1,136 @@ + + + +Bluebook + + + + + + + +
+ +
+
+
+

开启的任务

+
+
+

一个小记录(比较长的标题)

+

今天吃了一头鱼,好开心,明天继续~(比较长的内容。。)

+

2021-12-10 08:00

+
+
+
    +
  • +
  • +
  • 拆解
  • +
  • 自动化
  • +
  • 修改
  • +
  • 完成
  • +
  • X
  • +
+
+
确认xxx?
+
+

+

+

+ + + +

+

    +
  • 单选项1
  • +
  • 单选项2
  • +
  • 单选项3
  • +
  • 单选项4
  • +

+

    +
  • 多选项1
  • +
  • 多选项2
  • +
  • 多选项3
  • +
  • 多选项4
  • +
  • 多选项5
  • +

+

+
请选择文件
+

+

+

+
+
+ +
物料/任务内容:CSS 边框 CSS 边框属性 CSS边框属性允许你指定一个元素边框的样式和颜色。 在四边都有边框 红色底部边框 圆角边框 左侧边框带宽度,颜色为蓝色 边框样式 边框样式属性指定要显示什么样CSS 边框 CSS 边框属性 CSS边框属性允许你指定一个元素边框的样式和颜色。 在四边都有边框 红色底部边框 圆角边框 左侧边框带宽度,颜色为蓝色 边框样式 边框样式属性指定要显示什么样
+
物料/任务关系表
+ + + + + + + +
关系名称单位预估数量需求数量计划数量实际数量剩余数量需求团队生产团队任务队长
本任务生产100个笔和橡皮套装100200200200200xx学校xx文具制造厂xx文具制造厂-小明
父任务12月11日给学生加福利11111xx学校xx文具制造厂xx学校-小芳
子任务生产200只笔20020024024040xx学校xx文具制造厂铅笔分部xx文具制造厂铅笔分部-小刚
子任务生产200只橡皮2002002002000xx学校xx文具制造厂橡皮分部xx文具制造厂橡皮分部-小红
兄弟任务一次集体旅行11110xx学校xx学校xx学校-小黄
+
物料/任务属性表
+ + + + + + + +
关系名称单位单位生产时间单位簇状态优先级是否需要反馈过剩成果保留值
本任务生产100个笔和橡皮套装2分钟20已完成0%
父任务12月11日给学生加福利20天1进行中0%
子任务生产200只笔2分钟20已完成0%
子任务生产200只橡皮30秒20已完成0%
兄弟任务一次集体旅行6天1反馈中0%
+
物料/任务投票信息表
+ + + + + + + +
关系名称投票对象对象类型全员人数投票人数是否被否支持数量反对数量是否通过通过阈值反否阈值
本任务生产100个笔和橡皮套装xx文具制造厂生产方1005050050%90%
父任务12月11日给学生加福利xx学校需求方300152150250%90%
子任务生产200只笔xx文具制造厂铅笔分部生产方555050%90%
子任务生产200只橡皮xx文具制造厂橡皮分部生产方533050%90%
兄弟任务一次集体旅行xx学校需求方300150150050%90%
+
任务触发流程表
+ + + + + + + +
关系名称触发类型开启时间开启备注(读取操作表备注)完成时间完成备注/当前状态
父任务12月11日给学生加福利手动2021-12-10 10:00学校想发福利0000-00-00 00:00任务进行中
本任务生产100个笔和橡皮套装自动2021-12-10 19:00添加任务描述,并分配任务2021-12-11 13:00任务正常完成
子任务生产200只笔自动2021-12-11 08:00机器创建2021-12-11 14:00一切正常
子任务生产200只橡皮自动2021-12-11 11:00机器有点问题,11点才能开工2021-12-11 13:00正常完成
兄弟任务一次集体旅行手动2021-12-11 08:00已准备妥当0000-00-00 00:00任务反馈中
+
任务操作历史记录表
+ + + + + + +
操作类型操作时间操作人操作ip(任务队长可见)操作ua(任务队长可见)操作备注
触发2021-12-10 19:00系统触发127.0.0.1robot
开启2021-12-10 19:30xx文具制造厂192.168.1.101Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:94.0) Gecko/20100101 Firefox/94.0添加任务描述,并分配任务
修改2021-12-11 13:00xx文具制造厂192.168.1.101Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:94.0) Gecko/20100101 Firefox/94.0修改一些描述
完成2021-12-11 13:00xx文具制造厂192.168.1.101Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:94.0) Gecko/20100101 Firefox/94.0任务正常完成
+
团队资金流水表
+ + + + + + +
流水时间金额外部交易对象支付方式发票号相关任务备注
2021-12-10 19:00+60.50xx公司支付宝123456任务1
2021-12-10 19:01-79.00xx公司现金123456任务2
2021-12-10 19:02+76.00xx公司微信123456任务3
2021-12-10 19:03-20.00xx公司云闪付123456任务4
+
+
+
+
+
+ +
+ + \ No newline at end of file diff --git a/theme/default/login.html b/theme/default/login.html new file mode 100644 index 0000000..f71f391 --- /dev/null +++ b/theme/default/login.html @@ -0,0 +1,28 @@ + + + +{{login_title}} + + + + + + + +
+ + + \ No newline at end of file diff --git a/theme/default/login_preview.html b/theme/default/login_preview.html new file mode 100644 index 0000000..91585f7 --- /dev/null +++ b/theme/default/login_preview.html @@ -0,0 +1,28 @@ + + + +登录到 Bluebook + + + + + + + +
+ + + \ No newline at end of file diff --git a/theme/default/main.js b/theme/default/main.js new file mode 100644 index 0000000..bfa196d --- /dev/null +++ b/theme/default/main.js @@ -0,0 +1,65 @@ +/* 给 login.html 的绑定事件 */ +function display_register_field(){ + document.getElementById("register_field").style.display = "block"; + document.getElementById("login_button").value = "注册"; + + switch_link = document.getElementById("i_want_register"); + switch_link.innerText = "我要登录"; + switch_link.onclick = function(){hide_register_field()}; +} + +function hide_register_field(){ + document.getElementById("register_field").style.display = "none"; + document.getElementById("login_button").value = "登录"; + + switch_link = document.getElementById("i_want_register"); + switch_link.innerText = "我要注册"; + switch_link.onclick = function(){display_register_field()}; +} + +/* 给 index.html 的绑定事件 */ +function display_material_detail(){ + document.getElementById("cover").style.display = "block"; + document.getElementById("material_detail").style.display = "block"; +} + +function hide_material_detail(){ + document.getElementById("cover").style.display = "none"; + document.getElementById("material_detail").style.display = "none"; +} + +function display_material_operation_form(){ + let material_detail = document.getElementById("material_detail"); + let screen_width = document.body.clientWidth; + if (screen_width > 1348){ + material_detail.style.width = "680px"; + } + else if (screen_width > 1220){ + material_detail.style.width = "500px"; + } + + document.getElementById("material_operation_form").style.display = "block"; + document.getElementById("material_operation_focus_button").onclick = function(){hide_material_operation_form()}; +} + +function hide_material_operation_form(){ + let material_detail = document.getElementById("material_detail"); + let screen_width = document.body.clientWidth; + if (screen_width > 1348){ + material_detail.style.width = "1100px"; + } + else if (screen_width > 1220){ + material_detail.style.width = "800px"; + } + + document.getElementById("material_operation_form").style.display = "none"; + document.getElementById("material_operation_focus_button").onclick = function(){display_material_operation_form()}; +} + +function edit_material_detail_title(){ + document.getElementById("material_detail_title").readOnly=false +} + +function edit_material_detail_content(){ + //todo +} diff --git a/theme/default/res/icon.jpg b/theme/default/res/icon.jpg new file mode 100644 index 0000000000000000000000000000000000000000..3a51338c6aae392a16d43cc7aea8ed6de520b759 GIT binary patch literal 16996 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 A>i_@% literal 0 HcmV?d00001 diff --git a/theme/default/style.css b/theme/default/style.css new file mode 100644 index 0000000..3116d69 --- /dev/null +++ b/theme/default/style.css @@ -0,0 +1,462 @@ +body { + margin: 0; + font: 1em/1.75 sans-serif, serif; + color: #111; + background: #ddd; +} + +.cover { + width: 100%; + height: 100%; + position: fixed; + background: #11111188; + display: none; +} + +.wrap { + width: 1300px; + margin: 0 auto; +} + +.header { + background: #111; + text-align: center; +} + +.header h2 { + display: inline-block; + margin: 0 10px; + padding: 15px 30px; + font-weight: normal; + font-size: 1.3em; +} + +.header a { + color: #eee; + text-decoration: none; +} + +.header a:hover { + color: #ddd; +} + +.header_home.focus, +.header_home:hover { + border-bottom: 6px solid #3293f5; +} + +.header_outside.focus, +.header_outside:hover { + border-bottom: 6px solid #f5ba32; +} + +.header_mine.focus, +.header_mine:hover { + border-bottom: 6px solid #78aa1a; +} + +.material_area { + width: 20%; + min-height: 10000px; + float: left; +} + +.material_area_title { + padding: 20px 0; + text-align: center; +} + +.material_area_title h3 { + display: inline-block; + padding: 8px 20px; + border-radius: 10px; + font-size: 0.875em; + background: #eee; + box-shadow: -1px -1px 1px #888; +} + +.material_list { + padding: 0 10%; + border-right: 1px dashed #888; +} + +.material { + height: 120px; + padding: 0 9%; + background: #3293f5; + border-radius: 10px; + color: #ddd; + box-shadow: 2px 2px 3px #888; + user-select: none; +} + +.material_desc_title { + height: 16%; + margin: 0; + padding: 10px 0; + font-size: 0.93em; + overflow: hidden; + text-overflow: ellipsis; + white-space: nowrap; +} + +.material p { + margin: 0; +} + +.material_desc_content { + height: 40%; + font-size: 0.875em; + overflow: hidden; +} + +.material_desc_time { + font-size: 0.75em; + text-align: right; +} + +.material_detail { + width: 1000px; + min-height: 320px; + margin: 20px auto; + padding: 30px 40px; + position: absolute; + background: #eee; + border-radius: 2px; + box-shadow: 2px 2px 3px #888; + display: none; +} + +.material_detail_title, +.material_operation_form_title { + text-align: center; + font-size: 1.2em; + font-weight: bold; +} + +.material_detail_title { + display: block; + width: 100%; + background: #00000000; + color: #111; + margin: 10px 0; + padding: 5px; + border: unset; +} + +.material_detail_sub_title { + font-size: 1em; +} + +.material_detail_content, +.material_operation_form_content { + margin: 20px 0; +} + +.material_detail table { + font-size: 0.875em; + border-collapse: collapse; + overflow: scroll; +} + +.material_detail table th, +.material_detail table td { + border: 1px solid #888; + padding: 3px 6px; + white-space: nowrap; + overflow: scroll; +} + +.material_detail table th, +.material_detail table tr:hover { + background-color: #ddd; +} + +.material_operation_button_list { + position: absolute; + left: 100%; + top: -10px; + list-style-type: none; + margin: 0; + padding: 0; +} + +.material_operation_button_list li { + display: block; + width: 50px; + height: 50px; + margin: 20px; + background: #3293f5; + color: #ddd; + border-radius: 50%; + text-align: center; + line-height: 3; + user-select: none; +} + +.material_operation_button_list li:hover { + background: #7eafe0; +} + +.material_operation_form { + width: 320px; + min-height: 600px; + padding: 30px 40px; + position: absolute; + left: 113%; + top: 0; + background: #eee; + font-size: 0.875em; + border-radius: 2px; + box-shadow: 2px 2px 3px #888; + display: none; +} + +.material_operation_form_title { + margin: 0; +} + +.material_operation_form_title_inside { + margin: 0; + font-size: 1em; + text-align: center; +} + +.material_operation_form textarea { + width: 100%; + height: 100px; + line-height: 1.75; + font-family: sans-serif, serif; + resize: vertical; +} + +.material_operation_form input { + margin: 5px 0; + text-align: center; +} + +.material_operation_form input[type=text], +.material_operation_form input[type=password] { + width: 36%; + margin-right: 6px; +} + +.material_operation_form input[type=text], +.material_operation_form input[type=password], +.material_operation_form input[type=submit], +.material_operation_form input[type=button] { + padding: 2px 6px; + float: left; +} + +.material_operation_form input[type=date], +.material_operation_form input[type=time] { + width: 46%; +} + +.material_operation_form input[type=datetime-local] { + width: 100%; +} + +.material_operation_form ul { + list-style-type: none; + margin: 0; + padding: 0; +} + +.material_operation_form ul li { + float: left; + margin-right: 10px; + margin-bottom: 5px; +} + +.material_operation_form p { + clear: both; +} + +.footer { + text-align: center; + font-size: 0.875em; + color: #888; +} + +.footer a { + color: #888; +} + +/* 给 login.html 的样式内容 */ +.login { + width: 400px; + margin: 10% auto; + padding: 20px; + text-align: center; + background: #3293f5; + color: #ddd; + border-radius: 10px; + box-shadow: 2px 2px 3px #888; +} + +.login h1 { + font-size: 1.5em; +} + +.login h2 { + font-size: 1em; + font-weight: normal; +} + +.login form { + padding: 0 80px; +} + +.login input { + width: 100%; + margin: 6px 0; + padding: 6px 0; + text-align: center; + border-radius: 10px; + box-shadow: 0 0 0 #3293f5; +} + +.login a { + text-decoration: none; + color: #eee; +} + +.login a:hover { + text-decoration: underline; +} + +.login .register_field { + display: none; +} + +/* 给 1280px 以上的设备使用 */ +@media screen and (max-width: 1348px){ +.wrap { + width: 1100px; +} + +.material_area { + width: 25%; +} + +.material_detail { + width: 800px; +} + +.material_operation_form { + left: 117%; + width: 280px; +} + +} + +/* 给 1024px 以上的设备使用 */ +@media screen and (max-width: 1220px){ +.wrap { + width: 860px; +} + +.material_area { + width: 33%; +} + +.material_detail { + width: 680px; +} + +.material_operation_button_list { + left: 0; + top: 100%; +} + +.material_operation_button_list li { + float: left; +} + +.material_operation_form { + left: 0; + top: 125%; + width: 680px; +} + +} + +/* 给 800px 以上的设备使用 */ +@media screen and (max-width: 920px){ +.wrap { + width: auto; + padding: 0 5%; +} + +.material_detail { + width: 70%; +} + +.material_operation_form { + width: 87%; +} + +} + +/* 给平板使用 */ +@media screen and (max-width: 777px){ +.wrap { + padding: 0 5%; +} + +.material_area { + width: 50%; +} + +.header h2 { + font-size: 1.2em; +} + +.material_detail { + width: 70%; +} + +.material_operation_button_list li { + width: 30px; + height: 30px; + margin: 10px; + font-size: 0.75em; +} + +} + +/* 给手机使用 */ +@media screen and (max-width: 600px){ +.wrap { + padding: 0; +} + +.material_list { + padding: 0 5%; +} + +.header h2 { + padding: 10px 20px; + font-size: 1em; +} + +.login { + width: auto; + margin: 20% 10%; +} + +.login h1 { + font-size: 1em; +} + +.login h2 { + font-size: 0.875em; +} + +.login form { + padding: 0 10%; +} + +} \ No newline at end of file