这个基于SpringBoot的汉服租赁与展示平台是一个典型的B/S架构管理系统,主要面向汉服爱好者、租赁商家以及文化推广机构。系统采用前后端分离的设计模式,后端使用SpringBoot+MyBatisPlus技术栈,前端采用Vue.js框架,数据库选用MySQL。
作为一个完整的毕业设计项目,它涵盖了用户管理、汉服展示、租赁管理、订单处理等核心业务模块。项目最大的特点是:
提示:这类管理系统类项目非常适合作为计算机相关专业的毕业设计选题,因为它既包含了完整的技术栈应用,又具有实际商业价值,同时开发难度适中。
选择这套技术栈主要基于以下考虑:
前端选择Vue3生态主要因为:
系统采用经典的三层架构:
code复制表示层(Vue) → 业务逻辑层(Spring Boot) → 数据访问层(MyBatis-Plus)
↓
缓存层(Redis)
↓
数据存储层(MySQL)
数据库设计遵循第三范式,主要包含以下核心表:
用户表(sys_user)
汉服表(hanfu)
租赁订单表(rent_order)
评价表(comment)
注意:实际项目中还包含地址表、支付记录表、系统日志表等辅助表,这里仅列出核心表结构。
采用Shiro进行认证授权,密码存储方案:
关键代码实现:
java复制// 密码加密工具类
public class PasswordUtils {
private static final int HASH_ITERATIONS = 1024;
public static String encrypt(String password, String salt) {
return new SimpleHash("SHA-256", password, salt, HASH_ITERATIONS).toHex();
}
public static String generateSalt() {
return RandomStringUtils.randomAlphanumeric(16);
}
}
采用JWT作为无状态认证方案,包含以下信息:
刷新策略:
前端通过Elasticsearch实现高效的汉服检索,支持:
后端接口设计:
java复制@GetMapping("/hanfu/list")
public Result listHanfu(
@RequestParam(required = false) String keyword,
@RequestParam(required = false) String dynasty,
@RequestParam(required = false) String category,
@RequestParam(required = false) Double minPrice,
@RequestParam(required = false) Double maxPrice,
@RequestParam(defaultValue = "1") Integer page,
@RequestParam(defaultValue = "10") Integer size) {
// 构建查询条件
LambdaQueryWrapper<Hanfu> wrapper = new LambdaQueryWrapper<>();
if (StringUtils.isNotBlank(keyword)) {
wrapper.like(Hanfu::getName, keyword);
}
// 其他条件处理...
// 分页查询
Page<Hanfu> pageInfo = new Page<>(page, size);
hanfuService.page(pageInfo, wrapper);
return Result.success(pageInfo);
}
采用多图轮播+详情选项卡布局:
状态机设计:
code复制待支付 → 已支付 → 待发货 → 已发货 → 租赁中 → 待归还 → 已归还 → 已完成
↓ ↓
取消 申请续租
采用乐观锁防止超卖:
java复制@Transactional
public Result createOrder(OrderDTO dto) {
// 查询汉服信息(带版本号)
Hanfu hanfu = hanfuMapper.selectByIdWithVersion(dto.getHanfuId());
// 校验库存
if (hanfu.getStock() < 1) {
return Result.error("库存不足");
}
// 扣减库存(带版本号更新)
int update = hanfuMapper.updateStockWithVersion(
hanfu.getId(),
hanfu.getVersion());
if (update == 0) {
throw new RuntimeException("库存更新失败,请重试");
}
// 创建订单...
}
推荐环境:
配置文件示例(application-dev.yml):
yaml复制server:
port: 8080
spring:
datasource:
url: jdbc:mysql://localhost:3306/hanfu_rent?useSSL=false&serverTimezone=Asia/Shanghai
username: root
password: 123456
driver-class-name: com.mysql.cj.jdbc.Driver
redis:
host: localhost
port: 6379
password:
database: 0
mybatis-plus:
configuration:
log-impl: org.apache.ibatis.logging.stdout.StdOutImpl
mvn clean package -DskipTestsdockerfile复制FROM openjdk:17-jdk-slim
COPY target/hanfu-rent-0.0.1-SNAPSHOT.jar app.jar
ENTRYPOINT ["java","-jar","/app.jar"]
yaml复制version: '3'
services:
app:
image: hanfu-rent:1.0
ports:
- "8080:8080"
environment:
- SPRING_PROFILES_ACTIVE=prod
depends_on:
- redis
- mysql
mysql:
image: mysql:8.0
environment:
MYSQL_ROOT_PASSWORD: yourpassword
MYSQL_DATABASE: hanfu_rent
redis:
image: redis:6-alpine
npm run buildnginx复制server {
listen 80;
server_name yourdomain.com;
location / {
root /var/www/hanfu-rent/dist;
try_files $uri $uri/ /index.html;
}
location /api/ {
proxy_pass http://backend:8080/;
proxy_set_header Host $host;
}
}
提示:答辩时建议准备2-3个对比方案(如传统Servlet架构与SpringBoot架构的对比),展示你的技术决策过程。
问题1:MySQL连接失败
&useSSL=false&allowPublicKeyRetrieval=true问题2:前端跨域访问
解决方案:
java复制@Configuration
public class CorsConfig implements WebMvcConfigurer {
@Override
public void addCorsMappings(CorsRegistry registry) {
registry.addMapping("/**")
.allowedOrigins("*")
.allowedMethods("GET", "POST", "PUT", "DELETE")
.allowedHeaders("*")
.maxAge(3600);
}
}
问题3:库存扣减不一致
解决方案:
java复制public boolean deductStock(Long hanfuId) {
String lockKey = "lock:hanfu:" + hanfuId;
String clientId = UUID.randomUUID().toString();
try {
// 尝试获取锁
Boolean locked = redisTemplate.opsForValue()
.setIfAbsent(lockKey, clientId, 30, TimeUnit.SECONDS);
if (Boolean.TRUE.equals(locked)) {
// 执行库存扣减
return hanfuService.deductStock(hanfuId);
}
return false;
} finally {
// 释放锁
if (clientId.equals(redisTemplate.opsForValue().get(lockKey))) {
redisTemplate.delete(lockKey);
}
}
}
问题4:订单状态流转异常
建议:
问题5:内存溢出
解决方案:
-Xms512m -Xmx1024m -XX:+HeapDumpOnOutOfMemoryError问题6:数据库慢查询
优化方案:
在实际开发这个汉服租赁系统的过程中,我发现最大的挑战不在于技术实现,而在于业务流程的完整性和用户体验的细节处理。比如在租赁流程中,最初设计的"选择汉服-下单支付"两步走模式在实际测试中暴露出用户对押金规则理解不清的问题。后来我们增加了"租赁计算器"功能,用户可以实时看到不同租赁天数的费用明细,这个小小的改进使订单转化率提升了近30%。这让我深刻体会到,一个好的系统不仅要有扎实的技术基础,更需要从用户角度出发不断优化交互体验。