1. 项目概述
作为一名有多年Java开发经验的工程师,最近完成了一个基于SpringBoot的商场管理系统毕业设计项目。这个系统旨在解决传统商场管理中的痛点问题,如手工处理租赁流程效率低下、商铺状态更新不及时、信息不透明等。通过数字化手段,实现了商场租赁、活动管理、商户反馈等核心业务流程的自动化管理。
1.1 系统核心功能
系统主要包含两大角色功能模块:
商户端功能:
- 注册登录:商户可以通过手机号或邮箱注册账号
- 门店租赁:查看可租赁门店信息并提交申请
- 订单管理:查看和管理自己的租赁订单
- 报修申请:在线提交门店设备报修申请
- 活动参与:查看和参与商场组织的活动
- 反馈管理:向商场管理方提交反馈意见
管理端功能:
- 用户管理:管理商户账号和权限
- 门店管理:管理商场所有门店信息
- 租赁审批:审核商户的租赁申请
- 订单管理:管理所有租赁订单
- 活动管理:发布和管理商场活动
- 报修处理:处理商户的报修申请
- 反馈处理:查看和处理商户反馈
1.2 技术选型
后端技术栈:
- 框架:Spring Boot 2.7.x
- 安全:Spring Security
- 数据库:MySQL 8.0
- ORM:MyBatis-Plus
- 缓存:Redis
- 文档:Swagger
前端技术栈:
- 框架:Vue.js 3.x
- UI组件:Element Plus
- 图表:ECharts
- 构建工具:Vite
1.3 系统特点
- 前后端分离架构:采用RESTful API设计,前后端完全解耦
- RBAC权限控制:基于角色的访问控制,确保系统安全
- 响应式设计:适配PC和移动端不同设备
- 高性能设计:使用Redis缓存热点数据,提高系统响应速度
- 完善的文档:提供Swagger API文档和详细的使用说明
2. 系统设计与架构
2.1 系统架构设计
系统采用经典的三层架构设计:
code复制表现层(Web) → 业务逻辑层(Service) → 数据访问层(DAO)
架构图:
code复制+-------------------+ +-------------------+ +-------------------+
| 前端Vue.js | ←→ | Spring Boot | ←→ | MySQL |
| (Element Plus UI) | | (RESTful API) | | (关系型数据库) |
+-------------------+ +-------------------+ +-------------------+
↑
|
+-------------------+
| Redis |
| (缓存/会话管理) |
+-------------------+
2.2 数据库设计
系统采用MySQL作为主数据库,主要包含以下核心表:
-
用户相关表:
user:存储用户基本信息user_group:用户组/角色定义auth:权限配置
-
业务核心表:
store_information:门店信息lease_application:租赁申请lease_orders:租赁订单mall_activities:商场活动repair_application:报修申请merchant_feedback:商户反馈
-
辅助表:
activity_type:活动类型feedback_type:反馈类型upload:文件上传记录
2.3 关键表结构示例
以store_information(门店信息表)为例:
sql复制CREATE TABLE `store_information` (
`store_information_id` int NOT NULL AUTO_INCREMENT COMMENT '门店信息ID',
`house_number` varchar(64) NOT NULL COMMENT '门牌号',
`shop_floor_plan` varchar(255) DEFAULT NULL COMMENT '店面图',
`floor` varchar(64) DEFAULT NULL COMMENT '楼层',
`rental_price` int DEFAULT '0' COMMENT '租赁价格',
`store_area` varchar(64) DEFAULT NULL COMMENT '店面面积',
`store_status` varchar(64) DEFAULT NULL COMMENT '店面状态',
`merchant` varchar(64) DEFAULT NULL COMMENT '所属商户',
`store_details` longtext COMMENT '店面详情',
`create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
`update_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
PRIMARY KEY (`store_information_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci;
2.4 技术难点与解决方案
-
并发租赁问题:
- 问题:多个商户同时申请同一门店时可能产生冲突
- 解决方案:使用MySQL行锁+Redis分布式锁双重保障
-
文件上传与管理:
- 问题:门店图片、合同等文件需要安全存储和管理
- 解决方案:使用阿里云OSS对象存储服务
-
权限控制:
- 问题:不同角色需要不同的数据访问权限
- 解决方案:基于Spring Security实现动态权限控制
3. 核心功能实现
3.1 用户认证模块
采用JWT(JSON Web Token)实现无状态认证,关键代码如下:
java复制// 登录认证逻辑
@PostMapping("login")
public Map<String, Object> login(@RequestBody Map<String, String> data) {
String username = data.get("username");
String password = data.get("password");
// 1. 验证用户信息
User user = userService.validateUser(username, password);
// 2. 生成JWT Token
String token = JwtUtil.generateToken(user.getUserId(), user.getUsername());
// 3. 返回Token和用户基本信息
Map<String, Object> result = new HashMap<>();
result.put("token", token);
result.put("user", user);
return result;
}
// Token验证拦截器
public class JwtAuthenticationFilter extends OncePerRequestFilter {
@Override
protected void doFilterInternal(HttpServletRequest request,
HttpServletResponse response,
FilterChain filterChain) throws ServletException, IOException {
// 从请求头获取Token并验证
String token = request.getHeader("Authorization");
if (token != null && JwtUtil.validateToken(token)) {
Authentication authentication = JwtUtil.getAuthentication(token);
SecurityContextHolder.getContext().setAuthentication(authentication);
}
filterChain.doFilter(request, response);
}
}
3.2 租赁流程实现
租赁业务流程包含以下几个关键步骤:
- 门店浏览:商户查看可租赁门店信息
- 申请提交:填写租赁申请表单
- 管理审批:管理员审核租赁申请
- 合同签订:生成电子合同
- 订单创建:创建正式租赁订单
关键业务逻辑代码:
java复制@Transactional
public LeaseOrders createLeaseOrder(LeaseApplication application) {
// 1. 验证门店状态
StoreInformation store = storeMapper.selectById(application.getStoreId());
if (!"可租赁".equals(store.getStoreStatus())) {
throw new BusinessException("该门店当前不可租赁");
}
// 2. 锁定门店(防止并发问题)
storeMapper.lockStore(store.getStoreInformationId());
// 3. 创建租赁订单
LeaseOrders order = new LeaseOrders();
BeanUtils.copyProperties(application, order);
order.setLeaseDate(new Date());
order.setDeadlineDate(calculateDeadline(application.getLeaseMonths()));
order.setLeaseAmount(calculateAmount(store.getRentalPrice(), application.getLeaseMonths()));
// 4. 更新门店状态
store.setStoreStatus("已租赁");
store.setMerchant(application.getMerchantName());
storeMapper.updateById(store);
// 5. 保存订单
leaseOrdersMapper.insert(order);
return order;
}
3.3 报修流程实现
报修业务流程:
- 商户提交报修申请
- 管理员接收并分配维修人员
- 维修人员处理报修
- 商户确认维修完成
- 管理员关闭报修单
关键数据库表设计:
sql复制CREATE TABLE `repair_application` (
`repair_application_id` int NOT NULL AUTO_INCREMENT,
`repair_items` varchar(64) DEFAULT NULL COMMENT '报修物品',
`repair_date` date DEFAULT NULL COMMENT '报修日期',
`repair_description` text COMMENT '报修描述',
`repair_merchant` int DEFAULT '0' COMMENT '报修商户',
`merchant_name` varchar(64) DEFAULT NULL COMMENT '商户名称',
`merchant_phone_number` varchar(64) DEFAULT NULL COMMENT '商户电话',
`status` varchar(16) DEFAULT '待处理' COMMENT '状态',
`assignee` varchar(64) DEFAULT NULL COMMENT '分配人员',
`complete_time` datetime DEFAULT NULL COMMENT '完成时间',
`create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP,
`update_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
PRIMARY KEY (`repair_application_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci;
4. 系统测试与优化
4.1 测试策略
采用分层测试策略:
- 单元测试:使用JUnit+Mockito测试单个方法
- 集成测试:测试模块间交互
- API测试:使用Postman测试接口
- 性能测试:使用JMeter模拟并发请求
4.2 性能优化措施
-
数据库优化:
- 添加合适的索引
- 使用连接池(HikariCP)
- 读写分离(开发环境暂未实现)
-
缓存策略:
- 热点数据缓存(如门店信息)
- 使用Redis实现分布式锁
- 缓存击穿保护
-
接口优化:
- 分页查询
- 延迟加载
- 批量操作
4.3 安全措施
- 输入验证:所有接口参数都进行严格验证
- SQL注入防护:使用预编译语句
- XSS防护:输出编码
- CSRF防护:使用CSRF Token
- 敏感数据加密:密码等敏感信息加密存储
5. 部署与运维
5.1 系统部署方案
开发环境:
- JDK 17
- MySQL 8.0
- Redis 6.x
- Node.js 16.x
生产环境建议:
- 使用Docker容器化部署
- Nginx反向代理和负载均衡
- 阿里云RDS数据库服务
- 阿里云OSS对象存储
5.2 部署步骤
- 后端部署:
bash复制# 打包
mvn clean package -DskipTests
# 运行
java -jar mall-management-system.jar --spring.profiles.active=prod
- 前端部署:
bash复制# 安装依赖
npm install
# 构建生产环境代码
npm run build
# 部署到Nginx
cp -r dist/* /usr/share/nginx/html/
5.3 监控与日志
- 日志收集:使用Logback记录日志,按天归档
- 健康检查:Spring Boot Actuator提供健康端点
- APM监控:可选接入SkyWalking或Prometheus
6. 项目总结与展望
6.1 项目成果
通过本项目的开发,实现了以下目标:
- 完成了商场管理核心业务流程的数字化
- 提高了商场管理效率,减少了人工操作错误
- 改善了商户体验,提供了便捷的在线服务
- 积累了SpringBoot全栈开发经验
6.2 经验总结
在开发过程中积累了一些宝贵经验:
- 数据库设计:合理的索引设计对性能影响巨大
- 事务管理:@Transactional注解的使用要谨慎
- 接口设计:RESTful规范能显著提高API可维护性
- 异常处理:统一的异常处理机制很重要
6.3 未来改进方向
- 移动端适配:开发微信小程序版本
- 智能分析:加入租赁数据分析功能
- 物联网集成:接入智能门锁等IoT设备
- 支付集成:对接支付宝/微信支付
- 微服务改造:拆分为多个微服务提高扩展性
7. 开发心得
在开发这个商场管理系统的过程中,我深刻体会到几个关键点:
- 需求分析的重要性:前期充分的需求分析能避免后期大量返工
- 文档的价值:完善的文档能显著提高团队协作效率
- 测试的必要性:自动化测试能保证代码质量,减少BUG
- 性能的考量:从设计阶段就要考虑性能问题,而不是事后补救
对于初学者,我的建议是:
- 先掌握好Spring Boot和MySQL基础知识
- 从简单功能开始,逐步增加复杂度
- 多写单元测试,培养测试驱动开发的习惯
- 学会使用调试工具,提高问题排查效率
这个项目虽然已经完成,但技术上还有很多可以优化的地方。后续我计划继续完善文档,增加更多自动化测试用例,并尝试将其部署到云平台上。