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);
}