关于微信小程序垃圾分类平台,很多开发者第一次接触这个选题时,第一反应都是“这不就是一个带搜索功能的列表页吗?”。但真正动手做之后才会发现,垃圾分类平台远没有想象中那么简单:垃圾种类的数据标准怎么定、用户搜索时用“小龙虾”还是“湿垃圾”作为关键词、后端接口怎么设计才能扛住分类查询的高并发、小程序端如何兼顾体验和审核规范——这些问题每一个都能让新手卡上几天。
这篇文章我会从一个完整的“基于微信小程序垃圾分类平台”出发,讲清楚需求分析、技术选型、数据库设计、后端接口、小程序端实现、运营后台以及上线发布的完整链路。文章既包含可直接复制的代码示例,也会指出实际开发中容易踩的坑。如果你正准备做毕设、接外包,或者想在小程序生态里做一个工具类产品,这篇文章可以帮助你少走很多弯路。
1. 垃圾分类平台到底在解决什么问题
先聊一个现实问题:在很多城市开始推行垃圾分类之后,普通用户最常遇到的场景是,手里拎着一袋垃圾站在垃圾桶前,不确定这个算什么分类。贝壳是什么垃圾?椰子壳是干垃圾还是湿垃圾?大棒骨为什么不算厨余垃圾?这些问题靠人记忆很难全覆盖,靠搜索引擎又太慢,所以“随手查分类”就成为一个真实需求。
从开发角度看,这个需求可以拆成三层:
- 用户端:打开小程序,输入垃圾名称,快速得到分类结果,同时展示投放建议。
- 管理端:运营人员可以维护垃圾词库、分类标准、投放指南,甚至后续扩展积分活动和用户反馈。
- 服务端:提供搜索接口、分类查询接口、用户行为上报接口、内容管理接口。
看起来不复杂,但真正开始设计时,你会发现核心难点在于“数据模型怎么设计”和“搜索匹配怎么做”。比如用户搜“小龙虾壳”,词库里存的是“小龙虾”,如果没有做好同义词映射和分词,搜索结果就会为空。再比如用户直接拍照识别垃圾,这不是一个小项目该一开始就硬啃的功能,建议放在二期通过云端图像识别接口实现,首期先把关键词搜索体验做到极致。
所以,这个平台的核心价值不在于功能数量多,而在于“查得准、查得快、内容可维护”。这也是我在下文反复强调数据规范化和接口设计的原因。
2. 技术选型与技术架构
整个平台我推荐采用经典的前后端分离架构。小程序端使用原生微信小程序开发,后端使用 Spring Boot,数据库使用 MySQL,缓存使用 Redis,后台管理系统可以复用 Spring Boot 的接口,用 Vue 或简单后台模板实现。
为什么选这套组合,而不是用 uni-app 或者云开发?我解释一下选型逻辑:
| 技术组件 | 推荐方案 | 理由 |
|---|---|---|
| 小程序端 | 原生微信小程序 | 初学者友好,文档丰富,工具链稳定,避免跨端框架带来的兼容问题 |
| 后端 | Spring Boot 2.x / 3.x | 生态成熟,方便做接口权限、定时任务和后续扩展 |
| 数据库 | MySQL 8.x | 数据本身是结构化词条,关系型数据库最适合 |
| 缓存 | Redis | 高频搜索词和分类结果可以缓存,降低数据库压力 |
| 后台管理 | Vue 3 + Element Plus | 用于管理词库、分类标准、用户反馈 |
需要说明的是,如果你完全不熟悉 Java 后端,也可以换用 Node.js 或 Python Flask 实现接口,小程序端不受影响。本文代码示例以 Spring Boot 为主,但接口设计思路是通用的。
架构上,用户从小程序发起请求,先是经过微信网关,然后请求到达后端接口。后端先查 Redis 缓存,缓存未命中再查 MySQL,同时通过定时任务同步词库数据到缓存。运营后台修改词库后,通过接口主动刷新缓存。整体请求链路不长,单机部署就够用,后续如果需要扩容,接口设计成无状态即可水平扩展。
一个比较关键的架构决策是,不要把垃圾分类的逻辑全部放在小程序端。虽然这样做前端响应会更快,但分类标准一旦变化,就必须发版本审核。把分类判断放在后端,运营人员可以直接在后台调整,小程序不需要重新审核,这在业务快速变化时非常重要。
3. 环境准备与项目初始化
在写代码之前,先把环境准备好。以下是我建议的版本组合,实际以你本机环境为准:
JDK:1.8 或 11 Maven:3.6 以上 MySQL:5.7 或 8.0 Redis:5.0 以上 微信开发者工具:最新稳定版后端项目可以直接通过 Spring Initializr 生成,也可以手动建一个 Maven 项目。我建议使用 Spring Initializr 生成,依赖选择 Spring Web、Spring Data JPA(或 MyBatis)、Redis、Validation、Lombok。
生成后修改application.yml,配置数据源和 Redis:
server: port: 8080 spring: datasource: url: jdbc:mysql://localhost:3306/garbage_sorting?useUnicode=true&characterEncoding=utf8&serverTimezone=Asia/Shanghai username: root password: 123456 driver-class-name: com.mysql.cj.jdbc.Driver redis: host: localhost port: 6379 database: 0 mybatis: mapper-locations: classpath:mapper/*.xml type-aliases-package: com.example.garbage.entity同时在数据库中创建库表。这里需要特别说明,垃圾分类系统的核心表是“垃圾词条表”,字段设计会直接影响后续搜索效果,所以有必要从第一版就规划好。
CREATE DATABASE IF NOT EXISTS garbage_sorting DEFAULT CHARACTER SET utf8mb4; USE garbage_sorting; CREATE TABLE garbage_item ( id BIGINT PRIMARY KEY AUTO_INCREMENT, name VARCHAR(100) NOT NULL COMMENT '垃圾名称,如小龙虾', category TINYINT NOT NULL COMMENT '分类:1-可回收 2-有害 3-厨余 4-其他', sub_category VARCHAR(50) DEFAULT '' COMMENT '细分分类,如塑料、玻璃', aliases VARCHAR(500) DEFAULT '' COMMENT '别名,用逗号分隔,如小龙虾壳,龙虾壳', tips VARCHAR(500) DEFAULT '' COMMENT '投放提示', search_count INT DEFAULT 0 COMMENT '搜索次数', status TINYINT DEFAULT 1 COMMENT '1-启用 0-禁用', create_time DATETIME DEFAULT CURRENT_TIMESTAMP, update_time DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP ) COMMENT='垃圾词条表';这张表里,aliases字段看起来不起眼,实际上是搜索体验优化的关键。没有别名,用户搜“龙虾壳”就找不到“小龙虾”的词条,搜索失败率会非常高。分类编码统一用数字,不要用字符串,这样前端映射展示文案即可,后端判断也更高效。
4. 小程序端整体结构设计
微信小程序端是整个平台的入口,也是用户接触最多的部分。页面结构上,我建议规划为四个一级页面:
- 首页:分类搜索框 + 四大分类入口 + 搜索历史
- 分类详情页:展示某一分类下的常见垃圾列表
- 搜索记录页:展示用户历史搜索记录,支持删除
- 我的页面:展示用户信息、反馈入口、关于平台
首页是用户第一眼看到的东西,交互设计要简洁。顶部是搜索框,下面直接是四个分类彩色卡片(可回收、有害、厨余、其他),再往下是热门搜索词。每个分类卡片点击后进入该分类的详细列表,列表项展示垃圾名称和投放提示。
小程序端的目录结构大致如下:
miniprogram/ ├── app.js ├── app.json ├── app.wxss ├── pages/ │ ├── index/ │ ├── category/ │ ├── search-result/ │ └── mine/ ├── components/ │ ├── garbage-card/ │ └── empty-view/ ├── utils/ │ ├── request.js │ └── storage.js └── assets/首页核心交互就是搜索。用户输入关键词后,点击搜索按钮或回车,跳转到搜索结果页。搜索结果页不仅仅展示分类结果,还应该展示投放建议和同义词匹配到的内容。
在app.json中配置页面路由和窗口样式:
{ "pages": [ "pages/index/index", "pages/category/category", "pages/search-result/search-result", "pages/mine/mine" ], "window": { "navigationBarBackgroundColor": "#07c160", "navigationBarTitleText": "垃圾分类助手", "navigationBarTextStyle": "white" }, "style": "v2", "sitemapLocation": "sitemap.json" }这里要注意小程序命名规范。小程序的名称、简介不能含有“国家级”“最高级”等违规词语,也不能赌博、医疗夸大类。垃圾分类属于环保民生领域,命名上可以叫“垃圾分类助手”“垃圾分类查询”这种直白名称,审核通过率更高。
5. 后端核心接口设计
后端接口设计遵循 RESTful 风格,核心接口包括:
| 接口 | 方法 | 路径 | 功能 |
|---|---|---|---|
| 搜索垃圾 | GET | /api/garbage/search?keyword=xxx | 根据关键词返回分类结果 |
| 分类列表 | GET | /api/garbage/category/{categoryId} | 根据分类 ID 返回垃圾列表 |
| 全部词条分页 | GET | /api/garbage/page | 后台管理分页查询 |
| 新增词条 | POST | /api/garbage | 后台管理新增 |
| 更新词条 | PUT | /api/garbage/{id} | 后台管理更新 |
| 删除词条 | DELETE | /api/garbage/{id} | 后台管理删除 |
| 热门搜索 | GET | /api/garbage/hot | 返回热门搜索词 |
搜索接口是最核心的接口。它的逻辑是:接收用户输入的关键词,优先做精确匹配,再做别名匹配,最后做模糊匹配。如果都没有命中,返回一个友好的“未找到该垃圾信息”提示,同时建议用户换个名称试试。
下面是搜索接口的代码示例:
@RestController @RequestMapping("/api/garbage") public class GarbageController { @Resource private GarbageService garbageService; @GetMapping("/search") public Result search(@RequestParam String keyword) { if (StringUtils.isBlank(keyword)) { return Result.error("搜索关键词不能为空"); } SearchResultDTO result = garbageService.search(keyword.trim()); return Result.success(result); } }Service 层实现搜索逻辑,这里使用 MyBatis-Plus 进行数据库操作。搜索时先查缓存,缓存没有命中再查数据库,异步更新缓存。核心逻辑是matchByAlias和matchByKeyword两个方法,匹配成功之后增加搜索次数。
@Service public class GarbageServiceImpl implements GarbageService { @Resource private GarbageMapper garbageMapper; @Resource private RedisTemplate<String, String> redisTemplate; @Override public SearchResultDTO search(String keyword) { // 1. 尝试从缓存读取 String cacheKey = "garbage:search:" + keyword; String cacheValue = redisTemplate.opsForValue().get(cacheKey); if (StringUtils.isNotBlank(cacheValue)) { return JSON.parseObject(cacheValue, SearchResultDTO.class); } // 2. 数据库查询优先级:精确匹配 > 别名匹配 > 模糊匹配 GarbageItem item = garbageMapper.selectByName(keyword); if (item == null) { item = garbageMapper.selectByAlias(keyword); } if (item == null) { item = garbageMapper.selectByNameContaining(keyword); } // 3. 未命中返回空结果 if (item == null) { return SearchResultDTO.notFound(keyword); } // 4. 更新搜索次数 garbageMapper.incrementSearchCount(item.getId()); // 5. 写入 Redis 缓存,过期时间 10 分钟 SearchResultDTO dto = SearchResultDTO.build(item); redisTemplate.opsForValue().set(cacheKey, JSON.toJSONString(dto), 10, TimeUnit.MINUTES); return dto; } }这里需要提醒各位:Redis 缓存更新时,为了控制一致性,不需要修改词条后立即删除所有相关缓存,只需要保证运营后台执行更新操作时,主动删除该词条相关的缓存 key 即可。当然,更规范的做法是对缓存 key 做版本控制,例如在 key 中拼上更新时间戳。但刚做第一版时,主动删除缓存已经够用了。
搜索返回给前端的数据结构,我建议这样设计:
{ "code": 200, "message": "success", "data": { "keyword": "小龙虾", "matchType": "EXACT", "categoryId": 3, "categoryName": "厨余垃圾", "subCategory": "水产及水产加工品", "tips": "沥干水分后投放至绿色厨余垃圾桶", "aliases": ["小龙虾壳", "龙虾壳"], "searchCount": 1024 } }这样前端拿到categoryId后,可以展示对应的分类颜色和图标,同时展示tips作为投放指导,用户一目了然。
6. 数据库查询语句与 Mapper 实现细节
MyBatis-Plus 可以帮我们省去大量单表 CRUD 代码,但搜索匹配这种带有一定定制逻辑的查询,还是推荐直接写 SQL。核心查询语句如下:
<select id="selectByName" resultType="com.example.garbage.entity.GarbageItem"> SELECT * FROM garbage_item WHERE name = #{keyword} AND status = 1 LIMIT 1 </select> <select id="selectByAlias" resultType="com.example.garbage.entity.GarbageItem"> SELECT * FROM garbage_item WHERE status = 1 AND FIND_IN_SET(#{keyword}, aliases) LIMIT 1 </select> <select id="selectByNameContaining" resultType="com.example.garbage.entity.GarbageItem"> SELECT * FROM garbage_item WHERE name LIKE CONCAT('%', #{keyword}, '%') AND status = 1 LIMIT 10 </select>需要注意两个细节:
FIND_IN_SET适合别名数量有限且用逗号分隔的场景,但如果别名字段很长,或者需要高性能,建议单独建一张garbage_alias表,用关联查询。LIKE模糊查询在大数据量场景下走不了索引,如果词条过万,搜索性能可能下降。不过垃圾分类词库通常只有几千条,这条优化可以放到二期。
项目初期,为了演示方便,也可以直接在 Service 层先读出全表,再用 Java 代码做匹配。这种实现更直观,但千万别用在生产环境。
7. 管理后台与词库维护
垃圾分类平台长期运营的关键在于可持续维护,而不是上线之后什么都不管。词库需要随着用户反馈不断更新,比如“甘蔗渣”“玉米衣”“小龙虾壳”这类实际生活中常见但容易被忽视的词条,都需要通过运营后台补充。
管理后台功能可以精简为四个模块:
- 词条管理:新增、编辑、禁用、删除垃圾词条
- 分类管理:维护四个垃圾分类的基础信息,如分类名称、图标、描述
- 反馈管理:查看用户上报的“未找到分类”的垃圾名称
- 数据统计:查看搜索次数 Top 词汇、分类搜索占比
管理后台的前端技术没有限制,Vue、React 或者简单后台模板都行。关键是后端要提供一套带权限校验的管理接口,不能和用户端接口混用。可以引入 Spring Security 或 Sa-Token 做登录校验,也可以简单用一个管理员 token 实现。
这里给一个简单但实用的实现思路:管理端接口统一以/admin/api开头,拦截器校验请求头中的Authorization,没有 token 或 token 无效时直接返回 401。
@Component public class AdminAuthInterceptor implements HandlerInterceptor { private static final String ADMIN_TOKEN = "admin-token-here"; @Override public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception { String token = request.getHeader("Authorization"); if (!ADMIN_TOKEN.equals(token)) { response.setStatus(401); response.setContentType("application/json;charset=UTF-8"); response.getWriter().write("{\"code\":401,\"message\":\"未授权访问\"}"); return false; } return true; } }登录接口则要用固定账号密码换取 token,生产环境建议使用更严谨的认证方案,比如 Spring Security + JWT。如果只是课程设计或企业内部工具,拦截器方案足够简洁明了。
8. 小程序端搜索与结果展示实现
下面看小程序端如何调用后端接口。小程序不能直接请求线上域名,前提是在微信公众平台配置合法请求域名,把后端的 HTTPS 域名加到 request 合法域名列表里。开发模式下可以勾选“不校验合法域名”,但上线前必须配置好。
小程序的请求工具类封装:
// utils/request.js const BASE_URL = 'https://your-api-domain.com'; const request = (url, method = 'GET', data = {}) => { return new Promise((resolve, reject) => { wx.request({ url: BASE_URL + url, method: method, data: data, header: { 'Content-Type': 'application/json' }, success: (res) => { if (res.statusCode === 200) { resolve(res.data); } else { reject(res); } }, fail: (err) => { reject(err); } }); }); }; module.exports = { get: (url, data) => request(url, 'GET', data), post: (url, data) => request(url, 'POST', data) };搜索页的核心逻辑是,监听用户输入,用户输入完成后点击搜索按钮,调用搜索接口,然后跳转结果页。这里需要注意,如果用户输入为空,直接提示“请输入垃圾名称”,不要发起请求。
搜索结果页的展示逻辑:
- 如果搜索成功,展示分类名称、分类图标、投放提示和同义词。
- 如果搜索失败,展示空状态,并提示用户“暂时未收录该垃圾,欢迎提交反馈”。
- 增加“没有找到?点击反馈”按钮,用户可以上报这个垃圾名称,运营后台可以看到。
这里有一个容易踩的坑:小程序页面跳转传参有长度限制,如果搜索关键词很长,建议写入全局变量或通过 storage 传递,而不是放在 URL 参数里。关键词搜索这种场景一般长度很短,直接用 URL 参数即可,但如果未来做图片识别传递 base64,一定要用 storage 或云函数中转。
9. 缓存策略与性能优化
垃圾分类平台虽然数据量不大,但搜索接口是高频接口,尤其是用户反复搜索那些常见垃圾时,如果每次都打数据库,既浪费资源也没有必要。所以缓存是第一优先级的优化项。
我推荐用「热点词缓存 + 全量词条缓存」两级缓存:
- 热点词缓存:搜索过的关键词,结果缓存 10 分钟,过期时间较短,保证新词条上线后最多 10 分钟内生效。
- 全量词条缓存:运营后台发布词条变更时,主动刷新全量缓存。适合那种“搜索结果必须马上准确”的管理场景。
全量词条的缓存实现思路:
@Service public class GarbageCacheService { @Resource private StringRedisTemplate stringRedisTemplate; @Resource private GarbageMapper garbageMapper; public void refreshAllCache() { List<GarbageItem> list = garbageMapper.selectAll(); Map<String, String> map = new HashMap<>(); for (GarbageItem item : list) { map.put("garbage:item:" + item.getName(), JSON.toJSONString(item)); } stringRedisTemplate.opsForValue().multiSet(map); } }每次运营后台更新词条后,调用refreshAllCache,这样用户下一次搜索时,直接命中缓存,查询性能几乎等于 Redis 查询性能,响应时间可以控制在 50ms 以内。注意,多级缓存最怕数据不一致,所以过期时间不能设置太长。如果做不到主动清理缓存,建议把过期时间缩短到 5 分钟,这样即使数据不一致也只是暂时现象。
除了缓存,接口返回的数据结构也要精简。不要一次性返回全部字段,只返回小程序端需要展示的字段。工具类接口本身响应体应该轻量化,从数据源头控制体量,比后端做很多压缩逻辑更有效。
10. 小程序上线审核与发布流程
当整个项目开发测试完成后,就需要走小程序发布流程。发布流程没有想象中那么复杂,但需要注意几个关键点:
第一步:注册小程序账号。进入微信公众平台注册小程序账号,选择主体类型。个人主体可以申请个人小程序,但某些接口如支付、部分能力会受限,垃圾分类查询属于内容展示工具,个人主体可以正常通过。
第二步:配置服务器域名。在微信公众平台后台,「开发管理」-「开发设置」-「服务器域名」中,把后端的 HTTPS 域名添加到 request 合法域名中。这里必须使用 HTTPS,并且证书要有效。如果只是本地开发调试,可以在微信开发者工具中勾选「不校验合法域名、web-view(业务域名)、TLS 版本以及 HTTPS 证书」。
第三步:上传代码并提交审核。在微信开发者工具中点击「上传」,填写版本号和备注,然后登录微信公众平台,在「版本管理」中提交审核。审核周期一般为 1—3 天。实际操作中,避免使用“垃圾”“回收”这些词可能导致类目审查,所以小程序描述要写得清晰准确,类目选择“工具-信息查询”或“环保”等适配合适类目即可。
第四步:正式发布。审核通过后,点击「发布」,小程序就正式上线了。
整个过程中最容易出问题的地方是域名备案和 HTTPS 证书。如果你的服务器没有备案,小程序无法配置合法域名。建议提前把域名备案好,并在 Nginx 中配置好 HTTPS 证书。
11. 常见问题与排查思路
| 问题现象 | 可能原因 | 排查方式 | 解决方案 |
|---|---|---|---|
| 小程序请求接口报 200 但拿不到数据 | 接口返回的数据结构不是 JSON,或字段名不匹配 | 在开发者工具 Network 面板看响应内容 | 统一后端返回结构为{ code, message, data } |
| 搜索“龙虾壳”查不到结果 | 词条表中没有配置别名,或者模糊匹配没有生效 | 检查数据库中该词条的aliases字段 | 在运营后台补充别名,并重建缓存 |
| 发布后用户搜索报错“不在以下合法域名列表中” | 后端域名没有配置到小程序后台 | 登录微信公众平台检查服务器域名 | 添加合法域名,并确保 HTTPS 证书有效 |
| Redis 缓存一直不生效 | Redis 没启动,或者 key 拼写错误 | 使用 Redis Desktop Manager 查看 key | 确认 Redis 服务运行,检查 key 生成规则 |
| 管理后台登录失效 | token 过期或被拦截器拦截 | 查看后端日志和浏览器 Network | 检查 token 有效期,以及请求头是否带上 Authorization |
| 四大分类图标显示不全 | 图标资源路径错误或者文件缺失 | 查看小程序控制台资源加载错误 | 确认静态资源路径大小写正确,建议使用 base64 或网络图片 |
这里单独说一下“搜索结果为空白”的问题。前端页面拿到data之后,不能直接访问data.data.categoryName,因为当搜索不到垃圾时,data可能为null。代码中要加空值判断:
const result = res.data; if (result && result.categoryId) { this.setData({ hasResult: true, result: result }); } else { this.setData({ hasResult: false }); }如果你希望像真实项目那样做一个拍照识别垃圾的功能,可以接入云端图像识别 API,但这部分需要申请 API Key,并且涉及支付费用。如果没有预算,我建议先用关键词检索把体验做好,把拍照识别作为二期规划。
12. 最佳实践与工程建议
最后整理一下做这类平台型小程序的最佳实践,这些经验来自实际开发中的总结,不是单纯从网上抄来的概念。
第一,命名和字段要规范。数据库字段名用下划线命名法,Java 实体类用驼峰命名法,并且配置 MyBatis 的驼峰映射。这样不仅代码可读性强,后续做查询和联调也会顺畅很多。
第二,接口要做参数校验和异常兜底。不要信任前端传过来的任何参数。搜索关键词为空、过长、包含特殊字符这些情况都要在后端处理。全局异常处理器统一返回错误格式,避免前端拿到一堆堆栈信息然后白屏。
第三,代码和词库分开管理。垃圾词条数据不应该放在代码里,而是放在数据库中,通过运营后台维护。这样分类标准变化时,只需要改数据库,不需要重新发版小程序。
第四,用户反馈是词库迭代的重要来源。在搜索无结果页面加一个“提交反馈”按钮,用户上报垃圾名称,运营后台定期查看,批量补充词条。这个闭环是整个平台能否长期好用的关键。很多项目把重点放在了代码实现上,忽略了内容运营,最后用户搜索几次找不到答案就流失了。
第五,注意个人信息合规。垃圾分类小程序本身不需要强制用户授权手机号或微信昵称,最好不要在首页弹窗要求授权。如果需要展示头像昵称,在用户主动点击需要时再调用wx.getUserProfile获取。少要权限,审核更顺,用户也不反感。
第六,注意小程序的包体积。小程序主包限制 2MB,垃圾分类这种工具类小程序,图片资源不要放在本地,尽量使用网络图片或 CDN。图标可以用 iconfont 字体图标,减少包体占用。如果超过 2MB,也要拆分包。
13. 总结与实践建议
从技术角度看,基于微信小程序的垃圾分类平台是一个非常适合练手的全栈项目。它既包含前端小程序的页面交互、请求封装和状态管理,也包含后端接口设计、缓存策略、数据库模型和内容管理,同时还涉及小程序发布审核流程。麻雀虽小,五脏俱全。把这个项目完整做下来,你基本上就走通了一个小程序产品从 0 到 1 的实现链路。
如果你准备用这个项目做课程设计或毕业设计,建议在核心功能之外,再扩展一个可量化的亮点,比如搜索热词的实时统计、垃圾分类积分打卡、按照小区位置推荐投放点等。这些功能扩展难度不大,但能在答辩和展示中增加项目深度。
下一步你可以先从搭建后端项目开始,把数据库表建好,再实现搜索接口,然后用微信开发者工具创建一个小程序项目,把首页交互写出来,前后端联调通,就算跑通主流程。
如果想继续深入,还有几个方向可以研究:引入全文检索引擎比如 Elasticsearch 来做更精准的搜索匹配、把词库数据做成 OpenAPI 提供给其他开发者调用、增加 OCR 拍照识别、基于用户位置推荐垃圾投放点。工具类小程序的核心竞争力在于数据质量和响应速度,守住这两点,产品就不会差。