MicroCommunityWeb/public/vcCore/vcFramework.js

2313 lines
79 KiB
JavaScript
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

/**
* vcFramework
*
* @author 吴学文
*
* @version 0.3
*
* @description 完成组件化编程思想
*
* @time 2020-03-04
*
* @qq 928255095
*
* @mail 928255095@qq.com
*
*/
/**
构建vcFramework对象
**/
(function (window) {
"use strict";
let vcFramework = window.vcFramework || {};
window.vcFramework = vcFramework;
//为了兼容 0.1版本的vc 框架
window.vc = vcFramework;
let _vmOptions = {};
let _initMethod = [];
let _initEvent = [];
let _component = {};
let _destroyedMethod = [];
let _timers = [];//定时器
let _map = [];// 共享数据存储
let _namespace = [];
let _vueCache = {};
_vmOptions = {
el: '#component',
data: {},
watch: {},
methods: {},
destroyed: function () {
window.vcFramework.destroyedMethod.forEach(function (eventMethod) {
eventMethod();
});
//清理所有定时器
window.vcFramework.timers.forEach(function (timer) {
clearInterval(timer);
});
_timers = [];
}
};
vcFramework = {
version: "v0.0.3",
name: "vcFramework",
author: '吴学文',
email: '928255095@qq.com',
qq: '928255095',
description: 'vcFramework 是自研的一套组件开发套件',
vueCache: _vueCache,
vmOptions: _vmOptions,
namespace: _namespace,
initMethod: _initMethod,
initEvent: _initEvent,
component: _component,
destroyedMethod: _destroyedMethod,
debug: false,
timers: _timers,
_map: {}
};
//通知window对象
window.vcFramework = vcFramework;
window.vc = vcFramework;
})(window);
(function (vcFramework) {
let componentCache = {};
/**
* 树
* @param {*} _vcCreate 自定义组件
* @param {*} _html 组件内容
* @param {*} _nodeLocation 组件位置 1 开始节点 -1 结束节点
*/
let VcTree = function (_vcCreate, _html, _nodeLocation) {
let o = new Object();
o.treeId = vcFramework.uuid();
o.vcCreate = _vcCreate;
o.html = _html;
o.js = "";
o.css = "";
o.vcSubTree = [];
o.nodeLocation = _nodeLocation;
o.putSubTree = function (_vcSubTree) {
o.vcSubTree.push(_vcSubTree);
};
o.setHtml = function (_html) {
o.html = _html;
};
o.setJs = function (_js) {
o.js = _js;
};
o.setCss = function (_css) {
o.css = _css;
};
o.setLocation = function (_location) {
o.nodeLocation = _location;
};
return o;
};
/**
* 构建 树
*/
vcFramework.builderVcTree = async function () {
let _componentUrl = location.hash;
//判断是否为组件页面
if (vcFramework.notNull(_componentUrl)) {
let _vcComponent = document.getElementById('component');
let vcComponentChilds = _vcComponent.childNodes;
for (let vcIndex = vcComponentChilds.length - 1; vcIndex >= 0; vcIndex--) {
_vcComponent.removeChild(vcComponentChilds[vcIndex]);
}
if (_componentUrl.lastIndexOf('#') > -1) {
let endPos = _componentUrl.length;
if (_componentUrl.indexOf('?') > -1) {
endPos = _componentUrl.indexOf('?');
}
_componentUrl = _componentUrl.substring(_componentUrl.lastIndexOf('#') + 1, endPos);
}
let _tmpVcCreate = document.createElement("vc:create");
let _divComponentAttr = document.createAttribute('path');
_divComponentAttr.value = _componentUrl;
_tmpVcCreate.setAttributeNode(_divComponentAttr);
_vcComponent.appendChild(_tmpVcCreate);
let _commonPath = _vcComponent.getAttribute('vc-path');
if (vc.isNotEmpty(_commonPath)) {
let _pathVcCreate = document.createElement("vc:create");
let _pathDivComponentAttr = document.createAttribute('path');
_pathDivComponentAttr.value = _commonPath;
_pathVcCreate.setAttributeNode(_pathDivComponentAttr);
_vcComponent.appendChild(_pathVcCreate);
}
} else {
let _vcComponent = document.getElementById('component');
let _commonPath = _vcComponent.getAttribute('vc-path');
if (vc.isNotEmpty(_commonPath)) {
let _pathVcCreate = document.createElement("vc:create");
let _pathDivComponentAttr = document.createAttribute('path');
_pathDivComponentAttr.value = _commonPath;
_pathVcCreate.setAttributeNode(_pathDivComponentAttr);
_vcComponent.appendChild(_pathVcCreate);
}
}
let vcElements = document.getElementsByTagName('vc:create');
let treeList = [];
let _componentScript = [];
for (let _vcElementIndex = 0; _vcElementIndex < vcElements.length; _vcElementIndex++) {
let _vcElement = vcElements[_vcElementIndex];
let _tree = new VcTree(_vcElement, '', 1);
let _vcCreateAttr = document.createAttribute('id');
_vcCreateAttr.value = _tree.treeId;
_vcElement.setAttributeNode(_vcCreateAttr);
treeList.push(_tree);
//创建div
await findVcLabel(_tree, _vcElement);
let _res = _tree.html;
}
//渲染组件html
reader(treeList, _componentScript);
//执行组件js
execScript(treeList, _componentScript);
};
/**
* 页面内 组件跳转
*/
vcFramework.reBuilderVcTree = async function () {
let _componentUrl = location.hash;
//判断是否为组件页面
if (!vcFramework.notNull(_componentUrl)) {
vcFramework.toast('程序异常url没有包含组件');
return;
}
if (_componentUrl.lastIndexOf('#') < 0) {
vcFramework.toast('程序异常url包含组件错误');
return;
}
let _vcComponent = document.getElementById('component');
let vcComponentChilds = _vcComponent.childNodes;
for (let vcIndex = vcComponentChilds.length - 1; vcIndex >= 0; vcIndex--) {
_vcComponent.removeChild(vcComponentChilds[vcIndex]);
}
let endPos = _componentUrl.length;
if (_componentUrl.indexOf('?') > -1) {
endPos = _componentUrl.indexOf('?');
}
_componentUrl = _componentUrl.substring(_componentUrl.lastIndexOf('#') + 1, endPos);
let _tmpVcCreate = document.createElement("vc:create");
let _divComponentAttr = document.createAttribute('path');
_divComponentAttr.value = _componentUrl;
_tmpVcCreate.setAttributeNode(_divComponentAttr);
_vcComponent.appendChild(_tmpVcCreate);
let _commonPath = _vcComponent.getAttribute('vc-path');
if (vc.isNotEmpty(_commonPath)) {
let _pathVcCreate = document.createElement("vc:create");
let _pathDivComponentAttr = document.createAttribute('path');
_pathDivComponentAttr.value = _commonPath;
_pathVcCreate.setAttributeNode(_pathDivComponentAttr);
_vcComponent.appendChild(_pathVcCreate);
}
let treeList = [];
let _componentScript = [];
let _vcElement = _tmpVcCreate;
let vcElements = _vcComponent.getElementsByTagName('vc:create');
for (let _vcElementIndex = 0; _vcElementIndex < vcElements.length; _vcElementIndex++) {
let _vcElement = vcElements[_vcElementIndex];
let _tree = new VcTree(_vcElement, '', 1);
let _vcCreateAttr = document.createAttribute('id');
_vcCreateAttr.value = _tree.treeId;
_vcElement.setAttributeNode(_vcCreateAttr);
treeList.push(_tree);
//创建div
await findVcLabel(_tree, _vcElement);
}
//渲染组件html
reader(treeList, _componentScript);
//执行组件js
execScript(treeList, _componentScript);
};
/**
* 从当前 HTML中找是否存在 <vc:create path="xxxx"></vc:create> 标签
*/
findVcLabel = async function (_tree) {
//查看是否存在子 vc:create
let _componentName = _tree.vcCreate.getAttribute('path');
//console.log('_componentName', _componentName, _tree);
if (!vcFramework.isNotEmpty(_componentName)) {
throw '组件未包含path 属性' + _tree.vcCreate.outerHTML;
}
//开始加载组件
let _componentElement = await loadComponent(_componentName, _tree);
//_tree.setHtml(_componentElement);
//console.log('_componentElement>>', _componentElement)
if (vcFramework.isNotNull(_componentElement)) {
let vcChildElements = _componentElement.getElementsByTagName('vc:create');
if (vcChildElements.length > 0) {
let _vcDiv = document.createElement('div');
for (let _vcChildIndex = 0; _vcChildIndex < vcChildElements.length; _vcChildIndex++) {
//console.log('vcChildElements', vcChildElements);
let _tmpChildElement = vcChildElements[_vcChildIndex];
let _subtree = new VcTree(_tmpChildElement, '', 2);
let _vcCreateAttr = document.createAttribute('id');
_vcCreateAttr.value = _subtree.treeId;
_tmpChildElement.setAttributeNode(_vcCreateAttr);
_tree.putSubTree(_subtree);
await findVcLabel(_subtree);
}
}
}
};
/**
* 渲染组件 html 页面
*/
reader = function (_treeList, _componentScript) {
//console.log('_treeList', _treeList);
let _header = document.getElementsByTagName('head');
for (let _treeIndex = 0; _treeIndex < _treeList.length; _treeIndex++) {
let _tree = _treeList[_treeIndex];
let _vcCreateEl = document.getElementById(_tree.treeId);
let _componentHeader = _tree.html.getElementsByTagName('head');
let _componentBody = _tree.html.getElementsByTagName('body');
if (_vcCreateEl.hasAttribute("location") && 'head' == _vcCreateEl.getAttribute('location')) {
let _componentHs = _componentHeader[0].childNodes;
_header[0].appendChild(_componentHeader[0]);
} else if (_vcCreateEl.hasAttribute("location") && 'body' == _vcCreateEl.getAttribute('location')) {
_vcCreateEl.parentNode.replaceChild(_componentHeader[0].childNodes[0], _vcCreateEl);
let _bodyComponentHs = _componentHeader[0].childNodes;
for (let _bsIndex = 0; _bsIndex < _bodyComponentHs.length; _bsIndex++) {
let _bComponentScript = _bodyComponentHs[_bsIndex];
if (_bComponentScript.tagName == 'SCRIPT') {
let scriptObj = document.createElement("script");
scriptObj.src = _bComponentScript.src;
scriptObj.type = "text/javascript";
document.getElementsByTagName("body")[0].appendChild(scriptObj);
} else {
_header[0].appendChild(_bodyComponentHs[_bsIndex]);
}
}
} else {
//_vcCreateEl.innerHTML = _componentBody[0].innerHTML;
//_vcCreateEl.parentNode.replaceChild(_componentBody[0], _vcCreateEl);
for (let _comBodyIndex = 0; _comBodyIndex < _componentBody.length; _comBodyIndex++) {
let _childNodes = _componentBody[_comBodyIndex].childNodes;
for (let _tmpChildIndex = 0; _tmpChildIndex < _childNodes.length; _tmpChildIndex++) {
_vcCreateEl.parentNode.insertBefore(_childNodes[_tmpChildIndex], _vcCreateEl)
}
}
}
//将js 脚本放到 组件 脚本中
if (vcFramework.isNotEmpty(_tree.js)) {
_componentScript.push(_tree.js);
}
let _tmpSubTrees = _tree.vcSubTree;
if (_tmpSubTrees != null && _tmpSubTrees.length > 0) {
reader(_tmpSubTrees, _componentScript);
}
}
/**
* 执行 页面上的js 文件
*/
let _tmpScripts = document.head.getElementsByTagName("script");
let _tmpBody = document.getElementsByTagName('body');
for (let _scriptsIndex = 0; _scriptsIndex < _tmpScripts.length; _scriptsIndex++) {
let _tmpScript = _tmpScripts[_scriptsIndex];
//console.log('_head 中 script', _tmpScript.outerHTML)
let scriptObj = document.createElement("script");
scriptObj.src = _tmpScript.src;
//_tmpScript.parentNode.removeChild(_tmpScript);
scriptObj.type = "text/javascript";
_tmpBody[0].appendChild(scriptObj);
}
};
vcFramework.i18n = function(_key){
if(!window.hasOwnProperty('lang')){
return _key;
}
let _lang = window.lang;
if(!_lang.hasOwnProperty(_key)){
return _key;
}
return _lang[_key];
}
/**
* 解析 i18n 标签
*/
parseVcI18N = function(){
let _tmpI18N = document.getElementsByTagName("vc:i18n");
for (let _vcElementIndex = 0; _vcElementIndex < _tmpI18N.length; _vcElementIndex++) {
let _vcElement = _tmpI18N[_vcElementIndex];
let _name = _vcElement.getAttribute('name');
let textNode = document.createTextNode(vc.i18n(_name));
_vcElement.parentNode.appendChild(textNode);
//_vcElement.parentNode.replaceChild(textNode,_vcElement);
}
for (let _vcElementIndex = 0; _vcElementIndex < _tmpI18N.length; _vcElementIndex++) {
let _vcElement = _tmpI18N[_vcElementIndex];
_vcElement.parentNode.removeChild(_vcElement);
}
_tmpI18N = document.head.getElementsByTagName("vc:i18n");
for (let _vcElementIndex = 0; _vcElementIndex < _tmpI18N.length; _vcElementIndex++) {
let _vcElement = _tmpI18N[_vcElementIndex];
let _name = _vcElement.getAttribute('name');
let textNode = document.createTextNode(vc.i18n(_name));
_vcElement.parentNode.appendChild(textNode);
}
for (let _vcElementIndex = 0; _vcElementIndex < _tmpI18N.length; _vcElementIndex++) {
let _vcElement = _tmpI18N[_vcElementIndex];
_vcElement.parentNode.removeChild(_vcElement);
}
}
/**
* 手工执行js 脚本
*/
execScript = function (_tree, _componentScript) {
//console.log('_componentScript', _componentScript);
for (let i = 0; i < _componentScript.length; i++) {
//一段一段执行script
try {
eval(_componentScript[i]);
} catch (e) {
console.log('js脚本错误', _componentScript[i]);
console.error(e);
}
}
//初始化vue 对象
vcFramework.initVue();
vcFramework.initVcComponent();
parseVcI18N();
}
/**
* 加载组件
* 异步去服务端 拉去HTML 和 js
*/
loadComponent = async function (_componentName, _tree) {
if (vcFramework.isNotEmpty(_componentName) && _componentName.lastIndexOf('/') > 0) {
_componentName = _componentName + '/' + _componentName.substring(_componentName.lastIndexOf('/') + 1, _componentName.length);
}
//从缓存查询
let _cacheComponent = vcFramework.getComponent(_componentName);
//console.log('加载组件名称', _componentName);
let _htmlBody = '';
let _jsBody = '';
if (!vcFramework.isNotNull(_cacheComponent)) {
let _domain = 'components';
let filePath = '';
if (_tree.vcCreate.hasAttribute("domain")) {
_domain = _tree.vcCreate.getAttribute("domain");
}
if (_componentName.startsWith('/pages')) { //这里是为了处理 pages 页面
filePath = _componentName;
} else { //这里是为了处理组件
filePath = '/' + _domain + '/' + _componentName;
}
let htmlFilePath = filePath + ".html";
let jsFilePath = filePath + ".js";
//加载html 页面
[_htmlBody, _jsBody] = await Promise.all([vcFramework.httpGet(htmlFilePath), vcFramework.httpGet(jsFilePath)]);
let _componentObj = {
html: _htmlBody,
js: _jsBody
};
vcFramework.putComponent(_componentName, _componentObj);
} else {
_htmlBody = _cacheComponent.html;
_jsBody = _cacheComponent.js;
}
//处理命名空间
_htmlBody = dealHtmlNamespace(_tree, _htmlBody);
//处理 js
_jsBody = dealJs(_tree, _jsBody);
_jsBody = dealJsAddComponentCode(_tree, _jsBody);
//处理命名空间
_jsBody = dealJsNamespace(_tree, _jsBody);
//处理侦听
_jsBody = dealHtmlJs(_tree, _jsBody);
_tmpJsBody = '<script type="text/javascript">//<![CDATA[\n' + _jsBody + '//]]>\n</script>';
let parser = new DOMParser();
//let htmlComponentDoc = parser.parseFromString(_htmlBody + _tmpJsBody, 'text/html').documentElement;
let htmlComponentDoc = parser.parseFromString(_htmlBody, 'text/html').documentElement;
//创建div
let vcDiv = document.createElement('div');
let _divComponentAttr = document.createAttribute('data-component');
_divComponentAttr.value = _componentName;
vcDiv.setAttributeNode(_divComponentAttr);
vcDiv.appendChild(htmlComponentDoc);
//vcDiv.appendChild(jsComponentDoc);
_tree.setHtml(vcDiv);
_tree.setJs(_jsBody);
return vcDiv;
};
/**
* 处理 命名空间html
*/
dealHtmlNamespace = function (_tree, _html) {
let _componentVcCreate = _tree.vcCreate;
if (!_componentVcCreate.hasAttribute('namespace')) {
return _html;
}
let _namespaceValue = _componentVcCreate.getAttribute("namespace");
_html = _html.replace(/this./g, _namespaceValue + "_");
_html = _html.replace(/(id)( )*=( )*'/g, "id='" + _namespaceValue + "_");
_html = _html.replace(/(id)( )*=( )*"/g, 'id="' + _namespaceValue + '_');
return _html;
};
/**
* 处理js
*/
dealJs = function (_tree, _js) {
//在js 中检测propTypes 属性
if (_js.indexOf("propTypes") < 0) {
return _js;
}
let _componentVcCreate = _tree.vcCreate;
//解析propTypes信息
let tmpProTypes = _js.substring(_js.indexOf("propTypes"), _js.length);
tmpProTypes = tmpProTypes.substring(tmpProTypes.indexOf("{") + 1, tmpProTypes.indexOf("}")).trim();
if (!vcFramework.notNull(tmpProTypes)) {
return _js;
}
tmpProTypes = tmpProTypes.indexOf("\r") > 0 ? tmpProTypes.replace("\r/g", "") : tmpProTypes;
let tmpType = tmpProTypes.indexOf("\n") > 0
? tmpProTypes.split("\n")
: tmpProTypes.split(",");
let propsJs = "\nlet $props = {};\n";
for (let typeIndex = 0; typeIndex < tmpType.length; typeIndex++) {
let type = tmpType[typeIndex];
if (!vcFramework.notNull(type) || type.indexOf(":") < 0) {
continue;
}
let types = type.split(":");
let attrKey = "";
if (types[0].indexOf("//") > 0) {
attrKey = types[0].substring(0, types[0].indexOf("//"));
}
attrKey = types[0].replace(" ", "");
attrKey = attrKey.replace("\n", "")
attrKey = attrKey.replace("\r", "").trim();
if (!_componentVcCreate.hasAttribute(attrKey) && types[1].indexOf("=") < 0) {
let componentName = _componentVcCreate.getAttribute("path");
throw "组件[" + componentName + "]未配置组件属性" + attrKey;
}
let vcType = _componentVcCreate.getAttribute(attrKey);
if (!_componentVcCreate.hasAttribute(attrKey) && types[1].indexOf("=") > 0) {
vcType = dealJsPropTypesDefault(types[1]);
} else if (types[1].indexOf("vc.propTypes.string") >= 0) {
vcType = "'" + vcType + "'";
}
propsJs = propsJs + "$props." + attrKey + "=" + vcType + ";\n";
}
//将propsJs 插入到 第一个 { 之后
let position = _js.indexOf("{");
if (position < 0) {
let componentName = _componentVcCreate.getAttribute("name");
throw "组件" + componentName + "对应js 未包含 {} ";
}
let newJs = _js.substring(0, position + 1);
newJs = newJs + propsJs;
newJs = newJs + _js.substring(position + 1, _js.length);
return newJs;
};
dealJsPropTypesDefault = function (typeValue) {
let startPos = typeValue.indexOf("=") + 1;
let endPos = typeValue.length;
if (typeValue.indexOf(",") > 0) {
endPos = typeValue.indexOf(",");
} else if (typeValue.indexOf("//") > 0) {
endPos = typeValue.indexOf("//");
}
return typeValue.substring(startPos, endPos);
};
/**
* js 处理命名
*/
dealJsNamespace = function (_tree, _js) {
//在js 中检测propTypes 属性
let _componentVcCreate = _tree.vcCreate;
if (_js.indexOf("vc.extends") < 0) {
return _js;
}
let namespace = "";
if (!_componentVcCreate.hasAttribute("namespace")) {
namespace = 'default';
} else {
namespace = _componentVcCreate.getAttribute("namespace");
}
//js对象中插入namespace 值
let extPos = _js.indexOf("vc.extends");
let tmpProTypes = _js.substring(extPos, _js.length);
let pos = tmpProTypes.indexOf("{") + 1;
_js = _js.substring(0, extPos) + tmpProTypes.substring(0, pos).trim()
+ "\nnamespace:'" + namespace.trim() + "',\n" + tmpProTypes.substring(pos, tmpProTypes.length);
let position = _js.indexOf("{");
let propsJs = "\nlet $namespace='" + namespace.trim() + "';\n";
let newJs = _js.substring(0, position + 1);
newJs = newJs + propsJs;
newJs = newJs + _js.substring(position + 1, _js.length);
return newJs;
};
/**
* 处理js 变量和 方法都加入 组件编码
*
* @param tag 页面元素
* @param js js文件内容
* @return js 文件内容
*/
dealJsAddComponentCode = function (_tree, _js) {
let _componentVcCreate = _tree.vcCreate;
if (!_componentVcCreate.hasAttribute("code")) {
return _js;
}
let code = _componentVcCreate.getAttribute("code");
return _js.replace("@vc_/g", code);
}
/**
* 处理命名空间js
*/
dealHtmlJs = function (_tree, _js) {
let _componentVcCreate = _tree.vcCreate;
if (!_componentVcCreate.hasAttribute('namespace')) {
return _js;
}
let _namespaceValue = _componentVcCreate.getAttribute("namespace");
_js = _js.replace(/this./g, "vc.component." + _namespaceValue + "_");
_js = _js.replace(/(\$)( )*(\()( )*'#/g, "\$('#" + _namespaceValue + "_");
_js = _js.replace(/(\$)( )*(\()( )*"#/g, "\$(\"#" + _namespaceValue + "_");
//将 监听也做优化
_js = _js.replace(/(vc.on)\('/g, "vc.on('" + _namespaceValue + "','");
_js = _js.replace(/(vc.on)\("/g, "vc.on(\"" + _namespaceValue + "\",\"");
return _js;
}
})(window.vcFramework);
/**
* vc-event 事件处理
*
*/
(function (vcFramework) {
_initVcFrameworkEvent = function () {
let vcFrameworkEvent = document.createEvent('Event');
// 定义事件名为'build'.
vcFrameworkEvent.initEvent('initVcFrameworkFinish', true, true);
vcFramework.vcFrameworkEvent = vcFrameworkEvent;
};
/**
* 初始化 vue 事件
*/
_initVueEvent = function () {
vcFramework.$event = new Vue();
}
_initVcFrameworkEvent();
_initVueEvent();
})(window.vcFramework);
/**
* vc-util
*/
(function (vcFramework) {
//空判断 true 为非空 false 为空
vcFramework.isNotNull = function (_paramObj) {
if (_paramObj == null || _paramObj == undefined) {
return false;
}
return true;
};
//空判断 true 为非空 false 为空
vcFramework.isNotEmpty = function (_paramObj) {
if (_paramObj == null || _paramObj == undefined || _paramObj.trim() == '') {
return false;
}
return true;
};
vcFramework.uuid = function () {
let s = [];
let hexDigits = "0123456789abcdef";
for (let i = 0; i < 36; i++) {
s[i] = hexDigits.substr(Math.floor(Math.random() * 0x10), 1);
}
s[14] = "4"; // bits 12-15 of the time_hi_and_version field to 0010
s[19] = hexDigits.substr((s[19] & 0x3) | 0x8, 1); // bits 6-7 of the clock_seq_hi_and_reserved to 01
s[8] = s[13] = s[18] = s[23] = "-";
let uuid = s.join("");
return uuid;
};
/**
* 深度拷贝对象
*/
vcFramework.deepClone = function (obj) {
return JSON.stringify(JSON.stringify(obj));
}
vcFramework.changeNumMoneyToChinese = function (money) {
let cnNums = new Array("零", "壹", "贰", "叁", "肆", "伍", "陆", "柒", "捌", "玖"); //汉字的数字
let cnIntRadice = new Array("", "拾", "佰", "仟"); //基本单位
let cnIntUnits = new Array("", "万", "亿", "兆"); //对应整数部分扩展单位
let cnDecUnits = new Array("角", "分", "毫", "厘"); //对应小数部分单位
let cnInteger = "整"; //整数金额时后面跟的字符
let cnIntLast = "元"; //整型完以后的单位
let maxNum = 999999999999999.9999; //最大处理的数字
let IntegerNum; //金额整数部分
let DecimalNum; //金额小数部分
let ChineseStr = ""; //输出的中文金额字符串
let parts; //分离金额后用的数组,预定义
let Symbol = "";//正负值标记
if (money == "") {
return "";
}
money = parseFloat(money);
if (money >= maxNum) {
alert('超出最大处理数字');
return "";
}
if (money == 0) {
ChineseStr = cnNums[0] + cnIntLast + cnInteger;
return ChineseStr;
}
if (money < 0) {
money = -money;
Symbol = "负 ";
}
money = money.toString(); //转换为字符串
if (money.indexOf(".") == -1) {
IntegerNum = money;
DecimalNum = '';
} else {
parts = money.split(".");
IntegerNum = parts[0];
DecimalNum = parts[1].substr(0, 4);
}
if (parseInt(IntegerNum, 10) > 0) { //获取整型部分转换
var zeroCount = 0;
var IntLen = IntegerNum.length;
for (var i = 0; i < IntLen; i++) {
var n = IntegerNum.substr(i, 1);
var p = IntLen - i - 1;
var q = p / 4;
var m = p % 4;
if (n == "0") {
zeroCount++;
} else {
if (zeroCount > 0) {
ChineseStr += cnNums[0];
}
zeroCount = 0; //归零
ChineseStr += cnNums[parseInt(n)] + cnIntRadice[m];
}
if (m == 0 && zeroCount < 4) {
ChineseStr += cnIntUnits[q];
}
}
ChineseStr += cnIntLast;
//整型部分处理完毕
}
if (DecimalNum != '') { //小数部分
var decLen = DecimalNum.length;
for (var i = 0; i < decLen; i++) {
var n = DecimalNum.substr(i, 1);
if (n != '0') {
ChineseStr += cnNums[Number(n)] + cnDecUnits[i];
}
}
}
if (ChineseStr == '') {
ChineseStr += cnNums[0] + cnIntLast + cnInteger;
} else if (DecimalNum == '') {
ChineseStr += cnInteger;
}
ChineseStr = Symbol + ChineseStr;
return ChineseStr;
}
})(window.vcFramework);
/**
* 封装 后端请求 代码
*/
(function (vcFramework) {
vcFramework.httpGet = function (url) {
// XMLHttpRequest对象用于在后台与服务器交换数据
return new Promise((resolve, reject) => {
let xhr = new XMLHttpRequest();
xhr.open('GET', url, true);
xhr.onreadystatechange = function () {
// readyState == 4说明请求已完成
if (xhr.readyState == 4 && xhr.status == 200 || xhr.status == 304) {
// 从服务器获得数据
// fn.call(this, xhr.responseText);
resolve(xhr.responseText);
}
};
xhr.send();
});
};
vcFramework.httpPost = function (url, data, fn) {
let xhr = new XMLHttpRequest();
xhr.open("POST", url, true);
// 添加http头发送信息至服务器时内容编码类型
xhr.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");
xhr.onreadystatechange = function () {
if (xhr.readyState == 4 && (xhr.status == 200 || xhr.status == 304)) {
fn.call(xhr.responseText);
}
};
xhr.send(data);
};
})(window.vcFramework);
/**
* vc-cache
*
* 组件缓存
*/
(function (vcFramework) {
/**
* 组件缓存
*/
vcFramework.putComponent = function (_componentName, _component) {
let _componentCache = vcFramework.vueCache;
_componentCache[_componentName] = _component;
};
/**
* 组件提取
*/
vcFramework.getComponent = function (_componentName) {
let _componentCache = vcFramework.vueCache;
return _componentCache[_componentName];
}
})(window.vcFramework);
/***
* vc- constant 内容
*/
/**
常量
**/
(function (vcFramework) {
let constant = {
REQUIRED_MSG: "不能为空",
GET_CACHE_URL: ["/nav/getUserInfo"]
}
vcFramework.constant = constant;
})(window.vcFramework);
/***
* vc component 0.1 版本代码合并过来-----------------------------------------------------------------------
*
*
*/
/**
vc 函数初始化
add by wuxw
**/
(function (vcFramework) {
let DEFAULT_NAMESPACE = "default";
vcFramework.http = {
post: function (componentCode, componentMethod, param, options, successCallback, errorCallback) {
vcFramework.loading('open');
Vue.http.headers.common['APP-ID'] = '8000418004';
Vue.http.headers.common['TRANSACTION-ID'] = vcFramework.uuid();
Vue.http.headers.common['REQ-TIME'] = vcFramework.getDateYYYYMMDDHHMISS();
Vue.http.headers.common['SIGN'] = '';
Vue.http.post('/callComponent/' + componentCode + "/" + componentMethod, param, options)
.then(function (res) {
try {
let _header = res.headers.map;
//console.log('res', res);
if (vcFramework.notNull(_header['location'])) {
window.location.href = _header['location'];
return;
}
;
successCallback(res.bodyText, res);
} catch (e) {
console.error(e);
} finally {
vcFramework.loading('close');
}
}, function (res) {
try {
if (res.status == 401 && res.headers.map["location"]) {
let _header = res.headers.map;
//console.log('res', res);
window.location.href = _header['location'];
return;
}
if (res.status == 404) {
window.location.href = '/user.html#/pages/frame/login';
return;
}
errorCallback(res.bodyText, res);
} catch (e) {
console.error(e);
} finally {
vcFramework.loading('close');
}
});
},
get: function (componentCode, componentMethod, param, successCallback, errorCallback) {
//加入缓存机制
let _getPath = '/' + componentCode + '/' + componentMethod;
if (vcFramework.constant.GET_CACHE_URL.includes(_getPath)) {
let _cacheData = vcFramework.getData(_getPath);
//浏览器缓存中能获取到
if (_cacheData != null && _cacheData != undefined) {
successCallback(JSON.stringify(_cacheData), {status: 200});
return;
}
}
vcFramework.loading('open');
Vue.http.headers.common['APP-ID'] = '8000418004';
Vue.http.headers.common['TRANSACTION-ID'] = vcFramework.uuid();
Vue.http.headers.common['REQ-TIME'] = vcFramework.getDateYYYYMMDDHHMISS();
Vue.http.headers.common['SIGN'] = '';
Vue.http.get('/callComponent/' + componentCode + "/" + componentMethod, param)
.then(function (res) {
try {
successCallback(res.bodyText, res);
if (vcFramework.constant.GET_CACHE_URL.includes(_getPath) && res.status == 200) {
vcFramework.saveData(_getPath, JSON.parse(res.bodyText));
}
} catch (e) {
console.error(e);
} finally {
vcFramework.loading('close');
}
}, function (res) {
try {
if (res.status == 401 && res.headers.map["location"]) {
let _header = res.headers.map;
//console.log('res', res);
window.location.href = _header['location'];
return;
}
if (res.status == 404) {
window.location.href = '/user.html#/pages/frame/login';
return;
}
errorCallback(res.bodyText, res);
} catch (e) {
console.error(e);
} finally {
vcFramework.loading('close');
}
});
},
apiPost: function (api, param, options, successCallback, errorCallback) {
let _api = '';
Vue.http.headers.common['APP-ID'] = '8000418004';
Vue.http.headers.common['TRANSACTION-ID'] = vcFramework.uuid();
Vue.http.headers.common['REQ-TIME'] = vcFramework.getDateYYYYMMDDHHMISS();
Vue.http.headers.common['SIGN'] = '';
if (api.indexOf('/') >= 0) {
_api = '/app' + api;
} else {
_api = '/callComponent/' + api;
}
vcFramework.loading('open');
Vue.http.post(_api, param, options)
.then(function (res) {
try {
let _header = res.headers.map;
//console.log('res', res);
if (vcFramework.notNull(_header['location'])) {
window.location.href = _header['location'];
return;
}
;
successCallback(res.bodyText, res);
} catch (e) {
console.error(e);
} finally {
vcFramework.loading('close');
}
}, function (res) {
try {
if (res.status == 401 && res.headers.map["location"]) {
let _header = res.headers.map;
//console.log('res', res);
window.location.href = _header['location'];
return;
}
if (res.status == 404) {
window.location.href = '/user.html#/pages/frame/login';
return;
}
errorCallback(res.bodyText, res);
} catch (e) {
console.error(e);
} finally {
vcFramework.loading('close');
}
});
},
apiGet: function (api, param, successCallback, errorCallback) {
//加入缓存机制
let _getPath = '';
if (api.indexOf('/') != 0) {
_getPath = '/' + api;
}
if (vcFramework.constant.GET_CACHE_URL.includes(_getPath)) {
let _cacheData = vcFramework.getData(_getPath);
//浏览器缓存中能获取到
if (_cacheData != null && _cacheData != undefined) {
successCallback(JSON.stringify(_cacheData), {status: 200});
return;
}
}
let _api = '';
Vue.http.headers.common['APP-ID'] = '8000418004';
Vue.http.headers.common['TRANSACTION-ID'] = vcFramework.uuid();
Vue.http.headers.common['REQ-TIME'] = vcFramework.getDateYYYYMMDDHHMISS();
Vue.http.headers.common['SIGN'] = '';
Vue.http.headers.common['USER-ID'] = '-1';
if (api.indexOf('/') >= 0) {
_api = '/app' + api;
} else {
_api = '/callComponent/' + api;
}
if (vcFramework.hasOwnProperty('loading')) {
vcFramework.loading('open');
}
Vue.http.get(_api, param)
.then(function (res) {
try {
successCallback(res.bodyText, res);
if (vcFramework.constant.GET_CACHE_URL.includes(_getPath) && res.status == 200) {
vcFramework.saveData(_getPath, JSON.parse(res.bodyText));
}
} catch (e) {
console.error(e);
} finally {
if (vcFramework.hasOwnProperty('loading')) {
vcFramework.loading('close');
}
}
}, function (res) {
try {
if (res.status == 401 && res.headers.map["location"]) {
let _header = res.headers.map;
//console.log('res', res);
window.location.href = _header['location'];
return;
}
if (res.status == 404) {
window.location.href = '/user.html#/pages/frame/login';
return;
}
errorCallback(res.bodyText, res);
} catch (e) {
console.error(e);
} finally {
vcFramework.loading('close');
}
});
},
upload: function (componentCode, componentMethod, param, options, successCallback, errorCallback) {
vcFramework.loading('open');
Vue.http.post('/callComponent/upload/' + componentCode + "/" + componentMethod, param, options)
.then(function (res) {
try {
successCallback(res.bodyText, res);
} catch (e) {
console.error(e);
} finally {
vcFramework.loading('close');
}
}, function (error) {
try {
errorCallback(error.bodyText, error);
} catch (e) {
console.error(e);
} finally {
vcFramework.loading('close');
}
});
},
};
//let vmOptions = vcFramework.vmOptions;
//继承方法,合并 _vmOptions 的数据到 vmOptions中
vcFramework.extends = function (_vmOptions) {
let vmOptions = vcFramework.vmOptions;
if (typeof _vmOptions !== "object") {
throw "_vmOptions is not Object";
}
//console.log('vmOptions',vmOptions);
let nameSpace = DEFAULT_NAMESPACE;
if (_vmOptions.hasOwnProperty("namespace")) {
nameSpace = _vmOptions.namespace;
vcFramework.namespace.push({
namespace: _vmOptions.namespace,
})
}
//处理 data 对象
if (_vmOptions.hasOwnProperty('data')) {
for (let dataAttr in _vmOptions.data) {
if (nameSpace == DEFAULT_NAMESPACE) {
vmOptions.data[dataAttr] = _vmOptions.data[dataAttr];
} else {
vmOptions.data[nameSpace + "_" + dataAttr] = _vmOptions.data[dataAttr];
}
}
}
//处理methods 对象
if (_vmOptions.hasOwnProperty('methods')) {
for (let methodAttr in _vmOptions.methods) {
if (nameSpace == DEFAULT_NAMESPACE) {
vmOptions.methods[methodAttr] = _vmOptions.methods[methodAttr];
} else {
vmOptions.methods[nameSpace + "_" + methodAttr] = _vmOptions.methods[methodAttr];
}
}
}
//处理methods 对象
if (_vmOptions.hasOwnProperty('watch')) {
for (let watchAttr in _vmOptions.watch) {
if (nameSpace == DEFAULT_NAMESPACE) {
vmOptions.watch[watchAttr] = _vmOptions.watch[watchAttr];
} else {
vmOptions.watch[nameSpace + "_" + watchAttr] = _vmOptions.watch[watchAttr];
}
}
}
//处理_initMethod 初始化执行函数
if (_vmOptions.hasOwnProperty('_initMethod')) {
vcFramework.initMethod.push(_vmOptions._initMethod);
}
//处理_initEvent
if (_vmOptions.hasOwnProperty('_initEvent')) {
vcFramework.initEvent.push(_vmOptions._initEvent);
}
//处理_initEvent_destroyedMethod
if (_vmOptions.hasOwnProperty('_destroyedMethod')) {
vcFramework.destroyedMethod.push(_vmOptions._destroyedMethod);
}
};
//绑定跳转函数
vcFramework.jumpToPage = function (url) {
//判断 url 的模板是否 和当前url 模板一个
console.log('jumpToPage', url);
if (url.indexOf('#') < 0) {
window.location.href = url;
return;
}
let _targetUrl = url.substring(0, url.indexOf('#'));
if (location.pathname != _targetUrl) {
window.location.href = url;
return;
}
//刷新框架参数
//refreshVcFramework();
//修改锚点
location.hash = url.substring(url.indexOf("#") + 1, url.length);
//vcFramework.reBuilderVcTree();
};
refreshVcFramework = function () {
$that.$destroy();
let _vmOptions = {
el: '#component',
data: {},
watch: {},
methods: {},
destroyed: function () {
window.vcFramework.destroyedMethod.forEach(function (eventMethod) {
eventMethod();
});
//清理所有定时器
window.vcFramework.timers.forEach(function (timer) {
clearInterval(timer);
});
_timers = [];
}
};
vcFramework.vmOptions = _vmOptions;
vcFramework.initMethod = [];
vcFramework.initEvent = [];
vcFramework.component = {};
vcFramework.destroyedMethod = [];
vcFramework.namespace = [];
};
//保存菜单
vcFramework.setCurrentMenu = function (_menuId) {
window.localStorage.setItem('hc_menuId', _menuId);
};
//获取菜单
vcFramework.getCurrentMenu = function () {
return window.localStorage.getItem('hc_menuId');
};
//保存用户菜单
vcFramework.setMenus = function (_menus) {
window.localStorage.setItem('hc_menus', JSON.stringify(_menus));
};
//获取用户菜单
vcFramework.getMenus = function () {
return JSON.parse(window.localStorage.getItem('hc_menus'));
};
//保存菜单状态
vcFramework.setMenuState = function (_menuState) {
window.localStorage.setItem('hc_menu_state', _menuState);
};
//获取菜单状态
vcFramework.getMenuState = function () {
return window.localStorage.getItem('hc_menu_state');
};
//保存用户菜单
vcFramework.saveData = function (_key, _value) {
window.localStorage.setItem(_key, JSON.stringify(_value));
};
//保存用户菜单
vcFramework.removeData = function (_key) {
Object.keys(localStorage).forEach(item => item.indexOf(_key) !== -1 ? localStorage.removeItem(item) : '');
};
//获取用户菜单
vcFramework.getData = function (_key) {
return JSON.parse(window.localStorage.getItem(_key));
};
//保存当前小区信息 _communityInfo : {"communityId":"123213","name":"测试小区"}
vcFramework.setCurrentCommunity = function (_currentCommunityInfo) {
window.localStorage.setItem('hc_currentCommunityInfo', JSON.stringify(_currentCommunityInfo));
};
//获取当前小区信息
// @return {"communityId":"123213","name":"测试小区"}
vcFramework.getCurrentCommunity = function () {
return JSON.parse(window.localStorage.getItem('hc_currentCommunityInfo'));
};
//保存当前小区信息 _communityInfos : [{"communityId":"123213","name":"测试小区"}]
vcFramework.setCommunitys = function (_communityInfos) {
window.localStorage.setItem('hc_communityInfos', JSON.stringify(_communityInfos));
};
//获取当前小区信息
// @return {"communityId":"123213","name":"测试小区"}
vcFramework.getCommunitys = function () {
return JSON.parse(window.localStorage.getItem('hc_communityInfos'));
};
//删除缓存数据
vcFramework.clearCacheData = function () {
window.localStorage.clear();
};
//将org 对象的属性值赋值给dst 属性名为一直的属性
vcFramework.copyObject = function (org, dst) {
//for(key in Object.getOwnPropertyNames(dst)){
for (let key in dst) {
if (org.hasOwnProperty(key)) {
dst[key] = org[key]
}
}
};
//扩展 现有的对象 没有的属性扩充上去
vcFramework.extendObject = function (org, dst) {
for (let key in dst) {
if (!org.hasOwnProperty(key)) {
dst[key] = org[key]
}
}
};
vcFramework.getComponentCode = function () {
let _componentUrl = location.hash;
//判断是否为组件页面
if (!vcFramework.notNull(_componentUrl)) {
return "/";
}
if (_componentUrl.lastIndexOf('#') < 0) {
return "/";
}
let endPos = _componentUrl.length;
if (_componentUrl.indexOf('?') > -1) {
endPos = _componentUrl.indexOf('?');
}
_componentUrl = _componentUrl.substring(_componentUrl.lastIndexOf('#') + 1, endPos);
return _componentUrl;
}
//获取url参数
vcFramework.getParam = function (_key) {
//返回当前 URL 的查询部分(问号 ? 之后的部分)。
let urlParameters = location.search;
if (!vcFramework.notNull(urlParameters)) {
urlParameters = location.hash;
if (urlParameters.indexOf('?') != -1) {
urlParameters = urlParameters.substring(urlParameters.indexOf('?'), urlParameters.length);
}
}
//如果该求青中有请求的参数,则获取请求的参数,否则打印提示此请求没有请求的参数
if (urlParameters.indexOf('?') != -1) {
//获取请求参数的字符串
let parameters = decodeURI(urlParameters.substr(1));
//将请求的参数以&分割中字符串数组
parameterArray = parameters.split('&');
//循环遍历,将请求的参数封装到请求参数的对象之中
for (let i = 0; i < parameterArray.length; i++) {
if (_key == parameterArray[i].split('=')[0]) {
return parameterArray[i].split('=')[1];
}
}
}
return "";
};
//查询url
vcFramework.getUrl = function () {
//返回当前 URL 的查询部分(问号 ? 之后的部分)。
let urlParameters = location.pathname;
return urlParameters;
};
vcFramework.isBack = function () {
let _back = vc.getData("JAVA110_IS_BACK");
if (_back == null) {
return false;
}
vc.removeData("JAVA110_IS_BACK");
let beforeTime = _back;
let _date = new Date();
//10 秒内有效
if (_date.getTime() - beforeTime < 10 * 1000) {
return true;
}
return false;
};
vcFramework.getBack = function () {
//window.location.href = document.referrer;
let _date = new Date();
vc.saveData("JAVA110_IS_BACK", _date.getTime());
window.history.back(-1);
}
vcFramework.goBack = function () {
//window.location.href = document.referrer;
let _date = new Date();
vc.saveData("JAVA110_IS_BACK", _date.getTime());
window.history.back(-1);
}
//对象转get参数
vcFramework.objToGetParam = function (obj) {
let str = [];
for (let p in obj)
if (obj.hasOwnProperty(p)) {
str.push(encodeURIComponent(p) + "=" + encodeURIComponent(obj[p]));
}
return str.join("&");
};
//空判断 true 为非空 false 为空
vcFramework.notNull = function (_paramObj) {
if (_paramObj == null || _paramObj == undefined || _paramObj.trim() == '') {
return false;
}
return true;
};
vcFramework.isEmpty = function (_paramObj) {
if (_paramObj == null || _paramObj == undefined) {
return true;
}
return false;
};
//设置debug 模式
vcFramework.setDebug = function (_param) {
vcFramework.debug = _param;
};
//数据共享存放 主要为了组件间传递数据
vcFramework.put = function (_key, _value) {
vcFramework.map[_key] = _value;
};
//数据共享 获取 主要为了组件间传递数据
vcFramework.get = function (_key) {
return vcFramework.map[_key];
};
vcFramework.getDict = function (_name, _type, _callFun) {
let param = {
params: {
name: _name,
type: _type
}
};
//发送get请求
vcFramework.http.get('core', 'list', param,
function (json, res) {
if (res.status == 200) {
let _dictInfo = JSON.parse(json);
_callFun(_dictInfo);
return;
}
},
function (errInfo, error) {
console.log('请求失败处理');
});
}
vcFramework.getAttrSpec = function (_tableName, _callFun) {
let param = {
params: {
tableName: _tableName,
page: 1,
row: 100
}
};
//发送get请求
vcFramework.http.apiGet('/attrSpec/queryAttrSpec', param,
function (json, res) {
let _attrSpecInfo = JSON.parse(json);
if (_attrSpecInfo.code == 0) {
_callFun(_attrSpecInfo.data);
return;
}
},
function (errInfo, error) {
console.log('请求失败处理');
});
}
vcFramework.getAttrValue = function (_specCd, _callFun) {
let param = {
params: {
specCd: _specCd,
page: 1,
row: 100
}
};
//发送get请求
vcFramework.http.apiGet('/attrValue/queryAttrValue', param,
function (json, res) {
let _attrSpecInfo = JSON.parse(json);
if (_attrSpecInfo.code == 0) {
_callFun(_attrSpecInfo.data);
return;
}
},
function (errInfo, error) {
console.log('请求失败处理');
});
}
})(window.vcFramework);
/**
vc 定时器处理
**/
(function (w, vcFramework) {
/**
创建定时器
**/
vcFramework.createTimer = function (func, sec) {
let _timer = w.setInterval(func, sec);
vcFramework.timers.push(_timer); //这里将所有的定时器保存起来,页面退出时清理
return _timer;
};
//清理定时器
vcFramework.clearTimer = function (timer) {
clearInterval(timer);
}
})(window, window.vcFramework);
/**
* vcFramework.toast("");
时间处理工具类
**/
(function (vcFramework) {
function add0(m) {
return m < 10 ? '0' + m : m
}
vcFramework.dateTimeFormat = function (shijianchuo) {
//shijianchuo是整数否则要parseInt转换
let time = new Date(parseInt(shijianchuo));
let y = time.getFullYear();
let m = time.getMonth() + 1;
let d = time.getDate();
let h = time.getHours();
let mm = time.getMinutes();
let s = time.getSeconds();
return y + '-' + add0(m) + '-' + add0(d) + ' ' + add0(h) + ':' + add0(mm) + ':' + add0(s);
}
vcFramework.dateFormat = function (_time) {
let _date = new Date(_time);
let y = _date.getFullYear();
let m = _date.getMonth() + 1;
let d = _date.getDate();
return y + '-' + add0(m) + '-' + add0(d);
}
vcFramework.dateSub = function (dateTime,feeFlag) {
if(!dateTime || dateTime == '-'){
return dateTime
}
console.log("feeFlag:"+feeFlag);
dateTime = new Date(dateTime);
if(feeFlag!="2006012"){
dateTime=dateTime.setDate(dateTime.getDate()-1);
}
dateTime = vcFramework.dateFormat(dateTime)
return dateTime;
}
vcFramework.getDateYYYYMMDDHHMISS = function () {
let date = new Date();
let year = date.getFullYear();
let month = date.getMonth() + 1;
let day = date.getDate();
let hour = date.getHours();
let minute = date.getMinutes();
let second = date.getSeconds();
if (month < 10) {
month = '0' + month;
}
if (day < 10) {
day = '0' + day;
}
if (hour < 10) {
hour = '0' + hour;
}
if (minute < 10) {
minute = '0' + minute;
}
if (second < 10) {
second = '0' + second;
}
return year + "" + month + "" + day + "" + hour + "" + minute + "" + second;
};
vcFramework.initDateTime = function (_dateStr, _callBack) {
$('.' + _dateStr).datetimepicker({
language: 'zh-CN',
fontAwesome: 'fa',
format: 'yyyy-mm-dd hh:ii:ss',
initTime: true,
initialDate: new Date(),
autoClose: 1,
todayBtn: true
});
$('.' + _dateStr).datetimepicker()
.on('changeDate', function (ev) {
var value = $('.' + _dateStr).val();
//vc.component.addFeeConfigInfo.startTime = value;
_callBack(value);
});
//防止时间插件多次点击失去焦点
// $('.' + _dateStr)[0].addEventListener('click', myfunc)
//
// function myfunc(e) {
// e.currentTarget.blur();
// }
}
vcFramework.initDateMonth = function (_dateStr, _callBack) {
$('.' + _dateStr).datetimepicker({
language: 'zh-CN',
fontAwesome: 'fa',
format: 'yyyy-mm',
initTime: true,
startView: 3,
minView: 3,
initialDate: new Date(),
autoClose: 1,
todayBtn: true
});
$('.' + _dateStr).datetimepicker()
.on('changeDate', function (ev) {
let value = $('.' + _dateStr).val();
//vc.component.addFeeConfigInfo.startTime = value;
_callBack(value);
});
}
daysInMonth = function (year, month) {
if (month == 1) {
if (year % 4 == 0 && year % 100 != 0)
return 29;
else
return 28;
} else if ((month <= 6 && month % 2 == 0) || (month = 6 && month % 2 == 1))
return 31;
else
return 30;
}
vcFramework.addMonth = function (_date, _month) {
let y = _date.getFullYear();
let m = _date.getMonth();
let nextY = y;
let nextM = m;
//如果当前月+要加上的月>11 这里之所以用11是因为 js的月份从0开始
if ((m + _month) > 11) {
nextY = y + 1;
nextM = parseInt(m + _month) - 12;
} else {
nextM = m + _month
}
let daysInNextMonth = daysInMonth(nextY, nextM);
let day = _date.getDate();
if (day > daysInNextMonth) {
day = daysInNextMonth;
}
let _newDate = new Date(nextY, nextM, day)
return _newDate.getFullYear() + '-' + (_newDate.getMonth() + 1) + '-' + _newDate.getDate() + " " + _date.getHours() + ":" + _date.getMinutes() + ":" + _date.getSeconds();
};
})(window.vcFramework);
(function (vcFramework) {
vcFramework.propTypes = {
string: "string",//字符串类型
array: "array",
object: "object",
number: "number"
}
})(window.vcFramework);
/**
toast
**/
(function (vcFramework) {
vcFramework.toast = function Toast(msg, duration) {
duration = isNaN(duration) ? 3000 : duration;
let m = document.createElement('div');
m.innerHTML = msg;
m.style.cssText = "max-width:60%;min-width: 150px;padding:0 14px;height: 40px;color: rgb(255, 255, 255);line-height: 40px;text-align: center;border-radius: 4px;position: fixed;top: 30%;left: 50%;transform: translate(-50%, -50%);z-index: 999999;background: rgba(0, 0, 0,.7);font-size: 16px;";
document.body.appendChild(m);
setTimeout(function () {
let d = 0.5;
m.style.webkitTransition = '-webkit-transform ' + d + 's ease-in, opacity ' + d + 's ease-in';
m.style.opacity = '0';
setTimeout(function () {
document.body.removeChild(m)
}, d * 1000);
}, duration);
}
})(window.vcFramework);
/**
toast
**/
(function (vcFramework) {
vcFramework.urlToBase64 = function urlToBase64(_url, _callFun) {
let imgData;
let reader = new FileReader();
getImageBlob(_url, function (blob) {
reader.readAsDataURL(blob);
});
reader.onload = function (e) {
imgData = e.target.result;
_callFun(imgData);
};
function getImageBlob(_url, cb) {
let xhr = new XMLHttpRequest();
xhr.open("get", _url, true);
xhr.responseType = "blob";
xhr.onload = function () {
if (this.status == 200) {
if (cb) cb(this.response);
}
};
xhr.send();
}
}
})(window.vcFramework);
/***
* vc component 0.1 版本代码合并过来end-----------------------------------------------------------------------
*/
/**
初始化vue 对象
@param vc vue component对象
@param vmOptions Vue参数
**/
(function (vcFramework) {
vcFramework.initVue = function () {
let vmOptions = vcFramework.vmOptions;
//console.log("vmOptions:", vmOptions);
vcFramework.vue = new Vue(vmOptions);
vcFramework.component = vcFramework.vue;
//方便二次开发
window.$that = vcFramework.vue;
//发布vue 创建完成 事件
document.dispatchEvent(vcFramework.vcFrameworkEvent);
}
})(window.vcFramework);
/**
* vcFramwork init
* 框架开始初始化
*/
(function (vcFramework) {
//启动 框架
vcFramework.builderVcTree();
})(window.vcFramework);
/**
vc监听事件
**/
(function (vcFramework) {
/**
事件监听
**/
vcFramework.on = function () {
let _namespace = "";
let _componentName = "";
let _value = "";
let _callback = undefined;
if (arguments.length == 4) {
_namespace = arguments[0];
_componentName = arguments[1];
_value = arguments[2];
_callback = arguments[3];
} else if (arguments.length == 3) {
_componentName = arguments[0];
_value = arguments[1];
_callback = arguments[2];
} else {
console.error("执行on 异常vcFramework.on 参数只能是3个 或4个");
return;
}
if (vcFramework.notNull(_namespace)) {
vcFramework.vue.$on(_namespace + "_" + _componentName + '_' + _value,
function (param) {
if (vcFramework.debug) {
console.log("监听ON事件", _namespace, _componentName, _value, param);
}
_callback(param);
}
);
return;
}
vcFramework.vue.$on(_componentName + '_' + _value,
function (param) {
if (vcFramework.debug) {
console.log("监听ON事件", _componentName, _value, param);
}
_callback(param);
}
);
};
/**
事件触发
**/
vcFramework.emit = function () {
let _namespace = "";
let _componentName = "";
let _value = "";
let _param = undefined;
if (arguments.length == 4) {
_namespace = arguments[0];
_componentName = arguments[1];
_value = arguments[2];
_param = arguments[3];
} else if (arguments.length == 3) {
_componentName = arguments[0];
_value = arguments[1];
_param = arguments[2];
} else {
console.error("执行on 异常vcFramework.on 参数只能是3个 或4个");
return;
}
if (vcFramework.debug) {
console.log("监听emit事件", _namespace, _componentName, _value, _param);
}
if (vcFramework.notNull(_namespace)) {
vcFramework.vue.$emit(_namespace + "_" + _componentName + '_' + _value, _param);
return;
}
vcFramework.vue.$emit(_componentName + '_' + _value, _param);
};
})(window.vcFramework);
/**
* vue对象 执行初始化方法
*/
(function (vcFramework) {
vcFramework.initVcComponent = function () {
vcFramework.initEvent.forEach(function (eventMethod) {
eventMethod();
});
vcFramework.initMethod.forEach(function (callback) {
callback();
});
vcFramework.namespace.forEach(function (_param) {
vcFramework[_param.namespace] = vcFramework.vue[_param.namespace];
});
}
})(window.vcFramework);
/**
* 锚点变化监听
*/
(function (vcFramework) {
window.addEventListener("hashchange", function (e) {
let _componentUrl = location.hash;
//判断是否为组件页面
if (!vcFramework.notNull(_componentUrl)) {
return;
}
refreshVcFramework();
vcFramework.reBuilderVcTree();
}, false);
})(window.vcFramework);
/**
vc 校验 工具类 -method
(1)、required:true 必输字段
(2)、remote:"remote-valid.jsp" 使用ajax方法调用remote-valid.jsp验证输入值
(3)、email:true 必须输入正确格式的电子邮件
(4)、url:true 必须输入正确格式的网址
(5)、date:true 必须输入正确格式的日期日期校验ie6出错慎用
(6)、dateISO:true 必须输入正确格式的日期(ISO)例如2009-06-231998/01/22 只验证格式,不验证有效性
(7)、number:true 必须输入合法的数字(负数,小数)
(8)、digits:true 必须输入整数
(9)、creditcard:true 必须输入合法的信用卡号
(10)、equalTo:"#password" 输入值必须和#password相同
(11)、accept: 输入拥有合法后缀名的字符串(上传文件的后缀)
(12)、maxlength:5 输入长度最多是5的字符串(汉字算一个字符)
(13)、minlength:10 输入长度最小是10的字符串(汉字算一个字符)
(14)、rangelength:[5,10] 输入长度必须介于 5 和 10 之间的字符串")(汉字算一个字符)
(15)、range:[5,10] 输入值必须介于 5 和 10 之间
(16)、max:5 输入值不能大于5
(17)、min:10 输入值不能小于10
**/
(function (vcFramework) {
let validate = {
state: true,
errInfo: '',
setState: function (_state, _errInfo) {
this.state = _state;
if (!this.state) {
this.errInfo = _errInfo
throw "校验失败:" + _errInfo;
}
},
/**
校验手机号
**/
phone: function (text) {
let regPhone = /^0?1[3|4|5|6|7|8|9][0-9]\d{8}$/;
return regPhone.test(text);
},
/**
校验邮箱
**/
email: function (text) {
let regEmail = new RegExp("^[a-z0-9]+([._\\-]*[a-z0-9])*@([a-z0-9]+[-a-z0-9]*[a-z0-9]+.){1,63}[a-z0-9]+$"); //正则表达式
return regEmail.test(text);
},
/**
* 必填
* @param {参数} text
*/
required: function (text) {
if (text == undefined || text == null || text == "") {
return false;
}
return true;
},
/**
* 校验长度
* @param {校验文本} text
* @param {最小长度} minLength
* @param {最大长度} maxLength
*/
maxin: function (text, minLength, maxLength) {
if (text.length < minLength || text.length > maxLength) {
return false;
}
return true;
},
/**
* 校验长度
* @param {校验文本} text
* @param {最大长度} maxLength
*/
maxLength: function (text, maxLength) {
if (text.length > maxLength) {
return false;
}
return true;
},
/**
* 校验最小长度
* @param {校验文本} text
* @param {最小长度} minLength
*/
minLength: function (text, minLength) {
if (text.length < minLength) {
return false;
}
return true;
},
/**
* 全是数字
* @param {校验文本} text
*/
num: function (text) {
if (text == null || text == undefined) {
return true;
}
let regNum = /^[0-9][0-9]*$/;
return regNum.test(text);
},
date: function (str) {
if (str == null || str == undefined) {
return true;
}
let regDate = /^(\d{4})-(\d{2})-(\d{2})$/;
return regDate.test(str);
},
dateTime: function (str) {
if (str == null || str == undefined) {
return true;
}
let reDateTime = /^[1-9]\d{3}-(0[1-9]|1[0-2])-(0[1-9]|[1-2][0-9]|3[0-1])\s+(20|21|22|23|[0-1]\d):[0-5]\d:[0-5]\d$/;
return reDateTime.test(str);
},
/**
金额校验
**/
money: function (text) {
if (text == null || text == undefined) {
return true;
}
let regMoney = /^\d+\.?\d{0,2}$/;
return regMoney.test(text);
},
/**
系数校验
**/
moneyModulus: function (text) {
if (text == null || text == undefined) {
return true;
}
let regMoney = /^\d+\.?\d{0,4}$/;
return regMoney.test(text);
},
idCard: function (num) {
if (num == null || num == undefined || num == '') {
return true;
}
num = num.toUpperCase();
//身份证号码为15位或者18位15位时全为数字18位前17位为数字最后一位是校验位可能为数字或字符X。
if (!(/(^\d{15}$)|(^\d{17}([0-9]|X)$)/.test(num))) {
return false;
}
return true;
}
};
vc.validate = validate;
})(window.vcFramework);
/**
* 校验 -core
*/
(function (validate) {
/**
* 根据配置校验
*
* eg:
* dataObj:
* {
* name:"wuxw",
* age:"19",
* emailInfo:{
* email:"928255095@qq.com"
* }
* }
*
* dataConfig:
* {
* "name":[
{
limit:"required",
param:"",
errInfo:'用户名为必填'
},
{
limit:"maxin",
param:"1,10",
errInfo:'用户名必须为1到10个字之间'
}]
* }
*
*/
validate.validate = function (dataObj, dataConfig) {
try {
// 循环配置(每个字段)
for (let key in dataConfig) {
//配置信息
let tmpDataConfigValue = dataConfig[key];
//对key进行处理
let keys = key.split(".");
console.log("keys :", keys);
let tmpDataObj = dataObj;
//根据配置获取 数据值
keys.forEach(function (tmpKey) {
console.log('tmpDataObj:', tmpDataObj);
tmpDataObj = tmpDataObj[tmpKey]
});
// for(let tmpKey in keys){
// console.log('tmpDataObj:',tmpDataObj);
// tmpDataObj = tmpDataObj[tmpKey]
// }
tmpDataConfigValue.forEach(function (configObj) {
if (configObj.limit == "required") {
validate.setState(validate.required(tmpDataObj), configObj.errInfo);
}
if (configObj.limit == 'phone') {
validate.setState(validate.phone(tmpDataObj), configObj.errInfo);
}
if (configObj.limit == 'email') {
validate.setState(validate.email(tmpDataObj), configObj.errInfo);
}
if (configObj.limit == 'maxin') {
let tmpParam = configObj.param.split(",")
validate.setState(validate.maxin(tmpDataObj, tmpParam[0], tmpParam[1]), configObj.errInfo);
}
if (configObj.limit == 'maxLength') {
validate.setState(validate.maxLength(tmpDataObj, configObj.param), configObj.errInfo);
}
if (configObj.limit == 'minLength') {
validate.setState(validate.minLength(tmpDataObj, configObj.param), configObj.errInfo);
}
if (configObj.limit == 'num') {
validate.setState(validate.num(tmpDataObj), configObj.errInfo);
}
if (configObj.limit == 'date') {
validate.setState(validate.date(tmpDataObj), configObj.errInfo);
}
if (configObj.limit == 'dateTime') {
validate.setState(validate.dateTime(tmpDataObj), configObj.errInfo);
}
if (configObj.limit == 'money') {
validate.setState(validate.money(tmpDataObj), configObj.errInfo);
}
if (configObj.limit == 'idCard') {
validate.setState(validate.idCard(tmpDataObj), configObj.errInfo);
}
});
}
} catch (error) {
console.log("数据校验失败", validate.state, validate.errInfo, error);
return false;
}
return true;
}
})(window.vcFramework.validate);
/**
对 validate 进行二次封装
**/
(function (vcFramework) {
vcFramework.check = function (dataObj, dataConfig) {
return vcFramework.validate.validate(dataObj, dataConfig);
}
})(window.vcFramework);
/**
* 监听div 大小
*/
(function (vcFramework) {
vcFramework.eleResize = {
_handleResize: function (e) {
let ele = e.target || e.srcElement;
let trigger = ele.__resizeTrigger__;
if (trigger) {
let handlers = trigger.__z_resizeListeners;
if (handlers) {
let size = handlers.length;
for (let i = 0; i < size; i++) {
let h = handlers[i];
let handler = h.handler;
let context = h.context;
handler.apply(context, [e]);
}
}
}
},
_removeHandler: function (ele, handler, context) {
let handlers = ele.__z_resizeListeners;
if (handlers) {
let size = handlers.length;
for (let i = 0; i < size; i++) {
let h = handlers[i];
if (h.handler === handler && h.context === context) {
handlers.splice(i, 1);
return;
}
}
}
},
_createResizeTrigger: function (ele) {
let obj = document.createElement('object');
obj.setAttribute('style',
'display: block; position: absolute; top: 0; left: 0; height: 100%; width: 100%; overflow: hidden;opacity: 0; pointer-events: none; z-index: -1;');
obj.onload = vcFramework.eleResize._handleObjectLoad;
obj.type = 'text/html';
ele.appendChild(obj);
obj.data = 'about:blank';
return obj;
},
_handleObjectLoad: function (evt) {
this.contentDocument.defaultView.__resizeTrigger__ = this.__resizeElement__;
this.contentDocument.defaultView.addEventListener('resize', vcFramework.eleResize._handleResize);
}
};
if (document.attachEvent) {//ie9-10
vcFramework.eleResize.on = function (ele, handler, context) {
let handlers = ele.__z_resizeListeners;
if (!handlers) {
handlers = [];
ele.__z_resizeListeners = handlers;
ele.__resizeTrigger__ = ele;
ele.attachEvent('onresize', EleResize._handleResize);
}
handlers.push({
handler: handler,
context: context
});
};
vcFramework.eleResize.off = function (ele, handler, context) {
let handlers = ele.__z_resizeListeners;
if (handlers) {
EleResize._removeHandler(ele, handler, context);
if (handlers.length === 0) {
ele.detachEvent('onresize', EleResize._handleResize);
delete ele.__z_resizeListeners;
}
}
}
} else {
vcFramework.eleResize.on = function (ele, handler, context) {
let handlers = ele.__z_resizeListeners;
if (!handlers) {
handlers = [];
ele.__z_resizeListeners = handlers;
if (getComputedStyle(ele, null).position === 'static') {
ele.style.position = 'relative';
}
let obj = vcFramework.eleResize._createResizeTrigger(ele);
ele.__resizeTrigger__ = obj;
obj.__resizeElement__ = ele;
}
handlers.push({
handler: handler,
context: context
});
};
vcFramework.eleResize.off = function (ele, handler, context) {
let handlers = ele.__z_resizeListeners;
if (handlers) {
vcFramework.eleResize._removeHandler(ele, handler, context);
if (handlers.length === 0) {
let trigger = ele.__resizeTrigger__;
if (trigger) {
trigger.contentDocument.defaultView.removeEventListener('resize', EleResize._handleResize);
ele.removeChild(trigger);
delete ele.__resizeTrigger__;
}
delete ele.__z_resizeListeners;
}
}
}
}
})(window.vcFramework);
//全屏处理 这个后面可以关掉
(function (vcFramework) {
vcFramework._fix_height = (_targetDiv) => {
//只要窗口高度发生变化,就会进入这里面,在这里就可以写,回到聊天最底部的逻辑
let _vcPageHeight = document.getElementsByClassName('vc-page-height')[0];
//浏览器可见高度
let _minHeight = document.documentElement.clientHeight;
let _scollHeight = _targetDiv.scrollHeight;
if (_scollHeight < _minHeight) {
_scollHeight = _minHeight
}
_vcPageHeight.style.minHeight = _scollHeight + 'px';
//console.log('是否设置高度', _vcPageHeight.style.minHeight);
}
})(window.vcFramework);
/**
* 权限处理
*/
(function (vcFramework) {
let _staffPrivilege = vc.getData('hc_staff_privilege');
if (_staffPrivilege == null) {
_staffPrivilege = [];
}
vcFramework.hasPrivilege = (_privalege) => {
//只要窗口高度发生变化,就会进入这里面,在这里就可以写,回到聊天最底部的逻辑
return _staffPrivilege.includes(_privalege);
}
})(window.vcFramework);