diff --git a/public/api/owner/index.mjs b/public/api/owner/index.mjs new file mode 100644 index 000000000..5e92ccee0 --- /dev/null +++ b/public/api/owner/index.mjs @@ -0,0 +1,5 @@ +export default { + test: function(_item) { + console.log("测试"); + } +} \ No newline at end of file diff --git a/public/vcCore/vcFramework-0.4.js b/public/vcCore/vcFramework-0.4.js new file mode 100644 index 000000000..15f70dbe9 --- /dev/null +++ b/public/vcCore/vcFramework-0.4.js @@ -0,0 +1,2108 @@ +/** + * 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中找是否存在 标签 + */ + 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); + } + }; + + /** + * 手工执行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(); + } + + + /** + * 加载组件 + * 异步去服务端 拉去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 = ''; + 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)); + } + + + +})(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.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.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 = ''; + + if (api.indexOf('/') >= 0) { + _api = '/app' + 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'] = ''; + } 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 = ''; + + if (api.indexOf('/') >= 0) { + _api = '/app' + 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'] = ''; + } 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.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] + } + } + }; + //获取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.getBack = function () { + window.location.href = document.referrer; + window.history.back(-1); + } + vcFramework.goBack = function () { + window.location.href = document.referrer; + 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.dateFormat = 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.dateTimeFormat = function (_time) { + + 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.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; + }; + +})(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-23,1998/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); + }, + idCard: function (num) { + if (num == null || num == undefined) { + return true; + } + num = num.toUpperCase(); + //身份证号码为15位或者18位,15位时全为数字,18位前17位为数字,最后一位是校验位,可能为数字或字符X。 + if (!(/(^\d{15}$)|(^\d{17}([0-9]|X)$)/.test(num))) { + return false; + } + //校验位按照ISO 7064:1983.MOD 11-2的规定生成,X可以认为是数字10。 + //下面分别分析出生日期和校验位 + let len, re; + len = num.length; + if (len == 15) { + re = new RegExp(/^(\d{6})(\d{2})(\d{2})(\d{2})(\d{3})$/); + let arrSplit = num.match(re); + + //检查生日日期是否正确 + let dtmBirth = new Date('19' + arrSplit[2] + '/' + arrSplit[3] + '/' + arrSplit[4]); + let bGoodDay; + bGoodDay = (dtmBirth.getYear() == Number(arrSplit[2])) && ((dtmBirth.getMonth() + 1) == Number(arrSplit[3])) && (dtmBirth.getDate() == Number(arrSplit[4])); + if (!bGoodDay) { + return false; + } + else { + //将15位身份证转成18位 + //校验位按照ISO 7064:1983.MOD 11-2的规定生成,X可以认为是数字10。 + let arrInt = new Array(7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2); + let arrCh = new Array('1', '0', 'X', '9', '8', '7', '6', '5', '4', '3', '2'); + let nTemp = 0, i; + num = num.substr(0, 6) + '19' + num.substr(6, num.length - 6); + for (i = 0; i < 17; i++) { + nTemp += num.substr(i, 1) * arrInt[i]; + } + num += arrCh[nTemp % 11]; + return true; + } + } + if (len == 18) { + re = new RegExp(/^(\d{6})(\d{4})(\d{2})(\d{2})(\d{3})([0-9]|X)$/); + let arrSplit = num.match(re); + + //检查生日日期是否正确 + let dtmBirth = new Date(arrSplit[2] + "/" + arrSplit[3] + "/" + arrSplit[4]); + let bGoodDay; + bGoodDay = (dtmBirth.getFullYear() == Number(arrSplit[2])) && ((dtmBirth.getMonth() + 1) == Number(arrSplit[3])) && (dtmBirth.getDate() == Number(arrSplit[4])); + if (!bGoodDay) { + // alert(dtmBirth.getYear()); + // alert(arrSplit[2]); + return false; + } + else { + //检验18位身份证的校验码是否正确。 + //校验位按照ISO 7064:1983.MOD 11-2的规定生成,X可以认为是数字10。 + let valnum; + let arrInt = new Array(7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2); + let arrCh = new Array('1', '0', 'X', '9', '8', '7', '6', '5', '4', '3', '2'); + let nTemp = 0, i; + for (i = 0; i < 17; i++) { + nTemp += num.substr(i, 1) * arrInt[i]; + } + valnum = arrCh[nTemp % 11]; + if (valnum != num.substr(17, 1)) { + return false; + } + return true; + } + } + return false; + } + + }; + 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); + 7 + } + + 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); \ No newline at end of file