首页 文章 精选 留言 我的

精选列表

搜索[人工审查],共10002篇文章
优秀的个人博客,低调大师

SQLE —— SQL 审查工具

SQLE 是一款支持多场景审核,支持标准化上线流程,原生支持 MySQL 审核且数据库类型可扩展的 SQL 审核工具。 产品特色 支持通过插件的形式扩展可审核上线的数据库类型,无需升级软件,导入审核插件即可获对应数据库类型的审核上线能力,使用平台所有功能; 支持标准的 HTTP API,可与其他内部流程系统对接; 支持 DDL,和 DML 同时审核,并实现同工单内语句上下文关联; 支持在审核规则外对语句做必要的对象验证,防止实际执行时库表不存在等情况。 主要功能 平台管理 支持用户和角色管理; 支持配置上线数据库; 支持基于角色的资源隔离; 支持配置审核规则模板; 支持对不同的数据库应用不同的规则模板。 SQL 审核 支持工单审批流程,支持工单隔离; 支持邮件推送审批事件; 支持 SQL 上线; 支持生成回滚语句; 支持审核 MyBatis XML 文件; 支持审核建议按 SQL 归类去重展示; 支持审核报告下载。 SQL 审核计划 支持通过标准接口收集来自业务的 SQL 统计信息; 提供 MyBatis 文件扫描上传程序(scanner),可集成CI/CD; 支持静态审核,即脱离上线数据库审核; 支持定时审核,既有 SQL 进行生成审核报告。

优秀的个人博客,低调大师

Jenkins集成SonarQube 实现构建项目同时审查代码

软件版本: SonarQube:7.7 Jenkins:2.164.3 一、简介 SonarQube是一个开源的代码质量分析平台,便于管理代码的质量,可检查出项目代码的漏洞和潜在的逻辑问题。同时,它提供了丰富的插件,支持多种语言的检测, 如 Java、Python、Groovy、C#、C、C++等几十种编程语言的检测。 核心价值观: 检查代码是否遵循编程标准:如命名规范,编写的规范等。 检查设计存在的潜在缺陷:SonarQube通过插件Findbugs、Checkstyle等工具检测代码存在的缺陷。 检测代码的重复代码量:SonarQube可以展示项目中存在大量复制粘贴的代码。 检测代码中注释的程度:源码注释过多或者太少都不好,影响程序的可读可理解性。 检测代码中包、类之间的关系:分析类之间的关系是否合理,复杂度情况。 SonarQube主要由4个组件组成: 一个SonarQube服务器启动3个主要流程: Web服务器,供开发人员,管理人员浏览高质量快照并配置SonarQube实例 基于Elasticsearch的Search Server从UI返回搜索 计算引擎服务器负责处理代码分析报告并将其保存在SonarQube数据库中 一个SonarQube数据库存储: SonarQube实例的配置(安全性,插件设置等) 项目,视图等的质量快照 服务器上安装了多个SonarQube插件,可能包括语言,SCM,集成,身份验证和治理插件 在构建/持续集成服务器上运行一个或多个SonarScanner来分析项目 SonarQube工作流程: 二、安装步骤 好了,讲了一堆概念开始进入正题了。 1.安装jenkins 没有安装jenkins的可以参考之前的文章。Linux -- 集成Jenkins 2.安装SonarQube 本文为了方便测试使用Docker安装SonarQube。 运行SonarQube: docker run -d --name sonarqube -p 9000:9000 sonarqube 启动后默认登录账号为admin/admin。 默认情况下,镜像将使用不适合生产的嵌入式H2数据库。如需要设置数据库请参考如下设置。 生产数据库被配置成与作为环境变量以下SonarQube属性:sonar.jdbc.username,sonar.jdbc.password和sonar.jdbc.url。 $ docker run -d --name sonarqube \ -p 9000:9000 \ -e sonar.jdbc.username=sonar \ -e sonar.jdbc.password=sonar \ -e sonar.jdbc.url=jdbc:postgresql://localhost/sonar \ sonarqube 更多高级设置可以参考文档:Docker安装SonarQube 3.启动SonarQube: 安装chiese Pack中文插件,安装完记得点击页面上的Restart重启SonarQube。 然后重要的事情来了,就是配置质量阀。像我们只想针对新提交的代码进行审计,故定制如下质量阀指标: 好了,到此基本配置完了。下面开始集成Jenkins 4.集成Jenkins 因为我们是用Jenkins做为后台的持续扫描调度服务,所以需要安装SonarQube Scanner For Jenkins插件,也就不需要安装其他的扫描器了。 在Jenkins系统设置->配置SonarQube服务器连接详细信息。 构建项目: sonar.projectKey=tembin_loan_test sonar.projectName=tembin_loan_test sonar.projectVersion=1.0 sonar.exclusions=*-ui/** sonar.language=java sonar.java.source=1.8 sonar.sourceEncoding=UTF-8 sonar.sources=$WORKSPACE sonar.java.binaries=$WORKSPACE 打开构建结果的链接来查看SonarQube具体的分析报告。 5.质量阀状态关联构建结果 我们需要在代码分析无法满足SonarQube的质量标准时,就项目构建失败。Jenkins是支持这样的,需要安装插件Sonar Quality Gates Plugin 同时在系统设置->配置Quality Gates - Sonarqube。 然后,在项目工程中需要增加“构建后操作“。 6.邮件通知commiter 项目构建失败时,邮件通知提交代码的人。jenkins默认集成了一个挺好用的邮件插件Extended E-mail Notification。 先进行全局设置,初始配置时建议勾选debug和watch,方便查看邮件是否发送成功。如下图 项目配置邮件插件: 选择右下角高级设置 三、整合阿里Java开发规范(p3c-pmd) sonar-pmd 3.2.0-SNAPSHOT 集成p3c-pmd 1.3.4-pmd6.10.0 编译好的插件地址:sonar-pmd-plugin-3.2.0-SNAPSHOT.jar 提取码:9a4i 把sonar-pmd-plugin-3.2.0-SNAPSHOT.jar 更新到sonarqube服务器上sonarqube-7.7/extensions/plugins/sonar-pmd-plugin-3.2.0-SNAPSHOT.jar 更新后启动sonarqube 四、参考资料 SonarQube官方文档 SonarQube插件下载地址

