You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
spring-boot-online-exam/backend/src/main/java/lsgwr/exam/service/impl/UserServiceImpl.java

175 lines
6.9 KiB

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

/***********************************************************
* @Description : 用户服务
* @author : 梁山广(Laing Shan Guang)
* @date : 2019-05-17 08:03
* @email : liangshanguang2@gmail.com
***********************************************************/
package lsgwr.exam.service.impl;
import cn.hutool.core.codec.Base64;
import cn.hutool.core.util.IdUtil;
import lsgwr.exam.dto.RegisterDTO;
import lsgwr.exam.entity.Action;
import lsgwr.exam.entity.Page;
import lsgwr.exam.entity.Role;
import lsgwr.exam.entity.User;
import lsgwr.exam.enums.LoginTypeEnum;
import lsgwr.exam.enums.RoleEnum;
import lsgwr.exam.qo.LoginQo;
import lsgwr.exam.repository.ActionRepository;
import lsgwr.exam.repository.PageRepository;
import lsgwr.exam.repository.RoleRepository;
import lsgwr.exam.repository.UserRepository;
import lsgwr.exam.service.UserService;
import lsgwr.exam.utils.JwtUtils;
import lsgwr.exam.vo.*;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import javax.transaction.Transactional;
import java.util.ArrayList;
import java.util.List;
@Service
@Transactional
public class UserServiceImpl implements UserService {
@Autowired
UserRepository userRepository;
@Autowired
RoleRepository roleRepository;
@Autowired
PageRepository pageRepository;
@Autowired
ActionRepository actionRepository;
@Override
public User register(RegisterDTO registerDTO) {
try {
User user = new User();
user.setUserId(IdUtil.simpleUUID());
// 好像还缺少个用户名,用"exam_user_手机号"来注册需要校验唯一性数据字段已经设置unique了失败会异常地
String defaultUsername = "user";
user.setUserUsername(defaultUsername + "_" + registerDTO.getMobile());
// 初始化昵称和用户名相同
user.setUserNickname(user.getUserUsername());
// 这里还需要进行加密处理后续解密用Base64.decode()
user.setUserPassword(Base64.encode(registerDTO.getPassword()));
// 默认设置为学生身份,需要老师和学生身份地话需要管理员修改
user.setUserRoleId(RoleEnum.STUDENT.getId());
// 设置头像图片地址, 先默认一个地址,后面用户可以自己再改
String defaultAvatar = "http://d.lanrentuku.com/down/png/1904/business_avatar/8_avatar_2754583.png";
user.setUserAvatar(defaultAvatar);
// 设置描述信息,随便设置段默认的
user.setUserDescription("welcome to online exam system");
// 需要验证这个邮箱是不是已经存在数据字段已经设置unique了失败会异常地
user.setUserEmail(registerDTO.getEmail());
// 需要验证手机号是否已经存在数据字段已经设置unique了失败会异常地
user.setUserPhone(registerDTO.getMobile());
userRepository.save(user);
System.out.println(user);
return user;
} catch (Exception e) {
e.printStackTrace(); // 用户已经存在
// 出异常返回null表示注册失败
return null;
}
}
@Override
public String login(LoginQo loginQo) {
User user;
if (LoginTypeEnum.USERNAME.getType().equals(loginQo.getLoginType())) {
// 登陆者用地是用户名
user = userRepository.findByUserUsername(loginQo.getUserInfo());
} else {
// 登陆者用地是邮箱
user = userRepository.findByUserEmail(loginQo.getUserInfo());
}
if (user != null) {
// 如果user不是null即能找到才能验证用户名和密码
// 数据库存的密码
String passwordDb = Base64.decodeStr(user.getUserPassword());
// 用户请求参数中的密码
String passwordQo = loginQo.getPassword();
System.out.println(passwordDb);
System.out.println(passwordQo);
if (passwordQo.equals(passwordDb)) {
// 如果密码相等地话说明认证成功,返回生成的token有效期为一天
return JwtUtils.genJsonWebToken(user);
}
}
return null;
}
@Override
public UserVo getUserInfo(String userId) {
User user = userRepository.findById(userId).orElse(null);
UserVo userVo = new UserVo();
assert user != null;
BeanUtils.copyProperties(user, userVo);
return userVo;
}
@Override
public UserInfoVo getInfo(String userId) {
User user = userRepository.findById(userId).orElse(null);
assert user != null;
UserInfoVo userInfoVo = new UserInfoVo();
// 1.尽可能的拷贝属性
BeanUtils.copyProperties(user, userInfoVo);
Integer roleId = user.getUserRoleId();
Role role = roleRepository.findById(roleId).orElse(null);
assert role != null;
String roleName = role.getRoleName();
// 2.设置角色名称
userInfoVo.setRoleName(roleName);
// 3.设置当前用户的角色细节
RoleVo roleVo = new RoleVo();
BeanUtils.copyProperties(role, roleVo);
// 4.设置角色的可访问页面
String rolePageIds = role.getRolePageIds();
String[] pageIdArr = rolePageIds.split("-");
List<PageVo> pageVoList = new ArrayList<>();
for (String pageIdStr : pageIdArr) {
// 获取页面的id
Integer pageId = Integer.parseInt(pageIdStr);
// 4.1 向Role中添加Page
Page page = pageRepository.findById(pageId).orElse(null);
PageVo pageVo = new PageVo();
BeanUtils.copyProperties(page, pageVo);
// 4.2 向Page中添加action
List<ActionVo> actionVoList = new ArrayList<>();
String actionIdsStr = page.getActionIds();
String[] actionIdArr = actionIdsStr.split("-");
for (String actionIdStr : actionIdArr) {
Integer actionId = Integer.parseInt(actionIdStr);
Action action = actionRepository.findById(actionId).orElse(null);
ActionVo actionVo = new ActionVo();
assert action != null;
BeanUtils.copyProperties(action, actionVo);
actionVoList.add(actionVo);
}
// 设置actionVoList到pageVo中然后把pageVo加到pageVoList中
pageVo.setActionVoList(actionVoList);
// 设置pageVoList下面再设置到RoleVo中
pageVoList.add(pageVo);
}
// 设置PageVo的集合到RoleVo中
roleVo.setPageVoList(pageVoList);
// 最终把PageVo设置到UserInfoVo中这样就完成了拼接
userInfoVo.setRoleVo(roleVo);
return userInfoVo;
}
}