You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

208 lines
7.3 KiB

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

package com.dsideal.base;
import cn.hutool.core.io.FileUtil;
import com.cybermkd.mongo.plugin.MongoJFinalPlugin;
import com.dsideal.base.Admin.Controller.LoginController;
import com.dsideal.base.Index.Controller.IndexController;
import com.dsideal.base.Interceptor.*;
import com.dsideal.base.Util.LogBackLogFactory;
import com.jfinal.config.*;
import com.jfinal.kit.PathKit;
import com.jfinal.kit.PropKit;
import com.jfinal.kit.StrKit;
import com.jfinal.plugin.activerecord.ActiveRecordPlugin;
import com.jfinal.plugin.activerecord.dialect.MysqlDialect;
import com.jfinal.plugin.hikaricp.HikariCpPlugin;
import com.jfinal.server.undertow.UndertowServer;
import com.jfinal.template.Engine;
import java.io.File;
public class Start extends JFinalConfig {
//配置文件
public static void main(String[] args) {
//配置文件
String configFile = "application_dev.properties";
String myEnvVar = System.getenv("WORKING_ENV");
if (myEnvVar != null) {
configFile = configFile.replace("_dev", "_pro");
System.out.println("环境变量 WORKING_ENV 的值是: " + myEnvVar);
} else {
System.out.println("环境变量 WORKING_ENV 未设置。");
}
PropKit.use(configFile);
UndertowServer.create(Start.class, "undertow.properties").start();
}
/**
* 配置常量
*/
@Override
public void configConstant(Constants me) {
//使用LogBack
me.setLogFactory(new LogBackLogFactory());
}
/**
* 配置路由
*/
@Override
public void configRoute(Routes me) {
//默认页面
me.add("/", IndexController.class);
//登录路由
me.add("/login", LoginController.class);
}
@Override
public void configEngine(Engine engine) {
}
/**
* 配置插件
*/
private String connectionTestQuery = "select 1";
// 连接池中允许的最大连接数。缺省值10推荐的公式((core_count * 2) + effective_spindle_count)
private int maxPoolSize = 10;
// 一个连接 idle 状态的最大时长(毫秒),超时则被释放(retired),缺省:10分钟
private long idleTimeoutMs = 600000;
private long maxLifetimeMs = 1800000;
// 等待连接池分配连接的最大时长(毫秒),超过这个时长还没可用的连接则发生 SQLException 缺省:30秒
private long connectionTimeoutMs = 30000;
@Override
public void configPlugin(Plugins me) {
HikariCpPlugin hpPlugin = new HikariCpPlugin(PropKit.get("jdbcUrl"), PropKit.get("user"),
PropKit.get("password").trim(), PropKit.get("driverClassName"));
hpPlugin.setConnectionTestQuery(connectionTestQuery);
hpPlugin.setConnectionTimeout(connectionTimeoutMs);
hpPlugin.setIdleTimeout(idleTimeoutMs);
hpPlugin.setMaxLifetime(maxLifetimeMs);
hpPlugin.setMaximumPoolSize(maxPoolSize);
String jdbcUrlSlave = PropKit.get("jdbcUrlSlave");
if (StrKit.isBlank(jdbcUrlSlave)) jdbcUrlSlave = PropKit.get("jdbcUrl");
HikariCpPlugin slavePlugin = new HikariCpPlugin(jdbcUrlSlave, PropKit.get("user"),
PropKit.get("password").trim(), PropKit.get("driverClassName"));
slavePlugin.setConnectionTestQuery(connectionTestQuery);
slavePlugin.setConnectionTimeout(connectionTimeoutMs);
slavePlugin.setIdleTimeout(idleTimeoutMs);
slavePlugin.setMaxLifetime(maxLifetimeMs);
slavePlugin.setMaximumPoolSize(maxPoolSize);
me.add(hpPlugin);
me.add(slavePlugin);
// 配置ActiveRecord插件
ActiveRecordPlugin arp = new ActiveRecordPlugin(hpPlugin);
//遍历sql目录下所有的sql文件
File sqlDir;
String basePath = PathKit.getRootClassPath();
sqlDir = new File(basePath + "/Sql");
File[] sqlFiles = sqlDir.listFiles();
for (File sqlFile : sqlFiles != null ? sqlFiles : new File[0]) {
//只加载.sql文件
if (sqlFile.getName().indexOf(".sql") > 0) {
arp.addSqlTemplate("/Sql/" + sqlFile.getName());
}
}
arp.setShowSql(true);
arp.setDialect(new MysqlDialect());
//加载
me.add(arp);
//集成MongoDb
String mongodbUri = PropKit.get("mongodbUri");
MongoJFinalPlugin jFinalPlugin = new MongoJFinalPlugin();
// 验证连接字符串是否以预期的前缀开始
if (!mongodbUri.startsWith("mongodb://")) {
System.out.println("Invalid connection string format.");
return;
}
// 解析用户名和密码
int atIndex = mongodbUri.indexOf("@");
if (atIndex == -1) {
System.out.println("Username and password section is missing.");
return;
}
String userInfo = mongodbUri.substring("mongodb://".length(), atIndex);
String[] userInfoParts = userInfo.split(":");
String username = userInfoParts[0];
String password = userInfoParts.length > 1 ? userInfoParts[1] : "";
// 提取服务器地址列表
int slashIndex = mongodbUri.indexOf("/", atIndex + 1);
if (slashIndex == -1) {
System.out.println("No database name found.");
return;
}
String serverAddresses = mongodbUri.substring(atIndex + 1, slashIndex);
String[] servers = serverAddresses.split(",");
// 提取数据库名称,忽略查询参数
int questionMarkIndex = mongodbUri.indexOf("?", slashIndex);
String dbName = questionMarkIndex == -1
? mongodbUri.substring(slashIndex + 1)
: mongodbUri.substring(slashIndex + 1, questionMarkIndex);
jFinalPlugin.setDatabase(dbName);
jFinalPlugin.auth(username, password);
for (String server : servers) {
// 分割服务器地址以获取IP和端口
int portIndex = server.lastIndexOf(":");
String ipWithAt = server.substring(0, portIndex);
String ip = ipWithAt.substring(ipWithAt.indexOf("@") + 1);
String port = server.substring(portIndex + 1);
jFinalPlugin.add(ip, Integer.parseInt(port));
}
me.add(jFinalPlugin);
}
/**
* 配置全局拦截器
*/
@Override
public void configInterceptor(Interceptors me) {
//注册参数数字检查器
me.add(new IsNumbericInterceptor());
//注册Ids检查是不是数字的检查器
me.add(new CheckIdsInterceptor());
//注册一个GUID号的检查器
me.add(new IsGuidInterceptor());
//注册一个检查输入文本长度的拦截器
me.add(new LengthInterceptor());
//JWT检查器
me.add(new JwtCheckInterceptor());
}
/**
* 配置处理器
*/
@Override
public void configHandler(Handlers me) {
}
/**
* 在jfinal启动完成后马上执行
*/
@Override
public void onStart() {
//打印 启动Logo
String path = Start.class.getClassLoader().getResource("logo.txt").getPath();
File file = new File(path);
System.out.println(FileUtil.readUtf8String(file));
}
}