提交git

This commit is contained in:
2025-08-25 18:51:02 +08:00
commit 9dd33ed2b9
2171 changed files with 172166 additions and 0 deletions

20
uling-generator/pom.xml Normal file
View File

@ -0,0 +1,20 @@
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<parent>
<artifactId>uling</artifactId>
<groupId>cc.uling</groupId>
<version>1.0</version>
</parent>
<modelVersion>4.0.0</modelVersion>
<artifactId>uling-generator</artifactId>
<properties>
<maven.compiler.source>8</maven.compiler.source>
<maven.compiler.target>8</maven.compiler.target>
</properties>
</project>

View File

@ -0,0 +1,23 @@
package cc.uling.common.generator.main;
import org.apache.commons.lang3.StringUtils;
public class _AbGenerator {
public static String getModuleSrcPath(String rootPath, String module) {
String genModuleName = null;
String[] strings = rootPath.split("/");
for (int i = 0; i < strings.length; i++) {
if ("src".equals(strings[i]) && i > 0) {
genModuleName = strings[i - 1];
break;
}
}
String genPath = rootPath.replace("/src/main/webapp", "");
if (null != genModuleName && !StringUtils.isEmpty(module)) {
genPath = genPath.replace(genModuleName, module);
}
genPath += "/src/main/java/";
return genPath;
}
}

View File

@ -0,0 +1,25 @@
package cc.uling.common.generator.main;
import cc.uling.common.generator.model.AppModelGenerator;
import cc.uling.common.generator.model.AppModelGeneratorConfig;
import cc.uling.common.generator.service.AppServiceGenerator;
import cc.uling.common.generator.service.AppServiceGeneratorConfig;
import cc.uling.common.generator.serviceimpl.AppServiceImplGenerator;
import cc.uling.common.generator.serviceimpl.AppServiceImplGeneratorConfig;
import cc.uling.common.manager.ConfigFactory;
import java.util.Map;
public class _BaseGenCode {
public static void doGenerate(String module) {
String configFileName = module + ".properties";
Map<String, String> map = ConfigFactory.readPropToMap(configFileName);
if (null == map) {
System.out.println(configFileName + "文件不存在!");
System.exit(0);
}
AppModelGenerator.doGenerate(new AppModelGeneratorConfig(module).initFromMap(map));
AppServiceGenerator.doGenerate(new AppServiceGeneratorConfig(module).initFromMap(map));
AppServiceImplGenerator.doGenerate(new AppServiceImplGeneratorConfig(module).initFromMap(map));
}
}

View File

@ -0,0 +1,15 @@
package cc.uling.common.generator.main;
import cc.uling.common.generator.model.AppModelGenerator;
/**
* @Author: ccc
*/
public class _ModelGenCode {
public static void main(String[] args) {
AppModelGenerator.doGenerate(null);
}
}

View File

@ -0,0 +1,16 @@
package cc.uling.common.generator.main;
import cc.uling.common.generator.service.AppServiceGenerator;
/**
* api代码生成配置
*
* @Author: ccc
*/
public class _ServiceGenCode {
public static void main(String[] args) {
AppServiceGenerator.doGenerate(null);
}
}

View File

@ -0,0 +1,16 @@
package cc.uling.common.generator.main;
import cc.uling.common.generator.serviceimpl.AppServiceImplGenerator;
/**
*
* @Author: ccc
*/
public class _ServiceImplGenCode {
public static void main(String[] args) {
AppServiceImplGenerator.doGenerate(null);
}
}

View File

