diff --git a/flower_back/src/main/java/com/example/flower/service/FlowerService.java b/flower_back/src/main/java/com/example/flower/service/FlowerService.java new file mode 100644 index 0000000..a67545b --- /dev/null +++ b/flower_back/src/main/java/com/example/flower/service/FlowerService.java @@ -0,0 +1,149 @@ +package com.example.flower.service; + +import cn.hutool.core.collection.CollectionUtil; +import com.example.flower.entity.*; +import com.example.flower.mapper.*; +import com.example.flower.service.impl.FlowerServiceImpl; +import com.github.pagehelper.PageHelper; +import com.github.pagehelper.PageInfo; +import jakarta.annotation.Resource; +import org.springframework.stereotype.Service; +import com.example.flower.unit.UserCF; + +import java.util.ArrayList; +import java.util.List; +import java.util.Optional; +import java.util.Random; +import java.util.stream.Collectors; + +@Service +public class FlowerService implements FlowerServiceImpl { + @Resource + private FlowerMapper flowerMapper; + @Resource + private CartMapper cartMapper; + @Resource + private OrderMapper orderMapper; + @Resource + private UserMapper userMapper; + @Resource + private CommentMapper commentMapper; + + @Override + public PageInfo flowerList(int page, int page_size) { + PageHelper.startPage(page,page_size); + return new PageInfo<>(flowerMapper.flowerList()); + } + @Override + public PageInfo flowerListByQuery(int page,int page_size,String flower_name){ + PageHelper.startPage(page,page_size); + return new PageInfo<>(flowerMapper.flowerListByQuery(flower_name)); + } + @Override + public void flowerAdd(Flower flower){ + flowerMapper.flowerAdd(flower); + } + @Override + public int flowerDeletePer(int flower_id){ + return flowerMapper.flowerDeletePer(flower_id); + } + @Override + public int flowerDeleteMul(int[] flower_ids){ + return flowerMapper.flowerDeleteMul(flower_ids); + } + @Override + public Flower flowerInfo(int flower_id){ + return flowerMapper.flowerInfo(flower_id); + } + @Override + public int flowerModify(Flower flower){ + return flowerMapper.flowerModify(flower); + } + //前台 + @Override + public List flowerRecommend(int class_id){ + return flowerMapper.flowerRecommend(class_id); + } + @Override + public int flowerAddNum(int flower_id,int flower_sale){ + return flowerMapper.flowerAddNum(flower_id,flower_sale); + } + + //猜你喜欢 + @Override + public List recommend(int user_id) { + // 用户的哪些行为可以认为他跟商品产生了关系?加入购物车、下单、评论 + // 1. 获取所有的购物车信息 + List allCarts = cartMapper.findAllCart(); + // 2. 获取所有的订单信息 + List allOrders = orderMapper.findAllFlowerOrder(); + // 3. 获取所有的评论信息 + List allComments = commentMapper.findAllComment(); + // 4. 获取所有的用户信息 + List allUsers = userMapper.userList(); + // 5. 获取所有的商品信息 + List allFlower = flowerMapper.flowerList(); + + // 定义一个存储每个商品和每个用户关系的List + List data = new ArrayList<>(); + // 定义一个存储最后返回给前端的商品List + List result; + + // 开始计算每个商品和每个用户之间的关系数据 + for (Flower flower : allFlower) { + Integer flowerId = flower.getFlower_id(); + for (User user : allUsers) { + int userId = user.getUser_id(); + int index = 1; + // 1. 判断该用户有没有给该商品加入购物车,加入购物车的权重给 2 + Optional cartOptional = allCarts.stream().filter(x -> x.getFlower_id()==flowerId && x.getUser_id()==userId).findFirst(); + if (cartOptional.isPresent()) { + index += 2; + } + // 2. 判断该用户有没有对该商品下过单(已完成的订单),订单的权重给 3 + Optional ordersOptional = allOrders.stream().filter(x -> x.getFlower_id()==flowerId && x.getUser_id()==userId).findFirst(); + if (ordersOptional.isPresent()) { + index += 3; + } + // 3. 判断该用户有没有对该商品评论过,评论的权重给 1 + Optional commentOptional = allComments.stream().filter(x -> x.getFlower_id()==flowerId && x.getUser_id()==userId).findFirst(); + if (commentOptional.isPresent()) { + index += 1; + } + if (index > 1) { + RelateDTO relateDTO = new RelateDTO(userId, flowerId, index); + data.add(relateDTO); + } + } + } + + // 数据准备结束后,就把这些数据一起给这个推荐算法 + List flowerIds = UserCF.recommend(user_id, data); + // 把商品id转换成商品 + result = flowerIds.stream().map(flowerId -> allFlower.stream() + .filter(x -> x.getFlower_id()==flowerId).findFirst().orElse(null)) + .limit(6).collect(Collectors.toList()); + + if (CollectionUtil.isEmpty(result)) { + // 随机给它推荐10个 + return getRandomFlower(6); + } + if (result.size() < 6) { + int num = 6 - result.size(); + List list = getRandomFlower(num); + result.addAll(list); + } + return result; + } + + private List getRandomFlower(int num) { + List list = new ArrayList<>(num); + List flower = flowerMapper.flowerList(); + for (int i = 0; i < num; i++) { + int index = new Random().nextInt(flower.size()); + list.add(flower.get(index)); + } + return list; + } + +}