@tuoyuan/gateway-api-select-config 1.2.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -0
- package/README.md +605 -0
- package/dist/gateway-api-select-config.css +3 -0
- package/dist/gateway-api-select-config.es.js +1767 -0
- package/dist/gateway-api-select-config.umd.js +28 -0
- package/package.json +60 -0
- package/src/components/ApiConfig.vue +2264 -0
- package/src/components/SchemaFieldEditor.vue +572 -0
- package/src/index.js +70 -0
- package/src/utils/dataExtractor.js +359 -0
- package/src/utils/dataFilters.js +300 -0
- package/src/utils/reqMappingUtils.js +147 -0
- package/src/utils/schemaUtils.js +197 -0
- package/src/utils/treeUtils.js +134 -0
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
(function(e,t){typeof exports==`object`&&typeof module<`u`?t(exports,require(`vue`),require(`@arco-design/web-vue`)):typeof define==`function`&&define.amd?define([`exports`,`vue`,`@arco-design/web-vue`],t):(e=typeof globalThis<`u`?globalThis:e||self,t(e.GatewayApiSelectConfig={},e.Vue,e.ArcoVue))})(this,function(e,t,n){Object.defineProperties(e,{__esModule:{value:!0},[Symbol.toStringTag]:{value:`Module`}});var r=Object.defineProperty,i=(e,t)=>()=>(e&&(t=e(e=0)),t),a=(e,t)=>{let n={};for(var i in e)r(n,i,{get:e[i],enumerable:!0});return t||r(n,Symbol.toStringTag,{value:`Module`}),n},o=Symbol(`ArcoConfigProvider`),s=`arco`,c=`$arco`,l=e=>{let n=(0,t.getCurrentInstance)(),r=(0,t.inject)(o,void 0)?.prefixCls??n?.appContext.config.globalProperties[c]?.classPrefix??s;return e?`${r}-${e}`:r},u=Object.prototype.toString;function d(e){return u.call(e)===`[object Number]`&&e===e}var f=(e,t)=>{for(let[n,r]of t)e[n]=r;return e},p=(0,t.defineComponent)({name:`IconLink`,props:{size:{type:[Number,String]},strokeWidth:{type:Number,default:4},strokeLinecap:{type:String,default:`butt`,validator:e=>[`butt`,`round`,`square`].includes(e)},strokeLinejoin:{type:String,default:`miter`,validator:e=>[`arcs`,`bevel`,`miter`,`miter-clip`,`round`].includes(e)},rotate:Number,spin:Boolean},emits:{click:e=>!0},setup(e,{emit:n}){let r=l(`icon`);return{cls:(0,t.computed)(()=>[r,`${r}-link`,{[`${r}-spin`]:e.spin}]),innerStyle:(0,t.computed)(()=>{let t={};return e.size&&(t.fontSize=d(e.size)?`${e.size}px`:e.size),e.rotate&&(t.transform=`rotate(${e.rotate}deg)`),t}),onClick:e=>{n(`click`,e)}}}}),m=[`stroke-width`,`stroke-linecap`,`stroke-linejoin`];function h(e,n,r,i,a,o){return(0,t.openBlock)(),(0,t.createElementBlock)(`svg`,{viewBox:`0 0 48 48`,fill:`none`,xmlns:`http://www.w3.org/2000/svg`,stroke:`currentColor`,class:(0,t.normalizeClass)(e.cls),style:(0,t.normalizeStyle)(e.innerStyle),"stroke-width":e.strokeWidth,"stroke-linecap":e.strokeLinecap,"stroke-linejoin":e.strokeLinejoin,onClick:n[0]||=(...t)=>e.onClick&&e.onClick(...t)},n[1]||=[(0,t.createElementVNode)(`path`,{d:`m14.1 25.414-4.95 4.95a6 6 0 0 0 8.486 8.485l8.485-8.485a6 6 0 0 0 0-8.485m7.779.707 4.95-4.95a6 6 0 1 0-8.486-8.485l-8.485 8.485a6 6 0 0 0 0 8.485`},null,-1)],14,m)}var g=f(p,[[`render`,h]]),_=Object.assign(g,{install:(e,t)=>{let n=t?.iconPrefix??``;e.component(n+g.name,g)}}),v=(0,t.defineComponent)({name:`IconBulb`,props:{size:{type:[Number,String]},strokeWidth:{type:Number,default:4},strokeLinecap:{type:String,default:`butt`,validator:e=>[`butt`,`round`,`square`].includes(e)},strokeLinejoin:{type:String,default:`miter`,validator:e=>[`arcs`,`bevel`,`miter`,`miter-clip`,`round`].includes(e)},rotate:Number,spin:Boolean},emits:{click:e=>!0},setup(e,{emit:n}){let r=l(`icon`);return{cls:(0,t.computed)(()=>[r,`${r}-bulb`,{[`${r}-spin`]:e.spin}]),innerStyle:(0,t.computed)(()=>{let t={};return e.size&&(t.fontSize=d(e.size)?`${e.size}px`:e.size),e.rotate&&(t.transform=`rotate(${e.rotate}deg)`),t}),onClick:e=>{n(`click`,e)}}}}),y=[`stroke-width`,`stroke-linecap`,`stroke-linejoin`];function b(e,n,r,i,a,o){return(0,t.openBlock)(),(0,t.createElementBlock)(`svg`,{viewBox:`0 0 48 48`,fill:`none`,xmlns:`http://www.w3.org/2000/svg`,stroke:`currentColor`,class:(0,t.normalizeClass)(e.cls),style:(0,t.normalizeStyle)(e.innerStyle),"stroke-width":e.strokeWidth,"stroke-linecap":e.strokeLinecap,"stroke-linejoin":e.strokeLinejoin,onClick:n[0]||=(...t)=>e.onClick&&e.onClick(...t)},n[1]||=[(0,t.createElementVNode)(`path`,{d:`M17 42h14m6-24c0 2.823-.9 5.437-2.43 7.568-1.539 2.147-3.185 4.32-3.77 6.897l-.623 2.756A1 1 0 0 1 29.2 36H18.8a1 1 0 0 1-.976-.779l-.624-2.756c-.584-2.576-2.23-4.75-3.77-6.897A12.94 12.94 0 0 1 11 18c0-7.18 5.82-13 13-13s13 5.82 13 13Z`},null,-1)],14,y)}var x=f(v,[[`render`,b]]),S=Object.assign(x,{install:(e,t)=>{let n=t?.iconPrefix??``;e.component(n+x.name,x)}}),ee=(0,t.defineComponent)({name:`IconFile`,props:{size:{type:[Number,String]},strokeWidth:{type:Number,default:4},strokeLinecap:{type:String,default:`butt`,validator:e=>[`butt`,`round`,`square`].includes(e)},strokeLinejoin:{type:String,default:`miter`,validator:e=>[`arcs`,`bevel`,`miter`,`miter-clip`,`round`].includes(e)},rotate:Number,spin:Boolean},emits:{click:e=>!0},setup(e,{emit:n}){let r=l(`icon`);return{cls:(0,t.computed)(()=>[r,`${r}-file`,{[`${r}-spin`]:e.spin}]),innerStyle:(0,t.computed)(()=>{let t={};return e.size&&(t.fontSize=d(e.size)?`${e.size}px`:e.size),e.rotate&&(t.transform=`rotate(${e.rotate}deg)`),t}),onClick:e=>{n(`click`,e)}}}}),te=[`stroke-width`,`stroke-linecap`,`stroke-linejoin`];function C(e,n,r,i,a,o){return(0,t.openBlock)(),(0,t.createElementBlock)(`svg`,{viewBox:`0 0 48 48`,fill:`none`,xmlns:`http://www.w3.org/2000/svg`,stroke:`currentColor`,class:(0,t.normalizeClass)(e.cls),style:(0,t.normalizeStyle)(e.innerStyle),"stroke-width":e.strokeWidth,"stroke-linecap":e.strokeLinecap,"stroke-linejoin":e.strokeLinejoin,onClick:n[0]||=(...t)=>e.onClick&&e.onClick(...t)},n[1]||=[(0,t.createElementVNode)(`path`,{d:`M16 21h16m-16 8h10m11 13H11a2 2 0 0 1-2-2V8a2 2 0 0 1 2-2h21l7 7v27a2 2 0 0 1-2 2Z`},null,-1)],14,te)}var w=f(ee,[[`render`,C]]),T=Object.assign(w,{install:(e,t)=>{let n=t?.iconPrefix??``;e.component(n+w.name,w)}});function E(e,t=``,n=0){let r=[];if(!e)return r;if(e.type===`object`&&e.items&&!e.properties){if(e.items.type===`object`&&e.items.properties){let i=E(e.items,t,n);r.push(...i)}return r}if(e.type===`array`&&e.items){if(e.items.type===`object`&&e.items.properties){let i=E(e.items,t,n);r.push(...i)}return r}if(e.type===`object`&&e.properties){let i=e.required||[];for(let[a,o]of Object.entries(e.properties)){let e=t?`${t}.${a}`:a;if(o.type===`object`||o.type===`array`){let t=E(o,e,n+1);r.push(...t)}else r.push({key:e,name:a,label:o.label||o.title||a,type:o.type,description:o.description||``,level:n,required:i.includes(a)})}}return r}function D(e){if(!e)return{};if((e=>e?.items?.properties?Object.keys(e.items.properties).length===0:e?.properties?Object.keys(e.properties).length===0:!1)(e))return{模式:`自动推断`,说明:`Schema 不完整,将返回完整的原始数据`,数据路径:e.x_path||e.x_value||`@`};let t={};if(e.items?.properties){let n=e.items.properties;for(let[e,r]of Object.entries(n))t[e]={类型:r.type,路径:r.x_path,格式:r.format||`无`}}else if(e.properties){let n=e.properties;for(let[e,r]of Object.entries(n))r.type!==`object`&&r.type!==`array`&&(t[e]={类型:r.type,路径:r.x_path,格式:r.format||`无`})}return{数据路径:e.x_path||e.x_value||`@`,输出字段:t}}function O(e){return e?{接口路径:e.apiPath,入参配置:e.reqMapping||{},输出配置:D(e.res_schema)}:null}var k=(e,t)=>{let n=e.__vccOpts||e;for(let[e,r]of t)n[e]=r;return n},ne={name:`SchemaFieldEditor`,components:{AEmpty:n.Empty,ASpace:n.Space,ATag:n.Tag,AInput:n.Input,AButton:n.Button,ASelect:n.Select,AOption:n.Option,AOptgroup:n.Optgroup,ARow:n.Row,ACol:n.Col,IconFile:T,IconLink:_,IconBulb:S},props:{schema:{type:Object,required:!0},fieldPaths:{type:Object,default:()=>({})},fieldFormats:{type:Object,default:()=>({})}},emits:[`update`,`updateFormat`],setup(e,{emit:n}){let r=(0,t.computed)(()=>E(e.schema)),i=(0,t.ref)(null);return{fields:r,activeExampleField:i,handleInput:(e,t)=>{n(`update`,{key:e,path:t})},handleFormatChange:(e,t)=>{n(`updateFormat`,{key:e,format:t})},shouldShowFormat:e=>![`array`,`object`].includes(e.type),isDateField:e=>{let t=e.name.toLowerCase();return t.includes(`time`)||t.includes(`date`)||t.includes(`created`)||t.includes(`updated`)||e.type===`string`&&(e.format===`date`||e.format===`date-time`)},isNumberField:e=>e.type===`number`||e.type===`integer`,getPlaceholder:e=>`例如:@.${e.name}`,getExamples:e=>{let t=[],n=e.name;return e.type!==`array`&&e.type!==`object`?(t.push({path:`@.${n}`,desc:`直接取当前对象的字段`},{path:`@.data.${n}`,desc:`取 data 对象中的字段`},{path:`@.result.${n}`,desc:`取 result 对象中的字段`}),n.toLowerCase().includes(`id`)&&t.push({path:`@.${n}`,desc:`ID 字段(推荐)`}),n.toLowerCase().includes(`name`)&&t.push({path:`@.${n}`,desc:`名称字段(推荐)`})):e.type===`array`?t.push({path:`@.${n}`,desc:`直接取当前对象的数组`},{path:`@.data.${n}`,desc:`取 data 中的数组`},{path:`@.data.list`,desc:`取 data.list 数组`}):e.type===`object`&&t.push({path:`@.${n}`,desc:`直接取当前对象的子对象`},{path:`@.data.${n}`,desc:`取 data 中的子对象`}),t},showExamples:e=>{i.value===e.key?i.value=null:i.value=e.key},applyExample:(e,t)=>{n(`update`,{key:e,path:t}),i.value=null}}}},A={class:`schema-field-editor`},j={key:1,class:`field-list`},M={class:`field-header`},re={class:`field-name`},ie={class:`field-tags`},ae={class:`value-container`},N={class:`input-wrapper`},P={key:0,class:`examples-section`},F={class:`examples-header`},I={class:`examples-list`},L=[`onClick`],oe={class:`example-code`},se={class:`example-desc`};function R(e,n,r,i,a,o){let s=(0,t.resolveComponent)(`icon-file`),c=(0,t.resolveComponent)(`a-empty`),l=(0,t.resolveComponent)(`a-tag`),u=(0,t.resolveComponent)(`a-col`),d=(0,t.resolveComponent)(`icon-link`),f=(0,t.resolveComponent)(`icon-bulb`),p=(0,t.resolveComponent)(`a-button`),m=(0,t.resolveComponent)(`a-input`),h=(0,t.resolveComponent)(`a-option`),g=(0,t.resolveComponent)(`a-optgroup`),_=(0,t.resolveComponent)(`a-select`),v=(0,t.resolveComponent)(`a-row`);return(0,t.openBlock)(),(0,t.createElementBlock)(`div`,A,[i.fields.length===0?((0,t.openBlock)(),(0,t.createBlock)(c,{key:0,description:`未定义输出字段`},{image:(0,t.withCtx)(()=>[(0,t.createVNode)(s)]),default:(0,t.withCtx)(()=>[n[0]||=(0,t.createElementVNode)(`div`,{class:`empty-desc`},[(0,t.createTextVNode)(` 此 API 的 schema 定义不完整(缺少 items.properties)。`),(0,t.createElementVNode)(`br`),(0,t.createTextVNode)(` 保存后将自动返回完整的原始数据,无需配置字段映射。 `)],-1)]),_:1})):((0,t.openBlock)(),(0,t.createElementBlock)(`div`,j,[((0,t.openBlock)(!0),(0,t.createElementBlock)(t.Fragment,null,(0,t.renderList)(i.fields,e=>((0,t.openBlock)(),(0,t.createElementBlock)(`div`,{key:e.key,class:`field-item`},[(0,t.createVNode)(v,{gutter:8,class:`field-row`},{default:(0,t.withCtx)(()=>[(0,t.createVNode)(u,{span:5,class:`field-label-col`},{default:(0,t.withCtx)(()=>[(0,t.createElementVNode)(`div`,M,[(0,t.createElementVNode)(`span`,re,(0,t.toDisplayString)(e.label||e.name),1),(0,t.createElementVNode)(`div`,ie,[(0,t.createVNode)(l,{color:`arcoblue`,size:`small`,class:`type-tag`},{default:(0,t.withCtx)(()=>[(0,t.createTextVNode)((0,t.toDisplayString)(e.type),1)]),_:2},1024),e.required?((0,t.openBlock)(),(0,t.createBlock)(l,{key:0,color:`red`,size:`mini`,class:`required-tag`},{default:(0,t.withCtx)(()=>[...n[1]||=[(0,t.createTextVNode)(` 必填 `,-1)]]),_:1})):(0,t.createCommentVNode)(``,!0)])])]),_:2},1024),(0,t.createVNode)(u,{span:19,class:`field-value-col`},{default:(0,t.withCtx)(()=>[(0,t.createElementVNode)(`div`,ae,[(0,t.createElementVNode)(`div`,N,[(0,t.createVNode)(m,{"model-value":r.fieldPaths[e.key]||``,onInput:t=>i.handleInput(e.key,t),placeholder:i.getPlaceholder(e),"allow-clear":``,class:`path-input`},{prefix:(0,t.withCtx)(()=>[(0,t.createVNode)(d)]),suffix:(0,t.withCtx)(()=>[i.getExamples(e).length>0?((0,t.openBlock)(),(0,t.createBlock)(p,{key:0,onClick:t=>i.showExamples(e),type:`text`,size:`small`,class:`example-trigger-btn`},{icon:(0,t.withCtx)(()=>[(0,t.createVNode)(f)]),_:1},8,[`onClick`])):(0,t.createCommentVNode)(``,!0)]),_:2},1032,[`model-value`,`onInput`,`placeholder`])]),i.shouldShowFormat(e)?((0,t.openBlock)(),(0,t.createBlock)(v,{key:0,gutter:12,align:`center`,class:`format-row`},{default:(0,t.withCtx)(()=>[(0,t.createVNode)(u,{span:4},{default:(0,t.withCtx)(()=>[...n[2]||=[(0,t.createElementVNode)(`div`,{class:`format-label`},`格式化`,-1)]]),_:1}),(0,t.createVNode)(u,{span:20},{default:(0,t.withCtx)(()=>[(0,t.createVNode)(_,{"model-value":r.fieldFormats[e.key]||``,onChange:t=>i.handleFormatChange(e.key,t),placeholder:`选择格式化方式`,"allow-clear":``,size:`small`,class:`format-select`},{default:(0,t.withCtx)(()=>[(0,t.createVNode)(h,{value:``},{default:(0,t.withCtx)(()=>[...n[3]||=[(0,t.createTextVNode)(`无`,-1)]]),_:1}),i.isDateField(e)?((0,t.openBlock)(),(0,t.createBlock)(g,{key:0,label:`日期格式`},{default:(0,t.withCtx)(()=>[(0,t.createVNode)(h,{value:`YYYY-MM-DD`},{default:(0,t.withCtx)(()=>[...n[4]||=[(0,t.createTextVNode)(`YYYY-MM-DD`,-1)]]),_:1}),(0,t.createVNode)(h,{value:`YYYY-MM-DD HH:mm:ss`},{default:(0,t.withCtx)(()=>[...n[5]||=[(0,t.createTextVNode)(`YYYY-MM-DD HH:mm:ss`,-1)]]),_:1}),(0,t.createVNode)(h,{value:`YYYY/MM/DD`},{default:(0,t.withCtx)(()=>[...n[6]||=[(0,t.createTextVNode)(`YYYY/MM/DD`,-1)]]),_:1}),(0,t.createVNode)(h,{value:`timestamp`},{default:(0,t.withCtx)(()=>[...n[7]||=[(0,t.createTextVNode)(`时间戳(毫秒)`,-1)]]),_:1}),(0,t.createVNode)(h,{value:`timestamp_s`},{default:(0,t.withCtx)(()=>[...n[8]||=[(0,t.createTextVNode)(`时间戳(秒)`,-1)]]),_:1})]),_:1})):(0,t.createCommentVNode)(``,!0),i.isNumberField(e)?((0,t.openBlock)(),(0,t.createBlock)(g,{key:1,label:`数字格式`},{default:(0,t.withCtx)(()=>[(0,t.createVNode)(h,{value:`number`},{default:(0,t.withCtx)(()=>[...n[9]||=[(0,t.createTextVNode)(`数字`,-1)]]),_:1}),(0,t.createVNode)(h,{value:`integer`},{default:(0,t.withCtx)(()=>[...n[10]||=[(0,t.createTextVNode)(`整数`,-1)]]),_:1}),(0,t.createVNode)(h,{value:`currency`},{default:(0,t.withCtx)(()=>[...n[11]||=[(0,t.createTextVNode)(`货币`,-1)]]),_:1}),(0,t.createVNode)(h,{value:`percent`},{default:(0,t.withCtx)(()=>[...n[12]||=[(0,t.createTextVNode)(`百分比`,-1)]]),_:1})]),_:1})):(0,t.createCommentVNode)(``,!0),(0,t.createVNode)(g,{label:`通用格式`},{default:(0,t.withCtx)(()=>[(0,t.createVNode)(h,{value:`string`},{default:(0,t.withCtx)(()=>[...n[13]||=[(0,t.createTextVNode)(`字符串`,-1)]]),_:1}),(0,t.createVNode)(h,{value:`boolean`},{default:(0,t.withCtx)(()=>[...n[14]||=[(0,t.createTextVNode)(`布尔值`,-1)]]),_:1}),(0,t.createVNode)(h,{value:`json`},{default:(0,t.withCtx)(()=>[...n[15]||=[(0,t.createTextVNode)(`JSON`,-1)]]),_:1})]),_:1})]),_:2},1032,[`model-value`,`onChange`])]),_:2},1024)]),_:2},1024)):(0,t.createCommentVNode)(``,!0)])]),_:2},1024)]),_:2},1024),i.activeExampleField===e.key?((0,t.openBlock)(),(0,t.createElementBlock)(`div`,P,[(0,t.createElementVNode)(`div`,F,[(0,t.createVNode)(f,{class:`examples-icon`}),n[16]||=(0,t.createElementVNode)(`span`,{class:`examples-title`},`常用路径示例`,-1)]),(0,t.createElementVNode)(`div`,I,[((0,t.openBlock)(!0),(0,t.createElementBlock)(t.Fragment,null,(0,t.renderList)(i.getExamples(e),(n,r)=>((0,t.openBlock)(),(0,t.createElementBlock)(`div`,{key:r,class:`example-item`,onClick:t=>i.applyExample(e.key,n.path)},[(0,t.createElementVNode)(`code`,oe,(0,t.toDisplayString)(n.path),1),(0,t.createElementVNode)(`span`,se,(0,t.toDisplayString)(n.desc),1)],8,L))),128))]),n[17]||=(0,t.createElementVNode)(`div`,{class:`examples-footer`},` 点击示例可直接应用 `,-1)])):(0,t.createCommentVNode)(``,!0)]))),128))]))])}var ce=k(ne,[[`render`,R],[`__scopeId`,`data-v-8fa96dae`]]);function le(e,t){if(!t)return e;let n=t.toLowerCase(),r=e=>{let t=e.name?.toLowerCase().includes(n),i=e.apiPath?.toLowerCase().includes(n),a=t||i;if(e.isLeaf||e.apiPath||!e.children||e.children.length===0)return a?{...e,highlighted:!0}:null;if(e.children&&e.children.length>0){let t=e.children.map(e=>r(e)).filter(e=>e!==null);if(a)return{...e,children:e.children,expanded:!0,highlighted:!0};if(t.length>0)return{...e,children:t,expanded:!0}}return null};return e.map(e=>r(e)).filter(e=>e!==null)}function ue(e,t){if(!e||!t)return!1;let n=t.replace(/\./g,`\\.`).replace(/\*/g,`.*`);return RegExp(`^${n}$`).test(e)}function de(e,t){if(!e||e.trim()===``)return{};try{let n=e;if(t===`template`){let t=new Map,r=0;n=e.replace(/\$\{([^}]+)\}/g,(e,n)=>{let i=`"__TEMPLATE_${r}__"`;return t.set(i,e),r++,i});let i=JSON.parse(n),a=e=>{if(typeof e==`string`){for(let[n,r]of t.entries())if(e===n.replace(/"/g,``))return r;return e}else if(typeof e==`object`&&e){if(Array.isArray(e))return e.map(a);{let t={};for(let[n,r]of Object.entries(e))t[n]=a(r);return t}}return e};return a(i)}let r=JSON.parse(n);if(typeof r!=`object`||Array.isArray(r))throw Error(`入参配置必须是对象格式`);return r}catch(e){throw Error(`JSON 格式错误:`+e.message)}}function fe(e,t){if(!e||Object.keys(e).length===0)return{valid:!0,error:``};try{for(let[n,r]of Object.entries(e))if(t===`template`)typeof r==`string`&&!r.includes("${")&&console.warn(`字段 "${n}" 的值不包含模板变量,建议使用固定值模式`);else if(t===`function`&&typeof r==`string`&&!r.includes(`=>`))return{valid:!1,error:`字段 "${n}" 的值不是有效的函数表达式`};return{valid:!0,error:``}}catch(e){return{valid:!1,error:e.message}}}var z=a({applyFormat:()=>H,executeReqMapping:()=>W,extractDataBySchema:()=>B});function B(e,t){if(!t||typeof t!=`object`)return e;if(t.x_path?e=V(e,t.x_path):t.x_value&&(e=V(e,t.x_value)),Array.isArray(e)){if(t.items)return pe(e,{type:`array`,items:t.items})}else if(t.type===`object`&&t.properties)return me(e,t);return t.format&&e!=null&&(e=H(e,t.format)),e}function pe(e,t){let n=[];if(!Array.isArray(e))return[];if(!t||!t.items||typeof t.items!=`object`)return e;let r=t.items?.properties;return r&&Object.keys(r).length>0?(e.forEach(e=>{let t={};for(let[n,i]of Object.entries(r)){if(!i||typeof i!=`object`){t[n]=void 0;continue}let r=i.x_path;if(r){let a=V(e,r),o=i.format;o&&a!=null&&(a=H(a,o)),t[n]=a}else t[n]=void 0}n.push(t)}),n):t.items?.x_path?e.map(e=>{let n=V(e,t.items.x_path);return t.items.format&&n!=null&&(n=H(n,t.items.format)),n}):e}function me(e,t){let n={};if(!t||typeof t!=`object`)return e;let r=t.properties;if(!(r&&Object.keys(r).length>0)){if(t.x_path){let n=V(e,t.x_path);return t.format&&n!=null&&(n=H(n,t.format)),n}return e}for(let[r,i]of Object.entries(t.properties)){if(!i||typeof i!=`object`){n[r]=void 0;continue}if(i.x_path){let t=V(e,i.x_path),a=i.format;a&&t!=null&&(t=H(t,a)),n[r]=t}else n[r]=void 0}return n}function V(e,t){if(!t||typeof t!=`string`)return;let n=t.replace(/^[$@]\.?/,``).split(/[\.\[\]]/).filter(e=>e!==``&&e!==`*`),r=e;for(let e of n){if(r==null)return;r=r[e]}return r}function H(e,t){try{switch(t){case`YYYY-MM-DD`:return U(e,`YYYY-MM-DD`);case`YYYY-MM-DD HH:mm:ss`:return U(e,`YYYY-MM-DD HH:mm:ss`);case`YYYY/MM/DD`:return U(e,`YYYY/MM/DD`);case`timestamp`:return new Date(e).getTime();case`timestamp_s`:return Math.floor(new Date(e).getTime()/1e3);case`number`:return Number(e);case`integer`:return Math.floor(Number(e));case`currency`:return`¥`+Number(e).toLocaleString(`zh-CN`,{minimumFractionDigits:2,maximumFractionDigits:2});case`percent`:return(Number(e)*100).toFixed(2)+`%`;case`uppercase`:return String(e).toUpperCase();case`lowercase`:return String(e).toLowerCase();case`trim`:return String(e).trim();case`string`:return String(e);case`boolean`:return!!e;case`json`:return JSON.stringify(e);default:return e}}catch(t){return console.error(`格式化失败:`,t),e}}function U(e,t){let n=new Date(e);if(isNaN(n.getTime()))return String(e);let r=n.getFullYear(),i=String(n.getMonth()+1).padStart(2,`0`),a=String(n.getDate()).padStart(2,`0`),o=String(n.getHours()).padStart(2,`0`),s=String(n.getMinutes()).padStart(2,`0`),c=String(n.getSeconds()).padStart(2,`0`);return t.replace(`YYYY`,String(r)).replace(`MM`,i).replace(`DD`,a).replace(`HH`,o).replace(`mm`,s).replace(`ss`,c).replace(`/`,`/`)}function W(e,t={}){if(!e)return{};let n={};for(let[r,i]of Object.entries(e))if(typeof i==`string`)if(i.includes(`=>`))try{n[r]=Function(`ctx`,`return (${i})(ctx)`)(t)}catch(e){console.error(`执行函数表达式失败 [${r}]:`,e),n[r]=i}else if(i.match(/^\$\{[^}]+\}$/)){let e=t[i.match(/^\$\{([^}]+)\}$/)[1]];n[r]=e===void 0?i:e}else if(i.includes("${"))try{let e=i.replace(/\$\{([^}]+)\}/g,(e,n)=>t[n]===void 0?e:t[n]);if(e!==i){let t=Number(e);!isNaN(t)&&e.trim()!==``?n[r]=t:n[r]=e}else n[r]=e}catch(e){console.error(`解析模板字符串失败 [${r}]:`,e),n[r]=i}else n[r]=i;else n[r]=i;return n}var G=i((()=>{}));G();function K(e,t=null){if(t){let n=t.replace(/^@\./,``).split(`.`),r=e;for(let e of n)if(r&&typeof r==`object`)r=r[e];else{r=null;break}if(Array.isArray(r))return r}if(Array.isArray(e))return e;if(typeof e==`object`&&e){let t=[`data`,`list`,`items`,`records`,`rows`,`result`,`content`];for(let n of t){if(Array.isArray(e[n]))return e[n];if(e[n]&&typeof e[n]==`object`){for(let r of t)if(Array.isArray(e[n][r]))return e[n][r]}}return[e]}return[]}function he(e,t,n={},r={}){if(!e||typeof e!=`object`)return e;let i={};for(let[a,o]of Object.entries(t)){let t;if(typeof o==`function`)t=o(e);else if(typeof o==`string`){let n=o.split(`.`);t=e;for(let e of n)if(t&&typeof t==`object`)t=t[e];else{t=void 0;break}}else if(Array.isArray(o))for(let n of o){let r=e[n];if(r!=null&&r!==``){t=r;break}}else t=o;let s=n[a];s&&t!=null&&(t=ge(t,s));let c=r[a];c&&t!=null&&(t=H(t,c)),i[a]=t}return i}function ge(e,t){try{switch(t){case`string`:return typeof e==`object`&&e?e:String(e);case`number`:return Number(e);case`integer`:return Math.floor(Number(e));case`boolean`:return!!e;case`date`:return e;default:return e}}catch(t){return console.error(`类型转换失败:`,t),e}}function q(e,t){console.log(`=== applyFilter 调试信息 ===`),console.log(`1. 原始响应:`,e),console.log(`2. 过滤器配置:`,t);let n=K(e,t.arrayPath);return console.log(`3. 提取的数组 (extractArray):`,n),t.itemFilter&&typeof t.itemFilter==`function`&&(n=n.filter(t.itemFilter),console.log(`4. 过滤后 (itemFilter):`,n)),t.fieldMapping?(console.log(`5. 应用字段映射:`,t.fieldMapping),n=n.map(e=>he(e,t.fieldMapping,t.fieldTypes||{},t.fieldFormats||{})),console.log(`6. 映射后的数据:`,n)):console.log(`5. 没有配置字段映射,返回原始数据`),t.itemTransform&&typeof t.itemTransform==`function`&&(n=n.map(t.itemTransform),console.log(`7. 自定义转换后:`,n)),console.log(`8. 最终返回的数据:`,n),console.log(`=== applyFilter 结束 ===`),n}var J=e=>K(e).map(e=>typeof e==`string`?e:typeof e==`object`?e.content||e.title||e.message||e.text||e.notice||``:String(e)),Y=e=>K(e),X=e=>K(e),Z=e=>e,Q={notice:J,news:Y,menu:X,user:Z};function _e(e,t){let n=Q[t];return n?n(e):K(e)}async function ve(e,t,n={}){if(!e||!e.apiPath)throw Error(`缺少必要的配置: apiPath`);let r={};if(e.reqMapping){let{executeReqMapping:t}=await Promise.resolve().then(()=>(G(),z));r=t(e.reqMapping,n)}let i=await t({api:e.apiPath,params:r,config:{access_token:!0,...e.requestConfig}}),a=i.response||i.data||i;if(e.mode===`filter`&&e.filterConfig)return q(a,e.filterConfig);if(e.res_schema){let{extractDataBySchema:t}=await Promise.resolve().then(()=>(G(),z));return t(a,e.res_schema)}else return K(a)}var ye={name:`ApiConfig`,components:{ATree:n.Tree,ASelect:n.Select,AOption:n.Option,AOptgroup:n.Optgroup,SchemaFieldEditor:ce},props:{resSchema:{type:Object,required:!1,default:null},includePattern:{type:Array,default:()=>[]},excludePattern:{type:Array,default:()=>[]},apiListUrl:{type:String,default:``},apiLoader:{type:Function,default:async()=>{try{let{request:e}=await import(`@tuoyuan/gateway-request-lib`),t=await e({api:`/api/system.domain.get_func_tree`,params:{},config:{access_token:!0}});if(Array.isArray(t))return t;if(t?.data){if(Array.isArray(t.data))return t.data;if(t.data?.list)return t.data.list}return[]}catch(e){return console.error(`默认 API 加载器失败:`,e),null}}},initialConfig:{type:Object,default:null}},emits:[`save`,`change`],setup(e,{emit:n}){let r=(0,t.ref)(!1),i=(0,t.ref)(``),a=(0,t.ref)([]),o=(0,t.ref)(``),s=(0,t.ref)([]),c=(0,t.ref)(null),l=(0,t.ref)([]),u=(0,t.ref)([]),d=(0,t.ref)(`fixed`),f=(0,t.ref)(`{
|
|
2
|
+
"page_no": 1,
|
|
3
|
+
"page_size": 100
|
|
4
|
+
}`),p=(0,t.ref)(``),m=(0,t.ref)({}),h=(0,t.ref)({}),g=(0,t.ref)({arrayPath:``,fieldMapping:{}}),_=(0,t.ref)([]),v=(0,t.ref)(!1),y=(0,t.ref)(null),b=(0,t.ref)(``),x=(0,t.ref)([]),S=(0,t.computed)(()=>{if(!N.value)return[];try{if(N.value.type===`array`&&N.value.items){let e=N.value.items.properties;if(e&&typeof e==`object`)return Object.keys(e)}if(N.value.properties&&typeof N.value.properties==`object`)return Object.keys(N.value.properties)}catch(e){console.warn(`提取 Schema 字段失败:`,e)}return[]}),ee=(0,t.computed)(()=>{if(!y.value||!g.value.arrayPath)return null;try{return K(y.value,g.value.arrayPath)}catch(e){return console.error(`提取数组失败:`,e),null}}),te=async()=>{if(!c.value){alert(`请先选择一个 API`);return}v.value=!0,y.value=null,b.value=``,x.value=[];try{let{request:e}=await import(`@tuoyuan/gateway-request-lib`),t={};try{if(f.value&&f.value.trim()!==`{}`){let e=JSON.parse(f.value);t=Object.fromEntries(Object.entries(e).filter(([e,t])=>typeof t!=`string`||!t.includes(`=>`)))}}catch(e){console.warn(`解析入参失败,使用空参数测试:`,e)}let n=await e({api:c.value.apiPath,params:t,config:{access_token:!0}}),r=n.response||n.data||n;y.value=r,C(r)}catch(e){console.error(`测试接口失败:`,e),alert(`测试接口失败: `+e.message)}finally{v.value=!1}},C=e=>{let t=[],n=[],r=(e,n=``)=>{if(Array.isArray(e)){t.push({path:n||`@`,array:e});return}e&&typeof e==`object`&&Object.keys(e).forEach(t=>{r(e[t],n?`${n}.${t}`:t)})};r(e);let i=t.find(e=>e.path.includes(`list`)||e.path.includes(`data`)||e.path.includes(`items`))||t[0];i&&(b.value=i.path,n=i.array),n.length>0&&typeof n[0]==`object`&&(x.value=Object.keys(n[0]))},w=e=>{if(_.value.some(t=>t.target===e)){alert(`字段 "${e}" 已存在`);return}_.value.push({target:e,source:e,type:`string`,format:``})},T=()=>{g.value.arrayPath=b.value},D=e=>{try{return JSON.stringify(e,null,2)}catch{return String(e)}},O=()=>{_.value.push({target:``,source:``,type:`string`,format:``})},k=e=>{_.value.splice(e,1)};(0,t.watch)(d,e=>{f.value={fixed:`{
|
|
5
|
+
"page_no": 1,
|
|
6
|
+
"page_size": 100
|
|
7
|
+
}`,template:`{
|
|
8
|
+
"page_no": "{{pageNum}}",
|
|
9
|
+
"page_size": "{{pageSize}}"
|
|
10
|
+
}`,function:`{
|
|
11
|
+
"page_no": "(ctx) => Number(ctx.pageNum) || 1",
|
|
12
|
+
"page_size": "(ctx) => Number(ctx.pageSize) || 10"
|
|
13
|
+
}`}[e]}),(0,t.watch)(_,e=>{let t={},n={},r={};e.forEach(e=>{if(e.target&&e.source){let i=e.source.split(`,`).map(e=>e.trim()).filter(e=>e);i.length===1?t[e.target]=i[0]:i.length>1&&(t[e.target]=i),e.type&&(n[e.target]=e.type),e.format&&(r[e.target]=e.format)}}),g.value.fieldMapping=t,g.value.fieldTypes=n,g.value.fieldFormats=r},{deep:!0});let ne=(0,t.computed)(()=>A(s.value)),A=(e,t=``)=>e.map((e,n)=>{let r=t?`${t}-${n}-${e.id}`:`${n}-${e.id}`;return{key:r,title:e.name,name:e.name,apiPath:e.apiPath,isLeaf:e.isLeaf,_raw:e._raw,selectable:!!e.isLeaf,children:e.children&&e.children.length>0?A(e.children,r):void 0}}),j=(e,t=``,n=[])=>(e.forEach((e,r)=>{let i=t?`${t}-${r}-${e.id}`:`${r}-${e.id}`;e.isLeaf||n.push(i),e.children&&e.children.length>0&&j(e.children,i,n)}),n),M=(0,t.computed)(()=>o.value?j(s.value):s.value.map(e=>e.id));(0,t.watch)([s,o],()=>{u.value=M.value},{immediate:!0});let re=(e,t)=>{if(e.length===0)return;let n=e[0],r=t.node;r.isLeaf&&(l.value=[n],pe(r))},ie=e=>{console.log(`Tree expand event:`,e),u.value=e},ae=(0,t.computed)(()=>{if(!N.value)return!1;if(N.value.items){let e=N.value.items.properties;return!e||Object.keys(e).length===0}let e=N.value.properties;return!e||Object.keys(e).length===0}),N=(0,t.ref)(e.resSchema),P=(0,t.ref)(null),F=(0,t.computed)(()=>P.value?E(P.value):[]),I=(0,t.computed)(()=>({fixed:`{
|
|
14
|
+
"page_no": 1,
|
|
15
|
+
"page_size": 100
|
|
16
|
+
}`,template:`{
|
|
17
|
+
"page_no": "{{pageNum}}",
|
|
18
|
+
"page_size": "{{pageSize}}"
|
|
19
|
+
}`,function:`{
|
|
20
|
+
"page_no": "(ctx) => Number(ctx.pageNum) || 1",
|
|
21
|
+
"page_size": "(ctx) => Number(ctx.pageSize) || 10"
|
|
22
|
+
}`})[d.value]),L=(0,t.computed)(()=>c.value?_.value.some(e=>e.target&&e.source)&&!p.value:!1),oe=(0,t.computed)(()=>{if(!P.value||!F.value.length)return[];let e={};try{f.value&&f.value.trim()!==`{}`&&(e=JSON.parse(f.value))}catch{return[]}return F.value.filter(e=>e.required).filter(t=>{let n=e[t.name];return n==null||n===``}).map(e=>e.name)}),se=async()=>{r.value=!0,i.value=``;try{let t;if(e.apiLoader){if(t=await e.apiLoader(),t===null){i.value=`请配置 apiListUrl 或提供 apiLoader 函数`,r.value=!1;return}}else if(e.apiListUrl){let n=await fetch(e.apiListUrl);if(!n.ok)throw Error(`HTTP ${n.status}: ${n.statusText}`);let r=await n.json();if(r.code===1e4&&r.data&&r.data.list)t=r.data.list;else if(Array.isArray(r))t=r;else if(r.data&&Array.isArray(r.data))t=r.data;else throw Error(r.msg||`接口返回数据格式错误`)}let n=e=>e.map(e=>{let r={id:String(e.id||e.func_id),name:e.name||e.func_name,children:[],expanded:!1};if(e.children&&e.children.length>0&&r.children.push(...n(e.children)),e.funcs&&e.funcs.length>0){let n=e.funcs.map(e=>{let n=e.api||e.path||e.func_path||e.api_path;if(!n&&e.meta_domain&&e.tag){let r=(e,t)=>{for(let n of e){if(n.id===t)return n.name;if(n.children){let e=r(n.children,t);if(e)return e}}return null};r(t,e.meta_domain),n=`/api/${e.tag}`}return n||=e.name||`(未知路径)`,{id:String(e.id||e.func_id),name:e.name||e.func_name||`(未命名)`,apiPath:n,isLeaf:!0,_raw:e}});r.children.push(...n)}return r.children.length===0&&!e.funcs&&!e.children&&(r.isLeaf=!0,r.apiPath=e.path||e.name),r});a.value=n(t),R()}catch(e){i.value=`加载 API 列表失败:`+e.message,console.error(`加载 API 列表失败:`,e)}finally{r.value=!1}},R=()=>{let t=[...a.value];(e.includePattern.length>0||e.excludePattern.length>0)&&(t=ce(t,e.includePattern,e.excludePattern)),o.value&&(t=le(t,o.value)),s.value=t},ce=(e,t,n)=>{let r=e=>{if((e.isLeaf||e.apiPath)&&e.apiPath)return n.some(t=>ue(e.apiPath,t))||t.length>0&&!t.some(t=>ue(e.apiPath,t))?null:e;if(e.children?.length>0){let t=e.children.map(r).filter(Boolean);return t.length>0?{...e,children:t}:null}return null};return e.map(r).filter(Boolean)},z=()=>{R()},B=(e,t)=>{if(!e)return null;let n=e,r=null,i=[{check:()=>e.properties?.data?.properties?.list,path:`@.data.list`,schema:()=>e.properties.data.properties.list},{check:()=>e.properties?.list,path:`@.list`,schema:()=>e.properties.list},{check:()=>e.type===`array`,path:`@`,schema:()=>e}];for(let{check:e,path:t,schema:a}of i)if(e()){r=t,n=a();break}return!r&&t?.includes(`list`)&&e.properties?.data&&(r=`@.data.list`,n={type:`array`,items:{type:`object`,properties:{}}}),r&&n?.type===`array`?{type:`array`,x_path:r,items:n.items}:r?{...n,x_path:r}:n},pe=t=>{c.value=t,f.value=`{
|
|
23
|
+
"page_no": 1,
|
|
24
|
+
"page_size": 100
|
|
25
|
+
}`,p.value=``,m.value={},h.value={},g.value={arrayPath:``,fieldMapping:{}},_.value=[],y.value=null,b.value=``,x.value=[];let r=t._raw?.res_schema||t._raw?.schema?.res_schema||t.res_schema,i=t._raw?.req_schema||t._raw?.schema?.req_schema||t.req_schema;if(N.value=B(r,t.apiPath)||e.resSchema,P.value=i,N.value?.x_path&&(g.value.arrayPath=N.value.x_path.replace(/^@\./,``)),i&&F.value.length>0){let e=Object.fromEntries(F.value.map(e=>[e.name,e.type===`number`||e.type===`integer`?+!!e.name.includes(`page`):e.type===`boolean`?!0:``]));f.value=JSON.stringify(e,null,2)}n(`change`,{api:t,config:null,resSchema:N.value})},me=({key:e,path:t})=>{m.value[e]=t},V=({key:e,format:t})=>{h.value[e]=t};(0,t.watch)([f,d],()=>{try{p.value=fe(de(f.value,d.value),d.value).error||``}catch(e){p.value=e.message}});let H=()=>{if(L.value)try{let e=null;f.value.trim()!==`{}`&&f.value.trim()!==``&&(e=de(f.value,d.value)),n(`save`,{apiPath:c.value.apiPath,reqMapping:e,mode:`filter`,filterConfig:{arrayPath:g.value.arrayPath||null,fieldMapping:g.value.fieldMapping,fieldTypes:g.value.fieldTypes||{},fieldFormats:g.value.fieldFormats||{}}})}catch(e){alert(`保存失败:`+e.message),console.error(`保存配置失败:`,e)}},U=()=>{confirm(`确定要重置所有配置吗?`)&&(c.value=null,f.value=`{
|
|
26
|
+
"page_no": 1,
|
|
27
|
+
"page_size": 100
|
|
28
|
+
}`,p.value=``,m.value={},h.value={},g.value={arrayPath:``,fieldMapping:{},fieldTypes:{},fieldFormats:{}},_.value=[],o.value=``,R())},W=()=>{if(!e.initialConfig)return;let t=e.initialConfig;if(t.reqMapping){let e=Object.values(t.reqMapping)[0];typeof e==`string`&&e.includes("${")?d.value=`template`:typeof e==`string`&&e.includes(`=>`)?d.value=`function`:d.value=`fixed`,f.value=JSON.stringify(t.reqMapping,null,2)}if(t.filterConfig){let e=t.filterConfig;g.value.arrayPath=e.arrayPath||``,g.value.fieldMapping=e.fieldMapping||{},g.value.fieldTypes=e.fieldTypes||{},g.value.fieldFormats=e.fieldFormats||{},_.value=[],Object.entries(e.fieldMapping||{}).forEach(([t,n])=>{let r=Array.isArray(n)?n.join(`,`):n;_.value.push({target:t,source:r,type:e.fieldTypes?.[t]||`string`,format:e.fieldFormats?.[t]||``})})}};return(0,t.onMounted)(()=>{se(),W()}),(0,t.watch)([()=>e.includePattern,()=>e.excludePattern],()=>{R()},{deep:!0}),{loading:r,error:i,searchKeyword:o,filteredApiTree:s,treeData:ne,defaultExpandedKeys:M,expandedKeys:u,selectedApi:c,selectedKeys:l,filterConfig:g,filterFieldMappings:_,testingApi:v,testApiResult:y,extractedArrayPreview:ee,detectedArrayPath:b,detectedFields:x,resSchemaFields:S,reqMappingMode:d,reqMappingText:f,reqMappingError:p,reqMappingPlaceholder:I,fieldPaths:m,fieldFormats:h,currentResSchema:N,currentReqSchema:P,reqSchemaFields:F,isSchemaIncomplete:ae,canSave:L,missingRequiredParams:oe,handleSearch:z,handleTreeSelect:re,handleTreeExpand:ie,handleUpdateFieldPath:me,handleUpdateFieldFormat:V,handleTestApi:te,applyDetectedPath:T,quickAddField:w,formatJson:D,addFieldMapping:O,removeFieldMapping:k,handleSave:H,handleReset:U}}},be={class:`api-config-component`},xe={class:`left-panel`},Se={class:`search-box`},Ce={class:`api-tree-container`},we={key:0,class:`loading`},Te={key:1,class:`error`},Ee={key:2,class:`empty`},De={class:`tree-node-content`},Oe={class:`node-name`},ke={key:0,class:`node-path`},Ae={class:`right-panel`},je={key:0,class:`empty-state`},Me={key:1,class:`config-container`},Ne={class:`selected-api-info`},Pe={class:`api-info-card`},Fe={class:`info-row`},Ie={class:`value`},Le={class:`info-row`},Re={class:`value code`},ze={class:`req-mapping-section`},Be={key:0,class:`req-schema-hint`},Ve={class:`req-params-list`},He={class:`param-name`},Ue={class:`param-type`},We={key:0,class:`param-required`},Ge={key:1,class:`param-optional`},Ke={key:2,class:`param-desc`},qe={key:0,class:`missing-params-warning`},Je={class:`warning-content`},Ye={class:`warning-text`},Xe={class:`req-mapping-container`},Ze={class:`req-mode-selector`},Qe={title:`直接填写固定的参数值,适合不需要动态变化的场景`},$e={title:"使用 ${变量名} 语法引用外部变量,适合需要动态传参的场景"},et={title:`使用函数处理参数,可以进行复杂的数据转换和逻辑处理`},tt={class:`req-mapping-editor`},nt=[`placeholder`],rt={key:0,class:`error-message`},it={class:`filter-mode-section`},at={class:`test-api-section`},ot={key:0,class:`test-result-panel`},st={class:`result-header`},ct={key:0,class:`detected-path`},lt={class:`detected-value`},ut={key:1,class:`detected-fields`},dt={class:`fields-grid`},ft=[`onClick`],pt={key:1,class:`schema-fields-hint`},mt={class:`fields-grid`},ht=[`onClick`,`title`],gt={class:`filter-config-item`},_t={class:`filter-config-item`},vt={class:`config-label-row`},yt={key:0,class:`empty-hint`},bt={class:`mapping-col mapping-col-target`},xt=[`onUpdate:modelValue`],St={class:`mapping-col mapping-col-source`},Ct=[`onUpdate:modelValue`],wt={class:`mapping-col mapping-col-type`},Tt={class:`mapping-col mapping-col-format`},Et={class:`action-section`},Dt=[`disabled`];function Ot(e,n,r,i,a,o){let s=(0,t.resolveComponent)(`a-tree`),c=(0,t.resolveComponent)(`a-button`),l=(0,t.resolveComponent)(`a-option`),u=(0,t.resolveComponent)(`a-select`),d=(0,t.resolveComponent)(`a-optgroup`);return(0,t.openBlock)(),(0,t.createElementBlock)(`div`,be,[(0,t.createElementVNode)(`div`,xe,[n[11]||=(0,t.createElementVNode)(`div`,{class:`panel-header`},[(0,t.createElementVNode)(`h3`,null,`网关接口配置`)],-1),(0,t.createElementVNode)(`div`,Se,[(0,t.withDirectives)((0,t.createElementVNode)(`input`,{"onUpdate:modelValue":n[0]||=e=>i.searchKeyword=e,type:`text`,placeholder:`搜索接口名称或路径...`,class:`search-input`,onInput:n[1]||=(...e)=>i.handleSearch&&i.handleSearch(...e)},null,544),[[t.vModelText,i.searchKeyword]]),n[10]||=(0,t.createElementVNode)(`span`,{class:`search-icon`},`🔍`,-1)]),n[12]||=(0,t.createElementVNode)(`div`,{class:`section-title`},`选择 API 接口`,-1),(0,t.createElementVNode)(`div`,Ce,[i.loading?((0,t.openBlock)(),(0,t.createElementBlock)(`div`,we,`加载中...`)):i.error?((0,t.openBlock)(),(0,t.createElementBlock)(`div`,Te,(0,t.toDisplayString)(i.error),1)):i.filteredApiTree.length===0?((0,t.openBlock)(),(0,t.createElementBlock)(`div`,Ee,(0,t.toDisplayString)(i.searchKeyword?`未找到匹配的接口`:`暂无可用接口`),1)):((0,t.openBlock)(),(0,t.createBlock)(s,{key:3,data:i.treeData,"default-expand-all":!1,"expanded-keys":i.expandedKeys,"selected-keys":i.selectedKeys,"show-line":!1,onSelect:i.handleTreeSelect,onExpand:i.handleTreeExpand},{title:(0,t.withCtx)(e=>[(0,t.createElementVNode)(`div`,De,[(0,t.createElementVNode)(`span`,Oe,(0,t.toDisplayString)(e.name),1),e.apiPath?((0,t.openBlock)(),(0,t.createElementBlock)(`span`,ke,(0,t.toDisplayString)(e.apiPath),1)):(0,t.createCommentVNode)(``,!0)])]),_:1},8,[`data`,`expanded-keys`,`selected-keys`,`onSelect`,`onExpand`]))])]),(0,t.createElementVNode)(`div`,Ae,[i.selectedApi?((0,t.openBlock)(),(0,t.createElementBlock)(`div`,Me,[(0,t.createElementVNode)(`div`,Ne,[n[16]||=(0,t.createElementVNode)(`div`,{class:`section-title`},`当前选中接口`,-1),(0,t.createElementVNode)(`div`,Pe,[(0,t.createElementVNode)(`div`,Fe,[n[14]||=(0,t.createElementVNode)(`span`,{class:`label`},`接口名称:`,-1),(0,t.createElementVNode)(`span`,Ie,(0,t.toDisplayString)(i.selectedApi.name),1)]),(0,t.createElementVNode)(`div`,Le,[n[15]||=(0,t.createElementVNode)(`span`,{class:`label`},`接口路径:`,-1),(0,t.createElementVNode)(`span`,Re,(0,t.toDisplayString)(i.selectedApi.apiPath),1)])])]),(0,t.createElementVNode)(`div`,ze,[n[27]||=(0,t.createElementVNode)(`div`,{class:`section-title`},[(0,t.createTextVNode)(` 入参配置 `),(0,t.createElementVNode)(`span`,{class:`section-subtitle`},`(可选)`)],-1),i.currentReqSchema?((0,t.openBlock)(),(0,t.createElementBlock)(`div`,Be,[n[20]||=(0,t.createElementVNode)(`div`,{class:`hint-title`},`📋 接口请求参数:`,-1),(0,t.createElementVNode)(`div`,Ve,[((0,t.openBlock)(!0),(0,t.createElementBlock)(t.Fragment,null,(0,t.renderList)(i.reqSchemaFields,e=>((0,t.openBlock)(),(0,t.createElementBlock)(`div`,{key:e.key,class:`param-item`},[(0,t.createElementVNode)(`span`,He,(0,t.toDisplayString)(e.name),1),(0,t.createElementVNode)(`span`,Ue,(0,t.toDisplayString)(e.type),1),e.required?((0,t.openBlock)(),(0,t.createElementBlock)(`span`,We,`必填`)):((0,t.openBlock)(),(0,t.createElementBlock)(`span`,Ge,`可选`)),e.description?((0,t.openBlock)(),(0,t.createElementBlock)(`span`,Ke,(0,t.toDisplayString)(e.description),1)):(0,t.createCommentVNode)(``,!0)]))),128))]),i.missingRequiredParams.length>0?((0,t.openBlock)(),(0,t.createElementBlock)(`div`,qe,[n[19]||=(0,t.createElementVNode)(`div`,{class:`warning-icon`},`⚠️`,-1),(0,t.createElementVNode)(`div`,Je,[n[18]||=(0,t.createElementVNode)(`div`,{class:`warning-title`},`缺少必填参数`,-1),(0,t.createElementVNode)(`div`,Ye,[n[17]||=(0,t.createTextVNode)(` 以下参数是必填的,但未在入参配置中提供: `,-1),(0,t.createElementVNode)(`strong`,null,(0,t.toDisplayString)(i.missingRequiredParams.join(`、`)),1)])])])):(0,t.createCommentVNode)(``,!0)])):(0,t.createCommentVNode)(``,!0),(0,t.createElementVNode)(`div`,Xe,[(0,t.createElementVNode)(`div`,Ze,[(0,t.createElementVNode)(`label`,Qe,[(0,t.withDirectives)((0,t.createElementVNode)(`input`,{type:`radio`,"onUpdate:modelValue":n[2]||=e=>i.reqMappingMode=e,value:`fixed`},null,512),[[t.vModelRadio,i.reqMappingMode]]),n[21]||=(0,t.createElementVNode)(`span`,null,`固定值`,-1),n[22]||=(0,t.createElementVNode)(`span`,{class:`mode-hint`},`直接填写固定参数`,-1)]),(0,t.createElementVNode)(`label`,$e,[(0,t.withDirectives)((0,t.createElementVNode)(`input`,{type:`radio`,"onUpdate:modelValue":n[3]||=e=>i.reqMappingMode=e,value:`template`},null,512),[[t.vModelRadio,i.reqMappingMode]]),n[23]||=(0,t.createElementVNode)(`span`,null,`模板字符串`,-1),n[24]||=(0,t.createElementVNode)(`span`,{class:`mode-hint`},"支持 ${变量} 语法",-1)]),(0,t.createElementVNode)(`label`,et,[(0,t.withDirectives)((0,t.createElementVNode)(`input`,{type:`radio`,"onUpdate:modelValue":n[4]||=e=>i.reqMappingMode=e,value:`function`},null,512),[[t.vModelRadio,i.reqMappingMode]]),n[25]||=(0,t.createElementVNode)(`span`,null,`函数`,-1),n[26]||=(0,t.createElementVNode)(`span`,{class:`mode-hint`},`支持复杂逻辑处理`,-1)])]),(0,t.createElementVNode)(`div`,tt,[(0,t.withDirectives)((0,t.createElementVNode)(`textarea`,{"onUpdate:modelValue":n[5]||=e=>i.reqMappingText=e,placeholder:i.reqMappingPlaceholder,class:`json-editor`,rows:`8`},null,8,nt),[[t.vModelText,i.reqMappingText]]),i.reqMappingError?((0,t.openBlock)(),(0,t.createElementBlock)(`div`,rt,(0,t.toDisplayString)(i.reqMappingError),1)):(0,t.createCommentVNode)(``,!0)])])]),(0,t.createElementVNode)(`div`,it,[n[65]||=(0,t.createElementVNode)(`div`,{class:`section-title`},[(0,t.createTextVNode)(` 数据提取配置 `),(0,t.createElementVNode)(`span`,{class:`section-subtitle`},`(配置如何从接口数据中提取和映射字段)`)],-1),(0,t.createElementVNode)(`div`,at,[(0,t.createVNode)(c,{type:`outline`,onClick:i.handleTestApi,loading:i.testingApi,status:`success`},{default:(0,t.withCtx)(()=>[...n[28]||=[(0,t.createTextVNode)(` 🔬 测试接口(查看返回数据) `,-1)]]),_:1},8,[`onClick`,`loading`]),n[29]||=(0,t.createElementVNode)(`span`,{class:`test-hint`},`点击测试接口,查看实际返回的字段结构`,-1)]),i.testApiResult?((0,t.openBlock)(),(0,t.createElementBlock)(`div`,ot,[(0,t.createElementVNode)(`div`,st,[n[31]||=(0,t.createElementVNode)(`span`,{class:`result-title`},`📋 接口返回数据预览`,-1),(0,t.createVNode)(c,{size:`mini`,type:`text`,onClick:n[6]||=e=>i.testApiResult=null},{default:(0,t.withCtx)(()=>[...n[30]||=[(0,t.createTextVNode)(`关闭`,-1)]]),_:1})]),i.detectedArrayPath?((0,t.openBlock)(),(0,t.createElementBlock)(`div`,ct,[n[33]||=(0,t.createElementVNode)(`div`,{class:`detected-label`},`✓ 检测到数据数组路径:`,-1),(0,t.createElementVNode)(`div`,lt,(0,t.toDisplayString)(i.detectedArrayPath),1),(0,t.createVNode)(c,{size:`mini`,onClick:i.applyDetectedPath},{default:(0,t.withCtx)(()=>[...n[32]||=[(0,t.createTextVNode)(`应用此路径`,-1)]]),_:1},8,[`onClick`])])):(0,t.createCommentVNode)(``,!0),i.detectedFields.length>0?((0,t.openBlock)(),(0,t.createElementBlock)(`div`,ut,[n[34]||=(0,t.createElementVNode)(`div`,{class:`detected-label`},`✓ 检测到以下字段(点击快速添加):`,-1),(0,t.createElementVNode)(`div`,dt,[((0,t.openBlock)(!0),(0,t.createElementBlock)(t.Fragment,null,(0,t.renderList)(i.detectedFields,e=>((0,t.openBlock)(),(0,t.createElementBlock)(`div`,{key:e,class:`field-tag`,onClick:t=>i.quickAddField(e)},(0,t.toDisplayString)(e),9,ft))),128))])])):(0,t.createCommentVNode)(``,!0)])):(0,t.createCommentVNode)(``,!0),i.resSchemaFields.length>0?((0,t.openBlock)(),(0,t.createElementBlock)(`div`,pt,[n[35]||=(0,t.createElementVNode)(`div`,{class:`hint-title`},`📝 接口定义的字段:`,-1),(0,t.createElementVNode)(`div`,mt,[((0,t.openBlock)(!0),(0,t.createElementBlock)(t.Fragment,null,(0,t.renderList)(i.resSchemaFields,e=>((0,t.openBlock)(),(0,t.createElementBlock)(`div`,{key:e,class:`field-tag clickable`,onClick:t=>i.quickAddField(e),title:`点击添加 ${e} 字段映射`},(0,t.toDisplayString)(e),9,ht))),128))]),n[36]||=(0,t.createElementVNode)(`div`,{class:`hint-desc`},`点击字段名快速添加到映射配置`,-1)])):(0,t.createCommentVNode)(``,!0),(0,t.createElementVNode)(`div`,gt,[n[37]||=(0,t.createElementVNode)(`label`,{class:`config-label`},[(0,t.createTextVNode)(` 数据路径 `),(0,t.createElementVNode)(`span`,{class:`label-hint`},`(可选,留空则自动推断)`)],-1),(0,t.withDirectives)((0,t.createElementVNode)(`input`,{"onUpdate:modelValue":n[7]||=e=>i.filterConfig.arrayPath=e,type:`text`,class:`config-input`,placeholder:`例如: data.list 或 @.data.list(@表示根对象)`},null,512),[[t.vModelText,i.filterConfig.arrayPath]]),n[38]||=(0,t.createElementVNode)(`div`,{class:`config-hint`},` 💡 提示: 如果接口返回的数据结构是 { data: { list: [...] } }, 可以填写 "data.list" 或 "@.data.list" `,-1)]),(0,t.createElementVNode)(`div`,_t,[(0,t.createElementVNode)(`div`,vt,[n[40]||=(0,t.createElementVNode)(`label`,{class:`config-label`},`字段映射规则`,-1),(0,t.createVNode)(c,{size:`mini`,type:`primary`,onClick:i.addFieldMapping},{default:(0,t.withCtx)(()=>[...n[39]||=[(0,t.createTextVNode)(` + 添加字段 `,-1)]]),_:1},8,[`onClick`])]),i.filterFieldMappings.length===0?((0,t.openBlock)(),(0,t.createElementBlock)(`div`,yt,` 暂无字段映射,点击"添加字段"按钮开始配置,或先测试接口查看可用字段 `)):(0,t.createCommentVNode)(``,!0),((0,t.openBlock)(!0),(0,t.createElementBlock)(t.Fragment,null,(0,t.renderList)(i.filterFieldMappings,(e,r)=>((0,t.openBlock)(),(0,t.createElementBlock)(`div`,{key:r,class:`field-mapping-row`},[(0,t.createElementVNode)(`div`,bt,[n[41]||=(0,t.createElementVNode)(`label`,{class:`col-label`},`目标字段名`,-1),(0,t.withDirectives)((0,t.createElementVNode)(`input`,{"onUpdate:modelValue":t=>e.target=t,type:`text`,class:`mapping-input`,placeholder:`例如: id, title, content`},null,8,xt),[[t.vModelText,e.target]])]),n[63]||=(0,t.createElementVNode)(`div`,{class:`mapping-arrow`},`→`,-1),(0,t.createElementVNode)(`div`,St,[n[42]||=(0,t.createElementVNode)(`label`,{class:`col-label`},`来源字段(支持多个,逗号分隔)`,-1),(0,t.withDirectives)((0,t.createElementVNode)(`input`,{"onUpdate:modelValue":t=>e.source=t,type:`text`,class:`mapping-input`,placeholder:`例如: content,title,message`},null,8,Ct),[[t.vModelText,e.source]])]),(0,t.createElementVNode)(`div`,wt,[n[48]||=(0,t.createElementVNode)(`label`,{class:`col-label`},`类型`,-1),(0,t.createVNode)(u,{modelValue:e.type,"onUpdate:modelValue":t=>e.type=t,placeholder:`类型`,size:`small`,class:`mapping-select`},{default:(0,t.withCtx)(()=>[(0,t.createVNode)(l,{value:`string`},{default:(0,t.withCtx)(()=>[...n[43]||=[(0,t.createTextVNode)(`字符串`,-1)]]),_:1}),(0,t.createVNode)(l,{value:`number`},{default:(0,t.withCtx)(()=>[...n[44]||=[(0,t.createTextVNode)(`数字`,-1)]]),_:1}),(0,t.createVNode)(l,{value:`integer`},{default:(0,t.withCtx)(()=>[...n[45]||=[(0,t.createTextVNode)(`整数`,-1)]]),_:1}),(0,t.createVNode)(l,{value:`boolean`},{default:(0,t.withCtx)(()=>[...n[46]||=[(0,t.createTextVNode)(`布尔`,-1)]]),_:1}),(0,t.createVNode)(l,{value:`date`},{default:(0,t.withCtx)(()=>[...n[47]||=[(0,t.createTextVNode)(`日期`,-1)]]),_:1})]),_:1},8,[`modelValue`,`onUpdate:modelValue`])]),(0,t.createElementVNode)(`div`,Tt,[n[61]||=(0,t.createElementVNode)(`label`,{class:`col-label`},`格式化`,-1),(0,t.createVNode)(u,{modelValue:e.format,"onUpdate:modelValue":t=>e.format=t,placeholder:`选择格式化方式`,size:`small`,class:`mapping-select`,"allow-clear":``},{default:(0,t.withCtx)(()=>[(0,t.createVNode)(l,{value:``},{default:(0,t.withCtx)(()=>[...n[49]||=[(0,t.createTextVNode)(`无`,-1)]]),_:1}),e.type===`date`?((0,t.openBlock)(),(0,t.createBlock)(d,{key:0,label:`日期格式`},{default:(0,t.withCtx)(()=>[(0,t.createVNode)(l,{value:`YYYY-MM-DD`},{default:(0,t.withCtx)(()=>[...n[50]||=[(0,t.createTextVNode)(`YYYY-MM-DD`,-1)]]),_:1}),(0,t.createVNode)(l,{value:`YYYY-MM-DD HH:mm:ss`},{default:(0,t.withCtx)(()=>[...n[51]||=[(0,t.createTextVNode)(`YYYY-MM-DD HH:mm:ss`,-1)]]),_:1}),(0,t.createVNode)(l,{value:`YYYY/MM/DD`},{default:(0,t.withCtx)(()=>[...n[52]||=[(0,t.createTextVNode)(`YYYY/MM/DD`,-1)]]),_:1}),(0,t.createVNode)(l,{value:`timestamp`},{default:(0,t.withCtx)(()=>[...n[53]||=[(0,t.createTextVNode)(`时间戳(毫秒)`,-1)]]),_:1}),(0,t.createVNode)(l,{value:`timestamp_s`},{default:(0,t.withCtx)(()=>[...n[54]||=[(0,t.createTextVNode)(`时间戳(秒)`,-1)]]),_:1})]),_:1})):(0,t.createCommentVNode)(``,!0),e.type===`number`||e.type===`integer`?((0,t.openBlock)(),(0,t.createBlock)(d,{key:1,label:`数字格式`},{default:(0,t.withCtx)(()=>[(0,t.createVNode)(l,{value:`currency`},{default:(0,t.withCtx)(()=>[...n[55]||=[(0,t.createTextVNode)(`货币(¥)`,-1)]]),_:1}),(0,t.createVNode)(l,{value:`percent`},{default:(0,t.withCtx)(()=>[...n[56]||=[(0,t.createTextVNode)(`百分比(%)`,-1)]]),_:1})]),_:1})):(0,t.createCommentVNode)(``,!0),e.type===`string`?((0,t.openBlock)(),(0,t.createBlock)(d,{key:2,label:`字符串格式`},{default:(0,t.withCtx)(()=>[(0,t.createVNode)(l,{value:`uppercase`},{default:(0,t.withCtx)(()=>[...n[57]||=[(0,t.createTextVNode)(`大写`,-1)]]),_:1}),(0,t.createVNode)(l,{value:`lowercase`},{default:(0,t.withCtx)(()=>[...n[58]||=[(0,t.createTextVNode)(`小写`,-1)]]),_:1}),(0,t.createVNode)(l,{value:`trim`},{default:(0,t.withCtx)(()=>[...n[59]||=[(0,t.createTextVNode)(`去除空格`,-1)]]),_:1})]),_:1})):(0,t.createCommentVNode)(``,!0),(0,t.createVNode)(d,{label:`通用格式`},{default:(0,t.withCtx)(()=>[(0,t.createVNode)(l,{value:`json`},{default:(0,t.withCtx)(()=>[...n[60]||=[(0,t.createTextVNode)(`JSON字符串`,-1)]]),_:1})]),_:1})]),_:2},1032,[`modelValue`,`onUpdate:modelValue`])]),(0,t.createVNode)(c,{size:`mini`,type:`text`,status:`danger`,onClick:e=>i.removeFieldMapping(r),class:`mapping-delete-btn`},{default:(0,t.withCtx)(()=>[...n[62]||=[(0,t.createTextVNode)(` 删除 `,-1)]]),_:1},8,[`onClick`])]))),128)),n[64]||=(0,t.createElementVNode)(`div`,{class:`config-hint`},` 💡 提示: 来源字段支持多个备选(逗号分隔),系统会自动选择第一个有值的字段。例如: "content,title,message" `,-1)])]),(0,t.createElementVNode)(`div`,Et,[(0,t.createElementVNode)(`button`,{onClick:n[8]||=(...e)=>i.handleReset&&i.handleReset(...e),class:`btn-secondary`},` 重置 `),(0,t.createElementVNode)(`button`,{onClick:n[9]||=(...e)=>i.handleSave&&i.handleSave(...e),class:`btn-primary`,disabled:!i.canSave},` 保存配置 `,8,Dt)])])):((0,t.openBlock)(),(0,t.createElementBlock)(`div`,je,[...n[13]||=[(0,t.createElementVNode)(`div`,{class:`empty-icon`},`📋`,-1),(0,t.createElementVNode)(`div`,{class:`empty-text`},`请先选择一个 API 接口`,-1)]]))])])}var $=k(ye,[[`render`,Ot],[`__scopeId`,`data-v-209e697e`]]);G();var kt=$;typeof window<`u`&&window.Vue&&(window.GatewayApiSelectConfig=$,window.ApiConfig=$,window.GatewayApiSelectConfigUtils={extractDataBySchema:B,executeReqMapping:W,extractOutputFields:D,formatConfig:O,extractArray:K,noticeFilter:J,newsFilter:Y,menuFilter:X,userFilter:Z,applyFilter:q,applyFilterByName:_e,filters:Q,fetchGatewayData:ve}),e.ApiConfig=$,e.GatewayApiSelectConfig=$,e.applyFilter=q,e.applyFilterByName=_e,e.default=kt,e.executeReqMapping=W,e.extractArray=K,e.extractDataBySchema=B,e.extractOutputFields=D,e.fetchGatewayData=ve,e.filters=Q,e.formatConfig=O,e.install=e=>{e.component(`GatewayApiSelectConfig`,$),e.component(`ApiConfig`,$)},e.menuFilter=X,e.newsFilter=Y,e.noticeFilter=J,e.userFilter=Z});
|
package/package.json
ADDED
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@tuoyuan/gateway-api-select-config",
|
|
3
|
+
"version": "1.2.1",
|
|
4
|
+
"description": "网关接口配置组件 - 可视化配置API接口数据映射(支持虚拟滚动)",
|
|
5
|
+
"type": "module",
|
|
6
|
+
"main": "./dist/gateway-api-select-config.umd.js",
|
|
7
|
+
"module": "./dist/gateway-api-select-config.es.js",
|
|
8
|
+
"exports": {
|
|
9
|
+
".": {
|
|
10
|
+
"import": "./dist/gateway-api-select-config.es.js",
|
|
11
|
+
"require": "./dist/gateway-api-select-config.umd.js"
|
|
12
|
+
},
|
|
13
|
+
"./style.css": "./dist/gateway-api-select-config.css"
|
|
14
|
+
},
|
|
15
|
+
"files": [
|
|
16
|
+
"dist",
|
|
17
|
+
"src",
|
|
18
|
+
"README.md"
|
|
19
|
+
],
|
|
20
|
+
"keywords": [
|
|
21
|
+
"vue",
|
|
22
|
+
"vue3",
|
|
23
|
+
"component",
|
|
24
|
+
"api",
|
|
25
|
+
"config",
|
|
26
|
+
"gateway",
|
|
27
|
+
"data-mapping",
|
|
28
|
+
"visual-config"
|
|
29
|
+
],
|
|
30
|
+
"author": "Your Name <your.email@example.com>",
|
|
31
|
+
"license": "MIT",
|
|
32
|
+
"repository": {
|
|
33
|
+
"type": "git",
|
|
34
|
+
"url": "https://github.com/yourusername/gateway-api-select-config.git"
|
|
35
|
+
},
|
|
36
|
+
"bugs": {
|
|
37
|
+
"url": "https://github.com/yourusername/gateway-api-select-config/issues"
|
|
38
|
+
},
|
|
39
|
+
"homepage": "https://github.com/yourusername/gateway-api-select-config#readme",
|
|
40
|
+
"scripts": {
|
|
41
|
+
"build": "vite build --mode lib",
|
|
42
|
+
"prepublishOnly": "npm run build"
|
|
43
|
+
},
|
|
44
|
+
"dependencies": {
|
|
45
|
+
"@arco-design/web-vue": "^2.58.0",
|
|
46
|
+
"vue": "^3.0.0"
|
|
47
|
+
},
|
|
48
|
+
"devDependencies": {
|
|
49
|
+
"@vitejs/plugin-vue": "^6.0.6",
|
|
50
|
+
"vite": "^8.0.12"
|
|
51
|
+
},
|
|
52
|
+
"peerDependencies": {
|
|
53
|
+
"vue": "^3.0.0"
|
|
54
|
+
},
|
|
55
|
+
"peerDependenciesMeta": {
|
|
56
|
+
"@tuoyuan/gateway-request-lib": {
|
|
57
|
+
"optional": true
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
}
|