@ -0,0 +1,58 @@
package cc.uling.common.generator.model;
import com.jfinal.plugin.activerecord.dialect.OracleDialect;
import com.jfinal.plugin.activerecord.generator.MetaBuilder;
import com.jfinal.plugin.activerecord.generator.TableMeta;
import javax.sql.DataSource;
import java.sql.ResultSet;
import java.sql.SQLException;
/**
* 自定义 MetaBuilder处理表前缀跳过生成
*
* @Author: ccc
*/
public class AppMetaBuilder extends MetaBuilder {
/**
* 需要跳过生成的表前缀
*/
private String[] skipPre = null;
public AppMetaBuilder(DataSource dataSource) {
super(dataSource);
}
@Override
protected boolean isSkipTable(String tableName) {
if (null != skipPre) {
for (String skip : skipPre) {
if (tableName.startsWith(skip)) {
return true;
}
}
}
return false;
}
public void setSkipPre(String... skipPre) {
this.skipPre = skipPre;
}
@Override
protected ResultSet getTablesResultSet() throws SQLException {
String schemaPattern = dialect instanceof OracleDialect ? dbMeta.getUserName() : null;
return dbMeta.getTables(conn.getCatalog(), schemaPattern, null, new String[]{"TABLE", "VIEW"});
}
@Override
protected void buildPrimaryKey(TableMeta tableMeta) throws SQLException {
if (tableMeta.name.toLowerCase().endsWith("_view")) {
tableMeta.primaryKey = "id";
} else {
super.buildPrimaryKey(tableMeta);
}
}
}

View File

@ -0,0 +1,60 @@
package cc.uling.common.generator.model;
import cc.uling.common.generator.main._AbGenerator;
import com.alibaba.fastjson.JSON;
import com.jfinal.kit.PathKit;
import com.jfinal.kit.StrKit;
import com.jfinal.plugin.activerecord.generator.TableMeta;
import io.jboot.Jboot;
import io.jboot.codegen.CodeGenHelpler;
import io.jboot.codegen.model.JbootBaseModelGenerator;
import io.jboot.codegen.model.JbootModelGenerator;
import javax.sql.DataSource;
import java.util.List;
/**
* model代码自动生成
*
* @Author: ccc
*/
public class AppModelGenerator extends _AbGenerator {
public static void doGenerate(AppModelGeneratorConfig config) {
if (null == config) {
// config = Jboot.config(AppModelGeneratorConfig.class);
}
System.out.println(config.toString());
if (StrKit.isBlank(config.getModel())) {
System.err.println("配置Model不可为空");
System.exit(0);
}
String modelPackage = config.getModel();
String baseModelPackage = modelPackage + ".base";
String modulePath = getModuleSrcPath(PathKit.getWebRootPath(), config.getModule());
String modelDir = modulePath + modelPackage.replace(".", "/");
String baseModelDir = modulePath + baseModelPackage.replace(".", "/");
System.out.println("generate dir:" + modelDir+"|"+ JSON.toJSONString(config));
DataSource dataSource = CodeGenHelpler.getDatasource();
AppMetaBuilder metaBuilder = new AppMetaBuilder(dataSource);
if (StrKit.notBlank(config.getTablePrefixes())) {
metaBuilder.setRemovedTableNamePrefixes(config.getTablePrefixes().split(","));
}
if (StrKit.notBlank(config.getExcludedPrefixes())) {
metaBuilder.setSkipPre(config.getExcludedPrefixes().split(","));
}
List<TableMeta> tableMetaList = metaBuilder.build();
CodeGenHelpler.excludeTables(tableMetaList, config.getTableExcluded());
new JbootBaseModelGenerator(baseModelPackage, baseModelDir).generate(tableMetaList);
new JbootModelGenerator(modelPackage, baseModelPackage, modelDir).generate(tableMetaList);
System.out.println("entity generate finished !!!");
}
}

View File

@ -0,0 +1,91 @@
package cc.uling.common.generator.model;
import java.util.Map;
/**
* model代码生成配置
*
* @Author: ccc
*/
public class AppModelGeneratorConfig {
public AppModelGeneratorConfig() {
}
public AppModelGeneratorConfig(String module) {
this.module = module;
}
/**
* 包名
*/
private String model;
/**
* 生成表实体类需要移除的表前缀
*/
private String tablePrefixes;
/**
* 不包含的表名
*/
private String tableExcluded;
/**
* 包含表该前缀的不需要自动生成
*/
private String excludedPrefixes;
/**
* 模块
*/
private String module;
public String getModel() {
return model;
}
public void setModel(String model) {
this.model = model;
}
public String getTablePrefixes() {
return tablePrefixes;
}
public void setTablePrefixes(String tablePrefixes) {
this.tablePrefixes = tablePrefixes;
}
public String getTableExcluded() {
return tableExcluded;
}
public void setTableExcluded(String tableExcluded) {
this.tableExcluded = tableExcluded;
}
public String getExcludedPrefixes() {
return excludedPrefixes;
}
public void setExcludedPrefixes(String excludedPrefixes) {
this.excludedPrefixes = excludedPrefixes;
}
public String getModule() {
return module;
}
public AppModelGeneratorConfig setModule(String module) {
this.module = module;
return this;
}
public AppModelGeneratorConfig initFromMap(Map<String, String> map) {
setModel(map.get("model"));
setTablePrefixes(map.get("tablePrefixes"));
setTableExcluded(map.get("tableExcluded"));
setExcludedPrefixes(map.get("excludedPrefixes"));
return this;
}
}

