别再手动调API了!用SpringBoot+微信小程序,30分钟搞定一个属于你的AI聊天机器人(附完整源码)

张开发
2026/4/6 13:18:40 15 分钟阅读

分享文章

别再手动调API了!用SpringBoot+微信小程序,30分钟搞定一个属于你的AI聊天机器人(附完整源码)
30分钟极速构建SpringBoot与微信小程序联动的智能对话系统实战记得上周三晚上11点我正为一个兴趣社群的活动策划发愁——成员们需要即时获取活动相关的问答支持。传统客服系统太笨重第三方AI接口又贵又复杂。就在咖啡见底时我突发奇想为什么不用SpringBoot和微信小程序自己搭一个没想到从零开始到上线真的只用了半小时。下面就把这个咖啡因催生的实战方案拆解给你看。1. 环境闪电战5分钟搞定基础配置别被全栈开发吓到现代工具链早已让环境搭建变得像拼乐高一样简单。我们需要的只是三样核心工具IntelliJ IDEA社区版完全够用记得安装Lombok插件减少80%的样板代码微信开发者工具建议使用稳定版避免新版的兼容性问题MySQL 8.0用Docker跑最省事一条命令即可docker run --name some-mysql -e MYSQL_ROOT_PASSWORDmy-secret-pw -p 3306:3306 -d mysql:8.0关键技巧在Spring Initializr创建项目时勾选这几个依赖Spring Web构建RESTful APILombok自动生成getter/setterMyBatis-Plus数据库操作神器DevTools热部署必备2. 后端核心15分钟打造AI中控台2.1 智能对话引擎接入大模型API调用可以简单到令人发指。以某国产大模型为例核心代码不超过20行Service public class AIService { private static final String TOKEN_URL https://aip.baidubce.com/oauth/2.0/token; Value(${ai.api-key}) private String apiKey; Value(${ai.secret-key}) private String secretKey; public String chat(String message) { String token getAccessToken(); MapString, Object params new HashMap(); params.put(messages, List.of(Map.of(role, user, content, message))); return HttpUtil.createPost(https://aip.baidubce.com/rpc/2.0/ai_custom/v1/wenxinworkshop/chat/completions) .header(Content-Type, application/json) .header(Authorization, Bearer token) .body(JSONUtil.toJsonStr(params)) .execute() .body(); } private String getAccessToken() { String response HttpUtil.post(TOKEN_URL ?grant_typeclient_credentialsclient_id apiKey client_secret secretKey); return JSONUtil.parseObj(response).getStr(access_token); } }避坑指南Token需要缓存避免每次请求都获取可用Redis或简单内存缓存响应体建议统一封装方便小程序端处理2.2 对话历史存储方案MyBatis-Plus让数据库操作变得极其优雅Data TableName(chat_history) public class ChatMessage { TableId(type IdType.AUTO) private Long id; private String openId; // 微信用户唯一标识 private String content; private Boolean isUser; private LocalDateTime createTime; } Mapper public interface ChatMapper extends BaseMapperChatMessage {} Service RequiredArgsConstructor public class ChatService { private final ChatMapper chatMapper; public void saveMessage(String openId, String content, boolean isUser) { chatMapper.insert(new ChatMessage(openId, content, isUser, LocalDateTime.now())); } public ListChatMessage getHistory(String openId) { return chatMapper.selectList(new LambdaQueryWrapperChatMessage() .eq(ChatMessage::getOpenId, openId) .orderByAsc(ChatMessage::getCreateTime)); } }3. 小程序端10分钟实现聊天界面3.1 极简UI搭建微信小程序的WXML结构比想象中直观view classcontainer scroll-view scroll-y classchat-area scroll-top{{scrollTop}} block wx:for{{messages}} wx:keyid view classmessage {{item.isUser ? user : ai}} image classavatar src{{item.isUser ? avatarUser : avatarAI}}/image view classbubble{{item.content}}/view /view /block /scroll-view view classinput-area input placeholder说点什么... bindinputonInput value{{inputMsg}}/ button bindtapsendMessage发送/button /view /view配套的WXSS样式建议使用Flex布局.chat-area { flex: 1; padding: 20rpx; } .message { display: flex; margin-bottom: 30rpx; } .message.user { flex-direction: row-reverse; } .avatar { width: 80rpx; height: 80rpx; border-radius: 50%; } .bubble { max-width: 70%; padding: 15rpx 20rpx; border-radius: 10rpx; margin: 0 20rpx; } .message.user .bubble { background-color: #95ec69; } .message.ai .bubble { background-color: #f5f5f5; }3.2 与后端高效交互封装网络请求能显著提升代码质量// utils/http.js const request (url, method, data) { return new Promise((resolve, reject) { wx.request({ url: https://your-domain.com${url}, method, data, header: { content-type: application/json, Authorization: Bearer ${wx.getStorageSync(token)} }, success: (res) { if (res.statusCode 200) { resolve(res.data) } else { reject(res.data) } }, fail: (err) reject(err) }) }) } export const get (url, params) request(url, GET, params) export const post (url, data) request(url, POST, data)页面逻辑处理示例Page({ data: { messages: [], inputMsg: , scrollTop: 0 }, onLoad() { this.loadHistory() }, loadHistory() { get(/chat/history).then(res { this.setData({ messages: res.data }) this.scrollToBottom() }) }, sendMessage() { const msg this.data.inputMsg if (!msg.trim()) return const newMsg { id: Date.now(), content: msg, isUser: true } this.setData({ messages: [...this.data.messages, newMsg], inputMsg: , scrollTop: 99999 }) post(/chat/send, { message: msg }).then(res { this.setData({ messages: [...this.data.messages, { id: Date.now(), content: res.data.reply, isUser: false }] }) this.scrollToBottom() }) }, scrollToBottom() { this.setData({ scrollTop: 99999 }) } })4. 性能优化与扩展空间4.1 对话体验增强技巧打字机效果通过setInterval逐字显示AI回复本地缓存wx.setStorageSync保存最近对话记录敏感词过滤后端添加内容安全检查// 简单的敏感词过滤示例 public class ContentFilter { private static final SetString bannedWords Set.of(敏感词1, 敏感词2); public static boolean isSafe(String content) { return bannedWords.stream().noneMatch(content::contains); } }4.2 未来可扩展方向多模态支持接入图片生成API知识库集成结合向量数据库实现私有数据问答用户分析基于对话内容生成兴趣画像这个项目最让我惊喜的是从电脑开机到社群成员实际使用真的只用了32分钟。现代开发工具的进步让个人开发者也能快速实现专业级应用。最后分享一个彩蛋在测试时我不小心发送了你好AI回复了长达800字的哲学探讨——看来大模型也需要设置简洁模式参数。

更多文章