AppRun.java 8.87 KB
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<String, Object> shards = new HashMap<String, Object>();
        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) {

    }
}