|
|
|
@ -36,133 +36,188 @@ import com.wsk.tool.Pornographic;*/
|
|
|
|
|
@Slf4j
|
|
|
|
|
public class UserController {
|
|
|
|
|
|
|
|
|
|
// 使用@Resource注解注入UserInformationService,用于处理用户信息相关业务逻辑,由Spring框架自动装配
|
|
|
|
|
@Resource
|
|
|
|
|
private UserInformationService userInformationService;
|
|
|
|
|
// 使用@Resource注解注入UserPasswordService,用于处理用户密码相关业务逻辑,由Spring框架自动装配
|
|
|
|
|
@Resource
|
|
|
|
|
private UserPasswordService userPasswordService;
|
|
|
|
|
// 使用@Resource注解注入UserCollectionService,用于处理用户收藏相关业务逻辑,由Spring框架自动装配
|
|
|
|
|
@Resource
|
|
|
|
|
private UserCollectionService userCollectionService;
|
|
|
|
|
// 使用@Resource注解注入UserReleaseService,用于处理用户发布相关业务逻辑(从变量名推测,具体需看业务),由Spring框架自动装配
|
|
|
|
|
@Resource
|
|
|
|
|
private UserReleaseService userReleaseService;
|
|
|
|
|
// 使用@Resource注解注入BoughtShopService,用于处理用户购买店铺相关业务逻辑(从变量名推测,具体需看业务),由Spring框架自动装配
|
|
|
|
|
@Resource
|
|
|
|
|
private BoughtShopService boughtShopService;
|
|
|
|
|
// 使用@Resource注解注入UserWantService,用于处理用户求购相关业务逻辑,由Spring框架自动装配
|
|
|
|
|
@Resource
|
|
|
|
|
private UserWantService userWantService;
|
|
|
|
|
// 使用@Resource注解注入ShopCarService,用于处理购物车相关业务逻辑(从变量名推测,具体需看业务),由Spring框架自动装配
|
|
|
|
|
@Resource
|
|
|
|
|
private ShopCarService shopCarService;
|
|
|
|
|
// 使用@Resource注解注入OrderFormService,用于处理订单表单相关业务逻辑,由Spring框架自动装配
|
|
|
|
|
@Resource
|
|
|
|
|
private OrderFormService orderFormService;
|
|
|
|
|
// 使用@Resource注解注入GoodsOfOrderFormService,用于处理订单表单中商品相关业务逻辑(从变量名推测,具体需看业务),由Spring框架自动装配
|
|
|
|
|
@Resource
|
|
|
|
|
private GoodsOfOrderFormService goodsOfOrderFormService;
|
|
|
|
|
// 使用@Resource注解注入UserStateService,用于处理用户状态相关业务逻辑(从变量名推测,具体需看业务),由Spring框架自动装配
|
|
|
|
|
@Resource
|
|
|
|
|
private UserStateService userStateService;
|
|
|
|
|
// 使用@Resource注解注入ShopInformationService,用于处理店铺信息相关业务逻辑,由Spring框架自动装配
|
|
|
|
|
@Resource
|
|
|
|
|
private ShopInformationService shopInformationService;
|
|
|
|
|
// 使用@Resource注解注入GoodsCarService,用于处理商品车(可能类似购物车,具体看业务)相关业务逻辑,由Spring框架自动装配
|
|
|
|
|
@Resource
|
|
|
|
|
private GoodsCarService goodsCarService;
|
|
|
|
|
// 使用@Resource注解注入SpecificeService,具体业务逻辑需看其具体实现(从变量名较难准确判断,可能是特定业务相关),由Spring框架自动装配
|
|
|
|
|
@Resource
|
|
|
|
|
private SpecificeService specificeService;
|
|
|
|
|
// 使用@Resource注解注入ClassificationService,可能用于分类相关业务逻辑(从变量名推测),由Spring框架自动装配
|
|
|
|
|
@Resource
|
|
|
|
|
private ClassificationService classificationService;
|
|
|
|
|
// 使用@Resource注解注入AllKindsService,具体业务不太明确(从变量名较难准确判断),由Spring框架自动装配
|
|
|
|
|
@Resource
|
|
|
|
|
private AllKindsService allKindsService;
|
|
|
|
|
// 使用@Resource注解注入ShopContextService,可能用于店铺上下文相关业务逻辑(从变量名推测),由Spring框架自动装配
|
|
|
|
|
@Resource
|
|
|
|
|
private ShopContextService shopContextService;
|
|
|
|
|
|
|
|
|
|
//进入登录界面
|
|
|
|
|
// 处理进入登录界面的请求,使用GET方法访问/login.do路径时触发该方法
|
|
|
|
|
// 返回登录页面的视图名称,同时生成并设置token到session和model中,用于后续验证等操作
|
|
|
|
|
@RequestMapping(value = "/login.do", method = RequestMethod.GET)
|
|
|
|
|
public String login(HttpServletRequest request, Model model) {
|
|
|
|
|
// 通过单例模式获取TokenProccessor实例,并生成一个token,用于标识本次登录请求等相关操作(具体看业务)
|
|
|
|
|
String token = TokenProccessor.getInstance().makeToken();
|
|
|
|
|
// 在日志中记录进入登录界面以及生成的token信息,方便后续查看日志排查问题
|
|
|
|
|
log.info("进入登录界面,token为:" + token);
|
|
|
|
|
// 将生成的token设置到HttpServletRequest的session中,方便后续在不同请求间共享这个token
|
|
|
|
|
request.getSession().setAttribute("token", token);
|
|
|
|
|
// 将token添加到Model中,Model用于在视图渲染时传递数据,可能在前端页面会使用到这个token
|
|
|
|
|
model.addAttribute("token", token);
|
|
|
|
|
// 返回登录页面的视图名称,视图解析器会根据这个名称找到对应的页面进行渲染显示
|
|
|
|
|
return "page/login_page";
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
//退出
|
|
|
|
|
// 处理用户退出的请求,访问/logout.do路径时触发该方法
|
|
|
|
|
// 移除用户相关信息在session中的属性,然后重定向到相应页面
|
|
|
|
|
@RequestMapping(value = "/logout.do")
|
|
|
|
|
public String logout(HttpServletRequest request) {
|
|
|
|
|
try {
|
|
|
|
|
// 从session中移除用户信息相关的属性,比如用户详细信息、用户ID等,实现用户退出登录的效果
|
|
|
|
|
request.getSession().removeAttribute("userInformation");
|
|
|
|
|
request.getSession().removeAttribute("uid");
|
|
|
|
|
System.out.println("logout");
|
|
|
|
|
} catch (Exception e) {
|
|
|
|
|
// 如果出现异常,打印异常栈信息方便排查问题,然后重定向到首页(这里假设/home.do是首页,具体看配置)
|
|
|
|
|
e.printStackTrace();
|
|
|
|
|
return "redirect:/home.do";
|
|
|
|
|
}
|
|
|
|
|
// 正常情况下,重定向到根路径(通常是网站首页,具体看项目配置)
|
|
|
|
|
return "redirect:/";
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
//用户注册,拥有插入数据而已,没什么用的
|
|
|
|
|
// 用户注册方法,使用POST方法访问/registered.do路径时触发该方法
|
|
|
|
|
// 接收用户注册相关信息,先插入用户基本信息,再插入密码信息等,根据操作结果返回相应提示信息
|
|
|
|
|
@RequestMapping(value = "/registered.do", method = RequestMethod.POST)
|
|
|
|
|
public String registered(Model model,
|
|
|
|
|
@RequestParam String name, @RequestParam String phone, @RequestParam String password) {
|
|
|
|
|
// 创建一个UserInformation对象,用于封装要插入的用户基本信息
|
|
|
|
|
UserInformation userInformation = new UserInformation();
|
|
|
|
|
// 设置用户名,将前端传入的用户名赋值给用户信息对象
|
|
|
|
|
userInformation.setUsername(name);
|
|
|
|
|
// 设置用户手机号,将前端传入的手机号赋值给用户信息对象
|
|
|
|
|
userInformation.setPhone(phone);
|
|
|
|
|
// 设置用户信息的修改时间为当前时间,通常用于记录数据的更新时间等业务逻辑
|
|
|
|
|
userInformation.setModified(new Date());
|
|
|
|
|
// 设置用户信息的创建时间为当前时间,记录用户注册的时间
|
|
|
|
|
userInformation.setCreatetime(new Date());
|
|
|
|
|
// 调用userInformationService的insertSelective方法插入用户基本信息,根据返回结果判断插入是否成功,若返回1表示插入成功
|
|
|
|
|
if (userInformationService.insertSelective(userInformation) == 1) {
|
|
|
|
|
// 如果用户基本信息插入成功,通过手机号查询该用户的ID,用于后续关联密码等信息
|
|
|
|
|
int uid = userInformationService.selectIdByPhone(phone);
|
|
|
|
|
// 创建一个UserPassword对象,用于封装用户密码相关信息
|
|
|
|
|
UserPassword userPassword = new UserPassword();
|
|
|
|
|
// 设置用户密码的修改时间为当前时间
|
|
|
|
|
userPassword.setModified(new Date());
|
|
|
|
|
// 对用户传入的密码进行MD5加密(通过StringUtils工具类的实例方法),提高密码安全性,然后设置到密码对象中
|
|
|
|
|
password = StringUtils.getInstance().getMD5(password);
|
|
|
|
|
userPassword.setPassword(password);
|
|
|
|
|
// 设置用户密码对应的用户ID,关联到刚插入的用户基本信息记录
|
|
|
|
|
userPassword.setUid(uid);
|
|
|
|
|
// 调用userPasswordService的insertSelective方法插入用户密码信息,插入结果保存到result变量中
|
|
|
|
|
int result = userPasswordService.insertSelective(userPassword);
|
|
|
|
|
if (result != 1) {
|
|
|
|
|
// 如果插入用户密码信息失败,将"fail"结果添加到Model中,并返回"success"视图(这里视图名可能不太准确,具体看业务逻辑对应的页面)
|
|
|
|
|
if (result!= 1) {
|
|
|
|
|
model.addAttribute("result", "fail");
|
|
|
|
|
return "success";
|
|
|
|
|
}
|
|
|
|
|
// 如果用户密码插入成功,将"success"结果添加到Model中,并返回"success"视图
|
|
|
|
|
model.addAttribute("result", "success");
|
|
|
|
|
return "success";
|
|
|
|
|
}
|
|
|
|
|
// 如果用户基本信息插入失败,将"fail"结果添加到Model中,并返回"success"视图
|
|
|
|
|
model.addAttribute("result", "fail");
|
|
|
|
|
return "success";
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
//用户注册
|
|
|
|
|
// @RequestMapping(value = "/registered", method = RequestMethod.GET)
|
|
|
|
|
// public String registered() {
|
|
|
|
|
// return "registered";
|
|
|
|
|
// }
|
|
|
|
|
// 以下是另一个用户注册的方法,被注释掉了,可能是之前的实现或者备用的逻辑,暂时未启用
|
|
|
|
|
// 该方法使用GET方法访问/registered路径时触发,直接返回注册页面的视图名称(这里假设视图名称就是"registered",具体看业务配置)
|
|
|
|
|
// @RequestMapping(value = "/registered", method = RequestMethod.GET)
|
|
|
|
|
// public String registered() {
|
|
|
|
|
// return "registered";
|
|
|
|
|
// }
|
|
|
|
|
|
|
|
|
|
//验证登录
|
|
|
|
|
// 处理验证登录的请求,使用POST方法访问/login.do路径时触发该方法(与GET方法访问/login.do路径的处理逻辑不同,是另一个重载方法)
|
|
|
|
|
// 根据传入的手机号、密码、token等信息验证用户登录是否合法,根据验证结果进行相应的重定向操作
|
|
|
|
|
@RequestMapping(value = "/login.do", method = RequestMethod.POST)
|
|
|
|
|
public String login(HttpServletRequest request,
|
|
|
|
|
@RequestParam String phone, @RequestParam String password, @RequestParam String token) {
|
|
|
|
|
// 从session中获取之前在登录界面(GET方法的/login.do逻辑中设置的)生成的token,用于和本次传入的token对比,防止重复提交等情况
|
|
|
|
|
String loginToken = (String) request.getSession().getAttribute("token");
|
|
|
|
|
// 如果传入的手机号或者密码为空,直接重定向到登录页面,让用户重新输入
|
|
|
|
|
if (StringUtils.getInstance().isNullOrEmpty(phone) || StringUtils.getInstance().isNullOrEmpty(password)) {
|
|
|
|
|
return "redirect:/login.do";
|
|
|
|
|
}
|
|
|
|
|
//防止重复提交
|
|
|
|
|
if (StringUtils.getInstance().isNullOrEmpty(token) || !token.equals(loginToken)) {
|
|
|
|
|
// 防止重复提交,如果传入的token为空或者与session中的token不一致,重定向到登录页面
|
|
|
|
|
if (StringUtils.getInstance().isNullOrEmpty(token) ||!token.equals(loginToken)) {
|
|
|
|
|
return "redirect:/login.do";
|
|
|
|
|
}
|
|
|
|
|
// 调用getId方法(原代码中未显示该方法具体实现,推测是验证手机号和密码是否匹配等逻辑并获取用户相关信息),根据返回结果判断验证情况
|
|
|
|
|
boolean b = getId(phone, password, request);
|
|
|
|
|
//失败,不存在该手机号码
|
|
|
|
|
// 如果验证失败,即不存在该手机号码对应的用户,重定向到登录页面并带上错误提示信息
|
|
|
|
|
if (!b) {
|
|
|
|
|
return "redirect:/login.do?msg=不存在该手机号码";
|
|
|
|
|
}
|
|
|
|
|
// 如果验证成功,重定向到根路径(通常是网站首页,具体看项目配置)
|
|
|
|
|
return "redirect:/";
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
//查看用户基本信息
|
|
|
|
|
// 处理查看用户基本信息的请求,访问/personal_info.do路径时触发该方法
|
|
|
|
|
// 从session中获取用户信息,若存在则生成新的token并设置到session和model中,然后返回用户基本信息页面的视图名称
|
|
|
|
|
@RequestMapping(value = "/personal_info.do")
|
|
|
|
|
public String personalInfo(HttpServletRequest request, Model model) {
|
|
|
|
|
// 从session中获取用户信息对象,如果获取到的对象为空,说明用户未登录,重定向到登录页面
|
|
|
|
|
UserInformation userInformation = (UserInformation) request.getSession().getAttribute("userInformation");
|
|
|
|
|
if (StringUtils.getInstance().isNullOrEmpty(userInformation)) {
|
|
|
|
|
return "redirect:/login.do";
|
|
|
|
|
}
|
|
|
|
|
// 生成一个新的token,用于本次查看用户基本信息操作的相关验证等(具体看业务)
|
|
|
|
|
String personalInfoToken = TokenProccessor.getInstance().makeToken();
|
|
|
|
|
// 将新生成的token设置到HttpServletRequest的session中
|
|
|
|
|
request.getSession().setAttribute("personalInfoToken", personalInfoToken);
|
|
|
|
|
// 将token添加到Model中,方便在前端页面使用(可能用于页面数据验证等操作)
|
|
|
|
|
model.addAttribute("token", personalInfoToken);
|
|
|
|
|
// 将用户信息对象添加到Model中,方便在前端页面展示用户的基本信息
|
|
|
|
|
model.addAttribute("userInformation", userInformation);
|
|
|
|
|
// 返回用户基本信息页面的视图名称,视图解析器会根据这个名称找到对应的页面进行渲染显示
|
|
|
|
|
return "page/personal/personal_info";
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
//完善用户基本信息,认证
|
|
|
|
|
// 处理完善用户基本信息(认证)的请求,使用POST方法访问/certification.do路径时触发该方法
|
|
|
|
|
// 接收用户提交的各种基本信息,进行格式校验等操作后更新用户信息,根据更新结果返回相应的提示信息(封装在Map中)
|
|
|
|
|
@RequestMapping(value = "/certification.do", method = RequestMethod.POST)
|
|
|
|
|
@ResponseBody
|
|
|
|
|
public Map certification(HttpServletRequest request,
|
|
|
|
@ -171,63 +226,72 @@ public class UserController {
|
|
|
|
|
@RequestParam(required = false) String clazz, @RequestParam String token,
|
|
|
|
|
@RequestParam(required = false) String sno, @RequestParam(required = false) String dormitory,
|
|
|
|
|
@RequestParam(required = false) String gender) {
|
|
|
|
|
// 从session中获取用户信息对象,如果为空说明用户未登录,直接返回默认的提示信息(result为0的Map)
|
|
|
|
|
UserInformation userInformation = (UserInformation) request.getSession().getAttribute("userInformation");
|
|
|
|
|
Map<String, Integer> map = new HashMap<>();
|
|
|
|
|
map.put("result", 0);
|
|
|
|
|
//该用户还没有登录
|
|
|
|
|
if (StringUtils.getInstance().isNullOrEmpty(userInformation)) {
|
|
|
|
|
return map;
|
|
|
|
|
}
|
|
|
|
|
// 从session中获取之前在查看用户基本信息操作中设置的personalInfoToken,用于防止重复提交等验证
|
|
|
|
|
String certificationToken = (String) request.getSession().getAttribute("personalInfoToken");
|
|
|
|
|
//防止重复提交
|
|
|
|
|
// boolean b = token.equals(certificationToken);
|
|
|
|
|
// 防止重复提交,如果获取到的certificationToken为空,直接返回默认的提示信息(result为0的Map)
|
|
|
|
|
if (StringUtils.getInstance().isNullOrEmpty(certificationToken)) {
|
|
|
|
|
return map;
|
|
|
|
|
} else {
|
|
|
|
|
// 如果验证通过,移除session中的certificationToken,避免重复使用
|
|
|
|
|
request.getSession().removeAttribute("certificationToken");
|
|
|
|
|
}
|
|
|
|
|
if (userName != null && userName.length() < 25) {
|
|
|
|
|
// 如果传入的用户名不为空且长度小于25,对用户名进行空格替换等格式化操作(通过StringUtils工具类),然后设置到用户信息对象中
|
|
|
|
|
if (userName!= null && userName.length() < 25) {
|
|
|
|
|
userName = StringUtils.getInstance().replaceBlank(userName);
|
|
|
|
|
userInformation.setUsername(userName);
|
|
|
|
|
} else if (userName != null && userName.length() >= 25) {
|
|
|
|
|
} else if (userName!= null && userName.length() >= 25) {
|
|
|
|
|
// 如果用户名长度大于等于25,不符合要求,直接返回默认的提示信息(result为0的Map)
|
|
|
|
|
return map;
|
|
|
|
|
}
|
|
|
|
|
if (realName != null && realName.length() < 25) {
|
|
|
|
|
// 与处理用户名类似,对真实姓名进行格式校验和设置操作,如果不符合要求则返回默认提示信息
|
|
|
|
|
if (realName!= null && realName.length() < 25) {
|
|
|
|
|
realName = StringUtils.getInstance().replaceBlank(realName);
|
|
|
|
|
userInformation.setRealname(realName);
|
|
|
|
|
} else if (realName != null && realName.length() >= 25) {
|
|
|
|
|
} else if (realName!= null && realName.length() >= 25) {
|
|
|
|
|
return map;
|
|
|
|
|
}
|
|
|
|
|
if (clazz != null && clazz.length() < 25) {
|
|
|
|
|
// 对班级信息进行格式校验和设置操作,如果不符合要求则返回默认提示信息
|
|
|
|
|
if (clazz!= null && clazz.length() < 25) {
|
|
|
|
|
clazz = StringUtils.getInstance().replaceBlank(clazz);
|
|
|
|
|
userInformation.setClazz(clazz);
|
|
|
|
|
} else if (clazz != null && clazz.length() >= 25) {
|
|
|
|
|
} else if (clazz!= null && clazz.length() >= 25) {
|
|
|
|
|
return map;
|
|
|
|
|
}
|
|
|
|
|
if (sno != null && sno.length() < 25) {
|
|
|
|
|
// 对学号信息进行格式校验和设置操作,如果不符合要求则返回默认提示信息
|
|
|
|
|
if (sno!= null && sno.length() < 25) {
|
|
|
|
|
sno = StringUtils.getInstance().replaceBlank(sno);
|
|
|
|
|
userInformation.setSno(sno);
|
|
|
|
|
} else if (sno != null && sno.length() >= 25) {
|
|
|
|
|
} else if (sno!= null && sno.length() >= 25) {
|
|
|
|
|
return map;
|
|
|
|
|
}
|
|
|
|
|
if (dormitory != null && dormitory.length() < 25) {
|
|
|
|
|
// 对宿舍信息进行格式校验和设置操作,如果不符合要求则返回默认提示信息
|
|
|
|
|
if (dormitory!= null && dormitory.length() < 25) {
|
|
|
|
|
dormitory = StringUtils.getInstance().replaceBlank(dormitory);
|
|
|
|
|
userInformation.setDormitory(dormitory);
|
|
|
|
|
} else if (dormitory != null && dormitory.length() >= 25) {
|
|
|
|
|
} else if (dormitory!= null && dormitory.length() >= 25) {
|
|
|
|
|
return map;
|
|
|
|
|
}
|
|
|
|
|
if (gender != null && gender.length() <= 2) {
|
|
|
|
|
// 对性别信息进行格式校验和设置操作,如果不符合要求则返回默认提示信息
|
|
|
|
|
if (gender!= null && gender.length() <= 2) {
|
|
|
|
|
gender = StringUtils.getInstance().replaceBlank(gender);
|
|
|
|
|
userInformation.setGender(gender);
|
|
|
|
|
} else if (gender != null && gender.length() > 2) {
|
|
|
|
|
} else if (gender!= null && gender.length() > 2) {
|
|
|
|
|
return map;
|
|
|
|
|
}
|
|
|
|
|
// 调用userInformationService的updateByPrimaryKeySelective方法更新用户信息,根据返回结果判断更新是否成功
|
|
|
|
|
int result = userInformationService.updateByPrimaryKeySelective(userInformation);
|
|
|
|
|
if (result != 1) {
|
|
|
|
|
//更新失败,认证失败
|
|
|
|
|
if (result!= 1) {
|
|
|
|
|
// 如果更新失败,直接返回默认的提示信息(result为0的Map),代表认证失败
|
|
|
|
|
return map;
|
|
|
|
|
}
|
|
|
|
|
//认证成功
|
|
|
|
|
// 如果更新成功,说明认证成功,将更新后的用户信息重新设置到session中,然后更新提示信息的result为1,表示成功
|
|
|
|
|
request.getSession().setAttribute("userInformation", userInformation);
|
|
|
|
|
map.put("result", 1);
|
|
|
|
|
return map;
|
|
|
|
|