/*
* vue全局方法
*/
import Vue from 'vue';
import store from '@/store/index.js';
// 打印全局方法
Vue.prototype.printPage = function (sid, stitle) {
let oP = {};
if (stitle) {
oP.extraHead = '
' + stitle + '
';
}
$('#' + sid).printArea(oP);
};
// 全局过滤方法
Vue.prototype.filterColumn = function (value, row, column) {
let propt = null;
// && (row[column.property] || parseInt(row[column.property]) === 0)
console.log('数据', column.property)
if (column && column.property) {
propt = (row[column.property] || row[column.property] === 0) ? (row[column.property] + '') : '';
} else {
// console.log('执行了2', row[column.property])
return false;
}
// if (value || parseInt(value) === 0) {
// 修改全局過濾方法,过滤空白筛选
return propt === value + '';
// }
// return false;
};
/**
* @summary 表格列过滤
* @param {Array} tableColumns 列数组对象(详情请console)
* @param {Array} data 需要过滤的数据
* @param {Array} columns 需要过滤的列名
* @param {Object} desData 列名转义对象 e.g. {'1': '不横切', '2': '一切二', '3': '一切三'}
* */
Vue.prototype.setFilterDatas = function (tableColumns = [], data = [], columns = [], desData = {}) {
let objs = {};
// 过滤数据,得到对象 {order_no: {'001': '001'}, ...}
for (let fitem of data) {
for (let fsitem of columns) {
if (!objs[fsitem]) {
objs[fsitem] = {};
}
if (fitem[fsitem] || fitem[fsitem] === 0) {
// console.log('筛选', fitem[fsitem], objs[fsitem][fitem[fsitem]])
objs[fsitem][fitem[fsitem]] = fitem[fsitem];
} else {
objs[fsitem][''] = '';
}
}
}
for (let [k_, v_] of Object.entries(objs)) {
// k_ 为字段名;v_ 为{"0PAA10":"0PAA10","0PAA12":"0PAA12"}
// objs[k_] = [];
let aItem = [];
for (let v2_ of Object.values(v_)) {
let _test = v2_;
// code -> name
if (desData && desData[k_]) { _test = desData[k_][v2_]; }
aItem.push({
value: v2_,
text: _test
});
}
// 为列加入filters 并自定义 filterReset
for (let tcitem of tableColumns) {
if (tcitem.property === k_) {
tcitem.filters = aItem;
tcitem.filterReset = true;
break;
}
}
}
};
/**
* 列表数据筛选联动监听
* data 筛选后的数据
* tableColumn需要变化的筛选条件
*/
Vue.prototype.filterColumnWatch = function (data = [], tableColumn = {}) {
let filters = [];
let property = tableColumn.property;
for (let i in data) {
let flag = true;
for (let j in filters) {
if ((filters[j].value + '') === (data[i][property] + '')) {
flag = false;
break;
}
}
if (flag) {
filters.push({
value: data[i][property],
text: data[i][property]
})
}
}
tableColumn.filters = filters;
}
/**
* 表格合并列
* @param {当前表格显示数据} tableData
* @param {span-method自带参数*} param1
* @param {需要合并的列,如果不传默认全部*} propertyList
*/
Vue.prototype.mergeColumn = function (tableData, { row, column, rowIndex, columnIndex }, propertyList) {
let rowsPan = 1;
let thisColomnData = row[column['property']];
let thisMergeFlag = false;
if (typeof (propertyList) === 'undefined') {
thisMergeFlag = true;
} else if (propertyList.includes(column['property'])) {
thisMergeFlag = true;
}
if (thisMergeFlag && thisColomnData) {
if (rowIndex > 0 && thisColomnData === tableData[rowIndex - 1][column['property']]) {
return {
rowspan: 0,
colspan: 0
};
}
while (tableData[rowIndex + rowsPan] && thisColomnData === tableData[rowIndex + rowsPan][column['property']]) {
rowsPan += 1
}
return {
rowspan: rowsPan,
colspan: 1
};
}
}
/**
* 行拖动排序
* @param {当前表格显示数据} tableData
* @param {起始位置} startIndex
* @param {结束位置} endIndex
*/
Vue.prototype.changeRowOrder = function (allRow, startIndex, endIndex) {
let temp = [];
for (let i = 0; i < allRow.length; i++) {
if (i === startIndex) {
continue;
} else if (i === endIndex) {
temp.push(allRow[endIndex]);
temp.push(allRow[startIndex]);
} else {
temp.push(allRow[i]);
}
}
return temp;
}
let privilegeData = [];
function getPrivilegeFlag (privilegeMark, privilegeData) {
let privilegeFlag = false;
privilegeData = window.top.localStorage.getItem('ownPrivilege') && window.top.localStorage.getItem('ownPrivilege') !== 'undefined' ? JSON.parse(window.top.localStorage.getItem('ownPrivilege')) : [];
for (let i = 0; i < privilegeData.length; i++) {
let menuPrivilege = privilegeData[i].pId + privilegeData[i].privilege
if (privilegeData[i].menuType === '2' && privilegeMark === menuPrivilege) {
privilegeFlag = true;
break;
} else if (privilegeData[i].children !== null && privilegeData[i].children.length > 0) {
privilegeFlag = getPrivilegeFlag(privilegeMark, privilegeData[i].children);
if (privilegeFlag) break;
else continue;
}
}
return privilegeFlag;
}
Vue.prototype.checkPrivilege = function (privilega) {
privilegeData = window.top.localStorage.getItem('ownPrivilege') && window.top.localStorage.getItem('ownPrivilege') !== 'undefined' ? JSON.parse(window.top.localStorage.getItem('ownPrivilege')) : [];
if (privilegeData.length === 0) {
store.dispatch('generateRoutes').then(function (res) {
privilegeData = window.top.localStorage.getItem('ownPrivilege') && window.top.localStorage.getItem('ownPrivilege') !== 'undefined' ? JSON.parse(window.top.localStorage.getItem('ownPrivilege')) : [];
if (privilegeData.length > 0) {
let privilegeFlag = getPrivilegeFlag(privilega, privilegeData);
return privilegeFlag
}
}).catch(function () {
});
} else {
privilegeData = window.top.localStorage.getItem('ownPrivilege') && window.top.localStorage.getItem('ownPrivilege') !== 'undefined' ? JSON.parse(window.top.localStorage.getItem('ownPrivilege')) : [];
if (privilegeData.length > 0) {
let privilegeFlag = getPrivilegeFlag(privilega, privilegeData);
return privilegeFlag
}
}
}
// 新的权限指令封装
Vue.directive('privilege', {
inserted: function (_el, _binding) {
let menuId = window.activeMenu || window.top.localStorage.getItem('activeMenu');
let checkFoo = (privilegeData, {el, binding} = {el: _el, binding: _binding}) => {
let privilegeFlag = false;
let privilegeMark = binding.value;
// console.log({el, binding})
for (let i = 0; i < privilegeData.length; i++) {
if (privilegeData[i].privilege === privilegeMark || (menuId + privilegeData[i].privilege) === privilegeMark) {
privilegeFlag = true;
break;
}
}
if (!privilegeFlag) {
$(el).hide();
}
};
if (window.privilegeData && window.privilegeData.length > 0) {
checkFoo(window.privilegeData);
} else {
// 将待判断的项目添加至数组,等待数据获取完毕后再进行判断
window.privilegeAwaitItem ? window.privilegeAwaitItem.push({el: _el, binding: _binding}) : window.privilegeAwaitItem = [{el: _el, binding: _binding}];
if (!window.privilegeLoading) {
window.privilegeLoading = true;
getPrivilegeData(({arr, obj}) => {
// console.log(window.privilegeAwaitItem)
window.privilegeData = arr;
for (let item of window.privilegeAwaitItem) {
checkFoo(window.privilegeData, item);
}
window.privilegeAwaitItem = null;
window.privilegeLoading = false;
// console.log(window.privilegeAwaitItem)
});
}
}
},
update: function (el, binding) {
// TODO
},
componentUpdated: function (el, binding) {
// todo
}
})
Vue.prototype.getPrivilegeData = getPrivilegeData;
/**
* 获取当前用户在当前页面内所拥有的所有权限
* @param {Function} foo 回调函数,用于接收数据
*/
function getPrivilegeData (foo) {
console.log(window.activeMenu)
let menuId = window.activeMenu || window.top.localStorage.getItem('activeMenu');
Vue.prototype.axios.get('pass/v1/sysmenus/findFunctionMenusByUserId?menuType=2&companyId=' + window.top.localStorage.getItem('companyId') + '&pId=' + menuId)
.then(res => {
if (res.code === '0') {
let arr = [],
obj = {};
for (let item of res.data) {
if (item.pId === menuId) {
arr.push(item);
obj[item.privilege] = true;
}
}
foo({arr, obj});
} else {
foo({arr: [], obj: {}});
this.$message.error(res.message)
}
}).catch(() => {
foo({arr: [], obj: {}});
});
}
Vue.prototype.toFixed = function (number, n) {
if (n > 20 || n < 0) {
throw new RangeError('toFixed() digits argument must be between 0 and 20');
}
// const number = this;
if (isNaN(number) || number >= Math.pow(10, 21)) {
return number.toString();
}
if (typeof (n) === 'undefined' || n === 0) {
return (Math.round(number)).toString();
}
let result = number.toString();
const arr = result.split('.');
// 整数的情况
if (arr.length < 2) {
result += '.';
for (let i = 0; i < n; i += 1) {
result += '0';
}
return result;
}
const integer = arr[0];
const decimal = arr[1];
if (decimal.length === n) {
return result;
}
if (decimal.length < n) {
for (let i = 0; i < n - decimal.length; i += 1) {
result += '0';
}
return result;
}
result = integer + '.' + decimal.substr(0, n);
const last = decimal.substr(n, 1);
// 四舍五入,转换为整数再处理,避免浮点数精度的损失
if (parseInt(last, 10) >= 5) {
const x = Math.pow(10, n);
result = (Math.round((parseFloat(result) * x)) + 1) / x;
result = result.toFixed(n);
}
return result;
};