初始提交

This commit is contained in:
wanyongkang
2020-10-04 10:30:08 +08:00
commit 3193537726
441 changed files with 171716 additions and 0 deletions

338
src/extend/api/api.js Normal file
View 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
View 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
View 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
};

View 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>

View 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>

View 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>

View 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>

View 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>

View 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>

View File

@@ -0,0 +1,3 @@
<template>
<p style="font-size:12px;color:#999;margin:.4em auto;"><slot></slot></p>
</template>

View 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>

View 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>

View 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

View 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
View 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);

View 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
View 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');
});

View 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

File diff suppressed because it is too large Load Diff

View 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
View 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",
}
]

View 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

View 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
View 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
View 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
View 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;
}
}
})