1. 项目背景与核心需求
在当今快节奏的消费社会中,服装闲置问题日益突出。根据行业调研数据,中国家庭平均每年会产生约30件闲置衣物,其中超过60%的衣物仅穿着1-2次就被束之高阁。这种资源浪费现象催生了共享经济模式在服装领域的应用需求。
本项目"共享汇"正是基于SpringBoot框架开发的闲置服装交易平台,旨在解决以下核心痛点:
- 资源错配问题:连接闲置服装供给方与需求方,实现衣物资源的二次流通
- 交易信任缺失:通过平台认证和评价体系建立买卖双方信任机制
- 技术实现门槛:为计算机专业学生提供完整的毕设解决方案参考
提示:选择SpringBoot作为技术栈主要考虑其快速开发特性和丰富的生态支持,特别适合学生项目的时间约束条件
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 系统架构设计
2.1 技术选型决策
| 技术组件 | 选型理由 | 替代方案对比 |
|---|---|---|
| SpringBoot 2.7.x | 简化配置、内嵌Tomcat、自动装配 | 传统SSM架构配置复杂 |
| MyBatis-Plus | 减少SQL编写工作量 | JPA灵活性不足 |
| Redis | 高频访问数据缓存 | 直接数据库查询性能差 |
| Alibaba Cloud OSS | 稳定可靠的文件存储 | 本地存储扩展性差 |
2.2 核心模块划分
java复制com.sharedclothing
├── config // 系统配置
├── controller // 请求入口
├── service // 业务逻辑
├── dao // 数据访问
├── entity // 数据实体
├── util // 工具类
└── exception // 异常处理
2.3 数据库ER设计关键点
sql复制CREATE TABLE `t_goods` (
`id` bigint NOT NULL AUTO_INCREMENT,
`user_id` bigint NOT NULL COMMENT '发布用户',
`title` varchar(100) NOT NULL COMMENT '商品标题',
`category` varchar(20) NOT NULL COMMENT '服装类别',
`size` varchar(10) NOT NULL COMMENT '尺码',
`price` decimal(10,2) NOT NULL COMMENT '价格',
`original_price` decimal(10,2) DEFAULT NULL COMMENT '原价',
`wear_count` int DEFAULT '0' COMMENT '穿着次数',
`status` tinyint DEFAULT '0' COMMENT '0-待审核 1-已上架 2-已下架',
`main_image` varchar(255) DEFAULT NULL COMMENT '主图URL',
`detail` text COMMENT '详情描述',
`create_time` datetime DEFAULT CURRENT_TIMESTAMP,
PRIMARY KEY (`id`),
KEY `idx_user` (`user_id`),
KEY `idx_category` (`category`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
3. 核心功能实现细节
3.1 多条件商品检索实现
采用MyBatis-Plus的Wrapper构建动态查询条件:
java复制public Page<GoodsVO> queryGoods(GoodsQueryDTO query) {
QueryWrapper<Goods> wrapper = new QueryWrapper<>();
if (StringUtils.isNotBlank(query.getKeyword())) {
wrapper.like("title", query.getKeyword())
.or().like("detail", query.getKeyword());
}
if (query.getCategory() != null) {
wrapper.eq("category", query.getCategory());
}
if (query.getMinPrice() != null && query.getMaxPrice() != null) {
wrapper.between("price", query.getMinPrice(), query.getMaxPrice());
}
wrapper.eq("status", 1) // 只查询已上架商品
.orderByDesc(query.getSortField());
Page<Goods> page = goodsMapper.selectPage(
new Page<>(query.getPageNum(), query.getPageSize()),
wrapper
);
return convertToVOPage(page);
}
3.2 图片上传与OSS集成
采用阿里云OSS实现图片存储的方案要点:
- 前端采用WebUploader实现分片上传
- 服务端生成临时签名保障上传安全
- 图片处理采用OSS原生图片处理服务
关键配置示例:
yaml复制aliyun:
oss:
endpoint: https://oss-cn-hangzhou.aliyuncs.com
access-key-id: ${ACCESS_KEY_ID}
access-key-secret: ${ACCESS_KEY_SECRET}
bucket-name: shared-clothing
callback-url: /api/oss/callback
expire-time: 300000 # 签名有效期5分钟
max-size: 10485760 # 单文件最大10MB
3.3 交易流程状态机设计
java复制public enum TradeStatus {
INIT(0, "待付款"),
PAID(1, "已付款"),
SHIPPED(2, "已发货"),
RECEIVED(3, "已收货"),
FINISHED(4, "已完成"),
CANCELLED(-1, "已取消"),
REFUNDING(-2, "退款中");
// 状态校验逻辑
public static boolean canChangeTo(TradeStatus current, TradeStatus target) {
switch (current) {
case INIT: return target == PAID || target == CANCELLED;
case PAID: return target == SHIPPED || target == REFUNDING;
// 其他状态转换规则...
default: return false;
}
}
}
4. 毕设特色功能实现
4.1 智能推荐算法集成
基于用户行为的协同过滤推荐实现:
python复制# 使用Surprise库实现推荐算法
from surprise import Dataset, KNNBasic
from surprise.model_selection import cross_validate
def train_recommend_model():
# 加载用户-商品交互数据
data = Dataset.load_from_df(ratings_df[['userId', 'itemId', 'rating']],
reader=Reader(rating_scale=(1, 5)))
# 使用KNN基础算法
algo = KNNBasic(k=40, min_k=5,
sim_options={'name': 'cosine', 'user_based': False})
# 交叉验证
cross_validate(algo, data, measures=['RMSE', 'MAE'], cv=5, verbose=True)
# 训练最终模型
trainset = data.build_full_trainset()
algo.fit(trainset)
return algo
4.2 微信小程序端适配方案
采用uni-app实现多端兼容的关键配置:
javascript复制// manifest.json 配置
{
"mp-weixin": {
"appid": "wx1234567890abcdef",
"setting": {
"urlCheck": false,
"es6": true,
"postcss": true
},
"usingComponents": true,
"permission": {
"scope.userLocation": {
"desc": "用于展示附近的闲置衣物"
}
}
}
}
4.3 安全防护措施
- XSS防护:
java复制@Configuration
public class WebSecurityConfig extends WebSecurityConfigurerAdapter {
@Override
protected void configure(HttpSecurity http) throws Exception {
http.headers()
.xssProtection()
.and()
.contentSecurityPolicy("script-src 'self'");
}
}
- CSRF防护:
java复制@Bean
public SecurityFilterChain securityFilterChain(HttpSecurity http) throws Exception {
http.csrf(csrf -> csrf
.csrfTokenRepository(CookieCsrfTokenRepository.withHttpOnlyFalse())
.ignoringAntMatchers("/api/oss/callback")
);
return http.build();
}
5. 项目部署与运维
5.1 多环境配置方案
采用Profile区分不同环境配置:
properties复制# application-dev.properties
spring.datasource.url=jdbc:mysql://localhost:3306/shared_clothing_dev
spring.datasource.username=dev_user
spring.datasource.password=dev123
# application-prod.properties
spring.datasource.url=jdbc:mysql://prod-db:3306/shared_clothing
spring.datasource.username=prod_user
spring.datasource.password=${DB_PASSWORD}
启动时指定Profile:
bash复制java -jar shared-clothing.jar --spring.profiles.active=prod
5.2 Docker部署方案
dockerfile复制FROM openjdk:11-jre-slim
VOLUME /tmp
ARG JAR_FILE=target/*.jar
COPY ${JAR_FILE} app.jar
ENTRYPOINT ["java","-Djava.security.egd=file:/dev/./urandom","-jar","/app.jar"]
编排文件示例:
yaml复制version: '3'
services:
app:
image: shared-clothing:1.0
ports:
- "8080:8080"
environment:
- SPRING_PROFILES_ACTIVE=prod
depends_on:
- redis
- mysql
redis:
image: redis:6-alpine
ports:
- "6379:6379"
mysql:
image: mysql:8.0
environment:
MYSQL_ROOT_PASSWORD: root123
MYSQL_DATABASE: shared_clothing
ports:
- "3306:3306"
5.3 性能优化实践
- 缓存策略:
java复制@Cacheable(value = "goods", key = "#id", unless = "#result == null")
public GoodsDetailVO getGoodsDetail(Long id) {
return goodsMapper.selectDetailById(id);
}
@CacheEvict(value = "goods", key = "#goodsId")
public void updateGoods(GoodsUpdateDTO dto) {
// 更新逻辑
}
- SQL优化示例:
sql复制-- 避免SELECT *
SELECT id, title, price, main_image FROM t_goods WHERE status = 1 LIMIT 20;
-- 添加合适索引
ALTER TABLE t_order ADD INDEX idx_user_status (user_id, status);
6. 毕设答辩准备要点
6.1 技术亮点阐述
- 自动装配原理应用:
java复制@Configuration
@ConditionalOnClass(RedisTemplate.class)
@EnableConfigurationProperties(RedisProperties.class)
public class RedisAutoConfig {
@Bean
@ConditionalOnMissingBean
public RedisTemplate<String, Object> redisTemplate(
RedisConnectionFactory factory) {
RedisTemplate<String, Object> template = new RedisTemplate<>();
template.setConnectionFactory(factory);
template.setKeySerializer(new StringRedisSerializer());
template.setValueSerializer(new GenericJackson2JsonRedisSerializer());
return template;
}
}
6.2 常见问题应对
Q:为什么选择SpringBoot而不是其他框架?
A:从三个方面考虑:
- 快速原型开发需求(内嵌容器、自动配置)
- 丰富的Starter生态(Security、Redis等)
- 便于扩展为SpringCloud微服务架构
Q:如何保证二手服装的质量?
A:通过三重机制:
- 上传实物照片要求(多角度、细节图)
- 平台审核机制(人工初审+算法辅助)
- 用户评价体系(带图评价权重更高)
6.3 功能演示路线图
- 用户注册与登录(JWT令牌演示)
- 商品发布流程(包含图片上传)
- 搜索与筛选功能演示
- 完整的交易流程(创建订单→支付→发货→确认收货)
- 后台管理功能展示(数据统计、内容审核)
7. 源码结构与使用说明
7.1 关键代码位置
code复制src/
├── main/
│ ├── java/
│ │ └── com/
│ │ └── sharedclothing/
│ │ ├── config/ # 配置类
│ │ ├── controller/ # 控制器
│ │ ├── service/ # 服务层
│ │ ├── mapper/ # MyBatis接口
│ │ └── SharedClothingApplication.java # 启动类
│ └── resources/
│ ├── static/ # 静态资源
│ ├── templates/ # 模板文件
│ └── application.yml # 主配置文件
└── test/ # 测试代码
7.2 快速启动指南
- 环境准备:
bash复制# 需安装
- JDK 11+
- MySQL 8.0
- Redis 6+
- Maven 3.6+
- 数据库初始化:
sql复制CREATE DATABASE shared_clothing CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
GRANT ALL PRIVILEGES ON shared_clothing.* TO 'sc_user'@'%' IDENTIFIED BY 'sc_pass123';
FLUSH PRIVILEGES;
- 启动命令:
bash复制mvn clean package
java -jar target/shared-clothing-1.0.0.jar
注意:首次启动会自动初始化数据库表结构,请确保数据库连接配置正确
8. 扩展方向与优化建议
8.1 功能扩展路线
-
社交化扩展:
- 用户关注与动态feed流
- 衣物搭配分享社区
- 直播带货功能集成
-
技术深化方向:
- 接入Elasticsearch实现高级搜索
- 使用SpringCloud Alibaba升级为微服务架构
- 引入区块链技术实现交易存证
8.2 性能优化空间
-
前端优化:
- 实现图片懒加载
- 使用WebP格式替代JPEG
- 实施HTTP/2服务器推送
-
后端优化:
- 引入Caffeine本地缓存
- 数据库读写分离
- 热点数据预加载
8.3 商业化运营建议
-
盈利模式设计:
- 交易佣金(5-8%)
- 增值服务(首页推荐位)
- 会员订阅制(免佣金等权益)
-
用户增长策略:
- 邀请返现机制
- 校园大使计划
- 环保积分体系
在实际开发过程中,我发现SpringBoot的约定大于配置特性确实大幅提升了开发效率,特别是在快速迭代阶段。但同时也需要注意不要过度依赖自动配置,对于关键组件(如数据库连接池、缓存管理等)应该显式配置以确保可维护性。项目中最具挑战性的部分是交易状态机的设计,需要处理好各种边界条件和异常情况,这部分我通过状态模式+事件总线的架构最终实现了灵活的状态流转控制。
