Repository: mafly/SpringDemo Branch: master Commit: 852a6e8e295e Files: 100 Total size: 86.7 KB Directory structure: gitextract_vs5nz4fg/ ├── .classpath ├── .gitignore ├── .project ├── .settings/ │ ├── .jsdtscope │ ├── org.eclipse.jdt.core.prefs │ ├── org.eclipse.wst.common.component │ ├── org.eclipse.wst.common.project.facet.core.xml │ ├── org.eclipse.wst.jsdt.ui.superType.container │ └── org.eclipse.wst.jsdt.ui.superType.name ├── WebContent/ │ ├── META-INF/ │ │ └── MANIFEST.MF │ ├── WEB-INF/ │ │ ├── applicationContext.xml │ │ ├── lib/ │ │ │ ├── AXMLPrinter2.jar │ │ │ ├── activemq-broker-5.13.0.jar │ │ │ ├── activemq-client-5.13.0.jar │ │ │ ├── activemq-console-5.13.0.jar │ │ │ ├── activemq-jaas-5.13.0.jar │ │ │ ├── activemq-pool-5.13.0.jar │ │ │ ├── activemq-protobuf-1.1.jar │ │ │ ├── activemq-spring-5.13.0.jar │ │ │ ├── activemq-web-5.13.0.jar │ │ │ ├── aopalliance.jar │ │ │ ├── aspectjweaver-1.6.9.jar │ │ │ ├── commons-beanutils.jar │ │ │ ├── commons-collections.jar │ │ │ ├── commons-fileupload-1.3.1.jar │ │ │ ├── commons-io-2.4.jar │ │ │ ├── commons-lang.jar │ │ │ ├── commons-logging-1.1.3.jar │ │ │ ├── dom4j-1.6.1.jar │ │ │ ├── druid-1.0.9.jar │ │ │ ├── freemarker.jar │ │ │ ├── geronimo-j2ee-management_1.1_spec-1.0.1.jar │ │ │ ├── geronimo-jms_1.1_spec-1.1.1.jar │ │ │ ├── geronimo-jta_1.0.1B_spec-1.0.1.jar │ │ │ ├── gson-2.5.jar │ │ │ ├── httpclient-4.5.2.jar │ │ │ ├── httpcore-4.4.4.jar │ │ │ ├── jaxen-1.1-beta-6.jar │ │ │ ├── jdom.jar │ │ │ ├── jpush-client-3.2.9.jar │ │ │ ├── jstl-1.2.1.jar │ │ │ ├── jstl-api-1.2.1.jar │ │ │ ├── log4j-1.2.17.jar │ │ │ ├── mchange-commons-java-0.2.3.1.jar │ │ │ ├── mysql-connector-java-5.1.18.jar │ │ │ ├── okhttp-2.7.2.jar │ │ │ ├── okio-1.6.0.jar │ │ │ ├── poi-3.9-20121203.jar │ │ │ ├── poi-ooxml-3.9-20121203.jar │ │ │ ├── poi-ooxml-schemas-3.9-20121203.jar │ │ │ ├── servlet-api.jar │ │ │ ├── slf4j-api-1.7.13.jar │ │ │ ├── slf4j-log4j12-1.7.21.jar │ │ │ ├── spring-aop-4.2.6.RELEASE.jar │ │ │ ├── spring-beans-4.2.6.RELEASE.jar │ │ │ ├── spring-context-4.2.6.RELEASE.jar │ │ │ ├── spring-context-support-4.2.6.RELEASE.jar │ │ │ ├── spring-core-4.2.6.RELEASE.jar │ │ │ ├── spring-expression-4.2.6.RELEASE.jar │ │ │ ├── spring-jdbc-4.2.6.RELEASE.jar │ │ │ ├── spring-jms-4.2.6.RELEASE.jar │ │ │ ├── spring-tx-4.2.6.RELEASE.jar │ │ │ ├── spring-web-4.2.6.RELEASE.jar │ │ │ ├── spring-webmvc-4.2.6.RELEASE.jar │ │ │ ├── xmemcached-1.3.8.jar │ │ │ └── xmlbeans-2.3.0.jar │ │ ├── springMVC-servlet.xml │ │ └── web.xml │ └── index.html └── src/ ├── cn/ │ └── mayongfa/ │ ├── activemq/ │ │ ├── ActiveMQTransportListener.java │ │ ├── ConsumerMessageListener.java │ │ └── MessageSender.java │ ├── api/ │ │ └── controller/ │ │ └── UserController.java │ ├── cache/ │ │ ├── MemcachedBasis.java │ │ └── UserBasisCache.java │ ├── common/ │ │ ├── DateUtil.java │ │ ├── DynamicDataSource.java │ │ ├── ExceptionHandler.java │ │ ├── IdWorker.java │ │ ├── IdWorkerManage.java │ │ ├── JdbcContextHolder.java │ │ ├── MD5Util.java │ │ └── StrUtil.java │ ├── controller/ │ │ └── AccountController.java │ ├── dao/ │ │ └── UserBasisDao.java │ ├── interceptor/ │ │ ├── Authority.java │ │ ├── AuthorityAnnotationInterceptor.java │ │ ├── AuthorityType.java │ │ ├── DataSource.java │ │ ├── DataSourceChoose.java │ │ ├── DataSourceType.java │ │ └── TestInterceptor.java │ ├── model/ │ │ └── UserBasis.java │ ├── quartz/ │ │ └── GlodQuartz.java │ └── service/ │ ├── UserBasisService.java │ └── imp/ │ └── UserBasisServiceImp.java ├── global.properties ├── jdbc.properties ├── log4j.properties └── memcached.properties ================================================ FILE CONTENTS ================================================ ================================================ FILE: .classpath ================================================ ================================================ FILE: .gitignore ================================================ /build/ ================================================ FILE: .project ================================================ SpringDemo org.eclipse.wst.jsdt.core.javascriptValidator org.eclipse.jdt.core.javabuilder org.eclipse.wst.common.project.facet.core.builder org.eclipse.wst.validation.validationbuilder org.eclipse.jem.workbench.JavaEMFNature org.eclipse.wst.common.modulecore.ModuleCoreNature org.eclipse.wst.common.project.facet.core.nature org.eclipse.jdt.core.javanature org.eclipse.wst.jsdt.core.jsNature ================================================ FILE: .settings/.jsdtscope ================================================ ================================================ FILE: .settings/org.eclipse.jdt.core.prefs ================================================ eclipse.preferences.version=1 org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.7 org.eclipse.jdt.core.compiler.compliance=1.7 org.eclipse.jdt.core.compiler.problem.assertIdentifier=error org.eclipse.jdt.core.compiler.problem.enumIdentifier=error org.eclipse.jdt.core.compiler.source=1.7 ================================================ FILE: .settings/org.eclipse.wst.common.component ================================================ ================================================ FILE: .settings/org.eclipse.wst.common.project.facet.core.xml ================================================ ================================================ FILE: .settings/org.eclipse.wst.jsdt.ui.superType.container ================================================ org.eclipse.wst.jsdt.launching.baseBrowserLibrary ================================================ FILE: .settings/org.eclipse.wst.jsdt.ui.superType.name ================================================ Window ================================================ FILE: WebContent/META-INF/MANIFEST.MF ================================================ Manifest-Version: 1.0 Class-Path: ================================================ FILE: WebContent/WEB-INF/applicationContext.xml ================================================ classpath:global.properties classpath:jdbc.properties classpath:memcached.properties ${master.jdbc.driverClassName} ${master.jdbc.url} ${master.jdbc.username} ${master.jdbc.password} ${slave.jdbc.driverClassName} ${slave.jdbc.url} ${slave.jdbc.username} ${slave.jdbc.password} ${goldMaster.jdbc.driverClassName} ${goldMaster.jdbc.url} ${goldMaster.jdbc.username} ${goldMaster.jdbc.password} ${goldSlave.jdbc.driverClassName} ${goldSlave.jdbc.url} ${goldSlave.jdbc.username} ${goldSlave.jdbc.password} ${server1.memcached.host} ${server1.memcached.port} ${server2.memcached.host} ${server2.memcached.port} ${server1.memcached.weight} ${server2.memcached.weight} default_queue,gold_queue ================================================ FILE: WebContent/WEB-INF/springMVC-servlet.xml ================================================ 0 UTF-8 0.########## yyyy-MM-dd HH:mm:ss true ignore ================================================ FILE: WebContent/WEB-INF/web.xml ================================================ springdemo index.html encodingFilter org.springframework.web.filter.CharacterEncodingFilter encoding UTF-8 forceEncoding true encodingFilter /* HttpMethodFilter org.springframework.web.filter.HttpPutFormContentFilter HttpMethodFilter /* hiddenHttpMethodFilter org.springframework.web.filter.HiddenHttpMethodFilter methodParam requestMethod hiddenHttpMethodFilter /* org.springframework.web.context.ContextLoaderListener springMVC org.springframework.web.servlet.DispatcherServlet 1 springMVC / contextConfigLocation /WEB-INF/applicationContext.xml DruidWebStatFilter com.alibaba.druid.support.http.WebStatFilter exclusions *.js,*mp3,*.swf,*.xls,*.gif,*.jpg,*.png,*.css,*.ico,/druid/* DruidWebStatFilter /* DruidStatView com.alibaba.druid.support.http.StatViewServlet resetEnable true loginUsername admin loginPassword 123456 DruidStatView /druid/* ================================================ FILE: WebContent/index.html ================================================ Spring Demo Spring Demo ================================================ FILE: src/cn/mayongfa/activemq/ActiveMQTransportListener.java ================================================ package cn.mayongfa.activemq; import java.io.IOException; import org.apache.activemq.transport.TransportListener; import org.apache.log4j.Logger; /** * 消息传输监听 * @author Mafly * */ public class ActiveMQTransportListener implements TransportListener { private Logger log = Logger.getLogger(ActiveMQTransportListener.class); /** * 对消息传输命令进行监控 * @param command */ @Override public void onCommand(Object o) { } /** * 对监控到的异常进行触发 * @param error */ @Override public void onException(IOException error) { log.error("onException -> 消息服务器连接错误......", error); } /** * 当failover时触发 */ @Override public void transportInterupted() { log.warn("transportInterupted -> 消息服务器连接发生中断..."); //这里就可以状态进行标识了 } /** * 监控到failover恢复后进行触发 */ @Override public void transportResumed() { log.info("transportResumed -> 消息服务器连接已恢复..."); //这里就可以进行状态标识了 } } ================================================ FILE: src/cn/mayongfa/activemq/ConsumerMessageListener.java ================================================ package cn.mayongfa.activemq; import javax.jms.JMSException; import javax.jms.Message; import javax.jms.MessageListener; import javax.jms.TextMessage; import org.apache.log4j.Logger; import org.springframework.stereotype.Component; /** * 消费者监听类 * * @author Mafly */ @Component public class ConsumerMessageListener implements MessageListener { private Logger log = Logger.getLogger(ConsumerMessageListener.class); @Override public void onMessage(Message arg0) { // 监听发送到消息队列的文本消息,作强制转换。 TextMessage textMessage = (TextMessage) arg0; try { System.out.println("接收到的消息内容是:" + textMessage.getText()); // TODO: 你喜欢的任何事情... } catch (JMSException e) { log.error("", e); } } } ================================================ FILE: src/cn/mayongfa/activemq/MessageSender.java ================================================ package cn.mayongfa.activemq; import java.util.HashMap; import java.util.Map; import javax.jms.JMSException; import javax.jms.Message; import javax.jms.Session; import javax.jms.TextMessage; import org.apache.log4j.Logger; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.jms.core.JmsTemplate; import org.springframework.jms.core.MessageCreator; import org.springframework.stereotype.Component; import com.google.gson.Gson; /** * ActiveMQ 消息生产类 * * @author Mafly * */ @Component public class MessageSender { private Logger log = Logger.getLogger(MessageSender.class); @Autowired private JmsTemplate jmsTemplate; private String Queue = "default_queue"; private String GoldQueue = "gold_queue"; private Gson gson = new Gson(); /** * 用户登录消息 */ public void userLogin(long id, String username) { Map map = new HashMap(); map.put("userid", id); map.put("username", username); System.out.println("发送了一条消息。"); // 发送到金币队列 sendMessage(gson.toJson(map), 1); } /** * 发送到消息队列 * * @param messgae * @param type * 类型,0:默认队列 1:金币队列 ... */ public void sendMessage(final String messgae, int type) { try { String destination = this.Queue; if (type == 1) { destination = GoldQueue; } jmsTemplate.send(destination, new MessageCreator() { @Override public Message createMessage(Session session) throws JMSException { TextMessage textMessage = session.createTextMessage(messgae); return textMessage; } }); } catch (Exception e) { log.error("", e); } } } ================================================ FILE: src/cn/mayongfa/api/controller/UserController.java ================================================ package cn.mayongfa.api.controller; import java.util.Date; import java.util.HashMap; import java.util.List; import java.util.Map; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import org.apache.log4j.Logger; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.CrossOrigin; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestMethod; import org.springframework.web.bind.annotation.RequestParam; import org.springframework.web.bind.annotation.ResponseBody; import com.google.gson.Gson; import cn.mayongfa.common.MD5Util; import cn.mayongfa.common.StrUtil; import cn.mayongfa.model.UserBasis; import cn.mayongfa.service.UserBasisService; @Controller @RequestMapping("/api/user/*") public class UserController { private static Logger log = Logger.getLogger(UserController.class); @Autowired private UserBasisService userBasisService; /** * get * * @param oRequest * @param oResponse * @return */ @ResponseBody @RequestMapping(value = "get", produces = "application/json;charset=UTF-8", method = { RequestMethod.GET }) public String get(@RequestParam("id") long id) { int code = -1; String msg = ""; UserBasis entity = userBasisService.getEntity(id); try { if (entity != null && entity.getId() > 0) { code = 1; msg = "请求成功!"; } } catch (Exception e) { log.error("出错啦!", e); } Map responseMap = new HashMap(); responseMap.put("code", code); responseMap.put("msg", msg); responseMap.put("params", entity); responseMap.put("rows", ""); return new Gson().toJson(responseMap); } /** * getlist * * @param oRequest * @param oResponse * @return */ @CrossOrigin(origins = "*", maxAge = 3600) @ResponseBody @RequestMapping(value = "getlist", produces = "application/json;charset=UTF-8", method = { RequestMethod.GET }) public String getList() { int code = -1; String msg = ""; List userList = userBasisService.getList(); if (userList != null && userList.size() > 0) { code = 1; msg = "请求成功!"; } // 演示异常 userBasisService.getListCount(null); Map responseMap = new HashMap(); responseMap.put("code", code); responseMap.put("msg", msg); responseMap.put("params", ""); responseMap.put("rows", userList); return new Gson().toJson(responseMap); } /** * post * * @param oRequest * @param oResponse * @return */ @ResponseBody @RequestMapping(value = "post", produces = "application/json;charset=UTF-8", method = { RequestMethod.POST }) public String post(HttpServletRequest oRequest, HttpServletResponse oResponse) { int code = -1; String msg = ""; String name = oRequest.getParameter("name") != null ? oRequest.getParameter("name").toString() : ""; String password = oRequest.getParameter("password") != null ? oRequest.getParameter("password").toString() : ""; String phone = oRequest.getParameter("phone") != null ? oRequest.getParameter("phone").toString() : ""; if (StrUtil.isNullOrEmpty(name)) { msg = "请填写用户姓名!"; } else if (StrUtil.isNullOrEmpty(password)) { msg = "请填写密码!"; } else { UserBasis entity = new UserBasis(); entity.setId(StrUtil.DEFAULT_NULL); entity.setName(name); entity.setPassword(MD5Util.GetMD5Code32(password)); entity.setPhone(phone); entity.setStatus(1); entity.setUpdatetime(new Date()); entity.setCreatetime(new Date()); long id = userBasisService.Save(entity); if (id > 0) { code = 1; msg = "添加成功!"; } } Map responseMap = new HashMap(); responseMap.put("code", code); responseMap.put("msg", msg); responseMap.put("params", ""); responseMap.put("rows", ""); return new Gson().toJson(responseMap); } /** * delete * * @param oRequest * @param oResponse * @return */ @ResponseBody @RequestMapping(value = "delete", produces = "application/json;charset=UTF-8", method = { RequestMethod.DELETE }) public String delete(@RequestParam("id") long id) { int code = -1; String msg = ""; if (userBasisService.Delete(id)) { code = 1; msg = "删除成功!"; } else { msg = "删除失败!"; } Map responseMap = new HashMap(); responseMap.put("code", code); responseMap.put("msg", msg); responseMap.put("params", ""); responseMap.put("rows", ""); return new Gson().toJson(responseMap); } /** * put * * @param oRequest * @param oResponse * @return */ @ResponseBody @RequestMapping(value = "put", produces = "application/json;charset=UTF-8", method = { RequestMethod.POST }) public String put(HttpServletRequest oRequest, HttpServletResponse oResponse) { int code = -1; String msg = ""; long id = StrUtil.toLong(oRequest.getParameter("id"), StrUtil.DEFAULT_NULL); String name = oRequest.getParameter("name") != null ? oRequest.getParameter("name").toString() : ""; String phone = oRequest.getParameter("phone") != null ? oRequest.getParameter("phone").toString() : ""; if (id == StrUtil.DEFAULT_NULL) { msg = "请选择用户!"; } else if (StrUtil.isNullOrEmpty(name)) { msg = "请填写用户姓名!"; } else if (StrUtil.isNullOrEmpty(phone)) { // msg = "请填写电话!"; } else { UserBasis entity = userBasisService.getEntity(id); if (entity != null && entity.getId() == id) { entity.setName(name); entity.setPhone(phone); entity.setUpdatetime(new Date()); id = userBasisService.Save(entity); if (id > 0) { code = 1; msg = "更新成功!"; } else { msg = "更新失败!"; } } else { msg = "用户不存在!"; } } Map responseMap = new HashMap(); responseMap.put("code", code); responseMap.put("msg", msg); responseMap.put("params", ""); responseMap.put("rows", ""); return new Gson().toJson(responseMap); } } ================================================ FILE: src/cn/mayongfa/cache/MemcachedBasis.java ================================================ package cn.mayongfa.cache; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; import net.rubyeye.xmemcached.MemcachedClient; @Component public class MemcachedBasis { @Autowired protected MemcachedClient memcachedClient; /** * 失效时间(秒)3600*24 一天 */ protected int Exptime = 3600 * 24; /** * 基础数据失效时间(秒)3600*24*7 一周 */ protected int DataExptime = this.Exptime * 7; protected String Prefix = "SPRINGDEMO:"; } ================================================ FILE: src/cn/mayongfa/cache/UserBasisCache.java ================================================ package cn.mayongfa.cache; import java.util.concurrent.TimeoutException; import org.apache.log4j.Logger; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; import cn.mayongfa.dao.UserBasisDao; import cn.mayongfa.model.UserBasis; import net.rubyeye.xmemcached.exception.MemcachedException; @Component public class UserBasisCache extends MemcachedBasis { private Logger log = Logger.getLogger(UserBasisCache.class); @Autowired private UserBasisDao userBasisDao; /** * 设置缓存 * * @param model * 用户model * @return */ public Boolean set(UserBasis model) { Boolean result = false; try { result = memcachedClient.set(getCacheKey(model.getId()), super.Exptime, model); } catch (TimeoutException | InterruptedException | MemcachedException e) { log.error("", e); } return result; } /** * 获取缓存 * * @param id * 用户ID * @return */ public UserBasis get(long id) { UserBasis entity = new UserBasis(); try { entity = memcachedClient.get(getCacheKey(id)); if (entity == null || entity.getId() <= 0) { entity = userBasisDao.getEntity(id); this.set(entity); } } catch (TimeoutException | InterruptedException | MemcachedException e) { log.error("", e); entity = userBasisDao.getEntity(id); } return entity; } /** * 删除缓存 * * @param id * 用户ID * @return */ public Boolean delete(long id) { try { return memcachedClient.delete(getCacheKey(id)); } catch (TimeoutException | InterruptedException | MemcachedException e) { log.error("", e); } return false; } /** * 获取缓存 Key * * @param id * 用户ID * @return */ private String getCacheKey(long id) { return super.Prefix + "UserBasis:" + id; } } ================================================ FILE: src/cn/mayongfa/common/DateUtil.java ================================================ package cn.mayongfa.common; import java.text.ParseException; import java.text.SimpleDateFormat; import java.util.Date; import org.apache.log4j.Logger; public class DateUtil { private static Logger log = Logger.getLogger(DateUtil.class); /** * date类型转换为String类型 * @param data Date类型的时间 * @param formatType 格式为yyyy-MM-dd HH:mm:ss//yyyy年MM月dd日 HH时mm分ss秒 * @return */ public static String dateToString(Date date, String formatType) { SimpleDateFormat sdf=new SimpleDateFormat(formatType); //java.util.Date date=new java.util.Date(); return sdf.format(date); } /** * long类型转换为String类型 * @param currentTime 要转换的long类型的时间 * @param formatType 要转换的string类型的时间格式 * @return * @throws ParseException */ public static String longToString(long currentTime, String formatType){ /*SimpleDateFormat sf = new SimpleDateFormat(formatType); Date date = new Date(currentTime); return sf.format(date);*/ SimpleDateFormat oldFormat = new SimpleDateFormat("yyyyMMddHHmmss"); SimpleDateFormat newFormat = new SimpleDateFormat(formatType); Date date = null; try { date = oldFormat.parse(currentTime+""); } catch (Exception e) { log.error("", e); date = new Date(); e.printStackTrace(); } return newFormat.format(date); } /** * long类型转换为String类型 * @param currentTime 要转换的long类型的时间 * @param formatType 要转换的string类型的时间格式 * @return * @throws ParseException */ public static String longToString(long currentTime, String oldFormatType, String formatType) throws ParseException { String strTime = StrUtil.toStr(currentTime, StrUtil.DEFAULT_DATE); // long类型转成String Date date = stringToDate(strTime, oldFormatType); return dateToString(date, formatType); } /** * string类型转换为date类型 * @param strTime 的时间格式必须要与formatType的时间格式相同 * @param formatType 要转换的string类型的时间,formatType要转换的格式yyyy-MM-dd HH:mm:ss//yyyy年MM月dd日HH时mm分ss秒 * @return * @throws ParseException */ public static Date stringToDate(String strTime, String formatType) { try { SimpleDateFormat formatter = new SimpleDateFormat(formatType); Date date = null; date = formatter.parse(strTime); return date; } catch (Exception e) { log.error("", e); return new Date(); } } /** * long转换为Date类型 * @param currentTime 要转换的long类型的时间 * @param formatType 要转换的时间格式yyyy-MM-dd HH:mm:ss//yyyy年MM月dd日 HH时mm分ss秒 * @return * @throws ParseException */ public static Date longToDate(long currentTime, String formatType) { try { Date dateOld = new Date(currentTime); // 根据long类型的毫秒数生命一个date类型的时间 String sDateTime = dateToString(dateOld, formatType); // 把date类型的时间转换为string Date date = stringToDate(sDateTime, formatType); // 把String类型转换为Date类型 return date; } catch (Exception e) { log.error("", e); return new Date(); } } /** * string类型转换为long类型 * @param strTime 要转换的String类型的时间 * @param formatType 时间格式的时间格式和formatType的时间格式必须相同 * @return * @throws ParseException */ public static long stringToLong(String strTime, String formatType) { try { Date date = stringToDate(strTime, formatType); // String类型转成date类型 if (date == null) { return 0; } else { long currentTime = dateToLong(date); // date类型转成long类型 return currentTime; } } catch (Exception e) { log.error("", e); return 0; } } /** * date类型转换为long类型 * @param date 要转换的date类型的时间 * @return */ public static long dateToLong(Date date) { return StrUtil.toLong(dateToString(date,"yyyyMMddHHmmss"), StrUtil.DEFAULT_ALL); } /** * 获取龙long类型时间 * @return yyyyMMddHHmmss */ public static long dateToLong() { return StrUtil.toLong(dateToString(new Date(),"yyyyMMddHHmmss"), StrUtil.DEFAULT_ALL); } /** * 时间戳转Long类型时间 * @param unix 时间戳 * @return 若转换失败,返回当前时间 */ public static long unixToLong(long unix){ SimpleDateFormat format = new SimpleDateFormat("yyyyMMddHHmmss"); try{ return Long.parseLong(format.format(unix)); }catch(Exception e){ log.error("", e); return DateUtil.dateToLong(); } } /** * 分析Long类型的时间距离当前时间多久 * @param time Long类型的时间。yyyyMMddHHmmss * @return 若转换异常,返回DateUtil.longToString(time, "yyyy-MM-dd") */ public static String getTimePosition(long time){ SimpleDateFormat format = new SimpleDateFormat("yyyyMMddHHmmss"); Date date; try { date = format.parse(time + ""); long conversionTime = date.getTime(); long currentTime = System.currentTimeMillis(); long relativeTime = currentTime - conversionTime; if(relativeTime < 30*60*1000){ return "刚刚"; }else if(relativeTime < 60*60*1000){ return "30分钟前"; }else{ return DateUtil.longToString(time, "yyyy-MM-dd"); } } catch (ParseException e) { log.error("", e); return DateUtil.longToString(time, "yyyy-MM-dd"); } } } ================================================ FILE: src/cn/mayongfa/common/DynamicDataSource.java ================================================ package cn.mayongfa.common; import org.springframework.jdbc.datasource.lookup.AbstractRoutingDataSource; import cn.mayongfa.common.JdbcContextHolder; public class DynamicDataSource extends AbstractRoutingDataSource { @Override protected Object determineCurrentLookupKey() { // 获取当前数据源连接 return JdbcContextHolder.getJdbcType(); } } ================================================ FILE: src/cn/mayongfa/common/ExceptionHandler.java ================================================ package cn.mayongfa.common; import java.io.IOException; import java.util.HashMap; import java.util.Map; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import org.apache.log4j.Logger; import org.springframework.stereotype.Component; import org.springframework.web.servlet.HandlerExceptionResolver; import org.springframework.web.servlet.ModelAndView; import com.google.gson.Gson; @Component public class ExceptionHandler implements HandlerExceptionResolver { private static Logger log = Logger.getLogger(ExceptionHandler.class); @Override public ModelAndView resolveException(HttpServletRequest request, HttpServletResponse response, Object handler, Exception exception) { log.error("ExceptionHandler 捕获的异常:", exception); String requestType = request.getHeader("X-Requested-With"); String type = "api"; //TODO: if (!type.equals("api") && StrUtil.isNullOrEmpty(requestType)) { // 非API请求 return new ModelAndView("redirect:/500.html"); } else {// JSON格式返回 Map responseMap = new HashMap(); responseMap.put("code", -1); responseMap.put("msg", "系统异常,请稍后重试!"); responseMap.put("params", ""); responseMap.put("rows", ""); String json = new Gson().toJson(responseMap); response.setCharacterEncoding("UTF-8"); response.setContentType("application/json; charset=utf-8"); try { response.getWriter().write(json); response.getWriter().flush(); return null; } catch (IOException e) { log.error("", e); } } return new ModelAndView("redirect:/500.html"); } } ================================================ FILE: src/cn/mayongfa/common/IdWorker.java ================================================ package cn.mayongfa.common; import org.apache.log4j.Logger; /** * * 以后,根据数据id,即可计算出该数据,产自哪个数据中心的. * * @author Administrator * */ public class IdWorker { /** * 下面3个参数,不同部署的地方,系统,都要修改为不同的参数值. */ private long datacenterId = 1; private long workerId = 1; private static final String USERAGENT = "springdemo"; private long sequence = 0L; private static final Logger logger = Logger.getLogger(IdWorker.class); /** * */ private final long twepoch = 1288834974657L; // 机器标识位数 private final long workerIdBits = 5L; // 数据中心标识位数 private final long datacenterIdBits = 5L; // 机器ID最大值 private final long maxWorkerId = -1L ^ (-1L << workerIdBits); // 数据中心ID最大值 private final long maxDatacenterId = -1L ^ (-1L << datacenterIdBits); // 毫秒内自增位 private final long sequenceBits = 12L; // 机器ID偏左移12位 private final long workerIdShift = sequenceBits; // 数据中心ID左移17位 private final long datacenterIdShift = sequenceBits + workerIdBits; // 时间毫秒左移22位 private final long timestampLeftShift = sequenceBits + workerIdBits + datacenterIdBits; private final long sequenceMask = -1L ^ (-1L << sequenceBits); private long lastTimestamp = -1L; /** * * @param workerId * @param datacenterId */ public IdWorker(long workerId, long datacenterId) { if (workerId > maxWorkerId || workerId < 0) { throw new IllegalArgumentException(String.format( "workerId can't be greater than %d or less than 0.", maxWorkerId)); } if (datacenterId > maxDatacenterId || datacenterId < 0) { throw new IllegalArgumentException(String.format( "datacenterId can't be greater than %d or less than 0.", maxDatacenterId)); } this.workerId = workerId; this.datacenterId = datacenterId; } public IdWorker() { if (workerId > maxWorkerId || workerId < 0) { throw new IllegalArgumentException(String.format( "workerId can't be greater than %d or less than 0.", maxWorkerId)); } if (datacenterId > maxDatacenterId || datacenterId < 0) { throw new IllegalArgumentException(String.format( "datacenterId can't be greater than %d or less than 0.", maxDatacenterId)); } //this.workerId = workerId; //this.datacenterId = datacenterId; } /** * * @return */ protected synchronized long nextId() { long id = 0L; long timestamp = timeGen(); // 时间错误 if (timestamp < lastTimestamp) { throw new RuntimeException( String.format( "clock moved backwards. refusing to generate id for %d milliseconds.", lastTimestamp - timestamp)); } if (timestamp == lastTimestamp) { // 当前毫秒内,则+1 sequence = (1 + sequence) & sequenceMask; if (0 == sequence) { // 当前毫秒内计数满了,则等待下一秒 timestamp = tilNextMillis(lastTimestamp); } } else { sequence = 0; } lastTimestamp = timestamp; // ID偏移组合生成最终的ID,并返回ID id = ((timestamp - twepoch) << timestampLeftShift) | (datacenterId << datacenterIdShift) | (workerId << workerIdShift) | sequence; return id; } /** * 等待下一个毫秒的到来 * * @param lastTimestamp * @return */ protected long tilNextMillis(long lastTimestamp) { long timestamp = timeGen(); while (timestamp <= lastTimestamp) { timestamp = timeGen(); } return timestamp; } /** * * @return */ protected long timeGen() { return System.currentTimeMillis(); } public long get_worker_id() throws Exception { return workerId; } public long get_timestamp() throws Exception { return System.currentTimeMillis(); } public long get_id(String useragent) throws Exception { if (!USERAGENT.equals(useragent)) { throw new Exception("invalid useragent."); } long id = nextId(); logger.info(String.format("id: %s user_agent: %s worker_id: %s data_center_id: %s",id, useragent, workerId, datacenterId)); return id; } public long get_datacenter_id() throws Exception { return datacenterId; } } ================================================ FILE: src/cn/mayongfa/common/IdWorkerManage.java ================================================ package cn.mayongfa.common; public class IdWorkerManage { private static IdWorker IdWorkerInstance = null; static { IdWorkerManage.IdWorkerInstance = new IdWorker(); } /** * single 单例模式 * * @return */ private static IdWorker getIdWorkerInstance() { if (IdWorkerManage.IdWorkerInstance == null) { IdWorkerManage.IdWorkerInstance = new IdWorker(); } return IdWorkerManage.IdWorkerInstance; } /** * single 单例模式 * * @return */ public static long getId() throws Exception { return IdWorkerManage.getIdWorkerInstance().get_id("springdemo"); } /* public static void main(String[] args) { for (int i = 0; i < 101; i++) { try { System.out.println(IdWorkerManage.getId()); } catch (Exception e) { // TODO Auto-generated catch block e.printStackTrace(); } } }*/ } ================================================ FILE: src/cn/mayongfa/common/JdbcContextHolder.java ================================================ package cn.mayongfa.common; public class JdbcContextHolder { private static final ThreadLocal contextHolder = new ThreadLocal(); public static void setJdbcType(String jdbcType) { contextHolder.set(jdbcType); } public static void setSlave() { setJdbcType("slave"); } public static void setMaster() { clearJdbcType(); } public static String getJdbcType() { return (String) contextHolder.get(); } public static void clearJdbcType() { contextHolder.remove(); } } ================================================ FILE: src/cn/mayongfa/common/MD5Util.java ================================================ package cn.mayongfa.common; import java.security.MessageDigest; import org.apache.log4j.Logger; public class MD5Util { private static Logger log = Logger.getLogger(MD5Util.class); public static String GetMD5Code16(String strObj) { return GetMD5Code32(strObj).substring(8, 24); } public static String GetMD5Code32(String strObj) { String resultString = null; try { resultString = new String(strObj); MessageDigest md = MessageDigest.getInstance("MD5"); // md.digest() 该函数返回值为存放哈希值结果的byte数组 resultString = byteToString(md.digest(strObj.getBytes("UTF-8"))); } catch (Exception ex) { log.error("", ex); } return resultString; } // 转换字节数组为16进制字串 private static String byteToString(byte[] bByte) { StringBuffer sBuffer = new StringBuffer(); for (int i = 0; i < bByte.length; i++) { sBuffer.append(byteToArrayString(bByte[i])); } return sBuffer.toString(); } // 返回形式为数字跟字符串 private static String byteToArrayString(byte bByte) { int iRet = bByte; // System.out.println("iRet="+iRet); if (iRet < 0) { iRet += 256; } int iD1 = iRet / 16; int iD2 = iRet % 16; return strDigits[iD1] + strDigits[iD2]; } private final static String[] strDigits = { "0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "a", "b", "c", "d", "e", "f" }; } ================================================ FILE: src/cn/mayongfa/common/StrUtil.java ================================================ package cn.mayongfa.common; import java.io.UnsupportedEncodingException; import java.math.BigDecimal; import java.util.ArrayList; import java.util.Arrays; import java.util.Collections; import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.regex.Matcher; import java.util.regex.Pattern; import com.google.gson.Gson; import com.google.gson.reflect.TypeToken; /** * 字符串处理类 * * @Version 1.0 * @Remark */ public final class StrUtil { /** 7位ASCII字符,也叫作ISO646-US、Unicode字符集的基本拉丁块 */ private static final String US_ASCII = "US-ASCII"; /** ISO 拉丁字母表 No.1,也叫作 ISO-LATIN-1 */ private static final String ISO_8859_1 = "ISO-8859-1"; /** 8 位 UCS 转换格式 */ private static final String UTF_8 = "UTF-8"; /** 16 位 UCS 转换格式,Big Endian(最低地址存放高位字节)字节顺序 */ private static final String UTF_16BE = "UTF-16BE"; /** 16 位 UCS 转换格式,Little-endian(最高地址存放低位字节)字节顺序 */ private static final String UTF_16LE = "UTF-16LE"; /** 16 位 UCS 转换格式,字节顺序由可选的字节顺序标记来标识 */ private static final String UTF_16 = "UTF-16"; /** 中文超大字符集 */ private static final String GBK = "GBK"; /** 默认全部值 1111 */ public static final long DEFAULT_ALL = (long) 1111;// 如下拉选择的全部 选项 public static final int DEFAULT_ALL_Int = 1111;// 如下拉选择的全部 /** 默认空值 0001 */ public static final long DEFAULT_NULL = (long) 0001;// 在值转换时候,如 字符转为 // long类型时候,先判断字符是否为空,如果为空返回这个 // ,或者转换异常时候。 /** 默认值 9999 */ public static final long DEFAULT_VALUE = (long) 9999;// 如数据库非null字段情况下,给一个默认值 /** 默认值 0001-01-01 */ public static final String DEFAULT_DATE = "0001-01-01";// 日期为空的时候默认值,给一个默认值 /** * 将字符编码转换成GBK码 * * @param sStr * @return String * @throws UnsupportedEncodingException */ public final static String toGBK(String sStr) throws UnsupportedEncodingException { return changeCharset(sStr, GBK); } /** * 将字符编码转换成UTF-8码 * * @param sStr * @return String * @throws UnsupportedEncodingException */ public final static String toUTF8(String sStr) throws UnsupportedEncodingException { return changeCharset(sStr, UTF_8); } /** * 将字符编码转换成US-ASCII码 * * @param sStr * @return String * @throws UnsupportedEncodingException */ public final static String toASCII(String sStr) throws UnsupportedEncodingException { return changeCharset(sStr, US_ASCII); } /** * 将字符编码转换成UTF-16码 * * @param sStr * @return String * @throws UnsupportedEncodingException */ public final static String toUTF16(String sStr) throws UnsupportedEncodingException { return changeCharset(sStr, UTF_16); } /** * 字符串编码转换的实现方法 * * @param sStr * 待转换编码的字符串 * @param sNewCharset * 目标编码 * @return String * @throws UnsupportedEncodingException */ public final static String changeCharset(String sStr, String sNewCharset) throws UnsupportedEncodingException { // 用默认字符编码解码字符串。 byte[] aBits = sStr.getBytes(); // 用新的字符编码生成字符串 return new String(aBits, sNewCharset); } /** * 将字符编码转换成ISO-8859-1码 * * @param sStr * @return String * @throws UnsupportedEncodingException */ public final static String toISO_8859_1(String sStr) throws UnsupportedEncodingException { return changeCharset(sStr, ISO_8859_1); } /** * 将字符编码转换成UTF-16BE码 * * @param sStr * @return String * @throws UnsupportedEncodingException */ public final static String toUTF16BE(String sStr) throws UnsupportedEncodingException { return changeCharset(sStr, UTF_16BE); } /** * 将字符编码转换成UTF-16LE码 * * @param sStr * @return String * @throws UnsupportedEncodingException */ public final static String toUTF16LE(String sStr) throws UnsupportedEncodingException { return changeCharset(sStr, UTF_16LE); } /** * 字符串编码转换的实现方法 * * @param sStr * 待转换编码的字符串 * @param sOldCharset * 原编码 * @param sNewCharset * 目标编码 * @return String * @throws UnsupportedEncodingException */ public final static String changeCharset(String sStr, String sOldCharset, String sNewCharset) throws UnsupportedEncodingException { // 用旧的字符编码解码字符串。解码可能会出现异常。 byte[] aBits = sStr.getBytes(sOldCharset); // 用新的字符编码生成字符串 return new String(aBits, sNewCharset); } /** * 返回正则表达式的结果集 * * @param sStr * @param sPattern * @return List */ public final static List getRegexResult(String sStr, String sPattern) { ArrayList aList = new ArrayList(); Pattern oPattern = Pattern.compile(sPattern); Matcher oMatcher = oPattern.matcher(sStr); while (oMatcher.find()) { for (int i = 1, nTotal = oMatcher.groupCount(); i <= nTotal; i++) { aList.add(oMatcher.group(i)); } } return aList; } /** * 字符串正则表达式替换 * * @param sSource * @param sReplace * @param sPattern * @return String */ public final static String getRegexReplaceResult(String sSource, String sReplace, String sPattern) { Pattern oPattern = Pattern.compile(sPattern); Matcher oMatcher = oPattern.matcher(sSource); return oMatcher.replaceAll(sReplace); } /** * 正则表达式检查结果 * * @param sStr * @param sPattern * @return boolean */ public final static boolean checkMather(String sStr, String sPattern) { Pattern oPattern = Pattern.compile(sPattern); Matcher oMather = oPattern.matcher(sStr); return oMather.matches(); } /** * 如果字符串为空则用默认值 * * @param sStr * @param sDefault * @return String */ public final static String toStr(Object sStr, String sDefault) { return sStr == null ? sDefault : sStr.toString().trim(); } /** * 如果字符串为空则用默认值 * * @param sStr * @param sDefault * @return String */ public final static String toStrNOTrim(Object sStr, String sDefault) { return sStr == null ? sDefault : sStr.toString(); } /** * 把字符串转换成整数 * * @param sValue * @param nDefault * @return int */ public final static int toInt(String sValue, int nDefault) { if (sValue == null || sValue.isEmpty()) return nDefault; try { return Integer.valueOf(sValue); } catch (Exception ex) { return nDefault; } } /** * 把字符串转换成Long数 * * @param sValue * @param nDefault * @return int */ public final static Long toLong(String sValue, Long nDefault) { if (sValue == null || sValue.isEmpty()) return nDefault; try { return Long.valueOf(sValue); } catch (Exception ex) { return nDefault; } } /** * 把字符串转换成小数 * * @param sValue * @param nDefault * @return Float */ public final static Float toFloat(String sValue, Float nDefault) { if (sValue == null || sValue.isEmpty()) return nDefault; return Float.valueOf(sValue); } /** * 把字符串转换成双精度小数 * * @param sValue * @param nDefault * @return Double */ public final static Double toDouble(String sValue, Double nDefault) { if (sValue == null || sValue.isEmpty()) return nDefault; return Double.valueOf(sValue); } /** * 把字符串转换成浮点 * * @param sValue * @param nDefault * @return float */ public final static float toFloat(String sValue, float nDefault) { if (sValue == null || sValue.isEmpty()) return nDefault; return Float.valueOf(sValue); } /** * 把字符串转换成 布尔型 * * @param sValue * @param nDefault * @return boolean */ public final static boolean toBoolean(String sValue, boolean nDefault) { if (sValue == null || sValue.isEmpty()) return nDefault; return Boolean.valueOf(sValue); } /** * 数据显示小数点问题 * * @param d * @return */ public final static String doubleToStr(Double dd) { if (null == dd) { return ""; } double d = dd; double c = d - (int) d; if (c == 0) return (int) d + ""; else { BigDecimal b = new BigDecimal(d); BigDecimal one = new BigDecimal("1"); c = b.divide(one, 2, BigDecimal.ROUND_HALF_UP).doubleValue(); return String.valueOf(c); } } public final static String floatToStr(float d) { if (Math.round(d) - d == 0) { return String.valueOf((long) d); } return String.valueOf(d); } /** * 字符串 : 解决数据库入库时候的非法符号 转 HTML 符号 * * @param sStr * @param sDefault * @return */ public final static String toHtml(Object sStr, String sDefault) { String sValue = sStr == null ? sDefault : sStr.toString(); sValue = sValue.replaceAll("<", "<"); sValue = sValue.replaceAll(">", ">"); sValue = sValue.replaceAll("&", "&"); return sValue; } /** * 获取八位不重复随机码(取当前时间戳转化为16进制) * * @param time * @return */ public final static String toHex(long time) { return Integer.toHexString((int) time); } public static String getVerificationCode(int count, Boolean isLetter) { String[] beforeLetterShuffle = new String[] { "A", "B", "C", "D", "E", "F", "G", "H", "I", "J", "K", "L", "M", "N", "O", "P", "Q", "R", "S", "T", "U", "V", "W", "X", "Y", "Z" }; String[] beforeNumberShuffle = new String[] { "1", "2", "3", "4", "5", "6", "7", "8", "9", "8" }; List list = Arrays.asList(isLetter ? beforeLetterShuffle : beforeNumberShuffle); Collections.shuffle(list); StringBuilder sb = new StringBuilder(); for (int i = 0; i < list.size(); i++) { sb.append(list.get(i)); } String afterShuffle = sb.toString(); String result = afterShuffle.substring(0, count); return result; } /** * 检测字符串是否为空(null,"","null") * * @param value * @return 为空则返回true,否则返回false */ public final static boolean isNullOrEmpty(String value) { return value == null || "".equals(value.trim()) || "null".equals(value.trim()); } /** * 判断在values数组中是否存在value元素 * * @param values * 数组 * @param value * 字符串 * @return 存在,返回true。反之,false。 */ public static boolean contains(String[] values, String value) { if (values != null && values.length > 0) { for (String s : values) { if (s != null) { if (s.equals(value)) { return true; } } } } return false; } /** * json字符串转换为List> * * @param jsonString * @return */ public final static List> toMapList(String jsonString) { List> mapList = new ArrayList<>(); if (!StrUtil.isNullOrEmpty(jsonString)) { mapList = new Gson().fromJson(jsonString, new TypeToken>>() { }.getType()); } return mapList; } /** * json字符串转换为Map * * @param jsonString * @return */ public final static Map toMap(String jsonString) { Map map = new HashMap<>(); if (!StrUtil.isNullOrEmpty(jsonString)) { map = new Gson().fromJson(jsonString, new TypeToken>() { }.getType()); } return map; } } ================================================ FILE: src/cn/mayongfa/controller/AccountController.java ================================================ package cn.mayongfa.controller; import java.util.HashMap; import java.util.Map; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestMethod; import org.springframework.web.bind.annotation.RequestParam; import org.springframework.web.bind.annotation.ResponseBody; import com.google.gson.Gson; import cn.mayongfa.activemq.MessageSender; import cn.mayongfa.common.MD5Util; import cn.mayongfa.common.StrUtil; import cn.mayongfa.interceptor.Authority; import cn.mayongfa.interceptor.AuthorityType; import cn.mayongfa.model.UserBasis; import cn.mayongfa.service.UserBasisService; @Controller @Authority(AuthorityType.NoValidate) @RequestMapping("/account/*") public class AccountController { @Autowired private UserBasisService userBasisService; @Autowired private MessageSender messageSender; /** * login * */ @Authority(AuthorityType.Validate) @ResponseBody @RequestMapping(value = "login", produces = "application/json;charset=UTF-8", method = { RequestMethod.POST }) public String login(@RequestParam("phone") String phone, @RequestParam("password") String password) { int code = -1; String msg = ""; if (StrUtil.isNullOrEmpty(phone)) { msg = "请填写用户帐号!"; } else if (StrUtil.isNullOrEmpty(password)) { msg = "请填写密码!"; } else { UserBasis entity = userBasisService.getEntity(phone); if (entity != null && entity.getId() > 0) { if (entity.getPassword().equals(MD5Util.GetMD5Code32(password))) { code = 1; msg = "登录成功!"; messageSender.userLogin(entity.getId(), entity.getName()); // TODO: } else { msg = "用户密码错误!"; } } else { msg = "用户不存在!"; } } Map responseMap = new HashMap(); responseMap.put("code", code); responseMap.put("msg", msg); responseMap.put("params", ""); responseMap.put("rows", ""); return new Gson().toJson(responseMap); } } ================================================ FILE: src/cn/mayongfa/dao/UserBasisDao.java ================================================ package cn.mayongfa.dao; import java.sql.ResultSet; import java.sql.SQLException; import java.util.ArrayList; import java.util.List; import java.util.Map; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.jdbc.core.JdbcTemplate; import org.springframework.jdbc.core.RowCallbackHandler; import org.springframework.stereotype.Repository; import cn.mayongfa.common.DateUtil; import cn.mayongfa.common.IdWorkerManage; import cn.mayongfa.common.StrUtil; import cn.mayongfa.model.UserBasis; @Repository public class UserBasisDao { @Autowired private JdbcTemplate jdbcTemplate; /** * 保存 * * @param entity * ID=0 新增 * @return */ public long Save(UserBasis entity) { long ID = 0; try { if (entity.getId() == StrUtil.DEFAULT_NULL) { // 新增 entity.setId(IdWorkerManage.getId()); String strSql = "insert into userbasis (id,name,password,phone,status,createtime,updatetime) values (?,?,?,?,?,?,?)"; Object obj[] = { entity.getId(), entity.getName(), entity.getPassword(), entity.getPhone(), entity.getStatus(), entity.getCreatetime(), entity.getUpdatetime() }; int ret = jdbcTemplate.update(strSql, obj); if (ret > 0) { ID = entity.getId(); } } else { // 修改 String strSql = "update userbasis set id=?,name=?,password=?,phone=?,status=?,updatetime=? where id=?"; Object obj[] = { entity.getId(), entity.getName(), entity.getPassword(), entity.getPhone(), entity.getStatus(), entity.getUpdatetime(), entity.getId() }; int ret = jdbcTemplate.update(strSql, obj); if (ret > 0) { ID = entity.getId(); } } } catch (Exception e) { throw new RuntimeException(e); } return ID; } /** * 删除 * * @param ID * @return */ public Boolean Delete(long ID) { String strSql = "delete from userbasis where id=?"; Object obj[] = { DateUtil.dateToLong(), ID }; int ret = jdbcTemplate.update(strSql, obj); return ret > 0; } /** * 获取 * * @param ID * @return */ public UserBasis getEntity(long ID) { final UserBasis entity = new UserBasis(); String strSql = "select id,name,password,phone,status,createtime,updatetime from userbasis where id=?"; jdbcTemplate.query(strSql, new Object[] { ID }, new RowCallbackHandler() { public void processRow(ResultSet rs) throws SQLException { entity.setId(rs.getLong("id")); entity.setName(rs.getString("name")); entity.setPassword(rs.getString("password")); entity.setPhone(rs.getString("phone")); entity.setStatus(rs.getInt("status")); entity.setCreatetime(rs.getDate("createtime")); entity.setUpdatetime(rs.getDate("updatetime")); } }); return entity; } /** * 获取 * * @param ID * @return */ public UserBasis getEntity(String phone) { final UserBasis entity = new UserBasis(); String strSql = "select id,name,password,phone,status,createtime,updatetime from userbasis where phone=?"; jdbcTemplate.query(strSql, new Object[] { phone }, new RowCallbackHandler() { public void processRow(ResultSet rs) throws SQLException { entity.setId(rs.getLong("id")); entity.setName(rs.getString("name")); entity.setPassword(rs.getString("password")); entity.setPhone(rs.getString("phone")); entity.setStatus(rs.getInt("status")); entity.setCreatetime(rs.getDate("createtime")); entity.setUpdatetime(rs.getDate("updatetime")); } }); return entity; } /** * 根据条件获取 * * @return */ public List getList(Map whereMap, String OrderBy, int nStart, int nLimit) { final ArrayList list = new ArrayList(); String basisSql = "select id,name,password,phone,status,createtime,updatetime from userbasis "; String strSql = "select id from userbasis where 1=1"; StringBuffer whereSql = new StringBuffer(); List whereobj = new ArrayList(); if (whereMap.containsKey("id")) { long id = (long) whereMap.get("id"); whereSql.append(" and id=?"); whereobj.add(id); } if (whereMap.containsKey("name")) { String name = (String) whereMap.get("name"); whereSql.append(" and name=?"); whereobj.add(name); } if (whereMap.containsKey("password")) { String password = (String) whereMap.get("password"); whereSql.append(" and password=?"); whereobj.add(password); } if (whereMap.containsKey("phone")) { String phone = (String) whereMap.get("phone"); whereSql.append(" and phone=?"); whereobj.add(phone); } if (whereMap.containsKey("status")) { int status = (int) whereMap.get("status"); whereSql.append(" and status=?"); whereobj.add(status); } if (OrderBy == "") OrderBy = "createtime asc"; whereSql.append(" order by " + OrderBy + " limit " + nStart + "," + nLimit); strSql = strSql + whereSql; Object obj[] = whereobj.toArray(new Object[whereobj.size()]); basisSql += " INNER JOIN (" + strSql + ") userbasis_id USING (id)"; jdbcTemplate.query(basisSql, obj, new RowCallbackHandler() { public void processRow(ResultSet rs) throws SQLException { UserBasis entity = new UserBasis(); entity.setId(rs.getLong("id")); entity.setName(rs.getString("name")); entity.setPassword(rs.getString("password")); entity.setPhone(rs.getString("phone")); entity.setStatus(rs.getInt("status")); entity.setCreatetime(rs.getDate("createtime")); entity.setUpdatetime(rs.getDate("updatetime")); list.add(entity); } }); return list; } /** * 根据条件获取数据条数 * * @return */ public int getListCount(Map whereMap) { String strSql = "select count(id) from userbasis where 1=1"; StringBuffer whereSql = new StringBuffer(); List whereobj = new ArrayList(); if (whereMap.containsKey("id")) { long id = (long) whereMap.get("id"); whereSql.append(" and id=?"); whereobj.add(id); } if (whereMap.containsKey("name")) { String name = (String) whereMap.get("name"); whereSql.append(" and name=?"); whereobj.add(name); } if (whereMap.containsKey("password")) { String password = (String) whereMap.get("password"); whereSql.append(" and password=?"); whereobj.add(password); } if (whereMap.containsKey("phone")) { String phone = (String) whereMap.get("phone"); whereSql.append(" and phone=?"); whereobj.add(phone); } if (whereMap.containsKey("status")) { int status = (int) whereMap.get("status"); whereSql.append(" and status=?"); whereobj.add(status); } strSql = strSql + whereSql; Object obj[] = whereobj.toArray(new Object[whereobj.size()]); return jdbcTemplate.queryForObject(strSql, obj, Integer.class); } /** * 获取所有 * * @return */ public List getList() { final ArrayList list = new ArrayList(); String strSql = "select id,name,password,phone,status,createtime,updatetime from userbasis "; jdbcTemplate.query(strSql, new Object[] {}, new RowCallbackHandler() { public void processRow(ResultSet rs) throws SQLException { UserBasis entity = new UserBasis(); entity.setId(rs.getLong("id")); entity.setName(rs.getString("name")); entity.setPassword(rs.getString("password")); entity.setPhone(rs.getString("phone")); entity.setStatus(rs.getInt("status")); entity.setCreatetime(rs.getDate("createtime")); entity.setUpdatetime(rs.getDate("updatetime")); list.add(entity); } }); return list; } } ================================================ FILE: src/cn/mayongfa/interceptor/Authority.java ================================================ package cn.mayongfa.interceptor; import java.lang.annotation.Documented; import java.lang.annotation.ElementType; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; import java.lang.annotation.Target; @Retention(RetentionPolicy.RUNTIME) @Target(value = { ElementType.METHOD, ElementType.TYPE }) @Documented public @interface Authority { // 默认验证 AuthorityType value() default AuthorityType.Validate; } ================================================ FILE: src/cn/mayongfa/interceptor/AuthorityAnnotationInterceptor.java ================================================ package cn.mayongfa.interceptor; import java.lang.reflect.Method; import java.util.HashMap; import java.util.Map; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import org.springframework.web.method.HandlerMethod; import org.springframework.web.servlet.handler.HandlerInterceptorAdapter; import com.google.gson.Gson; /** * 权限认证拦截器 * */ public class AuthorityAnnotationInterceptor extends HandlerInterceptorAdapter { @Override public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception { if (handler instanceof HandlerMethod) { HandlerMethod hm = (HandlerMethod) handler; Class clazz = hm.getBeanType(); Method m = hm.getMethod(); try { if (clazz != null && m != null) { boolean isClzAnnotation = clazz.isAnnotationPresent(Authority.class); boolean isMethondAnnotation = m.isAnnotationPresent(Authority.class); Authority authority = null; // 如果方法和类声明中同时存在这个注解,那么方法中的会覆盖类中的设定。 if (isMethondAnnotation) { authority = m.getAnnotation(Authority.class); } else if (isClzAnnotation) { authority = clazz.getAnnotation(Authority.class); } int code = -1; String msg = ""; if (authority != null) { if (AuthorityType.NoValidate == authority.value()) { // 标记为不验证,放行 return true; } else if (AuthorityType.NoAuthority == authority.value()) { // 不验证权限,验证是否登录 // TODO: return true; } else { // 验证登录及权限 // TODO: code = 1; msg = "验证成功!"; return true; } } // //跳转 // String url = ""; // response.getWriter().write(""); // return false; // 未通过验证,返回提示json Map responseMap = new HashMap(); responseMap.put("code", code); responseMap.put("msg", msg); responseMap.put("params", ""); responseMap.put("rows", ""); String json = new Gson().toJson(responseMap); response.setCharacterEncoding("UTF-8"); response.setContentType("application/json; charset=utf-8"); response.getWriter().write(json); return false; } } catch (Exception e) { } } return false; } } ================================================ FILE: src/cn/mayongfa/interceptor/AuthorityType.java ================================================ package cn.mayongfa.interceptor; public enum AuthorityType { // 登录和权限都验证 默认 Validate, // 不验证 NoValidate, // 不验证权限 NoAuthority; } ================================================ FILE: src/cn/mayongfa/interceptor/DataSource.java ================================================ package cn.mayongfa.interceptor; import java.lang.annotation.Documented; import java.lang.annotation.ElementType; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; import java.lang.annotation.Target; @Retention(RetentionPolicy.RUNTIME) @Target(ElementType.METHOD) @Documented public @interface DataSource { DataSourceType value() default DataSourceType.Master; } ================================================ FILE: src/cn/mayongfa/interceptor/DataSourceChoose.java ================================================ package cn.mayongfa.interceptor; import java.lang.reflect.Method; import org.aspectj.lang.JoinPoint; import org.aspectj.lang.reflect.MethodSignature; import cn.mayongfa.common.JdbcContextHolder; public class DataSourceChoose { //方法执行前 public void before(JoinPoint point){ Object target = point.getTarget(); String method = point.getSignature().getName(); Class[] classz = target.getClass().getInterfaces(); MethodSignature methodSignature = (MethodSignature)point.getSignature(); Class[] parameterTypes = methodSignature.getMethod().getParameterTypes(); try { Method m = classz[0].getMethod(method, parameterTypes); if (m!=null && m.isAnnotationPresent(DataSource.class)) { DataSource data = m.getAnnotation(DataSource.class); JdbcContextHolder.clearJdbcType(); JdbcContextHolder.setJdbcType(data.value().getName()); } } catch (Exception e) { // TODO: handle exception } } } ================================================ FILE: src/cn/mayongfa/interceptor/DataSourceType.java ================================================ package cn.mayongfa.interceptor; public enum DataSourceType { // 主库 Master("master"), // 从库 Slave("slave"), // 金币主库 GoldMaster("master"), // 金币从库 GoldSlave("slave"); private DataSourceType(String name) { this.name = name; } private String name; public String getName() { return name; } public void setName(String name) { this.name = name; } } ================================================ FILE: src/cn/mayongfa/interceptor/TestInterceptor.java ================================================ package cn.mayongfa.interceptor; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import org.springframework.web.servlet.ModelAndView; import org.springframework.web.servlet.handler.HandlerInterceptorAdapter; public class TestInterceptor extends HandlerInterceptorAdapter { @Override public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception { // 请求处理完成之后 System.out.println("请求处理完成啦!"); super.afterCompletion(request, response, handler, ex); } @Override public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception { // 处理器执行完毕之后 System.out.println("处理器执行完毕啦!"); super.postHandle(request, response, handler, modelAndView); } @Override public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception { // 处理器实际执行之前 System.out.println("处理器执行之前!"); return super.preHandle(request, response, handler); } } ================================================ FILE: src/cn/mayongfa/model/UserBasis.java ================================================ package cn.mayongfa.model; import java.io.Serializable; @SuppressWarnings("serial") public class UserBasis implements Serializable{ private long id; private String name; private String password; private String phone; private int status; private java.util.Date createtime; private java.util.Date updatetime; public void setId(long value) { this.id = value; } public long getId() { return this.id; } public void setName(String value) { this.name = value; } public String getName() { return this.name; } public void setPassword(String value) { this.password = value; } public String getPassword() { return this.password; } public void setPhone(String value) { this.phone = value; } public String getPhone() { return this.phone; } public void setStatus(int value) { this.status = value; } public int getStatus() { return this.status; } public void setCreatetime(java.util.Date value) { this.createtime = value; } public java.util.Date getCreatetime() { return this.createtime; } public void setUpdatetime(java.util.Date value) { this.updatetime = value; } public java.util.Date getUpdatetime() { return this.updatetime; } } ================================================ FILE: src/cn/mayongfa/quartz/GlodQuartz.java ================================================ package cn.mayongfa.quartz; import org.springframework.scheduling.annotation.Scheduled; import org.springframework.stereotype.Component; /** * 业务相关的作业调度 * 字段 允许值 允许的特殊字符 秒 0-59 , - * / 分 0-59 , - * / 小时 0-23 , - * / 日期 1-31 , - * ? / L W C 月份 1-12 或者 JAN-DEC , - * / 星期 1-7 或者 SUN-SAT , - * ? / L C # 年(可选) 留空, 1970-2099 , - * / * 字符代表所有可能的值 / 字符用来指定数值的增量 L 字符仅被用于天(月)和天(星期)两个子表达式,表示一个月的最后一天或者一个星期的最后一天 6L 可以表示倒数第6天 * */ @Component public class GlodQuartz { /** * 用户自动加金币 * 每天凌晨一点执行一次 */ @Scheduled(cron = "0 0 1 * * ? ") public void addUserGold() { System.out.println("凌晨一点了,你睡了么?"); } /** * 每隔5秒定时清理缓存 */ @Scheduled(cron = "*/5 * * * * ? ") public void cacheClear() { //System.out.println("时间又过去5秒了,真令人伤感..."); } } ================================================ FILE: src/cn/mayongfa/service/UserBasisService.java ================================================ package cn.mayongfa.service; import java.util.List; import java.util.Map; import cn.mayongfa.interceptor.DataSource; import cn.mayongfa.interceptor.DataSourceType; import cn.mayongfa.model.UserBasis; public interface UserBasisService { /** * 保存 * @param entity * @return */ @DataSource public long Save(UserBasis entity); /** * 删除 * @param ID * @return */ @DataSource public Boolean Delete(long ID); /** * 获取信息 * @param ID * @return */ @DataSource(DataSourceType.Slave) public UserBasis getEntity(long ID); /** * 获取信息 * @param phone * @return */ @DataSource(DataSourceType.Slave) public UserBasis getEntity(String phone); /** * 根据条件获取 * @return */ @DataSource(DataSourceType.Slave) public List getList(Map whereMap, String OrderBy, int nStart, int nLimit); /** * 根据条件获取数据条数 * @return */ @DataSource(DataSourceType.Slave) public int getListCount(Map whereMap); /** * 获取所有 * @return */ @DataSource(DataSourceType.Slave) public List getList(); } ================================================ FILE: src/cn/mayongfa/service/imp/UserBasisServiceImp.java ================================================ package cn.mayongfa.service.imp; import java.util.List; import java.util.Map; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import cn.mayongfa.cache.UserBasisCache; import cn.mayongfa.dao.UserBasisDao; import cn.mayongfa.model.UserBasis; import cn.mayongfa.service.UserBasisService; @Service public class UserBasisServiceImp implements UserBasisService { @Autowired private UserBasisDao UserBasisdao; @Autowired private UserBasisCache UserBasiscache; @Override public long Save(UserBasis entity) { long id = UserBasisdao.Save(entity); if (id > 0) { UserBasiscache.set(entity); } return id; } @Override public Boolean Delete(long ID) { boolean result = UserBasisdao.Delete(ID); if (result) { UserBasiscache.delete(ID); } return result; } @Override public UserBasis getEntity(long ID) { return UserBasiscache.get(ID); } @Override public UserBasis getEntity(String phone) { return UserBasisdao.getEntity(phone); } @Override public int getListCount(Map whereMap) { throw new RuntimeException(); // return UserBasisdao.getListCount(whereMap); } @Override public List getList(Map whereMap, String OrderBy, int nStart, int nLimit) { return UserBasisdao.getList(whereMap, OrderBy, nStart, nLimit); } @Override public List getList() { return UserBasisdao.getList(); } } ================================================ FILE: src/global.properties ================================================ jxb.global.defaultavatar= jxb.global.defaultphoto= ================================================ FILE: src/jdbc.properties ================================================ master.jdbc.driverClassName=com.mysql.jdbc.Driver master.jdbc.url=jdbc:mysql://127.0.0.1:3306/springdemo?useUnicode=true&characterEncoding=UTF-8 master.jdbc.username=root master.jdbc.password=123456 slave.jdbc.driverClassName=com.mysql.jdbc.Driver slave.jdbc.url=jdbc:mysql://172.16.100.222:3306/springdemo?useUnicode=true&characterEncoding=UTF-8 slave.jdbc.username=read slave.jdbc.password=123456 goldMaster.jdbc.driverClassName=com.mysql.jdbc.Driver goldMaster.jdbc.url=jdbc:mysql://127.0.0.1:3306/springdemo?useUnicode=true&characterEncoding=UTF-8 goldMaster.jdbc.username=root goldMaster.jdbc.password=123456 goldSlave.jdbc.driverClassName=com.mysql.jdbc.Driver goldSlave.jdbc.url=jdbc:mysql://172.16.100.222:3306/springdemo?useUnicode=true&characterEncoding=UTF-8 goldSlave.jdbc.username=read goldSlave.jdbc.password=123456 ================================================ FILE: src/log4j.properties ================================================ # Priorities are: DEBUG, INFO, WARN, ERROR, or FATAL. log4j.rootCategory=INFO, CONSOLE,Druid #log4j.rootCategory=INFO, FILE #log4j.logger.cn.com.pkit=DEBUG logs.dir=${catalina.base}/logs/xdjxb/ logs.filename=logs fileBufferSize=20480 #log to File log4j.appender.FILE=org.apache.log4j.DailyRollingFileAppender log4j.appender.FILE.File=${logs.dir}/${logs.filename} log4j.appender.FILE.encoding=UTF-8 log4j.appender.FILE.Append=true log4j.appender.FILE.LocationInfo=true log4j.appender.FILE.DatePattern='.'yyyy-MM-dd'.log' log4j.appender.FILE.layout=org.apache.log4j.PatternLayout log4j.appender.FILE.layout.ConversionPattern=[%-5p] %d(%r) --> %l: %m %x %n log4j.appender.FILE.bufferSize=${fileBufferSize} # CONSOLE is set to be a ConsoleAppender using a PatternLayout. log4j.appender.CONSOLE=org.apache.log4j.ConsoleAppender log4j.appender.CONSOLE.Threshold=DEBUG log4j.appender.CONSOLE.layout=org.apache.log4j.PatternLayout log4j.appender.CONSOLE.layout.ConversionPattern=- %m%n #Druid log to File log4j.logger.druid.sql=warn,Druid log4j.logger.druid.sql.DataSource=warn,Druid log4j.logger.druid.sql.Connection=warn,Druid log4j.logger.druid.sql.Statement=warn,Druid log4j.logger.druid.sql.ResultSet=warn,Druid log4j.appender.Druid=org.apache.log4j.DailyRollingFileAppender log4j.appender.Druid.File=${logs.dir}/slowsql log4j.appender.Druid.encoding=UTF-8 log4j.appender.Druid.Append=true log4j.appender.Druid.LocationInfo=true log4j.appender.Druid.Threshold=warn log4j.appender.Druid.DatePattern='.'yyyy-MM-dd'.log' log4j.appender.Druid.layout=org.apache.log4j.PatternLayout log4j.appender.Druid.layout.ConversionPattern=[%-5p] %d(%r) - %m %n log4j.appender.Druid.bufferSize=${fileBufferSize} ================================================ FILE: src/memcached.properties ================================================ #\u8FDE\u63A5\u6C60\u5927\u5C0F\u5373\u5BA2\u6237\u7AEF\u4E2A\u6570 memcached.connectionPoolSize=10 memcached.failureMode=true #server1 server1.memcached.host=127.0.0.1 server1.memcached.port=11211 server1.memcached.weight=4 #server2 server2.memcached.host=127.0.0.1 server2.memcached.port=11211 server2.memcached.weight=6