package com.zbkj.admin.service.impl; import cn.hutool.core.collection.CollUtil; import cn.hutool.core.util.ObjectUtil; import com.zbkj.admin.filter.TokenComponent; import com.zbkj.admin.service.AdminLoginService; import com.zbkj.admin.service.ValidateCodeService; import com.zbkj.common.constants.SysConfigConstants; import com.zbkj.common.constants.SysGroupDataConstants; import com.zbkj.common.exception.CarException; import com.zbkj.common.model.system.SystemAdmin; import com.zbkj.common.model.system.SystemMenu; import com.zbkj.common.model.system.SystemPermissions; import com.zbkj.common.request.SystemAdminLoginRequest; import com.zbkj.common.response.MenusResponse; import com.zbkj.common.response.SystemAdminResponse; import com.zbkj.common.response.SystemGroupDataAdminLoginBannerResponse; import com.zbkj.common.response.SystemLoginResponse; import com.zbkj.common.utils.SecurityUtil; import com.zbkj.common.vo.LoginUserVo; import com.zbkj.common.vo.MenuTree; import com.zbkj.service.service.SystemAdminService; import com.zbkj.service.service.SystemConfigService; import com.zbkj.service.service.SystemGroupDataService; import com.zbkj.service.service.SystemMenuService; import org.springframework.beans.BeanUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.security.authentication.AuthenticationManager; import org.springframework.security.authentication.BadCredentialsException; import org.springframework.security.authentication.UsernamePasswordAuthenticationToken; import org.springframework.security.core.Authentication; import org.springframework.security.core.AuthenticationException; import org.springframework.stereotype.Service; import javax.annotation.Resource; import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.stream.Collectors; import java.util.stream.Stream; /** * 管理端登录服务实现类 */ @Service public class AdminLoginServiceImpl implements AdminLoginService { @Resource private TokenComponent tokenComponent; @Resource private AuthenticationManager authenticationManager; @Autowired private SystemAdminService systemAdminService; @Autowired private ValidateCodeService validateCodeService; @Autowired private SystemConfigService systemConfigService; @Autowired private SystemGroupDataService systemGroupDataService; @Autowired private SystemMenuService systemMenuService; /** * PC登录 */ @Override public SystemLoginResponse login(SystemAdminLoginRequest systemAdminLoginRequest, String ip) { // 判断验证码 boolean codeCheckResult = validateCodeService.check(systemAdminLoginRequest.getKey(), systemAdminLoginRequest.getCode()); if (!codeCheckResult) throw new CarException("验证码不正确"); // 用户验证 Authentication authentication = null; // 该方法会去调用UserDetailsServiceImpl.loadUserByUsername try { authentication = authenticationManager.authenticate(new UsernamePasswordAuthenticationToken(systemAdminLoginRequest.getAccount(), systemAdminLoginRequest.getPwd())); } catch (AuthenticationException e) { if (e instanceof BadCredentialsException) { throw new CarException("用户不存在或密码错误"); } throw new CarException(e.getMessage()); } LoginUserVo loginUser = (LoginUserVo) authentication.getPrincipal(); SystemAdmin systemAdmin = loginUser.getUser(); String token = tokenComponent.createToken(loginUser); SystemLoginResponse systemAdminResponse = new SystemLoginResponse(); systemAdminResponse.setToken(token); BeanUtils.copyProperties(systemAdmin, systemAdminResponse); //更新最后登录信息 systemAdmin.setLoginCount(systemAdmin.getLoginCount() + 1); systemAdmin.setLastIp(ip); systemAdminService.updateById(systemAdmin); return systemAdminResponse; } /** * 用户登出 */ @Override public Boolean logout() { LoginUserVo loginUserVo = SecurityUtil.getLoginUserVo(); if (ObjectUtil.isNotNull(loginUserVo)) { // 删除用户缓存记录 tokenComponent.delLoginUser(loginUserVo.getToken()); } return true; } /** * 获取登录页图片 * @return Map */ @Override public Map getLoginPic() { Map map = new HashMap<>(); //背景图 map.put("backgroundImage", systemConfigService.getValueByKey(SysConfigConstants.CONFIG_KEY_ADMIN_LOGIN_BACKGROUND_IMAGE)); //logo map.put("logo", systemConfigService.getValueByKey(SysConfigConstants.CONFIG_KEY_ADMIN_LOGIN_LOGO_LEFT_TOP)); map.put("loginLogo", systemConfigService.getValueByKey(SysConfigConstants.CONFIG_KEY_ADMIN_LOGIN_LOGO_LOGIN)); //轮播图 List bannerList = systemGroupDataService.getListByGid(SysGroupDataConstants.GROUP_DATA_ID_ADMIN_LOGIN_BANNER_IMAGE_LIST, SystemGroupDataAdminLoginBannerResponse.class); map.put("banner", bannerList); return map; } /** * 获取管理员可访问目录 * @return List */ @Override public List getMenus() { LoginUserVo loginUserVo = SecurityUtil.getLoginUserVo(); List roleList = Stream.of(loginUserVo.getUser().getRoles().split(",")).collect(Collectors.toList()); List menuList; if (roleList.contains("1")) {// 超管 menuList = systemMenuService.findAllCatalogue(); } else { menuList = systemMenuService.getMenusByUserId(loginUserVo.getUser().getId()); } // 组装前端对象 List responseList = menuList.stream().map(e -> { MenusResponse response = new MenusResponse(); BeanUtils.copyProperties(e, response); return response; }).collect(Collectors.toList()); MenuTree menuTree = new MenuTree(responseList); return menuTree.buildTree(); } /** * 根据Token获取对应用户信息 */ @Override public SystemAdminResponse getInfoByToken() { LoginUserVo loginUserVo = SecurityUtil.getLoginUserVo(); SystemAdmin systemAdmin = loginUserVo.getUser(); SystemAdminResponse systemAdminResponse = new SystemAdminResponse(); BeanUtils.copyProperties(systemAdmin, systemAdminResponse); List roleList = Stream.of(systemAdmin.getRoles().split(",")).collect(Collectors.toList()); List permList = CollUtil.newArrayList(); if (roleList.contains("1")) { permList.add("*:*:*"); } else { permList = loginUserVo.getPermissions().stream().map(SystemPermissions::getPath).collect(Collectors.toList()); } systemAdminResponse.setPermissionsList(permList); return systemAdminResponse; } }