UNPKG

@zhangqingcq/plug-r-qw

Version:

A JS lib base on Vue and View-design, you can achieve some complex functions with simple code after install this lib.

1,861 lines (1,713 loc) 447 kB
/******/ (function() { // webpackBootstrap /******/ "use strict"; /******/ // The require scope /******/ var __webpack_require__ = {}; /******/ /************************************************************************/ /******/ /* webpack/runtime/compat get default export */ /******/ !function() { /******/ // getDefaultExport function for compatibility with non-harmony modules /******/ __webpack_require__.n = function(module) { /******/ var getter = module && module.__esModule ? /******/ function() { return module['default']; } : /******/ function() { return module; }; /******/ __webpack_require__.d(getter, { a: getter }); /******/ return getter; /******/ }; /******/ }(); /******/ /******/ /* webpack/runtime/define property getters */ /******/ !function() { /******/ // define getter functions for harmony exports /******/ __webpack_require__.d = function(exports, definition) { /******/ for(var key in definition) { /******/ if(__webpack_require__.o(definition, key) && !__webpack_require__.o(exports, key)) { /******/ Object.defineProperty(exports, key, { enumerable: true, get: definition[key] }); /******/ } /******/ } /******/ }; /******/ }(); /******/ /******/ /* webpack/runtime/hasOwnProperty shorthand */ /******/ !function() { /******/ __webpack_require__.o = function(obj, prop) { return Object.prototype.hasOwnProperty.call(obj, prop); } /******/ }(); /******/ /******/ /* webpack/runtime/publicPath */ /******/ !function() { /******/ __webpack_require__.p = ""; /******/ }(); /******/ /************************************************************************/ var __webpack_exports__ = {}; // EXPORTS __webpack_require__.d(__webpack_exports__, { "default": function() { return /* binding */ entry_lib; } }); ;// CONCATENATED MODULE: ./node_modules/.pnpm/@vue+cli-service@5.0.8_5pnme6wivvd2n4h6wdhiax2xja/node_modules/@vue/cli-service/lib/commands/build/setPublicPath.js /* eslint-disable no-var */ // This file is imported into lib/wc client bundles. if (typeof window !== 'undefined') { var currentScript = window.document.currentScript if (false) { var getCurrentScript; } var src = currentScript && currentScript.src.match(/(.+\/)[^/]+\.js(\?.*)?$/) if (src) { __webpack_require__.p = src[1] // eslint-disable-line } } // Indicate to webpack that this file can be concatenated /* harmony default export */ var setPublicPath = (null); ;// CONCATENATED MODULE: ./node_modules/.pnpm/vue-loader@15.11.1_bqabpjbmnlfwajo2cvaompf4cy/node_modules/vue-loader/lib/loaders/templateLoader.js??ruleSet[1].rules[4]!./node_modules/.pnpm/vue-loader@15.11.1_bqabpjbmnlfwajo2cvaompf4cy/node_modules/vue-loader/lib/index.js??vue-loader-options!./src/components/hello.vue?vue&type=template&id=4e2556e8 var render = function render(){var _vm=this,_c=_vm._self._c;return _c('span',[_vm._v("Greetings from Ricky.")]) } var staticRenderFns = [] ;// CONCATENATED MODULE: ./node_modules/.pnpm/vue-loader@15.11.1_bqabpjbmnlfwajo2cvaompf4cy/node_modules/vue-loader/lib/index.js??vue-loader-options!./src/components/hello.vue?vue&type=script&lang=js /* harmony default export */ var hellovue_type_script_lang_js = ({ name: 'Hello' }); ;// CONCATENATED MODULE: ./src/components/hello.vue?vue&type=script&lang=js /* harmony default export */ var components_hellovue_type_script_lang_js = (hellovue_type_script_lang_js); ;// CONCATENATED MODULE: ./node_modules/.pnpm/vue-loader@15.11.1_bqabpjbmnlfwajo2cvaompf4cy/node_modules/vue-loader/lib/runtime/componentNormalizer.js /* globals __VUE_SSR_CONTEXT__ */ // IMPORTANT: Do NOT use ES2015 features in this file (except for modules). // This module is a runtime utility for cleaner component module output and will // be included in the final webpack user bundle. function normalizeComponent( scriptExports, render, staticRenderFns, functionalTemplate, injectStyles, scopeId, moduleIdentifier /* server only */, shadowMode /* vue-cli only */ ) { // Vue.extend constructor export interop var options = typeof scriptExports === 'function' ? scriptExports.options : scriptExports // render functions if (render) { options.render = render options.staticRenderFns = staticRenderFns options._compiled = true } // functional template if (functionalTemplate) { options.functional = true } // scopedId if (scopeId) { options._scopeId = 'data-v-' + scopeId } var hook if (moduleIdentifier) { // server build hook = function (context) { // 2.3 injection context = context || // cached call (this.$vnode && this.$vnode.ssrContext) || // stateful (this.parent && this.parent.$vnode && this.parent.$vnode.ssrContext) // functional // 2.2 with runInNewContext: true if (!context && typeof __VUE_SSR_CONTEXT__ !== 'undefined') { context = __VUE_SSR_CONTEXT__ } // inject component styles if (injectStyles) { injectStyles.call(this, context) } // register component module identifier for async chunk inferrence if (context && context._registeredComponents) { context._registeredComponents.add(moduleIdentifier) } } // used by ssr in case component is cached and beforeCreate // never gets called options._ssrRegister = hook } else if (injectStyles) { hook = shadowMode ? function () { injectStyles.call( this, (options.functional ? this.parent : this).$root.$options.shadowRoot ) } : injectStyles } if (hook) { if (options.functional) { // for template-only hot-reload because in that case the render fn doesn't // go through the normalizer options._injectStyles = hook // register for functional component in vue file var originalRender = options.render options.render = function renderWithStyleInjection(h, context) { hook.call(context) return originalRender(h, context) } } else { // inject component registration as beforeCreate hook var existing = options.beforeCreate options.beforeCreate = existing ? [].concat(existing, hook) : [hook] } } return { exports: scriptExports, options: options } } ;// CONCATENATED MODULE: ./src/components/hello.vue /* normalize component */ ; var component = normalizeComponent( components_hellovue_type_script_lang_js, render, staticRenderFns, false, null, null, null ) /* harmony default export */ var hello = (component.exports); ;// CONCATENATED MODULE: ./node_modules/.pnpm/vue-loader@15.11.1_bqabpjbmnlfwajo2cvaompf4cy/node_modules/vue-loader/lib/loaders/templateLoader.js??ruleSet[1].rules[4]!./node_modules/.pnpm/vue-loader@15.11.1_bqabpjbmnlfwajo2cvaompf4cy/node_modules/vue-loader/lib/index.js??vue-loader-options!./src/components/btTablePage/btTablePage.vue?vue&type=template&id=e28af606 var btTablePagevue_type_template_id_e28af606_render = function render(){var _vm=this,_c=_vm._self._c;return _c('div',{ref:"tableBox",staticClass:"btTablePage fullHeight flexColumnBox"},[_c('div',{directives:[{name:"show",rawName:"v-show",value:(_vm.showTopRow),expression:"showTopRow"}],staticClass:"topBtn"},[_vm._t("tableSetting"),_vm._t("topMsg"),_vm._t("topBtnGroup")],2),_c('div',{staticClass:"tableContainer growFlexItem"},[_c('div',{staticClass:"fullHeight relativeBox"},[_c('div',{ref:"tableContainerLOI",staticClass:"fullFlowContent"},[_c('Table',_vm._g(_vm._b({ref:"TableXXX",class:{ noBorderTable: _vm.noBorderTable, fullHeightTable: !_vm.fixedTable, lightHeadO: _vm.lightHead },attrs:{"height":(_vm.fixedTable && _vm.tableContainerHeight) || null,"columns":_vm.columnsT,"data":_vm.dataS,"highlight-row":_vm.radio || _vm.highlightRow},on:{"on-select":_vm.onSelect,"on-selection-change":_vm.selectionHandle,"on-sort-change":_vm.onSortChange,"on-row-click":_vm.onRowClick}},'Table',_vm.$attrs,false),_vm.$listeners))],1)])]),_c('div',{directives:[{name:"show",rawName:"v-show",value:(!_vm.noPage),expression:"!noPage"}],staticClass:"pageContainer"},[(_vm.usePagePro)?_c('page-pro',{attrs:{"modelValue":_vm.current,"total":_vm.total,"showTotal":_vm.showTotal,"pageSize":_vm.pageSizeT,"showSizer":_vm.showSizer,"pageSizeOpts":_vm.pageSizes,"size":_vm.pageComponentSize},on:{"on-change":_vm.changePage,"on-page-size-change":_vm.pageSizeChange}}):_c('Page',{attrs:{"current":_vm.current,"total":_vm.total,"pageSize":_vm.pageSizeT,"pageSizeOpts":_vm.pageSizes,"showSizer":_vm.showSizer,"showTotal":_vm.showTotal,"showElevator":!_vm.noElevator,"size":_vm.pageComponentSize},on:{"update:current":function($event){_vm.current=$event},"on-change":_vm.changePage,"on-page-size-change":_vm.pageSizeChange}})],1)]) } var btTablePagevue_type_template_id_e28af606_staticRenderFns = [] ;// CONCATENATED MODULE: external "lodash" var external_lodash_namespaceObject = require("lodash"); var external_lodash_default = /*#__PURE__*/__webpack_require__.n(external_lodash_namespaceObject); ;// CONCATENATED MODULE: external "sweetalert" var external_sweetalert_namespaceObject = require("sweetalert"); var external_sweetalert_default = /*#__PURE__*/__webpack_require__.n(external_sweetalert_namespaceObject); ;// CONCATENATED MODULE: ./src/locale/lang/zh-CN.js /* harmony default export */ var zh_CN = ({ r: { locale: 'zh-CN', testMsg: '测试国际化', confirm: '确定', save: '保存', cancel: '取消', clear: '清空', info: { title: '提示', text: '确定执行该操作?' }, http: { 403: '登录状态失效,请重新登录!', 409: '该账号已在其他地方登录,点击确定退出。' }, pSelect: '请选择', pInput: '请输入', selectDate: '选择日期', selectTime: '选择时间', search: '搜索', level: { 1: '一级', 2: '二级', 3: '三级' }, unknown: '未知', title: '标题', required: '该项为必填', back: '返回', button: '按钮', check: '查询', adSearch: '高级查询', all: '全选', tabSetting: ' 列表显示设置', delete: '删除', fView: '全屏预览', download: '点击下载', file: '文件', selectFile: '选择文件', notImg: '文件不是图片,不可预览', wrongFileType: '文件类型不被允许', supportType: '支持类型:', none: '无', fileIsBig: '文件过大', supportSize: '支持最大:', uploadError: '上传出错', uploadFail: '上传失败', uploadLength: '最多可上传{0}个文件', closePreview: '关闭预览', fullImg: '该文件不支持图片形式预览', preview: '预览', searchFor: '当前搜索:', noMore: '没有更多数据了', optionLabel: '选项', getDataError: '拉取数据出错', add: '添加', remove: '移除', addAll: '全部添加', removeAll: '全部移除', added: '已添加', notAdded: '未添加', success: '成功', failed: '失败', error: '出错', pageNotFound: '页面没找到', notFoundMsg: '您访问的页面不存在,点击下面按钮返回上一个页面。', hideMenu: '收起菜单', showMenu: '展开菜单', print: '打印', close: '关闭', help: '帮助', printGuide: { 1: '鼠标停留在表头列右边框,出现拖动图标,按下鼠标拖动可设置列宽。', 2: '点击“列表显示设置”,可选择需要打印的列,选择完需点击“确定”按钮。', 3: '页面有A4灰色参考线,将打印内容右边缘调至参考线区间,打印机默认设置时可将表格内容铺满A4纸,表格越宽字体将越小。', 4: '将此页面地址复制到浏览器地址栏,打开的页面将不可用。', 5: '未到此线内容将无法铺满纸张', 6: '超过此线打印内容将不完整', 7: 'A4 纵向参考线', 8: 'A4 横向参考线', 9: '复制的页面无法使用该打印功能。', 10: '鼠标停留在打印内容顶部矩形条右边框,出现拖动图标,按下鼠标拖动可设置打印内容宽度。' }, page: '条/页', total: '共', items: '条', notSave: '您未保存,是否保存?', last: '上一张', next: '下一张' } }); ;// CONCATENATED MODULE: external "vue" var external_vue_namespaceObject = require("vue"); var external_vue_default = /*#__PURE__*/__webpack_require__.n(external_vue_namespaceObject); ;// CONCATENATED MODULE: external "deepmerge" var external_deepmerge_namespaceObject = require("deepmerge"); var external_deepmerge_default = /*#__PURE__*/__webpack_require__.n(external_deepmerge_namespaceObject); ;// CONCATENATED MODULE: ./src/locale/format.js /** * t('XXX',...arg) * 去掉XXX中双花括号,或替换%{XXX}为arg[XXX],arg为t('XXX',...arg)中arg * 如果XXX没有花括号,则返回XXX本身 */ const RE_NARGS = /(%|)\{([0-9a-zA-Z_]+)\}/g function hasOwn(obj, key) { return Object.prototype.hasOwnProperty.call(obj, key) } /* harmony default export */ function format(string, ...args) { if (args.length === 1 && typeof args[0] === 'object') { args = args[0] } if (!args || !args.hasOwnProperty) { args = {} } return string.replace(RE_NARGS, (match, prefix, i, index) => { let result if (string[index - 1] === '{' && string[index + match.length] === '}') { return i } else { result = hasOwn(args, i) ? args[i] : null if (result === null || result === undefined) { return '' } return result } }) } ;// CONCATENATED MODULE: ./src/locale/index.js /** * @description 国际化 * @author ricky zhangqingcq@foxmail.com * @created 2020.10.14 */ let lang = zh_CN let merged = false let i18nHandler = function () { //如果vue原型上有$t方法,用该方法进行国际化翻译 const vuei18n = Object.getPrototypeOf(this || (external_vue_default())).$t if (typeof vuei18n === 'function' && !!(external_vue_default()).locale) { if (!merged) { merged = true external_vue_default().locale((external_vue_default()).config.lang, external_deepmerge_default()(lang, external_vue_default().locale((external_vue_default()).config.lang) || {}, { clone: true })) } return vuei18n.apply(this, arguments) } } const locale_t = function (path, options) { let value = i18nHandler.apply(this, arguments) if (value !== null && value !== undefined) { return value } //如果没有找到国际化翻译实例,则启用以下逻辑翻译 const array = path.split('.') let current = lang for (let i = 0, j = array.length; i < j; i++) { const property = array[i] value = current[property] if (i === j - 1) { return format(value, options) } if (!value) { return '' } current = value } return '' } const use = function (l) { lang = l || lang } const i18n = function (fn) { i18nHandler = fn || i18nHandler } /* harmony default export */ var locale = ({ use, t: locale_t, i18n }); ;// CONCATENATED MODULE: ./src/utils/swal.js /** * created 2019.06.27 * @author Ricky <zhangqingcq@foxmail.com> */ /** * @param {object|string|boolean} option 1.object:{title:'标题',content(or text):'内容,可以为空',type(or icon):'success(or error or * warning)'};2.string:'标题' * @param {string|HTMLElement} [text] 当option为object时不传此变量,当option为string时该变量为'内容' * @param {string} [icon] 当option为object时不传此变量,当option为string时该变量为弹出框类型'success'|'error'|'warning' * @param {boolean} closeOnClickOutside 点击外部关闭,默认:true */ /* harmony default export */ function swal(option, text, icon, closeOnClickOutside = true) { const T = (...arg) => locale_t.apply(this, arg) return new Promise((r, j) => { switch (myTypeof(option)) { case 'Object': let okTxt = T('r.confirm') let cancelTxt = T('r.cancel') let cancelVisible = false let okClass = 'swalConfirmBt' let cancelClass = 'swalCancelBt' const reg = /^HTML.*Element$/ option.type && (option.icon = option.type) && delete option.type option.className = option.className || 'swalBoxX' if (option.text && reg.test(myTypeof(option.text))) { option.content = option.text delete option.text } if (option.content && myTypeof(option.content) === 'String') { option.text = option.content delete option.content } if (option.button !== false) { if (option.buttons && myTypeof(option.buttons) === 'Object') { if (option.buttons.cancel) { option.buttons.cancel.text && (cancelTxt = option.buttons.cancel.text) && (cancelVisible = true) option.buttons.cancel.className && (cancelClass = option.buttons.cancel.className) option.buttons.confirm.text && (okTxt = option.buttons.confirm.text) option.buttons.confirm.className && (okClass = option.buttons.confirm.className) } } else if (option.buttons && myTypeof(option.buttons) === 'Array') { if (option.buttons[0]) { if (option.buttons[0] !== true) { cancelTxt = option.buttons[0] } cancelVisible = true } if (option.buttons[1] && option.buttons[1] !== true) { okTxt = option.buttons[1] } } option.buttons = { confirm: { text: okTxt, value: true, visible: true, className: okClass }, cancel: { text: cancelTxt, value: null, visible: cancelVisible, className: cancelClass } } } option.closeOnClickOutside = option.closeOnClickOutside ?? true external_sweetalert_default()(option) .then((res) => { if (res && myTypeof(option.onOk) === 'Function') { option.onOk() } r(res) }) .catch((err) => { j(err) }) break case 'String': let tempOption = { title: option, buttons: { confirm: { text: T('r.confirm'), value: true, visible: true, className: 'swalConfirmBt', closeModal: true } }, className: 'swalBoxX', closeOnClickOutside: closeOnClickOutside } if (text) { switch (myTypeof(text)) { case 'String': tempOption.text = text break case 'HTMLElement': tempOption.content = text break } } icon && (tempOption.icon = icon) external_sweetalert_default()(tempOption) .then((res) => { r(res) }) .catch((err) => { j(err) }) break case 'Boolean': if (option === false) { external_sweetalert_default().close() } break default: throw new TypeError('swal第一个参数类型有误,仅支持Object/String/false') } }) } ;// CONCATENATED MODULE: ./src/utils/spin.js let count = 0 let loader = document.createElement('div') loader.setAttribute('class', 'spinModal') loader.innerHTML = '<div class="loader"><svg class="circular" viewBox="25 25 50 50"><circle class="path" cx="50" cy="50" r="20" fill="none" stroke-width="5" stroke-miterlimit="10" /></svg></div>' window.onload = function () { document.getElementsByTagName('body')[0].append(loader) } function toggleSpin(d) { if (d) { loader.classList.add('show') } else { loader.classList.remove('show') } } function counts(d) { let t = count if (d) { count++ } else if (count > 0) { count-- } if (t !== count) { if (count === 0) { toggleSpin(false) } else if (t === 0) { toggleSpin(true) } } } ;// CONCATENATED MODULE: ./src/utils/functionGroup.js /** * @description 公共方法集合 * @author ricky zhangqingcq@foxmail.com * @created 2020.06.16 */ //判断变量类型 function myTypeof(v) { let str = Object.prototype.toString.call(v) return str.replace(/\[object |]/g, '') } // 下划线转换驼峰 function toHump(name) { return name.replace(/_(\w)/g, function (all, letter) { return letter.toUpperCase() }) } // 驼峰转换下划线 function toLine(name) { return name.replace(/([A-Z])/g, '_$1').toLowerCase() } /** * 去掉对象属性前后空格 */ function trimObj(obj) { let p = myTypeof(obj) if (p === 'Object') { for (let key in obj) { if (obj.hasOwnProperty(key)) { let o = myTypeof(obj[key]) if (o === 'String') { obj[key] = obj[key].trim() } else if (o === 'Object' || o === 'Array') { trimObj(obj[key]) } } } } else if (p === 'Array') { for (let i = 0, l = obj.length; i < l; i++) { let t = myTypeof(obj[i]) if (t === 'String') { obj[i] = obj[i].trim() } else if (t === 'Array' || t === 'Object') { trimObj(obj[i]) } } } return obj } /** * 清空集合 * @param {T} val 被清空的集合 * @param {Array.<string>} ignoreList 不需要清理的字段集合 * @return {T} */ function clearObj(val, ignoreList = []) { if (myTypeof(val) === 'Array') { val.forEach((item, index) => { switch (myTypeof(item)) { case 'Array': case 'Object': clearObj(item) break default: val[index] = null } }) return val } else if (myTypeof(val) === 'Object') { for (let key in val) { if (val.hasOwnProperty(key)) { let go = true for (let item of ignoreList) { if (item === key) { go = false break } } if (go) { switch (myTypeof(val[key])) { case 'Array': case 'Object': clearObj(val[key]) break default: val[key] = null } } } } return val } else { return val } } /*用浏览器内部转换器实现html转码*/ function htmlEncode(text) { //1.首先动态创建一个容器标签元素,如DIV let temp = document.createElement('div') //2.然后将要转换的字符串设置为这个元素的innerText(ie支持)或者textContent(火狐,google支持) temp.textContent !== undefined ? (temp.textContent = text) : (temp.innerText = text) //3.最后返回这个元素的innerHTML,即得到经过HTML编码转换的字符串了 let output = temp.innerHTML temp = null return output } /*用浏览器内部转换器实现html解码*/ function htmlDecode(html) { //1.首先动态创建一个容器标签元素,如DIV let temp = document.createElement('div') //2.然后将要转换的字符串设置为这个元素的innerHTML(ie,火狐,google都支持) temp.innerHTML = html //3.最后返回这个元素的innerText(ie支持)或者textContent(火狐,google支持),即得到经过HTML解码的字符串了。 let output = temp.innerText || temp.textContent temp = null return output } /*根据file文件对象获取文件地址用来预览*/ function getFileSrc(file) { return new Promise((resolve) => { let reader = new FileReader() reader.readAsDataURL(file) // 读出 base64 reader.onloadend = () => { resolve(reader.result) } }) } /*获取后缀名*/ function getFileTypeByName(name) { return name?.split('.').pop().toLocaleLowerCase() || '' } /*判断是否为图片(type是否包含‘image’)*/ function isImgByFile(type) { return myTypeof(type) === 'String' && type.indexOf('image') > -1 } /*根据文件名获取图标(上传组件用)*/ function getFileTypeIconByName(name) { const format = getFileTypeByName(name) let type = 'ios-document-outline' if (['gif', 'jpg', 'jpeg', 'png', 'bmp', 'webp'].indexOf(format) > -1) { type = 'ios-image' } else if (['mp4', 'm3u8', 'rmvb', 'avi', 'swf', '3gp', 'mkv', 'flv'].indexOf(format) > -1) { type = 'ios-film' } else if (['mp3', 'wav', 'wma', 'ogg', 'aac', 'flac'].indexOf(format) > -1) { type = 'ios-musical-notes' } else if (['doc', 'txt', 'docx', 'pages', 'epub', 'pdf'].indexOf(format) > -1) { type = 'md-document' } else if (['numbers', 'csv', 'xls', 'xlsx'].indexOf(format) > -1) { type = 'ios-stats' } else if (['keynote', 'ppt', 'pptx'].indexOf(format) > -1) { type = 'ios-videocam' } return type } /*下载一个文件(替换容易被浏览器屏蔽的window.open方法)*/ function downloadFileReaderFile(name, href) { let saveLink = document.createElement('a') saveLink.href = href saveLink.download = name fakeALinkClick(saveLink) } /*模拟被点击(比如模拟用户点击链接下载东西)*/ function fakeALinkClick(obj) { let ev = document.createEvent('MouseEvents') ev.initMouseEvent('click', true, false, window, 0, 0, 0, 0, 0, false, false, false, false, 0, null) obj.dispatchEvent(ev) } /*以form-data方式提交请求数据时,$fetch的config参数值*/ const formDataHeadConfig = { headers: { 'Content-Type': 'multipart/form-data' } } /*将普通对象转换成form-data请求参数格式*/ function toFormData(data) { let temp = new FormData() for (let key in data) { if (data.hasOwnProperty(key) && data[key] !== null) { temp.append(key, data[key]) } } return temp } /** * 按条件查找一个元素在集合中的位置(路径),返回找到的第一个符合条件的位置 * 仅适用于[{children:[{...},...],...},...]类似树结构集合(最外层也可以是一个对象)或一维数组 * @param {Array/Object} group - 集合,被查找的集合,必填 * @param {Function/String/Number/Boolean} condition - 查找条件,为常量时,将常量和集合元素直接对比,必填 * @param {String} pathKey - 查找结果(路径)元素在集合中的key,在集合为数组时,可以不填,返回index(索引) * @param {String} childKey - 集合子元素的key,默认值'children' * @param {Array} path - 递归用参数,逻辑内部参数,不用传 * @return {Array} 返回带有路径(层级)信息的数组 * @example group: {id:1,name:'爸爸',children:[{id:2,name:'大儿子'},{id:3,name:'二儿子'}]} * condition: e=>e?.id === 3 * pathKey: 'name' * childKey: 'children' * * 返回:['爸爸','二儿子'] */ function findPath({ group, condition, pathKey, childKey = 'children', path = [] }) { if (group && external_lodash_default().isObject(group)) { if (external_lodash_default().isFunction(condition)) { if (external_lodash_default().isPlainObject(group)) { let item = group let temp = external_lodash_default().cloneDeep(path) if (condition(item)) { if (pathKey && item[pathKey]) { temp.push(item[pathKey]) } return temp } else if (item[childKey] && !external_lodash_default().isEmpty(item[childKey])) { if (pathKey && item[pathKey]) { temp.push(item[pathKey]) } let rr = findPath({ group: item[childKey], condition: condition, pathKey: pathKey, childKey: childKey, path: temp }) if (!external_lodash_default().isEmpty(rr)) { return rr } } } else if (Array.isArray(group)) { for (let item of group) { let temp = external_lodash_default().cloneDeep(path) if (condition(item)) { if (pathKey && item[pathKey]) { temp.push(item[pathKey]) } else { temp.push(group.indexOf(item)) } return temp } else if (item[childKey] && item[childKey].length > 0) { if (pathKey && item[pathKey]) { temp.push(item[pathKey]) } else { temp.push(group.indexOf(item)) } let rr = findPath({ group: item[childKey], condition: condition, pathKey: pathKey, childKey: childKey, path: temp }) if (!external_lodash_default().isEmpty(rr)) { return rr } } } } } else if (Array.isArray(group)) { //条件为常量,集合为数组,这种情况只会有一种业务场景:在一维数组中查找某个常量在数组中第一次出现的index for (let item of group) { let temp = external_lodash_default().cloneDeep(path) if (item === condition) { temp.push(group.indexOf(item)) return temp } } } } return [] } /** * 在目标集合中按条件查找或直接查找,返回第一个满足条件的元素或路径 * 与findPath不同,这里的路径是完整路径(findPath省略了一些标准结构中间路径),找不到返回:false * @param {Array|Object} group 被查找的集合 * @param {Function|String|Number|Boolean|null|undefined} condition 查找的条件或值 * @param {Boolean} getPath 是否返回路径,默认为:false,返回找到的元素 */ function findCollection(group, condition, getPath = false) { if (!group || !condition) { return false } const isFunc = myTypeof(condition) === 'Function' let PATH let target = 'notFoundC' let deepSearch = function (group, condition) { if (myTypeof(group) === 'Array') { if (isFunc && condition(group)) { target = group return [] } for (let e of group) { if (target !== 'notFoundC') { break } if ((isFunc && condition(e)) || e === condition) { target = e return [group.indexOf(e)] } else if (myTypeof(e) === 'Array' || myTypeof(e) === 'Object') { let r = deepSearch(e, condition) if (r !== undefined) { return [group.indexOf(e), ...r] } } } } else if (myTypeof(group) === 'Object') { if (isFunc && condition(group)) { target = group return [] } for (let key in group) { if (target !== 'notFoundC') { break } if (group.hasOwnProperty(key)) { if ((isFunc && condition(key)) || group[key] === condition) { target = group[key] return [key] } else if (myTypeof(group[key]) === 'Object' || myTypeof(group[key]) === 'Array') { let r = deepSearch(group[key], condition) if (r !== undefined) { return [key, ...r] } } } } } } PATH = deepSearch(group, condition) if (getPath) { return PATH || false } return target === 'notFoundC' ? false : target } /*判断某个值是否在集合中*/ function oneOf(value, validList) { for (let i = 0, l = validList.length; i < l; i++) { if (value === validList[i]) { return true } } return false } /** * 小数位数限制,超出会返回被去掉后的值 * @param val 原来的值 * @param num 小数点后的位数,默认:2 * @return {number|*} */ function decimalDigitsLimit(val, num = 2) { let expStr = new RegExp(`(^-?\\d+\\.\\d{${num}})(\\d+$)`) let valStr = (val && String(val)) || '' if (expStr.test(valStr)) { return Number(valStr.replace(expStr, '$1')) } return val } /*文件导出,调用后端接口以form表单提交数据下载文件*/ function downloadFileByFormSubmit(url, data = {}, method = 'get') { let form = document.createElement('form') let body = document.getElementsByTagName('body')[0] body.appendChild(form) form.setAttribute('style', 'display:none') form.setAttribute('target', '') form.setAttribute('method', method) let _url = url if (window?.g) { /*所有特定缩写字母开头的地址,都会被改变加上config.js(public里的全局配置文件,在index.html引入,在打包后通过更改该文件用于不 同环境的部署)里配置的地址变成绝对地址,如: config.js里配置了 window.g={mgrURL:'http://mgr.myweb.com'} 请求地址 '/mgr/file' 会被改变为 'http://mgr.myweb.com/file' */ let httpEnv = Object.keys(window.g) .filter((e) => e?.indexOf('URL') > -1) .map((e) => e?.replace('URL', '')) for (let item of httpEnv) { let regExp = new RegExp('^/' + item + '(?=/.*$)', 'i') if (regExp.test(url) && window.g[item + 'URL']) { _url = window.g[item + 'URL'] + url.replace(regExp, '') break } } } form.setAttribute('action', _url) if (external_lodash_default().isPlainObject(data)) { for (let key in data) { if (data.hasOwnProperty(key) && (data[key] || data[key] === 0 || data[key] === false || data[key] === '')) { let input = document.createElement('input') input.setAttribute('type', 'hidden') input.setAttribute('name', key) input.setAttribute('value', data[key]) form.appendChild(input) } } form.submit() let ta = setTimeout(() => { body.removeChild(form) clearTimeout(ta) ta = null }, 8000) } else { console.error('请求数据格式有误,无法下载文件') } } /** * 文件导出(基于fetch+Blob,支持精确蒙层控制) * @param {string} url 导出路径 * @param {object} data 请求参数 * @param {string} method 请求方式,默认'get' * @param {string} filename 自定义文件名(可选,不传则从响应头获取或使用默认名) */ async function downloadFileWithSpin(url, data = {}, method = 'get', filename) { counts(true) try { let _url = url if (window?.g) { let httpEnv = Object.keys(window.g) .filter((e) => e?.indexOf('URL') > -1) .map((e) => e?.replace('URL', '')) for (let item of httpEnv) { let regExp = new RegExp('^/' + item + '(?=/.*$)', 'i') if (regExp.test(url) && window.g[item + 'URL']) { _url = window.g[item + 'URL'] + url.replace(regExp, '') break } } } const fetchOptions = { method: method.toUpperCase(), credentials: 'include' } if (method.toLowerCase() === 'get' && Object.keys(data).length > 0) { const params = new URLSearchParams() for (let key in data) { if (data.hasOwnProperty(key) && (data[key] || data[key] === 0 || data[key] === false || data[key] === '')) { params.append(key, data[key]) } } _url += (_url.includes('?') ? '&' : '?') + params.toString() } if (['post', 'put'].includes(method.toLowerCase())) { fetchOptions.headers = { 'Content-Type': 'application/json' } fetchOptions.body = JSON.stringify(data) } const response = await fetch(_url, fetchOptions) if (!response.ok) { throw new Error('下载失败') } let fileName = filename || 'download' if (!filename) { let contentDisposition = response.headers.get('Content-Disposition') if (contentDisposition) { contentDisposition = decodeURIComponent(contentDisposition) const match = contentDisposition.match(/filename[^;=\n]*=((['"]).*?\2|[^;\n]*)/) if (match && match[1]) { fileName = match[1].replace(/['"]/g, '') } } else { const urlPath = _url.split('?')[0] const nameFromUrl = urlPath.substring(urlPath.lastIndexOf('/') + 1) if (nameFromUrl && nameFromUrl.includes('.')) { fileName = decodeURIComponent(nameFromUrl) } } } const blob = await response.blob() const downloadUrl = window.URL.createObjectURL(blob) const link = document.createElement('a') link.href = downloadUrl link.download = fileName document.body.appendChild(link) link.click() document.body.removeChild(link) window.URL.revokeObjectURL(downloadUrl) } catch (error) { console.error('下载出错:', error) } finally { counts(false) } } /** * 文件导出功能(调用文件下载方法downloadFileByFormSubmit) * @param url 导出路径 * @param data 参数 * @param method 请求方式,默认'get' * @param spin 是否显示loading,默认值false * @param filename 自定义文件名(可选,不传则从响应头获取或使用默认名) */ async function fileExport(url, data = {}, method = 'get', spin = false, filename) { if ( data.hasOwnProperty('columns') && (data['columns'] === '' || data['columns'] === null || data['columns'] === undefined) ) { swal.call(this, { title: '需要导出的列不能为空', type: 'warning' }) return } if (spin) { await downloadFileWithSpin(url, data, method, filename) } else { downloadFileByFormSubmit(url, data, method) } } /** * 依据列显示设置缓存获取columns的key的集合 * @param {String} sKey - 列显示设置插件的sKey * @param {Array} columns - 表格table的columns * @param {Boolean} returnArray - 是否返回数组,默认值false,返回String * */ function getColumnsKeys(sKey, columns, returnArray = false) { let temp if (sKey && myTypeof(columns) === 'Array') { let names = localStorage.getItem(sKey) if (names) { names = JSON.parse(decodeURI(names)) temp = columns.filter((e) => e?.key && names.indexOf(e?.title) !== -1).map((e) => e?.key) } else { temp = columns.map((e) => e?.key) } } else { temp = [] } if (!returnArray) { temp = String(temp) } return temp } /** * 判断一个值是否为有效值,有效值:不为空即为有效 * @param val 需要判断的值 * @returns {boolean} */ function isValidValue(val) { return val !== undefined && val !== null && val !== '' } function isNumberValue(val) { const reg = /^-?\d+(.\d+)?$/ return reg.test(val) } /** * 手动tooltip(基于tableTooltip的高级表格内容展示,展示内容和形式更多样和合理) * tableTooltip: 替换view-design的Table的tooltip功能,只在内容会导致换行或显示不完整时渲染tooltip * @param {String/Array/Function} contentKey 要设置tooltip的column的key或者key组成的数组(内容按数组中key对应的内容先后拼接), * 或获取值的自定义逻辑(Function回调,会传入params) * @param {boolean} dash 在内容为空(null、undefined、'')时是否以'--'代替显示 * @param {String} jointMark 在内容为多个字段拼接时,各字段间连接符,默认没有 */ function tooltipManual(contentKey, dash = false, jointMark = '') { return function (h, params) { let content if (myTypeof(contentKey) === 'Array') { let temp = [] for (let item of contentKey) { if (isValidValue(params.row[item])) { temp.push(params.row[item]) } } content = temp.join(jointMark) } else if (myTypeof(contentKey) === 'Function') { content = contentKey(params) } else { content = params.row[contentKey] } return h('tableTooltip', { props: { content: dash ? (content === '' ? '--' : (content ?? '--')) : content } }) } } /*获取字符串width*/ function getStringWidth(str, fontSize = 12) { if (myTypeof(str) === 'String' && str.length > 0) { let nodesH = document.createElement('span') nodesH.style.fontSize = fontSize + 'px' nodesH.style.fontFamily = 'inherit' nodesH.innerHTML = str nodesH.style.opacity = '0' nodesH.style.position = 'fixed' nodesH.style.top = '3000px' document.body.append(nodesH) const width = nodesH.clientWidth document.body.removeChild(nodesH) return width } return 0 } /*判断集合(数组或对象)每个元素或单个变量是否是有效值*/ function isEmptyValue(data) { if (external_lodash_default().isPlainObject(data)) { for (let key in data) { if (data.hasOwnProperty(key) && isValidValue(data[key])) { return false } } return true } else if (Array.isArray(data)) { for (let item of data) { if (isValidValue(item)) { return false } } return true } return !isValidValue(data) } /*获取字符串长度,中文2,其他1(一般用于用户输入长度限制)*/ function stringLength(str) { if (myTypeof(str) === 'String') { return str.replace(/[^\x00-\xff]/g, '01').length } else if (myTypeof(str) === 'Number') { str += '' return str.replace(/[^\x00-\xff]/g, '01').length } return 0 } /** * 按条件设置集合中指定字段的值 * @param {Array} group 目标集合 * @param {Function} condition 匹配条件 * @param {String} key 要设置的字段键名 * @param val 要设置的字段的值,或处理逻辑 * @param {String} childKey 子集键名 */ function setValByOption({ group, condition, key, val, childKey = 'children' }) { if ( myTypeof(group) !== 'Array' || myTypeof(condition) !== 'Function' || myTypeof(key) !== 'String' || myTypeof(childKey) !== 'String' ) { return false } group.forEach((item) => { if (condition(item)) { if (myTypeof(val) === 'Function') { item[key] = val(item[key]) } else { item[key] = val } } if (myTypeof(item[childKey]) === 'Array' && item[childKey].length > 0) { setValByOption({ group: item[childKey], condition, key, val, childKey }) } }) } /** * 是否有该权限,用于权限管理 * @param {String} value 权限代码 * @returns {boolean} */ function hasPermission(value) { let btnPermissions = sessionStorage.getItem('btnPermissions') if (btnPermissions) { return btnPermissions.split(',').indexOf(value) > -1 } return false } /** * 如果值为''则将其替换为null * @param val 被替换的值 * @returns {*} */ function emptyInput(val) { if (val === '') { return null } return val } /** * 判断一个变量是否是NaN * @param v 变量 * @returns {boolean} */ function functionGroup_isNaN(v) { return myTypeof(v) === 'Number' && String(v) === 'NaN' } /** *过滤对象属性或者将对象转换成url的query字符串 * @param {Object} data 需要处理的对象 * @param {Boolean} toUrl 是否需要转换成url,为false时可以不传 * @param {Boolean} keepEmptyVal 是否保留空值(用于接口置空某个字段),为false时可以不传 * @returns {*} * 注意:当toUrl=false且keepEmptyVal=true时,两个参数都传比较好 */ function dataFilterOrToUrl(data, toUrl, keepEmptyVal) { if (myTypeof(data) !== 'Object') { return data } let _data = Object.assign(data, {}) let url = '' for (let key in _data) { if (_data.hasOwnProperty(key)) { let val = _data[key] if ( val === undefined || val === '' || (myTypeof(val) === 'String' && val.trim() === '') || val === null || functionGroup_isNaN(val) ) { if (keepEmptyVal) { if (toUrl) { url += key + '=&' } else { _data[key] = '' } } else { delete _data[key] } } else if (toUrl) { url += key + '=' + val + '&' } } } if (toUrl) { if (url.length > 0) { return url.substr(0, url.length - 1) } return '' } return _data } //阻止冒泡 function stopBubbling(e) { e = e || window.Event if (e?.stopPropagation) { //W3C阻止冒泡方法 e.stopPropagation() } else { e.cancelBubble = true //IE阻止冒泡方法 } } /*过滤对象或数组中无效值*/ function removeEmptyValue(data) { let temp if (Array.isArray(data)) { temp = [] for (let item of data) { if (Array.isArray(item) || external_lodash_default().isPlainObject(item)) { temp.push(removeEmptyValue(item)) } else if (isValidValue(item)) { temp.push(item) } } } else if (external_lodash_default().isPlainObject(data)) { temp = {} for (let key in data) { if (data.hasOwnProperty(key)) { if (Array.isArray(data[key] || external_lodash_default().isPlainObject(data[key]))) { temp[key] = removeEmptyValue(data[key]) } else if (isValidValue(data[key])) { temp[key] = data[key] } } } } return temp } /** *打印页面,根据后端所传递的数据生成 * @param data * @return {Promise<any>} */ function htmlPrint(data) { const pwin = window.open() pwin.document.write(data) const tc = setTimeout(() => { pwin.print() window.clearTimeout(tc) }, 10) } /** * 查找dom元素所有兄弟 * @param {node} elem - 被查找的元素 */ function siblingElems(elem) { let nodes = [] let _elem = elem while ((elem = elem.previousSibling)) { if (elem.nodeType === 1) { nodes.push(elem) } } while ((_elem = _elem.nextSibling)) { if (_elem.nodeType === 1) { nodes.push(_elem) } } return nodes } ;// CONCATENATED MODULE: external "axios" var external_axios_namespaceObject = require("axios"); var external_axios_default = /*#__PURE__*/__webpack_require__.n(external_axios_namespaceObject); ;// CONCATENATED MODULE: external "@zhangqingcq/view-design-r" var view_design_r_namespaceObject = require("@zhangqingcq/view-design-r"); ;// CONCATENATED MODULE: ./src/utils/messageBox.js /** created 2019.05.24 * @author ricky email:zhangqingcq@foxmail.com */ let loading = false /** * 对话框 * @param {object} options 对话框配置 * @param {string|function} options.content 弹框内容,1.string,直接将文字插入对应位置;2.function,如:(h)=>h('div',{class:'my-class'},'123') * @param {number} [options.height] 弹框高度,默认值130,最小值130 * @param {number} [options.width] 弹框宽度,默认值416,最小值416 * @param {string} [options.title] 弹框标题内容,默认值“提示” * @param {callback} [options.onOk] 确定按钮回调函数 * @param {callback} [options.onCancel] 取消按钮回调函数 * @param {callback} [options.onClose] 关闭(右上角叉叉)按钮回调函数 * @param {string} [options.okText] 确定按钮文字,默认值“确定” * @param {string} [options.cancelText] 取消按钮文字,默认值“取消” * @param {boolean} [options.noWarnIcon] 不展示内容开头的警告图标(非字符串内容默认不展示),默认值“false” * @param {string} [options.footerAlign] 底部对齐方式,string,默认值“center” * @param {boolean} [options.cancelBt] 展示取消按钮,boolean,默认值“true” * @example this.messageBox({ * content:'校验中,返回结果前,请勿关闭或刷新页面' * }) */ function messageBox({ height, width = 416, title, content, onOk, onCancel, onClose, okText, cancelText, noWarnIcon, footerAlign, cancelBt }) { const T = (...arg) => locale_t.apply(this, arg) const heightTemp = height && Number(height) - 90 > 100 ? Number(height) - 90 + 'px' : 0 const heightT = heightTemp || '100px' content = content || T('r.info.text') const stringContent = myTypeof(content) === 'String' const functionContent = myTypeof(content) === 'Function' view_design_r_namespaceObject.Modal.warning({ width: width, render: (h) => { return h( 'div', { class: 'customMessageBox', style: { height: heightT } }, [ h( 'div', { class: 'containerN' }, [ h( 'div', { class: 'titleN' }, [ h('span', title || T('r.info.title')), h( 'Button', { class: 'fr closeN ivu-btn ivu-btn-text', props: { type: 'text' }, on: { click() { view_design_r_namespaceObject.Modal.remove() if (onClose && myTypeof(onClose) === 'Function') { onClose() } } } }, [ h('i', { class: 'ivu-icon ivu-icon-ios-close', style: { fontSize: '30px' } }) ] ) ] ), h( 'div', { class: 'contentN', style: { textAlign: stringContent ? 'center' : 'left' } }, [ h('i', { class: stringContent && noWarnIcon !== true ? 'ivu-icon ivu-icon-ios-alert-outline' : 'hide', style: { fontSize: '60px', color: '#f8bb86' } }), h('div', { class: 'msgBoxConO' }, functionContent ? [content(h)] : content) ] ), h( 'div', { class: 'footerN', style: { textAlign: footerAlign || 'center' } }, [ h( 'Button', { class: 'okBtN ivu-btn ivu-btn-default', on: { click(e) { if (onOk && typeof onOk === 'function') { const p = onOk() if (p && myTypeof(p) === 'Promise') { loading = true const el = e?.currentTarget || e?.target if (el) { el.classList.add('ivu-btn-loading') el.nextSibling.setAttribute('disabled', 'disabled') const c = el.parentElement?.parentElement.querySelector('.titleN .closeN') c.classList.add('disabled') } Promise.resolve(p) .then(() => { loading = false view_design_r_namespaceObject.Modal.remove() }) .catch(() => { loading = false view_design_r_namespaceObject.Modal.remove() }) } else { view_design_r_namespaceObject.Modal.remove() } } } } }, [ h('i', { class: 'ivu-load-loop ivu-icon ivu-icon-ios-loading' }), h('span', okText || T('r.confirm')) ] ), h( 'Button', { class: ['cancelBtN ivu-btn ivu-btn-default', cancelBt === false && 'hide'], on: { click() { view_design_r_namespaceObject.Modal.remove() if (myTypeof(onCancel) === 'Function') { onCancel() } } } }, cancelText || T('r.cancel') ) ] ) ] ) ] ) } }) } ;// CONCATENATED MODULE: ./src/utils/fetch.js /** * created 2019.04.01 * @author Ricky <zhangqingcq@foxmail.com> */ const host = window.location.origin // 创建自定义对象 let service = external_axios_default().create({ baseURL: host, withCredentials: true // 允许携带cookie }) function notInitYet() { console.info( 'store为空,请在安装插件时传入store实例,vuex:Vue.use(plugRQw,{store}),Pinia:Vue.use(plugRQw,{useStore})' ) } /** * 拦截器,在发起请求前调用 */ service.interceptors.request.use( (q) => { return q }, (e) => { return Promise.reject(e) } ) function logoutHandle() { if (service.store) { if (typeof service.store === 'function') { const store = service.store() if (store.logout) { store.logout() } } else { service.store.dispatch('logout') } } else { notInitYet() } } /** * 拦截器,在请求返回时调用 */ service.interceptors.response.use( (r) => { if (r?.data?.code === 403 || r?.data?.code === 409) { messageBox({ content: locale_t('r.http.' + r.data.code), onOk: logoutHandle }) } return r }, (e) => { if (e?.response?.status === 403 || e?.response?.status === 409) { messageBox({ content: locale_t('r.http.' + e.response.status), onOk: logoutHandle }) } console.warn('请求出错:', e) return Promise.reject(e) } ) /** * 封装请求结果和错误处理 */ function checkResult(r, msg, rPath, config) { if (config?.spin) { counts(false) } let y = true let d = r?.data if (d) { rPath = rPath ? rPath : [] for (let e of rPath) { d = d[e] y = y && d } if (y) { return d } msg && console.warn(msg) return false } msg && console.warn(msg) return false } function handleRequest(method, url, data, msg, rPath, config, isUrlData) { return new Promise((s, j) => { switch (method) { case 'get': service .get(url, { params: data }) .then((r) => { let d = checkResult(r, msg, rPath, config) if (d) { s(d) } else { j(r) } }) .catch((e) => { checkResult({}, msg, rPath, config) j(e) }) break case 'delete': let keyT = isUrlData ? 'params' : 'data' service .delete(url, { [keyT]: data }) .then((r) => { let d = checkResult(r, msg, rPath, config) if (d) { s(d) } else { j(r) } }) .catch((e) => { checkResult({}, msg, rPath, config) j(e) }) break case 'post': service .post(url, data, config) .then((r) => { let d = checkResult(r, msg, rPath, config) if (d) { s(d) } else { j(r) } }) .catch((e) => { checkResult({}, msg, rPath, config) j(e) }) break case 'put': service .put(url, data, config) .then((r) => { let d = checkResult(r, msg, rPath, config) if (d) { s(d) } else { j(r) } }) .catch((e) => { checkResult({}, msg, rPath, config) j(e) }) break default: } }) } /** * 检查请求传入的各个参数 * @param method 请求方法 * @param url 地址 * @param data 餐宿 * @param msg 错误信息 * @param rPath 返回数据路径(提取) * @param config 请求配置 * @param isUrlData delete方法传参模式 true:params,false:data * @returns {Promise<*>} */ function checkRequest(method, url, data, msg, rPath, config = {}, isUrlData) { return new Promise((s, j) => { if (url) { if (config?.spin) { counts(true) } let url_ = url if (window?.g) { /*所有特定缩写字母开头的地址,都会被改变加上config.js(public里的全局配置文件,在index.html引入,在打包后通过更改该文件用于不 同环境的部署)里配置的地址变成绝对地址,如: config.js里配置了 window.g={mgrURL:'http://mgr.myweb.com'} 请求地址 ‘/mgr/file’ 会被改变为 'http://mgr.myweb.com/file' */ let httpEnv = Object.keys(window.g) .filter((e) => e?.indexOf?.('URL') > -1) .map((e) => e?.replace?.('URL', '')) for (let e of httpEnv) { let regExp = new RegExp('^/' + e + '(?=/.*$)', 'i') if (regExp.test(url) && window.g[e + 'URL']) { url_ = window.g[e + 'URL'] + url.replace(regExp, '') break } } } let data_ if (config?.headers?.['Content-Type'] === 'multipart/form-data') { data_ = data } else { if (Array.isArray(data)) { data_ = [] } else { da