1. 项目背景与行业痛点
眼镜零售行业正经历着从传统经营模式向数字化管理的转型浪潮。作为从业十余年的全栈开发者,我深刻理解这个行业面临的三大核心痛点:
- 库存管理混乱:镜架、镜片、隐形眼镜等SKU数量庞大,传统Excel表格难以应对频繁的出入库和调拨需求
- 验光数据孤岛:顾客的验光参数、历史配镜记录分散在各个门店的纸质档案中
- 营销手段单一:缺乏会员画像分析,促销活动往往靠经验决策而非数据驱动
这个基于Spring Boot的智能运营平台,正是为解决这些行业痛点而生。下面我将从技术选型到落地实现,完整分享这个毕业设计项目的开发经验。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 技术架构设计解析
2.1 整体技术栈选型
采用经典的B/S架构,主要技术组件包括:
- 后端:Spring Boot 2.7 + MyBatis Plus
- 前端:Vue.js + Element UI
- 数据库:MySQL 8.0
- 文档:Knife4j API文档
选择这套组合主要基于三点考虑:
- Spring Boot的自动装配特性大幅简化了配置工作,让毕业生能聚焦业务逻辑
- Vue+Element UI组合提供了丰富的可视化组件,特别适合零售系统的数据看板开发
- MySQL作为关系型数据库,完美适配眼镜零售的库存管理和交易场景
2.2 核心功能模块设计
系统包含6大核心模块:
- 商品管理:支持镜架、镜片的SKU管理和库存预警
- 验光中心:数字化存储球镜、柱镜、轴位等专业参数
- 智能推荐:根据历史配镜记录推荐适配镜片
- 会员系统:积分、优惠券、消费分析三位一体
- 数据看板:实时展示门店经营关键指标
- 供应链管理:对接供应商的采购和结算流程
3. 关键实现细节
3.1 验光数据建模
验光参数的专业性给数据库设计带来挑战。我们采用JSON字段存储变长参数:
java复制// 验光记录实体
public class OptometryRecord {
private Long id;
private Long customerId;
private LocalDateTime checkDate;
@TableField(typeHandler = JacksonTypeHandler.class)
private EyeCheckResult leftEye;
@TableField(typeHandler = JacksonTypeHandler.class)
private EyeCheckResult rightEye;
}
// 验光结果值对象
public class EyeCheckResult {
private BigDecimal sphere; // 球镜
private BigDecimal cylinder; // 柱镜
private Integer axis; // 轴位
private BigDecimal pd; // 瞳距
}
3.2 库存预警实现
基于Spring Scheduler的定时任务检查库存水位:
java复制@Scheduled(cron = "0 0 9 * * ?") // 每天上午9点执行
public void checkInventory() {
List<Product> lowStockProducts = productMapper.selectList(
new QueryWrapper<Product>()
.lt("stock", 5) // 库存低于5件
);
lowStockProducts.forEach(product -> {
String message = String.format("商品%s库存仅剩%d件",
product.getName(), product.getStock());
wechatNoticeService.sendAlert(message);
});
}
3.3 智能推荐算法
基于协同过滤的镜片推荐服务:
java复制public List<Lens> recommendLenses(Long customerId) {
// 1. 获取用户历史配镜记录
List<Prescription> histories = prescriptionMapper
.selectByCustomer(customerId);
// 2. 提取光学参数特征
OpticalFeature feature = extractFeature(histories);
// 3. 在数据库查找相似度高的镜片
return lensMapper.selectSimilar(feature.getSphere(),
feature.getCylinder(), 0.5); // 相似度阈值0.5
}
4. 开发中的典型问题与解决方案
4.1 验光参数校验问题
初期直接使用BigDecimal接收前端参数时,遇到"-0.50"被识别为非法格式的问题。解决方案:
- 配置自定义参数转换器
- 前端统一增加数值格式化过滤器
javascript复制// 前端过滤器
Vue.filter('diopter', value => {
return parseFloat(value).toFixed(2);
});
4.2 库存并发控制
促销活动时出现的超卖问题,通过MySQL乐观锁解决:
sql复制UPDATE product_stock
SET stock = stock - 1,
version = version + 1
WHERE sku_id = ? AND version = ?
4.3 性能优化实践
-
验光历史查询添加复合索引:
sql复制ALTER TABLE optometry_record ADD INDEX idx_customer_date (customer_id, check_date DESC) -
使用Redis缓存热门镜架数据:
java复制@Cacheable(value = "hotFrames", key = "#style") public List<Frame> getHotFrames(String style) { return frameMapper.selectHotFrames(style); }
5. 项目部署与上线
5.1 服务器环境配置
推荐使用2核4G的云服务器,关键配置项:
- JDK 17
- MySQL 8.0内存配置:
ini复制[mysqld] innodb_buffer_pool_size = 1G - Nginx前端静态资源缓存配置:
nginx复制location /static { expires 30d; }
5.2 压力测试数据
使用JMeter模拟100并发用户测试关键接口:
- 商品查询API:平均响应时间78ms
- 验光记录提交:平均响应时间153ms
- 订单创建:平均响应时间210ms
6. 项目扩展方向
在实际运营中可以考虑:
- 增加AR虚拟试戴功能(使用OpenCV)
- 对接微信小程序实现线上预约
- 加入销售预测模块(时间序列分析)
- 集成国产中间件替代Tomcat(如宝兰德)
这个项目完整实现了眼镜零售门店的数字化管理需求,从技术选型到业务实现都充分考虑到了毕业设计的教学目标和行业实际需求。我在开发过程中特别注重将复杂的验光业务逻辑转化为清晰的代码结构,这对初学者理解领域驱动设计很有帮助
