每次看到家人为"今晚吃什么"发愁时,我总在想:为什么不能有个专门为家庭烹饪设计的智能菜谱平台?这就是我们团队开发"基于Android的家庭食谱分享系统"的初衷。这个采用SpringBoot+Vue前后端分离架构的系统,不仅解决了手机端查看菜谱的便捷性问题,更重要的是建立了家庭厨艺爱好者的垂直社区。
传统菜谱App往往只提供单向的内容展示,而我们打造的这套系统包含三大核心模块:① 支持图文步骤、视频教程的智能菜谱库 ② 基于用户画像的个性化推荐引擎 ③ 厨友圈互动社区。特别在Android客户端,我们针对厨房场景做了深度优化——比如防误触的界面设计、语音控制翻页、灶台定时器联动等功能,实测让烹饪效率提升40%以上。
后端采用模块化设计,主要包含:
数据库选型上,MySQL存储结构化数据如用户信息、菜谱元数据,MongoDB存放菜谱步骤图文、评论等非结构化内容。这里有个关键设计决策:将菜谱的"基础信息"与"步骤详情"分离存储。例如:
java复制// 菜谱主表结构
@Entity
public class Recipe {
@Id
private Long id;
private String title;
private String coverImage;
private Integer difficulty;
// 其他元数据...
}
// 菜谱详情文档结构(MongoDB)
{
"_id": ObjectId("..."),
"recipeId": 123,
"steps": [
{
"stepNo": 1,
"description": "将土豆切块...",
"imageUrl": "/uploads/step1.jpg",
"timer": 300 // 步骤建议时长(秒)
}
]
}
重要提示:图片存储务必使用CDN加速,我们曾因直接使用本地存储导致安卓端图片加载缓慢,后迁移到阿里云OSS后加载速度提升3倍。
前端采用Vue3+TypeScript组合,通过自定义指令实现了几个厨房场景特色功能:
v-cooking-mode:进入烹饪模式后自动保持屏幕常亮v-voice-control:语音指令识别(如"下一步""暂停计时")v-timer-sync:与Android系统定时器服务联动模块划分参考:
code复制src/
├── modules/
│ ├── recipe/ # 菜谱模块
│ ├── social/ # 社区模块
│ └── kitchen/ # 智能厨房工具
├── directives/ # 自定义指令
└── shared/ # 公共组件
针对厨房环境优化的关键技术点:
dispatchTouchEvent方法,当检测到屏幕有油渍/水渍时自动增大触控阈值kotlin复制// 防误触实现示例
override fun dispatchTouchEvent(ev: MotionEvent): Boolean {
if (cookingModeActive) {
// 烹饪模式下扩大触摸有效区域
val newX = ev.x * TOUCH_SENSITIVITY_FACTOR
val newY = ev.y * TOUCH_SENSITIVITY_FACTOR
ev.setLocation(newX, newY)
}
return super.dispatchTouchEvent(ev)
}
菜谱创作者后台包含完整的富文本编辑器,支持:
我们开发了食材识别API,通过OCR技术解析用户上传的食材照片,自动生成食材清单。实测识别准确率达到92%:
code复制POST /api/ingredients/recognize
Content-Type: multipart/form-data
{
"image": "[图片二进制]",
"recognizeType": "text|barcode"
}
采用混合推荐策略:
推荐服务使用Redis缓存用户特征向量,平均响应时间控制在80ms内。关键算法实现:
python复制# 相似度计算示例
def calculate_similarity(user1, user2):
# 使用改进的余弦相似度
dot_product = np.dot(user1.preferences, user2.preferences)
norm_u1 = np.linalg.norm(user1.preferences)
norm_u2 = np.linalg.norm(user2.preferences)
return dot_product / (norm_u1 * norm_u2 + 1e-9) # 避免除零
厨友圈功能包含:
消息系统采用Socket.IO实现实时通知,针对安卓端做了消息分级:
通过以下措施将安卓端首屏加载时间从2.1s降至0.8s:
@Cacheable缓存菜谱热门数据在春节年夜饭高峰期,我们遭遇了每秒500+的并发请求。解决方案:
java复制// 限流器配置示例
@Bean
public RateLimiter apiRateLimiter() {
return RateLimiter.create(1000); // 每秒1000个请求
}
@GetMapping("/recipes/{id}")
@RateLimit(permits = 2) // 自定义注解
public Recipe getRecipe(@PathVariable Long id) {
// ...
}
现象:部分用户反映步骤图片显示为空白
排查过程:
解决方案:
现象:用户反馈首页推荐菜谱多样性不足
优化措施:
python复制def diversify(recommendations):
# 按类别分组
grouped = groupby(recommendations, key=lambda x: x.category)
# 每个类别最多取2个
return [item for group in grouped for item in group[1][:2]]
现象:用户间私信有时延迟达1分钟
根本原因:
优化方案:
javascript复制const io = new Server({
pingInterval: 25000,
pingTimeout: 5000
});
在实际运营中,我们发现家庭用户对以下功能需求强烈:
技术层面正在尝试:
这个项目给我的深刻体会是:技术方案必须紧密围绕真实场景。比如我们最初设计的精美图文排版,在实际厨房环境中发现根本不如语音控制实用。现在每次看到用户分享"跟着这个菜谱终于做出完美舒芙蕾"的帖子,都感觉那些通宵调试的日子特别值得。