
Java中MD5加密方法不可逆password DigestUtils.md5DigestAsHex(password.getBytes());Swagger使用方式1.导入Knife4j的maven坐标dependency groupIdcom.github.xiaoymin/groupId artifactIdknife4j-spring-boot-starter/artifactId version3.0.2/version /dependency2.在配置类中加入knife4j相关配置Bean public Docket docket() { ApiInfo apiInfo new ApiInfoBuilder() .title(苍穹外卖项目接口文档) .version(2.0) .description(苍穹外卖项目接口文档) .build(); Docket docket new Docket(DocumentationType.SWAGGER_2) .apiInfo(apiInfo) .select() //指定生成接口需要扫描到的包 .apis(RequestHandlerSelectors.basePackage(com.sky.controller)) .paths(PathSelectors.any()) .build(); return docket; }3.设置静态资源映射否则接口文档页面http://localhost:8080/doc.html无法访问同样是在配置类中protected void addResourceHandlers(ResourceHandlerRegistry registry) { log.info(开始进行静态资源映射...); registry.addResourceHandler(/doc.html).addResourceLocations(classpath:/META-INF/resources/); registry.addResourceHandler(/webjars/**).addResourceLocations(classpath:/META-INF/resources/webjars/); }Swagger常用注解:新增员工功能开发controller层通过DTO封装数据封装好后传给employeeService.save方法EmployeeController:PostMapping ApiOperation(新增员工) public Result add(RequestBody EmployeeDTO employeeDTO) { log.info(新增员工员工数据{}, employeeDTO); employeeService.save(employeeDTO); return Result.success(); }employeeService.save方法类中先对象属性拷贝BeanUtils.copyProperties(employeeDTO,employee);再将没有设计到的属性再封装给employee封装好后调用Mapper持久层insert方法插入数据库ThreadLocal的使用完善新增员工时创建人id和修改人id设置为了固定值新建工具类BaseContext将ThreadLocal常用方法写入package com.sky.context; public class BaseContext { public static ThreadLocalLong threadLocal new ThreadLocal(); public static void setCurrentId(Long id) { threadLocal.set(id); } public static Long getCurrentId() { return threadLocal.get(); } public static void removeCurrentId() { threadLocal.remove(); } }拦截器jwt校验令牌通过后获取登录员工id接着调用BaseContext工具类中ThreadLocal方法传入员工id程序继续执行到controllercontroller调用service层的save方法save方法中调用工具类中getCurrentId方法//设置当前记录的创建人id和修改人id employee.setCreateUser(BaseContext.getCurrentId()); employee.setUpdateUser(BaseContext.getCurrentId());员工分页查询功能实现pagehelper插件使用方法先在pom文件引入依赖dependency groupIdcom.github.pagehelper/groupId artifactIdpagehelper-spring-boot-starter/artifactId version${pagehelper}/version /dependency在service实现层public PageResult pageQuery(EmployeePageQueryDTO employeePageQueryDTO) { //开始分页查询 PageHelper.startPage(employeePageQueryDTO.getPage(),employeePageQueryDTO.getPageSize()); PageEmployee pageemployeeMapper.pageQuery(employeePageQueryDTO); long total page.getTotal(); ListEmployee records page.getResult(); PageResult pageResult new PageResult(total,records); return pageResult; }代码完善处理数据格式方式一在Employee实体类属性上加入JsonFormat(pattern yyyy-MM-dd HH:mm:ss)注解方式二(扩展SpringMVC的消息转换器)在配置类中编写一段代码其中强调配置类WebMvcConfiguration extends WebMvcConfigurationSupport 重写父类WebMvcConfigurationSupport 中的extendMessageConverters方法统一对后端传给前端的数据进行转换处理,方法中创建消息转化器类MappingJackson2HttpMessageConverter()再为这个消息转换器对象指定一个对象转换器可以将Java对象序列化为json数据在common模块下json包下JacksonObjectMapper直接创建出来固定 代码protected void extendMessageConverters(ListHttpMessageConverter? converters) { log.info(扩展消息转换器...); //创建一个消息转换器对象 MappingJackson2HttpMessageConverter converter new MappingJackson2HttpMessageConverter(); //需要为消息转换器设置一个对象转换器对象转换器可以将java对象序列化为json数据 converter.setObjectMapper(new JacksonObjectMapper()); //将自己的消息转化器加入容器中 converters.add(0,converter); }对象转换器JacksonObjectMapper固定代码package com.sky.json; import com.fasterxml.jackson.databind.DeserializationFeature; import com.fasterxml.jackson.databind.ObjectMapper; import com.fasterxml.jackson.databind.module.SimpleModule; import com.fasterxml.jackson.datatype.jsr310.deser.LocalDateDeserializer; import com.fasterxml.jackson.datatype.jsr310.deser.LocalDateTimeDeserializer; import com.fasterxml.jackson.datatype.jsr310.deser.LocalTimeDeserializer; import com.fasterxml.jackson.datatype.jsr310.ser.LocalDateSerializer; import com.fasterxml.jackson.datatype.jsr310.ser.LocalDateTimeSerializer; import com.fasterxml.jackson.datatype.jsr310.ser.LocalTimeSerializer; import java.time.LocalDate; import java.time.LocalDateTime; import java.time.LocalTime; import java.time.format.DateTimeFormatter; import static com.fasterxml.jackson.databind.DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES; /** * 对象映射器:基于jackson将Java对象转为json或者将json转为Java对象 * 将JSON解析为Java对象的过程称为 [从JSON反序列化Java对象] * 从Java对象生成JSON的过程称为 [序列化Java对象到JSON] */ public class JacksonObjectMapper extends ObjectMapper { public static final String DEFAULT_DATE_FORMAT yyyy-MM-dd; //public static final String DEFAULT_DATE_TIME_FORMAT yyyy-MM-dd HH:mm:ss; public static final String DEFAULT_DATE_TIME_FORMAT yyyy-MM-dd HH:mm; public static final String DEFAULT_TIME_FORMAT HH:mm:ss; public JacksonObjectMapper() { super(); //收到未知属性时不报异常 this.configure(FAIL_ON_UNKNOWN_PROPERTIES, false); //反序列化时属性不存在的兼容处理 this.getDeserializationConfig().withoutFeatures(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES); SimpleModule simpleModule new SimpleModule() .addDeserializer(LocalDateTime.class, new LocalDateTimeDeserializer(DateTimeFormatter.ofPattern(DEFAULT_DATE_TIME_FORMAT))) .addDeserializer(LocalDate.class, new LocalDateDeserializer(DateTimeFormatter.ofPattern(DEFAULT_DATE_FORMAT))) .addDeserializer(LocalTime.class, new LocalTimeDeserializer(DateTimeFormatter.ofPattern(DEFAULT_TIME_FORMAT))) .addSerializer(LocalDateTime.class, new LocalDateTimeSerializer(DateTimeFormatter.ofPattern(DEFAULT_DATE_TIME_FORMAT))) .addSerializer(LocalDate.class, new LocalDateSerializer(DateTimeFormatter.ofPattern(DEFAULT_DATE_FORMAT))) .addSerializer(LocalTime.class, new LocalTimeSerializer(DateTimeFormatter.ofPattern(DEFAULT_TIME_FORMAT))); //注册功能模块 例如可以添加自定义序列化器和反序列化器 this.registerModule(simpleModule); } }启用禁用员工账号编辑员工: