From 4c9d89f6eb4a7a773ebbed9aeedb22924b6d59e0 Mon Sep 17 00:00:00 2001 From: yy-wow Date: Mon, 28 Oct 2024 05:42:43 -0700 Subject: [PATCH 01/19] refactor/http-service --- designer-demo/package.json | 2 + designer-demo/registry.js | 3 +- designer-demo/src/composable/http/Login.vue | 83 ++ designer-demo/src/composable/http/index.js | 131 +++ designer-demo/src/composable/http/mock.js | 939 ++++++++++++++++++++ designer-demo/src/composable/index.js | 1 + packages/common/composable/http/axios.js | 151 ++++ packages/common/composable/http/index.js | 63 ++ packages/common/composable/index.js | 1 + packages/design-core/index.js | 3 +- packages/register/src/constants.js | 1 + packages/register/src/service.js | 5 + 12 files changed, 1381 insertions(+), 2 deletions(-) create mode 100644 designer-demo/src/composable/http/Login.vue create mode 100644 designer-demo/src/composable/http/index.js create mode 100644 designer-demo/src/composable/http/mock.js create mode 100644 designer-demo/src/composable/index.js create mode 100644 packages/common/composable/http/axios.js create mode 100644 packages/common/composable/http/index.js diff --git a/designer-demo/package.json b/designer-demo/package.json index 421f4f68f1..2b1a124c09 100644 --- a/designer-demo/package.json +++ b/designer-demo/package.json @@ -12,12 +12,14 @@ "@opentiny/tiny-engine": "workspace:^", "@opentiny/tiny-engine-theme-dark": "workspace:*", "@opentiny/tiny-engine-theme-light": "workspace:*", + "@opentiny/tiny-engine-utils": "workspace:*", "@opentiny/vue": "~3.14.0", "@opentiny/vue-design-smb": "~3.14.0", "@opentiny/vue-icon": "~3.14.0", "@opentiny/vue-locale": "~3.14.0", "@opentiny/vue-renderless": "~3.14.0", "@opentiny/vue-theme": "~3.14.0", + "@vueuse/core": "^9.6.0", "vue": "^3.4.21" }, "devDependencies": { diff --git a/designer-demo/registry.js b/designer-demo/registry.js index 88a4634807..ac499e930f 100644 --- a/designer-demo/registry.js +++ b/designer-demo/registry.js @@ -45,11 +45,12 @@ import { GlobalService } from '@opentiny/tiny-engine' import engineConfig from './engine.config' +import { HttpService } from './src/composable' export default { root: { id: 'engine.root', - metas: [GenerateCodeService, GlobalService] + metas: [HttpService, GenerateCodeService, GlobalService] }, config: engineConfig, layout: { diff --git a/designer-demo/src/composable/http/Login.vue b/designer-demo/src/composable/http/Login.vue new file mode 100644 index 0000000000..6c5c8b0d6c --- /dev/null +++ b/designer-demo/src/composable/http/Login.vue @@ -0,0 +1,83 @@ + + + + + diff --git a/designer-demo/src/composable/http/index.js b/designer-demo/src/composable/http/index.js new file mode 100644 index 0000000000..9073212958 --- /dev/null +++ b/designer-demo/src/composable/http/index.js @@ -0,0 +1,131 @@ +import { createApp } from 'vue' +import { HttpService } from '@opentiny/tiny-engine' +import { useBroadcastChannel } from '@vueuse/core' +import { constants } from '@opentiny/tiny-engine-utils' +import Login from './Login.vue' +import mockData from './mock' + +const LOGIN_EXPIRED_CODE = 401 +const { BROADCAST_CHANNEL } = constants + +const { post: globalNotify } = useBroadcastChannel({ name: BROADCAST_CHANNEL.Notify }) + +const procession = { + promiseLogin: null, + mePromise: {} +} + +const loginDom = document.createElement('div') +document.body.appendChild(loginDom) +const loginVM = createApp(Login).mount(loginDom) + +window.lowcode = { + platformCenter: { + Session: { + rebuiltCallback: function () { + loginVM.closeLogin() + + procession.mePromise.resolve('login ok') + procession.promiseLogin = null + procession.mePromise = {} + } + } + } +} + +const showError = (url, message) => { + globalNotify({ + type: 'error', + title: '接口报错', + message: `报错接口: ${url} \n报错信息: ${message ?? ''}` + }) +} + +const preRequest = (config) => { + const isDevelopEnv = import.meta.env.MODE?.includes('dev') + + if (isDevelopEnv && config.url.match(/\/generate\//)) { + config.baseURL = '' + } + + const isVsCodeEnv = window.vscodeBridge + + if (isVsCodeEnv) { + config.baseURL = '' + } + + return config +} + +const preResponse = (res) => { + if (res.data?.error) { + showError(res.config?.url, res?.data?.error?.message) + + return Promise.reject(res.data.error) + } + + return res.data?.data +} + +const openLogin = () => { + return new Promise((resolve, reject) => { + if (!procession.promiseLogin) { + procession.promiseLogin = loginVM.openLogin(procession, '/api/rebuildSession') + procession.promiseLogin.then(() => { + http.request(response.config).then(resolve, reject) + }) + } + }) +} + +const errorResponse = (error) => { + // 用户信息失效时,弹窗提示登录 + const { response } = error + + if (response?.status === LOGIN_EXPIRED_CODE) { + // vscode 插件环境弹出输入框提示登录 + if (window.vscodeBridge) { + return Promise.resolve(true) + } + + // 浏览器环境弹出小窗登录 + if (response?.headers['x-login-url']) { + return openLogin() + } + } + + showError(error.config?.url, error?.message) + + return response?.data.error ? Promise.reject(response.data.error) : Promise.reject(error.message) +} + +const getConfig = (env = import.meta.env) => { + const baseURL = env.VITE_ORIGIN + // 仅在本地开发时,启用 withCredentials + const dev = env.MODE?.includes('dev') + // 获取租户 id + const getTenant = () => new URLSearchParams(location.search).get('tenant') + + return { + baseURL, + withCredentials: false, + headers: { + 'x-lowcode-mode': dev ? 'develop' : null, + 'x-lowcode-org': getTenant() + } + } +} + +const options = { + axiosConfig: getConfig(), + enableMock: false, + mockData, + interceptors: { + request: [preRequest], + response: [[preResponse, errorResponse]] + } +} + +HttpService.apis.setOptions(options) + +export default HttpService diff --git a/designer-demo/src/composable/http/mock.js b/designer-demo/src/composable/http/mock.js new file mode 100644 index 0000000000..9b33d94d76 --- /dev/null +++ b/designer-demo/src/composable/http/mock.js @@ -0,0 +1,939 @@ +/** +* 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. +* +*/ + +const arrData = [] +const blockList = [] +let tempObj = null +let blockCount = 0 +let blockProgress = 0 + +export default [ + // 获取app的详细信息 + { + url: /\/app-center\/api\/apps\/detail/, + response: async () => { + const getAppInfo = async () => { + const response = await fetch('/mock/appInfo.json') + return response.json() + } + + const appInfoRes = await getAppInfo() + return new Promise((resolve) => { + setTimeout(() => { + resolve([200, appInfoRes]) + }, 1000) + }) + } + }, + { + url: /api\/apps\/i18n\/entries/, + response: async () => { + const getAppInfo = async () => { + const response = await fetch('/mock/i18n.json') + return response.json() + } + + const appInfoRes = await getAppInfo() + return new Promise((resolve) => { + setTimeout(() => { + resolve([200, appInfoRes]) + }, 1000) + }) + } + }, + // 获取应用列表信息 + { + url: /\/app-center\/api\/apps\/list/, + response: async () => { + const getAppList = async () => { + const response = await fetch('/mock/appList.json') + return response.json() + } + + const appListRes = await getAppList() + return new Promise((resolve) => { + setTimeout(() => { + resolve([200, appListRes]) + }, 1000) + }) + } + }, + // 页面管理 - 获取页面详情 + { + url: /\/app-center\/api\/pages\/detail/, + response: async (config) => { + const url = config.url + const pageId = url.substr(url.lastIndexOf('/') + 1) + + // 根据pageId加载不同的页面详情 + const pageDetail = async (pageId) => { + const response = await fetch(`/mock/pageDetail/${pageId}.json`) + return response.json() + } + + const pageInfo = await pageDetail(pageId) + + return new Promise((resolve) => { + setTimeout(() => { + resolve([200, pageInfo]) + }, 1000) + }) + } + }, + // 页面管理 - 获取页面列表 + { + url: /\/app-center\/api\/pages\/list\/\d+/, + response: async () => { + const getPageList = async () => { + const response = await fetch('/mock/pageLists.json') + return response.json() + } + + const pageListRes = await getPageList() + + return new Promise((resolve) => { + setTimeout(() => { + resolve([200, pageListRes]) + }, 1000) + }) + } + }, + // 页面管理 - 获取文件夹列表列表 + { + url: /\/app-center\/api\/folders\/list/, + response: async () => { + const getPageList = async () => { + const response = await fetch('/mock/pageFolder.json') + return response.json() + } + + const pageListRes = await getPageList() + + return new Promise((resolve) => { + setTimeout(() => { + resolve([200, pageListRes]) + }, 1000) + }) + } + }, + // 页面管理 -- 新建页面 + { + url: /\/app-center\/api\/pages\/create/, + response: async (config) => { + const createPage = async () => { + const response = await fetch('/mock/createPage.json') + return response.json() + } + + const createPageRes = await createPage() + const data = JSON.parse(config.data) + const pageId = data.app + + if (pageId % 2) { + return new Promise((resolve) => { + setTimeout(() => { + resolve([200, createPageRes]) + }, 500) + }) + } + + return new Promise((resolve) => { + setTimeout(() => { + resolve([200, { error: { message: '服务出错' } }]) + }, 500) + }) + } + }, + // 页面管理 -- 保存页面,同时创建页面备份记录 + { + url: /\/app-center\/api\/pages\/update/, + response: async (config) => { + const savePage = async () => { + const response = await fetch('/mock/savePage.json') + return response.json() + } + + const savePageRes = await savePage() + + const url = config.url + const pageId = url.substr(url.lastIndexOf('/') + 1) + + if (pageId === '1') { + return new Promise((resolve) => { + setTimeout(() => { + resolve([200, savePageRes]) + }, 1000) + }) + } + + return new Promise((resolve) => { + setTimeout(() => { + resolve([200, { error: { message: '服务出错' } }]) + }, 500) + }) + } + }, + // 页面管理 -- 复制页面 + /** + * params + * { + * name:'', + * route:'', + * parent:'', + * groupId:'' + * } + * res + * { + * pages:[{},{}], + * pageInfo:{} + * } + **/ + { + url: /\/app-center\/api\/pages\/copy/, + response: async (config) => { + const newPage = JSON.parse(config.data) + + const pageList = async () => { + const response = await fetch('/mock/pageList.json') + + return response.json() + } + + const list = await pageList(newPage) + list.data[0].data.push(newPage) + + const res = { + data: { + pages: list, + newPage: newPage + } + } + + return new Promise((resolve) => { + setTimeout(() => { + resolve([200, res]) + }, 1000) + }) + } + }, + // 根据页面ID获取页面历史备份列表 + { + url: /\/app-center\/api\/pageHistory\/list/, + response: async (config) => { + /** + * 数据格式 + * [ + * { + * "id": 1, + * "pageId": 1, // 页面ID,根据id获取页面详情 + * "message": "修改文本内容", + * "time": "2022-02-06 18:00:00" + * } + * ] + */ + const pageId = config.url.substr(config.url.lastIndexOf('/') + 1) + + const pageHistory = async (pageId) => { + const response = await fetch(`/mock/pageHistory/${pageId}.json`) + return response.json() + } + + const historyData = await pageHistory(pageId) + + return new Promise((resolve) => { + setTimeout(() => { + resolve([200, historyData]) + }, 1000) + }) + } + }, + // 删除页面备份记录 + { + url: /\/app-center\/api\/pageHistory\/delete/, + response: async () => { + return new Promise((resolve) => { + setTimeout(() => { + resolve([200]) + }, 1000) + }) + } + }, + // 根据页面备份记录还原页面信息 + { + url: /\/app-center\/api\/pageHistory\/restore/, + response: async () => { + return new Promise((resolve) => { + setTimeout(() => { + resolve([200]) + }, 1000) + }) + } + }, + // 创建区块分组信息 + { + url: /\/material-center\/api\/block-groups\/create/, + response: (config) => { + const data = JSON.parse(config.data) + const name = data.name + + const id = blockList.length + 1 + const group = { + id, + name, + blocks: [] + } + + blockList.push(group) + + return new Promise((resolve) => { + setTimeout(() => { + resolve([200, { data: group }]) + }, 500) + }) + } + }, + // 更新分组:修改分组名字/向分组里添加、删除区块 + { + url: /\/material-center\/api\/block-groups\/update/, + response: async (config) => { + const url = config.url + const groupId = url.substr(url.lastIndexOf('/') + 1) + const { name, blocks } = JSON.parse(config.data) + const getAvailable = async (groupId) => { + const response = await fetch(`/mock/block/available/${(groupId % 2) + 1}.json`) + return response.json() + } + + const avaliableBlocks = await getAvailable(groupId) + let result = [] + + for (let i = 0; i < blockList.length; i++) { + if (String(blockList[i].id) === groupId) { + if (name) blockList[i].name = name + if (blocks) { + blockList[i].blocks = [] + avaliableBlocks.forEach((item) => { + if (blocks.indexOf(item.id) > -1) { + blockList[i].blocks.push(item) + } + }) + } + result = blockList[i] + + break + } + } + + return new Promise((resolve) => { + setTimeout(() => { + resolve([200, { data: result }]) + }, 500) + }) + } + }, + // 根据区块分组ID删除区块分组信息 + { + url: /\/material-center\/api\/block-groups\/delete/, + response: async (config) => { + const url = config.url + const groupId = url.substr(url.lastIndexOf('/') + 1) + + const group = blockList.splice( + blockList.findIndex((item) => item.id === groupId), + 1 + ) + + return new Promise((resolve) => { + setTimeout(() => { + resolve([200, { data: group }]) + }, 500) + }) + } + }, + // 获取区块分组列表 + { + url: /\/material-center\/api\/block-groups/, + response() { + return new Promise((resolve) => { + setTimeout(() => { + resolve([200, { data: blockList }]) + }, 500) + }) + } + }, + // 创建区块 + { + url: /\/material-center\/api\/block\/create/, + response: async (config) => { + const data = JSON.parse(config.data) + + // 创建需往数据库里插入信息 + data.id = String(++blockCount) + arrData.push(data) + + const blockId = data.id + if (blockId % 2) { + return new Promise((resolve) => { + setTimeout(() => { + resolve([200, { data }]) + }, 2000) // 耗时较长 + }) + } + + return new Promise((resolve) => { + setTimeout(() => { + resolve([200, { error: { message: '新建区块失败' } }]) + }, 500) + }) + } + }, + // 发布区块 + { + url: /\/material-center\/api\/block\/deploy/, + /* + 请求参数: + { + block, + deploy_info: "修改button信息" + } + */ + response: async (config) => { + const data = JSON.parse(config.data) + const blockId = data.block?.id + if (blockId % 2) { + const deploy = async () => { + const response = await fetch(`/mock/block/deploy.json`) + return response.json() + } + const deployData = await deploy() + + return new Promise((resolve) => { + setTimeout(() => { + resolve([200, { data: deployData.data }]) + }, 500) + }) + } + + return new Promise((resolve) => { + setTimeout(() => { + resolve([200, { error: { message: '发布区块失败' } }]) + }, 500) + }) + } + }, + // 获取发布区块的进度信息 + { + url: /\/material-center\/api\/tasks/, + response: async (config) => { + const url = config.url + const taskId = url.substr(url.lastIndexOf('/') + 1) + const deployProgress = async () => { + const response = await fetch(`/mock/block/deployProgress.json`) + return response.json() + } + const deployProgressRes = await deployProgress() + + // 区块Id不相等直接返回 + if (Number(taskId) !== deployProgressRes.data.id) { + return new Promise((resolve) => { + setTimeout(() => { + resolve([200, { error: { message: '查询区块进度失败' } }]) + }, 500) + }) + } + + const FINISHED_PROGRESS = 100 + const INTERVAL_PROGRESS = 20 + + // 判断发布状态 + const deployStatus = deployProgressRes.data.taskStatus + + // 如果构建状态为运行中:1, 返回构建进度条 + if (deployStatus === 1) { + // 模拟后台进度更新, 每次查询进度更新增加20% + deployProgressRes.data.progress_percent = blockProgress + blockProgress += INTERVAL_PROGRESS + + if (blockProgress >= FINISHED_PROGRESS) { + deployProgressRes.data.progress_percent = FINISHED_PROGRESS + blockProgress = 0 + } + } + + // 其它状态直接返回结果 + return new Promise((resolve) => { + setTimeout(() => { + resolve([200, deployProgressRes]) + }, 1000) + }) + } + }, + // 修改区块,同时创建区块备份记录/还原到某一历史备份 + { + url: /\/material-center\/api\/block\/update/, + response: async (config) => { + const url = config.url + const blockId = url.substr(url.lastIndexOf('/') + 1) + const { current_history } = JSON.parse(config.data) + + // 消费侧-还原到某一历史备份 + if (current_history) { + let block = null + + for (let i = 0; i < blockList.length; i++) { + const blocks = blockList[i].blocks + + for (let i = 0; i < blocks.length; i++) { + block = blocks[i] + + if (String(block.id) === blockId && block.current_history) { + block.current_history.id = current_history + + break + } + } + } + + return new Promise((resolve) => { + setTimeout(() => { + resolve([200, { data: block }]) + }, 500) + }) + } + + // 只有奇数区块可以保存成功 + if (blockId % 2) { + const block = JSON.parse(config.data) + let blockData = null + + for (let i = 0; i < arrData.length; i++) { + if (Number(arrData[i].id) === Number(blockId)) { + blockData = arrData[i] + + Object.entries(block).forEach(([key, value]) => { + blockData[key] = value + }) + + break + } + } + + return new Promise((resolve) => { + setTimeout(() => { + resolve([200, { data: blockData }]) + }, 1000) + }) + } + + return new Promise((resolve) => { + setTimeout(() => { + resolve([200, { error: { message: '保存区块失败' } }]) + }, 500) + }) + } + }, + // 区块管理 -- 获取区块列表 + { + url: /\/material-center\/api\/block\/list/, + proxy: '/mock/block/blockList.json', + handleData({ data }) { + if (arrData.length === 0) { + arrData.push(...data) + blockCount = arrData.length + } + + return { data: arrData } + } + }, + // 区块管理 -- 删除区块 + { + url: /\/material-center\/api\/block\/delete/, + response(config) { + const url = config.url + const blockId = url.substr(url.lastIndexOf('/') + 1) + let data = [] + + // 只有 ID 为奇数的区块才能删除,否则抛出错误信息 + if (blockId % 2) { + arrData.some((item, index) => { + if (String(item.id) === blockId) { + data = item + arrData.splice(index, 1) + return true + } + return false + }) + + return new Promise((resolve) => { + setTimeout(() => { + resolve([200, { data }]) + }, 500) // 耗时较短 + }) + } + + return new Promise((resolve) => { + setTimeout(() => { + resolve([200, { error: { message: '删除区块失败' } }]) + }, 500) // 耗时较短 + }) + } + }, + // 根据区块ID获取区块历史备份列表 + { + url: /\/material-center\/api\/block-history/, + response: async (config) => { + const url = config.url + const query = url.substr(url.indexOf('?')) + const params = new URLSearchParams(query) + const block = params.get('block') + + if (!block) { + return new Promise((resolve) => { + setTimeout(() => { + resolve([200, { data: [] }]) + }, 1000) + }) + } + + const historyList = async () => { + const response = await fetch(`/mock/block/history.json`) + return response.json() + } + + const blockInfo = await historyList(block) + + return new Promise((resolve) => { + setTimeout(() => { + resolve([200, { data: blockInfo }]) + }, 1000) + }) + } + }, + // 删除区块备份记录 + { + url: /\/app-center\/api\/blockHistory\/delete/, + response: async () => { + return new Promise((resolve) => { + setTimeout(() => { + resolve([200]) + }, 1000) + }) + } + }, + // 根据区块备份记录还原区块信息 + { + url: /\/app-center\/api\/blockHistory\/restore/, + response: async () => { + return new Promise((resolve) => { + setTimeout(() => { + resolve([200]) + }, 1000) + }) + } + }, + // 根据分组ID获取当前分组可以添加的区块 + { + url: /\/material-center\/api\/block\/notgroup/, + response: async (config) => { + const url = config.url + const groupId = + url.indexOf('?') > -1 + ? url.substring(url.lastIndexOf('/') + 1, url.indexOf('?')) + : url.substr(url.lastIndexOf('/') + 1) + const query = url.substr(url.indexOf('?')) + const params = new URLSearchParams(query) + const value = params.get('label_contains') + const author = params.getAll('author') + const tenant = params.getAll('tenant') + const tag = params.getAll('tag') + + if (!groupId) { + return new Promise((resolve) => { + setTimeout(() => { + resolve([200, { data: [] }]) + }, 500) + }) + } + + const getAvailable = async (groupId) => { + const response = await fetch(`/mock/block/available/${(groupId % 2) + 1}.json`) + return response.json() + } + + const blocks = await getAvailable(groupId) + + // 搜索结果 + const searchResult = value ? blocks.filter((item) => item.label.indexOf(value) > -1) : blocks + // 标签过滤结果 + const tagResult = + tag && tag.length ? searchResult.filter((item) => item.tags?.some((i) => tag.includes(i))) : searchResult + // 组织过滤结果 + const tenantResult = + tenant && tenant.length ? tagResult.filter((item) => tenant.includes(String(item.tenant?.id))) : tagResult + // 作者过滤结果 + const authorResult = + author && author.length ? tenantResult.filter((item) => author.includes(String(item.author?.id))) : tenantResult + + return new Promise((resolve) => { + setTimeout(() => { + resolve([200, { data: authorResult }]) + }, 500) + }) + } + }, + // 获取区块所有标签 + { + url: /\/material-center\/api\/block\/tags/, + response: async () => { + const getAvailable = async () => { + const response = await fetch(`/mock/block/available/1.json`) + return response.json() + } + + const blocks = await getAvailable() + const tags = [] + + blocks && + blocks.forEach((block) => { + block.tags && tags.push(...block.tags) + }) + + return new Promise((resolve) => { + setTimeout(() => { + resolve([200, { data: Array.from(new Set(tags)) }]) + }, 500) + }) + } + }, + // 获取区块所有作者 + { + url: /\/material-center\/api\/block\/users/, + response: async () => { + const getAvailable = async () => { + const response = await fetch(`/mock/block/available/1.json`) + return response.json() + } + + const blocks = await getAvailable() + const users = [] + + blocks && + blocks.forEach((block) => { + users.push(block.author) + }) + + return new Promise((resolve) => { + setTimeout(() => { + resolve([200, { data: users }]) + }, 500) + }) + } + }, + // 获取区块所有组织 + { + url: /\/material-center\/api\/block\/tenants/, + response: async () => { + const getAvailable = async () => { + const response = await fetch(`/mock/block/available/1.json`) + return response.json() + } + + const blocks = await getAvailable() + const tenants = [] + + blocks && + blocks.forEach((block) => { + block.tenant && tenants.push(block.tenant) + }) + + return new Promise((resolve) => { + setTimeout(() => { + resolve([200, { data: tenants }]) + }, 500) + }) + } + }, + // 根据区块分组ID获取该分组下的区块列表 + { + url: /\/material-center\/api\/block/, + response(config) { + const url = config.url + const query = url.substr(url.indexOf('?')) + const params = new URLSearchParams(query) + const groupId = params.get('groups') + const value = params.get('label_contains') + let groupData = [] + + for (let i = 0; i < blockList.length; i++) { + if (String(blockList[i].id) === groupId) { + groupData = blockList[i].blocks + + break + } + } + + groupData = value ? groupData.filter((item) => item.label.indexOf(value) > -1) : groupData + + return new Promise((resolve) => { + setTimeout(() => { + resolve([200, { data: groupData }]) + }, 500) + }) + } + }, + // 数据源管理 -- 获取数据源列表 + { + url: /api\/sources\/list/, + response: async () => { + const getDatasourceList = async () => { + const response = await fetch('/mock/datasource.json') + return response.json() + } + + let { data } = await getDatasourceList() + const index = data.findIndex((data) => data.id === tempObj?.id) + + if (index > -1) { + data[index] = tempObj + + if (tempObj.status === 'delete') { + data.splice(index, 1) + } + } else { + if (tempObj) { + tempObj.id = data.length + 1 + data = [...data, tempObj] + } + } + + return new Promise((resolve) => { + setTimeout(() => { + resolve([200, { data: data }]) + }, 1000) + }) + } + }, + // 数据源管理 -- 新增数据源 + { + url: /\/app-center\/api\/sources\/create/, + response: async (config) => { + tempObj = JSON.parse(config.data) + + return new Promise((resolve) => { + setTimeout(() => { + resolve([200, { data: tempObj }]) + }, 1000) + }) + } + }, + // 数据源管理 -- 删除数据源 + { + url: /\/app-center\/api\/sources\/delete/, + response: async (config) => { + const url = config.url + const dataSourceId = url.substr(url.lastIndexOf('/') + 1) + tempObj = { id: dataSourceId, status: 'delete' } + + return new Promise((resolve) => { + setTimeout(() => { + resolve([200, { data: tempObj }]) + }, 500) + }) + } + }, + // 数据源管理 -- 更新数据源 + { + url: /\/app-center\/api\/sources\/update/, + response: async (config) => { + const addres = config.url.split('/') + const id = Number(addres[addres.length - 1]) + + // 提交需要更新的内容 + tempObj = JSON.parse(config.data) + tempObj.id = id + + return new Promise((resolve) => { + setTimeout(() => { + resolve([200, { data: tempObj }]) + }, 500) + }) + } + }, + // 数据源管理 -- 查询数据源详情 + { + url: /api\/sources\/detail/, + response: async (config) => { + const addres = config.url.split('/') + const id = addres[addres.length - 1] + + const getDataSourceDetail = async () => { + const response = await fetch('/mock/datasource.json') + return response.json() + } + + const { data } = await getDataSourceDetail() + let result = data.filter((item) => item.id === id)[0] + + if (tempObj && tempObj.id === id) { + result = tempObj + } + + return new Promise((resolve) => { + setTimeout(() => { + resolve([200, { data: result }]) + }, 500) + }) + } + }, + // 数据源管理 -- 获取数据源模板列表 + { + url: /\/app-center\/api\/source_tpl/, + response: async () => { + const getDataSourceTemplate = async () => { + const response = await fetch('/mock/dataSourceTemplate.json') + return response.json() + } + const templateData = await getDataSourceTemplate() + + return new Promise((resolve) => { + setTimeout(() => { + resolve([200, templateData]) + }, 500) + }) + } + }, + // 数据源管理 -- mock 用户输入的远程服务 + { + url: /\.*api.*\/mock/, + response: async () => { + const getDataSourceTemplate = async () => { + const response = await fetch('/mock/userService.json') + return response.json() + } + const templateData = await getDataSourceTemplate() + + return new Promise((resolve) => { + setTimeout(() => { + resolve([200, templateData]) + }, 500) + }) + } + }, + { + url: /ng-bundle\.json$/, + proxy: 'mock/ng-bundle.json' + }, + { + url: '*', + proxy: '*' + } +] diff --git a/designer-demo/src/composable/index.js b/designer-demo/src/composable/index.js new file mode 100644 index 0000000000..27b08c481b --- /dev/null +++ b/designer-demo/src/composable/index.js @@ -0,0 +1 @@ +export { default as HttpService } from './http' diff --git a/packages/common/composable/http/axios.js b/packages/common/composable/http/axios.js new file mode 100644 index 0000000000..25edcb693e --- /dev/null +++ b/packages/common/composable/http/axios.js @@ -0,0 +1,151 @@ +/** + * 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 axios from 'axios' +import MockAdapter from 'axios-mock-adapter' + +export function globalDefaults(key, value) { + if (key && typeof key === 'string') { + if (typeof value === 'undefined') { + return axios.defaults[key] + } + axios.defaults[key] = value + return undefined + } + + return axios.defaults +} + +export default (config) => { + const instance = axios.create(config) + const defaults = {} + let mock + + if (typeof MockAdapter.prototype.proxy === 'undefined') { + MockAdapter.prototype.proxy = function ({ url, config = {}, proxy, response, handleData } = {}) { + let stream = this + const request = (proxy, any) => { + return (setting) => { + return new Promise((resolve) => { + config.responseType = 'json' + axios + .get(any ? proxy + setting.url + '.json' : proxy, config) + .then(({ data }) => { + typeof handleData === 'function' && (data = handleData(data, setting)) + resolve([200, data]) + }) + .catch((error) => { + resolve([error.response.status, error.response.data]) + }) + }) + } + } + + if (url === '*' && proxy && typeof proxy === 'string') { + stream = proxy === '*' ? this.onAny().passThrough() : this.onAny().reply(request(proxy, true)) + } else { + if (proxy && typeof proxy === 'string') { + stream = this.onAny(url).reply(request(proxy)) + } else if (typeof response === 'function') { + stream = this.onAny(url).reply(response) + } + } + + return stream + } + } + + return { + request(config) { + return instance(config) + }, + get(url, config) { + return instance.get(url, config) + }, + delete(url, config) { + return instance.delete(url, config) + }, + head(url, config) { + return instance.head(url, config) + }, + post(url, data, config) { + return instance.post(url, data, config) + }, + put(url, data, config) { + return instance.put(url, data, config) + }, + patch(url, data, config) { + return instance.patch(url, data, config) + }, + all(iterable) { + return axios.all(iterable) + }, + spread(callback) { + return axios.spread(callback) + }, + defaults(key, value) { + if (key && typeof key === 'string') { + if (typeof value === 'undefined') { + return instance.defaults[key] + } + instance.defaults[key] = value + defaults[key] = value + return undefined + } + + return instance.defaults + }, + defaultSettings() { + return defaults + }, + interceptors: { + request: { + use(fnHandle, fnError) { + return instance.interceptors.request.use(fnHandle, fnError) + }, + eject(id) { + return instance.interceptors.request.eject(id) + } + }, + response: { + use(fnHandle, fnError) { + return instance.interceptors.response.use(fnHandle, fnError) + }, + eject(id) { + return instance.interceptors.response.eject(id) + } + } + }, + mock(config) { + if (!mock) { + mock = new MockAdapter(instance) + } + + if (Array.isArray(config)) { + config.forEach((item) => { + mock.proxy(item) + }) + } + + return mock + }, + disableMock() { + mock && mock.restore() + mock = undefined + }, + isMock() { + return typeof mock !== 'undefined' + }, + CancelToken: axios.CancelToken, + isCancel: axios.isCancel + } +} diff --git a/packages/common/composable/http/index.js b/packages/common/composable/http/index.js new file mode 100644 index 0000000000..bdc702ec72 --- /dev/null +++ b/packages/common/composable/http/index.js @@ -0,0 +1,63 @@ +import { defineService, META_SERVICE } from '@opentiny/tiny-engine-meta-register' +import axios from './axios' + +const addInterceptors = ({ data, http, type }) => { + if (typeof data === 'function') { + http.interceptors[type].use(data) + + return + } + + if (Array.isArray(data)) { + data.forEach((item) => { + if (Array.isArray(item)) { + http.interceptors[type].use(...item) + + return + } + + if (typeof item === 'function') { + http.interceptors[type].use(item) + } + }) + } +} + +export default defineService({ + id: META_SERVICE.Http, + type: 'MetaService', + initialState: { + http: null + }, + options: { + axiosConfig: { + // axios 配置 + baseURL: '', + withCredentials: false, // 跨域请求时是否需要使用凭证 + headers: {} // 请求头 + }, + enableMock: false, // 是否启用 mock + mockData: {}, // mock 数据 + interceptors: { + // 拦截器 + request: [], // 支持配置多个请求拦截器,先注册后执行 + response: [] // 支持配置多个响应拦截器,先注册先执行 + } + }, + init: ({ state, options = {} }) => { + const { axiosConfig = {}, interceptors = {}, enableMock, mockData } = options + const http = axios(axiosConfig) + + enableMock && http.mock(mockData) + + const { request = [], response = [] } = interceptors + + addInterceptors({ data: request, http, type: 'request' }) + addInterceptors({ data: response, http, type: 'response' }) + + state.http = http + }, + apis: ({ state }) => ({ + getHttp: () => state.http + }) +}) diff --git a/packages/common/composable/index.js b/packages/common/composable/index.js index 7abca10782..11be93bbef 100644 --- a/packages/common/composable/index.js +++ b/packages/common/composable/index.js @@ -1,2 +1,3 @@ export { GenerateCodeService } from './generateCode' export { default as GlobalService } from './defaultGlobalService' +export { default as HttpService } from './http' diff --git a/packages/design-core/index.js b/packages/design-core/index.js index 58d5d8bcc3..2be107bc1e 100644 --- a/packages/design-core/index.js +++ b/packages/design-core/index.js @@ -38,7 +38,8 @@ export { PluginPanel, PluginSetting, ToolbarBase, - GlobalService + GlobalService, + HttpService } from '@opentiny/tiny-engine-common' export { default as defaultRegistry } from './registry' diff --git a/packages/register/src/constants.js b/packages/register/src/constants.js index 03db83897d..dee67414bb 100644 --- a/packages/register/src/constants.js +++ b/packages/register/src/constants.js @@ -1,6 +1,7 @@ export const META_SERVICE = { GlobalService: 'engine.service.globalService', EditorInfo: 'engine.service.editorInfo', + Http: 'engine.service.http', App: 'engine.service.app', GenerateCode: 'engine.service.generateCode', Layout: 'engine.service.layout', diff --git a/packages/register/src/service.js b/packages/register/src/service.js index 11b53796d4..51be10e0bb 100644 --- a/packages/register/src/service.js +++ b/packages/register/src/service.js @@ -1,4 +1,5 @@ import { reactive, readonly } from 'vue' +import { merge } from 'lodash-es' import { metaHashMap } from './common' /** @@ -73,6 +74,10 @@ export const defineService = (serviceOptions) => { resultService.apis = apis({ state }) } + resultService.apis.setOptions = (kv) => { + resultService.options = merge({}, options, kv) + } + resultService.apis.getState = () => readonly(state) resultService.apis.setState = (kv) => { Object.assign(state, kv) From d994745bba36209c61f518a3e6849f386265d4c7 Mon Sep 17 00:00:00 2001 From: yy-wow Date: Mon, 28 Oct 2024 23:35:58 -0700 Subject: [PATCH 02/19] feat: useHttp 2 httpService --- .../canvas/DesignCanvas/src/DesignCanvas.vue | 7 +- .../common/composable/defaultGlobalService.js | 9 +-- packages/common/composable/http/index.js | 7 +- packages/common/js/http.js | 10 +-- packages/common/js/vscodeGenerateFile.js | 18 ++--- .../CollectionConfigurator.vue | 4 +- .../VariableConfigurator.vue | 16 ++-- .../src/preview/src/preview/http.js | 15 ++-- .../src/preview/src/previewApp.vue | 76 +++++++++---------- packages/plugins/block/src/js/http.js | 50 +++++++----- packages/plugins/bridge/src/http.js | 26 ++++--- packages/plugins/datasource/src/js/http.js | 34 +++++---- packages/plugins/i18n/src/Main.vue | 3 +- .../i18n/src/composable/useTranslate.js | 11 ++- .../materials/src/composable/useMaterial.js | 17 +++-- .../materials/src/composable/useResource.js | 3 +- .../materials/src/meta/block/src/http.js | 34 +++++---- packages/plugins/page/src/http.js | 29 +++---- packages/plugins/robot/src/Main.vue | 6 +- packages/plugins/robot/src/js/robotSetting.js | 3 +- packages/plugins/state/src/js/http.js | 9 +-- packages/plugins/tutorial/src/js/http.js | 10 +-- packages/toolbars/generate-code/src/Main.vue | 3 +- packages/toolbars/generate-code/src/http.js | 41 ---------- packages/toolbars/lock/src/http.js | 7 +- packages/toolbars/logo/src/Main.vue | 33 ++++---- packages/toolbars/logout/src/js/http.js | 6 +- 27 files changed, 232 insertions(+), 255 deletions(-) delete mode 100644 packages/toolbars/generate-code/src/http.js diff --git a/packages/canvas/DesignCanvas/src/DesignCanvas.vue b/packages/canvas/DesignCanvas/src/DesignCanvas.vue index 65727d0f52..2633d88ce1 100644 --- a/packages/canvas/DesignCanvas/src/DesignCanvas.vue +++ b/packages/canvas/DesignCanvas/src/DesignCanvas.vue @@ -28,9 +28,10 @@ import { useModal, getMergeRegistry, getMergeMeta, - getOptions + getOptions, + getMetaApi, + META_SERVICE } from '@opentiny/tiny-engine-meta-register' -import { useHttp } from '@opentiny/tiny-engine-http' import { constants } from '@opentiny/tiny-engine-utils' import * as ast from '@opentiny/tiny-engine-common/js/ast' import { initCanvas } from '../../init-canvas/init-canvas' @@ -181,7 +182,7 @@ export default { getMaterial: useMaterial().getMaterial, addHistory: useHistory().addHistory, registerBlock: useMaterial().registerBlock, - request: useHttp(), + request: getMetaApi(META_SERVICE.Http).getHttp(), ast }, CanvasLayout, diff --git a/packages/common/composable/defaultGlobalService.js b/packages/common/composable/defaultGlobalService.js index f62f056350..edb09983c1 100644 --- a/packages/common/composable/defaultGlobalService.js +++ b/packages/common/composable/defaultGlobalService.js @@ -1,5 +1,4 @@ -import { useHttp } from '@opentiny/tiny-engine-http' -import { useMessage, useModal, defineService, META_SERVICE } from '@opentiny/tiny-engine-meta-register' +import { useMessage, useModal, defineService, getMetaApi, META_SERVICE } from '@opentiny/tiny-engine-meta-register' import { watch } from 'vue' const getBaseInfo = () => { @@ -43,7 +42,7 @@ const initialState = { const getUserInfo = () => { // 获取登录用户信息 - return useHttp() + return getMetaApi(META_SERVICE.Http) .get('/platform-center/api/user/me') .catch((error) => { useModal().message({ message: error.message, status: 'error' }) @@ -51,10 +50,10 @@ const getUserInfo = () => { } // 获取当前应用的信息 -const fetchAppInfo = (appId) => useHttp().get(`/app-center/api/apps/detail/${appId}`) +const fetchAppInfo = (appId) => getMetaApi(META_SERVICE.Http).get(`/app-center/api/apps/detail/${appId}`) // 获取应用列表 -const fetchAppList = (platformId) => useHttp().get(`/app-center/api/apps/list/${platformId}`) +const fetchAppList = (platformId) => getMetaApi(META_SERVICE.Http).get(`/app-center/api/apps/list/${platformId}`) const { subscribe, publish } = useMessage() diff --git a/packages/common/composable/http/index.js b/packages/common/composable/http/index.js index bdc702ec72..07975bec73 100644 --- a/packages/common/composable/http/index.js +++ b/packages/common/composable/http/index.js @@ -58,6 +58,11 @@ export default defineService({ state.http = http }, apis: ({ state }) => ({ - getHttp: () => state.http + getHttp: () => state.http, + get: (...args) => state.http?.get(...args), + post: (...args) => state.http?.post(...args), + request: (...args) => state.http?.request(...args), + put: (...args) => state.http?.put(...args), + delete: (...args) => state.http?.delete(...args) }) }) diff --git a/packages/common/js/http.js b/packages/common/js/http.js index d6b51c2ba7..5d31972e15 100644 --- a/packages/common/js/http.js +++ b/packages/common/js/http.js @@ -10,12 +10,10 @@ * */ -import { useHttp } from '@opentiny/tiny-engine-http' import { isVsCodeEnv } from './environments' import { generateRouter, generatePage } from './vscodeGenerateFile' import { usePage, useCanvas, useNotify } from '@opentiny/tiny-engine-meta-register' - -const http = useHttp() +import { getMetaApi, META_SERVICE } from '@opentiny/tiny-engine-meta-register' /** * 异常情况埋点上传 @@ -27,7 +25,9 @@ export const requestEvent = (url, params) => { return } - return http.post(url, params).catch(() => {}) + return getMetaApi(META_SERVICE.Http) + .post(url, params) + .catch(() => {}) } /** @@ -38,7 +38,7 @@ export const requestEvent = (url, params) => { * */ export const handlePageUpdate = (pageId, params, routerChange) => { - return http + return getMetaApi(META_SERVICE.Http) .post(`/app-center/api/pages/update/${pageId}`, params) .then((res) => { const { pageSettingState } = usePage() diff --git a/packages/common/js/vscodeGenerateFile.js b/packages/common/js/vscodeGenerateFile.js index 35ea136899..357f6effc9 100644 --- a/packages/common/js/vscodeGenerateFile.js +++ b/packages/common/js/vscodeGenerateFile.js @@ -10,9 +10,7 @@ * */ -import { useHttp } from '@opentiny/tiny-engine-http' - -const http = useHttp() +import { getMetaApi, META_SERVICE } from '@opentiny/tiny-engine-meta-register' /** * vscode生成路由文件 @@ -26,7 +24,7 @@ const http = useHttp() * @returns { string } */ -const generateRouter = (params) => http.post('/generate/api/generateRouter', params) +const generateRouter = (params) => getMetaApi(META_SERVICE.Http).post('/generate/api/generateRouter', params) /** * vscode生成本地国际化词条 @@ -43,7 +41,7 @@ const generateRouter = (params) => http.post('/generate/api/generateRouter', par * @returns { string } */ -const generateI18n = (params) => http.post('/generate/api/generateI18n', params) +const generateI18n = (params) => getMetaApi(META_SERVICE.Http).post('/generate/api/generateI18n', params) /** * vscode生成区块 @@ -57,7 +55,7 @@ const generateI18n = (params) => http.post('/generate/api/generateI18n', params) * @returns { string } */ -const generateBlock = (params) => http.post('/generate/api/generateBlock', params) +const generateBlock = (params) => getMetaApi(META_SERVICE.Http).post('/generate/api/generateBlock', params) /** * vscode生成页面 @@ -70,7 +68,7 @@ const generateBlock = (params) => http.post('/generate/api/generateBlock', param } * @returns { string } */ -const generatePage = (params) => http.post('/generate/api/generatePage', params) +const generatePage = (params) => getMetaApi(META_SERVICE.Http).post('/generate/api/generatePage', params) /** * vscode生成数据源 @@ -86,7 +84,7 @@ const generatePage = (params) => http.post('/generate/api/generatePage', params) } * @returns { string } */ -const generateDataSource = (params) => http.post('/generate/api/generateDataSource', params) +const generateDataSource = (params) => getMetaApi(META_SERVICE.Http).post('/generate/api/generateDataSource', params) /** * vscode生成桥接源 @@ -98,7 +96,7 @@ const generateDataSource = (params) => http.post('/generate/api/generateDataSour } * @returns { string } */ -const generateBridge = (params) => http.post('/generate/api/generateBridge', params) +const generateBridge = (params) => getMetaApi(META_SERVICE.Http).post('/generate/api/generateBridge', params) /** * vscode生成工具类 @@ -110,6 +108,6 @@ const generateBridge = (params) => http.post('/generate/api/generateBridge', par } * @returns { string } */ -const generateUtil = (params) => http.post('/generate/api/generateUtil', params) +const generateUtil = (params) => getMetaApi(META_SERVICE.Http).post('/generate/api/generateUtil', params) export { generateRouter, generateI18n, generateBlock, generatePage, generateDataSource, generateBridge, generateUtil } diff --git a/packages/configurator/src/collection-configurator/CollectionConfigurator.vue b/packages/configurator/src/collection-configurator/CollectionConfigurator.vue index 9b4448bbfb..5d05badb71 100644 --- a/packages/configurator/src/collection-configurator/CollectionConfigurator.vue +++ b/packages/configurator/src/collection-configurator/CollectionConfigurator.vue @@ -11,7 +11,6 @@ - - diff --git a/packages/http/src/axios.js b/packages/http/src/axios.js deleted file mode 100644 index 1f19ae50da..0000000000 --- a/packages/http/src/axios.js +++ /dev/null @@ -1,151 +0,0 @@ -/** - * 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 axios from 'axios' -import MockAdapter from 'axios-mock-adapter' - -export function globalDefaults(key, value) { - if (key && typeof key === 'string') { - if (typeof value === 'undefined') { - return axios.defaults[key] - } - axios.defaults[key] = value - return undefined - } - - return axios.defaults -} - -export default (config) => { - const instance = axios.create(config) - const defaults = {} - let mock - - if (typeof MockAdapter.prototype.proxy === 'undefined') { - MockAdapter.prototype.proxy = function ({ url, config = {}, proxy, response, handleData } = {}) { - let stream = this - const request = (proxy, any) => { - return (setting) => { - return new Promise((resolve) => { - config.responseType = 'json' - axios - .get(any ? proxy + setting.url + '.json' : proxy, config) - .then(({ data }) => { - typeof handleData === 'function' && (data = handleData(data, setting)) - resolve([200, data]) - }) - .catch((error) => { - resolve([error.response.status, error.response.data]) - }) - }) - } - } - - if (url === '*' && proxy && typeof proxy === 'string') { - stream = proxy === '*' ? this.onAny().passThrough() : this.onAny().reply(request(proxy, true)) - } else { - if (proxy && typeof proxy === 'string') { - stream = this.onAny(url).reply(request(proxy)) - } else if (typeof response === 'function') { - stream = this.onAny(url).reply(response) - } - } - - return stream - } - } - - return { - request(config) { - return instance(config) - }, - get(url, config) { - return instance.get(url, config) - }, - delete(url, config) { - return instance.delete(url, config) - }, - head(url, config) { - return instance.head(url, config) - }, - post(url, data, config) { - return instance.post(url, data, config) - }, - put(url, data, config) { - return instance.put(url, data, config) - }, - patch(url, data, config) { - return instance.patch(url, data, config) - }, - all(iterable) { - return axios.all(iterable) - }, - spread(callback) { - return axios.spread(callback) - }, - defaults(key, value) { - if (key && typeof key === 'string') { - if (typeof value === 'undefined') { - return instance.defaults[key] - } - instance.defaults[key] = value - defaults[key] = value - return undefined - } - - return instance.defaults - }, - defaultSettings() { - return defaults - }, - interceptors: { - request: { - use(fnHandle, fnError) { - return instance.interceptors.request.use(fnHandle, fnError) - }, - eject(id) { - return instance.interceptors.request.eject(id) - } - }, - response: { - use(fnHandle, fnError) { - return instance.interceptors.response.use(fnHandle, fnError) - }, - eject(id) { - return instance.interceptors.response.eject(id) - } - } - }, - mock(config) { - if (!mock) { - mock = new MockAdapter(instance) - } - - if (Array.isArray(config)) { - config.forEach((item) => { - mock.proxy(item) - }) - } - - return mock - }, - disableMock() { - mock?.restore() - mock = undefined - }, - isMock() { - return typeof mock !== 'undefined' - }, - CancelToken: axios.CancelToken, - isCancel: axios.isCancel - } -} diff --git a/packages/http/src/config.js b/packages/http/src/config.js deleted file mode 100644 index 54b57a8caf..0000000000 --- a/packages/http/src/config.js +++ /dev/null @@ -1,29 +0,0 @@ -/** - * 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. - * - */ - -export function getConfig(env = import.meta.env) { - const baseURL = env.VITE_ORIGIN - - // 仅在本地开发时,启用 withCredentials - const dev = env.MODE?.includes('dev') - - // 获取租户 id - const getTenant = () => new URLSearchParams(location.search).get('tenant') - return { - baseURL, - withCredentials: false, - headers: { - 'x-lowcode-mode': dev ? 'develop' : null, - 'x-lowcode-org': getTenant() - } - } -} diff --git a/packages/http/src/index.js b/packages/http/src/index.js deleted file mode 100644 index 5106751059..0000000000 --- a/packages/http/src/index.js +++ /dev/null @@ -1,158 +0,0 @@ -/** - * 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. - * - */ - -/* eslint-disable no-undef */ -import axios, { globalDefaults } from './axios' -import { createApp } from 'vue' -import { useBroadcastChannel } from '@vueuse/core' -import Login from './Login.vue' -import { getConfig } from './config' -import mockData from './mock' -import { constants } from '@opentiny/tiny-engine-utils' -import { initHook, HOOK_NAME } from '@opentiny/tiny-engine-meta-register' - -const { BROADCAST_CHANNEL } = constants - -const { post: globalNotify } = useBroadcastChannel({ name: BROADCAST_CHANNEL.Notify }) - -const procession = { - promiseLogin: null, - mePromise: {} -} - -const LOGIN_EXPIRED_CODE = 401 - -const loginDom = document.createElement('div') -document.body.appendChild(loginDom) -const loginVM = createApp(Login).mount(loginDom) - -const showError = (url, message) => { - globalNotify({ - type: 'error', - title: '接口报错', - message: `报错接口: ${url} \n报错信息: ${message ?? ''}` - }) -} - -window.lowcode = { - platformCenter: { - Session: { - rebuiltCallback: function () { - loginVM.closeLogin() - - procession.mePromise.resolve('login ok') - procession.promiseLogin = null - procession.mePromise = {} - } - } - } -} - -let http // 封装axios的http实例 -let environment = import.meta.env // 当前设计器运行环境变量 - -const isVsCodeEnv = window.vscodeBridge -const isMock = () => environment.VITE_API_MOCK === 'mock' - -export const createHttp = (options) => { - // 缓存http实例,避免每个请求重新创建实例 - if (http && !options.force) { - return http - } - const isDevelopEnv = environment.MODE?.includes('dev') - const axiosConfig = getConfig(environment) - http = axios(axiosConfig) - - // 如果未指定是否启用 mock,则本地开发时默认启用,模拟数据在 public/mock 目录下 - const { enableMock = isDevelopEnv } = options - enableMock && http.mock(mockData) - - const preRequest = (config) => { - if (isDevelopEnv && config.url.match(/\/generate\//)) { - config.baseURL = '' - } - - if (isVsCodeEnv) { - config.baseURL = '' - } - - return config - } - - // 请求拦截器 - http.interceptors.request.use(preRequest) - - const preResponse = (res) => { - if (res.data?.error) { - showError(res.config?.url, res?.data?.error?.message) - - return Promise.reject(res.data.error) - } - - return res.data?.data - } - - const openLogin = () => { - return new Promise((resolve, reject) => { - if (!procession.promiseLogin) { - procession.promiseLogin = loginVM.openLogin(procession, '/api/rebuildSession') - procession.promiseLogin.then(() => { - http.request(response.config).then(resolve, reject) - }) - } - }) - } - - const errorResponse = (error) => { - // 用户信息失效时,弹窗提示登录 - const { response } = error - if (response?.status === LOGIN_EXPIRED_CODE) { - // vscode 插件环境弹出输入框提示登录 - if (window.vscodeBridge) { - return Promise.resolve(true) - } - - // 浏览器环境弹出小窗登录 - if (response?.headers['x-login-url']) { - return openLogin() - } - } - - showError(error.config?.url, error?.message) - - return response?.data.error ? Promise.reject(response.data.error) : Promise.reject(error.message) - } - - // 响应拦截器 - http.interceptors.response.use(preResponse, errorResponse) - - return http -} - -/** - * 根据环境不同初始化设置http参数 - * @param {*} env: 当前环境变量 - */ -export const initHttp = ({ env }) => { - if (Object.keys(env).length) { - environment = env - } - const baseURL = environment.VITE_ORIGIN - // 调用初始化方法前可能已经存在已经实例化的http,需要设置baseURL - http?.defaults('baseURL', baseURL) - globalDefaults('baseURL', baseURL) - http = createHttp({ force: true, enableMock: isMock() }) -} - -export const useHttp = () => createHttp({ enableMock: isMock() }) - -initHook(HOOK_NAME.useHttp, useHttp, { useDefaultExport: true }) diff --git a/packages/http/src/mock.js b/packages/http/src/mock.js deleted file mode 100644 index 9b33d94d76..0000000000 --- a/packages/http/src/mock.js +++ /dev/null @@ -1,939 +0,0 @@ -/** -* 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. -* -*/ - -const arrData = [] -const blockList = [] -let tempObj = null -let blockCount = 0 -let blockProgress = 0 - -export default [ - // 获取app的详细信息 - { - url: /\/app-center\/api\/apps\/detail/, - response: async () => { - const getAppInfo = async () => { - const response = await fetch('/mock/appInfo.json') - return response.json() - } - - const appInfoRes = await getAppInfo() - return new Promise((resolve) => { - setTimeout(() => { - resolve([200, appInfoRes]) - }, 1000) - }) - } - }, - { - url: /api\/apps\/i18n\/entries/, - response: async () => { - const getAppInfo = async () => { - const response = await fetch('/mock/i18n.json') - return response.json() - } - - const appInfoRes = await getAppInfo() - return new Promise((resolve) => { - setTimeout(() => { - resolve([200, appInfoRes]) - }, 1000) - }) - } - }, - // 获取应用列表信息 - { - url: /\/app-center\/api\/apps\/list/, - response: async () => { - const getAppList = async () => { - const response = await fetch('/mock/appList.json') - return response.json() - } - - const appListRes = await getAppList() - return new Promise((resolve) => { - setTimeout(() => { - resolve([200, appListRes]) - }, 1000) - }) - } - }, - // 页面管理 - 获取页面详情 - { - url: /\/app-center\/api\/pages\/detail/, - response: async (config) => { - const url = config.url - const pageId = url.substr(url.lastIndexOf('/') + 1) - - // 根据pageId加载不同的页面详情 - const pageDetail = async (pageId) => { - const response = await fetch(`/mock/pageDetail/${pageId}.json`) - return response.json() - } - - const pageInfo = await pageDetail(pageId) - - return new Promise((resolve) => { - setTimeout(() => { - resolve([200, pageInfo]) - }, 1000) - }) - } - }, - // 页面管理 - 获取页面列表 - { - url: /\/app-center\/api\/pages\/list\/\d+/, - response: async () => { - const getPageList = async () => { - const response = await fetch('/mock/pageLists.json') - return response.json() - } - - const pageListRes = await getPageList() - - return new Promise((resolve) => { - setTimeout(() => { - resolve([200, pageListRes]) - }, 1000) - }) - } - }, - // 页面管理 - 获取文件夹列表列表 - { - url: /\/app-center\/api\/folders\/list/, - response: async () => { - const getPageList = async () => { - const response = await fetch('/mock/pageFolder.json') - return response.json() - } - - const pageListRes = await getPageList() - - return new Promise((resolve) => { - setTimeout(() => { - resolve([200, pageListRes]) - }, 1000) - }) - } - }, - // 页面管理 -- 新建页面 - { - url: /\/app-center\/api\/pages\/create/, - response: async (config) => { - const createPage = async () => { - const response = await fetch('/mock/createPage.json') - return response.json() - } - - const createPageRes = await createPage() - const data = JSON.parse(config.data) - const pageId = data.app - - if (pageId % 2) { - return new Promise((resolve) => { - setTimeout(() => { - resolve([200, createPageRes]) - }, 500) - }) - } - - return new Promise((resolve) => { - setTimeout(() => { - resolve([200, { error: { message: '服务出错' } }]) - }, 500) - }) - } - }, - // 页面管理 -- 保存页面,同时创建页面备份记录 - { - url: /\/app-center\/api\/pages\/update/, - response: async (config) => { - const savePage = async () => { - const response = await fetch('/mock/savePage.json') - return response.json() - } - - const savePageRes = await savePage() - - const url = config.url - const pageId = url.substr(url.lastIndexOf('/') + 1) - - if (pageId === '1') { - return new Promise((resolve) => { - setTimeout(() => { - resolve([200, savePageRes]) - }, 1000) - }) - } - - return new Promise((resolve) => { - setTimeout(() => { - resolve([200, { error: { message: '服务出错' } }]) - }, 500) - }) - } - }, - // 页面管理 -- 复制页面 - /** - * params - * { - * name:'', - * route:'', - * parent:'', - * groupId:'' - * } - * res - * { - * pages:[{},{}], - * pageInfo:{} - * } - **/ - { - url: /\/app-center\/api\/pages\/copy/, - response: async (config) => { - const newPage = JSON.parse(config.data) - - const pageList = async () => { - const response = await fetch('/mock/pageList.json') - - return response.json() - } - - const list = await pageList(newPage) - list.data[0].data.push(newPage) - - const res = { - data: { - pages: list, - newPage: newPage - } - } - - return new Promise((resolve) => { - setTimeout(() => { - resolve([200, res]) - }, 1000) - }) - } - }, - // 根据页面ID获取页面历史备份列表 - { - url: /\/app-center\/api\/pageHistory\/list/, - response: async (config) => { - /** - * 数据格式 - * [ - * { - * "id": 1, - * "pageId": 1, // 页面ID,根据id获取页面详情 - * "message": "修改文本内容", - * "time": "2022-02-06 18:00:00" - * } - * ] - */ - const pageId = config.url.substr(config.url.lastIndexOf('/') + 1) - - const pageHistory = async (pageId) => { - const response = await fetch(`/mock/pageHistory/${pageId}.json`) - return response.json() - } - - const historyData = await pageHistory(pageId) - - return new Promise((resolve) => { - setTimeout(() => { - resolve([200, historyData]) - }, 1000) - }) - } - }, - // 删除页面备份记录 - { - url: /\/app-center\/api\/pageHistory\/delete/, - response: async () => { - return new Promise((resolve) => { - setTimeout(() => { - resolve([200]) - }, 1000) - }) - } - }, - // 根据页面备份记录还原页面信息 - { - url: /\/app-center\/api\/pageHistory\/restore/, - response: async () => { - return new Promise((resolve) => { - setTimeout(() => { - resolve([200]) - }, 1000) - }) - } - }, - // 创建区块分组信息 - { - url: /\/material-center\/api\/block-groups\/create/, - response: (config) => { - const data = JSON.parse(config.data) - const name = data.name - - const id = blockList.length + 1 - const group = { - id, - name, - blocks: [] - } - - blockList.push(group) - - return new Promise((resolve) => { - setTimeout(() => { - resolve([200, { data: group }]) - }, 500) - }) - } - }, - // 更新分组:修改分组名字/向分组里添加、删除区块 - { - url: /\/material-center\/api\/block-groups\/update/, - response: async (config) => { - const url = config.url - const groupId = url.substr(url.lastIndexOf('/') + 1) - const { name, blocks } = JSON.parse(config.data) - const getAvailable = async (groupId) => { - const response = await fetch(`/mock/block/available/${(groupId % 2) + 1}.json`) - return response.json() - } - - const avaliableBlocks = await getAvailable(groupId) - let result = [] - - for (let i = 0; i < blockList.length; i++) { - if (String(blockList[i].id) === groupId) { - if (name) blockList[i].name = name - if (blocks) { - blockList[i].blocks = [] - avaliableBlocks.forEach((item) => { - if (blocks.indexOf(item.id) > -1) { - blockList[i].blocks.push(item) - } - }) - } - result = blockList[i] - - break - } - } - - return new Promise((resolve) => { - setTimeout(() => { - resolve([200, { data: result }]) - }, 500) - }) - } - }, - // 根据区块分组ID删除区块分组信息 - { - url: /\/material-center\/api\/block-groups\/delete/, - response: async (config) => { - const url = config.url - const groupId = url.substr(url.lastIndexOf('/') + 1) - - const group = blockList.splice( - blockList.findIndex((item) => item.id === groupId), - 1 - ) - - return new Promise((resolve) => { - setTimeout(() => { - resolve([200, { data: group }]) - }, 500) - }) - } - }, - // 获取区块分组列表 - { - url: /\/material-center\/api\/block-groups/, - response() { - return new Promise((resolve) => { - setTimeout(() => { - resolve([200, { data: blockList }]) - }, 500) - }) - } - }, - // 创建区块 - { - url: /\/material-center\/api\/block\/create/, - response: async (config) => { - const data = JSON.parse(config.data) - - // 创建需往数据库里插入信息 - data.id = String(++blockCount) - arrData.push(data) - - const blockId = data.id - if (blockId % 2) { - return new Promise((resolve) => { - setTimeout(() => { - resolve([200, { data }]) - }, 2000) // 耗时较长 - }) - } - - return new Promise((resolve) => { - setTimeout(() => { - resolve([200, { error: { message: '新建区块失败' } }]) - }, 500) - }) - } - }, - // 发布区块 - { - url: /\/material-center\/api\/block\/deploy/, - /* - 请求参数: - { - block, - deploy_info: "修改button信息" - } - */ - response: async (config) => { - const data = JSON.parse(config.data) - const blockId = data.block?.id - if (blockId % 2) { - const deploy = async () => { - const response = await fetch(`/mock/block/deploy.json`) - return response.json() - } - const deployData = await deploy() - - return new Promise((resolve) => { - setTimeout(() => { - resolve([200, { data: deployData.data }]) - }, 500) - }) - } - - return new Promise((resolve) => { - setTimeout(() => { - resolve([200, { error: { message: '发布区块失败' } }]) - }, 500) - }) - } - }, - // 获取发布区块的进度信息 - { - url: /\/material-center\/api\/tasks/, - response: async (config) => { - const url = config.url - const taskId = url.substr(url.lastIndexOf('/') + 1) - const deployProgress = async () => { - const response = await fetch(`/mock/block/deployProgress.json`) - return response.json() - } - const deployProgressRes = await deployProgress() - - // 区块Id不相等直接返回 - if (Number(taskId) !== deployProgressRes.data.id) { - return new Promise((resolve) => { - setTimeout(() => { - resolve([200, { error: { message: '查询区块进度失败' } }]) - }, 500) - }) - } - - const FINISHED_PROGRESS = 100 - const INTERVAL_PROGRESS = 20 - - // 判断发布状态 - const deployStatus = deployProgressRes.data.taskStatus - - // 如果构建状态为运行中:1, 返回构建进度条 - if (deployStatus === 1) { - // 模拟后台进度更新, 每次查询进度更新增加20% - deployProgressRes.data.progress_percent = blockProgress - blockProgress += INTERVAL_PROGRESS - - if (blockProgress >= FINISHED_PROGRESS) { - deployProgressRes.data.progress_percent = FINISHED_PROGRESS - blockProgress = 0 - } - } - - // 其它状态直接返回结果 - return new Promise((resolve) => { - setTimeout(() => { - resolve([200, deployProgressRes]) - }, 1000) - }) - } - }, - // 修改区块,同时创建区块备份记录/还原到某一历史备份 - { - url: /\/material-center\/api\/block\/update/, - response: async (config) => { - const url = config.url - const blockId = url.substr(url.lastIndexOf('/') + 1) - const { current_history } = JSON.parse(config.data) - - // 消费侧-还原到某一历史备份 - if (current_history) { - let block = null - - for (let i = 0; i < blockList.length; i++) { - const blocks = blockList[i].blocks - - for (let i = 0; i < blocks.length; i++) { - block = blocks[i] - - if (String(block.id) === blockId && block.current_history) { - block.current_history.id = current_history - - break - } - } - } - - return new Promise((resolve) => { - setTimeout(() => { - resolve([200, { data: block }]) - }, 500) - }) - } - - // 只有奇数区块可以保存成功 - if (blockId % 2) { - const block = JSON.parse(config.data) - let blockData = null - - for (let i = 0; i < arrData.length; i++) { - if (Number(arrData[i].id) === Number(blockId)) { - blockData = arrData[i] - - Object.entries(block).forEach(([key, value]) => { - blockData[key] = value - }) - - break - } - } - - return new Promise((resolve) => { - setTimeout(() => { - resolve([200, { data: blockData }]) - }, 1000) - }) - } - - return new Promise((resolve) => { - setTimeout(() => { - resolve([200, { error: { message: '保存区块失败' } }]) - }, 500) - }) - } - }, - // 区块管理 -- 获取区块列表 - { - url: /\/material-center\/api\/block\/list/, - proxy: '/mock/block/blockList.json', - handleData({ data }) { - if (arrData.length === 0) { - arrData.push(...data) - blockCount = arrData.length - } - - return { data: arrData } - } - }, - // 区块管理 -- 删除区块 - { - url: /\/material-center\/api\/block\/delete/, - response(config) { - const url = config.url - const blockId = url.substr(url.lastIndexOf('/') + 1) - let data = [] - - // 只有 ID 为奇数的区块才能删除,否则抛出错误信息 - if (blockId % 2) { - arrData.some((item, index) => { - if (String(item.id) === blockId) { - data = item - arrData.splice(index, 1) - return true - } - return false - }) - - return new Promise((resolve) => { - setTimeout(() => { - resolve([200, { data }]) - }, 500) // 耗时较短 - }) - } - - return new Promise((resolve) => { - setTimeout(() => { - resolve([200, { error: { message: '删除区块失败' } }]) - }, 500) // 耗时较短 - }) - } - }, - // 根据区块ID获取区块历史备份列表 - { - url: /\/material-center\/api\/block-history/, - response: async (config) => { - const url = config.url - const query = url.substr(url.indexOf('?')) - const params = new URLSearchParams(query) - const block = params.get('block') - - if (!block) { - return new Promise((resolve) => { - setTimeout(() => { - resolve([200, { data: [] }]) - }, 1000) - }) - } - - const historyList = async () => { - const response = await fetch(`/mock/block/history.json`) - return response.json() - } - - const blockInfo = await historyList(block) - - return new Promise((resolve) => { - setTimeout(() => { - resolve([200, { data: blockInfo }]) - }, 1000) - }) - } - }, - // 删除区块备份记录 - { - url: /\/app-center\/api\/blockHistory\/delete/, - response: async () => { - return new Promise((resolve) => { - setTimeout(() => { - resolve([200]) - }, 1000) - }) - } - }, - // 根据区块备份记录还原区块信息 - { - url: /\/app-center\/api\/blockHistory\/restore/, - response: async () => { - return new Promise((resolve) => { - setTimeout(() => { - resolve([200]) - }, 1000) - }) - } - }, - // 根据分组ID获取当前分组可以添加的区块 - { - url: /\/material-center\/api\/block\/notgroup/, - response: async (config) => { - const url = config.url - const groupId = - url.indexOf('?') > -1 - ? url.substring(url.lastIndexOf('/') + 1, url.indexOf('?')) - : url.substr(url.lastIndexOf('/') + 1) - const query = url.substr(url.indexOf('?')) - const params = new URLSearchParams(query) - const value = params.get('label_contains') - const author = params.getAll('author') - const tenant = params.getAll('tenant') - const tag = params.getAll('tag') - - if (!groupId) { - return new Promise((resolve) => { - setTimeout(() => { - resolve([200, { data: [] }]) - }, 500) - }) - } - - const getAvailable = async (groupId) => { - const response = await fetch(`/mock/block/available/${(groupId % 2) + 1}.json`) - return response.json() - } - - const blocks = await getAvailable(groupId) - - // 搜索结果 - const searchResult = value ? blocks.filter((item) => item.label.indexOf(value) > -1) : blocks - // 标签过滤结果 - const tagResult = - tag && tag.length ? searchResult.filter((item) => item.tags?.some((i) => tag.includes(i))) : searchResult - // 组织过滤结果 - const tenantResult = - tenant && tenant.length ? tagResult.filter((item) => tenant.includes(String(item.tenant?.id))) : tagResult - // 作者过滤结果 - const authorResult = - author && author.length ? tenantResult.filter((item) => author.includes(String(item.author?.id))) : tenantResult - - return new Promise((resolve) => { - setTimeout(() => { - resolve([200, { data: authorResult }]) - }, 500) - }) - } - }, - // 获取区块所有标签 - { - url: /\/material-center\/api\/block\/tags/, - response: async () => { - const getAvailable = async () => { - const response = await fetch(`/mock/block/available/1.json`) - return response.json() - } - - const blocks = await getAvailable() - const tags = [] - - blocks && - blocks.forEach((block) => { - block.tags && tags.push(...block.tags) - }) - - return new Promise((resolve) => { - setTimeout(() => { - resolve([200, { data: Array.from(new Set(tags)) }]) - }, 500) - }) - } - }, - // 获取区块所有作者 - { - url: /\/material-center\/api\/block\/users/, - response: async () => { - const getAvailable = async () => { - const response = await fetch(`/mock/block/available/1.json`) - return response.json() - } - - const blocks = await getAvailable() - const users = [] - - blocks && - blocks.forEach((block) => { - users.push(block.author) - }) - - return new Promise((resolve) => { - setTimeout(() => { - resolve([200, { data: users }]) - }, 500) - }) - } - }, - // 获取区块所有组织 - { - url: /\/material-center\/api\/block\/tenants/, - response: async () => { - const getAvailable = async () => { - const response = await fetch(`/mock/block/available/1.json`) - return response.json() - } - - const blocks = await getAvailable() - const tenants = [] - - blocks && - blocks.forEach((block) => { - block.tenant && tenants.push(block.tenant) - }) - - return new Promise((resolve) => { - setTimeout(() => { - resolve([200, { data: tenants }]) - }, 500) - }) - } - }, - // 根据区块分组ID获取该分组下的区块列表 - { - url: /\/material-center\/api\/block/, - response(config) { - const url = config.url - const query = url.substr(url.indexOf('?')) - const params = new URLSearchParams(query) - const groupId = params.get('groups') - const value = params.get('label_contains') - let groupData = [] - - for (let i = 0; i < blockList.length; i++) { - if (String(blockList[i].id) === groupId) { - groupData = blockList[i].blocks - - break - } - } - - groupData = value ? groupData.filter((item) => item.label.indexOf(value) > -1) : groupData - - return new Promise((resolve) => { - setTimeout(() => { - resolve([200, { data: groupData }]) - }, 500) - }) - } - }, - // 数据源管理 -- 获取数据源列表 - { - url: /api\/sources\/list/, - response: async () => { - const getDatasourceList = async () => { - const response = await fetch('/mock/datasource.json') - return response.json() - } - - let { data } = await getDatasourceList() - const index = data.findIndex((data) => data.id === tempObj?.id) - - if (index > -1) { - data[index] = tempObj - - if (tempObj.status === 'delete') { - data.splice(index, 1) - } - } else { - if (tempObj) { - tempObj.id = data.length + 1 - data = [...data, tempObj] - } - } - - return new Promise((resolve) => { - setTimeout(() => { - resolve([200, { data: data }]) - }, 1000) - }) - } - }, - // 数据源管理 -- 新增数据源 - { - url: /\/app-center\/api\/sources\/create/, - response: async (config) => { - tempObj = JSON.parse(config.data) - - return new Promise((resolve) => { - setTimeout(() => { - resolve([200, { data: tempObj }]) - }, 1000) - }) - } - }, - // 数据源管理 -- 删除数据源 - { - url: /\/app-center\/api\/sources\/delete/, - response: async (config) => { - const url = config.url - const dataSourceId = url.substr(url.lastIndexOf('/') + 1) - tempObj = { id: dataSourceId, status: 'delete' } - - return new Promise((resolve) => { - setTimeout(() => { - resolve([200, { data: tempObj }]) - }, 500) - }) - } - }, - // 数据源管理 -- 更新数据源 - { - url: /\/app-center\/api\/sources\/update/, - response: async (config) => { - const addres = config.url.split('/') - const id = Number(addres[addres.length - 1]) - - // 提交需要更新的内容 - tempObj = JSON.parse(config.data) - tempObj.id = id - - return new Promise((resolve) => { - setTimeout(() => { - resolve([200, { data: tempObj }]) - }, 500) - }) - } - }, - // 数据源管理 -- 查询数据源详情 - { - url: /api\/sources\/detail/, - response: async (config) => { - const addres = config.url.split('/') - const id = addres[addres.length - 1] - - const getDataSourceDetail = async () => { - const response = await fetch('/mock/datasource.json') - return response.json() - } - - const { data } = await getDataSourceDetail() - let result = data.filter((item) => item.id === id)[0] - - if (tempObj && tempObj.id === id) { - result = tempObj - } - - return new Promise((resolve) => { - setTimeout(() => { - resolve([200, { data: result }]) - }, 500) - }) - } - }, - // 数据源管理 -- 获取数据源模板列表 - { - url: /\/app-center\/api\/source_tpl/, - response: async () => { - const getDataSourceTemplate = async () => { - const response = await fetch('/mock/dataSourceTemplate.json') - return response.json() - } - const templateData = await getDataSourceTemplate() - - return new Promise((resolve) => { - setTimeout(() => { - resolve([200, templateData]) - }, 500) - }) - } - }, - // 数据源管理 -- mock 用户输入的远程服务 - { - url: /\.*api.*\/mock/, - response: async () => { - const getDataSourceTemplate = async () => { - const response = await fetch('/mock/userService.json') - return response.json() - } - const templateData = await getDataSourceTemplate() - - return new Promise((resolve) => { - setTimeout(() => { - resolve([200, templateData]) - }, 500) - }) - } - }, - { - url: /ng-bundle\.json$/, - proxy: 'mock/ng-bundle.json' - }, - { - url: '*', - proxy: '*' - } -] diff --git a/packages/http/vite.config.js b/packages/http/vite.config.js deleted file mode 100644 index afc974c252..0000000000 --- a/packages/http/vite.config.js +++ /dev/null @@ -1,39 +0,0 @@ -/** - * 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 { defineConfig } from 'vite' -import path from 'path' -import vue from '@vitejs/plugin-vue' -import vueJsx from '@vitejs/plugin-vue-jsx' -import generateComment from '@opentiny/tiny-engine-vite-plugin-meta-comments' - -// https://vitejs.dev/config/ -export default defineConfig({ - plugins: [generateComment(), vue(), vueJsx()], - publicDir: false, - resolve: {}, - build: { - cssCodeSplit: false, - lib: { - entry: path.resolve(__dirname, './src/index.js'), - name: 'http', - fileName: () => 'index.js', - formats: ['es'] - }, - rollupOptions: { - output: { - banner: 'import "./style.css"' - }, - external: ['vue', /@opentiny\/tiny-engine.*/, /@opentiny\/vue.*/] - } - } -}) diff --git a/packages/plugins/block/package.json b/packages/plugins/block/package.json index f4aa66db78..011497c75e 100644 --- a/packages/plugins/block/package.json +++ b/packages/plugins/block/package.json @@ -26,7 +26,6 @@ "homepage": "https://opentiny.design/tiny-engine", "dependencies": { "@opentiny/tiny-engine-common": "workspace:*", - "@opentiny/tiny-engine-http": "workspace:*", "@opentiny/tiny-engine-meta-register": "workspace:*", "@opentiny/tiny-engine-utils": "workspace:*", "@vue/shared": "^3.4.29", diff --git a/packages/plugins/bridge/package.json b/packages/plugins/bridge/package.json index 7e9997a876..abc9ee0384 100644 --- a/packages/plugins/bridge/package.json +++ b/packages/plugins/bridge/package.json @@ -26,7 +26,6 @@ "homepage": "https://opentiny.design/tiny-engine", "dependencies": { "@opentiny/tiny-engine-common": "workspace:*", - "@opentiny/tiny-engine-http": "workspace:*", "@opentiny/tiny-engine-meta-register": "workspace:*" }, "devDependencies": { diff --git a/packages/plugins/datasource/package.json b/packages/plugins/datasource/package.json index f33d9263e7..872fff3d91 100644 --- a/packages/plugins/datasource/package.json +++ b/packages/plugins/datasource/package.json @@ -26,7 +26,6 @@ "homepage": "https://opentiny.design/tiny-engine", "dependencies": { "@opentiny/tiny-engine-common": "workspace:*", - "@opentiny/tiny-engine-http": "workspace:*", "@opentiny/tiny-engine-meta-register": "workspace:*", "@opentiny/tiny-engine-utils": "workspace:*", "@vue/shared": "^3.3.4", diff --git a/packages/plugins/help/package.json b/packages/plugins/help/package.json index 10bffb9b3c..e2cb4c8899 100644 --- a/packages/plugins/help/package.json +++ b/packages/plugins/help/package.json @@ -25,7 +25,6 @@ "license": "MIT", "homepage": "https://opentiny.design/tiny-engine", "dependencies": { - "@opentiny/tiny-engine-http": "workspace:*", "@opentiny/tiny-engine-meta-register": "workspace:*" }, "devDependencies": { diff --git a/packages/plugins/i18n/package.json b/packages/plugins/i18n/package.json index a2d945d592..7837a4abdd 100644 --- a/packages/plugins/i18n/package.json +++ b/packages/plugins/i18n/package.json @@ -26,7 +26,6 @@ "homepage": "https://opentiny.design/tiny-engine", "dependencies": { "@opentiny/tiny-engine-common": "workspace:*", - "@opentiny/tiny-engine-http": "workspace:*", "@opentiny/tiny-engine-meta-register": "workspace:*", "@opentiny/tiny-engine-utils": "workspace:*", "vue-clipboard3": "^2.0.0" diff --git a/packages/plugins/materials/package.json b/packages/plugins/materials/package.json index 4744fabb7f..ffb1db2e12 100644 --- a/packages/plugins/materials/package.json +++ b/packages/plugins/materials/package.json @@ -27,7 +27,6 @@ "dependencies": { "@opentiny/tiny-engine-builtin-component": "workspace:*", "@opentiny/tiny-engine-common": "workspace:*", - "@opentiny/tiny-engine-http": "workspace:*", "@opentiny/tiny-engine-meta-register": "workspace:*", "@opentiny/tiny-engine-utils": "workspace:*" }, diff --git a/packages/plugins/page/package.json b/packages/plugins/page/package.json index a99b56894b..dcdfb17b8e 100644 --- a/packages/plugins/page/package.json +++ b/packages/plugins/page/package.json @@ -26,7 +26,6 @@ "homepage": "https://opentiny.design/tiny-engine", "dependencies": { "@opentiny/tiny-engine-common": "workspace:*", - "@opentiny/tiny-engine-http": "workspace:*", "@opentiny/tiny-engine-meta-register": "workspace:*", "@opentiny/tiny-engine-utils": "workspace:*" }, diff --git a/packages/plugins/robot/package.json b/packages/plugins/robot/package.json index 70825a07c2..b18ee22e23 100644 --- a/packages/plugins/robot/package.json +++ b/packages/plugins/robot/package.json @@ -25,7 +25,6 @@ "license": "MIT", "homepage": "https://opentiny.design/tiny-engine", "dependencies": { - "@opentiny/tiny-engine-http": "workspace:*", "@opentiny/tiny-engine-meta-register": "workspace:*" }, "devDependencies": { diff --git a/packages/plugins/schema/package.json b/packages/plugins/schema/package.json index 3a1a3d468c..11b0460490 100644 --- a/packages/plugins/schema/package.json +++ b/packages/plugins/schema/package.json @@ -26,7 +26,6 @@ "homepage": "https://opentiny.design/tiny-engine", "dependencies": { "@opentiny/tiny-engine-common": "workspace:*", - "@opentiny/tiny-engine-http": "workspace:*", "@opentiny/tiny-engine-meta-register": "workspace:*", "@opentiny/tiny-engine-utils": "workspace:*" }, diff --git a/packages/plugins/state/package.json b/packages/plugins/state/package.json index 71d1957fd1..7c36836790 100644 --- a/packages/plugins/state/package.json +++ b/packages/plugins/state/package.json @@ -26,7 +26,6 @@ "homepage": "https://opentiny.design/tiny-engine", "dependencies": { "@opentiny/tiny-engine-common": "workspace:*", - "@opentiny/tiny-engine-http": "workspace:*", "@opentiny/tiny-engine-meta-register": "workspace:*", "@opentiny/tiny-engine-utils": "workspace:*", "monaco-editor": "0.33.0" diff --git a/packages/plugins/tutorial/package.json b/packages/plugins/tutorial/package.json index ea0d36c12d..608b8a191f 100644 --- a/packages/plugins/tutorial/package.json +++ b/packages/plugins/tutorial/package.json @@ -26,7 +26,6 @@ "homepage": "https://opentiny.design/tiny-engine", "dependencies": { "@opentiny/tiny-engine-common": "workspace:*", - "@opentiny/tiny-engine-http": "workspace:*", "@opentiny/tiny-engine-meta-register": "workspace:*", "marked": "^4.0.17" }, diff --git a/packages/settings/styles/package.json b/packages/settings/styles/package.json index c4d3779d09..b53e5c0d10 100644 --- a/packages/settings/styles/package.json +++ b/packages/settings/styles/package.json @@ -27,7 +27,6 @@ "dependencies": { "@opentiny/tiny-engine-common": "workspace:*", "@opentiny/tiny-engine-configurator": "workspace:*", - "@opentiny/tiny-engine-http": "workspace:*", "@opentiny/tiny-engine-meta-register": "workspace:*", "@opentiny/tiny-engine-utils": "workspace:*", "@vueuse/core": "^9.6.0", diff --git a/packages/toolbars/breadcrumb/package.json b/packages/toolbars/breadcrumb/package.json index 791d622e25..26706ef9e3 100644 --- a/packages/toolbars/breadcrumb/package.json +++ b/packages/toolbars/breadcrumb/package.json @@ -26,7 +26,6 @@ "homepage": "https://opentiny.design/tiny-engine", "dependencies": { "@opentiny/tiny-engine-common": "workspace:*", - "@opentiny/tiny-engine-http": "workspace:*", "@opentiny/tiny-engine-meta-register": "workspace:*", "@opentiny/tiny-engine-utils": "workspace:*" }, diff --git a/packages/toolbars/generate-code/package.json b/packages/toolbars/generate-code/package.json index 52239ed625..96837013e5 100644 --- a/packages/toolbars/generate-code/package.json +++ b/packages/toolbars/generate-code/package.json @@ -26,7 +26,6 @@ "homepage": "https://opentiny.design/tiny-engine", "dependencies": { "@opentiny/tiny-engine-common": "workspace:*", - "@opentiny/tiny-engine-http": "workspace:*", "@opentiny/tiny-engine-meta-register": "workspace:*", "@opentiny/tiny-engine-utils": "workspace:*" }, diff --git a/packages/toolbars/lock/package.json b/packages/toolbars/lock/package.json index 41a0041c54..935650c59f 100644 --- a/packages/toolbars/lock/package.json +++ b/packages/toolbars/lock/package.json @@ -26,7 +26,6 @@ "homepage": "https://opentiny.design/tiny-engine", "dependencies": { "@opentiny/tiny-engine-common": "workspace:*", - "@opentiny/tiny-engine-http": "workspace:*", "@opentiny/tiny-engine-meta-register": "workspace:*", "@opentiny/tiny-engine-utils": "workspace:*" }, diff --git a/packages/toolbars/logo/package.json b/packages/toolbars/logo/package.json index 760704d4d5..41118c2adf 100644 --- a/packages/toolbars/logo/package.json +++ b/packages/toolbars/logo/package.json @@ -26,7 +26,6 @@ "homepage": "https://opentiny.design/tiny-engine", "dependencies": { "@opentiny/tiny-engine-common": "workspace:*", - "@opentiny/tiny-engine-http": "workspace:*", "@opentiny/tiny-engine-meta-register": "workspace:*" }, "devDependencies": { From 8897191d07b1b8991ef56b5c1ebd6cc39c61d737 Mon Sep 17 00:00:00 2001 From: yy-wow Date: Mon, 4 Nov 2024 20:18:37 -0800 Subject: [PATCH 10/19] fix: review --- packages/common/composable/http/index.js | 38 +++++++++++++----------- 1 file changed, 20 insertions(+), 18 deletions(-) diff --git a/packages/common/composable/http/index.js b/packages/common/composable/http/index.js index 5ea8640a49..a870009705 100644 --- a/packages/common/composable/http/index.js +++ b/packages/common/composable/http/index.js @@ -3,29 +3,31 @@ import axios from 'axios' let http = null -const addInterceptors = ({ data, type }) => { - if (typeof data === 'function') { - http.interceptors[type].use(data) +const createInterceptorHandler = + (http) => + ({ data, type }) => { + if (typeof data === 'function') { + http.interceptors[type].use(data) - return - } + return + } - if (Array.isArray(data)) { - data.forEach((item) => { - if (!item) return + if (Array.isArray(data)) { + data.forEach((item) => { + if (!item) return - if (Array.isArray(item)) { - http.interceptors[type].use(...item) + if (Array.isArray(item)) { + http.interceptors[type].use(...item) - return - } + return + } - if (typeof item === 'function') { - http.interceptors[type].use(item) - } - }) + if (typeof item === 'function') { + http.interceptors[type].use(item) + } + }) + } } -} export default defineService({ id: META_SERVICE.Http, @@ -48,7 +50,7 @@ export default defineService({ const { request = [], response = [] } = interceptors http = axios.create(axiosConfig) - + const addInterceptors = createInterceptorHandler(http) addInterceptors({ data: request, type: 'request' }) addInterceptors({ data: response, type: 'response' }) }, From 628e8ad2c9acb1b861be3ad6b4adeedbff6fc45b Mon Sep 17 00:00:00 2001 From: yy-wow Date: Mon, 4 Nov 2024 20:24:04 -0800 Subject: [PATCH 11/19] fix: error --- designer-demo/src/composable/http/index.js | 1 - 1 file changed, 1 deletion(-) diff --git a/designer-demo/src/composable/http/index.js b/designer-demo/src/composable/http/index.js index 7af897eecd..a0fc41c008 100644 --- a/designer-demo/src/composable/http/index.js +++ b/designer-demo/src/composable/http/index.js @@ -3,7 +3,6 @@ import { HttpService } from '@opentiny/tiny-engine' import { useBroadcastChannel } from '@vueuse/core' import { constants } from '@opentiny/tiny-engine-utils' import Login from './Login.vue' -import mockData from './mock' const LOGIN_EXPIRED_CODE = 401 const { BROADCAST_CHANNEL } = constants From b57f8438795d92c8167a3b4d7c024a24812ef458 Mon Sep 17 00:00:00 2001 From: yy-wow Date: Tue, 5 Nov 2024 14:44:22 -0800 Subject: [PATCH 12/19] fix: review --- designer-demo/src/composable/http/index.js | 46 +++++++++++----------- 1 file changed, 23 insertions(+), 23 deletions(-) diff --git a/designer-demo/src/composable/http/index.js b/designer-demo/src/composable/http/index.js index a0fc41c008..08dccee0ea 100644 --- a/designer-demo/src/composable/http/index.js +++ b/designer-demo/src/composable/http/index.js @@ -9,29 +9,6 @@ const { BROADCAST_CHANNEL } = constants const { post: globalNotify } = useBroadcastChannel({ name: BROADCAST_CHANNEL.Notify }) -const procession = { - promiseLogin: null, - mePromise: {} -} - -const loginDom = document.createElement('div') -document.body.appendChild(loginDom) -const loginVM = createApp(Login).mount(loginDom) - -window.lowcode = { - platformCenter: { - Session: { - rebuiltCallback: function () { - loginVM.closeLogin() - - procession.mePromise.resolve('login ok') - procession.promiseLogin = null - procession.mePromise = {} - } - } - } -} - const showError = (url, message) => { globalNotify({ type: 'error', @@ -67,6 +44,29 @@ const preResponse = (res) => { } const openLogin = () => { + const procession = { + promiseLogin: null, + mePromise: {} + } + + const loginDom = document.createElement('div') + document.body.appendChild(loginDom) + const loginVM = createApp(Login).mount(loginDom) + + window.lowcode = { + platformCenter: { + Session: { + rebuiltCallback: function () { + loginVM.closeLogin() + + procession.mePromise.resolve('login ok') + procession.promiseLogin = null + procession.mePromise = {} + } + } + } + } + return new Promise((resolve, reject) => { if (!procession.promiseLogin) { procession.promiseLogin = loginVM.openLogin(procession, '/api/rebuildSession') From 7bbea8e1f4236d033a30bb11cd7324fb83d8966a Mon Sep 17 00:00:00 2001 From: yy-wow Date: Tue, 5 Nov 2024 16:04:32 -0800 Subject: [PATCH 13/19] fix: review --- designer-demo/src/composable/http/index.js | 39 ++++++++++++---------- 1 file changed, 21 insertions(+), 18 deletions(-) diff --git a/designer-demo/src/composable/http/index.js b/designer-demo/src/composable/http/index.js index 08dccee0ea..e682034982 100644 --- a/designer-demo/src/composable/http/index.js +++ b/designer-demo/src/composable/http/index.js @@ -9,6 +9,12 @@ const { BROADCAST_CHANNEL } = constants const { post: globalNotify } = useBroadcastChannel({ name: BROADCAST_CHANNEL.Notify }) +const procession = { + promiseLogin: null, + mePromise: {} +} +let loginVM = null + const showError = (url, message) => { globalNotify({ type: 'error', @@ -44,24 +50,21 @@ const preResponse = (res) => { } const openLogin = () => { - const procession = { - promiseLogin: null, - mePromise: {} - } - - const loginDom = document.createElement('div') - document.body.appendChild(loginDom) - const loginVM = createApp(Login).mount(loginDom) - - window.lowcode = { - platformCenter: { - Session: { - rebuiltCallback: function () { - loginVM.closeLogin() - - procession.mePromise.resolve('login ok') - procession.promiseLogin = null - procession.mePromise = {} + if (!window.lowcode) { + const loginDom = document.createElement('div') + document.body.appendChild(loginDom) + loginVM = createApp(Login).mount(loginDom) + + window.lowcode = { + platformCenter: { + Session: { + rebuiltCallback: function () { + loginVM.closeLogin() + + procession.mePromise.resolve('login ok') + procession.promiseLogin = null + procession.mePromise = {} + } } } } From 4bebcb370b01574885934b1f14e08b2a59168aee Mon Sep 17 00:00:00 2001 From: yy-wow Date: Tue, 5 Nov 2024 16:14:08 -0800 Subject: [PATCH 14/19] fix: review --- designer-demo/src/composable/http/index.js | 20 ++++++++++++-------- 1 file changed, 12 insertions(+), 8 deletions(-) diff --git a/designer-demo/src/composable/http/index.js b/designer-demo/src/composable/http/index.js index e682034982..f11538395a 100644 --- a/designer-demo/src/composable/http/index.js +++ b/designer-demo/src/composable/http/index.js @@ -118,14 +118,18 @@ const getConfig = (env = import.meta.env) => { } } -const options = { - axiosConfig: getConfig(), - interceptors: { - request: [preRequest], - response: [[preResponse, errorResponse]] +const customizeHttpService = () => { + const options = { + axiosConfig: getConfig(), + interceptors: { + request: [preRequest], + response: [[preResponse, errorResponse]] + } } -} -HttpService.apis.setOptions(options) + HttpService.apis.setOptions(options) + + return HttpService +} -export default HttpService +export default customizeHttpService() From 4f090aa4b4d799d09f27ffda28abda7952917945 Mon Sep 17 00:00:00 2001 From: yy-wow Date: Tue, 5 Nov 2024 17:47:10 -0800 Subject: [PATCH 15/19] fix: appid --- packages/plugins/block/src/js/blockSetting.jsx | 2 +- packages/plugins/bridge/src/js/resource.js | 2 +- packages/plugins/datasource/src/DataSourceForm.vue | 2 +- packages/plugins/materials/src/meta/block/src/BlockGroup.vue | 2 +- .../plugins/materials/src/meta/block/src/BlockGroupPanel.vue | 2 +- packages/plugins/materials/src/meta/block/src/BlockList.vue | 2 +- packages/plugins/materials/src/meta/block/src/BlockPanel.vue | 2 +- packages/plugins/page/src/PageTree.vue | 2 +- 8 files changed, 8 insertions(+), 8 deletions(-) diff --git a/packages/plugins/block/src/js/blockSetting.jsx b/packages/plugins/block/src/js/blockSetting.jsx index 181aeb5739..490ada401b 100644 --- a/packages/plugins/block/src/js/blockSetting.jsx +++ b/packages/plugins/block/src/js/blockSetting.jsx @@ -584,7 +584,7 @@ export const publishBlock = (params) => { } } -const getAppId = () => getMetaApi(META_SERVICE.GlobalService).getState().appInfo.id +const getAppId = () => getMetaApi(META_SERVICE.GlobalService).getBaseInfo().id const getCategories = () => { const appId = getAppId() diff --git a/packages/plugins/bridge/src/js/resource.js b/packages/plugins/bridge/src/js/resource.js index 1527d7c2d8..9279b671ae 100644 --- a/packages/plugins/bridge/src/js/resource.js +++ b/packages/plugins/bridge/src/js/resource.js @@ -116,7 +116,7 @@ export const ACTION_TYPE = { Edit: 'edit' } -const getAppId = () => getMetaApi(META_SERVICE.GlobalService).getState().appInfo.id +const getAppId = () => getMetaApi(META_SERVICE.GlobalService).getBaseInfo().id export const getResources = () => { const id = getAppId() diff --git a/packages/plugins/datasource/src/DataSourceForm.vue b/packages/plugins/datasource/src/DataSourceForm.vue index 1ceb50e1ed..4ccb0b44b6 100644 --- a/packages/plugins/datasource/src/DataSourceForm.vue +++ b/packages/plugins/datasource/src/DataSourceForm.vue @@ -141,7 +141,7 @@ export default { closeRemotePanel() } - const getAppId = () => getMetaApi(META_SERVICE.GlobalService).getState().appInfo.id + const getAppId = () => getMetaApi(META_SERVICE.GlobalService).getBaseInfo().id const deleteDataSource = () => { const execDelete = () => diff --git a/packages/plugins/materials/src/meta/block/src/BlockGroup.vue b/packages/plugins/materials/src/meta/block/src/BlockGroup.vue index 05b5c15536..11a0c71d8d 100644 --- a/packages/plugins/materials/src/meta/block/src/BlockGroup.vue +++ b/packages/plugins/materials/src/meta/block/src/BlockGroup.vue @@ -176,7 +176,7 @@ export default { const groupSelect = ref(null) const editFormRef = ref(null) const editFormItemRef = ref(null) - const getAppId = () => getMetaApi(META_SERVICE.GlobalService).getState().appInfo.id + const getAppId = () => getMetaApi(META_SERVICE.GlobalService).getBaseInfo().id const createGroupForm = ref(null) diff --git a/packages/plugins/materials/src/meta/block/src/BlockGroupPanel.vue b/packages/plugins/materials/src/meta/block/src/BlockGroupPanel.vue index 7fe1f675ed..66015098bd 100644 --- a/packages/plugins/materials/src/meta/block/src/BlockGroupPanel.vue +++ b/packages/plugins/materials/src/meta/block/src/BlockGroupPanel.vue @@ -80,7 +80,7 @@ export default { const { isDefaultGroupId, isRefresh, selectedGroup, selectedBlockArray, getGroupList } = useBlock() const { panel, closePanel } = useGroupPanel() const { message } = useModal() - const getAppId = () => getMetaApi(META_SERVICE.GlobalService).getState().appInfo.id + const getAppId = () => getMetaApi(META_SERVICE.GlobalService).getBaseInfo().id const panelState = inject('panelState', {}) const blockUsers = ref([]) provide('blockUsers', blockUsers) diff --git a/packages/plugins/materials/src/meta/block/src/BlockList.vue b/packages/plugins/materials/src/meta/block/src/BlockList.vue index 55ad636052..9660f3d343 100644 --- a/packages/plugins/materials/src/meta/block/src/BlockList.vue +++ b/packages/plugins/materials/src/meta/block/src/BlockList.vue @@ -81,7 +81,7 @@ export default { const panelState = inject('panelState', {}) const displayType = inject('displayType') const { message, confirm } = useModal() - const getAppId = () => getMetaApi(META_SERVICE.GlobalService).getState().appInfo.id + const getAppId = () => getMetaApi(META_SERVICE.GlobalService).getBaseInfo().id const openVersionPanel = async ({ item }) => { selectedBlock.value = item diff --git a/packages/plugins/materials/src/meta/block/src/BlockPanel.vue b/packages/plugins/materials/src/meta/block/src/BlockPanel.vue index 6674a56c85..493388cc6d 100644 --- a/packages/plugins/materials/src/meta/block/src/BlockPanel.vue +++ b/packages/plugins/materials/src/meta/block/src/BlockPanel.vue @@ -48,7 +48,7 @@ export default { const { addDefaultGroup, isDefaultGroupId, isAllGroupId, isRefresh, selectedGroup } = useBlock() const { materialState } = useMaterial() const { message } = useModal() - const getAppId = () => getMetaApi(META_SERVICE.GlobalService).getState().appInfo.id + const getAppId = () => getMetaApi(META_SERVICE.GlobalService).getBaseInfo().id const state = reactive({ searchValue: '', diff --git a/packages/plugins/page/src/PageTree.vue b/packages/plugins/page/src/PageTree.vue index 77c64adf41..6ac0762799 100644 --- a/packages/plugins/page/src/PageTree.vue +++ b/packages/plugins/page/src/PageTree.vue @@ -80,7 +80,7 @@ export default { const { setBreadcrumbPage } = useBreadcrumb() const pageTreeRefs = ref([]) const ROOT_ID = pageSettingState.ROOT_ID - const getAppId = () => getMetaApi(META_SERVICE.GlobalService).getState().appInfo.id + const getAppId = () => getMetaApi(META_SERVICE.GlobalService).getBaseInfo().id const state = reactive({ pageSearchValue: '', From 861511d6231f93cd457d4cd452210a311109a742 Mon Sep 17 00:00:00 2001 From: yy-wow Date: Tue, 5 Nov 2024 20:38:15 -0800 Subject: [PATCH 16/19] fix: appid --- .../src/collection-configurator/CollectionConfigurator.vue | 2 +- .../src/variable-configurator/VariableConfigurator.vue | 2 +- packages/plugins/bridge/src/BridgeSetting.vue | 2 +- packages/plugins/datasource/src/DataSourceGlobalDataHandler.vue | 2 +- packages/plugins/datasource/src/DataSourceList.vue | 2 +- packages/plugins/i18n/src/Main.vue | 2 +- packages/plugins/materials/src/meta/block/src/BlockDetail.vue | 2 +- packages/plugins/materials/src/meta/block/src/http.js | 2 +- packages/plugins/page/src/PageFolderSetting.vue | 2 +- packages/plugins/page/src/PageSetting.vue | 2 +- packages/plugins/robot/src/js/robotSetting.js | 2 +- 11 files changed, 11 insertions(+), 11 deletions(-) diff --git a/packages/configurator/src/collection-configurator/CollectionConfigurator.vue b/packages/configurator/src/collection-configurator/CollectionConfigurator.vue index 5d05badb71..24273149c1 100644 --- a/packages/configurator/src/collection-configurator/CollectionConfigurator.vue +++ b/packages/configurator/src/collection-configurator/CollectionConfigurator.vue @@ -47,7 +47,7 @@ export default { const fetchDataSourceList = (appId) => getMetaApi(META_SERVICE.Http).get(`/app-center/api/sources/list/${appId}`) - const appId = getMetaApi(META_SERVICE.GlobalService).getState().appInfo.id + const appId = getMetaApi(META_SERVICE.GlobalService).getBaseInfo().id fetchDataSourceList(appId).then((data) => { options.value = data }) diff --git a/packages/configurator/src/variable-configurator/VariableConfigurator.vue b/packages/configurator/src/variable-configurator/VariableConfigurator.vue index 4c3d943a70..06a4e33c82 100644 --- a/packages/configurator/src/variable-configurator/VariableConfigurator.vue +++ b/packages/configurator/src/variable-configurator/VariableConfigurator.vue @@ -486,7 +486,7 @@ export default { } else if (item.id === 'datasource') { state.bindPrefix = CONSTANTS.DATASOUCEPREFIX const url = new URLSearchParams(location.search) - const appId = getMetaApi(META_SERVICE.GlobalService).getState().appInfo.id + const appId = getMetaApi(META_SERVICE.GlobalService).getBaseInfo().id const selectedId = appId || url.get('id') // 实时请求数据源列表数据,保证数据源获取最新的数据源数据 diff --git a/packages/plugins/bridge/src/BridgeSetting.vue b/packages/plugins/bridge/src/BridgeSetting.vue index ef1782b9f1..7655882176 100644 --- a/packages/plugins/bridge/src/BridgeSetting.vue +++ b/packages/plugins/bridge/src/BridgeSetting.vue @@ -209,7 +209,7 @@ export default { category: getType(), type: getCategory(), name: state.name, - app: getMetaApi(META_SERVICE.GlobalService).getState().appInfo.id, + app: getMetaApi(META_SERVICE.GlobalService).getBaseInfo().id, content: state.category ? state.content : { diff --git a/packages/plugins/datasource/src/DataSourceGlobalDataHandler.vue b/packages/plugins/datasource/src/DataSourceGlobalDataHandler.vue index 10022e1cac..18727a23ce 100644 --- a/packages/plugins/datasource/src/DataSourceGlobalDataHandler.vue +++ b/packages/plugins/datasource/src/DataSourceGlobalDataHandler.vue @@ -55,7 +55,7 @@ export default { }) const saveGlobalDataHandle = () => { - const id = getMetaApi(META_SERVICE.GlobalService).getState().appInfo.id + const id = getMetaApi(META_SERVICE.GlobalService).getBaseInfo().id const handler = { dataHandler: { type: 'JSFunction', value: state.dataHandlerValue || DEFAULT_INTERCEPTOR.dataHandler.value }, diff --git a/packages/plugins/datasource/src/DataSourceList.vue b/packages/plugins/datasource/src/DataSourceList.vue index 511da1b7ef..631b84736b 100644 --- a/packages/plugins/datasource/src/DataSourceList.vue +++ b/packages/plugins/datasource/src/DataSourceList.vue @@ -53,7 +53,7 @@ const activeIndex = ref(-1) export const refresh = () => { const url = new URLSearchParams(location.search) - const selectedId = getMetaApi(META_SERVICE.GlobalService).getState().appInfo.id || url.get('id') + const selectedId = getMetaApi(META_SERVICE.GlobalService).getBaseInfo().id || url.get('id') fetchDataSourceList(selectedId).then((data) => { dataSourceList.value = data useCanvas().canvasApi.value.setDataSourceMap(data) diff --git a/packages/plugins/i18n/src/Main.vue b/packages/plugins/i18n/src/Main.vue index e57588628f..e41bd7d104 100644 --- a/packages/plugins/i18n/src/Main.vue +++ b/packages/plugins/i18n/src/Main.vue @@ -360,7 +360,7 @@ export default { }) } const handleChange = (data) => { - const appId = getMetaApi(META_SERVICE.GlobalService).getState().appInfo.id + const appId = getMetaApi(META_SERVICE.GlobalService).getBaseInfo().id const action = `/app-center/api/apps/${appId}/i18n/entries/update` const loadingTarget = notEmpty.value ? '#boxeight' : '#empty-loading-box' diff --git a/packages/plugins/materials/src/meta/block/src/BlockDetail.vue b/packages/plugins/materials/src/meta/block/src/BlockDetail.vue index 6c03a4bf4e..fb4f5863cd 100644 --- a/packages/plugins/materials/src/meta/block/src/BlockDetail.vue +++ b/packages/plugins/materials/src/meta/block/src/BlockDetail.vue @@ -82,7 +82,7 @@ export default { .filter((item) => item.id !== blockId) .map((item) => ({ id: item.id, version: item.current_version })) - const appId = getMetaApi(META_SERVICE.GlobalService).getState().appInfo.id + const appId = getMetaApi(META_SERVICE.GlobalService).getBaseInfo().id requestUpdateGroup({ id: groupId, blocks, app: appId }).then(() => { isRefresh.value = true emit('close') diff --git a/packages/plugins/materials/src/meta/block/src/http.js b/packages/plugins/materials/src/meta/block/src/http.js index ed37a8a6a8..10480c2384 100644 --- a/packages/plugins/materials/src/meta/block/src/http.js +++ b/packages/plugins/materials/src/meta/block/src/http.js @@ -93,7 +93,7 @@ export const requestUpdateGroup = ({ id, name, app, blocks }) => // 更新区块版本 export const requestGroupBlockVersion = async ({ groupId, blockId, blockVersion }) => { - const app = getMetaApi(META_SERVICE.GlobalService).getState().appInfo.id + const app = getMetaApi(META_SERVICE.GlobalService).getBaseInfo().id let blocks = await fetchGroupBlocksById({ groupId }) blocks = blocks.map((block) => ({ diff --git a/packages/plugins/page/src/PageFolderSetting.vue b/packages/plugins/page/src/PageFolderSetting.vue index 49cf43e625..bebb978157 100644 --- a/packages/plugins/page/src/PageFolderSetting.vue +++ b/packages/plugins/page/src/PageFolderSetting.vue @@ -105,7 +105,7 @@ export default { const data = pageSettingState.currentPageData const createParams = { ...data, - app: getMetaApi(META_SERVICE.GlobalService).getState().appInfo.id, + app: getMetaApi(META_SERVICE.GlobalService).getBaseInfo().id, isPage: false } diff --git a/packages/plugins/page/src/PageSetting.vue b/packages/plugins/page/src/PageSetting.vue index 94547d9601..4558d22746 100644 --- a/packages/plugins/page/src/PageSetting.vue +++ b/packages/plugins/page/src/PageSetting.vue @@ -171,7 +171,7 @@ export default { ...page_content_state, fileName: pageSettingState.currentPageData.name }, - app: getMetaApi(META_SERVICE.GlobalService).getState().appInfo.id, + app: getMetaApi(META_SERVICE.GlobalService).getBaseInfo().id, isPage: true } diff --git a/packages/plugins/robot/src/js/robotSetting.js b/packages/plugins/robot/src/js/robotSetting.js index aa964e73bd..d3ff7455d9 100644 --- a/packages/plugins/robot/src/js/robotSetting.js +++ b/packages/plugins/robot/src/js/robotSetting.js @@ -58,7 +58,7 @@ export const initBlockList = async () => { if (state.blockList?.length) { return } - const appId = getMetaApi(META_SERVICE.GlobalService).getState().appInfo.id + const appId = getMetaApi(META_SERVICE.GlobalService).getBaseInfo().id try { const list = await getMetaApi(META_SERVICE.Http).get('/material-center/api/blocks', { params: { appId } }) setBlocks(list) From 30efb0d7e75ca4864dfa18c7990a300ea7a58dd2 Mon Sep 17 00:00:00 2001 From: yy-wow Date: Wed, 6 Nov 2024 15:09:11 -0800 Subject: [PATCH 17/19] fix: remove unused file --- designer-demo/src/composable/http/mock.js | 921 ---------------------- 1 file changed, 921 deletions(-) delete mode 100644 designer-demo/src/composable/http/mock.js diff --git a/designer-demo/src/composable/http/mock.js b/designer-demo/src/composable/http/mock.js deleted file mode 100644 index 32538f04d4..0000000000 --- a/designer-demo/src/composable/http/mock.js +++ /dev/null @@ -1,921 +0,0 @@ -/** - * 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. - * - */ - -const arrData = [] -const blockList = [] -let tempObj = null -let blockCount = 0 -let blockProgress = 0 - -export default [ - // 获取app的详细信息 - { - url: /\/app-center\/api\/apps\/detail/, - response: async () => { - const getAppInfo = async () => { - const response = await fetch('/mock/appInfo.json') - return response.json() - } - - const appInfoRes = await getAppInfo() - return new Promise((resolve) => { - setTimeout(() => { - resolve([200, appInfoRes]) - }, 1000) - }) - } - }, - { - url: /api\/apps\/i18n\/entries/, - response: async () => { - const getAppInfo = async () => { - const response = await fetch('/mock/i18n.json') - return response.json() - } - - const appInfoRes = await getAppInfo() - return new Promise((resolve) => { - setTimeout(() => { - resolve([200, appInfoRes]) - }, 1000) - }) - } - }, - // 获取应用列表信息 - { - url: /\/app-center\/api\/apps\/list/, - response: async () => { - const getAppList = async () => { - const response = await fetch('/mock/appList.json') - return response.json() - } - - const appListRes = await getAppList() - return new Promise((resolve) => { - setTimeout(() => { - resolve([200, appListRes]) - }, 1000) - }) - } - }, - // 页面管理 - 获取页面详情 - { - url: /\/app-center\/api\/pages\/detail/, - response: async (config) => { - const url = config.url - const pageId = url.substr(url.lastIndexOf('/') + 1) - - // 根据pageId加载不同的页面详情 - const pageDetail = async (pageId) => { - const response = await fetch(`/mock/pageDetail/${pageId}.json`) - return response.json() - } - - const pageInfo = await pageDetail(pageId) - - return new Promise((resolve) => { - setTimeout(() => { - resolve([200, pageInfo]) - }, 1000) - }) - } - }, - // 页面管理 - 获取页面列表 - { - url: /\/app-center\/api\/pages\/list\/\d+/, - response: async () => { - const getPageList = async () => { - const response = await fetch('/mock/pageLists.json') - return response.json() - } - - const pageListRes = await getPageList() - - return new Promise((resolve) => { - setTimeout(() => { - resolve([200, pageListRes]) - }, 1000) - }) - } - }, - // 页面管理 - 获取文件夹列表列表 - { - url: /\/app-center\/api\/folders\/list/, - response: async () => { - const getPageList = async () => { - const response = await fetch('/mock/pageFolder.json') - return response.json() - } - - const pageListRes = await getPageList() - - return new Promise((resolve) => { - setTimeout(() => { - resolve([200, pageListRes]) - }, 1000) - }) - } - }, - // 页面管理 -- 新建页面 - { - url: /\/app-center\/api\/pages\/create/, - response: async (config) => { - const createPage = async () => { - const response = await fetch('/mock/createPage.json') - return response.json() - } - - const createPageRes = await createPage() - const data = JSON.parse(config.data) - const pageId = data.app - - if (pageId % 2) { - return new Promise((resolve) => { - setTimeout(() => { - resolve([200, createPageRes]) - }, 500) - }) - } - - return new Promise((resolve) => { - setTimeout(() => { - resolve([200, { error: { message: '服务出错' } }]) - }, 500) - }) - } - }, - // 页面管理 -- 保存页面,同时创建页面备份记录 - { - url: /\/app-center\/api\/pages\/update/, - response: async (config) => { - const savePage = async () => { - const response = await fetch('/mock/savePage.json') - return response.json() - } - - const savePageRes = await savePage() - - const url = config.url - const pageId = url.substr(url.lastIndexOf('/') + 1) - - if (pageId === '1') { - return new Promise((resolve) => { - setTimeout(() => { - resolve([200, savePageRes]) - }, 1000) - }) - } - - return new Promise((resolve) => { - setTimeout(() => { - resolve([200, { error: { message: '服务出错' } }]) - }, 500) - }) - } - }, - // 页面管理 -- 复制页面 - /** - * params - * { - * name:'', - * route:'', - * parent:'', - * groupId:'' - * } - * res - * { - * pages:[{},{}], - * pageInfo:{} - * } - **/ - { - url: /\/app-center\/api\/pages\/copy/, - response: async (config) => { - const newPage = JSON.parse(config.data) - - const pageList = async () => { - const response = await fetch('/mock/pageList.json') - - return response.json() - } - - const list = await pageList(newPage) - list.data[0].data.push(newPage) - - const res = { - data: { - pages: list, - newPage: newPage - } - } - - return new Promise((resolve) => { - setTimeout(() => { - resolve([200, res]) - }, 1000) - }) - } - }, - // 根据页面ID获取页面历史备份列表 - { - url: /\/app-center\/api\/pageHistory\/list/, - response: async (config) => { - /** - * 数据格式 - * [ - * { - * "id": 1, - * "pageId": 1, // 页面ID,根据id获取页面详情 - * "message": "修改文本内容", - * "time": "2022-02-06 18:00:00" - * } - * ] - */ - const pageId = config.url.substr(config.url.lastIndexOf('/') + 1) - - const pageHistory = async (pageId) => { - const response = await fetch(`/mock/pageHistory/${pageId}.json`) - return response.json() - } - - const historyData = await pageHistory(pageId) - - return new Promise((resolve) => { - setTimeout(() => { - resolve([200, historyData]) - }, 1000) - }) - } - }, - // 删除页面备份记录 - { - url: /\/app-center\/api\/pageHistory\/delete/, - response: async () => { - return new Promise((resolve) => { - setTimeout(() => { - resolve([200]) - }, 1000) - }) - } - }, - // 根据页面备份记录还原页面信息 - { - url: /\/app-center\/api\/pageHistory\/restore/, - response: async () => { - return new Promise((resolve) => { - setTimeout(() => { - resolve([200]) - }, 1000) - }) - } - }, - // 创建区块分组信息 - { - url: /\/material-center\/api\/block-groups\/create/, - response: (config) => { - const data = JSON.parse(config.data) - const name = data.name - - const id = blockList.length + 1 - const group = { - id, - name, - blocks: [] - } - - blockList.push(group) - - return new Promise((resolve) => { - setTimeout(() => { - resolve([200, { data: group }]) - }, 500) - }) - } - }, - // 更新分组:修改分组名字/向分组里添加、删除区块 - { - url: /\/material-center\/api\/block-groups\/update/, - response: async (config) => { - const url = config.url - const groupId = url.substr(url.lastIndexOf('/') + 1) - const { name, blocks } = JSON.parse(config.data) - const getAvailable = async (groupId) => { - const response = await fetch(`/mock/block/available/${(groupId % 2) + 1}.json`) - return response.json() - } - - const avaliableBlocks = await getAvailable(groupId) - let result = [] - - for (let i = 0; i < blockList.length; i++) { - if (String(blockList[i].id) === groupId) { - if (name) blockList[i].name = name - if (blocks) { - blockList[i].blocks = [] - avaliableBlocks.forEach((item) => { - if (blocks.indexOf(item.id) > -1) { - blockList[i].blocks.push(item) - } - }) - } - result = blockList[i] - - break - } - } - - return new Promise((resolve) => { - setTimeout(() => { - resolve([200, { data: result }]) - }, 500) - }) - } - }, - // 根据区块分组ID删除区块分组信息 - { - url: /\/material-center\/api\/block-groups\/delete/, - response: async (config) => { - const url = config.url - const groupId = url.substr(url.lastIndexOf('/') + 1) - - const group = blockList.splice( - blockList.findIndex((item) => item.id === groupId), - 1 - ) - - return new Promise((resolve) => { - setTimeout(() => { - resolve([200, { data: group }]) - }, 500) - }) - } - }, - // 获取区块分组列表 - { - url: /\/material-center\/api\/block-groups/, - response() { - return new Promise((resolve) => { - setTimeout(() => { - resolve([200, { data: blockList }]) - }, 500) - }) - } - }, - // 创建区块 - { - url: /\/material-center\/api\/block\/create/, - response: async (config) => { - const data = JSON.parse(config.data) - - // 创建需往数据库里插入信息 - data.id = String(++blockCount) - arrData.push(data) - - const blockId = data.id - if (blockId % 2) { - return new Promise((resolve) => { - setTimeout(() => { - resolve([200, { data }]) - }, 2000) // 耗时较长 - }) - } - - return new Promise((resolve) => { - setTimeout(() => { - resolve([200, { error: { message: '新建区块失败' } }]) - }, 500) - }) - } - }, - // 发布区块 - { - url: /\/material-center\/api\/block\/deploy/, - /* - 请求参数: - { - block, - deploy_info: "修改button信息" - } - */ - response: async (config) => { - const data = JSON.parse(config.data) - const blockId = data.block?.id - if (blockId % 2) { - const deploy = async () => { - const response = await fetch(`/mock/block/deploy.json`) - return response.json() - } - const deployData = await deploy() - - return new Promise((resolve) => { - setTimeout(() => { - resolve([200, { data: deployData.data }]) - }, 500) - }) - } - - return new Promise((resolve) => { - setTimeout(() => { - resolve([200, { error: { message: '发布区块失败' } }]) - }, 500) - }) - } - }, - // 获取发布区块的进度信息 - { - url: /\/material-center\/api\/tasks/, - response: async (config) => { - const url = config.url - const taskId = url.substr(url.lastIndexOf('/') + 1) - const deployProgress = async () => { - const response = await fetch(`/mock/block/deployProgress.json`) - return response.json() - } - const deployProgressRes = await deployProgress() - - // 区块Id不相等直接返回 - if (Number(taskId) !== deployProgressRes.data.id) { - return new Promise((resolve) => { - setTimeout(() => { - resolve([200, { error: { message: '查询区块进度失败' } }]) - }, 500) - }) - } - - const FINISHED_PROGRESS = 100 - const INTERVAL_PROGRESS = 20 - - // 判断发布状态 - const deployStatus = deployProgressRes.data.taskStatus - - // 如果构建状态为运行中:1, 返回构建进度条 - if (deployStatus === 1) { - // 模拟后台进度更新, 每次查询进度更新增加20% - deployProgressRes.data.progress_percent = blockProgress - blockProgress += INTERVAL_PROGRESS - - if (blockProgress >= FINISHED_PROGRESS) { - deployProgressRes.data.progress_percent = FINISHED_PROGRESS - blockProgress = 0 - } - } - - // 其它状态直接返回结果 - return new Promise((resolve) => { - setTimeout(() => { - resolve([200, deployProgressRes]) - }, 1000) - }) - } - }, - // 修改区块,同时创建区块备份记录/还原到某一历史备份 - { - url: /\/material-center\/api\/block\/update/, - response: async (config) => { - const url = config.url - const blockId = url.substr(url.lastIndexOf('/') + 1) - const { current_history } = JSON.parse(config.data) - - // 消费侧-还原到某一历史备份 - if (current_history) { - let block = null - - for (let i = 0; i < blockList.length; i++) { - const blocks = blockList[i].blocks - - for (let i = 0; i < blocks.length; i++) { - block = blocks[i] - - if (String(block.id) === blockId && block.current_history) { - block.current_history.id = current_history - - break - } - } - } - - return new Promise((resolve) => { - setTimeout(() => { - resolve([200, { data: block }]) - }, 500) - }) - } - - // 只有奇数区块可以保存成功 - if (blockId % 2) { - const block = JSON.parse(config.data) - const blockData = arrData.find((item) => Number(item.id) === Number(blockId)) - - if (blockData) { - Object.assign(blockData, block) - } - - return new Promise((resolve) => { - setTimeout(() => { - resolve([200, { data: blockData }]) - }, 1000) - }) - } - - return new Promise((resolve) => { - setTimeout(() => { - resolve([200, { error: { message: '保存区块失败' } }]) - }, 500) - }) - } - }, - // 区块管理 -- 获取区块列表 - { - url: /\/material-center\/api\/block\/list/, - proxy: '/mock/block/blockList.json', - handleData({ data }) { - if (arrData.length === 0) { - arrData.push(...data) - blockCount = arrData.length - } - - return { data: arrData } - } - }, - // 区块管理 -- 删除区块 - { - url: /\/material-center\/api\/block\/delete/, - response(config) { - const url = config.url - const blockId = url.substr(url.lastIndexOf('/') + 1) - - // 只有 ID 为奇数的区块才能删除,否则抛出错误信息 - if (blockId % 2) { - const index = arrData.findIndex((item) => String(item.id) === blockId) - let data = [] - - if (index > -1) { - data = arrData.splice(index, 1)[0] - } - - return new Promise((resolve) => { - setTimeout(() => { - resolve([200, { data }]) - }, 500) // 耗时较短 - }) - } - - return new Promise((resolve) => { - setTimeout(() => { - resolve([200, { error: { message: '删除区块失败' } }]) - }, 500) // 耗时较短 - }) - } - }, - // 根据区块ID获取区块历史备份列表 - { - url: /\/material-center\/api\/block-history/, - response: async (config) => { - const url = config.url - const query = url.substr(url.indexOf('?')) - const params = new URLSearchParams(query) - const block = params.get('block') - - if (!block) { - return new Promise((resolve) => { - setTimeout(() => { - resolve([200, { data: [] }]) - }, 1000) - }) - } - - const historyList = async () => { - const response = await fetch(`/mock/block/history.json`) - return response.json() - } - - const blockInfo = await historyList(block) - - return new Promise((resolve) => { - setTimeout(() => { - resolve([200, { data: blockInfo }]) - }, 1000) - }) - } - }, - // 删除区块备份记录 - { - url: /\/app-center\/api\/blockHistory\/delete/, - response: async () => { - return new Promise((resolve) => { - setTimeout(() => { - resolve([200]) - }, 1000) - }) - } - }, - // 根据区块备份记录还原区块信息 - { - url: /\/app-center\/api\/blockHistory\/restore/, - response: async () => { - return new Promise((resolve) => { - setTimeout(() => { - resolve([200]) - }, 1000) - }) - } - }, - // 根据分组ID获取当前分组可以添加的区块 - { - url: /\/material-center\/api\/block\/notgroup/, - response: async (config) => { - const url = config.url - const groupId = - url.indexOf('?') > -1 - ? url.substring(url.lastIndexOf('/') + 1, url.indexOf('?')) - : url.substr(url.lastIndexOf('/') + 1) - const query = url.substr(url.indexOf('?')) - const params = new URLSearchParams(query) - const value = params.get('label_contains') - const author = params.getAll('author') - const tenant = params.getAll('tenant') - const tag = params.getAll('tag') - - if (!groupId) { - return new Promise((resolve) => { - setTimeout(() => { - resolve([200, { data: [] }]) - }, 500) - }) - } - - const getAvailable = async (groupId) => { - const response = await fetch(`/mock/block/available/${(groupId % 2) + 1}.json`) - return response.json() - } - - const blocks = await getAvailable(groupId) - - // 搜索结果 - const searchResult = value ? blocks.filter((item) => item.label.indexOf(value) > -1) : blocks - // 标签过滤结果 - const tagResult = - tag && tag.length ? searchResult.filter((item) => item.tags?.some((i) => tag.includes(i))) : searchResult - // 组织过滤结果 - const tenantResult = - tenant && tenant.length ? tagResult.filter((item) => tenant.includes(String(item.tenant?.id))) : tagResult - // 作者过滤结果 - const authorResult = - author && author.length ? tenantResult.filter((item) => author.includes(String(item.author?.id))) : tenantResult - - return new Promise((resolve) => { - setTimeout(() => { - resolve([200, { data: authorResult }]) - }, 500) - }) - } - }, - // 获取区块所有标签 - { - url: /\/material-center\/api\/block\/tags/, - response: async () => { - const getAvailable = async () => { - const response = await fetch(`/mock/block/available/1.json`) - return response.json() - } - - const blocks = await getAvailable() - const tags = [] - - blocks?.forEach((block) => { - if (block.tags?.length) { - tags.push(...block.tags) - } - }) - - return new Promise((resolve) => { - setTimeout(() => { - resolve([200, { data: Array.from(new Set(tags)) }]) - }, 500) - }) - } - }, - // 获取区块所有作者 - { - url: /\/material-center\/api\/block\/users/, - response: async () => { - const getAvailable = async () => { - const response = await fetch(`/mock/block/available/1.json`) - return response.json() - } - - const blocks = await getAvailable() - const users = [] - - blocks && - blocks.forEach((block) => { - users.push(block.author) - }) - - return new Promise((resolve) => { - setTimeout(() => { - resolve([200, { data: users }]) - }, 500) - }) - } - }, - // 获取区块所有组织 - { - url: /\/material-center\/api\/block\/tenants/, - response: async () => { - const getAvailable = async () => { - const response = await fetch(`/mock/block/available/1.json`) - return response.json() - } - - const blocks = await getAvailable() - const tenants = [] - - blocks?.forEach((block) => { - block.tenant && tenants.push(block.tenant) - }) - - return new Promise((resolve) => { - setTimeout(() => { - resolve([200, { data: tenants }]) - }, 500) - }) - } - }, - // 根据区块分组ID获取该分组下的区块列表 - { - url: /\/material-center\/api\/block/, - response(config) { - const url = config.url - const query = url.substr(url.indexOf('?')) - const params = new URLSearchParams(query) - const groupId = params.get('groups') - const value = params.get('label_contains') - const group = blockList.find((item) => String(item.id) === groupId) - let groupData = group ? group.blocks : [] - - groupData = value ? groupData.filter((item) => item.label.indexOf(value) > -1) : groupData - - return new Promise((resolve) => { - setTimeout(() => { - resolve([200, { data: groupData }]) - }, 500) - }) - } - }, - // 数据源管理 -- 获取数据源列表 - { - url: /api\/sources\/list/, - response: async () => { - const getDatasourceList = async () => { - const response = await fetch('/mock/datasource.json') - return response.json() - } - - let { data } = await getDatasourceList() - const index = data.findIndex((data) => data.id === tempObj?.id) - - if (index > -1) { - data[index] = tempObj - - if (tempObj.status === 'delete') { - data.splice(index, 1) - } - } else { - if (tempObj) { - tempObj.id = data.length + 1 - data = [...data, tempObj] - } - } - - return new Promise((resolve) => { - setTimeout(() => { - resolve([200, { data: data }]) - }, 1000) - }) - } - }, - // 数据源管理 -- 新增数据源 - { - url: /\/app-center\/api\/sources\/create/, - response: async (config) => { - tempObj = JSON.parse(config.data) - - return new Promise((resolve) => { - setTimeout(() => { - resolve([200, { data: tempObj }]) - }, 1000) - }) - } - }, - // 数据源管理 -- 删除数据源 - { - url: /\/app-center\/api\/sources\/delete/, - response: async (config) => { - const url = config.url - const dataSourceId = url.substr(url.lastIndexOf('/') + 1) - tempObj = { id: dataSourceId, status: 'delete' } - - return new Promise((resolve) => { - setTimeout(() => { - resolve([200, { data: tempObj }]) - }, 500) - }) - } - }, - // 数据源管理 -- 更新数据源 - { - url: /\/app-center\/api\/sources\/update/, - response: async (config) => { - const addres = config.url.split('/') - const id = Number(addres[addres.length - 1]) - - // 提交需要更新的内容 - tempObj = JSON.parse(config.data) - tempObj.id = id - - return new Promise((resolve) => { - setTimeout(() => { - resolve([200, { data: tempObj }]) - }, 500) - }) - } - }, - // 数据源管理 -- 查询数据源详情 - { - url: /api\/sources\/detail/, - response: async (config) => { - const addres = config.url.split('/') - const id = addres[addres.length - 1] - - const getDataSourceDetail = async () => { - const response = await fetch('/mock/datasource.json') - return response.json() - } - - const { data } = await getDataSourceDetail() - let result = data.filter((item) => item.id === id)[0] - - if (tempObj && tempObj.id === id) { - result = tempObj - } - - return new Promise((resolve) => { - setTimeout(() => { - resolve([200, { data: result }]) - }, 500) - }) - } - }, - // 数据源管理 -- 获取数据源模板列表 - { - url: /\/app-center\/api\/source_tpl/, - response: async () => { - const getDataSourceTemplate = async () => { - const response = await fetch('/mock/dataSourceTemplate.json') - return response.json() - } - const templateData = await getDataSourceTemplate() - - return new Promise((resolve) => { - setTimeout(() => { - resolve([200, templateData]) - }, 500) - }) - } - }, - // 数据源管理 -- mock 用户输入的远程服务 - { - url: /\.*api.*\/mock/, - response: async () => { - const getDataSourceTemplate = async () => { - const response = await fetch('/mock/userService.json') - return response.json() - } - const templateData = await getDataSourceTemplate() - - return new Promise((resolve) => { - setTimeout(() => { - resolve([200, templateData]) - }, 500) - }) - } - }, - { - url: /ng-bundle\.json$/, - proxy: 'mock/ng-bundle.json' - }, - { - url: '*', - proxy: '*' - } -] From 227da3045af7a7bee73afccdddbfda2ba7c5e224 Mon Sep 17 00:00:00 2001 From: yy-wow Date: Wed, 6 Nov 2024 16:35:57 -0800 Subject: [PATCH 18/19] fix: remove unused dependency --- packages/common/package.json | 1 - 1 file changed, 1 deletion(-) diff --git a/packages/common/package.json b/packages/common/package.json index b611c243e2..37d3215684 100644 --- a/packages/common/package.json +++ b/packages/common/package.json @@ -49,7 +49,6 @@ "@opentiny/tiny-engine-vite-plugin-meta-comments": "workspace:*", "@vitejs/plugin-vue": "^5.1.2", "@vitejs/plugin-vue-jsx": "^4.0.1", - "axios-mock-adapter": "^1.21.5", "glob": "^10.3.4", "vite": "^5.4.2" }, From 2b16423472524834ad52087ec35cba33e89540f4 Mon Sep 17 00:00:00 2001 From: yy-wow Date: Wed, 6 Nov 2024 17:04:43 -0800 Subject: [PATCH 19/19] fix: preview add httpService --- designer-demo/src/preview.js | 3 ++- packages/design-core/src/preview/src/main.js | 4 +++- packages/design-core/src/preview/src/preview/importMap.json | 1 - 3 files changed, 5 insertions(+), 3 deletions(-) diff --git a/designer-demo/src/preview.js b/designer-demo/src/preview.js index 4e120d4c6c..eb7717c66a 100644 --- a/designer-demo/src/preview.js +++ b/designer-demo/src/preview.js @@ -14,6 +14,7 @@ import { initHook, HOOK_NAME, GenerateCodeService, Breadcrumb, Media, Lang } fro import { initPreview } from '@opentiny/tiny-engine' import 'virtual:svg-icons-register' import '@opentiny/tiny-engine-theme' +import { HttpService } from './composable' const beforeAppCreate = () => { initHook(HOOK_NAME.useEnv, import.meta.env) @@ -23,7 +24,7 @@ initPreview({ registry: { root: { id: 'engine.root', - metas: [GenerateCodeService] + metas: [HttpService, GenerateCodeService] }, config: { id: 'engine.config', theme: 'light' }, toolbars: [Breadcrumb, Media, Lang] diff --git a/packages/design-core/src/preview/src/main.js b/packages/design-core/src/preview/src/main.js index 6f706b3b07..da28cc9b44 100644 --- a/packages/design-core/src/preview/src/main.js +++ b/packages/design-core/src/preview/src/main.js @@ -12,7 +12,7 @@ import { createApp } from 'vue' import initSvgs from '@opentiny/tiny-engine-svgs' -import { defineEntry, mergeRegistry } from '@opentiny/tiny-engine-meta-register' +import { defineEntry, mergeRegistry, initServices } from '@opentiny/tiny-engine-meta-register' import defaultRegistry from '../../../registry.js' import App from './App.vue' @@ -23,6 +23,8 @@ export const initPreview = ({ registry, lifeCycles = {} }) => { beforeAppCreate?.() defineEntry(mergedRegistry) + initServices() + // TODO: 后续需要方案 // import(`../../theme/${mergedRegistry.config.theme || 'light'}.js`) diff --git a/packages/design-core/src/preview/src/preview/importMap.json b/packages/design-core/src/preview/src/preview/importMap.json index 424f6fa4de..8b134ce517 100644 --- a/packages/design-core/src/preview/src/preview/importMap.json +++ b/packages/design-core/src/preview/src/preview/importMap.json @@ -8,7 +8,6 @@ "@vueuse/core": "${VITE_CDN_DOMAIN}/@vueuse/core@9.6.0/index.mjs", "@vueuse/shared": "${VITE_CDN_DOMAIN}/@vueuse/shared@9.6.0/index.mjs", "axios": "${VITE_CDN_DOMAIN}/axios@1.0.0/dist/esm/axios.js", - "axios-mock-adapter": "${VITE_CDN_DOMAIN}/axios-mock-adapter@1.21.1/dist/axios-mock-adapter.js", "@opentiny/tiny-engine-webcomponent-core": "${VITE_CDN_DOMAIN}/@opentiny/tiny-engine-webcomponent-core@1/dist/tiny-engine-webcomponent-core.es.js", "@opentiny/tiny-engine-i18n-host": "${VITE_CDN_DOMAIN}/@opentiny/tiny-engine-i18n-host@1/dist/lowcode-design-i18n-host.es.js", "@opentiny/tiny-engine-builtin-component": "${VITE_CDN_DOMAIN}/@opentiny/tiny-engine-builtin-component@1/dist/index.js",