2021-11-28

2021SC@SDUSC

智能研究中心快递柜学习笔记9

utils下放一些公共代码,自己封装的工具类函数,在需要的地方调用。

 其中desform下的CustomExpression定义了用户自定义表达,用来填写用户自定义的表达式,可用在Online表单的默认值表达式中使用,注意需要外部使用的变量或方法一定要 export,否则无法识别。
示例:

export const name = '张三';               // const 是常量
export let age = 17; 
                                         // 看情况 export const 还是 let ,两者都可正常使用
export function content(arg) { 
  // export 方法,可传参数,使用时要加括号,值一定要return回去,可以返回Promise
  return 'content' + arg;
}
export const address = (arg) => content(arg) + ' | 北京市'; 
  // export 箭头函数也可以

下面就是地址获取的默认值

export function demoFieldDefVal_getAddress(arg) {
  if (!arg) {
    arg = '朝阳区'
  }
  return `北京市 ${arg}`
}

authFilter是一个访问权限控制函数

Filter是过滤器,有针对性的过滤,针对哪些url过滤配置在shiro.xmI中,一个请求过来的时候,如果这个请求的url被包含在了shiro.xml的配置中,就会进入AuthFilter,然后就可以根据自己业务就行逻辑处理 了,比如登录、验证sesion中的数据等等。Filter就是对你想处理的url进行拦截,并处理自己的业务逻辑。

web三大组件之一Filter,过滤器,属于Servlet规范,作用是拦截一个请求,做一些业务逻辑操作,然后可以决定请求是否可以继续往下分发,落到其他的Filter或者对应的Servlet。一个http请求过来之后,一个Filter的工作流程大概是:

  • 首先进入filter,执行相关业务逻辑
  • 若判定通行,则进入Servlet逻辑,Servlet执行完毕之后,又返回Filter,最后在返回给请求方
  • 判定失败,直接返回,不需要将请求发给Servlet

实现一个自定义的Filter一般有两个步骤

  • 实现 Filter 接口
  • 在doFilter方法中添加业务逻辑
    如果允许访问继续,则执行chain.doFilter(req, response); 
    不执行上面这一句,则访问到此为止

 【子表行编辑】实现两个功能:
1、隐藏JEditableTable无权限的字段
 2、禁用JEditableTable无权限的字段

export function colAuthFilterJEditableTable(columns,pre) {
  let authList = getAllShowAndDisabledAuthCols(pre);
  const cols = columns.filter(item => {
    let oneAuth = authList.find(auth => {
      return auth.action === pre + item.key;
    });
    if(!oneAuth){
      return true
    }

    //代码严谨处理,防止一个授权标识,配置多次
    if(oneAuth instanceof Array){
      oneAuth = oneAuth[0]
    }

    //禁用逻辑
    if (oneAuth.type == '2' && !oneAuth.isAuth) {
      item["disabled"] = true
      return true
    }
    //隐藏逻辑逻辑
    if (oneAuth.type == '1' && !oneAuth.isAuth) {
      return false
    }
    return true
  })
  return cols
}


function hasColoum(item,authList){
  if (authList.includes(item.dataIndex)) {
    return false
  }
  return true
}

//权限无效时不做控制,有效时控制,只能控制 显示不显示
//根据授权码前缀获取未授权的列信息
function getNoAuthCols(pre){
  let permissionList = [];
  let allPermissionList = [];

  //let authList = Vue.ls.get(USER_AUTH);
  let authList = JSON.parse(sessionStorage.getItem(USER_AUTH) || "[]");
  for (let auth of authList) {
    //显示策略,有效状态
    if(auth.type == '1'&&startWith(auth.action,pre)) {
      permissionList.push(substrPre(auth.action,pre));
    }
  }
  //console.log("页面禁用权限--Global--",sessionStorage.getItem(SYS_BUTTON_AUTH));
  let allAuthList = JSON.parse(sessionStorage.getItem(SYS_BUTTON_AUTH) || "[]");
  for (let gauth of allAuthList) {
    //显示策略,有效状态
    if(gauth.type == '1'&&gauth.status == '1'&&startWith(gauth.action,pre)) {
      allPermissionList.push(substrPre(gauth.action,pre));
    }
  }
  const cols = allPermissionList.filter(item => {
    if (permissionList.includes(item)) {
      return false;
    }
    return true;
  })
  return cols;
}

 额外增加方法【用于行编辑组件】

