❦ treeleaf 树叶-java框架
treeleaf-cache 缓存框架
提供基于redis和本地内存两种缓存操作封装(集成连接池)
CacheConfig cacheConfig = new CacheConfig();
cacheConfig.setType(0);//设置缓存类型,0为redis,1为本地缓存
cacheConfig.setHost("192.168.0.1");//设置redis远程地址
cacheConfig.setPassword("treeleaf");//设置redis密码,没密码可不设置
cacheConfig.setPort(6379);//redis端口
cacheConfig.setMaxTotal(30);//连接池最大大小
cacheConfig.init();//初始化
User user = new User();
user.setId("123");
user.setUsername("张三");
Cache cache = CacheFactory.getCache();
cache.set("user@123", user, 60);//以key为"user@123"存在redis中,设置60秒超时
cache.pushQueue("myQueue", user);//将user插入名为"myQueue"的列尾
List list = new ArrayList();
list.add(user);
cache.setList("myList", list, 60);//将一个list存到redis,设置60秒超时
Map map = new HashMap()
map.put("123", "张三");
cache.setMap("myMap", map, 60);//以key为"myMap"设置一个map,60秒超时
cache.setMapValue("myMap", "456", "李四");//增加一个key为456,value为李四的数据到myMap中
user = cache.popQueue("myQueue", User.class);//从list的头部取出数据
user = cache.get("user@123", User.class);
List<User> users = cache.getList("myList", User.class);
String value = cache.getMapValue("myMap", "456");
cache.del("user@123");//删除key为user@123的数据
treeleaf-common 通用工具类
提供分页标准,查询结果集标准,bean操作,http访问,断言,数据加解密,唯一id生成,浮点数精确计算,模版生成,手机邮箱格式验证
//bean操作
Map map = new HashMap();
map.put("id", "123");
map.put("username", "张三");
User user = FastBeanUtils.fastPopulate(User.class, map);
String json = Jsoner.toJson(user);
user = Jsoner.toObj(user);
//http访问
Map<String, String> param = new HashMap<>();
param.put("a", "1");
param.put("b", "2");
String r = new Get("https://xxx.com").param("c", "3").params(param).get();
String r2 = new Post("https://xxx.com")
.header("Content-Type", "application/x-www-form-urlencoded")
.body("a=1&b=2&c=3")
.post(new FileOutputStream(new File("xxx")));
//断言(所以断言不成功的都会抛出AssertException,附带有失败的提示信息,客户端可以统一拦截并转义)
Assert.notNull(user, "用户对象不能为空");
Assert.hasText(user.getUsername(), "用户名不能为空");
AssertEx.hasText(user.getUsername())
.setRetCode("999999")
.throwEx("用户{}的用户名不能为空", user.getId());
//数据加密
byte [] byteKey = Des3.build3DesKey();
String byte2Base64Key = Des3.build3DesKeyToBase64();
byte [] result = Des3.encrypt("123".getByte("utf-8"), byteKey);//无论在什么时候调用getByte(),都要记得指定编码
String result2 = Des3.encryptToBase64("123", byte2Base64Key);
//另还有RSA, sha-1, sha-2
//唯一ID生成
ID.get();//参考了mongodb的ID生成策略,有序,全局唯一,但如果忽略了大小写则有可能会重复
Uuid.buildBase64UUID();//改进了uuid,由原来36位缩减到了22位长度
//浮点数精确计算
//因为java的浮点数计算中存在着失真的问题
//所有涉及到浮点数运算的都最好使用BigDecimal,且构造BigDecimal时必须是字符串的入参,否则还是会失真)
double a = Maths.add(0.2, 0.1, 0.1);
double b = Maths.subtract(0.2, 0.1, 0.1, 0.1);
double c = Maths.multiply(0.2, 0.1, 0.1);
double d = Maths.divide(0.2, 0.1, 0.1);
//手机邮箱格式验证
new MobileNumValidator().validate("15912345678");
new EmailValidator().validate("[email protected]");
treeleaf-db 数据库操作扩展
提供简易的数据库操作,无需编写SQL
//treeleaf-db是建立于基于Model的,所以必须最好要有一个Model:
/**
* 每个凡是要映射到数据库字段的属性都需用@Column标识,
* 如果是主键,则需要加上primaryKey=true,
* autoIncremen,表示是数据库是否自增长,但只支持mysql,不建议使用,因为对
* 数据库扩展(分库分表,换数据库等)比较限制,默认为false
* 如果跟数据库字段名不一致, 可以设置value="数据库实际字段名",
* requrie用于标识属性在保存或修改的时候是否必须不能为空, 可不设置该值,默认为false
*/
@Table("t_user")//标注实际的数据库表名
public class User extends Model {
/**
* 用户id
*/
//使用
@Column(primaryKey = true)
private String id;
/**
* 用户名
*/
@Column(requrie=true)
private String username;
/**
* 密码
*/
@Column
private String password;
//get set...
}
User user = new User();
user.setId("123");
user.setUsername("张三");
//设置数据源
DBConnectionFactory factory = new DefaultDBConnectionFactoryImpl();
factory.setDataSource(dataSource);
//构建数据模型操作对象
DBModelOperator operator = new MySqlDBModelOperator();
operator.save(user);//保存
user.setName("张二");
operator.update(user);//更新
user = operator.findById(user.getId(), User.class);//根据id查找
//如果多条件查询或者统计总数据怎么.? 可以使用Example!
//先定义一个Example,一个Example最好对应一个模型
public class UserExample extends Example<UserExample.UserCriteria> {
@Override
protected UserCriteria createCriteriaInternal() {
return new UserCriteria();
}
public static class UserCriteria extends Criteria {
public UserCriteria andMobileEqualTo(String v) {
return addCriterion("a.mobile =", v, "mobile");
}
public PeriodCriteria andUsernameIsNotNull() {
return addCriterion("a.username is not null");
}
public UserCriteria andUsernameLike(String v) {
return addCriterion("a.username like", '%' + v + '%', "username");
}
}
}
UserExample example = new UserExample();
//加上查询条件
example.createCriteria().andMobileEqualTo("159123467").andUsernameLike("张");
example.or().andUsernameIsNotNull();
//分页
example.setPageable(new Pageable(1, 10));//从第一页开始,每页10条
//排序
example.setOrderByClause("id desc");
List<UserModel> list = operator.findByExample(example, UserModel.class);//查询
long total = operator.countByExample(example, UserModel.class);//统计总数
//推荐使用PageResult对象返回
PageResult pageResult = new PageResult<>(example.getPageable(), list, total);
treeleaf-web web框架
封装Spring MVC,提供明朗的返回类型,日志打印,异常捕获转义,客户端信息获取
<!--配置spring mvc-->
<mvc:annotation-driven>
<mvc:argument-resolvers>
<bean class="org.treeleaf.web.spring.handler.ParamHandlerMethodArgumentResolver"/>
<bean class="org.treeleaf.web.spring.handler.ClientInfoHandlerMethodArgumentResolver"/>
</mvc:argument-resolvers>
<mvc:return-value-handlers>
<bean class="org.treeleaf.web.spring.handler.TextHandlerMethodReturnValueHandler"/>
<bean class="org.treeleaf.web.spring.handler.HtmlHandlerMethodReturnValueHandler"/>
<bean class="org.treeleaf.web.spring.handler.RedirectHandlerMethodReturnValueHandler"/>
</mvc:return-value-handlers>
</mvc:annotation-driven>
<!-- 拦截器 -->
<mvc:interceptors>
<mvc:interceptor>
<mvc:mapping path="/**"/>
<mvc:exclude-mapping path="/**/*.js"/>
<mvc:exclude-mapping path="/**/*.css"/>
<mvc:exclude-mapping path="/**/*.jpg"/>
<mvc:exclude-mapping path="/**/*.gif"/>
<mvc:exclude-mapping path="/**/*.png"/>
<mvc:exclude-mapping path="/file/**"/>
<bean class="org.treeleaf.web.spring.interceptor.MultipleHandlerInerceptor">
<property name="handlers">
<list>
<!--增加接口访问参数, 耗时, 异常打印-->
<bean class="org.treeleaf.web.spring.interceptor.PrintLogHandlerInerceptor"/>
<!--使用treeleaf-db配合spring-jdbc时可以配置该拦截器进行数据库连接资源回收-->
<bean class="org.treeleaf.web.spring.interceptor.DBConnectionHandlerInterceptor"/>
</list>
</property>
</bean>
</mvc:interceptor>
</mvc:interceptors>
<!--异常处理,对于请求网页的会返回错误页面,对于请求json格式的会返回json格式的信息-->
<bean class="org.treeleaf.web.spring.resovler.ExHandlerExceptionResolver">
<!--默认响应码-->
<property name="status" value="200"/>
<property name="exExceptionHanlder">
<bean class="com.syyg.mobile.ext.MobileExceptionHandler">
<!--配置错误跳转页面-->
<property name="errorView" value="/error"/>
<!--是否采用redirect跳转-->
<property name="redirect" value="false"/>
<!--默认提示语-->
<property name="tip" value="网络繁忙,请稍后尝试"/>
</bean>
</property>
</bean>
@Controller
@RequestMapping("user")
public class UserController {
//返回Html页面
@RequestMapping("index.html")
public Html index() {
User user = new User();
user.setId("123");
return new Html(user);//默认跳到spring mvc配置的网页根路径下的user/index.jsp, 同时会放置一个名为model的对象到require的attribute里面
//return new Html("/user/index", user);//强制指定跳转到哪个jsp
}
//前端跳转的方式前往user/index.html页面
@RequestMapping("home.html")
public Html home() {
return new Redirect("/user/index.html");
}
//返回json数据
@RequestMapping("basicinfo.json")
public Json basicinfo(String userId) {
Assert.notNull(userId, "用户id不能为空");
User user = new User();
return new Json(user);
}
//提供jsonp的方式供其它域名下的js调用
@RequestMapping("basicinfo.jsonp")
public Jsonp basicinfoJsonp(ClientInfo clientInfo) {
Assert.notNull(userId, "用户id不能为空");
log.info("客户端ip:{},是否移动端:{}", clientInfo.getIp(), clientInfo.isMobile());
User user = new User();
return new Jsonp(user);
}
//返回纯文本
@RequestMapping("status")
public Text status(Param param) {
log.info("传入参数:{}", param.asMap());
return new Text(Text.CONTENT_TYPE_XML, "<xml>\n" +
"<return_code><![CDATA[SUCCESS]]></return_code>\n" +
"<return_msg><![CDATA[OK]]></return_msg>\n" +
"</xml>");
}
//返回json数据,专供Extjs调用
@RequestMapping("basicinfo.json")
public ExtJson basicinfoExt(String userId) {
Assert.notNull(userId, "用户id不能为空");
User user = new User();
return new ExtJson(user);
}
}
treeleaf-webchat 微信模块
提供了一些微信js sdk上需要用到的微信接口操作, 以及微信支付,微信红包功能
//微信Jssdk类接口
Jssdk jssdk = new Jssdk();
jssdk.setAppid("appid");
jssdk.setSecret("secret");
String at = jssdk.access_token();
SnsUserInfo userInfo = jssdk.snsuserinfo(at, "opendid");
//具体其它接口见Jssdk
//微信支付
//统一下单接口, 获取微信支付链接
UnifiedOrder unifiedOrder = new UnifiedOrder();
//设置入参
unifiedOrder.setDevice_info(WechatPay.DEVICE_INFO);
unifiedOrder.setBody("产品名称");
unifiedOrder.setOut_trade_no("订单号");
unifiedOrder.setFee_type("CNY");
unifiedOrder.setTotal_fee(String.valueOf(Maths.multiply(1, 100D).intValue()));//单位是分
unifiedOrder.setSpbill_create_ip("127.0.0.1");
unifiedOrder.setNotify_url("自己的通知地址");
unifiedOrder.setTrade_type("交易类型");//取值如下:JSAPI,NATIVE,APP,WAP
unifiedOrder.setOpenid("openid");
WechatPay wechatPay = new WechatPay();
wechatPay.setAppid("appid");
wechatPay.setMerchantNo("merchantNo");
wechatPay.setKey("key");
UnifiedOrderResult orderResult = wechatPay.unifiedorder(unifiedOrder);
//另wechatPay提供js sdk支付和支付结果通知验签
//wechatPay.jsapi(xxx)
//wechatPay.notice(xml)
//微信红包(有普通也有裂变)
WechatRedpack wechatRedpack = new WechatRedpack();
wechatRedpack.setAppid("appid");
wechatRedpack.setKey("key");
wechatRedpack.setMerchantNo("merchantNo");
wechatRedpack.setCertPath("apiclient_cert.p12");
DateFormat format = new SimpleDateFormat("yyyyMMddHHmmssSSS");
String billNo = "RB" + format.format(new Date()) + new Random().nextInt(10);
Redpack redpack = new Redpack();
redpack.setMch_billno(billNo);
redpack.setSend_name("sendName");
redpack.setRe_openid("openId");
redpack.setTotal_amount("10");
redpack.setTotal_num("1");
redpack.setWishing("wishing");
redpack.setClient_ip("127.0.0.1");
redpack.setAct_name("actName");
redpack.setRemark("remarke");
RedpackResult result = wechatRedpack.send(redpack);
treeleaf-queue 队列客户端框架
暂时提供了kafka的操作封装
treeleaf-config 配置管理
暂时提供了基于zookeeper的配置管理