Java实现字段脱敏处理


     /**
     * [中文姓名] 只显示第一个汉字,其他隐藏为2个星号<例子:李**>
     *
     * @param fullName
     * @return
     */
    public static String chineseName(String fullName) {
        if (StringUtils.isBlank(fullName)) {
            return "";
        }
        String name = StringUtils.left(fullName, 1);
        return StringUtils.rightPad(name, StringUtils.length(fullName), "*");
    }

    /**
     * [中文姓名] 只显示第一个汉字,其他隐藏为2个星号<例子:李**>
     *
     * @param familyName
     * @param givenName
     * @return
     */
    public static String chineseName(String familyName, String givenName) {
        if (StringUtils.isBlank(familyName) || StringUtils.isBlank(givenName)) {
            return "";
        }
        return chineseName(familyName + givenName);
    }

    /**
     * [身份证号] 显示最后四位,其他隐藏。共计18位或者15位。<例子:*************5762>
     *
     * @param id
     * @return
     */
    public static String idCardNum(String id) {
        if (StringUtils.isBlank(id)) {
            return "";
        }
        String num = StringUtils.right(id, 4);
        return StringUtils.leftPad(num, StringUtils.length(id), "*");
    }

    /**
     * [固定电话] 后四位,其他隐藏<例子:****1234>
     *
     * @param num
     * @return
     */
    public static String fixedPhone(String num) {
        if (StringUtils.isBlank(num)) {
            return "";
        }
        return StringUtils.leftPad(StringUtils.right(num, 4), StringUtils.length(num), "*");
    }

    /**
     * [手机号码] 前三位,后四位,其他隐藏<例子:138******1234>
     *
     * @param num
     * @return
     */
    public static String mobilePhone(String num) {
        if (StringUtils.isBlank(num)) {
            return "";
        }
        return StringUtils.left(num, 3).concat(StringUtils.removeStart(StringUtils.leftPad(StringUtils.right(num, 4), StringUtils.length(num), "*"), "***"));
    }

    /**
     * [地址] 只显示到地区,不显示详细地址;我们要对个人信息增强保护<例子:北京市海淀区****>
     *
     * @param address
     * @param sensitiveSize
     *            敏感信息长度
     * @return
     */
    public static String address(String address, int sensitiveSize) {
        if (StringUtils.isBlank(address)) {
            return "";
        }
        int length = StringUtils.length(address);
        return StringUtils.rightPad(StringUtils.left(address, length - sensitiveSize), length, "*");
    }

    /**
     * [电子邮箱] 邮箱前缀仅显示第一个字母,前缀其他隐藏,用星号代替,@及后面的地址显示<例子:g**@163.com>
     *
     * @param email
     * @return
     */
    public static String email(String email) {
        if (StringUtils.isBlank(email)) {
            return "";
        }
        int index = StringUtils.indexOf(email, "@");
        if (index <= 1) {
            return email;
        }else{
            return StringUtils.rightPad(StringUtils.left(email, 1), index, "*").concat(StringUtils.mid(email, index, StringUtils.length(email)));
        }
    }

    /**
     * [银行卡号] 前六位,后四位,其他用星号隐藏每位1个星号<例子:6222600**********1234>
     *
     * @param cardNum
     * @return
     */
    public static String bankCard(String cardNum) {
        if (StringUtils.isBlank(cardNum)) {
            return "";
        }
        return StringUtils.left(cardNum, 6).concat(StringUtils.removeStart(StringUtils.leftPad(StringUtils.right(cardNum, 4), StringUtils.length(cardNum), "*"), "******"));
    }

    /**
     * [公司开户银行联号] 公司开户银行联行号,显示前两位,其他用星号隐藏,每位1个星号<例子:12********>
     *
     * @param code
     * @return
     */
    public static String cnapsCode(String code) {
        if (StringUtils.isBlank(code)) {
            return "";
        }
        return StringUtils.rightPad(StringUtils.left(code, 2), StringUtils.length(code), "*");
    }

重写权限系统


之前权限系统基于ColaUI和BDF2,现在其基础上进行改造

要求:
1.实现资源控制和权限控制
2.用户依据角色资源和权限,实现用户级资源和权限递减
3.资源控制主要控制页面和组件
4.权限主要控制数据层

