From cc3547d30cecdacf43432297c8dc64131c47129b Mon Sep 17 00:00:00 2001 From: yaoyun8 Date: Mon, 22 Jan 2024 01:29:55 -0800 Subject: [PATCH 1/4] =?UTF-8?q?fix=EF=BC=9A=E4=BF=AE=E5=A4=8D=E6=96=B0?= =?UTF-8?q?=E5=A2=9E=E7=BB=84=E4=BB=B6sql=E8=AF=AD=E5=8F=A5=E5=AD=97?= =?UTF-8?q?=E6=AE=B5=E6=A0=A1=E9=AA=8C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- scripts/connection.mjs | 36 +++++++++++++++++++++++++++++++++++- 1 file changed, 35 insertions(+), 1 deletion(-) diff --git a/scripts/connection.mjs b/scripts/connection.mjs index 08b1a44fe5..24d4d3296c 100644 --- a/scripts/connection.mjs +++ b/scripts/connection.mjs @@ -94,12 +94,37 @@ class MysqlConnection { return str.replace(/'/g, "\\'") } + /** + * 校验组件字段数据 + * @param {object} component 组件数据 + * @returns boolean 校验组件字段是否失败,true-有字段出错 + */ + validateFields(component) { + const longtextFields = ['name', 'npm', 'snippets', 'schema_fragment', 'configure', 'component_metadata'] + + return Object.entries(component).some(([key, value]) => { + if (longtextFields.includes(key) && value !== null && typeof value !== 'object') { + logger.error(`组件 ${component.component} 的字段 ${key} 值类型有误`) + + return true + } + + return false + }) + } + /** * 生成更新组件的sql语句 * @param {object} component 组件数据 * @returns 更新组件的sql语句 */ updateComponent(component) { + const valid = this.validateFields(component) + + if (valid) { + return + } + const values = [] let sqlContent = `update ${componentsTableName} set ` @@ -164,6 +189,15 @@ class MysqlConnection { * @returns 新增组件的sql语句 */ insertComponent(component) { + const valid = this.validateFields(component) + + if (valid) { + return + } + + const defaultName = { + zh_CN: component.component + } const defaultNpm = { package: '', exportName: '', @@ -195,7 +229,7 @@ class MysqlConnection { } const { version = '1.0.0', - name, + name = defaultName, component: componentName, icon, description, From ad0f8ff5b0a731459dedb507342e7125c2ee5a9a Mon Sep 17 00:00:00 2001 From: yaoyun8 Date: Mon, 22 Jan 2024 23:50:13 -0800 Subject: [PATCH 2/4] =?UTF-8?q?fix=EF=BC=9A=E4=BC=98=E5=8C=96=E8=84=9A?= =?UTF-8?q?=E6=9C=AC=E6=8F=90=E7=A4=BA?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- scripts/buildMaterials.mjs | 29 ++++++++++++++++------------- scripts/connection.mjs | 36 ++++++++++++++++++------------------ scripts/logger.mjs | 4 ++-- 3 files changed, 36 insertions(+), 33 deletions(-) diff --git a/scripts/buildMaterials.mjs b/scripts/buildMaterials.mjs index 63f861945c..01e768b195 100644 --- a/scripts/buildMaterials.mjs +++ b/scripts/buildMaterials.mjs @@ -28,7 +28,7 @@ const write = (bundle) => { * 校验组件文件数据 * @param {string} file 组件文件路径 * @param {object} component 组件数据 - * @returns + * @returns */ const validateComponent = (file, component) => { const requiredFields = ['component'] @@ -54,7 +54,7 @@ const validateComponent = (file, component) => { * 校验区块文件数据 * @param {string} file 区块文件路径 * @param {object} block 区块数据 - * @returns + * @returns */ const validateBlock = (file, block) => { const requiredFields = ['label', 'assets'] @@ -79,7 +79,7 @@ const validateBlock = (file, block) => { const generateComponents = () => { try { fg([`${materialsDir}/**/*.json`]).then((files) => { - if(!files.length) { + if (!files.length) { logger.warn('物料文件夹为空,请先执行`pnpm splitMaterials`命令拆分物料资产包') } @@ -101,7 +101,9 @@ const generateComponents = () => { const material = fsExtra.readJsonSync(file, { throws: false }) if (!material) { - logger.error(`读取物料文件 ${file} 失败`) + const fileFullPath = path.join(process.cwd(), file) + + logger.error(`文件格式有误 (${fileFullPath})`) return } @@ -146,16 +148,16 @@ const generateComponents = () => { if (connection.connected) { connection.initDB(material) } - }) - appInfo.materialHistory.components = componentsMap + appInfo.materialHistory.components = componentsMap - write(bundle) + write(bundle) + }) }) - logger.success('构建物料资产包成功') + logger.success('物料资产包构建成功') } catch (error) { - logger.error(`构建物料资产包失败:${error}`) + logger.error(`物料资产包构建失败:${error}`) } } @@ -168,20 +170,21 @@ watcher.on('all', (event, file) => { change: '更新', unlink: '删除' } + const fileFullPath = path.join(process.cwd(), file) - logger.info(`${eventMap[event]}组件文件 ${file}`) + logger.info(`${eventMap[event]}组件文件 (${fileFullPath})`) // 监听物料文件变化,更新物料资产包 generateComponents() if (!connection.connected || event === 'unlink') return - const component = fsExtra.readJsonSync(path.join(process.cwd(), file)) + const component = fsExtra.readJsonSync(fileFullPath) if (event === 'change') { - connection.updateComponent(component) + connection.updateComponent(component, fileFullPath) } else if (event === 'add') { - connection.insertComponent(component) + connection.insertComponent(component, fileFullPath) } }) diff --git a/scripts/connection.mjs b/scripts/connection.mjs index 24d4d3296c..22f3b348d0 100644 --- a/scripts/connection.mjs +++ b/scripts/connection.mjs @@ -41,7 +41,7 @@ class MysqlConnection { logger.warn('未能连接到数据库,请查看数据库配置是否正确') reject() } else { - logger.success('连接数据库成功') + logger.success('数据库连接成功') this.connected = true resolve() } @@ -99,17 +99,17 @@ class MysqlConnection { * @param {object} component 组件数据 * @returns boolean 校验组件字段是否失败,true-有字段出错 */ - validateFields(component) { + validateFields(component, file) { const longtextFields = ['name', 'npm', 'snippets', 'schema_fragment', 'configure', 'component_metadata'] - return Object.entries(component).some(([key, value]) => { + return Object.entries(component).every(([key, value]) => { if (longtextFields.includes(key) && value !== null && typeof value !== 'object') { - logger.error(`组件 ${component.component} 的字段 ${key} 值类型有误`) + logger.error(`"${key}" 的值不是有效的JSON (${file})`) - return true + return false } - return false + return true }) } @@ -118,10 +118,10 @@ class MysqlConnection { * @param {object} component 组件数据 * @returns 更新组件的sql语句 */ - updateComponent(component) { - const valid = this.validateFields(component) + updateComponent(component, file) { + const valid = this.validateFields(component, file) - if (valid) { + if (!valid) { return } @@ -161,10 +161,10 @@ class MysqlConnection { this.query(sqlContent, component.component) .then(() => { - logger.success(`更新组件 ${component.component} 成功`) + logger.success(`组件 ${component.component} 更新成功`) }) .catch((error) => { - logger.success(`更新组件 ${component.component} 失败:${error}`) + logger.error(`组件 ${component.component} 更新失败:${error}`) }) } @@ -188,10 +188,10 @@ class MysqlConnection { * @param {object} component 组件数据 * @returns 新增组件的sql语句 */ - insertComponent(component) { - const valid = this.validateFields(component) + insertComponent(component, file) { + const valid = this.validateFields(component, file) - if (valid) { + if (!valid) { return } @@ -290,11 +290,11 @@ class MysqlConnection { .then((result) => { const id = result.insertId - logger.success(`新增组件 ${component.component} 成功`) + logger.success(`组件 ${component.component} 新增成功`) this.relationMaterialHistory(id) }) .catch((error) => { - logger.success(`新增组件 ${component.component} 失败:${error}`) + logger.success(`组件 ${component.component} 新增失败:${error}`) }) } @@ -363,11 +363,11 @@ class MysqlConnection { return new Promise((resolve, reject) => { this.query(sqlContent) .then((result) => { - logger.success(`创建表 ${componentsTableName} 成功`) + logger.success(`表 ${componentsTableName} 创建成功`) resolve(result) }) .catch((error) => { - logger.success(`创建表 ${componentsTableName} 失败:${error}`) + logger.success(`表 ${componentsTableName} 创建失败:${error}`) reject(error) }) }) diff --git a/scripts/logger.mjs b/scripts/logger.mjs index e7e8657565..7d7e3a276d 100644 --- a/scripts/logger.mjs +++ b/scripts/logger.mjs @@ -14,9 +14,9 @@ class Logger { success: 'green' } const time = new Date().toLocaleTimeString() - const colorMsg = colors[colorMap[type]](msg) + const colorMsg = colors[colorMap[type]](type) - return `[${this.command}] [${colors.dim(time)}] ${colorMsg}` + return `[${this.command}] [${colors.dim(time)}] ${colorMsg} ${msg}` } // eslint-disable-next-line no-console From 7d16e42ba0c75fce925a3bc7e674ef4442b80e2e Mon Sep 17 00:00:00 2001 From: yaoyun8 Date: Tue, 23 Jan 2024 00:19:48 -0800 Subject: [PATCH 3/4] =?UTF-8?q?fix=EF=BC=9A=E5=87=BD=E6=95=B0=E5=90=8D?= =?UTF-8?q?=E4=BC=98=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- scripts/connection.mjs | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/scripts/connection.mjs b/scripts/connection.mjs index 22f3b348d0..2b21e243ba 100644 --- a/scripts/connection.mjs +++ b/scripts/connection.mjs @@ -97,9 +97,9 @@ class MysqlConnection { /** * 校验组件字段数据 * @param {object} component 组件数据 - * @returns boolean 校验组件字段是否失败,true-有字段出错 + * @returns boolean 校验组件字段是否失败,false-有字段出错 */ - validateFields(component, file) { + validate(component, file) { const longtextFields = ['name', 'npm', 'snippets', 'schema_fragment', 'configure', 'component_metadata'] return Object.entries(component).every(([key, value]) => { @@ -119,7 +119,7 @@ class MysqlConnection { * @returns 更新组件的sql语句 */ updateComponent(component, file) { - const valid = this.validateFields(component, file) + const valid = this.validate(component, file) if (!valid) { return @@ -189,7 +189,7 @@ class MysqlConnection { * @returns 新增组件的sql语句 */ insertComponent(component, file) { - const valid = this.validateFields(component, file) + const valid = this.validate(component, file) if (!valid) { return From b34a9f10bad5dd692f55809d4da78dbb70dd067b Mon Sep 17 00:00:00 2001 From: yaoyun8 Date: Tue, 23 Jan 2024 01:06:57 -0800 Subject: [PATCH 4/4] =?UTF-8?q?fix=EF=BC=9A=E4=BF=AE=E5=A4=8D=E6=9B=B4?= =?UTF-8?q?=E6=96=B0=E7=9A=84sql=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- scripts/connection.mjs | 48 +++++++++++++++++++++++++++++++++++------- 1 file changed, 40 insertions(+), 8 deletions(-) diff --git a/scripts/connection.mjs b/scripts/connection.mjs index 2b21e243ba..016f856895 100644 --- a/scripts/connection.mjs +++ b/scripts/connection.mjs @@ -95,11 +95,11 @@ class MysqlConnection { } /** - * 校验组件字段数据 + * 校验组件数据是否有效 * @param {object} component 组件数据 * @returns boolean 校验组件字段是否失败,false-有字段出错 */ - validate(component, file) { + isValid(component, file) { const longtextFields = ['name', 'npm', 'snippets', 'schema_fragment', 'configure', 'component_metadata'] return Object.entries(component).every(([key, value]) => { @@ -119,7 +119,7 @@ class MysqlConnection { * @returns 更新组件的sql语句 */ updateComponent(component, file) { - const valid = this.validate(component, file) + const valid = this.isValid(component, file) if (!valid) { return @@ -130,6 +130,38 @@ class MysqlConnection { Object.keys(component).forEach((key) => { const { [key]: value } = component + const fields = [ + 'version', + 'name', + 'component', + 'icon', + 'description', + 'docUrl', + 'screenshot', + 'tags', + 'keywords', + 'devMode', + 'npm', + 'group', + 'category', + 'priority', + 'snippets', + 'schema', + 'configure', + 'public', + 'framework', + 'isOfficial', + 'isDefault', + 'tiny_reserved', + 'tenant', + 'createBy', + 'updatedBy' + ] + + if (!fields.includes(key)) { + return + } + const field = this.fieldTransform(key) let updateContent = '' @@ -161,10 +193,10 @@ class MysqlConnection { this.query(sqlContent, component.component) .then(() => { - logger.success(`组件 ${component.component} 更新成功`) + logger.success(`组件 ${component.component} 数据更新成功`) }) .catch((error) => { - logger.error(`组件 ${component.component} 更新失败:${error}`) + logger.error(`组件 ${component.component} 数据更新失败 ${error}`) }) } @@ -189,7 +221,7 @@ class MysqlConnection { * @returns 新增组件的sql语句 */ insertComponent(component, file) { - const valid = this.validate(component, file) + const valid = this.isValid(component, file) if (!valid) { return @@ -290,11 +322,11 @@ class MysqlConnection { .then((result) => { const id = result.insertId - logger.success(`组件 ${component.component} 新增成功`) + logger.success(`组件 ${component.component} 数据新增成功`) this.relationMaterialHistory(id) }) .catch((error) => { - logger.success(`组件 ${component.component} 新增失败:${error}`) + logger.success(`组件 ${component.component} 数据新增失败:${error}`) }) }