Files
UserclassFront/src/utils/index.js
T
lijing 7e49587c10 feat: 迁移 Vue3 + Vite + view-ui-plus(对齐 NoticeFront 框架)
- 构建:Vue CLI 4 → Vite 5,入口迁至根 index.html(含 env-config + 主题通道 loader)
- 技术栈:Vue 2.6 → Vue 3.4,view-design → view-ui-plus 1.3.24,vue-router 3 → 4(hash)
- 壳层重写:App.vue / components/layout.vue 对齐 Notice 骨架(logo-badge、icon-* 通道图标、resolveMenuPage、crumb-home 基线)
- 机械转换:具名 slot → template #x、.sync → v-model:、@click.native、$set、beforeDestroy、/deep/ → :deep()
- render:h('Button')/h('Input') → 真组件 + 扁平 props/onClick
- 组件适配:vuedraggable 4 的 #item 插槽;vue-treeselect → @zanmato/vue3-treeselect;Page 分页改 v-model + pageSize 显式回写
- 清理:删除 Vue2 死代码(layout_old/bak/child、App.Net、codeModal、未引用组件)
- 修复:深链接首次加载被重定向到首个模块(router.isReady)

验证:vite build 通过;headless CDP 全 15 路由无异常;教师列表 2 行渲染、操作列按钮点击弹窗正常。
2026-10-20 15:16:52 +08:00

246 lines
6.5 KiB
JavaScript

