|
|
@ -0,0 +1,144 @@
|
|
|
|
|
|
|
|
package com.example.api.service.impl;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
import com.example.api.exception.AccountAndPasswordError; // 导入自定义异常类,用于处理账号和密码错误的情况
|
|
|
|
|
|
|
|
import com.example.api.model.dto.LoginDto; // 导入登录数据传输对象,用于封装登录请求的数据
|
|
|
|
|
|
|
|
import com.example.api.model.entity.Admin; // 导入Admin实体类,代表系统中的管理员账户
|
|
|
|
|
|
|
|
import com.example.api.model.entity.LoginLog; // 导入登录日志实体类,用于记录管理员登录日志
|
|
|
|
|
|
|
|
import com.example.api.repository.AdminRepository; // 导入AdminRepository接口,用于访问管理员数据
|
|
|
|
|
|
|
|
import com.example.api.repository.LoginLogRepository; // 导入LoginLogRepository接口,用于访问登录日志数据
|
|
|
|
|
|
|
|
import com.example.api.service.AdminService; // 导入AdminService接口,定义管理员服务
|
|
|
|
|
|
|
|
import com.example.api.service.EmailService; // 导入EmailService接口,用于发送邮件服务
|
|
|
|
|
|
|
|
import com.example.api.utils.DataTimeUtil; // 导入日期时间工具类,用于处理日期时间
|
|
|
|
|
|
|
|
import com.example.api.utils.JwtTokenUtil; // 导入JWT工具类,用于生成和解析JWT令牌
|
|
|
|
|
|
|
|
import org.springframework.stereotype.Service; // 标识这是一个Service组件,Spring容器会进行管理
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
import javax.annotation.Resource; // 注解,用于注入Spring管理的Bean
|
|
|
|
|
|
|
|
import java.util.Date; // 导入Date类,用于处理日期
|
|
|
|
|
|
|
|
import java.util.List; // 导入List类,用于处理列表数据
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
|
|
|
* Admin服务实现类,提供管理员相关的业务逻辑。
|
|
|
|
|
|
|
|
*/
|
|
|
|
|
|
|
|
@Service
|
|
|
|
|
|
|
|
public class AdminServiceImpl implements AdminService {
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
@Resource
|
|
|
|
|
|
|
|
private AdminRepository adminRepository; // 注入Admin仓库,用于访问管理员数据
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
@Resource
|
|
|
|
|
|
|
|
private EmailService emailService; // 注入邮件服务,用于发送邮件
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
|
|
|
* 保存管理员信息。
|
|
|
|
|
|
|
|
* @param admin 管理员实体对象
|
|
|
|
|
|
|
|
* @return 保存后的管理员实体对象
|
|
|
|
|
|
|
|
* @throws Exception 如果参数异常则抛出异常
|
|
|
|
|
|
|
|
*/
|
|
|
|
|
|
|
|
@Override
|
|
|
|
|
|
|
|
public Admin save(Admin admin) throws Exception {
|
|
|
|
|
|
|
|
// 校验邮箱长度和密码长度,如果不符合要求则抛出异常
|
|
|
|
|
|
|
|
if (admin.getEmail().length() < 8 || admin.getPassword().length() < 5) throw new Exception("请求参数异常");
|
|
|
|
|
|
|
|
// 设置创建时间
|
|
|
|
|
|
|
|
admin.setCreateAt(DataTimeUtil.getNowTimeString());
|
|
|
|
|
|
|
|
// 保存管理员信息
|
|
|
|
|
|
|
|
return adminRepository.save(admin);
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
|
|
|
* 根据ID查询管理员信息。
|
|
|
|
|
|
|
|
* @param id 管理员ID
|
|
|
|
|
|
|
|
* @return 查询到的管理员实体对象,如果没有找到则返回null
|
|
|
|
|
|
|
|
*/
|
|
|
|
|
|
|
|
@Override
|
|
|
|
|
|
|
|
public Admin findById(String id) {
|
|
|
|
|
|
|
|
// 根据ID查询管理员信息,如果不存在则返回null
|
|
|
|
|
|
|
|
return adminRepository.findById(id).orElse(null);
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
|
|
|
* 发送验证邮件。
|
|
|
|
|
|
|
|
* @param email 管理员邮箱
|
|
|
|
|
|
|
|
* @return 发送邮件的结果
|
|
|
|
|
|
|
|
* @throws Exception 如果邮箱账户不存在则抛出异常
|
|
|
|
|
|
|
|
*/
|
|
|
|
|
|
|
|
@Override
|
|
|
|
|
|
|
|
public boolean sendEmail(String email) throws Exception {
|
|
|
|
|
|
|
|
// 根据邮箱查询管理员信息
|
|
|
|
|
|
|
|
Admin admin = adminRepository.findAdminByEmail(email);
|
|
|
|
|
|
|
|
// 如果管理员信息不存在,则抛出异常
|
|
|
|
|
|
|
|
if (admin == null) throw new Exception("不存在的邮箱账户");
|
|
|
|
|
|
|
|
// 发送验证邮件
|
|
|
|
|
|
|
|
return emailService.sendVerificationCode(email);
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
|
|
|
* 密码登录。
|
|
|
|
|
|
|
|
* @param dto 登录数据传输对象
|
|
|
|
|
|
|
|
* @return 登录成功的管理员实体对象
|
|
|
|
|
|
|
|
* @throws Exception 如果邮箱或密码错误则抛出异常
|
|
|
|
|
|
|
|
*/
|
|
|
|
|
|
|
|
@Override
|
|
|
|
|
|
|
|
public Admin loginByPassword(LoginDto dto) throws Exception {
|
|
|
|
|
|
|
|
// 根据邮箱和密码查询管理员信息
|
|
|
|
|
|
|
|
Admin one = adminRepository.findAdminByEmailAndPassword(dto.getEmail(), dto.getPassword());
|
|
|
|
|
|
|
|
// 如果管理员信息不存在,则抛出异常
|
|
|
|
|
|
|
|
if (one == null) {
|
|
|
|
|
|
|
|
throw new Exception("邮箱或密码错误");
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
// 返回管理员信息
|
|
|
|
|
|
|
|
return one;
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
|
|
|
* 邮箱验证码登录。
|
|
|
|
|
|
|
|
* @param dto 登录数据传输对象
|
|
|
|
|
|
|
|
* @return 登录成功的管理员实体对象
|
|
|
|
|
|
|
|
* @throws Exception 如果验证码错误则抛出异常
|
|
|
|
|
|
|
|
*/
|
|
|
|
|
|
|
|
@Override
|
|
|
|
|
|
|
|
public Admin loginByEmail(LoginDto dto) throws Exception {
|
|
|
|
|
|
|
|
// 校验邮箱验证码
|
|
|
|
|
|
|
|
boolean status = emailService.checkVerificationCode(dto.getEmail(), dto.getCode());
|
|
|
|
|
|
|
|
// 如果验证码错误,则抛出异常
|
|
|
|
|
|
|
|
if (!status) throw new Exception("验证码错误");
|
|
|
|
|
|
|
|
// 根据邮箱查询管理员信息
|
|
|
|
|
|
|
|
return adminRepository.findAdminByEmail(dto.getEmail());
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
|
|
|
* 查询所有管理员信息。
|
|
|
|
|
|
|
|
* @return 所有管理员实体对象列表
|
|
|
|
|
|
|
|
*/
|
|
|
|
|
|
|
|
@Override
|
|
|
|
|
|
|
|
public List<Admin> findAll() {
|
|
|
|
|
|
|
|
// 查询所有管理员信息
|
|
|
|
|
|
|
|
return adminRepository.findAll();
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
|
|
|
* 创建JWT Token。
|
|
|
|
|
|
|
|
* @param admin 管理员实体对象
|
|
|
|
|
|
|
|
* @param exp Token过期时间
|
|
|
|
|
|
|
|
* @return 生成的JWT Token字符串
|
|
|
|
|
|
|
|
*/
|
|
|
|
|
|
|
|
@Override
|
|
|
|
|
|
|
|
public String createToken(Admin admin, long exp) {
|
|
|
|
|
|
|
|
// 从管理员信息中获取角色字符串
|
|
|
|
|
|
|
|
String rolesString = admin.getRoles();
|
|
|
|
|
|
|
|
// 将角色字符串分割成数组
|
|
|
|
|
|
|
|
String[] roles = rolesString != null ? rolesString.split(";") : null;
|
|
|
|
|
|
|
|
// 创建JWT Token
|
|
|
|
|
|
|
|
return JwtTokenUtil.createToken(admin.getEmail(), roles, exp);
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
|
|
|
* 删除管理员信息。
|
|
|
|
|
|
|
|
* @param id 管理员ID
|
|
|
|
|
|
|
|
*/
|
|
|
|
|
|
|
|
@Override
|
|
|
|
|
|
|
|
public void delete(String id) {
|
|
|
|
|
|
|
|
// 根据ID删除管理员信息
|
|
|
|
|
|
|
|
adminRepository.deleteById(id);
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
}
|