take-out-sky项目笔记第三章

news/2025/2/22 20:16:40/

文章目录

  • 前言
  • 公共字段自动填充
  • 文件的上传

前言

以后这个项目所涉及的比较重要的技术点我都会将其单独写一篇文章,如果将这些技术点写在项目文章里面的话,不仅会不够细致,而且还会使项目结构看起来很乱,不够规整。这个项目文章以及项目所涉及的技术点我都放在了一个专栏里面,就是该项目的专栏。有关技术点的链接引用的文章都是我自己写的与这个项目相结合又对其扩展的。

公共字段自动填充

在这里插入图片描述
对于公共功能的实现,我们首先可能会想到 AOP , 但如果你使用的是 mybatis-plus 会有效的简化这一功能的实现。
该项目使用的是 mybatis ,所以接下来我们会使用 AOP,java注解,反射 来完成 这一功能的实现。

有关这三者的基本使用可以参照以下文章:
AOP的基本使用;
java注解,在这片文章中包含了反射。
这两篇文章也是我写的文章,我将涉及到的技术点给提了出来,以后这个项目所涉及的比较重要的技术点我都会将其但多写一篇文章,如果将这些技术点写在项目文章里面的话,不仅会不够细致,而且还会使项目结构看起来很乱,不够规整。这个项目文章以及项目所涉及的技术点我都放在了一个专栏里面

在本项目中,该公共字段自动填充用于 增加修改 数据

代码实例:

//定义枚举,用于指定是 增加 还是 修改 操作
/*** 数据库操作类型*/
public enum OperationType {/*** 更新操作*/UPDATE,/*** 插入操作*/INSERT}//定义Java注解,作用与增加与修改数据的方法,
//通过反射获取注解,判断是哪种方法,从而实现相应的填充功能//指定注解的作用范围
@Target(ElementType.METHOD)
//保留策略
@Retention(RetentionPolicy.RUNTIME)
public @interface AutoFill {//定义注解成员,为枚举类型OperationType value();
}/*** 自动填充注解的切面*/
@Aspect
@Component // 需要将该类加入到IOC容器中
@Slf4j
public class AutoFillAspect {//定义切点,这里使用注解的方式来定义切点,根据需要自行设置@Pointcut("execution(public * com.sky.mapper.*.*(..)) && @annotation(com.sky.annotation.AutoFill)")public void autoFillPointcut() {}// 定义前置通知,使用在方法aspect()上注册的切入点@Before("autoFillPointcut()")public void autoFill(JoinPoint joinPoint) {log.info("开始自动填充。。。");//通过反射获取目标对象关联的注解值MethodSignature methodSignature = (MethodSignature) joinPoint.getSignature();AutoFill autoFill = methodSignature.getMethod().getAnnotation(AutoFill.class);OperationType value = autoFill.value();//获取参数--实体对象Object[] args = joinPoint.getArgs();Object target = args[0];if (target == null){return;}//准备填充的数据LocalDateTime now = LocalDateTime.now();Long currentId = BaseContext.getCurrentId();//根据填充类型进行字段填充if (value == OperationType.INSERT){try {//通过反射填充创建人、创建时间,修改人,修改时间Method setCreateTime = target.getClass().getMethod(AutoFillConstant.SET_CREATE_TIME, LocalDateTime.class);Method setCreateUser = target.getClass().getMethod(AutoFillConstant.SET_CREATE_USER, Long.class);Method setUpdateTime = target.getClass().getMethod(AutoFillConstant.SET_UPDATE_TIME, LocalDateTime.class);Method setUpdateUser = target.getClass().getMethod(AutoFillConstant.SET_UPDATE_USER, Long.class);//设置值setUpdateUser.invoke(target, currentId);setUpdateTime.invoke(target, now);setCreateTime.invoke(target, now);setCreateUser.invoke(target, currentId);} catch (Exception e) {e.printStackTrace();}} else if (value == OperationType.UPDATE){try {//填充更新人、更新时间Method setUpdateTime = target.getClass().getMethod(AutoFillConstant.SET_UPDATE_TIME, LocalDateTime.class);Method setUpdateUser = target.getClass().getMethod(AutoFillConstant.SET_UPDATE_USER, Long.class);//设置值setUpdateUser.invoke(target, currentId);setUpdateTime.invoke(target, now);} catch (Exception e) {e.printStackTrace();}}      }
}/*** 公共字段自动填充相关常量*/
public class AutoFillConstant {/*** 实体类中的方法名称*/public static final String SET_CREATE_TIME = "setCreateTime";public static final String SET_UPDATE_TIME = "setUpdateTime";public static final String SET_CREATE_USER = "setCreateUser";public static final String SET_UPDATE_USER = "setUpdateUser";
}/*** 添加员工* @param employee*/@AutoFill(OperationType.INSERT)@Insert("insert into employee (name, username, password, phone, sex, id_number, status, create_time, update_time, create_user, update_user)" +"values " +"(#{name},#{username},#{password},#{phone},#{sex},#{idNumber},#{status},#{createTime},#{updateTime},#{createUser},#{updateUser})")void insert(Employee employee);/*** 修改用户信息* @param employee*/@AutoFill(OperationType.UPDATE)void update(Employee employee);

