当前位置: 首页 > news >正文

写一张营销型网站页面多长时间网站建设开发实训报告总结

写一张营销型网站页面多长时间,网站建设开发实训报告总结,网站防护找谁做,app下载安装免费写在最前 如果这个项目让你有所收获#xff0c;记得 Star 关注哦#xff0c;这对我是非常不错的鼓励与支持。 源码地址#xff08;后端#xff09;#xff1a;mingyue: #x1f389; 基于 Spring Boot、Spring Cloud Alibaba 的分布式微服务架构基础服务中心 源…写在最前 如果这个项目让你有所收获记得 Star 关注哦这对我是非常不错的鼓励与支持。 源码地址后端mingyue: 基于 Spring Boot、Spring Cloud Alibaba 的分布式微服务架构基础服务中心 源码地址前端mingyue-ui: 基于 Vue3 TS Vite Element plus 等技术适配 MingYue 后台微服务 文档地址Wiki - Gitee.com 为什么要日志插件 在Java应用程序中记录日志是一种良好的实践它为开发、运维和支持团队提供了很多好处。以下是一些主要的理由 故障排除和调试 日志是定位和解决问题的重要工具。通过在关键代码路径和操作中插入日志语句开发人员可以追踪应用程序的执行流程快速定位潜在的错误和异常。 性能分析 记录关键操作的执行时间、资源使用情况等信息有助于性能分析和优化。通过分析日志可以确定应用程序的瓶颈并改进性能。 安全审计 记录关键的安全事件和用户活动以便进行审计和检测潜在的安全威胁。登录失败、访问敏感信息等事件的记录对于安全监控至关重要。 系统状态监控 通过记录系统状态和关键指标可以实时监控应用程序的运行状况。这有助于及时发现和解决潜在的问题以提高系统的稳定性和可用性。 版本追踪和审计 在代码中记录版本信息、变更历史和代码提交信息有助于追踪应用程序的演变过程。审计日志还可以用于追溯特定功能或问题的起源。 用户行为分析 对于包含用户交互的应用程序记录用户活动可以帮助了解他们的使用模式、偏好和行为。这对于改进用户体验和调整产品设计非常有帮助。 合规性和法规要求 许多行业和法规要求记录关键事件和操作以确保企业的合规性。通过日志记录可以满足这些法规的要求并提供审计证据。 持久化数据 将日志存储在持久化介质中例如文件或数据库以便在应用程序重新启动后仍然可以访问日志。这有助于在系统故障或应用程序崩溃时还原状态并进行故障排除。 日志设计 日志类型 系统操作日志和用户登录日志是两种不同类型的日志它们记录了系统中不同方面的活动 系统操作日志记录系统的各种操作包括但不限于增删改查、上传与下载文件等。 用户登录日志记录用户登录和注销的信息。 记录方式 系统操作日志采用注解非侵入方式记录 用户登录日志采用显式侵入方式记录 日志插件 添加 mingyue-common-log 插件 dependenciesdependencygroupIdcom.csp.mingyue/groupIdartifactIdmingyue-common-security/artifactId/dependency /dependencies Log 注解 Target({ ElementType.PARAMETER, ElementType.METHOD }) Retention(RetentionPolicy.RUNTIME) Documented public interface Log { ​/*** 模块*/String module() default ; ​/*** 功能*/BusinessType businessType() default BusinessType.OTHER; ​/*** 操作人类别*/OperatorUserType operatorUserType() default OperatorUserType.MANAGE; ​/*** 是否保存请求的参数*/boolean isSaveRequestData() default true; ​/*** 是否保存响应的参数*/boolean isSaveResponseData() default true; ​/*** 排除指定的请求参数*/String[] excludeParamNames() default {}; ​ } Log 切面 操作日志记录核心类 Slf4j Aspect RequiredArgsConstructor AutoConfiguration public class LogAspect { ​private final ServiceInstance serviceInstance; ​/*** 排除敏感属性字段*/public static final String[] EXCLUDE_PROPERTIES { password, oldPassword, newPassword, confirmPassword }; ​/*** 处理完请求后执行* param joinPoint 切点*/AfterReturning(pointcut annotation(controllerLog), returning jsonResult)public void doAfterReturning(JoinPoint joinPoint, Log controllerLog, Object jsonResult) {handleLog(joinPoint, controllerLog, null, jsonResult);} ​/*** 拦截异常操作* param joinPoint 切点* param e 异常*/AfterThrowing(value annotation(controllerLog), throwing e)public void doAfterThrowing(JoinPoint joinPoint, Log controllerLog, Exception e) {handleLog(joinPoint, controllerLog, e, null);} ​protected void handleLog(final JoinPoint joinPoint, Log controllerLog, final Exception e, Object jsonResult) {// 日志记录开始时间Long startTime System.currentTimeMillis(); ​// 数据库日志OperateLogEvent operateLog new OperateLogEvent(); ​try {// 请求信息String ip ServletUtils.getClientIP();operateLog.setReqIp(ip);operateLog.setServiceId(serviceInstance.getServiceId());operateLog.setReqAddress(AddressUtils.getRealAddressByIP(ip));operateLog.setReqUrl(StrUtil.sub(Objects.requireNonNull(ServletUtils.getRequest()).getRequestURI(), 0, 255)); ​operateLog.setStatus(BusinessStatus.SUCCESS.ordinal()); ​// 用户信息LoginUser loginUser LoginHelper.getLoginUser();operateLog.setUserId(loginUser.getUserId());operateLog.setUserName(loginUser.getUsername()); ​if (e ! null) {operateLog.setStatus(BusinessStatus.FAIL.ordinal());operateLog.setException(StrUtil.sub(e.getMessage(), 0, 2000));} ​// 设置方法名称String className joinPoint.getTarget().getClass().getName();String methodName joinPoint.getSignature().getName();operateLog.setMethod(className . methodName ()); ​// 设置User-AgentoperateLog.setUserAgent(ServletUtils.getRequest().getHeader(HttpHeaders.USER_AGENT));// 设置请求方式operateLog.setReqMethod(ServletUtils.getRequest().getMethod());// 处理设置注解上的参数getControllerMethodDescription(joinPoint, controllerLog, operateLog, jsonResult);}catch (Exception exp) {// 记录本地异常日志log.error(异常信息:{}, exp.getMessage());}finally {Long endTime System.currentTimeMillis();operateLog.setDuration(endTime - startTime);// 发布事件保存数据库SpringUtils.context().publishEvent(operateLog);}} ​/*** 获取注解中对方法的描述信息 用于Controller层注解* param log 日志* param operateLog 操作日志*/public void getControllerMethodDescription(JoinPoint joinPoint, Log log, OperateLogEvent operateLog,Object jsonResult) throws Exception {// 设置标题operateLog.setModule(log.module());// 设置 action 动作operateLog.setBusinessType(log.businessType().ordinal());// 设置操作人类别operateLog.setUserType(log.operatorUserType().ordinal());// 是否需要保存 request参数和值if (log.isSaveRequestData()) {// 获取参数的信息传入到数据库中。setRequestValue(joinPoint, operateLog, log.excludeParamNames());}// 是否需要保存 response参数和值if (log.isSaveResponseData() ObjectUtil.isNotNull(jsonResult)) {R resp JSONUtil.toBean(JSONUtil.toJsonStr(jsonResult), R.class);operateLog.setRespMsg(resp.getMsg());operateLog.setRespCode(resp.getCode());operateLog.setRespResult(StrUtil.sub(JSONUtil.toJsonStr(jsonResult), 0, 2000));}} ​/*** 获取请求的参数放到log中* param operLog 操作日志* throws Exception 异常*/private void setRequestValue(JoinPoint joinPoint, OperateLogEvent operLog, String[] excludeParamNames)throws Exception {MapString, String paramsMap ServletUtils.getParamMap(ServletUtils.getRequest());String requestMethod operLog.getReqMethod();if (MapUtil.isEmpty(paramsMap) HttpMethod.PUT.name().equals(requestMethod)|| HttpMethod.POST.name().equals(requestMethod)) {String params argsArrayToString(joinPoint.getArgs(), excludeParamNames);operLog.setReqParams(StrUtil.sub(params, 0, 2000));}else {MapUtil.removeAny(paramsMap, EXCLUDE_PROPERTIES);MapUtil.removeAny(paramsMap, excludeParamNames);operLog.setReqParams(StrUtil.sub(JSONUtil.toJsonStr(paramsMap), 0, 2000));}} ​/*** 参数拼装*/private String argsArrayToString(Object[] paramsArray, String[] excludeParamNames) {StringJoiner params new StringJoiner( );if (ArrayUtil.isEmpty(paramsArray)) {return params.toString();}for (Object o : paramsArray) {if (ObjectUtil.isNotNull(o) !isFilterObject(o)) {String str JSONUtil.toJsonStr(o);Dict dict JsonUtils.parseMap(str);if (MapUtil.isNotEmpty(dict)) {MapUtil.removeAny(dict, EXCLUDE_PROPERTIES);MapUtil.removeAny(dict, excludeParamNames);str JSONUtil.toJsonStr(dict);}params.add(str);}}return params.toString();} ​/*** 判断是否需要过滤的对象。* 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.values()) {return value instanceof MultipartFile;}}return o instanceof MultipartFile || o instanceof HttpServletRequest || o instanceof HttpServletResponse|| o instanceof BindingResult;} ​ } 异步调用日志服务 Slf4j Component RequiredArgsConstructor public class LogEventListener { ​private final RemoteLogService remoteLogService; ​/*** 保存系统日志记录*/AsyncEventListenerpublic void saveLog(OperateLogEvent operateLog) {log.info(保存系统日志记录落库「{}」, JSONUtil.toJsonStr(operateLog));remoteLogService.saveSysOperateLog(BeanUtil.copyProperties(operateLog, SysOperateLog.class));} ​ } 自动注入日志类 org.springframework.boot.autoconfigure.AutoConfiguration.imports com.csp.mingyue.common.log.event.LogEventListener com.csp.mingyue.common.log.aspect.LogAspect 系统操作日志表设计 DROP TABLE IF EXISTS sys_operate_log; CREATE TABLE sys_operate_log (operate_log_id    BIGINT(20)         NOT NULL                 COMMENT 操作日志ID,module            VARCHAR(50)        DEFAULT               COMMENT 模块,business_type     INT(2)             DEFAULT 0                COMMENT 业务类型0其它 1新增 2修改 3删除,method            VARCHAR(100)       DEFAULT               COMMENT 方法名称,service_id        VARCHAR(32)        DEFAULT NULL             COMMENT 服务ID,user_id           BIGINT(20)         NOT NULL                 COMMENT 用户ID,user_name         VARCHAR(50)        NOT NULL                 COMMENT 用户账号,user_type         TINYINT(1)         DEFAULT 0                COMMENT 用户类型0其它 1系统用户,user_agent        VARCHAR(1000)      DEFAULT NULL             COMMENT 用户代理,req_ip            VARCHAR(128)       DEFAULT               COMMENT 请求IP,req_address       VARCHAR(255)       DEFAULT               COMMENT 请求地点,req_url           VARCHAR(255)       DEFAULT               COMMENT 请求URL,req_method        VARCHAR(20)        DEFAULT NULL             COMMENT 请求方式,req_params        TEXT               DEFAULT NULL             COMMENT 请求参数,duration          BIGINT             NOT NULL                 COMMENT 执行时长单位ms,resp_code         INT                DEFAULT NULL             COMMENT 结果码,resp_msg          VARCHAR(512)       NULL DEFAULT          COMMENT 结果提示,resp_result       VARCHAR(2000)      DEFAULT               COMMENT 返回参数,status            CHAR(1)            DEFAULT 0                COMMENT 操作状态0正常 1异常,exception         TEXT               DEFAULT NULL             COMMENT 异常信息,operate_time      DATETIME           NOT NULL                 COMMENT 操作时间,is_deleted        CHAR(1)            DEFAULT 0              COMMENT 删除标志0正常1删除,create_by         VARCHAR(64)        DEFAULT               COMMENT 创建者,create_time       DATETIME           DEFAULT NULL             COMMENT 创建时间,update_by         VARCHAR(64)        DEFAULT               COMMENT 更新者,update_time       DATETIME           DEFAULT NULL             COMMENT 更新时间,PRIMARY KEY (operate_log_id) ) ENGINEInnoDB DEFAULT CHARSETutf8mb4 COLLATEutf8mb4_bin ROW_FORMATDYNAMIC COMMENT系统操作日志; 测试日志注解 使用注解 Log(module 用户管理, businessType BusinessType.DELETE) DeleteMapping({userId}) Log(module 用户管理, businessType BusinessType.DELETE) Operation(summary 删除用户, parameters { Parameter(name userId, description 用户ID, required true) }) public RBoolean delUser(PathVariable Long userId) {return R.ok(sysUserService.delUser(userId)); } 调用接口 调用完成后查看数据库是否存在该操作记录即可 curl -X DELETE   http://192.168.63.114:7100/system/sysUser/111111111   -H accept: */*   -H Authorization: UWapduuggQcNSqg1oQZ17ZyfPHDxxt8Q
http://www.dnsts.com.cn/news/207477.html