优秀的个人博客,低调大师

代码审查,异步调用的常见问题剖析

先来看一段代码,就是一小段而已: export function loginWithWx() { wx.showLoading({ title: "登录中..." }); wx.login({ success: res => { wx.request({ url: `${apiRoot}wx/${res.code}`, method: "get", success: res => { const { data } = res; const jwt = app.globalData.jwt = data?.jwt; if (jwt) { wx.reLaunch({ url: "../index/index" }); wx.hideLoading(); } else { showMessage(data.message || "登录时发生错误"); wx.hideLoading(); } }, fail: res => { showMessage("请求超时,请稍后重试"); } }); wx.hideLoading(); }, fail: res => { console.log(res); } }); wx.hideLoading(); } 这段代码乍一看,似乎没毛病。但是稍微思考一下,就能发现问题了。 首先,最直观的问题:缩进太深。缩进最深的地方是 24 个空格,也就是 6 层。一般我们认为 3 层以内的缩进比较容易阅读,超过 3 层应该考虑使用“Extract Method”方法进行重构。 接下来,看外层逻辑: wx.showLoading() wx.login() wx.hideLoading() 这是期望的执行顺序。 注意到 wx.login 是一个异步过程,所以实际上 hideLoading() 并不会等登录过程结束就关闭了加载提示。所以第 2 个问题是忽略了异步执行的顺序。 马上可以想到使用 wx.login() 的 complete 参数来解决: wx.showLoading(); wx.login({ complete: () => wx.hideLoading() }); 不过马上就引出了下一个问题:complete 还是太快! 为什么?我们再把内部的逻辑结构清理出来: wx.login({ success: () => { wx.request({ success: () => { }, fail: () => { } }) }, fail: () => { } }) 注意到 wx.request 仍然是一个异步过程,所以 wx.login 的 success 会立即结束,触发 complete。而这时候 wx.request 可能还在等待服务器响应。 那么是不是应该把 wx.hideLoading() 放到内部逻辑中去?理论上来说,是的! 但实际情况是,内部逻辑分支较多,深次较深,既有同步逻辑,也有异步逻辑……考虑应该放在哪些地方,需要非常的谨慎。实际上,案例中的代码就已经在内部逻辑中放了一些 wx.hideLoading(),只不过 覆盖不全; 因为最外层的 hideLoading() 提前执行,失效了。 违反了规范性约束:成对逻辑应该尽量避免一对多的情况。 解释一下第 3 点,就是说:一个 showLoading() 最好只对应一个 hideLoading()。考虑到逻辑的复杂性,这不是强制约束规则,但应该尽量去避免。 处理的办法是,重构,将内部逻辑拆分出来;然后,将完成事件处理逻辑作为一个参数,一层层的往里传: 显然在当前的技术环境中,这并不是最优方案,还可以继续优化——反正都要封装,干脆封装成 Promise。然后通过 await 调用转换成同步语法,处理起来会轻松得多。封装的具体过程在前两篇文章中有详细的讲解,这里就不赘述了。总之,我们封装了 wx 的异步版本 awx,在这里用就好: export async function asyncLoginWithWx() { wx.showLoading({ title: "登录中..." }); try { return await internalProcess(); } catch (err) { showMessage("请求超时,请稍后重试"); } finally { wx.showLoading(); } // 把内部逻辑用个局部函数封装起来, // 主要是为了让 try ... catch ... 看起来清晰一些 async function internalProcess() { const { code } = await awx.login(); const { data } = awx.request({ url: `${apiRoot}wx/${code}`, method: "get", }); const jwt = app.globalData.jwt = data?.jwt; if (jwt) { wx.reLaunch({ url: "../index/index" }); } else { showMessage(data.message || "登录时发生错误"); } } } 喜欢此文,点个赞 ⇙ 支持作者,赏个咖啡豆 ⇓

资源下载

更多资源
Mario

Mario

马里奥是站在游戏界顶峰的超人气多面角色。马里奥靠吃蘑菇成长,特征是大鼻子、头戴帽子、身穿背带裤,还留着胡子。与他的双胞胎兄弟路易基一起,长年担任任天堂的招牌角色。

Spring

Spring

Spring框架(Spring Framework)是由Rod Johnson于2002年提出的开源Java企业级应用框架,旨在通过使用JavaBean替代传统EJB实现方式降低企业级编程开发的复杂性。该框架基于简单性、可测试性和松耦合性设计理念,提供核心容器、应用上下文、数据访问集成等模块,支持整合Hibernate、Struts等第三方框架,其适用范围不仅限于服务器端开发,绝大多数Java应用均可从中受益。

Rocky Linux

Rocky Linux

Rocky Linux(中文名:洛基)是由Gregory Kurtzer于2020年12月发起的企业级Linux发行版,作为CentOS稳定版停止维护后与RHEL(Red Hat Enterprise Linux)完全兼容的开源替代方案,由社区拥有并管理,支持x86_64、aarch64等架构。其通过重新编译RHEL源代码提供长期稳定性,采用模块化包装和SELinux安全架构,默认包含GNOME桌面环境及XFS文件系统,支持十年生命周期更新。

Sublime Text

Sublime Text

Sublime Text具有漂亮的用户界面和强大的功能,例如代码缩略图,Python的插件,代码段等。还可自定义键绑定,菜单和工具栏。Sublime Text 的主要功能包括:拼写检查,书签,完整的 Python API , Goto 功能,即时项目切换,多选择,多窗口等等。Sublime Text 是一个跨平台的编辑器,同时支持Windows、Linux、Mac OS X等操作系统。

用户登录
用户注册