在哪个网站做淘宝水印网站建设服务费税率多少钱

pingmian/2025/10/9 2:39:26/文章来源:
在哪个网站做淘宝水印,网站建设服务费税率多少钱,威海建设集团网站,兰州网站建设公司排名在实现自定义日志之前#xff0c;我们需要了解AOP。 1.AOP AOP#xff08;Aspect-Oriented Programming#xff0c;面向切面编程#xff09;是一种编程范式#xff0c;旨在通过将横切关注点#xff08;cross-cutting concerns#xff09;从主要业务逻辑中分离出来我们需要了解AOP。 1.AOP AOPAspect-Oriented Programming面向切面编程是一种编程范式旨在通过将横切关注点cross-cutting concerns从主要业务逻辑中分离出来使得代码更模块化、更易于维护。横切关注点指的是那些存在于应用程序中多个模块中、并且对整个应用程序产生影响的功能比如日志记录、事务管理、安全性等。 AOP的核心概念包括切面Aspect 切面是一组横切关注点的模块化单元它定义了在何处切点、何时通知以及如何执行横切关注点。连接点Join Point 连接点是在应用程序执行过程中能够应用切面的点比如方法调用、异常处理等。切点Pointcut 切点是一组连接点的集合用于定义在何处应用切面。通常切点通过表达式或者正则表达式定义。通知Advice 通知是切面在连接点上执行的动作它定义了在连接点的何时执行什么操作比如在方法执行前后、抛出异常时执行的操作。引入Introduction 引入允许我们向现有的类添加新的方法或属性而不需要修改它们的源代码。目标对象Target Object 目标对象是一个应用程序类它可能包含切点也可能不包含。织入Weaving 织入是将切面应用到目标对象并创建新的代理对象的过程。织入可以在编译时、类加载时、运行时进行。AOP主要用于解决横切关注点的问题这些关注点通常涉及多个模块并且难以在代码中统一管理。通过使用AOP可以使得这些关注点更加集中和可维护提高了代码的可读性和可维护性。常见的AOP框架包括Spring AOP、AspectJ等。 2.实现 ** 第一步需要在pom.xml文件中引入AOP 的依赖 ** dependencygroupIdorg.springframework.boot/groupIdartifactIdspring-boot-starter-aop/artifactId/dependency第二步自定义日志注解 Target({ElementType.PARAMETER, ElementType.METHOD}) Retention(RetentionPolicy.RUNTIME) Documented public interface Log {/*** 模块*/public String title() default ;/*** 功能*/public BusinessType businessType() default BusinessType.OTHER;/*** 操作人类别*/public OperatorType operatorType() default OperatorType.MANAGE;/*** 是否保存请求的参数*/public boolean isSaveRequestData() default true;/*** 是否保存响应的参数*/public boolean isSaveResponseData() default true; }解释一下这里的注解的意思没记错的话应该是java8新特性也可能记错了里的东西想深入了解的可以去看看。 Target 用于指定注解的作用范围即注解可以被应用在哪些元素上。 在提供的例子中Target({ElementType.PARAMETER, ElementType.METHOD}) 表示这个注解可以应用在方法的参数和方法上。 Retention 用于指定注解的保留策略即注解在何时生效。 RetentionPolicy.RUNTIME 表示注解会在运行时保留因此可以通过反射机制来获取注解信息。 Documented 用于指定注解是否应该被 javadoc 工具记录。 如果一个注解被 Documented 标记那么它会被 javadoc 工具提取并文档化这使得该注解的信息可以包含在生成的文档中。 这三个元注解的使用通常是一起的它们提供了对注解的定义、应用范围和保留策略的灵活控制。在提供的例子中这个注解的含义是可以应用在方法参数和方法上在运行时保留并且会被 javadoc 工具文档化。 第三步构建你的操作类型或者操作人使用枚举 * 业务操作类型**/ public enum BusinessType {/*** 其它*/OTHER,/*** 新增*/INSERT,/*** 修改*/UPDATE,/*** 删除*/DELETE,/*** 授权*/ASSGIN,/*** 导出*/EXPORT,/*** 导入*/IMPORT,/*** 强退*/FORCE,/*** 更新状态*/STATUS,/*** 清空数据*/CLEAN,/*** 批量删除*/BATCHDELETE, }* 操作人类别**/ public enum OperatorType {/*** 其它*/OTHER,/*** 后台用户*/MANAGE,/*** 手机端用户*/MOBILE } 第四步 在这里我们要建立业务层用来将生产日志保存在数据库中 public interface AsyncOperLogService {public void savaOperLog(BhOperLog bhOperLog); }通过实现类完成具体插入代码这里使用mybatisplus不了解的可以看我之前的笔记MyBatisPlus Overridepublic void savaOperLog(BhOperLog bhOperLog) {bhOperLogMapper.insert(bhOperLog);}下面是具体的实体类 Data ApiModel(description 系统操作日志) TableName(你的表名称) public class OperLog extends BaseEntity {private static final long serialVersionUID 1L;ApiModelProperty(value id)private long id;ApiModelProperty(value 模块标题)TableField(title)private String title;ApiModelProperty(value 业务类型0其它 1新增 2修改 3删除)TableField(business_type)private String businessType;ApiModelProperty(value 方法名称)TableField(method)private String method;ApiModelProperty(value 请求方式)TableField(request_method)private String requestMethod;ApiModelProperty(value 操作类别0其它 1后台用户 2手机端用户)TableField(operator_type)private String operatorType;ApiModelProperty(value 操作人员)TableField(oper_name)private String operName;ApiModelProperty(value 部门名称)TableField(dept_name)private String deptName;ApiModelProperty(value 请求URL)TableField(oper_url)private String operUrl;ApiModelProperty(value 主机地址)TableField(oper_ip)private String operIp;ApiModelProperty(value 请求参数)TableField(oper_param)private String operParam;ApiModelProperty(value 返回参数)TableField(json_result)private String jsonResult;ApiModelProperty(value 操作状态0正常 1异常)TableField(status)private Integer status;ApiModelProperty(value 错误消息)TableField(error_msg)private String errorMsg;ApiModelProperty(value 操作时间)TableField(oper_time)private Date operTime; } 第五步完成具体的日志配置开发 下面是完整代码 * 操作日志记录处理**/ Aspect Component public class LogAspect {ResourceAsyncOperLogService asyncOperLogService;/*** 处理完请求后执行** param joinPoint 切点*/AfterReturning(pointcut annotation(controllerLog),returning jsonResult)public void doAfterReturnin(JoinPoint joinPoint, Log controllerLog, Object jsonResult){handleLog(joinPoint, controllerLog,null, jsonResult);}protected void handleLog(final JoinPoint joinPoint, Log controllerLog, final Exception e, Object jsonResult) {try {RequestAttributes ra RequestContextHolder.getRequestAttributes();ServletRequestAttributes sra (ServletRequestAttributes) ra;HttpServletRequest request sra.getRequest();// *数据库日志*//BhOperLog operLog new BhOperLog();operLog.setStatus(1);// 请求的地址 IpUtil.getIpAddr(ServletUtils.getRequest());String ip IpUtil.getIpAddress(request);operLog.setOperIp(ip);operLog.setOperUrl(request.getRequestURI());String token request.getHeader(token);String userName JwtUtils.getUsername(token);operLog.setOperName(userName);if (e ! null) {operLog.setStatus(0);operLog.setErrorMsg(e.getMessage());}// 设置方法名称String className joinPoint.getTarget().getClass().getName();String methodName joinPoint.getSignature().getName();operLog.setMethod(className . methodName ());// 设置请求方式operLog.setRequestMethod(request.getMethod());// 处理设置注解上的参数getControllerMethodDescription(joinPoint, controllerLog, operLog, jsonResult);// 保存数据库asyncOperLogService.savaOperLog(operLog);} catch (Exception exp) {// 记录本地异常日志 // log.error(前置通知异常); // log.error(异常信息:{}, exp.getMessage());exp.printStackTrace();}}/*** 获取注解中对方法的描述信息 用于Controller层注解** param log 日志* param operLog 操作日志* throws Exception*/public void getControllerMethodDescription(JoinPoint joinPoint, Log log, BhOperLog operLog, Object jsonResult) throws Exception {// 设置action动作operLog.setBusinessType(log.businessType().name());// 设置标题operLog.setTitle(log.title());// 设置操作人类别operLog.setOperatorType(log.operatorType().name());// 是否需要保存request参数和值if (log.isSaveRequestData()) {// 获取参数的信息传入到数据库中。setRequestValue(joinPoint, operLog);}// 是否需要保存response参数和值if (log.isSaveResponseData() !StringUtils.isEmpty(jsonResult)) {operLog.setJsonResult(JacksonUtils.obj2String(jsonResult));}}/*** 获取请求的参数放到log中** param operLog 操作日志* throws Exception 异常*/private void setRequestValue(JoinPoint joinPoint, BhOperLog operLog) throws Exception {String requestMethod operLog.getRequestMethod();if (HttpMethod.PUT.name().equals(requestMethod) || HttpMethod.POST.name().equals(requestMethod)) {String params argsArrayToString(joinPoint.getArgs());operLog.setOperParam(params);}}/*** 参数拼装*/private String argsArrayToString(Object[] paramsArray) {String params ;if (paramsArray ! null paramsArray.length 0) {for (Object o : paramsArray) {if (!StringUtils.isEmpty(o) !isFilterObject(o)) {try {String jsonObj JacksonUtils.obj2String(o);params jsonObj ;} catch (Exception e) {}}}}return params.trim();}/*** 判断是否需要过滤的对象。** param o 对象信息。* return 如果是需要过滤的对象则返回true否则返回false。*/SuppressWarnings(rawtypes)public boolean isFilterObject(final Object o) {Class? clazz o.getClass();if (clazz.isArray()) {return clazz.getComponentType().isAssignableFrom(MultipartFile.class);} else if (Collection.class.isAssignableFrom(clazz)) {Collection collection (Collection) o;for (Object value : collection) {return value instanceof MultipartFile;}} else if (Map.class.isAssignableFrom(clazz)) {Map map (Map) o;for (Object value : map.entrySet()) {Map.Entry entry (Map.Entry) value;return entry.getValue() instanceof MultipartFile;}}return o instanceof MultipartFile || o instanceof HttpServletRequest || o instanceof HttpServletResponse|| o instanceof BindingResult;}} 那么如何使用呢 只需要在你需要的Controller中加入 这个注解就可以了 Log(title 菜单管理, businessType BusinessType.STATUS) 其中title根据具体模块书写businessType就是你自定义的操作类型 这样就完成了自定义日志的开发也可以将这些代码通过自定义start进行打包加入Maven中进行使用。

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

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

