一、个人简介
- 💖💖作者:计算机编程果茶熊
- 💙💙个人简介:曾长期从事计算机专业培训教学,担任过编程老师,同时本人也热爱上课教学,擅长Java、微信小程序、Python、Golang、安卓Android等多个IT方向。会做一些项目定制化开发、代码讲解、答辩教学、文档编写、也懂一些降重方面的技巧。平常喜欢分享一些自己开发中遇到的问题的解决办法,也喜欢交流技术,大家有技术代码这一块的问题可以问我!
- 💛💛想说的话:感谢大家的关注与支持!
- 💜💜
- 网站实战项目
- 安卓/小程序实战项目
- 大数据实战项目
- 计算机毕业设计选题
- 💕💕文末获取源码联系计算机编程果茶熊
二、系统介绍
- 后端开发语言:Java
- 后端框架:Spring Boot(Spring+SpringMVC+Mybatis)
- 前端:微信小程序
- 数据库:MySQL
- 系统架构:C/S
- 开发工具:微信小程序开发工具
家乡扶贫助农小程序是基于微信生态构建的乡村振兴数字化平台,采用Spring Boot框架作为后端核心,结合MySQL数据库实现数据持久化存储。该系统通过微信小程序为载体,为农户、消费者和管理员提供便捷的线上服务。系统涵盖用户管理、商品分类管理、农产品管理、扶贫项目管理、系统管理、订单管理和个人中心七大核心功能模块。用户管理模块负责农户和消费者的注册认证与权限分配,商品分类管理为农产品提供科学的分类体系,农产品管理模块支持农户发布展示自家产品信息,扶贫项目管理整合当地扶贫资源并提供项目跟踪功能。订单管理模块处理交易流程,确保买卖双方权益,个人中心为用户提供个性化服务界面。整个系统通过C/S架构设计,确保数据传输的稳定性和安全性,为促进农村电商发展和精准扶贫工作提供技术支撑。
三、视频解说
四、部分功能展示
五、部分代码展示
import org.apache.spark.sql.SparkSession;
import org.apache.spark.sql.Dataset;
import org.apache.spark.sql.Row;
public class CoreFunctionService {
private SparkSession spark = SparkSession.builder().appName("PovertyReliefSystem").master("local[*]").getOrCreate();
@Service
@Transactional
public class ProductManagementService {
public ProductManagementResult addProduct(ProductInfo productInfo) {
if (productInfo.getProductName() == null || productInfo.getProductName().trim().isEmpty()) {
return new ProductManagementResult(false, "产品名称不能为空");
}
if (productInfo.getPrice() <= 0) {
return new ProductManagementResult(false, "产品价格必须大于0");
}
if (productInfo.getStock() < 0) {
return new ProductManagementResult(false, "库存数量不能为负数");
}
Product existingProduct = productMapper.findByNameAndFarmerId(productInfo.getProductName(), productInfo.getFarmerId());
if (existingProduct != null) {
return new ProductManagementResult(false, "该农户已存在同名产品");
}
Product product = new Product();
product.setProductName(productInfo.getProductName());
product.setDescription(productInfo.getDescription());
product.setPrice(productInfo.getPrice());
product.setStock(productInfo.getStock());
product.setCategoryId(productInfo.getCategoryId());
product.setFarmerId(productInfo.getFarmerId());
product.setImages(String.join(",", productInfo.getImages()));
product.setStatus(ProductStatus.PENDING_REVIEW);
product.setCreateTime(new Date());
product.setUpdateTime(new Date());
try {
int result = productMapper.insertProduct(product);
if (result > 0) {
logService.addOperationLog("产品管理", "添加产品", "成功添加产品:" + product.getProductName());
Dataset<Row> productData = spark.sql("SELECT * FROM products WHERE farmer_id = " + productInfo.getFarmerId());
long totalProducts = productData.count();
if (totalProducts > 10) {
farmerService.updateFarmerLevel(productInfo.getFarmerId(), "高级农户");
}
return new ProductManagementResult(true, "产品添加成功", product.getId());
} else {
return new ProductManagementResult(false, "产品添加失败");
}
} catch (Exception e) {
logService.addErrorLog("产品管理", "添加产品失败", e.getMessage());
throw new RuntimeException("产品添加过程中发生异常", e);
}
}
public ProductManagementResult updateProductStock(Long productId, Integer newStock, String operationType) {
if (productId == null || productId <= 0) {
return new ProductManagementResult(false, "产品ID无效");
}
if (newStock < 0) {
return new ProductManagementResult(false, "库存数量不能为负数");
}
Product product = productMapper.findById(productId);
if (product == null) {
return new ProductManagementResult(false, "产品不存在");
}
Integer oldStock = product.getStock();
product.setStock(newStock);
product.setUpdateTime(new Date());
if (newStock == 0) {
product.setStatus(ProductStatus.OUT_OF_STOCK);
} else if (product.getStatus() == ProductStatus.OUT_OF_STOCK) {
product.setStatus(ProductStatus.AVAILABLE);
}
try {
int result = productMapper.updateProduct(product);
if (result > 0) {
StockRecord stockRecord = new StockRecord();
stockRecord.setProductId(productId);
stockRecord.setOldStock(oldStock);
stockRecord.setNewStock(newStock);
stockRecord.setOperationType(operationType);
stockRecord.setOperationTime(new Date());
stockRecordMapper.insertStockRecord(stockRecord);
logService.addOperationLog("库存管理", "更新库存", "产品ID:" + productId + ",原库存:" + oldStock + ",新库存:" + newStock);
return new ProductManagementResult(true, "库存更新成功");
} else {
return new ProductManagementResult(false, "库存更新失败");
}
} catch (Exception e) {
logService.addErrorLog("库存管理", "更新库存失败", e.getMessage());
throw new RuntimeException("库存更新过程中发生异常", e);
}
}
}
@Service
@Transactional
public class PovertyReliefProjectService {
public ProjectManagementResult createProject(ProjectCreationRequest request) {
if (request.getProjectName() == null || request.getProjectName().trim().isEmpty()) {
return new ProjectManagementResult(false, "项目名称不能为空");
}
if (request.getTargetAmount() <= 0) {
return new ProjectManagementResult(false, "目标金额必须大于0");
}
if (request.getStartDate().after(request.getEndDate())) {
return new ProjectManagementResult(false, "开始时间不能晚于结束时间");
}
if (request.getBeneficiaryCount() <= 0) {
return new ProjectManagementResult(false, "受益人数必须大于0");
}
PovertyReliefProject existingProject = projectMapper.findByName(request.getProjectName());
if (existingProject != null) {
return new ProjectManagementResult(false, "项目名称已存在");
}
PovertyReliefProject project = new PovertyReliefProject();
project.setProjectName(request.getProjectName());
project.setDescription(request.getDescription());
project.setTargetAmount(request.getTargetAmount());
project.setCurrentAmount(BigDecimal.ZERO);
project.setStartDate(request.getStartDate());
project.setEndDate(request.getEndDate());
project.setBeneficiaryCount(request.getBeneficiaryCount());
project.setProjectType(request.getProjectType());
project.setRegion(request.getRegion());
project.setStatus(ProjectStatus.PENDING_APPROVAL);
project.setCreateTime(new Date());
project.setUpdateTime(new Date());
project.setCreatorId(request.getCreatorId());
try {
int result = projectMapper.insertProject(project);
if (result > 0) {
ProjectProgress initialProgress = new ProjectProgress();
initialProgress.setProjectId(project.getId());
initialProgress.setProgressDescription("项目创建成功,等待审批");
initialProgress.setProgressDate(new Date());
initialProgress.setProgressPercentage(0);
projectProgressMapper.insertProgress(initialProgress);
logService.addOperationLog("扶贫项目", "创建项目", "成功创建项目:" + project.getProjectName());
Dataset<Row> projectAnalysis = spark.sql("SELECT project_type, COUNT(*) as count FROM poverty_relief_projects GROUP BY project_type");
projectAnalysis.show();
notificationService.sendProjectCreationNotification(project);
return new ProjectManagementResult(true, "项目创建成功", project.getId());
} else {
return new ProjectManagementResult(false, "项目创建失败");
}
} catch (Exception e) {
logService.addErrorLog("扶贫项目", "创建项目失败", e.getMessage());
throw new RuntimeException("项目创建过程中发生异常", e);
}
}
public ProjectManagementResult donateToProject(Long projectId, BigDecimal donationAmount, Long donorId) {
if (projectId == null || projectId <= 0) {
return new ProjectManagementResult(false, "项目ID无效");
}
if (donationAmount.compareTo(BigDecimal.ZERO) <= 0) {
return new ProjectManagementResult(false, "捐款金额必须大于0");
}
if (donationAmount.compareTo(new BigDecimal("100000")) > 0) {
return new ProjectManagementResult(false, "单次捐款金额不能超过10万元");
}
PovertyReliefProject project = projectMapper.findById(projectId);
if (project == null) {
return new ProjectManagementResult(false, "项目不存在");
}
if (project.getStatus() != ProjectStatus.ACTIVE) {
return new ProjectManagementResult(false, "项目当前状态不允许捐款");
}
if (new Date().after(project.getEndDate())) {
return new ProjectManagementResult(false, "项目已结束,不能继续捐款");
}
User donor = userMapper.findById(donorId);
if (donor == null || donor.getAccountBalance().compareTo(donationAmount) < 0) {
return new ProjectManagementResult(false, "账户余额不足");
}
try {
BigDecimal newCurrentAmount = project.getCurrentAmount().add(donationAmount);
project.setCurrentAmount(newCurrentAmount);
project.setUpdateTime(new Date());
if (newCurrentAmount.compareTo(project.getTargetAmount()) >= 0) {
project.setStatus(ProjectStatus.COMPLETED);
}
int projectUpdateResult = projectMapper.updateProject(project);
if (projectUpdateResult <= 0) {
throw new RuntimeException("项目金额更新失败");
}
donor.setAccountBalance(donor.getAccountBalance().subtract(donationAmount));
int donorUpdateResult = userMapper.updateUser(donor);
if (donorUpdateResult <= 0) {
throw new RuntimeException("捐赠者余额更新失败");
}
DonationRecord donationRecord = new DonationRecord();
donationRecord.setProjectId(projectId);
donationRecord.setDonorId(donorId);
donationRecord.setDonationAmount(donationAmount);
donationRecord.setDonationTime(new Date());
donationRecord.setStatus("SUCCESS");
donationRecordMapper.insertDonationRecord(donationRecord);
BigDecimal progressPercentage = newCurrentAmount.divide(project.getTargetAmount(), 4, RoundingMode.HALF_UP).multiply(new BigDecimal("100"));
ProjectProgress progress = new ProjectProgress();
progress.setProjectId(projectId);
progress.setProgressDescription("收到捐款 " + donationAmount + " 元");
progress.setProgressDate(new Date());
progress.setProgressPercentage(progressPercentage.intValue());
projectProgressMapper.insertProgress(progress);
logService.addOperationLog("扶贫捐款", "项目捐款", "用户ID:" + donorId + "向项目ID:" + projectId + "捐款" + donationAmount + "元");
return new ProjectManagementResult(true, "捐款成功", projectId);
} catch (Exception e) {
logService.addErrorLog("扶贫捐款", "捐款失败", e.getMessage());
throw new RuntimeException("捐款过程中发生异常", e);
}
}
}
@Service
@Transactional
public class OrderManagementService {
public OrderManagementResult createOrder(OrderCreationRequest request) {
if (request.getUserId() == null || request.getUserId() <= 0) {
return new OrderManagementResult(false, "用户ID无效");
}
if (request.getOrderItems() == null || request.getOrderItems().isEmpty()) {
return new OrderManagementResult(false, "订单商品不能为空");
}
User user = userMapper.findById(request.getUserId());
if (user == null) {
return new OrderManagementResult(false, "用户不存在");
}
BigDecimal totalAmount = BigDecimal.ZERO;
List<OrderItem> validOrderItems = new ArrayList<>();
for (OrderItemRequest itemRequest : request.getOrderItems()) {
Product product = productMapper.findById(itemRequest.getProductId());
if (product == null) {
return new OrderManagementResult(false, "商品ID " + itemRequest.getProductId() + " 不存在");
}
if (product.getStatus() != ProductStatus.AVAILABLE) {
return new OrderManagementResult(false, "商品 " + product.getProductName() + " 当前不可购买");
}
if (product.getStock() < itemRequest.getQuantity()) {
return new OrderManagementResult(false, "商品 " + product.getProductName() + " 库存不足");
}
OrderItem orderItem = new OrderItem();
orderItem.setProductId(itemRequest.getProductId());
orderItem.setProductName(product.getProductName());
orderItem.setQuantity(itemRequest.getQuantity());
orderItem.setPrice(product.getPrice());
BigDecimal itemTotal = product.getPrice().multiply(new BigDecimal(itemRequest.getQuantity()));
orderItem.setSubtotal(itemTotal);
totalAmount = totalAmount.add(itemTotal);
validOrderItems.add(orderItem);
}
if (user.getAccountBalance().compareTo(totalAmount) < 0) {
return new OrderManagementResult(false, "账户余额不足,当前余额:" + user.getAccountBalance() + ",需要支付:" + totalAmount);
}
String orderNumber = generateOrderNumber();
Order order = new Order();
order.setOrderNumber(orderNumber);
order.setUserId(request.getUserId());
order.setTotalAmount(totalAmount);
order.setStatus(OrderStatus.PENDING_PAYMENT);
order.setCreateTime(new Date());
order.setUpdateTime(new Date());
order.setShippingAddress(request.getShippingAddress());
order.setContactPhone(request.getContactPhone());
order.setRemark(request.getRemark());
try {
int orderResult = orderMapper.insertOrder(order);
if (orderResult <= 0) {
throw new RuntimeException("订单创建失败");
}
for (OrderItem orderItem : validOrderItems) {
orderItem.setOrderId(order.getId());
orderItemMapper.insertOrderItem(orderItem);
Product product = productMapper.findById(orderItem.getProductId());
product.setStock(product.getStock() - orderItem.getQuantity());
if (product.getStock() == 0) {
product.setStatus(ProductStatus.OUT_OF_STOCK);
}
productMapper.updateProduct(product);
}
user.setAccountBalance(user.getAccountBalance().subtract(totalAmount));
userMapper.updateUser(user);
order.setStatus(OrderStatus.PAID);
order.setPayTime(new Date());
orderMapper.updateOrder(order);
logService.addOperationLog("订单管理", "创建订单", "用户ID:" + request.getUserId() + "创建订单,金额:" + totalAmount);
Dataset<Row> orderAnalysis = spark.sql("SELECT DATE(create_time) as order_date, SUM(total_amount) as daily_sales FROM orders WHERE DATE(create_time) = CURDATE() GROUP BY DATE(create_time)");
orderAnalysis.show();
return new OrderManagementResult(true, "订单创建成功", order.getId(), orderNumber);
} catch (Exception e) {
logService.addErrorLog("订单管理", "创建订单失败", e.getMessage());
throw new RuntimeException("订单创建过程中发生异常", e);
}
}
public OrderManagementResult processOrderShipment(Long orderId, String trackingNumber, String shippingCompany) {
if (orderId == null || orderId <= 0) {
return new OrderManagementResult(false, "订单ID无效");
}
if (trackingNumber == null || trackingNumber.trim().isEmpty()) {
return new OrderManagementResult(false, "快递单号不能为空");
}
if (shippingCompany == null || shippingCompany.trim().isEmpty()) {
return new OrderManagementResult(false, "快递公司不能为空");
}
Order order = orderMapper.findById(orderId);
if (order == null) {
return new OrderManagementResult(false, "订单不存在");
}
if (order.getStatus() != OrderStatus.PAID) {
return new OrderManagementResult(false, "订单状态不允许发货,当前状态:" + order.getStatus());
}
try {
order.setStatus(OrderStatus.SHIPPED);
order.setTrackingNumber(trackingNumber);
order.setShippingCompany(shippingCompany);
order.setShipTime(new Date());
order.setUpdateTime(new Date());
int updateResult = orderMapper.updateOrder(order);
if (updateResult <= 0) {
throw new RuntimeException("订单状态更新失败");
}
OrderStatusHistory statusHistory = new OrderStatusHistory();
statusHistory.setOrderId(orderId);
statusHistory.setOldStatus(OrderStatus.PAID.toString());
statusHistory.setNewStatus(OrderStatus.SHIPPED.toString());
statusHistory.setChangeTime(new Date());
statusHistory.setRemark("订单已发货,快递公司:" + shippingCompany + ",快递单号:" + trackingNumber);
orderStatusHistoryMapper.insertStatusHistory(statusHistory);
User user = userMapper.findById(order.getUserId());
if (user != null) {
notificationService.sendShipmentNotification(user.getPhone(), order.getOrderNumber(), trackingNumber, shippingCompany);
}
logService.addOperationLog("订单管理", "订单发货", "订单号:" + order.getOrderNumber() + ",快递公司:" + shippingCompany + ",快递单号:" + trackingNumber);
return new OrderManagementResult(true, "订单发货成功", orderId);
} catch (Exception e) {
logService.addErrorLog("订单管理", "订单发货失败", e.getMessage());
throw new RuntimeException("订单发货过程中发生异常", e);
}
}
private String generateOrderNumber() {
SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMddHHmmss");
String timeStr = sdf.format(new Date());
String randomStr = String.valueOf((int) (Math.random() * 9000) + 1000);
return "ORD" + timeStr + randomStr;
}
}
}
六、部分文档展示
七、END
💕💕文末获取源码联系计算机编程果茶熊