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

征求网站建设万网在线

征求网站建设,万网在线,西安网站制作公司排名,文创产品设计案例及理念文章目录 瑞吉外卖1.技术栈2.项目文件架构3.业务功能模块#xff08;例子#xff09;3.1管理员登录接口层(Controller)3.2管理员登录实现层(ServiceImpl)3.3管理员登录服务层#xff08;Service#xff09;3.4管理员登录Mapper层 4.公共模块4.1 BaseContext#xff08;保存… 文章目录 瑞吉外卖1.技术栈2.项目文件架构3.业务功能模块例子3.1管理员登录接口层(Controller)3.2管理员登录实现层(ServiceImpl)3.3管理员登录服务层Service3.4管理员登录Mapper层 4.公共模块4.1 BaseContext保存获取登录用户id4.2CustomException4.3GlobalExceptionHandler全局异常4.4对象映射器4.5公共字段填充4.6封装返回结果类 5插件模块5.1Redis序列化器5.2Web MVC Riji涉及的基础知识DTO启动类注解开发Slf4jRestController各个请求路径之间的区别(**http的get、post、put、delete**)AutowiredMP操作中的条件构造器MD5加密传参的接收不同情况Spring引入的两个基本概念SpringBoot MP中涉及的分页操作Session的基本用法和知识Service MapperTransactionalThreadLocal基本概念和使用自定义业务异常全局异常对象序列化MP中的公共填充封装结果类序列化和反序列化 以及 Redis的相关操作webMVC配置 瑞吉外卖 项目位置https://gitee.com/xue-junbao/reji.git 1.技术栈 前端 HTML5CSSJSnode.js 后端 JavaSpring Boot Mybaits Plus Swagger 项目 **数据库**MYSQL,Redis **部署**阿里云ECS服务器 2.项目文件架构 如图 多看基本项目就这几个层级 引入知识 DTO启动类注解 3.业务功能模块例子 3.1管理员登录接口层(Controller) package com.itheima.reggie.controller;//依赖引入 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.itheima.reggie.common.R; import com.itheima.reggie.entity.Employee; import com.itheima.reggie.service.EmployeeService; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.util.DigestUtils; import org.springframework.util.StringUtils; import org.springframework.web.bind.annotation.*;import javax.servlet.http.HttpServletRequest; import java.time.LocalDateTime;import static org.apache.commons.lang.StringUtils.isNotEmpty; import static org.springframework.util.StringUtils.*;Slf4j RestController RequestMapping(/employee) public class EmployeeController {Autowiredprivate EmployeeService employeeService;/*** 员工登录* param request* param employee* return*/PostMapping(/login)public REmployee login(HttpServletRequest request, RequestBody Employee employee) {/*** 1.对页面提交密码进行md5加密处理* 2.根据用户名查询数据库* 3.如果没有返回失败结果* 4.比对密码* 5.产看员工状态* 6.登录成功将员工id存入Session并返回登录成功结果*///1String password employee.getPassword();password DigestUtils.md5DigestAsHex(password.getBytes());//2LambdaQueryWrapperEmployee employeeLambdaQueryWrapper new LambdaQueryWrapper();employeeLambdaQueryWrapper.eq(Employee::getUsername,employee.getUsername());Employee empemployeeService.getOne(employeeLambdaQueryWrapper);//3if(emp null){return R.error(登录失败);}//4if(!emp.getPassword().equals(password)){return R.error(登录失败);}//5if(emp.getStatus()0){return R.error(账号禁用!);}//6request.getSession().setAttribute(employee,emp.getId());return R.success(emp);}/*** 员工退出* param request* return*/PostMapping(/logout)public RString logout(HttpServletRequest request){//清理Session中保存的当前登录员工的idrequest.getSession().removeAttribute(employee);return R.success(退出成功);}/*** 新增员工* param employee* return*/PostMappingpublic RString save(HttpServletRequest request,RequestBody Employee employee){log.info(新增员工员工信息{},employee.toString());//设置初始密码123456,md5加密处理employee.setPassword(DigestUtils.md5DigestAsHex(123456.getBytes()));// employee.setCreateTime(LocalDateTime.now()); // employee.setUpdateTime(LocalDateTime.now()); // // //获得当前用户登录id // Long empID(Long)request.getSession().getAttribute(employee); // // employee.setCreateUser(empID); // employee.setUpdateUser(empID);employeeService.save(employee);return R.success(新增员工成功);}/*** 分页查询*/GetMapping(/page)public RPage page(int page,int pageSize,String name){log.info(page{},pageSize{},name{},page,pageSize,name);//构造分页构造器Page pageInfonew Page(page,pageSize);//构造条件构造器LambdaQueryWrapperEmployee queryWrappernew LambdaQueryWrapper();//添加过滤条件queryWrapper.like(isNotEmpty(name),Employee::getName,name);//添加排序条件queryWrapper.orderByDesc(Employee::getUpdateTime);//执行查询employeeService.page(pageInfo,queryWrapper);return R.success(pageInfo);}/*** 根据id修改员工信息* param employee* return*/PutMappingpublic RString update(HttpServletRequest request, RequestBody Employee employee){log.info(employee.toString());long idThread.currentThread().getId();log.info(线程id为{},id);employeeService.updateById(employee);return R.success(员工信息修改成功!);}/*** 根据id查询员工信息* param id* return*/GetMapping(/{id})public REmployee getById(PathVariable Long id){log.info(根据id查询员工信息--);Employee employeeemployeeService.getById(id);if(employee!null)return R.success(employee);elsereturn R.error(没有查询到员工信息);}} 引入知识 注解开发Slf4jRestControllerAutowired各个请求Mapper路径之间的区别MP操作中的条件构造器MD5加密传参的接收不同情况Spring的两大基础概念SpringBoot MP中涉及的分页操作Session的基本用法和知识 3.2管理员登录实现层(ServiceImpl) package com.itheima.reggie.service.impl;/*** 实现类*/import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.itheima.reggie.entity.Employee; import com.itheima.reggie.mapper.EmployeeMapper; import com.itheima.reggie.service.EmployeeService; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional;Service Transactional public class EmployeeServiceImpl extends ServiceImplEmployeeMapper, Employee implements EmployeeService { } 引入知识 Service注解Transactional 3.3管理员登录服务层Service package com.itheima.reggie.service; /*** 接口*/import com.baomidou.mybatisplus.extension.service.IService; import com.itheima.reggie.entity.Employee;public interface EmployeeService extends IServiceEmployee { } 3.4管理员登录Mapper层 package com.itheima.reggie.mapper;/****/import com.baomidou.mybatisplus.core.mapper.BaseMapper; import com.itheima.reggie.entity.Employee; import org.apache.ibatis.annotations.Mapper;Mapper public interface EmployeeMapper extends BaseMapperEmployee {}4.公共模块 4.1 BaseContext保存获取登录用户id package com.itheima.reggie.common;/*** Title: BaseContext* Author xjb* Package com.itheima.reggie.common* Date 2023/11/22 17:09* description: 基于ThreadLocal封装工具类用户保存和获取当前登录用户id*/ public class BaseContext {private static ThreadLocalLong threadLocal new ThreadLocal();/*** 设置值* param id*/public static void setCurrentId(Long id){threadLocal.set(id);}/*** 获取值* return*/public static Long getCurrentId(){return threadLocal.get();} } 引入知识 ThreadLocal基本概念和使用 4.2CustomException package com.itheima.reggie.common;/*** Title: CustomException* Author xjb* Package com.itheima.reggie.common* Date 2023/11/30 16:16* description: 自定义业务异常*/ public class CustomException extends RuntimeException{public CustomException(String message){super(message);} } 引入知识 自定义业务异常 4.3GlobalExceptionHandler全局异常 package com.itheima.reggie.common;import com.sun.org.glassfish.external.statistics.annotations.Reset; import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.ControllerAdvice; import org.springframework.web.bind.annotation.ExceptionHandler; import org.springframework.web.bind.annotation.ResponseBody; import org.springframework.web.bind.annotation.RestController;import java.sql.SQLIntegrityConstraintViolationException;/*** 全局异常捕获*/ ControllerAdvice(annotations {RestController.class, Controller.class}) ResponseBody Slf4j public class GlobalExceptionHandler {/*** 异常处理方法* param ex* return*/ExceptionHandler(SQLIntegrityConstraintViolationException.class)public RString exceptionHandler(SQLIntegrityConstraintViolationException ex){log.error(ex.getMessage());if(ex.getMessage().contains(Duplicate entry)){String[] split ex.getMessage().split( );String msgsplit[2]已存在;return R.error(msg);}return R.error(未知错误);}/*** 异常处理方法(删除分类)* param ex* return*/ExceptionHandler(CustomException.class)public RString exceptionHandler(CustomException ex){log.error(ex.getMessage());return R.error(ex.getMessage());} } 引入知识 全局异常的声明和定义 4.4对象映射器 package com.itheima.reggie.common;import com.fasterxml.jackson.databind.DeserializationFeature; import com.fasterxml.jackson.databind.ObjectMapper; import com.fasterxml.jackson.databind.module.SimpleModule; import com.fasterxml.jackson.databind.ser.std.ToStringSerializer; 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.math.BigInteger; 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_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(BigInteger.class, ToStringSerializer.instance).addSerializer(Long.class, ToStringSerializer.instance).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);} } 引入知识 对象序列化和反序列化 4.5公共字段填充 package com.itheima.reggie.common;import com.baomidou.mybatisplus.core.handlers.MetaObjectHandler; import lombok.extern.slf4j.Slf4j; import org.apache.ibatis.reflection.MetaObject; import org.springframework.stereotype.Component;import java.time.LocalDateTime;/*** Title: MyMetaObjecthandler* Author xjb* Package com.itheima.reggie.common* Date 2023/11/22 16:07* description: 公共字段填充*/ Slf4j Component public class MyMetaObjecthandler implements MetaObjectHandler {//原数据对象处理器/*** 插入自动填充* param metaObject*/Overridepublic void insertFill(MetaObject metaObject){log.info(公共字段自动填充[insert]...);log.info(metaObject.toString());metaObject.setValue(createTime, LocalDateTime.now());metaObject.setValue(updateTime, LocalDateTime.now());metaObject.setValue(createUser, BaseContext.getCurrentId());metaObject.setValue(updateUser, BaseContext.getCurrentId());}/*** 更新自动填充* param metaObject*/Overridepublic void updateFill(MetaObject metaObject){log.info(公共字段自动填充[update]...);log.info(metaObject.toString());long idThread.currentThread().getId();log.info(线程id为{},id);metaObject.setValue(createTime, LocalDateTime.now());metaObject.setValue(updateTime, LocalDateTime.now());metaObject.setValue(updateUser, BaseContext.getCurrentId());} } 引入知识 MP中的公共填充 4.6封装返回结果类 package com.itheima.reggie.common;import lombok.Data; import java.util.HashMap; import java.util.Map;/*** 通用返回结果类服务器响应的数据最终都会封装成为此对象* param T*/ Data public class RT {private Integer code; //编码1成功0和其它数字为失败private String msg; //错误信息private T data; //数据private Map map new HashMap(); //动态数据public static T RT success(T object) {RT r new RT();r.data object;r.code 1;return r;}public static T RT error(String msg) {R r new R();r.msg msg;r.code 0;return r;}public RT add(String key, Object value) {this.map.put(key, value);return this;} } 引入知识 封装结果类 5插件模块 5.1Redis序列化器 package com.itheima.reggie.config;import org.springframework.cache.annotation.CachingConfigurerSupport; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.data.redis.connection.RedisConnectionFactory; import org.springframework.data.redis.connection.lettuce.LettuceConnectionFactory; import org.springframework.data.redis.core.RedisTemplate; import org.springframework.data.redis.serializer.StringRedisSerializer;Configuration public class RedisConfig extends CachingConfigurerSupport {Beanpublic RedisTemplateObject, Object redisTemplate(RedisConnectionFactory connectionFactory) {RedisTemplateObject, Object redisTemplate new RedisTemplate();//默认的Key序列化器为JdkSerializationRedisSerializerredisTemplate.setKeySerializer(new StringRedisSerializer()); // key序列化//redisTemplate.setValueSerializer(new GenericJackson2JsonRedisSerializer()); // value序列化redisTemplate.setConnectionFactory(connectionFactory);return redisTemplate;} } 引入知识 序列化和反序列化的意义Redis的序列化和反序列化 5.2Web MVC package com.itheima.reggie.config;import com.fasterxml.jackson.databind.DeserializationFeature; import com.fasterxml.jackson.databind.ObjectMapper; import com.fasterxml.jackson.databind.module.SimpleModule; import com.fasterxml.jackson.databind.ser.std.ToStringSerializer; 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 com.github.xiaoymin.knife4j.spring.annotations.EnableKnife4j; import com.itheima.reggie.common.JacksonObjectMapper; import com.itheima.reggie.entity.Employee; import lombok.extern.slf4j.Slf4j; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.http.converter.HttpMessageConverter; import org.springframework.http.converter.json.MappingJackson2HttpMessageConverter; import org.springframework.web.servlet.config.annotation.ResourceHandlerRegistry; import org.springframework.web.servlet.config.annotation.WebMvcConfigurationSupport; import springfox.documentation.builders.ApiInfoBuilder; import springfox.documentation.builders.PathSelectors; import springfox.documentation.builders.RequestHandlerSelectors; import springfox.documentation.service.ApiInfo; import springfox.documentation.spi.DocumentationType; import springfox.documentation.spring.web.plugins.Docket; import springfox.documentation.swagger2.annotations.EnableSwagger2;import java.math.BigInteger; import java.time.LocalDate; import java.time.LocalDateTime; import java.time.LocalTime; import java.time.format.DateTimeFormatter; import java.util.List;import static com.fasterxml.jackson.databind.DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES;Slf4j Configuration EnableSwagger2 EnableKnife4j public class WebMvcConfig extends WebMvcConfigurationSupport {/*** 设置静态资源映射* param registry*/Overrideprotected void addResourceHandlers(ResourceHandlerRegistry registry) {log.info(开始进行静态资源映射...);registry.addResourceHandler(doc.html).addResourceLocations(classpath:/META-INF/resources/);registry.addResourceHandler(/webjars/**).addResourceLocations(classpath:/META-INF/resources/webjars/);registry.addResourceHandler(/backend/**).addResourceLocations(classpath:/backend/);registry.addResourceHandler(/front/**).addResourceLocations(classpath:/front/);}/*** 扩展mvc框架的消息转换器* param converters*/Overrideprotected void extendMessageConverters(ListHttpMessageConverter? converters) {log.info(扩展消息转换器...);//创建消息转换器对象MappingJackson2HttpMessageConverter messageConverter new MappingJackson2HttpMessageConverter();//设置对象转换器底层使用Jackson将Java对象转为jsonmessageConverter.setObjectMapper(new JacksonObjectMapper());//将上面的消息转换器对象追加到mvc框架的转换器集合中converters.add(0,messageConverter);}//扫描controller,生成接口文档Beanpublic Docket createRestApi() {// 文档类型return new Docket(DocumentationType.SWAGGER_2).apiInfo(apiInfo()).select().apis(RequestHandlerSelectors.basePackage(com.itheima.reggie.controller)).paths(PathSelectors.any()).build();}//描述接口文档private ApiInfo apiInfo() {return new ApiInfoBuilder().title(瑞吉外卖).version(1.0).description(瑞吉外卖接口文档).build();} } 引入知识 webMVC配置 Riji涉及的基础知识 DTO 要理解DTO和VO这两个概念就行 DTO可以理解为前端传入的数据过多一个表塞不下那么可以对这个表进行扩展然后做为DTO来传输数据VO则是反着的后端返回前端数据多要整合成一个VO对象返回 DTO与VO-CSDN博客 启动类 知道注解意思就行 使用Spring Boot构建RESTful服务项目启动类瑞吉外卖-CSDN博客 注解开发 什么是注解 Annotion(注解)是一个接口程序可以通过反射来获取指定程序元素的Annotion对象然后通过Annotion对象来获取注解里面的元数据。 我们常常使用的注解Data、Controller等等这些都是注解创建一个注解也很简单创建一个类然后将class改为 interface就是一个注解啦。 官方解释 Java 注解(Annotation)用于为 Java 代码提供元数据。作为元数据注解不直接影响你的代码执行但也有一些类型的注解实际上可以用于这一目的。Java 注解是从 Java5 开始添加到 Java 的。–官方文档 关于注解的处理 我们一般将利用反射来处理注解的方式称之为运行时注解。 另外一种则是编译时注解如我们常常使用的 lombok 里的注解Data它能够帮我们省略set/get方法我们在Class上加上这个注解后在编译的时候lombok其实是修改了.class文件的将set/get方法放进去了不然的话你可以看看编译完后的.class文件。诸如这种我们常称为编译时注解也就是使用javac处理注解。 注解和反射 **反射定义**反射ReflectionJava 中的反射机制是指Java 程序在运行期间可以获取到一个对象的全部信息。 反射机制一般用来解决Java 程序运行期间对某个实例对象一无所知的情况下如何调用该对象内部的方法问题。 二者之间的关系 互补注解和反射不是相互替代的而是可以一起使用的互补机制。注解通常用于添加元数据而反射则用于在运行时处理这些元数据。用途注解通常用于标记代码中的特定部分以便在编译时或运行时进行处理。反射则用于在运行时动态地检查和操作类、方法和字段。结合使用有时你可以使用注解来存储有关类、方法和字段的信息然后使用反射来读取和处理这些信息。例如某些框架如Spring使用注解来配置组件然后在运行时使用反射来识别和初始化这些组件。 **简单理解**注解可以将一部分配置类操作封装到一个注解接口中其中可以提供配置类也可以提供一些规则 Java注解详解和自定义注解实战用代码讲解 - 掘金 (juejin.cn) Slf4j 这是一个日志注解,只需要知道怎么用就行 项目引用 dependencygroupIdorg.projectlombok/groupIdartifactIdlombok/artifactIdversion1.16.10/version/dependencydependencygroupIdorg.slf4j/groupIdartifactIdslf4j-log4j12/artifactIdversion1.7.28/version/dependency 使用 Slf4j日志级别,级别由低到高设置的级别越低打印的日志越多 ①trace: 一般不会使用在日志里边也不会打印出来最低的一个日志级别。 ②debug: 一般放于程序的某个关键点的地方用于打印一个变量值或者一个方法返回的信息之类的信息。 ③info 一般处理业务逻辑的时候使用就跟 system.err打印一样用于说明此处是干什么的。 ④warn警告不会影响程序的运行但是值得注意。 ⑤error 用户程序报错必须解决的时候使用此级别打印日志。 RestController RestController是一个组合注解它包含了Controller和ResponseBody两个注解的功能。 用RestController标记的类表示这是一个RESTful风格的控制器它可以处理HTTP请求并返回JSON格式的响应。 RestController注解在处理请求时会自动将方法的返回值转换为JSON格式的响应体并返回给客户端。 因此使用RestController可以省去在每个方法上都加ResponseBody注解的麻烦。 RestController也支持RequestMapping注解用于映射请求。 例如可以在RestController中定义一个处理GET请求的方法并使用RequestMapping注解指定请求的URL和请求方法如下所示 RestController RequestMapping(/user) public class UserController {GetMapping(/{id})public User getUserById(PathVariable Long id) {// 根据id查询用户信息User user userService.getUserById(id);return user;} }上述代码中GetMapping注解表示该方法处理GET请求{code /{id}}表示URL中的参数PathVariable注解用于获取参数值。方法的返回值会自动转换为JSON格式的响应体返回给客户端。 需要注意的是使用RestController时需要确保Spring的Jackson或Gson库已经正确配置否则无法将Java对象转换为JSON格式的响应 关于RESTful风格 RESTful风格是一种基于HTTP协议设计Web API的软件架构风格由Roy Fielding在2000年提出。它强调使用HTTP动词来表示对资源的操作GET、POST、PUT、PATCH、DELETE等并通过URI表示资源的唯一标识符。 需要知道 在实际应用中RESTful风格的Web服务通常使用JSON或XML格式进行数据交换。相比于其他Web服务交互方案如SOAPRESTful风格更加轻量级和简单明了因此得到了广泛的应用和支持. RestController详解 - 知乎 (zhihu.com) 各个请求路径之间的区别(http的get、post、put、delete) 只需要记住 post用于向服务器提交数据get拉取数据put更新数据delete删除数据就可以了 Spring Boot中的RESTful APIGetMapping, PostMapping, PutMapping, 和 DeleteMapping详解-CSDN博客 Autowired Autowired 注解能够自动装配 Spring 容器中的 bean使得开发者无需手动通过 new 关键字或者通过 getBean() 方法来获取依赖对象。 简单说就是自动创建和配置对应type的对象有点像工厂模式。 深入解析 Spring 的 Autowired自动装配的魔法与细节-CSDN博客 MP操作中的条件构造器 关于项目中的操作我们可以将步骤分为 构造条件构造器确定条件并且构造条件封装条件构造器并查询封装结果执行下一步操作 员工登录为例 //1构造条件选择器LambdaQueryWrapperEmployee queryWrapper new LambdaQueryWrapper();//2构造条件并且封装queryWrapper.eq(Employee::getUsername,employee.getUsername());//3开始查询数据,获取返回结果Employee emp employeeService.getOne(queryWrapper);//4比对数据,看是否可以登录if(emp null){return R.error(登录失败);}if(!emp.getPassword().equals(password)){return R.error(登录失败);}if(emp.getStatus()0){return R.error(账号禁用!);}request.getSession().setAttribute(employee,emp.getId());基础操作看链接 MyBatis-Plus 基础LambdaQueryWrapper详解与实例-CSDN博客 MD5加密 只需要学会直接调用Spring提供的DigestUtils.md5DigestAsHex方法完成md5加密操作就可以了。 此项目管理员登录中 //管理员登录 String password employdee.getPassword();password DigestUtils.md5DigestAsHex(password.getBytes());//登录获取的密码通过加密和sql中的数据进行比对//增加用户//设置初始密码123456,md5加密处理employee.setPassword(DigestUtils.md5DigestAsHex(123456.getBytes()));Java中的MD5加密详解-CSDN博客 ​ 传参的接收不同情况 搞清楚各个注解处理的数据类型 重点有RequestBody处理的是JSON和XML类型的数据PathVariable处理的是URL上绑定的参数无注解时会自己寻找一个匹配的参数要求名字对应 Spring MVC注解详解与实战从请求处理到数据绑定-CSDN博客 Spring引入的两个基本概念 简单了解一下就好了。 IOC控制反转就是将类写成bean类让获取的时候无需关注创建和配置的过程 AOP切面编程就是对程序进行横向切分添加额外的行为或功能。AOP常用于实现日志记录、事务管理、安全检查等横切关注点项目中涉及的公共字段填充就是用的AOP。可以理解为一个配置一次全局自动触发的工具。 控制反转(IoC)与面向切面编程(AOP)-CSDN博客 SpringBoot MP中涉及的分页操作 项目中的使用 构造分页器构造查询条件执行分页查询 例如 //构造分页器 Page pageInfo new Page(page,pageSize);//构造条件构造器 LambdaQueryWrapperEmployee wrapper new LambdaQueryWrapper(); //添加过滤条件 wrapper.like(isNotEmpty(name),Employee::getName,name);//第一个参数是执行的条件 //添加排序条件wrapper.orderByDesc(Employee::getUpdateTime);//降序排列//执行查询 employeeService.page(pageInfo,wrapper);return pageInfo;SpringBoot MyBatis-Plus 实现分页操作详解-CSDN博客 Session的基本用法和知识 项目中只需要会最基本的如何获取session设置以及应用场景。 本项目中例如 request.getSession().setAttribute(employee,emp.getId());就是设置一个session存入了当前用户的权限信息和id 不要忘了传入的参数为public REmployee login(HttpServletRequest request, RequestBody Employee employee)里面应该有HttpServletRequest request 获取和删除session为request.getSession().getAttribute(employee)和request.getSession().removeAttribute(employee); Java中的Session详解及示例代码-CSDN博客 Service Mapper 简单理解这个注解使得 当类上标注了Service注解后Spring容器会自动扫描并创建该类的一个实例即Bean这样我们就可以在其他地方通过自动装配Autowired的方式注入这个Bean。 Spring Boot实战深入理解Service与Mapper注解-CSDN博客 Transactional 这个注解可以保证在操作多个数据库表单时候确保事物的一致性也就是说只有所有的操作都成功才会成功否则就会回滚让所有操作都失败。 ThreadLocal基本概念和使用 简答说就是保存一个数据方便同一线程内的其它地方调用数据降低复杂程度 ThreadLocal和简单应用-CSDN博客 自定义业务异常 学会如何使用可以让项目更加规范!!! Java中的自定义异常处理业务异常类的创建与使用-CSDN博客 全局异常 统一管理全局异常抛出 深入理解Java Spring中的全局异常处理以Reggie项目为例-CSDN博客 对象序列化 了解其原理和应用这种代码都是写死的不用记。 JacksonObjectMapper自定义配置详解-CSDN博客 MP中的公共填充 学明白后续会有Mabatis的操作同时应用AOP。 MyBatis-Plus中的公共字段自动填充策略-CSDN博客 封装结果类 Java通用返回结果类的设计与应用-CSDN博客 序列化和反序列化 以及 Redis的相关操作 序列化和反序列化详解-CSDN博客自定义Redis配置以优化你的Spring应用-CSDN博客 webMVC配置 项目最基础的配置需要指定资源路径和API文档 Spring Boot中WebMvcConfig配置详解及示例-CSDN博客
http://www.hkea.cn/news/14278863/

