├── LICENSE ├── README.md ├── miniprogram ├── app.js ├── app.json ├── app.wxss ├── cloudfunctions │ ├── addGarbage │ │ ├── index.js │ │ └── package.json │ ├── baiduAccessToken │ │ ├── index.js │ │ └── package.json │ ├── commitToBarbarge │ │ ├── index.js │ │ └── package.json │ ├── login │ │ ├── config.json │ │ ├── index.js │ │ └── package.json │ └── sum │ │ ├── index.js │ │ └── package.json ├── colorui │ ├── animation.wxss │ ├── components │ │ ├── cu-custom.js │ │ ├── cu-custom.json │ │ ├── cu-custom.wxml │ │ └── cu-custom.wxss │ ├── icon.wxss │ └── main.wxss ├── images │ ├── HazardouAwaste.jpg │ ├── HouseholdfoodWaste.jpg │ ├── RecycleableWaste.jpg │ ├── ResidualWaste.png │ ├── ai-chat.png │ ├── icon_ai.png │ ├── icon_ai_default.png │ ├── icon_sort.png │ ├── icon_sort_default.png │ ├── no-result.png │ ├── paizhao.png │ ├── qa.png │ ├── qa_default.png │ └── qq .png ├── package.json ├── pages │ ├── ai │ │ ├── camera │ │ │ ├── camera.js │ │ │ ├── camera.json │ │ │ ├── camera.wxml │ │ │ └── camera.wxss │ │ ├── filter │ │ │ ├── filter.js │ │ │ ├── filter.json │ │ │ ├── filter.wxml │ │ │ └── filter.wxss │ │ ├── index.js │ │ ├── index.json │ │ ├── index.wxml │ │ ├── index.wxss │ │ ├── result.js │ │ ├── result.json │ │ ├── result.wxml │ │ ├── result.wxss │ │ ├── search.js │ │ ├── search.json │ │ ├── search.wxml │ │ └── search.wxss │ ├── android │ │ ├── qa.js │ │ ├── qa.json │ │ ├── qa.wxml │ │ └── qa.wxss │ ├── index │ │ ├── index.js │ │ ├── index.json │ │ ├── index.wxml │ │ ├── index.wxss │ │ └── user-unlogin.png │ ├── result │ │ ├── commit.js │ │ ├── commit.json │ │ ├── commit.wxml │ │ ├── commit.wxss │ │ ├── gan.js │ │ ├── gan.json │ │ ├── gan.wxml │ │ ├── gan.wxss │ │ ├── list.js │ │ ├── list.json │ │ ├── list.wxml │ │ └── list.wxss │ └── sort │ │ ├── sort.js │ │ ├── sort.json │ │ ├── sort.wxml │ │ └── sort.wxss ├── project.config.json ├── sitemap.json ├── style │ └── guide.wxss └── utils │ ├── http.js │ ├── map.js │ ├── md5.js │ ├── strings.js │ └── util.js ├── product.csv ├── project.config.json └── sort.json /LICENSE: -------------------------------------------------------------------------------- 1 | GNU GENERAL PUBLIC LICENSE 2 | Version 3, 29 June 2007 3 | 4 | Copyright (C) 2007 Free Software Foundation, Inc. 5 | Everyone is permitted to copy and distribute verbatim copies 6 | of this license document, but changing it is not allowed. 7 | 8 | Preamble 9 | 10 | The GNU General Public License is a free, copyleft license for 11 | software and other kinds of works. 12 | 13 | The licenses for most software and other practical works are designed 14 | to take away your freedom to share and change the works. By contrast, 15 | the GNU General Public License is intended to guarantee your freedom to 16 | share and change all versions of a program--to make sure it remains free 17 | software for all its users. We, the Free Software Foundation, use the 18 | GNU General Public License for most of our software; it applies also to 19 | any other work released this way by its authors. You can apply it to 20 | your programs, too. 21 | 22 | When we speak of free software, we are referring to freedom, not 23 | price. Our General Public Licenses are designed to make sure that you 24 | have the freedom to distribute copies of free software (and charge for 25 | them if you wish), that you receive source code or can get it if you 26 | want it, that you can change the software or use pieces of it in new 27 | free programs, and that you know you can do these things. 28 | 29 | To protect your rights, we need to prevent others from denying you 30 | these rights or asking you to surrender the rights. Therefore, you have 31 | certain responsibilities if you distribute copies of the software, or if 32 | you modify it: responsibilities to respect the freedom of others. 33 | 34 | For example, if you distribute copies of such a program, whether 35 | gratis or for a fee, you must pass on to the recipients the same 36 | freedoms that you received. You must make sure that they, too, receive 37 | or can get the source code. And you must show them these terms so they 38 | know their rights. 39 | 40 | Developers that use the GNU GPL protect your rights with two steps: 41 | (1) assert copyright on the software, and (2) offer you this License 42 | giving you legal permission to copy, distribute and/or modify it. 43 | 44 | For the developers' and authors' protection, the GPL clearly explains 45 | that there is no warranty for this free software. For both users' and 46 | authors' sake, the GPL requires that modified versions be marked as 47 | changed, so that their problems will not be attributed erroneously to 48 | authors of previous versions. 49 | 50 | Some devices are designed to deny users access to install or run 51 | modified versions of the software inside them, although the manufacturer 52 | can do so. This is fundamentally incompatible with the aim of 53 | protecting users' freedom to change the software. The systematic 54 | pattern of such abuse occurs in the area of products for individuals to 55 | use, which is precisely where it is most unacceptable. Therefore, we 56 | have designed this version of the GPL to prohibit the practice for those 57 | products. If such problems arise substantially in other domains, we 58 | stand ready to extend this provision to those domains in future versions 59 | of the GPL, as needed to protect the freedom of users. 60 | 61 | Finally, every program is threatened constantly by software patents. 62 | States should not allow patents to restrict development and use of 63 | software on general-purpose computers, but in those that do, we wish to 64 | avoid the special danger that patents applied to a free program could 65 | make it effectively proprietary. To prevent this, the GPL assures that 66 | patents cannot be used to render the program non-free. 67 | 68 | The precise terms and conditions for copying, distribution and 69 | modification follow. 70 | 71 | TERMS AND CONDITIONS 72 | 73 | 0. Definitions. 74 | 75 | "This License" refers to version 3 of the GNU General Public License. 76 | 77 | "Copyright" also means copyright-like laws that apply to other kinds of 78 | works, such as semiconductor masks. 79 | 80 | "The Program" refers to any copyrightable work licensed under this 81 | License. Each licensee is addressed as "you". "Licensees" and 82 | "recipients" may be individuals or organizations. 83 | 84 | To "modify" a work means to copy from or adapt all or part of the work 85 | in a fashion requiring copyright permission, other than the making of an 86 | exact copy. The resulting work is called a "modified version" of the 87 | earlier work or a work "based on" the earlier work. 88 | 89 | A "covered work" means either the unmodified Program or a work based 90 | on the Program. 91 | 92 | To "propagate" a work means to do anything with it that, without 93 | permission, would make you directly or secondarily liable for 94 | infringement under applicable copyright law, except executing it on a 95 | computer or modifying a private copy. Propagation includes copying, 96 | distribution (with or without modification), making available to the 97 | public, and in some countries other activities as well. 98 | 99 | To "convey" a work means any kind of propagation that enables other 100 | parties to make or receive copies. Mere interaction with a user through 101 | a computer network, with no transfer of a copy, is not conveying. 102 | 103 | An interactive user interface displays "Appropriate Legal Notices" 104 | to the extent that it includes a convenient and prominently visible 105 | feature that (1) displays an appropriate copyright notice, and (2) 106 | tells the user that there is no warranty for the work (except to the 107 | extent that warranties are provided), that licensees may convey the 108 | work under this License, and how to view a copy of this License. If 109 | the interface presents a list of user commands or options, such as a 110 | menu, a prominent item in the list meets this criterion. 111 | 112 | 1. Source Code. 113 | 114 | The "source code" for a work means the preferred form of the work 115 | for making modifications to it. "Object code" means any non-source 116 | form of a work. 117 | 118 | A "Standard Interface" means an interface that either is an official 119 | standard defined by a recognized standards body, or, in the case of 120 | interfaces specified for a particular programming language, one that 121 | is widely used among developers working in that language. 122 | 123 | The "System Libraries" of an executable work include anything, other 124 | than the work as a whole, that (a) is included in the normal form of 125 | packaging a Major Component, but which is not part of that Major 126 | Component, and (b) serves only to enable use of the work with that 127 | Major Component, or to implement a Standard Interface for which an 128 | implementation is available to the public in source code form. A 129 | "Major Component", in this context, means a major essential component 130 | (kernel, window system, and so on) of the specific operating system 131 | (if any) on which the executable work runs, or a compiler used to 132 | produce the work, or an object code interpreter used to run it. 133 | 134 | The "Corresponding Source" for a work in object code form means all 135 | the source code needed to generate, install, and (for an executable 136 | work) run the object code and to modify the work, including scripts to 137 | control those activities. However, it does not include the work's 138 | System Libraries, or general-purpose tools or generally available free 139 | programs which are used unmodified in performing those activities but 140 | which are not part of the work. For example, Corresponding Source 141 | includes interface definition files associated with source files for 142 | the work, and the source code for shared libraries and dynamically 143 | linked subprograms that the work is specifically designed to require, 144 | such as by intimate data communication or control flow between those 145 | subprograms and other parts of the work. 146 | 147 | The Corresponding Source need not include anything that users 148 | can regenerate automatically from other parts of the Corresponding 149 | Source. 150 | 151 | The Corresponding Source for a work in source code form is that 152 | same work. 153 | 154 | 2. Basic Permissions. 155 | 156 | All rights granted under this License are granted for the term of 157 | copyright on the Program, and are irrevocable provided the stated 158 | conditions are met. This License explicitly affirms your unlimited 159 | permission to run the unmodified Program. The output from running a 160 | covered work is covered by this License only if the output, given its 161 | content, constitutes a covered work. This License acknowledges your 162 | rights of fair use or other equivalent, as provided by copyright law. 163 | 164 | You may make, run and propagate covered works that you do not 165 | convey, without conditions so long as your license otherwise remains 166 | in force. You may convey covered works to others for the sole purpose 167 | of having them make modifications exclusively for you, or provide you 168 | with facilities for running those works, provided that you comply with 169 | the terms of this License in conveying all material for which you do 170 | not control copyright. Those thus making or running the covered works 171 | for you must do so exclusively on your behalf, under your direction 172 | and control, on terms that prohibit them from making any copies of 173 | your copyrighted material outside their relationship with you. 174 | 175 | Conveying under any other circumstances is permitted solely under 176 | the conditions stated below. Sublicensing is not allowed; section 10 177 | makes it unnecessary. 178 | 179 | 3. Protecting Users' Legal Rights From Anti-Circumvention Law. 180 | 181 | No covered work shall be deemed part of an effective technological 182 | measure under any applicable law fulfilling obligations under article 183 | 11 of the WIPO copyright treaty adopted on 20 December 1996, or 184 | similar laws prohibiting or restricting circumvention of such 185 | measures. 186 | 187 | When you convey a covered work, you waive any legal power to forbid 188 | circumvention of technological measures to the extent such circumvention 189 | is effected by exercising rights under this License with respect to 190 | the covered work, and you disclaim any intention to limit operation or 191 | modification of the work as a means of enforcing, against the work's 192 | users, your or third parties' legal rights to forbid circumvention of 193 | technological measures. 194 | 195 | 4. Conveying Verbatim Copies. 196 | 197 | You may convey verbatim copies of the Program's source code as you 198 | receive it, in any medium, provided that you conspicuously and 199 | appropriately publish on each copy an appropriate copyright notice; 200 | keep intact all notices stating that this License and any 201 | non-permissive terms added in accord with section 7 apply to the code; 202 | keep intact all notices of the absence of any warranty; and give all 203 | recipients a copy of this License along with the Program. 204 | 205 | You may charge any price or no price for each copy that you convey, 206 | and you may offer support or warranty protection for a fee. 207 | 208 | 5. Conveying Modified Source Versions. 209 | 210 | You may convey a work based on the Program, or the modifications to 211 | produce it from the Program, in the form of source code under the 212 | terms of section 4, provided that you also meet all of these conditions: 213 | 214 | a) The work must carry prominent notices stating that you modified 215 | it, and giving a relevant date. 216 | 217 | b) The work must carry prominent notices stating that it is 218 | released under this License and any conditions added under section 219 | 7. This requirement modifies the requirement in section 4 to 220 | "keep intact all notices". 221 | 222 | c) You must license the entire work, as a whole, under this 223 | License to anyone who comes into possession of a copy. This 224 | License will therefore apply, along with any applicable section 7 225 | additional terms, to the whole of the work, and all its parts, 226 | regardless of how they are packaged. This License gives no 227 | permission to license the work in any other way, but it does not 228 | invalidate such permission if you have separately received it. 229 | 230 | d) If the work has interactive user interfaces, each must display 231 | Appropriate Legal Notices; however, if the Program has interactive 232 | interfaces that do not display Appropriate Legal Notices, your 233 | work need not make them do so. 234 | 235 | A compilation of a covered work with other separate and independent 236 | works, which are not by their nature extensions of the covered work, 237 | and which are not combined with it such as to form a larger program, 238 | in or on a volume of a storage or distribution medium, is called an 239 | "aggregate" if the compilation and its resulting copyright are not 240 | used to limit the access or legal rights of the compilation's users 241 | beyond what the individual works permit. Inclusion of a covered work 242 | in an aggregate does not cause this License to apply to the other 243 | parts of the aggregate. 244 | 245 | 6. Conveying Non-Source Forms. 246 | 247 | You may convey a covered work in object code form under the terms 248 | of sections 4 and 5, provided that you also convey the 249 | machine-readable Corresponding Source under the terms of this License, 250 | in one of these ways: 251 | 252 | a) Convey the object code in, or embodied in, a physical product 253 | (including a physical distribution medium), accompanied by the 254 | Corresponding Source fixed on a durable physical medium 255 | customarily used for software interchange. 256 | 257 | b) Convey the object code in, or embodied in, a physical product 258 | (including a physical distribution medium), accompanied by a 259 | written offer, valid for at least three years and valid for as 260 | long as you offer spare parts or customer support for that product 261 | model, to give anyone who possesses the object code either (1) a 262 | copy of the Corresponding Source for all the software in the 263 | product that is covered by this License, on a durable physical 264 | medium customarily used for software interchange, for a price no 265 | more than your reasonable cost of physically performing this 266 | conveying of source, or (2) access to copy the 267 | Corresponding Source from a network server at no charge. 268 | 269 | c) Convey individual copies of the object code with a copy of the 270 | written offer to provide the Corresponding Source. This 271 | alternative is allowed only occasionally and noncommercially, and 272 | only if you received the object code with such an offer, in accord 273 | with subsection 6b. 274 | 275 | d) Convey the object code by offering access from a designated 276 | place (gratis or for a charge), and offer equivalent access to the 277 | Corresponding Source in the same way through the same place at no 278 | further charge. You need not require recipients to copy the 279 | Corresponding Source along with the object code. If the place to 280 | copy the object code is a network server, the Corresponding Source 281 | may be on a different server (operated by you or a third party) 282 | that supports equivalent copying facilities, provided you maintain 283 | clear directions next to the object code saying where to find the 284 | Corresponding Source. Regardless of what server hosts the 285 | Corresponding Source, you remain obligated to ensure that it is 286 | available for as long as needed to satisfy these requirements. 287 | 288 | e) Convey the object code using peer-to-peer transmission, provided 289 | you inform other peers where the object code and Corresponding 290 | Source of the work are being offered to the general public at no 291 | charge under subsection 6d. 292 | 293 | A separable portion of the object code, whose source code is excluded 294 | from the Corresponding Source as a System Library, need not be 295 | included in conveying the object code work. 296 | 297 | A "User Product" is either (1) a "consumer product", which means any 298 | tangible personal property which is normally used for personal, family, 299 | or household purposes, or (2) anything designed or sold for incorporation 300 | into a dwelling. In determining whether a product is a consumer product, 301 | doubtful cases shall be resolved in favor of coverage. For a particular 302 | product received by a particular user, "normally used" refers to a 303 | typical or common use of that class of product, regardless of the status 304 | of the particular user or of the way in which the particular user 305 | actually uses, or expects or is expected to use, the product. A product 306 | is a consumer product regardless of whether the product has substantial 307 | commercial, industrial or non-consumer uses, unless such uses represent 308 | the only significant mode of use of the product. 309 | 310 | "Installation Information" for a User Product means any methods, 311 | procedures, authorization keys, or other information required to install 312 | and execute modified versions of a covered work in that User Product from 313 | a modified version of its Corresponding Source. The information must 314 | suffice to ensure that the continued functioning of the modified object 315 | code is in no case prevented or interfered with solely because 316 | modification has been made. 317 | 318 | If you convey an object code work under this section in, or with, or 319 | specifically for use in, a User Product, and the conveying occurs as 320 | part of a transaction in which the right of possession and use of the 321 | User Product is transferred to the recipient in perpetuity or for a 322 | fixed term (regardless of how the transaction is characterized), the 323 | Corresponding Source conveyed under this section must be accompanied 324 | by the Installation Information. But this requirement does not apply 325 | if neither you nor any third party retains the ability to install 326 | modified object code on the User Product (for example, the work has 327 | been installed in ROM). 328 | 329 | The requirement to provide Installation Information does not include a 330 | requirement to continue to provide support service, warranty, or updates 331 | for a work that has been modified or installed by the recipient, or for 332 | the User Product in which it has been modified or installed. Access to a 333 | network may be denied when the modification itself materially and 334 | adversely affects the operation of the network or violates the rules and 335 | protocols for communication across the network. 336 | 337 | Corresponding Source conveyed, and Installation Information provided, 338 | in accord with this section must be in a format that is publicly 339 | documented (and with an implementation available to the public in 340 | source code form), and must require no special password or key for 341 | unpacking, reading or copying. 342 | 343 | 7. Additional Terms. 344 | 345 | "Additional permissions" are terms that supplement the terms of this 346 | License by making exceptions from one or more of its conditions. 347 | Additional permissions that are applicable to the entire Program shall 348 | be treated as though they were included in this License, to the extent 349 | that they are valid under applicable law. If additional permissions 350 | apply only to part of the Program, that part may be used separately 351 | under those permissions, but the entire Program remains governed by 352 | this License without regard to the additional permissions. 353 | 354 | When you convey a copy of a covered work, you may at your option 355 | remove any additional permissions from that copy, or from any part of 356 | it. (Additional permissions may be written to require their own 357 | removal in certain cases when you modify the work.) You may place 358 | additional permissions on material, added by you to a covered work, 359 | for which you have or can give appropriate copyright permission. 360 | 361 | Notwithstanding any other provision of this License, for material you 362 | add to a covered work, you may (if authorized by the copyright holders of 363 | that material) supplement the terms of this License with terms: 364 | 365 | a) Disclaiming warranty or limiting liability differently from the 366 | terms of sections 15 and 16 of this License; or 367 | 368 | b) Requiring preservation of specified reasonable legal notices or 369 | author attributions in that material or in the Appropriate Legal 370 | Notices displayed by works containing it; or 371 | 372 | c) Prohibiting misrepresentation of the origin of that material, or 373 | requiring that modified versions of such material be marked in 374 | reasonable ways as different from the original version; or 375 | 376 | d) Limiting the use for publicity purposes of names of licensors or 377 | authors of the material; or 378 | 379 | e) Declining to grant rights under trademark law for use of some 380 | trade names, trademarks, or service marks; or 381 | 382 | f) Requiring indemnification of licensors and authors of that 383 | material by anyone who conveys the material (or modified versions of 384 | it) with contractual assumptions of liability to the recipient, for 385 | any liability that these contractual assumptions directly impose on 386 | those licensors and authors. 387 | 388 | All other non-permissive additional terms are considered "further 389 | restrictions" within the meaning of section 10. If the Program as you 390 | received it, or any part of it, contains a notice stating that it is 391 | governed by this License along with a term that is a further 392 | restriction, you may remove that term. If a license document contains 393 | a further restriction but permits relicensing or conveying under this 394 | License, you may add to a covered work material governed by the terms 395 | of that license document, provided that the further restriction does 396 | not survive such relicensing or conveying. 397 | 398 | If you add terms to a covered work in accord with this section, you 399 | must place, in the relevant source files, a statement of the 400 | additional terms that apply to those files, or a notice indicating 401 | where to find the applicable terms. 402 | 403 | Additional terms, permissive or non-permissive, may be stated in the 404 | form of a separately written license, or stated as exceptions; 405 | the above requirements apply either way. 406 | 407 | 8. Termination. 408 | 409 | You may not propagate or modify a covered work except as expressly 410 | provided under this License. Any attempt otherwise to propagate or 411 | modify it is void, and will automatically terminate your rights under 412 | this License (including any patent licenses granted under the third 413 | paragraph of section 11). 414 | 415 | However, if you cease all violation of this License, then your 416 | license from a particular copyright holder is reinstated (a) 417 | provisionally, unless and until the copyright holder explicitly and 418 | finally terminates your license, and (b) permanently, if the copyright 419 | holder fails to notify you of the violation by some reasonable means 420 | prior to 60 days after the cessation. 421 | 422 | Moreover, your license from a particular copyright holder is 423 | reinstated permanently if the copyright holder notifies you of the 424 | violation by some reasonable means, this is the first time you have 425 | received notice of violation of this License (for any work) from that 426 | copyright holder, and you cure the violation prior to 30 days after 427 | your receipt of the notice. 428 | 429 | Termination of your rights under this section does not terminate the 430 | licenses of parties who have received copies or rights from you under 431 | this License. If your rights have been terminated and not permanently 432 | reinstated, you do not qualify to receive new licenses for the same 433 | material under section 10. 434 | 435 | 9. Acceptance Not Required for Having Copies. 436 | 437 | You are not required to accept this License in order to receive or 438 | run a copy of the Program. Ancillary propagation of a covered work 439 | occurring solely as a consequence of using peer-to-peer transmission 440 | to receive a copy likewise does not require acceptance. However, 441 | nothing other than this License grants you permission to propagate or 442 | modify any covered work. These actions infringe copyright if you do 443 | not accept this License. Therefore, by modifying or propagating a 444 | covered work, you indicate your acceptance of this License to do so. 445 | 446 | 10. Automatic Licensing of Downstream Recipients. 447 | 448 | Each time you convey a covered work, the recipient automatically 449 | receives a license from the original licensors, to run, modify and 450 | propagate that work, subject to this License. You are not responsible 451 | for enforcing compliance by third parties with this License. 452 | 453 | An "entity transaction" is a transaction transferring control of an 454 | organization, or substantially all assets of one, or subdividing an 455 | organization, or merging organizations. If propagation of a covered 456 | work results from an entity transaction, each party to that 457 | transaction who receives a copy of the work also receives whatever 458 | licenses to the work the party's predecessor in interest had or could 459 | give under the previous paragraph, plus a right to possession of the 460 | Corresponding Source of the work from the predecessor in interest, if 461 | the predecessor has it or can get it with reasonable efforts. 462 | 463 | You may not impose any further restrictions on the exercise of the 464 | rights granted or affirmed under this License. For example, you may 465 | not impose a license fee, royalty, or other charge for exercise of 466 | rights granted under this License, and you may not initiate litigation 467 | (including a cross-claim or counterclaim in a lawsuit) alleging that 468 | any patent claim is infringed by making, using, selling, offering for 469 | sale, or importing the Program or any portion of it. 470 | 471 | 11. Patents. 472 | 473 | A "contributor" is a copyright holder who authorizes use under this 474 | License of the Program or a work on which the Program is based. The 475 | work thus licensed is called the contributor's "contributor version". 476 | 477 | A contributor's "essential patent claims" are all patent claims 478 | owned or controlled by the contributor, whether already acquired or 479 | hereafter acquired, that would be infringed by some manner, permitted 480 | by this License, of making, using, or selling its contributor version, 481 | but do not include claims that would be infringed only as a 482 | consequence of further modification of the contributor version. For 483 | purposes of this definition, "control" includes the right to grant 484 | patent sublicenses in a manner consistent with the requirements of 485 | this License. 486 | 487 | Each contributor grants you a non-exclusive, worldwide, royalty-free 488 | patent license under the contributor's essential patent claims, to 489 | make, use, sell, offer for sale, import and otherwise run, modify and 490 | propagate the contents of its contributor version. 491 | 492 | In the following three paragraphs, a "patent license" is any express 493 | agreement or commitment, however denominated, not to enforce a patent 494 | (such as an express permission to practice a patent or covenant not to 495 | sue for patent infringement). To "grant" such a patent license to a 496 | party means to make such an agreement or commitment not to enforce a 497 | patent against the party. 498 | 499 | If you convey a covered work, knowingly relying on a patent license, 500 | and the Corresponding Source of the work is not available for anyone 501 | to copy, free of charge and under the terms of this License, through a 502 | publicly available network server or other readily accessible means, 503 | then you must either (1) cause the Corresponding Source to be so 504 | available, or (2) arrange to deprive yourself of the benefit of the 505 | patent license for this particular work, or (3) arrange, in a manner 506 | consistent with the requirements of this License, to extend the patent 507 | license to downstream recipients. "Knowingly relying" means you have 508 | actual knowledge that, but for the patent license, your conveying the 509 | covered work in a country, or your recipient's use of the covered work 510 | in a country, would infringe one or more identifiable patents in that 511 | country that you have reason to believe are valid. 512 | 513 | If, pursuant to or in connection with a single transaction or 514 | arrangement, you convey, or propagate by procuring conveyance of, a 515 | covered work, and grant a patent license to some of the parties 516 | receiving the covered work authorizing them to use, propagate, modify 517 | or convey a specific copy of the covered work, then the patent license 518 | you grant is automatically extended to all recipients of the covered 519 | work and works based on it. 520 | 521 | A patent license is "discriminatory" if it does not include within 522 | the scope of its coverage, prohibits the exercise of, or is 523 | conditioned on the non-exercise of one or more of the rights that are 524 | specifically granted under this License. You may not convey a covered 525 | work if you are a party to an arrangement with a third party that is 526 | in the business of distributing software, under which you make payment 527 | to the third party based on the extent of your activity of conveying 528 | the work, and under which the third party grants, to any of the 529 | parties who would receive the covered work from you, a discriminatory 530 | patent license (a) in connection with copies of the covered work 531 | conveyed by you (or copies made from those copies), or (b) primarily 532 | for and in connection with specific products or compilations that 533 | contain the covered work, unless you entered into that arrangement, 534 | or that patent license was granted, prior to 28 March 2007. 535 | 536 | Nothing in this License shall be construed as excluding or limiting 537 | any implied license or other defenses to infringement that may 538 | otherwise be available to you under applicable patent law. 539 | 540 | 12. No Surrender of Others' Freedom. 541 | 542 | If conditions are imposed on you (whether by court order, agreement or 543 | otherwise) that contradict the conditions of this License, they do not 544 | excuse you from the conditions of this License. If you cannot convey a 545 | covered work so as to satisfy simultaneously your obligations under this 546 | License and any other pertinent obligations, then as a consequence you may 547 | not convey it at all. For example, if you agree to terms that obligate you 548 | to collect a royalty for further conveying from those to whom you convey 549 | the Program, the only way you could satisfy both those terms and this 550 | License would be to refrain entirely from conveying the Program. 551 | 552 | 13. Use with the GNU Affero General Public License. 553 | 554 | Notwithstanding any other provision of this License, you have 555 | permission to link or combine any covered work with a work licensed 556 | under version 3 of the GNU Affero General Public License into a single 557 | combined work, and to convey the resulting work. The terms of this 558 | License will continue to apply to the part which is the covered work, 559 | but the special requirements of the GNU Affero General Public License, 560 | section 13, concerning interaction through a network will apply to the 561 | combination as such. 562 | 563 | 14. Revised Versions of this License. 564 | 565 | The Free Software Foundation may publish revised and/or new versions of 566 | the GNU General Public License from time to time. Such new versions will 567 | be similar in spirit to the present version, but may differ in detail to 568 | address new problems or concerns. 569 | 570 | Each version is given a distinguishing version number. If the 571 | Program specifies that a certain numbered version of the GNU General 572 | Public License "or any later version" applies to it, you have the 573 | option of following the terms and conditions either of that numbered 574 | version or of any later version published by the Free Software 575 | Foundation. If the Program does not specify a version number of the 576 | GNU General Public License, you may choose any version ever published 577 | by the Free Software Foundation. 578 | 579 | If the Program specifies that a proxy can decide which future 580 | versions of the GNU General Public License can be used, that proxy's 581 | public statement of acceptance of a version permanently authorizes you 582 | to choose that version for the Program. 583 | 584 | Later license versions may give you additional or different 585 | permissions. However, no additional obligations are imposed on any 586 | author or copyright holder as a result of your choosing to follow a 587 | later version. 588 | 589 | 15. Disclaimer of Warranty. 590 | 591 | THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY 592 | APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT 593 | HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY 594 | OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, 595 | THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR 596 | PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM 597 | IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF 598 | ALL NECESSARY SERVICING, REPAIR OR CORRECTION. 599 | 600 | 16. Limitation of Liability. 601 | 602 | IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING 603 | WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS 604 | THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY 605 | GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE 606 | USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF 607 | DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD 608 | PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), 609 | EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF 610 | SUCH DAMAGES. 611 | 612 | 17. Interpretation of Sections 15 and 16. 613 | 614 | If the disclaimer of warranty and limitation of liability provided 615 | above cannot be given local legal effect according to their terms, 616 | reviewing courts shall apply local law that most closely approximates 617 | an absolute waiver of all civil liability in connection with the 618 | Program, unless a warranty or assumption of liability accompanies a 619 | copy of the Program in return for a fee. 620 | 621 | END OF TERMS AND CONDITIONS 622 | 623 | How to Apply These Terms to Your New Programs 624 | 625 | If you develop a new program, and you want it to be of the greatest 626 | possible use to the public, the best way to achieve this is to make it 627 | free software which everyone can redistribute and change under these terms. 628 | 629 | To do so, attach the following notices to the program. It is safest 630 | to attach them to the start of each source file to most effectively 631 | state the exclusion of warranty; and each file should have at least 632 | the "copyright" line and a pointer to where the full notice is found. 633 | 634 | 635 | Copyright (C) 636 | 637 | This program is free software: you can redistribute it and/or modify 638 | it under the terms of the GNU General Public License as published by 639 | the Free Software Foundation, either version 3 of the License, or 640 | (at your option) any later version. 641 | 642 | This program is distributed in the hope that it will be useful, 643 | but WITHOUT ANY WARRANTY; without even the implied warranty of 644 | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 645 | GNU General Public License for more details. 646 | 647 | You should have received a copy of the GNU General Public License 648 | along with this program. If not, see . 649 | 650 | Also add information on how to contact you by electronic and paper mail. 651 | 652 | If the program does terminal interaction, make it output a short 653 | notice like this when it starts in an interactive mode: 654 | 655 | Copyright (C) 656 | This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'. 657 | This is free software, and you are welcome to redistribute it 658 | under certain conditions; type `show c' for details. 659 | 660 | The hypothetical commands `show w' and `show c' should show the appropriate 661 | parts of the General Public License. Of course, your program's commands 662 | might be different; for a GUI interface, you would use an "about box". 663 | 664 | You should also get your employer (if you work as a programmer) or school, 665 | if any, to sign a "copyright disclaimer" for the program, if necessary. 666 | For more information on this, and how to apply and follow the GNU GPL, see 667 | . 668 | 669 | The GNU General Public License does not permit incorporating your program 670 | into proprietary programs. If your program is a subroutine library, you 671 | may consider it more useful to permit linking proprietary applications with 672 | the library. If this is what you want to do, use the GNU Lesser General 673 | Public License instead of this License. But first, please read 674 | . 675 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # 垃圾分类小程序 2 | ## 小程序使用到的云开发内容 3 | > 不了解小程序云开发请访问[文档](https://developers.weixin.qq.com/miniprogram/dev/wxcloud/basis/getting-started.html) 4 | 5 | --- 6 | ## 截图 7 |
8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | --- 18 | 19 | 20 | ## 部分数据库截图(product.csv) 21 | ![部分数据库截图](https://gitee.com/lwzhang1101/images/raw/master/img/garbage/tiyan.jpg) 22 | ## 完整数据库截图 23 | ![完整数据库截图](https://gitee.com/lwzhang1101/images/raw/master/img/garbage/wanz.jpg) 24 | 25 | 云函数,云数据库: 26 | - 数据库:存储四种垃圾分类的相关垃圾数据, 创建表commit,sort,product。把sort.json 和product.csv 导入云数据库即可(需要完整数据的可以通过下面的联系方式,联系我) 27 | > * QQ: 383755537 28 | > * WX: bjawenfd 29 | - 云函数:获取百度识别库的accessToken 30 | [百度AI识别库地址](http://ai.baidu.com/docs#/ImageClassify-API/ebc492b1) 31 | [QQ AI地址](https://ai.qq.com/) 32 | 33 | ## 需要修改为自己的key 34 | 1. 小程序key 在文件project.config.json->appid 记住创建小程序的时候选择云开发 35 | 2. 百度key 主要做拍照识别的cloudfunctions->baiduAccessToken->index->apiKey和secretKey 36 | 此处替换为:API Key 和 Secret Key 37 | 38 | ## 常见错误 39 | 1. 没有自己部署云函数 40 | 2. 数据库没有给与相应的权限,最好给最大权限 41 | 3. 需要的key 配置错误。 42 | 4. 没有创建数据库名称 43 | 44 | ## 直接扫码体验 45 | ![标准垃圾分类](https://gitee.com/lwzhang1101/images/raw/master/img/garbage/erweima01.jpg) 46 | ## 其他小程序 47 | ![婚礼邀请函love](https://gitee.com/lwzhang1101/images/raw/master/img/marry/自制婚礼请柬1.jpg) 48 | 49 | [源码](https://github.com/zhangliwen1101/wedding) 50 | 51 | ## 打赏(需要完整版数据的可以联系我) 52 | 码砖不易,如果您需要,随意打赏,从零开始搭建此项目,直到发版 ->后期运营~ 53 | > * QQ: 383755537 54 | > * WX: bjawenfd 55 | 56 | ### 支付宝 57 | 58 | 59 | 60 | ### 微信 61 | 62 | 63 | 64 | ### 扫码关注,私信,拿完整源码: 65 | 66 | 67 | 68 | ## License 69 | 70 | [MIT](http://opensource.org/licenses/MIT) 71 | 72 | Copyright (c) 2019-present, developed by jack.zhang 73 | 74 | 75 | -------------------------------------------------------------------------------- /miniprogram/app.js: -------------------------------------------------------------------------------- 1 | //app.js 2 | App({ 3 | onLaunch: function() { 4 | 5 | if (!wx.cloud) { 6 | console.error('请使用 2.2.3 或以上的基础库以使用云能力') 7 | } else { 8 | wx.cloud.init({ 9 | env: 'debug-5c669b', 10 | traceUser: true, 11 | }) 12 | } 13 | const updateManager = wx.getUpdateManager() 14 | updateManager.onCheckForUpdate(function(res) { 15 | console.log(res.hasUpdate) 16 | if (res.hasUpdate) { 17 | updateManager.onUpdateReady(function() { 18 | wx.showModal({ 19 | title: '更新提示', 20 | content: '新版本已经准备好,是否重启应用?', 21 | success: function(res) { 22 | if (res.confirm) { 23 | updateManager.applyUpdate() 24 | } 25 | } 26 | }) 27 | }) 28 | } 29 | }) 30 | updateManager.onUpdateFailed(function() { 31 | // 新版本下载失败 32 | }) 33 | 34 | }, 35 | globalData: {} 36 | }) -------------------------------------------------------------------------------- /miniprogram/app.json: -------------------------------------------------------------------------------- 1 | { 2 | "pages": [ 3 | "pages/ai/index", 4 | "pages/ai/camera/camera", 5 | "pages/ai/search", 6 | "pages/ai/filter/filter", 7 | "pages/android/qa", 8 | "pages/index/index", 9 | "pages/sort/sort", 10 | "pages/result/gan", 11 | "pages/result/list", 12 | "pages/result/commit" 13 | ], 14 | "window": { 15 | "backgroundColor": "#F6F6F6", 16 | "backgroundTextStyle": "light", 17 | "navigationBarBackgroundColor": "#00cc77", 18 | "navigationBarTitleText": "智能垃圾分类", 19 | "navigationBarTextStyle": "white" 20 | }, 21 | "tabBar": { 22 | "list": [ 23 | { 24 | "pagePath": "pages/ai/index", 25 | "text": "识别", 26 | "iconPath": "images/icon_ai_default.png", 27 | "selectedIconPath": "images/icon_ai.png" 28 | }, 29 | 30 | { 31 | "pagePath": "pages/sort/sort", 32 | "text": "分类", 33 | "iconPath": "images/icon_sort_default.png", 34 | "selectedIconPath": "images/icon_sort.png" 35 | } 36 | ] 37 | }, 38 | "sitemapLocation": "sitemap.json" 39 | } -------------------------------------------------------------------------------- /miniprogram/app.wxss: -------------------------------------------------------------------------------- 1 | @import "colorui/main.wxss"; 2 | @import "colorui/icon.wxss"; 3 | /**app.wxss**/ 4 | .container { 5 | display: flex; 6 | flex-direction: column; 7 | align-items: center; 8 | box-sizing: border-box; 9 | } 10 | 11 | button { 12 | background: initial; 13 | } 14 | 15 | button:focus{ 16 | outline: 0; 17 | } 18 | 19 | button::after{ 20 | border: none; 21 | } 22 | 23 | 24 | page { 25 | background: #f6f6f6; 26 | display: flex; 27 | flex-direction: column; 28 | justify-content: flex-start; 29 | } 30 | 31 | .userinfo, .uploader, .tunnel { 32 | margin-top: 40rpx; 33 | height: 140rpx; 34 | width: 100%; 35 | background: #fff; 36 | border: 1px solid rgba(0, 0, 0, 0.1); 37 | border-left: none; 38 | border-right: none; 39 | display: flex; 40 | flex-direction: row; 41 | align-items: center; 42 | transition: all 300ms ease; 43 | } 44 | 45 | .userinfo-avatar { 46 | width: 100rpx; 47 | height: 100rpx; 48 | margin: 20rpx; 49 | border-radius: 50%; 50 | background-size: cover; 51 | background-color: white; 52 | } 53 | 54 | .userinfo-avatar:after { 55 | border: none; 56 | } 57 | 58 | .userinfo-nickname { 59 | font-size: 32rpx; 60 | color: #007aff; 61 | background-color: white; 62 | background-size: cover; 63 | } 64 | 65 | .userinfo-nickname::after { 66 | border: none; 67 | } 68 | 69 | .uploader, .tunnel { 70 | height: auto; 71 | padding: 0 0 0 40rpx; 72 | flex-direction: column; 73 | align-items: flex-start; 74 | box-sizing: border-box; 75 | } 76 | 77 | .uploader-text, .tunnel-text { 78 | width: 100%; 79 | line-height: 52px; 80 | font-size: 34rpx; 81 | color: #007aff; 82 | } 83 | 84 | .uploader-container { 85 | width: 100%; 86 | height: 400rpx; 87 | padding: 20rpx 20rpx 20rpx 0; 88 | display: flex; 89 | align-content: center; 90 | justify-content: center; 91 | box-sizing: border-box; 92 | border-top: 1px solid rgba(0, 0, 0, 0.1); 93 | } 94 | 95 | .uploader-image { 96 | width: 100%; 97 | height: 360rpx; 98 | } 99 | 100 | .tunnel { 101 | padding: 0 0 0 40rpx; 102 | } 103 | 104 | .tunnel-text { 105 | position: relative; 106 | color: #222; 107 | display: flex; 108 | flex-direction: row; 109 | align-content: center; 110 | justify-content: space-between; 111 | box-sizing: border-box; 112 | border-top: 1px solid rgba(0, 0, 0, 0.1); 113 | } 114 | 115 | .tunnel-text:first-child { 116 | border-top: none; 117 | } 118 | 119 | .tunnel-switch { 120 | position: absolute; 121 | right: 20rpx; 122 | top: -2rpx; 123 | } 124 | 125 | .disable { 126 | color: #888; 127 | } 128 | 129 | .service { 130 | position: fixed; 131 | right: 40rpx; 132 | bottom: 40rpx; 133 | width: 140rpx; 134 | height: 140rpx; 135 | border-radius: 50%; 136 | background: linear-gradient(#007aff, #0063ce); 137 | box-shadow: 0 5px 10px rgba(0, 0, 0, 0.3); 138 | display: flex; 139 | align-content: center; 140 | justify-content: center; 141 | transition: all 300ms ease; 142 | } 143 | 144 | .service-button { 145 | position: absolute; 146 | top: 40rpx; 147 | } 148 | 149 | .service:active { 150 | box-shadow: none; 151 | } 152 | 153 | .request-text { 154 | padding: 20rpx 0; 155 | font-size: 24rpx; 156 | line-height: 36rpx; 157 | word-break: break-all; 158 | } 159 | -------------------------------------------------------------------------------- /miniprogram/cloudfunctions/addGarbage/index.js: -------------------------------------------------------------------------------- 1 | // 云函数入口文件 2 | const cloud = require('wx-server-sdk') 3 | 4 | cloud.init() 5 | const db = cloud.database() 6 | // 云函数入口函数 7 | exports.main = async(event, context) => { 8 | return new Promise(async (resolve, reject) => { 9 | try { 10 | console.log("name===="+event.name) 11 | let dataBack="" 12 | var datas =await db.collection('product'). 13 | where({ name: event.name }).get() 14 | console.log(datas) 15 | dataBack=datas.data 16 | if (datas.data.length>0){ 17 | dataBack = { errCode: 1, errMsg: "已经存在" } 18 | }else{ 19 | var result = await db.collection('product').add({ 20 | data: { 21 | name: event.name, 22 | sortId: event.sortId 23 | } 24 | }) 25 | if (result._id == undefined || result._id == "" ){ 26 | dataBack = { errCode: 0, errMsg: "插入失败" } 27 | }else{ 28 | dataBack = { errCode: 0, errMsg: "插入成功" } 29 | } 30 | } 31 | resolve({ 32 | data:dataBack, 33 | }) 34 | } catch (error) { 35 | console.log(error) 36 | if (!error.code) reject(error) 37 | resolve(error) 38 | } 39 | }) 40 | 41 | 42 | } -------------------------------------------------------------------------------- /miniprogram/cloudfunctions/addGarbage/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "addGarbage", 3 | "version": "1.0.0", 4 | "description": "", 5 | "main": "index.js", 6 | "scripts": { 7 | "test": "echo \"Error: no test specified\" && exit 1" 8 | }, 9 | "author": "", 10 | "license": "ISC", 11 | "dependencies": { 12 | "wx-server-sdk": "latest" 13 | } 14 | } -------------------------------------------------------------------------------- /miniprogram/cloudfunctions/baiduAccessToken/index.js: -------------------------------------------------------------------------------- 1 | const rq = require('request-promise') 2 | // 3 | /** 4 | * 获取百度ai AccessToken 5 | */ 6 | exports.main = async(event, context) => { 7 | let apiKey = '', 8 | grantType = 'client_credentials', 9 | secretKey = '', 10 | url = `` 11 | 12 | return new Promise(async(resolve, reject) => { 13 | try { 14 | let data = await rq({ 15 | method: 'POST', 16 | url, 17 | form: { 18 | "grant_type": grantType, 19 | "client_secret": secretKey, 20 | "client_id": apiKey 21 | }, 22 | json: true 23 | }) 24 | resolve({ 25 | code: 0, 26 | data, 27 | info: '操作成功!' 28 | }) 29 | } catch (error) { 30 | console.log(error) 31 | if (!error.code) reject(error) 32 | resolve(error) 33 | } 34 | }) 35 | } 36 | -------------------------------------------------------------------------------- /miniprogram/cloudfunctions/baiduAccessToken/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "baiduAccessToken", 3 | "version": "1.0.0", 4 | "description": "", 5 | "main": "index.js", 6 | "scripts": { 7 | "test": "echo \"Error: no test specified\" && exit 1" 8 | }, 9 | "author": "", 10 | "license": "ISC", 11 | "dependencies": { 12 | "request-promise": "latest" 13 | } 14 | } -------------------------------------------------------------------------------- /miniprogram/cloudfunctions/commitToBarbarge/index.js: -------------------------------------------------------------------------------- 1 | // 云函数入口文件 2 | const cloud = require('wx-server-sdk') 3 | 4 | cloud.init() 5 | const db = cloud.database() 6 | // 云函数入口函数 7 | exports.main = async (event, context) => { 8 | return new Promise(async (resolve, reject) => { 9 | try { 10 | console.log("name====" + event.name) 11 | console.log("name====" + JSON.stringify(event)) 12 | let dataBack = "" 13 | var datas = await db.collection('product'). 14 | where({ name: event.name }).get() 15 | console.log(datas) 16 | dataBack = datas.data 17 | if (datas.data.length > 0) { 18 | var result = await db.collection('commit').where( 19 | { keyword: event.name, _id: event.id }).remove() 20 | console.log("===" + JSON.stringify(result)) 21 | var resultStats=result.stats 22 | console.log("===" + JSON.stringify(resultStats)) 23 | console.log("===" + JSON.stringify(resultStats.removed)) 24 | if (resultStats.removed == 0 || resultStats.removed == 1) { 25 | dataBack = { errCode: 0, errMsg: "已经存在,commit 表删除成功" } 26 | } else { 27 | dataBack = { errCode: 1, errMsg: "已经存在,但commit表删除失败" } 28 | } 29 | } else { 30 | var result = await db.collection('product').add({ 31 | data: { 32 | name: event.name, 33 | sortId: event.sortId 34 | } 35 | }) 36 | if (result._id == undefined || result._id == "") { 37 | dataBack = { errCode: 0, errMsg: "插入失败" } 38 | } else { 39 | //去删除 commit 表的相关数据 40 | var result = await db.collection('commit').where( 41 | { keyword: event.name ,_id:event.id}).remove() 42 | console.log("==="+JSON.stringify(result)) 43 | var resultStats = result.stats 44 | console.log("===" + JSON.stringify(resultStats)) 45 | console.log("===" + JSON.stringify(resultStats.removed)) 46 | if (resultStats.removed == 0 || resultStats.removed == 1){ 47 | dataBack = { errCode: 0, errMsg: "完美成功" } 48 | }else{ 49 | dataBack = { errCode: 1, errMsg: "插入成功,但commit表删除失败" } 50 | } 51 | } 52 | } 53 | resolve({ 54 | data: dataBack, 55 | }) 56 | } catch (error) { 57 | console.log(error) 58 | if (!error.code) reject(error) 59 | resolve(error) 60 | } 61 | }) 62 | 63 | 64 | } -------------------------------------------------------------------------------- /miniprogram/cloudfunctions/commitToBarbarge/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "commitToBarbarge", 3 | "version": "1.0.0", 4 | "description": "", 5 | "main": "index.js", 6 | "scripts": { 7 | "test": "echo \"Error: no test specified\" && exit 1" 8 | }, 9 | "author": "", 10 | "license": "ISC", 11 | "dependencies": { 12 | "wx-server-sdk": "latest" 13 | } 14 | } -------------------------------------------------------------------------------- /miniprogram/cloudfunctions/login/config.json: -------------------------------------------------------------------------------- 1 | { 2 | "permissions": { 3 | "openapi": [] 4 | } 5 | } 6 | -------------------------------------------------------------------------------- /miniprogram/cloudfunctions/login/index.js: -------------------------------------------------------------------------------- 1 | // 云函数模板 2 | // 部署:在 cloud-functions/login 文件夹右击选择 “上传并部署” 3 | 4 | const cloud = require('wx-server-sdk') 5 | 6 | // 初始化 cloud 7 | cloud.init() 8 | 9 | /** 10 | * 这个示例将经自动鉴权过的小程序用户 openid 返回给小程序端 11 | * 12 | * event 参数包含小程序端调用传入的 data 13 | * 14 | */ 15 | exports.main = (event, context) => { 16 | console.log(event) 17 | console.log(context) 18 | 19 | // 可执行其他自定义逻辑 20 | // console.log 的内容可以在云开发云函数调用日志查看 21 | 22 | // 获取 WX Context (微信调用上下文),包括 OPENID、APPID、及 UNIONID(需满足 UNIONID 获取条件) 23 | const wxContext = cloud.getWXContext() 24 | 25 | return { 26 | event, 27 | openid: wxContext.OPENID, 28 | appid: wxContext.APPID, 29 | unionid: wxContext.UNIONID, 30 | } 31 | } 32 | -------------------------------------------------------------------------------- /miniprogram/cloudfunctions/login/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "login", 3 | "version": "1.0.0", 4 | "description": "", 5 | "main": "index.js", 6 | "scripts": { 7 | "test": "echo \"Error: no test specified\" && exit 1" 8 | }, 9 | "author": "", 10 | "license": "ISC", 11 | "dependencies": { 12 | "wx-server-sdk": "latest" 13 | } 14 | } 15 | -------------------------------------------------------------------------------- /miniprogram/cloudfunctions/sum/index.js: -------------------------------------------------------------------------------- 1 | // 云函数入口文件 2 | const cloud = require('wx-server-sdk') 3 | 4 | cloud.init() 5 | 6 | // 云函数入口函数 7 | exports.main = (event, context) => { 8 | console.log(event) 9 | console.log(context) 10 | return { 11 | sum: event.a + event.b 12 | } 13 | } -------------------------------------------------------------------------------- /miniprogram/cloudfunctions/sum/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "sum", 3 | "version": "1.0.0", 4 | "description": "", 5 | "main": "index.js", 6 | "scripts": { 7 | "test": "echo \"Error: no test specified\" && exit 1" 8 | }, 9 | "author": "", 10 | "license": "ISC", 11 | "dependencies": { 12 | "wx-server-sdk": "latest" 13 | } 14 | } -------------------------------------------------------------------------------- /miniprogram/colorui/animation.wxss: -------------------------------------------------------------------------------- 1 | /* 2 | Animation 微动画 3 | 基于ColorUI组建库的动画模块 by 文晓港 2019年3月26日19:52:28 4 | */ 5 | 6 | /* css 滤镜 控制黑白底色gif的 */ 7 | .gif-black{ 8 | mix-blend-mode: screen; 9 | } 10 | .gif-white{ 11 | mix-blend-mode: multiply; 12 | } 13 | 14 | 15 | /* Animation css */ 16 | [class*=animation-] { 17 | animation-duration: .5s; 18 | animation-timing-function: ease-out; 19 | animation-fill-mode: both 20 | } 21 | 22 | .animation-fade { 23 | animation-name: fade; 24 | animation-duration: .8s; 25 | animation-timing-function: linear 26 | } 27 | 28 | .animation-scale-up { 29 | animation-name: scale-up 30 | } 31 | 32 | .animation-scale-down { 33 | animation-name: scale-down 34 | } 35 | 36 | .animation-slide-top { 37 | animation-name: slide-top 38 | } 39 | 40 | .animation-slide-bottom { 41 | animation-name: slide-bottom 42 | } 43 | 44 | .animation-slide-left { 45 | animation-name: slide-left 46 | } 47 | 48 | .animation-slide-right { 49 | animation-name: slide-right 50 | } 51 | 52 | .animation-shake { 53 | animation-name: shake 54 | } 55 | 56 | .animation-reverse { 57 | animation-direction: reverse 58 | } 59 | 60 | @keyframes fade { 61 | 0% { 62 | opacity: 0 63 | } 64 | 65 | 100% { 66 | opacity: 1 67 | } 68 | } 69 | 70 | @keyframes scale-up { 71 | 0% { 72 | opacity: 0; 73 | transform: scale(.2) 74 | } 75 | 76 | 100% { 77 | opacity: 1; 78 | transform: scale(1) 79 | } 80 | } 81 | 82 | @keyframes scale-down { 83 | 0% { 84 | opacity: 0; 85 | transform: scale(1.8) 86 | } 87 | 88 | 100% { 89 | opacity: 1; 90 | transform: scale(1) 91 | } 92 | } 93 | 94 | @keyframes slide-top { 95 | 0% { 96 | opacity: 0; 97 | transform: translateY(-100%) 98 | } 99 | 100 | 100% { 101 | opacity: 1; 102 | transform: translateY(0) 103 | } 104 | } 105 | 106 | @keyframes slide-bottom { 107 | 0% { 108 | opacity: 0; 109 | transform: translateY(100%) 110 | } 111 | 112 | 100% { 113 | opacity: 1; 114 | transform: translateY(0) 115 | } 116 | } 117 | 118 | @keyframes shake { 119 | 120 | 0%, 121 | 100% { 122 | transform: translateX(0) 123 | } 124 | 125 | 10% { 126 | transform: translateX(-9px) 127 | } 128 | 129 | 20% { 130 | transform: translateX(8px) 131 | } 132 | 133 | 30% { 134 | transform: translateX(-7px) 135 | } 136 | 137 | 40% { 138 | transform: translateX(6px) 139 | } 140 | 141 | 50% { 142 | transform: translateX(-5px) 143 | } 144 | 145 | 60% { 146 | transform: translateX(4px) 147 | } 148 | 149 | 70% { 150 | transform: translateX(-3px) 151 | } 152 | 153 | 80% { 154 | transform: translateX(2px) 155 | } 156 | 157 | 90% { 158 | transform: translateX(-1px) 159 | } 160 | } 161 | 162 | @keyframes slide-left { 163 | 0% { 164 | opacity: 0; 165 | transform: translateX(-100%) 166 | } 167 | 168 | 100% { 169 | opacity: 1; 170 | transform: translateX(0) 171 | } 172 | } 173 | 174 | @keyframes slide-right { 175 | 0% { 176 | opacity: 0; 177 | transform: translateX(100%) 178 | } 179 | 180 | 100% { 181 | opacity: 1; 182 | transform: translateX(0) 183 | } 184 | } -------------------------------------------------------------------------------- /miniprogram/colorui/components/cu-custom.js: -------------------------------------------------------------------------------- 1 | const app = getApp(); 2 | Component({ 3 | /** 4 | * 组件的一些选项 5 | */ 6 | options: { 7 | addGlobalClass: true, 8 | multipleSlots: true 9 | }, 10 | /** 11 | * 组件的对外属性 12 | */ 13 | properties: { 14 | bgColor: { 15 | type: String, 16 | default: '' 17 | }, 18 | isCustom: { 19 | type: [Boolean, String], 20 | default: false 21 | }, 22 | isBack: { 23 | type: [Boolean, String], 24 | default: false 25 | }, 26 | bgImage: { 27 | type: String, 28 | default: '' 29 | }, 30 | }, 31 | /** 32 | * 组件的初始数据 33 | */ 34 | data: { 35 | StatusBar: app.globalData.StatusBar, 36 | CustomBar: app.globalData.CustomBar, 37 | Custom: app.globalData.Custom 38 | }, 39 | /** 40 | * 组件的方法列表 41 | */ 42 | methods: { 43 | BackPage() { 44 | wx.navigateBack({ 45 | delta: 1 46 | }); 47 | }, 48 | toHome(){ 49 | wx.reLaunch({ 50 | url: '/pages/index/index', 51 | }) 52 | } 53 | } 54 | }) -------------------------------------------------------------------------------- /miniprogram/colorui/components/cu-custom.json: -------------------------------------------------------------------------------- 1 | { 2 | "component": true, 3 | "usingComponents": {} 4 | } -------------------------------------------------------------------------------- /miniprogram/colorui/components/cu-custom.wxml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | -------------------------------------------------------------------------------- /miniprogram/colorui/components/cu-custom.wxss: -------------------------------------------------------------------------------- 1 | /* colorui/components/cu-custom.wxss */ -------------------------------------------------------------------------------- /miniprogram/colorui/icon.wxss: -------------------------------------------------------------------------------- 1 | @keyframes cuIcon-spin { 2 | 0% { 3 | -webkit-transform: rotate(0); 4 | transform: rotate(0); 5 | } 6 | 7 | 100% { 8 | -webkit-transform: rotate(359deg); 9 | transform: rotate(359deg); 10 | } 11 | } 12 | 13 | .iconfont-spin { 14 | -webkit-animation: cuIcon-spin 2s infinite linear; 15 | animation: cuIcon-spin 2s infinite linear; 16 | display: inline-block; 17 | } 18 | 19 | .iconfont-pulse { 20 | -webkit-animation: cuIcon-spin 1s infinite steps(8); 21 | animation: cuIcon-spin 1s infinite steps(8); 22 | display: inline-block; 23 | } 24 | 25 | [class*="cuIcon-"] { 26 | font-family: "cuIcon"; 27 | font-size: inherit; 28 | font-style: normal; 29 | } 30 | 31 | @font-face { 32 | font-family: "cuIcon"; 33 | src: url('//at.alicdn.com/t/font_533566_yfq2d9wdij.eot?t=1545239985831'); 34 | /* IE9*/ 35 | src: url('//at.alicdn.com/t/font_533566_yfq2d9wdij.eot?t=1545239985831#iefix') format('embedded-opentype'), 36 | /* IE6-IE8 */ 37 | url('data:application/x-font-woff;charset=utf-8;base64,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') format('woff'), 38 | url('//at.alicdn.com/t/font_533566_yfq2d9wdij.ttf?t=1545239985831') format('truetype'), 39 | /* chrome, firefox, opera, Safari, Android, iOS 4.2+*/ 40 | url('//at.alicdn.com/t/font_533566_yfq2d9wdij.svg?t=1545239985831#iconfont') format('svg'); 41 | /* iOS 4.1- */ 42 | } 43 | 44 | .cuIcon-appreciate:before { 45 | content: "\e644"; 46 | } 47 | 48 | .cuIcon-check:before { 49 | content: "\e645"; 50 | } 51 | 52 | .cuIcon-close:before { 53 | content: "\e646"; 54 | } 55 | 56 | .cuIcon-edit:before { 57 | content: "\e649"; 58 | } 59 | 60 | .cuIcon-emoji:before { 61 | content: "\e64a"; 62 | } 63 | 64 | .cuIcon-favorfill:before { 65 | content: "\e64b"; 66 | } 67 | 68 | .cuIcon-favor:before { 69 | content: "\e64c"; 70 | } 71 | 72 | .cuIcon-loading:before { 73 | content: "\e64f"; 74 | } 75 | 76 | .cuIcon-locationfill:before { 77 | content: "\e650"; 78 | } 79 | 80 | .cuIcon-location:before { 81 | content: "\e651"; 82 | } 83 | 84 | .cuIcon-phone:before { 85 | content: "\e652"; 86 | } 87 | 88 | .cuIcon-roundcheckfill:before { 89 | content: "\e656"; 90 | } 91 | 92 | .cuIcon-roundcheck:before { 93 | content: "\e657"; 94 | } 95 | 96 | .cuIcon-roundclosefill:before { 97 | content: "\e658"; 98 | } 99 | 100 | .cuIcon-roundclose:before { 101 | content: "\e659"; 102 | } 103 | 104 | .cuIcon-roundrightfill:before { 105 | content: "\e65a"; 106 | } 107 | 108 | .cuIcon-roundright:before { 109 | content: "\e65b"; 110 | } 111 | 112 | .cuIcon-search:before { 113 | content: "\e65c"; 114 | } 115 | 116 | .cuIcon-taxi:before { 117 | content: "\e65d"; 118 | } 119 | 120 | .cuIcon-timefill:before { 121 | content: "\e65e"; 122 | } 123 | 124 | .cuIcon-time:before { 125 | content: "\e65f"; 126 | } 127 | 128 | .cuIcon-unfold:before { 129 | content: "\e661"; 130 | } 131 | 132 | .cuIcon-warnfill:before { 133 | content: "\e662"; 134 | } 135 | 136 | .cuIcon-warn:before { 137 | content: "\e663"; 138 | } 139 | 140 | .cuIcon-camerafill:before { 141 | content: "\e664"; 142 | } 143 | 144 | .cuIcon-camera:before { 145 | content: "\e665"; 146 | } 147 | 148 | .cuIcon-commentfill:before { 149 | content: "\e666"; 150 | } 151 | 152 | .cuIcon-comment:before { 153 | content: "\e667"; 154 | } 155 | 156 | .cuIcon-likefill:before { 157 | content: "\e668"; 158 | } 159 | 160 | .cuIcon-like:before { 161 | content: "\e669"; 162 | } 163 | 164 | .cuIcon-notificationfill:before { 165 | content: "\e66a"; 166 | } 167 | 168 | .cuIcon-notification:before { 169 | content: "\e66b"; 170 | } 171 | 172 | .cuIcon-order:before { 173 | content: "\e66c"; 174 | } 175 | 176 | .cuIcon-samefill:before { 177 | content: "\e66d"; 178 | } 179 | 180 | .cuIcon-same:before { 181 | content: "\e66e"; 182 | } 183 | 184 | .cuIcon-deliver:before { 185 | content: "\e671"; 186 | } 187 | 188 | .cuIcon-evaluate:before { 189 | content: "\e672"; 190 | } 191 | 192 | .cuIcon-pay:before { 193 | content: "\e673"; 194 | } 195 | 196 | .cuIcon-send:before { 197 | content: "\e675"; 198 | } 199 | 200 | .cuIcon-shop:before { 201 | content: "\e676"; 202 | } 203 | 204 | .cuIcon-ticket:before { 205 | content: "\e677"; 206 | } 207 | 208 | .cuIcon-back:before { 209 | content: "\e679"; 210 | } 211 | 212 | .cuIcon-cascades:before { 213 | content: "\e67c"; 214 | } 215 | 216 | .cuIcon-discover:before { 217 | content: "\e67e"; 218 | } 219 | 220 | .cuIcon-list:before { 221 | content: "\e682"; 222 | } 223 | 224 | .cuIcon-more:before { 225 | content: "\e684"; 226 | } 227 | 228 | .cuIcon-scan:before { 229 | content: "\e689"; 230 | } 231 | 232 | .cuIcon-settings:before { 233 | content: "\e68a"; 234 | } 235 | 236 | .cuIcon-questionfill:before { 237 | content: "\e690"; 238 | } 239 | 240 | .cuIcon-question:before { 241 | content: "\e691"; 242 | } 243 | 244 | .cuIcon-shopfill:before { 245 | content: "\e697"; 246 | } 247 | 248 | .cuIcon-form:before { 249 | content: "\e699"; 250 | } 251 | 252 | .cuIcon-pic:before { 253 | content: "\e69b"; 254 | } 255 | 256 | .cuIcon-filter:before { 257 | content: "\e69c"; 258 | } 259 | 260 | .cuIcon-footprint:before { 261 | content: "\e69d"; 262 | } 263 | 264 | .cuIcon-top:before { 265 | content: "\e69e"; 266 | } 267 | 268 | .cuIcon-pulldown:before { 269 | content: "\e69f"; 270 | } 271 | 272 | .cuIcon-pullup:before { 273 | content: "\e6a0"; 274 | } 275 | 276 | .cuIcon-right:before { 277 | content: "\e6a3"; 278 | } 279 | 280 | .cuIcon-refresh:before { 281 | content: "\e6a4"; 282 | } 283 | 284 | .cuIcon-moreandroid:before { 285 | content: "\e6a5"; 286 | } 287 | 288 | .cuIcon-deletefill:before { 289 | content: "\e6a6"; 290 | } 291 | 292 | .cuIcon-refund:before { 293 | content: "\e6ac"; 294 | } 295 | 296 | .cuIcon-cart:before { 297 | content: "\e6af"; 298 | } 299 | 300 | .cuIcon-qrcode:before { 301 | content: "\e6b0"; 302 | } 303 | 304 | .cuIcon-remind:before { 305 | content: "\e6b2"; 306 | } 307 | 308 | .cuIcon-delete:before { 309 | content: "\e6b4"; 310 | } 311 | 312 | .cuIcon-profile:before { 313 | content: "\e6b7"; 314 | } 315 | 316 | .cuIcon-home:before { 317 | content: "\e6b8"; 318 | } 319 | 320 | .cuIcon-cartfill:before { 321 | content: "\e6b9"; 322 | } 323 | 324 | .cuIcon-discoverfill:before { 325 | content: "\e6ba"; 326 | } 327 | 328 | .cuIcon-homefill:before { 329 | content: "\e6bb"; 330 | } 331 | 332 | .cuIcon-message:before { 333 | content: "\e6bc"; 334 | } 335 | 336 | .cuIcon-addressbook:before { 337 | content: "\e6bd"; 338 | } 339 | 340 | .cuIcon-link:before { 341 | content: "\e6bf"; 342 | } 343 | 344 | .cuIcon-lock:before { 345 | content: "\e6c0"; 346 | } 347 | 348 | .cuIcon-unlock:before { 349 | content: "\e6c2"; 350 | } 351 | 352 | .cuIcon-vip:before { 353 | content: "\e6c3"; 354 | } 355 | 356 | .cuIcon-weibo:before { 357 | content: "\e6c4"; 358 | } 359 | 360 | .cuIcon-activity:before { 361 | content: "\e6c5"; 362 | } 363 | 364 | .cuIcon-friendaddfill:before { 365 | content: "\e6c9"; 366 | } 367 | 368 | .cuIcon-friendadd:before { 369 | content: "\e6ca"; 370 | } 371 | 372 | .cuIcon-friendfamous:before { 373 | content: "\e6cb"; 374 | } 375 | 376 | .cuIcon-friend:before { 377 | content: "\e6cc"; 378 | } 379 | 380 | .cuIcon-goods:before { 381 | content: "\e6cd"; 382 | } 383 | 384 | .cuIcon-selection:before { 385 | content: "\e6ce"; 386 | } 387 | 388 | .cuIcon-explore:before { 389 | content: "\e6d2"; 390 | } 391 | 392 | .cuIcon-present:before { 393 | content: "\e6d3"; 394 | } 395 | 396 | .cuIcon-squarecheckfill:before { 397 | content: "\e6d4"; 398 | } 399 | 400 | .cuIcon-square:before { 401 | content: "\e6d5"; 402 | } 403 | 404 | .cuIcon-squarecheck:before { 405 | content: "\e6d6"; 406 | } 407 | 408 | .cuIcon-round:before { 409 | content: "\e6d7"; 410 | } 411 | 412 | .cuIcon-roundaddfill:before { 413 | content: "\e6d8"; 414 | } 415 | 416 | .cuIcon-roundadd:before { 417 | content: "\e6d9"; 418 | } 419 | 420 | .cuIcon-add:before { 421 | content: "\e6da"; 422 | } 423 | 424 | .cuIcon-notificationforbidfill:before { 425 | content: "\e6db"; 426 | } 427 | 428 | .cuIcon-explorefill:before { 429 | content: "\e6dd"; 430 | } 431 | 432 | .cuIcon-fold:before { 433 | content: "\e6de"; 434 | } 435 | 436 | .cuIcon-game:before { 437 | content: "\e6df"; 438 | } 439 | 440 | .cuIcon-redpacket:before { 441 | content: "\e6e0"; 442 | } 443 | 444 | .cuIcon-selectionfill:before { 445 | content: "\e6e1"; 446 | } 447 | 448 | .cuIcon-similar:before { 449 | content: "\e6e2"; 450 | } 451 | 452 | .cuIcon-appreciatefill:before { 453 | content: "\e6e3"; 454 | } 455 | 456 | .cuIcon-infofill:before { 457 | content: "\e6e4"; 458 | } 459 | 460 | .cuIcon-info:before { 461 | content: "\e6e5"; 462 | } 463 | 464 | .cuIcon-forwardfill:before { 465 | content: "\e6ea"; 466 | } 467 | 468 | .cuIcon-forward:before { 469 | content: "\e6eb"; 470 | } 471 | 472 | .cuIcon-rechargefill:before { 473 | content: "\e6ec"; 474 | } 475 | 476 | .cuIcon-recharge:before { 477 | content: "\e6ed"; 478 | } 479 | 480 | .cuIcon-vipcard:before { 481 | content: "\e6ee"; 482 | } 483 | 484 | .cuIcon-voice:before { 485 | content: "\e6ef"; 486 | } 487 | 488 | .cuIcon-voicefill:before { 489 | content: "\e6f0"; 490 | } 491 | 492 | .cuIcon-friendfavor:before { 493 | content: "\e6f1"; 494 | } 495 | 496 | .cuIcon-wifi:before { 497 | content: "\e6f2"; 498 | } 499 | 500 | .cuIcon-share:before { 501 | content: "\e6f3"; 502 | } 503 | 504 | .cuIcon-wefill:before { 505 | content: "\e6f4"; 506 | } 507 | 508 | .cuIcon-we:before { 509 | content: "\e6f5"; 510 | } 511 | 512 | .cuIcon-lightauto:before { 513 | content: "\e6f6"; 514 | } 515 | 516 | .cuIcon-lightforbid:before { 517 | content: "\e6f7"; 518 | } 519 | 520 | .cuIcon-lightfill:before { 521 | content: "\e6f8"; 522 | } 523 | 524 | .cuIcon-camerarotate:before { 525 | content: "\e6f9"; 526 | } 527 | 528 | .cuIcon-light:before { 529 | content: "\e6fa"; 530 | } 531 | 532 | .cuIcon-barcode:before { 533 | content: "\e6fb"; 534 | } 535 | 536 | .cuIcon-flashlightclose:before { 537 | content: "\e6fc"; 538 | } 539 | 540 | .cuIcon-flashlightopen:before { 541 | content: "\e6fd"; 542 | } 543 | 544 | .cuIcon-searchlist:before { 545 | content: "\e6fe"; 546 | } 547 | 548 | .cuIcon-service:before { 549 | content: "\e6ff"; 550 | } 551 | 552 | .cuIcon-sort:before { 553 | content: "\e700"; 554 | } 555 | 556 | .cuIcon-down:before { 557 | content: "\e703"; 558 | } 559 | 560 | .cuIcon-mobile:before { 561 | content: "\e704"; 562 | } 563 | 564 | .cuIcon-mobilefill:before { 565 | content: "\e705"; 566 | } 567 | 568 | .cuIcon-copy:before { 569 | content: "\e706"; 570 | } 571 | 572 | .cuIcon-countdownfill:before { 573 | content: "\e707"; 574 | } 575 | 576 | .cuIcon-countdown:before { 577 | content: "\e708"; 578 | } 579 | 580 | .cuIcon-noticefill:before { 581 | content: "\e709"; 582 | } 583 | 584 | .cuIcon-notice:before { 585 | content: "\e70a"; 586 | } 587 | 588 | .cuIcon-upstagefill:before { 589 | content: "\e70e"; 590 | } 591 | 592 | .cuIcon-upstage:before { 593 | content: "\e70f"; 594 | } 595 | 596 | .cuIcon-babyfill:before { 597 | content: "\e710"; 598 | } 599 | 600 | .cuIcon-baby:before { 601 | content: "\e711"; 602 | } 603 | 604 | .cuIcon-brandfill:before { 605 | content: "\e712"; 606 | } 607 | 608 | .cuIcon-brand:before { 609 | content: "\e713"; 610 | } 611 | 612 | .cuIcon-choicenessfill:before { 613 | content: "\e714"; 614 | } 615 | 616 | .cuIcon-choiceness:before { 617 | content: "\e715"; 618 | } 619 | 620 | .cuIcon-clothesfill:before { 621 | content: "\e716"; 622 | } 623 | 624 | .cuIcon-clothes:before { 625 | content: "\e717"; 626 | } 627 | 628 | .cuIcon-creativefill:before { 629 | content: "\e718"; 630 | } 631 | 632 | .cuIcon-creative:before { 633 | content: "\e719"; 634 | } 635 | 636 | .cuIcon-female:before { 637 | content: "\e71a"; 638 | } 639 | 640 | .cuIcon-keyboard:before { 641 | content: "\e71b"; 642 | } 643 | 644 | .cuIcon-male:before { 645 | content: "\e71c"; 646 | } 647 | 648 | .cuIcon-newfill:before { 649 | content: "\e71d"; 650 | } 651 | 652 | .cuIcon-new:before { 653 | content: "\e71e"; 654 | } 655 | 656 | .cuIcon-pullleft:before { 657 | content: "\e71f"; 658 | } 659 | 660 | .cuIcon-pullright:before { 661 | content: "\e720"; 662 | } 663 | 664 | .cuIcon-rankfill:before { 665 | content: "\e721"; 666 | } 667 | 668 | .cuIcon-rank:before { 669 | content: "\e722"; 670 | } 671 | 672 | .cuIcon-bad:before { 673 | content: "\e723"; 674 | } 675 | 676 | .cuIcon-cameraadd:before { 677 | content: "\e724"; 678 | } 679 | 680 | .cuIcon-focus:before { 681 | content: "\e725"; 682 | } 683 | 684 | .cuIcon-friendfill:before { 685 | content: "\e726"; 686 | } 687 | 688 | .cuIcon-cameraaddfill:before { 689 | content: "\e727"; 690 | } 691 | 692 | .cuIcon-apps:before { 693 | content: "\e729"; 694 | } 695 | 696 | .cuIcon-paintfill:before { 697 | content: "\e72a"; 698 | } 699 | 700 | .cuIcon-paint:before { 701 | content: "\e72b"; 702 | } 703 | 704 | .cuIcon-picfill:before { 705 | content: "\e72c"; 706 | } 707 | 708 | .cuIcon-refresharrow:before { 709 | content: "\e72d"; 710 | } 711 | 712 | .cuIcon-colorlens:before { 713 | content: "\e6e6"; 714 | } 715 | 716 | .cuIcon-markfill:before { 717 | content: "\e730"; 718 | } 719 | 720 | .cuIcon-mark:before { 721 | content: "\e731"; 722 | } 723 | 724 | .cuIcon-presentfill:before { 725 | content: "\e732"; 726 | } 727 | 728 | .cuIcon-repeal:before { 729 | content: "\e733"; 730 | } 731 | 732 | .cuIcon-album:before { 733 | content: "\e734"; 734 | } 735 | 736 | .cuIcon-peoplefill:before { 737 | content: "\e735"; 738 | } 739 | 740 | .cuIcon-people:before { 741 | content: "\e736"; 742 | } 743 | 744 | .cuIcon-servicefill:before { 745 | content: "\e737"; 746 | } 747 | 748 | .cuIcon-repair:before { 749 | content: "\e738"; 750 | } 751 | 752 | .cuIcon-file:before { 753 | content: "\e739"; 754 | } 755 | 756 | .cuIcon-repairfill:before { 757 | content: "\e73a"; 758 | } 759 | 760 | .cuIcon-taoxiaopu:before { 761 | content: "\e73b"; 762 | } 763 | 764 | .cuIcon-weixin:before { 765 | content: "\e612"; 766 | } 767 | 768 | .cuIcon-attentionfill:before { 769 | content: "\e73c"; 770 | } 771 | 772 | .cuIcon-attention:before { 773 | content: "\e73d"; 774 | } 775 | 776 | .cuIcon-commandfill:before { 777 | content: "\e73e"; 778 | } 779 | 780 | .cuIcon-command:before { 781 | content: "\e73f"; 782 | } 783 | 784 | .cuIcon-communityfill:before { 785 | content: "\e740"; 786 | } 787 | 788 | .cuIcon-community:before { 789 | content: "\e741"; 790 | } 791 | 792 | .cuIcon-read:before { 793 | content: "\e742"; 794 | } 795 | 796 | .cuIcon-calendar:before { 797 | content: "\e74a"; 798 | } 799 | 800 | .cuIcon-cut:before { 801 | content: "\e74b"; 802 | } 803 | 804 | .cuIcon-magic:before { 805 | content: "\e74c"; 806 | } 807 | 808 | .cuIcon-backwardfill:before { 809 | content: "\e74d"; 810 | } 811 | 812 | .cuIcon-playfill:before { 813 | content: "\e74f"; 814 | } 815 | 816 | .cuIcon-stop:before { 817 | content: "\e750"; 818 | } 819 | 820 | .cuIcon-tagfill:before { 821 | content: "\e751"; 822 | } 823 | 824 | .cuIcon-tag:before { 825 | content: "\e752"; 826 | } 827 | 828 | .cuIcon-group:before { 829 | content: "\e753"; 830 | } 831 | 832 | .cuIcon-all:before { 833 | content: "\e755"; 834 | } 835 | 836 | .cuIcon-backdelete:before { 837 | content: "\e756"; 838 | } 839 | 840 | .cuIcon-hotfill:before { 841 | content: "\e757"; 842 | } 843 | 844 | .cuIcon-hot:before { 845 | content: "\e758"; 846 | } 847 | 848 | .cuIcon-post:before { 849 | content: "\e759"; 850 | } 851 | 852 | .cuIcon-radiobox:before { 853 | content: "\e75b"; 854 | } 855 | 856 | .cuIcon-rounddown:before { 857 | content: "\e75c"; 858 | } 859 | 860 | .cuIcon-upload:before { 861 | content: "\e75d"; 862 | } 863 | 864 | .cuIcon-writefill:before { 865 | content: "\e760"; 866 | } 867 | 868 | .cuIcon-write:before { 869 | content: "\e761"; 870 | } 871 | 872 | .cuIcon-radioboxfill:before { 873 | content: "\e763"; 874 | } 875 | 876 | .cuIcon-punch:before { 877 | content: "\e764"; 878 | } 879 | 880 | .cuIcon-shake:before { 881 | content: "\e765"; 882 | } 883 | 884 | .cuIcon-move:before { 885 | content: "\e768"; 886 | } 887 | 888 | .cuIcon-safe:before { 889 | content: "\e769"; 890 | } 891 | 892 | .cuIcon-activityfill:before { 893 | content: "\e775"; 894 | } 895 | 896 | .cuIcon-crownfill:before { 897 | content: "\e776"; 898 | } 899 | 900 | .cuIcon-crown:before { 901 | content: "\e777"; 902 | } 903 | 904 | .cuIcon-goodsfill:before { 905 | content: "\e778"; 906 | } 907 | 908 | .cuIcon-messagefill:before { 909 | content: "\e779"; 910 | } 911 | 912 | .cuIcon-profilefill:before { 913 | content: "\e77a"; 914 | } 915 | 916 | .cuIcon-sound:before { 917 | content: "\e77b"; 918 | } 919 | 920 | .cuIcon-sponsorfill:before { 921 | content: "\e77c"; 922 | } 923 | 924 | .cuIcon-sponsor:before { 925 | content: "\e77d"; 926 | } 927 | 928 | .cuIcon-upblock:before { 929 | content: "\e77e"; 930 | } 931 | 932 | .cuIcon-weblock:before { 933 | content: "\e77f"; 934 | } 935 | 936 | .cuIcon-weunblock:before { 937 | content: "\e780"; 938 | } 939 | 940 | .cuIcon-my:before { 941 | content: "\e78b"; 942 | } 943 | 944 | .cuIcon-myfill:before { 945 | content: "\e78c"; 946 | } 947 | 948 | .cuIcon-emojifill:before { 949 | content: "\e78d"; 950 | } 951 | 952 | .cuIcon-emojiflashfill:before { 953 | content: "\e78e"; 954 | } 955 | 956 | .cuIcon-flashbuyfill:before { 957 | content: "\e78f"; 958 | } 959 | 960 | .cuIcon-text:before { 961 | content: "\e791"; 962 | } 963 | 964 | .cuIcon-goodsfavor:before { 965 | content: "\e794"; 966 | } 967 | 968 | .cuIcon-musicfill:before { 969 | content: "\e795"; 970 | } 971 | 972 | .cuIcon-musicforbidfill:before { 973 | content: "\e796"; 974 | } 975 | 976 | .cuIcon-card:before { 977 | content: "\e624"; 978 | } 979 | 980 | .cuIcon-triangledownfill:before { 981 | content: "\e79b"; 982 | } 983 | 984 | .cuIcon-triangleupfill:before { 985 | content: "\e79c"; 986 | } 987 | 988 | .cuIcon-roundleftfill-copy:before { 989 | content: "\e79e"; 990 | } 991 | 992 | .cuIcon-font:before { 993 | content: "\e76a"; 994 | } 995 | 996 | .cuIcon-title:before { 997 | content: "\e82f"; 998 | } 999 | 1000 | .cuIcon-recordfill:before { 1001 | content: "\e7a4"; 1002 | } 1003 | 1004 | .cuIcon-record:before { 1005 | content: "\e7a6"; 1006 | } 1007 | 1008 | .cuIcon-cardboardfill:before { 1009 | content: "\e7a9"; 1010 | } 1011 | 1012 | .cuIcon-cardboard:before { 1013 | content: "\e7aa"; 1014 | } 1015 | 1016 | .cuIcon-formfill:before { 1017 | content: "\e7ab"; 1018 | } 1019 | 1020 | .cuIcon-coin:before { 1021 | content: "\e7ac"; 1022 | } 1023 | 1024 | .cuIcon-cardboardforbid:before { 1025 | content: "\e7af"; 1026 | } 1027 | 1028 | .cuIcon-circlefill:before { 1029 | content: "\e7b0"; 1030 | } 1031 | 1032 | .cuIcon-circle:before { 1033 | content: "\e7b1"; 1034 | } 1035 | 1036 | .cuIcon-attentionforbid:before { 1037 | content: "\e7b2"; 1038 | } 1039 | 1040 | .cuIcon-attentionforbidfill:before { 1041 | content: "\e7b3"; 1042 | } 1043 | 1044 | .cuIcon-attentionfavorfill:before { 1045 | content: "\e7b4"; 1046 | } 1047 | 1048 | .cuIcon-attentionfavor:before { 1049 | content: "\e7b5"; 1050 | } 1051 | 1052 | .cuIcon-titles:before { 1053 | content: "\e701"; 1054 | } 1055 | 1056 | .cuIcon-icloading:before { 1057 | content: "\e67a"; 1058 | } 1059 | 1060 | .cuIcon-full:before { 1061 | content: "\e7bc"; 1062 | } 1063 | 1064 | .cuIcon-mail:before { 1065 | content: "\e7bd"; 1066 | } 1067 | 1068 | .cuIcon-peoplelist:before { 1069 | content: "\e7be"; 1070 | } 1071 | 1072 | .cuIcon-goodsnewfill:before { 1073 | content: "\e7bf"; 1074 | } 1075 | 1076 | .cuIcon-goodsnew:before { 1077 | content: "\e7c0"; 1078 | } 1079 | 1080 | .cuIcon-medalfill:before { 1081 | content: "\e7c1"; 1082 | } 1083 | 1084 | .cuIcon-medal:before { 1085 | content: "\e7c2"; 1086 | } 1087 | 1088 | .cuIcon-newsfill:before { 1089 | content: "\e7c3"; 1090 | } 1091 | 1092 | .cuIcon-newshotfill:before { 1093 | content: "\e7c4"; 1094 | } 1095 | 1096 | .cuIcon-newshot:before { 1097 | content: "\e7c5"; 1098 | } 1099 | 1100 | .cuIcon-news:before { 1101 | content: "\e7c6"; 1102 | } 1103 | 1104 | .cuIcon-videofill:before { 1105 | content: "\e7c7"; 1106 | } 1107 | 1108 | .cuIcon-video:before { 1109 | content: "\e7c8"; 1110 | } 1111 | 1112 | .cuIcon-exit:before { 1113 | content: "\e7cb"; 1114 | } 1115 | 1116 | .cuIcon-skinfill:before { 1117 | content: "\e7cc"; 1118 | } 1119 | 1120 | .cuIcon-skin:before { 1121 | content: "\e7cd"; 1122 | } 1123 | 1124 | .cuIcon-moneybagfill:before { 1125 | content: "\e7ce"; 1126 | } 1127 | 1128 | .cuIcon-usefullfill:before { 1129 | content: "\e7cf"; 1130 | } 1131 | 1132 | .cuIcon-usefull:before { 1133 | content: "\e7d0"; 1134 | } 1135 | 1136 | .cuIcon-moneybag:before { 1137 | content: "\e7d1"; 1138 | } 1139 | 1140 | .cuIcon-redpacket_fill:before { 1141 | content: "\e7d3"; 1142 | } 1143 | 1144 | .cuIcon-subscription:before { 1145 | content: "\e7d4"; 1146 | } 1147 | 1148 | .cuIcon-loading1:before { 1149 | content: "\e633"; 1150 | } 1151 | 1152 | .cuIcon-github:before { 1153 | content: "\e692"; 1154 | } 1155 | 1156 | .cuIcon-global:before { 1157 | content: "\e7eb"; 1158 | } 1159 | 1160 | .cuIcon-settingsfill:before { 1161 | content: "\e6ab"; 1162 | } 1163 | 1164 | .cuIcon-back_android:before { 1165 | content: "\e7ed"; 1166 | } 1167 | 1168 | .cuIcon-expressman:before { 1169 | content: "\e7ef"; 1170 | } 1171 | 1172 | .cuIcon-evaluate_fill:before { 1173 | content: "\e7f0"; 1174 | } 1175 | 1176 | .cuIcon-group_fill:before { 1177 | content: "\e7f5"; 1178 | } 1179 | 1180 | .cuIcon-play_forward_fill:before { 1181 | content: "\e7f6"; 1182 | } 1183 | 1184 | .cuIcon-deliver_fill:before { 1185 | content: "\e7f7"; 1186 | } 1187 | 1188 | .cuIcon-notice_forbid_fill:before { 1189 | content: "\e7f8"; 1190 | } 1191 | 1192 | .cuIcon-fork:before { 1193 | content: "\e60c"; 1194 | } 1195 | 1196 | .cuIcon-pick:before { 1197 | content: "\e7fa"; 1198 | } 1199 | 1200 | .cuIcon-wenzi:before { 1201 | content: "\e6a7"; 1202 | } 1203 | 1204 | .cuIcon-ellipse:before { 1205 | content: "\e600"; 1206 | } 1207 | 1208 | .cuIcon-qr_code:before { 1209 | content: "\e61b"; 1210 | } 1211 | 1212 | .cuIcon-dianhua:before { 1213 | content: "\e64d"; 1214 | } 1215 | 1216 | .cuIcon-icon:before { 1217 | content: "\e602"; 1218 | } 1219 | 1220 | .cuIcon-loading2:before { 1221 | content: "\e7f1"; 1222 | } 1223 | 1224 | .cuIcon-btn:before { 1225 | content: "\e601"; 1226 | } 1227 | -------------------------------------------------------------------------------- /miniprogram/images/HazardouAwaste.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zhangliwen1101/Garbage/0feb59a9162c1072f8ec53eb783cd319508f8a90/miniprogram/images/HazardouAwaste.jpg -------------------------------------------------------------------------------- /miniprogram/images/HouseholdfoodWaste.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zhangliwen1101/Garbage/0feb59a9162c1072f8ec53eb783cd319508f8a90/miniprogram/images/HouseholdfoodWaste.jpg -------------------------------------------------------------------------------- /miniprogram/images/RecycleableWaste.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zhangliwen1101/Garbage/0feb59a9162c1072f8ec53eb783cd319508f8a90/miniprogram/images/RecycleableWaste.jpg -------------------------------------------------------------------------------- /miniprogram/images/ResidualWaste.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zhangliwen1101/Garbage/0feb59a9162c1072f8ec53eb783cd319508f8a90/miniprogram/images/ResidualWaste.png -------------------------------------------------------------------------------- /miniprogram/images/ai-chat.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zhangliwen1101/Garbage/0feb59a9162c1072f8ec53eb783cd319508f8a90/miniprogram/images/ai-chat.png -------------------------------------------------------------------------------- /miniprogram/images/icon_ai.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zhangliwen1101/Garbage/0feb59a9162c1072f8ec53eb783cd319508f8a90/miniprogram/images/icon_ai.png -------------------------------------------------------------------------------- /miniprogram/images/icon_ai_default.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zhangliwen1101/Garbage/0feb59a9162c1072f8ec53eb783cd319508f8a90/miniprogram/images/icon_ai_default.png -------------------------------------------------------------------------------- /miniprogram/images/icon_sort.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zhangliwen1101/Garbage/0feb59a9162c1072f8ec53eb783cd319508f8a90/miniprogram/images/icon_sort.png -------------------------------------------------------------------------------- /miniprogram/images/icon_sort_default.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zhangliwen1101/Garbage/0feb59a9162c1072f8ec53eb783cd319508f8a90/miniprogram/images/icon_sort_default.png -------------------------------------------------------------------------------- /miniprogram/images/no-result.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zhangliwen1101/Garbage/0feb59a9162c1072f8ec53eb783cd319508f8a90/miniprogram/images/no-result.png -------------------------------------------------------------------------------- /miniprogram/images/paizhao.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zhangliwen1101/Garbage/0feb59a9162c1072f8ec53eb783cd319508f8a90/miniprogram/images/paizhao.png -------------------------------------------------------------------------------- /miniprogram/images/qa.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zhangliwen1101/Garbage/0feb59a9162c1072f8ec53eb783cd319508f8a90/miniprogram/images/qa.png -------------------------------------------------------------------------------- /miniprogram/images/qa_default.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zhangliwen1101/Garbage/0feb59a9162c1072f8ec53eb783cd319508f8a90/miniprogram/images/qa_default.png -------------------------------------------------------------------------------- /miniprogram/images/qq .png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zhangliwen1101/Garbage/0feb59a9162c1072f8ec53eb783cd319508f8a90/miniprogram/images/qq .png -------------------------------------------------------------------------------- /miniprogram/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "miniprogram", 3 | "version": "1.0.0", 4 | "main": "app.js", 5 | "dependencies": { 6 | "_js-base64@2.5.1@js-base64": "^2.5.1", 7 | "js-base64": "^2.5.1" 8 | }, 9 | "devDependencies": {}, 10 | "scripts": { 11 | "test": "echo \"Error: no test specified\" && exit 1" 12 | }, 13 | "author": "", 14 | "license": "ISC", 15 | "description": "" 16 | } 17 | -------------------------------------------------------------------------------- /miniprogram/pages/ai/camera/camera.js: -------------------------------------------------------------------------------- 1 | var md5 = require('../../../utils/md5.js') 2 | var http = require('../../../utils/http.js') 3 | var util = require('../../../utils/util.js') 4 | // import { Utilaa } from 'util' 5 | // var u = require('underscore') 6 | Page({ 7 | data:{ 8 | accessToken:"", 9 | isShow:false, 10 | results:[], 11 | src:"", 12 | isCamera:true, 13 | btnTxt:"拍照" 14 | }, 15 | onLoad() { 16 | this.ctx = wx.createCameraContext() 17 | var time=wx.getStorageSync("time") 18 | var curTime = new Date().getTime() 19 | var timeNum=new Date(parseInt(curTime - time) * 1000).getDay() 20 | console.log("======="+timeNum) 21 | var accessToken=wx.getStorageSync("access_token") 22 | console.log("====accessToken===" + accessToken+"a") 23 | if (timeNum > 28 || (accessToken == "" || 24 | accessToken == null||accessToken == undefined)){ 25 | this.accessTokenFunc() 26 | }else{ 27 | this.setData({ 28 | accessToken: wx.getStorageSync("access_token") 29 | }) 30 | } 31 | }, 32 | takePhoto() { 33 | var that=this 34 | if (this.data.isCamera==false){ 35 | this.setData({ 36 | isCamera: true, 37 | btnTxt: "拍照" 38 | }) 39 | return 40 | } 41 | this.ctx.takePhoto({ 42 | quality: 'high', 43 | success: (res) => { 44 | this.setData({ 45 | src: res.tempImagePath, 46 | isCamera:false, 47 | btnTxt:"重拍" 48 | }) 49 | wx.showLoading({ 50 | title: '正在加载中', 51 | }) 52 | wx.getFileSystemManager().readFile({ 53 | filePath:res.tempImagePath, 54 | encoding:"base64", 55 | success: res => { 56 | that.req(that.data.accessToken,res.data) 57 | }, 58 | fail:res=>{ 59 | wx.hideLoading() 60 | wx.showToast({ 61 | title: '拍照失败,未获取相机权限或其他原因', 62 | icon:"none" 63 | }) 64 | } 65 | }) 66 | } 67 | }) 68 | }, 69 | req:function(token,image){ 70 | var that=this 71 | http.req("https://aip.baidubce.com/rest/2.0/image-classify/v2/advanced_general?access_token="+token,{ 72 | "image": image 73 | },function(res){ 74 | wx.hideLoading() 75 | console.log(JSON.stringify(res)) 76 | var num=res.result_num 77 | var results = res.data.result 78 | if (results!=undefined&&results!=null){ 79 | that.setData({ 80 | isShow: true, 81 | results: results 82 | }) 83 | 84 | console.log(results) 85 | }else{ 86 | wx.showToast({ 87 | icon: 'none', 88 | title: 'AI识别失败,请联系管理员', 89 | }) 90 | } 91 | },"POST") 92 | }, 93 | accessTokenFunc:function(){ 94 | var that=this 95 | console.log("accessTokenFunc is start") 96 | wx.cloud.callFunction({ 97 | name: 'baiduAccessToken', 98 | success: res => { 99 | console.log("===="+JSON.stringify(res)) 100 | console.log("====" + JSON.stringify(res.result.data.access_token)) 101 | that.data.accessToken = res.result.data.access_token 102 | wx.setStorageSync("access_token", res.result.data.access_token) 103 | wx.setStorageSync("time", new Date().getTime()) 104 | }, 105 | fail: err => { 106 | wx.showToast({ 107 | icon: 'none', 108 | title: '调用失败', 109 | }) 110 | console.error('[云函数] [sum] 调用失败:', err) 111 | } 112 | }) 113 | }, 114 | radioChange:function(e){ 115 | console.log(e) 116 | console.log(e.detail) 117 | console.log(e.detail.value) 118 | wx.navigateTo({ 119 | url: '/pages/result/list?keyword=' + e.detail.value, 120 | }) 121 | }, 122 | hideModal:function(){ 123 | this.setData({ 124 | isShow:false, 125 | }) 126 | }, 127 | stopRecord() { 128 | this.ctx.stopRecord({ 129 | success: (res) => { 130 | this.setData({ 131 | src: res.tempThumbPath, 132 | videoSrc: res.tempVideoPath 133 | }) 134 | } 135 | }) 136 | }, 137 | error(e) { 138 | console.log(e.detail) 139 | } 140 | 141 | }) -------------------------------------------------------------------------------- /miniprogram/pages/ai/camera/camera.json: -------------------------------------------------------------------------------- 1 | { 2 | "usingComponents": {} 3 | } -------------------------------------------------------------------------------- /miniprogram/pages/ai/camera/camera.wxml: -------------------------------------------------------------------------------- 1 | 2 | 4 | 5 | 6 | 7 | 8 | {{btnTxt}} 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 20 | 21 | 22 | 23 | 24 | 25 | -------------------------------------------------------------------------------- /miniprogram/pages/ai/camera/camera.wxss: -------------------------------------------------------------------------------- 1 | .photo-view{ 2 | width: 100%; 3 | height: 200rpx; 4 | display: flex; 5 | flex-direction: column; 6 | justify-content: center; 7 | align-items: center; 8 | } 9 | .takePhoto{ 10 | width: 100rpx; 11 | height: 100rpx; 12 | border-radius: 100rpx; 13 | background-color: #00cc77; 14 | color: white; 15 | display: flex; 16 | flex-direction: column; 17 | justify-content: center; 18 | align-items: center; 19 | } -------------------------------------------------------------------------------- /miniprogram/pages/ai/filter/filter.js: -------------------------------------------------------------------------------- 1 | const db = wx.cloud.database() 2 | Page({ 3 | 4 | 5 | data: { 6 | MAX_LIMIT: 20, 7 | page: 0, 8 | dataCount: 0, 9 | datas: [], 10 | type: 1, 11 | logo:"" 12 | }, 13 | 14 | 15 | onLoad: function(options) { 16 | console.log(JSON.stringify(options)) 17 | this.data.type = options.type 18 | var typeInt = parseInt(this.data.type) 19 | var title = "" 20 | var logoImg="" 21 | switch (typeInt) { 22 | case 1: 23 | title = '可回收物' 24 | logoImg ="/images/RecycleableWaste.jpg" 25 | break; 26 | case 2: 27 | title = '有害垃圾' 28 | logoImg = "/images/HazardouAwaste.jpg" 29 | break; 30 | case 3: 31 | title = '湿垃圾' 32 | logoImg = "/images/HouseholdfoodWaste.jpg" 33 | break; 34 | case 4: 35 | title = '干垃圾' 36 | logoImg = "/images/ResidualWaste.png" 37 | break; 38 | } 39 | wx.setNavigationBarTitle({ 40 | title: title, 41 | }) 42 | this.setData({ 43 | logo:logoImg 44 | }) 45 | this.data.dataCount = db.collection('product').where({ 46 | sortId: this.data.type 47 | }).count() 48 | this.onGetData() 49 | }, 50 | onGetData: function() { 51 | wx.showLoading({ 52 | title: '正在加载数据中.....', 53 | }) 54 | if (this.data.dataCount < this.data.page * this.data.MAX_LIMIT) { 55 | wx.showToast({ 56 | title: '数据已经加载完', 57 | icon: "none" 58 | }) 59 | wx.hideLoading() 60 | return 61 | } 62 | var that = this 63 | if (this.data.page == 0) { 64 | this.data.datas = [] 65 | } 66 | var datas = db.collection('product').skip(this.data.page * this.data.MAX_LIMIT).limit(this.data.MAX_LIMIT).where({ 67 | sortId: parseInt(that.data.type) 68 | }).get({ 69 | success: function(res) { 70 | console.log(res.data) 71 | wx.hideLoading() 72 | that.data.page = that.data.page + 1 73 | for (var i = 0; i < res.data.length; i++) { 74 | that.data.datas.push(res.data[i]) 75 | } 76 | that.setData({ 77 | datas: that.data.datas 78 | }) 79 | }, 80 | fail: res => { 81 | wx.hideLoading() 82 | wx.showToast({ 83 | title: '数据加载失败', 84 | icon: "none" 85 | }) 86 | } 87 | }) 88 | }, 89 | onPullDownRefresh: function() { 90 | this.data.page = 0 91 | this.onGetData() 92 | }, 93 | 94 | onReachBottom: function() { 95 | this.onGetData() 96 | }, 97 | 98 | }) -------------------------------------------------------------------------------- /miniprogram/pages/ai/filter/filter.json: -------------------------------------------------------------------------------- 1 | { 2 | "onReachBottomDistance": 50, 3 | "usingComponents": {} 4 | } -------------------------------------------------------------------------------- /miniprogram/pages/ai/filter/filter.wxml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | {{item.name}} 5 | 6 | 7 | 8 | {{item.name}} 9 | 10 | -------------------------------------------------------------------------------- /miniprogram/pages/ai/filter/filter.wxss: -------------------------------------------------------------------------------- 1 | .filter-view { 2 | display: flex; 3 | flex-direction: column; 4 | } 5 | .item-view{ 6 | display: flex; 7 | flex-direction: row; 8 | padding: 20rpx 50rpx; 9 | height: 90rpx; 10 | align-items: center; 11 | } 12 | .img{ 13 | height: 50rpx; 14 | width: 50rpx; 15 | margin-right: 30rpx; 16 | } 17 | .item-ji { 18 | background-color: #f6f6f6; 19 | color:black; 20 | } 21 | -------------------------------------------------------------------------------- /miniprogram/pages/ai/index.js: -------------------------------------------------------------------------------- 1 | Page({ 2 | 3 | data: { 4 | SHOW_TOP: true, 5 | }, 6 | 7 | onLoad: function(options) { 8 | // console.log("AAAAAAAAA") 9 | var myDate = new Date(); 10 | var isShowed=wx.getStorageSync("tip") 11 | if(isShowed!=1){ 12 | setTimeout(() => { 13 | this.setData({ 14 | SHOW_TOP: false 15 | }) 16 | wx.setStorageSync("tip", 1) 17 | }, 2 * 1000) 18 | }else{ 19 | this.setData({ 20 | SHOW_TOP: false 21 | }) 22 | } 23 | }, 24 | 25 | goSearch: function() { 26 | wx.navigateTo({ 27 | url: 'search', 28 | }) 29 | }, 30 | onBindCamera: function() { 31 | wx.navigateTo({ 32 | url: 'camera/camera', 33 | }) 34 | }, 35 | // onAikefu: function() { 36 | // wx.navigateTo({ 37 | // url: '/pages/android/qa', 38 | // }) 39 | // }, 40 | onShareAppMessage: function() { 41 | return { 42 | title: "智能分类垃圾", 43 | imageUrl: "https://6c61-laji-bopv4-1259505195.tcb.qcloud.la/laji.png?sign=7c8d38e435eb3104fcf5933ebff667f5&t=1561904613", 44 | path: "pages/ai/index" 45 | } 46 | } 47 | }) -------------------------------------------------------------------------------- /miniprogram/pages/ai/index.json: -------------------------------------------------------------------------------- 1 | { 2 | "usingComponents": {} 3 | } -------------------------------------------------------------------------------- /miniprogram/pages/ai/index.wxml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 自动识别 11 | 12 | 13 | 14 | 15 | 16 | 点击「添加到我的小程序」 17 | 18 | 19 | 20 | -------------------------------------------------------------------------------- /miniprogram/pages/ai/index.wxss: -------------------------------------------------------------------------------- 1 | 2 | .bg-darkGray { 3 | background-color: #f6f6f6; 4 | color:#ffffff; 5 | } 6 | .cu-bar .search-form { 7 | background-color: #ffffff; 8 | } 9 | .cu-bar .search-form input{ 10 | height: 100rpx; 11 | } 12 | .cu-bar .search-form{ 13 | height: 90rpx; 14 | } 15 | .cu-bar{ 16 | margin-top: 300rpx; 17 | } 18 | .ai-view{ 19 | width: 100%; 20 | height: 100%; 21 | display: flex; 22 | flex-direction: column; 23 | align-items: center; 24 | margin-top: 50rpx; 25 | } 26 | .txt{ 27 | font-size: 36rpx; 28 | font-weight: bold; 29 | color: #00cc77; 30 | } 31 | .tip{ 32 | font-size: 22rpx; 33 | color: #00cc77; 34 | margin-top: 20rpx; 35 | } 36 | .ai-paizhao{ 37 | width: 150rpx; 38 | height: 150rpx; 39 | margin-top: 50rpx; 40 | } 41 | .float-view{ 42 | position:absolute; 43 | z-index:9; 44 | width: 100rpx; 45 | height: 100rpx; 46 | margin-right: 50rpx; 47 | margin-bottom: 50rpx; 48 | } 49 | 50 | 51 | 52 | .box { 53 | position: fixed; 54 | top: 0; 55 | /* left: 0; */ 56 | right: 0; 57 | z-index: 999; 58 | display: flex; 59 | justify-content: flex-end; 60 | align-items: flex-end; 61 | flex-direction: column; 62 | width: 600rpx; 63 | } 64 | .arrow { 65 | width: 0; 66 | height: 0; 67 | margin-right: 120rpx; 68 | border-width: 20rpx; 69 | border-style: solid; 70 | border-color: transparent transparent #00cc77 transparent; 71 | } 72 | .body { 73 | background-color: #00cc77; 74 | box-shadow: 0 10rpx 20rpx -10rpx #00cc77; 75 | border-radius: 12rpx; 76 | display: flex; 77 | align-items: center; 78 | justify-content: center; 79 | height: 84rpx; 80 | padding: 0 20rpx; 81 | margin-right: 40rpx; 82 | } 83 | .body > text { 84 | color: #FFF; 85 | font-size: 28rpx; 86 | font-weight: 400; 87 | } 88 | /* .kefu-box{ 89 | position: fixed; 90 | bottom: 0; 91 | right: 0; 92 | z-index: 999; 93 | display: flex; 94 | justify-content: flex-end; 95 | align-items: flex-end; 96 | flex-direction: column; 97 | width: 400rpx; 98 | height: 400rpx; 99 | } */ 100 | .kefu-body { 101 | background-color: white; 102 | box-shadow: 0 10rpx 20rpx -10rpx #e1e1e1; 103 | border-radius: 140rpx; 104 | display: flex; 105 | align-items: center; 106 | justify-content: center; 107 | height: 60rpx; 108 | padding: 10rpx 30rpx; 109 | margin-right: 40rpx; 110 | margin-bottom: 40rpx; 111 | } 112 | .img{ 113 | width: 40rpx; 114 | height: 40rpx; 115 | } 116 | .q-tx{ 117 | margin: 0 0 0 10rpx; 118 | font-size: 24rpx; 119 | } -------------------------------------------------------------------------------- /miniprogram/pages/ai/result.js: -------------------------------------------------------------------------------- 1 | const db = wx.cloud.database() 2 | Page({ 3 | 4 | /** 5 | * 页面的初始数据 6 | */ 7 | data: { 8 | 9 | }, 10 | 11 | /** 12 | * 生命周期函数--监听页面加载 13 | */ 14 | onLoad: function (options) { 15 | 16 | }, 17 | 18 | /** 19 | * 生命周期函数--监听页面初次渲染完成 20 | */ 21 | onReady: function () { 22 | 23 | }, 24 | 25 | /** 26 | * 生命周期函数--监听页面显示 27 | */ 28 | onShow: function () { 29 | 30 | }, 31 | 32 | /** 33 | * 生命周期函数--监听页面隐藏 34 | */ 35 | onHide: function () { 36 | 37 | }, 38 | 39 | 40 | onUnload: function () { 41 | 42 | }, 43 | 44 | onShareAppMessage: function () { 45 | 46 | } 47 | }) -------------------------------------------------------------------------------- /miniprogram/pages/ai/result.json: -------------------------------------------------------------------------------- 1 | { 2 | "navigationBarBackgroundColor": "#2c2b27", 3 | "usingComponents": {} 4 | } -------------------------------------------------------------------------------- /miniprogram/pages/ai/result.wxml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 干垃圾: 6 | 除有害垃圾、湿垃圾、可回收物以外的其他生活废弃物 7 | 8 | 9 | 干垃圾主要包括 10 | 餐盒、餐巾纸、湿纸巾、卫生间用纸、塑料袋、 食品包装袋、污染严重的纸、烟蒂、纸尿裤、 一次性杯子、大骨头、贝壳、花盆、陶瓷等 11 | 干垃圾投放要求 12 | 13 | 14 | 尽量沥干水分 15 | 16 | 17 | 18 | 难以辨识类别的生活垃圾投入干垃圾容器内 19 | 20 | -------------------------------------------------------------------------------- /miniprogram/pages/ai/result.wxss: -------------------------------------------------------------------------------- 1 | page{ 2 | height: 100%; 3 | } 4 | .container { 5 | margin: 50rpx 5%; 6 | width: 90%; 7 | padding: 20rpx; 8 | height: 100%; 9 | display: flex; 10 | flex-direction: column; 11 | background-color: #e9e8e6; 12 | border-radius: 20rpx; 13 | 14 | } 15 | 16 | .view-hearder { 17 | display: flex; 18 | flex-direction: row; 19 | width: 100%; 20 | } 21 | 22 | .hearder-name-view { 23 | display: flex; 24 | flex-direction: column; 25 | margin-left: 30rpx; 26 | } 27 | 28 | .one-view { 29 | font-size: 30rpx; 30 | font-weight: bold; 31 | } 32 | 33 | .two-view { 34 | width: 400rpx; 35 | font-size: 25rpx; 36 | } 37 | 38 | .logo { 39 | height: 200rpx; 40 | width: 200rpx; 41 | border-radius: 20rpx; 42 | } 43 | 44 | .title { 45 | background-color: #2c2b27; 46 | color: white; 47 | height: 80rpx; 48 | width: 100%; 49 | display: flex; 50 | flex-direction: column; 51 | justify-content: center; 52 | align-items: center; 53 | margin: 30rpx 0; 54 | } 55 | .text-gan{ 56 | color: #2c2b27; 57 | } 58 | .action-go{ 59 | width: 100%; 60 | margin-top: 10rpx; 61 | } 62 | -------------------------------------------------------------------------------- /miniprogram/pages/ai/search.js: -------------------------------------------------------------------------------- 1 | const db = wx.cloud.database() 2 | Page({ 3 | 4 | 5 | data: { 6 | MAX_LIMIT:20, 7 | page:0, 8 | dataCount:0, 9 | datas:[], 10 | searchTxt:"", 11 | logo:"", 12 | isSHow:false 13 | }, 14 | 15 | 16 | onLoad: function (options) { 17 | this.data.dataCount = db.collection('product').count() 18 | }, 19 | searchIcon:function(e){ 20 | this.data.searchTxt= e.detail.value 21 | console.log("====="+e.detail.value) 22 | this.data.page=0 23 | this.onGetData() 24 | }, 25 | onGetData:function(){ 26 | wx.showLoading({ 27 | title: '正在加载数据中.....', 28 | }) 29 | if (this.data.dataCount < this.data.page * this.data.MAX_LIMIT){ 30 | wx.showToast({ 31 | title: '数据已经加载完', 32 | icon: "none" 33 | }) 34 | wx.hideLoading() 35 | return 36 | } 37 | var that=this 38 | console.log("=====" + this.data.page) 39 | if(this.data.page==0){ 40 | this.data.datas=[] 41 | } 42 | var datas = db.collection('product').skip(this.data.page * this.data.MAX_LIMIT).limit(this.data.MAX_LIMIT).where({ 43 | name: db.RegExp({ 44 | regexp: that.data.searchTxt, 45 | }) 46 | }).get({ 47 | success: function (res) { 48 | wx.hideLoading() 49 | that.data.page = that.data.page +1 50 | for (var i=0;i < res.data.length;i++){ 51 | that.data.datas.push(res.data[i]) 52 | } 53 | that.setData({ 54 | datas:that.data.datas 55 | }) 56 | },fail:res=>{ 57 | wx.hideLoading() 58 | wx.showToast({ 59 | title: '数据加载失败', 60 | icon:"none" 61 | }) 62 | } 63 | }) 64 | }, 65 | onItemClick:function(event){ 66 | var index =event.currentTarget.dataset.index 67 | var logoImg="" 68 | console.log(index) 69 | switch (parseInt(index)) { 70 | case 1: 71 | logoImg = "/images/RecycleableWaste.jpg" 72 | break; 73 | case 2: 74 | logoImg = "/images/HazardouAwaste.jpg" 75 | break; 76 | case 3: 77 | logoImg = "/images/HouseholdfoodWaste.jpg" 78 | break; 79 | case 4: 80 | logoImg = "/images/ResidualWaste.png" 81 | break; 82 | } 83 | console.log(logoImg) 84 | this.setData({ 85 | logo:logoImg, 86 | isShow:!this.data.isShow 87 | }) 88 | }, 89 | hideModal:function(){ 90 | this.setData({ 91 | isShow: !this.data.isShow 92 | }) 93 | }, 94 | onPullDownRefresh: function () { 95 | this.data.page=0 96 | this.data.datas=[] 97 | this.onGetData() 98 | }, 99 | 100 | onReachBottom: function () { 101 | this.onGetData() 102 | }, 103 | 104 | }) -------------------------------------------------------------------------------- /miniprogram/pages/ai/search.json: -------------------------------------------------------------------------------- 1 | { 2 | "onReachBottomDistance": 50, 3 | "usingComponents": {} 4 | } -------------------------------------------------------------------------------- /miniprogram/pages/ai/search.wxml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 6 | 7 | 8 | 10 | 11 | 13 | 15 | 17 | 19 | {{item.name}} 20 | 21 | 22 | 24 | 26 | 28 | 30 | {{item.name}} 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | -------------------------------------------------------------------------------- /miniprogram/pages/ai/search.wxss: -------------------------------------------------------------------------------- 1 | .bg-darkGray { 2 | background-color: #f6f6f6; 3 | color:#ffffff; 4 | } 5 | .cu-bar .search-form { 6 | background-color: #ffffff; 7 | } 8 | 9 | .filter-view { 10 | display: flex; 11 | flex-direction: column; 12 | } 13 | .item-view{ 14 | display: flex; 15 | flex-direction: row; 16 | padding: 20rpx 50rpx; 17 | height: 90rpx; 18 | align-items: center; 19 | } 20 | .img{ 21 | height: 50rpx; 22 | width: 50rpx; 23 | margin-right: 30rpx; 24 | } 25 | .item-ji { 26 | background-color: #f6f6f6; 27 | color:black; 28 | } 29 | .cu-dialog{ 30 | width: 300rpx; 31 | } 32 | .bg-img{ 33 | width: 300rpx; 34 | height: 300rpx; 35 | } 36 | -------------------------------------------------------------------------------- /miniprogram/pages/android/qa.js: -------------------------------------------------------------------------------- 1 | var md5 = require('../../utils/md5.js') 2 | var http = require('../../utils/http.js') 3 | var util = require('../../utils/util.js') 4 | Page({ 5 | 6 | /** 7 | * 页面的初始数据 8 | */ 9 | data: { 10 | content: "", 11 | chats: [], 12 | StatusBar:0, 13 | scrollTop:0, 14 | inputvalue:"" 15 | }, 16 | requestData: { 17 | app_id: '', 18 | appKey:"", 19 | time_stamp: '', 20 | nonce_str: '', 21 | text: '', 22 | sign: '' 23 | }, 24 | submitContent: function (content) { 25 | this.requestData.text = content 26 | console.log("this.requestData.text", this.requestData.text) 27 | if (this.requestData.text == '' || this.requestData.text == null) { 28 | wx.showToast({ 29 | title: '请输入内容', 30 | }) 31 | return 32 | } 33 | wx.showLoading({ 34 | title: '正在加载中....', 35 | }) 36 | this.requestData.time_stamp = Math.round(new Date().getTime() / 1000).toString(); 37 | this.requestData.nonce_str = util.generateRandomString(24) 38 | var md5Str = md5.hexMD5(Date.now().toString()).toString() 39 | var map = new Map(); 40 | map.set("app_id", this.requestData.app_id) 41 | map.set("time_stamp", this.requestData.time_stamp) 42 | map.set("nonce_str", this.requestData.nonce_str) 43 | map.set("session", md5Str) 44 | map.set("question", encodeURIComponent(this.requestData.text)) 45 | console.log("encodeURIComponent===", encodeURIComponent(this.requestData.text.trim())) 46 | var md5Param = util.signTengxunAI(map, this.requestData.appKey) 47 | this.requestData.sign = md5Param 48 | var that = this 49 | http.req('https://api.ai.qq.com/fcgi-bin/nlp/nlp_textchat', { 50 | app_id: this.requestData.app_id, 51 | time_stamp: this.requestData.time_stamp, 52 | nonce_str: this.requestData.nonce_str, 53 | question: this.requestData.text, 54 | session: md5Str, 55 | sign: md5Param 56 | }, function (res) { 57 | wx.hideLoading() 58 | console.log("that.data=" + JSON.stringify(res.data.data)) 59 | var content = { content: res.data.data.answer, type: 0 } 60 | that.data.chats.push(content) 61 | var height = that.data.chats.length * 100 62 | console.log("that.data.chats=" + JSON.stringify(that.data.chats)) 63 | that.setData({ 64 | chats: that.data.chats, 65 | scrollTop: height, 66 | }) 67 | }) 68 | }, 69 | onLoad: function (options) { 70 | wx.getSystemInfo({ 71 | success: e => { 72 | this.data.StatusBar = e.statusBarHeight; 73 | } 74 | }) 75 | }, 76 | inputContent:function(e){ 77 | this.setData({ 78 | content: e.detail.value 79 | }) 80 | }, 81 | onSend:function(){ 82 | if (this.data.chats.length>100) { 83 | this.data.chats=[] 84 | } 85 | if (this.data.content==""){ 86 | wx.showToast({ 87 | title: '请输入内容...', 88 | icon:"none" 89 | }) 90 | return 91 | } 92 | var meContent={content:this.data.content,type:1} 93 | this.data.chats.push(meContent) 94 | var height = this.data.chats.length * 100 95 | var lajiContent=this.data.content 96 | this.submitContent(lajiContent) 97 | this.setData({ 98 | chats:this.data.chats, 99 | scrollTop: height, 100 | inputvalue:"" 101 | }) 102 | this.data.content="" 103 | } 104 | }) -------------------------------------------------------------------------------- /miniprogram/pages/android/qa.json: -------------------------------------------------------------------------------- 1 | { 2 | "usingComponents": {} 3 | } -------------------------------------------------------------------------------- /miniprogram/pages/android/qa.wxml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | {{item.content}} 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | {{item.content}} 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | -------------------------------------------------------------------------------- /miniprogram/pages/android/qa.wxss: -------------------------------------------------------------------------------- 1 | .bg-green{ 2 | background-color: #00cc77; 3 | } 4 | .cu-bar.input{ 5 | background-color: #f6f6f6; 6 | } 7 | .solid-bottom{ 8 | background-color: white; 9 | border-radius: 10rpx; 10 | } 11 | .cu-chat{ 12 | margin-bottom: 100rpx; 13 | height:100vh; 14 | } -------------------------------------------------------------------------------- /miniprogram/pages/index/index.js: -------------------------------------------------------------------------------- 1 | //index.js 2 | const app = getApp() 3 | 4 | Page({ 5 | data: { 6 | avatarUrl: './user-unlogin.png', 7 | userInfo: {}, 8 | logged: false, 9 | takeSession: false, 10 | requestResult: '' 11 | }, 12 | 13 | onLoad: function() { 14 | if (!wx.cloud) { 15 | wx.redirectTo({ 16 | url: '../chooseLib/chooseLib', 17 | }) 18 | return 19 | } 20 | 21 | // 获取用户信息 22 | wx.getSetting({ 23 | success: res => { 24 | if (res.authSetting['scope.userInfo']) { 25 | // 已经授权,可以直接调用 getUserInfo 获取头像昵称,不会弹框 26 | wx.getUserInfo({ 27 | success: res => { 28 | this.setData({ 29 | avatarUrl: res.userInfo.avatarUrl, 30 | userInfo: res.userInfo 31 | }) 32 | } 33 | }) 34 | } 35 | } 36 | }) 37 | }, 38 | 39 | onGetUserInfo: function(e) { 40 | if (!this.logged && e.detail.userInfo) { 41 | this.setData({ 42 | logged: true, 43 | avatarUrl: e.detail.userInfo.avatarUrl, 44 | userInfo: e.detail.userInfo 45 | }) 46 | } 47 | }, 48 | 49 | onGetOpenid: function() { 50 | // 调用云函数 51 | wx.cloud.callFunction({ 52 | name: 'login', 53 | data: {}, 54 | success: res => { 55 | console.log('[云函数] [login] user openid: ', JSON.stringify(res)) 56 | app.globalData.openid = res.result.openid 57 | wx.navigateTo({ 58 | url: '../userConsole/userConsole', 59 | }) 60 | }, 61 | fail: err => { 62 | console.error('[云函数] [login] 调用失败', err) 63 | wx.navigateTo({ 64 | url: '../deployFunctions/deployFunctions', 65 | }) 66 | } 67 | }) 68 | }, 69 | 70 | // 上传图片 71 | doUpload: function () { 72 | // 选择图片 73 | wx.chooseImage({ 74 | count: 1, 75 | sizeType: ['compressed'], 76 | sourceType: ['album', 'camera'], 77 | success: function (res) { 78 | 79 | wx.showLoading({ 80 | title: '上传中', 81 | }) 82 | 83 | const filePath = res.tempFilePaths[0] 84 | 85 | // 上传图片 86 | const cloudPath = 'my-image' + filePath.match(/\.[^.]+?$/)[0] 87 | wx.cloud.uploadFile({ 88 | cloudPath, 89 | filePath, 90 | success: res => { 91 | console.log('[上传文件] 成功:', res) 92 | 93 | app.globalData.fileID = res.fileID 94 | app.globalData.cloudPath = cloudPath 95 | app.globalData.imagePath = filePath 96 | 97 | wx.navigateTo({ 98 | url: '../storageConsole/storageConsole' 99 | }) 100 | }, 101 | fail: e => { 102 | console.error('[上传文件] 失败:', e) 103 | wx.showToast({ 104 | icon: 'none', 105 | title: '上传失败', 106 | }) 107 | }, 108 | complete: () => { 109 | wx.hideLoading() 110 | } 111 | }) 112 | 113 | }, 114 | fail: e => { 115 | console.error(e) 116 | } 117 | }) 118 | }, 119 | 120 | }) 121 | -------------------------------------------------------------------------------- /miniprogram/pages/index/index.json: -------------------------------------------------------------------------------- 1 | { 2 | "usingComponents": {} 3 | } -------------------------------------------------------------------------------- /miniprogram/pages/index/index.wxml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 上传图片 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 前端操作数据库 33 | 34 | 35 | 36 | 37 | 38 | 39 | 快速新建云函数 40 | 41 | 42 | 43 | 44 | 45 | 46 | 云调用 47 | 48 | 49 | 50 | 51 | 52 | -------------------------------------------------------------------------------- /miniprogram/pages/index/index.wxss: -------------------------------------------------------------------------------- 1 | /**index.wxss**/ 2 | 3 | page { 4 | background: #f6f6f6; 5 | display: flex; 6 | flex-direction: column; 7 | justify-content: flex-start; 8 | } 9 | 10 | .userinfo, .uploader, .tunnel { 11 | margin-top: 40rpx; 12 | height: 140rpx; 13 | width: 100%; 14 | background: #fff; 15 | border: 1px solid rgba(0, 0, 0, 0.1); 16 | border-left: none; 17 | border-right: none; 18 | display: flex; 19 | flex-direction: row; 20 | align-items: center; 21 | transition: all 300ms ease; 22 | } 23 | 24 | .userinfo-avatar { 25 | width: 100rpx; 26 | height: 100rpx; 27 | margin: 20rpx; 28 | border-radius: 50%; 29 | background-size: cover; 30 | background-color: white; 31 | } 32 | 33 | .userinfo-avatar:after { 34 | border: none; 35 | } 36 | 37 | .userinfo-nickname { 38 | font-size: 32rpx; 39 | color: #007aff; 40 | background-color: white; 41 | background-size: cover; 42 | } 43 | 44 | .userinfo-nickname::after { 45 | border: none; 46 | } 47 | 48 | .uploader, .tunnel { 49 | height: auto; 50 | padding: 0 0 0 40rpx; 51 | flex-direction: column; 52 | align-items: flex-start; 53 | box-sizing: border-box; 54 | } 55 | 56 | .uploader-text, .tunnel-text { 57 | width: 100%; 58 | line-height: 52px; 59 | font-size: 34rpx; 60 | color: #007aff; 61 | } 62 | 63 | .uploader-container { 64 | width: 100%; 65 | height: 400rpx; 66 | padding: 20rpx 20rpx 20rpx 0; 67 | display: flex; 68 | align-content: center; 69 | justify-content: center; 70 | box-sizing: border-box; 71 | border-top: 1px solid rgba(0, 0, 0, 0.1); 72 | } 73 | 74 | .uploader-image { 75 | width: 100%; 76 | height: 360rpx; 77 | } 78 | 79 | .tunnel { 80 | padding: 0 0 0 40rpx; 81 | } 82 | 83 | .tunnel-text { 84 | position: relative; 85 | color: #222; 86 | display: flex; 87 | flex-direction: row; 88 | align-content: center; 89 | justify-content: space-between; 90 | box-sizing: border-box; 91 | border-top: 1px solid rgba(0, 0, 0, 0.1); 92 | } 93 | 94 | .tunnel-text:first-child { 95 | border-top: none; 96 | } 97 | 98 | .tunnel-switch { 99 | position: absolute; 100 | right: 20rpx; 101 | top: -2rpx; 102 | } 103 | 104 | .disable { 105 | color: #888; 106 | } 107 | 108 | .service { 109 | position: fixed; 110 | right: 40rpx; 111 | bottom: 40rpx; 112 | width: 140rpx; 113 | height: 140rpx; 114 | border-radius: 50%; 115 | background: linear-gradient(#007aff, #0063ce); 116 | box-shadow: 0 5px 10px rgba(0, 0, 0, 0.3); 117 | display: flex; 118 | align-content: center; 119 | justify-content: center; 120 | transition: all 300ms ease; 121 | } 122 | 123 | .service-button { 124 | position: absolute; 125 | top: 40rpx; 126 | } 127 | 128 | .service:active { 129 | box-shadow: none; 130 | } 131 | 132 | .request-text { 133 | padding: 20rpx 0; 134 | font-size: 24rpx; 135 | line-height: 36rpx; 136 | word-break: break-all; 137 | } 138 | -------------------------------------------------------------------------------- /miniprogram/pages/index/user-unlogin.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zhangliwen1101/Garbage/0feb59a9162c1072f8ec53eb783cd319508f8a90/miniprogram/pages/index/user-unlogin.png -------------------------------------------------------------------------------- /miniprogram/pages/result/commit.js: -------------------------------------------------------------------------------- 1 | const db = wx.cloud.database() 2 | Page({ 3 | data: { 4 | keyword:"", 5 | isCommiting:false, 6 | }, 7 | onLoad: function (options) { 8 | var keyword= options.keyword 9 | this.setData({ 10 | keyword: keyword 11 | }) 12 | }, 13 | formSubmit:function(e){ 14 | console.log(e) 15 | console.log(e.detail) 16 | console.log(e.detail.value) 17 | var keyword = e.detail.value.keyword 18 | if (keyword == undefined || keyword == null || keyword==""){ 19 | wx.showToast({ 20 | title: '请输入垃圾名称', 21 | icon:"none" 22 | }) 23 | return 24 | } 25 | this.setData({ 26 | isCommiting:true 27 | }) 28 | 29 | db.collection('commit').add({ 30 | data:{ 31 | keyword: keyword 32 | }, 33 | success:res=>{ 34 | console.log(res) 35 | this.setData({ 36 | isCommiting: false 37 | }) 38 | wx.showToast({ 39 | title: '提交成功', 40 | icon: "none" 41 | }) 42 | wx.switchTab({ 43 | url: '/pages/ai/index', 44 | }) 45 | },fail:res=>{ 46 | this.setData({ 47 | isCommiting: false 48 | }) 49 | wx.showToast({ 50 | title: '提交失败', 51 | icon: "none" 52 | }) 53 | } 54 | }) 55 | } 56 | 57 | }) -------------------------------------------------------------------------------- /miniprogram/pages/result/commit.json: -------------------------------------------------------------------------------- 1 | { 2 | "usingComponents": {} 3 | } -------------------------------------------------------------------------------- /miniprogram/pages/result/commit.wxml: -------------------------------------------------------------------------------- 1 |
2 | 3 | 4 | 5 | 谢谢您完善垃圾样本,提交库未收藏的垃圾名称,将会帮助更多的其他人,垃圾分类感谢你的贡献 6 | 7 | 垃圾名称 8 | 9 | 10 | 18 |
-------------------------------------------------------------------------------- /miniprogram/pages/result/commit.wxss: -------------------------------------------------------------------------------- 1 | page{ 2 | height: 100%; 3 | } 4 | .bg-green { 5 | background-color: #0c7; 6 | margin: 100rpx 50rpx 0 50rpx; 7 | } 8 | 9 | .form-view { 10 | margin: 250rpx 100rpx 0 100rpx; 11 | } 12 | .txt{ 13 | font-size: 24rpx; 14 | color: #525050; 15 | margin: 40rpx 0 30rpx 0; 16 | } 17 | .img-view { 18 | display: flex; 19 | flex-direction: column; 20 | align-items: center; 21 | justify-content: center; 22 | align-content: center; 23 | width: 100%; 24 | margin-bottom: 10rpx; 25 | } 26 | 27 | .img { 28 | width: 200rpx; 29 | height: 200rpx; 30 | } 31 | -------------------------------------------------------------------------------- /miniprogram/pages/result/gan.js: -------------------------------------------------------------------------------- 1 | const db = wx.cloud.database() 2 | Page({ 3 | 4 | data: { 5 | sort:"", 6 | isShowNoResult:false, 7 | keyword:"", 8 | sorts:[{ 9 | color:"#664035", 10 | bgcolor: "#d6d5d4", 11 | logo:"/images/HouseholdfoodWaste.jpg", 12 | name:"湿垃圾", 13 | content: "日常生活垃圾产生的容易腐烂的生物质废弃物", 14 | desc: "剩菜剩饭、瓜皮果核、花卉绿植、过期食品等", 15 | action: ["纯流质的食物垃圾,如牛奶等,应直接倒进下水口","有包装物的湿垃圾应将包装物去除后分类投放,包装物请投放到对应的可回收物或干垃圾容器"], 16 | },{ 17 | color: "#2c2b27", 18 | bgcolor: "#e9e8e6", 19 | logo: "/images/ResidualWaste.png", 20 | name: "干垃圾", 21 | content: "除有害垃圾、湿垃圾、可回收物以外的其他生活废弃物", 22 | desc: "餐盒、餐巾纸、湿纸巾、卫生间用纸、塑料袋、 食品包装袋、污染严重的纸、烟蒂、纸尿裤、 一次性杯子、大骨头、贝壳、花盆、陶瓷等", 23 | action: ["尽量沥干水分", "难以辨识类别的生活垃圾投入干垃圾容器内"], 24 | 25 | },{ 26 | color: "#e73322", 27 | bgcolor: "#c8e2f8", 28 | logo: "/images/HazardouAwaste.jpg", 29 | name: "有害垃圾", 30 | content: "对人体健康或者自然环境造成直接或潜在危害的废弃物", 31 | desc: "废电池、油漆桶、荧光灯管、废药品及其包装物等", 32 | action: ["投放时请注意轻放", "易破损的请连带包装或包裹后轻放","如易挥发,请密封后投放"], 33 | },{ 34 | color: "#014782", 35 | bgcolor: "#e9e8e6", 36 | logo: "/images/RecycleableWaste.jpg", 37 | name: "可回收物", 38 | content: "适宜回收利用和资源化利 用的,如:玻、金、塑、 纸、衣", 39 | desc: "酱油瓶、玻璃杯、平板玻璃、易拉罐、饮料瓶、 洗发水瓶、塑料玩具、书本、报纸、广告单、 纸板箱、衣服、床上用品等", 40 | action: ["轻投轻放", "清洁干燥,避免污染", "废纸尽量平整", "立体包装物请清空内容物,清洁后压扁投放","有尖锐边角的,应包裹后投放"], 41 | }] 42 | }, 43 | 44 | onLoad: function (options) { 45 | var sortId = options.sortId 46 | console.log(sortId) 47 | switch (parseInt(sortId)) { 48 | case 1: 49 | this.data.sort = this.data.sorts[3] 50 | break; 51 | case 2: 52 | this.data.sort = this.data.sorts[2] 53 | break; 54 | case 3: 55 | this.data.sort = this.data.sorts[0] 56 | break; 57 | case 4: 58 | this.data.sort = this.data.sorts[1] 59 | break 60 | } 61 | this.setData({ 62 | sort: this.data.sort, 63 | }) 64 | }, 65 | commit:function(){ 66 | wx.navigateTo({ 67 | url: '/pages/result/commit?keyword='+this.data.keyword, 68 | }) 69 | }, 70 | onGoHome:function(){ 71 | wx.switchTab({ 72 | url: '/pages/ai/index', 73 | }) 74 | } 75 | }) -------------------------------------------------------------------------------- /miniprogram/pages/result/gan.json: -------------------------------------------------------------------------------- 1 | { 2 | "navigationBarBackgroundColor": "#ffffff", 3 | "navigationBarTextStyle": "black", 4 | "usingComponents": {} 5 | } -------------------------------------------------------------------------------- /miniprogram/pages/result/gan.wxml: -------------------------------------------------------------------------------- 1 | 3 | 4 | 5 | 6 | {{sort.name}}: 7 | {{sort.content}} 8 | 9 | 10 | {{sort.name}}主要包括 11 | {{sort.desc}} 12 | {{sort.name}}投放要求 13 | 14 | 15 | 16 | {{item}} 17 | 18 | 19 | 20 | 21 | 22 | 未找到相关内容 23 | 24 | 回首页 25 | 去提交 26 | 27 | 28 | -------------------------------------------------------------------------------- /miniprogram/pages/result/gan.wxss: -------------------------------------------------------------------------------- 1 | page{ 2 | height: 100%; 3 | } 4 | .container { 5 | margin: 50rpx 5%; 6 | width: 90%; 7 | padding: 40rpx 20rpx; 8 | height: 100%; 9 | display: flex; 10 | flex-direction: column; 11 | background-color: #e9e8e6; 12 | border-radius: 20rpx; 13 | 14 | } 15 | 16 | .view-hearder { 17 | display: flex; 18 | flex-direction: row; 19 | width: 100%; 20 | } 21 | 22 | .hearder-name-view { 23 | display: flex; 24 | flex-direction: column; 25 | margin-left: 30rpx; 26 | } 27 | 28 | .one-view { 29 | font-size: 30rpx; 30 | font-weight: bold; 31 | } 32 | 33 | .two-view { 34 | width: 400rpx; 35 | font-size: 25rpx; 36 | } 37 | 38 | .logo { 39 | height: 200rpx; 40 | width: 200rpx; 41 | border-radius: 20rpx; 42 | } 43 | 44 | .title { 45 | /* background-color: #2c2b27; */ 46 | color: white; 47 | height: 80rpx; 48 | width: 100%; 49 | display: flex; 50 | flex-direction: column; 51 | justify-content: center; 52 | align-items: center; 53 | margin: 30rpx 0; 54 | } 55 | .text-gan{ 56 | color: #2c2b27; 57 | } 58 | .action-go{ 59 | width: 100%; 60 | margin-top: 10rpx; 61 | } 62 | .no-view{ 63 | display: flex; 64 | flex-direction: column; 65 | align-content: center; 66 | align-items: center; 67 | margin-top: 250rpx; 68 | } 69 | .no-img{ 70 | width: 300rpx; 71 | height: 300rpx; 72 | } 73 | .content{ 74 | color:#00cc77; 75 | font-size:30rpx; 76 | font-weight: bold; 77 | margin-top: 30rpx; 78 | } 79 | .btn-view{ 80 | margin-top: 40rpx; 81 | display: flex; 82 | flex-direction: row; 83 | } 84 | .btn-commit{ 85 | border-radius: 20rpx; 86 | background-color:#00cc77; 87 | color: white; 88 | margin:0 10rpx; 89 | padding: 20rpx 80rpx; 90 | } -------------------------------------------------------------------------------- /miniprogram/pages/result/list.js: -------------------------------------------------------------------------------- 1 | const db = wx.cloud.database() 2 | Page({ 3 | 4 | 5 | data: { 6 | MAX_LIMIT: 20, 7 | page: 0, 8 | dataCount: 0, 9 | datas: [], 10 | logo: "", 11 | isSHow: false, 12 | keyword:"", 13 | isHasData:true, 14 | }, 15 | 16 | 17 | onLoad: function (options) { 18 | this.data.keyword = options.keyword 19 | this.data.dataCount = db.collection('product').count() 20 | this.onGetData() 21 | }, 22 | onGetData: function () { 23 | wx.showLoading({ 24 | title: '正在加载数据中.....', 25 | }) 26 | if (this.data.dataCount < this.data.page * this.data.MAX_LIMIT) { 27 | wx.showToast({ 28 | title: '数据已经加载完', 29 | icon: "none" 30 | }) 31 | wx.hideLoading() 32 | return 33 | } 34 | var that = this 35 | if (this.data.page == 0) { 36 | this.data.datas = [] 37 | } 38 | var datas = db.collection('product').skip(this.data.page * this.data.MAX_LIMIT).limit(this.data.MAX_LIMIT).where({ 39 | name: db.RegExp({ 40 | regexp: that.data.keyword, 41 | }) 42 | }).get({ 43 | success: function (res) { 44 | wx.hideLoading() 45 | 46 | if (res.data.length == 0 && that.data.page==0){ 47 | that.setData({ 48 | isHasData: false 49 | }) 50 | }else{ 51 | for (var i = 0; i < res.data.length; i++) { 52 | that.data.datas.push(res.data[i]) 53 | } 54 | that.setData({ 55 | datas: that.data.datas, 56 | isHasData: true 57 | }) 58 | that.data.page = that.data.page + 1 59 | } 60 | }, fail: res => { 61 | wx.hideLoading() 62 | if (that.data.datas.length==0){ 63 | that.setData({ 64 | isHasData: false 65 | }) 66 | } 67 | wx.showToast({ 68 | title: '数据加载失败', 69 | icon: "none" 70 | }) 71 | } 72 | }) 73 | }, 74 | onItemClick: function (event) { 75 | var index = event.currentTarget.dataset.index 76 | console.log(index) 77 | var data=this.data.datas[index] 78 | wx.navigateTo({ 79 | url: '/pages/result/gan?sortId=' + data.sortId, 80 | }) 81 | }, 82 | hideModal: function () { 83 | this.setData({ 84 | isShow: !this.data.isShow 85 | }) 86 | }, 87 | onPullDownRefresh: function () { 88 | this.data.page = 0 89 | this.onGetData() 90 | }, 91 | onGoHome:function(){ 92 | wx.switchTab({ 93 | url: '/pages/ai/index', 94 | }) 95 | }, 96 | commit: function () { 97 | wx.navigateTo({ 98 | url: '/pages/result/commit?keyword=' + this.data.keyword, 99 | }) 100 | }, 101 | onReachBottom: function () { 102 | this.onGetData() 103 | }, 104 | 105 | }) -------------------------------------------------------------------------------- /miniprogram/pages/result/list.json: -------------------------------------------------------------------------------- 1 | { 2 | "onReachBottomDistance": 50, 3 | "usingComponents": {} 4 | } -------------------------------------------------------------------------------- /miniprogram/pages/result/list.wxml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | {{item.name}} 9 | 10 | 11 | 12 | 13 | 14 | 15 | {{item.name}} 16 | 17 | 18 | 19 | 20 | 21 | 22 | 未找到相关内容 23 | 24 | 回首页 25 | 去提交 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | -------------------------------------------------------------------------------- /miniprogram/pages/result/list.wxss: -------------------------------------------------------------------------------- 1 | .bg-darkGray { 2 | background-color: #f6f6f6; 3 | color:#ffffff; 4 | } 5 | .cu-bar .search-form { 6 | background-color: #ffffff; 7 | } 8 | 9 | .filter-view { 10 | display: flex; 11 | flex-direction: column; 12 | } 13 | .item-view{ 14 | display: flex; 15 | flex-direction: row; 16 | padding: 20rpx 50rpx; 17 | height: 90rpx; 18 | align-items: center; 19 | } 20 | .img{ 21 | height: 50rpx; 22 | width: 50rpx; 23 | margin-right: 30rpx; 24 | } 25 | .item-ji { 26 | background-color: #f6f6f6; 27 | color:black; 28 | } 29 | .cu-dialog{ 30 | width: 300rpx; 31 | } 32 | .bg-img{ 33 | width: 300rpx; 34 | height: 300rpx; 35 | } 36 | .no-view{ 37 | display: flex; 38 | flex-direction: column; 39 | align-content: center; 40 | align-items: center; 41 | margin-top: 250rpx; 42 | } 43 | .no-img{ 44 | width: 300rpx; 45 | height: 300rpx; 46 | } 47 | .content{ 48 | color:#00cc77; 49 | font-size:30rpx; 50 | font-weight: bold; 51 | margin-top: 30rpx; 52 | } 53 | .btn-view{ 54 | margin-top: 40rpx; 55 | display: flex; 56 | flex-direction: row; 57 | } 58 | .btn-commit{ 59 | border-radius: 20rpx; 60 | background-color:#00cc77; 61 | color: white; 62 | margin:0 10rpx; 63 | padding: 20rpx 80rpx; 64 | } -------------------------------------------------------------------------------- /miniprogram/pages/sort/sort.js: -------------------------------------------------------------------------------- 1 | const app = getApp(); 2 | Page({ 3 | data: { 4 | ColorList: [ 5 | "../../images/RecycleableWaste.jpg", 6 | "../../images/HazardouAwaste.jpg", 7 | "../../images/HouseholdfoodWaste.jpg", 8 | "../../images/ResidualWaste.png", 9 | ] 10 | }, 11 | goSearch: function () { 12 | wx.navigateTo({ 13 | url: '/pages/ai/search', 14 | }) 15 | }, 16 | onClick:function(e){ 17 | console.log(JSON.stringify(e)) 18 | var index = e.currentTarget.dataset.index 19 | var indexClick=0; 20 | switch (index){ 21 | case 0: 22 | indexClick=1 23 | break; 24 | case 1: 25 | indexClick = 2 26 | break; 27 | case 2: 28 | indexClick = 3 29 | break; 30 | case 3: 31 | indexClick = 4 32 | break; 33 | } 34 | wx.navigateTo({ 35 | url: '/pages/ai/filter/filter?type=' + indexClick, 36 | }) 37 | } 38 | }) -------------------------------------------------------------------------------- /miniprogram/pages/sort/sort.json: -------------------------------------------------------------------------------- 1 | { 2 | "usingComponents": {} 3 | } -------------------------------------------------------------------------------- /miniprogram/pages/sort/sort.wxml: -------------------------------------------------------------------------------- 1 | 2 | 保护环境,人人有责 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | -------------------------------------------------------------------------------- /miniprogram/pages/sort/sort.wxss: -------------------------------------------------------------------------------- 1 | .icon{ 2 | width: 220rpx; 3 | height: 220rpx; 4 | margin: 20rpx 40rpx; 5 | border-radius: 20rpx; 6 | } 7 | .padding-sm{ 8 | width: 100%; 9 | } 10 | .top-view{ 11 | display: flex; 12 | flex-direction: row; 13 | justify-content: center; 14 | margin-top: 70rpx; 15 | } 16 | 17 | .bg-darkGray { 18 | background-color: #f6f6f6; 19 | color:#ffffff; 20 | } 21 | .cu-bar .search-form { 22 | background-color: #ffffff; 23 | } 24 | .cu-bar{ 25 | margin-top: 20rpx; 26 | } -------------------------------------------------------------------------------- /miniprogram/project.config.json: -------------------------------------------------------------------------------- 1 | { 2 | "description": "项目配置文件", 3 | "packOptions": { 4 | "ignore": [] 5 | }, 6 | "setting": { 7 | "urlCheck": true, 8 | "es6": true, 9 | "postcss": true, 10 | "minified": true, 11 | "newFeature": true, 12 | "autoAudits": false 13 | }, 14 | "compileType": "miniprogram", 15 | "libVersion": "2.7.7", 16 | "appid": "wxde6079eb86902fda", 17 | "projectname": "miniprogram-test-1", 18 | "cloudfunctionRoot": "cloudfunctions/", 19 | "debugOptions": { 20 | "hidedInDevtools": [] 21 | }, 22 | "isGameTourist": false, 23 | "condition": { 24 | "search": { 25 | "current": -1, 26 | "list": [] 27 | }, 28 | "conversation": { 29 | "current": -1, 30 | "list": [] 31 | }, 32 | "game": { 33 | "currentL": -1, 34 | "list": [] 35 | }, 36 | "miniprogram": { 37 | "current": -1, 38 | "list": [] 39 | } 40 | } 41 | } -------------------------------------------------------------------------------- /miniprogram/sitemap.json: -------------------------------------------------------------------------------- 1 | { 2 | "desc": "关于本文件的更多信息,请参考文档 https://developers.weixin.qq.com/miniprogram/dev/framework/sitemap.html", 3 | "rules": [{ 4 | "action": "allow", 5 | "page": "*" 6 | }] 7 | } -------------------------------------------------------------------------------- /miniprogram/style/guide.wxss: -------------------------------------------------------------------------------- 1 | page { 2 | background: #f6f6f6; 3 | display: flex; 4 | flex-direction: column; 5 | justify-content: flex-start; 6 | } 7 | 8 | .list { 9 | margin-top: 40rpx; 10 | height: auto; 11 | width: 100%; 12 | background: #fff; 13 | padding: 0 40rpx; 14 | border: 1px solid rgba(0, 0, 0, 0.1); 15 | border-left: none; 16 | border-right: none; 17 | transition: all 300ms ease; 18 | display: flex; 19 | flex-direction: column; 20 | align-items: stretch; 21 | box-sizing: border-box; 22 | } 23 | 24 | .list-item { 25 | width: 100%; 26 | padding: 0; 27 | line-height: 104rpx; 28 | font-size: 34rpx; 29 | color: #007aff; 30 | border-top: 1px solid rgba(0, 0, 0, 0.1); 31 | display: flex; 32 | flex-direction: row; 33 | align-content: center; 34 | justify-content: space-between; 35 | box-sizing: border-box; 36 | } 37 | 38 | .list-item:first-child { 39 | border-top: none; 40 | } 41 | 42 | .list-item image { 43 | max-width: 100%; 44 | max-height: 20vh; 45 | margin: 20rpx 0; 46 | } 47 | 48 | .request-text { 49 | color: #222; 50 | padding: 20rpx 0; 51 | font-size: 24rpx; 52 | line-height: 36rpx; 53 | word-break: break-all; 54 | } 55 | 56 | .guide { 57 | width: 100%; 58 | padding: 40rpx; 59 | box-sizing: border-box; 60 | display: flex; 61 | flex-direction: column; 62 | } 63 | 64 | .guide .headline { 65 | font-size: 34rpx; 66 | font-weight: bold; 67 | color: #555; 68 | line-height: 40rpx; 69 | } 70 | 71 | .guide .p { 72 | margin-top: 20rpx; 73 | font-size: 28rpx; 74 | line-height: 36rpx; 75 | color: #666; 76 | } 77 | 78 | .guide .code { 79 | margin-top: 20rpx; 80 | font-size: 28rpx; 81 | line-height: 36rpx; 82 | color: #666; 83 | background: white; 84 | white-space: pre; 85 | } 86 | 87 | .guide .code-dark { 88 | margin-top: 20rpx; 89 | background: rgba(0, 0, 0, 0.8); 90 | padding: 20rpx; 91 | font-size: 28rpx; 92 | line-height: 36rpx; 93 | border-radius: 6rpx; 94 | color: #fff; 95 | white-space: pre 96 | } 97 | 98 | .guide image { 99 | max-width: 100%; 100 | } 101 | 102 | .guide .image1 { 103 | margin-top: 20rpx; 104 | max-width: 100%; 105 | width: 356px; 106 | height: 47px; 107 | } 108 | 109 | .guide .image2 { 110 | margin-top: 20rpx; 111 | width: 264px; 112 | height: 100px; 113 | } 114 | 115 | .guide .flat-image { 116 | height: 100px; 117 | } 118 | 119 | .guide .code-image { 120 | max-width: 100%; 121 | } 122 | 123 | .guide .copyBtn { 124 | width: 180rpx; 125 | font-size: 20rpx; 126 | margin-top: 16rpx; 127 | margin-left: 0; 128 | } 129 | 130 | .guide .nav { 131 | margin-top: 50rpx; 132 | display: flex; 133 | flex-direction: row; 134 | align-content: space-between; 135 | } 136 | 137 | .guide .nav .prev { 138 | margin-left: unset; 139 | } 140 | 141 | .guide .nav .next { 142 | margin-right: unset; 143 | } 144 | 145 | -------------------------------------------------------------------------------- /miniprogram/utils/http.js: -------------------------------------------------------------------------------- 1 | var md5 = require('md5.js') 2 | function req(url, data, cb, method) { 3 | 4 | for (var Key in data) { 5 | if (data[Key] === null) { 6 | delete data[Key]; 7 | } 8 | } 9 | 10 | wx.request({ 11 | url: url, 12 | data: data, 13 | method: method || 'GET', 14 | header: { 15 | "content-type": "application/x-www-form-urlencoded", 16 | 17 | }, 18 | success: function (res) { 19 | return typeof cb == "function" && cb(res) 20 | }, 21 | fail: function () { 22 | return typeof cb == "function" && cb(false) 23 | } 24 | }) 25 | } 26 | module.exports = { 27 | req: req, 28 | } -------------------------------------------------------------------------------- /miniprogram/utils/map.js: -------------------------------------------------------------------------------- 1 | function Map() { 2 | var struct = function(key, value) { 3 | this.key = key; 4 | this.value = value; 5 | } 6 | 7 | var put = function(key, value) { 8 | for (var i = 0; i < this.arr.length; i++) { 9 | if (this.arr[i].key === key) { 10 | this.arr[i].value = value; 11 | return; 12 | } 13 | } 14 | this.arr[this.arr.length] = new struct(key, value); 15 | } 16 | 17 | var get = function(key) { 18 | for (var i = 0; i < this.arr.length; i++) { 19 | if (this.arr[i].key === key) { 20 | return this.arr[i].value; 21 | } 22 | } 23 | return null; 24 | } 25 | 26 | var remove = function(key) { 27 | var v; 28 | for (var i = 0; i < this.arr.length; i++) { 29 | v = this.arr.pop(); 30 | if (v.key === key) { 31 | continue; 32 | } 33 | this.arr.unshift(v); 34 | } 35 | } 36 | 37 | var size = function() { 38 | return this.arr.length; 39 | } 40 | 41 | var isEmpty = function() { 42 | return this.arr.length <= 0; 43 | } 44 | 45 | this.arr = new Array(); 46 | this.get = get; 47 | this.put = put; 48 | this.remove = remove; 49 | this.size = size; 50 | this.isEmpty = isEmpty; 51 | } 52 | 53 | module.exports = { 54 | Map: Map 55 | } -------------------------------------------------------------------------------- /miniprogram/utils/md5.js: -------------------------------------------------------------------------------- 1 | /* 2 | * A JavaScript implementation of the RSA Data Security, Inc. MD5 Message 3 | * Digest Algorithm, as defined in RFC 1321. 4 | * Version 1.1 Copyright (C) Paul Johnston 1999 - 2002. 5 | * Code also contributed by Greg Holt 6 | * See http://pajhome.org.uk/site/legal.html for details. 7 | */ 8 | 9 | /* 10 | * Add integers, wrapping at 2^32. This uses 16-bit operations internally 11 | * to work around bugs in some JS interpreters. 12 | */ 13 | function safe_add(x, y) { 14 | var lsw = (x & 0xFFFF) + (y & 0xFFFF) 15 | var msw = (x >> 16) + (y >> 16) + (lsw >> 16) 16 | return (msw << 16) | (lsw & 0xFFFF) 17 | } 18 | 19 | /* 20 | * Bitwise rotate a 32-bit number to the left. 21 | */ 22 | function rol(num, cnt) { 23 | return (num << cnt) | (num >>> (32 - cnt)) 24 | } 25 | 26 | /* 27 | * These functions implement the four basic operations the algorithm uses. 28 | */ 29 | function cmn(q, a, b, x, s, t) { 30 | return safe_add(rol(safe_add(safe_add(a, q), safe_add(x, t)), s), b) 31 | } 32 | function ff(a, b, c, d, x, s, t) { 33 | return cmn((b & c) | ((~b) & d), a, b, x, s, t) 34 | } 35 | function gg(a, b, c, d, x, s, t) { 36 | return cmn((b & d) | (c & (~d)), a, b, x, s, t) 37 | } 38 | function hh(a, b, c, d, x, s, t) { 39 | return cmn(b ^ c ^ d, a, b, x, s, t) 40 | } 41 | function ii(a, b, c, d, x, s, t) { 42 | return cmn(c ^ (b | (~d)), a, b, x, s, t) 43 | } 44 | 45 | /* 46 | * Calculate the MD5 of an array of little-endian words, producing an array 47 | * of little-endian words. 48 | */ 49 | function coreMD5(x) { 50 | var a = 1732584193 51 | var b = -271733879 52 | var c = -1732584194 53 | var d = 271733878 54 | 55 | for (var i = 0; i < x.length; i += 16) { 56 | var olda = a 57 | var oldb = b 58 | var oldc = c 59 | var oldd = d 60 | 61 | a = ff(a, b, c, d, x[i + 0], 7, -680876936) 62 | d = ff(d, a, b, c, x[i + 1], 12, -389564586) 63 | c = ff(c, d, a, b, x[i + 2], 17, 606105819) 64 | b = ff(b, c, d, a, x[i + 3], 22, -1044525330) 65 | a = ff(a, b, c, d, x[i + 4], 7, -176418897) 66 | d = ff(d, a, b, c, x[i + 5], 12, 1200080426) 67 | c = ff(c, d, a, b, x[i + 6], 17, -1473231341) 68 | b = ff(b, c, d, a, x[i + 7], 22, -45705983) 69 | a = ff(a, b, c, d, x[i + 8], 7, 1770035416) 70 | d = ff(d, a, b, c, x[i + 9], 12, -1958414417) 71 | c = ff(c, d, a, b, x[i + 10], 17, -42063) 72 | b = ff(b, c, d, a, x[i + 11], 22, -1990404162) 73 | a = ff(a, b, c, d, x[i + 12], 7, 1804603682) 74 | d = ff(d, a, b, c, x[i + 13], 12, -40341101) 75 | c = ff(c, d, a, b, x[i + 14], 17, -1502002290) 76 | b = ff(b, c, d, a, x[i + 15], 22, 1236535329) 77 | 78 | a = gg(a, b, c, d, x[i + 1], 5, -165796510) 79 | d = gg(d, a, b, c, x[i + 6], 9, -1069501632) 80 | c = gg(c, d, a, b, x[i + 11], 14, 643717713) 81 | b = gg(b, c, d, a, x[i + 0], 20, -373897302) 82 | a = gg(a, b, c, d, x[i + 5], 5, -701558691) 83 | d = gg(d, a, b, c, x[i + 10], 9, 38016083) 84 | c = gg(c, d, a, b, x[i + 15], 14, -660478335) 85 | b = gg(b, c, d, a, x[i + 4], 20, -405537848) 86 | a = gg(a, b, c, d, x[i + 9], 5, 568446438) 87 | d = gg(d, a, b, c, x[i + 14], 9, -1019803690) 88 | c = gg(c, d, a, b, x[i + 3], 14, -187363961) 89 | b = gg(b, c, d, a, x[i + 8], 20, 1163531501) 90 | a = gg(a, b, c, d, x[i + 13], 5, -1444681467) 91 | d = gg(d, a, b, c, x[i + 2], 9, -51403784) 92 | c = gg(c, d, a, b, x[i + 7], 14, 1735328473) 93 | b = gg(b, c, d, a, x[i + 12], 20, -1926607734) 94 | 95 | a = hh(a, b, c, d, x[i + 5], 4, -378558) 96 | d = hh(d, a, b, c, x[i + 8], 11, -2022574463) 97 | c = hh(c, d, a, b, x[i + 11], 16, 1839030562) 98 | b = hh(b, c, d, a, x[i + 14], 23, -35309556) 99 | a = hh(a, b, c, d, x[i + 1], 4, -1530992060) 100 | d = hh(d, a, b, c, x[i + 4], 11, 1272893353) 101 | c = hh(c, d, a, b, x[i + 7], 16, -155497632) 102 | b = hh(b, c, d, a, x[i + 10], 23, -1094730640) 103 | a = hh(a, b, c, d, x[i + 13], 4, 681279174) 104 | d = hh(d, a, b, c, x[i + 0], 11, -358537222) 105 | c = hh(c, d, a, b, x[i + 3], 16, -722521979) 106 | b = hh(b, c, d, a, x[i + 6], 23, 76029189) 107 | a = hh(a, b, c, d, x[i + 9], 4, -640364487) 108 | d = hh(d, a, b, c, x[i + 12], 11, -421815835) 109 | c = hh(c, d, a, b, x[i + 15], 16, 530742520) 110 | b = hh(b, c, d, a, x[i + 2], 23, -995338651) 111 | 112 | a = ii(a, b, c, d, x[i + 0], 6, -198630844) 113 | d = ii(d, a, b, c, x[i + 7], 10, 1126891415) 114 | c = ii(c, d, a, b, x[i + 14], 15, -1416354905) 115 | b = ii(b, c, d, a, x[i + 5], 21, -57434055) 116 | a = ii(a, b, c, d, x[i + 12], 6, 1700485571) 117 | d = ii(d, a, b, c, x[i + 3], 10, -1894986606) 118 | c = ii(c, d, a, b, x[i + 10], 15, -1051523) 119 | b = ii(b, c, d, a, x[i + 1], 21, -2054922799) 120 | a = ii(a, b, c, d, x[i + 8], 6, 1873313359) 121 | d = ii(d, a, b, c, x[i + 15], 10, -30611744) 122 | c = ii(c, d, a, b, x[i + 6], 15, -1560198380) 123 | b = ii(b, c, d, a, x[i + 13], 21, 1309151649) 124 | a = ii(a, b, c, d, x[i + 4], 6, -145523070) 125 | d = ii(d, a, b, c, x[i + 11], 10, -1120210379) 126 | c = ii(c, d, a, b, x[i + 2], 15, 718787259) 127 | b = ii(b, c, d, a, x[i + 9], 21, -343485551) 128 | 129 | a = safe_add(a, olda) 130 | b = safe_add(b, oldb) 131 | c = safe_add(c, oldc) 132 | d = safe_add(d, oldd) 133 | } 134 | return [a, b, c, d] 135 | } 136 | 137 | /* 138 | * Convert an array of little-endian words to a hex string. 139 | */ 140 | function binl2hex(binarray) { 141 | var hex_tab = "0123456789abcdef" 142 | var str = "" 143 | for (var i = 0; i < binarray.length * 4; i++) { 144 | str += hex_tab.charAt((binarray[i >> 2] >> ((i % 4) * 8 + 4)) & 0xF) + 145 | hex_tab.charAt((binarray[i >> 2] >> ((i % 4) * 8)) & 0xF) 146 | } 147 | return str 148 | } 149 | 150 | /* 151 | * Convert an array of little-endian words to a base64 encoded string. 152 | */ 153 | function binl2b64(binarray) { 154 | var tab = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/" 155 | var str = "" 156 | for (var i = 0; i < binarray.length * 32; i += 6) { 157 | str += tab.charAt(((binarray[i >> 5] << (i % 32)) & 0x3F) | 158 | ((binarray[i >> 5 + 1] >> (32 - i % 32)) & 0x3F)) 159 | } 160 | return str 161 | } 162 | 163 | /* 164 | * Convert an 8-bit character string to a sequence of 16-word blocks, stored 165 | * as an array, and append appropriate padding for MD4/5 calculation. 166 | * If any of the characters are >255, the high byte is silently ignored. 167 | */ 168 | function str2binl(str) { 169 | var nblk = ((str.length + 8) >> 6) + 1 // number of 16-word blocks 170 | var blks = new Array(nblk * 16) 171 | for (var i = 0; i < nblk * 16; i++) blks[i] = 0 172 | for (var i = 0; i < str.length; i++) 173 | blks[i >> 2] |= (str.charCodeAt(i) & 0xFF) << ((i % 4) * 8) 174 | blks[i >> 2] |= 0x80 << ((i % 4) * 8) 175 | blks[nblk * 16 - 2] = str.length * 8 176 | return blks 177 | } 178 | 179 | /* 180 | * Convert a wide-character string to a sequence of 16-word blocks, stored as 181 | * an array, and append appropriate padding for MD4/5 calculation. 182 | */ 183 | function strw2binl(str) { 184 | var nblk = ((str.length + 4) >> 5) + 1 // number of 16-word blocks 185 | var blks = new Array(nblk * 16) 186 | for (var i = 0; i < nblk * 16; i++) blks[i] = 0 187 | for (var i = 0; i < str.length; i++) 188 | blks[i >> 1] |= str.charCodeAt(i) << ((i % 2) * 16) 189 | blks[i >> 1] |= 0x80 << ((i % 2) * 16) 190 | blks[nblk * 16 - 2] = str.length * 16 191 | return blks 192 | } 193 | 194 | /* 195 | * External interface 196 | */ 197 | function hexMD5(str) { return binl2hex(coreMD5(str2binl(str))) } 198 | function hexMD5w(str) { return binl2hex(coreMD5(strw2binl(str))) } 199 | function b64MD5(str) { return binl2b64(coreMD5(str2binl(str))) } 200 | function b64MD5w(str) { return binl2b64(coreMD5(strw2binl(str))) } 201 | /* Backward compatibility */ 202 | function calcMD5(str) { return binl2hex(coreMD5(str2binl(str))) } 203 | module.exports = { 204 | hexMD5: hexMD5 205 | } -------------------------------------------------------------------------------- /miniprogram/utils/strings.js: -------------------------------------------------------------------------------- 1 | /** 2 | * Copyright (c) 2014 Baidu.com, Inc. All Rights Reserved 3 | * 4 | * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with 5 | * the License. You may obtain a copy of the License at 6 | * 7 | * http://www.apache.org/licenses/LICENSE-2.0 8 | * 9 | * Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on 10 | * an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the 11 | * specific language governing permissions and limitations under the License. 12 | * 13 | * @file strings.js 14 | * @author leeight 15 | */ 16 | 17 | var kEscapedMap = { 18 | '!': '%21', 19 | '\'': '%27', 20 | '(': '%28', 21 | ')': '%29', 22 | '*': '%2A' 23 | }; 24 | 25 | exports.normalize = function (string, encodingSlash) { 26 | var result = encodeURIComponent(string); 27 | result = result.replace(/[!'\(\)\*]/g, function ($1) { 28 | return kEscapedMap[$1]; 29 | }); 30 | 31 | if (encodingSlash === false) { 32 | result = result.replace(/%2F/gi, '/'); 33 | } 34 | 35 | return result; 36 | }; 37 | 38 | exports.trim = function (string) { 39 | return (string || '').replace(/^\s+|\s+$/g, ''); 40 | }; 41 | 42 | -------------------------------------------------------------------------------- /miniprogram/utils/util.js: -------------------------------------------------------------------------------- 1 | var md5 = require('md5.js') 2 | const formatTime = date => { 3 | const year = date.getFullYear() 4 | const month = date.getMonth() + 1 5 | const day = date.getDate() 6 | const hour = date.getHours() 7 | const minute = date.getMinutes() 8 | const second = date.getSeconds() 9 | 10 | return [year, month, day].map(formatNumber).join('/') + ' ' + [hour, minute, second].map(formatNumber).join(':') 11 | } 12 | 13 | const formatNumber = n => { 14 | n = n.toString() 15 | return n[1] ? n : '0' + n 16 | } 17 | /** 生成随机字符串*/ 18 | function generateRandomString(n){ 19 | var chars = ['0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z']; 20 | var res = ""; 21 | for (var i = 0; i < n; i++) { 22 | var id = Math.ceil(Math.random() * 35); 23 | res += chars[id]; 24 | } 25 | return res; 26 | } 27 | /** 腾讯AI 签名*/ 28 | function signTengxunAI(map,key){ 29 | var mapKeys = map.keys; 30 | var keysArr = [] 31 | for (let key of map.keys()) { 32 | keysArr.push(key); 33 | } 34 | console.log("sort", keysArr.sort()) 35 | var param = ''; 36 | for (var i = 0; i < keysArr.length; i++) { 37 | param = param + keysArr[i] + "=" + map.get(keysArr[i]) + "&" 38 | } 39 | param = param + "app_key="+key 40 | var md5Param = md5.hexMD5(param).toUpperCase() 41 | // console.log("param============", param) 42 | console.log("md5Param=========", md5Param) 43 | return md5Param 44 | } 45 | 46 | 47 | function Base64() { 48 | 49 | // private property 50 | var _keyStr = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/="; 51 | 52 | // public method for encoding 53 | this.encode = function (input) { 54 | var output = ""; 55 | var chr1, chr2, chr3, enc1, enc2, enc3, enc4; 56 | var i = 0; 57 | input = _utf8_encode(input); 58 | while (i < input.length) { 59 | chr1 = input.charCodeAt(i++); 60 | chr2 = input.charCodeAt(i++); 61 | chr3 = input.charCodeAt(i++); 62 | enc1 = chr1 >> 2; 63 | enc2 = ((chr1 & 3) << 4) | (chr2 >> 4); 64 | enc3 = ((chr2 & 15) << 2) | (chr3 >> 6); 65 | enc4 = chr3 & 63; 66 | if (isNaN(chr2)) { 67 | enc3 = enc4 = 64; 68 | } else if (isNaN(chr3)) { 69 | enc4 = 64; 70 | } 71 | output = output + 72 | _keyStr.charAt(enc1) + _keyStr.charAt(enc2) + 73 | _keyStr.charAt(enc3) + _keyStr.charAt(enc4); 74 | } 75 | return output; 76 | } 77 | 78 | // public method for decoding 79 | this.decode = function (input) { 80 | var output = ""; 81 | var chr1, chr2, chr3; 82 | var enc1, enc2, enc3, enc4; 83 | var i = 0; 84 | input = input.replace(/[^A-Za-z0-9\+\/\=]/g, ""); 85 | while (i < input.length) { 86 | enc1 = _keyStr.indexOf(input.charAt(i++)); 87 | enc2 = _keyStr.indexOf(input.charAt(i++)); 88 | enc3 = _keyStr.indexOf(input.charAt(i++)); 89 | enc4 = _keyStr.indexOf(input.charAt(i++)); 90 | chr1 = (enc1 << 2) | (enc2 >> 4); 91 | chr2 = ((enc2 & 15) << 4) | (enc3 >> 2); 92 | chr3 = ((enc3 & 3) << 6) | enc4; 93 | output = output + String.fromCharCode(chr1); 94 | if (enc3 != 64) { 95 | output = output + String.fromCharCode(chr2); 96 | } 97 | if (enc4 != 64) { 98 | output = output + String.fromCharCode(chr3); 99 | } 100 | } 101 | output = _utf8_decode(output); 102 | return output; 103 | } 104 | 105 | // private method for UTF-8 encoding 106 | _utf8_encode = function (string) { 107 | string = string.replace(/\r\n/g, "\n"); 108 | var utftext = ""; 109 | for (var n = 0; n < string.length; n++) { 110 | var c = string.charCodeAt(n); 111 | if (c < 128) { 112 | utftext += String.fromCharCode(c); 113 | } else if ((c > 127) && (c < 2048)) { 114 | utftext += String.fromCharCode((c >> 6) | 192); 115 | utftext += String.fromCharCode((c & 63) | 128); 116 | } else { 117 | utftext += String.fromCharCode((c >> 12) | 224); 118 | utftext += String.fromCharCode(((c >> 6) & 63) | 128); 119 | utftext += String.fromCharCode((c & 63) | 128); 120 | } 121 | 122 | } 123 | return utftext; 124 | } 125 | 126 | // private method for UTF-8 decoding 127 | _utf8_decode = function (utftext) { 128 | var string = ""; 129 | var i = 0; 130 | var c = c1 = c2 = 0; 131 | while (i < utftext.length) { 132 | c = utftext.charCodeAt(i); 133 | if (c < 128) { 134 | string += String.fromCharCode(c); 135 | i++; 136 | } else if ((c > 191) && (c < 224)) { 137 | c2 = utftext.charCodeAt(i + 1); 138 | string += String.fromCharCode(((c & 31) << 6) | (c2 & 63)); 139 | i += 2; 140 | } else { 141 | c2 = utftext.charCodeAt(i + 1); 142 | c3 = utftext.charCodeAt(i + 2); 143 | string += String.fromCharCode(((c & 15) << 12) | ((c2 & 63) << 6) | (c3 & 63)); 144 | i += 3; 145 | } 146 | } 147 | return string; 148 | } 149 | } 150 | 151 | module.exports = { 152 | formatTime: formatTime, 153 | generateRandomString: generateRandomString, 154 | signTengxunAI: signTengxunAI, 155 | Base64: Base64 156 | } 157 | -------------------------------------------------------------------------------- /product.csv: -------------------------------------------------------------------------------- 1 | id,name,imageUrl,sortId,ctime 2 | 1,艾草,,3,06/25/2019 17:42:14 3 | 2,棒棒糖,,3,06/25/2019 17:42:52 4 | 3,八宝粥,,3,06/25/2019 17:43:10 5 | 4,白茶,,3,06/25/2019 17:43:27 6 | 5,扁豆,,3,06/25/2019 17:43:44 7 | 6,布丁,,3,06/25/2019 17:44:01 8 | 7,巴旦木,,3,06/25/2019 17:44:14 9 | 8,饼干,,3,06/25/2019 17:44:29 10 | 9,碧根果肉,,3,06/25/2019 17:44:45 11 | 10,白瓜子,,3,06/25/2019 17:45:05 12 | 11,包裹着猫屎的猫砂,,3,06/25/2019 17:45:47 13 | 12,薄荷叶,,3,06/25/2019 17:46:06 14 | 13,八角,,3,06/25/2019 17:46:18 15 | 14,北京烤鸭,,3,06/25/2019 17:46:30 16 | 15,菠萝,,3,06/25/2019 17:46:45 17 | 16,板栗壳,,3,06/25/2019 17:47:02 18 | 17,槟榔,,3,06/25/2019 17:47:37 19 | 18,菠萝密肉,,3,06/25/2019 17:48:02 20 | 19,菠萝皮,,3,06/25/2019 17:48:21 21 | 20,爆米花,,3,06/25/2019 17:48:36 22 | 21,白米虾,,3,06/25/2019 17:48:48 23 | 22,冰淇淋,,3,06/25/2019 17:49:06 24 | 23,蚌肉,,3,06/25/2019 17:49:45 25 | 24,白砂糖,,3,06/25/2019 17:50:00 26 | 25,白糖,,3,06/25/2019 17:50:13 27 | 26,百香果壳,,3,06/25/2019 17:50:55 28 | 27,包子,,3,06/25/2019 17:51:11 29 | 28,白煮蛋,,3,06/25/2019 17:51:27 30 | 29,葱,,3,06/25/2019 17:51:45 31 | -------------------------------------------------------------------------------- /project.config.json: -------------------------------------------------------------------------------- 1 | { 2 | "miniprogramRoot": "miniprogram/", 3 | "cloudfunctionRoot": "cloudfunctions/", 4 | "setting": { 5 | "urlCheck": false, 6 | "es6": true, 7 | "postcss": true, 8 | "minified": true, 9 | "newFeature": true, 10 | "coverView": true, 11 | "nodeModules": false, 12 | "autoAudits": false, 13 | "checkInvalidKey": true, 14 | "checkSiteMap": true, 15 | "uploadWithSourceMap": true, 16 | "babelSetting": { 17 | "ignore": [], 18 | "disablePlugins": [], 19 | "outputPath": "" 20 | } 21 | }, 22 | "appid": "wx1fd75450454bf065", 23 | "projectname": "Garbage", 24 | "libVersion": "2.7.2", 25 | "simulatorType": "wechat", 26 | "simulatorPluginLibVersion": {}, 27 | "condition": { 28 | "search": { 29 | "current": -1, 30 | "list": [] 31 | }, 32 | "conversation": { 33 | "current": -1, 34 | "list": [] 35 | }, 36 | "plugin": { 37 | "current": -1, 38 | "list": [] 39 | }, 40 | "game": { 41 | "list": [] 42 | }, 43 | "miniprogram": { 44 | "current": 7, 45 | "list": [ 46 | { 47 | "id": -1, 48 | "name": "db guide", 49 | "pathName": "pages/databaseGuide/databaseGuide", 50 | "query": "" 51 | }, 52 | { 53 | "id": -1, 54 | "name": "分类", 55 | "pathName": "pages/sort/sort", 56 | "query": "", 57 | "scene": null 58 | }, 59 | { 60 | "id": -1, 61 | "name": "拍照页面", 62 | "pathName": "pages/ai/camera/camera", 63 | "query": "", 64 | "scene": null 65 | }, 66 | { 67 | "id": -1, 68 | "name": "搜索", 69 | "pathName": "pages/ai/search", 70 | "query": "", 71 | "scene": null 72 | }, 73 | { 74 | "id": 4, 75 | "name": "筛选", 76 | "pathName": "pages/ai/filter/filter", 77 | "query": "type=3", 78 | "scene": null 79 | }, 80 | { 81 | "id": 5, 82 | "name": "ai 搜索结果", 83 | "pathName": "pages/result/gan", 84 | "query": "keyword=花", 85 | "scene": null 86 | }, 87 | { 88 | "id": 6, 89 | "name": "未查询到的结果提交", 90 | "pathName": "pages/result/commit", 91 | "query": "keyword=花", 92 | "scene": null 93 | }, 94 | { 95 | "id": 7, 96 | "name": "小Q", 97 | "pathName": "pages/android/qa", 98 | "query": "", 99 | "scene": null 100 | } 101 | ] 102 | } 103 | } 104 | } -------------------------------------------------------------------------------- /sort.json: -------------------------------------------------------------------------------- 1 | {"_id":"1","name":"可回收物"} 2 | {"_id":"2","name":"有害垃圾"} 3 | {"_id":"3","name":"湿垃圾"} 4 | {"_id":"4","name":"干垃圾"} 5 | --------------------------------------------------------------------------------