export default {
goodTime (str) {
let now = new Date().getTime()
let oldTime = new Date(str).getTime()
let difference = now - oldTime
let result = ''
let minute = 1000 * 60
let hour = minute * 60
let day = hour * 24
let month = day * 30
let year = month * 12
let _year = difference / year
let _month = difference / month
let _week = difference / (7 * day)
let _day = difference / day
let _hour = difference / hour
let _min = difference / minute
if (_year >= 1) {
result = '发表于 ' + ~~(_year) + ' 年前'
} else if (_month >= 1) {
result = '发表于 ' + ~~(_month) + ' 个月前'
} else if (_week >= 1) {
result = '发表于 ' + ~~(_week) + ' 周前'
} else if (_day >= 1) {
result = '发表于 ' + ~~(_day) + ' 天前'
} else if (_hour >= 1) {
result = '发表于 ' + ~~(_hour) + ' 个小时前'
} else if (_min >= 1) {
result = '发表于 ' + ~~(_min) + ' 分钟前'
} else {
result = '刚刚'
}
return result
},
/**
* iView2 Tree 公用方法:选中指定ID节点,自动展开所有父节点
* @param {Array} treeData 树形原始数据
* @param {Number|String} targetId 要选中的节点id
* @param {Object} vueThis 当前Vue组件this实例
*/
selectTreeNodeById(treeData, targetId, vueThis) {
const loop = function (nodes, parentNode) {
for (let node of nodes) {
// 清空所有节点选中状态
node.selected = false
if (node.id === targetId) {
// 目标节点设为选中
node.selected = true
let p = parentNode
// 逐层向上展开父节点
while (p) {
p.expand = true
p = p._parent
}
return true
}
if (node.children && node.children.length) {
// 绑定父节点引用
node.children.forEach(child => child._parent = node)
const res = loop(node.children, node)
if (res) return true
}
}
return false
}
loop(treeData, null)
},
strToHexCharCode(_str) {
if (_str === "") return "";
var hexCharCode = [];
for (var i = 0; i < _str.length; i++) {
var str = _str.charCodeAt(i).toString(16);
if (_str.length == 1) str += "0" + _str;
hexCharCode.push(str);
}
return hexCharCode.join("");
},
dateFormat(_date,fmt){
var date=new Date(_date);
var o = {
"M+": date.getMonth() + 1, //月份
"d+": date.getDate(), //日
"H+": date.getHours(), //小时
"m+": date.getMinutes(), //分
"s+": date.getSeconds(), //秒
"q+": Math.floor((date.getMonth() + 3) / 3), //季度
"S": date.getMilliseconds() //毫秒
};
if (/(y+)/.test(fmt)) fmt = fmt.replace(RegExp.$1, (date.getFullYear() + "").substr(4 - RegExp.$1.length));
for (var k in o)
if (new RegExp("(" + k + ")").test(fmt)) fmt = fmt.replace(RegExp.$1, (RegExp.$1.length == 1) ? (o[k]) : (("00" + o[k]).substr(("" + o[k]).length)));
return fmt;
},
dataFilter(_key,arry) {
for (var key in arry) {
if (arry.hasOwnProperty(key)) {
var element = arry[key];
if(element.k==_key)
return element.v;
}
}
return '';
},
myUpload(url,fileObj,data,callback){
var FileController ="/api"+ url; // 接收上传文件的后台地址
if (!fileObj ||fileObj.length==0) {
console.error('请选择上传文件'); return;
}
// FormData 对象
var form = new FormData();
//表单数据
for (let key in data) {
const element = data[key];
form.append(key,element);
}
form.append("file", fileObj);// 文件对象
// XMLHttpRequest 对象
var xhr = new XMLHttpRequest();
xhr.open("post", FileController, true);
xhr.onload = function (resp) {
var obj = JSON.parse(resp.currentTarget.response);
if(callback)
callback(obj);
};
xhr.send(form);
},
comSetting(){//公共插件基础配置,如有需要,覆盖即可
const tree={
view: {
dblClickExpand: false,
showIcon: false,
},
check: {
enable: false,
},
callback:{}
}
return {
tree:tree,
}
},
comSetting1(){//公共插件基础配置,如有需要,覆盖即可
const tree={
view: {
dblClickExpand: false,
showIcon: false,
},
edit: {
enable: true,
showRemoveBtn: false,
showRenameBtn: false,
drag: { prev: true, next: true,inner: false}
},
check: {
enable: false
},
data: {
simpleData: {
enable: true
}
},
callback: {
}
}
return {
tree:tree,
}
},
openFistNode(_zNodes){//展开一级节点
if(_zNodes&&_zNodes.length>0){
for (var key in _zNodes) {
if (_zNodes.hasOwnProperty(key)) {
var element = _zNodes[key];
element.open=true;
}
}
}
else{
_zNodes.open=true;
}
return _zNodes;
},
editorFormat(val){//富文本提取文字
return val.replace(/<[^>]+>/g, "");
},
mathFormat(val,number=2){//小数点截取,默认取2位
if(isNaN(val))return 0;
var num=Math.pow(10,number);
return Math.floor(val*num)/num;
},
fileSize(size){//返回文件大小
if(!size) return '';
if(size/1024<1024){
size=Math.ceil(size/1024);
return size+'KB';
}else if(size/(1024*1024)<1024){
size=Math.ceil(size/(1024*1024)*100)/100;
return size+'MB';
}else if(size/(1024*1024*1024)<1024){
size=Math.ceil(size/(1024*1024*1024)*100)/100;
return size+'GB';
}
},
handleValidate(_this,name){//表单验证
let isValid = false;
_this.$refs[name].validate(function (valid) {
if (valid) {
isValid = true;
} else {
// _this.$Message.info('表单验证失败!');
_this.$Message.info('请填写红色星号内容!');
}
})
return isValid;
},
handleReset(_this,resetName,name) {//表单重置
if(name&&_this.isModal&&_this.isModal[name]) _this.isModal[name] = false;
if (resetName) {
_this.$refs[resetName].resetFields();
}
},
downFile(id) {//下载文件
location.href = APIConfig.Base.FileDown + '?id=' + id;
},
localStorage:{
get(key){
return localStorage.getItem(key);
},
set(key,val){
localStorage.setItem(key,val);
}
}
}