function getAllShowAndDisabledAuthCols(pre){
  //用户拥有的权限
  let userAuthList = JSON.parse(sessionStorage.getItem(USER_AUTH) || "[]");
  //全部权限配置
  let allAuthList = JSON.parse(sessionStorage.getItem(SYS_BUTTON_AUTH) || "[]");

  let newAllAuthList = allAuthList.map(function (item, index) {
    let hasAuthArray = userAuthList.filter(u => u.action===item.action );
    if (hasAuthArray && hasAuthArray.length>0) {
      item["isAuth"] = true
    }
    return item;
  })

  return newAllAuthList;
}

function startWith(str,pre) {
  if (pre == null || pre == "" || str==null|| str==""|| str.length == 0 || pre.length > str.length)
    return false;
  if (str.substr(0, pre.length) == pre)
    return true;
  else
    return false;
}

function substrPre(str,pre) {
  return str.substr(pre.length);
}

 

 AES加密,高级加密标准(AES,Advanced Encryption Standard)为最常见的对称加密算法(微信小程序加密传输就是用这个加密算法的)。是对称加密算法也就是加密和解密用相同的密钥。

加密流程图

明文P:没有经过加密的数据。

密钥K:用来加密明文的密码,在对称加密算法中,加密与解密的密钥是相同的。密钥为接收方与发送方协商产生,但不可以直接在网络上传输,否则会导致密钥泄漏,通常是通过非对称加密算法加密密钥,然后再通过网络传输给对方,或者直接面对面商量密钥。

AES加密函数:设AES加密函数为E,则 C = E(K, P),其中P为明文,K为密钥,C为密文。也就是说,把明文P和密钥K作为加密函数的参数输入,则加密函数E会输出密文C。

密文C:经加密函数处理后的数据

AES解密函数:设AES解密函数为D,则 P = D(K, C),其中C为密文,K为密钥,P为明文。也就是说,把密文C和密钥K作为解密函数的参数输入,则解密函数会输出明文P。

  • 对称加密算法          加密和解密用到的密钥是相同的,这种加密方式加密速度非常快,适合经常发送数据的场合。缺点是密钥的传输比较麻烦 
  • 非对称加密算法      加密和解密用的密钥是不同的,这种加密方式是用数学上的难解问题构造的,通常加密解密的速度比较慢,适合偶尔发送数据的场合。优点是密钥传输方便。

 获取加密字符串,并对结果进行缓存

export function getEncryptedString() {
  return getAction("/sys/getEncryptedString",{}).then((res)=>{
    let encryptedString = {};
    encryptedString.key = res.result.key;
    encryptedString.iv = res.result.iv;
    Vue.ls.set(ENCRYPTED_STRING, encryptedString, 7 * 24 * 60 * 60 * 1000);
    return encryptedString;
  });
}
AES加密 :字符串 key iv  返回base64
export function encryption(word, keyStr, ivStr) {

  let key = CryptoJS.enc.Utf8.parse(keyStr)
  let iv = CryptoJS.enc.Utf8.parse(ivStr)

  let srcs = CryptoJS.enc.Utf8.parse(word);
  var encrypted = CryptoJS.AES.encrypt(srcs, key, {
    iv: iv,
    mode: CryptoJS.mode.CBC,
    padding: CryptoJS.pad.ZeroPadding
  });
  // console.log("-=-=-=-", encrypted.ciphertext)
  return CryptoJS.enc.Base64.stringify(encrypted.ciphertext);

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值