写完感觉脑袋蒙蒙的,中间也花了太多时间干其他事去了,现在也不想整理,等后续再整理吧
登录外卖系统
把yml文件中的数据库用户密码改成自己的
新版idea TODO标签页位置:
点击后就会出现在这里:
对前端传过来的明文密码进行md5加密后与数据库密码进行比对:
将DTO属性拷贝到实体类中:
前面的拷贝到后面
JWT令牌登录认证逻辑:
ThreadLocal
ThreadLocal并不是一个Thread,而是Thread的局部变量
客户端发起的每一次请求,tomcat都会为其分配一个单独的线程,ThreadLocal为每个线程提供单独一份存储空间,具有线程隔离的效果,只有在线程内才能获取到对应的值,线程外不能访问
使用ThreadLocal可在一次请求中,使其他层获取到拦截器拦截到的数据(在拦截器中set,在其他层get)
自动将LocalDateTime日期对象格式化,不用对每个对象使用Format进行格式化:
@Transactional:开启事务,须在启动类上加上@EnableTransactionManagement配合使用
公共字段自动填充功能:
@Aspect
@Component
@Slf4j
public class AutoFillAspect {
/**
* 切入点
*/
@Pointcut("execution(* com.sky.mapper.*.*(..))&&@annotation(com.sky.annotation.AutoFill)")
public void autoFillPointCut(){}
/**
* 前置通知 在通知中进行公共字段的赋值
*/
@Before("autoFillPointCut()")
public void autoFill(JoinPoint joinPoint){
log.info("开始进行公共字段自动填充...");
//获取当前被拦截的方法上的数据库操作类型
MethodSignature signature =(MethodSignature) joinPoint.getSignature();//方法签名对象
AutoFill autoFill=signature.getMethod().getAnnotation(AutoFill.class);//获得方法上的注解对象
OperationType operationType=autoFill.value();//获得数据库操作类型
//获取到当前被拦截的方法的参数--实体对象
Object[] args=joinPoint.getArgs();
if (args==null||args.length==0){
return;
}
Object entity=args[0];
//准备赋值的数据
LocalDateTime now=LocalDateTime.now();
Long currentId= BaseContext.getCurrentId();
//根据当前不同的操作类型 为对应的属性通过反射来赋值
if (operationType==OperationType.INSERT){
//为4个公共字段赋值
try {
Method setCreateTime=entity.getClass().getDeclaredMethod(AutoFillConstant.SET_CREATE_TIME, LocalDateTime.class);
Method setCreateUser=entity.getClass().getDeclaredMethod(AutoFillConstant.SET_CREATE_USER,Long.class);
Method setUpdateTime=entity.getClass().getDeclaredMethod(AutoFillConstant.SET_UPDATE_TIME,LocalDateTime.class);
Method setUpdateUser=entity.getClass().getDeclaredMethod(AutoFillConstant.SET_UPDATE_USER,Long.class);
//通过反射为对象属性赋值
setCreateTime.invoke(entity,now);
setCreateUser.invoke(entity,currentId);
setUpdateTime.invoke(entity,now);
setUpdateUser.invoke(entity,currentId);
} catch (Exception e) {
e.printStackTrace();
}
} else if (operationType==OperationType.UPDATE) {
try {
//为2个公共字段赋值
Method setUpdateTime=entity.getClass().getDeclaredMethod(AutoFillConstant.SET_UPDATE_TIME,LocalDateTime.class);
Method setUpdateUser=entity.getClass().getDeclaredMethod(AutoFillConstant.SET_UPDATE_USER ,Long.class);
//通过反射为对象属性赋值
setUpdateTime.invoke(entity,now);
setUpdateUser.invoke(entity,currentId);
} catch (Exception e) {
e.printStackTrace();
}
}
}
}
防止生产环境与开发环境配置冲突:
从yml文件中引用不同环境中的配置
如:application.yml:application-dev.yml:
@ConditionalOnMissingBean:当没有这个这个bean对象的时候创建bean,保证整个Spring容器里,只有一个该对象
菜品图片无法回显:设置为公共读
mybatis xml <foreach>
两种不同的方式
mybatis xml select语句 and报错:鼠标光标放在and上 ctrl+enter ->language->选generateSql
sql语句不提示:
点黄灯泡->->选mysql
knifef4j打开接口文档:http://localhost:8080/doc.html
接口文档管理端和用户端分开展示
微信小程序目录结构
修改对应的后端接口地址
[ app.json 文件内容错误] app.json: app.json 未找到,未找到入口 app.json 文件,或者文件读取失败,请检查后重新编译。
解决办法:
在project.config.json中添加:"miniprogramRoot": "mp-weixin/"
微信支付流程: