当前位置: 首页 > news >正文

Java MD5加密与Swagger实战教程

Java中MD5加密方法:不可逆

password = DigestUtils.md5DigestAsHex(password.getBytes());

Swagger使用方式

1.导入Knife4j的maven坐标

<dependency> <groupId>com.github.xiaoymin</groupId> <artifactId>knife4j-spring-boot-starter</artifactId> <version>3.0.2</version> </dependency>

2.在配置类中加入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 ThreadLocal<Long> 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,程序继续执行到controller,controller调用service层的save方法,save方法中调用工具类中getCurrentId方法:

//设置当前记录的创建人id和修改人id employee.setCreateUser(BaseContext.getCurrentId()); employee.setUpdateUser(BaseContext.getCurrentId());

员工分页查询功能实现:

pagehelper插件使用方法

先在pom文件引入依赖

<dependency> <groupId>com.github.pagehelper</groupId> <artifactId>pagehelper-spring-boot-starter</artifactId> <version>${pagehelper}</version> </dependency>

在service实现层

public PageResult pageQuery(EmployeePageQueryDTO employeePageQueryDTO) { //开始分页查询 PageHelper.startPage(employeePageQueryDTO.getPage(),employeePageQueryDTO.getPageSize()); Page<Employee> page=employeeMapper.pageQuery(employeePageQueryDTO); long total = page.getTotal(); List<Employee> 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(List<HttpMessageConverter<?>> 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); } }

启用禁用员工账号:

编辑员工:

http://www.jsqmd.com/news/1006230/

相关文章:

  • 北京大兴区黄金回收店评测:三条核心指标筛选,爱回收12家门店全地址 - 新闻快传
  • 嵌入式SRAM深度解析:MC68377操作模式、内存映射与工程实践
  • 北京朝阳区黄金回收店推荐:爱回收24家门店全地址,选店三条标准说清楚 - 新闻快传
  • 终极指南:掌握AlienFX Tools,释放Alienware灯光与风扇的全部潜能
  • 昆山汽车座垫脚垫定制怎么选?车饰源(车舒源)品质突围 - 百航
  • 2026年国内GEO服务商怎么选?这份指南帮你避开80%的踩坑风险 - 速递信息
  • 2023-2025年江苏省省级企业技术中心名单深度分析报告
  • 使用语义分割经典模型 HRNet 训练道路分割模型并测试使用——从高分辨率特征到工程落地实践
  • MC68349中断与总线异常处理:从硬件原理到嵌入式系统调试实战
  • 2026年中国GEO服务商综合实力权威测评排行榜,全栈自研标杆的泓动数据领跑GEO优化行业3.0时代 - 互联网科技品牌测评
  • 给芯片做‘体检’:一文搞懂DFT扫描链的插入与测试流程(以Tessent为例)
  • 2026照片去水印免费软件App有哪些?手机免费去水印软件App推荐与安全无广告排行
  • 3个关键步骤让Citra模拟器在PC上流畅运行3DS游戏
  • 货损降至0%!无锡靠谱物流公司推荐案例解析 - 速递信息
  • 2026在线音频转文字怎么操作?免费工具+详细上手教程
  • 告别抠图!用Mask R-CNN实战分割商品图,Python+PyTorch保姆级教程
  • Vue-Fabric-Editor深度解析:插件化架构如何重构Web图片编辑体验
  • 车仕宝汽车服务:上海汽车补胎换胎专业施工透明无套路 - 百航
  • CI/CD前世今生(持续集成、持续交付、持续部署、Jenkins、Github Actions)
  • Poppins字体完整指南:多语言排版终极解决方案
  • 2026 武汉表包金钻回收门道解析 耀辉黄金奢侈品回收本地标杆实力全览 - 奢侈品回收
  • 第19章 「朗兰兹的曙光」—— 悦儿篇
  • 工商业储能系列: BMS分散式主动均衡详解
  • 大雾速通
  • 2026年阿里云Hermes Agent/OpenClaw配置Token Plan集成详细教程
  • Windows安卓应用安装器:3分钟快速在电脑上运行安卓应用
  • AG-UI 在 IoT 控制台里怎么落地:设备状态、命令确认与人机协同
  • MC9328MX1 USB控制器寄存器详解与驱动开发实战
  • 2026武汉卡地亚首饰回收哪家靠谱?实测真实分享 - 逸程
  • 计算机网络体系结构与协议