Quellcode durchsuchen

代码生成部分

skyfffire vor 2 Monaten
Ursprung
Commit
19ab197115

+ 3 - 0
README.MD

@@ -34,6 +34,7 @@
 > DB_URL = jdbc:mysql://your_server_db_host:3306/dalian-nft-api<br>
 > DB_USER = root<br>
 > DB_PASSWORD = your_server_db_password<br>
+> DEV_MODE = 1 或 0<br>
 
 > 关键:配置端口映射<br>
 > 勾选 Bind ports。<br>
@@ -46,3 +47,5 @@
 或者先pull再构建也可以,国内源是这样的,从2023年之后不稳定
 
 docker run -d --name mysql-container -p 33061:3306 -v /app/mysql:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=xxxxxx -e MYSQL_ROOT_HOST=% mysql:8.0
+
+## 使用IDEA并在本地生成代码时,可以在运行里配置环境变量

+ 23 - 1
src/main/java/common/jfinal/AppConfig.java

@@ -1,18 +1,30 @@
 package common.jfinal;
 
 import com.jfinal.config.*;
+import com.jfinal.plugin.activerecord.ActiveRecordPlugin;
+import com.jfinal.plugin.druid.DruidPlugin;
 import com.jfinal.server.undertow.UndertowServer;
 import com.jfinal.template.Engine;
 import modules.hello.HelloController;
 
 public class AppConfig extends JFinalConfig {
+    static String DB_URL = System.getenv("DB_URL");
+    static String DB_USER = System.getenv("DB_USER");
+    static String DB_PASSWORD = System.getenv("DB_PASSWORD");
+    static String DEV_MODE = System.getenv("DEV_MODE");
+
     public static void main(String[] args) {
         UndertowServer.start(AppConfig.class, 8888, true);
     }
 
+    public static DruidPlugin getDruidPlugin() {
+        return new DruidPlugin(DB_URL, DB_USER, DB_PASSWORD);
+    }
+
     @Override
     public void configConstant(Constants constants) {
-
+        constants.setDevMode(DEV_MODE.equals("1"));
+        constants.setInjectDependency(true);
     }
 
     @Override
@@ -27,7 +39,17 @@ public class AppConfig extends JFinalConfig {
 
     @Override
     public void configPlugin(Plugins plugins) {
+        DruidPlugin dp = getDruidPlugin();
+        plugins.add(dp);
 
+        ActiveRecordPlugin arp = new ActiveRecordPlugin(dp);
+        // 是否打印SQL
+        arp.setShowSql(DEV_MODE.equals("1"));
+        // 加载sql模板
+//        arp.addSqlTemplate("/common/all.sqlt");
+        // 映射实体
+//        _MappingKit.mapping(arp);
+        plugins.add(arp);
     }
 
     @Override

+ 58 - 0
src/main/java/common/jfinal/generate/CodeGenerator.java

@@ -0,0 +1,58 @@
+package common.jfinal.generate;
+
+import com.jfinal.plugin.activerecord.dialect.MysqlDialect;
+import com.jfinal.plugin.activerecord.generator.Generator;
+import com.jfinal.plugin.druid.DruidPlugin;
+import common.jfinal.AppConfig;
+import common.utils.model.MyGenerator;
+
+import javax.sql.DataSource;
+
+public class CodeGenerator {
+	// 黑名单表,不参与生成实体
+	private static final String[] tableBlackList = {};
+
+	public static DataSource getDataSource() {
+		DruidPlugin druidPlugin = AppConfig.getDruidPlugin();
+		druidPlugin.start();
+		return druidPlugin.getDataSource();
+	}
+
+	public static void main(String[] args) {
+		// model包
+		String modelPackageName = "common.model";
+		// baseModel包
+		String baseModelPackageName = modelPackageName + ".base";
+		// baseModel路径(相对项目)
+		String baseModelPath = baseModelPackageName.replace('.', '/');
+		// baseModel绝对路径
+		String baseModelOutputDir = System.getProperty("user.dir") + "/src/main/java/" + baseModelPath;
+		// model绝对路径
+		String modelOutputDir = baseModelOutputDir + "/..";
+		// 生成器
+		Generator gen = MyGenerator.create(getDataSource())
+				.setBaseModelPackageName(baseModelPackageName)
+				.setBaseModelOutputDir(baseModelOutputDir)
+				.setModelPackageName(modelPackageName)
+				.setModelOutputDir(modelOutputDir)
+				.buildGenerator();
+		// 设置数据库方言
+		gen.setDialect(new MysqlDialect());
+		// 设置字段备注
+		gen.setGenerateRemarks(true);
+		// 黑名单
+		gen.addBlacklist(tableBlackList);
+		// 生成dao
+		gen.setGenerateDaoInModel(true);
+		// 是否生成字典文件
+		gen.setGenerateDataDictionary(false);
+		// 设置表名前缀
+		gen.setRemovedTableNamePrefixes("t_");
+		// 生成日志
+		gen.setGenerateView(true);
+		// 生成model模板
+		gen.setBaseModelTemplate("/common/jfinal/generate/base_model_template.jf");
+		// 生成
+		gen.generate();
+	}
+}

+ 61 - 0
src/main/java/common/jfinal/generate/base_model_template.jf

@@ -0,0 +1,61 @@
+package #(baseModelPackageName);
+
+import com.jfinal.plugin.activerecord.Model;
+import com.jfinal.plugin.activerecord.IBean;
+
+/**
+ * Generated by JFinal, do not modify this file.
+ */
+#if (generateChainSetter)
+@SuppressWarnings({"serial", "unchecked"})
+#else
+@SuppressWarnings("serial")
+#end
+public abstract class #(tableMeta.baseModelName)<M extends #(tableMeta.baseModelName)<M>> extends Model<M> implements IBean {
+#set(b = generateChainSetter)
+#for(cm : tableMeta.columnMetas)
+	#if (cm.remarks)
+	/**
+	 * #(cm.remarks)
+	 */
+	#end
+	#set(argName = javaKeyword.contains(cm.attrName) ? '_' + cm.attrName : cm.attrName)
+	public #(b ? 'M' : 'void') set#(firstCharToUpperCase(cm.attrName))(#(cm.javaType) #(argName)) {
+		set("#(cm.name)", #(argName));
+		#if (b)
+		return (M)this;
+		#end
+	}
+	
+	#if (cm.remarks)
+	/**
+	 * #(cm.remarks)
+	 */
+	#end
+	#set(getterOfModel = getterTypeMap.get(cm.javaType))
+	#if (isBlank(getterOfModel))
+		#set(getterOfModel = 'get')
+	#end
+	public #(cm.javaType) get#(firstCharToUpperCase(cm.attrName))() {
+		return #(getterOfModel)("#(cm.name)");
+	}
+#end
+	
+	public boolean save() {
+		set("create_time", System.currentTimeMillis());
+		
+		return super.save();
+	}
+	
+	public boolean update() {
+		set("update_time", System.currentTimeMillis());
+		
+		return super.update();
+	}
+
+	public boolean delete() {
+		set("is_deleted", 1);
+
+		return super.update();
+	}
+}

