From f9ac9c2dc9db0a607174428dc37e11170297f97d Mon Sep 17 00:00:00 2001 From: Eterlaze <1215710470@qq.com> Date: Sat, 21 Dec 2024 14:59:23 +0800 Subject: [PATCH] =?UTF-8?q?=E7=AE=A1=E7=90=86=E5=91=98=E5=BA=93=E6=8E=A5?= =?UTF-8?q?=E5=8F=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../api/repository/AdminRepository.java | 36 +++++ .../com/example/api/service/AdminService.java | 72 +++++++++ .../api/service/impl/AdminServiceImpl.java | 144 ++++++++++++++++++ 3 files changed, 252 insertions(+) create mode 100644 IDEA/src/main/java/com/example/api/repository/AdminRepository.java create mode 100644 IDEA/src/main/java/com/example/api/service/AdminService.java create mode 100644 IDEA/src/main/java/com/example/api/service/impl/AdminServiceImpl.java diff --git a/IDEA/src/main/java/com/example/api/repository/AdminRepository.java b/IDEA/src/main/java/com/example/api/repository/AdminRepository.java new file mode 100644 index 00000000..77ed9529 --- /dev/null +++ b/IDEA/src/main/java/com/example/api/repository/AdminRepository.java @@ -0,0 +1,36 @@ +package com.example.api.repository; + +import com.example.api.model.entity.Admin; // 导入Admin实体类 +import org.springframework.data.jpa.repository.JpaRepository; // 继承JPA仓库接口 +import org.springframework.stereotype.Repository; // 标识这是一个Repository组件 + +/** + * 管理员仓库接口,用于数据库操作。 + */ +// 使用@Repository注解标识这是一个Spring组件,通常用于数据访问层 +@Repository +public interface AdminRepository extends JpaRepository { + + /** + * 根据邮箱和密码查找管理员。 + * @param email 管理员的邮箱 + * @param password 管理员的密码 + * @return 匹配的管理员对象,如果没有找到则返回null + */ + Admin findAdminByEmailAndPassword(String email, String password); + + /** + * 根据邮箱查找管理员。 + * @param email 管理员的邮箱 + * @return 匹配的管理员对象,如果没有找到则返回null + */ + Admin findAdminByEmail(String email); + + /** + * 检查是否存在具有特定角色的管理员。 + * @param roles 角色名称 + * @return 如果存在返回true,否则返回false + */ + boolean existsAdminByRoles(String roles); + +} diff --git a/IDEA/src/main/java/com/example/api/service/AdminService.java b/IDEA/src/main/java/com/example/api/service/AdminService.java new file mode 100644 index 00000000..fa7ed2c8 --- /dev/null +++ b/IDEA/src/main/java/com/example/api/service/AdminService.java @@ -0,0 +1,72 @@ +package com.example.api.service; + +import com.example.api.model.dto.LoginDto; // 导入LoginDto数据传输对象,封装登录信息 +import com.example.api.model.entity.Admin; // 导入Admin实体类,代表管理员信息 + +import java.util.List; // 导入List类,用于处理列表数据 + +/** + * 管理员服务接口,定义管理员相关的业务操作。 + */ +public interface AdminService { + + /** + * 保存管理员信息。 + * @param admin 管理员实体对象,包含管理员的各个属性 + * @return 保存后的管理员实体对象,包含由数据库生成的ID等信息 + * @throws Exception 如果保存过程中出现错误,则抛出异常 + */ + Admin save(Admin admin) throws Exception; + + /** + * 根据ID查询管理员信息。 + * @param id 管理员ID + * @return 查询到的管理员实体对象,如果没有找到则返回null + */ + Admin findById(String id); + + /** + * 发送验证邮件。 + * @param email 管理员邮箱地址 + * @return 发送邮件的结果,成功返回true,失败返回false + * @throws Exception 如果发送邮件过程中出现错误,则抛出异常 + */ + boolean sendEmail(String email) throws Exception; + + /** + * 通过密码登录。 + * @param dto 登录数据传输对象,封装登录信息 + * @return 登录成功的管理员实体对象 + * @throws Exception 如果登录失败,则抛出异常 + */ + Admin loginByPassword(LoginDto dto) throws Exception; + + /** + * 通过邮箱验证码登录。 + * @param dto 登录数据传输对象,封装登录信息 + * @return 登录成功的管理员实体对象 + * @throws Exception 如果登录失败,则抛出异常 + */ + Admin loginByEmail(LoginDto dto) throws Exception; + + /** + * 查询所有管理员信息。 + * @return 管理员实体对象列表,包含所有管理员的详细信息 + */ + List findAll(); + + /** + * 生成JWT令牌。 + * @param admin 管理员实体对象,用于获取用户信息 + * @param exp 令牌的过期时间 + * @return 生成的JWT令牌字符串 + */ + String createToken(Admin admin, long exp); + + /** + * 根据ID删除管理员信息。 + * @param id 要删除的管理员ID + */ + void delete(String id); + +} diff --git a/IDEA/src/main/java/com/example/api/service/impl/AdminServiceImpl.java b/IDEA/src/main/java/com/example/api/service/impl/AdminServiceImpl.java new file mode 100644 index 00000000..54030b93 --- /dev/null +++ b/IDEA/src/main/java/com/example/api/service/impl/AdminServiceImpl.java @@ -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 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); + } + +}