@dypnb/dev-tools 1.0.20 → 1.0.22
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1,2 @@
|
|
1
|
+
#! /usr/bin/env node
|
2
|
+
!function(e,n){"object"==typeof exports&&"undefined"!=typeof module?n(exports):"function"==typeof define&&define.amd?define(["exports"],n):n((e="undefined"!=typeof globalThis?globalThis:e||self).MyBundle={})}(this,(function(e){"use strict";e.javaToJsConverter=class{static convert(e){const n=this.extractClassName(e),t=this.parseFields(e);return console.log(`[JavaToJsConverter] 识别到 ${t.length} 个字段`),this.generateJsCode(t,n)}static generateJsCode(e,n){let t=`/**\n * 由Java类 ${n} 自动转换的字段定义\n */\n`;return t+="export const fields = {\n",e.forEach((e=>{t+=` ${e.fieldName}: {\n`,t+=` label: '${e.label}',\n`,t+=` prop: '${e.fieldName}'\n`,t+=" },\n"})),t+="};\n\n",t+=`/**\n * 使用示例:\n * \n * // 创建表单项\n * const formItem = {\n * label: fields.${e[0]?.fieldName||"fieldName"}.label,\n * prop: fields.${e[0]?.fieldName||"fieldName"}.prop,\n * type: 'Input'\n * };\n */`,t}static generateFormJson(e){const n=this.convert(e),t=this.extractClassName(e),l=this.parseFields(e);let i=n+"\n\n";return i+=`/**\n * 由Java类 ${t} 自动生成的表单配置\n */\n`,i+="export const FormJson = {\n",i+=" formOption: {\n",i+=" labelPosition: 'right',\n",i+=" labelWidth: '160px',\n",i+=" size: 'small',\n",i+=" formFlex: {\n",i+=" gutter: 20,\n",i+=" span: 8\n",i+=" }\n",i+=" },\n",i+=" formItemJson: [\n",i+=" {\n",i+=" label: '基本信息',\n",i+=" showTitle: true,\n",i+=" children: [\n",l.forEach(((e,n)=>{let t="Input";"Date"===e.type?t="DatePicker":"Boolean"===e.type?t="Switch":"Long"!==e.type&&"Integer"!==e.type&&"BigDecimal"!==e.type||(t="InputNumber"),i+=" {\n",i+=` label: fields.${e.fieldName}.label,\n`,i+=` prop: fields.${e.fieldName}.prop,\n`,i+=` type: '${t}',\n`,i+=" rules: [\n",i+=" {\n",i+=" required: true,\n",i+=` message: '请输入' + fields.${e.fieldName}.label,\n`,i+=` trigger: '${"DatePicker"===t?"change":"blur"}'\n`,i+=" }\n",i+=" ],\n",i+=" options: {\n","DatePicker"===t?(i+=" type: 'date',\n",i+=" valueFormat: 'yyyy-MM-dd',\n",i+=" format: 'yyyy-MM-dd'\n"):(i+=" clearable: true,\n",i+=` placeholder: '请输入' + fields.${e.fieldName}.label\n`),i+=" }\n",i+=` }${n<l.length-1?",":""}\n`})),i+=" ]\n",i+=" }\n",i+=" ]\n",i+="};\n",i}static generateQueryFormJson(e){const n=this.parseFields(e),t=this.extractClassName(e),l=n.slice(0,5);let i=`/**\n * 由Java类 ${t} 自动生成的查询表单配置\n */\n`;return i+="export const QueryFormJson = {\n",i+=" formOption: {\n",i+=" inline: true,\n",i+=" labelWidth: '120px',\n",i+=" labelPosition: 'right',\n",i+=" size: 'small',\n",i+=" formFlex: {\n",i+=" gutter: 20,\n",i+=" span: 8\n",i+=" }\n",i+=" },\n",i+=" formItemJson: [\n",i+=" {\n",i+=` label: '${t}信息',\n`,i+=" showTitle: false,\n",i+=" children: [\n",l.forEach(((e,n)=>{let t="Input";(e.fieldName.includes("Type")||e.fieldName.includes("Status")||e.fieldName.includes("Nature")||e.fieldName.includes("Mode"))&&(t="Select"),i+=" {\n",i+=` label: fields.${e.fieldName}.label,\n`,i+=` prop: fields.${e.fieldName}.prop,\n`,i+=` type: '${t}',\n`,i+=" isEnter: true,\n","Select"===t?(i+=" options: {\n",i+=" clearable: true,\n",i+=` placeholder: '请选择' + fields.${e.fieldName}.label\n`,i+=" },\n",i+=` dictType: '${this.toDictType(e.fieldName)}',\n`,i+=" option: []\n"):(i+=" options: {\n",i+=" clearable: true,\n",i+=` placeholder: '请输入' + fields.${e.fieldName}.label\n`,i+=" }\n"),i+=` }${n<l.length-1?",":""}\n`})),i+=" ]\n",i+=" }\n",i+=" ],\n",i+=" buttonJson: {\n",i+=" type: 'Search',\n",i+=" list: [\n",i+=" {\n",i+=" label: '搜索',\n",i+=" type: 'Query',\n",i+=` permi: '${this.toModuleName(t)}:query',\n`,i+=" options: {\n",i+=" icon: 'el-icon-search',\n",i+=" size: 'mini',\n",i+=" type: 'primary'\n",i+=" }\n",i+=" },\n",i+=" {\n",i+=" label: '重置',\n",i+=" type: 'Reset',\n",i+=` permi: '${this.toModuleName(t)}:query',\n`,i+=" options: {\n",i+=" icon: 'el-icon-refresh',\n",i+=" size: 'mini'\n",i+=" }\n",i+=" }\n",i+=" ]\n",i+=" }\n",i+="};\n",i}static generatePageButtonsJson(e){const n=this.extractClassName(e);let t=`/**\n * 由Java类 ${n} 自动生成的页面按钮配置\n */\n`;return t+="export const PageButtonsJson = {\n",t+=" rowJson: {\n",t+=" gutter: 10,\n",t+=" },\n",t+=" buttonList: [\n",t+=" {\n",t+=" span: 1.5,\n",t+=" label: '新增',\n",t+=` permi: '${this.toModuleName(n)}:add',\n`,t+=" type: 'Add',\n",t+=" options: [\n",t+=" {\n",t+=" icon: 'el-icon-plus',\n",t+=" plain: true,\n",t+=" size: 'mini',\n",t+=" type: 'primary',\n",t+=" },\n",t+=" ],\n",t+=" },\n",t+=" ],\n",t+="};\n",t}static generateTableJson(e){const n=this.parseFields(e),t=this.extractClassName(e),l=n.find((e=>e.fieldName.endsWith("Id")))||n[0],i=n.slice(0,Math.min(7,n.length));let a=`/**\n * 由Java类 ${t} 自动生成的表格配置\n */\n`;return a+="export const TableJson = {\n",a+=" columnJson: {\n",a+=" showSelect: false,\n",a+=" showIndex: true,\n",a+=` selectIdKey: '${l.fieldName}',\n`,a+=" data: [\n",a+=" {\n",a+=" type: 'index',\n",a+=" width: '55',\n",a+=" align: 'left',\n",a+=" headerAlign: 'left',\n",a+=" label: '序号'\n",a+=" },\n",i.forEach(((e,n)=>{a+=" {\n",a+=" align: 'left',\n",a+=" headerAlign: 'left',\n",0===n&&(a+=" width: '180',\n"),a+=` label: fields.${e.fieldName}.label,\n`,a+=` prop: fields.${e.fieldName}.prop,\n`,(e.fieldName.includes("Type")||e.fieldName.includes("Status")||e.fieldName.includes("Nature")||e.fieldName.includes("Mode"))&&(a+=` dictType: '${this.toDictType(e.fieldName)}',\n`),a+=" showOverflowTooltip: true\n",a+=" },\n"})),a+=" {\n",a+=" align: 'center',\n",a+=" headerAlign: 'center',\n",a+=" width: '130',\n",a+=" label: '操作',\n",a+=" type: 'func',\n",a+=" fixed: 'right',\n",a+=" buttonList: [\n",a+=" {\n",a+=" label: '编辑',\n",a+=" type: 'Edit',\n",a+=` permi: '${this.toModuleName(t)}:edit',\n`,a+=" options: {\n",a+=" icon: 'el-icon-edit',\n",a+=" size: 'mini',\n",a+=" type: 'text'\n",a+=" }\n",a+=" },\n",a+=" {\n",a+=" label: '删除',\n",a+=" type: 'Delete',\n",a+=` permi: '${this.toModuleName(t)}:remove',\n`,a+=" options: {\n",a+=" icon: 'el-icon-delete',\n",a+=" size: 'mini',\n",a+=" type: 'text'\n",a+=" }\n",a+=" }\n",a+=" ]\n",a+=" }\n",a+=" ]\n",a+=" }\n",a+="};\n",a}static generateDialogJson(e){const n=this.parseFields(e),t=this.extractClassName(e);this.toModuleName(t);const l=this.groupFieldsByType(n);let i=`/**\n * 由Java类 ${t} 自动生成的对话框配置\n */\n`;return i+="export const DialogJson = {\n",i+=" type: 'Add',\n",i+=` title: '${t}',\n`,i+=" options: {\n",i+=" width: '70%',\n",i+=" appendToBody: true,\n",i+=" destroyOnClose: true,\n",i+=" closeOnClickModal: false\n",i+=" },\n",i+=" buttonList: [\n",i+=" {\n",i+=" label: '确定',\n",i+=" type: 'Ok',\n",i+=" permi: '',\n",i+=" options: {\n",i+=" type: 'primary'\n",i+=" }\n",i+=" },\n",i+=" {\n",i+=" label: '取消',\n",i+=" type: 'Cancel',\n",i+=" permi: '',\n",i+=" options: {\n",i+=" type: ''\n",i+=" }\n",i+=" }\n",i+=" ],\n",i+=" formJson: {\n",i+=" formOption: {\n",i+=" labelPosition: 'right',\n",i+=" inline: false,\n",i+=" labelWidth: '160px',\n",i+=" size: 'small',\n",i+=" formFlex: {\n",i+=" gutter: 20,\n",i+=" span: 8\n",i+=" }\n",i+=" },\n",i+=" defaultFormData: {\n",i+=" },\n",i+=" formItemJson: [\n",Object.entries(l).forEach((([e,n],t)=>{i+=" {\n",i+=` label: '${e}',\n`,i+=" showTitle: true,\n",i+=" children: [\n",n.forEach(((e,t)=>{let l="Input",a=8;"Date"===e.type?l="DatePicker":"Boolean"===e.type?l="Switch":"Long"===e.type||"Integer"===e.type||"BigDecimal"===e.type?l="InputNumber":(e.fieldName.includes("Type")||e.fieldName.includes("Status")||e.fieldName.includes("Nature")||e.fieldName.includes("Mode"))&&(l="Select"),(e.fieldName.includes("Description")||e.fieldName.includes("Remark")||e.fieldName.includes("Comment")||e.fieldName.includes("Analysis")||e.fieldName.includes("Impact"))&&(a=12),i+=" {\n",i+=` label: fields.${e.fieldName}.label,\n`,i+=` prop: fields.${e.fieldName}.prop,\n`,i+=` type: '${l}',\n`,a>8&&(i+=" formFlex: {\n",i+=` span: ${a}\n`,i+=" },\n"),i+=" rules: [\n",i+=" {\n",i+=" required: true,\n",i+=` message: '请${"Select"===l||"DatePicker"===l?"选择":"输入"}' + fields.${e.fieldName}.label,\n`,i+=` trigger: '${["Select","DatePicker"].includes(l)?"change":"blur"}'\n`,i+=" }\n",i+=" ],\n",i+=" options: {\n","DatePicker"===l?(i+=" type: 'date',\n",i+=" valueFormat: 'yyyy-MM-dd',\n",i+=` format: 'yyyy-MM-dd'${a>8?",":""}\n`,a>8&&(i+=" pickerOptions: {}\n")):"Select"===l?(i+=" clearable: true,\n",i+=` placeholder: '请选择' + fields.${e.fieldName}.label\n`):(i+=" clearable: true,\n",a>8&&(i+=" type: 'textarea',\n",i+=" rows: 4,\n"),i+=` placeholder: '请输入' + fields.${e.fieldName}.label\n`),i+=" }","Select"===l&&(i+=`,\n dictType: '${this.toDictType(e.fieldName)}',\n`,i+=" option: []"),i+=`\n }${t<n.length-1?",":""}\n`})),i+=" ]\n",i+=` }${t<Object.keys(l).length-1?",":""}\n`})),i+=" ]\n",i+=" }\n",i+="};\n",i}static parseFields(e){const n=[/\/\*\*\s*([\s\S]*?)\s*\*\/\s*(?:@[\s\S]*?)*\s*(?:private|public|protected)\s+(\w+(?:<[^>]+>)?)\s+(\w+)\s*;/g,/(?:@\w+(?:\([^)]*\))?(?:\s*@\w+(?:\([^)]*\))?)*)\s*(?:private|public|protected)\s+(\w+(?:<[^>]+>)?)\s+(\w+)\s*;/g,/(?:private|public|protected)\s+(\w+(?:<[^>]+>)?)\s+(\w+)\s*;/g];let t,l=[];for(;null!==(t=n[0].exec(e));){const n=t[1]?.trim()||"",i=t[2],a=t[3],s=e.substring(Math.max(0,t.index-200),t.index+t[0].length).match(/@Excel\(name\s*=\s*"([^"]+)"/),o=e.substring(Math.max(0,t.index-200),t.index+t[0].length).match(/@ApiModelProperty\("([^"]+)"\)/),r=e.substring(Math.max(0,t.index-200),t.index+t[0].length).match(/@ApiModelProperty\(value\s*=\s*"([^"]+)"/),d=e.substring(Math.max(0,t.index-200),t.index+t[0].length).match(/@ApiModelProperty\("([^"]+)"\)/),p=s?s[1]:o?o[1]:r?r[1]:d?d[1]:a;"serialVersionUID"!==a&&l.push({fieldName:a,label:p,type:i,comment:n})}for(;null!==(t=n[1].exec(e));){const e=t[2];if(!l.some((n=>n.fieldName===e))&&"serialVersionUID"!==e){const n=t[1],i=t[0].substring(0,t[0].indexOf(n)),a=i.match(/@Excel\(name\s*=\s*"([^"]+)"/),s=i.match(/@ApiModelProperty\("([^"]+)"\)/),o=i.match(/@ApiModelProperty\(value\s*=\s*"([^"]+)"/),r=i.match(/@ApiModelProperty\("([^"]+)"\)/),d=a?a[1]:s?s[1]:o?o[1]:r?r[1]:e;l.push({fieldName:e,label:d,type:n,comment:""})}}for(;null!==(t=n[2].exec(e));){const e=t[2];if(!l.some((n=>n.fieldName===e))&&"serialVersionUID"!==e){const n=t[1];l.push({fieldName:e,label:e,type:n,comment:""})}}return l}static extractClassName(e){const n=e.match(/public class (\w+)/);return n?n[1]:"Unknown"}static toDictType(e){const n=e.replace(/[A-Z]/g,(e=>`_${e.toLowerCase()}`));return n.startsWith("_")?n.substring(1):n}static toModuleName(e){let n=e;return["Entity","Model","DO","PO","DTO","VO"].forEach((e=>{n.endsWith(e)&&(n=n.substring(0,n.length-e.length))})),n=n.charAt(0).toLowerCase()+n.substring(1),`${n}:manage`}static groupFieldsByType(e){return{"基本信息":e}}static generateAll(e){return`${this.convert(e)}\n\n${this.generateQueryFormJson(e)}\n\n${this.generatePageButtonsJson(e)}\n\n${this.generateTableJson(e)}\n\n${this.generateDialogJson(e)}`}}}));
|
@@ -0,0 +1,2 @@
|
|
1
|
+
#! /usr/bin/env node
|
2
|
+
"use strict";exports.javaToJsConverter=class{static convert(e){const n=this.extractClassName(e),t=this.parseFields(e);return console.log(`[JavaToJsConverter] 识别到 ${t.length} 个字段`),this.generateJsCode(t,n)}static generateJsCode(e,n){let t=`/**\n * 由Java类 ${n} 自动转换的字段定义\n */\n`;return t+="export const fields = {\n",e.forEach((e=>{t+=` ${e.fieldName}: {\n`,t+=` label: '${e.label}',\n`,t+=` prop: '${e.fieldName}'\n`,t+=" },\n"})),t+="};\n\n",t+=`/**\n * 使用示例:\n * \n * // 创建表单项\n * const formItem = {\n * label: fields.${e[0]?.fieldName||"fieldName"}.label,\n * prop: fields.${e[0]?.fieldName||"fieldName"}.prop,\n * type: 'Input'\n * };\n */`,t}static generateFormJson(e){const n=this.convert(e),t=this.extractClassName(e),l=this.parseFields(e);let i=n+"\n\n";return i+=`/**\n * 由Java类 ${t} 自动生成的表单配置\n */\n`,i+="export const FormJson = {\n",i+=" formOption: {\n",i+=" labelPosition: 'right',\n",i+=" labelWidth: '160px',\n",i+=" size: 'small',\n",i+=" formFlex: {\n",i+=" gutter: 20,\n",i+=" span: 8\n",i+=" }\n",i+=" },\n",i+=" formItemJson: [\n",i+=" {\n",i+=" label: '基本信息',\n",i+=" showTitle: true,\n",i+=" children: [\n",l.forEach(((e,n)=>{let t="Input";"Date"===e.type?t="DatePicker":"Boolean"===e.type?t="Switch":"Long"!==e.type&&"Integer"!==e.type&&"BigDecimal"!==e.type||(t="InputNumber"),i+=" {\n",i+=` label: fields.${e.fieldName}.label,\n`,i+=` prop: fields.${e.fieldName}.prop,\n`,i+=` type: '${t}',\n`,i+=" rules: [\n",i+=" {\n",i+=" required: true,\n",i+=` message: '请输入' + fields.${e.fieldName}.label,\n`,i+=` trigger: '${"DatePicker"===t?"change":"blur"}'\n`,i+=" }\n",i+=" ],\n",i+=" options: {\n","DatePicker"===t?(i+=" type: 'date',\n",i+=" valueFormat: 'yyyy-MM-dd',\n",i+=" format: 'yyyy-MM-dd'\n"):(i+=" clearable: true,\n",i+=` placeholder: '请输入' + fields.${e.fieldName}.label\n`),i+=" }\n",i+=` }${n<l.length-1?",":""}\n`})),i+=" ]\n",i+=" }\n",i+=" ]\n",i+="};\n",i}static generateQueryFormJson(e){const n=this.parseFields(e),t=this.extractClassName(e),l=n.slice(0,5);let i=`/**\n * 由Java类 ${t} 自动生成的查询表单配置\n */\n`;return i+="export const QueryFormJson = {\n",i+=" formOption: {\n",i+=" inline: true,\n",i+=" labelWidth: '120px',\n",i+=" labelPosition: 'right',\n",i+=" size: 'small',\n",i+=" formFlex: {\n",i+=" gutter: 20,\n",i+=" span: 8\n",i+=" }\n",i+=" },\n",i+=" formItemJson: [\n",i+=" {\n",i+=` label: '${t}信息',\n`,i+=" showTitle: false,\n",i+=" children: [\n",l.forEach(((e,n)=>{let t="Input";(e.fieldName.includes("Type")||e.fieldName.includes("Status")||e.fieldName.includes("Nature")||e.fieldName.includes("Mode"))&&(t="Select"),i+=" {\n",i+=` label: fields.${e.fieldName}.label,\n`,i+=` prop: fields.${e.fieldName}.prop,\n`,i+=` type: '${t}',\n`,i+=" isEnter: true,\n","Select"===t?(i+=" options: {\n",i+=" clearable: true,\n",i+=` placeholder: '请选择' + fields.${e.fieldName}.label\n`,i+=" },\n",i+=` dictType: '${this.toDictType(e.fieldName)}',\n`,i+=" option: []\n"):(i+=" options: {\n",i+=" clearable: true,\n",i+=` placeholder: '请输入' + fields.${e.fieldName}.label\n`,i+=" }\n"),i+=` }${n<l.length-1?",":""}\n`})),i+=" ]\n",i+=" }\n",i+=" ],\n",i+=" buttonJson: {\n",i+=" type: 'Search',\n",i+=" list: [\n",i+=" {\n",i+=" label: '搜索',\n",i+=" type: 'Query',\n",i+=` permi: '${this.toModuleName(t)}:query',\n`,i+=" options: {\n",i+=" icon: 'el-icon-search',\n",i+=" size: 'mini',\n",i+=" type: 'primary'\n",i+=" }\n",i+=" },\n",i+=" {\n",i+=" label: '重置',\n",i+=" type: 'Reset',\n",i+=` permi: '${this.toModuleName(t)}:query',\n`,i+=" options: {\n",i+=" icon: 'el-icon-refresh',\n",i+=" size: 'mini'\n",i+=" }\n",i+=" }\n",i+=" ]\n",i+=" }\n",i+="};\n",i}static generatePageButtonsJson(e){const n=this.extractClassName(e);let t=`/**\n * 由Java类 ${n} 自动生成的页面按钮配置\n */\n`;return t+="export const PageButtonsJson = {\n",t+=" rowJson: {\n",t+=" gutter: 10,\n",t+=" },\n",t+=" buttonList: [\n",t+=" {\n",t+=" span: 1.5,\n",t+=" label: '新增',\n",t+=` permi: '${this.toModuleName(n)}:add',\n`,t+=" type: 'Add',\n",t+=" options: [\n",t+=" {\n",t+=" icon: 'el-icon-plus',\n",t+=" plain: true,\n",t+=" size: 'mini',\n",t+=" type: 'primary',\n",t+=" },\n",t+=" ],\n",t+=" },\n",t+=" ],\n",t+="};\n",t}static generateTableJson(e){const n=this.parseFields(e),t=this.extractClassName(e),l=n.find((e=>e.fieldName.endsWith("Id")))||n[0],i=n.slice(0,Math.min(7,n.length));let a=`/**\n * 由Java类 ${t} 自动生成的表格配置\n */\n`;return a+="export const TableJson = {\n",a+=" columnJson: {\n",a+=" showSelect: false,\n",a+=" showIndex: true,\n",a+=` selectIdKey: '${l.fieldName}',\n`,a+=" data: [\n",a+=" {\n",a+=" type: 'index',\n",a+=" width: '55',\n",a+=" align: 'left',\n",a+=" headerAlign: 'left',\n",a+=" label: '序号'\n",a+=" },\n",i.forEach(((e,n)=>{a+=" {\n",a+=" align: 'left',\n",a+=" headerAlign: 'left',\n",0===n&&(a+=" width: '180',\n"),a+=` label: fields.${e.fieldName}.label,\n`,a+=` prop: fields.${e.fieldName}.prop,\n`,(e.fieldName.includes("Type")||e.fieldName.includes("Status")||e.fieldName.includes("Nature")||e.fieldName.includes("Mode"))&&(a+=` dictType: '${this.toDictType(e.fieldName)}',\n`),a+=" showOverflowTooltip: true\n",a+=" },\n"})),a+=" {\n",a+=" align: 'center',\n",a+=" headerAlign: 'center',\n",a+=" width: '130',\n",a+=" label: '操作',\n",a+=" type: 'func',\n",a+=" fixed: 'right',\n",a+=" buttonList: [\n",a+=" {\n",a+=" label: '编辑',\n",a+=" type: 'Edit',\n",a+=` permi: '${this.toModuleName(t)}:edit',\n`,a+=" options: {\n",a+=" icon: 'el-icon-edit',\n",a+=" size: 'mini',\n",a+=" type: 'text'\n",a+=" }\n",a+=" },\n",a+=" {\n",a+=" label: '删除',\n",a+=" type: 'Delete',\n",a+=` permi: '${this.toModuleName(t)}:remove',\n`,a+=" options: {\n",a+=" icon: 'el-icon-delete',\n",a+=" size: 'mini',\n",a+=" type: 'text'\n",a+=" }\n",a+=" }\n",a+=" ]\n",a+=" }\n",a+=" ]\n",a+=" }\n",a+="};\n",a}static generateDialogJson(e){const n=this.parseFields(e),t=this.extractClassName(e);this.toModuleName(t);const l=this.groupFieldsByType(n);let i=`/**\n * 由Java类 ${t} 自动生成的对话框配置\n */\n`;return i+="export const DialogJson = {\n",i+=" type: 'Add',\n",i+=` title: '${t}',\n`,i+=" options: {\n",i+=" width: '70%',\n",i+=" appendToBody: true,\n",i+=" destroyOnClose: true,\n",i+=" closeOnClickModal: false\n",i+=" },\n",i+=" buttonList: [\n",i+=" {\n",i+=" label: '确定',\n",i+=" type: 'Ok',\n",i+=" permi: '',\n",i+=" options: {\n",i+=" type: 'primary'\n",i+=" }\n",i+=" },\n",i+=" {\n",i+=" label: '取消',\n",i+=" type: 'Cancel',\n",i+=" permi: '',\n",i+=" options: {\n",i+=" type: ''\n",i+=" }\n",i+=" }\n",i+=" ],\n",i+=" formJson: {\n",i+=" formOption: {\n",i+=" labelPosition: 'right',\n",i+=" inline: false,\n",i+=" labelWidth: '160px',\n",i+=" size: 'small',\n",i+=" formFlex: {\n",i+=" gutter: 20,\n",i+=" span: 8\n",i+=" }\n",i+=" },\n",i+=" defaultFormData: {\n",i+=" },\n",i+=" formItemJson: [\n",Object.entries(l).forEach((([e,n],t)=>{i+=" {\n",i+=` label: '${e}',\n`,i+=" showTitle: true,\n",i+=" children: [\n",n.forEach(((e,t)=>{let l="Input",a=8;"Date"===e.type?l="DatePicker":"Boolean"===e.type?l="Switch":"Long"===e.type||"Integer"===e.type||"BigDecimal"===e.type?l="InputNumber":(e.fieldName.includes("Type")||e.fieldName.includes("Status")||e.fieldName.includes("Nature")||e.fieldName.includes("Mode"))&&(l="Select"),(e.fieldName.includes("Description")||e.fieldName.includes("Remark")||e.fieldName.includes("Comment")||e.fieldName.includes("Analysis")||e.fieldName.includes("Impact"))&&(a=12),i+=" {\n",i+=` label: fields.${e.fieldName}.label,\n`,i+=` prop: fields.${e.fieldName}.prop,\n`,i+=` type: '${l}',\n`,a>8&&(i+=" formFlex: {\n",i+=` span: ${a}\n`,i+=" },\n"),i+=" rules: [\n",i+=" {\n",i+=" required: true,\n",i+=` message: '请${"Select"===l||"DatePicker"===l?"选择":"输入"}' + fields.${e.fieldName}.label,\n`,i+=` trigger: '${["Select","DatePicker"].includes(l)?"change":"blur"}'\n`,i+=" }\n",i+=" ],\n",i+=" options: {\n","DatePicker"===l?(i+=" type: 'date',\n",i+=" valueFormat: 'yyyy-MM-dd',\n",i+=` format: 'yyyy-MM-dd'${a>8?",":""}\n`,a>8&&(i+=" pickerOptions: {}\n")):"Select"===l?(i+=" clearable: true,\n",i+=` placeholder: '请选择' + fields.${e.fieldName}.label\n`):(i+=" clearable: true,\n",a>8&&(i+=" type: 'textarea',\n",i+=" rows: 4,\n"),i+=` placeholder: '请输入' + fields.${e.fieldName}.label\n`),i+=" }","Select"===l&&(i+=`,\n dictType: '${this.toDictType(e.fieldName)}',\n`,i+=" option: []"),i+=`\n }${t<n.length-1?",":""}\n`})),i+=" ]\n",i+=` }${t<Object.keys(l).length-1?",":""}\n`})),i+=" ]\n",i+=" }\n",i+="};\n",i}static parseFields(e){const n=[/\/\*\*\s*([\s\S]*?)\s*\*\/\s*(?:@[\s\S]*?)*\s*(?:private|public|protected)\s+(\w+(?:<[^>]+>)?)\s+(\w+)\s*;/g,/(?:@\w+(?:\([^)]*\))?(?:\s*@\w+(?:\([^)]*\))?)*)\s*(?:private|public|protected)\s+(\w+(?:<[^>]+>)?)\s+(\w+)\s*;/g,/(?:private|public|protected)\s+(\w+(?:<[^>]+>)?)\s+(\w+)\s*;/g];let t,l=[];for(;null!==(t=n[0].exec(e));){const n=t[1]?.trim()||"",i=t[2],a=t[3],s=e.substring(Math.max(0,t.index-200),t.index+t[0].length).match(/@Excel\(name\s*=\s*"([^"]+)"/),r=e.substring(Math.max(0,t.index-200),t.index+t[0].length).match(/@ApiModelProperty\("([^"]+)"\)/),o=e.substring(Math.max(0,t.index-200),t.index+t[0].length).match(/@ApiModelProperty\(value\s*=\s*"([^"]+)"/),d=e.substring(Math.max(0,t.index-200),t.index+t[0].length).match(/@ApiModelProperty\("([^"]+)"\)/),c=s?s[1]:r?r[1]:o?o[1]:d?d[1]:a;"serialVersionUID"!==a&&l.push({fieldName:a,label:c,type:i,comment:n})}for(;null!==(t=n[1].exec(e));){const e=t[2];if(!l.some((n=>n.fieldName===e))&&"serialVersionUID"!==e){const n=t[1],i=t[0].substring(0,t[0].indexOf(n)),a=i.match(/@Excel\(name\s*=\s*"([^"]+)"/),s=i.match(/@ApiModelProperty\("([^"]+)"\)/),r=i.match(/@ApiModelProperty\(value\s*=\s*"([^"]+)"/),o=i.match(/@ApiModelProperty\("([^"]+)"\)/),d=a?a[1]:s?s[1]:r?r[1]:o?o[1]:e;l.push({fieldName:e,label:d,type:n,comment:""})}}for(;null!==(t=n[2].exec(e));){const e=t[2];if(!l.some((n=>n.fieldName===e))&&"serialVersionUID"!==e){const n=t[1];l.push({fieldName:e,label:e,type:n,comment:""})}}return l}static extractClassName(e){const n=e.match(/public class (\w+)/);return n?n[1]:"Unknown"}static toDictType(e){const n=e.replace(/[A-Z]/g,(e=>`_${e.toLowerCase()}`));return n.startsWith("_")?n.substring(1):n}static toModuleName(e){let n=e;return["Entity","Model","DO","PO","DTO","VO"].forEach((e=>{n.endsWith(e)&&(n=n.substring(0,n.length-e.length))})),n=n.charAt(0).toLowerCase()+n.substring(1),`${n}:manage`}static groupFieldsByType(e){return{"基本信息":e}}static generateAll(e){return`${this.convert(e)}\n\n${this.generateQueryFormJson(e)}\n\n${this.generatePageButtonsJson(e)}\n\n${this.generateTableJson(e)}\n\n${this.generateDialogJson(e)}`}};
|
@@ -0,0 +1,2 @@
|
|
1
|
+
#! /usr/bin/env node
|
2
|
+
class e{static convert(e){const n=this.extractClassName(e),t=this.parseFields(e);return console.log(`[JavaToJsConverter] 识别到 ${t.length} 个字段`),this.generateJsCode(t,n)}static generateJsCode(e,n){let t=`/**\n * 由Java类 ${n} 自动转换的字段定义\n */\n`;return t+="export const fields = {\n",e.forEach((e=>{t+=` ${e.fieldName}: {\n`,t+=` label: '${e.label}',\n`,t+=` prop: '${e.fieldName}'\n`,t+=" },\n"})),t+="};\n\n",t+=`/**\n * 使用示例:\n * \n * // 创建表单项\n * const formItem = {\n * label: fields.${e[0]?.fieldName||"fieldName"}.label,\n * prop: fields.${e[0]?.fieldName||"fieldName"}.prop,\n * type: 'Input'\n * };\n */`,t}static generateFormJson(e){const n=this.convert(e),t=this.extractClassName(e),l=this.parseFields(e);let i=n+"\n\n";return i+=`/**\n * 由Java类 ${t} 自动生成的表单配置\n */\n`,i+="export const FormJson = {\n",i+=" formOption: {\n",i+=" labelPosition: 'right',\n",i+=" labelWidth: '160px',\n",i+=" size: 'small',\n",i+=" formFlex: {\n",i+=" gutter: 20,\n",i+=" span: 8\n",i+=" }\n",i+=" },\n",i+=" formItemJson: [\n",i+=" {\n",i+=" label: '基本信息',\n",i+=" showTitle: true,\n",i+=" children: [\n",l.forEach(((e,n)=>{let t="Input";"Date"===e.type?t="DatePicker":"Boolean"===e.type?t="Switch":"Long"!==e.type&&"Integer"!==e.type&&"BigDecimal"!==e.type||(t="InputNumber"),i+=" {\n",i+=` label: fields.${e.fieldName}.label,\n`,i+=` prop: fields.${e.fieldName}.prop,\n`,i+=` type: '${t}',\n`,i+=" rules: [\n",i+=" {\n",i+=" required: true,\n",i+=` message: '请输入' + fields.${e.fieldName}.label,\n`,i+=` trigger: '${"DatePicker"===t?"change":"blur"}'\n`,i+=" }\n",i+=" ],\n",i+=" options: {\n","DatePicker"===t?(i+=" type: 'date',\n",i+=" valueFormat: 'yyyy-MM-dd',\n",i+=" format: 'yyyy-MM-dd'\n"):(i+=" clearable: true,\n",i+=` placeholder: '请输入' + fields.${e.fieldName}.label\n`),i+=" }\n",i+=` }${n<l.length-1?",":""}\n`})),i+=" ]\n",i+=" }\n",i+=" ]\n",i+="};\n",i}static generateQueryFormJson(e){const n=this.parseFields(e),t=this.extractClassName(e),l=n.slice(0,5);let i=`/**\n * 由Java类 ${t} 自动生成的查询表单配置\n */\n`;return i+="export const QueryFormJson = {\n",i+=" formOption: {\n",i+=" inline: true,\n",i+=" labelWidth: '120px',\n",i+=" labelPosition: 'right',\n",i+=" size: 'small',\n",i+=" formFlex: {\n",i+=" gutter: 20,\n",i+=" span: 8\n",i+=" }\n",i+=" },\n",i+=" formItemJson: [\n",i+=" {\n",i+=` label: '${t}信息',\n`,i+=" showTitle: false,\n",i+=" children: [\n",l.forEach(((e,n)=>{let t="Input";(e.fieldName.includes("Type")||e.fieldName.includes("Status")||e.fieldName.includes("Nature")||e.fieldName.includes("Mode"))&&(t="Select"),i+=" {\n",i+=` label: fields.${e.fieldName}.label,\n`,i+=` prop: fields.${e.fieldName}.prop,\n`,i+=` type: '${t}',\n`,i+=" isEnter: true,\n","Select"===t?(i+=" options: {\n",i+=" clearable: true,\n",i+=` placeholder: '请选择' + fields.${e.fieldName}.label\n`,i+=" },\n",i+=` dictType: '${this.toDictType(e.fieldName)}',\n`,i+=" option: []\n"):(i+=" options: {\n",i+=" clearable: true,\n",i+=` placeholder: '请输入' + fields.${e.fieldName}.label\n`,i+=" }\n"),i+=` }${n<l.length-1?",":""}\n`})),i+=" ]\n",i+=" }\n",i+=" ],\n",i+=" buttonJson: {\n",i+=" type: 'Search',\n",i+=" list: [\n",i+=" {\n",i+=" label: '搜索',\n",i+=" type: 'Query',\n",i+=` permi: '${this.toModuleName(t)}:query',\n`,i+=" options: {\n",i+=" icon: 'el-icon-search',\n",i+=" size: 'mini',\n",i+=" type: 'primary'\n",i+=" }\n",i+=" },\n",i+=" {\n",i+=" label: '重置',\n",i+=" type: 'Reset',\n",i+=` permi: '${this.toModuleName(t)}:query',\n`,i+=" options: {\n",i+=" icon: 'el-icon-refresh',\n",i+=" size: 'mini'\n",i+=" }\n",i+=" }\n",i+=" ]\n",i+=" }\n",i+="};\n",i}static generatePageButtonsJson(e){const n=this.extractClassName(e);let t=`/**\n * 由Java类 ${n} 自动生成的页面按钮配置\n */\n`;return t+="export const PageButtonsJson = {\n",t+=" rowJson: {\n",t+=" gutter: 10,\n",t+=" },\n",t+=" buttonList: [\n",t+=" {\n",t+=" span: 1.5,\n",t+=" label: '新增',\n",t+=` permi: '${this.toModuleName(n)}:add',\n`,t+=" type: 'Add',\n",t+=" options: [\n",t+=" {\n",t+=" icon: 'el-icon-plus',\n",t+=" plain: true,\n",t+=" size: 'mini',\n",t+=" type: 'primary',\n",t+=" },\n",t+=" ],\n",t+=" },\n",t+=" ],\n",t+="};\n",t}static generateTableJson(e){const n=this.parseFields(e),t=this.extractClassName(e),l=n.find((e=>e.fieldName.endsWith("Id")))||n[0],i=n.slice(0,Math.min(7,n.length));let a=`/**\n * 由Java类 ${t} 自动生成的表格配置\n */\n`;return a+="export const TableJson = {\n",a+=" columnJson: {\n",a+=" showSelect: false,\n",a+=" showIndex: true,\n",a+=` selectIdKey: '${l.fieldName}',\n`,a+=" data: [\n",a+=" {\n",a+=" type: 'index',\n",a+=" width: '55',\n",a+=" align: 'left',\n",a+=" headerAlign: 'left',\n",a+=" label: '序号'\n",a+=" },\n",i.forEach(((e,n)=>{a+=" {\n",a+=" align: 'left',\n",a+=" headerAlign: 'left',\n",0===n&&(a+=" width: '180',\n"),a+=` label: fields.${e.fieldName}.label,\n`,a+=` prop: fields.${e.fieldName}.prop,\n`,(e.fieldName.includes("Type")||e.fieldName.includes("Status")||e.fieldName.includes("Nature")||e.fieldName.includes("Mode"))&&(a+=` dictType: '${this.toDictType(e.fieldName)}',\n`),a+=" showOverflowTooltip: true\n",a+=" },\n"})),a+=" {\n",a+=" align: 'center',\n",a+=" headerAlign: 'center',\n",a+=" width: '130',\n",a+=" label: '操作',\n",a+=" type: 'func',\n",a+=" fixed: 'right',\n",a+=" buttonList: [\n",a+=" {\n",a+=" label: '编辑',\n",a+=" type: 'Edit',\n",a+=` permi: '${this.toModuleName(t)}:edit',\n`,a+=" options: {\n",a+=" icon: 'el-icon-edit',\n",a+=" size: 'mini',\n",a+=" type: 'text'\n",a+=" }\n",a+=" },\n",a+=" {\n",a+=" label: '删除',\n",a+=" type: 'Delete',\n",a+=` permi: '${this.toModuleName(t)}:remove',\n`,a+=" options: {\n",a+=" icon: 'el-icon-delete',\n",a+=" size: 'mini',\n",a+=" type: 'text'\n",a+=" }\n",a+=" }\n",a+=" ]\n",a+=" }\n",a+=" ]\n",a+=" }\n",a+="};\n",a}static generateDialogJson(e){const n=this.parseFields(e),t=this.extractClassName(e);this.toModuleName(t);const l=this.groupFieldsByType(n);let i=`/**\n * 由Java类 ${t} 自动生成的对话框配置\n */\n`;return i+="export const DialogJson = {\n",i+=" type: 'Add',\n",i+=` title: '${t}',\n`,i+=" options: {\n",i+=" width: '70%',\n",i+=" appendToBody: true,\n",i+=" destroyOnClose: true,\n",i+=" closeOnClickModal: false\n",i+=" },\n",i+=" buttonList: [\n",i+=" {\n",i+=" label: '确定',\n",i+=" type: 'Ok',\n",i+=" permi: '',\n",i+=" options: {\n",i+=" type: 'primary'\n",i+=" }\n",i+=" },\n",i+=" {\n",i+=" label: '取消',\n",i+=" type: 'Cancel',\n",i+=" permi: '',\n",i+=" options: {\n",i+=" type: ''\n",i+=" }\n",i+=" }\n",i+=" ],\n",i+=" formJson: {\n",i+=" formOption: {\n",i+=" labelPosition: 'right',\n",i+=" inline: false,\n",i+=" labelWidth: '160px',\n",i+=" size: 'small',\n",i+=" formFlex: {\n",i+=" gutter: 20,\n",i+=" span: 8\n",i+=" }\n",i+=" },\n",i+=" defaultFormData: {\n",i+=" },\n",i+=" formItemJson: [\n",Object.entries(l).forEach((([e,n],t)=>{i+=" {\n",i+=` label: '${e}',\n`,i+=" showTitle: true,\n",i+=" children: [\n",n.forEach(((e,t)=>{let l="Input",a=8;"Date"===e.type?l="DatePicker":"Boolean"===e.type?l="Switch":"Long"===e.type||"Integer"===e.type||"BigDecimal"===e.type?l="InputNumber":(e.fieldName.includes("Type")||e.fieldName.includes("Status")||e.fieldName.includes("Nature")||e.fieldName.includes("Mode"))&&(l="Select"),(e.fieldName.includes("Description")||e.fieldName.includes("Remark")||e.fieldName.includes("Comment")||e.fieldName.includes("Analysis")||e.fieldName.includes("Impact"))&&(a=12),i+=" {\n",i+=` label: fields.${e.fieldName}.label,\n`,i+=` prop: fields.${e.fieldName}.prop,\n`,i+=` type: '${l}',\n`,a>8&&(i+=" formFlex: {\n",i+=` span: ${a}\n`,i+=" },\n"),i+=" rules: [\n",i+=" {\n",i+=" required: true,\n",i+=` message: '请${"Select"===l||"DatePicker"===l?"选择":"输入"}' + fields.${e.fieldName}.label,\n`,i+=` trigger: '${["Select","DatePicker"].includes(l)?"change":"blur"}'\n`,i+=" }\n",i+=" ],\n",i+=" options: {\n","DatePicker"===l?(i+=" type: 'date',\n",i+=" valueFormat: 'yyyy-MM-dd',\n",i+=` format: 'yyyy-MM-dd'${a>8?",":""}\n`,a>8&&(i+=" pickerOptions: {}\n")):"Select"===l?(i+=" clearable: true,\n",i+=` placeholder: '请选择' + fields.${e.fieldName}.label\n`):(i+=" clearable: true,\n",a>8&&(i+=" type: 'textarea',\n",i+=" rows: 4,\n"),i+=` placeholder: '请输入' + fields.${e.fieldName}.label\n`),i+=" }","Select"===l&&(i+=`,\n dictType: '${this.toDictType(e.fieldName)}',\n`,i+=" option: []"),i+=`\n }${t<n.length-1?",":""}\n`})),i+=" ]\n",i+=` }${t<Object.keys(l).length-1?",":""}\n`})),i+=" ]\n",i+=" }\n",i+="};\n",i}static parseFields(e){const n=[/\/\*\*\s*([\s\S]*?)\s*\*\/\s*(?:@[\s\S]*?)*\s*(?:private|public|protected)\s+(\w+(?:<[^>]+>)?)\s+(\w+)\s*;/g,/(?:@\w+(?:\([^)]*\))?(?:\s*@\w+(?:\([^)]*\))?)*)\s*(?:private|public|protected)\s+(\w+(?:<[^>]+>)?)\s+(\w+)\s*;/g,/(?:private|public|protected)\s+(\w+(?:<[^>]+>)?)\s+(\w+)\s*;/g];let t,l=[];for(;null!==(t=n[0].exec(e));){const n=t[1]?.trim()||"",i=t[2],a=t[3],s=e.substring(Math.max(0,t.index-200),t.index+t[0].length).match(/@Excel\(name\s*=\s*"([^"]+)"/),r=e.substring(Math.max(0,t.index-200),t.index+t[0].length).match(/@ApiModelProperty\("([^"]+)"\)/),o=e.substring(Math.max(0,t.index-200),t.index+t[0].length).match(/@ApiModelProperty\(value\s*=\s*"([^"]+)"/),d=e.substring(Math.max(0,t.index-200),t.index+t[0].length).match(/@ApiModelProperty\("([^"]+)"\)/),c=s?s[1]:r?r[1]:o?o[1]:d?d[1]:a;"serialVersionUID"!==a&&l.push({fieldName:a,label:c,type:i,comment:n})}for(;null!==(t=n[1].exec(e));){const e=t[2];if(!l.some((n=>n.fieldName===e))&&"serialVersionUID"!==e){const n=t[1],i=t[0].substring(0,t[0].indexOf(n)),a=i.match(/@Excel\(name\s*=\s*"([^"]+)"/),s=i.match(/@ApiModelProperty\("([^"]+)"\)/),r=i.match(/@ApiModelProperty\(value\s*=\s*"([^"]+)"/),o=i.match(/@ApiModelProperty\("([^"]+)"\)/),d=a?a[1]:s?s[1]:r?r[1]:o?o[1]:e;l.push({fieldName:e,label:d,type:n,comment:""})}}for(;null!==(t=n[2].exec(e));){const e=t[2];if(!l.some((n=>n.fieldName===e))&&"serialVersionUID"!==e){const n=t[1];l.push({fieldName:e,label:e,type:n,comment:""})}}return l}static extractClassName(e){const n=e.match(/public class (\w+)/);return n?n[1]:"Unknown"}static toDictType(e){const n=e.replace(/[A-Z]/g,(e=>`_${e.toLowerCase()}`));return n.startsWith("_")?n.substring(1):n}static toModuleName(e){let n=e;return["Entity","Model","DO","PO","DTO","VO"].forEach((e=>{n.endsWith(e)&&(n=n.substring(0,n.length-e.length))})),n=n.charAt(0).toLowerCase()+n.substring(1),`${n}:manage`}static groupFieldsByType(e){return{"基本信息":e}}static generateAll(e){return`${this.convert(e)}\n\n${this.generateQueryFormJson(e)}\n\n${this.generatePageButtonsJson(e)}\n\n${this.generateTableJson(e)}\n\n${this.generateDialogJson(e)}`}}export{e as javaToJsConverter};
|
package/package.json
CHANGED
@@ -1,11 +1,11 @@
|
|
1
1
|
{
|
2
2
|
"name": "@dypnb/dev-tools",
|
3
|
-
"version": "1.0.
|
3
|
+
"version": "1.0.22",
|
4
4
|
"description": "开发时的提效工具",
|
5
|
-
"main": "lib/bundle.cjs
|
6
|
-
"jsnext:main": "lib/bundle.esm
|
7
|
-
"module": "lib/bundle.esm
|
8
|
-
"browser": "lib/bundle.browser
|
5
|
+
"main": "lib/bundle/index.cjs",
|
6
|
+
"jsnext:main": "lib/bundle/index.esm",
|
7
|
+
"module": "lib/bundle/index.esm",
|
8
|
+
"browser": "lib/bundle/index.browser",
|
9
9
|
"type": "module",
|
10
10
|
"scripts": {
|
11
11
|
"dev": "npx rollup -wc rollup.config.dev.js",
|
@@ -25,7 +25,6 @@
|
|
25
25
|
"dyp-javaTojs": "dist/javaTojs/index.cjs"
|
26
26
|
},
|
27
27
|
"dependencies": {
|
28
|
-
"@dypnb/dev-tools": "^1.0.13",
|
29
28
|
"axios": "^1.4.0",
|
30
29
|
"chalk": "4.1.0",
|
31
30
|
"execa": "^5.1.1",
|
@@ -71,6 +70,7 @@
|
|
71
70
|
},
|
72
71
|
"files": [
|
73
72
|
"dist/*",
|
73
|
+
"lib/*",
|
74
74
|
"*.json",
|
75
75
|
"README.md"
|
76
76
|
],
|