+ 12 - 0
src/main/java/common/model/User.java

@@ -0,0 +1,12 @@
+package common.model;
+
+import common.model.base.BaseUser;
+
+/**
+ * Generated by JFinal.
+ */
+@SuppressWarnings("serial")
+public class User extends BaseUser<User> {
+	public static final User dao = new User().dao();
+}
+

+ 23 - 0
src/main/java/common/model/_MappingKit.java

@@ -0,0 +1,23 @@
+package common.model;
+
+import com.jfinal.plugin.activerecord.ActiveRecordPlugin;
+
+/**
+ * Generated by JFinal, do not modify this file.
+ * <pre>
+ * Example:
+ * public void configPlugin(Plugins me) {
+ *     ActiveRecordPlugin arp = new ActiveRecordPlugin(...);
+ *     _MappingKit.mapping(arp);
+ *     me.add(arp);
+ * }
+ * </pre>
+ */
+public class _MappingKit {
+	
+	public static void mapping(ActiveRecordPlugin arp) {
+		arp.addMapping("t_user", "id", User.class);
+	}
+}
+
+

+ 115 - 0
src/main/java/common/model/base/BaseUser.java

@@ -0,0 +1,115 @@
+package common.model.base;
+
+import com.jfinal.plugin.activerecord.Model;
+import com.jfinal.plugin.activerecord.IBean;
+
+/**
+ * Generated by JFinal, do not modify this file.
+ */
+@SuppressWarnings("serial")
+public abstract class BaseUser<M extends BaseUser<M>> extends Model<M> implements IBean {
+	/**
+	 * 数字id,从10000开始
+	 */
+	public void setId(java.lang.Long id) {
+		set("id", id);
+	}
+	
+	/**
+	 * 数字id,从10000开始
+	 */
+	public java.lang.Long getId() {
+		return getLong("id");
+	}
+	/**
+	 * 昵称
+	 */
+	public void setNickname(java.lang.String nickname) {
+		set("nickname", nickname);
+	}
+	
+	/**
+	 * 昵称
+	 */
+	public java.lang.String getNickname() {
+		return getStr("nickname");
+	}
+	/**
+	 * 手机号
+	 */
+	public void setMobileNumber(java.lang.String mobileNumber) {
+		set("mobile_number", mobileNumber);
+	}
+	
+	/**
+	 * 手机号
+	 */
+	public java.lang.String getMobileNumber() {
+		return getStr("mobile_number");
+	}
+	/**
+	 * 密码的md5的md5
+	 */
+	public void setPwdMd5Md5(java.lang.String pwdMd5Md5) {
+		set("pwd_md5_md5", pwdMd5Md5);
+	}
+	
+	/**
+	 * 密码的md5的md5
+	 */
+	public java.lang.String getPwdMd5Md5() {
+		return getStr("pwd_md5_md5");
+	}
+	/**
+	 * 角色
+	 */
+	public void setRole(java.lang.Integer role) {
+		set("role", role);
+	}
+	
+	/**
+	 * 角色
+	 */
+	public java.lang.Integer getRole() {
+		return getInt("role");
+	}
+	public void setCreateTime(java.lang.Long createTime) {
+		set("create_time", createTime);
+	}
+	
+	public java.lang.Long getCreateTime() {
+		return getLong("create_time");
+	}
+	public void setUpdateTime(java.lang.Long updateTime) {
+		set("update_time", updateTime);
+	}
+	
+	public java.lang.Long getUpdateTime() {
+		return getLong("update_time");
+	}
+	public void setIsDeleted(java.lang.Integer isDeleted) {
+		set("is_deleted", isDeleted);
+	}
+	
+	public java.lang.Integer getIsDeleted() {
+		return getInt("is_deleted");
+	}
+	
+	public boolean save() {
+		set("create_time", System.currentTimeMillis());
+		
+		return super.save();
+	}
+	
+	public boolean update() {
+		set("update_time", System.currentTimeMillis());
+		
+		return super.update();
+	}
+
+	public boolean delete() {
+		set("is_deleted", 1);
+
+		return super.update();
+	}
+}

