- 构建: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 行渲染、操作列按钮点击弹窗正常。
246 lines
6.5 KiB
JavaScript
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);
|
|
}
|
|
}
|
|
|
|
|
|
|
|
|
|
}
|