【苍穹外卖 | 项目日记】第二天

news2025/4/20 2:15:02

前言:

        坦率的讲今天有点水,课也多,上了一天课,中午下课后和晚上十一点多跑完步回来写了两个接口

0f526593ea354ea69e92d64dcbf9e025.png

目录

前言:

今日完结任务:

 今日收获:

1.实现了公共字段填充功能

2.实现了文件上传接口

杂项知识点:

总结:


 

 

今日完结任务:

  • 实现了公共字段填充功能
  • 实现了文件上传接口

 今日收获:

1.实现了公共字段填充功能

我们的项目开发中会牵扯大量的数据表,而这些数据表中有一些重叠的字段,我们把他们叫做公共字段,例如菜品种类表和员工表里面都有修改人/时间 以及 创建人/时间 四个公共的字段,而且代码也基本一致,都是给对象赋值然后传递到mapper层进行数据库操作,而大量相似的代码会造成代码的冗余,因此我们对此方面进行优化:
优化前:
915dcc3c18c54bfe8e703660c970d638.png

我们优化的思想是AOP思想

【Spring知识点介绍 | 第二篇】什么是AOP_我是一盘牛肉的博客-CSDN博客

简单的来讲,就是把所有需要对这四个字段进行修改的方法提前进行拦截,在我们的 通知 中就对这四个字段进行赋值,然后再进行被拦截的方法。(由此可以看出我们这里的通知是前置通知

拦截我们这里采用的方法是自定义注解,自定义一个方法注解,被该注解标记的方法会被拦截器拦截。

2dce00d4ef1840a99d49d6d1adb9705a.png

这里简单贴一部分代码:
be51070879cf49a9aaece593d8011697.png

使用AOP思想的好处就是我们在不改动源代码的前提下 实现了对目标代码的优化,这对于大型项目有很大的优点。

此外在这个方法中我还学到了两个注解:
1.@target注解

@Target 是 Java 注解中的一个元注解,用于指定注解可以应用的目标元素类型。它可以用来约束一个注解可以在哪些地方使用。@Target 注解包含一个 value 属性,其值是一个枚举数组,表示注解可以应用的目标元素类型。常见的目标元素类型包括:

  • ElementType.TYPE:可以应用在类、接口、枚举等类型上。
  • ElementType.FIELD:可以应用在字段上。
  • ElementType.METHOD:可以应用在方法上。
  • ElementType.PARAMETER:可以应用在方法参数上。
  • ElementType.CONSTRUCTOR:可以应用在构造函数上。
  • ElementType.LOCAL_VARIABLE:可以应用在局部变量上。
  • ElementType.ANNOTATION_TYPE:可以应用在注解上。
  • ElementType.PACKAGE:可以应用在包上。

2.@Retention注解

@Retention 是 Java 注解中的一个元注解,用于指定注解的保留策略,即注解在何时生效。它可以用来约束一个注解可以保留多长时间。@Retention 注解包含一个 value 属性,其值是一个枚举类型 RetentionPolicy 的枚举常量。

常见的保留策略包括:

  • RetentionPolicy.SOURCE:注解仅保留在源代码中,编译时会被忽略。这意味着在编译后的字节码中不会包含该注解。
  • RetentionPolicy.CLASS:注解保留在编译后的字节码中,但在运行时不可见。这是默认的保留策略,如果在注解上没有明确指定保留策略,默认为 CLASS。
  • RetentionPolicy.RUNTIME:注解保留在编译后的字节码中,并在运行时可见。这意味着可以通过反射机制在运行时获取并解析注解信息。

2.实现了文件上传接口

这里的文件上传主要是图片文件,我们整体的思路是 利用阿里云OSS服务器,把图片上传到阿里云的OSS服务器后,利用后端接收OSS服务器返回的图片URL,然后再返回给前端,前端调用URL进行图片回显。

其实这个接口整体的思路很简单,没有什么创新的点,在这里我也简单的贴出来一部分代码:

37fd903b20ad40c4b8d9017b01087f15.png
92961cb870b24cf293301937375be52c.png

 在写这个接口的时候,我们把AliyunOSSutils  对象交给了IOC容器管理,并在实现方法中自动装配,实现了解耦

这里我介绍一下这个代码中给我启发性的两点:
1.使用UUID生成文件名

这里我们使用的OSS云服务需要给上传后的文件命名,而重复的命名会导致文件被覆盖,因此我们使用UUID工具类来生成一串随机数,把这个随机数作为文件名,这样文件就不会被覆盖。

2.不要把配置类写死

我们在配置类文件中配置aliyunOSS位置信息的时候,不要直接写死,应该写成这种格式(即让A配置类引用B配置类)

96445c2f773a4c3fa802b98443d3593d.png

也就是说引用另一个配置类中的信息,这是因为我们的项目会经历开发,测试,维护三个阶段,而这三个阶段可能使用的数据库等等配置类不一致,因此我们不要在配置类中把配置类写死

而是再写一个配置类,例如dev(开发配置类),让目标配置类引用开发配置类:

647de1af05f14f5a82d601bfcc9832c7.png

引用dev中的配置类 

18d4f435b03a4627ae9b5d6b8d0240a5.png

这样当我们切换环境的时候,直接修改active中的配置类就好了,而不用在配置类中一个一个修改。

杂项知识点:

什么叫做逻辑外键:

逻辑外键是在关系数据库中的一个概念,它是通过程序或规则实现的关联关系,而不是通过数据库引擎的外键约束来实现的。在逻辑外键中,没有在数据库模式中显式定义外键约束,但是应用程序或业务规则会处理相关的关联逻辑。

简单的说:逻辑外键就是在数据库中并没有使用外键的形式把两张表关联起来,而是在业务层用代码实现对表进行逻辑关系绑定。

通过反射来拿到一个类的方法

这个知识点的应用场景是公共字段填充功能,我们先贴代码再进行解释

f4acfe6e15004b149e5da9e1d82a005f.png

我们利用连接点拿到了第一个参数(这里我们默认第一个参数就是需要进行字段填充的对象),而此时arg的类型并不明确,他可能是emplyee,也可能是category。因此我们无法直接用arg来调用对应的参数方法。

而这里我们的解决思路是利用反射

Method setCreateTime = arg.getClass().getDeclaredMethod(AutoFillConstant.SET_CREATE_TIME, LocalDateTime.class);
Method setCreaterUser = arg.getClass().getDeclaredMethod(AutoFillConstant.SET_CREATE_USER, Long.class);
Method setUpdateTime = arg.getClass().getDeclaredMethod(AutoFillConstant.SET_UPDATE_TIME, LocalDateTime.class);
Method setUpdateUser = arg.getClass().getDeclaredMethod(AutoFillConstant.SET_UPDATE_USER, long.class);

我们取第一条解释一下:

首先,arg.getClass() 返回 arg 对象的运行时类,即获取到 arg 对象的类对象。接着,getDeclaredMethod(AutoFillConstant.SET_CREATE_TIME, LocalDateTime.class) 是调用类对象的 getDeclaredMethod 方法,并传入两个参数。第一个参数是要获取的方法的名称,AutoFillConstant.SET_CREATE_TIME 表示要获取的方法名。第二个参数是方法的参数类型,LocalDateTime.class 表示要获取的方法的参数类型为 LocalDateTime。
getDeclaredMethod 方法会返回一个 Method 对象,表示指定名称和参数类型的方法。如果找不到对应的方法,会抛出 NoSuchMethodException 异常。
然后,将获取到的方法对象赋值给 setCreateTime 变量。

而我们通过反射就拿到了类中的方法

之后再利用invoke方法进行赋值,就完成了对象字段的填充

1b48118919b141ddaab7bb7fe8e3a219.png

由此我们可以看出反射也是一个很高级的知识点,它使得我们能对未知类型的对象进行调用其类中的特有方法。 

总结:

        今天虽然实现的接口少,但是我的收获也很大,明天的课很少,打算一直在宿舍些项目了。写项目真的是一个很畅快的过程。

如果我的内容对你有帮助,请点赞,评论,收藏。创作不易,大家的支持就是我坚持下去的动力!

69e9169c980f43e0aad31ff9ada88a9c.png

 

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1085568.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

35道Rust面试题

这套Rust面试题包括了填空题、判断题、连线题和编码题等题型。 选择题 1 ,下面哪个是打印变量language的正确方法? A,println("{}", language); B,println(language); C,println!("{}", langu…

【已修复】vcruntime140.dll有什么用,vcruntime140.dll缺失如何修复

我是网友,今天非常荣幸能够在这里和大家分享关于电脑找不到vcruntime140.dll无法继续执行代码的解决方法。我相信,在座的许多朋友都曾遇到过这个问题,而今天我将为大家介绍五种有效的解决方法。 首先,让我们来了解一下vcruntime1…

stm32mp157中断简单应用

设置按键中断,按键1按下,LED亮,再按一次,灭 按键2按下,蜂鸣器响。再按一次,不响 按键3按下,风扇转,再按一次,风扇停 main.c #include "gpio.h" #include &…

99 # mongo 的基本安装和配置

关系型数据库和非关系型数据库 MySQL Oracle SqlServer 用一种关系模型来组织数据的数据库(查询方便,不方便拓展)nosql mongo redis memcached (不同于传统的关系数据库) mongo 特点 分布式:文档类型&am…

地下城堡3魂之诗阵容搭配攻略

在地下城堡3魂之诗游戏中,拥有一个合理搭配的阵容非常关键,可以让角色能力发挥最大化。以下是建议的阵容搭配及攻略: 关注【娱乐天梯】,获取内部福利号 1.核心成员(2名) 在阵容中选择两个输出型角色作为核心成员,他们的…

Vue实战项目1:跑马灯效果

Vue实战项目1&#xff1a;跑马灯效果 目录 一、效果预览二、编写思路三、整体代码展示 一、效果预览 二、编写思路 两个按钮用于启动和停止&#xff0c;绑定点击事件&#xff0c;使用v-on&#xff0c;可以简写为 <input type"button" value"跑起来" c…

扒一扒集成运放uA741的内部电路

uA741是一款常见的集成运放芯片,这个是uA741的内部电路。 Q1与Q2组成的差动对是整个741运算放大器的输入端,这两个三极管是射极跟随器的连接方式,特点是输入电阻大,输出电阻小。 Q1和Q2的输出接至共基极组态的PNP晶体管Q3和Q4

ECharts 双y轴时如何处理0刻度线对齐的问题

ECharts 多y轴时如何处理0刻度线对齐的问题 用echarts做双&#xff08;多&#xff09;轴时发现其中某轴有负数时0刻度线不对齐。 解决 首先判断是否有负数 const hasNegative Math.min(...seriesData[0], ... seriesData[1]);如果有的话&#xff0c;我的配置是这样的 yAxi…

Python利用jieba分词提取字符串中的省市区(字符串无规则)

目录 背景库&#xff08;jieba&#xff09;代码拓展结尾 背景 今天的需求就是在一串字符串中提取包含&#xff0c;省、市、区&#xff0c;该字符串不是一个正常的地址;,如下字符串 "安徽省、浙江省、江苏省、上海市,冷运标快首重1kg价格xx元,1.01kg(含)-5kg(不含)续重价…

RabbitMQ详细使用

工作队列 注意事项&#xff1a;一个消息只能被处理一次&#xff0c;不可以处理多次 轮询分发信息 消息应答 消费者在接收到消息并且处理该消息之后&#xff0c;告诉rabbitmq它已经处理了&#xff0c;rabbitmq可以把该消息删除了。倘若mq没有收到应答&#xff0c;mq会将消息转…

车载相关名词--车载数据中心方案

车载数据中心方案 参考链接:https://zhuanlan.zhihu.com/p/600031042?utm_id=0 下面这张图是小鹏汽车嵌入式系统高级专家 唐黾 在同ARM一起的一个演讲稿中发布的,是一张未来车载数据中心单芯片方案构想图。主要针对的是智驾域和座舱域融合方案,下面对如上图的内外部组件及…

telnet 连接闪退

目录 问题查找问题解决参考 问题 在使用 telnet 连接板子时&#xff0c;出现了 telnet 界面一闪而逝的情况。正常板子开机&#xff0c;查看其存在 telnetd 进程&#xff0c;而使用 telnet 后&#xff0c;登录界面一闪而逝&#xff0c;板子上的 telnetd 进程消失。 查找问题 …

go cpu、内存监控、性能分析:PProf

PProf PProf 是什么 PProf是 golang 官方提供的性能调优分析工具&#xff0c;用于分析和优化Go程序的性能。 PProf通过收集和分析程序的运行时数据来生成性能分析报告。它使用Go语言的运行时特性&#xff0c;如代码注释和特殊的程序运行标记&#xff0c;来收集性能数据。PPr…

【数据结构】二叉树--链式结构的实现 (遍历)

目录 一 二叉树的遍历 1 构建一个二叉树 2 前序遍历 3 中序遍历 4 后续遍历 5 层序 6 二叉树销毁 二 应用(递归思想) 1 二叉树节点个数 2 叶子节点个数 3 第K层的节点个数 4 二叉树查找值为x的节点 5 判断是否是二叉树 一 二叉树的遍历 学习二叉树结构&#xff0…

ubuntu22.04 电脑声音和腾讯会议等声音很小怎么修复

电脑的声音很小&#xff0c;特别是开微信会议的时候几乎听不到声音&#xff0c;而声音设置都已经设置为最大 这时候就是用命令 alsamixer腾讯会议的声音 调整这两个声音的大小即可 H键弹出帮助菜单 F6按键选择声卡 左右按键选择轨道 M键静音所选轨道 上下按键调整音量…

共生与共享:线程与进程的关系

&#x1f30d;前言 在计算机科学和操作系统领域&#xff0c;线程&#xff08;Thread&#xff09;和进程&#xff08;Process&#xff09;是两个关键概念。它们之间存在密切的关系&#xff0c;但又有着明显的区别。本文将深入探讨线程和进程之间的关系&#xff0c;以及它们在并…

CCF CSP认证 历年题目自练Day29

题目一 试题编号&#xff1a; 202112-1 试题名称&#xff1a; 序列查询 时间限制&#xff1a; 300ms 内存限制&#xff1a; 512.0MB 样例1输入 3 10 2 5 8 样例1输出 15 样例2输入 9 10 1 2 3 4 5 6 7 8 9 样例2输出 45 题目分析&#xff08;个人理解&#xff09; 还是…

数据库静态脱敏和动态脱敏解决方案 安当加密

安当KDPS数据保护系统的数据库脱敏功能是一种安全策略&#xff0c;它可以将数据库中的敏感数据进行脱敏处理&#xff0c;使得数据在被访问时不会泄露敏感信息。该功能主要具有以下特点&#xff1a; 可扩展性&#xff1a;可以支持多种数据库类型&#xff0c;如Oracle、MySQL、S…

分布式系统开发技术中的CAP定理原理

分布式系统开发技术中的CAP定理原理 在分布式系统开发中&#xff0c;CAP定理&#xff08;一致性、可用性和分区容忍性&#xff09;是指导我们设计、开发和维护系统的核心原理。该定理阐述了分布式系统中一致性、可用性和扩展性之间无法同时满足的矛盾关系&#xff0c;为我们提…

HDMI 基于 4 层 PCB 的布线指南

HDMI 基于 4 层 PCB 的布线指南 简介 HDMI 规范文件里面规定其差分线阻抗要求控制在 100Ω 15%&#xff0c;其中 Rev.1.3a 里面规定相对放宽了一些&#xff0c;容忍阻抗失控在 100Ω 25%范围内&#xff0c;不要超过 250ps。 通常&#xff0c;在 PCB 设计时&#xff0c;注意控…