1. 项目背景与核心需求
这个SpringBoot香水分享平台的设计初衷,源于当前香水消费市场存在的三个核心痛点:
- 信息不对称:普通消费者难以获取专业香水知识,香调、留香时间等关键信息分散在不同平台
- 体验分享缺失:现有电商平台侧重交易,缺乏垂直社区的深度互动功能
- 个性化推荐不足:主流平台推荐算法基于销量而非真实香型偏好
我在实际开发中发现,一个合格的香水分享平台需要同时满足三类用户需求:
- 普通用户:需要直观的香型可视化展示、场景化搜索(如"适合夏天的柑橘调")
- 香水爱好者:期待香调分解雷达图、持久度对比等专业工具
- 品牌方:关注用户画像分析和市场趋势洞察
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 技术架构设计
2.1 整体技术栈选型
采用经典的SpringBoot+Vue前后端分离架构,具体组件选择经过多次实测对比:
| 组件类型 | 候选方案 | 最终选择 | 选择依据 |
|---|---|---|---|
| 持久层框架 | MyBatis / JPA | MyBatis-Plus | 需要灵活处理香水成分的多级关联查询 |
| 缓存方案 | Redis / Ehcache | Redis + 本地缓存 | 热点香水数据双缓存策略(实测QPS提升3倍) |
| 搜索服务 | Elasticsearch / Solr | Elasticsearch 7.x | 对香调描述文本的高亮和语义搜索支持更好 |
| 文件存储 | 本地存储 / OSS | 阿里云OSS | 香水图片需要CDN加速(实测首屏加载时间减少65%) |
2.2 核心业务模块设计
java复制// 香水实体类的关键设计
@Data
public class Perfume {
private Long id;
private String name;
@TableField(typeHandler = JsonTypeHandler.class)
private List<Note> topNotes; // 前调成分
private Concentration concentration; // 浓度枚举
@TableField(exist = false)
private ScoreDetail scores; // 用户评分详情
}
// 采用策略模式处理不同浓度香水的持久度计算
public interface LongevityCalculator {
int calculateLongevity(Perfume perfume);
}
@Service
@RequiredArgsConstructor
public class PerfumeService {
private final Map<Concentration, LongevityCalculator> calculators;
public int getLongevity(Perfume perfume) {
return calculators.get(perfume.getConcentration())
.calculateLongevity(perfume);
}
}
3. 特色功能实现细节
3.1 香调可视化系统
开发过程中最复杂的部分是将香水成分转化为直观的雷达图。我们采用以下技术方案:
- 成分标准化处理:
- 使用HanLP分词器处理用户输入的香调描述
- 建立包含1200+种香料的标准化词库
- 通过TF-IDF算法提取关键香调
python复制# 香调关键词提取示例(后台管理工具)
def extract_notes(text):
from pyhanlp import HanLP
term_list = HanLP.extractKeyword(text, 5)
return [t for t in term_list if t in PERFUME_LEXICON]
- 雷达图生成逻辑:
- 将香调分为5大维度:花香、果香、木质香、东方香、清新香
- 使用ECharts实现动态渲染
- 加入香调强度的时间轴动画(前调/中调/后调)
3.2 智能推荐引擎
区别于电商平台的协同过滤算法,我们设计了基于 olfactory profile 的推荐系统:
- 用户注册时完成香型偏好测试(类似葡萄酒品鉴的"风味轮")
- 使用SVM算法建立用户香型偏好模型
- 结合实时场景标签(天气/场合/心情)进行动态推荐
java复制// 推荐服务核心逻辑
public List<Perfume> recommend(User user, Scene scene) {
List<Perfume> candidates = perfumeMapper.selectByTags(
user.getPreferenceTags());
return candidates.stream()
.sorted(comparing(p ->
similarityCalculator.calculate(p, scene)))
.limit(5)
.collect(Collectors.toList());
}
4. 开发中的典型问题与解决方案
4.1 香水图片色差问题
在初期版本中,用户上传的香水瓶身图片存在严重色偏。我们通过以下方案解决:
- 前端采用Adobe Color SDK进行色彩校正
- 后台使用OpenCV进行白平衡处理
- 建立标准色卡库,要求商家拍摄时放置ColorChecker
重要提示:处理透明玻璃瓶时,需要特别处理alpha通道,否则会导致背景色污染
4.2 高并发场景下的香评发布
在促销活动期间,香评发布接口出现超时问题。通过以下优化手段解决:
-
异步化改造:
- 使用Spring Event发布香评事件
- 引入RabbitMQ实现削峰填谷
-
缓存策略优化:
- 香评列表采用多级缓存(Redis → Caffeine)
- 对热评实施预计算策略
java复制@TransactionalEventListener
public void handleReviewEvent(ReviewEvent event) {
// 异步更新香水平均分
CompletableFuture.runAsync(() ->
perfumeService.updateScore(event.getPerfumeId()),
reviewTaskExecutor);
}
5. 项目部署与监控
5.1 容器化部署方案
采用Docker Compose编排方案,关键配置如下:
yaml复制services:
app:
image: openjdk:11-jre
environment:
- SPRING_PROFILES_ACTIVE=prod
depends_on:
- redis
- elasticsearch
redis:
image: redis:6-alpine
volumes:
- redis_data:/data
elasticsearch:
image: docker.elastic.co/elasticsearch/elasticsearch:7.10.0
environment:
- discovery.type=single-node
5.2 监控系统搭建
- 使用Prometheus+Grafana监控:
- 特别关注香评发布的P99延迟
- 设置推荐算法耗时告警阈值
- 日志系统:
- ELK收集业务异常日志
- 关键操作链路追踪
6. 毕业设计扩展建议
对于计算机专业学生,可以在基础版本上实现以下扩展:
-
社交功能增强:
- 实现香水"撞香"提醒功能
- 开发基于WebRTC的实时试香分享
-
技术深度扩展:
- 集成TensorFlow实现香调图像识别
- 使用区块链技术实现香水真伪溯源
-
商业化方向:
- 开发AR试香功能(需要3D建模)
- 实现与IoT香薰设备的联动控制
我在实际开发中最深刻的体会是:香水数据的结构化处理比想象中复杂,需要建立完善的香料知识图谱。建议后续开发者先花时间完善基础数据体系,这直接决定了推荐系统的准确性。
