【Java】数据可视化电商系统 SpringBoot+Vue框架 计算机毕业设计项目 Idea+Navicat+MySQL安装 附源码+文档+讲解

32 阅读3分钟

一、个人简介

💖💖作者:计算机编程果茶熊 💙💙个人简介:曾长期从事计算机专业培训教学,担任过编程老师,同时本人也热爱上课教学,擅长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

💕💕文末获取源码联系计算机编程果茶熊