From 4626bd13933dcf1cf57d778a60e649fe16cd8650 Mon Sep 17 00:00:00 2001 From: zhenggm Date: Wed, 9 Mar 2022 19:02:56 +0800 Subject: [PATCH] =?UTF-8?q?=E5=88=9D=E5=A7=8B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/cc/smtweb/framework/core/db/DbEngine.java | 10 ++- .../cc/smtweb/framework/core/db/EntityDao.java | 27 ++++--- .../framework/core/db/cache/ModelTableCache.java | 2 + .../framework/core/db/dao/AbstractEntityDao.java | 11 ++- .../cc/smtweb/framework/core/db/impl/BaseBean.java | 7 +- .../smtweb/framework/core/db/jdbc/JdbcEngine.java | 4 + .../cc/smtweb/framework/core/db/vo/ModelField.java | 4 + .../cc/smtweb/framework/core/db/vo/ModelIndex.java | 4 + .../cc/smtweb/framework/core/db/vo/ModelTable.java | 5 ++ .../mvc/controller/scan/ApplicationScanner.java | 3 +- .../core/mvc/controller/scan/BeanManager.java | 24 +++++- .../core/mvc/controller/scan/ClassParser.java | 45 ++++++----- .../core/mvc/service/AbstractCompProvider.java | 24 ++++++ .../core/mvc/service/AbstractCompService.java | 50 ++++++++++++ .../core/mvc/service/AbstractDelHandler.java | 52 +++++++++++++ .../core/mvc/service/AbstractLoadHandler.java | 39 ++++++++++ .../core/mvc/service/AbstractSaveHandler.java | 65 ++++++++++++++++ .../core/mvc/service/DefaultDelHandler.java | 63 +++++++++++++++ .../core/mvc/service/DefaultLoadHandler.java | 26 +++++++ .../core/mvc/service/DefaultProvider.java | 21 +++++ .../core/mvc/service/DefaultSaveHandler.java | 90 ++++++++++++++++++++++ .../framework/core/mvc/service/IDataProvider.java | 8 ++ .../framework/core/mvc/service/IHandler.java | 13 ++++ .../bpm/web/design/project/ModelProject.java | 88 +++++++++++++++++++++ .../web/design/project/ModelProjectService.java | 37 +++++++++ .../cc/smtweb/system/bpm/test/BuildJavaBean.java | 59 ++++++++++++++ 26 files changed, 744 insertions(+), 37 deletions(-) create mode 100644 smtweb-framework/sw-framework-core/src/main/java/cc/smtweb/framework/core/mvc/service/AbstractCompProvider.java create mode 100644 smtweb-framework/sw-framework-core/src/main/java/cc/smtweb/framework/core/mvc/service/AbstractCompService.java create mode 100644 smtweb-framework/sw-framework-core/src/main/java/cc/smtweb/framework/core/mvc/service/AbstractDelHandler.java create mode 100644 smtweb-framework/sw-framework-core/src/main/java/cc/smtweb/framework/core/mvc/service/AbstractLoadHandler.java create mode 100644 smtweb-framework/sw-framework-core/src/main/java/cc/smtweb/framework/core/mvc/service/AbstractSaveHandler.java create mode 100644 smtweb-framework/sw-framework-core/src/main/java/cc/smtweb/framework/core/mvc/service/DefaultDelHandler.java create mode 100644 smtweb-framework/sw-framework-core/src/main/java/cc/smtweb/framework/core/mvc/service/DefaultLoadHandler.java create mode 100644 smtweb-framework/sw-framework-core/src/main/java/cc/smtweb/framework/core/mvc/service/DefaultProvider.java create mode 100644 smtweb-framework/sw-framework-core/src/main/java/cc/smtweb/framework/core/mvc/service/DefaultSaveHandler.java create mode 100644 smtweb-framework/sw-framework-core/src/main/java/cc/smtweb/framework/core/mvc/service/IDataProvider.java create mode 100644 smtweb-framework/sw-framework-core/src/main/java/cc/smtweb/framework/core/mvc/service/IHandler.java create mode 100644 smtweb-system/sw-system-bpm/src/main/java/cc/smtweb/system/bpm/web/design/project/ModelProject.java create mode 100644 smtweb-system/sw-system-bpm/src/main/java/cc/smtweb/system/bpm/web/design/project/ModelProjectService.java create mode 100644 smtweb-system/sw-system-bpm/src/test/java/cc/smtweb/system/bpm/test/BuildJavaBean.java diff --git a/smtweb-framework/sw-framework-core/src/main/java/cc/smtweb/framework/core/db/DbEngine.java b/smtweb-framework/sw-framework-core/src/main/java/cc/smtweb/framework/core/db/DbEngine.java index b0ae535..035ebb3 100644 --- a/smtweb-framework/sw-framework-core/src/main/java/cc/smtweb/framework/core/db/DbEngine.java +++ b/smtweb-framework/sw-framework-core/src/main/java/cc/smtweb/framework/core/db/DbEngine.java @@ -1,8 +1,10 @@ package cc.smtweb.framework.core.db; +import cc.smtweb.framework.core.db.impl.BaseBean; import cc.smtweb.framework.core.db.impl.DefaultEntity; import cc.smtweb.framework.core.db.jdbc.IdGenerator; import cc.smtweb.framework.core.db.jdbc.JdbcEngine; +import cc.smtweb.framework.core.mvc.controller.scan.BeanManager; import cc.smtweb.framework.core.util.SpringUtil; import lombok.extern.slf4j.Slf4j; import org.springframework.jdbc.core.JdbcTemplate; @@ -52,8 +54,12 @@ public class DbEngine extends JdbcEngine { return handler; } - public EntityDao findDao(String tableName) { - EntityDao handler = tableDaoMap.get(type); + public EntityDao findDao(String tableName) { + Class clazz = BeanManager.getInstance().getTableClass(tableName); + if (clazz != null) { + return findDao(clazz); + } + EntityDao handler = tableDaoMap.get(tableName); if (handler == null) { synchronized (tableDaoMap) { diff --git a/smtweb-framework/sw-framework-core/src/main/java/cc/smtweb/framework/core/db/EntityDao.java b/smtweb-framework/sw-framework-core/src/main/java/cc/smtweb/framework/core/db/EntityDao.java index 8731a5f..240e8f3 100644 --- a/smtweb-framework/sw-framework-core/src/main/java/cc/smtweb/framework/core/db/EntityDao.java +++ b/smtweb-framework/sw-framework-core/src/main/java/cc/smtweb/framework/core/db/EntityDao.java @@ -1,5 +1,6 @@ package cc.smtweb.framework.core.db; +import cc.smtweb.framework.core.SwException; import cc.smtweb.framework.core.db.dao.AbstractEntityDao; import cc.smtweb.framework.core.db.dao.EntityColumn; import cc.smtweb.framework.core.db.jdbc.JdbcEngine; @@ -220,16 +221,6 @@ public class EntityDao extends AbstractEntityDao { } /** - * 读取实体对象ID值 - * - * @param entity - * @return - */ - public Long readEntityId(T entity) { - return (Long) readId(entity); - } - - /** * 查询单行数据,返回bean */ public T queryEntity(Long id) { @@ -278,4 +269,20 @@ public class EntityDao extends AbstractEntityDao { return jdbcEngine.query(sb.toString(), type, params); } + + + public void checkUnique(T bean, String... fields) { + if (fields.length == 0) return; + String ss = "", sTitle = ""; + List args = new ArrayList<>(fields.length + 1); + args.add(readId(bean)); + for (String f: fields) { + if (StringUtils.isEmpty(f)) continue; + ss += " and " + f + "=?"; + args.add(readValue(bean, f)); + sTitle += "+" + modelTable.getFieldTitle(f); + } + if (jdbcEngine.isExists("select 1 from " + tableName + " where " + modelTable.getIdField() + "=? " + ss, args.toArray())) + throw new SwException(sTitle.substring(1) + " 不能重复!"); + } } diff --git a/smtweb-framework/sw-framework-core/src/main/java/cc/smtweb/framework/core/db/cache/ModelTableCache.java b/smtweb-framework/sw-framework-core/src/main/java/cc/smtweb/framework/core/db/cache/ModelTableCache.java index bd068b6..e2e270c 100644 --- a/smtweb-framework/sw-framework-core/src/main/java/cc/smtweb/framework/core/db/cache/ModelTableCache.java +++ b/smtweb-framework/sw-framework-core/src/main/java/cc/smtweb/framework/core/db/cache/ModelTableCache.java @@ -21,6 +21,7 @@ import java.util.Set; public class ModelTableCache extends AbstractCache { private final static String mk = "k"; private final static String md = "d"; + private final static String mf = "l"; public static ModelTableCache getInstance() { return CacheManager.getIntance().getCache(ModelTableCache.class); @@ -29,6 +30,7 @@ public class ModelTableCache extends AbstractCache { public ModelTableCache() { regMap(mk, k-> k.getName().toUpperCase()); regList(md, k-> String.valueOf(k.getDatabaseId())); + regList(mf, k-> k.get); } @Override diff --git a/smtweb-framework/sw-framework-core/src/main/java/cc/smtweb/framework/core/db/dao/AbstractEntityDao.java b/smtweb-framework/sw-framework-core/src/main/java/cc/smtweb/framework/core/db/dao/AbstractEntityDao.java index 4492db7..affb3fb 100644 --- a/smtweb-framework/sw-framework-core/src/main/java/cc/smtweb/framework/core/db/dao/AbstractEntityDao.java +++ b/smtweb-framework/sw-framework-core/src/main/java/cc/smtweb/framework/core/db/dao/AbstractEntityDao.java @@ -84,7 +84,7 @@ public abstract class AbstractEntityDao { */ public AbstractEntityDao(String tableName) { this.tableName = tableName; - this.type = (Class)DefaultEntity.class; + this.type = (Class) DefaultEntity.class; modelTable = cacheManager.getCache(ModelTableCache.class).getByName(tableName); for (ModelField field : modelTable.getFields()) { @@ -94,7 +94,8 @@ public abstract class AbstractEntityDao { /** * 根据字段名,得到类中的字段属性名 - * @param tbAbbr 表缩写,一般是字段的前缀 + * + * @param tbAbbr 表缩写,一般是字段的前缀 * @param fieldName 字段名 * @return */ @@ -305,7 +306,7 @@ public abstract class AbstractEntityDao { sql.append("DELETE FROM ").append(tableName).append(" WHERE ").append(idColumn.getField().getName()).append("=?"); } - private Object readValue(T obj, String fieldName) { + protected Object readValue(T obj, String fieldName) { EntityColumn beanColumn = getBeanColumn(fieldName); return beanColumn.readValue(obj); @@ -379,5 +380,9 @@ public abstract class AbstractEntityDao { return (Long) idColumn.readValue(entity); } + + public T createBean() throws Exception { + return this.type.newInstance(); + } } diff --git a/smtweb-framework/sw-framework-core/src/main/java/cc/smtweb/framework/core/db/impl/BaseBean.java b/smtweb-framework/sw-framework-core/src/main/java/cc/smtweb/framework/core/db/impl/BaseBean.java index 3053b44..e35dad6 100644 --- a/smtweb-framework/sw-framework-core/src/main/java/cc/smtweb/framework/core/db/impl/BaseBean.java +++ b/smtweb-framework/sw-framework-core/src/main/java/cc/smtweb/framework/core/db/impl/BaseBean.java @@ -1,5 +1,6 @@ package cc.smtweb.framework.core.db.impl; +import cc.smtweb.framework.core.SwMap; import cc.smtweb.framework.core.util.JsonUtil; import cc.smtweb.framework.core.util.NumberUtil; import com.fasterxml.jackson.databind.JsonNode; @@ -89,10 +90,14 @@ public class BaseBean implements Serializable { return this.data.get(fieldName); } - public void readFromJson(String json){ + public void readFromJson(String json) { Map map = JsonUtil.parseMap(json); if (map != null) { data.putAll(map); } } + + public void readFromMap(SwMap map) { + data.putAll(map); + } } diff --git a/smtweb-framework/sw-framework-core/src/main/java/cc/smtweb/framework/core/db/jdbc/JdbcEngine.java b/smtweb-framework/sw-framework-core/src/main/java/cc/smtweb/framework/core/db/jdbc/JdbcEngine.java index 5016a50..18d0a71 100644 --- a/smtweb-framework/sw-framework-core/src/main/java/cc/smtweb/framework/core/db/jdbc/JdbcEngine.java +++ b/smtweb-framework/sw-framework-core/src/main/java/cc/smtweb/framework/core/db/jdbc/JdbcEngine.java @@ -388,6 +388,10 @@ public class JdbcEngine { return jdbcTemplate.query(sql + " LIMIT " + start + "," + limit, createRowMapper(type)); } + public boolean isExists(String sql, Object... params) { + return jdbcTemplate.queryForObject(sql + " LIMIT 0, 1", int.class, params) > 0; + } + private RowMapper createRowMapper(Class type) { RowMapper rowMapper; if (java.util.Map.class.isAssignableFrom(type)) { diff --git a/smtweb-framework/sw-framework-core/src/main/java/cc/smtweb/framework/core/db/vo/ModelField.java b/smtweb-framework/sw-framework-core/src/main/java/cc/smtweb/framework/core/db/vo/ModelField.java index d36ba95..cd0fe35 100644 --- a/smtweb-framework/sw-framework-core/src/main/java/cc/smtweb/framework/core/db/vo/ModelField.java +++ b/smtweb-framework/sw-framework-core/src/main/java/cc/smtweb/framework/core/db/vo/ModelField.java @@ -35,4 +35,8 @@ public class ModelField { private String link; //控件类型:TEXT/TextArea/NUMBER/COMBO private String editor; + + public boolean isNotNull() { + return notNull == 1; + } } diff --git a/smtweb-framework/sw-framework-core/src/main/java/cc/smtweb/framework/core/db/vo/ModelIndex.java b/smtweb-framework/sw-framework-core/src/main/java/cc/smtweb/framework/core/db/vo/ModelIndex.java index f75cdbd..23c52d8 100644 --- a/smtweb-framework/sw-framework-core/src/main/java/cc/smtweb/framework/core/db/vo/ModelIndex.java +++ b/smtweb-framework/sw-framework-core/src/main/java/cc/smtweb/framework/core/db/vo/ModelIndex.java @@ -17,4 +17,8 @@ public class ModelIndex { private String type; private String name; private String fields; + + public boolean isUnique() { + return TYPE_UNIQUE.equals(type); + } } diff --git a/smtweb-framework/sw-framework-core/src/main/java/cc/smtweb/framework/core/db/vo/ModelTable.java b/smtweb-framework/sw-framework-core/src/main/java/cc/smtweb/framework/core/db/vo/ModelTable.java index f936ebc..1283953 100644 --- a/smtweb-framework/sw-framework-core/src/main/java/cc/smtweb/framework/core/db/vo/ModelTable.java +++ b/smtweb-framework/sw-framework-core/src/main/java/cc/smtweb/framework/core/db/vo/ModelTable.java @@ -62,6 +62,11 @@ public class ModelTable implements Serializable { return null; } + public String getFieldTitle(String fieldName) { + ModelField field = findField(fieldName); + return field != null ? field.getTitle() : fieldName; + } + public String fullName() { return dbName + '.' + name; } diff --git a/smtweb-framework/sw-framework-core/src/main/java/cc/smtweb/framework/core/mvc/controller/scan/ApplicationScanner.java b/smtweb-framework/sw-framework-core/src/main/java/cc/smtweb/framework/core/mvc/controller/scan/ApplicationScanner.java index e018aa0..34ac3e3 100644 --- a/smtweb-framework/sw-framework-core/src/main/java/cc/smtweb/framework/core/mvc/controller/scan/ApplicationScanner.java +++ b/smtweb-framework/sw-framework-core/src/main/java/cc/smtweb/framework/core/mvc/controller/scan/ApplicationScanner.java @@ -23,7 +23,8 @@ import java.util.List; public class ApplicationScanner { public static void scan(ConfigurableApplicationContext applicationContext) throws Exception { MethodAccessManager methodAccessManager = applicationContext.getBean(MethodAccessManager.class); - BeanManager beanManager = new BeanManager(applicationContext); + BeanManager beanManager = BeanManager.getInstance(); + beanManager.install(applicationContext); String[] names = applicationContext.getBeanNamesForType(ControllerConfig.class); if (names != null) { diff --git a/smtweb-framework/sw-framework-core/src/main/java/cc/smtweb/framework/core/mvc/controller/scan/BeanManager.java b/smtweb-framework/sw-framework-core/src/main/java/cc/smtweb/framework/core/mvc/controller/scan/BeanManager.java index 3d9582d..20adc64 100644 --- a/smtweb-framework/sw-framework-core/src/main/java/cc/smtweb/framework/core/mvc/controller/scan/BeanManager.java +++ b/smtweb-framework/sw-framework-core/src/main/java/cc/smtweb/framework/core/mvc/controller/scan/BeanManager.java @@ -32,7 +32,21 @@ public class BeanManager implements IActionManager { private List destroyMethods = new ArrayList<>(); private List beanMethods = new ArrayList<>(); - BeanManager(ApplicationContext applicationContext) { + private Map> mapTableClass = new HashMap<>(); + + private static BeanManager instance = null; + static { + instance = new BeanManager(); + } + + public static BeanManager getInstance() { + return instance; + } + + private BeanManager() { + } + + public void install(ApplicationContext applicationContext) { this.applicationContext = applicationContext; beanContext = new BeanContext(beanMap, applicationContext); } @@ -127,6 +141,14 @@ public class BeanManager implements IActionManager { return this.putIfAbsent(url, methodAccess) == null; } + public void addTableClass(String tableName, Class clzz) { + mapTableClass.put(tableName, clzz); + } + + public Class getTableClass(String tableName) { + return mapTableClass.get(tableName); + } + private static class OrderMethodAccess { private final int order; private final MethodAccess methodAccess; diff --git a/smtweb-framework/sw-framework-core/src/main/java/cc/smtweb/framework/core/mvc/controller/scan/ClassParser.java b/smtweb-framework/sw-framework-core/src/main/java/cc/smtweb/framework/core/mvc/controller/scan/ClassParser.java index 692f55e..84db2a4 100644 --- a/smtweb-framework/sw-framework-core/src/main/java/cc/smtweb/framework/core/mvc/controller/scan/ClassParser.java +++ b/smtweb-framework/sw-framework-core/src/main/java/cc/smtweb/framework/core/mvc/controller/scan/ClassParser.java @@ -69,28 +69,35 @@ public class ClassParser { } else { log.error(clazz.getName() + " must be singleton, can not use field: " + singletonField.getName()); } - } else { - SwService swService = clazz.getAnnotation(SwService.class); + return; + } - if (swService != null) { - urlMaker.setServiceUrl(swService.value()); - log.debug("[smt]init service: " + clazz.getName()); + SwService swService = clazz.getAnnotation(SwService.class); + if (swService != null) { + urlMaker.setServiceUrl(swService.value()); + log.debug("[smt]init service: " + clazz.getName()); + //Service类,非单例,以免多线程并发相互干扰 + ControllerAccess controllerAccess = buildControllerAccess(clazz, false); + if (controllerAccess.isSingleton()) { + controllerAccess.newSingletonInstance(); + beanManager.addSingletonController(controllerAccess); + } - ControllerAccess controllerAccess = buildControllerAccess(clazz, false); - if (controllerAccess.isSingleton()) { - controllerAccess.newSingletonInstance(); - beanManager.addSingletonController(controllerAccess); - } + // 处理url路径 + methodParser.parse(clazz, controllerAccess, true); + return; + } - // 处理url路径 - methodParser.parse(clazz, controllerAccess, true); - } else { - SwCache swCache = clazz.getAnnotation(SwCache.class); - if (swCache != null) { - CacheManager cacheManager = CacheManager.getIntance(); - cacheManager.install((AbstractCache)clazz.newInstance()); - } - } + SwCache swCache = clazz.getAnnotation(SwCache.class); + if (swCache != null) { + CacheManager cacheManager = CacheManager.getIntance(); + cacheManager.install((AbstractCache) clazz.newInstance()); + return; + } + + SwTable swTable = clazz.getAnnotation(SwTable.class); + if (swTable != null) { + beanManager.addTableClass(swTable.value(), clazz); } } diff --git a/smtweb-framework/sw-framework-core/src/main/java/cc/smtweb/framework/core/mvc/service/AbstractCompProvider.java b/smtweb-framework/sw-framework-core/src/main/java/cc/smtweb/framework/core/mvc/service/AbstractCompProvider.java new file mode 100644 index 0000000..0185538 --- /dev/null +++ b/smtweb-framework/sw-framework-core/src/main/java/cc/smtweb/framework/core/mvc/service/AbstractCompProvider.java @@ -0,0 +1,24 @@ +package cc.smtweb.framework.core.mvc.service; + +import cc.smtweb.framework.core.db.DbEngine; +import cc.smtweb.framework.core.db.EntityDao; + +import java.util.HashMap; +import java.util.Map; + +/** + * Created by Akmm at 2022/3/3 11:13 + * 数据提供者,线程级缓存 + */ +public class AbstractCompProvider { + //临时缓存 + private Map cacheData = new HashMap<>(); + + protected T doGetData(String key, IDataProvider loader) { + cacheData.computeIfAbsent(key, s -> loader.load()); + if (!cacheData.containsKey(key)) { + cacheData.put(key, loader.load()); + } + return (T) cacheData.get(key); + } +} diff --git a/smtweb-framework/sw-framework-core/src/main/java/cc/smtweb/framework/core/mvc/service/AbstractCompService.java b/smtweb-framework/sw-framework-core/src/main/java/cc/smtweb/framework/core/mvc/service/AbstractCompService.java new file mode 100644 index 0000000..c486b63 --- /dev/null +++ b/smtweb-framework/sw-framework-core/src/main/java/cc/smtweb/framework/core/mvc/service/AbstractCompService.java @@ -0,0 +1,50 @@ +package cc.smtweb.framework.core.mvc.service; + +import cc.smtweb.framework.core.R; +import cc.smtweb.framework.core.SwMap; +import cc.smtweb.framework.core.annotation.SwBody; +import cc.smtweb.framework.core.annotation.SwService; +import cc.smtweb.framework.core.db.DbEngine; +import cc.smtweb.framework.core.db.EntityDao; +import cc.smtweb.framework.core.session.UserSession; + +import java.util.HashMap; +import java.util.Map; + +/** + * Created by Akmm at 2022/3/2 10:39 + * 通用业务mvc总调度 + */ +public abstract class AbstractCompService { + public final static String TYPE_LIST = "list"; + public final static String TYPE_LOAD = "load"; + public final static String TYPE_SAVE = "save"; + public final static String TYPE_DEL = "del"; + + protected abstract IHandler createHanlder(String type); + + private R pageHandler(SwMap params, UserSession us, String type) { + try { + IHandler handler = createHanlder(TYPE_SAVE); + return handler.doWork(params, us); + } catch (Exception e) { + return R.error("操作失败!", e); + } + } + + public R save(@SwBody SwMap params, UserSession us) { + return pageHandler(params, us, TYPE_SAVE); + } + + public R load(@SwBody SwMap params, UserSession us) { + return pageHandler(params, us, TYPE_LOAD); + } + + public R del(@SwBody SwMap params, UserSession us) { + return pageHandler(params, us, TYPE_DEL); + } + + public R list(@SwBody SwMap params, UserSession us) { + return pageHandler(params, us, TYPE_LIST); + } +} diff --git a/smtweb-framework/sw-framework-core/src/main/java/cc/smtweb/framework/core/mvc/service/AbstractDelHandler.java b/smtweb-framework/sw-framework-core/src/main/java/cc/smtweb/framework/core/mvc/service/AbstractDelHandler.java new file mode 100644 index 0000000..3aa77a5 --- /dev/null +++ b/smtweb-framework/sw-framework-core/src/main/java/cc/smtweb/framework/core/mvc/service/AbstractDelHandler.java @@ -0,0 +1,52 @@ +package cc.smtweb.framework.core.mvc.service; + +import cc.smtweb.framework.core.R; +import cc.smtweb.framework.core.SwMap; +import cc.smtweb.framework.core.db.DbEngine; +import cc.smtweb.framework.core.session.UserSession; +import lombok.extern.slf4j.Slf4j; + +/** + * Created by Akmm at 2022/3/2 19:44 + * 保存 + */ +@Slf4j +public abstract class AbstractDelHandler implements IHandler{ + protected SwMap params; + protected UserSession us; + + @Override + public R doWork(SwMap params, UserSession us) throws Exception { + this.params = params; + this.us = us; + + long id = readId(); + + checkValid(); + DbEngine.getInstance().doTrans(() -> { + try { + del(); + saveSuccess(); + return true; + } catch (Exception e) { + saveFailed(); + log.error("保存失败!", e); + return false; + } + }); + return R.success(); + } + + /** + * 读取页面传回来的id + * @return + */ + protected long readId() { + return params.readLong("id", 0L); + } + + protected abstract void checkValid() throws Exception; + protected abstract void del() throws Exception; + protected void saveSuccess() {} + protected void saveFailed() {} +} diff --git a/smtweb-framework/sw-framework-core/src/main/java/cc/smtweb/framework/core/mvc/service/AbstractLoadHandler.java b/smtweb-framework/sw-framework-core/src/main/java/cc/smtweb/framework/core/mvc/service/AbstractLoadHandler.java new file mode 100644 index 0000000..998b7cc --- /dev/null +++ b/smtweb-framework/sw-framework-core/src/main/java/cc/smtweb/framework/core/mvc/service/AbstractLoadHandler.java @@ -0,0 +1,39 @@ +package cc.smtweb.framework.core.mvc.service; + +import cc.smtweb.framework.core.R; +import cc.smtweb.framework.core.SwMap; +import cc.smtweb.framework.core.session.UserSession; + +/** + * Created by Akmm at 2022/3/2 19:44 + */ +public abstract class AbstractLoadHandler implements IHandler { + protected SwMap params; + protected UserSession us; + + @Override + public R doWork(SwMap params, UserSession us) throws Exception { + this.params = params; + this.us = us; + long id = readId(); + T bean; + if (id <= 0L) { + bean = createComp(); + } else { + bean = loadComp(id); + } + return R.success(bean); + } + + /** + * 读取页面传回来的id + * @return + */ + protected long readId() { + return params.readLong("id", 0L); + } + + protected abstract T createComp() throws Exception; + + protected abstract T loadComp(long id); +} diff --git a/smtweb-framework/sw-framework-core/src/main/java/cc/smtweb/framework/core/mvc/service/AbstractSaveHandler.java b/smtweb-framework/sw-framework-core/src/main/java/cc/smtweb/framework/core/mvc/service/AbstractSaveHandler.java new file mode 100644 index 0000000..1f30e59 --- /dev/null +++ b/smtweb-framework/sw-framework-core/src/main/java/cc/smtweb/framework/core/mvc/service/AbstractSaveHandler.java @@ -0,0 +1,65 @@ +package cc.smtweb.framework.core.mvc.service; + +import cc.smtweb.framework.core.R; +import cc.smtweb.framework.core.SwMap; +import cc.smtweb.framework.core.db.DbEngine; +import cc.smtweb.framework.core.session.UserSession; +import lombok.extern.slf4j.Slf4j; + +/** + * Created by Akmm at 2022/3/2 19:44 + * 保存 + */ +@Slf4j +public abstract class AbstractSaveHandler implements IHandler{ + protected SwMap params; + protected UserSession us; + protected T bean; + protected boolean isNew; + + @Override + public R doWork(SwMap params, UserSession us) throws Exception { + this.params = params; + this.us = us; + + long id = readId(); + + isNew = id <= 0L; + if (isNew) { + bean = createComp(); + } else { + bean = loadComp(id); + } + readFromPage(); + checkValid(); + DbEngine.getInstance().doTrans(() -> { + try { + save(); + saveSuccess(); + return true; + } catch (Exception e) { + saveFailed(); + log.error("保存失败!", e); + return false; + } + }); + return R.success(bean); + } + + /** + * 读取页面传回来的id + * @return + */ + protected long readId() { + return params.readLong("id", 0L); + } + + protected abstract void readFromPage(); + protected abstract void checkValid() throws Exception; + protected abstract void save() throws Exception; + protected void saveSuccess() {} + protected void saveFailed() {} + + protected abstract T createComp() throws Exception; + protected abstract T loadComp(long id) throws Exception; +} diff --git a/smtweb-framework/sw-framework-core/src/main/java/cc/smtweb/framework/core/mvc/service/DefaultDelHandler.java b/smtweb-framework/sw-framework-core/src/main/java/cc/smtweb/framework/core/mvc/service/DefaultDelHandler.java new file mode 100644 index 0000000..5d76d35 --- /dev/null +++ b/smtweb-framework/sw-framework-core/src/main/java/cc/smtweb/framework/core/mvc/service/DefaultDelHandler.java @@ -0,0 +1,63 @@ +package cc.smtweb.framework.core.mvc.service; + +import cc.smtweb.framework.core.SwException; +import cc.smtweb.framework.core.cache.AbstractCache; +import cc.smtweb.framework.core.cache.CacheManager; +import cc.smtweb.framework.core.db.DbEngine; +import cc.smtweb.framework.core.db.EntityDao; +import cc.smtweb.framework.core.db.cache.ModelTableCache; +import cc.smtweb.framework.core.db.impl.DefaultEntity; +import cc.smtweb.framework.core.db.vo.ModelField; +import cc.smtweb.framework.core.db.vo.ModelIndex; +import cc.smtweb.framework.core.db.vo.ModelTable; +import org.apache.commons.lang3.StringUtils; + +/** + * Created by Akmm at 2022/3/2 19:52 + * 默认实体实现 + */ +public class DefaultDelHandler extends AbstractDelHandler { + protected String tableName; + + public DefaultDelHandler(String tableName) { + this.tableName = tableName; + } + + @Override + protected void checkValid() throws Exception { + ModelTable table = ModelTableCache.getInstance().getByName(tableName); + + EntityDao dao = DbEngine.getInstance().findDao(tableName); + for (ModelIndex mi: table.getIndexes()) { + if (mi.isUnique()) { + dao.checkUnique(bean, mi.getFields().split(",")); + } + } + } + + @Override + protected void del() { + EntityDao dao = DbEngine.getInstance().findDao(tableName); + dao.deleteEntity(id); + } + + @Override + protected void saveSuccess() { + super.saveSuccess(); + ModelTable table = ModelTableCache.getInstance().getByName(tableName); + if (table.isNeedCache()) { + AbstractCache cache = CacheManager.getIntance().getCache(tableName); + cache.put(bean); + } + } + + @Override + protected void saveFailed() { + super.saveFailed(); + ModelTable table = ModelTableCache.getInstance().getByName(tableName); + if (table.isNeedCache()) { + AbstractCache cache = CacheManager.getIntance().getCache(tableName); + cache.reset(bean); + } + } +} diff --git a/smtweb-framework/sw-framework-core/src/main/java/cc/smtweb/framework/core/mvc/service/DefaultLoadHandler.java b/smtweb-framework/sw-framework-core/src/main/java/cc/smtweb/framework/core/mvc/service/DefaultLoadHandler.java new file mode 100644 index 0000000..1edf0ef --- /dev/null +++ b/smtweb-framework/sw-framework-core/src/main/java/cc/smtweb/framework/core/mvc/service/DefaultLoadHandler.java @@ -0,0 +1,26 @@ +package cc.smtweb.framework.core.mvc.service; + +import cc.smtweb.framework.core.db.DbEngine; +import cc.smtweb.framework.core.db.impl.DefaultEntity; + +/** + * Created by Akmm at 2022/3/2 19:52 + * 默认实体实现 + */ +public class DefaultLoadHandler extends AbstractLoadHandler { + protected String tableName; + + public DefaultLoadHandler(String tableName) { + this.tableName = tableName; + } + + @Override + protected T createComp() throws Exception { + return (T)DbEngine.getInstance().findDao(tableName).createBean(); + } + + @Override + protected T loadComp(long id) { + return new DefaultProvider(tableName).getBean(id); + } +} diff --git a/smtweb-framework/sw-framework-core/src/main/java/cc/smtweb/framework/core/mvc/service/DefaultProvider.java b/smtweb-framework/sw-framework-core/src/main/java/cc/smtweb/framework/core/mvc/service/DefaultProvider.java new file mode 100644 index 0000000..503adc0 --- /dev/null +++ b/smtweb-framework/sw-framework-core/src/main/java/cc/smtweb/framework/core/mvc/service/DefaultProvider.java @@ -0,0 +1,21 @@ +package cc.smtweb.framework.core.mvc.service; + +import cc.smtweb.framework.core.db.DbEngine; +import cc.smtweb.framework.core.db.EntityDao; +import cc.smtweb.framework.core.db.impl.DefaultEntity; + +/** + * Created by Akmm at 2022/3/3 20:04 + */ +public class DefaultProvider extends AbstractCompProvider { + public String tableName; + + public DefaultProvider(String tableName) { + this.tableName = tableName; + } + + public T getBean(long id) { + EntityDao dao = (EntityDao)DbEngine.getInstance().findDao(tableName); + return doGetData(tableName + "." + id, () -> dao.queryEntity(id)); + } +} diff --git a/smtweb-framework/sw-framework-core/src/main/java/cc/smtweb/framework/core/mvc/service/DefaultSaveHandler.java b/smtweb-framework/sw-framework-core/src/main/java/cc/smtweb/framework/core/mvc/service/DefaultSaveHandler.java new file mode 100644 index 0000000..bb22ff6 --- /dev/null +++ b/smtweb-framework/sw-framework-core/src/main/java/cc/smtweb/framework/core/mvc/service/DefaultSaveHandler.java @@ -0,0 +1,90 @@ +package cc.smtweb.framework.core.mvc.service; + +import cc.smtweb.framework.core.SwException; +import cc.smtweb.framework.core.cache.AbstractCache; +import cc.smtweb.framework.core.cache.CacheManager; +import cc.smtweb.framework.core.db.DbEngine; +import cc.smtweb.framework.core.db.EntityDao; +import cc.smtweb.framework.core.db.cache.ModelTableCache; +import cc.smtweb.framework.core.db.impl.DefaultEntity; +import cc.smtweb.framework.core.db.vo.ModelField; +import cc.smtweb.framework.core.db.vo.ModelIndex; +import cc.smtweb.framework.core.db.vo.ModelTable; +import org.apache.commons.lang3.StringUtils; + +/** + * Created by Akmm at 2022/3/2 19:52 + * 默认实体实现 + */ +public class DefaultSaveHandler extends AbstractSaveHandler { + protected String tableName; + + public DefaultSaveHandler(String tableName) { + this.tableName = tableName; + } + + @Override + protected T createComp() throws Exception { + final EntityDao dao = DbEngine.getInstance().findDao(tableName); + T bean = (T) dao.createBean(); + bean.setEntityId(dao.nextId()); + return bean; + } + + @Override + protected T loadComp(long id) { + return new DefaultProvider(tableName).getBean(id); + } + + @Override + protected void readFromPage() { + bean.readFromMap(params); + } + + @Override + protected void checkValid() throws Exception { + ModelTable table = ModelTableCache.getInstance().getByName(tableName); + for (ModelField field: table.getFields()) { + if (field.isNotNull() && StringUtils.isEmpty(bean.getStr(field.getName()))) { + throw new SwException(field.getTitle() + "不能为空!"); + } + } + + EntityDao dao = DbEngine.getInstance().findDao(tableName); + for (ModelIndex mi: table.getIndexes()) { + if (mi.isUnique()) { + dao.checkUnique(bean, mi.getFields().split(",")); + } + } + } + + @Override + protected void save() { + EntityDao dao = DbEngine.getInstance().findDao(tableName); + if (isNew) { + dao.insertEntity(bean); + } else { + dao.updateEntity(bean); + } + } + + @Override + protected void saveSuccess() { + super.saveSuccess(); + ModelTable table = ModelTableCache.getInstance().getByName(tableName); + if (table.isNeedCache()) { + AbstractCache cache = CacheManager.getIntance().getCache(tableName); + cache.put(bean); + } + } + + @Override + protected void saveFailed() { + super.saveFailed(); + ModelTable table = ModelTableCache.getInstance().getByName(tableName); + if (table.isNeedCache()) { + AbstractCache cache = CacheManager.getIntance().getCache(tableName); + cache.reset(bean); + } + } +} diff --git a/smtweb-framework/sw-framework-core/src/main/java/cc/smtweb/framework/core/mvc/service/IDataProvider.java b/smtweb-framework/sw-framework-core/src/main/java/cc/smtweb/framework/core/mvc/service/IDataProvider.java new file mode 100644 index 0000000..84f130e --- /dev/null +++ b/smtweb-framework/sw-framework-core/src/main/java/cc/smtweb/framework/core/mvc/service/IDataProvider.java @@ -0,0 +1,8 @@ +package cc.smtweb.framework.core.mvc.service; + +/** + * Created by Akmm at 2022/3/3 12:10 + */ +public interface IDataProvider { + T load(); +} diff --git a/smtweb-framework/sw-framework-core/src/main/java/cc/smtweb/framework/core/mvc/service/IHandler.java b/smtweb-framework/sw-framework-core/src/main/java/cc/smtweb/framework/core/mvc/service/IHandler.java new file mode 100644 index 0000000..3ef847e --- /dev/null +++ b/smtweb-framework/sw-framework-core/src/main/java/cc/smtweb/framework/core/mvc/service/IHandler.java @@ -0,0 +1,13 @@ +package cc.smtweb.framework.core.mvc.service; + +import cc.smtweb.framework.core.R; +import cc.smtweb.framework.core.SwMap; +import cc.smtweb.framework.core.session.UserSession; + +/** + * Created by Akmm at 2022/3/2 19:01 + * 所有handler的接口 + */ +public interface IHandler { + R doWork(SwMap params, UserSession us) throws Exception; +} diff --git a/smtweb-system/sw-system-bpm/src/main/java/cc/smtweb/system/bpm/web/design/project/ModelProject.java b/smtweb-system/sw-system-bpm/src/main/java/cc/smtweb/system/bpm/web/design/project/ModelProject.java new file mode 100644 index 0000000..bf8f4d8 --- /dev/null +++ b/smtweb-system/sw-system-bpm/src/main/java/cc/smtweb/system/bpm/web/design/project/ModelProject.java @@ -0,0 +1,88 @@ +package cc.smtweb.system.bpm.web.design.project; + +import cc.smtweb.framework.core.annotation.SwTable; +import cc.smtweb.framework.core.db.impl.DefaultEntity; + +/** + * Created by Akmm at 2022/3/1 15:35 + */ +@SwTable("ASP_MODEL_PROJECT") +public class ModelProject extends DefaultEntity { + public static final String ENTITY_NAME = "ASP_MODEL_PROJECT"; + + public ModelProject() { + super(ENTITY_NAME); + } + + public long getPrjId() { + return getLong("prj_id"); + } + + public void setPrjId(long prjId) { + put("prj_id", prjId); + } + + public String getPrjName() { + return getStr("prj_name"); + } + + public void setPrjName(String prjName) { + put("prj_name", prjName); + } + + public String getPrjDepends() { + return getStr("prj_depends"); + } + + public void setPrjDepends(String prjDepends) { + put("prj_depends", prjDepends); + } + + public String getPrjDesc() { + return getStr("prj_desc"); + } + + public void setPrjDesc(String prjDesc) { + put("prj_desc", prjDesc); + } + + public int getPrjStatus() { + return getInt("prj_status"); + } + + public void setPrjStatus(int prjStatus) { + put("prj_status", prjStatus); + } + + public long getPrjCreateUid() { + return getLong("prj_create_uid"); + } + + public void setPrjCreateUid(long prjCreateUid) { + put("prj_create_uid", prjCreateUid); + } + + public long getPrjUpdateUid() { + return getLong("prj_update_uid"); + } + + public void setPrjUpdateUid(long prjUpdateUid) { + put("prj_update_uid", prjUpdateUid); + } + + public long getPrjCreateAt() { + return getLong("prj_create_at"); + } + + public void setPrjCreateAt(long prjCreateAt) { + put("prj_create_at", prjCreateAt); + } + + public long getPrjUpdateAt() { + return getLong("prj_update_at"); + } + + public void setPrjUpdateAt(long prjUpdateAt) { + put("prj_update_at", prjUpdateAt); + } +} diff --git a/smtweb-system/sw-system-bpm/src/main/java/cc/smtweb/system/bpm/web/design/project/ModelProjectService.java b/smtweb-system/sw-system-bpm/src/main/java/cc/smtweb/system/bpm/web/design/project/ModelProjectService.java new file mode 100644 index 0000000..7d12ce5 --- /dev/null +++ b/smtweb-system/sw-system-bpm/src/main/java/cc/smtweb/system/bpm/web/design/project/ModelProjectService.java @@ -0,0 +1,37 @@ +package cc.smtweb.system.bpm.web.design.project; + +import cc.smtweb.framework.core.R; +import cc.smtweb.framework.core.SwMap; +import cc.smtweb.framework.core.annotation.SwBody; +import cc.smtweb.framework.core.annotation.SwParam; +import cc.smtweb.framework.core.annotation.SwService; +import cc.smtweb.framework.core.db.DbEngine; +import cc.smtweb.framework.core.db.EntityDao; +import cc.smtweb.framework.core.mvc.service.AbstractCompService; +import cc.smtweb.framework.core.mvc.service.DefaultLoadHandler; +import cc.smtweb.framework.core.mvc.service.DefaultSaveHandler; +import cc.smtweb.framework.core.mvc.service.IHandler; +import cc.smtweb.framework.core.session.UserSession; +import cc.smtweb.system.bpm.engine.entity.AspModelPO; + +/** + * Created by Akmm at 2022/3/1 17:00 + * 项目服务类 + */ +@SwService +public class ModelProjectService extends AbstractCompService { + @Override + protected IHandler createHanlder(String type) { + switch (type) { + case TYPE_LOAD: + return new DefaultLoadHandler(ModelProject.ENTITY_NAME); + case TYPE_SAVE: + return new DefaultSaveHandler<>(ModelProject.ENTITY_NAME); + case TYPE_DEL: + return new DefaultSaveHandler<>(ModelProject.ENTITY_NAME); + } + return null; + } + + +} diff --git a/smtweb-system/sw-system-bpm/src/test/java/cc/smtweb/system/bpm/test/BuildJavaBean.java b/smtweb-system/sw-system-bpm/src/test/java/cc/smtweb/system/bpm/test/BuildJavaBean.java new file mode 100644 index 0000000..a068825 --- /dev/null +++ b/smtweb-system/sw-system-bpm/src/test/java/cc/smtweb/system/bpm/test/BuildJavaBean.java @@ -0,0 +1,59 @@ +package cc.smtweb.system.bpm.test; + +import cc.smtweb.framework.core.db.cache.ModelTableCache; +import cc.smtweb.system.bpm.util.CodeGenUtil; +import org.apache.commons.lang3.StringUtils; +import org.junit.Test; + +/** + * Created by Akmm at 2022/3/1 9:41 + * 生成bean + */ +public class BuildJavaBean { + @Test + public void buildBean() { + String str = "`prj_id` bigint(20) NOT NULL DEFAULT '-1',\n" + + " `prj_name` varchar(100) COLLATE utf8_unicode_ci DEFAULT NULL COMMENT '项目名称',\n" + + " `prj_depends` varchar(200) COLLATE utf8_unicode_ci DEFAULT NULL COMMENT '依赖其他的项目',\n" + + " `prj_desc` varchar(255) COLLATE utf8_unicode_ci DEFAULT NULL COMMENT '项目描述',\n" + + " `prj_status` tinyint(4) NOT NULL DEFAULT '0' COMMENT '状态:0 启用,1 禁用',\n" + + " `prj_create_uid` bigint(20) DEFAULT NULL,\n" + + " `prj_update_uid` bigint(20) DEFAULT NULL,\n" + + " `prj_create_at` bigint(20) NOT NULL DEFAULT '0' COMMENT '创建时间',\n" + + " `prj_update_at` bigint(20) NOT NULL DEFAULT '0' COMMENT '更新时间',"; + String[] ss = str.split("\n"); + for (String s: ss) { + String[] s0 = s.trim().split(" "); + if (StringUtils.isEmpty(s0[0])) continue; + String tn = s0[0].substring(1, s0[0].indexOf("`", 2)); + String tnu = CodeGenUtil.underlineToUpperHump(tn); + String tnn = CodeGenUtil.underlineToHump(tn); + + String tt = s0[1]; + String ttj; + if (tt.contains("(")) tt = tt.substring(0, tt.indexOf("(")); + switch (tt) { + case "bigint": + tt = "long"; + ttj = "Long"; + break; + case "tinyint": + case "int": + tt = "int"; + ttj = "Int"; + break; + default: + tt = "String"; + ttj = "Str"; + break; + } + System.out.println("private " + tt + " get" + tnu + "(){\n" + + "return get" + ttj + "(\"" + tn + "\");\n" + + "}\n" + + "" + + "private void set" + tnu + "(" + tt + " " + tnn + "){\n" + + "put(\"" + tn + "\", " + tnn + ");\n" + + "}\n"); + } + } +}