package com.stylefeng.guns.modular.system.controller; import com.google.code.kaptcha.Constants; import com.stylefeng.guns.core.base.controller.BaseController; import com.stylefeng.guns.core.base.tips.Tip; import com.stylefeng.guns.core.common.constant.state.ManagerStatus; import com.stylefeng.guns.core.common.exception.BizExceptionEnum; import com.stylefeng.guns.core.common.exception.InvalidKaptchaException; import com.stylefeng.guns.core.exception.GunsException; import com.stylefeng.guns.core.log.LogManager; import com.stylefeng.guns.core.log.factory.LogTaskFactory; import com.stylefeng.guns.core.node.MenuNode; import com.stylefeng.guns.core.shiro.ShiroKit; import com.stylefeng.guns.core.shiro.ShiroUser; import com.stylefeng.guns.core.util.ApiMenuFilter; import com.stylefeng.guns.core.util.KaptchaUtil; import com.stylefeng.guns.core.util.ToolUtil; import com.stylefeng.guns.modular.system.dto.LoginWarpper; import com.stylefeng.guns.modular.system.factory.UserFactory; import com.stylefeng.guns.modular.system.model.User; import com.stylefeng.guns.modular.system.service.IMenuService; import com.stylefeng.guns.modular.system.service.IUserService; import com.stylefeng.guns.modular.system.transfer.ResgisDto; import com.stylefeng.guns.modular.system.util.R; import io.swagger.annotations.ApiImplicitParam; import io.swagger.annotations.ApiImplicitParams; import io.swagger.annotations.ApiOperation; import org.apache.shiro.authc.UsernamePasswordToken; import org.apache.shiro.subject.Subject; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Controller; import org.springframework.ui.Model; import org.springframework.web.bind.annotation.*; import javax.servlet.http.HttpServletRequest; import java.time.LocalDate; import java.time.format.DateTimeFormatter; import java.util.Date; import java.util.List; import java.util.Random; import static com.stylefeng.guns.core.support.HttpKit.getIp; /** * 登录控制器 * * @author fengshuonan * @Date 2017年1月10日 下午8:25:24 */ @Controller public class LoginController extends BaseController { @Autowired private IMenuService menuService; @Autowired private IUserService userService; @PostMapping("/base/regis") @ApiOperation(value = "注册",tags = "APP登录") @ResponseBody public Tip regis(@RequestBody ResgisDto resgisDto) { // 判断账号是否重复 User theUser = userService.getByAccount(resgisDto.getPhone()); if (theUser != null) { throw new GunsException(BizExceptionEnum.USER_ALREADY_REG); } // 完善账号信息 resgisDto.setSalt(ShiroKit.getRandomSalt(5)); resgisDto.setPassword(ShiroKit.md5(resgisDto.getPassword(), resgisDto.getSalt())); resgisDto.setStatus(ManagerStatus.OK.getCode()); resgisDto.setCreatetime(new Date()); resgisDto.setAccount(resgisDto.getPhone()); User user1 = UserFactory.createUser1(resgisDto); user1.setUid(generateUniqueId()); this.userService.insert(user1); return SUCCESS_TIP; } public static String generateUniqueId() { // 获取当前日期并格式化为yyyyMMdd LocalDate now = LocalDate.now(); DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyyMMdd"); String formattedDate = now.format(formatter); // 生成四位随机数字 Random random = new Random(); int randomNumber = random.nextInt(9999); // 生成0到9998之间的数 if (randomNumber < 1000) { // 确保是四位数 randomNumber += 1000; } return "YH" + formattedDate + String.valueOf(randomNumber); } /** * 跳转到主页 */ @RequestMapping(value = "/", method = RequestMethod.GET) public String index(Model model) { //获取菜单列表 List roleList = ShiroKit.getUser().getRoleList(); if (roleList == null || roleList.size() == 0) { ShiroKit.getSubject().logout(); model.addAttribute("tips", "该用户没有角色,无法登陆"); return "/login.html"; } List menus = menuService.getMenusByRoleIds(roleList); List titles = MenuNode.buildTitle(menus); titles = ApiMenuFilter.build(titles); model.addAttribute("titles", titles); //获取用户头像 Integer id = ShiroKit.getUser().getId(); User user = userService.selectById(id); String avatar = user.getAvatar(); model.addAttribute("avatar", avatar); return "/index.html"; } /** * 跳转到登录页面 */ @RequestMapping(value = "/login", method = RequestMethod.GET) public String login() { if (ShiroKit.isAuthenticated() || ShiroKit.getUser() != null) { return REDIRECT + "/"; } else { return "/login.html"; } } @ResponseBody @PostMapping("/base/login") @ApiOperation(value = "登录操作", tags = {"APP登录"}, notes = "") @ApiImplicitParams({ @ApiImplicitParam(value = "手机号码", name = "phone", required = true, dataType = "String"), @ApiImplicitParam(value = "密码", name = "password", required = true, dataType = "String") }) public R driverLogin(String phone, String password){ try { return userService.driverLogin(phone, password); }catch (Exception e){ e.printStackTrace(); return R.fail(); } } /** * 点击登录执行的动作 */ @RequestMapping(value = "/login", method = RequestMethod.POST) public String loginVali() { String username = super.getPara("username").trim(); String password = super.getPara("password").trim(); String remember = super.getPara("remember"); //验证验证码是否正确 if (KaptchaUtil.getKaptchaOnOff()) { String kaptcha = super.getPara("kaptcha").trim(); String code = (String) super.getSession().getAttribute(Constants.KAPTCHA_SESSION_KEY); if (ToolUtil.isEmpty(kaptcha) || !kaptcha.equalsIgnoreCase(code)) { throw new InvalidKaptchaException(); } } Subject currentUser = ShiroKit.getSubject(); UsernamePasswordToken token = new UsernamePasswordToken(username, password.toCharArray()); if ("on".equals(remember)) { token.setRememberMe(true); } else { token.setRememberMe(false); } currentUser.login(token); ShiroUser shiroUser = ShiroKit.getUser(); super.getSession().setAttribute("shiroUser", shiroUser); super.getSession().setAttribute("username", shiroUser.getAccount()); LogManager.me().executeLog(LogTaskFactory.loginLog(shiroUser.getId(), getIp())); ShiroKit.getSession().setAttribute("sessionFlag", true); return REDIRECT + "/"; } /** * 退出登录 */ @RequestMapping(value = "/logout", method = RequestMethod.GET) public String logOut() { LogManager.me().executeLog(LogTaskFactory.exitLog(ShiroKit.getUser().getId(), getIp())); ShiroKit.getSubject().logout(); deleteAllCookie(); return REDIRECT + "/login"; } }