Blame view

src/main/java/com/rnt/AppRun.java 8.87 KB
e80df919   atao   init
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
  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 {
e80df919   atao   init
64
              PropKit.use(pro);
544e2bea   atao   提交代码
65
66
          } catch (Exception e) {
              PropKit.use(dev);
e80df919   atao   init
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
              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"));
  
          /**
           *  是否对消息进行加密,对应于微信平台的消息加解密方式:
           *  1true进行加密且必须配置 encodingAesKey
           *  2false采用明文模式,同时也支持混合模式
           */
          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. 上线时应保证此处isLocalDevfalse,或者注释掉该不分代码!
           *
           * 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) {
  
      }
  }