public Employee login(EmployeeLoginDTO employeeLoginDTO) {
String username = employeeLoginDTO.getUsername();
String password = employeeLoginDTO.getPassword();
//1、根据用户名查询数据库中的数据
Employee employee = employeeMapper.getByUsername(username);
//2、处理各种异常情况(用户名不存在、密码不对、账号被锁定)
if (employee == null) {
//账号不存在
throw new AccountNotFoundException(MessageConstant.ACCOUNT_NOT_FOUND);
}
//密码比对
//TODO 对前端传过来的明文密码进行md5加密护理
password=DigestUtils.md5DigestAsHex(password.getBytes());
if (!password.equals(employee.getPassword())) {
//密码错误
throw new PasswordErrorException(MessageConstant.PASSWORD_ERROR);
}
if (employee.getStatus() == StatusConstant.DISABLE) {
//账号被锁定
throw new AccountLockedException(MessageConstant.ACCOUNT_LOCKED);
}
//3、返回实体对象
return employee;
}我来为你详细解释这段代码中的每个类和方法,以及它的实现思路。
**已检索仓库** *EmployeeServiceImpl login method implementation* 25 个结果
**已查看文件** *EmployeeServiceImpl.java*
**已查看文件** *MessageConstant.java*
**已查看文件** *StatusConstant.java*
**已查看文件** *Employee.java*
**已查看文件** *AccountNotFoundException.java*
**已查看文件** *PasswordErrorException.java*
**已查看文件** *AccountLockedException.java*
现在我来为你详细解释这段代码中的每个类和方法,以及它的实现思路。
## 代码整体结构和功能
这段代码是员工登录功能的实现,位于 [EmployeeServiceImpl.java](file://D:\SUM\代码\sky-take-out\sky-server\src\main\java\com\sky\service\impl\EmployeeServiceImpl.java) 文件中,是 [EmployeeService](file:///D:/SUM/%E4%BB%A3%E7%A0%81/sky-take-out/sky-server/src/main/java/com/sky/service/EmployeeService.java#L15-L35) 接口的具体实现。
## 逐个类和方法解释
### 主要类介绍
1. **EmployeeServiceImpl** - 员工服务实现类
- 实现了 [EmployeeService](file:///D:/SUM/%E4%BB%A3%E7%A0%81/sky-take-out/sky-server/src/main/java/com/sky/service/EmployeeService.java#L15-L35) 接口
- 使用了 `@Service` 注解,表明这是一个 Spring 服务组件
2. **EmployeeLoginDTO** - 员工登录数据传输对象
```java
@Data
@ApiModel(description = "员工登录时传递的数据模型")
public class EmployeeLoginDTO implements Serializable {
@ApiModelProperty("用户名")
private String username;
@ApiModelProperty("密码")
private String password;
}
```
用于接收前端传递的登录信息(用户名和密码)
3. **Employee** - 员工实体类
- 包含员工的所有属性:id、username、name、password、phone、sex、idNumber、status 等
- 使用了 Lombok 注解 `@Data` 自动生成 getter/setter 方法
4. **常量类**
- [MessageConstant](file:///D:/SUM/%E4%BB%A3%E7%A0%81/sky-take-out/sky-common/src/main/java/com/sky/constant/MessageConstant.java#L7-L27):包含各种错误消息常量
- [StatusConstant](file:///D:/SUM/%E4%BB%A3%E7%A0%81/sky-take-out/sky-common/src/main/java/com/sky/constant/StatusConstant.java#L6-L13):包含员工状态常量(启用/禁用)
5. **异常类**
- [AccountNotFoundException](file:///D:/SUM/%E4%BB%A3%E7%A0%81/sky-take-out/sky-common/src/main/java/com/sky/exception/AccountNotFoundException.java#L5-L15):账号不存在异常
- [PasswordErrorException](file:///D:/SUM/%E4%BB%A3%E7%A0%81/sky-take-out/sky-common/src/main/java/com/sky/exception/PasswordErrorException.java#L5-L15):密码错误异常
- [AccountLockedException](file:///D:/SUM/%E4%BB%A3%E7%A0%81/sky-take-out/sky-common/src/main/java/com/sky/exception/AccountLockedException.java#L5-L15):账号被锁定异常
### 核心方法:login 方法详解
```java
public Employee login(EmployeeLoginDTO employeeLoginDTO) {
String username = employeeLoginDTO.getUsername();
String password = employeeLoginDTO.getPassword();
//1、根据用户名查询数据库中的数据
Employee employee = employeeMapper.getByUsername(username);
//2、处理各种异常情况(用户名不存在、密码不对、账号被锁定)
if (employee == null) {
//账号不存在
throw new AccountNotFoundException(MessageConstant.ACCOUNT_NOT_FOUND);
}
//密码比对
//TODO 对前端传过来的明文密码进行md5加密护理
password=DigestUtils.md5DigestAsHex(password.getBytes());
if (!password.equals(employee.getPassword())) {
//密码错误
throw new PasswordErrorException(MessageConstant.PASSWORD_ERROR);
}
if (employee.getStatus() == StatusConstant.DISABLE) {
//账号被锁定
throw new AccountLockedException(MessageConstant.ACCOUNT_LOCKED);
}
//3、返回实体对象
return employee;
}
```
## 实现思路(小白也能理解的版本)
让我用一个通俗的比喻来解释这个登录过程:
### 1. 接收用户输入的信息
就像酒店前台接待员接收客人提供的房卡和密码一样:
```java
String username = employeeLoginDTO.getUsername(); // 客人提供的房卡(用户名)
String password = employeeLoginDTO.getPassword(); // 客人提供的密码
```
### 2. 在系统中查找用户信息
就像前台接待员在酒店系统中查找这张房卡的信息:
```java
Employee employee = employeeMapper.getByUsername(username);
```
### 3. 检查各种异常情况
#### 情况一:房卡不存在
```java
if (employee == null) {
//账号不存在
throw new AccountNotFoundException(MessageConstant.ACCOUNT_NOT_FOUND);
}
```
如果系统中查不到这张房卡,就告诉客人"房卡不存在"。
#### 情况二:密码错误
```java
password=DigestUtils.md5DigestAsHex(password.getBytes()); // 把密码加密
if (!password.equals(employee.getPassword())) {
//密码错误
throw new PasswordErrorException(MessageConstant.PASSWORD_ERROR);
}
```
先把客人提供的密码加密,然后和系统中存储的加密密码比较,如果不一样就提示"密码错误"。
#### 情况三:账户被锁定
```java
if (employee.getStatus() == StatusConstant.DISABLE) {
//账号被锁定
throw new AccountLockedException(MessageConstant.ACCOUNT_LOCKED);
}
```
如果这张房卡被酒店锁定(比如欠费),就提示"账号被锁定"。
### 4. 登录成功
如果所有检查都通过了,就把员工信息返回,表示登录成功:
```java
return employee;
```
## 涉及的关键技术点
1. **MD5加密**:使用 `DigestUtils.md5DigestAsHex()` 对密码进行加密处理
2. **异常处理**:使用自定义异常类来处理不同的错误情况
3. **数据访问**:通过 [EmployeeMapper](file:///D:/SUM/%E4%BB%A3%E7%A0%81/sky-take-out/sky-server/src/main/java/com/sky/mapper/EmployeeMapper.java#L1-L31) 访问数据库查询员工信息
4. **DTO模式**:使用数据传输对象(DTO)来接收前端数据
## 总结
这段代码实现了员工登录的核心逻辑,通过用户名查询用户、验证密码、检查账户状态,最终完成登录验证。整个过程注重安全性,对密码进行了加密处理,并对各种异常情况做了妥善处理。
这就是一个典型的登录验证流程,在大多数系统中都会有类似的实现方式。
员工登录
于 2025-09-24 11:10:11 首次发布
1451

被折叠的 条评论
为什么被折叠?



