《苍穹外卖》电商实战项目笔记整理

599 阅读5分钟

超级全超级牛逼的文档

《苍穹外卖》电商实战项目(java)知识点整理(P1~P65)【上】

blog.csdn.net/RuanFun/art…

每一次请求都是单独的线程。

ThreadLocal 并不是一个Thread,而是Thread的局部变量。 ThreadLocal为每个线程提供单独一份存储空间,具有线程隔离的效果,只有在线程内才能获取到对应的值,线程外则不能访问。

写员工管理类:看管理端接口写,用PostMapping或GetMapping或Putmapping注解看接口,注解里面写什么路径也是来看接口,前面@RequestMapping("/xx/xx")路径已经写过则只用写最后面没有写过的就行。正常操作调用employeeService.方法();然后Create method 'update'in 'Employeeservice,然后EmployeeServiceImpl实现类中重写该方法,同样进行一系列操作,返回结果语句都是return Result.success();括号里面写什么具体看Result泛型里面定义的是什么,没有定义泛型就不用写。

比如下面:

解析注解 blog.csdn.net/zen99t/arti…

反射(非常重要)通过反射的方式获取这些点的状态和信息。 blog.csdn.net/sinat_38259…

[SpringBoot]自定义注解@AutoFill,实现公共字段自动填充(避免重复对时间属性初始化

自定义切面,实现公共字段自动填充处理逻辑 ①定义切入点,即统一拦截加入了AutoFill 注解的方法 ②编写前置通知,进行公共字段自动填充 获取到当前被拦截的方法上的数据库操作类型 获取到当前被拦截的方法的参数--实体对象 准备赋值的数据 根据当前不同的操作类型,为对应的属性通过反射来赋值

原文链接: blog.csdn.net/qq_62015542…

浅谈Spring中的JoinPoint MethodSignature Signature

blog.csdn.net/prince0520/…

AOP 中,切面可以通过 JoinPoint 对象获取到连接点的相关信息,其中包括方法签名信息。

通过 JoinPoint 对象的 getSignature() 方法获取到 Signature 对象。 如果连接点是一个方法,那么可以将 Signature 对象转换为 MethodSignature 对象,通过 MethodSignature 对象可以获取到更加详细的方法签名信息,比如方法返回类型、参数类型等。

怎么操作呢

    就是点Signature,ctrl+b进去 然后点住Signature方法,ctrl+h进去,选中MemberSignature (org.aspectj.lang.reflect)
    复制粘贴过来替换掉Signature ,进行一波向下转型的操作,

全用到这篇文章里面的:

自定义注解@AutoFill,实现公共字段自动填充

笔记全在项目代码里面 比较重要且难

@Aspect
@Component
@Slf4j
public class AutoFillAspect {
    /**
     * 切入点:对哪些类的哪些方法进行拦截
     * ①定义切入点,即统一拦截加入了AutoFill 注解的方法
     */
    //*.*(..)表包里面所有的类所有的方法
   // @Pointcut里面写的是对哪些方法进行拦截,要满足2点:①必须是mapper下的所有类的方法,②还要有AutoFill这个注解。
    @Pointcut("execution(* com.sky.mapper.*.*(..)) && @annotation(com.sky.annotation.AutoFill)")
    public void autoFillPintCut(){
    }

    /**
     * 前置通知 在通知中进行公共字段的赋值
     * @param joinPoint
     */
    @Before("autoFillPintCut()")
    public void autoFill(JoinPoint joinPoint){
        log.info("开始进行公共字段自动填充...");

        /*
        AOP 中,切面可以通过 JoinPoint 对象获取到连接点的相关信息,其中包括方法签名信息。
        过 JoinPoint 对象的 getSignature() 方法获取到 Signature 对象。
        如果连接点是一个方法,那么可以将 Signature 对象向下转型为 MethodSignature 对象,
        通过 MethodSignature 对象可以获取到更加详细的方法签名信息,比如方法返回类型、参数类型等。

        怎么操作呢
        就是点Signature ctrl+b进去 然后点住Signature方法,ctrl+h进去,选中MemberSignature (org.aspectj.lang.reflect)
        复制粘贴过来替换掉Signature ,进行一波向下转型的操作,
         */

        //1.获取到当前被拦截的方法上的数据库操作类型(比如是Insert还是Update,不同的类型需要给不同的参数赋值)
        MethodSignature signature = (MethodSignature) joinPoint.getSignature();//通过连接点对象来获取签名,向下转型为MethodSignature
        AutoFill autoFill = signature.getMethod().getAnnotation(AutoFill.class);//获得方法上的注解对象
        OperationType operationType = autoFill.value();//获得数据库操作类型(Insert or Update)
        //2.获取到当前被拦截的方法的参数--实体对象(比如传入的参数是员工还是菜品还是其它的)
        Object[] args = joinPoint.getArgs();
        //为防止空指针出现
        if(args == null || args.length == 0){
            return;
        }
        Object entity = args[0];
        //3 .准备赋值的数据(给公共字段赋值的数据,比如时间就是系统时间,用户ID是从ThreadLocal获取
        LocalDateTime now = LocalDateTime.now();
        Long currentId = BaseContext.getCurrentId();
        //4.根据当前不同的操作类型,为对应的属性通过反射来赋值
        //这里注意首字母大小写啊  不要搞反
        if(operationType == OperationType.INSERT){
            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);//人

                //4.根据当前不同的操作类型,为对应的属性通过反射来赋值
                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 {
                //这里是更新 把上面的复制下来 去除新增操作就行
                Method setUpdateTime = entity.getClass().getDeclaredMethod(AutoFillConstant.SET_UPDATE_TIME,LocalDateTime.class);//时间
                Method setUpdateUser = entity.getClass().getDeclaredMethod(AutoFillConstant.SET_UPDATE_USER,Long.class);//人

                //4.根据当前不同的操作类型,为对应的属性通过反射来赋值
                setUpdateTime.invoke(entity,now);
                setUpdateUser.invoke(entity,currentId);

            } catch (Exception e){
                e.printStackTrace();
            }
        }
    }
}  