重写部分:
角色表
角色页面表
角色页面组件表
角色权限表
用户页面表
用户页面组件表
用户权限表

角色表用于保存角色的基本信息
角色页面表用于保存该角色可查看的页面信息(基于菜单表递减)
角色页面组件表用于保存该角色可查看的页面内的组件信息(基于组件表递减)
角色权限表用于保存该角色可操作的数据信息(基于该账号所属机构现有数据的某些字段值递减)

用户页面表用于保存该用于不可看的页面信息(基于角色页面表)
用户页面组件表同上取反
用户权限表用于保存该用户可看的数据(基于角色权限表)

A表基于B表,则A表的值最大为B表的值

这些表的增删改并不是重点,重点是将设置的值接入系统

接入点:
1.用户登录后获取角色及其对应的菜单项(版本替换过程中还需保证不影响原来的权限系统)
2.点击菜单加载对应的页面信息时(页面权限判断)
3.页面加载时组件的过滤(组件权限的判断)
4.数据请求时数据的过滤(数据权限的判断)

注意:
1.页面组件及数据权限过滤时接口全都基于用户查询
2.菜单加载时需考虑对原系统的影响,避免线上系统出现问题
3.页面权限判断深入框架内部,需修改jar包实现接入;
  如没有找到接口,可暂将资源设置的结果集映射的原系统表进行替代
4.组件权限过滤已在“ColaUI组件过滤”中提出,可替换其查询路径进行接口替换
5.数据过滤基于账号所属机构,主要在Dao层进行限定

ColaUI组件过滤设置


ColaUI配合后端BDF2框架共同实现组件级权限控制

在请求页面资源时通过js代码对页面进行权限过滤
<!--测试组件-->
<div id='test'></div>
(function() {
	cola(function(model) {
        var role_resource_data={
            url:'/html/test.html',
            ids:['test']
        };
    //其它代码
    App.resetComponentAuth(role_resource_data);
  });
}).call(this);
注意事项:
1.对应id组件上方如果不加注释,那么在进行角色组件资源设置时显示的是id;
  添加注释后则显示注释中的内容
2.url对应值为要控制的页面路径,从webapp下开始写
3.ids为要控制的页面中的id组件集合,不写入则组件控制无效
4.在其他代码部分不能出现return,例如return model.widgetConfig({...});
  否则代码不执行最后一行,无法进行组件过滤
5.最后一行代码进行了数据库访问,对组件权限信息进行获取,并刷新页面

ORA-00911: 无效字符


一般情况下是由于JDBC要执行的SQL语句尾部多结束符造成的,即“;”

Hibernate之Session操作


session.save(Object object); //增加
session.update(Object object);//修改
session.saveOrUpdate(Object object);//主键字段有值则修改,无则新增。
session.delete(Object object);//删除
session.createQuery(String HQL);//按HQL语句查询
session.createCriteria(Class entityClass);//按实体进行QBC查询 
session.load(Class entityClass,Serialize id); //根据id查询,延迟加载。
session.get(Class entityClass,Serialize id); //根据id查询,立即加载。
//Restrictions查询用法
HQL运算符	QBC运算符		含义
=		Restrictions.eq()	等于equal
<>		Restrictions.ne()	不等于not equal
>		Restrictions.gt()	大于greater than
>=		Restrictions.ge()	大于等于greater than or equal
<		Restrictions.lt()	小于less than
<=		Restrictions.le()	小于等于less than or equal
is null		Restrictions.isnull()	等于空值
is not null	Restrictions.isNotNull() 非空值
like		Restrictions.like()	字符串模式匹配
and		Restrictions.and()	逻辑与
and		Restrictions.conjunction() 逻辑与
or		Restrictions.or()	逻辑或
or		Restrictions.disjunction() 逻辑或
not		Restrictions.not()	逻辑非
in(列表)	Restrictions.in()	等于列表中的某一个值
not in(列表)	Restrictions.not(Restrictions.in()) 不等于列表中任意一个值
between x and y Restrictions.between()	闭区间xy中的任意值
not between x and y Restrictions.not(Restrictions..between()) 小于值X或者大于值y

application.properties中文乱码


原因:
当在程序中读取application.properties值时
默认是以ISO-8859-1的字符编码读取