定义切入点时,不仅使用 execution 去定位方法,而且还要满足添加了 @AutoFill 注解的方法才能实现公共共字段填充功能。

文件的上传

这里的文件主要指 图片
该功能的实现使用了阿里的:对象存储OSS技术。
可见文章对象存储OSS

这部分的代码示例:

/*** 通用Controller*/
@Slf4j
@RestController
@RequestMapping("/admin/common")
public class CommonController {@Autowiredprivate AliOssUtil aliOssUtil;/*** 文件上传* @param file* @return*/@PostMapping("/upload")public Result<String> upload(MultipartFile file) {log.info("文件上传: {}",file);//todo 使用阿里对象存储OSS服务进行文件的储存,因为是练习项目这里就不开通该服务,将会在一篇文章中介绍该技术{//将文件上传到AliOss,阿里对象存储服务中try {//获取文件名String originalFilename = file.getOriginalFilename();//获取文件后缀String substring = originalFilename.substring(originalFilename.lastIndexOf("."));//生成新的文件名,两种方式//String fileName = System.currentTimeMillis() + substring;//使用uuid生成新的文件名String objectName = UUID.randomUUID().toString() + substring;//上传文件到阿里云OSSString filePath = aliOssUtil.upload(file.getBytes(), objectName);return Result.success(filePath);} catch (IOException e) {log.error("文件上传失败: {}", e);}return Result.error(MessageConstant.UPLOAD_FAILED);}}
}

将上传文件的部分封装成了工具类,在上述链接文章中。
MultipartFilespring 提供的接收文件的类

未完。。。。。。。。。


http://www.ppmy.cn/news/1422347.html

相关文章

【C 数据结构】线性表

文章目录 【 1. 线性表 】【 2. 顺序存储结构、链式存储结构 】【 3. 前驱、后继 】 【 1. 线性表 】 线性表&#xff0c;全名为线性存储结构&#xff0c;线性表结构存储的数据往往是可以依次排列的&#xff08;不考虑数值大小顺序&#xff09;。 例如&#xff0c;存储类似 {1…

【网络编程】web服务器shttpd源码剖析——命令行和文件配置解析

hello &#xff01;大家好呀&#xff01; 欢迎大家来到我的网络编程系列之web服务器shttpd源码剖析——命令行解析&#xff0c;在这篇文章中&#xff0c;你将会学习到在Linux内核中如何创建一个自己的并发服务器shttpd&#xff0c;并且我会给出源码进行剖析&#xff0c;以及手绘…

Java练习题

题目&#xff1a;使用二维数组打印杨辉三角前二十行。 介绍&#xff1a;杨辉三角&#xff0c;又称贾宪三角形&#xff0c;帕斯卡三角形&#xff0c;是二项式系数在三角形中的一种几何排列。 左图的表在我国南宋数学家杨辉1261年所著的《详解九章算法》一书里就出现了。 现在&…

PCG共轭梯度最小二乘相位解包裹-matlab(可直接运行)

phase_unwrap.m %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % 根据Ghiglia和Romero(1994)提出的方法,基于加权和非加权最小二乘法进行相位解包裹 % 链接:https://doi.org/10.1364/JOSAA.11.000107 % 输…

Go语言异常处理方式

Go 语言没有传统的异常处理机制&#xff0c;如 Java、C 或 Python 中的 try-catch 语句。取而代之&#xff0c;Go 采用了基于返回错误值和 panic/recover 机制的混合模式来进行错误处理。以下是 Go 语言中处理异常&#xff08;或称错误&#xff09;的两种主要方式&#xff1a; …

服务器docker应用一览

文章目录 一、需求概况二、业务流程三、运行效果四、实现过程1. 基础前提2. 源码放送3.核心代码4. 项目打包5.部署步骤 一、需求概况 现有某云主机服务器&#xff0c;用来做项目演示用&#xff0c;上面运行了docker应用&#xff0c;现希望有一总览页面&#xff0c;用来展示部署…

蓝桥杯(基础题)

试题 C: 好数 时间限制 : 1.0s 内存限制: 256.0MB 本题总分&#xff1a;10 分 【问题描述】 一个整数如果按从低位到高位的顺序&#xff0c;奇数位&#xff08;个位、百位、万位 &#xff09;上 的数字是奇数&#xff0c;偶数位&#xff08;十位、千位、十万位 &…

故障转移-redis

4.4.故障转移 集群初识状态是这样的&#xff1a; 其中7001、7002、7003都是master&#xff0c;我们计划让7002宕机。 4.4.1.自动故障转移 当集群中有一个master宕机会发生什么呢&#xff1f; 直接停止一个redis实例&#xff0c;例如7002&#xff1a; redis-cli -p 7002 sh…