liujie
2026-01-21 66ec0428ca4f69dec6f698a3fd201944da8e2683
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
package com.estate.expert.admin.service.impl;
 
import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
import com.estate.expert.admin.domain.business.screenaccount.ScreenAccount;
import com.estate.expert.admin.domain.common.EntityBase;
import com.estate.expert.admin.domain.session.UserSession;
import com.estate.expert.admin.domain.session.UserSessionRepository;
import com.estate.expert.admin.domain.user.UserDto;
import com.estate.expert.admin.domain.user.UserMapper;
import com.estate.expert.admin.domain.user.UserRepository;
import com.estate.expert.admin.domain.user.UserState;
import com.estate.expert.admin.domain.common.response.UserLoginResponse;
import com.estate.expert.admin.enums.BizResultCode;
import com.estate.expert.admin.service.LoginService;
import com.estate.expert.admin.service.ScreenAccountService;
import com.estate.expert.admin.service.screen.ScreenService;
import com.estate.expert.admin.utils.MD5Utils;
import com.estate.expert.admin.utils.UUIDGenerator;
import com.estate.expert.common.domain.Session;
import com.estate.expert.common.domain.SessionStatus;
import com.estate.expert.common.utils.PasswordUtils;
import org.springframework.stereotype.Service;
 
import javax.annotation.Resource;
import java.time.LocalDateTime;
 
/**
 * 登录服务实现
 */
@Service
public class LoginServiceImpl implements LoginService {
 
    @Resource
    private UserRepository userRepository;
 
    @Resource
    private UserMapper userMapper;
    @Resource
    private UserSessionRepository userSessionRepository;
 
    @Resource
    private ScreenAccountService screenAccountService;
 
 
 
    public UserLoginResponse login(String mobile, String password) {
        var user = userRepository.findByMobile(mobile);
        BizResultCode.ACCOUNT_NOT_FOUND.check(user == null);
 
        String passInDb = user.getPassword();
        var checkPasswordBl = PasswordUtils.verify(password, passInDb);
        BizResultCode.BIZ_PASSWORD_INVALID.check(!checkPasswordBl);
        BizResultCode.ACCOUNT_FORBIDDEN.check(user.getState() == UserState.DISABLE || user.isDeleted());
 
        Session session = new Session();
        session.setUserId(user.getId());
        session.setUser(user);
        session.setLastAccessTime(LocalDateTime.now());
        session.setToken(UUIDGenerator.generate32Uuid());
        session.setCreateTime(LocalDateTime.now());
        session.setClientCode("admin");
        session.setStatus(SessionStatus.ENABLED);
 
        UserLoginResponse response = new UserLoginResponse();
        response.setToken(session.getToken());
        response.setUserInfo(userMapper.toDto(user));
 
        // 将session保存到数据库
        UserSession userSession = new UserSession();
        userSession.setUser(user);
        userSession.setToken(session.getToken());
        userSession.setCreateTime(LocalDateTime.now());
        userSession.setLastAccessTime(LocalDateTime.now());
        userSession.setClientCode("admin");
        userSession.setState(SessionStatus.ENABLED.name());
        userSessionRepository.save(userSession);
 
        user.setLastAccessTime(LocalDateTime.now());
        userRepository.save(user);
        return response;
 
    }
 
    public void logout(String token) {
        UserSession session = userSessionRepository.findByTokenOrderByIdDesc(token).orElse(null);
        if (session == null) {
            return;
        }
 
        session.setState(SessionStatus.LOGOUT.name());
        userSessionRepository.save(session);
    }
 
}