diff --git a/IDEA/src/main/java/com/example/api/controller/AdminController.java b/IDEA/src/main/java/com/example/api/controller/AdminController.java new file mode 100644 index 00000000..d0678c55 --- /dev/null +++ b/IDEA/src/main/java/com/example/api/controller/AdminController.java @@ -0,0 +1,121 @@ +package com.example.api.controller; + +import com.example.api.exception.AccountAndPasswordError; +import com.example.api.model.dto.LoginDto; +import com.example.api.model.entity.Admin; +import com.example.api.model.entity.LoginLog; +import com.example.api.model.enums.Role; +import com.example.api.model.support.ResponseResult; +import com.example.api.repository.AdminRepository; +import com.example.api.service.AdminService; +import com.example.api.service.LoginLogService; +import com.example.api.utils.JwtTokenUtil; +import lombok.extern.slf4j.Slf4j; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.security.access.prepost.PreAuthorize; +import org.springframework.web.bind.annotation.*; + +import javax.annotation.Resource; +import javax.servlet.http.HttpServletRequest; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +// 定义RestController注解,表示该类是一个控制器,用于处理HTTP请求 +@RestController +// 定义RequestMapping注解,设置该控制器的基础URL路径 +@RequestMapping("/api/admin") +// 使用@Slf4j注解来自动生成日志对象 +@Slf4j +public class AdminController { + + // 使用LoggerFactory获取当前类的日志对象 + Logger logger = LoggerFactory.getLogger(AdminController.class); + + // 通过@Resource注解自动注入AdminService + @Resource + private AdminService adminService; + + // 通过@Resource注解自动注入AdminRepository + @Resource + private AdminRepository adminRepository; + + // 通过@Resource注解自动注入LoginLogService + @Resource + private LoginLogService loginLogService; + + // 检查是否有初始化管理员账号 + @GetMapping("hasInit") + public boolean hasInit() { + return adminRepository.existsAdminByRoles(Role.ROLE_SUPER_ADMIN.getValue()); + } + + // 初始化管理员账号 + @PostMapping("/init") + public Admin init(@RequestBody Admin admin) throws Exception { + admin.setRoles(Role.ROLE_SUPER_ADMIN.getValue()); + return adminService.save(admin); + } + + // 获取所有管理员账号信息 + @GetMapping("") + @PreAuthorize("hasAnyRole('ROLE_SUPER_ADMIN' ,'ROLE_ADMIN')") + public List findAll() { + return adminService.findAll(); + } + + // 删除管理员账号 + @DeleteMapping("") + @PreAuthorize("hasAnyRole('ROLE_SUPER_ADMIN' ,'ROLE_ADMIN')") + public void delete(String id) { + adminService.delete(id); + } + + // 保存管理员账号信息 + @PostMapping("") + @PreAuthorize("hasAnyRole('ROLE_SUPER_ADMIN' ,'ROLE_ADMIN')") + public Admin save(@RequestBody Admin admin) throws Exception { + return adminService.save(admin); + } + + // 管理员登录 + @PostMapping("/login") + public Map loginByEmail(String type, @RequestBody LoginDto dto, HttpServletRequest request) throws Exception { + Map map = new HashMap<>(); + Admin admin = null; + String token = null; + try { + // 根据登录类型(邮箱或密码)进行登录 + admin = type.equals("email") ? adminService.loginByEmail(dto) : adminService.loginByPassword(dto); + // 创建JWT令牌 + token = adminService.createToken(admin, + dto.isRemember() ? JwtTokenUtil.REMEMBER_EXPIRATION_TIME : JwtTokenUtil.EXPIRATION_TIME); + } catch (Exception e) { + // 抛出异常,表示邮箱或密码错误 + throw new Exception("邮箱或密码错误"); + } finally { + // 记录登录日志 + loginLogService.recordLog(dto, admin, request); + } + // 将管理员信息和令牌放入返回结果 + map.put("admin", admin); + map.put("token", token); + return map; + } + + // 发送邮箱验证码 + @GetMapping("/sendEmail") + public ResponseResult sendEmail(String email) throws Exception { + Boolean flag = adminService.sendEmail(email); + ResponseResult res = new ResponseResult(); + if (flag) { + res.setMsg("发送成功,请登录邮箱查看"); + } else { + res.setMsg("发送验证码失败,请检查邮箱服务"); + } + res.setStatus(flag); + return res; + } + +} \ No newline at end of file diff --git a/IDEA/src/main/java/com/example/api/model/entity/Admin.java b/IDEA/src/main/java/com/example/api/model/entity/Admin.java new file mode 100644 index 00000000..620ec130 --- /dev/null +++ b/IDEA/src/main/java/com/example/api/model/entity/Admin.java @@ -0,0 +1,52 @@ +package com.example.api.model.entity; + +// 导入Lombok提供的注解,用于简化Java类的编写 +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; +// 导入Hibernate提供的注解,用于定义生成ID的策略 +import org.hibernate.annotations.GenericGenerator; + +// 导入JPA注解,用于定义实体和字段的映射 +import javax.persistence.Column; +import javax.persistence.Entity; +import javax.persistence.GeneratedValue; +import javax.persistence.Id; + +/** + * 管理员实体类,用于表示数据库中的管理员表 + */ +// 使用@Data注解自动生成getter和setter方法,以及toString(), equals()和hashCode()方法 +@Data +// 使用@Entity注解标记这个类是一个JPA实体,可以被持久化到数据库 +@Entity +// 使用@NoArgsConstructor生成一个无参数的构造函数 +@NoArgsConstructor +// 使用@AllArgsConstructor生成一个全参数的构造函数 +@AllArgsConstructor + +public class Admin { + + // 使用@Id标记这个字段为主键 + @Id + // 使用@GeneratedValue指定主键值的生成策略,这里使用"uuid2"生成器 + @GeneratedValue(generator = "uuid2") + // 使用@GenericGenerator定义一个名为"uuid2"的生成器,使用Hibernate的UUID生成策略 + @GenericGenerator(name = "uuid2", strategy = "org.hibernate.id.UUIDGenerator") + private String id; + + // 使用@Column注解定义email字段的数据库列属性,设置数据类型为varchar(30),默认值为'LTD',且字段不能为空 + @Column(columnDefinition = "varchar(30) default 'LTD' not null") + private String email; + + // 使用@Column注解定义password字段的数据库列属性,设置数据类型为varchar(30),默认值为'LTD',且字段不能为空 + @Column(columnDefinition = "varchar(30) default 'LTD' not null") + private String password; + + // roles字段,用于存储管理员的角色信息 + private String roles; + + // createAt字段,用于存储管理员的创建时间 + private String createAt; + +}