睿乐购电商课程设计——全局配置 忘是亡心i 2023-02-22 13:33 116阅读 0赞 ### 睿乐购电商课程设计——全局配置 ### * * * 配置类 * 获取用户的登录信息 * 全局异常处理 * 数据封装工具类 * 分页工具类 ### 配置类 ### * `DefaultFastjsonConfig`: fastjson数据处理配置:日期处理 package com.ysu.shop.config; import com.alibaba.fastjson.serializer.SerializeConfig; import com.alibaba.fastjson.serializer.SerializerFeature; import com.alibaba.fastjson.serializer.ToStringSerializer; import com.alibaba.fastjson.support.config.FastJsonConfig; import com.alibaba.fastjson.support.spring.FastJsonHttpMessageConverter; import org.springframework.boot.autoconfigure.condition.ConditionalOnClass; import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean; import org.springframework.boot.autoconfigure.condition.ConditionalOnWebApplication; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.http.MediaType; import java.math.BigInteger; import java.nio.charset.Charset; import java.util.ArrayList; import java.util.List; @Configuration("defaultFastjsonConfig") @ConditionalOnClass(com.alibaba.fastjson.JSON.class) @ConditionalOnMissingBean(FastJsonHttpMessageConverter.class) @ConditionalOnWebApplication public class DefaultFastjsonConfig { @Bean public FastJsonHttpMessageConverter fastJsonHttpMessageConverter() { FastJsonHttpMessageConverter converter = new FastJsonHttpMessageConverter(); converter.setFastJsonConfig(fastjsonConfig()); converter.setSupportedMediaTypes(getSupportedMediaType()); return converter; } /** * fastjson的配置 */ public FastJsonConfig fastjsonConfig() { FastJsonConfig fastJsonConfig = new FastJsonConfig(); fastJsonConfig.setSerializerFeatures( SerializerFeature.DisableCircularReferenceDetect, SerializerFeature.PrettyFormat, SerializerFeature.WriteEnumUsingToString ); fastJsonConfig.setDateFormat("yyyy-MM-dd HH:mm:ss"); fastJsonConfig.setCharset(Charset.forName("utf-8")); //解决Long转json精度丢失的问题 SerializeConfig serializeConfig = SerializeConfig.globalInstance; serializeConfig.put(BigInteger.class, ToStringSerializer.instance); serializeConfig.put(Long.class, ToStringSerializer.instance); serializeConfig.put(Long.TYPE, ToStringSerializer.instance); fastJsonConfig.setSerializeConfig(serializeConfig); return fastJsonConfig; } /** * 支持的mediaType类型 */ public List<MediaType> getSupportedMediaType() { ArrayList<MediaType> mediaTypes = new ArrayList<>(); mediaTypes.add(MediaType.APPLICATION_JSON_UTF8); return mediaTypes; } } * `SwaggerConfig`:swagger2文档配置 package com.ysu.shop.config; import io.swagger.annotations.ApiOperation; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import springfox.documentation.builders.ApiInfoBuilder; import springfox.documentation.builders.PathSelectors; import springfox.documentation.builders.RequestHandlerSelectors; import springfox.documentation.service.ApiInfo; import springfox.documentation.service.ApiKey; import springfox.documentation.spi.DocumentationType; import springfox.documentation.spring.web.plugins.Docket; import springfox.documentation.swagger2.annotations.EnableSwagger2; import java.util.ArrayList; import java.util.List; /** * @documentationc Swagger2配置文件 * <p> * 使用Swagger2只需三步 * 1、导入Swaggerr依赖 * 2、配置Docket的bean * 3、使用@Api等注解修饰 * </p> */ @Configuration @EnableSwagger2 public class SwaggerConfig { @Bean public Docket createRestApi() { return new Docket(DocumentationType.SWAGGER_2) .select() // 方法需要有ApiOperation注解才能生存接口文档 .apis(RequestHandlerSelectors.withMethodAnnotation(ApiOperation.class)) // 路径使用any风格 .paths(PathSelectors.any()) .build() // 如何保护我们的Api,有三种验证(ApiKey, BasicAuth, OAuth) .securitySchemes(security()) // 接口文档的基本信息 .apiInfo(apiInfo()); } /** * 接口文档详细信息 * * @return */ private ApiInfo apiInfo() { return new ApiInfoBuilder().title("睿乐购商城").description("接口文档").termsOfServiceUrl("http://www.localhost:8082").version("1.0.0").build(); } private List<ApiKey> security() { ArrayList<ApiKey> apiKeys = new ArrayList<>(); apiKeys.add(new ApiKey("token", "token", "header")); return apiKeys; } } ### 获取用户的登录信息 ### * 通过注解获取登录信息 package com.ysu.shop.annotation; import java.lang.annotation.*; @Target({ ElementType.PARAMETER}) @Retention(RetentionPolicy.RUNTIME) @Documented public @interface TokenToUser { String value() default "oldUser"; } * 处理器 package com.ysu.shop.handler; import com.ysu.shop.annotation.TokenToUser; import com.ysu.shop.pojo.User; import com.ysu.shop.service.UserService; import org.springframework.core.MethodParameter; import org.springframework.stereotype.Component; import org.springframework.web.bind.support.WebDataBinderFactory; import org.springframework.web.context.request.NativeWebRequest; import org.springframework.web.method.support.HandlerMethodArgumentResolver; import org.springframework.web.method.support.ModelAndViewContainer; import javax.annotation.Resource; import javax.servlet.http.HttpServletRequest; import java.io.IOException; @Component public class TokenToUserMethodArgumentResolver implements HandlerMethodArgumentResolver { @Resource private UserService userService; public TokenToUserMethodArgumentResolver() { } public boolean supportsParameter(MethodParameter parameter) { if (parameter.hasParameterAnnotation(TokenToUser.class)) { return true; } return false; } public Object resolveArgument(MethodParameter parameter, ModelAndViewContainer mavContainer, NativeWebRequest webRequest, WebDataBinderFactory binderFactory) throws Exception { if (parameter.getParameterAnnotation(TokenToUser.class) instanceof TokenToUser) { User oldUser = null; String token = webRequest.getHeader("token"); if (null != token && !"".equals(token) && token.length() == 32) { oldUser = userService.getUserByToken(token); } return oldUser; } return null; } public static byte[] getRequestPostBytes(HttpServletRequest request) throws IOException { int contentLength = request.getContentLength(); if (contentLength < 0) { return null; } byte buffer[] = new byte[contentLength]; for (int i = 0; i < contentLength; ) { int readlen = request.getInputStream().read(buffer, i, contentLength - i); if (readlen == -1) { break; } i += readlen; } return buffer; } } * 配置 package com.ysu.shop.config; import com.ysu.shop.handler.TokenToUserMethodArgumentResolver; import org.springframework.context.annotation.Configuration; import org.springframework.web.method.support.HandlerMethodArgumentResolver; import org.springframework.web.servlet.config.annotation.WebMvcConfigurer; import javax.annotation.Resource; import java.util.List; @Configuration public class SpringBootWebMvcConfigurer implements WebMvcConfigurer { @Resource private TokenToUserMethodArgumentResolver tokenUserMethodArgumentResolver; public void addArgumentResolvers(List<HandlerMethodArgumentResolver> argumentResolvers) { argumentResolvers.add(tokenUserMethodArgumentResolver); } } ### 全局异常处理 ### * 自定义异常父类 package com.ysu.shop.exception; public class MyException extends RuntimeException { /** * */ private static final long serialVersionUID = 6445638039342655172L; // 异常错误码 private int code; //异常信息 private String msg; //异常构造方法 在使用时方便传入错误码和信息 public MyException(int code, String msg) { this.code = code; this.msg = msg; } public int getCode() { return code; } public void setCode(int code) { this.code = code; } public String getMsg() { return msg; } public void setMsg(String msg) { this.msg = msg; } } * 用户未登录 package com.ysu.shop.exception; public class UserNoLoginException extends MyException{ /** * */ private static final long serialVersionUID = 5276752412710843243L; private static final String MSG = "用户未登录,无法操作"; private String msg; private static final int code = 402; public UserNoLoginException(){ super(code,MSG); this.msg = MSG; } public UserNoLoginException(String msg) { super(code,msg); this.msg = msg; } @Override public String getMsg() { return msg; } @Override public void setMsg(String msg) { this.msg = msg; } @Override public int getCode() { return UserNoLoginException.code; } } * 用户操作没有权限 package com.ysu.shop.exception; public class NotAuthorityException extends MyException{ /** * */ private static final long serialVersionUID = 174218172435946873L; private static final String MSG = "不是管理员,没有该权限操作"; private String msg; private static final int code = 412; public NotAuthorityException(){ super(code,MSG); this.msg = MSG; } public NotAuthorityException(String msg) { super(code, msg); this.msg = msg; } @Override public String getMsg() { return msg; } @Override public void setMsg(String msg) { this.msg = msg; } @Override public int getCode() { return NotAuthorityException.code; } } * 参数异常 package com.ysu.shop.exception; /** * @description 抛出异常 (code=406,msg = "参数异常!") */ public class ParamValidException extends MyException{ /** * */ private static final long serialVersionUID = 1L; private static final String MSG = "参数异常!"; private String msg; private static final int code = 406; public ParamValidException(){ super(code,MSG); this.msg = MSG; } public ParamValidException(String msg) { super(code, msg); this.msg = msg; } @Override public String getMsg() { return msg; } @Override public void setMsg(String msg) { this.msg = msg; } @Override public int getCode() { return ParamValidException.code; } } * 异常处理器 package com.ysu.shop.handler; import com.ysu.shop.exception.MyException; import com.ysu.shop.util.Result; import com.ysu.shop.util.ResultGenerator; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.web.bind.annotation.ExceptionHandler; import org.springframework.web.bind.annotation.RestControllerAdvice; import javax.servlet.http.HttpServletRequest; @RestControllerAdvice @SuppressWarnings("all") public class GlobalExceptionHandle { private static Logger log = LoggerFactory.getLogger(MyException.class); private static final int NOT_FOUND = 404; //捕获全局异常,处理所有不可知的异常 这个注解是捕获所有异常 @ExceptionHandler(value = Exception.class) public Result handleException(Exception e, HttpServletRequest request) { //此处返回json数据 //捕捉到的异常如果是自定义异常类,那么就返回自定义异常类中的错误码和错误信息 if (e instanceof MyException) { log.error("msg:{}, url:{}", ((MyException) e).getMsg(), request.getRequestURL()); return ResultGenerator.getErrorResult(((MyException) e).getCode(), ((MyException) e).getMsg()); } e.printStackTrace(); log.error("msg:{}, url:{}", e.getMessage(), request.getRequestURL()); return ResultGenerator.getErrorResult(NOT_FOUND, e.getMessage()); } } ### 数据封装工具类 ### * `Result` package com.ysu.shop.util; import java.io.Serializable; public class Result<T> implements Serializable { private static final long serialVersionUID = 1L; private int status; private String msg; private T data; public Result() { } public int getStatus() { return status; } public void setStatus(int 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; } @Override public String toString() { return "Result{" + "status=" + status + ", msg='" + msg + '\'' + ", data=" + data + '}'; } } * `ResultGenerator` package com.ysu.shop.util; import org.springframework.util.StringUtils; @SuppressWarnings("all") public class ResultGenerator { private static final String DEFAULT_SUCCESS_MESSAGE = "SUCCESS"; private static final String DEFAULT_FAIL_MESSAGE = "FAIL"; /** * @Date 2020/6/18 * @Param * @return result(status=200,msg="SUCCESS") **/ public static Result getSuccessResult() { Result result = new Result(); result.setStatus(Constants.RESULT_CODE_SUCCESS); result.setMsg(DEFAULT_SUCCESS_MESSAGE); return result; } /** * @Date 2020/6/18 * @Param * @return result(status=200,msg=msg) **/ public static Result getSuccessResult(String message) { Result result = new Result(); result.setStatus(Constants.RESULT_CODE_SUCCESS); result.setMsg(message); return result; } /** * @Date 2020/6/18 * @Param * @return result(status=200,msg="SUCCESS",data=data) **/ public static Result getSuccessResult(Object data) { Result result = new Result(); result.setStatus(Constants.RESULT_CODE_SUCCESS); result.setMsg(DEFAULT_SUCCESS_MESSAGE); result.setData(data); return result; } /** * @Date 2020/6/18 * @Param * @return result(status=500,msg=msg) **/ public static Result getFailResult(String message) { Result result = new Result(); result.setStatus(Constants.RESULT_CODE_SERVER_ERROR); if (StringUtils.isEmpty(message)) { result.setMsg(DEFAULT_FAIL_MESSAGE); } else { result.setMsg(message); } return result; } /** * @Date 2020/6/18 * @Param * @return result(status=412,msg=msg) **/ public static Result getNullResult(String message) { Result result = new Result(); result.setStatus(Constants.RESULT_CODE_BAD_REQUEST); result.setMsg(message); return result; } /** * @Description : 自定义错误码,错误信息 * @Date 2020/6/18 * @Param * @return **/ public static Result getErrorResult(int code, String message) { Result result = new Result(); result.setStatus(code); result.setMsg(message); return result; } /** * @Description: 返回错误信息 * @Date: 2020/6/18 * @Param: * @return: result(status=1,msg=msg) **/ public static Result getErrorResult(String msg){ Result result = new Result(); result.setStatus(Constants.RESULT_CODE_ERROR); result.setMsg(msg); return result; } /** * @Description: 因参数错误返回错误信息 * @Date: 2020/6/18 * @Param: * @return: result(status=406,msg=msg) **/ public static Result getErrorByParams(String msg){ Result result = new Result(); result.setStatus(Constants.RESULT_CODE_PARAM_ERROR); result.setMsg(msg); return result; } } ### 分页工具类 ### * PageResult package com.ysu.shop.util; import java.io.Serializable; import java.util.List; public class PageResult implements Serializable { /** * */ private static final long serialVersionUID = -619801323991675434L; private int totalCount; // 总记录数 private int pageSize; //每页记录数 private int totalPage;//总页数 private int currPage;//当前页数 private List<?> list;//列表数据 /** * 分页 * * @param list 列表数据 * @param totalCount 总记录数 * @param pageSize 每页记录数 * @param currPage 当前页数 */ public PageResult(List<?> list, int totalCount, int pageSize, int currPage) { this.list = list; this.totalCount = totalCount; this.pageSize = pageSize; this.currPage = currPage; this.totalPage = (int) Math.ceil((double) totalCount / pageSize); } public int getTotalCount() { return totalCount; } public void setTotalCount(int totalCount) { this.totalCount = totalCount; } public int getPageSize() { return pageSize; } public void setPageSize(int pageSize) { this.pageSize = pageSize; } public int getTotalPage() { return totalPage; } public void setTotalPage(int totalPage) { this.totalPage = totalPage; } public int getCurrPage() { return currPage; } public void setCurrPage(int currPage) { this.currPage = currPage; } public List<?> getList() { return list; } public void setList(List<?> list) { this.list = list; } @Override public String toString() { return "PageResult{" + "totalCount=" + totalCount + ", pageSize=" + pageSize + ", totalPage=" + totalPage + ", currPage=" + currPage + ", list=" + list + '}'; } } * `PageUtil` package com.ysu.shop.util; import java.util.LinkedHashMap; import java.util.Map; public class PageUtil extends LinkedHashMap<String, Object> { /** * */ private static final long serialVersionUID = 6266971646743089177L; // 当前页码 private int page; //每页条数 private int limit; public PageUtil(Map<String, Object> params) { this.putAll(params); //分页参数 this.page = Integer.parseInt(params.get("page").toString()); this.limit = Integer.parseInt(params.get("limit").toString()); this.put("start", (page - 1) * limit); this.put("page", page); this.put("limit", limit); } public int getPage() { return page; } public void setPage(int page) { this.page = page; } public int getLimit() { return limit; } public void setLimit(int limit) { this.limit = limit; } @Override public String toString() { return "PageUtil{" + "page=" + page + ", limit=" + limit + '}'; } }
相关 【畅购电商】项目总结 目录 1. 电商项目架构图 1.1 系统架构 1.2 技术架构 2. 介绍电商项目 2.1 后台和前台、后端和前端 2.2 Vue全家桶包含哪些技术? 2.3 什 布满荆棘的人生/ 2024年03月27日 17:27/ 0 赞/ 154 阅读
相关 畅购电商项目 1. 电商项目架构图 -------------------- 技术框架/技术选型 1.1 系统架构 ![b7df8ec6234340b2b3624095 妖狐艹你老母/ 2023年10月04日 21:27/ 0 赞/ 137 阅读
相关 睿乐购电商课程设计——图片上传 睿乐购电商课程设计——图片上传 图书前端 后台 图书前端 <body> <div class="x-bo 悠悠/ 2023年02月23日 03:39/ 0 赞/ 51 阅读
相关 睿乐购电商课程设计——商品模块 睿乐购电商课程设计——商品模块 商品详情页 商品搜索页 购物车 商品详情页 `detail.j ﹏ヽ暗。殇╰゛Y/ 2023年02月23日 03:38/ 0 赞/ 101 阅读
相关 睿乐购电商课程设计——用户模块 睿乐购电商课程设计——用户模块 mapper service control mapper 用 谁借莪1个温暖的怀抱¢/ 2023年02月22日 13:33/ 0 赞/ 98 阅读
相关 电商系列(一)课程介绍 1.1、淘宝架构 ![这里写图片描述][SouthEast] 1.2 、课程安排 ![这里写图片描述][SouthEast 1] 1.2 、课程学习与解决问题 £神魔★判官ぃ/ 2021年09月26日 13:26/ 0 赞/ 388 阅读
还没有评论,来说两句吧...