+ 29 - 0
src/main/java/common/utils/http/MyController.java

@@ -0,0 +1,29 @@
+package common.utils.http;
+
+import com.jfinal.core.Controller;
+import com.jfinal.core.NotAction;
+import com.jfinal.json.FastJson;
+import com.jfinal.kit.HttpKit;
+import com.jfinal.kit.StrKit;
+
+import javax.servlet.http.HttpServletRequest;
+
+public class MyController extends Controller {
+	@NotAction
+	public <T> T getJsonModel(Class<T> type) {
+		return MyController.getJsonModelByRequestAndType(getRequest(), type);
+	}
+	
+	public static <T> T getJsonModelByRequestAndType(HttpServletRequest request, Class<T> type) {
+		String data = HttpKit.readData(request);
+		
+		// request只支持读取一次,无法满足需求
+		if (!StrKit.isBlank(data)) {
+			request.setAttribute("data", data);
+		} else {
+			data = (String) request.getAttribute("data");
+		}
+		
+		return FastJson.getJson().parse(data, type);
+	}
+}

+ 16 - 0
src/main/java/common/utils/http/MyPaginate.java

@@ -0,0 +1,16 @@
+package common.utils.http;
+
+import com.alibaba.fastjson.JSONObject;
+
+public class MyPaginate extends JSONObject {
+	public static String PAGE_NUMBER_KEY = "pageNumber";
+	public static String PAGE_SIZE_KEY = "pageSize";
+	
+	public int getPageNumber() {
+		return this.get(PAGE_NUMBER_KEY) != null ? this.getInteger(PAGE_NUMBER_KEY) : 1;
+	}
+	
+	public int getPageSize() {
+		return this.get(PAGE_SIZE_KEY) != null ? this.getInteger(PAGE_SIZE_KEY) : 200; 
+	}
+}