View File

@ -0,0 +1,62 @@
package cc.uling.common.generator.service;
import cc.uling.common.generator.main._AbGenerator;
import cc.uling.common.generator.model.AppMetaBuilder;
import com.jfinal.kit.PathKit;
import com.jfinal.kit.StrKit;
import com.jfinal.plugin.activerecord.generator.TableMeta;
import io.jboot.Jboot;
import io.jboot.codegen.CodeGenHelpler;
import io.jboot.codegen.service.JbootServiceInterfaceGenerator;
import javax.sql.DataSource;
import java.util.List;
/**
* @Author: ccc
*/
public class AppServiceGenerator extends _AbGenerator {
public static void doGenerate(AppServiceGeneratorConfig config) {
if (null == config) {
config = Jboot.config(AppServiceGeneratorConfig.class);
}
if (StrKit.isBlank(config.getModel()) || StrKit.isBlank(config.getService())) {
System.err.println("配置Service不可为空");
System.exit(0);
}
System.out.println(config.toString());
String modelPackage = config.getModel();
String servicePackage = config.getService();
String modulePath = getModuleSrcPath(PathKit.getWebRootPath(), config.getModule());
String outPath = modulePath + servicePackage.replace(".", "/");
System.out.println("generate service:" + servicePackage);
DataSource dataSource = CodeGenHelpler.getDatasource();
AppMetaBuilder metaBuilder = new AppMetaBuilder(dataSource);
if (StrKit.notBlank(config.getTablePrefixes())) {
metaBuilder.setRemovedTableNamePrefixes(config.getTablePrefixes().split(","));
}
if (StrKit.notBlank(config.getExcludedPrefixes())) {
metaBuilder.setSkipPre(config.getExcludedPrefixes().split(","));
}
List<TableMeta> tableMetaList = metaBuilder.build();
CodeGenHelpler.excludeTables(tableMetaList, config.getTableExcluded());
new JbootServiceInterfaceGenerator(servicePackage, outPath, modelPackage).generate(tableMetaList);
System.out.println("service generate finished !!!");
}
}

View File

@ -0,0 +1,40 @@
package cc.uling.common.generator.service;
import cc.uling.common.generator.model.AppModelGeneratorConfig;
import io.jboot.app.config.annotation.ConfigModel;
import java.util.Map;
/**
* @Author: ccc
*/
public class AppServiceGeneratorConfig extends AppModelGeneratorConfig {
public AppServiceGeneratorConfig() {
super();
}
public AppServiceGeneratorConfig(String module) {
super(module);
}
/**
* service 包名
*/
private String service;
public String getService() {
return service;
}
public void setService(String service) {
this.service = service;
}
@Override
public AppServiceGeneratorConfig initFromMap(Map<String, String> map) {
super.initFromMap(map);
setService(map.get("service"));
return this;
}
}

View File

