Files
Tbed/src/main/java/cn/hellohao/controller/UserController.java
T

414 lines
18 KiB
Java

package cn.hellohao.controller;
import cn.hellohao.auth.filter.SubjectFilter;
import cn.hellohao.auth.token.JWTUtil;
import cn.hellohao.config.SysName;
import cn.hellohao.pojo.*;
import cn.hellohao.service.*;
import cn.hellohao.utils.Base64Encryption;
import cn.hellohao.utils.NewSendEmail;
import cn.hellohao.utils.Print;
import cn.hellohao.utils.SetText;
import cn.hutool.core.util.HexUtil;
import com.alibaba.fastjson.JSONObject;
import org.apache.shiro.SecurityUtils;
import org.apache.shiro.authc.IncorrectCredentialsException;
import org.apache.shiro.authc.UnknownAccountException;
import org.apache.shiro.authc.UsernamePasswordToken;
import org.apache.shiro.subject.Subject;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
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 javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.UUID;
@Controller
@RequestMapping("/user")
public class UserController {
@Autowired
private UserService userService;
@Autowired
private EmailConfigService emailConfigService;
@Autowired
private ConfdataService confdataService;
@Autowired
private UploadConfigService uploadConfigService;
@Autowired
private SysConfigService sysConfigService;
@Autowired
IRedisService iRedisService;
private Logger logger = LoggerFactory.getLogger(UserController.class);
@PostMapping("/register")
@ResponseBody
public Msg Register(HttpServletRequest httpServletRequest, @RequestParam(value = "data", defaultValue = "") String data) {
Msg msg = new Msg();
JSONObject jsonObj = JSONObject.parseObject(data);
String username = jsonObj.getString("username");
String email = jsonObj.getString("email");
String password = Base64Encryption.encryptBASE64(jsonObj.getString("password").getBytes());
String verifyCodeForRegister = jsonObj.getString("verifyCode");
Object redis_verifyCodeForRegister = iRedisService.getValue("verifyCodeForRegister_"+httpServletRequest.getHeader("verifyCodeForRegister"));
if(!SetText.checkEmail(email)){
//邮箱格式不正确
msg.setCode("110403");
msg.setInfo("邮箱格式不正确");
return msg;
}
String regex = "^\\w+$";
if(username.length()>30){
//用户名格式不正确
msg.setCode("110403");
msg.setInfo("用户名不得超过30位字符");
return msg;
}
if(!username.matches (regex)){
//用户名格式不正确
msg.setCode("110403");
msg.setInfo("用户名不得含有特殊字符");
return msg;
}
if(null==redis_verifyCodeForRegister){
msg.setCode("4035");
msg.setInfo("验证码已失效,请重新弄获取。");
return msg;
}else if(null==verifyCodeForRegister){
msg.setCode("4036");
msg.setInfo("验证码不能为空。");
return msg;
}
if((redis_verifyCodeForRegister.toString().toLowerCase()).compareTo((verifyCodeForRegister.toLowerCase()))==0){
User user = new User();
UploadConfig updateConfig = uploadConfigService.getUpdateConfig();
EmailConfig emailConfig = emailConfigService.getemail();
Integer countusername = userService.countusername(username);
Integer countmail = userService.countmail(email);
SysConfig sysConfig = sysConfigService.getstate();
if(sysConfig.getRegister()!=1){
msg.setCode("110403");
msg.setInfo("本站已暂时关闭用户注册功能");
return msg;
}
if(countusername == 1 || !SysName.CheckSysName(username)){
msg.setCode("110406");
msg.setInfo("此用户名已存在");
return msg;
}
if(countmail == 1){
msg.setCode("110407");
msg.setInfo("此邮箱已被注册");
return msg;
}
String uid = UUID.randomUUID().toString().replace("-", "").toLowerCase();
SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");//设置日期格式
String birthder = df.format(new Date());// new Date()为获取当前系统时间
user.setLevel(1);
user.setUid(uid);
user.setBirthder(birthder);
user.setMemory(updateConfig.getUsermemory());
user.setGroupid(1);
user.setEmail(email);
user.setUsername(username);
user.setPassword(password);
user.setToken(UUID.randomUUID().toString().replace("-", ""));
final Confdata confdata = confdataService.selectConfdata("config");
JSONObject jsonObject = JSONObject.parseObject(confdata.getJsondata());
Integer type = 0;
if(emailConfig.getUsing()==1){
user.setIsok(0);
//注册完发激活链接
Thread thread = new Thread() {
public void run() {
Integer a = NewSendEmail.sendEmail(emailConfig,user.getUsername(), uid, user.getEmail(),jsonObject);
}
};
thread.start();
msg.setInfo("注册成功,请注意查收邮箱尽快激活账户");
}else{
//直接注册
user.setIsok(1);
msg.setInfo("注册成功,快去登陆吧");
}
userService.register(user);
}else{
msg.setCode("110408");
msg.setInfo("验证码不正确");//失效也要处理。
}
return msg;
}
@PostMapping(value = {"/validateEmail","/wechat/validateEmail"})
@ResponseBody
public Msg validateEmail(HttpServletRequest httpServletRequest,@RequestParam(value = "data", defaultValue = "") String data) {
Msg msg = new Msg();
try {
JSONObject jsonObj = JSONObject.parseObject(data);
String email = jsonObj.getString("email");
String towSendEmailCode = jsonObj.getString("towSendEmailCode");
Object verifyCodeFortowSendEmail =iRedisService.getValue("verifyCodeFortowSendEmail_"+httpServletRequest.getHeader("verifyCodeFortowSendEmail"));
User u = new User();
u.setEmail(email);
User user = userService.getUsers(u);
if(user.getIsok()!=0){
msg.setInfo("不知细叶谁裁出,二月春风似剪刀");
return msg;
}
if(null==verifyCodeFortowSendEmail){
msg.setCode("4035");
msg.setInfo("验证码已失效,请重新弄获取。");
return msg;
}else if(null==towSendEmailCode){
msg.setCode("4036");
msg.setInfo("验证码不能为空。");
return msg;
}
if((verifyCodeFortowSendEmail.toString().toLowerCase()).compareTo((towSendEmailCode.toLowerCase()))==0){
//注册完发激活链接
final Confdata dataJson = confdataService.selectConfdata("config");
JSONObject confdata = JSONObject.parseObject(dataJson.getJsondata());
EmailConfig emailConfig = emailConfigService.getemail();
Thread thread = new Thread() {
public void run() {
Integer a = NewSendEmail.sendEmail(emailConfig,user.getUsername(), user.getUid(), user.getEmail(),confdata);
}
};
thread.start();
msg.setInfo("邮件已发送,请注意查收邮箱尽快激活账户(如果没收到,请检查垃圾邮件)");
}else{
msg.setCode("110408");
msg.setInfo("验证码不正确");
return msg;
}
}catch (Exception e){
logger.error("报错位置:/validateEmail",e);
msg.setCode("500");
msg.setInfo("邮件发送失败");
}
return msg;
}
@PostMapping("/login")//new
@ResponseBody
public Msg login(HttpServletRequest httpServletRequest,@RequestParam(value = "data", defaultValue = "") String data) {
Msg msg = new Msg();
JSONObject jsonObj = JSONObject.parseObject(data);
String email = jsonObj.getString("email");
String password = Base64Encryption.encryptBASE64(jsonObj.getString("password").getBytes());
String verifyCode = jsonObj.getString("verifyCode");
if(null == email || null == password || null == verifyCode){
msg.setCode("5000");
msg.setInfo("登录信息不正确");
return msg;
}
if(email.replace(" ","").equals("") || password.replace(" ","").equals("")
|| verifyCode.replace(" ","").equals("")){
msg.setCode("5000");
msg.setInfo("登录信息不正确");
return msg;
}
Object redis_VerifyCode = iRedisService.getValue("verifyCode_"+httpServletRequest.getHeader("verifyCode"));
if(null==redis_VerifyCode){
msg.setCode("4035");
msg.setInfo("验证码已失效,请重新弄获取。");
return msg;
}else if(null==verifyCode){
msg.setCode("4036");
msg.setInfo("验证码不能为空。");
return msg;
}
if((redis_VerifyCode.toString().toLowerCase()).compareTo((verifyCode.toLowerCase()))==0){
Subject subject = SecurityUtils.getSubject();
UsernamePasswordToken tokenOBJ = new UsernamePasswordToken(email,password);
tokenOBJ.setRememberMe(true);
try {
subject.login(tokenOBJ);
SecurityUtils.getSubject().getSession().setTimeout(3600000);
JSONObject jsonObject = new JSONObject();
User user = (User) SecurityUtils.getSubject().getPrincipal();
if(user.getIsok()==0){
msg.setInfo("你的账号暂未激活");
msg.setData(user.getEmail());
msg.setCode("110402");
return msg;
}
if(user.getIsok()<0){
msg.setInfo("你的账户已被冻结");
msg.setCode("110403");
return msg;
}
String token = JWTUtil.createToken(user);
Subject su = SecurityUtils.getSubject();
System.out.println("当前用户角色:admin:"+su.hasRole("admin"));
msg.setInfo("登录成功");
jsonObject.put("token",token);
jsonObject.put("RoleLevel",user.getLevel()==2?"admin":"user");
jsonObject.put("userName",user.getUsername());
msg.setData(jsonObject);
return msg;
} catch (UnknownAccountException e) {
//此异常说明用户名不存在
msg.setCode("4000");
msg.setInfo("登录账号不存在");
System.err.println("邮箱/用户名不存在");
// e.printStackTrace();
return msg;
}catch (IncorrectCredentialsException e) {
msg.setCode("4000");
msg.setInfo("登录密码错误");
System.err.println("密码不存在");
// e.printStackTrace();
return msg;
}catch (Exception e) {
msg.setCode("5000");
msg.setInfo("登录失败");
System.err.println("登录失败");
e.printStackTrace();
return msg;
}
}else{
msg.setCode("40034");
msg.setInfo("验证码不正确");
}
return msg;
}
@RequestMapping(value = "/activation", method = RequestMethod.GET)
public String activation(Model model, HttpServletRequest request, HttpSession session, String activation, String username) {
Integer ret = 0;
User u2 = new User();
u2.setUid(activation);
User user = userService.getUsers(u2);
model.addAttribute("webhost",SubjectFilter.WEBHOST);
if (user != null && user.getIsok() == 0) {
userService.uiduser(activation);
model.addAttribute("title","激活成功");
model.addAttribute("name","Hi~"+username);
model.addAttribute("note","您的账号已成功激活看");
return "msg";
} else {
model.addAttribute("title","操作无效");
model.addAttribute("name","该页面为无效页面");
model.addAttribute("note","请返回首页");
return "msg";
}
}
@PostMapping(value = "/logout")//new
@ResponseBody
public Msg exit(Model model, HttpServletRequest request, HttpServletResponse response, HttpSession session) {
Msg msg = new Msg();
Subject subject = SecurityUtils.getSubject();
subject.logout();
msg.setInfo("退出成功");
Print.Normal("用户账号退出成功");
return msg;
}
@PostMapping("/retrievePass")
@ResponseBody
public Msg retrievePass(HttpServletRequest httpServletRequest, @RequestParam(value = "data", defaultValue = "") String data) {
Msg msg = new Msg();
try {
JSONObject jsonObj = JSONObject.parseObject(data);
String email = jsonObj.getString("email");
String retrieveCode = jsonObj.getString("retrieveCode");
Object redis_verifyCodeForEmailRetrieve =iRedisService.getValue("verifyCodeForRetrieve_"+httpServletRequest.getHeader("verifyCodeForRetrieve"));
EmailConfig emailConfig = emailConfigService.getemail();
if(null==redis_verifyCodeForEmailRetrieve){
msg.setCode("4035");
msg.setInfo("验证码已失效,请重新弄获取。");
return msg;
}else if(null==retrieveCode){
msg.setCode("4036");
msg.setInfo("验证码不能为空。");
return msg;
}
if((redis_verifyCodeForEmailRetrieve.toString().toLowerCase()).compareTo((retrieveCode.toLowerCase()))!=0){
msg.setCode("40034");
msg.setInfo("验证码不正确");
return msg;
}
Integer ret = userService.countmail(email);
if(ret>0){
if(emailConfig.getUsing()==1){
User u2 = new User();
u2.setEmail(email);
User user = userService.getUsers(u2);
if(user.getIsok()==-1){
msg.setCode("110110");
msg.setInfo("当前用户已被冻结,禁止操作");
return msg;
}
final Confdata confdata = confdataService.selectConfdata("config");
JSONObject jsonObject = JSONObject.parseObject(confdata.getJsondata());
Thread thread = new Thread() {
public void run() {
Integer a = NewSendEmail.sendEmailFindPass(emailConfig,user.getUsername(), user.getUid(), user.getEmail(),jsonObject);
}
};
thread.start();
msg.setInfo("重置密码的验证链接已发送至该邮箱,请前往邮箱验证并重置密码。【若长时间未收到邮件,请检查垃圾箱】");
}else{
msg.setCode("400");
msg.setInfo("本站暂未开启邮箱服务,请联系管理员");
}
}else{
msg.setCode("110404");
msg.setInfo("未找到邮箱所在的用户");
}
}catch (Exception e){
e.printStackTrace();
msg.setCode("110500");
msg.setInfo("系统发生错误");
}
return msg;
}
@RequestMapping(value = "/retrieve", method = RequestMethod.GET)
public String retrieve(Model model, String activation,String cip) {
Integer ret = 0;
try {
User u2 = new User();
u2.setUid(activation);
User user = userService.getUsers(u2);
user.setIsok(1);
String new_pass = HexUtil.decodeHexStr(cip);//解密密码
user.setPassword(Base64Encryption.encryptBASE64(new_pass.getBytes()));
String uid = UUID.randomUUID().toString().replace("-", "").toLowerCase();
user.setUid(uid);
if (user != null) {
Integer r = userService.changeUser(user);
model.addAttribute("title","成功");
model.addAttribute("name","新密码:"+new_pass);//
model.addAttribute("note","密码已被系统重置,请即使登录修改你的新密码");
} else {
model.addAttribute("title","抱歉");
model.addAttribute("name","为获取到用户信息");
model.addAttribute("note","操作失败");
}
}catch (Exception e){
e.printStackTrace();
model.addAttribute("title","抱歉");
model.addAttribute("name","系统操作过程中发生错误");
model.addAttribute("note","操作失败");
}
model.addAttribute("webhost", SubjectFilter.WEBHOST);
return "msg";
}
}