一、个人简介
💖💖作者:计算机编程果茶熊 💙💙个人简介:曾长期从事计算机专业培训教学,担任过编程老师,同时本人也热爱上课教学,擅长Java、微信小程序、Python、Golang、安卓Android等多个IT方向。会做一些项目定制化开发、代码讲解、答辩教学、文档编写、也懂一些降重方面的技巧。平常喜欢分享一些自己开发中遇到的问题的解决办法,也喜欢交流技术,大家有技术代码这一块的问题可以问我! 💛💛想说的话:感谢大家的关注与支持! 💜💜 网站实战项目 安卓/小程序实战项目 大数据实战项目 计算机毕业设计选题 💕💕文末获取源码联系计算机编程果茶熊
二、系统介绍
开发语言:Java 后端框架:Spring Boot(Spring+SpringMVC+Mybatis) 前端:Vue 数据库:MySQL 系统架构:B/S 开发工具:IDEA(Java的)
三、视频解说
四、部分功能展示
五、部分代码展示
SparkSession spark = SparkSession.builder().appName("EcomAnalytics").master("local[*]").getOrCreate();
// ========== 核心功能1:用户管理(服务层业务处理)==========
public UserDTO createUser(UserCreateRequest req) {
if (req == null) throw new IllegalArgumentException("请求为空");
if (userMapper.findByUsername(req.getUsername()) != null) throw new BusinessException("用户名已存在");
String salt = UUID.randomUUID().toString().replace("-", "");
String hashed = DigestUtils.sha256Hex(req.getPassword() + salt);
User user = new User();
user.setUsername(req.getUsername());
user.setPassword(hashed);
user.setSalt(salt);
user.setEmail(req.getEmail());
user.setStatus(1);
userMapper.insert(user);
Role defaultRole = roleMapper.findByName("USER");
userRoleMapper.insert(new UserRole(user.getId(), defaultRole.getId()));
return UserDTO.fromEntity(user);
}
public UserDTO updateUserProfile(Long userId, UserProfileUpdateRequest req) {
User user = userMapper.selectById(userId);
if (user == null) throw new BusinessException("用户不存在");
if (req.getEmail() != null) user.setEmail(req.getEmail());
if (req.getDisplayName() != null) user.setDisplayName(req.getDisplayName());
user.setUpdatedAt(new Date());
userMapper.update(user);
return UserDTO.fromEntity(user);
}
// ========== 核心功能2:订单管理(下单、库存、取消、状态变更)==========
@Transactional
public OrderDTO createOrder(OrderCreateRequest req) {
if (req.getItems() == null || req.getItems().isEmpty()) throw new BusinessException("订单明细为空");
long orderId = idGenerator.nextId();
Order order = new Order();
order.setId(orderId);
order.setUserId(req.getUserId());
order.setStatus(OrderStatus.PENDING.name());
order.setTotalAmount(BigDecimal.ZERO);
orderMapper.insert(order);
BigDecimal total = BigDecimal.ZERO;
for (OrderItemRequest it : req.getItems()) {
Product p = productMapper.selectById(it.getProductId());
if (p == null) throw new BusinessException("商品不存在:" + it.getProductId());
if (p.getStock() < it.getQuantity()) throw new BusinessException("库存不足:" + p.getId());
productMapper.decreaseStock(p.getId(), it.getQuantity());
OrderItem oi = new OrderItem();
oi.setOrderId(orderId);
oi.setProductId(p.getId());
oi.setPrice(p.getPrice());
oi.setQuantity(it.getQuantity());
orderItemMapper.insert(oi);
total = total.add(p.getPrice().multiply(new BigDecimal(it.getQuantity())));
}
order.setTotalAmount(total);
order.setUpdatedAt(new Date());
orderMapper.update(order);
boolean paid = paymentService.charge(req.getPaymentInfo(), total);
if (!paid) { throw new BusinessException("支付失败"); }
order.setStatus(OrderStatus.PAID.name());
orderMapper.update(order);
kafkaTemplate.send("orders", JsonUtils.toJson(order));
return OrderDTO.fromEntity(order);
}
@Transactional
public CancelResult cancelOrder(Long orderId, Long userId) {
Order order = orderMapper.selectById(orderId);
if (order == null) return new CancelResult(false,"订单不存在");
if (!order.getUserId().equals(userId)) return new CancelResult(false,"无权限取消");
if (order.getStatus().equals(OrderStatus.SHIPPED.name()) || order.getStatus().equals(OrderStatus.CLOSED.name())) return new CancelResult(false,"无法取消");
order.setStatus(OrderStatus.CANCELED.name());
order.setUpdatedAt(new Date());
orderMapper.update(order);
List<OrderItem> items = orderItemMapper.findByOrderId(orderId);
for (OrderItem oi : items) { productMapper.increaseStock(oi.getProductId(), oi.getQuantity()); }
if (order.getStatus().equals(OrderStatus.PAID.name())) { refundService.refund(order); }
kafkaTemplate.send("order_cancellations", JsonUtils.toJson(Map.of("orderId",orderId,"userId",userId)));
return new CancelResult(true,"取消成功");
}
// ========== 核心功能3:可视化管理(基于Spark做批量统计与实时入库触发)==========
public List<DailySalesDTO> computeDailySales(LocalDate from, LocalDate to) {
String url = jdbcProps.getUrl();
String table = "orders";
Dataset<Row> df = spark.read().format("jdbc").option("url",url).option("dbtable",table).option("user",jdbcProps.getUser()).option("password",jdbcProps.getPassword()).load();
Dataset<Row> filtered = df.filter(df.col("status").equalTo("PAID")).select(df.col("id"),df.col("total_amount"),df.col("created_at"));
Dataset<Row> transformed = filtered.withColumn("day", functions.date_format(filtered.col("created_at"),"yyyy-MM-dd")).groupBy("day").agg(functions.sum("total_amount").alias("sales")).orderBy(functions.desc("day"));
List<Row> rows = transformed.collectAsList();
List<DailySalesDTO> result = new ArrayList<>();
for (Row r : rows) { DailySalesDTO d = new DailySalesDTO(); d.setDay(r.getString(0)); d.setSales(r.getDecimal(1)); result.add(d); }
return result;
}
public List<TopProductDTO> computeTopProducts(int topN) {
String url = jdbcProps.getUrl();
Dataset<Row> itemsDf = spark.read().format("jdbc").option("url",url).option("dbtable","order_items").option("user",jdbcProps.getUser()).option("password",jdbcProps.getPassword()).load();
Dataset<Row> agg = itemsDf.groupBy("product_id").agg(functions.sum(itemsDf.col("quantity")).alias("sold"),functions.sum(itemsDf.col("price").multiply(itemsDf.col("quantity"))).alias("revenue")).orderBy(functions.desc("sold")).limit(topN);
List<Row> rows = agg.collectAsList();
List<TopProductDTO> out = new ArrayList<>();
for (Row r : rows) { TopProductDTO t = new TopProductDTO(); t.setProductId(r.getLong(0)); t.setSold(r.getLong(1)); t.setRevenue(r.getDecimal(2)); out.add(t); }
return out;
}
public void refreshVisualizationCache() {
List<DailySalesDTO> days = computeDailySales(LocalDate.now().minusDays(30), LocalDate.now());
cacheService.put("dashboard:dailySales", days);
List<TopProductDTO> tops = computeTopProducts(10);
cacheService.put("dashboard:topProducts", tops);
kafkaTemplate.send("analytics_refresh", "ok");
}
六、部分文档展示
七、END
💕💕文末获取源码联系计算机编程果茶熊