@ -0,0 +1,61 @@
package cc.uling.common.generator.serviceimpl;
import cc.uling.common.generator.main._AbGenerator;
import cc.uling.common.generator.model.AppMetaBuilder;
import com.jfinal.kit.PathKit;
import com.jfinal.kit.StrKit;
import com.jfinal.plugin.activerecord.generator.TableMeta;
import io.jboot.Jboot;
import io.jboot.codegen.CodeGenHelpler;
import javax.sql.DataSource;
import java.util.List;
/**
* @Author: ccc
*/
public class AppServiceImplGenerator extends _AbGenerator {
public static void doGenerate(AppServiceImplGeneratorConfig config) {
if (null == config) {
config = Jboot.config(AppServiceImplGeneratorConfig.class);
}
System.out.println(config.toString());
if (StrKit.isBlank(config.getModel()) || StrKit.isBlank(config.getService())
|| StrKit.isBlank(config.getProvider())) {
System.err.println("配置Provider不可为空");
System.exit(0);
}
String modelPackage = config.getModel();
String servicepackage = config.getService();
String serviceimplpackage = config.getProvider();
String modulepath = getModuleSrcPath(PathKit.getWebRootPath(), config.getModule());
String outPath = modulepath + serviceimplpackage.replace(".", "/");
System.out.println("generate service impl:" + servicepackage);
DataSource dataSource = CodeGenHelpler.getDatasource();
AppMetaBuilder metaBuilder = new AppMetaBuilder(dataSource);
if (StrKit.notBlank(config.getTablePrefixes())) {
metaBuilder.setRemovedTableNamePrefixes(config.getTablePrefixes().split(","));
}
if (StrKit.notBlank(config.getExcludedPrefixes())) {
metaBuilder.setSkipPre(config.getExcludedPrefixes().split(","));
}
List<TableMeta> tableMetaList = metaBuilder.build();
CodeGenHelpler.excludeTables(tableMetaList, config.getTableExcluded());
new BaseServiceImplGenerator(servicepackage, modelPackage, serviceimplpackage, outPath).generate(tableMetaList);
System.out.println("service impl generate finished !!!");
}
}

View File

@ -0,0 +1,41 @@
package cc.uling.common.generator.serviceimpl;
import cc.uling.common.generator.service.AppServiceGeneratorConfig;
import io.jboot.app.config.annotation.ConfigModel;
import java.util.Map;
/**
* api代码生成配置
*
* @Author: ccc
*/
public class AppServiceImplGeneratorConfig extends AppServiceGeneratorConfig {
public AppServiceImplGeneratorConfig() {
super();
}
public AppServiceImplGeneratorConfig(String module) {
super(module);
}
private String provider;
public String getProvider() {
return provider;
}
public void setProvider(String provider) {
this.provider = provider;
}
@Override
public AppServiceImplGeneratorConfig initFromMap(Map<String, String> map) {
super.initFromMap(map);
setProvider(map.get("provider"));
return this;
}
}

View File

@ -0,0 +1,98 @@
package cc.uling.common.generator.serviceimpl;
import com.jfinal.kit.Kv;
import com.jfinal.kit.PathKit;
import com.jfinal.kit.StrKit;
import com.jfinal.plugin.activerecord.generator.BaseModelGenerator;
import com.jfinal.plugin.activerecord.generator.TableMeta;
import com.jfinal.template.Engine;
import com.jfinal.template.source.ClassPathSourceFactory;
import java.io.File;
import java.io.FileWriter;
import java.io.IOException;
import java.util.List;
/**
* @Author: ccc
*/
public class BaseServiceImplGenerator extends BaseModelGenerator {
private String modelPacket;
private String servicePackage;
// private String serviceImplPackage;
public BaseServiceImplGenerator(String servicePackage, String modelPacket, String serviceImplPackage, String outPath) {
super(serviceImplPackage, outPath);
this.modelPacket = modelPacket;
this.servicePackage = servicePackage;
String path = AppServiceImplGenerator.class.getName().replace(".", "/");
path = path.replace(AppServiceImplGenerator.class.getSimpleName(), "");
this.template = path + "/service_impl_template.tp";
}
public BaseServiceImplGenerator(String servicePackage, String modelPacket, String serviceImplPackage) {
super(serviceImplPackage, PathKit.getWebRootPath() + "/src/main/java/" + serviceImplPackage.replace(".", "/"));
this.modelPacket = modelPacket;
this.servicePackage = servicePackage;
String path = AppServiceImplGenerator.class.getName().replace(".", "/");
path = path.replace(AppServiceImplGenerator.class.getSimpleName(), "");
this.template = path + "/service_impl_template.tp";
}
@Override
public void generate(List<TableMeta> tableMetas) {
System.out.println("Generate base model ...");
System.out.println("Base Model Output Dir: " + baseModelOutputDir);
Engine engine = Engine.create("forServiceImpl");
engine.setSourceFactory(new ClassPathSourceFactory());
engine.addSharedMethod(new StrKit());
engine.addSharedObject("getterTypeMap", getterTypeMap);
engine.addSharedObject("javaKeyword", javaKeyword);
for (TableMeta tableMeta : tableMetas) {
genBaseModelContent(tableMeta);
}
writeToFile(tableMetas);
}
@Override
protected void genBaseModelContent(TableMeta tableMeta) {
Kv data = Kv.by("serviceImplPackageName", baseModelPackageName);
data.set("generateChainSetter", generateChainSetter);
data.set("tableMeta", tableMeta);
data.set("basePackage", servicePackage);
data.set("modelPackage", modelPacket);
Engine engine = Engine.use("forServiceImpl");
tableMeta.baseModelContent = engine.getTemplate(template).renderToString(data);
}
/**
* base model 覆盖写入
*/
@Override
protected void writeToFile(TableMeta tableMeta) throws IOException {
File dir = new File(baseModelOutputDir);
if (!dir.exists()) {
dir.mkdirs();
}
String target = baseModelOutputDir + File.separator + tableMeta.modelName + "ServiceImpl" + ".java";
File targetFile = new File(target);
if (targetFile.exists()) {
return;
}
FileWriter fw = new FileWriter(target);
try {
fw.write(tableMeta.baseModelContent);
} finally {
fw.close();
}
}
}

