@@ -0,0 +1,54 @@ | |||||
package cc.smtweb.framework.core.cache; | |||||
import cc.smtweb.framework.core.common.SwConsts; | |||||
import cc.smtweb.framework.core.db.DbEngine; | |||||
import cc.smtweb.framework.core.db.EntityDao; | |||||
import cc.smtweb.framework.core.db.impl.DefaultEntity; | |||||
import java.util.List; | |||||
/** | |||||
* Created by Akmm at 2022/6/16 15:53 | |||||
*/ | |||||
public class AbstractEntityCache<T extends DefaultEntity> extends AbstractCache<T> { | |||||
@Override | |||||
protected String getId(T bean) { | |||||
return String.valueOf(bean.getEntityId()); | |||||
} | |||||
private String getCacheKey(T bean, String fields) { | |||||
String[] fs = fields.split(","); | |||||
String ret = ""; | |||||
for (String f: fs) { | |||||
ret += SwConsts.SPLIT_CHAR + bean.getStr(f); | |||||
} | |||||
return ret.substring(SwConsts.SPLIT_CHAR.length()); | |||||
} | |||||
/** | |||||
* 注册其他key的List缓存,如tree的children | |||||
* | |||||
* @param key | |||||
* @param fields | |||||
*/ | |||||
protected void regList(String key, String fields) { | |||||
regList(key, bean -> getCacheKey(bean, fields)); | |||||
} | |||||
/** | |||||
* 注册其他key的Map缓存,如按code缓存 | |||||
* | |||||
* @param key | |||||
* @param fields | |||||
*/ | |||||
protected void regMap(String key, String fields) { | |||||
regMap(key, bean -> getCacheKey(bean, fields)); | |||||
} | |||||
@Override | |||||
protected List<T> loadAll() { | |||||
EntityDao<T> dao = DbEngine.getInstance().findDao(pTypeClass); | |||||
return dao.query(); | |||||
} | |||||
} |
@@ -86,16 +86,18 @@ public interface SwEnum { | |||||
public String sqlType; | public String sqlType; | ||||
public int dataLength; | public int dataLength; | ||||
public String javaType; | public String javaType; | ||||
public String shortJavaType; | |||||
//java.sql.Types里的值 | //java.sql.Types里的值 | ||||
public int type; | public int type; | ||||
public String defaultValue; | public String defaultValue; | ||||
public String editor; | public String editor; | ||||
public DataTypeBean(String value, String name, String sqlType, int dataLength, String javaType, int type, String defaultValue, String editor) { | |||||
public DataTypeBean(String value, String name, String sqlType, int dataLength, String javaType, String shortJavaType, int type, String defaultValue, String editor) { | |||||
super(value, name); | super(value, name); | ||||
this.sqlType = sqlType; | this.sqlType = sqlType; | ||||
this.dataLength = dataLength; | this.dataLength = dataLength; | ||||
this.javaType = javaType; | this.javaType = javaType; | ||||
this.shortJavaType = shortJavaType; | |||||
this.defaultValue = defaultValue; | this.defaultValue = defaultValue; | ||||
this.editor = editor; | this.editor = editor; | ||||
this.type = type; | this.type = type; | ||||
@@ -105,6 +107,7 @@ public interface SwEnum { | |||||
if (dataLength > 0) return sqlType + "(" + dataLength + ")"; | if (dataLength > 0) return sqlType + "(" + dataLength + ")"; | ||||
return sqlType; | return sqlType; | ||||
} | } | ||||
} | } | ||||
/** | /** | ||||
@@ -116,26 +119,26 @@ public interface SwEnum { | |||||
public final static String TYPE_DATETIME = "datetime"; | public final static String TYPE_DATETIME = "datetime"; | ||||
public static DataType instance = new DataType(); | public static DataType instance = new DataType(); | ||||
public static DataTypeBean ID = instance.addEnum("id", "ID", "bigint", 0, "long", Types.BIGINT, "", EditorType.INPUT.value); | |||||
public static DataTypeBean CODE = instance.addEnum("code", "编码", "varchar", 32, "string", Types.VARCHAR, "", EditorType.INPUT.value); | |||||
public static DataTypeBean NAME = instance.addEnum("name", "名称", "varchar", 100, "string", Types.VARCHAR, "", EditorType.INPUT.value); | |||||
public static DataTypeBean REMARK = instance.addEnum("remark", "备注", "varchar", 255, "string", Types.VARCHAR, "", EditorType.INPUT.value); | |||||
public static DataTypeBean TEXT = instance.addEnum("text", "大文本", "text", 0, "string", Types.CLOB, "", EditorType.TEXT.value); | |||||
public static DataTypeBean INT = instance.addEnum("int", "整型", "int", 0, "int", Types.INTEGER, "0", EditorType.NUMBER.value); | |||||
public static DataTypeBean SHORT = instance.addEnum("short", "短整型", "smallint", 0, "short", Types.SMALLINT, "0", EditorType.NUMBER.value); | |||||
public static DataTypeBean BOOL = instance.addEnum("bool", "布尔型", "tinyint", 0, "boolean", Types.TINYINT, "0", EditorType.SWITCH.value); | |||||
public static DataTypeBean CURRENCY = instance.addEnum("currency", "金额型", "bigint", 0, "long", Types.BIGINT, "0", EditorType.NUMBER.value); | |||||
public static DataTypeBean DATE = instance.addEnum("date", "日期型", "bigint", 0, "long", Types.BIGINT, "0", EditorType.DATE.value); | |||||
public static DataTypeBean TIME = instance.addEnum("time", "时间型", "bigint", 0, "long", Types.BIGINT, "0", EditorType.TIME.value); | |||||
public static DataTypeBean DATETIME = instance.addEnum("datetime", "日期时间型", "bigint", 0, "long", Types.BIGINT, "0", EditorType.DATETIME.value); | |||||
public static DataTypeBean ID = instance.addEnum("id", "ID", "bigint", 0, "long", "Long", Types.BIGINT, "", EditorType.INPUT.value); | |||||
public static DataTypeBean CODE = instance.addEnum("code", "编码", "varchar", 32, "String", "Str", Types.VARCHAR, "", EditorType.INPUT.value); | |||||
public static DataTypeBean NAME = instance.addEnum("name", "名称", "varchar", 100, "String", "Str", Types.VARCHAR, "", EditorType.INPUT.value); | |||||
public static DataTypeBean REMARK = instance.addEnum("remark", "备注", "varchar", 255, "String", "Str", Types.VARCHAR, "", EditorType.INPUT.value); | |||||
public static DataTypeBean TEXT = instance.addEnum("text", "大文本", "text", 0, "String", "Str", Types.CLOB, "", EditorType.TEXT.value); | |||||
public static DataTypeBean INT = instance.addEnum("int", "整型", "int", 0, "int", "Int", Types.INTEGER, "0", EditorType.NUMBER.value); | |||||
public static DataTypeBean SHORT = instance.addEnum("short", "短整型", "smallint", 0, "int", "Int", Types.SMALLINT, "0", EditorType.NUMBER.value); | |||||
public static DataTypeBean BOOL = instance.addEnum("bool", "布尔型", "tinyint", 0, "boolean", "Bool", Types.TINYINT, "0", EditorType.SWITCH.value); | |||||
public static DataTypeBean CURRENCY = instance.addEnum("currency", "金额型", "bigint", 0, "long", "Long", Types.BIGINT, "0", EditorType.NUMBER.value); | |||||
public static DataTypeBean DATE = instance.addEnum("date", "日期型", "bigint", 0, "long","Long", Types.BIGINT, "0", EditorType.DATE.value); | |||||
public static DataTypeBean TIME = instance.addEnum("time", "时间型", "bigint", 0, "long", "Long", Types.BIGINT, "0", EditorType.TIME.value); | |||||
public static DataTypeBean DATETIME = instance.addEnum("datetime", "日期时间型", "bigint", 0, "long", "Long", Types.BIGINT, "0", EditorType.DATETIME.value); | |||||
@Override | @Override | ||||
protected DataTypeBean buildBean(String value, String name) { | protected DataTypeBean buildBean(String value, String name) { | ||||
return null; | return null; | ||||
} | } | ||||
public DataTypeBean addEnum(String value, String name, String sqlType, int dataLength, String javaType, int type, String defaultValue, String editor) { | |||||
final DataTypeBean bean = new DataTypeBean(value, name, sqlType, dataLength, javaType, type, defaultValue, editor); | |||||
public DataTypeBean addEnum(String value, String name, String sqlType, int dataLength, String javaType, String shortJavaType, int type, String defaultValue, String editor) { | |||||
final DataTypeBean bean = new DataTypeBean(value, name, sqlType, dataLength, javaType, shortJavaType, type, defaultValue, editor); | |||||
mapAll.put(value, bean); | mapAll.put(value, bean); | ||||
return bean; | return bean; | ||||
} | } | ||||
@@ -1,6 +1,7 @@ | |||||
package cc.smtweb.framework.core.db.vo; | package cc.smtweb.framework.core.db.vo; | ||||
import lombok.Data; | import lombok.Data; | ||||
import org.apache.commons.codec.digest.DigestUtils; | |||||
/** | /** | ||||
* 索引定义 {name:"索引名称,如idx_t1", fields:"字段,如f1,f2", type="索引类别:P-主键 I-一般索引 U-唯一索引"} | * 索引定义 {name:"索引名称,如idx_t1", fields:"字段,如f1,f2", type="索引类别:P-主键 I-一般索引 U-唯一索引"} | ||||
@@ -12,10 +13,13 @@ public class ModelIndex { | |||||
public static final String TYPE_UNIQUE = "U"; | public static final String TYPE_UNIQUE = "U"; | ||||
private String type; | private String type; | ||||
private String name; | |||||
private String fields; | private String fields; | ||||
public boolean isUnique() { | public boolean isUnique() { | ||||
return TYPE_UNIQUE.equals(type); | return TYPE_UNIQUE.equals(type); | ||||
} | } | ||||
public String getName() { | |||||
return DigestUtils.md5Hex(fields).substring(0, 16); | |||||
} | |||||
} | } |
@@ -10,11 +10,5 @@ import org.springframework.stereotype.Component; | |||||
public class BpmConfigBean { | public class BpmConfigBean { | ||||
// 是否debug模式 | // 是否debug模式 | ||||
private boolean debug; | private boolean debug; | ||||
private boolean codeBuild; | |||||
private String codeVuePath; | |||||
private String codeVueDir; | |||||
private String codeJavaPath; | private String codeJavaPath; | ||||
private String codeJavaPackage; | |||||
/** UI控件扩展定义路径 */ | |||||
private String configUiPath; | |||||
} | } |
@@ -3,93 +3,109 @@ package cc.smtweb.system.bpm.util; | |||||
import org.apache.commons.lang3.StringUtils; | import org.apache.commons.lang3.StringUtils; | ||||
public class CodeGenUtil { | public class CodeGenUtil { | ||||
private CodeGenUtil() {} | |||||
private CodeGenUtil() { | |||||
} | |||||
/*** | |||||
* 下划线命名转为驼峰命名 | |||||
* | |||||
* @param para | |||||
* 下划线命名的字符串 | |||||
*/ | |||||
public static String underlineToHump(String para){ | |||||
StringBuilder result=new StringBuilder(); | |||||
String[] a = para.split("_"); | |||||
for(String s:a){ | |||||
if(result.length() == 0){ | |||||
result.append(s.toLowerCase()); | |||||
}else{ | |||||
result.append(s.substring(0, 1).toUpperCase()); | |||||
result.append(s.substring(1).toLowerCase()); | |||||
} | |||||
/*** | |||||
* 下划线命名转为驼峰命名 | |||||
* | |||||
* @param para | |||||
* 下划线命名的字符串 | |||||
*/ | |||||
public static String underlineToHump(String para) { | |||||
StringBuilder result = new StringBuilder(); | |||||
String[] a = para.split("_"); | |||||
for (String s : a) { | |||||
if (result.length() == 0) { | |||||
result.append(s.toLowerCase()); | |||||
} else { | |||||
result.append(s.substring(0, 1).toUpperCase()); | |||||
result.append(s.substring(1).toLowerCase()); | |||||
} | |||||
} | |||||
return result.toString(); | |||||
} | } | ||||
return result.toString(); | |||||
} | |||||
/*** | |||||
* 下划线命名转为大写驼峰命名 | |||||
* 大驼峰式命名法(upper camel case) | |||||
* | |||||
* @param para | |||||
* 下划线命名的字符串 | |||||
*/ | |||||
public static String underlineToUpperHump(String para){ | |||||
StringBuilder result=new StringBuilder(); | |||||
String[] a = para.split("_"); | |||||
for(String s : a){ | |||||
result.append(s.substring(0, 1).toUpperCase()); | |||||
result.append(s.substring(1).toLowerCase()); | |||||
/*** | |||||
* 下划线命名转为大写驼峰命名 | |||||
* 大驼峰式命名法(upper camel case) | |||||
* | |||||
* @param para | |||||
* 下划线命名的字符串 | |||||
*/ | |||||
public static String underlineToUpperHump(String para) { | |||||
StringBuilder result = new StringBuilder(); | |||||
String[] a = para.split("_"); | |||||
for (String s : a) { | |||||
result.append(s.substring(0, 1).toUpperCase()); | |||||
result.append(s.substring(1).toLowerCase()); | |||||
} | |||||
return result.toString(); | |||||
} | } | ||||
return result.toString(); | |||||
} | |||||
/*** | |||||
* 驼峰命名转为下划线命名 | |||||
* | |||||
* @param para | |||||
* 驼峰命名的字符串 | |||||
*/ | |||||
public static String humpToUnderline(String para){ | |||||
return humpTo(para, "_"); | |||||
} | |||||
/*** | |||||
* 驼峰命名转为下划线命名 | |||||
* | |||||
* @param para | |||||
* 驼峰命名的字符串 | |||||
*/ | |||||
public static String humpToUnderline(String para) { | |||||
return humpTo(para, "_"); | |||||
} | |||||
private static String humpTo(String para, String splitChar){ | |||||
StringBuilder sb = new StringBuilder(para); | |||||
//偏移量,第i个下划线的位置是 当前的位置+ 偏移量(i-1),第一个下划线偏移量是0 | |||||
int temp=0; | |||||
for(int i=0;i<para.length();i++){ | |||||
if(Character.isUpperCase(para.charAt(i))){ | |||||
sb.insert(i+temp, splitChar); | |||||
temp+=1; | |||||
} | |||||
private static String humpTo(String para, String splitChar) { | |||||
StringBuilder sb = new StringBuilder(para); | |||||
//偏移量,第i个下划线的位置是 当前的位置+ 偏移量(i-1),第一个下划线偏移量是0 | |||||
int temp = 0; | |||||
for (int i = 0; i < para.length(); i++) { | |||||
if (Character.isUpperCase(para.charAt(i))) { | |||||
sb.insert(i + temp, splitChar); | |||||
temp += 1; | |||||
} | |||||
} | |||||
return sb.toString().toLowerCase(); | |||||
} | } | ||||
return sb.toString().toLowerCase(); | |||||
} | |||||
/*** | |||||
* 驼峰命名转为横线线命名 | |||||
* | |||||
* @param para | |||||
* 驼峰命名的字符串 | |||||
*/ | |||||
public static String humpToDash(String para){ | |||||
return humpTo(para, "-"); | |||||
} | |||||
/*** | |||||
* 驼峰命名转为横线线命名 | |||||
* | |||||
* @param para | |||||
* 驼峰命名的字符串 | |||||
*/ | |||||
public static String humpToDash(String para) { | |||||
return humpTo(para, "-"); | |||||
} | |||||
/** 大驼峰转小驼峰 */ | |||||
public static String toLowerHump(String name) { | |||||
if (StringUtils.isNotBlank(name)) { | |||||
return Character.toLowerCase(name.charAt(0)) + name.substring(1); | |||||
/** | |||||
* 大驼峰转小驼峰 | |||||
*/ | |||||
public static String toLowerHump(String name) { | |||||
if (StringUtils.isNotBlank(name)) { | |||||
return Character.toLowerCase(name.charAt(0)) + name.substring(1); | |||||
} | |||||
return ""; | |||||
} | } | ||||
return ""; | |||||
} | |||||
/** | |||||
* 小驼峰转大驼峰 | |||||
*/ | |||||
public static String toUpperHump(String name) { | |||||
if (StringUtils.isNotBlank(name)) { | |||||
return Character.toUpperCase(name.charAt(0)) + name.substring(1); | |||||
} | |||||
/** 小驼峰转大驼峰 */ | |||||
public static String toUpperHump(String name) { | |||||
if (StringUtils.isNotBlank(name)) { | |||||
return Character.toUpperCase(name.charAt(0)) + name.substring(1); | |||||
return ""; | |||||
} | } | ||||
return ""; | |||||
} | |||||
public static String getBeanName(String tableName) { | |||||
StringBuilder result = new StringBuilder(); | |||||
String[] a = tableName.split("_"); | |||||
for (int i = 1, len = a.length; i < len; i++) { | |||||
String s = a[i]; | |||||
result.append(s.substring(0, 1).toUpperCase()); | |||||
result.append(s.substring(1).toLowerCase()); | |||||
} | |||||
return result.toString(); | |||||
} | |||||
} | } |
@@ -1,12 +1,20 @@ | |||||
package cc.smtweb.system.bpm.util; | package cc.smtweb.system.bpm.util; | ||||
import cc.smtweb.framework.core.common.SwEnum; | |||||
import cc.smtweb.framework.core.common.SwException; | import cc.smtweb.framework.core.common.SwException; | ||||
import cc.smtweb.framework.core.common.SwMap; | import cc.smtweb.framework.core.common.SwMap; | ||||
import cc.smtweb.framework.core.db.DbEngine; | import cc.smtweb.framework.core.db.DbEngine; | ||||
import cc.smtweb.framework.core.db.cache.ModelTableCache; | |||||
import cc.smtweb.framework.core.db.vo.ModelField; | |||||
import cc.smtweb.framework.core.db.vo.ModelTable; | |||||
import cc.smtweb.framework.core.util.DateUtil; | |||||
import freemarker.template.Configuration; | import freemarker.template.Configuration; | ||||
import freemarker.template.Template; | import freemarker.template.Template; | ||||
import freemarker.template.TemplateMethodModelEx; | import freemarker.template.TemplateMethodModelEx; | ||||
import freemarker.template.TemplateModelException; | import freemarker.template.TemplateModelException; | ||||
import org.apache.commons.io.IOUtils; | |||||
import org.apache.commons.lang3.StringUtils; | |||||
import sun.nio.ch.IOUtil; | |||||
import java.io.*; | import java.io.*; | ||||
import java.nio.charset.StandardCharsets; | import java.nio.charset.StandardCharsets; | ||||
@@ -21,6 +29,9 @@ import java.util.Map; | |||||
*/ | */ | ||||
public class CodeGenerator { | public class CodeGenerator { | ||||
private final static String KEY_MODEL = "model"; | private final static String KEY_MODEL = "model"; | ||||
private final static String TEMPLATE_JAVA_BEAN = "java_bean"; | |||||
private final static String TEMPLATE_JAVA_CACHE = "java_cache"; | |||||
private final static String TEMPLATE_JAVA_SERVICE = "java_service"; | |||||
private static CodeGenerator instance = null; | private static CodeGenerator instance = null; | ||||
private Configuration configuration = null; | private Configuration configuration = null; | ||||
@@ -69,16 +80,24 @@ public class CodeGenerator { | |||||
} | } | ||||
} | } | ||||
public void generate(Map<String, Object> model, String templateName, OutputStream out) { | |||||
public void generate(Map<String, Object> model, String templateName, String fileName) { | |||||
File file = new File(fileName); | |||||
if (file.exists()) file.delete(); | |||||
FileOutputStream out = null; | |||||
try { | try { | ||||
file.createNewFile(); | |||||
out = new FileOutputStream(fileName); | |||||
initModel(model); | initModel(model); | ||||
Template template = configuration.getTemplate(templateName, StandardCharsets.UTF_8.toString()); | |||||
Template template = configuration.getTemplate(templateName + ".ftl", StandardCharsets.UTF_8.toString()); | |||||
template.setOutputEncoding(encode); | template.setOutputEncoding(encode); | ||||
template.process(model, new OutputStreamWriter(out, encode)); | template.process(model, new OutputStreamWriter(out, encode)); | ||||
out.close(); | |||||
out.flush(); | |||||
} catch (Exception e) { | } catch (Exception e) { | ||||
e.printStackTrace(); | |||||
throw new SwException(e); | |||||
throw new SwException("生成代码失败!", e); | |||||
} finally { | |||||
IOUtils.closeQuietly(out); | |||||
} | } | ||||
} | } | ||||
@@ -88,6 +107,18 @@ public class CodeGenerator { | |||||
return out.getBuffer().toString(); | return out.getBuffer().toString(); | ||||
} | } | ||||
public void generateBean(Map<String, Object> model, String fileName) { | |||||
generate(model, TEMPLATE_JAVA_BEAN, fileName); | |||||
} | |||||
public void generateCache(Map<String, Object> model, String fileName) { | |||||
generate(model, TEMPLATE_JAVA_CACHE, fileName); | |||||
} | |||||
public void generateService(Map<String, Object> model, String fileName) { | |||||
generate(model, TEMPLATE_JAVA_SERVICE, fileName); | |||||
} | |||||
/** | /** | ||||
* 获取单实例 | * 获取单实例 | ||||
* | * | ||||
@@ -110,6 +141,7 @@ public class CodeGenerator { | |||||
} | } | ||||
} | } | ||||
/* | /* | ||||
{param:{pa:"aaa"}, | {param:{pa:"aaa"}, | ||||
layout:{ | layout:{ | ||||
@@ -0,0 +1,73 @@ | |||||
package cc.smtweb.system.bpm.util; | |||||
import cc.smtweb.framework.core.common.SwMap; | |||||
import com.fasterxml.jackson.annotation.JsonIgnoreProperties; | |||||
import com.fasterxml.jackson.dataformat.xml.annotation.JacksonXmlElementWrapper; | |||||
import com.fasterxml.jackson.dataformat.xml.annotation.JacksonXmlProperty; | |||||
import com.fasterxml.jackson.dataformat.xml.annotation.JacksonXmlRootElement; | |||||
import lombok.Data; | |||||
import org.apache.commons.io.FileUtils; | |||||
import java.io.File; | |||||
import java.io.InputStream; | |||||
import java.net.MalformedURLException; | |||||
import java.util.ArrayList; | |||||
import java.util.HashMap; | |||||
import java.util.List; | |||||
import java.util.Map; | |||||
/** | |||||
* Created by Akmm at 14-2-14 上午10:13 | |||||
* 读取Idea信息的工具类 | |||||
*/ | |||||
public class IdeaUtil { | |||||
//获取工程中的Module文件 | |||||
public static Map<String, String> getModules(String ideaPath) { | |||||
Map<String, String> map = new HashMap<>(); | |||||
IdeaProject project = XmlUtil.readValue(new File(ideaPath + "/.idea/modules.xml"), IdeaProject.class); | |||||
if (project == null || project.component == null || project.component.modules == null) return map; | |||||
for (Module module: project.component.modules) { | |||||
String s = module.filepath.replace("$PROJECT_DIR$", ideaPath); | |||||
File f = new File(s); | |||||
s = f.getName(); | |||||
int i = s.lastIndexOf("."); | |||||
if (i >= 0) s = s.substring(0, i); | |||||
map.put(s, f.getParent()); | |||||
} | |||||
return map; | |||||
} | |||||
public static void main(String args[]) throws Exception { | |||||
Map<String, String> list = getModules("e:/jujia/git/6.0/smtweb2/smtweb-framework"); | |||||
for (Map.Entry<String, String> s : list.entrySet()) { | |||||
System.out.println(s.getKey() + "=" + s.getValue()); | |||||
} | |||||
} | |||||
@Data | |||||
@JsonIgnoreProperties(ignoreUnknown = true) | |||||
@JacksonXmlRootElement(localName = "project") | |||||
public static class IdeaProject { | |||||
private Component component; | |||||
} | |||||
@Data | |||||
@JsonIgnoreProperties(ignoreUnknown = true) | |||||
static class Component { | |||||
@JacksonXmlElementWrapper(localName = "modules") | |||||
@JacksonXmlProperty(localName = "module") | |||||
public List<Module> modules; | |||||
} | |||||
@Data | |||||
@JsonIgnoreProperties(ignoreUnknown = true) | |||||
static class Module { | |||||
@JacksonXmlProperty | |||||
private String fileurl; | |||||
@JacksonXmlProperty | |||||
private String filepath; | |||||
} | |||||
} |
@@ -34,6 +34,18 @@ public class XmlUtil { | |||||
} | } | ||||
} | } | ||||
public static <T> T readValue(File file, Class<T> clazz) { | |||||
try { | |||||
if (file == null || !file.exists()) { | |||||
return null; | |||||
} else { | |||||
return OBJECT_MAPPER.readValue(file, clazz); | |||||
} | |||||
} catch (Exception e) { | |||||
throw new JsonParseException("can't convert this json to " + clazz + " type", e); | |||||
} | |||||
} | |||||
public static <T> T readValue(InputStream is, Class<T> clazz) { | public static <T> T readValue(InputStream is, Class<T> clazz) { | ||||
try { | try { | ||||
if (is == null) { | if (is == null) { | ||||
@@ -0,0 +1,163 @@ | |||||
package cc.smtweb.system.bpm.web.design.form; | |||||
import cc.smtweb.framework.core.common.R; | |||||
import cc.smtweb.framework.core.common.SwEnum; | |||||
import cc.smtweb.framework.core.common.SwException; | |||||
import cc.smtweb.framework.core.common.SwMap; | |||||
import cc.smtweb.framework.core.db.cache.ModelTableCache; | |||||
import cc.smtweb.framework.core.db.vo.ModelCache; | |||||
import cc.smtweb.framework.core.db.vo.ModelField; | |||||
import cc.smtweb.framework.core.db.vo.ModelProject; | |||||
import cc.smtweb.framework.core.db.vo.ModelTable; | |||||
import cc.smtweb.framework.core.mvc.service.AbstractHandler; | |||||
import cc.smtweb.framework.core.util.CommUtil; | |||||
import cc.smtweb.framework.core.util.DateUtil; | |||||
import cc.smtweb.framework.core.util.MapUtil; | |||||
import cc.smtweb.framework.core.util.SpringUtil; | |||||
import cc.smtweb.system.bpm.spring.BpmConfigBean; | |||||
import cc.smtweb.system.bpm.util.CodeGenUtil; | |||||
import cc.smtweb.system.bpm.util.CodeGenerator; | |||||
import cc.smtweb.system.bpm.util.IdeaUtil; | |||||
import cc.smtweb.system.bpm.web.design.db.ModelCatalogCache; | |||||
import cc.smtweb.system.bpm.web.design.db.ModelProjectCache; | |||||
import org.apache.commons.lang3.StringUtils; | |||||
import java.io.File; | |||||
import java.util.ArrayList; | |||||
import java.util.List; | |||||
import java.util.Map; | |||||
/** | |||||
* Created by Akmm at 2022/6/14 20:11 | |||||
* 生成代码 | |||||
*/ | |||||
public class CodeBuildHandler extends AbstractHandler { | |||||
private static final String SRC_MAIN_JAVA = "/src/main/java/"; | |||||
private static final String SRC_MAIN_RES = "/src/main/resources"; | |||||
private String userName; | |||||
//java文件所在路径 | |||||
private String codeJavaPath; | |||||
private String packageName; | |||||
private BpmConfigBean bpmConfigBean; | |||||
public R buildJavaCode() { | |||||
userName = String.valueOf(us.getUserId()); | |||||
//页面id | |||||
long pageId = params.readLong("pageId"); | |||||
//是否需要创建服务 | |||||
boolean needBuildService = params.readBool("service"); | |||||
//实体相关 | |||||
List<Map<String, Object>> tables = params.readListMap("table"); | |||||
buildCodeJavaPath(pageId); | |||||
for (Map<String, Object> map : tables) { | |||||
long tableId = MapUtil.readLong(map, "tableId"); | |||||
buildJavaTable(tableId, MapUtil.readBool(map, "bean"), MapUtil.readBool(map, "cache")); | |||||
} | |||||
if (needBuildService) buildJavaService(pageId); | |||||
return R.success(); | |||||
} | |||||
/** | |||||
* 构建java代码路径 | |||||
* | |||||
* @param pageId 页面id | |||||
*/ | |||||
private void buildCodeJavaPath(long pageId) { | |||||
ModelForm form = ModelFormCache.getInstance().get(pageId); | |||||
if (form == null) throw new SwException("未找到指定的页面定义!"); | |||||
String moduleName = ModelProjectCache.getInstance().getModule(form.getPrjId()); | |||||
if (StringUtils.isEmpty(moduleName) || moduleName.equals("sys") || moduleName.equals("bpm")) { | |||||
moduleName = "sw-system-bpm"; | |||||
packageName = "cc.smtweb.system.bpm.web"; | |||||
} else { | |||||
packageName = "cc.smtweb.biz." + moduleName + ".web"; | |||||
} | |||||
BpmConfigBean bpmConfigBean = SpringUtil.getBean(BpmConfigBean.class); | |||||
Map<String, String> mapIdeaModules = IdeaUtil.getModules(bpmConfigBean.getCodeJavaPath()); | |||||
if (mapIdeaModules == null || mapIdeaModules.isEmpty()) throw new SwException("没有定义idea项目的路径!"); | |||||
codeJavaPath = mapIdeaModules.get(moduleName); | |||||
if (StringUtils.isEmpty(codeJavaPath)) { | |||||
throw new SwException("没有找到对应项目在idea中Module的路径!"); | |||||
} | |||||
codeJavaPath += "/src/main/java/"; | |||||
//加上目录 | |||||
String cn = ModelCatalogCache.getInstance().getFullName(form.getMcId()); | |||||
if (StringUtils.isNotEmpty(cn)) { | |||||
packageName += "." + cn; | |||||
} | |||||
codeJavaPath += packageName.replaceAll("\\.", "/"); | |||||
new File(codeJavaPath).mkdirs(); | |||||
} | |||||
/** | |||||
* 生成bean | |||||
* | |||||
* @param tableId | |||||
*/ | |||||
private void buildJavaTable(long tableId, boolean needBean, boolean needCache) { | |||||
ModelTable table = ModelTableCache.getInstance().get(tableId); | |||||
if (table == null) throw new SwException("没有找到对应的表定义!"); | |||||
SwMap model = new SwMap(); | |||||
model.put("user", userName); | |||||
model.put("sysTime", DateUtil.nowDateTime()); | |||||
model.put("packageName", packageName); | |||||
model.put("tableName", table.getName()); | |||||
model.put("tableTitle", table.getTitle()); | |||||
final String beanName = CodeGenUtil.getBeanName(table.getName()); | |||||
model.put("beanName", beanName); | |||||
if (needBean) { | |||||
List<SwMap> fields = new ArrayList<>(); | |||||
model.put("fields", fields); | |||||
for (ModelField field : table.getFields()) { | |||||
SwMap fn = new SwMap(); | |||||
fields.add(fn); | |||||
fn.put("name", field.getName()); | |||||
fn.put("title", field.getTitle()); | |||||
fn.put("javaName", CodeGenUtil.getBeanName(field.getName())); | |||||
SwEnum.DataTypeBean dtb = SwEnum.DataType.instance.getByValue(field.getDataType()); | |||||
fn.put("javaType", dtb.javaType); | |||||
fn.put("shortJavaType", dtb.shortJavaType); | |||||
} | |||||
CodeGenerator.getInstance().generateBean(model, codeJavaPath + "/" + beanName + ".java"); | |||||
} | |||||
if (needCache) { | |||||
if (!table.isNeedCache()) throw new SwException("表设置为不需要缓存!" + table.getTitle()); | |||||
List<SwMap> caches = new ArrayList<>(); | |||||
model.put("caches", caches); | |||||
for (ModelCache cache : table.getCaches()) { | |||||
SwMap fn = new SwMap(); | |||||
caches.add(fn); | |||||
final String name = cache.getName(); | |||||
fn.put("name", name); | |||||
fn.put("nameUF", CodeGenUtil.toUpperHump(name)); | |||||
fn.put("title", cache.getTitle()); | |||||
fn.put("fields", cache.getFields()); | |||||
} | |||||
CodeGenerator.getInstance().generateCache(model, codeJavaPath + "/" + beanName + "Cache.java"); | |||||
} | |||||
} | |||||
private void buildJavaService(long pageId) { | |||||
ModelForm form = ModelFormCache.getInstance().get(pageId); | |||||
String sName = form.getService(); | |||||
if (StringUtils.isEmpty(sName)) throw new SwException("页面设置未定义服务名!" + form.getTitle()); | |||||
sName = CodeGenUtil.toUpperHump(sName); | |||||
SwMap model = new SwMap(); | |||||
model.put("user", userName); | |||||
model.put("sysTime", DateUtil.nowDateTime()); | |||||
model.put("packageName", packageName); | |||||
model.put("formTitle", form.getTitle()); | |||||
CodeGenerator.getInstance().generateService(model, codeJavaPath + "/" + sName + "Service.java"); | |||||
} | |||||
} |
@@ -2,6 +2,7 @@ package cc.smtweb.system.bpm.web.design.form; | |||||
import cc.smtweb.framework.core.annotation.SwCache; | import cc.smtweb.framework.core.annotation.SwCache; | ||||
import cc.smtweb.framework.core.cache.AbstractCache; | import cc.smtweb.framework.core.cache.AbstractCache; | ||||
import cc.smtweb.framework.core.cache.AbstractEntityCache; | |||||
import cc.smtweb.framework.core.cache.CacheManager; | import cc.smtweb.framework.core.cache.CacheManager; | ||||
import cc.smtweb.framework.core.common.SwConsts; | import cc.smtweb.framework.core.common.SwConsts; | ||||
import cc.smtweb.framework.core.db.DbEngine; | import cc.smtweb.framework.core.db.DbEngine; | ||||
@@ -16,7 +17,7 @@ import java.util.Set; | |||||
* Created by Akmm at 2022/1/12 18:34 | * Created by Akmm at 2022/1/12 18:34 | ||||
*/ | */ | ||||
@SwCache(ident = "ASP_MODEL_FORM", title = "页面定义") | @SwCache(ident = "ASP_MODEL_FORM", title = "页面定义") | ||||
public class ModelFormCache extends AbstractCache<ModelForm> { | |||||
public class ModelFormCache extends AbstractEntityCache<ModelForm> { | |||||
private final static String mk = "k"; | private final static String mk = "k"; | ||||
private final static String mp = "prj"; | private final static String mp = "prj"; | ||||
private final static String mc = "c"; | private final static String mc = "c"; | ||||
@@ -24,6 +24,7 @@ import java.util.List; | |||||
*/ | */ | ||||
@SwService | @SwService | ||||
public class ModelFormService extends AbstractCompService { | public class ModelFormService extends AbstractCompService { | ||||
private final static String TYPE_CODE = "type_code"; | |||||
@Override | @Override | ||||
protected AbstractHandler createHandler(String type) { | protected AbstractHandler createHandler(String type) { | ||||
switch (type) { | switch (type) { | ||||
@@ -35,7 +36,8 @@ public class ModelFormService extends AbstractCompService { | |||||
return new DefaultDelHandler<ModelForm>(ModelForm.ENTITY_NAME); | return new DefaultDelHandler<ModelForm>(ModelForm.ENTITY_NAME); | ||||
case TYPE_LIST: | case TYPE_LIST: | ||||
return new DefaultListHandler<ModelForm>(ModelForm.ENTITY_NAME); | return new DefaultListHandler<ModelForm>(ModelForm.ENTITY_NAME); | ||||
case TYPE_CODE: | |||||
return new CodeBuildHandler(); | |||||
} | } | ||||
return null; | return null; | ||||
} | } | ||||
@@ -142,4 +144,14 @@ public class ModelFormService extends AbstractCompService { | |||||
public R loadTmpls(@SwBody SwMap params, UserSession us) { | public R loadTmpls(@SwBody SwMap params, UserSession us) { | ||||
return R.success(CodeGenerator.getInstance().getModelTemplates()); | return R.success(CodeGenerator.getInstance().getModelTemplates()); | ||||
} | } | ||||
//加载模板定义 | |||||
public R buildJaveCode(@SwBody SwMap params, UserSession us) { | |||||
try { | |||||
CodeBuildHandler handler = (CodeBuildHandler) getHandler(params, us, TYPE_CODE); | |||||
return handler.buildJavaCode(); | |||||
} catch (Exception e) { | |||||
return R.error("操作失败!", e); | |||||
} | |||||
} | |||||
} | } |
@@ -5,9 +5,6 @@ smtweb: | |||||
url: http://127.0.0.1:8888/sw/files/ | url: http://127.0.0.1:8888/sw/files/ | ||||
bpm: | bpm: | ||||
debug: true | debug: true | ||||
code-build: true | |||||
code-vue-path: '/code/2021/nodejs/sw-sys-uc-vue/src/' | |||||
code-vue-dir: 'pages' | |||||
code-java-path: '/code/2021/java/sw-sys-uc/sw-sys-uc-web/src/main/java/' | code-java-path: '/code/2021/java/sw-sys-uc/sw-sys-uc-web/src/main/java/' | ||||
code-java-package: 'cc.smtweb.system.uc.web' | code-java-package: 'cc.smtweb.system.uc.web' | ||||
config-ui-path: '/code/2021/java/sw-sys-uc/sw-sys-uc-web/src/main/resources/plugin/config/' | config-ui-path: '/code/2021/java/sw-sys-uc/sw-sys-uc-web/src/main/resources/plugin/config/' | ||||
@@ -5,12 +5,7 @@ smtweb: | |||||
url: http://127.0.0.1:8888/sw/files/ | url: http://127.0.0.1:8888/sw/files/ | ||||
bpm: | bpm: | ||||
debug: true | debug: true | ||||
code-build: true | |||||
code-vue-path: '/code/2021/nodejs/sw-sys-uc-vue/src/' | |||||
code-vue-dir: 'pages' | |||||
code-java-path: '/code/2021/java/sw-sys-uc/sw-sys-uc-web/src/main/java/' | |||||
code-java-package: 'cc.smtweb.system.uc.web' | |||||
config-ui-path: '/code/2021/java/sw-sys-uc/sw-sys-uc-web/src/main/resources/plugin/config/' | |||||
code-java-path: 'e:/jujia/git/6.0/smtweb2/smtweb-framework' | |||||
db: | db: | ||||
type: mysql | type: mysql | ||||
default: | default: | ||||
@@ -0,0 +1,42 @@ | |||||
package ${packageName}; | |||||
import cc.smtweb.framework.core.annotation.SwTable; | |||||
import cc.smtweb.framework.core.common.SwMap; | |||||
import cc.smtweb.framework.core.db.impl.DefaultEntity; | |||||
/** | |||||
* Created by ${user} at ${sysTime} | |||||
* 实体【[${tableTitle}](${tableName})】的Entity类 | |||||
*/ | |||||
@SwTable("${tableName}") | |||||
public class ${beanName} extends DefaultEntity { | |||||
public static final String ENTITY_NAME = "${tableName}"; | |||||
public ${beanName}() { | |||||
super(ENTITY_NAME); | |||||
} | |||||
<#list fields as field> | |||||
<#if field.javaType == "boolean"> | |||||
/** ${field.title} */ | |||||
public boolean is${field.javaName}() { | |||||
return getBool("${field.name}"); | |||||
} | |||||
/** ${field.title} */ | |||||
public void set${javaName}(boolean ${field.name}) { | |||||
setBool("${field.name}", ${field.name}); | |||||
} | |||||
<#else > | |||||
/** ${field.title} */ | |||||
public ${field.javaType} get${field.javaName}() { | |||||
return get${field.shortJavaType}("${field.name}"); | |||||
} | |||||
/** ${field.title} */ | |||||
public void set${field.javaName}(${field.javaType} ${field.name}) { | |||||
put("${field.name}", ${field.name}); | |||||
} | |||||
</#if> | |||||
</#list> | |||||
} |
@@ -0,0 +1,51 @@ | |||||
package ${packageName}; | |||||
import cc.smtweb.framework.core.annotation.SwCache; | |||||
import cc.smtweb.framework.core.cache.AbstractEntityCache; | |||||
import cc.smtweb.framework.core.cache.CacheManager; | |||||
import java.util.ArrayList; | |||||
import java.util.Comparator; | |||||
import java.util.List; | |||||
import java.util.Set; | |||||
/** | |||||
* Created by ${user} at ${sysTime} | |||||
* 实体【[${tableTitle}](${tableName})】的缓存类 | |||||
*/ | |||||
@SwCache(ident = "${tableName}", title = "页面定义") | |||||
public class ${beanName}Cache extends AbstractEntityCache<${beanName}> { | |||||
<#list caches as cache> | |||||
//缓存key:${cache.title} | |||||
public final static String mk_${cache.name} = "${cache.name}"; | |||||
</#list> | |||||
public static ${beanName}Cache getInstance() { | |||||
return CacheManager.getIntance().getCache(${beanName}Cache.class); | |||||
} | |||||
public ${beanName}Cache() { | |||||
<#list caches as cache> | |||||
//缓存key:${cache.title} | |||||
<#if cache.type=="M"> | |||||
regMap(mk_${cache.name}, "${cache.fields}"); | |||||
<#else> | |||||
regList(mk_${cache.name}, "${cache.fields}"); | |||||
</#if> | |||||
</#list> | |||||
} | |||||
<#list caches as cache> | |||||
<#if cache.type=="M"> | |||||
//缓存key:${cache.title} | |||||
public final ${beanName} getBy${cache.nameUF}(String key) { | |||||
return getByKey(mk_${cache.name}, key); | |||||
} | |||||
<#else> | |||||
//缓存key:${cache.title} | |||||
public final Set<${beanName}> getBy${cache.nameUF}(String key) { | |||||
return getListByKey(mk_${cache.name}, key); | |||||
} | |||||
</#if> | |||||
</#list> | |||||
} |
@@ -0,0 +1,30 @@ | |||||
package ${packageName}; | |||||
import cc.smtweb.framework.core.annotation.SwBody; | |||||
import cc.smtweb.framework.core.annotation.SwService; | |||||
import cc.smtweb.framework.core.common.R; | |||||
import cc.smtweb.framework.core.common.SwMap; | |||||
import cc.smtweb.system.bpm.web.engine.dynPage.DynPageService; | |||||
import cc.smtweb.framework.core.mvc.service.AbstractHandler; | |||||
import cc.smtweb.framework.core.session.UserSession; | |||||
/** | |||||
* Created by ${user} at ${sysTime} | |||||
* 页面【[${formTitle}]的服务类 | |||||
*/ | |||||
@SwService | |||||
public class ${service}Service extends DynPageService { | |||||
//public final static String TYPE_DEMO = "demo"; | |||||
@Override | |||||
protected AbstractHandler createHandler(String type) { | |||||
return super.createHandler(type); | |||||
} | |||||
/* demo | |||||
//自定义 | |||||
public R demo(@SwBody SwMap params, UserSession us) { | |||||
return pageHandler(params, us, TYPE_DEMO, handler -> ((DemoHandler)handler).demo()); | |||||
} | |||||
*/ | |||||
} |
@@ -5,12 +5,16 @@ import cc.smtweb.framework.core.common.SwMap; | |||||
import cc.smtweb.system.bpm.spring.BpmApplication; | import cc.smtweb.system.bpm.spring.BpmApplication; | ||||
import cc.smtweb.system.bpm.web.design.form.ModelForm; | import cc.smtweb.system.bpm.web.design.form.ModelForm; | ||||
import cc.smtweb.system.bpm.web.design.form.ModelFormHelper; | import cc.smtweb.system.bpm.web.design.form.ModelFormHelper; | ||||
import cc.smtweb.system.bpm.web.design.form.ModelFormService; | |||||
import cc.smtweb.system.bpm.web.engine.dynPage.DynPageService; | import cc.smtweb.system.bpm.web.engine.dynPage.DynPageService; | ||||
import org.junit.Test; | import org.junit.Test; | ||||
import org.junit.runner.RunWith; | import org.junit.runner.RunWith; | ||||
import org.springframework.boot.test.context.SpringBootTest; | import org.springframework.boot.test.context.SpringBootTest; | ||||
import org.springframework.test.context.junit4.SpringRunner; | import org.springframework.test.context.junit4.SpringRunner; | ||||
import java.util.ArrayList; | |||||
import java.util.List; | |||||
/** | /** | ||||
* Created by Akmm at 2022/4/26 9:46 | * Created by Akmm at 2022/4/26 9:46 | ||||
*/ | */ | ||||
@@ -72,4 +76,23 @@ public class ModelFormTest { | |||||
ModelFormHelper.buildSaveModelByTmpl(form, "model_simple"); | ModelFormHelper.buildSaveModelByTmpl(form, "model_simple"); | ||||
System.out.println(form.getContent()); | System.out.println(form.getContent()); | ||||
} | } | ||||
@Test | |||||
public void testBuildJavaBean() { | |||||
//{pageId,dataset:"", data:{form:{},list: {total:0,rows:[]}}, filter:{}} | |||||
SwMap params = new SwMap(); | |||||
params.put("pageId", 718479207767740416L); | |||||
params.put("service", true); | |||||
List<SwMap> table = new ArrayList<>(); | |||||
params.put("table", table); | |||||
SwMap map = new SwMap(); | |||||
map.put("tableId", 718391823709507584L); | |||||
map.put("bean", true); | |||||
map.put("cache", true); | |||||
table.add(map); | |||||
ModelFormService service = new ModelFormService(); | |||||
R r = service.buildJaveCode(params, null); | |||||
System.out.println(r.readSuccess()); | |||||
} | |||||
} | } |