+ 33 - 0
src/main/java/common/utils/http/MyRet.java

@@ -0,0 +1,33 @@
+package common.utils.http;
+
+import com.jfinal.kit.Ret;
+
+public class MyRet extends Ret {
+    private MyRet() {}
+
+    public static MyRet fail(String msg) {
+        return new MyRet().setState(false).setMsg(msg);
+    }
+
+    public static MyRet ok(String msg) {
+        return new MyRet().setState(true).setMsg(msg);
+    }
+
+    public MyRet setState(boolean state) {
+        this.set("state", state);
+
+        return this;
+    }
+
+    public MyRet setMsg(String msg) {
+        this.set("msg", msg);
+
+        return this;
+    }
+
+    public MyRet setData(Object data) {
+        this.set("data", data);
+
+        return this;
+    }
+}

+ 18 - 0
src/main/java/common/utils/model/CopyUtil.java

@@ -0,0 +1,18 @@
+package common.utils.model;
+
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.List;
+
+public class CopyUtil {
+	public static Object[] generateDuplicateObjects(Object[] objects) {
+		List<Object> copiedList = new ArrayList<>();
+		
+		for (int i = 0; i < 2; i++) {
+			copiedList.addAll(Arrays.asList(objects));
+			copiedList.add(System.currentTimeMillis());
+		}
+		
+		return copiedList.toArray();
+	}
+}

+ 53 - 0
src/main/java/common/utils/model/MyGenerator.java

@@ -0,0 +1,53 @@
+package common.utils.model;
+
+import com.jfinal.plugin.activerecord.generator.Generator;
+
+import javax.sql.DataSource;
+
+public class MyGenerator {
+    private DataSource dataSource = null;
+    private String baseModelPackageName = null;
+    private String baseModelOutputDir = null;
+    private String modelPackageName = null;
+    private String modelOutputDir = null;
+    
+    private MyGenerator(DataSource dataSource) {
+        this.dataSource = dataSource;
+    }
+
+    public Generator buildGenerator() {
+        return new Generator(dataSource, baseModelPackageName, baseModelOutputDir, modelPackageName, modelOutputDir);
+    }
+    
+    public static MyGenerator create(DataSource dataSource) {
+        return new MyGenerator(dataSource);
+    }
+    
+    public MyGenerator setBaseModelPackageName(String baseModelPackageName) {
+        this.baseModelPackageName = baseModelPackageName;
+        System.out.println("BaseModelPackageName: " + baseModelPackageName);
+        
+        return this;
+    }
+
+    public MyGenerator setBaseModelOutputDir(String baseModelOutputDir) {
+        this.baseModelOutputDir = baseModelOutputDir;
+        System.out.println("BaseModelOutputDir: " + baseModelOutputDir);
+
+        return this;
+    }
+
+    public MyGenerator setModelPackageName(String modelPackageName) {
+        this.modelPackageName = modelPackageName;
+        System.out.println("ModelPackageName: " + modelPackageName);
+
+        return this;
+    }
+
+    public MyGenerator setModelOutputDir(String modelOutputDir) {
+        this.modelOutputDir = modelOutputDir;
+        System.out.println("ModelOutputDir: " + modelOutputDir);
+
+        return this;
+    }
+}