View File

@ -0,0 +1,11 @@
package #(serviceImplPackageName);
import io.jboot.aop.annotation.Bean;
import #(basePackage).#(tableMeta.modelName)Service;
import #(modelPackage).#(tableMeta.modelName);
import io.jboot.service.JbootServiceBase;
@Bean
public class #(tableMeta.modelName)Service#(firstCharToUpperCase(implName == null ? 'Impl' : implName)) extends JbootServiceBase<#(tableMeta.modelName)> implements #(tableMeta.modelName)Service {
}

View File

@ -0,0 +1,21 @@
package ${pkg};
<#list imports as impt>
import ${impt};
</#list>
/**
* ${classDesc}
* @author 代码自动生成,切勿手动修改
* @Des d
*/
public class ${className} {
<#list fields as field>
/**
* ${field.fieldDesc}
*/
public static final ${field.fieldType} ${field.fieldName} = ${field.fieldValue};
</#list>
}

View File

@ -0,0 +1,121 @@
package cc.uling.common.manager;
import com.alibaba.fastjson.JSON;
import java.io.InputStream;
import java.lang.reflect.Field;
import java.util.HashMap;
import java.util.Map;
import java.util.Properties;
public class ConfigFactory {
private ConfigFactory() {
}
public static Object initPropByMap(String filePath, Object obj) {
Map<String, String> map = readPropToMap(filePath);
System.out.println("config|"+ JSON.toJSONString(map));
return initPropByMap(map, obj);
}
/**
* 工具方法: 将 Map 的值映射到一个 Model 上
*
* @param map 属性集合
* @param obj 对象, 或类型
* @return 返回实例化后的对象
*/
public static Object initPropByMap(Map<String, String> map, Object obj) {
if (map == null) {
map = new HashMap<>();
}
// 1、取出类型
Class<?> cs = null;
if (obj instanceof Class) {
// 如果是一个类型则将obj=null以便完成静态属性反射赋值
cs = (Class<?>) obj;
obj = null;
} else {
// 如果是一个对象,则取出其类型
cs = obj.getClass();
}
// 2、遍历类型属性反射赋值
for (Field field : cs.getDeclaredFields()) {
String value = map.get(field.getName());
if (value == null) {
// 如果为空代表没有配置此项
continue;
}
try {
Object valueConvert = getValueByType(value, field.getType());
field.setAccessible(true);
field.set(obj, valueConvert);
} catch (IllegalArgumentException | IllegalAccessException e) {
throw new RuntimeException("属性赋值出错:" + field.getName(), e);
}
}
return obj;
}
/**
* 工具方法: 将指定路径的properties配置文件读取到Map中
*
* @param propertiesPath 配置文件地址
* @return 一个Map
*/
public static Map<String, String> readPropToMap(String propertiesPath) {
Map<String, String> map = new HashMap<String, String>();
try {
InputStream is = ConfigFactory.class.getClassLoader().getResourceAsStream(propertiesPath);
if (is == null) {
return null;
}
Properties prop = new Properties();
prop.load(is);
for (String key : prop.stringPropertyNames()) {
map.put(key, prop.getProperty(key));
}
} catch (Exception e) {
e.printStackTrace();
// throw new RuntimeException("配置文件(" + propertiesPath + ")加载失败", e);
}
return map;
}
public static <T> T getValueByType(Object obj, Class<T> cs) {
// 如果 obj 为 null 或者本来就是 cs 类型
if (obj == null || obj.getClass().equals(cs)) {
return (T) obj;
}
// 开始转换
String obj2 = String.valueOf(obj);
Object obj3 = null;
if (cs.equals(String.class)) {
obj3 = obj2;
} else if (cs.equals(int.class) || cs.equals(Integer.class)) {
obj3 = Integer.valueOf(obj2);
} else if (cs.equals(long.class) || cs.equals(Long.class)) {
obj3 = Long.valueOf(obj2);
} else if (cs.equals(short.class) || cs.equals(Short.class)) {
obj3 = Short.valueOf(obj2);
} else if (cs.equals(byte.class) || cs.equals(Byte.class)) {
obj3 = Byte.valueOf(obj2);
} else if (cs.equals(float.class) || cs.equals(Float.class)) {
obj3 = Float.valueOf(obj2);
} else if (cs.equals(double.class) || cs.equals(Double.class)) {
obj3 = Double.valueOf(obj2);
} else if (cs.equals(boolean.class) || cs.equals(Boolean.class)) {
obj3 = Boolean.valueOf(obj2);
} else if (cs.equals(char.class) || cs.equals(Character.class)) {
obj3 = obj2.charAt(0);
} else {
obj3 = (T) obj;
}
return (T) obj3;
}
}

