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<Integer> roleList = ShiroKit.getUser().getRoleList();
|
if (roleList == null || roleList.size() == 0) {
|
ShiroKit.getSubject().logout();
|
model.addAttribute("tips", "该用户没有角色,无法登陆");
|
return "/login.html";
|
}
|
List<MenuNode> menus = menuService.getMenusByRoleIds(roleList);
|
List<MenuNode> 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<LoginWarpper> 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";
|
}
|
}
|