五、安全规约强制部分1、可被用户直接访问的功能必须进行权限控制校验。
说明:防止没有做权限控制就可随意访问、操作别人的数据,比如查看、修改别人的订单。
2、用户敏感数据禁止直接展示,必须对展示数据脱敏。
说明:支付宝中查看个人手机号码会显示成:158****9119,隐藏中间4位,防止隐私泄露。
3、用户输入的SQL参数严格使用参数绑定或者METADATA字段值限定,防止SQL注入,禁止字符串拼接SQL访问数据库。
✨4、用户请求传入的任何参数必须做有效性验证。
说明:忽略参数校验可能导致:
page size 过大导致内存溢出
恶意order by导致数据库慢查询
正则输入源串拒绝服务ReDOS
任意重定向
SQL注入
Shell注入
反序列化注入
5、禁止向HTML页面输出未经安全过滤或未正确转义的用户数据。
6、表单、AJAX提交必须执行CSRF安全过滤。
说明:CSRF(Cross-site request forgery)跨站请求伪造是一类常见编程漏洞。对于存在CSRF 漏洞的应用/网站,攻击者可以事先构造好URL, ...
四、工程规约1、应用分层推荐部分1、图中默认上层依赖于下层,箭头关系表示可直接依赖,如:开放接口层可以依赖于 Web 层,也可以直接依赖于Service层,依此类推:
开放接口层:可直接封装Service接口暴露成RPC接口;通过Web封装成http接口;网关控制层等。
终端显示层:各个端的模板渲染并执行显示层。当前主要是velocity渲染,JS渲染,JSP渲 染,移动端展示层等。
Web层:主要是对访问控制进行转发,各类基本参数校验,或者不复用的业务简单处理等。
Service 层:相对具体的业务逻辑服务层。
Manager 层:通用业务处理层,它有如下特征:
1) 对第三方平台封装的层,预处理返回结果及转化异常信息;
2) 对Service层通用能力的下沉,如缓存方案、中间件通用处理;
3) 与DAO层交互,对DAO的业务通用能力的封装。
DAO层:数据访问层,与底层Mysql、Oracle、Hbase、OB进行数据交互。
外部接口或第三方平台:包括其它部门RPC开放接口,基础平台,其它公司的HTTP接口。
参考部分1、( ...
三、MYSQL规约1、建表规约强制部分1、表达是与否概念的字段,必须使用is_xxx的方式命名,数据类型是unsigned tinyint ( 1表示是,0表示否),此规则同样适用于odps建表。
说明:任何字段如果为非负数,必须是unsigned。
✨2、表名、字段名必须使用小写字母或数字;禁止出现数字开头,禁止两个下划线中间只出现数字。数据库字段名的修改代价很大,因为无法进行预发布,所以字段名称需要慎重考虑。
正例:getter_admin,task_config,level3_name
反例:GetterAdmin,taskConfig,level_3_name
3、表名不使用复数名词。
说明:表名应该仅仅表示表里面的实体内容,不应该表示实体数量,对应于DO类名也是单数 形式,符合表达习惯。
4、禁用保留字,如desc、range、match、delayed等,参考官方保留字。
5、唯一索引名为uk_字段名;普通索引名则为idx_字段名。 说明:uk_ 即 unique key;idx_ 即index 的简称。
✨6、小数类型为decimal,禁止使 ...
二、异常日志1、异常处理强制部分1、不要捕获Java类库中定义的继承自RuntimeException的运行时异常类,如: IndexOutOfBoundsException / NullPointerException,这类异常由程序员预检查来规避,保证程序健壮性。
正例:if(obj != null) {…}
反例:try { obj.method() } catch(NullPointerException e){…}
2、异常不要用来做流程控制,条件控制,因为异常的处理效率比条件分支低。
3、对大段代码进行try-catch,这是不负责任的表现。catch时请分清稳定代码和非稳 定代码,稳定代码指的是无论如何不会出错的代码。对于非稳定代码的catch尽可能进行区分异常类型,再做对应的异常处理。
4、捕获异常是为了处理它,不要捕获了却什么都不处理而抛弃之,如果不想处理它,请将该异常抛给它的调用者。最外层的业务使用者,必须处理异常,将其转化为用户可以理解的内容。
5、有try块放到了事务代码中,catch异常后,如果需要回滚事务,一定要注意手动回 ...
一、编程规约1、命名规约强制部分1、所有编程相关命名均不能以下划线或美元符号开始,也不能以下划线或美元符号结束。
2、所有编程相关的命名严禁使用拼音与英文混合的方式,更不允许直接使用中文的方式。
3、类名使用UpperCamelCase风格,必须遵从驼峰形式,但以下情形例外:(领域模型的相关命名)DO / DTO / VO / DAO 等。
4、方法名、参数名、成员变量、局部变量都统一使用lowerCamelCase风格,必须遵从驼峰形式。
5、常量命名全部大写,单词间用下划线隔开,力求语义表达完整清楚,不要嫌名字长。
6、抽象类命名使用Abstract或Base开头;异常类命名使用Exception结尾;测试类命名以它要测试的类的名称开始,以Test结尾。
7、中括号是数组类型的一部分,数组定义如下:String[] args;
8、POJO类中的任何布尔类型的变量,都不要加is,否则部分框架解析会引起序列化错误。
反例:定义为基本数据类型boolean isSuccess;的属性,它的方法也是isSuccess(),RPC 框架在反向解析的时候 ...
1、表单收集信息的统计前端:编写analysis.vue文件展示统计信息
核心方法:
1、跳转到新页面查看提交者的的填写信息
1234567viewAnswer(data){ getTemplate(data.formId).then(response=>{ localStorage.setItem("formCode",response.data.content); localStorage.setItem("formVal",data.formData); window.open('/tool/formDesigner/view'); }) },
2、获取当前调查统计的信息(可优化当前获取了完整信息,当调查人数较多时不适用),并获取统计分析结果
1234567891011getData(formId) { this.loading = true; queryByFormIdFor ...
1、修改formDesigner源码实现模板保存按钮功能(供参考)前端:1、按钮与调用的方法(ruoyi-ui/src/components/formDesigner/designer.vue)
1<el-button icon="el-icon-add" type="text" @click="saveHandle">保存</el-button>
1234567891011121314saveHandle() { let form = {}; form.formName = this.formConf.formRef; form.content = this.code; form.formId=this.formId; this.$confirm('确定保存吗?','模板保存',{type: 'warning' ...
1.1调查问卷系统1、在若依上整合formDesigner参考原文:如何将formDesigner集成到前端管理模板中 - 酒肉空间 - OSCHINA - 中文开源技术交流社区
1、下载 formDesigner 组件最新版本代码2、下载完毕之后解压,取得 formDesigner 组件源码,完整复制到自己前端项目中
3、将 formDesigner 组件中 asset 目录下的 iconfont 目录复制到项目的 asset 目录下,以避免出现表单组件的图标无法显示
4、找到项目中 formDesigner 组件目录的 /index.js 文件,作者的项目路径为:ruoyi-ui/src/components/formDesigner/index.js,圈中的红框内,需要解决路径依赖,作者调整为相对路径,亦可调整为项目的绝对路径。
5、在项目中找到 main.js, 注册 formDesigner 组件(此处供参考)路径:ruoyi-ui/src/main.js
6、解决依赖组件问题,对比 formDesig ...
微服务CAP理论CAP主要是在分布式项目下的一个理论。包含了三项,一致性、可用性、分区容错性
一致性(Consistency)是指更新操作成功并返回客户端完成后,所有节点在同一时间的数据完全一致(强一致性),不能存在中间状态。
可用性(Availability) 是指系统提供的服务必须一直处于可用的状态,对于用户的每一个操作请求总是能够在有限的时间内返回结果。
分区容错性(Partition tolerance) 是指分布式系统在遇到任何网络分区故障时,仍然需要能够保证对外提供满足一致性和可用性的服务,除非是整个网络环境都发生了故障。
分布式系统中无法同时保证一致性和可用性对于分布式系统而言,分区容错性是一个最基本的要求,因此基本上我们在设计分布式系统的时候只能从一致性(C)和可用性(A)之间进行取舍。
如果保证了一致性(C):对于节点N1和N2,当往N1里写数据时,N2上的操作必须被暂停,只有当N1同步数据到N2时才能对N2进行读写请求,在N2被暂停操作期间客户端提交的请求会收到失败或超时。显然,这与可用性是相悖的。
如果保证了可用性(A):那就不能暂停N2的读写操作,但同时N ...
Redis1、完全基于内存的,C语言编写
2、采用单线程,避免不必要的上下文切换可竞争条件
3、使用多路I/O复用模型,非阻塞IO
I/O多路复用模型
I/O多路复用是指利用单个线程来同时监听多个Socket ,并在某个Socket可读、可写时得到通知,从而避免无效的等待,充分利用CPU资源。
目前的I/O多路复用都是采用的epoll模式实现,它会在通知用户进程Socket就绪的同时,把已就绪的Socket写入用户空间,不需要挨个遍历Socket来判断是否就绪,提升了性能。
其中Redis的网络模型就是使用I/O多路复用结合事件的处理器来应对多个Socket请求,比如,提供了连接应答处理器、命令回复处理器,命令请求处理器;
在Redis6.0之后,为了提升更好的性能,在命令回复处理器使用了多线程来处理回复事件,在命令请求处理器中,将命令的转换使用了多线程,增加命令转换速度,在命令执行的时候,依然是单线程
缓存穿透缓存穿透是指查询一个一定不存在的数据,如果从存储层查不到数据则不写入缓存,这将导致这个不存在的数据每次请求都要到 DB 去查 ...