AppRun.java
8.87 KB
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
64
65
66
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
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) {
}
}