相关文章

哈尔滨优化网站方法陕西一建2022停考

文章目录1. 题目2. 解题2.1 单调栈2.2 哈希1. 题目 给你一份工作时间表 hours,上面记录着某一位员工每天的工作小时数。 我们认为当员工一天中的工作小时数大于 8 小时的时候,那么这一天就是「劳累的一天」。 所谓「表现良好的时间段」,意…

常用网站开发软件6杭州网站建设外包

AI时代系列丛书 AI时代程序员开发之道✨内容简介参与方式 AI时代项目经理成长之道✨内容简介参与方式 AI时代架构师修炼之道✨内容简介参与方式 AI时代产品经理升级之道✨内容简介参与方式 AI时代Python量化交易实战✨内容简介参与方式 AI时代程序员开发之道✨ 内容简介 本书是…

《网站建设与管理》方案天津餐饮网站建设

腾讯云我的世界mc服务器多少钱?95元一年2核2G3M轻量应用服务器、2核4G5M带宽优惠价218元一年、4核8G12M带宽轻量服务器446元一年,云服务器CVM标准型S5实例2核2G优惠价280元一年、2核4G配置服务器748元一年,腾讯云百科txybk.com分享腾讯云我的…

那些做seo的网站公司网站制作高端

什么是建造者模式? 传说女娲是用泥巴捏出人来的,当时捏出的小泥人虽然每个都是两条腿、两只手、一个脑袋的样子,但是具体到每个部位,却有有所不同:有的小泥人手长一点,有的手短一点;有的脑袋圆…