相关文章:

  • 河南省城市建设网站ftp服务器软件
  • 外包做网站山西建设厅八大员查询网站
  • 7天精通网站建设实录建个微商城网站
  • 万先生网站中英语网站制作方法
  • 做网站如何挑选服务器陕西省建设工程招投标信息网官网
  • 平度市建设局网站漯河网络推广哪家好
  • 个人做网站法律风险不断加强门户网站建设
  • 中国建设电工立网站建设网站的技术性背景
  • 网站开发成本都有哪几项建个企业网站对公司宣传有用吗
  • 有做外贸个人网站深圳app开发公司有哪些
  • 做网站用的图片分辨率网站开发php程序员
  • 怎样做能直接上传微信的视频网站公司名称起名大全
  • 建设企业网站方法网站设计 电子购物网站设计
  • 网站描述模板产品开发流程图模板
  • 网站建设与推广综合实训总结做外贸网站用哪些小语种
  • 免费做婚礼邀请函的网站北京网页设计公司有哪些
  • 如何用c语言做网站国家建筑网官网
  • php网站在线打包源码食品网站建设策划书
  • 网站建设的书籍wep购物网站开发模板
  • 建设部高级职称查询官方网站dedecms的网站如何添加个引导页
  • 视频网站发展好应该怎么做o2o的代表平台有哪些
  • 怎样优化排名自己网站在线培训系统软件
  • 网站 安全 维护wordpress 扫码阅读
  • 建设厅官方网站新资质标准建设厅注册中心网站
  • 建个注册页面网站WordPress如何添加备案
  • 做深圳门户网站起什么名字好品牌宣传策划公司
  • 做公司+网站建设价格音乐网站开发文档撰写模板
  • 17网站一起做网店好不好泰安招聘齐鲁人才网
  • 网站续费合同书成都网站建设零一
  • 大良营销网站建设好么wordpress副标题调用函数