一、个人简介
- 💖💖作者:计算机编程果茶熊
- 💙💙个人简介:曾长期从事计算机专业培训教学,担任过编程老师,同时本人也热爱上课教学,擅长Java、微信小程序、Python、Golang、安卓Android等多个IT方向。会做一些项目定制化开发、代码讲解、答辩教学、文档编写、也懂一些降重方面的技巧。平常喜欢分享一些自己开发中遇到的问题的解决办法,也喜欢交流技术,大家有技术代码这一块的问题可以问我!
- 💛💛想说的话:感谢大家的关注与支持!
- 💜💜
- 网站实战项目
- 安卓/小程序实战项目
- 大数据实战项目
- 计算机毕业设计选题
- 💕💕文末获取源码联系计算机编程果茶熊
二、系统介绍
- 后端开发语言:Java+Python(两个版本都支持)
- 后端框架:Spring Boot(Spring+SpringMVC+Mybatis)+Django(两个版本都支持)
- 前端:uni-app+微信小程序+安卓
- 数据库:MySQL
- 系统架构:C/S + B/S
- 开发工具:IDEA(Java的)或者PyCharm(Python的)+微信小程序开发工具
SpringBoot+Android校园互助平台是一款专为高校学生设计的综合性服务应用系统,采用SpringBoot作为后端核心框架,结合Android原生开发、uni-app跨平台技术以及微信小程序,构建了完整的C/S+B/S混合架构。该系统以MySQL数据库为数据存储基础,通过Java后端服务为用户提供全方位的校园互助服务。平台核心功能涵盖跑腿服务、物品代购、信息发布、订单管理等多个方面,用户可以通过系统发布跑腿需求、寻找接单人员、管理配送流程以及处理收货确认等操作。系统还集成了完善的论坛交流模块,支持分类讨论、举报管理等社区功能,为校园师生提供了便捷的信息交流平台。平台采用统一的用户管理体系,支持充值、订单跟踪、个人信息管理等个性化服务,通过物品分类管理和智能推荐算法,提高了服务匹配效率。整个系统界面友好、操作简便,充分考虑了大学生群体的使用习惯和实际需求,为构建和谐便民的校园生活环境提供了有力的技术支撑。
三、视频解说
大学导师力荐:SpringBoot+Android校园互助平台成2026年最优毕设项目
四、部分功能展示
五、部分代码展示
import org.apache.spark.sql.SparkSession;
import org.apache.spark.sql.Dataset;
import org.apache.spark.sql.Row;
import org.springframework.stereotype.Service;
import org.springframework.beans.factory.annotation.Autowired;
import javax.annotation.PostConstruct;
@Service
public class ErrandTaskService {
private SparkSession spark;
@Autowired
private ErrandTaskMapper errandTaskMapper;
@PostConstruct
public void initSpark() {
spark = SparkSession.builder()
.appName("CampusErrandAnalysis")
.master("local[*]")
.getOrCreate();
}
public Result publishErrandTask(ErrandTaskDTO taskDTO) {
ErrandTask task = new ErrandTask();
task.setUserId(taskDTO.getUserId());
task.setTaskTitle(taskDTO.getTaskTitle());
task.setTaskDescription(taskDTO.getTaskDescription());
task.setTaskType(taskDTO.getTaskType());
task.setPickupLocation(taskDTO.getPickupLocation());
task.setDeliveryLocation(taskDTO.getDeliveryLocation());
task.setTaskFee(taskDTO.getTaskFee());
task.setExpectedTime(taskDTO.getExpectedTime());
task.setTaskStatus("PENDING");
task.setCreateTime(new Date());
task.setUpdateTime(new Date());
if (taskDTO.getTaskFee() == null || taskDTO.getTaskFee().compareTo(BigDecimal.ZERO) <= 0) {
return Result.error("跑腿费用必须大于0");
}
if (StringUtils.isEmpty(taskDTO.getPickupLocation()) || StringUtils.isEmpty(taskDTO.getDeliveryLocation())) {
return Result.error("取货地址和送达地址不能为空");
}
int result = errandTaskMapper.insertErrandTask(task);
if (result > 0) {
Dataset<Row> taskData = spark.read()
.format("jdbc")
.option("url", "jdbc:mysql://localhost:3306/campus_help")
.option("dbtable", "errand_task")
.option("user", "root")
.option("password", "password")
.load();
taskData.filter("task_type = '" + taskDTO.getTaskType() + "'")
.groupBy("pickup_location")
.count()
.show();
return Result.success("跑腿任务发布成功", task);
}
return Result.error("跑腿任务发布失败");
}
public Result acceptErrandTask(Long taskId, Long accepterId) {
ErrandTask task = errandTaskMapper.selectByTaskId(taskId);
if (task == null) {
return Result.error("跑腿任务不存在");
}
if (!"PENDING".equals(task.getTaskStatus())) {
return Result.error("该任务已被接单或已完成");
}
if (task.getUserId().equals(accepterId)) {
return Result.error("不能接受自己发布的任务");
}
User accepter = userMapper.selectByUserId(accepterId);
if (accepter == null || accepter.getAccountStatus() != 1) {
return Result.error("接单人账户状态异常");
}
task.setAccepterId(accepterId);
task.setTaskStatus("ACCEPTED");
task.setAcceptTime(new Date());
task.setUpdateTime(new Date());
int updateResult = errandTaskMapper.updateErrandTask(task);
if (updateResult > 0) {
AcceptRecord record = new AcceptRecord();
record.setTaskId(taskId);
record.setAccepterId(accepterId);
record.setAcceptTime(new Date());
acceptRecordMapper.insertAcceptRecord(record);
return Result.success("接单成功");
}
return Result.error("接单失败");
}
}
@Service
public class OrderManagementService {
private SparkSession spark;
@Autowired
private OrderMapper orderMapper;
@Autowired
private PaymentService paymentService;
@PostConstruct
public void initSpark() {
spark = SparkSession.builder()
.appName("OrderDataAnalysis")
.master("local[*]")
.getOrCreate();
}
public Result createOrder(OrderCreateDTO orderDTO) {
Order order = new Order();
order.setUserId(orderDTO.getUserId());
order.setTaskId(orderDTO.getTaskId());
order.setOrderType(orderDTO.getOrderType());
order.setTotalAmount(orderDTO.getTotalAmount());
order.setOrderStatus("CREATED");
order.setCreateTime(new Date());
order.setUpdateTime(new Date());
String orderNo = generateOrderNumber();
order.setOrderNo(orderNo);
if (orderDTO.getTotalAmount() == null || orderDTO.getTotalAmount().compareTo(BigDecimal.ZERO) <= 0) {
return Result.error("订单金额必须大于0");
}
ErrandTask task = errandTaskMapper.selectByTaskId(orderDTO.getTaskId());
if (task == null || !"ACCEPTED".equals(task.getTaskStatus())) {
return Result.error("关联的跑腿任务状态异常");
}
User user = userMapper.selectByUserId(orderDTO.getUserId());
if (user == null || user.getBalance().compareTo(orderDTO.getTotalAmount()) < 0) {
return Result.error("用户余额不足");
}
int insertResult = orderMapper.insertOrder(order);
if (insertResult > 0) {
Dataset<Row> orderData = spark.read()
.format("jdbc")
.option("url", "jdbc:mysql://localhost:3306/campus_help")
.option("dbtable", "order_info")
.option("user", "root")
.option("password", "password")
.load();
orderData.filter("order_status = 'CREATED'")
.groupBy("order_type")
.agg(functions.sum("total_amount").alias("total_revenue"))
.show();
return Result.success("订单创建成功", order);
}
return Result.error("订单创建失败");
}
public Result processPayment(Long orderId, String paymentMethod) {
Order order = orderMapper.selectByOrderId(orderId);
if (order == null) {
return Result.error("订单不存在");
}
if (!"CREATED".equals(order.getOrderStatus())) {
return Result.error("订单状态异常,无法支付");
}
User user = userMapper.selectByUserId(order.getUserId());
if (user.getBalance().compareTo(order.getTotalAmount()) < 0) {
return Result.error("余额不足,请先充值");
}
PaymentRecord payment = new PaymentRecord();
payment.setOrderId(orderId);
payment.setUserId(order.getUserId());
payment.setPaymentAmount(order.getTotalAmount());
payment.setPaymentMethod(paymentMethod);
payment.setPaymentStatus("SUCCESS");
payment.setPaymentTime(new Date());
user.setBalance(user.getBalance().subtract(order.getTotalAmount()));
userMapper.updateUser(user);
order.setOrderStatus("PAID");
order.setPaymentTime(new Date());
order.setUpdateTime(new Date());
orderMapper.updateOrder(order);
paymentRecordMapper.insertPaymentRecord(payment);
ErrandTask task = errandTaskMapper.selectByTaskId(order.getTaskId());
task.setTaskStatus("IN_PROGRESS");
task.setUpdateTime(new Date());
errandTaskMapper.updateErrandTask(task);
return Result.success("支付成功");
}
public Result updateOrderStatus(Long orderId, String newStatus) {
Order order = orderMapper.selectByOrderId(orderId);
if (order == null) {
return Result.error("订单不存在");
}
String currentStatus = order.getOrderStatus();
if (!isValidStatusTransition(currentStatus, newStatus)) {
return Result.error("订单状态流转异常");
}
order.setOrderStatus(newStatus);
order.setUpdateTime(new Date());
if ("COMPLETED".equals(newStatus)) {
order.setCompleteTime(new Date());
ErrandTask task = errandTaskMapper.selectByTaskId(order.getTaskId());
task.setTaskStatus("COMPLETED");
task.setCompleteTime(new Date());
errandTaskMapper.updateErrandTask(task);
User accepter = userMapper.selectByUserId(task.getAccepterId());
BigDecimal commission = order.getTotalAmount().multiply(new BigDecimal("0.95"));
accepter.setBalance(accepter.getBalance().add(commission));
userMapper.updateUser(accepter);
}
int updateResult = orderMapper.updateOrder(order);
return updateResult > 0 ? Result.success("订单状态更新成功") : Result.error("订单状态更新失败");
}
}
@Service
public class UserManagementService {
private SparkSession spark;
@Autowired
private UserMapper userMapper;
@Autowired
private TokenService tokenService;
@PostConstruct
public void initSpark() {
spark = SparkSession.builder()
.appName("UserBehaviorAnalysis")
.master("local[*]")
.getOrCreate();
}
public Result registerUser(UserRegisterDTO registerDTO) {
if (StringUtils.isEmpty(registerDTO.getUsername()) || registerDTO.getUsername().length() < 3) {
return Result.error("用户名长度不能少于3位");
}
if (StringUtils.isEmpty(registerDTO.getPassword()) || registerDTO.getPassword().length() < 6) {
return Result.error("密码长度不能少于6位");
}
if (!isValidEmail(registerDTO.getEmail())) {
return Result.error("邮箱格式不正确");
}
if (!isValidPhone(registerDTO.getPhone())) {
return Result.error("手机号格式不正确");
}
User existUser = userMapper.selectByUsername(registerDTO.getUsername());
if (existUser != null) {
return Result.error("用户名已存在");
}
existUser = userMapper.selectByEmail(registerDTO.getEmail());
if (existUser != null) {
return Result.error("邮箱已被注册");
}
existUser = userMapper.selectByPhone(registerDTO.getPhone());
if (existUser != null) {
return Result.error("手机号已被注册");
}
User newUser = new User();
newUser.setUsername(registerDTO.getUsername());
newUser.setPassword(passwordEncoder.encode(registerDTO.getPassword()));
newUser.setEmail(registerDTO.getEmail());
newUser.setPhone(registerDTO.getPhone());
newUser.setNickname(registerDTO.getNickname());
newUser.setGender(registerDTO.getGender());
newUser.setAccountStatus(1);
newUser.setBalance(new BigDecimal("0.00"));
newUser.setCreateTime(new Date());
newUser.setUpdateTime(new Date());
int insertResult = userMapper.insertUser(newUser);
if (insertResult > 0) {
Dataset<Row> userData = spark.read()
.format("jdbc")
.option("url", "jdbc:mysql://localhost:3306/campus_help")
.option("dbtable", "user_info")
.option("user", "root")
.option("password", "password")
.load();
userData.groupBy("gender")
.count()
.show();
return Result.success("注册成功", newUser);
}
return Result.error("注册失败");
}
public Result loginUser(UserLoginDTO loginDTO) {
if (StringUtils.isEmpty(loginDTO.getUsername()) || StringUtils.isEmpty(loginDTO.getPassword())) {
return Result.error("用户名和密码不能为空");
}
User user = userMapper.selectByUsername(loginDTO.getUsername());
if (user == null) {
user = userMapper.selectByEmail(loginDTO.getUsername());
}
if (user == null) {
user = userMapper.selectByPhone(loginDTO.getUsername());
}
if (user == null) {
return Result.error("用户不存在");
}
if (user.getAccountStatus() != 1) {
return Result.error("账户已被禁用");
}
if (!passwordEncoder.matches(loginDTO.getPassword(), user.getPassword())) {
return Result.error("密码错误");
}
String token = tokenService.generateToken(user.getUserId());
user.setLastLoginTime(new Date());
user.setLoginCount(user.getLoginCount() + 1);
userMapper.updateUser(user);
LoginRecord loginRecord = new LoginRecord();
loginRecord.setUserId(user.getUserId());
loginRecord.setLoginTime(new Date());
loginRecord.setLoginIp(getClientIP());
loginRecordMapper.insertLoginRecord(loginRecord);
Map<String, Object> result = new HashMap<>();
result.put("token", token);
result.put("userInfo", user);
return Result.success("登录成功", result);
}
public Result updateUserProfile(Long userId, UserUpdateDTO updateDTO) {
User user = userMapper.selectByUserId(userId);
if (user == null) {
return Result.error("用户不存在");
}
if (StringUtils.isNotEmpty(updateDTO.getNickname())) {
user.setNickname(updateDTO.getNickname());
}
if (StringUtils.isNotEmpty(updateDTO.getAvatar())) {
user.setAvatar(updateDTO.getAvatar());
}
if (updateDTO.getGender() != null) {
user.setGender(updateDTO.getGender());
}
if (StringUtils.isNotEmpty(updateDTO.getSchool())) {
user.setSchool(updateDTO.getSchool());
}
if (StringUtils.isNotEmpty(updateDTO.getMajor())) {
user.setMajor(updateDTO.getMajor());
}
if (StringUtils.isNotEmpty(updateDTO.getStudentId())) {
User existUser = userMapper.selectByStudentId(updateDTO.getStudentId());
if (existUser != null && !existUser.getUserId().equals(userId)) {
return Result.error("学号已被其他用户绑定");
}
user.setStudentId(updateDTO.getStudentId());
}
user.setUpdateTime(new Date());
int updateResult = userMapper.updateUser(user);
return updateResult > 0 ? Result.success("用户信息更新成功", user) : Result.error("用户信息更新失败");
}
}
六、部分文档展示
七、END
💕💕文末获取源码联系计算机编程果茶熊