package com.rnt; import java.util.HashMap; import java.util.Map; import com.jfinal.config.Constants; import com.jfinal.config.Handlers; import com.jfinal.config.Interceptors; import com.jfinal.config.JFinalConfig; import com.jfinal.config.Plugins; import com.jfinal.config.Routes; import com.jfinal.core.JFinal; import com.jfinal.kit.PropKit; import com.jfinal.plugin.activerecord.ActiveRecordPlugin; import com.jfinal.plugin.activerecord.dialect.MysqlDialect; import com.jfinal.plugin.druid.DruidPlugin; import com.jfinal.plugin.redis.Redis; import com.jfinal.plugin.redis.RedisPlugin; import com.jfinal.template.Engine; import com.jfinal.weixin.sdk.api.ApiConfig; import com.jfinal.weixin.sdk.api.ApiConfigKit; import com.jfinal.weixin.sdk.cache.RedisAccessTokenCache; import com.jfinal.wxaapp.WxaConfig; import com.jfinal.wxaapp.WxaConfigKit; import com.rnt.commo.enums.DSEnum; import com.rnt.commo.interceptor.BindInterceptor; import com.rnt.commo.interceptor.CorsInterceptor; import com.rnt.commo.interceptor.ExceInterceptor; import com.rnt.controller.ParkCustBindingController; import com.rnt.controller.ParkLotController; import com.rnt.controller.WeixinApiController; import com.rnt.controller.WeixinMsgController; import com.rnt.controller.WeixinPayController; import com.rnt.controller.WxaUserApiController; import org.beetl.core.GroupTemplate; import org.beetl.ext.jfinal3.JFinal3BeetlRenderFactory; import org.beetl.sql.core.kit.StringKit; /** * Copyright: Copyright (c) 2017 zteits * * @ClassName: com.rnt * @Description: * @version: v1.0.0 * @author: atao * @date: 2017/6/6 下午2:54 * Modification History: * Date Author Version Description * ---------------------------------------------------------* * 2017/6/6 atao v1.0.0 创建 */ public class AppRun extends JFinalConfig { // 本地开发模式 private boolean isLocalDev = false; /** * 如果生产环境配置文件存在,则优先加载该配置,否则加载开发环境配置文件 * * @param pro 生产环境配置文件 * @param dev 开发环境配置文件 */ public void loadProp(String pro, String dev) { try { PropKit.use(pro); } catch (Exception e) { PropKit.use(dev); isLocalDev = true; } } @Override public void configConstant(Constants me) { loadProp("a_little_config_pro.txt", "a_little_config.txt"); me.setDevMode(PropKit.getBoolean("devMode", false)); // ApiConfigKit 设为开发模式可以在开发阶段输出请求交互的 xml 与 json 数据 ApiConfigKit.setDevMode(me.getDevMode()); //配置页面渲染组件为Beetl JFinal3BeetlRenderFactory rf = new JFinal3BeetlRenderFactory(); rf.config(); me.setRenderFactory(rf); GroupTemplate gt = rf.groupTemplate; //根据gt可以添加扩展函数,格式化函数,共享变量等, Map shards = new HashMap(); shards.put("host", PropKit.get("app.host")); shards.put("staticHost", PropKit.get("app.staticHost")); gt.setSharedVars(shards); } @Override public void configRoute(Routes me) { me.add("/msg", WeixinMsgController.class); me.add("/api", WeixinApiController.class, "/api"); me.add("/pay", WeixinPayController.class,"/"); me.add("/wxa/user", WxaUserApiController.class); me.add("/park", ParkLotController.class, "/"); me.add("/binding", ParkCustBindingController.class, "/"); } @Override public void configPlugin(Plugins me) { //多数据源配置 park数据源 DruidPlugin parkDruidPlugin = new DruidPlugin(PropKit.get("park.druid.url"), PropKit.get("park.druid.username"), PropKit.get("park.druid.password").trim()); me.add(parkDruidPlugin); ActiveRecordPlugin parkArp = new ActiveRecordPlugin(DSEnum.PARK_DATASOURCE.name(), parkDruidPlugin); parkArp.setShowSql(true); parkArp.setDialect(new MysqlDialect()); com.rnt.model.park._MappingKit.mapping(parkArp); me.add(parkArp); //多数据源配置 zf数据源 DruidPlugin zfDruidPlugin = new DruidPlugin(PropKit.get("zf.druid.url"), PropKit.get("zf.druid.username"), PropKit.get("zf.druid.password").trim()); me.add(zfDruidPlugin); ActiveRecordPlugin zfArp = new ActiveRecordPlugin(DSEnum.ZF_DATASOURCE.name(), zfDruidPlugin); zfArp.setShowSql(true); zfArp.setDialect(new MysqlDialect()); com.rnt.model.zf._MappingKit.mapping(zfArp); me.add(zfArp); String redisPass = PropKit.get("redis.password"); //Redis 缓存配置 RedisPlugin redisPlugin; if (StringKit.isEmpty(redisPass)) { redisPlugin = new RedisPlugin("weixin", PropKit.get("redis.host"), PropKit.getInt("redis.port")); } else { redisPlugin = new RedisPlugin("weixin", PropKit.get("redis.host"), PropKit.getInt("redis.port"), redisPass); } me.add(redisPlugin); // C3p0Plugin c3p0Plugin = new C3p0Plugin(PropKit.get("jdbcUrl"), PropKit.get("user"), PropKit.get // ("password").trim()); // me.add(c3p0Plugin); // EhCachePlugin ecp = new EhCachePlugin(); // me.add(ecp); // 使用redis分布accessToken // RedisPlugin redisPlugin = new RedisPlugin("weixin", "127.0.0.1"); // redisPlugin.setSerializer(JdkSerializer.me); // 需要使用fst高性能序列化的用户请删除这一行(Fst jar依赖请查看WIKI) // me.add(redisPlugin); } @Override public void configInterceptor(Interceptors me) { /**注意:拦截器的配置顺序不能变*/ //运行跨域访问 me.addGlobalActionInterceptor(new CorsInterceptor()); //统一异常处理 me.addGlobalActionInterceptor(new ExceInterceptor()); //微信绑定拦截器 me.addGlobalActionInterceptor(new BindInterceptor()); // 设置默认的 appId 规则,默认值为appId,可采用url挂参数 ?appId=xxx 切换多公众号 // ApiInterceptor.setAppIdParser(new AppIdParser.DefaultParameterAppIdParser("appId")); 默认无需设置 // MsgInterceptor.setAppIdParser(new AppIdParser.DefaultParameterAppIdParser("appId")); 默认无需设置 } @Override public void configHandler(Handlers me) { } @Override public void afterJFinalStart() { // 1.5 之后支持redis存储access_token、js_ticket,需要先启动RedisPlugin // ApiConfigKit.setAccessTokenCache(new RedisAccessTokenCache()); // 1.6新增的2种初始化 //启用Redis 缓存 ApiConfigKit.setAccessTokenCache(new RedisAccessTokenCache(Redis.use("weixin"))); // ApiConfigKit.setAccessTokenCache(new RedisAccessTokenCache("weixin")); ApiConfig ac = new ApiConfig(); // 配置微信 API 相关参数 ac.setToken(PropKit.get("token")); ac.setAppId(PropKit.get("appId")); ac.setAppSecret(PropKit.get("appSecret")); /** * 是否对消息进行加密,对应于微信平台的消息加解密方式: * 1:true进行加密且必须配置 encodingAesKey * 2:false采用明文模式,同时也支持混合模式 */ ac.setEncryptMessage(PropKit.getBoolean("encryptMessage", false)); ac.setEncodingAesKey(PropKit.get("encodingAesKey", "setting it in config file")); /** * 多个公众号时,重复调用ApiConfigKit.putApiConfig(ac)依次添加即可,第一个添加的是默认。 */ ApiConfigKit.putApiConfig(ac); /** * 1.9 新增LocalTestTokenCache用于本地和线上同时使用一套appId时避免本地将线上AccessToken冲掉 * * 设计初衷:https://www.oschina.net/question/2702126_2237352 * * 注意: * 1. 上线时应保证此处isLocalDev为false,或者注释掉该不分代码! * * 2. 为了安全起见,此处可以自己添加密钥之类的参数,例如: * http://localhost/weixin/api/getToken?secret=xxxx * 然后在WeixinApiController#getToken()方法中判断secret * * @see WeixinApiController#getToken() */ // if (isLocalDev) { // String onLineTokenUrl = "http://localhost/weixin/api/getToken"; // ApiConfigKit.setAccessTokenCache(new LocalTestTokenCache(onLineTokenUrl)); // } WxaConfig wc = new WxaConfig(); wc.setAppId("wx4f53594f9a6b3dcb"); wc.setAppSecret("eec6482ba3804df05bd10895bace0579"); WxaConfigKit.setWxaConfig(wc); } public static void main(String[] args) { JFinal.start("src/main/webapp", 8080, "/"); } @Override public void configEngine(Engine engine) { } }