解决办法:
1.添加配置
banner.charset=UTF-8
server.tomcat.uri-encoding=UTF-8
spring.http.encoding.charset=UTF-8
spring.http.encoding.enabled=true
spring.http.encoding.force=true
spring.messages.encoding=UTF-8

2.设置文件字符编码
进入File -> Settings -> Editor -> File Encodings
将Properties Files (*.properties)下的Default encoding for properties files设置为UTF-8
将Transparent native-to-ascii conversion前的勾选上
点击ok

码云JavaDoc的使用


Gitee最近又推出了一个新的服务,JavaDoc
此服务的主要作用就是:
将打包时生成的javaDoc文档部署到对应路径
以便远程访问

注意:
1.项目pom文件需引入JavaDoc的Jar包
<plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-javadoc-plugin</artifactId>
    <version>3.0.0</version>
</plugin>
2.项目设置中编程语言选中Java
否则服务中不会出现JavaDoc的选项

Oracle数据库安装教程


1.下载链接:
https://www.oracle.com/technetwork/cn/database/enterprise-edition/downloads/112010-win64soft-086667-zhs.html

2.点击下载:
win64_11gR2_database_1of2.zip
win64_11gR2_database_2of2.zip

3.解压
将两者解压到同一个文件夹下

4.点击setup

5.弹出Installer,加载中

6.安装选项
邮箱可以不填,(之后会提示你是否不希望收到安全更新的通知,点击“是”)把更新的“√”去掉。

7.选择创建和配置数据库

8.选择桌面类

9.选择安装路径并输入口令(密码)
要确保安装盘的内存在有4G以上够用就行

10.条件检查
如果有失败或者全部失败可以选择全部忽略

11.安装
点击完成后开始安装

如安装错误:未找到wfmlrsvcapp.ear
请参考:https://blog.csdn.net/singit/article/details/70832723



Canvas实现圆圈移动


<!doctype html>
<html lang="en">
 <head>
  <meta charset="UTF-8">
  <meta name="Generator" content="EditPlus®">
  <meta name="Author" content="Justin">
  <meta name="Keywords" content="canvas">
  <meta name="Description" content="canvas study">
  <title>canvas_study</title>
 </head>
 <body>
 <div>
	<canvas id="test" width="600" height="600" 
          style="border:1px solid #000000;margin-left:300px"></canvas>
 </div>
 </body>
</html>
<script>
        //用于保存鼠标移动前的坐标
	var x=-100;
	var y=-100;
	//获取鼠标当前位置
	function mousePosition(ev){
	   if(ev.pageX || ev.pageY){
	     return {x:ev.pageX, y:ev.pageY};
	   }
	   return {
	     x:ev.clientX + document.body.scrollLeft - document.body.clientLeft,
	     y:ev.clientY + document.body.scrollTop - document.body.clientTop
	   };
	}
	document.onmousemove = mouseMove;
	
	var c=document.getElementById("test");
		var ctx=c.getContext("2d");
		//线
		ctx.moveTo(0,0);
		ctx.lineTo(600,600);
		ctx.moveTo(0,600);
		ctx.lineTo(600,0);
		ctx.stroke();
        //鼠标移动时执行
	function mouseMove(ev){
		 ev = ev || window.event;
		 var mousePos = mousePosition(ev);
		//清除上一个圆
		clear();
		
		
		var c=document.getElementById("test");
		var ctx=c.getContext("2d");

		//线
		ctx.moveTo(0,0);
		ctx.lineTo(600,600);
		ctx.moveTo(0,600);
		ctx.lineTo(600,0);
		ctx.stroke();
                //圆
		ctx.beginPath();
		ctx.arc(mousePos.x-300,mousePos.y,40,0,2*Math.PI);
		ctx.stroke();
		x=mousePos.x;
		y=mousePos.y;
	}

	function clear(){
		var c=document.getElementById("test");
		var ctx=c.getContext("2d");
		ctx.clearRect(0,0,600,600);
	}
	
</script>


vue启动报错:Module build failed: Error: No parser and no file path given, couldn’t infer a parser.


报错信息:
Module build failed: Error: No parser and no file path given, couldn't infer a parser.

解决方案:
npm i prettier@~1.12.0

之后重新运行即可