初始提交
This commit is contained in:
338
src/extend/api/api.js
Normal file
338
src/extend/api/api.js
Normal file
@@ -0,0 +1,338 @@
|
||||
import axios from "axios";
|
||||
import qs from 'qs';
|
||||
import router from "../../router";
|
||||
import { Message } from "element-ui";
|
||||
import saveAs from "./../lib/filesaver";
|
||||
import NProgress from 'nprogress';
|
||||
import './../../../static/css/nprogress.css';
|
||||
|
||||
var http = require("./httpurl");
|
||||
function getUserToken(){
|
||||
var data = window.localStorage.getItem("etorcurrentuser");
|
||||
if(data)
|
||||
return JSON.parse(data).Token;
|
||||
return "";
|
||||
}
|
||||
|
||||
var bmsAxios = axios.create({
|
||||
// timeout: 120000,
|
||||
withCredentials: true,
|
||||
baseURL: http.baseURL,
|
||||
headers: {
|
||||
post: {
|
||||
"Content-Type": "application/x-www-form-urlencoded;charset=UTF-8"
|
||||
}
|
||||
}
|
||||
});
|
||||
|
||||
bmsAxios.interceptors.request.use(
|
||||
config => {
|
||||
var data = "";
|
||||
if (window.localStorage.getItem("etorcurrentuser")) {
|
||||
data = window.localStorage.getItem("etorcurrentuser");
|
||||
}
|
||||
|
||||
if (data == "") {
|
||||
config.headers.token = "";
|
||||
config.headers.sid = sid || 0;
|
||||
} else {
|
||||
config.headers.token = JSON.parse(data).Token;
|
||||
//var TenantId = JSON.parse(data).Manager.TenantId;
|
||||
//var OperaterID = JSON.parse(data).Manager.ID;
|
||||
}
|
||||
var sid = window.localStorage.getItem("sid");
|
||||
config.headers.sid = sid || 0;
|
||||
removeNullAndUndefinedProperty(config.data)//没用的参数不要传
|
||||
removeNullAndUndefinedProperty(config.params)//没用的参数不要传
|
||||
if (config.url != "Permission/AgainGetToken") {
|
||||
window.localStorage.setItem(
|
||||
"lastrequesttime",
|
||||
JSON.stringify(Date.now())
|
||||
); //记录用户最后请求时间
|
||||
}
|
||||
//debugger
|
||||
return config;
|
||||
},
|
||||
error => {
|
||||
return Promise.reject(error);
|
||||
}
|
||||
);
|
||||
// 返回状态
|
||||
let onceMessage = false;
|
||||
bmsAxios.interceptors.response.use(
|
||||
res => {
|
||||
return res;
|
||||
},
|
||||
error => {
|
||||
//有异常
|
||||
if (error.response) {
|
||||
switch (error.response.status) {
|
||||
case 401:
|
||||
if (onceMessage) return;
|
||||
onceMessage = true;
|
||||
// Message.error("信息过期,请重新登陆");
|
||||
router.replace({
|
||||
path: "/login",
|
||||
query: {
|
||||
redirect: router.currentRoute.fullPath
|
||||
}
|
||||
});
|
||||
break;
|
||||
case 204:
|
||||
Message.error("暂无数据");
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
return Promise.reject(error);
|
||||
}
|
||||
);
|
||||
|
||||
export function get(url, config) {
|
||||
return new Promise((resolve, reject) => {
|
||||
bmsAxios.get(url, {
|
||||
params: config,
|
||||
paramsSerializer: function (params) {
|
||||
return qs.stringify(params, { arrayFormat: 'repeat' })
|
||||
}
|
||||
}).then(
|
||||
response => {
|
||||
if (response.data.Code == 10000) {
|
||||
return resolve(response.data);
|
||||
} else {
|
||||
Message.error(response.data.Message||"数据异常")
|
||||
}
|
||||
},
|
||||
err => {
|
||||
reject(err);
|
||||
}
|
||||
)
|
||||
.catch(error => {
|
||||
reject(error);
|
||||
});
|
||||
});
|
||||
}
|
||||
|
||||
export function post(url, params) {
|
||||
return new Promise((resolve, reject) => {
|
||||
bmsAxios.post(url, params).then(
|
||||
response => {
|
||||
if (response.data.Code == 10000) {
|
||||
Message.success("操作成功")
|
||||
return resolve(response.data);
|
||||
} else {
|
||||
Message.error(response.data.Message)
|
||||
}
|
||||
},
|
||||
err => {
|
||||
Message.error("操作失败")
|
||||
reject(err);
|
||||
}
|
||||
)
|
||||
.catch(error => {
|
||||
Message.error("操作异常")
|
||||
reject(error);
|
||||
});
|
||||
});
|
||||
}
|
||||
|
||||
export function put(url, params) {
|
||||
return new Promise((resolve, reject) => {
|
||||
bmsAxios.put(url, params).then(
|
||||
response => {
|
||||
resolve(response.data);
|
||||
},
|
||||
err => {
|
||||
reject(err);
|
||||
}
|
||||
)
|
||||
.catch(error => {
|
||||
reject(error);
|
||||
});
|
||||
});
|
||||
}
|
||||
export function del(url, config) {
|
||||
return new Promise((resolve, reject) => {
|
||||
bmsAxios.delete(url, { params: config }).then(
|
||||
response => {
|
||||
resolve(response.data);
|
||||
},
|
||||
err => {
|
||||
reject(err);
|
||||
}
|
||||
)
|
||||
.catch(error => {
|
||||
reject(error);
|
||||
});
|
||||
});
|
||||
}
|
||||
/** 使用 get HTTP Method 下载文件 */
|
||||
export function getDownloadFile(url, params, name) {
|
||||
NProgress.start();
|
||||
return new Promise((resolve, reject) => {
|
||||
bmsAxios
|
||||
.get(url, {
|
||||
params: {
|
||||
...params,
|
||||
params: params
|
||||
},
|
||||
responseType: "blob"
|
||||
})
|
||||
.then(response => {
|
||||
//确定最终文件名
|
||||
const fileNameHeader = "x-suggested-filename";
|
||||
let suggestedFileName = response.headers[fileNameHeader] || name;
|
||||
if (suggestedFileName)
|
||||
suggestedFileName = decodeURIComponent(suggestedFileName);
|
||||
const effectiveFileName =
|
||||
suggestedFileName === undefined ? "untitled" : suggestedFileName;
|
||||
|
||||
//长度为零给出提示,扔出错误
|
||||
if (response.data.size == 0) throw new Error("文件长度为0");
|
||||
|
||||
//返回json,进行解析,获取Message,扔出错误
|
||||
if (response.data.type == "application/json") {
|
||||
let reader = new FileReader();
|
||||
reader.onload = function (event) {
|
||||
var message = JSON.parse(event.target.result);
|
||||
reject(new Error(message.Message)); //拒绝
|
||||
};
|
||||
reader.readAsText(response.data);
|
||||
} else {
|
||||
saveAs(response.data, effectiveFileName);
|
||||
resolve(); //解决
|
||||
}
|
||||
})
|
||||
.catch(e => reject(e)).finally(function () {
|
||||
NProgress.done();
|
||||
}); //拒绝
|
||||
});
|
||||
}
|
||||
export function all(urlArr) { //并发请求
|
||||
if (urlArr.length > 6) {
|
||||
throw '当前不支持数量大于6个的并发请求';
|
||||
}
|
||||
return new Promise((resolve, reject) => {
|
||||
axios.all(urlArr).then(
|
||||
axios.spread((v0, v1, v2, v3, v4, v5) => {
|
||||
let ret = {};
|
||||
arguments.forEach((item, idx) => {
|
||||
if (item)
|
||||
ret[`ret${idx}`] = item
|
||||
})
|
||||
resolve(item);
|
||||
}),
|
||||
err => {
|
||||
reject(err);
|
||||
}
|
||||
)
|
||||
.catch(error => {
|
||||
reject(error);
|
||||
});
|
||||
});
|
||||
}
|
||||
|
||||
export function axiosHttp(url, params, type = 'get') {
|
||||
return new Promise((resolve, reject) => {
|
||||
axios[type](url, { params: params }).then(
|
||||
response => {
|
||||
resolve(response.data);
|
||||
},
|
||||
err => {
|
||||
reject(err);
|
||||
}
|
||||
).catch(error => {
|
||||
reject(error);
|
||||
});
|
||||
});
|
||||
}
|
||||
function removeNullAndUndefinedProperty(model) {//移除对象中值为null、undefined的属性
|
||||
if (model) {
|
||||
for (let key in model) {
|
||||
if (model[key] === null || typeof (model[key]) === 'undefined') {
|
||||
delete model[key]
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
function createFileInput(accept, onSelect) {
|
||||
var lastFileInput = document.getElementById("f1_id");
|
||||
if (lastFileInput != null) {
|
||||
document.body.removeChild(lastFileInput);
|
||||
}
|
||||
lastFileInput = document.createElement("input");
|
||||
lastFileInput.type = "file";
|
||||
lastFileInput.name = "f1";
|
||||
lastFileInput.id = "f1_id";
|
||||
accept && (lastFileInput.accept = accept);
|
||||
lastFileInput.setAttribute("style", "display:none;");
|
||||
document.body.appendChild(lastFileInput);
|
||||
lastFileInput.onchange = function (e) {
|
||||
var f = lastFileInput.files[0];
|
||||
onSelect && onSelect(f)
|
||||
}
|
||||
return lastFileInput;
|
||||
}
|
||||
export function getUuid(length) {
|
||||
return Number(Math.random().toString().substr(3, length) + Date.now()).toString(36);
|
||||
}
|
||||
|
||||
//通过axios上传文件
|
||||
export function upload(url, uconfig) {
|
||||
var uconfig = uconfig || {};
|
||||
var params = uconfig.params || {};
|
||||
var accept = uconfig.accept || "image/gif, image/jpeg,image/jpg,image/png,image/*";
|
||||
var onProgress = uconfig.onProgress || function () { };
|
||||
var onStart = uconfig.onStart || function () { };
|
||||
var uuid = uconfig.uuid || getUuid(10);
|
||||
let config = {
|
||||
headers: {
|
||||
"Content-Type": "multipart/form-data",
|
||||
"token":getUserToken(),
|
||||
"sid":0
|
||||
},
|
||||
transformRequest: [function (data) {
|
||||
return data
|
||||
}],
|
||||
onUploadProgress: e => {
|
||||
var completeProgress = ((e.loaded / e.total * 100) | 0);
|
||||
onProgress && onProgress(uuid, completeProgress);
|
||||
console.log("onUploadProgress:" + completeProgress);
|
||||
}
|
||||
}
|
||||
let formData = new FormData();
|
||||
for (let key of Object.keys(params)) {
|
||||
formData.append(key, params[key] !== null ? params[key] : '')
|
||||
}
|
||||
return new Promise((resolve, reject) => {
|
||||
var lastFileInput = createFileInput(accept, file => {
|
||||
if (!file)
|
||||
reject("没有选择文件")
|
||||
formData.append(file.name, file);
|
||||
onStart && onStart(uuid, file);
|
||||
|
||||
var uploadAxios = axios.create({
|
||||
withCredentials: true,
|
||||
baseURL: http.baseURL
|
||||
});
|
||||
uploadAxios.post(url, formData, config).then(
|
||||
response => { resolve(response.data) },
|
||||
err => { reject(err) }
|
||||
).catch(error => { reject(error) })
|
||||
})
|
||||
lastFileInput.click();
|
||||
});
|
||||
}
|
||||
export default {
|
||||
baseURL: http.baseURL,
|
||||
get,
|
||||
post,
|
||||
del,
|
||||
put,
|
||||
upload,//:httpfile.upload,
|
||||
getDownloadFile,
|
||||
all(urlArr) { //并发请求
|
||||
return all(urlArr);
|
||||
}
|
||||
};
|
||||
224
src/extend/api/httpfile.js
Normal file
224
src/extend/api/httpfile.js
Normal file
@@ -0,0 +1,224 @@
|
||||
function then(onthen) {
|
||||
this._then_callback = function (p) { };
|
||||
this._error_callback = function (p) { };
|
||||
this._on_then = onthen;
|
||||
}
|
||||
|
||||
function JsFormData() {
|
||||
this.boundry = "";
|
||||
this.formName = "";
|
||||
this.formValue = "";
|
||||
}
|
||||
JsFormData.prototype.constructor = JsFormData;
|
||||
JsFormData.prototype.getFormString = function () {
|
||||
return "--" + this.boundry + "\r\nContent-Disposition:form-data; name=" + this.formName + "\r\n\r\n" + this.formValue + "\r\n";
|
||||
};
|
||||
JsFormData.prototype.toString = function () {
|
||||
return this.getFormString();
|
||||
};
|
||||
|
||||
function JsFileFormData() {
|
||||
this.formFileName = "";
|
||||
this.contentType = "";
|
||||
JsFormData.call(this);
|
||||
}
|
||||
JsFileFormData.prototype = new JsFileFormData();
|
||||
JsFileFormData.prototype.constructor = JsFileFormData;
|
||||
JsFileFormData.prototype.getFormString = function () {
|
||||
return "--" + this.boundry + "\r\nContent-Disposition:form-data; name=" + this.formName + "; filename=" + this.formFileName + "\r\nContent-Type: " + this.contentType + "\r\n\r\n" + this.formValue + "\r\n";
|
||||
};
|
||||
JsFileFormData.prototype.toString = function () {
|
||||
return this.getFormString();
|
||||
};
|
||||
then.prototype.constructor = then;
|
||||
then.prototype = new then();
|
||||
then.prototype.then = function (p) {
|
||||
this._then_callback = p;
|
||||
this._on_then();
|
||||
return this;
|
||||
};
|
||||
then.prototype.error = function (p) {
|
||||
this._error_callback = p;
|
||||
return this;
|
||||
}
|
||||
then.prototype.invoke_then = function (p) {
|
||||
this._then_callback(p);
|
||||
return this;
|
||||
}
|
||||
then.prototype.invoke_error = function (p) {
|
||||
this._error_callback(p);
|
||||
return this;
|
||||
}
|
||||
|
||||
function JsHttpHelper() {
|
||||
this.formData = new Array();
|
||||
}
|
||||
JsHttpHelper.prototype.boundry = Math.random().toString().substr(2),
|
||||
JsHttpHelper.prototype.addFormValue = function (key, value) {
|
||||
var f = new JsFormData();
|
||||
f.formName = key;
|
||||
f.formValue = value;
|
||||
f.boundry = this.boundry;
|
||||
this.formData.push(f);
|
||||
};
|
||||
JsHttpHelper.prototype.addFileFormValue = function (key, fname, fcontent) {
|
||||
var f = new JsFileFormData();
|
||||
f.formName = key;
|
||||
f.formValue = fcontent;
|
||||
f.contentType = "application/octet-stream";
|
||||
f.formFileName = fname;
|
||||
f.boundry = this.boundry;
|
||||
this.formData.push(f);
|
||||
};
|
||||
JsHttpHelper.prototype.postMultipartFormData = function (url, postCallBack, updateProgress, errorFunc) {
|
||||
var xhr = new XMLHttpRequest();
|
||||
// xhr.onloadend = function (e) {
|
||||
// if (e.total > 0)
|
||||
// postCallBack(e, xhr);
|
||||
// };
|
||||
xhr.onload = function (e) {
|
||||
if((e.status >= 200 && e.status < 300) || e.status == 304){
|
||||
postCallBack(e, xhr);
|
||||
}
|
||||
};
|
||||
xhr.onabort = errorFunc;
|
||||
xhr.onerror = errorFunc;
|
||||
xhr.ontimeout = errorFunc;
|
||||
if (updateProgress != null) {
|
||||
xhr.upload.onprogress = function (e) {
|
||||
if (e.lengthComputable) {
|
||||
updateProgress((e.loaded / e.total) * 100);
|
||||
}
|
||||
}
|
||||
};
|
||||
xhr.open("POST", url, true);
|
||||
xhr.setRequestHeader("content-type", "multipart/form-data; charset=utf-8; boundary=" + this.boundry);
|
||||
var postBody = "";
|
||||
// console.log(this.formData);
|
||||
for (var s = 0; s < this.formData.length; s++) {
|
||||
postBody += this.formData[s].getFormString();
|
||||
}
|
||||
postBody += "--" + this.boundry + "--\r\n";
|
||||
xhr.send(postBody);
|
||||
this.formData = new Array();
|
||||
console.log(this.formData);
|
||||
};
|
||||
|
||||
JsHttpHelper.prototype.constructor = JsHttpHelper;
|
||||
|
||||
var lastFileInput;
|
||||
|
||||
function compress_image(base64Image, callback, wd) {
|
||||
if (wd == null || wd == undefined) {
|
||||
wd = 200;
|
||||
}
|
||||
var image = document.createElement("img");
|
||||
image.onload = function () {
|
||||
var square = wd;
|
||||
var canvas = document.createElement('canvas');
|
||||
var HoverW = this.height / this.width;
|
||||
var hNew = wd * HoverW;
|
||||
var wNew = wd;
|
||||
canvas.width = wNew;
|
||||
canvas.height = hNew;
|
||||
var context = canvas.getContext('2d');
|
||||
context.clearRect(0, 0, canvas.width, canvas.height);
|
||||
context.drawImage(this, 0, 0, this.width, this.height, 0, 0, wNew, hNew);
|
||||
var data = canvas.toDataURL('image/jpeg');
|
||||
//console.log("compress_image raw " + base64Image.length + " now " + data.length + " decrease rate " + (base64Image.length - data.length) / base64Image.length);
|
||||
callback(data);
|
||||
};
|
||||
image.setAttribute('src', base64Image);
|
||||
}
|
||||
|
||||
function read_file_base64String(funcReadOver, funcReadOutoffLimit, sizeLimit) {
|
||||
if (sizeLimit == null || sizeLimit == undefined) {
|
||||
sizeLimit = 200;
|
||||
}
|
||||
lastFileInput = document.getElementById("f1_id");
|
||||
if (lastFileInput != null) {
|
||||
document.body.removeChild(lastFileInput);
|
||||
lastFileInput = null;
|
||||
}
|
||||
if (lastFileInput == null) {
|
||||
lastFileInput = document.createElement("input");
|
||||
lastFileInput.type = "file";
|
||||
lastFileInput.name = "f1";
|
||||
lastFileInput.id = "f1_id";
|
||||
lastFileInput.setAttribute("style", "display:none;");
|
||||
document.body.appendChild(lastFileInput);
|
||||
}
|
||||
lastFileInput.onchange = null;
|
||||
lastFileInput.onchange = function (e) {
|
||||
var f = lastFileInput.files[0];
|
||||
var reader = new FileReader();
|
||||
var sz = ((f.size / 1024) / 1024);
|
||||
//console.log(sz + "m");
|
||||
reader.onloadend = function (e) {
|
||||
compress_image(e.target.result, function (bs64) {
|
||||
funcReadOver(bs64);
|
||||
}, sizeLimit);
|
||||
//1M == 1398211
|
||||
};
|
||||
reader.readAsDataURL(f);
|
||||
};
|
||||
lastFileInput.click();
|
||||
}
|
||||
|
||||
function upload(url,func, keyValues, isfile, accept) {
|
||||
// var proc = progressBar.start();
|
||||
lastFileInput = document.getElementById("f1_id");
|
||||
if (lastFileInput != null) {
|
||||
document.body.removeChild(lastFileInput);
|
||||
lastFileInput = null;
|
||||
}
|
||||
if (lastFileInput == null) {
|
||||
lastFileInput = document.createElement("input");
|
||||
lastFileInput.type = "file";
|
||||
lastFileInput.name = "f1";
|
||||
lastFileInput.id = "f1_id";
|
||||
accept && (lastFileInput.accept = accept);
|
||||
lastFileInput.setAttribute("style", "display:none;");
|
||||
document.body.appendChild(lastFileInput);
|
||||
}
|
||||
lastFileInput.onchange = null;
|
||||
lastFileInput.onchange = function (e) {
|
||||
var f = lastFileInput.files[0];
|
||||
var reader = new FileReader();
|
||||
reader.onloadend = function (e) {
|
||||
var sz = ((f.size / 1024) / 1024);
|
||||
if (isfile != undefined && isfile!=='') {
|
||||
var http = new JsHttpHelper();
|
||||
http.addFileFormValue("f2", f.name, e.target.result);
|
||||
if(keyValues){
|
||||
for (var key in keyValues) {
|
||||
http.addFormValue(keyValues[key].key, keyValues[key].value);
|
||||
}
|
||||
}
|
||||
http.postMultipartFormData(url, func, null, function (e, xhr) {
|
||||
});
|
||||
} else {
|
||||
compress_image(e.target.result, function (bs64) {
|
||||
var http = new JsHttpHelper();
|
||||
http.addFileFormValue("f2", f.name, bs64);
|
||||
if(keyValues){
|
||||
for (var key in keyValues) {
|
||||
http.addFormValue(keyValues[key].key, keyValues[key].value);
|
||||
}
|
||||
}
|
||||
http.postMultipartFormData(url, func, null, function (e, xhr) {
|
||||
});
|
||||
});
|
||||
}
|
||||
//1M == 1398211
|
||||
};
|
||||
reader.readAsDataURL(f);
|
||||
};
|
||||
lastFileInput.click();
|
||||
}
|
||||
|
||||
export default{
|
||||
compress_image,
|
||||
read_file_base64String,
|
||||
upload
|
||||
}
|
||||
23
src/extend/api/httpurl.js
Normal file
23
src/extend/api/httpurl.js
Normal file
@@ -0,0 +1,23 @@
|
||||
//npm run build -- dev
|
||||
//npm run build -- test
|
||||
//npm run build -- prod
|
||||
|
||||
const devUrlNew ='http://localhost:5000/api/'
|
||||
const testUrlNew = "http://localhost:5000/api/"
|
||||
const prodUrlNew ="http://www.juip.com/api/";// "http://api.yk.hncore.net/api/"/"http://hapi.hncore.net/api"
|
||||
|
||||
var baseURL= devUrlNew
|
||||
switch (process.env.NODE_ENV) {
|
||||
case "development":
|
||||
baseURL =devUrlNew
|
||||
break;
|
||||
case "test":
|
||||
baseURL =testUrlNew
|
||||
break;
|
||||
case "production":
|
||||
baseURL = prodUrlNew
|
||||
break;
|
||||
}
|
||||
export {
|
||||
baseURL
|
||||
};
|
||||
35
src/extend/components/breadcrumbs.vue
Normal file
35
src/extend/components/breadcrumbs.vue
Normal file
@@ -0,0 +1,35 @@
|
||||
<template>
|
||||
<nav class="model-breadcrumbs">
|
||||
<ol>
|
||||
<li style="display:inline-block;" v-for="(item,index) in routes" :key="index">
|
||||
<router-link style="color:#333" v-if="item.link" :to="item.link">{{item.name}}<span style="margin:0 .4em;">></span></router-link>
|
||||
<span v-else>{{item.name}}</span>
|
||||
</li>
|
||||
</ol>
|
||||
</nav>
|
||||
</template>
|
||||
<script>
|
||||
export default {
|
||||
props:{
|
||||
routes:{
|
||||
type:Array,
|
||||
default:function(){
|
||||
return []
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
</script>
|
||||
|
||||
<style scoped>
|
||||
.model-breadcrumbs{
|
||||
padding:15px;
|
||||
border: 1px solid #dae1f2;
|
||||
font-size:16px;
|
||||
background: white;
|
||||
border-radius: 5px;
|
||||
width: 100%;
|
||||
box-sizing: border-box;
|
||||
color:#333;
|
||||
}
|
||||
</style>
|
||||
38
src/extend/components/drop-down.vue
Normal file
38
src/extend/components/drop-down.vue
Normal file
@@ -0,0 +1,38 @@
|
||||
<template>
|
||||
<el-dropdown @command="assignValue">
|
||||
<el-button size="mini">
|
||||
{{value.name}}<i class="el-icon-arrow-down el-icon--right"></i>
|
||||
</el-button>
|
||||
<el-dropdown-menu slot="dropdown">
|
||||
<el-dropdown-item :command="item" v-for="(item,index) in list" :key="item.code||index">{{item.name||1111}}</el-dropdown-item>
|
||||
</el-dropdown-menu>
|
||||
</el-dropdown>
|
||||
</template>
|
||||
<script>
|
||||
export default {
|
||||
props: {
|
||||
title: {
|
||||
type: String,
|
||||
default: 'drop down'
|
||||
},
|
||||
list: {
|
||||
type: Array,
|
||||
default: function () {
|
||||
return [];
|
||||
}
|
||||
},
|
||||
value:{
|
||||
type:Object,
|
||||
default:function(){
|
||||
return {};
|
||||
}
|
||||
}
|
||||
},
|
||||
methods:{
|
||||
assignValue:function(value){
|
||||
this.$emit('input',value)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
</script>
|
||||
32
src/extend/components/empty.vue
Normal file
32
src/extend/components/empty.vue
Normal file
@@ -0,0 +1,32 @@
|
||||
<template>
|
||||
<section class="model-empty" style="padding:30px;text-align:center;">
|
||||
<figure :class="`model-empty-figure ${type}`"></figure>
|
||||
<h2 style="font-size:14px;color:#999;font-weight:400;">{{title}}</h2>
|
||||
<slot></slot>
|
||||
</section>
|
||||
</template>
|
||||
<script>
|
||||
export default {
|
||||
props:{
|
||||
type:{
|
||||
type:String
|
||||
},
|
||||
title:{
|
||||
type:String,
|
||||
default:'还没有任何数据'
|
||||
}
|
||||
}
|
||||
}
|
||||
</script>
|
||||
<style scoped>
|
||||
.model-empty-figure{
|
||||
height:100px;
|
||||
background-repeat: no-repeat;
|
||||
background-position:center top;
|
||||
background-size:auto 100%;
|
||||
background-image: url('/static/img/nodata.png');
|
||||
}
|
||||
.model-empty-figure.call{
|
||||
background-image:url('/static/img/no-call.png');
|
||||
}
|
||||
</style>
|
||||
10
src/extend/components/header.vue
Normal file
10
src/extend/components/header.vue
Normal file
@@ -0,0 +1,10 @@
|
||||
<template>
|
||||
<div data-v-1aadaada="" class="table_tabs" style="justify-content: start;"><span data-v-1aadaada="">{{title}}</span></div>
|
||||
</template>
|
||||
<script>
|
||||
export default {
|
||||
props:{
|
||||
title:String
|
||||
}
|
||||
}
|
||||
</script>
|
||||
23
src/extend/components/lazy-loader.vue
Normal file
23
src/extend/components/lazy-loader.vue
Normal file
@@ -0,0 +1,23 @@
|
||||
<template>
|
||||
<div v-if="init||visible">
|
||||
<slot></slot>
|
||||
</div>
|
||||
</template>
|
||||
<script>
|
||||
export default {
|
||||
props:{
|
||||
visible:{
|
||||
type:Boolean,
|
||||
default:true
|
||||
}
|
||||
},
|
||||
data:function(){
|
||||
init:false
|
||||
},
|
||||
watch:{
|
||||
visible:function(value){
|
||||
if(value) this.init=true;
|
||||
}
|
||||
}
|
||||
}
|
||||
</script>
|
||||
83
src/extend/components/loading.vue
Normal file
83
src/extend/components/loading.vue
Normal file
@@ -0,0 +1,83 @@
|
||||
<template>
|
||||
<div style="position:relative;" :is="tag" v-if="successCode.indexOf(code-0)!==-1||code==-1"
|
||||
v-loading="animation?code==-1?true:false:false">
|
||||
<slot></slot>
|
||||
</div>
|
||||
<div :is="tag" v-else :class="`${position} model-loading`" style="background-color:#fff;">
|
||||
<div class="layout-td">
|
||||
<h2 style="font-size:16px;margin-bottom:.6em"><span>错误({{code}})</span></h2>
|
||||
<p>{{errorMessage}},
|
||||
<span class="cursor" style="color:#6896ff" @click="reload">刷新页面</span>,
|
||||
或者<span class="cursor" style="color:#6896ff" @click="$emit('reloading')">重新加载</span>
|
||||
</p>
|
||||
</div>
|
||||
</div>
|
||||
</template>
|
||||
<script>
|
||||
export default {
|
||||
props: {
|
||||
position: {
|
||||
type: String,
|
||||
default: ''
|
||||
},
|
||||
tag: {
|
||||
type: String,
|
||||
default: 'div'
|
||||
},
|
||||
code: {
|
||||
type: [String, Number],
|
||||
default: -1
|
||||
},
|
||||
successCode: {
|
||||
type: Array,
|
||||
default: function () {
|
||||
return [200, 10000, 304]
|
||||
}
|
||||
},
|
||||
message: {
|
||||
type: String,
|
||||
default: '服务器繁忙'
|
||||
},
|
||||
animation:{
|
||||
type:Boolean,
|
||||
default:true
|
||||
}
|
||||
},
|
||||
computed: {
|
||||
errorMessage: function () {
|
||||
return navigator.onLine ? '服务器繁忙' : '网络错误'
|
||||
}
|
||||
},
|
||||
data: function () {
|
||||
return {
|
||||
product: process.env.NODE_ENV === 'production'
|
||||
}
|
||||
},
|
||||
methods: {
|
||||
reload: function () {
|
||||
location.reload();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
</script>
|
||||
<style scoped>
|
||||
.model-loading {
|
||||
position: relative;
|
||||
flex-wrap: wrap;
|
||||
margin: 15px auto;
|
||||
padding: 15px;
|
||||
min-height: 50px;
|
||||
color: #999;
|
||||
font-size: 14px;
|
||||
text-align: center;
|
||||
background-color: #fff;
|
||||
}
|
||||
|
||||
.model-loading.middle {
|
||||
display: flex;
|
||||
align-items: center;
|
||||
justify-content: center;
|
||||
}
|
||||
|
||||
</style>
|
||||
3
src/extend/components/note.vue
Normal file
3
src/extend/components/note.vue
Normal file
@@ -0,0 +1,3 @@
|
||||
<template>
|
||||
<p style="font-size:12px;color:#999;margin:.4em auto;"><slot></slot></p>
|
||||
</template>
|
||||
92
src/extend/components/pagination.vue
Normal file
92
src/extend/components/pagination.vue
Normal file
@@ -0,0 +1,92 @@
|
||||
<template>
|
||||
<el-pagination
|
||||
:style="[style.original,style[type]]"
|
||||
:current-page.sync="currentPageSelf"
|
||||
:page-sizes="pageSizes" :page-size.sync="pageSizeSelf" :layout="layout" :total="total">
|
||||
</el-pagination>
|
||||
</template>
|
||||
<script>
|
||||
const pageSize =20;
|
||||
let style={
|
||||
original:{
|
||||
position:'static',
|
||||
transform:'translate(0,0)',
|
||||
textAlign:'center'
|
||||
},
|
||||
primary:{
|
||||
backgroundColor:'#fff',
|
||||
padding:'15px',
|
||||
border:'1px solid #EBEEF5',
|
||||
borderTop:0
|
||||
}
|
||||
};
|
||||
export default {
|
||||
props: {
|
||||
type:{
|
||||
type:String,
|
||||
default:'primary'
|
||||
},
|
||||
pageSizes: {
|
||||
type: Array,
|
||||
default: function () {
|
||||
return [1.5*pageSize, 2 * pageSize, 3 * pageSize, 5 * pageSize,10*pageSize]
|
||||
}
|
||||
},
|
||||
pageSize: {
|
||||
type: Number,
|
||||
default:1.5*pageSize
|
||||
},
|
||||
layout: {
|
||||
type: String,
|
||||
default: 'total,sizes,prev, pager, next, jumper'
|
||||
},
|
||||
total: {
|
||||
type: Number,
|
||||
default: 0
|
||||
},
|
||||
currentPage:{
|
||||
type: Number,
|
||||
default:1
|
||||
}
|
||||
},
|
||||
data:function(){
|
||||
return {
|
||||
style:style
|
||||
}
|
||||
},
|
||||
computed: {
|
||||
currentPageSelf: {
|
||||
get: function () {
|
||||
return this.currentPage
|
||||
},
|
||||
set: function (value){
|
||||
this.$emit('update:currentPage', value);
|
||||
}
|
||||
},
|
||||
pageSizeSelf:{
|
||||
get:function(){
|
||||
return this.pageSize
|
||||
},
|
||||
set:function(value){
|
||||
this.$emit('update:pageSize',value);
|
||||
}
|
||||
}
|
||||
},
|
||||
watch:{
|
||||
pageSize:function(){
|
||||
this.emitChange()
|
||||
},
|
||||
currentPage:function(){
|
||||
this.emitChange()
|
||||
}
|
||||
},
|
||||
methods:{
|
||||
emitChange:function(){
|
||||
clearTimeout(this.timerId);
|
||||
setTimeout(()=>{
|
||||
this.$emit('change',[this.currentPage,this.pageSize]);
|
||||
},80)
|
||||
}
|
||||
}
|
||||
}
|
||||
</script>
|
||||
22
src/extend/components/search-bar.vue
Normal file
22
src/extend/components/search-bar.vue
Normal file
@@ -0,0 +1,22 @@
|
||||
<template>
|
||||
<el-form style="background-color:#fdfdfe;padding:10px;" :inline="inline" :label-width="labelWidth">
|
||||
<slot></slot>
|
||||
<div class="layout-tr-between" style="width:100%;">
|
||||
<div><slot name="left"></slot></div>
|
||||
<div><slot name="right"></slot></div>
|
||||
</div>
|
||||
</el-form>
|
||||
</template>
|
||||
<script>
|
||||
export default {
|
||||
props:{
|
||||
labelWidth:{
|
||||
type:String
|
||||
},
|
||||
inline:{
|
||||
type:Boolean,
|
||||
default:true
|
||||
}
|
||||
}
|
||||
}
|
||||
</script>
|
||||
99
src/extend/directive/transferDom copy.js
Normal file
99
src/extend/directive/transferDom copy.js
Normal file
@@ -0,0 +1,99 @@
|
||||
// Thanks to: https://github.com/calebroseland/vue-dom-portal
|
||||
|
||||
/**
|
||||
* Get target DOM Node
|
||||
* @param {(Node|string|Boolean)} [node=document.body] DOM Node, CSS selector, or Boolean
|
||||
* @return {Node} The target that the el will be appended to
|
||||
*/
|
||||
function getTarget (node) {
|
||||
if (node === void 0) {
|
||||
return document.body
|
||||
}
|
||||
|
||||
if (typeof node === 'string' && node.indexOf('?') === 0) {
|
||||
return document.body
|
||||
} else if (typeof node === 'string' && node.indexOf('?') > 0) {
|
||||
node = node.split('?')[0]
|
||||
}
|
||||
|
||||
if (node === 'body' || node === true) {
|
||||
return document.body
|
||||
}
|
||||
|
||||
return node instanceof window.Node ? node : document.querySelector(node)
|
||||
}
|
||||
|
||||
function getShouldUpdate (node) {
|
||||
// do not updated by default
|
||||
if (!node) {
|
||||
return false
|
||||
}
|
||||
if (typeof node === 'string' && node.indexOf('?') > 0) {
|
||||
try {
|
||||
const config = JSON.parse(node.split('?')[1])
|
||||
return config.autoUpdate || false
|
||||
} catch (e) {
|
||||
return false
|
||||
}
|
||||
}
|
||||
return false
|
||||
}
|
||||
|
||||
const directive = {
|
||||
inserted (el, { value }, vnode) {
|
||||
el.className = el.className ? el.className + ' v-transfer-dom' : 'v-transfer-dom'
|
||||
const parentNode = el.parentNode
|
||||
var home = document.createComment('')
|
||||
var hasMovedOut = false
|
||||
|
||||
if (value !== false) {
|
||||
parentNode.replaceChild(home, el) // moving out, el is no longer in the document
|
||||
getTarget(value).appendChild(el) // moving into new place
|
||||
hasMovedOut = true
|
||||
}
|
||||
if (!el.__transferDomData) {
|
||||
el.__transferDomData = {
|
||||
parentNode: parentNode,
|
||||
home: home,
|
||||
target: getTarget(value),
|
||||
hasMovedOut: hasMovedOut
|
||||
}
|
||||
}
|
||||
},
|
||||
componentUpdated (el, { value }) {
|
||||
const shouldUpdate = getShouldUpdate(value)
|
||||
if (!shouldUpdate) {
|
||||
return
|
||||
}
|
||||
// need to make sure children are done updating (vs. `update`)
|
||||
var ref$1 = el.__transferDomData
|
||||
// homes.get(el)
|
||||
var parentNode = ref$1.parentNode
|
||||
var home = ref$1.home
|
||||
var hasMovedOut = ref$1.hasMovedOut // recall where home is
|
||||
|
||||
if (!hasMovedOut && value) {
|
||||
// remove from document and leave placeholder
|
||||
parentNode.replaceChild(home, el)
|
||||
// append to target
|
||||
getTarget(value).appendChild(el)
|
||||
el.__transferDomData = Object.assign({}, el.__transferDomData, { hasMovedOut: true, target: getTarget(value) })
|
||||
} else if (hasMovedOut && value === false) {
|
||||
// previously moved, coming back home
|
||||
parentNode.replaceChild(el, home)
|
||||
el.__transferDomData = Object.assign({}, el.__transferDomData, { hasMovedOut: false, target: getTarget(value) })
|
||||
} else if (value) {
|
||||
// already moved, going somewhere else
|
||||
getTarget(value).appendChild(el)
|
||||
}
|
||||
},
|
||||
unbind: function unbind (el, binding) {
|
||||
el.className = el.className.replace('v-transfer-dom', '')
|
||||
if (el.__transferDomData && el.__transferDomData.hasMovedOut === true) {
|
||||
el.__transferDomData.parentNode && el.__transferDomData.parentNode.appendChild(el)
|
||||
}
|
||||
el.__transferDomData = null
|
||||
}
|
||||
}
|
||||
|
||||
export default directive
|
||||
49
src/extend/directive/transferDom.js
Normal file
49
src/extend/directive/transferDom.js
Normal file
@@ -0,0 +1,49 @@
|
||||
function getTarget (node = document.body) {
|
||||
if (node === true) return document.body
|
||||
return node instanceof window.Node ? node : document.querySelector(node)
|
||||
}
|
||||
|
||||
const homes = new Map()
|
||||
|
||||
const directive = {
|
||||
inserted (el, { value }, vnode) {
|
||||
console.log('v-transfer-dom:inserted')
|
||||
const { parentNode } = el
|
||||
const home = document.createComment('')
|
||||
let hasMovedOut = false
|
||||
|
||||
if (value !== false) {
|
||||
parentNode&&parentNode.replaceChild(home, el) // moving out, el is no longer in the document
|
||||
getTarget(value).appendChild(el) // moving into new place
|
||||
hasMovedOut = true
|
||||
}
|
||||
|
||||
if (!homes.has(el)) homes.set(el, { parentNode, home, hasMovedOut }) // remember where home is or should be
|
||||
},
|
||||
componentUpdated (el, { value }) { // need to make sure children are done updating (vs. `update`)
|
||||
console.log('v-transfer-dom:componentUpdated')
|
||||
const { parentNode, home, hasMovedOut } = homes.get(el) // recall where home is
|
||||
|
||||
if (!hasMovedOut && value) {
|
||||
// remove from document and leave placeholder
|
||||
parentNode.replaceChild(home, el)
|
||||
// append to target
|
||||
getTarget(value).appendChild(el)
|
||||
|
||||
homes.set(el, Object.assign({}, homes.get(el), { hasMovedOut: true }))
|
||||
} else if (hasMovedOut && value === false) {
|
||||
// previously moved, coming back home
|
||||
parentNode.replaceChild(el, home)
|
||||
homes.set(el, Object.assign({}, homes.get(el), { hasMovedOut: false }))
|
||||
} else if (value) {
|
||||
// already moved, going somewhere else
|
||||
getTarget(value).appendChild(el)
|
||||
}
|
||||
},
|
||||
unbind (el, binding) {
|
||||
console.log('v-transfer-dom:unbind')
|
||||
el.parentNode.removeChild(el);
|
||||
homes.delete(el)
|
||||
}
|
||||
}
|
||||
export default directive
|
||||
56
src/extend/index.js
Normal file
56
src/extend/index.js
Normal file
@@ -0,0 +1,56 @@
|
||||
import vue from 'vue';
|
||||
// element-ui
|
||||
import ElementUI from 'element-ui';
|
||||
import 'element-ui/lib/theme-chalk/index.css';
|
||||
vue.use(ElementUI);
|
||||
|
||||
|
||||
import './js/utils';
|
||||
|
||||
import './js/filter';
|
||||
|
||||
//api
|
||||
import api from './api/api';
|
||||
vue.prototype.$api = api;
|
||||
|
||||
//message
|
||||
import './js/messageTip';
|
||||
|
||||
//localStorage
|
||||
import local from './js/localStorage';
|
||||
vue.prototype.$local = local;
|
||||
|
||||
import vaild from './../../static/js/vaild.js'
|
||||
vue.prototype.$vaild = vaild;
|
||||
|
||||
|
||||
// echarts from baidu
|
||||
//import echarts from 'echarts';
|
||||
//vue.prototype.$echarts = echarts;
|
||||
// components
|
||||
import loading from './components/loading';
|
||||
import dropDown from './components/drop-down';
|
||||
import empty from './components/empty';
|
||||
import pagination from './components/pagination';
|
||||
import ScrollBar from 'element-ui/lib/scrollbar';
|
||||
import modelNote from './components/note';
|
||||
|
||||
// import '../../static/umeditor/themes/default/css/umeditor.css';
|
||||
// import '../../static/umeditor/umeditor.config.js'
|
||||
// import '../../static/umeditor/umeditor.js'
|
||||
// import '../../static/umeditor/lang/zh-cn/zh-cn.js'
|
||||
// import UE from '../../static/umeditor/umeditor.vue';
|
||||
|
||||
import UE from "vue-ueditor-wrap";
|
||||
|
||||
vue.component("model-loading", loading);
|
||||
vue.component("model-drop-down", dropDown);
|
||||
vue.component("model-empty", empty);
|
||||
vue.component("model-pagination", pagination);
|
||||
vue.component("ScrollBar",ScrollBar);
|
||||
vue.component("model-note", modelNote);
|
||||
vue.component("UE",UE);
|
||||
|
||||
|
||||
|
||||
|
||||
137
src/extend/js/dateFormatUtil.js
Normal file
137
src/extend/js/dateFormatUtil.js
Normal file
@@ -0,0 +1,137 @@
|
||||
// 当前日期
|
||||
let now = new Date();
|
||||
// 今天本周的第几天
|
||||
let nowDayOfWeek = now.getDay();
|
||||
// 当前日
|
||||
let nowDay = now.getDate();
|
||||
// 当前月
|
||||
let nowMonth = now.getMonth();
|
||||
// 当前年
|
||||
let nowYear = now.getFullYear();
|
||||
nowYear += (nowYear < 2000) ? 1900 : 0;
|
||||
// 上月日期
|
||||
let lastMonthDate = new Date();
|
||||
lastMonthDate.setDate(1);
|
||||
lastMonthDate.setMonth(lastMonthDate.getMonth() - 1);
|
||||
let lastMonth = lastMonthDate.getMonth();
|
||||
// 日期格式化,时间戳 时分秒 hh:mm:ss
|
||||
export function formatTimeStamp(date, fmt = 'yyyy-MM-dd hh:mm:ss') {
|
||||
if(!date) {
|
||||
return '-';
|
||||
}
|
||||
date = new Date(date);
|
||||
if (/(y+)/.test(fmt)) {
|
||||
fmt = fmt.replace(RegExp.$1, (date.getFullYear() + '').substr(4 - RegExp.$1.length));
|
||||
}
|
||||
let o = {
|
||||
'M+': date.getMonth() + 1,
|
||||
'd+': date.getDate(),
|
||||
'h+': date.getHours(),
|
||||
'm+': date.getMinutes(),
|
||||
's+': date.getSeconds()
|
||||
};
|
||||
for (let k in o) {
|
||||
if (new RegExp(`(${k})`).test(fmt)) {
|
||||
let str = o[k] + '';
|
||||
fmt = fmt.replace(RegExp.$1, (RegExp.$1.length === 1) ? str : padLeftZero(str));
|
||||
}
|
||||
}
|
||||
return fmt;
|
||||
}
|
||||
function padLeftZero(str) {
|
||||
return ('00' + str).substr(str.length);
|
||||
}
|
||||
// 获取当前时间
|
||||
export function getNowDate() {
|
||||
return formatTimeStamp(new Date());
|
||||
}
|
||||
// 获得某月的天数
|
||||
export function getMonthDays(myMonth) {
|
||||
let monthStartDate = new Date(nowYear, myMonth, 1);
|
||||
let monthEndDate = new Date(nowYear, myMonth + 1, 1);
|
||||
let days = (monthEndDate - monthStartDate) / (1000 * 60 * 60 * 24);
|
||||
return days;
|
||||
}
|
||||
// 获得本季度的开始月份
|
||||
export function getQuarterStartMonth() {
|
||||
let quarterStartMonth = 0;
|
||||
if (nowMonth < 3) {
|
||||
quarterStartMonth = 0;
|
||||
}
|
||||
if (2 < nowMonth && nowMonth < 6) {
|
||||
quarterStartMonth = 3;
|
||||
}
|
||||
if (5 < nowMonth && nowMonth < 9) {
|
||||
quarterStartMonth = 6;
|
||||
}
|
||||
if (nowMonth > 8) {
|
||||
quarterStartMonth = 9;
|
||||
}
|
||||
return quarterStartMonth;
|
||||
}
|
||||
// 获得本周的开始日期
|
||||
export function getWeekStartDate() {
|
||||
let weekStartDate = new Date(nowYear, nowMonth, nowDay - nowDayOfWeek);
|
||||
return formatTimeStamp(weekStartDate);
|
||||
}
|
||||
// 获得本周的结束日期
|
||||
export function getWeekEndDate() {
|
||||
let weekEndDate = new Date(nowYear, nowMonth, nowDay + (6 - nowDayOfWeek));
|
||||
return formatTimeStamp(weekEndDate);
|
||||
}
|
||||
// 获得上周的开始日期
|
||||
export function getLastWeekStartDate() {
|
||||
let weekStartDate = new Date(nowYear, nowMonth, nowDay - nowDayOfWeek - 6);
|
||||
return formatTimeStamp(weekStartDate);
|
||||
}
|
||||
// 获得上周的结束日期
|
||||
export function getLastWeekEndDate() {
|
||||
let weekEndDate = new Date(nowYear, nowMonth, nowDay - nowDayOfWeek);
|
||||
return formatTimeStamp(weekEndDate);
|
||||
}
|
||||
// 获得本月的开始日期
|
||||
export function getMonthStartDate() {
|
||||
let monthStartDate = new Date(nowYear, nowMonth, 1);
|
||||
return formatTimeStamp(monthStartDate);
|
||||
}
|
||||
// 获得本月的当前日期
|
||||
export function getMonthCurrentDate() {
|
||||
let monthEndDate = new Date(nowYear, nowMonth, now.getDate());
|
||||
return formatTimeStamp(monthEndDate);
|
||||
}
|
||||
// 获得本月的结束日期
|
||||
export function getMonthEndDate() {
|
||||
let monthEndDate = new Date(nowYear, nowMonth, getMonthDays(nowMonth));
|
||||
return formatTimeStamp(monthEndDate);
|
||||
}
|
||||
// 获得上月开始时间
|
||||
export function getLastMonthStartDate() {
|
||||
let lastMonthStartDate = new Date(nowYear, lastMonth, 1);
|
||||
return formatTimeStamp(lastMonthStartDate);
|
||||
}
|
||||
// 获得上月结束时间
|
||||
export function getLastMonthEndDate() {
|
||||
let lastMonthEndDate = new Date(nowYear, lastMonth, getMonthDays(lastMonth));
|
||||
return formatTimeStamp(lastMonthEndDate);
|
||||
}
|
||||
// 获得上月当前时间
|
||||
export function getLastMonthCurrentDate() {
|
||||
let lastMonthCurrentDate = new Date(nowYear, lastMonth, now.getDate());
|
||||
return formatTimeStamp(lastMonthCurrentDate);
|
||||
}
|
||||
// 获得本季度的开始日期
|
||||
export function getQuarterStartDate() {
|
||||
let quarterStartDate = new Date(nowYear, getQuarterStartMonth(), 1);
|
||||
return formatTimeStamp(quarterStartDate);
|
||||
}
|
||||
// 或的本季度的结束日期
|
||||
export function getQuarterEndDate() {
|
||||
let quarterEndMonth = getQuarterStartMonth() + 2;
|
||||
let quarterStartDate = new Date(nowYear, quarterEndMonth, getMonthDays(quarterEndMonth));
|
||||
return formatTimeStamp(quarterStartDate);
|
||||
}
|
||||
// 当时时间减去天数
|
||||
export function getNowDateSubtraction(day) {
|
||||
let nowDateSubtraction = new Date().setDate((new Date().getDate() - day));
|
||||
return formatTimeStamp(nowDateSubtraction);
|
||||
}
|
||||
116
src/extend/js/filter.js
Normal file
116
src/extend/js/filter.js
Normal file
@@ -0,0 +1,116 @@
|
||||
import vue from 'vue';
|
||||
vue.filter("upcase", function (value) {
|
||||
var arr = ['一', '二', '三', '四', '五', '六', '七', '八', '九', '十']
|
||||
// value = arr[value];
|
||||
if (value <= 9) {
|
||||
value = arr[value];
|
||||
} else if (value == 19) {
|
||||
value = '二十'
|
||||
} else if (9 < value <= 18) {
|
||||
value = '十' + arr[value % 10]
|
||||
}
|
||||
// if (value >= 10) {
|
||||
// if (value % 10 == 0) {
|
||||
// value = arr[(value / 10) - 1] + '十'
|
||||
// } else {
|
||||
// value = arr[(value / 10) - 1] + '十' + arr[(value % 10) - 1]
|
||||
// }
|
||||
// }
|
||||
return value;
|
||||
});
|
||||
vue.filter('week', function (value) { // 时间转星期
|
||||
if (!value) return ''
|
||||
let date = new Date(value).getDay();
|
||||
//let weeks = new Array("Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday");
|
||||
let weeks = new Array("周日", "周一", "周二", "周三", "周四", "周五", "周六");
|
||||
return weeks[date];
|
||||
})
|
||||
//yyyy-MM-dd HH:mm:ss
|
||||
vue.filter("dateFormat", function (value) {
|
||||
if (value == null || value == '') return '-';
|
||||
value = new Date(value);
|
||||
return value.getFullYear() + (value.getMonth() + 1 > 9 ? "-" : "-0") + (value.getMonth() + 1) + (value.getDate() > 9 ? "-" : "-0") + value.getDate() + " " + (value.getHours() > 9 ? "" : "0") + value.getHours() + (value.getMinutes() > 9 ? ":" : ":0") + value.getMinutes() + (value.getSeconds() > 9 ? ":" : ":0") + value.getSeconds();
|
||||
});
|
||||
//yyyyMMddHHmmss
|
||||
vue.filter("dateFormat1", function (value) {
|
||||
if (value == null) return null;
|
||||
value = new Date(value);
|
||||
return value.getFullYear() + (value.getMonth() + 1 > 9 ? "" : "0") + (value.getMonth() + 1) + (value.getDate() > 9 ? "" : "0") + value.getDate() + "" + (value.getHours() > 9 ? "" : "0") + value.getHours() + (value.getMinutes() > 9 ? "" : "0") + value.getMinutes() + (value.getSeconds() > 9 ? "" : "0") + value.getSeconds();
|
||||
});
|
||||
//yyyy-MM-dd HH:mm
|
||||
vue.filter("dateMinuteFormat", function (value) {
|
||||
if (value == null) return null;
|
||||
value = new Date(value);
|
||||
return value.getFullYear() + (value.getMonth() + 1 > 9 ? "-" : "-0") + (value.getMonth() + 1) + (value.getDate() > 9 ? "-" : "-0") + value.getDate() + " " + (value.getHours() > 9 ? "" : "0") + value.getHours() + (value.getMinutes() > 9 ? ":" : ":0") + value.getMinutes();
|
||||
});
|
||||
//yyyy-MM-dd
|
||||
vue.filter("dateFormat2", function (value) {
|
||||
if (value == null) return null;
|
||||
value = new Date(value);
|
||||
return value.getFullYear() + (value.getMonth() + 1 > 9 ? "-" : "-0") + (value.getMonth() + 1) + (value.getDate() > 9 ? "-" : "-0") + value.getDate();
|
||||
});
|
||||
//yyyy-MM
|
||||
vue.filter("dateFormat3", function (value) {
|
||||
if (value == null) return null;
|
||||
value = new Date(value);
|
||||
return value.getFullYear() + (value.getMonth() + 1 > 9 ? "-" : "-0") + (value.getMonth() + 1);
|
||||
});
|
||||
//yyyy年MM月dd日
|
||||
vue.filter("dateFormat4", function (value) {
|
||||
if (value == null) return null;
|
||||
value = new Date(value);
|
||||
return value.getFullYear() + (value.getMonth() + 1 > 9 ? "年" : "年0") + (value.getMonth() + 1) + (value.getDate() > 9 ? "月" : "月0") + value.getDate() + "日";
|
||||
});
|
||||
|
||||
//null??"-"
|
||||
vue.filter("nullFormat", function (value) {
|
||||
return (value == null || value == undefined || value == '') ? "-" : value;
|
||||
});
|
||||
//0.00
|
||||
vue.filter("roundFormat", function (value) {
|
||||
if (value == null || isNaN(value)) return null;
|
||||
return value.toFixed(2);
|
||||
});
|
||||
//yyyy-MM-dd
|
||||
vue.filter("shortDateFormat", function (value) {
|
||||
if (value == null || value == '') return '-';
|
||||
value = new Date(value);
|
||||
return value.getFullYear() + (value.getMonth() + 1 > 9 ? "-" : "-0") + (value.getMonth() + 1) + (value.getDate() > 9 ? "-" : "-0") + value.getDate();
|
||||
});
|
||||
|
||||
//00:00:00
|
||||
vue.filter("shortTimeFormat", function (value) {
|
||||
if (value == null) return null;
|
||||
value = new Date(value);
|
||||
return (value.getHours() > 9 ? "" : "0") + value.getHours() + (value.getMinutes() > 9 ? ":" : ":0") + value.getMinutes() + (value.getSeconds() > 9 ? ":" : ":0") + value.getSeconds();
|
||||
});
|
||||
|
||||
//字数太多显示不全...
|
||||
vue.filter("partStringFormat", function (value, count = 10) {
|
||||
if (value == null) return null;
|
||||
if (value.length <= count) {
|
||||
return value;
|
||||
}
|
||||
if (value.length > count) {
|
||||
return value.substring(0, count) + '...'
|
||||
}
|
||||
});
|
||||
|
||||
//判断是否初始化时间字段,若是则返回空串
|
||||
vue.filter("iNitStringFormat", function (value) {
|
||||
if (value == "null") return null;
|
||||
if (value == "0001-01-01T00:00:00+08:00") {
|
||||
value = "";
|
||||
} else {
|
||||
value = new Date(value);
|
||||
value = value.getFullYear() + (value.getMonth() + 1 > 9 ? "-" : "-0") + (value.getMonth() + 1) + (value.getDate() > 9 ? "-" : "-0") + value.getDate() + " " + (value.getHours() > 9 ? "" : "0") + value.getHours() + (value.getMinutes() > 9 ? ":" : ":0") + value.getMinutes() + (value.getSeconds() > 9 ? ":" : ":0") + value.getSeconds();
|
||||
}
|
||||
return value;
|
||||
});
|
||||
|
||||
vue.filter("phoneHide", function (value) {
|
||||
if (isNaN(Number(value))) return value;
|
||||
if (!value) return '-';
|
||||
var rega = new RegExp("(\\w{3})\\w{" + (value.trim().length - 7) + "}(\\w{4})", "ig");
|
||||
return value = value.replace(rega, '$1****$2');
|
||||
});
|
||||
173
src/extend/js/localStorage.js
Normal file
173
src/extend/js/localStorage.js
Normal file
@@ -0,0 +1,173 @@
|
||||
|
||||
var _setCache=(str)=> {//1支持多用户登录同端,2处理个别浏览器缓存未清理干净
|
||||
let _managerId = 0
|
||||
_managerId=window.localStorage.getItem('unique_login');//唯一登录标识
|
||||
return `${str}_${_managerId}`
|
||||
};
|
||||
export default {
|
||||
setUserCache(data){//设置登录用户信息缓存
|
||||
let _unique_login=data.Manager.ID+data.Manager.Logincode
|
||||
let _cacheName=`etorcurrentuser_${_unique_login}`
|
||||
window.localStorage.setItem( _cacheName, JSON.stringify(data));
|
||||
window.localStorage.setItem('unique_login', _unique_login);
|
||||
window.localStorage.setItem("etorcurrentuser",JSON.stringify(data));//兼容未使用公共方法的页面
|
||||
},
|
||||
getUserByCache: function () {//获取用户信息缓存
|
||||
let _cacheName=_setCache("etorcurrentuser")
|
||||
var str= window.localStorage.getItem(_cacheName);
|
||||
return JSON.parse(str);
|
||||
},
|
||||
setMenus(data){
|
||||
let _cacheName="pmenus"
|
||||
window.localStorage.setItem( _cacheName, JSON.stringify(data));
|
||||
},
|
||||
getMenus(){
|
||||
let _cacheName="pmenus"
|
||||
var str= window.localStorage.getItem(_cacheName);
|
||||
return JSON.parse(str);
|
||||
},
|
||||
isRoot: function () {//是否超级管理员
|
||||
var currentUser=this.getUserByCache();
|
||||
var isRoot=currentUser.Manager.IsRootUser;
|
||||
return isRoot;
|
||||
},
|
||||
freshToken(type) {
|
||||
//刷新token
|
||||
// 0刷新过期时间,1刷新管理小区
|
||||
let etorcurrentuser=this.getUserByCache()
|
||||
newapi
|
||||
.AgainGetToken({ Token: etorcurrentuser.Token, Type: type })
|
||||
.then(res => {
|
||||
if (res.Code == 10000) {
|
||||
console.log(`刷新token成功`);
|
||||
etorcurrentuser.Token = res.Data;
|
||||
this.setUserCache(etorcurrentuser)
|
||||
}
|
||||
})
|
||||
.catch(res => { });
|
||||
},
|
||||
arr: [],
|
||||
dbclick: function (tag) {
|
||||
var img_obj = document.getElementsByClassName(tag);
|
||||
var body = document.getElementsByTagName("body")[0];
|
||||
var obj_arr = new Array();
|
||||
var img_arr = new Array();
|
||||
var nowindex = 0;
|
||||
for (var i = 0; i < img_obj.length; i++) {
|
||||
obj_arr.push(img_obj[i]);
|
||||
img_arr.push(img_obj[i].getAttribute("src"));
|
||||
img_obj[i].ondblclick = function () {
|
||||
var nowurl = this.getAttribute("src");
|
||||
//获取到当前点击是第几个元素
|
||||
for (var t = 0; t < img_arr.length; t++) {
|
||||
if (img_arr[t] == nowurl) nowindex = t;
|
||||
}
|
||||
var cover_div = document.createElement("div");
|
||||
var center_div = document.createElement("div");
|
||||
var img_box = document.createElement("div");
|
||||
var leftspan = document.createElement("span");
|
||||
var rightspan = document.createElement("span");
|
||||
|
||||
cover_div.className = "cover-div";
|
||||
center_div.className = "center-div";
|
||||
img_box.className = "readimg_box";
|
||||
leftspan.className = "leftspan";
|
||||
rightspan.className = "rightspan";
|
||||
|
||||
center_div.appendChild(img_box);
|
||||
body.appendChild(cover_div);
|
||||
body.appendChild(center_div);
|
||||
body.appendChild(leftspan);
|
||||
body.appendChild(rightspan);
|
||||
//外层div点击的时候,删除
|
||||
cover_div.onclick = function () {
|
||||
body.removeChild(cover_div);
|
||||
body.removeChild(leftspan);
|
||||
body.removeChild(rightspan);
|
||||
body.removeChild(center_div);
|
||||
center_div.removeChild(img_box);
|
||||
};
|
||||
//添加图片
|
||||
|
||||
for (var n = 0; n < img_arr.length; n++) {
|
||||
var oimg = document.createElement("img");
|
||||
oimg.className = "img_cover";
|
||||
oimg.src = img_arr[n];
|
||||
img_box.appendChild(oimg);
|
||||
}
|
||||
img_box.style.marginLeft = -nowindex * 500 + "px";
|
||||
rightspan.onclick = function () {
|
||||
nowindex++;
|
||||
if (nowindex >= img_arr.length - 1) {
|
||||
nowindex = img_arr.length - 1;
|
||||
}
|
||||
img_box.style.marginLeft = -nowindex * 500 + "px";
|
||||
};
|
||||
leftspan.onclick = function () {
|
||||
//console.log(img_arr.length - 1);
|
||||
//console.log(nowindex);
|
||||
nowindex--;
|
||||
if (nowindex <= 0) {
|
||||
nowindex = 0;
|
||||
}
|
||||
|
||||
img_box.style.marginLeft = -nowindex * 500 + "px";
|
||||
};
|
||||
};
|
||||
}
|
||||
},
|
||||
uploadimg: function () {
|
||||
var input = document.createElement("input");
|
||||
input.setAttribute("type", "file");
|
||||
var event = document.createEvent("MouseEvents");
|
||||
event.initMouseEvent(
|
||||
"click",
|
||||
false,
|
||||
true,
|
||||
window,
|
||||
0,
|
||||
0,
|
||||
0,
|
||||
0,
|
||||
0,
|
||||
false,
|
||||
false,
|
||||
true,
|
||||
false,
|
||||
0,
|
||||
null
|
||||
);
|
||||
input.dispatchEvent(event);
|
||||
// this.makebase64()
|
||||
var that = this;
|
||||
// console.log(that.makebase64)
|
||||
input.onchange = function (e) {
|
||||
var f = input.files[0];
|
||||
console.log("e");
|
||||
console.log(e);
|
||||
console.log("input.files");
|
||||
console.log(f.name);
|
||||
console.log(f.size / 1024);
|
||||
// if(f.name)
|
||||
if (f.size / 1024 > 2048) {
|
||||
// alert('图片大小不能超过2m')
|
||||
// Message({
|
||||
// type: 'error',
|
||||
// message: '图片大小不能超过2m'
|
||||
// })
|
||||
return;
|
||||
}
|
||||
var reader = new FileReader();
|
||||
console.log("reader1");
|
||||
console.log(reader);
|
||||
reader.readAsDataURL(f);
|
||||
console.log("reader");
|
||||
console.log(reader);
|
||||
reader.onloadend = function (e) {
|
||||
e = window.event || e;
|
||||
|
||||
var imgbase = e.target.result;
|
||||
};
|
||||
};
|
||||
}
|
||||
};
|
||||
2149
src/extend/js/menus.js
Normal file
2149
src/extend/js/menus.js
Normal file
File diff suppressed because it is too large
Load Diff
27
src/extend/js/messageTip.js
Normal file
27
src/extend/js/messageTip.js
Normal file
@@ -0,0 +1,27 @@
|
||||
import vue from 'vue';
|
||||
vue.prototype.$error = function(text){
|
||||
this.$message({
|
||||
type: "error",
|
||||
message: text
|
||||
})
|
||||
}
|
||||
|
||||
vue.prototype.$info = function(text){
|
||||
this.$message({
|
||||
type: "info",
|
||||
message: text
|
||||
})
|
||||
}
|
||||
|
||||
vue.prototype.$warn = function(text){
|
||||
this.$message({
|
||||
type: "warning",
|
||||
message: text
|
||||
})
|
||||
}
|
||||
vue.prototype.$success = function(text){
|
||||
this.$message({
|
||||
type: "success",
|
||||
message: text
|
||||
})
|
||||
}
|
||||
234
src/extend/js/newMenus.js
Normal file
234
src/extend/js/newMenus.js
Normal file
@@ -0,0 +1,234 @@
|
||||
export var menus = [
|
||||
{
|
||||
"Id": 1,
|
||||
"Permissionlabel": "概况总览",
|
||||
"Permissionurl": "/store/index",
|
||||
"Icon": "icon-gaikuang",
|
||||
},
|
||||
{
|
||||
"Id": 2,
|
||||
"Permissionlabel": "店铺管理",
|
||||
"Permissionurl": "",
|
||||
"Icon": "icon-zhuangxiu",
|
||||
"Children": [
|
||||
{
|
||||
"Id": 23,
|
||||
"Permissionlabel": "设计",
|
||||
"Permissionurl": "/d",
|
||||
"target":"_blank"
|
||||
},
|
||||
{
|
||||
"Id": 23,
|
||||
"Permissionlabel": "设置",
|
||||
"Permissionurl": "/store/setting",
|
||||
}]
|
||||
},
|
||||
{
|
||||
"Id": 5,
|
||||
"Permissionlabel": "课程管理",
|
||||
"Permissionurl": "",
|
||||
"Icon": "icon-kecheng" ,
|
||||
"Children": [
|
||||
{
|
||||
"Id": 23,
|
||||
"Permissionlabel": "录播课程",
|
||||
"Permissionurl": "/course/list",
|
||||
},
|
||||
{
|
||||
"Id": 23,
|
||||
"Permissionlabel": "直播课程",
|
||||
"Permissionurl": "/course/live",
|
||||
},
|
||||
{
|
||||
"Id": 23,
|
||||
"Permissionlabel": "课程套餐",
|
||||
"Permissionurl": "/course/package",
|
||||
},
|
||||
{
|
||||
"Id": 10049,
|
||||
"Permissionlabel": "音视频库",
|
||||
"Permissionurl": "/course/asset",
|
||||
},
|
||||
{
|
||||
"Id": 10093,
|
||||
"Permissionlabel": "课程评论",
|
||||
"Permissionurl": "/course/comment",
|
||||
"Icon": "icon-fuwuguanli",
|
||||
"Iconactivate": "icon-fuwuguanli_xuanzhong",
|
||||
},
|
||||
{
|
||||
"Id": 10050,
|
||||
"Permissionlabel": "学习记录",
|
||||
"Permissionurl": "/course/learn",
|
||||
},
|
||||
]
|
||||
},
|
||||
{
|
||||
"Id": 5,
|
||||
"Permissionlabel": "题库管理",
|
||||
"Permissionurl": "",
|
||||
"Icon": "icon-zhuxue",
|
||||
"Children": [
|
||||
{
|
||||
"Id": 23,
|
||||
"Permissionlabel": "科目",
|
||||
"Permissionurl": "/questions/subject",
|
||||
},
|
||||
{
|
||||
"Id": 23,
|
||||
"Permissionlabel": "考点",
|
||||
"Permissionurl": "/questions/examsite",
|
||||
},
|
||||
{
|
||||
"Id": 10049,
|
||||
"Permissionlabel": "试题",
|
||||
"Permissionurl": "/questions/question",
|
||||
},
|
||||
{
|
||||
"Id": 10093,
|
||||
"Permissionlabel": "试卷",
|
||||
"Permissionurl": "/questions/paper",
|
||||
"Icon": "icon-fuwuguanli",
|
||||
"Iconactivate": "icon-fuwuguanli_xuanzhong",
|
||||
},
|
||||
{
|
||||
"Id": 10050,
|
||||
"Permissionlabel": "考试",
|
||||
"Permissionurl": "/questions/exam",
|
||||
},
|
||||
]
|
||||
},
|
||||
{
|
||||
"Id": 30001,
|
||||
"Permissionlabel": "订单管理",
|
||||
"Permissionurl": "",
|
||||
"Icon": "icon-shuju",
|
||||
"Children": [
|
||||
{
|
||||
"Id": 10099,
|
||||
"Permissionlabel": "订单概况",
|
||||
"Permissionurl": "/order/index",
|
||||
"Icon": "icon-shebeiguanli",
|
||||
"Iconactivate": "icon-shebeiguanli_xuanzhong",
|
||||
},
|
||||
|
||||
{
|
||||
"Id": 10099,
|
||||
"Permissionlabel": "课程订单",
|
||||
"Permissionurl": "/order/courseorder",
|
||||
"Icon": "icon-shebeiguanli",
|
||||
"Iconactivate": "icon-shebeiguanli_xuanzhong",
|
||||
},
|
||||
{
|
||||
"Id": 10053,
|
||||
"Permissionlabel": "套餐订单",
|
||||
"Permissionurl": "/order/packageorder",
|
||||
"Icon": null,
|
||||
|
||||
},
|
||||
{
|
||||
"Id": 10054,
|
||||
"Permissionlabel": "拼团订单",
|
||||
"Permissionurl": "/order/grouporder",
|
||||
},
|
||||
{
|
||||
"Id": 10100,
|
||||
"Permissionlabel": "直播订单",
|
||||
"Permissionurl": "/order/liveorder",
|
||||
},
|
||||
{
|
||||
"Id": 10100,
|
||||
"Permissionlabel": "题库订单",
|
||||
"Permissionurl": "/order/questionorder",
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"Id": 3,
|
||||
"Permissionlabel": "营销中心",
|
||||
"Permissionurl": "",
|
||||
"Icon": "icon-zhuxue",
|
||||
"Children": [
|
||||
{
|
||||
"Id": 138,
|
||||
"Permissionlabel": "推销员",
|
||||
"Permissionurl": "/sell/seller",
|
||||
},
|
||||
{
|
||||
"Id": 10159,
|
||||
"Permissionlabel": "兑换码",
|
||||
"Permissionurl": "/sell/redeemcode",
|
||||
},
|
||||
{
|
||||
"Id": 12,
|
||||
"Permissionlabel": "优惠券",
|
||||
"Permissionurl": "/sell/coupon",
|
||||
},
|
||||
{
|
||||
"Id": 12,
|
||||
"Permissionlabel": "吸粉器",
|
||||
"Permissionurl": "/sell/fans",
|
||||
},
|
||||
{
|
||||
"Id": 10056,
|
||||
"Permissionlabel": "支付有礼",
|
||||
"Permissionurl": "/sell/payaward",
|
||||
},
|
||||
{
|
||||
"Id": 138,
|
||||
"Permissionlabel": "弹窗广告",
|
||||
"Permissionurl": "/sell/popad",
|
||||
},
|
||||
{
|
||||
"Id": 138,
|
||||
"Permissionlabel": "好友助力",
|
||||
"Permissionurl": "/sell/help",
|
||||
},
|
||||
{
|
||||
"Id": 138,
|
||||
"Permissionlabel": "限时折扣",
|
||||
"Permissionurl": "/sell/timediscount",
|
||||
} ,
|
||||
{
|
||||
"Id": 138,
|
||||
"Permissionlabel": "裂变海报",
|
||||
"Permissionurl": "/sell/fission",
|
||||
} ,
|
||||
{
|
||||
"Id": 10159,
|
||||
"Permissionlabel": "工具",
|
||||
"Permissionurl": "/sell/index",
|
||||
},
|
||||
]
|
||||
},
|
||||
{
|
||||
"Id": 9999,
|
||||
"Permissionlabel": "设置",
|
||||
"Permissionurl": "",
|
||||
"Icon": "icon-shezhi",
|
||||
"Children": [
|
||||
{
|
||||
"Id": 10042,
|
||||
"Permissionlabel": "员工管理",
|
||||
"Permissionurl": "/setting/managerlist",
|
||||
},
|
||||
{
|
||||
"Id": 22,
|
||||
"Permissionlabel": "系统通知",
|
||||
"Permissionurl": "/setting/sysNotice",
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"Id": 3,
|
||||
"Permissionlabel": "资讯管理",
|
||||
"Permissionurl": "/article/list",
|
||||
"Icon": "icon-jiaoyi"
|
||||
},
|
||||
{
|
||||
"Id": 10000,
|
||||
"Permissionlabel": "用户中心",
|
||||
"Permissionurl": "users",
|
||||
"Icon": "icon-yonghu",
|
||||
}
|
||||
]
|
||||
25
src/extend/js/permission.js
Normal file
25
src/extend/js/permission.js
Normal file
@@ -0,0 +1,25 @@
|
||||
import Vue from 'vue';
|
||||
|
||||
function getPermission(permission, permissionObj) {
|
||||
if (!permissionObj) return true;
|
||||
|
||||
if (permission instanceof Array) return permission.find(item => {
|
||||
return permissionObj[item]
|
||||
});
|
||||
return permissionObj[permission];
|
||||
}
|
||||
|
||||
function permissionInit(value) {
|
||||
let items = ['AllowView', 'AllowAdd', 'AllowEdit', 'AllowDel'];
|
||||
let _items = ['allowView', 'allowAdd', 'allowEdit', 'allowDel'];
|
||||
let permission = [];
|
||||
items.forEach(function (item) {
|
||||
permission.push(getPermission(item,value));
|
||||
});
|
||||
permission.forEach(function (item, index) {
|
||||
Vue.prototype[_items[index]] = item;
|
||||
// console.log(_items[index], item);
|
||||
});
|
||||
|
||||
}
|
||||
export default permissionInit
|
||||
15
src/extend/js/treeDataTransfer.js
Normal file
15
src/extend/js/treeDataTransfer.js
Normal file
@@ -0,0 +1,15 @@
|
||||
export default function convertTree(root) {
|
||||
var that=this;
|
||||
var newRoot=root.Data;
|
||||
if(root.Children&&root.Children.length>0){
|
||||
var children=[];
|
||||
root.Children.forEach(function (child){
|
||||
var newChild=convertTree(child);
|
||||
children.push(newChild);
|
||||
});
|
||||
newRoot.children=children
|
||||
}else{
|
||||
newRoot.children=[];
|
||||
}
|
||||
return newRoot;
|
||||
}
|
||||
156
src/extend/js/utils.js
Normal file
156
src/extend/js/utils.js
Normal file
@@ -0,0 +1,156 @@
|
||||
import vue from "vue";
|
||||
import {
|
||||
MessageBox
|
||||
} from 'element-ui';
|
||||
|
||||
vue.prototype.$makeSure = function (fn, message, title) {
|
||||
try {
|
||||
message = message || '您确定要执行此操作吗';
|
||||
title = title || '温馨提示';
|
||||
MessageBox.confirm(message, title).then(() => {
|
||||
fn();
|
||||
}).catch(() => {});
|
||||
} catch (e) {
|
||||
debugger
|
||||
}
|
||||
};
|
||||
//vue.prototype.$upload = http_upload_picture; //global variable
|
||||
vue.prototype.$getPageSize = function (num) {
|
||||
var winHeight = document.documentElement.clientHeight;
|
||||
// 菜单高62 分页72 page_content的上下padding合30 表头高44 其他内容占据高度num
|
||||
var size = parseInt((winHeight - 62 - 44 - 72 - 30 - num) / 44);
|
||||
size = size <= 1 ? 1 : size
|
||||
//三目运算的判断
|
||||
return size;
|
||||
};
|
||||
vue.prototype.$getStyleHeight = function (num, flag=true) {
|
||||
var winHeight = document.documentElement.clientHeight;
|
||||
|
||||
// 菜单高62 page_content的上下padding合30 其他内容占据高度num
|
||||
var size = parseInt(winHeight - 56 - 15 - num)
|
||||
if (flag) {
|
||||
return {
|
||||
'height': size + 'px',
|
||||
}
|
||||
} else {
|
||||
return {
|
||||
'min-height': size + 'px',
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
vue.prototype.$getHeight = function (num, flag) {
|
||||
var winHeight = document.documentElement.clientHeight;
|
||||
var size = parseInt(winHeight - 62 - 30 - num)
|
||||
size < 0 && (size = 0);
|
||||
return size + 'px';
|
||||
};
|
||||
|
||||
vue.prototype.$addstyle = function (arr, id) {
|
||||
arr.forEach(element => {
|
||||
var link = document.createElement('link');
|
||||
link.setAttribute("rel", "stylesheet");
|
||||
link.setAttribute("id", id);
|
||||
link.href = element;
|
||||
document.getElementsByTagName("head")[0].appendChild(link)
|
||||
}, this);
|
||||
};
|
||||
|
||||
vue.prototype.$addscript = function (url, callback) {
|
||||
var head = document.getElementsByTagName("head")[0];
|
||||
// arr.forEach(element => {
|
||||
var script = document.createElement('script');
|
||||
script.setAttribute('style', 'type/javascript');
|
||||
script.setAttribute('id', 'echarts2');
|
||||
script.src = url;
|
||||
head.appendChild(script)
|
||||
if (typeof (callback) != "undefined") {
|
||||
if (script.readyState) {
|
||||
script.onreadystatechange = function () {
|
||||
if (script.readyState == "loaded" || script.readyState == "complete") {
|
||||
script.onreadystatechange = null;
|
||||
callback();
|
||||
}
|
||||
};
|
||||
} else {
|
||||
script.onload = function () {
|
||||
callback();
|
||||
};
|
||||
}
|
||||
}
|
||||
// }, this)
|
||||
};
|
||||
//获取本日、本周、本月、本年的时间
|
||||
vue.prototype.$getTime = (idx) => {
|
||||
!idx && (idx = 0);
|
||||
let date = new Date(new Date().setHours(23, 59, 59, 0));
|
||||
let year = date.getFullYear(),
|
||||
month = date.getMonth() + 1,
|
||||
day = date.getDate();
|
||||
switch (idx) {
|
||||
case 0: //本日
|
||||
return [new Date(year, month, day), date]
|
||||
case 1: //本周
|
||||
let week = date.getDay();
|
||||
week == 0 && (week = 7);
|
||||
let time = new Date(new Date().setHours(0, 0, 0, 0));
|
||||
time.setDate(day - week + 1);
|
||||
return [new Date(time), date]
|
||||
case 2: //本月
|
||||
return [new Date(year, month, '1'), date]
|
||||
case 3: //本年
|
||||
return [new Date(year + '-01-01'), date]
|
||||
}
|
||||
};
|
||||
vue.prototype.empty = '--';
|
||||
vue.prototype.maxPageSize = 2000;
|
||||
vue.prototype.camelCase=function(str='none',smallCamelCase=true){
|
||||
str=str.toString();
|
||||
if(str.toLowerCase()=='id') return smallCamelCase?'id':'ID';
|
||||
return smallCamelCase?str[0].toLowerCase()+str.slice(1):str[0].toUpperCase()+str.slice(1);
|
||||
};
|
||||
vue.prototype.camelCaseData=function(data,smallCamelCase=true){
|
||||
let agent={};
|
||||
let that=this;
|
||||
Object.keys(data).forEach(function(key){
|
||||
agent[that.camelCase(key,smallCamelCase)]=data[key];
|
||||
});
|
||||
return agent;
|
||||
}
|
||||
vue.prototype.$uuid=function(length){
|
||||
return Number(Math.random().toString().substr(3,length) + Date.now()).toString(36);
|
||||
}
|
||||
|
||||
String.prototype.toJson = function () {
|
||||
return JSON.parse(this);
|
||||
}
|
||||
String.prototype.isEmpty = function () {
|
||||
if (this == null || this == undefined || this.trim() == "") {
|
||||
return true;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
String.prototype.DateFormat = function (fmt) {
|
||||
var dt = new Date(this);
|
||||
return dt.Format(fmt);
|
||||
}
|
||||
Date.prototype.Format = function (fmt) { //author: meizz
|
||||
var o = {
|
||||
"M+": this.getMonth() + 1, //月份
|
||||
"d+": this.getDate(), //日
|
||||
"h+": this.getHours(), //小时
|
||||
"m+": this.getMinutes(), //分
|
||||
"s+": this.getSeconds(), //秒
|
||||
"q+": Math.floor((this.getMonth() + 3) / 3), //季度
|
||||
"S": this.getMilliseconds() //毫秒
|
||||
};
|
||||
if (/(y+)/.test(fmt))
|
||||
fmt = fmt.replace(RegExp.$1, (this.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;
|
||||
}
|
||||
Window.prototype.clone=function(data){
|
||||
return JSON.parse(JSON.stringify(data));
|
||||
}
|
||||
179
src/extend/lib/filesaver.js
Normal file
179
src/extend/lib/filesaver.js
Normal file
@@ -0,0 +1,179 @@
|
||||
/* FileSaver.js
|
||||
* A saveAs() FileSaver implementation.
|
||||
* 1.3.5
|
||||
* 2018-01-22 15:49:54
|
||||
*
|
||||
* By Eli Grey, https://eligrey.com
|
||||
* License: MIT
|
||||
* See https://github.com/eligrey/FileSaver.js/blob/master/LICENSE.md
|
||||
*/
|
||||
|
||||
/*global self */
|
||||
/*jslint bitwise: true, indent: 4, laxbreak: true, laxcomma: true, smarttabs: true, plusplus: true */
|
||||
|
||||
/*! @source http://purl.eligrey.com/github/FileSaver.js/blob/master/src/FileSaver.js */
|
||||
|
||||
var saveAs = saveAs || (function(view) {
|
||||
"use strict";
|
||||
// IE <10 is explicitly unsupported
|
||||
if (typeof view === "undefined" || typeof navigator !== "undefined" && /MSIE [1-9]\./.test(navigator.userAgent)) {
|
||||
return;
|
||||
}
|
||||
var
|
||||
doc = view.document
|
||||
// only get URL when necessary in case Blob.js hasn't overridden it yet
|
||||
, get_URL = function() {
|
||||
return view.URL || view.webkitURL || view;
|
||||
}
|
||||
, save_link = doc.createElementNS("http://www.w3.org/1999/xhtml", "a")
|
||||
, can_use_save_link = "download" in save_link
|
||||
, click = function(node) {
|
||||
var event = new MouseEvent("click");
|
||||
node.dispatchEvent(event);
|
||||
}
|
||||
, is_safari = /constructor/i.test(view.HTMLElement) || view.safari
|
||||
, is_chrome_ios =/CriOS\/[\d]+/.test(navigator.userAgent)
|
||||
, throw_outside = function(ex) {
|
||||
(view.setImmediate || view.setTimeout)(function() {
|
||||
throw ex;
|
||||
}, 0);
|
||||
}
|
||||
, force_saveable_type = "application/octet-stream"
|
||||
// the Blob API is fundamentally broken as there is no "downloadfinished" event to subscribe to
|
||||
, arbitrary_revoke_timeout = 1000 * 40 // in ms
|
||||
, revoke = function(file) {
|
||||
var revoker = function() {
|
||||
if (typeof file === "string") { // file is an object URL
|
||||
get_URL().revokeObjectURL(file);
|
||||
} else { // file is a File
|
||||
file.remove();
|
||||
}
|
||||
};
|
||||
setTimeout(revoker, arbitrary_revoke_timeout);
|
||||
}
|
||||
, dispatch = function(filesaver, event_types, event) {
|
||||
event_types = [].concat(event_types);
|
||||
var i = event_types.length;
|
||||
while (i--) {
|
||||
var listener = filesaver["on" + event_types[i]];
|
||||
if (typeof listener === "function") {
|
||||
try {
|
||||
listener.call(filesaver, event || filesaver);
|
||||
} catch (ex) {
|
||||
throw_outside(ex);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
, auto_bom = function(blob) {
|
||||
// prepend BOM for UTF-8 XML and text/* types (including HTML)
|
||||
// note: your browser will automatically convert UTF-16 U+FEFF to EF BB BF
|
||||
if (/^\s*(?:text\/\S*|application\/xml|\S*\/\S*\+xml)\s*;.*charset\s*=\s*utf-8/i.test(blob.type)) {
|
||||
return new Blob([String.fromCharCode(0xFEFF), blob], {type: blob.type});
|
||||
}
|
||||
return blob;
|
||||
}
|
||||
, FileSaver = function(blob, name, no_auto_bom) {
|
||||
if (!no_auto_bom) {
|
||||
blob = auto_bom(blob);
|
||||
}
|
||||
// First try a.download, then web filesystem, then object URLs
|
||||
var
|
||||
filesaver = this
|
||||
, type = blob.type
|
||||
, force = type === force_saveable_type
|
||||
, object_url
|
||||
, dispatch_all = function() {
|
||||
dispatch(filesaver, "writestart progress write writeend".split(" "));
|
||||
}
|
||||
// on any filesys errors revert to saving with object URLs
|
||||
, fs_error = function() {
|
||||
if ((is_chrome_ios || (force && is_safari)) && view.FileReader) {
|
||||
// Safari doesn't allow downloading of blob urls
|
||||
var reader = new FileReader();
|
||||
reader.onloadend = function() {
|
||||
var url = is_chrome_ios ? reader.result : reader.result.replace(/^data:[^;]*;/, 'data:attachment/file;');
|
||||
var popup = view.open(url, '_blank');
|
||||
if(!popup) view.location.href = url;
|
||||
url=undefined; // release reference before dispatching
|
||||
filesaver.readyState = filesaver.DONE;
|
||||
dispatch_all();
|
||||
};
|
||||
reader.readAsDataURL(blob);
|
||||
filesaver.readyState = filesaver.INIT;
|
||||
return;
|
||||
}
|
||||
// don't create more object URLs than needed
|
||||
if (!object_url) {
|
||||
object_url = get_URL().createObjectURL(blob);
|
||||
}
|
||||
if (force) {
|
||||
view.location.href = object_url;
|
||||
} else {
|
||||
var opened = view.open(object_url, "_blank");
|
||||
if (!opened) {
|
||||
// Apple does not allow window.open, see https://developer.apple.com/library/safari/documentation/Tools/Conceptual/SafariExtensionGuide/WorkingwithWindowsandTabs/WorkingwithWindowsandTabs.html
|
||||
view.location.href = object_url;
|
||||
}
|
||||
}
|
||||
filesaver.readyState = filesaver.DONE;
|
||||
dispatch_all();
|
||||
revoke(object_url);
|
||||
}
|
||||
;
|
||||
filesaver.readyState = filesaver.INIT;
|
||||
|
||||
if (can_use_save_link) {
|
||||
object_url = get_URL().createObjectURL(blob);
|
||||
setTimeout(function() {
|
||||
save_link.href = object_url;
|
||||
save_link.download = name;
|
||||
click(save_link);
|
||||
dispatch_all();
|
||||
revoke(object_url);
|
||||
filesaver.readyState = filesaver.DONE;
|
||||
});
|
||||
return;
|
||||
}
|
||||
|
||||
fs_error();
|
||||
}
|
||||
, FS_proto = FileSaver.prototype
|
||||
, saveAs = function(blob, name, no_auto_bom) {
|
||||
return new FileSaver(blob, name || blob.name || "download", no_auto_bom);
|
||||
}
|
||||
;
|
||||
// IE 10+ (native saveAs)
|
||||
if (typeof navigator !== "undefined" && navigator.msSaveOrOpenBlob) {
|
||||
return function(blob, name, no_auto_bom) {
|
||||
name = name || blob.name || "download";
|
||||
|
||||
if (!no_auto_bom) {
|
||||
blob = auto_bom(blob);
|
||||
}
|
||||
return navigator.msSaveOrOpenBlob(blob, name);
|
||||
};
|
||||
}
|
||||
|
||||
FS_proto.abort = function(){};
|
||||
FS_proto.readyState = FS_proto.INIT = 0;
|
||||
FS_proto.WRITING = 1;
|
||||
FS_proto.DONE = 2;
|
||||
|
||||
FS_proto.error =
|
||||
FS_proto.onwritestart =
|
||||
FS_proto.onprogress =
|
||||
FS_proto.onwrite =
|
||||
FS_proto.onabort =
|
||||
FS_proto.onerror =
|
||||
FS_proto.onwriteend =
|
||||
null;
|
||||
|
||||
return saveAs;
|
||||
}(
|
||||
typeof self !== "undefined" && self
|
||||
|| typeof window !== "undefined" && window
|
||||
|| this
|
||||
));
|
||||
|
||||
export default saveAs;
|
||||
23
src/extend/vuex/index.js
Normal file
23
src/extend/vuex/index.js
Normal file
@@ -0,0 +1,23 @@
|
||||
import Vue from 'vue'
|
||||
import Vuex from 'vuex'
|
||||
|
||||
Vue.use(Vuex)
|
||||
|
||||
export default new Vuex.Store({
|
||||
state:{
|
||||
userInfo:null,
|
||||
currentNav:'首页',
|
||||
menus:[],
|
||||
},
|
||||
mutations:{
|
||||
updateUserInfo:function(state, data) {
|
||||
state.userInfo = data;
|
||||
},
|
||||
setCurrentNav:function(state,data){
|
||||
state.currentNav=data;
|
||||
},
|
||||
setMnus:function(state,data){
|
||||
state.menus=data;
|
||||
}
|
||||
}
|
||||
})
|
||||
Reference in New Issue
Block a user