员工登录

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)来接收前端数据

## 总结

这段代码实现了员工登录的核心逻辑,通过用户名查询用户、验证密码、检查账户状态,最终完成登录验证。整个过程注重安全性,对密码进行了加密处理,并对各种异常情况做了妥善处理。

这就是一个典型的登录验证流程,在大多数系统中都会有类似的实现方式。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值