相关文章:

  • 上海网站建设最好的公司排名新浪网页版登录
  • 想自己做网站怎么做使用nas服务器建设网站
  • 广州海珠区繁华吗哈尔滨网站优化技术
  • 设计的网站都有哪些自己做的博客网站
  • 免费流程图制作网站培训方案怎么做
  • 网站建设有哪些岗位四川公众项目咨询管理有限公司
  • 网站建设报价购物申请建设网站的报告书
  • 网站的专题怎么做发帖推广平台
  • 青岛网站设计多少钱wordpress easycode
  • 自己有域名怎么做免费网站网站设计流程是
  • 免费app下载免费seo工具大全
  • 英文网站备案怎么躲避wordpress审核评论
  • 东莞北京网站建设外贸开发产品网站建设
  • 开鲁网站seo站长工具网页制作素材图片百度云
  • 网站需求清单网站新闻建设作用
  • 怎么添加网站关键词wordpress主题添加授权
  • 上海 网站建设平台 补贴电子商务网站建设教材
  • 崇信网站建设广西网站建设价格多少
  • 注册网站需要visa怎么办网页修改器
  • 英德市住房和城乡建设局手机网站项目管理证书
  • 做dnf辅助官方网站网站建设邀标书
  • 中关村在线官方网站电脑wordpress分享插件国内
  • 邵阳汽车网站建设制作营销网站公司
  • 新媒体包不包括公司网站的建设简单网页源代码
  • 昆山做网站价格莱芜都市网下载
  • 企业门户网站建设方案后台管理wordpress %3c 3.6.1
  • wordpress多站点功能wordpress 酒店预订
  • 长安响应式网站建设郴州网站建设公司简介
  • seo站长教程手机网站规划
  • 网站素材图片虚拟主机加RDS安装wordpress