构建框架

This commit is contained in:
龙运模
2024-06-24 18:52:21 +08:00
commit 33942cbe95
328 changed files with 50716 additions and 0 deletions
+29
View File
@@ -0,0 +1,29 @@
export default {
//hex颜色转rgb颜色
HexToRgb(str) {
str = str.replace("#", "")
var hxs = str.match(/../g)
for (var i = 0; i < 3; i++) hxs[i] = parseInt(hxs[i], 16)
return hxs
},
//rgb颜色转hex颜色
RgbToHex(a, b, c) {
var hexs = [a.toString(16), b.toString(16), c.toString(16)]
for (var i = 0; i < 3; i++) {
if (hexs[i].length == 1) hexs[i] = "0" + hexs[i]
}
return "#" + hexs.join("");
},
//加深
darken(color, level) {
var rgbc = this.HexToRgb(color)
for (var i = 0; i < 3; i++) rgbc[i] = Math.floor(rgbc[i] * (1 - level))
return this.RgbToHex(rgbc[0], rgbc[1], rgbc[2])
},
//变淡
lighten(color, level) {
var rgbc = this.HexToRgb(color)
for (var i = 0; i < 3; i++) rgbc[i] = Math.floor((255 - rgbc[i]) * level + rgbc[i])
return this.RgbToHex(rgbc[0], rgbc[1], rgbc[2])
}
}
+304
View File
@@ -0,0 +1,304 @@
//初始数据库结构
const dbData = [
{
dbName: "masterDB", //数据库名称
version: 1, //数据库版本号,当结构发生变化时
tables: [ //表
{
name: "SYS_favorites", //表名称
keyPath: "uid", //主键
autoIncrement: false, //主键是否自增
index: [ //索引
{
name: "name_index", //索引名称
key: "name" //索引key
}
]
},
{
name: "SYS_keyword",
keyPath: "id"
}
]
},
{
dbName: "guestDB",
version: 1,
tables: [
{
name: "MY_demo",
keyPath: "id"
}
]
}
]
// 使用示例
// import DB from '@/utils/db'
// 初始化创建数据库 一般在项目启动时就执行了
// await DB.create()
// 打开某个数据库,返回数据库实例
// const database = await DB.open("dbName")
// 在打开的数据库中添加数据到tablenName表
// await database.add("tablenName", data)
// 查询
// await database.get("tablenName", key)
// 查询 根据索引
// await database.indexGet("tablenName", "indexName", indexVal)
// 修改
// await database.put("tablenName", data)
// 删除
// await database.delete("tablenName", key)
// 获取所有
// await database.getAll("tablenName")
// 清空某个表数据
// await database.clear("tablenName")
// 获取某个表信息
// database.getTable("tablenName")
// 获取所有表
// database.getTables()
// 关闭数据库连接
// database.close()
export default {
//建立数据库,表,初始数据
create() {
var promiseArray = []
const addDB = db => {
return new Promise((resolve, reject) => {
const request = indexedDB.open(db.dbName, db.version)
request.onupgradeneeded = e => {
const thisDB = e.target.result
db.tables.forEach(item => {
let table = null
if (thisDB.objectStoreNames.contains(item.name)) {
//已存在表,删除旧index
table = e.target.transaction.objectStore(item.name)
table.indexNames.length>0 && table.indexNames.forEach(indexName => {
table.deleteIndex(indexName)
})
}else{
//创建新的表
table = thisDB.createObjectStore(item.name, {
keyPath: item.keyPath,
autoIncrement: item.autoIncrement
})
}
//建立index
item.index && item.index.forEach(ind => {
table.createIndex(ind.name, ind.key, { unique: false })
})
})
},
request.onsuccess = e => {
return resolve(e.target.result)
}
request.onerror = e => {
return reject(e)
}
})
}
dbData.forEach(db => {
promiseArray.push(addDB(db))
})
return new Promise((resolve, reject) => {
Promise.all(promiseArray).then((e) => {
resolve(e)
}).catch(e => {
reject(e)
})
})
},
//所有数据库
databases(){
return indexedDB.databases()
},
//打开数据库
open(dbName){
return new Promise((resolve, reject) => {
const request = indexedDB.open(dbName)
request.onsuccess = e => {
const database = new this.database(e.target.result)
resolve(database)
}
request.onerror = e => {
reject(e)
}
})
},
//删除数据库
deleteDB(dbName){
return indexedDB.deleteDatabase(dbName)
},
//数据库类
database: function (IDBDatabase) {
this.IDBDatabase = IDBDatabase
/**
* 添加行数据
* @param {string} tableName 表名
* @param {object} data 数据
* @returns {promise}
*/
this.add = (tableName, data) => {
return new Promise((resolve, reject) => {
const request = IDBDatabase.transaction([tableName], 'readwrite').objectStore(tableName).add(data)
request.onsuccess = e => {
resolve(e)
}
request.onerror = e => {
reject(e)
}
})
}
/**
* 修改行数据,未查询到就新增
* @param {string} tableName 表名
* @param {object} data 数据
* @returns {promise}
*/
this.put = (tableName, data) => {
return new Promise((resolve, reject) => {
const request = IDBDatabase.transaction([tableName], 'readwrite').objectStore(tableName).put(data)
request.onsuccess = e => {
resolve(e)
}
request.onerror = e => {
reject(e)
}
})
}
/**
* 删除行
* @param {string} tableName 表名
* @param {string} key 主键
* @returns {promise}
*/
this.delete = (tableName, key) => {
return new Promise((resolve, reject) => {
const request = IDBDatabase.transaction([tableName], 'readwrite').objectStore(tableName).delete(key)
request.onsuccess = e => {
resolve(e)
}
request.onerror = e => {
reject(e)
}
})
}
/**
* 根据主键获取行
* @param {string} tableName 表名
* @param {string} key 主键
* @returns {promise}
*/
this.get = (tableName, key) => {
return new Promise((resolve, reject) => {
const request = IDBDatabase.transaction([tableName], 'readwrite').objectStore(tableName).get(key)
request.onsuccess = () => {
resolve(request.result || null)
}
request.onerror = e => {
reject(e)
}
})
}
/**
* 根据索引获取行
* @param {string} tableName 表名
* @param {string} indexName 索引库名称
* @param {string} indexVal 索引值
* @returns {promise}
*/
this.indexGet = (tableName, indexName, indexVal) => {
return new Promise((resolve, reject) => {
const request = IDBDatabase.transaction([tableName], 'readwrite').objectStore(tableName).index(indexName).get(indexVal)
request.onsuccess = () => {
resolve(request.result || null)
}
request.onerror = e => {
reject(e)
}
})
}
/**
* 获取所有行
* @param {string} tableName 表名
* @returns {promise}
*/
this.getAll = (tableName) => {
return new Promise((resolve, reject) => {
const request = IDBDatabase.transaction([tableName], 'readwrite').objectStore(tableName).getAll()
request.onsuccess = () => {
resolve(request.result || null)
}
request.onerror = e => {
reject(e)
}
})
}
/**
* 清空表
* @param {string} tableName 表名
* @returns {promise}
*/
this.clear = (tableName) => {
return new Promise((resolve, reject) => {
const request = IDBDatabase.transaction([tableName], 'readwrite').objectStore(tableName).clear()
request.onsuccess = e => {
resolve(e)
}
request.onerror = err => {
reject(err)
}
})
}
/**
* 获取表信息
* @returns {IDBObjectStore}
*/
this.getTable = (tableName) => {
const request = IDBDatabase.transaction([tableName], 'readwrite').objectStore(tableName)
return request
}
/**
* 获取所有的表
* @returns {[IDBObjectStore]}
*/
this.getTables = () => {
const tables = []
for (let item of IDBDatabase.objectStoreNames) {
tables.push(IDBDatabase.transaction([item], 'readwrite').objectStore(item))
}
return tables
}
/**
* 关闭数据库连接
* @returns {}
*/
this.close = () => {
return IDBDatabase.close()
}
}
}
+33
View File
@@ -0,0 +1,33 @@
/**
* 全局代码错误捕捉
* 比如 null.length 就会被捕捉到
*/
export default (error, vm)=>{
//过滤HTTP请求错误
if(error.status || error.status==0){
return false
}
var errorMap = {
InternalError: "Javascript引擎内部错误",
ReferenceError: "未找到对象",
TypeError: "使用了错误的类型或对象",
RangeError: "使用内置对象时,参数超范围",
SyntaxError: "语法错误",
EvalError: "错误的使用了Eval",
URIError: "URI错误"
}
var errorName = errorMap[error.name] || "未知错误"
console.warn(`[SCUI error]: ${error}`);
console.error(error);
//throw error;
vm.$nextTick(() => {
vm.$notify.error({
title: errorName,
message: error
});
})
}
+60
View File
@@ -0,0 +1,60 @@
/**
* loadJS 异步加载远程JS
* @constructor
* @param {string} src - 必填,需要加载的URL路径
* @param {string} keyName - 必填,唯一key和JS返回的全局的对象名
* @param {string} callbackName - 非必填,如果远程JS有callback,则可更有效的判断是否完成加载
*/
export function loadJS (src, keyName, callbackName) {
return new Promise((resolve, reject) => {
let has = document.head.querySelector("script[loadKey="+keyName+"]")
if(has){
return resolve(window[keyName])
}
let script = document.createElement("script")
script.type = "text/javascript"
script.src = src
script.setAttribute("loadKey", keyName)
document.head.appendChild(script)
script.onload = () => {
if(callbackName){
window[callbackName] = () => {
return resolve(window[keyName])
}
}else{
setTimeout(()=>{
return resolve(window[keyName])
},50)
}
}
script.onerror = (err) => {
return reject(err)
}
})
}
/**
* loadCSS 异步加载远程css
* @constructor
* @param {string} src - 必填,需要加载的URL路径
* @param {string} keyName - 必填,唯一key
*/
export function loadCSS (src, keyName) {
return new Promise((resolve, reject) => {
let has = document.head.querySelector("link[loadKey="+keyName+"]")
if(has){
return resolve()
}
let link = document.createElement('link')
link.rel = "stylesheet"
link.href = src
link.setAttribute("loadKey", keyName)
document.head.appendChild(link)
link.onload = () => {
return resolve()
}
link.onerror = (err) => {
return reject(err)
}
})
}
+55
View File
@@ -0,0 +1,55 @@
import tool from '@/utils/tool';
/**
* 是否含有不限分类,有则表示全部允许通过
*/
export function permissionAll() {
const allPermissions = "*/*/*"
let permissions = tool.data.get("PERMISSIONS");
return permissions.includes(allPermissions);
}
/**
* 比对两组数据是否一致
* @param news
* @param old
* @returns {boolean}
*/
export function judementSameArr(news, old) {
// console.log(news)
// console.log(old)
let count = 0;
const leng = news.length;
for (let i in news) {
for (let j in old) {
if (news[i] === old[j]) {
count++;
// console.log(news[i])
}
}
}
// console.log('相同的数量', count)
return count === leng;
}
export function permission(data) {
let permissions = tool.data.get("PERMISSIONS");
if(!permissions){
return false;
}
let isHave = permissions.includes(data);
return isHave;
}
export function rolePermission(data) {
let userInfo = tool.data.get("USER_INFO");
if(!userInfo){
return false;
}
let role = userInfo.role;
if(!role){
return false;
}
let isHave = role.includes(data);
return isHave;
}
+137
View File
@@ -0,0 +1,137 @@
// 打印类属性、方法定义
/* eslint-disable */
const Print = function(dom, options) {
if (!(this instanceof Print)) return new Print(dom, options);
this.options = this.extend({
'noPrint': '.no-print'
}, options);
if ((typeof dom) === "string") {
try{
this.dom = document.querySelector(dom);
}catch{
var createDom = document.createElement("div")
createDom.innerHTML = dom
this.dom = createDom;
};
} else {
this.isDOM(dom)
this.dom = this.isDOM(dom) ? dom : dom.$el;
}
this.init();
};
Print.prototype = {
init: function() {
var content = this.getStyle() + this.getHtml();
this.writeIframe(content);
},
extend: function(obj, obj2) {
for (var k in obj2) {
obj[k] = obj2[k];
}
return obj;
},
getStyle: function() {
var str = "",
styles = document.querySelectorAll('style,link');
for (var i = 0; i < styles.length; i++) {
str += styles[i].outerHTML;
}
str += "<style>" + (this.options.noPrint ? this.options.noPrint : '.no-print') +
"{display:none;}</style>";
str += "<style>html,body{background-color:#fff;}</style>";
return str;
},
getHtml: function() {
var inputs = document.querySelectorAll('input');
var textareas = document.querySelectorAll('textarea');
var selects = document.querySelectorAll('select');
for (var k = 0; k < inputs.length; k++) {
if (inputs[k].type == "checkbox" || inputs[k].type == "radio") {
if (inputs[k].checked == true) {
inputs[k].setAttribute('checked', "checked")
} else {
inputs[k].removeAttribute('checked')
}
} else if (inputs[k].type == "text") {
inputs[k].setAttribute('value', inputs[k].value)
} else {
inputs[k].setAttribute('value', inputs[k].value)
}
}
for (var k2 = 0; k2 < textareas.length; k2++) {
if (textareas[k2].type == 'textarea') {
textareas[k2].innerHTML = textareas[k2].value
}
}
for (var k3 = 0; k3 < selects.length; k3++) {
if (selects[k3].type == 'select-one') {
var child = selects[k3].children;
for (var i in child) {
if (child[i].tagName == 'OPTION') {
if (child[i].selected == true) {
child[i].setAttribute('selected', "selected")
} else {
child[i].removeAttribute('selected')
}
}
}
}
}
return this.dom.outerHTML;
},
writeIframe: function(content) {
var w, doc, iframe = document.createElement('iframe'),
f = document.body.appendChild(iframe);
iframe.id = "myIframe";
//iframe.style = "position:absolute;width:0;height:0;top:-10px;left:-10px;";
iframe.setAttribute('style', 'position:absolute;width:0;height:0;top:-10px;left:-10px;');
w = f.contentWindow || f.contentDocument;
doc = f.contentDocument || f.contentWindow.document;
doc.open();
doc.write(content);
doc.close();
var _this = this
iframe.onload = function() {
_this.toPrint(w);
setTimeout(function() {
document.body.removeChild(iframe)
}, 100)
}
},
toPrint: function(frameWindow) {
try {
setTimeout(function() {
frameWindow.focus();
try {
if (!frameWindow.document.execCommand('print', false, null)) {
frameWindow.print();
}
} catch (e) {
frameWindow.print();
}
frameWindow.close();
}, 10);
} catch (err) {
console.log('err', err);
}
},
isDOM: (typeof HTMLElement === 'object') ?
function(obj) {
return obj instanceof HTMLElement;
} : function(obj) {
return obj && typeof obj === 'object' && obj.nodeType === 1 && typeof obj.nodeName === 'string';
}
};
export default Print
+210
View File
@@ -0,0 +1,210 @@
import axios from 'axios';
import { ElNotification, ElMessageBox } from 'element-plus';
import sysConfig from "@/config";
import tool from '@/utils/tool';
import router from '@/router';
axios.defaults.baseURL = ''
axios.defaults.timeout = sysConfig.TIMEOUT
// HTTP request 拦截器
axios.interceptors.request.use(
(config) => {
let token = tool.cookie.get("TOKEN");
if(token){
config.headers[sysConfig.TOKEN_NAME] = sysConfig.TOKEN_PREFIX + token
}
if(!sysConfig.REQUEST_CACHE && config.method == 'get'){
config.params = config.params || {};
config.params['_'] = new Date().getTime();
}
Object.assign(config.headers, sysConfig.HEADERS)
return config;
},
(error) => {
return Promise.reject(error);
}
);
//FIX 多个API同时401时疯狂弹窗BUG
let MessageBox_401_show = false
// HTTP response 拦截器
axios.interceptors.response.use(
(response) => {
return response;
},
(error) => {
if (error.response) {
if (error.response.status == 404) {
ElNotification.error({
title: '请求错误',
message: "Status:404,正在请求不存在的服务器记录!"
});
} else if (error.response.status == 500) {
ElNotification.error({
title: '请求错误',
message: error.response.data.message || "Status:500,服务器发生错误!"
});
} else if (error.response.status == 401) {
if(!MessageBox_401_show){
MessageBox_401_show = true
ElMessageBox.confirm('当前用户已被登出或无权限访问当前资源,请尝试重新登录后再操作。', '无权限访问', {
type: 'error',
closeOnClickModal: false,
center: true,
confirmButtonText: '重新登录',
beforeClose: (action, instance, done) => {
MessageBox_401_show = false
done()
}
}).then(() => {
router.replace({path: '/login'});
}).catch(() => {})
}
} else {
ElNotification.error({
title: '请求错误',
message: error.message || `Status:${error.response.status},未知错误!`
});
}
} else {
ElNotification.error({
title: '请求错误',
message: "请求服务器无响应!"
});
}
return Promise.reject(error.response);
}
);
var http = {
/** get 请求
* @param {string} url 接口地址
* @param {object} params 请求参数
* @param {object} config 参数
*/
get: function(url, params={}, config={}) {
return new Promise((resolve, reject) => {
axios({
method: 'get',
url: url,
params: params,
...config
}).then((response) => {
resolve(response.data);
}).catch((error) => {
reject(error);
})
})
},
/** post 请求
* @param {string} url 接口地址
* @param {object} data 请求参数
* @param {object} config 参数
*/
post: function(url, data={}, config={}) {
return new Promise((resolve, reject) => {
axios({
method: 'post',
url: url,
data: data,
...config
}).then((response) => {
resolve(response.data);
}).catch((error) => {
reject(error);
})
})
},
/** put 请求
* @param {string} url 接口地址
* @param {object} data 请求参数
* @param {object} config 参数
*/
put: function(url, data={}, config={}) {
return new Promise((resolve, reject) => {
axios({
method: 'put',
url: url,
data: data,
...config
}).then((response) => {
resolve(response.data);
}).catch((error) => {
reject(error);
})
})
},
/** patch 请求
* @param {string} url 接口地址
* @param {object} data 请求参数
* @param {object} config 参数
*/
patch: function(url, data={}, config={}) {
return new Promise((resolve, reject) => {
axios({
method: 'patch',
url: url,
data: data,
...config
}).then((response) => {
resolve(response.data);
}).catch((error) => {
reject(error);
})
})
},
/** delete 请求
* @param {string} url 接口地址
* @param {object} data 请求参数
* @param {object} config 参数
*/
delete: function(url, data={}, config={}) {
return new Promise((resolve, reject) => {
axios({
method: 'delete',
url: url,
data: data,
...config
}).then((response) => {
resolve(response.data);
}).catch((error) => {
reject(error);
})
})
},
/** jsonp 请求
* @param {string} url 接口地址
* @param {string} name JSONP回调函数名称
*/
jsonp: function(url, name='jsonp'){
return new Promise((resolve) => {
var script = document.createElement('script')
var _id = `jsonp${Math.ceil(Math.random() * 1000000)}`
script.id = _id
script.type = 'text/javascript'
script.src = url
window[name] =(response) => {
resolve(response)
document.getElementsByTagName('head')[0].removeChild(script)
try {
delete window[name];
}catch(e){
window[name] = undefined;
}
}
document.getElementsByTagName('head')[0].appendChild(script)
})
}
}
export default http;
+316
View File
@@ -0,0 +1,316 @@
/*!
* template.js v0.7.1 (https://github.com/yanhaijing/template.js)
* API https://github.com/yanhaijing/template.js/blob/master/doc/api.md
* Copyright 2015 yanhaijing. All Rights Reserved
* Licensed under MIT (https://github.com/yanhaijing/template.js/blob/master/MIT-LICENSE.txt)
*/
/* eslint-disable */
;(function(root, factory) {
var template = factory(root);
if (typeof define === 'function' && define.amd) {
// AMD
define('template', function() {
return template;
});
} else if (typeof exports === 'object') {
// Node.js
module.exports = template;
} else {
// Browser globals
var _template = root.template;
template.noConflict = function() {
if (root.template === template) {
root.template = _template;
}
return template;
};
root.template = template;
}
}(this, function(root) {
'use strict';
var o = {
sTag: '<%',//开始标签
eTag: '%>',//结束标签
compress: false,//是否压缩html
escape: true, //默认输出是否进行HTML转义
error: function (e) {}//错误回调
};
var functionMap = {}; //内部函数对象
//修饰器前缀
var modifierMap = {
'': function (param) {return nothing(param)},
'h': function (param) {return encodeHTML(param)},
'u': function (param) {return encodeURI(param)}
};
var toString = {}.toString;
var slice = [].slice;
function type(x) {
if(x === null){
return 'null';
}
var t= typeof x;
if(t !== 'object'){
return t;
}
var c = toString.call(x).slice(8, -1).toLowerCase();
if(c !== 'object'){
return c;
}
if(x.constructor==Object){
return c;
}
return 'unknown';
}
function isObject(obj) {
return type(obj) === 'object';
}
function isFunction(fn) {
return type(fn) === 'function';
}
function isString(str) {
return type(str) === 'string';
}
function extend() {
var target = arguments[0] || {};
var arrs = slice.call(arguments, 1);
var len = arrs.length;
for (var i = 0; i < len; i++) {
var arr = arrs[i];
for (var name in arr) {
target[name] = arr[name];
}
}
return target;
}
function clone() {
var args = slice.call(arguments);
return extend.apply(null, [{}].concat(args));
}
function nothing(param) {
return param;
}
function encodeHTML(source) {
return String(source)
.replace(/&/g,'&amp;')
.replace(/</g,'&lt;')
.replace(/>/g,'&gt;')
.replace(/\\/g,'&#92;')
.replace(/"/g,'&quot;')
.replace(/'/g,'&#39;');
}
function compress(html) {
return html.replace(/\s+/g, ' ').replace(/<!--[\w\W]*?-->/g, '');
}
function consoleAdapter(cmd, msg) {
typeof console !== 'undefined' && console[cmd] && console[cmd](msg);
}
function handelError(e) {
var message = 'template.js error\n\n';
for (var key in e) {
message += '<' + key + '>\n' + e[key] + '\n\n';
}
message += '<message>\n' + e.message + '\n\n';
consoleAdapter('error', message);
o.error(e);
function error() {
return 'template.js error';
}
error.toString = function () {
return '__code__ = "template.js error"';
}
return error;
}
function parse(tpl, opt) {
var code = '';
var sTag = opt.sTag;
var eTag = opt.eTag;
var escape = opt.escape;
function parsehtml(line) {
// 单双引号转义,换行符替换为空格
line = line.replace(/('|")/g, '\\$1');
var lineList = line.split('\n');
var code = '';
for (var i = 0; i < lineList.length; i++) {
code += ';__code__ += ("' + lineList[i] + (i === lineList.length - 1 ? '")\n' : '\\n")\n');
}
return code;
}
function parsejs(line) {
//var reg = /^(:?)(.*?)=(.*)$/;
var reg = /^(?:=|(:.*?)=)(.*)$/
var html;
var arr;
var modifier;
// = := :*=
// :h=123 [':h=123', 'h', '123']
if (arr = reg.exec(line)) {
html = arr[2]; // 输出
if (Boolean(arr[1])) {
// :开头
modifier = arr[1].slice(1);
} else {
// = 开头
modifier = escape ? 'h' : '';
}
return ';__code__ += __modifierMap__["' + modifier + '"](typeof (' + html + ') !== "undefined" ? (' + html + ') : "")\n';
}
//原生js
return ';' + line + '\n';
}
var tokens = tpl.split(sTag);
for (var i = 0, len = tokens.length; i < len; i++) {
var token = tokens[i].split(eTag);
if (token.length === 1) {
code += parsehtml(token[0]);
} else {
code += parsejs(token[0], true);
if (token[1]) {
code += parsehtml(token[1]);
}
}
}
return code;
}
function compiler(tpl, opt) {
var mainCode = parse(tpl, opt);
var headerCode = '\n' +
' var html = (function (__data__, __modifierMap__) {\n' +
' var __str__ = "", __code__ = "";\n' +
' for(var key in __data__) {\n' +
' __str__+=("var " + key + "=__data__[\'" + key + "\'];");\n' +
' }\n' +
' eval(__str__);\n\n';
var footerCode = '\n' +
' ;return __code__;\n' +
' }(__data__, __modifierMap__));\n' +
' return html;\n';
var code = headerCode + mainCode + footerCode;
code = code.replace(/[\r]/g, ' '); // ie 7 8 会报错,不知道为什么
try {
var Render = new Function('__data__', '__modifierMap__', code);
Render.toString = function () {
return mainCode;
}
return Render;
} catch(e) {
e.temp = 'function anonymous(__data__, __modifierMap__) {' + code + '}';
throw e;
}
}
function compile(tpl, opt) {
opt = clone(o, opt);
try {
var Render = compiler(tpl, opt);
} catch(e) {
e.name = 'CompileError';
e.tpl = tpl;
e.render = e.temp;
delete e.temp;
return handelError(e);
}
function render(data) {
data = clone(functionMap, data);
try {
var html = Render(data, modifierMap);
html = opt.compress ? compress(html) : html;
return html;
} catch(e) {
e.name = 'RenderError';
e.tpl = tpl;
e.render = Render.toString();
return handelError(e)();
}
}
render.toString = function () {
return Render.toString();
};
return render;
}
function template(tpl, data) {
if (typeof tpl !== 'string') {
return '';
}
var fn = compile(tpl);
if (!isObject(data)) {
return fn;
}
return fn(data);
}
template.config = function (option) {
if (isObject(option)) {
o = extend(o, option);
}
return clone(o);
};
template.registerFunction = function(name, fn) {
if (!isString(name)) {
return clone(functionMap);
}
if (!isFunction(fn)) {
return functionMap[name];
}
return functionMap[name] = fn;
}
template.unregisterFunction = function (name) {
if (!isString(name)) {
return false;
}
delete functionMap[name];
return true;
}
template.registerModifier = function(name, fn) {
if (!isString(name)) {
return clone(modifierMap);
}
if (!isFunction(fn)) {
return modifierMap[name];
}
return modifierMap[name] = fn;
}
template.unregisterModifier = function (name) {
if (!isString(name)) {
return false;
}
delete modifierMap[name];
return true;
}
template.__encodeHTML = encodeHTML;
template.__compress = compress;
template.__handelError = handelError;
template.__compile = compile;
template.version = '0.7.1';
return template;
}));
+221
View File
@@ -0,0 +1,221 @@
/*
* @Descripttion: 工具集
* @version: 1.2
* @LastEditors: sakuya
* @LastEditTime: 2022年5月24日00:28:56
*/
import CryptoJS from 'crypto-js';
import sysConfig from "@/config";
const tool = {}
/* localStorage */
tool.data = {
set(key, data, datetime = 0) {
//加密
if(sysConfig.LS_ENCRYPTION == "AES"){
data = tool.crypto.AES.encrypt(JSON.stringify(data), sysConfig.LS_ENCRYPTION_key)
}
let cacheValue = {
content: data,
datetime: parseInt(datetime) === 0 ? 0 : new Date().getTime() + parseInt(datetime) * 1000
}
return localStorage.setItem(key, JSON.stringify(cacheValue))
},
get(key) {
try {
const value = JSON.parse(localStorage.getItem(key))
if (value) {
let nowTime = new Date().getTime()
if (nowTime > value.datetime && value.datetime != 0) {
localStorage.removeItem(key)
return null;
}
//解密
if(sysConfig.LS_ENCRYPTION == "AES"){
value.content = JSON.parse(tool.crypto.AES.decrypt(value.content, sysConfig.LS_ENCRYPTION_key))
}
return value.content
}
return null
} catch (err) {
return null
}
},
remove(key) {
return localStorage.removeItem(key)
},
clear() {
return localStorage.clear()
}
}
/*sessionStorage*/
tool.session = {
set(table, settings) {
var _set = JSON.stringify(settings)
return sessionStorage.setItem(table, _set);
},
get(table) {
var data = sessionStorage.getItem(table);
try {
data = JSON.parse(data)
} catch (err) {
return null
}
return data;
},
remove(table) {
return sessionStorage.removeItem(table);
},
clear() {
return sessionStorage.clear();
}
}
/*cookie*/
tool.cookie = {
set(name, value, config={}) {
var cfg = {
expires: null,
path: null,
domain: null,
secure: false,
httpOnly: false,
...config
}
var cookieStr = `${name}=${escape(value)}`
if(cfg.expires){
var exp = new Date()
exp.setTime(exp.getTime() + parseInt(cfg.expires) * 1000)
cookieStr += `;expires=${exp.toGMTString()}`
}
if(cfg.path){
cookieStr += `;path=${cfg.path}`
}
if(cfg.domain){
cookieStr += `;domain=${cfg.domain}`
}
document.cookie = cookieStr
},
get(name){
var arr = document.cookie.match(new RegExp("(^| )"+name+"=([^;]*)(;|$)"))
if(arr != null){
return unescape(arr[2])
}else{
return null
}
},
remove(name){
var exp = new Date()
exp.setTime(exp.getTime() - 1)
document.cookie = `${name}=;expires=${exp.toGMTString()}`
}
}
/* Fullscreen */
tool.screen = function (element) {
var isFull = !!(document.webkitIsFullScreen || document.mozFullScreen || document.msFullscreenElement || document.fullscreenElement);
if(isFull){
if(document.exitFullscreen) {
document.exitFullscreen();
}else if (document.msExitFullscreen) {
document.msExitFullscreen();
}else if (document.mozCancelFullScreen) {
document.mozCancelFullScreen();
}else if (document.webkitExitFullscreen) {
document.webkitExitFullscreen();
}
}else{
if(element.requestFullscreen) {
element.requestFullscreen();
}else if(element.msRequestFullscreen) {
element.msRequestFullscreen();
}else if(element.mozRequestFullScreen) {
element.mozRequestFullScreen();
}else if(element.webkitRequestFullscreen) {
element.webkitRequestFullscreen();
}
}
}
/* 复制对象 */
tool.objCopy = function (obj) {
return JSON.parse(JSON.stringify(obj));
}
/* 日期格式化 */
tool.dateFormat = function (date, fmt='yyyy-MM-dd hh:mm:ss') {
date = new Date(date)
var o = {
"M+" : date.getMonth()+1, //月份
"d+" : date.getDate(), //日
"h+" : date.getHours(), //小时
"m+" : date.getMinutes(), //分
"s+" : date.getSeconds(), //秒
"q+" : Math.floor((date.getMonth()+3)/3), //季度
"S" : date.getMilliseconds() //毫秒
};
if(/(y+)/.test(fmt)) {
fmt=fmt.replace(RegExp.$1, (date.getFullYear()+"").substr(4 - RegExp.$1.length));
}
for(var k in o) {
if(new RegExp("("+ k +")").test(fmt)){
fmt = fmt.replace(RegExp.$1, (RegExp.$1.length==1) ? (o[k]) : (("00"+ o[k]).substr((""+ o[k]).length)));
}
}
return fmt;
}
/* 千分符 */
tool.groupSeparator = function (num) {
num = num + '';
if(!num.includes('.')){
num += '.'
}
return num.replace(/(\d)(?=(\d{3})+\.)/g, function ($0, $1) {
return $1 + ',';
}).replace(/\.$/, '');
}
/* 常用加解密 */
tool.crypto = {
//MD5加密
MD5(data){
return CryptoJS.MD5(data).toString()
},
//BASE64加解密
BASE64: {
encrypt(data){
return CryptoJS.enc.Base64.stringify(CryptoJS.enc.Utf8.parse(data))
},
decrypt(cipher){
return CryptoJS.enc.Base64.parse(cipher).toString(CryptoJS.enc.Utf8)
}
},
//AES加解密
AES: {
encrypt(data, secretKey, config={}){
if(secretKey.length % 8 != 0){
console.warn("[SCUI error]: 秘钥长度需为8的倍数,否则解密将会失败。")
}
const result = CryptoJS.AES.encrypt(data, CryptoJS.enc.Utf8.parse(secretKey), {
iv: CryptoJS.enc.Utf8.parse(config.iv || ""),
mode: CryptoJS.mode[config.mode || "ECB"],
padding: CryptoJS.pad[config.padding || "Pkcs7"]
})
return result.toString()
},
decrypt(cipher, secretKey, config={}){
const result = CryptoJS.AES.decrypt(cipher, CryptoJS.enc.Utf8.parse(secretKey), {
iv: CryptoJS.enc.Utf8.parse(config.iv || ""),
mode: CryptoJS.mode[config.mode || "ECB"],
padding: CryptoJS.pad[config.padding || "Pkcs7"]
})
return CryptoJS.enc.Utf8.stringify(result);
}
}
}
export default tool
+61
View File
@@ -0,0 +1,61 @@
import { nextTick } from 'vue'
import NProgress from 'nprogress'
import 'nprogress/nprogress.css'
import router from '@/router'
import store from '@/store'
export default {
//刷新标签
refresh() {
NProgress.start()
const route = router.currentRoute.value
store.commit("removeKeepLive", route.name)
store.commit("setRouteShow", false)
nextTick(() => {
store.commit("pushKeepLive", route.name)
store.commit("setRouteShow", true)
NProgress.done()
})
},
//关闭标签
close(tag) {
const route = tag || router.currentRoute.value
store.commit("removeViewTags", route)
store.commit("removeIframeList", route)
store.commit("removeKeepLive", route.name)
const tagList = store.state.viewTags.viewTags
const latestView = tagList.slice(-1)[0]
if (latestView) {
router.push(latestView)
} else {
router.push('/')
}
},
//关闭标签后处理
closeNext(next) {
const route = router.currentRoute.value
store.commit("removeViewTags", route)
store.commit("removeIframeList", route)
store.commit("removeKeepLive", route.name)
if(next){
const tagList = store.state.viewTags.viewTags
next(tagList)
}
},
//关闭其他
closeOther() {
const route = router.currentRoute.value
const tagList = [...store.state.viewTags.viewTags]
tagList.forEach(tag => {
if(tag.meta&&tag.meta.affix || route.fullPath==tag.fullPath){
return true
}else{
this.close(tag)
}
})
},
//设置标题
setTitle(title){
store.commit("updateViewTagsTitle", title)
}
}
+18
View File
@@ -0,0 +1,18 @@
//验证手机号
export function verifyPhone(rule, value, callback) {
let reg = /^[1][3, 4, 5, 6, 7, 8, 9][0-9]{9}$/
if(!reg.test(value)){
return callback(new Error('请输入正确的手机号码'))
}
callback()
}
//车牌号码
export function verifyCars(rule, value, callback) {
let reg = /^[京津沪渝冀豫云辽黑湘皖鲁新苏浙赣鄂桂甘晋蒙陕吉闽贵粤青藏川宁琼使领][A-HJ-NP-Z][A-HJ-NP-Z0-9]{4,5}[A-HJ-NP-Z0-9挂学警港澳]$/
if(!reg.test(value)){
return callback(new Error('请输入正确的车牌号码'))
}
callback()
}