记录封装的js方法(防止之后用到不记得咋写的了),实时更新。
更新时间:2024-10-10
添加内容:给el-tree 的每个层级 动态添加类名
// import { Dialog } from "vant";
import router from "@/router";
// import { fakeApi } from "@/api/luApi.js";
const PublicFunction = {
/**
* 存放公共的js
*
* */
/**
* 合并单元格
* TableData:传递过来的表格数据
* itemName:属性名
* rowIndex:行索引值
* */
MergeCol: (TableData, itemName, rowIndex) => {
// 合并单元格
// id:属性名
// rowIndex:行索引值
var idName = TableData[rowIndex][itemName]; // 获取当前单元格的值
if (rowIndex > 0) {
// 判断是不是第一行
// eslint-disable-next-line eqeqeq
if (TableData[rowIndex][itemName] != TableData[rowIndex - 1][itemName]) {
// 先判断当前单元格的值是不是和上一行的值相等
var i = rowIndex;
var num = 0; // 定义一个变量i,用于记录行索引值并进行循环,num用于计数
while (i < TableData.length) {
// 当索引值小于table的数组长度时,循环执行
if (TableData[i][itemName] === idName) {
// 判断循环的单元格的值是不是和当前行的值相等
i++; // 如果相等,则索引值加1
num++; // 合并的num计数加1
} else {
i = TableData.length; // 如果不相等,将索引值设置为table的数组长度,跳出循环
}
}
return {
rowspan: num, // 最终将合并的行数返回
colspan: 1,
};
} else {
return {
rowspan: 0, // 如果相等,则将rowspan设置为0
colspan: 1,
};
}
} else {
// 如果是第一行,则直接返回
let i = rowIndex;
let num = 0;
while (i < TableData.length) {
// 当索引值小于table的数组长度时,循环执行
if (TableData[i][itemName] === idName) {
i++;
num++;
} else {
i = TableData.length;
}
}
return {
rowspan: num,
colspan: 1,
};
}
},
/**
* 非form表单
* 判断是否输入的是数字
*/
checkPriceSell: (rule, value, callback) => {
if (value) {
if (!/^\d+(\.\d{1,2})?$/.test(value)) {
callback(new Error("请输入数字!"));
} else {
callback();
}
}
},
/**跳转 上一页/首页
* @routeName:要跳转到的上一页的页面路由; [类型:string]
* @mag:传递message提示信息 ; [类型:string]
* @objData:传递的参数; [类型:object]
* */
returnaircraftChoice(routeName, msg, objData) {
this.$confirm('此操作将永久删除该数据, 是否继续?', '提示', {
confirmButtonText: '确定',
cancelButtonText: '取消',
type: 'warning'
}).then(() => {
router.push({
name: routeName, //目前是跳到表单页面
params: {
data: [objData, "Old"],
},
});
}).catch(() => { });
},
// 数据连接
/**
*
* 参数一二三是在调用方法时写死的,vals是接收的参数
* */
dataConnection(ip, points, CarType, vals) {
//末尾数据为明细表数据
const params = {
ipAddress: ip,
points: points,
CarType: CarType,
Main: vals,
};
return params;
},
/**
* 查询当天日期(年-月-日)
*/
getNowDate() {
const timeOne = new Date();
const year = timeOne.getFullYear();
let month = timeOne.getMonth() + 1;
let day = timeOne.getDate();
month = month < 10 ? "0" + month : month;
day = day < 10 ? "0" + day : day;
const NOW_MONTHS_AGO = `${year}-${month}-${day}`;
return NOW_MONTHS_AGO;
},
/**
* 获取n个main~max间的随机整数
* @max:[数据类型是int]最大值
* @min:[数据类型是int]最小值
* @n:[数据类型是int]生成几个值
*/
// 获取一个1~100 随机数 let randomData = Math.floor(Math.random() * 100 + 1)
random(min, max, n) {
let arr = [];
for (let i = 0; i < n; i++) {
arr.push(Math.floor(Math.random() * (max - min) + min));
}
arr.sort((a, b) => a - b);
return arr;
},
/***************************************
* 生成从minNum到maxNum的随机数。
* 如果指定decimalNum个数,则生成指定小数位数的随机数
* 如果不指定任何参数,则生成0-1之间的随机数。
*
* @minNum:[数据类型是Integer]生成的随机数的最小值(minNum和maxNum可以调换位置)
* @maxNum:[数据类型是Integer]生成的随机数的最大值
* @decimalNum:[数据类型是Integer]如果生成的是带有小数的随机数,则指定随机数的小数点后的位数
* @n:[数据类型是int],指的是生成几个
*
****************************************/
randomNum(maxNum, minNum, n, decimalNum) {
var max = 0,
min = 0;
let arr = [];
minNum <= maxNum
? ((min = minNum), (max = maxNum))
: ((min = maxNum), (max = minNum));
// return (Math.random() * (max - min) + min).toFixed(decimalNum);
for (let i = 0; i < n; i++) {
arr.push((Math.random() * (max - min) + min).toFixed(decimalNum));
}
return arr;
},
/**
* 获取当前日期以及前6天日期的集合
* @data:[数据类型是int],指的是共几天
*/
sevenDay(data) {
let myDate = new Date(); //获取今天日期
// myDate.setDate(myDate.getDate() - 6);
myDate.setDate(myDate.getDate() - data + 1); //获取6天前的日期
let dateArray = [];
let dateTemp;
let flag = 1;
for (let i = 0; i < data; i++) {
dateTemp = myDate.getMonth() + 1 + "-" + myDate.getDate();
dateArray.push(dateTemp);
myDate.setDate(myDate.getDate() + flag);
}
return dateArray;
},
/**
* 全选 四个参数
* @isAll:是否被勾选(指表头), [ 类型:布尔]
* @tableData:该表格的数据 [ 类型:数组对象]
* @checkList:被选择勾选的id数组, [类型:Array]
* @isCheck:是否列表的被全部勾选(指表格数据) [类型:布尔]
*
* [返回一个对象],
* @isAll:布尔值,(指表头是否勾选),
* @checkList: checkList(指被勾选的数据)
* */
allCheck(isAll, tableData, checkList, isCheck) {
if (isAll) {
for (let i = 0; i < tableData.length; i++) {
tableData[i].check = true;
if (tableData[i].ID === undefined) {
checkList.push(tableData[i].id);
} else {
checkList.push(tableData[i].ID);
}
}
isCheck = false; //部分选中
isAll = true; //全选
} else {
for (let i = 0; i < tableData.length; i++) {
tableData[i].check = false;
checkList = [];
}
isCheck = false; //
isAll = false; //
}
return { isAll: isAll, checkList: checkList };
},
/***
* @GetButtonByRoleAndMenus:查询当前菜单下所拥有的按钮的方法
* @params:参数{MenuID: Menuid,RoleIds: RoleID}
* @_this:this
*/
// async GetButtonByRoleAndMenus(params, _this) {
// await fakeApi
// .Sys_ButtonTable(params)
// .then((res) => {
// var tempbtn = [];
// res.data.forEach((item) => {
// var obj = {
// btnName: item.ButtonName,
// btnType: item.type, //success
// btnColor:item.color,
// plain: true,
// SvgIconName: "UpLoad",
// // color: this.getColor(),
// // color: item.ButtonColor,
// };
// tempbtn.push(obj);
// });
// _this.$refs.ButtonRef.SetButtonConfigDatas(tempbtn);
// })
// .catch((err) => {});
// }
// 菜单列表树结构使用递归展示
SetTreeMenuDataTableIds(resData) {
resData.forEach((item) => {
item.MenuName = item.Model.MenuName
item.IsEnabled = item.Model.IsEnabled
item.MenuURL = item.Model.MenuURL
item.IconClass = item.Model.IconClass
item.ModuleID = item.Model.ID
item.ParentId = item.Model.ParentId
if (item.Children) {
if (item.Children.length != 0) {
this.SetTreeMenuDataTableIds(item.Children)
}
}
})
},
// 单位列表树结构使用递归展示
SetTreeUnitSetDataTableIds(resData) {
resData.forEach((item) => {
item.ID = item.Model.ID;
item.ParentId = item.ParentId;
item.DataID = item.Model.DataID;
item.DataName = item.Model.DataName;
item.SortID = item.Model.SortID;
item.Dsc = item.Model.Dsc;
item.DictID = item.Model.DictID;
if (item.Children) {
if (item.Children.length != 0) {
this.SetTreeUnitSetDataTableIds(item.Children)
}
}
})
},
//#region 测试
format(timestamp) {
const date = new Date(timestamp);
const year = date.getFullYear();
const month = padZero(date.getMonth() + 1);
const day = padZero(date.getDate());
return `${year}-${month}-${day}`;
},
padZero(num) {
return num < 10 ? `0${num}` : num;
},
//#endregion
//#region 获取tab可视化高度
getElementTabOffsetTop(element) {
let offsetTop = 0;
let currentElement = element;
// 遍历元素的每个祖先元素
while (currentElement) {
// 累加每个祖先元素的 offsetTop
offsetTop += currentElement.offsetTop;
// 检查当前元素是否是滚动容器(比如 div 有 overflow-y: auto)
if (currentElement.scrollTop) {
// 累加滚动容器的 scrollTop
offsetTop -= currentElement.scrollTop;
}
// 移动到父元素
currentElement = currentElement.offsetParent;
}
// 还需要考虑页面的滚动(视口滚动)
offsetTop += document.documentElement.scrollTop || document.body.scrollTop || 0;
return offsetTop;
},
//#endregion
//#region 用于动态修改el-tree 每个层级的背景色
/**
* 递归地获取节点的层级。如果节点没有父节点,则返回当前层级;否则,递归调用并增加层级
* @param {*} node
* @param {*} level
* @returns
*/
getLevel(node, level = 1) {
if (!node.parent) {
return level;
} else {
return this.getLevel(node.parent, level + 1);
}
},
/**
* 根据节点的层级动态添加 CSS 类
* @param {*} selectTreeData 选中的id
* @returns
*/
renderContent(h, { node, data, store }, selectTreeData) {
const level = this.getLevel(node);
const isSelected = selectTreeData === data.id; // 检查当前节点是否被选中
const customClass = `tree-node-level-${level} ${isSelected ? "selected-node" : ""
}`;
return h("span", { class: customClass }, [h("span", null, [data.label])]);
},
//#endregion
};
export { PublicFunction };