package com.wei.mall.common;
import com.wei.mall.exception.ImoocMallExceptionEnum;
/**
* 描述: 通用返回对象
*/
public class ApiRestResponse<T> {
private Integer status;
private String msg;
private T data;
private static final int OK_CODE = 10000;
private static final String OK_MSG = "SUCCESS";
public ApiRestResponse(Integer status, String msg, T data) {
this.status = status;
this.msg = msg;
this.data = data;
}
public ApiRestResponse(Integer status, String msg) {
this.status = status;
this.msg = msg;
}
public ApiRestResponse() {
this(OK_CODE, OK_MSG);
}
public static <T> ApiRestResponse<T> success() {
return new ApiRestResponse<>();
}
public static <T> ApiRestResponse<T> success(T result) {
ApiRestResponse<T> response = new ApiRestResponse<>();
response.setData(result);
return response;
}
public static <T> ApiRestResponse<T> error(Integer code, String msg) {
return new ApiRestResponse<>(code, msg);
}
public static <T> ApiRestResponse<T> error(ImoocMallExceptionEnum ex) {
return new ApiRestResponse<>(ex.getCode(), ex.getMsg());
}
@Override
public String toString() {
return "ApiRestResponse{" +
"status=" + status +
", msg='" + msg + '\'' +
", data=" + data +
'}';
}
public Integer getStatus() {
return status;
}
public void setStatus(Integer status) {
this.status = status;
}
public String getMsg() {
return msg;
}
public void setMsg(String msg) {
this.msg = msg;
}
public T getData() {
return data;
}
public void setData(T data) {
this.data = data;
}
public static int getOkCode() {
return OK_CODE;
}
public static String getOkMsg() {
return OK_MSG;
}
}
package com.wei.mall.common;
/**
* 常量值
*/
public class Constant {
public static final String SALT="fskdhfiuhjfshfjhsad4354%¥%¥%3";
public static final String IMOOC_MALL_USER = "imooc_mall_user";
}
package com.wei.mall.controller;
import com.wei.mall.common.ApiRestResponse;
import com.wei.mall.common.Constant;
import com.wei.mall.exception.ImoocMallException;
import com.wei.mall.exception.ImoocMallExceptionEnum;
import com.wei.mall.model.pojo.User;
import com.wei.mall.service.UserService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.util.StringUtils;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.ResponseBody;
import javax.servlet.http.HttpSession;
import java.security.NoSuchAlgorithmException;
/**
* 用户Controller
*/
@Controller
public class UserController {
@Autowired
UserService userService;
@GetMapping("/test")
@ResponseBody
public User personalPage(){
User user = userService.getUser();
return user;
}
/**
* 用户注册
*/
@PostMapping("/register")
@ResponseBody
public ApiRestResponse register(@RequestParam("userName") String userName,
@RequestParam("password") String password) throws ImoocMallException, NoSuchAlgorithmException {
if (StringUtils.isEmpty(userName)) {
return ApiRestResponse.error(ImoocMallExceptionEnum.NEED_USER_NAME);
}
if (StringUtils.isEmpty(password)) {
return ApiRestResponse.error(ImoocMallExceptionEnum.NEED_PASSWORD);
}
//密码长度不能少于8位
if (password.length() < 8) {
return ApiRestResponse.error(ImoocMallExceptionEnum.PASSWORD_TOO_SHORT);
}
userService.register(userName, password);
return ApiRestResponse.success();
}
/**
* 用户登录
*/
@PostMapping("/login")
@ResponseBody
public ApiRestResponse login(@RequestParam("userName") String userName,
@RequestParam("password") String password,
HttpSession session){
if (StringUtils.isEmpty(userName)) {
return ApiRestResponse.error(ImoocMallExceptionEnum.NEED_USER_NAME);
}
if (StringUtils.isEmpty(password)) {
return ApiRestResponse.error(ImoocMallExceptionEnum.NEED_PASSWORD);
}
User user = userService.login(userName, password);
//保存用户信息时,不保存密码
user.setPassword(null);//避免密码的泄露,如果直接返回的话,因为user属性有一个password,为了防止把密码返回,直接把密码设置为空
session.setAttribute(Constant.IMOOC_MALL_USER,user);//设置k 和v k是固定的,用常量类继续设置.把user对象放到value对象中去
return ApiRestResponse.success(user);
}
/**
* 更新个性签名
* @param session
* @param signature
* @return
* @throws ImoocMallException
*/
@PostMapping("/user/update")
@ResponseBody
public ApiRestResponse updateUserInfo(HttpSession session,@RequestParam String signature) throws ImoocMallException {
User currentUser = (User)session.getAttribute(Constant.IMOOC_MALL_USER);
if (currentUser==null){
return ApiRestResponse.error(ImoocMallExceptionEnum.NEED_LOGIN);
}
User use=new User();
use.setId(currentUser.getId());
use.setPersonalizedSignature(signature);
userService.updateInformation(use);
return ApiRestResponse.success();
}
/**
* 退出功能。登出,清除Session
* @param session
* @return
*/
@PostMapping("/user/logout")
@ResponseBody
public ApiRestResponse logout(HttpSession session){
session.removeAttribute(Constant.IMOOC_MALL_USER);
//session中已经包含k中的值 了,直接把k删掉就可以了
// session.setAttribute(Constant.IMOOC_MALL_USER,user);//设置k 和v k是固定的,用常量类继续设置.把user对象放到value对象中去
return ApiRestResponse.success();
}
/**
* 登录角色判断,管理员登陆接口
*/
@PostMapping("/adminLogin")
@ResponseBody
public ApiRestResponse adminLogin(@RequestParam("userName") String userName,
@RequestParam("password") String password,
HttpSession session){
if (StringUtils.isEmpty(userName)) {
return ApiRestResponse.error(ImoocMallExceptionEnum.NEED_USER_NAME);
}
if (StringUtils.isEmpty(password)) {
return ApiRestResponse.error(ImoocMallExceptionEnum.NEED_PASSWORD);
}
User user = userService.login(userName, password);
//进入是管理员
if (userService.checkAdminRole(user)) {
//2是是管理员,执行操作
//保存用户信息时,不保存密码
user.setPassword(null);
session.setAttribute(Constant.IMOOC_MALL_USER, user);
return ApiRestResponse.success();
}else{
return ApiRestResponse.error(ImoocMallExceptionEnum.NEED_ADMIN);
}
}
}
package com.wei.mall.exception;
import com.wei.mall.common.ApiRestResponse;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.web.bind.annotation.ControllerAdvice;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.ResponseBody;
/**
* 描述: 处理统一异常的handler
*/
@ControllerAdvice
public class GlobalExceptionHandler {
private final Logger log = LoggerFactory.getLogger(GlobalExceptionHandler.class);
@ExceptionHandler(Exception.class)
@ResponseBody
public Object handleException(Exception e) {
log.error("Default Exception: ", e);
return ApiRestResponse.error(ImoocMallExceptionEnum.SYSTEM_ERROR);
}
@ExceptionHandler(ImoocMallException.class)//业务异常
@ResponseBody
public Object handleImoocMallException(ImoocMallException e) {
log.error("ImoocMallException: ", e);
return ApiRestResponse.error(e.getCode(), e.getMessage());
}
}
package com.wei.mall.exception;
/**
* 描述: 统一异常
*/
public class ImoocMallException extends Exception {
private final Integer code;
private final String message;
public ImoocMallException(Integer code, String message) {
this.code = code;
this.message = message;
}
public ImoocMallException(ImoocMallExceptionEnum exceptionEnum) {
this(exceptionEnum.getCode(), exceptionEnum.getMsg());
}
public Integer getCode() {
return code;
}
@Override
public String getMessage() {
return message;
}
}
package com.wei.mall.exception;
/**
* 描述: 异常枚举
*/
public enum ImoocMallExceptionEnum {
NEED_USER_NAME(10001, "用户名不能为空"),
NEED_PASSWORD(10002, "密码不能为空"),
PASSWORD_TOO_SHORT(10003, "密码长度不能小于8位"),
NAME_EXISTED(10004, "不允许重名,注册失败"),
INSERT_FAILED(10005, "插入失败,请重试"),
WRONG_PASSWORD(10006, "密码错误"),
NEED_LOGIN(10007, "用户未登录"),
UPDATE_FAILED(10008, "更新失败"),
NEED_ADMIN(10009, "无管理员权限"),
SYSTEM_ERROR(20000, "系统异常,请从控制台或日志中查看具体错误信息");
/**
* 异常码
*/
Integer code;
/**
* 异常信息
*/
String msg;
ImoocMallExceptionEnum(Integer code, String msg) {
this.code = code;
this.msg = msg;
}
public Integer getCode() {
return code;
}
public void setCode(Integer code) {
this.code = code;
}
public String getMsg() {
return msg;
}
public void setMsg(String msg) {
this.msg = msg;
}
}