diff --git a/packages/canvas/src/components/render/RenderMain.js b/packages/canvas/src/components/render/RenderMain.js index 532821b7062950e3dd2b8821720022161983f5da..45e358eb54c98bd80e58f76502979bfc3abbb4d8 100644 --- a/packages/canvas/src/components/render/RenderMain.js +++ b/packages/canvas/src/components/render/RenderMain.js @@ -18,7 +18,10 @@ import { generateFunction } from '@opentiny/tiny-engine-controller/utils' import renderer, { parseData, setConfigure, setController, globalNotify, isStateAccessor } from './render' import { getNode as getNodeById, clearNodes, getRoot, setContext, getContext, setCondition, context } from './context' import CanvasEmpty from './CanvasEmpty.vue' - +//添加类型转换方法 +import { obj2String, string2Obj } from '@opentiny/tiny-engine-controller/adapter' +//添加请求数据源方法(同发送请求) +import { getRequest } from '@opentiny/tiny-engine-plugin-datasource' //tiny-engine\packages\plugins\datasource\src\js\datasource.js const { BROADCAST_CHANNEL } = constants const reset = (obj) => { @@ -194,22 +197,29 @@ const getDataSourceMap = () => { } const setDataSourceMap = (list) => { + dataSourceMap.value = list.reduce((dMap, config) => { + + /* const dataSource = { config: config.data } - - const result = { + const result = { code: '', msg: 'success', data: {} - } - result.data = - dataSource.config.type === 'array' - ? { items: dataSource?.config?.data, total: dataSource?.config?.data?.length } - : dataSource?.config?.data - + } + result.data = dataSource.config.type === 'array' ? { items: dataSource?.config?.data , total: dataSource?.config?.data?.length } : dataSource?.config?.data + dataSource.load = () => Promise.resolve(result) dMap[config.name] = dataSource - + */ + + + if (config.data.options.params) { + config.data.options.params = string2Obj(config.data.options.params || "{}") + } + const dataSource = getRequest(config.data) + dataSource.load() + dMap[config.name] = dataSource return dMap }, {}) } diff --git a/packages/design-core/assets/plugin-icon-materials.svg b/packages/design-core/assets/plugin-icon-materials.svg index 31240724bb861e122d72527a53ad22f53b2133e7..2ed82c267eaed0644b6890e39a52c11d8d86d549 100644 --- a/packages/design-core/assets/plugin-icon-materials.svg +++ b/packages/design-core/assets/plugin-icon-materials.svg @@ -1,16 +1 @@ - - - + \ No newline at end of file diff --git a/packages/design-core/src/preview/src/preview/srcFiles/dataSourceMap.js b/packages/design-core/src/preview/src/preview/srcFiles/dataSourceMap.js index ae37f2e255587a3cdbee8e191e60f3cd23cbe661..d08f338d032b1fd698e549b24f7112c48dec5a51 100644 --- a/packages/design-core/src/preview/src/preview/srcFiles/dataSourceMap.js +++ b/packages/design-core/src/preview/src/preview/srcFiles/dataSourceMap.js @@ -1,35 +1,123 @@ /** -* Copyright (c) 2023 - present TinyEngine Authors. -* Copyright (c) 2023 - present Huawei Cloud Computing Technologies Co., Ltd. -* -* Use of this source code is governed by an MIT-style license. -* -* THE OPEN SOURCE SOFTWARE IN THIS PRODUCT IS DISTRIBUTED IN THE HOPE THAT IT WILL BE USEFUL, -* BUT WITHOUT ANY WARRANTY, WITHOUT EVEN THE IMPLIED WARRANTY OF MERCHANTABILITY OR FITNESS FOR -* A PARTICULAR PURPOSE. SEE THE APPLICABLE LICENSES FOR MORE DETAILS. -* -*/ + * Copyright (c) 2023 - present TinyEngine Authors. + * Copyright (c) 2023 - present Huawei Cloud Computing Technologies Co., Ltd. + * + * Use of this source code is governed by an MIT-style license. + * + * THE OPEN SOURCE SOFTWARE IN THIS PRODUCT IS DISTRIBUTED IN THE HOPE THAT IT WILL BE USEFUL, + * BUT WITHOUT ANY WARRANTY, WITHOUT EVEN THE IMPLIED WARRANTY OF MERCHANTABILITY OR FITNESS FOR + * A PARTICULAR PURPOSE. SEE THE APPLICABLE LICENSES FOR MORE DETAILS. + * + */ import dataSources from './dataSource.js' +//import { getRequest } from './fetch.js' //@opentiny/tiny-engine-plugin-datasource' //tiny-engine\packages\plugins\datasource\src\js\datasource.js +import axios from 'axios' +//添加类型转换方法 +export const generateFunction = (body, context) => { + const Func = Function + try { + return new Func(`return ${body}`).call(context).bind(context) + } catch (error) { + // do nothing + } + return undefined +} + +const load = (http, options, dataSource, shouldFetch) => (params, customUrl) => { + if (!shouldFetch()) { + return undefined + } + dataSource.status = 'loading' + const { method, uri: url, params: defaultParams, timeout, headers } = options + const config = { method, url, headers, timeout } + + const data = params || defaultParams + + config.url = customUrl || config.url + + if (method.toLowerCase() === 'get') { + config.params = data + } else { + config.data = data + } + + return http.request(config) +} + +const createFn = (fnContent) => { + return (...args) => { + const fn = generateFunction(fnContent, this) + return fn.apply(this, args) + } +} + +export const getRequest = (config) => { + const http = axios.create() + const dataSource = { config } + const shouldFetch = createFn(config.shouldFetch.value) + const willFetch = createFn(config.willFetch.value) + + const dataHandler = (res) => { + const data = createFn(config.dataHandler.value)(res) + dataSource.status = 'loaded' + dataSource.data = data + return data + } + + const errorHandler = (error) => { + createFn(config.errorHandler.value)(error) + dataSource.status = 'error' + dataSource.error = error + } + + http.interceptors.request.use(willFetch, errorHandler) + + http.interceptors.response.use(dataHandler, errorHandler) + + dataSource.status = 'init' + dataSource.load = load(http, config.options, dataSource, shouldFetch) + + return dataSource +} + +export const overrideOrMergeData = (isOverride, data, imported) => { + if (isOverride) { + return imported + } else { + return imported.concat(data || []) + } +} + +export const getDataAfterPage = (data, attrs) => { + const { currentPage, pageSize } = attrs + const offset = (currentPage - 1) * pageSize + return data.slice(offset, offset + pageSize) +} + +//添加请求数据源方法(同发送请求) const dataSourceMap = {} Array.isArray(dataSources.list) && dataSources.list.forEach((config) => { - const dataSource = { config: config.data } - - const result = { - code: '', - msg: 'success', - data: {} - } - result.data = - dataSource.config.type === 'array' - ? { items: dataSource?.config?.data, total: dataSource?.config?.data?.length } - : dataSource?.config?.data + /* + const dataSource = { config: config.data } + const result = { + code: '', + msg: 'success', + data: {} + } + result.data = dataSource.config.type === 'array' + ? { items: dataSource?.config?.data, total: dataSource?.config?.data?.length } + : dataSource?.config?.data + dataSource.load = () => Promise.resolve(result) + + if (config.data.options.params) { + config.data.options.params = JSON.parse(config.data.options.params || "{}") + } */ + const dataSource = getRequest(config.data) dataSourceMap[config.name] = dataSource - - dataSource.load = () => Promise.resolve(result) }) export default dataSourceMap diff --git a/packages/design-core/vite.config.js b/packages/design-core/vite.config.js index e149e0f227e0322589c7adbc42d7bc125f7d5bab..71490575c67d5d62926a202cc4ff5ea1b17c5e45 100644 --- a/packages/design-core/vite.config.js +++ b/packages/design-core/vite.config.js @@ -12,7 +12,9 @@ import { createSvgIconsPlugin } from 'vite-plugin-svg-icons' import { importmapPlugin } from './scripts/externalDeps' import visualizer from 'rollup-plugin-visualizer' -const origin = 'http://localhost:9090/' +//const origin = 'http://localhost:9090/' + +const origin = 'http://localhost:7011/' const config = { base: './', @@ -24,6 +26,7 @@ const config = { server: { // 这里保证本地启动服务是localhost,支持js多线程和谷歌浏览器读写本地文件api port: 8080, + open: '/?type=app&id=918&tenant=1', proxy: { '/app-center/v1/api': { diff --git a/packages/plugins/datasource/index.js b/packages/plugins/datasource/index.js index 22898068914bac13476f5cdf6592b57e228f8c59..706571dc868c5d89b479d52a81d15f5769ab323e 100644 --- a/packages/plugins/datasource/index.js +++ b/packages/plugins/datasource/index.js @@ -11,6 +11,8 @@ */ import { fetchDataSourceList, fetchDataSourceDetail } from './src/js/http' +import { getRequest } from './src/js/datasource' + import component from './src/Main.vue' export default { @@ -21,4 +23,4 @@ export default { component } -export { fetchDataSourceList, fetchDataSourceDetail } +export { fetchDataSourceList, fetchDataSourceDetail ,getRequest} diff --git a/packages/plugins/datasource/src/DataSourceField.vue b/packages/plugins/datasource/src/DataSourceField.vue index 9763b4aa9fc7364ce6ab02ef9405b5fe8fe6dba2..35ec6939decea089cbbce2fa76377961c6bc797a 100644 --- a/packages/plugins/datasource/src/DataSourceField.vue +++ b/packages/plugins/datasource/src/DataSourceField.vue @@ -6,7 +6,7 @@ >