diff --git a/packages/canvas/render/src/application-function/global-state.ts b/packages/canvas/render/src/application-function/global-state.ts index 9e8f84ae82..3e1623967b 100644 --- a/packages/canvas/render/src/application-function/global-state.ts +++ b/packages/canvas/render/src/application-function/global-state.ts @@ -13,14 +13,43 @@ export function useGlobalState() { watchEffect(() => { reset(stores) globalState.value.forEach(({ id, state = {}, getters = {} }) => { - const computedGetters = Object.keys(getters).reduce( - (acc, key) => ({ - ...acc, - [key]: new Func('return ' + getters[key])().call(acc, state) // parseData(getters[key], null, acc)?.call?.(acc, state) //理论上不应该走parseData, unibuy代码遗留 - }), - {} - ) - stores[id] = { ...state, ...computedGetters } + const hasGetters = Object.keys(getters).length > 0 + + if (Array.isArray(state)) { + if (!hasGetters) { + stores[id] = [...state] + } else { + const computedGetters = {} + Object.keys(getters).forEach((key) => { + try { + computedGetters[key] = new Func('return ' + getters[key])().call(computedGetters, state) + } catch (error) { + computedGetters[key] = undefined + } + }) + + const arrayWithGetters = [...state] + Object.assign(arrayWithGetters, computedGetters) + stores[id] = arrayWithGetters + } + } else if (typeof state !== 'object' || state === null) { + stores[id] = state + } else { + if (!hasGetters) { + stores[id] = { ...state } + } else { + const computedGetters = {} + Object.keys(getters).forEach((key) => { + try { + computedGetters[key] = new Func('return ' + getters[key])().call(computedGetters, state) + } catch (error) { + computedGetters[key] = undefined + } + }) + + stores[id] = Object.assign({}, state, computedGetters) + } + } }) }) return { diff --git a/packages/configurator/src/variable-configurator/VariableConfigurator.vue b/packages/configurator/src/variable-configurator/VariableConfigurator.vue index 43860532d5..6246572531 100644 --- a/packages/configurator/src/variable-configurator/VariableConfigurator.vue +++ b/packages/configurator/src/variable-configurator/VariableConfigurator.vue @@ -505,14 +505,17 @@ export default { state.variables = {} const stores = useResource().appSchemaState.globalState - stores.forEach(({ id, state: storeState = {}, getters = {} }) => { - const loadProp = (prop) => { - const propBinding = `${id}.${prop}` - state.variables[propBinding] = propBinding - } - - Object.keys(storeState).forEach(loadProp) - Object.keys(getters).forEach(loadProp) + stores.forEach(({ id, state: _storeState = {}, _getters = {} }) => { + state.variables[id] = id + // fix: store 列表错误渲染成子属性列表 + // store 值处理迁移到 global-state.ts 进行处理 + // const loadProp = (prop) => { + // const propBinding = `${id}.${prop}` + // state.variables[propBinding] = propBinding + // } + + // Object.keys(storeState).forEach(loadProp) + // Object.keys(getters).forEach(loadProp) }) } else if (item.id === 'loop') { state.bindPrefix = '' diff --git a/packages/plugins/materials/src/composable/useResource.js b/packages/plugins/materials/src/composable/useResource.js index 10577ebd3f..9cfab9a4a4 100644 --- a/packages/plugins/materials/src/composable/useResource.js +++ b/packages/plugins/materials/src/composable/useResource.js @@ -143,8 +143,8 @@ const fetchAppState = async () => { appSchemaState.bridge = appData.bridge appSchemaState.utils = appData.utils - appSchemaState.isDemo = appData.meta?.is_demo - appSchemaState.globalState = appData?.meta.global_state + appSchemaState.isDemo = appData.meta?.isDemo || appData.meta?.is_demo + appSchemaState.globalState = appData?.meta.globalState || appData?.meta.global_state // 词条语言为空时使用默认的语言 const defaultLocales = [ diff --git a/packages/toolbars/generate-code/src/Main.vue b/packages/toolbars/generate-code/src/Main.vue index cb27a69556..9c91434b32 100644 --- a/packages/toolbars/generate-code/src/Main.vue +++ b/packages/toolbars/generate-code/src/Main.vue @@ -127,6 +127,15 @@ export default { } }) + // 处理 i18n 对象中可能为 null 的情况 + if (metaData.i18n) { + Object.keys(metaData.i18n).forEach((langKey) => { + metaData.i18n[langKey] = metaData.i18n[langKey] || {} + }) + } else { + metaData.i18n = {} + } + const appSchema = { // metaData 包含dataSource、utils、i18n、globalState ...metaData, diff --git a/scripts/buildMaterials.mjs b/scripts/buildMaterials.mjs index 4f8a05b73b..0cffaf3b9d 100644 --- a/scripts/buildMaterials.mjs +++ b/scripts/buildMaterials.mjs @@ -150,14 +150,14 @@ const generateComponents = () => { componentsMap.push({ component, npm }) + const { package: packageName = '', version = '', exportName = '' } = npm || {} + if (connection.connected) { connection.initDB(material) } appInfo.materialHistory.components = componentsMap - const { package: packageName = '', version = '', exportName = '' } = npm || {} - const mapItem = { componentName: component, package: packageName, diff --git a/scripts/connection.mjs b/scripts/connection.mjs index a06c5623ee..8ae5a68b1f 100644 --- a/scripts/connection.mjs +++ b/scripts/connection.mjs @@ -15,9 +15,9 @@ dotenv.config({ path: `${pathsDotenv}.local` }) const { SQL_HOST, SQL_PORT, SQL_USER, SQL_PASSWORD, SQL_DATABASE } = process.env // 组件表名称 -const componentsTableName = 'user_components' +const componentsTableName = 't_component' // 组件关联到物料资产包的id -const materialHistoryId = 639 +const materialHistoryId = 1 // 数据库配置 const mysqlConfig = { host: SQL_HOST, // 主机名(服务器地址) @@ -202,9 +202,10 @@ class MysqlConnection { /** * 新建的组件关联物料资产包 + * @deprecated 物料资产包已废弃,使用relationMaterialHistory替代 * @param {number} id 新建的组件id */ - relationMaterialHistory(id) { + relationMaterialBlockHistory(id) { const uniqSql = `SELECT * FROM \`material_histories_components__user_components_mhs\` WHERE \`material-history_id\`=${materialHistoryId} AND \`user-component_id\`=${id}` this.query(uniqSql).then((result) => { if (!result.length) { @@ -215,6 +216,20 @@ class MysqlConnection { }) } + /** + * 新建的组件关联物料资产包 + * @param {number} id 新建的组件id + */ + relationMaterialHistory(id) { + const uniqSql = `SELECT * FROM \`r_material_history_component\` WHERE \`material_history_id\`=${materialHistoryId} AND \`component_id\`=${id}` + this.query(uniqSql).then((result) => { + if (!result.length) { + const sqlContent = `INSERT INTO \`r_material_history_component\` (\`material_history_id\`, \`component_id\`) VALUES (${materialHistoryId}, ${id})` + this.query(sqlContent) + } + }) + } + /** * 生成新增组件的sql语句 * @param {object} component 组件数据 @@ -282,10 +297,15 @@ class MysqlConnection { isOfficial = 0, isDefault = 0, tiny_reserved = 0, - tenant = 1, - createBy = 86, - updatedBy = 86 + component_metadata = null, + library_id = 1, + tenant_id = 1, + renter_id = 1, + site_id = 1, + created_by = 1, + last_updated_by = 1 } = component + const values = `('${version}', '${this.formatSingleQuoteValue(JSON.stringify(name))}', '${componentName}', @@ -308,15 +328,19 @@ class MysqlConnection { '${isOfficial}', '${isDefault}', '${tiny_reserved}', - '${tenant}', - '${createBy}', - '${updatedBy}' + '${component_metadata}', + '${library_id}', + '${tenant_id}', + '${renter_id}', + '${site_id}', + '${created_by}', + '${last_updated_by}' );` - const sqlContent = `INSERT INTO ${componentsTableName} (version, name, component, icon, description, doc_url, + const sqlContent = `INSERT INTO ${componentsTableName} (version, name, name_en, icon, description, doc_url, screenshot, tags, keywords, dev_mode, npm, \`group\`, \`category\`, priority, snippets, - schema_fragment, configure, \`public\`, framework, isOfficial, isDefault, tiny_reserved, - tenant, createdBy, updatedBy) VALUES ${values}`.replace(/\n/g, '') + schema_fragment, configure, \`public\`, framework, is_official, is_default, tiny_reserved,component_metadata, + library_id, tenant_id, renter_id, site_id, created_by, last_updated_by) VALUES ${values}`.replace(/\n/g, '') this.query(sqlContent, componentName) .then((result) => { @@ -335,7 +359,7 @@ class MysqlConnection { * @param {object} component 组件数据 */ initDB(component) { - const selectSqlContent = `SELECT * FROM ${this.config.database}.${componentsTableName} WHERE component = '${component.component}'` + const selectSqlContent = `SELECT * FROM ${this.config.database}.${componentsTableName} WHERE name_en = '${component.component}'` this.query(selectSqlContent) .then((result) => {