1. 项目背景与核心价值
高校汉服租赁管理系统是近年来传统文化复兴浪潮下的一个典型应用场景。随着"国潮"兴起,越来越多大学生在传统节日、毕业典礼、文艺演出等场合选择穿着汉服,但高昂的购置成本和存放问题催生了校园汉服租赁需求。
这个基于SpringBoot+Vue的全栈系统解决了三个核心痛点:
- 租赁流程数字化:将传统的线下登记、押金管理、租期跟踪等流程转移到线上,减少人工差错
- 库存可视化:通过分类标签、尺码管理和状态追踪,解决汉服这类特殊服饰的库存管理难题
- 跨平台适配:管理员端(SpringBoot)和用户端(Vue)分离,满足PC端后台管理和移动端便捷租赁的双重需求
技术栈选择体现了当前企业级开发的黄金组合:
- 后端:SpringBoot 3.x(自动配置+内嵌容器)
- 前端:Vue 3 + Element Plus(组合式API+TypeScript支持)
- 持久层:MyBatis-Plus + PageHelper(简化CRUD+分页)
- 数据库:MySQL 8.0(窗口函数+JSON支持)
提示:系统默认使用SpringBoot 3.1.5和Vue 3.3.4,这两个版本在2023年Q3已进入长期支持阶段,适合作为2025年项目的基线版本
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 核心功能模块设计
2.1 租赁业务主流程
系统采用状态机模式管理汉服生命周期:
mermaid复制stateDiagram-v2
[*] --> 在库
在库 --> 租赁中 : 用户下单支付
租赁中 --> 清洗中 : 用户归还
清洗中 --> 在库 : 清洁完成
清洗中 --> 维修中 : 发现破损
维修中 --> 在库 : 修复完成
维修中 --> 已报废 : 无法修复
对应数据库表设计关键字段:
sql复制CREATE TABLE `hanfu` (
`id` BIGINT PRIMARY KEY AUTO_INCREMENT,
`name` VARCHAR(64) NOT NULL COMMENT '汉服名称',
`category` ENUM('唐制','宋制','明制') NOT NULL,
`size` ENUM('XS','S','M','L','XL') NOT NULL,
`status` ENUM('在库','租赁中','清洗中','维修中','已报废') NOT NULL DEFAULT '在库',
`daily_price` DECIMAL(10,2) UNSIGNED NOT NULL,
`deposit` DECIMAL(10,2) UNSIGNED NOT NULL COMMENT '押金',
`main_image` VARCHAR(255) NOT NULL COMMENT '主图URL'
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
2.2 特色功能实现
-
智能推荐系统:
- 基于用户历史租赁记录和汉服标签的协同过滤算法
- 使用MySQL 8.0的JSON字段存储用户偏好向量
java复制// SpringBoot中处理JSON字段的实体类设计 @Data @TableName(autoResultMap = true) public class User { @TableId(type = IdType.AUTO) private Long id; private String username; @TableField(typeHandler = FastjsonTypeHandler.class) private JSONObject preferenceVector; // {"唐制":0.8, "明制":0.3} } -
逾期预警模块:
- 基于Spring Scheduler的定时任务扫描
- 集成腾讯云短信API发送提醒
java复制@Scheduled(cron = "0 0 10 * * ?") // 每天上午10点执行 public void checkOverdueOrders() { LocalDate today = LocalDate.now(); List<Order> orders = orderMapper.selectList(new QueryWrapper<Order>() .eq("status", "租赁中") .lt("end_date", today)); orders.forEach(order -> { smsService.sendOverdueNotice(order.getUserPhone()); }); }
3. 技术实现关键点
3.1 前后端分离架构
采用JWT+RBAC的安全方案:
code复制 +---------------+
| Vue 3 SPA |
+-------┬-------+
│
+-------┴-------+
| Nginx反向代理 |
+-------┬-------+
│
+-------┴-------+
| SpringBoot API|
+-------┬-------+
│
+-------┴-------+
| MySQL 8.0 |
+---------------+
前端axios拦截器示例:
javascript复制// src/utils/request.js
const service = axios.create({
baseURL: import.meta.env.VITE_APP_BASE_API,
timeout: 5000
})
service.interceptors.request.use(config => {
if (store.getters.token) {
config.headers['Authorization'] = `Bearer ${store.getters.token}`
}
return config
}, error => {
return Promise.reject(error)
})
3.2 MyBatis-Plus高级应用
-
自动填充策略:
java复制@Data public class BaseEntity { @TableField(fill = FieldFill.INSERT) private LocalDateTime createTime; @TableField(fill = FieldFill.INSERT_UPDATE) private LocalDateTime updateTime; } @Component public class MyMetaObjectHandler implements MetaObjectHandler { @Override public void insertFill(MetaObject metaObject) { this.strictInsertFill(metaObject, "createTime", LocalDateTime.class, LocalDateTime.now()); } @Override public void updateFill(MetaObject metaObject) { this.strictUpdateFill(metaObject, "updateTime", LocalDateTime.class, LocalDateTime.now()); } } -
多租户SQL解析:
java复制public class TenantParser implements TenantLineHandler { @Override public Expression getTenantId() { return new LongValue(SecurityUtils.getCurrentUser().getCampusId()); } @Override public String getTenantIdColumn() { return "campus_id"; } @Override public boolean ignoreTable(String tableName) { return !Arrays.asList("hanfu", "order").contains(tableName); } }
4. 部署与运维方案
4.1 生产环境部署
推荐使用Docker Compose编排:
yaml复制version: '3.8'
services:
mysql:
image: mysql:8.0
environment:
MYSQL_ROOT_PASSWORD: ${DB_ROOT_PASS}
MYSQL_DATABASE: hanfu_rental
volumes:
- mysql_data:/var/lib/mysql
ports:
- "3306:3306"
backend:
build: ./backend
depends_on:
- mysql
environment:
SPRING_DATASOURCE_URL: jdbc:mysql://mysql:3306/hanfu_rental
ports:
- "8080:8080"
frontend:
build: ./frontend
ports:
- "80:80"
volumes:
mysql_data:
4.2 性能优化实践
-
MySQL索引策略:
sql复制-- 高频查询字段组合索引 ALTER TABLE `hanfu` ADD INDEX `idx_category_status` (`category`, `status`); -- 订单表时间范围查询索引 ALTER TABLE `order` ADD INDEX `idx_user_date` (`user_id`, `start_date`, `end_date`); -
SpringBoot缓存配置:
java复制@Configuration @EnableCaching public class CacheConfig { @Bean public RedisCacheManager cacheManager(RedisConnectionFactory factory) { RedisCacheConfiguration config = RedisCacheConfiguration.defaultCacheConfig() .entryTtl(Duration.ofMinutes(30)) .disableCachingNullValues() .serializeValuesWith(SerializationPair.fromSerializer(new GenericJackson2JsonRedisSerializer())); return RedisCacheManager.builder(factory) .cacheDefaults(config) .transactionAware() .build(); } }
5. 扩展开发建议
-
微信小程序集成:
- 复用现有API层
- 使用uni-app跨平台方案
javascript复制// pages/index/index.vue export default { methods: { async loadHanfuList() { const res = await uni.request({ url: 'https://api.example.com/hanfu', header: { 'Authorization': `Bearer ${uni.getStorageSync('[token](https://taotoken.net?utm_source=general)')}` } }); this.list = res.data; } } } -
智能清洁调度:
java复制@RabbitListener(queues = "cleaning.queue") public void processCleaningTask(HanfuCleanDTO dto) { // 调用物联网设备接口 iotService.startCleaning(dto.getHanfuId()); // 更新状态 hanfuService.updateStatus(dto.getHanfuId(), "清洗中"); } -
数据可视化看板:
vue复制<!-- src/views/dashboard.vue --> <template> <el-row :gutter="20"> <el-col :span="12"> <v-chart :option="rentalChartOption" /> </el-col> <el-col :span="12"> <v-chart :option="categoryChartOption" /> </el-col> </el-row> </template> <script setup> import { use } from 'echarts/core' import { PieChart, BarChart } from 'echarts/charts' use([PieChart, BarChart]) const rentalChartOption = ref({ tooltip: { trigger: 'item' }, series: [{ type: 'pie', data: [] }] }) </script>
注意:系统默认包含Swagger API文档和前端Mock数据,开发时可先启动前端服务独立开发
