一、图书系统管理
这一部分包括根据用户名查询用户,展示所有用户,添加用户,更新用户信息,删除用户,增删查改图书等。从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