package com.xgs.hisystem.service.impl;
import com.xgs.hisystem.config.HisConstants;
import com.xgs.hisystem.config.ServerConfig;
import com.xgs.hisystem.pojo.bo.BaseResponse;
import com.xgs.hisystem.pojo.bo.PageRspBO;
import com.xgs.hisystem.pojo.entity.*;
import com.xgs.hisystem.pojo.vo.*;
import com.xgs.hisystem.repository.*;
import com.xgs.hisystem.service.IEmailService;
import com.xgs.hisystem.service.IUserService;
import com.xgs.hisystem.task.AsyncTask;
import com.xgs.hisystem.util.DateUtil;
import com.xgs.hisystem.util.MD5Util;
import org.apache.shiro.SecurityUtils;
import org.apache.shiro.authc.AuthenticationException;
import org.apache.shiro.authc.UsernamePasswordToken;
import org.apache.shiro.crypto.hash.SimpleHash;
import org.apache.shiro.subject.Subject;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.PageRequest;
import org.springframework.data.domain.Sort;
import org.springframework.data.jpa.domain.Specification;
import org.springframework.stereotype.Service;
import org.springframework.util.StringUtils;
import org.thymeleaf.context.Context;
import org.thymeleaf.spring5.SpringTemplateEngine;
import javax.persistence.criteria.Predicate;
import javax.transaction.Transactional;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import java.util.Optional;
import java.util.stream.Collectors;
@Service
public class UserServiceImpl implements IUserService {
@Autowired
private IUserRepository iUserRepository;
@Autowired
private ILoginInforRepository iLoginInforRepository;
@Autowired
private SpringTemplateEngine templateEngine;
@Autowired
private IEmailService iEmailService;
@Autowired
private IRoleRespository iRoleRespository;
@Autowired
private IUserRoleRepository iUserRoleRepository;
@Autowired
private IAnnouncementRepository iAnnouncementRepository;
@Autowired
private AsyncTask asyncTask;
@Autowired
private ServerConfig serverConfig;
private static final Logger logger = LoggerFactory.getLogger(UserServiceImpl.class);
/**
* 登录验证
*
* @param reqVO
* @return
*/
@Override
public BaseResponse<String> doLogin(UserLoginReqVO reqVO) {
String email = reqVO.getEmail();
String password = reqVO.getPassword();
UserEntity user = iUserRepository.findByEmail(email);
if (StringUtils.isEmpty(user)) {
return BaseResponse.error(HisConstants.USER.USER_NOT_EXIST);
}
//登录验证
UsernamePasswordToken token = new UsernamePasswordToken(email, password);
Subject subject = SecurityUtils.getSubject();
try {
subject.login(token);
} catch (AuthenticationException e) {
return BaseResponse.error(HisConstants.USER.PASSWORD_ERROR);
}
//验证邮箱激活状态
if (user.getEmailStatus().equals(0)) {
return BaseResponse.error(HisConstants.USER.EMAIL_STATUS_INACTIVE);
}
//验证角色审核状态
List<UserRoleEntity> userRoleList = iUserRoleRepository.findByUId(user.getId());
//审核通过角色个数
long passStatusCount = userRoleList.stream()
.filter(userRole -> userRole.getRoleStatus().equals(1)).count();
if (passStatusCount == 0) {
//未审核角色个数
long unAuditStatusCount = userRoleList.stream()
.filter(userRole -> userRole.getRoleStatus().equals(0)).count();
if (unAuditStatusCount >= 1) {
return BaseResponse.error(HisConstants.USER.ROLE_STATUS_NOTAUDIT);
}
//审核未通过
else {
return BaseResponse.error(HisConstants.USER.ROLE_STATUS_NOTPASS);
}
}
//保存用户登录信息
asyncTask.saveLoginInfor(reqVO.getIp(), reqVO.getBroswer(), email);
return BaseResponse.success(HisConstants.USER.SUCCESS);
}
/**
* 保存用户注册信息,向用户发送激活链接
*
* @param reqVO
* @return
*/
@Transactional
@Override
public BaseResponse<String> saveUserAndSendEmail(UserRegisterReqVO reqVO) {
String email = reqVO.getEmail();
String roleName = reqVO.getRoleName();
try {
//验证角色
RoleEntity role = iRoleRespository.findByDescription(roleName);
if (role == null) {
return BaseResponse.error("您选择的角色不存在,请重试!");
}
//检查该账户是否已存在
UserEntity checkUser = iUserRepository.findByEmail(email);
if (checkUser != null) {
return BaseResponse.error(HisConstants.USER.ACCOUNT_EXIST);
}
UserEntity user = new UserEntity();
user.setEmail(email);
user.setUsername(reqVO.getUsername());
user.setPlainPassword(reqVO.getPassword());
//生成盐和加盐密码
String salt = MD5Util.md5Encrypt32Lower(reqVO.getEmail());
// 使用SimpleHash类对原始密码进行加密
String password = new SimpleHash("MD5", reqVO.getPassword(), salt, 1024).toHex();
user.setPassword(password);
user.setSalt(salt);
//生成激活码
String validateCode = MD5Util.md5Encrypt32Upper(reqVO.getEmail());
user.setValidateCode(validateCode);
user.setEmailStatus(0);
iUserRepository.saveAndFlush(user);
//保存用户与角色信息
UserRoleEntity userRole = new UserRoleEntity();
userRole.setuId(user.getId());
userRole.setRoleId(role.getId());
String description = user.getEmail() + "#" + role.getRole();
userRole.setDescription(description);
userRole.setRoleStatus(0);
iUserRoleRepository.saveAndFlush(userRole);
//组装发送邮件参数
String title = "账户激活";
Context context = new Context();
//组装激活地址
String url = serverConfig.getUrl().concat("/activation").concat("?email=")
.concat(email).concat("&validateCode=").concat(validateCode);
context.setVariable("url", url);
String emailContent = templateEngine.process("email/email", context);
//发送邮件
iEmailService.sendMail(reqVO.getEmail(), title, emailContent);
return BaseResponse.success(HisConstants.USER.SUCCESS);
} catch (Exception e) {
e.printStackTrace();
return BaseResponse.error("保存用户信息或邮件发送异常,请联系管理员处理!");
}
}
/**
* 激活账户
*
* @param email
* @param validateCode
* @return
* @throws ParseException
*/
@Transactional
@Override
public BaseResponse<String> activation(String email, String validateCode) throws ParseException {
try {
UserEntity user = iUserRepository.findByEmail(email);
if (user == null) {
return BaseResponse.error("未查询到该邮箱,请核对信息!");
}
String nowDate = DateUtil.getCurrentDateToString();
String createDate = user.getCreateDatetime();
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-M-d HH:mm:ss");
Date start = sdf.parse(createDate);
Date end = sdf.parse(nowDate);
long cha = end.getTime() - start.getTime();
double result = cha * 1.0 / (1000 * 60 * 60);
if (result > 48) {
return BaseRes
没有合适的资源?快使用搜索试试~ 我知道了~
资源推荐
资源详情
资源评论
收起资源包目录
基于springboot医院管理系统 (2004个子文件)
mvnw.cmd 6KB
sb-admin-2.css 251KB
sb-admin-2.css 251KB
bootstrap.css 143KB
bootstrap.css 143KB
all.css 66KB
all.css 66KB
fontawesome.css 64KB
fontawesome.css 64KB
all.min.css 53KB
all.min.css 53KB
fontawesome.min.css 51KB
fontawesome.min.css 51KB
v4-shims.css 40KB
v4-shims.css 40KB
font-awesome.css 37KB
font-awesome.css 37KB
font-awesome.min.css 30KB
font-awesome.min.css 30KB
v4-shims.min.css 26KB
v4-shims.min.css 26KB
sweetalert.css 22KB
sweetalert.css 22KB
auth.css 13KB
auth.css 13KB
chosen.min.css 12KB
chosen.min.css 12KB
bootstrap-table.css 9KB
bootstrap-table.css 9KB
svg-with-js.css 7KB
svg-with-js.css 7KB
dataTables.bootstrap4.css 6KB
dataTables.bootstrap4.css 6KB
dataTables.bootstrap4.min.css 5KB
dataTables.bootstrap4.min.css 5KB
flatpickr.min.css 5KB
flatpickr.min.css 5KB
svg-with-js.min.css 5KB
svg-with-js.min.css 5KB
mcss_outpatient.css 4KB
mcss_outpatient.css 4KB
style.css 3KB
style.css 3KB
mcss_medicalExamination.css 3KB
mcss_medicalExamination.css 3KB
mcss_outpatientToll.css 3KB
mcss_outpatientToll.css 3KB
component.css 2KB
component.css 2KB
bg.css 2KB
bg.css 2KB
responsive.css 1KB
responsive.css 1KB
mcss_register.css 1KB
mcss_register.css 1KB
mcss_main.css 1KB
mcss_main.css 1KB
mcss_takingdrug.css 1KB
mcss_takingdrug.css 1KB
dmail.css 1KB
dmail.css 1KB
component-1.css 1KB
component-1.css 1KB
preloader.css 1KB
preloader.css 1KB
fmail.css 1KB
fmail.css 1KB
mcss_notice.css 976B
mcss_notice.css 976B
regular.css 710B
regular.css 710B
solid.css 703B
solid.css 703B
brands.css 691B
brands.css 691B
tooltipify.min.css 676B
tooltipify.min.css 676B
regular.min.css 657B
regular.min.css 657B
solid.min.css 649B
solid.min.css 649B
brands.min.css 642B
brands.min.css 642B
mcss_examinationTollInfo.css 505B
mcss_examinationTollInfo.css 505B
mcss_registerRecord.css 457B
mcss_registerRecord.css 457B
mcss_MedicalRecord.css 449B
mcss_MedicalRecord.css 449B
mcss_accountset.css 380B
mcss_accountset.css 380B
mcss_login.css 345B
mcss_announcement.css 345B
mcss_userInfo.css 345B
mcss_login.css 345B
mcss_announcement.css 345B
mcss_userInfo.css 345B
mcss_storageManage.css 281B
mcss_storageManage.css 281B
mcss_drugManage.css 209B
共 2004 条
- 1
- 2
- 3
- 4
- 5
- 6
- 21
资源评论
晚安独角兽
- 粉丝: 5480
- 资源: 73
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功