在阿里云上申请一个oss(Object Storage Service) 即对象存储服务,阿里云上有7天试用期.在黑马java web2023版148,149两集能学到。

String uuid = UUID.randomUUID().toString()详解 blog.csdn.net/qq_44942083…

MultipartFile实现文件的上传和下载blog.csdn.net/weixin_4605…

/**
 * 通用接口
 * 写法应该和员工管理接口一样
 */
@RestController
@RequestMapping("/common/upload")
@Slf4j
@Api(tags = "通用接口")
public class CommonController {
    @Autowired
    private AliOssUtil aliOssUtil;

    /**
     * 文件上传
     *
     * @param file
     * @return
     */
    @PostMapping("/upload")
    @ApiOperation("文件上传")
    public Result<String> upload(MultipartFile file) {
        log.info("文件上传,{}", file);

        try {
            //为了防止文件重名导致覆盖
            String originalFilename = file.getOriginalFilename();//原始文件名
            //获取原始文件名的后缀

            String extension = originalFilename.substring(originalFilename.lastIndexOf("."));

            //构造新文件名称 objectName
            //UUID.randomUUID().toString()是javaJDK提供的一个自动生成主键的方法
            String objectName = UUID.randomUUID().toString() + extension;

            //文件的请求路径
            String filePath = aliOssUtil.upload(file.getBytes(), objectName);

            return Result.success(filePath);
        } catch (IOException e) {
            log.error("文件上传失败,{}", e);
        }

        return Result.error(MessageConstant.UPLOAD_FAILED);
    }
}

over

一些注意事项

哥们儿这里更新密码后要记得保存啊不然登录不进去

还是细心点吧一点小细节真的会让我找问题找半天。

有配置对应的xml文件,mapper接口才会有小鸟。

实现类接口这里上面要有@Mapper注解,细心一点