开源新项目Auto-Annotation,这你不了解一下

logo

Auto-Annotation

一个注解实现对业务功能增强的注解集


项目简介

​ 项目源码开源地址:点这里

​ 对业务开发过程中经常遇见的一些通用场景进行注解封装,形成一系列比较通用的注解集,来满足日常开发需要。注解集随业务拓展不断更新中,欢迎您的补充…

                  _                                     _        _   _
       /\        | |            /\                     | |      | | (_)
      /  \  _   _| |_ ___      /  \   _ __  _ __   ___ | |_ __ _| |_ _  ___  _ __
     / /\ \| | | | __/ _ \    / /\ \ | '_ \| '_ \ / _ \| __/ _` | __| |/ _ \| '_ \
    / ____ \ |_| | || (_) |  / ____ \| | | | | | | (_) | || (_| | |_| | (_) | | | |
   /_/    \_\__,_|\__\___/  /_/    \_\_| |_|_| |_|\___/ \__\__,_|\__|_|\___/|_| |_|

:: Project Version 1.0.0 :: auto-annotation:druid :: Running SpringBoot 2.6.5 :: 

项目引用

​ 该项目已上传至Maven中央仓库,使用者可直接引用

<dependency>
    <groupId>io.github.lindaifeng</groupId>
    <artifactId>auto-annotation</artifactId>
    <version>1.0.0</version>
</dependency>

技术实现

环境配置

运行环境JDK1.8

开发工具: IdeaMaven

默认已启动中间件:Mysql8.0Redis

主要功能点展示

  • 数据脱敏篇 @SensitiveFiled
  • 参数校验篇 @MockValidator
  • 防重复提交篇 @RepeatSubmit
  • 接口限流篇 @RateLimit
  • 强制登录篇 @LoginRequired
  • 日志记录篇 @OperateLog
  • 动态数据源篇 @DynamicDb
  • 数据加密篇 @EncryptionFields

数据脱敏篇

本文链接:点这里

​ 在日常业务开发中,我们会接触到各种各样的数据,这些数据可能包含用户敏感信息。如果这些敏感信息在传输和存储过程中被泄露,将会给用户带来不必要的麻烦和安全隐患。因此,数据脱敏技术的应用变得越来越重要。

@Target(ElementType.FIELD)
@Retention(RetentionPolicy.RUNTIME)
@JacksonAnnotationsInside
@JsonSerialize(using = SensitiveFiledSerialize.class)
public @interface SensitiveFiled {

    /**
     * 脱敏实现类
     */
    Class<? extends ISensitiveTypeStrategy> using();
    /**
     * 脱敏前缀位数(自定义脱敏使用)
     */
    int prefixHideLen() default 0;
    /**
     * 脱敏后缀位数(自定义脱敏使用)
     */
    int suffixHideLen() default 0;
    /**
     * 脱敏符号(自定义脱敏使用)
     */
    String symbol() default "*";

}

参数校验篇

本文链接:点这里

​ API开发中经常会遇到一些对请求数据进行验证的情况,常规操作是不是在代码中进行if判断是否参数为空?这样显得很不优雅,这时候如果使用注解就有两个好处,一是验证逻辑和业务逻辑分离,代码清晰,二是验证逻辑可以轻松复用,只需要在要验证的地方加上注解就可。

@Target({ElementType.FIELD})
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Constraint(validatedBy = MockValidatorImpl.class)
public @interface MockValidator {
    /**
     * 校验响应信息
     */
    String message() default "xxx校验不通过";

    /**
     * 校验分组
     */
    Class<?>[] groups() default {};

    /**
     * 自定义校验负载信息
     */
    Class<? extends Payload>[] payload() default {};

}

防重复提交篇

本文链接:点这里

​ 在实际的开发项目中,一个对外暴露的接口往往会面临很多次请求,表单重复提交在日常 Web 应用中是最常见且带来麻烦最多的一个问题。

​ 有很多的应用场景都会遇到表单重复提交问题,比如由于用户误操作,多次点击表单提交按钮;由于网速等原因造成页面卡顿,用户重复刷新提交页面,甚至会有黑客或恶意用户使用工具重复恶意提交表单来对网站进行攻击,这就造成请求发送多次,引发数据混乱,数据重复等问题,所以说防止表单重复提交在 Web 应用中的重要性是极高的。

@Inherited
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface RepeatSubmit {
    /**
     * 间隔时间(ms),小于此时间视为重复提交
     */
    int interval() default 5000;

    /**
     * 提示消息
     */
    String message() default "不允许重复提交,请稍后再试";
}

接口限流篇

本文链接:点这里

​ 在访问高峰期为保证应用服务稳定运行,需要对高并发场景下接口进行接口限流处理,通对接口流量的访问限制能够在一定程度上防止接口被恶意调用的情况出现。

@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface RateLimit {
    /**
     * 限流key
     */
    String key() default "rate_limit_key:";

    /**
     * 限流时间,单位秒
     */
    int time() default 60;

    /**
     * 限流次数
     */
    int count() default 100;

    /**
     * 限流类型
     */
    RateLimitTypeEnum limitType() default RateLimitTypeEnum.GLOBAL;
}

强制登录篇

本文链接:点这里

​ 最近在一些业务场景中遇到这样的需求,有些接口需要登录后才能访问。我思考了一下,自定义注解的使用 注解+拦截器 实现登录校验,项目中在进入方法之前判断用户是否登录、登录了则继续执行方法,未登录则返回异常信息,或许是一个很不错的方法,当然类似黑名单的方式也可以,适合自己的最好。

@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface LoginRequired {

}

日志记录篇

本文链接:点这里

​ 平时开发中,我们经常需要通过日志或者数据库来记录系统中一些重要的操作,如删除、修改和新增等。但每次在这些方法里手动打印日志或者记录到数据库太过繁琐,并且在代码中看到好多日志打印语句一点都不优雅。

​ 通过自定义注解统一收集日志的方式来实现,则不需要在代码中考虑日志打印的问题,只需要在接口上打一个注解即可。

@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Repeatable(OperateLogs.class)
public @interface OperateLog {

    /**
     * 业务id
     */
    String bid();
    /**
     * 日志标签
     */
    String tag();
    /**
     * 操作类型
     */
    OperateTypeEnum operateType();
    /**
     * 日志消息
     */
    String message() default "";
    /**
     * 操作人员
     */
    String operatorId() default "";
    /**
     * 是否记录结果值
     */
    boolean recordResult() default false;
    /**
     * 结果值
     */
    String result() default "";
    /**
     * 是否在方法执行后记录(默认方法执行前记录)
     */
    boolean after() default false;

}

动态数据源篇

本文链接:点这里

​ 通常一个系统只需要连接一个数据库就可以了。但是在企业应用的开发中往往会和其他子系统交互,特别是对于一些数据实时性要求比较高的数据,我们就需要做实时连接查询,而不是做同步。这个时候就需要用到多数据源。

​ 举个例子,在主从数据库的业务场景中,一个库用来读,一个库用来写,那么在进行数据库读写操作时就需要进行数据库的切换。

@Target({ ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Inherited
public @interface DynamicDb {
    /**
     * 切换数据库源
     */
    DbType value() default DbType.PRIMARY_DB;
}

数据加密篇

本文链接:点这里

​ 前段时间在做密码测评时,遇到一个这样的业务场景,业务系统中的数据需要进行加密存储,在数据传输过程中进行加密传输。这就麻烦了,这数据可不光要加密,肯定也要解密呀,这再加上个传输加解密以及存储加解密,想想都麻烦,于是便想有什么办法能够写一套通用的代码来处理这种业务场景呢。

​ 力求便捷,最先想到的便是自定义注解了,那么我能不能通过定义一个注解来标识哪些接口需要加解密传输,哪些字段需要加解密存储呢。于是数据加密篇便油然而生。

@Target({ElementType.FIELD})
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface EncryptionFields {
    /**
     * 是否将接收到的参数解密存储
     */
    boolean decryptStorage() default false;
    /**
     * 是否将接收到的参数加密存储
     */
    boolean encryptStorage() default false;

    /**
     * 是否将查询到的结果解密返回
     */
    boolean decryptReturn() default false;
    /**
     * 是否将查询到的结果加密返回
     */
    boolean encryptReturn() default false;
}	

总结

​ 本项目为个人在闲暇之余的初创项目,代码结构总体比较简单易懂,内含详细的注释,非常适合新手以及无该业务场景经验者学习。

​ 如果在使用过程中发现bug,或者你有一个很不错的自定义注解想法,欢迎给我提issues,我将会采用你的意见一起来丰富这个项目。

​ 如果本项目对你有些帮助,欢迎给我一个🌟🌟🌟star🌟🌟🌟,让更多人知道它的存在,这对我很重要 。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: pdfjs-annotation是PDF.js的一个功能模块,用于处理和展示PDF文档中的注释。PDF.js是一个开源JavaScript库,用于在浏览器中渲染和呈现PDF文档。 pdfjs-annotation模块提供了一些API和功能,使用户可以在PDF文档中添加、编辑和查看注释。它支持不同类型的注释,如文本注释、高亮注释、批注、标记等。用户可以使用这些注释工具在PDF文档上进行标记、批注和记笔记,以便在共享或查看时更好地理解文档内容。 使用pdfjs-annotation,用户可以通过简单的JavaScript代码实现与注释相关的操作。例如,可以使用API创建一个的注释,设置注释的坐标、颜色、样式等属性,然后将注释添加到PDF页面上。还可以使用API获取已添加的注释列表,以便在界面中显示或编辑已有的注释。此外,也可以使用一些工具函数来管理注释的显示和隐藏。 pdfjs-annotation不仅可以用于个人使用,还可以嵌入到网页或应用程序中,以提供更好的文档交互和协作功能。用户可以基于pdfjs-annotation进行扩展和定制,以满足特定的需求。 总而言之,pdfjs-annotation是一个功能强大的PDF注释模块,它为用户提供了方便的工具和API,用于在PDF文档中添加、编辑和查看注释。它可以帮助用户更好地理解和共享PDF文档,并提供更好的文档交互和协作功能。 ### 回答2: pdfjs-annotation是一个基于PDF.js库的扩展,用于在浏览器中显示和管理PDF文件的注释和标记。 PDF.js是一个由Mozilla开发的JavaScript库,用于在Web页面中渲染PDF文档。它提供了一种在浏览器中显示PDF文件的便捷方式,无需依赖任何插件或附加软件。 pdfjs-annotation利用PDF.js的渲染功能,并添加了注释和标记的功能。用户可以在PDF文件中添加各种类型的注释,例如箭头、文字、高亮、标签等。这些注释可以用于标记重要内容、进行批注、引用其他文档等。 同时,pdfjs-annotation还提供了管理注释的功能。用户可以选择编辑、删除、移动、复制、粘贴和旋转注释,以便根据需要对其进行调整。此外,还可以通过搜索和过滤功能查找特定类型或内容的注释。 pdfjs-annotation还支持与其他用户共享和协作。用户可以导出和导入注释,便于与其他人共享和查看。在多人协作中,用户可以实时更和同步注释,以便进行实时讨论和反馈。 总结来说,pdfjs-annotation是一个强大的工具,扩展了PDF.js库的功能,使用户能够在浏览器中方便地添加、管理和共享PDF文件的注释和标记。无需安装任何额外的软件,用户就可以实现多种注释操作,并与其他人进行协作和共享。 ### 回答3: pdfjs-annotation是一个基于pdf.js开发的一个注释功能库。pdf.js是Mozilla开发的一款基于HTML5技术的开源PDF阅读器,而pdfjs-annotation则是在pdf.js的基础上增加了注释功能。 pdfjs-annotation可以让用户在阅读PDF文件的同时,对文档进行标注和注释。它提供了多种注释工具,比如文本框、高亮、下划线、删除线、批注等。用户可以根据需要选择合适的工具,在文档中添加注释,以便在以后的阅读或共享中更好地理解和交流。 通过pdfjs-annotation,用户可以方便地在PDF文档上划重点、做笔记、提出问题或者标记重要内容。这些注释可以在保存PDF文件时一并保存,也可以单独导出为注释文件或者文字文件,方便共享和查阅。 此外,pdfjs-annotation还具备一些其他功能。例如,它可以实现对注释的编辑、删除和复制等操作,方便用户按需对注释进行管理;它还支持对注释进行搜索和筛选,可以快速定位和浏览注释内容。 总之,pdfjs-annotation是一个功能强大、易于使用的PDF文档注释工具。它为用户提供了丰富的注释工具和便捷的操作方式,帮助用户更好地理解和交流PDF文档的内容。无论是个人阅读还是团队协作,pdfjs-annotation都能提供便利,并提升文档的分析和分享效率。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值