View File

@ -0,0 +1,11 @@
package cc.uling.gen;
import cc.uling.common.generator.main._BaseGenCode;
public class _GenCodeSystem {
public static void main(String[] args) {
String module = "uling-system";
_BaseGenCode.doGenerate(module);
}
}

View File

@ -0,0 +1,13 @@
package cc.uling.gen;
import cc.uling.common.generator.main._BaseGenCode;
public class _GenCodeYC {
public static void main(String[] args) {
String module = "uling-yc-service";
_BaseGenCode.doGenerate(module);
}
}

View File

@ -0,0 +1,11 @@
package cc.uling.gen;
import cc.uling.common.generator.main._BaseGenCode;
public class _GenCodeYCNovel {
public static void main(String[] args) {
String module = "uling-novel-api";
_BaseGenCode.doGenerate(module);
}
}

View File

@ -0,0 +1,10 @@
jboot.datasource.type = mysql
jboot.datasource.url = jdbc:mysql://localhost:3306/yc_system_db?characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=false
jboot.datasource.user = root
jboot.datasource.password = 12345678
## Product DB
#jboot.datasource.type=mysql
#jboot.datasource.url=jdbc:mysql://localhost:3306/yc_system_db?characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=false
#jboot.datasource.user=root
#jboot.datasource.password=MyNewPass4!

View File

@ -0,0 +1,6 @@
# DB table
tablePrefixes=novel_
excludedPrefixes=api_,net_,app_,iot_,sys_,ul_,yc_,ypc_,up_
model=com.web.gen.model
service=com.web.gen.service
provider=com.web.gen.service.impl

View File

@ -0,0 +1,5 @@
tablePrefixes=
excludedPrefixes=net_,app_,iot_,yc_,ypc_
model=com.web.gen.model
service=com.web.gen.service
provider=com.web.gen.service.impl

View File

@ -0,0 +1,11 @@
# DB table
#?????yc_(?`yc_pay_order` ??????: PayOrder)
tablePrefixes=yc_
#???api_,net_,app_,iot_,sys_????
excludedPrefixes=api_,net_,app_,iot_,sys_
#??model??????
model=com.web.gen.model
#??service??????
service=com.web.gen.service
#??serviceImpl??????
provider=com.web.gen.service.impl

View File