+ 31 - 0
src/main/java/common/utils/model/SaveUtil.java

@@ -0,0 +1,31 @@
+package common.utils.model;
+
+import com.jfinal.plugin.activerecord.Db;
+import com.jfinal.plugin.activerecord.Model;
+
+import java.util.concurrent.atomic.AtomicInteger;
+
+public class SaveUtil {
+	public static final int SAVE_CODE = 1;
+	public static final int UPDATE_CODE = 2;
+	
+	public static int saveOrUpdate(Model<?> model) {
+		Object[] values = CopyUtil.generateDuplicateObjects(model._getAttrValues());
+		
+		return Db.update(SqlUtil.generateReplaceSql(TableUtil.getTableName(model), model), values);
+	}
+	
+	public static int saveSuperAndSub(Model<?> superModel, Model<?> subModel) {
+		AtomicInteger code = new AtomicInteger();
+
+		Db.tx(() -> {
+			SaveUtil.saveOrUpdate(superModel);
+
+			code.set(SaveUtil.saveOrUpdate(subModel));
+
+			return true;
+		});
+
+		return code.get();
+	}
+}

+ 38 - 0
src/main/java/common/utils/model/SqlUtil.java

@@ -0,0 +1,38 @@
+package common.utils.model;
+
+import com.jfinal.plugin.activerecord.Model;
+
+public class SqlUtil {
+	public static String generateReplaceSql(String table, Model<?> model) {
+		StringBuilder sqlBuilder = new StringBuilder().append("insert ").append("into ");
+		sqlBuilder.append(table).append(" ");
+		String[] modelKeys = model._getAttrNames();
+		
+		// 生成字段
+		sqlBuilder.append("(");
+		for (String key : modelKeys) {
+			sqlBuilder.append('`').append(key).append('`');
+			sqlBuilder.append(", ");
+		}
+		sqlBuilder.append("`create_time`");
+		sqlBuilder.append(") ");
+		
+		// 生成参数占位符
+		sqlBuilder.append("values (");
+		for (int i = 0; i < modelKeys.length; i++) {
+			sqlBuilder.append('?');
+			sqlBuilder.append(", ");
+		}
+		sqlBuilder.append("?) ");
+		
+		// 生成后续更新部分
+		sqlBuilder.append("on duplicate key update ");
+		for (String modelKey : modelKeys) {
+			sqlBuilder.append(modelKey).append("=?");
+			sqlBuilder.append(", ");
+		}
+		sqlBuilder.append("update_time=?");
+		
+		return sqlBuilder.toString();
+	}
+}

+ 14 - 0
src/main/java/common/utils/model/TableUtil.java

@@ -0,0 +1,14 @@
+package common.utils.model;
+
+import com.jfinal.plugin.activerecord.Model;
+import com.jfinal.plugin.activerecord.TableMapping;
+
+public class TableUtil {
+	public static String getTableName(Model<?> model) {
+		return TableMapping.me().getTable(model.getClass()).getName();
+	}
+	
+	public static String getTableName(Class<? extends Model<?>> c) {
+		return TableMapping.me().getTable(c).getName();
+	}
+}