liujie
2026-08-21 ad5db85e540947e82c7a4d5612879b3b3ecdf459
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
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
package com.tourguide.modules.user.service;
 
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.tourguide.common.api.PageResponse;
import com.tourguide.common.exception.BusinessException;
import com.tourguide.modules.user.dto.UserCreateRequest;
import com.tourguide.modules.user.dto.AdminPasswordResetRequest;
import com.tourguide.modules.user.dto.RoleOptionResponse;
import com.tourguide.modules.user.dto.UserResponse;
import com.tourguide.modules.user.dto.UserUpdateRequest;
import com.tourguide.modules.user.entity.AdminUser;
import com.tourguide.modules.user.entity.SysRole;
import com.tourguide.modules.user.mapper.AdminUserMapper;
import com.tourguide.modules.user.mapper.SysRoleMapper;
import org.springframework.security.crypto.password.PasswordEncoder;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.util.StringUtils;
import java.util.List;
import java.util.stream.Collectors;
 
/** 仅处理管理后台账号,禁止读写小程序用户表。 */
@Service
public class AdminUserService {
    private final AdminUserMapper userMapper;
    private final SysRoleMapper roleMapper;
    private final PasswordEncoder passwordEncoder;
 
    public AdminUserService(AdminUserMapper userMapper, SysRoleMapper roleMapper, PasswordEncoder passwordEncoder) {
        this.userMapper = userMapper;
        this.roleMapper = roleMapper;
        this.passwordEncoder = passwordEncoder;
    }
 
    public AdminUser findEnabledById(Long id) {
        AdminUser user = userMapper.selectById(id);
        if (user == null || user.getStatus() == null || user.getStatus() != 1) {
            throw new BusinessException(401, "后台用户不存在或已停用");
        }
        return user;
    }
 
    public AdminUser findByUsername(String username) {
        return userMapper.selectOne(new LambdaQueryWrapper<AdminUser>().eq(AdminUser::getUsername, username).last("LIMIT 1"));
    }
 
    public PageResponse<UserResponse> page(long page, long size, String nickname, String username,
                                           String roleCode, Integer status) {
        LambdaQueryWrapper<AdminUser> query = new LambdaQueryWrapper<AdminUser>()
                .like(StringUtils.hasText(nickname), AdminUser::getNickname, nickname == null ? null : nickname.trim())
                .like(StringUtils.hasText(username), AdminUser::getUsername, username == null ? null : username.trim())
                .eq(StringUtils.hasText(roleCode), AdminUser::getRoleCode, roleCode)
                .eq(status != null, AdminUser::getStatus, status)
                .orderByDesc(AdminUser::getId);
        Page<AdminUser> result = userMapper.selectPage(new Page<AdminUser>(page, size), query);
        return new PageResponse<UserResponse>(result.getRecords().stream().map(UserResponse::from).collect(Collectors.toList()),
                result.getTotal(), result.getCurrent(), result.getSize());
    }
 
    @Transactional
    public UserResponse create(UserCreateRequest request) {
        ensureUsernameAvailable(request.getUsername());
        ensureRoleEnabled(request.getRoleCode());
        AdminUser user = new AdminUser();
        user.setUsername(request.getUsername());
        user.setPassword(passwordEncoder.encode(request.getPassword()));
        user.setNickname(request.getNickname());
        user.setMobile(request.getMobile());
        user.setRoleCode(request.getRoleCode());
        user.setStatus(request.getStatus());
        user.setDeleted(0);
        userMapper.insert(user);
        return UserResponse.from(user);
    }
 
    @Transactional
    public UserResponse update(Long id, UserUpdateRequest request, Long operatorId) {
        if (id.equals(operatorId) && request.getStatus() == 0) {
            throw new BusinessException(409, "不能禁用当前登录账号");
        }
        AdminUser user = getRequired(id);
        ensureUsernameAvailable(request.getUsername(), id);
        ensureRoleEnabled(request.getRoleCode());
        user.setUsername(request.getUsername());
        user.setNickname(request.getNickname());
        user.setRoleCode(request.getRoleCode());
        user.setStatus(request.getStatus());
        userMapper.updateById(user);
        return UserResponse.from(user);
    }
 
    @Transactional
    public UserResponse updateStatus(Long id, Integer status, Long operatorId) {
        if (id.equals(operatorId) && status == 0) throw new BusinessException(409, "不能禁用当前登录账号");
        AdminUser user = getRequired(id);
        user.setStatus(status);
        userMapper.updateById(user);
        return UserResponse.from(user);
    }
 
    @Transactional
    public void resetPassword(Long id, AdminPasswordResetRequest request) {
        if (!request.getNewPassword().equals(request.getConfirmPassword())) {
            throw new BusinessException(400, "两次输入的密码不一致");
        }
        AdminUser user = getRequired(id);
        user.setPassword(passwordEncoder.encode(request.getNewPassword()));
        userMapper.updateById(user);
    }
 
    public List<RoleOptionResponse> roleOptions() {
        return roleMapper.selectList(new LambdaQueryWrapper<SysRole>()
                        .eq(SysRole::getStatus, 1)
                        .orderByAsc(SysRole::getId))
                .stream().map(RoleOptionResponse::new).collect(Collectors.toList());
    }
 
    @Transactional
    public void delete(Long id, Long operatorId) {
        if (id.equals(operatorId)) throw new BusinessException(409, "不能删除当前登录账号");
        if (userMapper.deleteById(id) == 0) { throw new BusinessException(404, "后台用户不存在"); }
    }
 
    private AdminUser getRequired(Long id) {
        AdminUser user = userMapper.selectById(id);
        if (user == null) { throw new BusinessException(404, "后台用户不存在"); }
        return user;
    }
 
    private void ensureUsernameAvailable(String username) {
        ensureUsernameAvailable(username, null);
    }
 
    private void ensureUsernameAvailable(String username, Long excludedId) {
        if (userMapper.selectCount(new LambdaQueryWrapper<AdminUser>()
                .eq(AdminUser::getUsername, username)
                .ne(excludedId != null, AdminUser::getId, excludedId)) > 0) {
            throw new BusinessException(409, "后台用户名已存在");
        }
    }
 
    private void ensureRoleEnabled(String roleCode) {
        if (roleMapper.selectCount(new LambdaQueryWrapper<SysRole>()
                .eq(SysRole::getRoleCode, roleCode)
                .eq(SysRole::getStatus, 1)) == 0) {
            throw new BusinessException(400, "所选角色不存在或已停用");
        }
    }
}