@ -0,0 +1,83 @@
<?xml version="1.0" encoding="UTF-8"?>
<module org.jetbrains.idea.maven.project.MavenProjectsManager.isMavenModule="true" type="JAVA_MODULE" version="4">
<component name="NewModuleRootManager" LANGUAGE_LEVEL="JDK_1_8">
<output url="file://$MODULE_DIR$/target/classes" />
<output-test url="file://$MODULE_DIR$/target/test-classes" />
<content url="file://$MODULE_DIR$">
<sourceFolder url="file://$MODULE_DIR$/src/main/java" isTestSource="false" />
<sourceFolder url="file://$MODULE_DIR$/src/main/resources" type="java-resource" />
<excludeFolder url="file://$MODULE_DIR$/target" />
</content>
<orderEntry type="inheritedJdk" />
<orderEntry type="sourceFolder" forTests="false" />
<orderEntry type="library" name="Maven: io.jboot:jboot:3.15.7" level="project" />
<orderEntry type="library" name="Maven: com.jfinal:jfinal:5.0.1" level="project" />
<orderEntry type="library" name="Maven: com.jfinal:cos:2022.2" level="project" />
<orderEntry type="library" name="Maven: com.jfinal:jfinal-undertow:3.1" level="project" />
<orderEntry type="library" name="Maven: io.undertow:undertow-core:2.2.18.Final" level="project" />
<orderEntry type="library" name="Maven: org.jboss.xnio:xnio-api:3.8.7.Final" level="project" />
<orderEntry type="library" name="Maven: org.wildfly.common:wildfly-common:1.5.4.Final" level="project" />
<orderEntry type="library" name="Maven: org.wildfly.client:wildfly-client-config:1.0.1.Final" level="project" />
<orderEntry type="library" scope="RUNTIME" name="Maven: org.jboss.xnio:xnio-nio:3.8.7.Final" level="project" />
<orderEntry type="library" name="Maven: org.jboss.threads:jboss-threads:3.1.0.Final" level="project" />
<orderEntry type="library" name="Maven: io.undertow:undertow-servlet:2.2.18.Final" level="project" />
<orderEntry type="library" name="Maven: javax.servlet:javax.servlet-api:4.0.1" level="project" />
<orderEntry type="library" name="Maven: cglib:cglib:3.3.0" level="project" />
<orderEntry type="library" name="Maven: org.ow2.asm:asm:7.1" level="project" />
<orderEntry type="library" name="Maven: io.undertow:undertow-websockets-jsr:2.2.18.Final" level="project" />
<orderEntry type="library" name="Maven: org.jboss.spec.javax.websocket:jboss-websocket-api_1.1_spec:2.0.0.Final" level="project" />
<orderEntry type="library" name="Maven: com.zaxxer:HikariCP:4.0.3" level="project" />
<orderEntry type="library" name="Maven: com.fasterxml.jackson.core:jackson-core:2.13.3" level="project" />
<orderEntry type="library" name="Maven: com.fasterxml.jackson.core:jackson-annotations:2.13.3" level="project" />
<orderEntry type="library" name="Maven: com.fasterxml.jackson.core:jackson-databind:2.13.3" level="project" />
<orderEntry type="library" name="Maven: com.fasterxml.jackson.dataformat:jackson-dataformat-yaml:2.13.3" level="project" />
<orderEntry type="library" name="Maven: org.yaml:snakeyaml:1.30" level="project" />
<orderEntry type="library" name="Maven: mysql:mysql-connector-java:5.1.49" level="project" />
<orderEntry type="library" name="Maven: de.ruedigermoeller:fst:2.57" level="project" />
<orderEntry type="library" name="Maven: org.objenesis:objenesis:2.5.1" level="project" />
<orderEntry type="library" name="Maven: org.javassist:javassist:3.29.0-GA" level="project" />
<orderEntry type="library" name="Maven: com.alibaba:fastjson:1.2.83" level="project" />
<orderEntry type="library" name="Maven: com.google.guava:guava:31.1-jre" level="project" />
<orderEntry type="library" name="Maven: com.google.guava:failureaccess:1.0.1" level="project" />
<orderEntry type="library" name="Maven: com.google.guava:listenablefuture:9999.0-empty-to-avoid-conflict-with-guava" level="project" />
<orderEntry type="library" name="Maven: com.google.code.findbugs:jsr305:3.0.2" level="project" />
<orderEntry type="library" name="Maven: org.checkerframework:checker-qual:3.12.0" level="project" />
<orderEntry type="library" name="Maven: com.google.errorprone:error_prone_annotations:2.11.0" level="project" />
<orderEntry type="library" name="Maven: com.google.j2objc:j2objc-annotations:1.3" level="project" />
<orderEntry type="library" name="Maven: it.sauronsoftware.cron4j:cron4j:2.2.5" level="project" />
<orderEntry type="library" name="Maven: org.jsoup:jsoup:1.14.3" level="project" />
<orderEntry type="library" name="Maven: com.github.ben-manes.caffeine:caffeine:2.9.3" level="project" />
<orderEntry type="library" name="Maven: commons-io:commons-io:2.11.0" level="project" />
<orderEntry type="library" name="Maven: javax.annotation:javax.annotation-api:1.3.2" level="project" />
<orderEntry type="library" name="Maven: org.hibernate.validator:hibernate-validator:6.0.21.Final" level="project" />
<orderEntry type="library" name="Maven: org.jboss.logging:jboss-logging:3.3.2.Final" level="project" />
<orderEntry type="library" name="Maven: com.fasterxml:classmate:1.3.4" level="project" />
<orderEntry type="library" name="Maven: org.glassfish:javax.el:3.0.0" level="project" />
<orderEntry type="library" name="Maven: io.dropwizard.metrics:metrics-core:4.2.9" level="project" />
<orderEntry type="library" name="Maven: io.dropwizard.metrics:metrics-servlets:4.2.9" level="project" />
<orderEntry type="library" name="Maven: io.dropwizard.metrics:metrics-json:4.2.9" level="project" />
<orderEntry type="library" name="Maven: com.helger:profiler:1.1.1" level="project" />
<orderEntry type="library" name="Maven: io.dropwizard.metrics:metrics-healthchecks:4.2.9" level="project" />
<orderEntry type="library" name="Maven: io.dropwizard.metrics:metrics-jvm:4.2.9" level="project" />
<orderEntry type="library" name="Maven: io.jsonwebtoken:jjwt:0.9.1" level="project" />
<orderEntry type="library" name="Maven: c3p0:c3p0:0.9.1.2" level="project" />
<orderEntry type="library" name="Maven: com.alibaba:druid:1.0.21" level="project" />
<orderEntry type="library" name="Maven: org.apache.commons:commons-pool2:2.4.3" level="project" />
<orderEntry type="library" name="Maven: redis.clients:jedis:3.2.0" level="project" />
<orderEntry type="library" scope="PROVIDED" name="Maven: org.projectlombok:lombok:1.18.16" level="project" />
<orderEntry type="library" name="Maven: ch.qos.logback:logback-core:1.2.3" level="project" />
<orderEntry type="library" name="Maven: ch.qos.logback:logback-classic:1.2.3" level="project" />
<orderEntry type="library" name="Maven: org.slf4j:slf4j-api:1.7.30" level="project" />
<orderEntry type="library" name="Maven: log4j:log4j:1.2.17" level="project" />
<orderEntry type="library" name="Maven: org.apache.logging.log4j:log4j-core:2.23.1" level="project" />
<orderEntry type="library" name="Maven: org.apache.logging.log4j:log4j-api:2.23.1" level="project" />
<orderEntry type="library" name="Maven: javax.validation:validation-api:2.0.1.Final" level="project" />
<orderEntry type="library" name="Maven: commons-logging:commons-logging:1.2" level="project" />
<orderEntry type="library" name="Maven: org.apache.commons:commons-lang3:3.6" level="project" />
<orderEntry type="library" name="Maven: commons-codec:commons-codec:1.10" level="project" />
<orderEntry type="library" name="Maven: cn.hutool:hutool-all:5.8.29" level="project" />
<orderEntry type="library" name="Maven: pro.fessional:kaptcha:2.3.3" level="project" />
<orderEntry type="library" name="Maven: com.jhlabs:filters:2.0.235-1" level="project" />
<orderEntry type="library" name="Maven: eu.bitwalker:UserAgentUtils:1.19" level="project" />
</component>
</module>