1. 项目概述
校园二手闲置物品共享平台是一个基于Vue.js前端框架和Spring Boot后端框架开发的Web应用系统,旨在为高校学生提供一个便捷、安全的二手物品交易平台。这个项目完美契合了当前校园内大量闲置物品需要流通的实际需求,同时也响应了绿色环保、循环经济的理念。
我在开发这个平台时,主要考虑了以下几个核心需求点:
- 学生群体对二手教材、电子产品、生活用品的交易需求旺盛
- 传统线下交易存在信息不对称、交易效率低的问题
- 校园内交易需要确保安全性和可信度
- 移动端便捷访问是学生用户的核心诉求
技术栈选择上,前端采用Vue.js 3.x组合式API开发,后端使用Spring Boot 2.7.x构建RESTful API,数据库选用MySQL 8.0,并配合Redis做缓存。这种技术组合既保证了开发效率,又能满足校园级应用的性能需求。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 核心功能模块设计
2.1 用户系统
用户模块采用RBAC权限模型,区分普通用户、管理员和超级管理员三种角色。我特别设计了基于JWT的认证流程:
java复制// Spring Security配置示例
@Configuration
@EnableWebSecurity
public class SecurityConfig extends WebSecurityConfigurerAdapter {
@Override
protected void configure(HttpSecurity http) throws Exception {
http.csrf().disable()
.authorizeRequests()
.antMatchers("/api/auth/**").permitAll()
.antMatchers("/api/admin/**").hasRole("ADMIN")
.anyRequest().authenticated()
.and()
.addFilter(new JwtAuthenticationFilter(authenticationManager()))
.addFilter(new JwtAuthorizationFilter(authenticationManager()));
}
}
注意:校园环境下要特别注意防止越权访问,建议对敏感操作(如删除商品)增加二次验证。
2.2 商品管理
商品模块支持多维度分类和灵活的搜索功能。我在实现时采用了Elasticsearch来提升搜索体验:
javascript复制// Vue组件中的搜索实现
const searchProducts = debounce(async (query) => {
if (query.length < 2) return
const res = await axios.get('/api/products/search', {
params: { q: query, page: 1, size: 10 }
})
searchResults.value = res.data
}, 300)
商品详情页设计要点:
- 采用瀑布流展示多张图片
- 价格走势图表(针对教材类商品)
- 卖家信用评级展示
- 在线沟通入口
2.3 交易系统
交易流程是平台的核心,我设计了如下状态机:
code复制待付款 → 已付款 → 待发货 → 已发货 → 待收货 → 已完成
↘ ↙
已取消
对应的数据库表设计特别注意了事务一致性:
sql复制CREATE TABLE `transaction` (
`id` BIGINT NOT NULL AUTO_INCREMENT,
`product_id` BIGINT NOT NULL,
`buyer_id` BIGINT NOT NULL,
`seller_id` BIGINT NOT NULL,
`amount` DECIMAL(10,2) NOT NULL,
`status` ENUM('PENDING','PAID','SHIPPED','COMPLETED','CANCELLED') NOT NULL,
`created_at` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
PRIMARY KEY (`id`),
FOREIGN KEY (`product_id`) REFERENCES `product` (`id`),
FOREIGN KEY (`buyer_id`) REFERENCES `user` (`id`),
FOREIGN KEY (`seller_id`) REFERENCES `user` (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
3. 关键技术实现细节
3.1 前后端分离架构
项目采用典型的前后端分离架构,通过RESTful API进行通信。我在实践中总结出几个关键点:
- API设计规范:
- 使用JSON作为数据交换格式
- 遵循HTTP状态码规范(200成功,400客户端错误等)
- 统一的响应结构:
- 跨域解决方案:
java复制// Spring Boot跨域配置
@Configuration
public class CorsConfig implements WebMvcConfigurer {
@Override
public void addCorsMappings(CorsRegistry registry) {
registry.addMapping("/**")
.allowedOrigins("http://localhost:8080")
.allowedMethods("*")
.allowedHeaders("*")
.allowCredentials(true);
}
}
- 前端axios封装示例:
javascript复制const service = axios.create({
baseURL: process.env.VUE_APP_BASE_API,
timeout: 10000
})
// 请求拦截器
service.interceptors.request.use(
config => {
if (store.getters.token) {
config.headers['Authorization'] = 'Bearer ' + getToken()
}
return config
},
error => {
return Promise.reject(error)
}
)
3.2 图片上传与存储
考虑到校园二手交易中图片的重要性,我实现了以下功能:
- 图片压缩(使用canvas在前端实现)
- 多图上传(限制最多9张)
- 七牛云OSS存储方案
关键代码实现:
javascript复制// 前端图片压缩
function compressImage(file, quality = 0.8) {
return new Promise((resolve) => {
const reader = new FileReader()
reader.onload = (event) => {
const img = new Image()
img.onload = () => {
const canvas = document.createElement('canvas')
const ctx = canvas.getContext('2d')
canvas.width = img.width
canvas.height = img.height
ctx.drawImage(img, 0, 0)
canvas.toBlob(resolve, 'image/jpeg', quality)
}
img.src = event.target.result
}
reader.readAsDataURL(file)
})
}
3.3 即时通讯功能
为了便于买卖双方沟通,我集成了WebSocket实现实时聊天:
java复制// Spring Boot WebSocket配置
@Configuration
@EnableWebSocketMessageBroker
public class WebSocketConfig implements WebSocketMessageBrokerConfigurer {
@Override
public void configureMessageBroker(MessageBrokerRegistry config) {
config.enableSimpleBroker("/topic");
config.setApplicationDestinationPrefixes("/app");
}
@Override
public void registerStompEndpoints(StompEndpointRegistry registry) {
registry.addEndpoint("/ws")
.setAllowedOrigins("*")
.withSockJS();
}
}
前端使用SockJS-client实现:
javascript复制import SockJS from 'sockjs-client'
import Stomp from 'stompjs'
const connect = () => {
const socket = new SockJS('/ws')
const stompClient = Stomp.over(socket)
stompClient.connect({}, () => {
stompClient.subscribe('/topic/messages', (message) => {
const msg = JSON.parse(message.body)
store.commit('ADD_MESSAGE', msg)
})
})
return stompClient
}
4. 性能优化实践
4.1 前端性能优化
- 组件懒加载:
javascript复制const ProductDetail = () => import('@/views/ProductDetail.vue')
- 路由懒加载:
javascript复制{
path: '/product/:id',
component: () => import('@/views/ProductDetail.vue'),
props: true
}
- 图片懒加载:
html复制<img v-lazy="imageUrl" alt="product image">
4.2 后端性能优化
- Redis缓存热门商品:
java复制@Cacheable(value = "products", key = "#id")
public Product getProductById(Long id) {
return productRepository.findById(id).orElse(null);
}
- 数据库查询优化:
java复制@Query("SELECT p FROM Product p JOIN FETCH p.user WHERE p.id = :id")
Product findByIdWithUser(@Param("id") Long id);
- 异步处理邮件通知:
java复制@Async
public void sendEmailNotification(EmailMessage message) {
// 发送邮件逻辑
}
5. 安全防护措施
5.1 XSS防护
前端使用DOMPurify净化输入:
javascript复制import DOMPurify from 'dompurify'
const clean = DOMPurify.sanitize(userInput)
后端配置:
java复制@Configuration
public class WebSecurityConfig extends WebSecurityConfigurerAdapter {
@Override
protected void configure(HttpSecurity http) throws Exception {
http.headers()
.xssProtection()
.and()
.contentSecurityPolicy("script-src 'self'");
}
}
5.2 CSRF防护
虽然RESTful API通常不依赖CSRF防护,但考虑到部分操作可能涉及表单提交,我仍然保留了防护机制:
java复制http.csrf().csrfTokenRepository(CookieCsrfTokenRepository.withHttpOnlyFalse())
5.3 数据脱敏
用户敏感信息在返回前端时进行脱敏处理:
java复制public UserDTO toDTO(User user) {
return new UserDTO(
user.getId(),
user.getUsername(),
maskPhoneNumber(user.getPhone()),
maskEmail(user.getEmail())
);
}
6. 部署方案
6.1 开发环境部署
使用Docker Compose快速搭建开发环境:
yaml复制version: '3'
services:
mysql:
image: mysql:8.0
environment:
MYSQL_ROOT_PASSWORD: root
MYSQL_DATABASE: campus_trade
ports:
- "3306:3306"
volumes:
- ./mysql-data:/var/lib/mysql
redis:
image: redis:6
ports:
- "6379:6379"
volumes:
- ./redis-data:/data
6.2 生产环境部署
采用Nginx + Docker Swarm集群部署方案:
- Nginx配置示例:
nginx复制upstream backend {
server backend1:8080;
server backend2:8080;
keepalive 32;
}
server {
listen 80;
server_name campus-trade.example.com;
location / {
root /usr/share/nginx/html;
try_files $uri $uri/ /index.html;
}
location /api {
proxy_pass http://backend;
proxy_http_version 1.1;
proxy_set_header Connection "";
}
}
- Spring Boot应用Dockerfile:
dockerfile复制FROM openjdk:11-jre-slim
COPY target/campus-trade-backend-0.0.1-SNAPSHOT.jar app.jar
ENTRYPOINT ["java","-jar","/app.jar"]
7. 项目扩展方向
在实际开发过程中,我发现以下几个值得进一步优化的方向:
- 推荐系统集成
- 基于用户行为的协同过滤推荐
- 基于商品内容的相似推荐
- 移动端适配
- 开发微信小程序版本
- 开发Flutter跨平台应用
- 物流跟踪
- 集成快递100 API
- 校内自提点管理
- 信用体系
- 建立用户信用评分模型
- 引入校园卡认证
这个校园二手交易平台从技术实现到业务逻辑都有很多值得深入探讨的地方。我在开发过程中最大的体会是:校园场景下的产品设计要特别注重用户体验和安全性,技术方案的选择要兼顾开发效率和系统性能。