谈谈网站的开发流程网站建设著作权

在当今信息化时代,即时通讯软件成为了大家的生活中不可或缺的一部分。除了大家熟知的微信、QQ等常见的公共社交软件之外,企业内部也需要一款私有化部署的即时通讯软件来提高团队协作效率以及保护数据安全。但是,如何选择一款适合自己企业的私…

seo 网站关键词优化交互网站怎么做的

#!/usr/local/bin/python3# -*- coding:utf-8 -*-#----------函数位置参数和关键字参数----------def test(x,y): #此处的 x,y为形参print(x)print(y)test(1,2) #位置参数调用-此处的 1,2为实参,且与形参一一对应test(y2,x1) #关键字调用&…

宁波网站开发制作深圳保障性租赁住房

第一题 1. 指针变量p进行自加运算(即 执行p;)后,地址偏移值为1,则其数据类型为,char说法是否正确? A:正确 B:错误 答案及解析 B 比如我们的空类,空类所占的字节为1,指向空类的指针,自加运算之后…

自己建立网站后怎么做淘客最近时事新闻热点

一、简介 iSCSI(internet SCSI)技术由IBM公司研究开发,是一个供硬件设备使用的、可以在IP协议的上层运行的SCSI指令集,这种指令集合可以实现在IP网络上运行SCSI协议,使其能够在诸如高速千兆以太网上进行路由选择。iSCS…

旅游公司网站建设wordpress 家园

