前言
💖💖作者:计算机程序员小杨 💙💙个人简介:我是一名计算机相关专业的从业者,擅长Java、微信小程序、Python、Golang、安卓Android等多个IT方向。会做一些项目定制化开发、代码讲解、答辩教学、文档编写、也懂一些降重方面的技巧。热爱技术,喜欢钻研新工具和框架,也乐于通过代码解决实际问题,大家有技术代码这一块的问题可以问我! 💛💛想说的话:感谢大家的关注与支持! 💕💕文末获取源码联系 计算机程序员小杨 💜💜 网站实战项目 安卓/小程序实战项目 大数据实战项目 深度学习实战项目 计算机毕业设计选题 💜💜
一.开发工具简介
开发语言:Java+Python(两个版本都支持) 后端框架:Spring Boot(Spring+SpringMVC+Mybatis)+Django(两个版本都支持) 前端:Vue+ElementUI+HTML 数据库:MySQL 系统架构:B/S 开发工具:IDEA(Java的)或者PyCharm(Python的)
二.系统内容简介
校园淘二手交易平台是一个专门面向大学生群体的线上二手商品交易系统,采用B/S架构设计,基于Java语言和SpringBoot框架进行后端开发,前端使用Vue框架结合ElementUI组件库构建用户界面,数据存储采用MySQL数据库。该平台整合了完整的电商交易流程,包含系统首页展示、个人中心管理、用户注册登录、商品分类体系、商品信息发布与浏览、订单生成与跟踪、订单评价反馈、举报投诉处理、公告通知发布以及系统后台管理等核心功能模块。平台为校园内的学生提供了一个安全、便捷的二手物品交易环境,支持学生用户发布闲置物品信息、浏览购买所需商品、在线下单支付、评价交易体验等完整的交易操作。通过规范化的商品分类管理和订单流程控制,平台能够有效促进校园内物品的循环利用,为学生群体构建了一个专属的二手交易生态圈,解决了传统线下交易信息不对称、交易安全性低、交易效率差等问题。
三.系统功能演示
2026年校园创业热潮:校园淘二手交易平台SpringBoot开发正当时|计算机毕业设计|SpringBoot框架
四.系统界面展示
五.系统源码展示
import org.apache.spark.sql.SparkSession;
@RestController
@RequestMapping("/api")
public class CampusTradeController {
private SparkSession spark = SparkSession.builder().appName("CampusTradeAnalysis").master("local[*]").getOrCreate();
@PostMapping("/goods/publish")
public ResponseEntity<ApiResponse> publishGoods(@RequestBody GoodsInfo goodsInfo, HttpServletRequest request) {
String userId = JwtUtil.getUserIdFromToken(request.getHeader("Authorization"));
if (StringUtils.isEmpty(userId)) {
return ResponseEntity.ok(ApiResponse.error("用户未登录"));
}
if (StringUtils.isEmpty(goodsInfo.getGoodsName()) || goodsInfo.getGoodsName().length() > 50) {
return ResponseEntity.ok(ApiResponse.error("商品名称不能为空且长度不能超过50字符"));
}
if (goodsInfo.getPrice() == null || goodsInfo.getPrice().compareTo(BigDecimal.ZERO) <= 0) {
return ResponseEntity.ok(ApiResponse.error("商品价格必须大于0"));
}
if (StringUtils.isEmpty(goodsInfo.getDescription()) || goodsInfo.getDescription().length() > 500) {
return ResponseEntity.ok(ApiResponse.error("商品描述不能为空且长度不能超过500字符"));
}
if (goodsInfo.getCategoryId() == null || goodsInfo.getCategoryId() <= 0) {
return ResponseEntity.ok(ApiResponse.error("请选择正确的商品分类"));
}
GoodsCategory category = goodsCategoryService.getCategoryById(goodsInfo.getCategoryId());
if (category == null) {
return ResponseEntity.ok(ApiResponse.error("商品分类不存在"));
}
goodsInfo.setUserId(Long.parseLong(userId));
goodsInfo.setStatus(1);
goodsInfo.setCreateTime(new Date());
goodsInfo.setUpdateTime(new Date());
goodsInfo.setViewCount(0);
goodsInfoService.insertGoods(goodsInfo);
Dataset<Row> goodsData = spark.read().format("jdbc").option("url", "jdbc:mysql://localhost:3306/campus_trade").option("dbtable", "goods_info").option("user", "root").option("password", "123456").load();
goodsData.filter(col("user_id").equalTo(userId)).groupBy("category_id").count().show();
return ResponseEntity.ok(ApiResponse.success("商品发布成功"));
}
@PostMapping("/order/create")
public ResponseEntity<ApiResponse> createOrder(@RequestBody OrderCreateRequest request, HttpServletRequest httpRequest) {
String buyerId = JwtUtil.getUserIdFromToken(httpRequest.getHeader("Authorization"));
if (StringUtils.isEmpty(buyerId)) {
return ResponseEntity.ok(ApiResponse.error("用户未登录"));
}
if (request.getGoodsId() == null || request.getGoodsId() <= 0) {
return ResponseEntity.ok(ApiResponse.error("商品ID无效"));
}
if (request.getQuantity() == null || request.getQuantity() <= 0) {
return ResponseEntity.ok(ApiResponse.error("购买数量必须大于0"));
}
GoodsInfo goods = goodsInfoService.getGoodsById(request.getGoodsId());
if (goods == null) {
return ResponseEntity.ok(ApiResponse.error("商品不存在"));
}
if (goods.getStatus() != 1) {
return ResponseEntity.ok(ApiResponse.error("商品已下架或不可购买"));
}
if (goods.getUserId().equals(Long.parseLong(buyerId))) {
return ResponseEntity.ok(ApiResponse.error("不能购买自己发布的商品"));
}
if (goods.getStock() < request.getQuantity()) {
return ResponseEntity.ok(ApiResponse.error("商品库存不足"));
}
BigDecimal totalAmount = goods.getPrice().multiply(new BigDecimal(request.getQuantity()));
OrderInfo orderInfo = new OrderInfo();
orderInfo.setOrderNumber(generateOrderNumber());
orderInfo.setBuyerId(Long.parseLong(buyerId));
orderInfo.setSellerId(goods.getUserId());
orderInfo.setGoodsId(request.getGoodsId());
orderInfo.setQuantity(request.getQuantity());
orderInfo.setTotalAmount(totalAmount);
orderInfo.setStatus(1);
orderInfo.setCreateTime(new Date());
orderInfo.setUpdateTime(new Date());
orderInfoService.insertOrder(orderInfo);
goods.setStock(goods.getStock() - request.getQuantity());
goodsInfoService.updateGoods(goods);
Dataset<Row> orderData = spark.read().format("jdbc").option("url", "jdbc:mysql://localhost:3306/campus_trade").option("dbtable", "order_info").option("user", "root").option("password", "123456").load();
orderData.filter(col("buyer_id").equalTo(buyerId)).agg(sum("total_amount").alias("total_spent"), count("*").alias("order_count")).show();
return ResponseEntity.ok(ApiResponse.success("订单创建成功"));
}
@PostMapping("/user/register")
public ResponseEntity<ApiResponse> registerUser(@RequestBody UserRegisterRequest request) {
if (StringUtils.isEmpty(request.getUsername()) || request.getUsername().length() < 3 || request.getUsername().length() > 20) {
return ResponseEntity.ok(ApiResponse.error("用户名长度必须在3-20字符之间"));
}
if (!Pattern.matches("^[a-zA-Z0-9_]+__CODEBLOCK_0__quot;, request.getUsername())) {
return ResponseEntity.ok(ApiResponse.error("用户名只能包含字母、数字和下划线"));
}
if (StringUtils.isEmpty(request.getPassword()) || request.getPassword().length() < 6) {
return ResponseEntity.ok(ApiResponse.error("密码长度不能少于6位"));
}
if (StringUtils.isEmpty(request.getEmail()) || !Pattern.matches("^[\\w-\\.]+@([\\w-]+\\.)+[\\w-]{2,4}__CODEBLOCK_0__quot;, request.getEmail())) {
return ResponseEntity.ok(ApiResponse.error("邮箱格式不正确"));
}
if (StringUtils.isEmpty(request.getPhone()) || !Pattern.matches("^1[3-9]\\d{9}__CODEBLOCK_0__quot;, request.getPhone())) {
return ResponseEntity.ok(ApiResponse.error("手机号格式不正确"));
}
UserInfo existUser = userInfoService.getUserByUsername(request.getUsername());
if (existUser != null) {
return ResponseEntity.ok(ApiResponse.error("用户名已存在"));
}
existUser = userInfoService.getUserByEmail(request.getEmail());
if (existUser != null) {
return ResponseEntity.ok(ApiResponse.error("邮箱已被注册"));
}
existUser = userInfoService.getUserByPhone(request.getPhone());
if (existUser != null) {
return ResponseEntity.ok(ApiResponse.error("手机号已被注册"));
}
UserInfo userInfo = new UserInfo();
userInfo.setUsername(request.getUsername());
userInfo.setPassword(BCryptUtil.encode(request.getPassword()));
userInfo.setEmail(request.getEmail());
userInfo.setPhone(request.getPhone());
userInfo.setNickname(request.getUsername());
userInfo.setStatus(1);
userInfo.setCreateTime(new Date());
userInfo.setUpdateTime(new Date());
userInfoService.insertUser(userInfo);
Dataset<Row> userData = spark.read().format("jdbc").option("url", "jdbc:mysql://localhost:3306/campus_trade").option("dbtable", "user_info").option("user", "root").option("password", "123456").load();
userData.groupBy("status").count().show();
return ResponseEntity.ok(ApiResponse.success("用户注册成功"));
}
}
六.系统文档展示
结束
💕💕文末获取源码联系 计算机程序员小杨