文章目录
- 前言
- 公共字段自动填充
- 文件的上传
前言
以后这个项目所涉及的比较重要的技术点我都会将其单独写一篇文章,如果将这些技术点写在项目文章里面的话,不仅会不够细致,而且还会使项目结构看起来很乱,不够规整。这个项目文章以及项目所涉及的技术点我都放在了一个专栏里面,就是该项目的专栏。有关技术点的链接引用的文章都是我自己写的与这个项目相结合又对其扩展的。
公共字段自动填充
对于公共功能的实现,我们首先可能会想到 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);}}
}
将上传文件的部分封装成了工具类,在上述链接文章中。
MultipartFile 是 spring 提供的接收文件的类
未完。。。。。。。。。