基于ssm框架的图书推荐系统(下)

本文介绍了一个基于SSM(Spring、SpringMVC、MyBatis)框架的图书推荐系统。系统管理部分涉及用户查询、添加、删除和图书管理等功能。协同过滤算法用于推荐书籍,算法思路包括遍历借阅记录、数据清洗、计算预测评分并选取推荐书籍。详细代码可在GitHub找到。
摘要由CSDN通过智能技术生成

一、图书系统管理
这一部分包括根据用户名查询用户,展示所有用户,添加用户,更新用户信息,删除用户,增删查改图书等。从dao层–service层–controller层一步步实现,下面以展示所有用户为例。(一般会一个就可以模仿写出很多个功能,但是有一些service层的逻辑需要注意。)
首先编写dao层

public interface UserDao {
     List<UserDO> listAllUsers();
}

实现接口中方法:dao层使用@Repository注解

@Repository(value = "userDao")
public class UserDaoImpl extends CommonDao implements UserDao {
   

    private static final Logger LOGGER = LoggerFactory.getLogger(UserDaoImpl.class);
@Override
    public List<UserDO> listAllUsers() {
        LoggerUtil.info(LOGGER,"enter in UserDaoImpl[listAllUsers]");
        return getSqlSession().selectList("hahaha.listAllUsers");
    }
}

其次编写service层

public interface UserService {

    List<UserDTO> listAllUsers();
}

实现接口中方法:

@Service(value = "UserService")
public class UserServiceImpl implements UserService {
   

   @Resource(name = "userDao")
    private  UserDao userDao;

    private static final Logger LOGGER = LoggerFactory.getLogger(UserService.class);
   @Override
    public List<UserDTO> listAllUsers() {
        LoggerUtil.info(LOGGER,"enter in UserServiceImpl[listAllUsers]");
        List<UserDO> userDOList=userDao.listAllUsers();
        return convertDOSToDTOS(userDOList);
    }
    /**
     * UserDO对象转为UserDTO对象
     * @param userDO
     * @return
     */
    private UserDTO convertToDTO(UserDO userDO)
    {
        UserDTO userDTO=new UserDTO();
        userDTO.setUserId(userDO.getUserId());
        userDTO.setUsername(userDO.getUsername());
        userDTO.setPassword(userDO.getPassword());
        userDTO.setEmail(userDO.getEmail());
        userDTO.setGmtCreate(DateUtils.format(userDO.getGmtCreate()));
        userDTO.setGmtModified(DateUtils.format(userDO.getGmtModified()));
        userDTO.setModifier(userDO.getModifier());
        userDTO.setPhoneNumber(userDO.getPhoneNumber());
        userDTO.setAge(userDO.getAge());
        userDTO.setSex(userDO.getSex());
        userDTO.setProfession(userDO.getProfession());
        return userDTO;
    }

    /**
     * UserDTO列表转为UserDO列表
     * @param userDOList
     * @return
     */
    private List<UserDTO> convertDOSToDTOS(List<UserDO> userDOList)
    {
        List<UserDTO> userDTOList= Lists.newArrayList();
        if (!CollectionUtils.isEmpty(userDOList)) {
            for (UserDO userDO : userDOList) {
                UserDTO userDTO = convertToDTO(userDO);
                userDTOList.add(userDTO);
            }
        }
        return userDTOList;
    }
}

最后是controller层,当urlpattern为/admin/user,则执行此方法,并将model返回前端展示。

@Controller
public class AdminController {
   
    private static final Logger LOGGER = LoggerFactory.getLogger(LoginController.class);
   @Resource(name = "UserService")
    private UserService userService;
    /**
     * 展示所有用户
     * @param httpSession
     * @param model
     * @return
     */
    @RequestMapping(value = "/admin/user")
    public String listAllUsers(HttpSession httpSession,Model model)
    {
        BaseResult result=new BaseResult();
        try {
            LoggerUtil.info(LOGGER, "enter in AdminController[listAllUsers]");
            UserDTO userDTO = (UserDTO) httpSession.getAttribute("isLogin");
            if (userDTO == null) {
                return "redirect:/login";
            }
           List<UserDTO> userDTOList= userService.listAllUsers();
            model.addAttribute("userList",userDTOList);
            result.setSuccess(true);
            return "admin_user";
        }catch(BusinessException be){
            ExceptionHandler.handleBusinessException(LOGGER,result,be,"展示所有用户失败");
        }catch(Exception e){
            ExceptionHandler.handleSystemException(LOGGER,result,e,"展示所有用户失败");
        }
        return "error";
    }

二、基于用户的协同过滤算法推荐
算法思路:1、遍历borrow表,将每本书和其对应被借阅的次数存入map;
2、数据清洗:由于一个用户可以多次借阅同一本书并且多次评分,那么就选取最近的一次评分作为用户对这本书的最终评分;
3、计算用户对他未看过的书的预测评分:(1)首先找出看过这本书的用户;(2)然后计算当前用户和这些用户之间的相似度(采用皮尔逊相关系数),通过相似度和对应用户对这本书的评分加权得到预测评分;(3)将预测评分存入最大堆,依次选取三本推荐给用户;
4、如果推荐列表不足三本,则从步骤1的map中依次向下取。
具体代码如下:

package book.task;

import book.dao.BookDao;
import book.dao.BorrowDao;
import book.dao.RecommendDao;
import book.dao.UserDao;
import book.domain.dataobject.*;
import book.domain.exception.BusinessException;
import book.util.LoggerUtil;
import com.google.common.base.Joiner;
import com.google.common.base.Splitter;
import com.google.common.collect.Lists;
import com.google.common.co
评论 10
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值