├── 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 | 
22 | ## 完整数据库截图
23 | 
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 | 
46 | ## 其他小程序
47 | 
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 |
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 |
--------------------------------------------------------------------------------
/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 | 点击获取 openid
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 |
--------------------------------------------------------------------------------
/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 |
--------------------------------------------------------------------------------