文章目录 透传属性如何禁止“透传属性和事件”多根节点设置透传访问“透传属性和事件” $props、$attrs和$listeners的使用详解 透传属性 透传属性和事件并没有在子组件中用props和emits声明透传属性和事件最常见的如click和class、id、style当子组件只有一个根元素时&#xf…

北京网络公司建站开网站要多少钱

我这里是根据次数进行倒叙,可根据自己情况进行修改 function sortKey(array,key){return array.sort(function(a,b){var x a[key];var y b[key];return ((x>y)?-1:(x<y)?1:0)}) }; 转载于:https://www.cnblogs.com/wangyang0210/p/10185494.html

宝丰县建设局网站wordpress文章在哪个文件夹

pandas简介&#xff1a;pandas包含的数据结构和数据处理工具的设计使得利用进行数据清洗和数据分析非常快捷&#xff1b;与numpy的区别&#xff0c;pandas用来处理表格型或异质型数据的&#xff0c;而numpy更适合处理同质型的数值类数据。 1、Series简介 1、Series是一种一维的…

公司网站建设重点内容宁波网站建设公司费用价格

先要了解一下C语言里全部的位运算都是指二进制数的位运算。即使输入的是十进制的数&#xff0c;在内存中也是存储为二进制形式。 “<<”使用方法&#xff1a; 格式是&#xff1a;a<<m&#xff0c;a和m必须是整型表达式&#xff0c;要求m>0。 功能&#xff1a…

网站建设基础书籍更新标签wordpress

一、参考资料 【2023 CANN训练营第一季】Ascend C算子开发入门&#xff08;中&#xff09; 二、重要说明 TIK2编程范式把算子核内的处理程序&#xff0c;分成多个流水任务&#xff0c;任务之间通过队列&#xff08;Queue&#xff09;进行通信和同步&#xff0c;并通过统一的…

杭州高端定制网站wordpress 同步微博

Every day a Leetcode 题目来源&#xff1a;1423. 可获得的最大点数 解法1&#xff1a;前缀和 后缀和 基于贪心的思想&#xff0c;要使得获得的点数最大&#xff0c;每次拿卡牌都应该选点数尽量高的卡牌。 但是拿卡牌有限制&#xff0c;每次行动&#xff0c;只可以从行的…

建设网站的报告深圳网站建设q双赢世讯

P01S01 变量与字符串 变量变量的命名规则 字符串字符串的表达方法字符串的基本操作 数整数与浮点数数中下划线常量 注释 变量 变量的命名规则 变量名只能包含字母、数字和下划线&#xff1b; 变量名能以字母或下划线开头&#xff0c;但是不能以数字开头&#xff1b; 变量名不能…

长沙建站福建省住房城乡和城乡建设厅网站

当我们在程序里需要做遮罩效果时&#xff0c;可以PorterDuffXfermode类实现。 例如有一副图片&#xff0c;需要使用一个图形&#xff08;一般是可以使用Canvas画出来的图形&#xff09;&#xff0c;图形覆盖到的地方在图片上才显示出来&#xff0c;可以使用PorterDuff.Mode.SR…

做个简单的企业小网站常州网络科技推广公司

项目地址&#xff1a;https://github.com/liuhuanyong/LanguageResources 致力于利用web公开信息,采用爬虫脚本,加工处理形成语言资源包括词汇知识库,领域语料等语言资源,该资源可用于自然语言处理任务. 1、 corpus_resources.py:词库&#xff0c;包括&#xff1a; name:人民日…

一般多少钱做一个网站淘宝客不建网站怎样做

【实例简介】Android超声波通信例子,手机之间,手机与超声波设备间的超声波通信【实例截图】【核心代码】ComAir5Demo_V1.0.3└── ComAir5Demo_V1.0.3├── AndroidManifest.xml├── ComAir5Demo_ReleaseNote.txt├── libs│ ├── android-support-v4.jar│ └──…

建设系统网站全名django 网站开发实例

文章目录 前言一、基于口令的认证&#xff08;用户名密码&#xff09;二、基于公钥的认证&#xff08;免密登录&#xff09;三、禁止用户登录和修改端口四、免密登录具体操作 前言 非对称加密是在认证用户连接的时候使用的&#xff0c;对称加密是在用户连接之后开始传输数据的…

ps做游戏下载网站北京网站制作17页

C11引入了范围for循环&#xff0c;它是一种更简洁和易用的循环语法&#xff0c;用于遍历数组、容器类&#xff08;例如 std::vector、std::list 等&#xff09;或支持迭代器的类型。 范围for循环遍历数组的示例 int arr[] {1, 2, 3, 4, 5};for (int num : arr) {std::cout &…