AdminAuthServiceImpl.java 4.77 KB
package com.diligrp.rider.service.impl;

import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.diligrp.rider.common.exception.BizException;
import com.diligrp.rider.config.JwtUtil;
import com.diligrp.rider.dto.AdminLoginDTO;
import com.diligrp.rider.entity.AdminUser;
import com.diligrp.rider.entity.City;
import com.diligrp.rider.entity.Substation;
import com.diligrp.rider.entity.SysRole;
import com.diligrp.rider.mapper.AdminUserMapper;
import com.diligrp.rider.mapper.CityMapper;
import com.diligrp.rider.mapper.SubstationMapper;
import com.diligrp.rider.service.AdminMenuService;
import com.diligrp.rider.vo.AdminLoginUserVO;
import com.diligrp.rider.vo.AdminLoginVO;
import com.diligrp.rider.vo.AdminMenuVO;
import lombok.RequiredArgsConstructor;
import org.springframework.stereotype.Service;
import org.springframework.util.DigestUtils;

import java.nio.charset.StandardCharsets;
import java.util.List;

@Service
@RequiredArgsConstructor
public class AdminAuthServiceImpl {

    private static final String ROLE_TYPE_ADMIN = "admin";
    private static final String ROLE_TYPE_SUBSTATION = "substation";

    private final AdminUserMapper adminUserMapper;
    private final SubstationMapper substationMapper;
    private final CityMapper cityMapper;
    private final AdminMenuService adminMenuService;
    private final JwtUtil jwtUtil;

    /**
     * 统一登录入口
     * role=admin:超级管理员登录(admin_user表)
     * role=substation:分站管理员登录(substation表)
     */
    public AdminLoginVO login(AdminLoginDTO dto) {
        if (ROLE_TYPE_ADMIN.equals(dto.getRole())) {
            return loginAdmin(dto.getAccount(), dto.getPass());
        }
        return loginSubstation(dto.getAccount(), dto.getPass());
    }

    private AdminLoginVO loginAdmin(String account, String pass) {
        AdminUser user = adminUserMapper.selectOne(new LambdaQueryWrapper<AdminUser>()
                .eq(AdminUser::getUserLogin, account).last("LIMIT 1"));
        if (user == null) throw new BizException("账号不存在");
        if (!encryptPass(pass).equals(user.getUserPass())) throw new BizException("密码错误");
        if (user.getUserStatus() == null || user.getUserStatus() == 0) throw new BizException("账号已被禁用");

        SysRole role = adminMenuService.resolveRole(user.getRoleId(), ROLE_TYPE_ADMIN);
        List<AdminMenuVO> menus = adminMenuService.getMenus(role, ROLE_TYPE_ADMIN);

        AdminLoginUserVO loginUser = new AdminLoginUserVO();
        loginUser.setId(user.getId());
        loginUser.setUserLogin(user.getUserLogin());
        loginUser.setUserNickname(user.getUserNickname());
        loginUser.setRole(ROLE_TYPE_ADMIN);
        loginUser.setRoleType(ROLE_TYPE_ADMIN);
        loginUser.setRoleCode(role.getCode());

        AdminLoginVO vo = new AdminLoginVO();
        vo.setToken(jwtUtil.generateAdminToken(user.getId(), ROLE_TYPE_ADMIN));
        vo.setUser(loginUser);
        vo.setMenus(menus);
        vo.setHomePath(adminMenuService.resolveHomePath(menus));
        return vo;
    }

    private AdminLoginVO loginSubstation(String account, String pass) {
        Substation sub = substationMapper.selectOne(new LambdaQueryWrapper<Substation>()
                .eq(Substation::getUserLogin, account).last("LIMIT 1"));
        if (sub == null) throw new BizException("账号不存在");
        if (!encryptPass(pass).equals(sub.getUserPass())) throw new BizException("密码错误");
        if (sub.getUserStatus() == null || sub.getUserStatus() == 0) throw new BizException("账号已被禁用");
        if (sub.getCityId() == null || sub.getCityId() < 1) throw new BizException("当前分站账号未绑定有效城市");

        SysRole role = adminMenuService.resolveRole(sub.getRoleId(), ROLE_TYPE_SUBSTATION);
        List<AdminMenuVO> menus = adminMenuService.getMenus(role, ROLE_TYPE_SUBSTATION);
        City city = cityMapper.selectById(sub.getCityId());

        AdminLoginUserVO loginUser = new AdminLoginUserVO();
        loginUser.setId(sub.getId());
        loginUser.setUserLogin(sub.getUserLogin());
        loginUser.setUserNickname(sub.getUserNickname());
        loginUser.setRole(ROLE_TYPE_SUBSTATION);
        loginUser.setRoleType(ROLE_TYPE_SUBSTATION);
        loginUser.setRoleCode(role.getCode());
        loginUser.setCityId(sub.getCityId());
        loginUser.setCityName(city != null ? city.getName() : null);

        AdminLoginVO vo = new AdminLoginVO();
        vo.setToken(jwtUtil.generateAdminToken(sub.getId(), ROLE_TYPE_SUBSTATION));
        vo.setUser(loginUser);
        vo.setMenus(menus);
        vo.setHomePath(adminMenuService.resolveHomePath(menus));
        return vo;
    }

    private String encryptPass(String pass) {
        return DigestUtils.md5DigestAsHex(pass.getBytes(StandardCharsets.UTF_8));
    }
}