[
  {
    "path": ".classpath",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<classpath>\n\t<classpathentry kind=\"src\" path=\"src\"/>\n\t<classpathentry kind=\"con\" path=\"org.eclipse.jst.j2ee.internal.web.container\"/>\n\t<classpathentry kind=\"con\" path=\"org.eclipse.jst.j2ee.internal.module.container\"/>\n\t<classpathentry kind=\"lib\" path=\"WebContent/WEB-INF/lib/spring-aop-4.2.6.RELEASE.jar\"/>\n\t<classpathentry kind=\"lib\" path=\"WebContent/WEB-INF/lib/spring-beans-4.2.6.RELEASE.jar\"/>\n\t<classpathentry kind=\"lib\" path=\"WebContent/WEB-INF/lib/spring-context-4.2.6.RELEASE.jar\"/>\n\t<classpathentry kind=\"lib\" path=\"WebContent/WEB-INF/lib/spring-context-support-4.2.6.RELEASE.jar\"/>\n\t<classpathentry kind=\"lib\" path=\"WebContent/WEB-INF/lib/spring-core-4.2.6.RELEASE.jar\"/>\n\t<classpathentry kind=\"lib\" path=\"WebContent/WEB-INF/lib/spring-expression-4.2.6.RELEASE.jar\"/>\n\t<classpathentry kind=\"lib\" path=\"WebContent/WEB-INF/lib/spring-jdbc-4.2.6.RELEASE.jar\"/>\n\t<classpathentry kind=\"lib\" path=\"WebContent/WEB-INF/lib/spring-jms-4.2.6.RELEASE.jar\"/>\n\t<classpathentry kind=\"lib\" path=\"WebContent/WEB-INF/lib/spring-tx-4.2.6.RELEASE.jar\"/>\n\t<classpathentry kind=\"lib\" path=\"WebContent/WEB-INF/lib/spring-web-4.2.6.RELEASE.jar\"/>\n\t<classpathentry kind=\"lib\" path=\"WebContent/WEB-INF/lib/spring-webmvc-4.2.6.RELEASE.jar\"/>\n\t<classpathentry kind=\"lib\" path=\"WebContent/WEB-INF/lib/druid-1.0.9.jar\"/>\n\t<classpathentry kind=\"lib\" path=\"WebContent/WEB-INF/lib/aopalliance.jar\"/>\n\t<classpathentry kind=\"lib\" path=\"WebContent/WEB-INF/lib/aspectjweaver-1.6.9.jar\"/>\n\t<classpathentry kind=\"lib\" path=\"WebContent/WEB-INF/lib/AXMLPrinter2.jar\"/>\n\t<classpathentry kind=\"lib\" path=\"WebContent/WEB-INF/lib/commons-beanutils.jar\"/>\n\t<classpathentry kind=\"lib\" path=\"WebContent/WEB-INF/lib/commons-collections.jar\"/>\n\t<classpathentry kind=\"lib\" path=\"WebContent/WEB-INF/lib/commons-fileupload-1.3.1.jar\"/>\n\t<classpathentry kind=\"lib\" path=\"WebContent/WEB-INF/lib/commons-io-2.4.jar\"/>\n\t<classpathentry kind=\"lib\" path=\"WebContent/WEB-INF/lib/commons-lang.jar\"/>\n\t<classpathentry kind=\"lib\" path=\"WebContent/WEB-INF/lib/commons-logging-1.1.3.jar\"/>\n\t<classpathentry kind=\"lib\" path=\"WebContent/WEB-INF/lib/dom4j-1.6.1.jar\"/>\n\t<classpathentry kind=\"lib\" path=\"WebContent/WEB-INF/lib/freemarker.jar\"/>\n\t<classpathentry kind=\"lib\" path=\"WebContent/WEB-INF/lib/geronimo-j2ee-management_1.1_spec-1.0.1.jar\"/>\n\t<classpathentry kind=\"lib\" path=\"WebContent/WEB-INF/lib/geronimo-jms_1.1_spec-1.1.1.jar\"/>\n\t<classpathentry kind=\"lib\" path=\"WebContent/WEB-INF/lib/geronimo-jta_1.0.1B_spec-1.0.1.jar\"/>\n\t<classpathentry kind=\"lib\" path=\"WebContent/WEB-INF/lib/gson-2.5.jar\"/>\n\t<classpathentry kind=\"lib\" path=\"WebContent/WEB-INF/lib/httpclient-4.5.2.jar\"/>\n\t<classpathentry kind=\"lib\" path=\"WebContent/WEB-INF/lib/httpcore-4.4.4.jar\"/>\n\t<classpathentry kind=\"lib\" path=\"WebContent/WEB-INF/lib/jaxen-1.1-beta-6.jar\"/>\n\t<classpathentry kind=\"lib\" path=\"WebContent/WEB-INF/lib/jdom.jar\"/>\n\t<classpathentry kind=\"lib\" path=\"WebContent/WEB-INF/lib/jpush-client-3.2.9.jar\"/>\n\t<classpathentry kind=\"lib\" path=\"WebContent/WEB-INF/lib/jstl-1.2.1.jar\"/>\n\t<classpathentry kind=\"lib\" path=\"WebContent/WEB-INF/lib/jstl-api-1.2.1.jar\"/>\n\t<classpathentry kind=\"lib\" path=\"WebContent/WEB-INF/lib/log4j-1.2.17.jar\"/>\n\t<classpathentry kind=\"lib\" path=\"WebContent/WEB-INF/lib/mchange-commons-java-0.2.3.1.jar\"/>\n\t<classpathentry kind=\"lib\" path=\"WebContent/WEB-INF/lib/mysql-connector-java-5.1.18.jar\"/>\n\t<classpathentry kind=\"lib\" path=\"WebContent/WEB-INF/lib/okhttp-2.7.2.jar\"/>\n\t<classpathentry kind=\"lib\" path=\"WebContent/WEB-INF/lib/okio-1.6.0.jar\"/>\n\t<classpathentry kind=\"lib\" path=\"WebContent/WEB-INF/lib/poi-3.9-20121203.jar\"/>\n\t<classpathentry kind=\"lib\" path=\"WebContent/WEB-INF/lib/poi-ooxml-3.9-20121203.jar\"/>\n\t<classpathentry kind=\"lib\" path=\"WebContent/WEB-INF/lib/poi-ooxml-schemas-3.9-20121203.jar\"/>\n\t<classpathentry kind=\"lib\" path=\"WebContent/WEB-INF/lib/servlet-api.jar\"/>\n\t<classpathentry kind=\"lib\" path=\"WebContent/WEB-INF/lib/slf4j-api-1.7.13.jar\"/>\n\t<classpathentry kind=\"lib\" path=\"WebContent/WEB-INF/lib/slf4j-log4j12-1.7.21.jar\"/>\n\t<classpathentry kind=\"lib\" path=\"WebContent/WEB-INF/lib/xmemcached-1.3.8.jar\"/>\n\t<classpathentry kind=\"lib\" path=\"WebContent/WEB-INF/lib/xmlbeans-2.3.0.jar\"/>\n\t<classpathentry kind=\"con\" path=\"org.eclipse.jst.server.core.container/org.eclipse.jst.server.tomcat.runtimeTarget/Apache Tomcat v8.0\"/>\n\t<classpathentry kind=\"con\" path=\"org.eclipse.jdt.launching.JRE_CONTAINER\"/>\n\t<classpathentry kind=\"lib\" path=\"WebContent/WEB-INF/lib/activemq-broker-5.13.0.jar\"/>\n\t<classpathentry kind=\"lib\" path=\"WebContent/WEB-INF/lib/activemq-client-5.13.0.jar\"/>\n\t<classpathentry kind=\"lib\" path=\"WebContent/WEB-INF/lib/activemq-console-5.13.0.jar\"/>\n\t<classpathentry kind=\"lib\" path=\"WebContent/WEB-INF/lib/activemq-jaas-5.13.0.jar\"/>\n\t<classpathentry kind=\"lib\" path=\"WebContent/WEB-INF/lib/activemq-pool-5.13.0.jar\"/>\n\t<classpathentry kind=\"lib\" path=\"WebContent/WEB-INF/lib/activemq-protobuf-1.1.jar\"/>\n\t<classpathentry kind=\"lib\" path=\"WebContent/WEB-INF/lib/activemq-spring-5.13.0.jar\"/>\n\t<classpathentry kind=\"lib\" path=\"WebContent/WEB-INF/lib/activemq-web-5.13.0.jar\"/>\n\t<classpathentry kind=\"output\" path=\"build/classes\"/>\n</classpath>\n"
  },
  {
    "path": ".gitignore",
    "content": "/build/\n"
  },
  {
    "path": ".project",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\r\n<projectDescription>\r\n\t<name>SpringDemo</name>\r\n\t<comment></comment>\r\n\t<projects>\r\n\t</projects>\r\n\t<buildSpec>\r\n\t\t<buildCommand>\r\n\t\t\t<name>org.eclipse.wst.jsdt.core.javascriptValidator</name>\r\n\t\t\t<arguments>\r\n\t\t\t</arguments>\r\n\t\t</buildCommand>\r\n\t\t<buildCommand>\r\n\t\t\t<name>org.eclipse.jdt.core.javabuilder</name>\r\n\t\t\t<arguments>\r\n\t\t\t</arguments>\r\n\t\t</buildCommand>\r\n\t\t<buildCommand>\r\n\t\t\t<name>org.eclipse.wst.common.project.facet.core.builder</name>\r\n\t\t\t<arguments>\r\n\t\t\t</arguments>\r\n\t\t</buildCommand>\r\n\t\t<buildCommand>\r\n\t\t\t<name>org.eclipse.wst.validation.validationbuilder</name>\r\n\t\t\t<arguments>\r\n\t\t\t</arguments>\r\n\t\t</buildCommand>\r\n\t</buildSpec>\r\n\t<natures>\r\n\t\t<nature>org.eclipse.jem.workbench.JavaEMFNature</nature>\r\n\t\t<nature>org.eclipse.wst.common.modulecore.ModuleCoreNature</nature>\r\n\t\t<nature>org.eclipse.wst.common.project.facet.core.nature</nature>\r\n\t\t<nature>org.eclipse.jdt.core.javanature</nature>\r\n\t\t<nature>org.eclipse.wst.jsdt.core.jsNature</nature>\r\n\t</natures>\r\n</projectDescription>\r\n"
  },
  {
    "path": ".settings/.jsdtscope",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\r\n<classpath>\r\n\t<classpathentry excluding=\"**/*.min.js|**/node_modules/*|**/bower_components/*\" kind=\"src\" path=\"WebContent\"/>\r\n\t<classpathentry kind=\"con\" path=\"org.eclipse.wst.jsdt.launching.JRE_CONTAINER\"/>\r\n\t<classpathentry kind=\"con\" path=\"org.eclipse.wst.jsdt.launching.WebProject\">\r\n\t\t<attributes>\r\n\t\t\t<attribute name=\"hide\" value=\"true\"/>\r\n\t\t</attributes>\r\n\t</classpathentry>\r\n\t<classpathentry kind=\"con\" path=\"org.eclipse.wst.jsdt.launching.baseBrowserLibrary\"/>\r\n\t<classpathentry kind=\"output\" path=\"\"/>\r\n</classpath>\r\n"
  },
  {
    "path": ".settings/org.eclipse.jdt.core.prefs",
    "content": "eclipse.preferences.version=1\r\norg.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled\r\norg.eclipse.jdt.core.compiler.codegen.targetPlatform=1.7\r\norg.eclipse.jdt.core.compiler.compliance=1.7\r\norg.eclipse.jdt.core.compiler.problem.assertIdentifier=error\r\norg.eclipse.jdt.core.compiler.problem.enumIdentifier=error\r\norg.eclipse.jdt.core.compiler.source=1.7\r\n"
  },
  {
    "path": ".settings/org.eclipse.wst.common.component",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?><project-modules id=\"moduleCoreId\" project-version=\"1.5.0\">\r\n    <wb-module deploy-name=\"SpringDemo\">\r\n        <wb-resource deploy-path=\"/\" source-path=\"/WebContent\" tag=\"defaultRootSource\"/>\r\n        <wb-resource deploy-path=\"/WEB-INF/classes\" source-path=\"/src\"/>\r\n        <property name=\"context-root\" value=\"SpringDemo\"/>\r\n        <property name=\"java-output-path\" value=\"/SpringDemo/build/classes\"/>\r\n    </wb-module>\r\n</project-modules>\r\n"
  },
  {
    "path": ".settings/org.eclipse.wst.common.project.facet.core.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<faceted-project>\n  <fixed facet=\"java\"/>\n  <fixed facet=\"jst.web\"/>\n  <fixed facet=\"wst.jsdt.web\"/>\n  <installed facet=\"jst.web\" version=\"3.0\"/>\n  <installed facet=\"wst.jsdt.web\" version=\"1.0\"/>\n</faceted-project>\n"
  },
  {
    "path": ".settings/org.eclipse.wst.jsdt.ui.superType.container",
    "content": "org.eclipse.wst.jsdt.launching.baseBrowserLibrary"
  },
  {
    "path": ".settings/org.eclipse.wst.jsdt.ui.superType.name",
    "content": "Window"
  },
  {
    "path": "WebContent/META-INF/MANIFEST.MF",
    "content": "Manifest-Version: 1.0\r\nClass-Path: \r\n\r\n"
  },
  {
    "path": "WebContent/WEB-INF/applicationContext.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\" ?>\n<beans xmlns=\"http://www.springframework.org/schema/beans\"\n\txmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" xmlns:p=\"http://www.springframework.org/schema/p\"\n\txmlns:context=\"http://www.springframework.org/schema/context\"\n\txmlns:aop=\"http://www.springframework.org/schema/aop\" xmlns:tx=\"http://www.springframework.org/schema/tx\"\n\txsi:schemaLocation=\"http://www.springframework.org/schema/beans\n       http://www.springframework.org/schema/beans/spring-beans.xsd\n       http://www.springframework.org/schema/context\n       http://www.springframework.org/schema/context/spring-context.xsd\n       http://www.springframework.org/schema/tx\n       http://www.springframework.org/schema/tx/spring-tx.xsd\n       http://www.springframework.org/schema/aop\n       http://www.springframework.org/schema/aop/spring-aop.xsd\">\n\n\t<!-- 将多个配置文件读取到容器中，交给Spring管理 -->\n\t<bean id=\"propertyConfigurer\"\n\t\tclass=\"org.springframework.beans.factory.config.PropertyPlaceholderConfigurer\">\n\t\t<property name=\"locations\">\n\t\t\t<list>\n\t\t\t\t<value>classpath:global.properties</value>\n\t\t\t\t<value>classpath:jdbc.properties</value>\n\t\t\t\t<value>classpath:memcached.properties</value>\n\t\t\t</list>\n\t\t</property>\n\t</bean>\n\n\t<!-- 扫描类包，将标注Spring注解的类自动转化Bean，同时完成Bean的注入 -->\n\t<context:component-scan base-package=\"cn.mayongfa.activemq\" />\n\t<context:component-scan base-package=\"cn.mayongfa.common\" />\n\t<context:component-scan base-package=\"cn.mayongfa.service\" />\n\t<context:component-scan base-package=\"cn.mayongfa.dao\" />\n\t<context:component-scan base-package=\"cn.mayongfa.cache\" />\n\t\n\t<!--master 配置数据源 -->\n\t<bean id=\"masterDataSource\" class=\"com.alibaba.druid.pool.DruidDataSource\"\n\t\tinit-method=\"init\" destroy-method=\"close\">\n\t\t<property name=\"driverClassName\">\n\t\t\t<value>${master.jdbc.driverClassName}</value>\n\t\t</property>\n\t\t<property name=\"url\">\n\t\t\t<value>${master.jdbc.url}</value>\n\t\t</property>\n\t\t<property name=\"username\">\n\t\t\t<value>${master.jdbc.username}</value>\n\t\t</property>\n\t\t<property name=\"password\">\n\t\t\t<value>${master.jdbc.password}</value>\n\t\t</property>\n\n\t\t<!-- 通过别名的方式配置扩展插件，常用的插件有：监控统计用的filter:stat 日志用的filter:log4j 防御sql注入的filter:wall -->\n\t\t<property name=\"filters\" value=\"stat,log4j\" />\n\t\t<!-- 最大并发连接数 -->\n\t\t<property name=\"maxActive\" value=\"30\" />\n\t\t<!-- 初始化连接数量 -->\n\t\t<property name=\"initialSize\" value=\"5\" />\n\t\t<!-- 配置获取连接等待超时的时间 -->\n\t\t<property name=\"maxWait\" value=\"60000\" />\n\t\t<!-- 最小空闲连接数 -->\n\t\t<property name=\"minIdle\" value=\"5\" />\n\t\t<!-- 配置间隔多久才进行一次检测，检测需要关闭的空闲连接，单位是毫秒 -->\n\t\t<property name=\"timeBetweenEvictionRunsMillis\" value=\"60000\" />\n\t\t<!-- 配置一个连接在池中最小生存的时间，单位是毫秒 -->\n\t\t<property name=\"minEvictableIdleTimeMillis\" value=\"300000\" />\n\t\t<property name=\"validationQuery\" value=\"SELECT 'x'\" />\n\t\t<property name=\"testWhileIdle\" value=\"true\" />\n\t\t<property name=\"testOnBorrow\" value=\"false\" />\n\t\t<property name=\"testOnReturn\" value=\"false\" />\n\t\t<property name=\"poolPreparedStatements\" value=\"false\" />\n\t\t<property name=\"maxOpenPreparedStatements\" value=\"100\" />\n\t\t<!-- 打开removeAbandoned功能(连接泄漏监测，怀疑存在泄漏之后再打开) -->\n\t\t<property name=\"removeAbandoned\" value=\"true\" />\n\t\t<!-- 1800秒，也就是30分钟 -->\n\t\t<property name=\"removeAbandonedTimeout\" value=\"1800\" />\n\t\t<!-- 关闭abanded连接时输出错误日志 -->\n\t\t<property name=\"logAbandoned\" value=\"true\" />\n\t</bean>\n\n\t<!--slave 配置数据源 -->\n\t<bean id=\"slaveDataSource\" class=\"com.alibaba.druid.pool.DruidDataSource\"\n\t\tinit-method=\"init\" destroy-method=\"close\">\n\t\t<property name=\"driverClassName\">\n\t\t\t<value>${slave.jdbc.driverClassName}</value>\n\t\t</property>\n\t\t<property name=\"url\">\n\t\t\t<value>${slave.jdbc.url}</value>\n\t\t</property>\n\t\t<property name=\"username\">\n\t\t\t<value>${slave.jdbc.username}</value>\n\t\t</property>\n\t\t<property name=\"password\">\n\t\t\t<value>${slave.jdbc.password}</value>\n\t\t</property>\n\n\t\t<!-- 通过别名的方式配置扩展插件，常用的插件有：监控统计用的filter:stat 日志用的filter:log4j 防御sql注入的filter:wall -->\n\t\t<!-- <property name=\"filters\" value=\"stat,log4j\" /> -->\n\t\t<property name=\"proxyFilters\">  \n            <list>  \n                <ref bean=\"stat-filter\" />  \n                <ref bean=\"log-filter\" />  \n            </list>   \n        </property> \n\t\t<!-- 最大并发连接数 -->\n\t\t<property name=\"maxActive\" value=\"30\" />\n\t\t<!-- 初始化连接数量 -->\n\t\t<property name=\"initialSize\" value=\"5\" />\n\t\t<!-- 配置获取连接等待超时的时间 -->\n\t\t<property name=\"maxWait\" value=\"60000\" />\n\t\t<!-- 最小空闲连接数 -->\n\t\t<property name=\"minIdle\" value=\"5\" />\n\t\t<!-- 配置间隔多久才进行一次检测，检测需要关闭的空闲连接，单位是毫秒 -->\n\t\t<property name=\"timeBetweenEvictionRunsMillis\" value=\"60000\" />\n\t\t<!-- 配置一个连接在池中最小生存的时间，单位是毫秒 -->\n\t\t<property name=\"minEvictableIdleTimeMillis\" value=\"300000\" />\n\t\t<property name=\"validationQuery\" value=\"SELECT 'x'\" />\n\t\t<property name=\"testWhileIdle\" value=\"true\" />\n\t\t<property name=\"testOnBorrow\" value=\"false\" />\n\t\t<property name=\"testOnReturn\" value=\"false\" />\n\t\t<property name=\"poolPreparedStatements\" value=\"false\" />\n\t\t<property name=\"maxOpenPreparedStatements\" value=\"100\" />\n\t\t<!-- 打开removeAbandoned功能(连接泄漏监测，怀疑存在泄漏之后再打开) -->\n\t\t<property name=\"removeAbandoned\" value=\"true\" />\n\t\t<!-- 1800秒，也就是30分钟 -->\n\t\t<property name=\"removeAbandonedTimeout\" value=\"1800\" />\n\t\t<!-- 关闭abanded连接时输出错误日志 -->\n\t\t<property name=\"logAbandoned\" value=\"true\" />\n\t</bean>\n\t\n\t<!--goldMaster 配置数据源 -->\n\t<bean id=\"goldMasterDataSource\" class=\"com.alibaba.druid.pool.DruidDataSource\"\n\t\tinit-method=\"init\" destroy-method=\"close\">\n\t\t<property name=\"driverClassName\">\n\t\t\t<value>${goldMaster.jdbc.driverClassName}</value>\n\t\t</property>\n\t\t<property name=\"url\">\n\t\t\t<value>${goldMaster.jdbc.url}</value>\n\t\t</property>\n\t\t<property name=\"username\">\n\t\t\t<value>${goldMaster.jdbc.username}</value>\n\t\t</property>\n\t\t<property name=\"password\">\n\t\t\t<value>${goldMaster.jdbc.password}</value>\n\t\t</property>\n\n\t\t<!-- 通过别名的方式配置扩展插件，常用的插件有：监控统计用的filter:stat 日志用的filter:log4j 防御sql注入的filter:wall -->\n\t\t<!-- <property name=\"filters\" value=\"stat,log4j\" /> -->\n\t\t<property name=\"proxyFilters\">  \n            <list>  \n                <ref bean=\"stat-filter\" />  \n                <ref bean=\"log-filter\" />  \n            </list>   \n        </property> \n\t\t<!-- 最大并发连接数 -->\n\t\t<property name=\"maxActive\" value=\"30\" />\n\t\t<!-- 初始化连接数量 -->\n\t\t<property name=\"initialSize\" value=\"5\" />\n\t\t<!-- 配置获取连接等待超时的时间 -->\n\t\t<property name=\"maxWait\" value=\"60000\" />\n\t\t<!-- 最小空闲连接数 -->\n\t\t<property name=\"minIdle\" value=\"5\" />\n\t\t<!-- 配置间隔多久才进行一次检测，检测需要关闭的空闲连接，单位是毫秒 -->\n\t\t<property name=\"timeBetweenEvictionRunsMillis\" value=\"60000\" />\n\t\t<!-- 配置一个连接在池中最小生存的时间，单位是毫秒 -->\n\t\t<property name=\"minEvictableIdleTimeMillis\" value=\"300000\" />\n\t\t<property name=\"validationQuery\" value=\"SELECT 'x'\" />\n\t\t<property name=\"testWhileIdle\" value=\"true\" />\n\t\t<property name=\"testOnBorrow\" value=\"false\" />\n\t\t<property name=\"testOnReturn\" value=\"false\" />\n\t\t<property name=\"poolPreparedStatements\" value=\"false\" />\n\t\t<property name=\"maxOpenPreparedStatements\" value=\"100\" />\n\t\t<!-- 打开removeAbandoned功能(连接泄漏监测，怀疑存在泄漏之后再打开) -->\n\t\t<property name=\"removeAbandoned\" value=\"true\" />\n\t\t<!-- 1800秒，也就是30分钟 -->\n\t\t<property name=\"removeAbandonedTimeout\" value=\"1800\" />\n\t\t<!-- 关闭abanded连接时输出错误日志 -->\n\t\t<property name=\"logAbandoned\" value=\"true\" />\n\t</bean>\n\t\n\t<!--goldSlave 配置数据源 -->\n\t<bean id=\"goldSlaveDataSource\" class=\"com.alibaba.druid.pool.DruidDataSource\"\n\t\tinit-method=\"init\" destroy-method=\"close\">\n\t\t<property name=\"driverClassName\">\n\t\t\t<value>${goldSlave.jdbc.driverClassName}</value>\n\t\t</property>\n\t\t<property name=\"url\">\n\t\t\t<value>${goldSlave.jdbc.url}</value>\n\t\t</property>\n\t\t<property name=\"username\">\n\t\t\t<value>${goldSlave.jdbc.username}</value>\n\t\t</property>\n\t\t<property name=\"password\">\n\t\t\t<value>${goldSlave.jdbc.password}</value>\n\t\t</property>\n\n\t\t<!-- 通过别名的方式配置扩展插件，常用的插件有：监控统计用的filter:stat 日志用的filter:log4j 防御sql注入的filter:wall -->\n\t\t<!-- <property name=\"filters\" value=\"stat,log4j\" /> -->\n\t\t<property name=\"proxyFilters\">  \n            <list>  \n                <ref bean=\"stat-filter\" />  \n                <ref bean=\"log-filter\" />  \n            </list>   \n        </property> \n\t\t<!-- 最大并发连接数 -->\n\t\t<property name=\"maxActive\" value=\"30\" />\n\t\t<!-- 初始化连接数量 -->\n\t\t<property name=\"initialSize\" value=\"5\" />\n\t\t<!-- 配置获取连接等待超时的时间 -->\n\t\t<property name=\"maxWait\" value=\"60000\" />\n\t\t<!-- 最小空闲连接数 -->\n\t\t<property name=\"minIdle\" value=\"5\" />\n\t\t<!-- 配置间隔多久才进行一次检测，检测需要关闭的空闲连接，单位是毫秒 -->\n\t\t<property name=\"timeBetweenEvictionRunsMillis\" value=\"60000\" />\n\t\t<!-- 配置一个连接在池中最小生存的时间，单位是毫秒 -->\n\t\t<property name=\"minEvictableIdleTimeMillis\" value=\"300000\" />\n\t\t<property name=\"validationQuery\" value=\"SELECT 'x'\" />\n\t\t<property name=\"testWhileIdle\" value=\"true\" />\n\t\t<property name=\"testOnBorrow\" value=\"false\" />\n\t\t<property name=\"testOnReturn\" value=\"false\" />\n\t\t<property name=\"poolPreparedStatements\" value=\"false\" />\n\t\t<property name=\"maxOpenPreparedStatements\" value=\"100\" />\n\t\t<!-- 打开removeAbandoned功能(连接泄漏监测，怀疑存在泄漏之后再打开) -->\n\t\t<property name=\"removeAbandoned\" value=\"true\" />\n\t\t<!-- 1800秒，也就是30分钟 -->\n\t\t<property name=\"removeAbandonedTimeout\" value=\"1800\" />\n\t\t<!-- 关闭abanded连接时输出错误日志 -->\n\t\t<property name=\"logAbandoned\" value=\"true\" />\n\t</bean>\n\t\n\t<!-- 慢SQL记录 -->  \n\t<bean id=\"stat-filter\" class=\"com.alibaba.druid.filter.stat.StatFilter\">  \n\t     <property name=\"mergeSql\" value=\"true\" />  \n\t     <!-- 3000毫秒，也就是3秒 -->\n\t     <property name=\"slowSqlMillis\" value=\"3000\" />  \n\t     <property name=\"logSlowSql\" value=\"true\" />  \n\t</bean>  \n\t<bean id=\"log-filter\" class=\"com.alibaba.druid.filter.logging.Log4jFilter\">  \n\t    <property name=\"statementLogErrorEnabled\" value=\"true\" />  \n\t</bean>\n\t\n\t<bean id=\"dataSource\" class=\"cn.mayongfa.common.DynamicDataSource\">\n\t\t<property name=\"targetDataSources\">\n\t\t\t<map>\n\t\t\t\t<entry key=\"slave\" value-ref=\"slaveDataSource\" />\n\t\t\t\t<entry key=\"goldMaster\" value-ref=\"goldMasterDataSource\" />\n\t\t\t\t<entry key=\"goldSlave\" value-ref=\"goldSlaveDataSource\" />\n\t\t\t</map>\n\t\t</property>\n\t\t<property name=\"defaultTargetDataSource\" ref=\"masterDataSource\" />\n\t</bean>\n\n\t<!-- 配置Jdbc模板 -->\n\t<bean id=\"jdbcTemplate\" class=\"org.springframework.jdbc.core.JdbcTemplate\">\n\t\t<property name=\"dataSource\" ref=\"dataSource\"></property>\n\t</bean>\n\n\t<!-- 配置事务管理器 -->\n\t<bean id=\"transactionManager\"\n\t\tclass=\"org.springframework.jdbc.datasource.DataSourceTransactionManager\"\n\t\tp:dataSource-ref=\"dataSource\" />\n\n\t<!-- 数据源切换类 -->\n\t<bean id=\"dataSourceChoose\" class=\"cn.mayongfa.interceptor.DataSourceChoose\" />\n\n\t<!-- 通过AOP配置提供事务增强，让service包下所有Bean的所有方法拥有事务 -->\n\t<aop:config proxy-target-class=\"true\">\n\t\t<aop:pointcut id=\"serviceMethod\"\n\t\t\texpression=\" execution(* cn.mayongfa.service..*(..))\" />\n\t\t<aop:advisor pointcut-ref=\"serviceMethod\" advice-ref=\"txAdvice\"\n\t\t\torder=\"2\" />\n\t\t<aop:aspect ref=\"dataSourceChoose\" order=\"1\">\n\t\t\t<aop:before method=\"before\" pointcut-ref=\"serviceMethod\" />\n\t\t</aop:aspect>\n\t</aop:config>\n\t<tx:advice id=\"txAdvice\" transaction-manager=\"transactionManager\">\n\t\t<tx:attributes>\n\t\t\t<tx:method name=\"*\" />\n\t\t</tx:attributes>\n\t</tx:advice>\n\n\t<!-- Memcached 配置 -->\n\t<bean id=\"memcachedClientBuilder\" class=\"net.rubyeye.xmemcached.XMemcachedClientBuilder\"\n\t\tp:connectionPoolSize=\"${memcached.connectionPoolSize}\" p:failureMode=\"${memcached.failureMode}\">\n\t\t<constructor-arg>\n\t\t\t<list>\n\t\t\t\t<bean class=\"java.net.InetSocketAddress\">\n\t\t\t\t\t<constructor-arg>\n\t\t\t\t\t\t<value>${server1.memcached.host}</value>\n\t\t\t\t\t</constructor-arg>\n\t\t\t\t\t<constructor-arg>\n\t\t\t\t\t\t<value>${server1.memcached.port}</value>\n\t\t\t\t\t</constructor-arg>\n\t\t\t\t</bean>\n\t\t\t\t<bean class=\"java.net.InetSocketAddress\">\n\t\t\t\t\t<constructor-arg>\n\t\t\t\t\t\t<value>${server2.memcached.host}</value>\n\t\t\t\t\t</constructor-arg>\n\t\t\t\t\t<constructor-arg>\n\t\t\t\t\t\t<value>${server2.memcached.port}</value>\n\t\t\t\t\t</constructor-arg>\n\t\t\t\t</bean>\n\t\t\t</list>\n\t\t</constructor-arg>\n\t\t<constructor-arg>\n\t\t\t<list>\n\t\t\t\t<value>${server1.memcached.weight}</value>\n\t\t\t\t<value>${server2.memcached.weight}</value>\n\t\t\t</list>\n\t\t</constructor-arg>\n\t\t<property name=\"commandFactory\">\n\t\t\t<bean class=\"net.rubyeye.xmemcached.command.TextCommandFactory\" />\n\t\t</property>\n\t\t<property name=\"sessionLocator\">\n\t\t\t<bean class=\"net.rubyeye.xmemcached.impl.KetamaMemcachedSessionLocator\" />\n\t\t</property>\n\t\t<property name=\"transcoder\">\n\t\t\t<bean class=\"net.rubyeye.xmemcached.transcoders.SerializingTranscoder\" />\n\t\t</property>\n\t</bean>\n\t<bean id=\"memcachedClient\" factory-bean=\"memcachedClientBuilder\"\n\t\tfactory-method=\"build\" destroy-method=\"shutdown\" />\n\t\t\n\t\t\n\t<!-- Spring提供的JMS工具类，它可以进行消息发送、接收等 -->\n\t<bean id=\"jmsTemplate\" class=\"org.springframework.jms.core.JmsTemplate\">\n\t\t<!-- 这个connectionFactory对应的是我们定义的Spring提供的那个ConnectionFactory对象 -->\n\t\t<property name=\"connectionFactory\" ref=\"connectionFactory\" />\n\t</bean>\n\n\t<!-- 真正可以产生Connection的ConnectionFactory，由ActiveMQ提供 -->\n\t<bean id=\"targetConnectionFactory\" class=\"org.apache.activemq.ActiveMQConnectionFactory\">\n\t\t<property name=\"brokerURL\" value=\"failover:tcp://192.168.3.15:61616\" />\n\t\t<!-- 消息传输监听器 处理网络及服务器异常 -->\n\t\t<property name=\"transportListener\">\n\t\t\t<bean class=\"cn.mayongfa.activemq.ActiveMQTransportListener\" />\n\t\t</property>\n\t</bean>\n\n\t<!-- Spring用于管理真正的ConnectionFactory的ConnectionFactory -->\n\t<bean id=\"connectionFactory\"\n\t\tclass=\"org.springframework.jms.connection.SingleConnectionFactory\">\n\t\t<property name=\"targetConnectionFactory\" ref=\"targetConnectionFactory\" />\n\t</bean>\n\n\t<!--这个是队列目的地 -->\n\t<bean id=\"queueDestination\" class=\"org.apache.activemq.command.ActiveMQQueue\">\n\t\t<constructor-arg>\n\t\t\t<value>default_queue,gold_queue</value>\n\t\t</constructor-arg>\n\t</bean>\n\t<!-- 消息监听器 -->\n\t<bean id=\"consumerMessageListener\" class=\"cn.mayongfa.activemq.ConsumerMessageListener\" />\n\t<!-- 消息监听容器 -->\n\t<bean id=\"jmsContainer\"\n\t\tclass=\"org.springframework.jms.listener.DefaultMessageListenerContainer\">\n\t\t<property name=\"connectionFactory\" ref=\"connectionFactory\" />\n\t\t<property name=\"destination\" ref=\"queueDestination\" />\n\t\t<property name=\"messageListener\" ref=\"consumerMessageListener\" />\n\t\t<!-- 设置固定的线程数 -->\n\t\t<property name=\"concurrentConsumers\" value=\"2\"></property>\n\t\t<!-- 设置动态的线程数 -->\n\t\t<property name=\"concurrency\" value=\"2-5\"></property>\n\t</bean>\n</beans>"
  },
  {
    "path": "WebContent/WEB-INF/springMVC-servlet.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<beans xmlns=\"http://www.springframework.org/schema/beans\"\n\txmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" xmlns:p=\"http://www.springframework.org/schema/p\"\n\txmlns:context=\"http://www.springframework.org/schema/context\"\n\txmlns:task=\"http://www.springframework.org/schema/task\"\n\txmlns:util=\"http://www.springframework.org/schema/util\" xmlns:mvc=\"http://www.springframework.org/schema/mvc\"\n\txsi:schemaLocation=\"\n      http://www.springframework.org/schema/beans\n      http://www.springframework.org/schema/beans/spring-beans-4.2.xsd\n      http://www.springframework.org/schema/util\n      http://www.springframework.org/schema/util/spring-util-4.2.xsd\n      http://www.springframework.org/schema/context \n      http://www.springframework.org/schema/context/spring-context-4.2.xsd\n      http://www.springframework.org/schema/mvc\n      http://www.springframework.org/schema/mvc/spring-mvc-4.2.xsd\n      http://www.springframework.org/schema/task \n      http://www.springframework.org/schema/task/spring-task.xsd \">\n\n\t<!-- 使用默认的注解映射 -->\n\t<mvc:annotation-driven />\n\t<mvc:resources location=\"/\" mapping=\"/index.html\" />\n\n\n\t<!-- 自动扫描controller包中的控制器 -->\n\t<context:component-scan base-package=\"cn.mayongfa.api.controller\" />\n\t<context:component-scan base-package=\"cn.mayongfa.controller\" />\n\n\t<!-- 扫描定时作业调度包 -->\n\t<task:annotation-driven />\n\t<context:component-scan base-package=\"cn.mayongfa.quartz\"/>\n\t\n\t<!--视图解释器 -->\n\t<bean id=\"viewResolver\"\n\t\tclass=\"org.springframework.web.servlet.view.freemarker.FreeMarkerViewResolver\">\n\t\t<property name=\"cache\" value=\"true\" />\n\t\t<property name=\"prefix\" value=\"\" />\n\t\t<property name=\"suffix\" value=\".ftl\" />\n\t\t<property name=\"contentType\" value=\"text/html;charset=UTF-8\"></property>\n\t\t<property name=\"requestContextAttribute\" value=\"request\" />\n\t\t<property name=\"exposeSpringMacroHelpers\" value=\"true\" />\n\t\t<property name=\"exposeRequestAttributes\" value=\"true\" />\n\t\t<property name=\"exposeSessionAttributes\" value=\"true\" />\n\t</bean>\n\n\t<!-- Freemarker配置 -->\n\t<bean id=\"freemarkerConfig\"\n\t\tclass=\"org.springframework.web.servlet.view.freemarker.FreeMarkerConfigurer\">\n\t\t<property name=\"templateLoaderPath\" value=\"/WEB-INF/view/\" />\n\t\t<property name=\"defaultEncoding\" value=\"UTF-8\" />\n\t\t<property name=\"freemarkerSettings\">\n\t\t\t<props>\n\t\t\t\t<prop key=\"template_update_delay\">0</prop>\n\t\t\t\t<prop key=\"default_encoding\">UTF-8</prop>\n\t\t\t\t<prop key=\"number_format\">0.##########</prop>\n\t\t\t\t<prop key=\"datetime_format\">yyyy-MM-dd HH:mm:ss</prop>\n\t\t\t\t<prop key=\"classic_compatible\">true</prop>\n\t\t\t\t<prop key=\"template_exception_handler\">ignore</prop>\n\t\t\t</props>\n\t\t</property>\n\t\t<!-- freemark 全局变量 -->\n\t\t<property name=\"freemarkerVariables\">\n\t\t\t<map>\n\t\t\t\t<entry key=\"webroot\" value=\"http://127.0.0.1:8080\"></entry>\n\t\t\t</map>\n\t\t</property>\n\t</bean>\n\n\t<!-- 上传文件拦截，设置最大上传文件大小 30M=30*1024*1024(B)=31457280 bytes -->\n\t<bean id=\"multipartResolver\"\n\t\tclass=\"org.springframework.web.multipart.commons.CommonsMultipartResolver\">\n\t\t<property name=\"maxUploadSize\" value=\"31457280\" />\n\t</bean>\n\n\t<mvc:interceptors>\n\t\t<!-- 直接定义在mvc:interceptors根下面的Interceptor将拦截所有的请求 -->\n\t\t<mvc:interceptor>\n\t\t\t<!-- 定义在mvc:interceptor下面的表示是对特定的请求才进行拦截的 -->\n\t\t\t<mvc:mapping path=\"/api/**\" />\n\t\t\t<bean class=\"cn.mayongfa.interceptor.TestInterceptor\"></bean>\n\t\t</mvc:interceptor>\n\t\t<!-- 权限认证拦截器\n\t\t<mvc:interceptor>\n\t\t\t<mvc:mapping path=\"/account/**\"/>\n\t\t\t<bean class=\"cn.mayongfa.interceptor.AuthorityAnnotationInterceptor\"></bean>\n\t\t</mvc:interceptor> -->\n\t</mvc:interceptors>\n\n\t<!-- API 接口跨域配置 -->\n\t<mvc:cors>\n\t\t<mvc:mapping path=\"/api/**\" allowed-origins=\"*\"\n\t\t\tallowed-methods=\"POST, GET, OPTIONS, DELETE, PUT\"\n\t\t\tallowed-headers=\"Content-Type, Access-Control-Allow-Headers, Authorization, X-Requested-With\"\n\t\t\tallow-credentials=\"true\" />\n\t</mvc:cors>\n</beans>"
  },
  {
    "path": "WebContent/WEB-INF/web.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<web-app xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\"\n\txmlns=\"http://java.sun.com/xml/ns/javaee\"\n\txsi:schemaLocation=\"http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd\"\n\tid=\"WebApp_ID\" version=\"3.0\">\n\t<display-name>springdemo</display-name>\n\t<welcome-file-list>\n\t\t<welcome-file>index.html</welcome-file>\n\t</welcome-file-list>\n\t<filter>\n\t\t<filter-name>encodingFilter</filter-name>\n\t\t<filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>\n\t\t<init-param>\n\t\t\t<param-name>encoding</param-name>\n\t\t\t<param-value>UTF-8</param-value>\n\t\t</init-param>\n\t\t<init-param>\n\t\t\t<param-name>forceEncoding</param-name>\n\t\t\t<param-value>true</param-value>\n\t\t</init-param>\n\t</filter>\n\t<filter-mapping>\n\t\t<filter-name>encodingFilter</filter-name>\n\t\t<url-pattern>/*</url-pattern>\n\t</filter-mapping>\n\n\t<filter>\n\t\t<filter-name>HttpMethodFilter</filter-name>\n\t\t<filter-class>org.springframework.web.filter.HttpPutFormContentFilter</filter-class>\n\t</filter>\n\t<filter-mapping>\n\t\t<filter-name>HttpMethodFilter</filter-name>\n\t\t<url-pattern>/*</url-pattern>\n\t</filter-mapping>\n\t<filter>\n\t\t<filter-name>hiddenHttpMethodFilter</filter-name>\n\t\t<filter-class>org.springframework.web.filter.HiddenHttpMethodFilter</filter-class>\n\t\t<init-param>\n\t\t\t<param-name>methodParam</param-name>\n\t\t\t<param-value>requestMethod</param-value>\n\t\t</init-param>\n\t</filter>\n\t<filter-mapping>\n\t\t<filter-name>hiddenHttpMethodFilter</filter-name>\n\t\t<url-pattern>/*</url-pattern>\n\t</filter-mapping>\n\t\n\t<listener>\n\t\t<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>\n\t</listener>\n\t<servlet>\n\t\t<servlet-name>springMVC</servlet-name>\n\t\t<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>\n\t\t<load-on-startup>1</load-on-startup>\n\t</servlet>\n\t<servlet-mapping>\n\t\t<servlet-name>springMVC</servlet-name>\n\t\t<url-pattern>/</url-pattern>\n\t</servlet-mapping>\n\t<context-param>\n\t\t<param-name>contextConfigLocation</param-name>\n\t\t<param-value>/WEB-INF/applicationContext.xml</param-value>\n\t</context-param>\n\t\n\t<!-- 连接池 启用Web监控统计功能   start-->\n\t<filter>\n\t\t<filter-name>DruidWebStatFilter</filter-name>\n\t\t<filter-class>com.alibaba.druid.support.http.WebStatFilter</filter-class>\n\t\t<init-param>\n\t\t\t<param-name>exclusions</param-name>\n\t\t\t<param-value>*.js,*mp3,*.swf,*.xls,*.gif,*.jpg,*.png,*.css,*.ico,/druid/*</param-value>\n\t\t</init-param>\n\t</filter>\n\t<filter-mapping>\n\t\t<filter-name>DruidWebStatFilter</filter-name>\n\t\t<url-pattern>/*</url-pattern>\n\t</filter-mapping>\n\t<servlet>\n\t\t<servlet-name>DruidStatView</servlet-name>\n\t\t<servlet-class>com.alibaba.druid.support.http.StatViewServlet</servlet-class>\n\t\t<init-param>  \n\t\t\t<!-- 允许清空统计数据 -->  \n\t\t\t<param-name>resetEnable</param-name>  \n\t\t\t<param-value>true</param-value>  \n\t\t</init-param>  \n\t\t<init-param>  \n\t\t\t<!-- 用户名 -->  \n\t\t\t<param-name>loginUsername</param-name>  \n\t\t\t<param-value>admin</param-value>  \n\t\t</init-param>  \n\t\t<init-param>  \n\t\t\t<!-- 密码 -->  \n\t\t\t<param-name>loginPassword</param-name>  \n\t\t\t<param-value>123456</param-value>  \n\t\t</init-param>\n\t</servlet>\n\t<servlet-mapping>\n\t\t<servlet-name>DruidStatView</servlet-name>\n\t\t<url-pattern>/druid/*</url-pattern>\n\t</servlet-mapping>\n\t<!-- 连接池 启用Web监控统计功能   end-->\n</web-app>"
  },
  {
    "path": "WebContent/index.html",
    "content": "<html>\r\n<head>\r\n<title>Spring Demo</title>\r\n</head>\r\n<body>Spring Demo\r\n</body>\r\n</html>"
  },
  {
    "path": "src/cn/mayongfa/activemq/ActiveMQTransportListener.java",
    "content": "package cn.mayongfa.activemq;\n\nimport java.io.IOException;\n\nimport org.apache.activemq.transport.TransportListener;\nimport org.apache.log4j.Logger;\n\n/**\n * 消息传输监听\n * @author Mafly\n *\n */\npublic class ActiveMQTransportListener implements TransportListener {\n\t\n\tprivate Logger log = Logger.getLogger(ActiveMQTransportListener.class);\n\n\t/**     \n\t * 对消息传输命令进行监控     \n\t * @param command     \n\t */     \n\t@Override     \n\tpublic void onCommand(Object o) {\n\t\t\n\t}     \n     \n\t/**     \n\t * 对监控到的异常进行触发     \n\t * @param error     \n\t */     \n\t@Override     \n\tpublic void onException(IOException error) {\t\t     \n\t\tlog.error(\"onException -> 消息服务器连接错误......\", error);\n\t}     \n     \n\t/**     \n\t * 当failover时触发     \n\t */     \n\t@Override     \n\tpublic void transportInterupted() {     \n\t\tlog.warn(\"transportInterupted -> 消息服务器连接发生中断...\");     \n\t\t//这里就可以状态进行标识了\n\t\t\n\t}     \n     \n\t/**     \n\t * 监控到failover恢复后进行触发     \n\t */     \n\t@Override     \n\tpublic void transportResumed() {     \n\t\tlog.info(\"transportResumed -> 消息服务器连接已恢复...\"); \n\t\t//这里就可以进行状态标识了\n\t}\n}\n"
  },
  {
    "path": "src/cn/mayongfa/activemq/ConsumerMessageListener.java",
    "content": "package cn.mayongfa.activemq;\n\nimport javax.jms.JMSException;\nimport javax.jms.Message;\nimport javax.jms.MessageListener;\nimport javax.jms.TextMessage;\n\nimport org.apache.log4j.Logger;\nimport org.springframework.stereotype.Component;\n\n/**\n * 消费者监听类\n * \n * @author Mafly\n */\n@Component\npublic class ConsumerMessageListener implements MessageListener {\n\n\tprivate Logger log = Logger.getLogger(ConsumerMessageListener.class);\n\n\t@Override\n\tpublic void onMessage(Message arg0) {\n\t\t// 监听发送到消息队列的文本消息，作强制转换。\n\t\tTextMessage textMessage = (TextMessage) arg0;\n\t\ttry {\n\t\t\tSystem.out.println(\"接收到的消息内容是：\" + textMessage.getText());\n\n\t\t\t// TODO: 你喜欢的任何事情...\n\n\t\t} catch (JMSException e) {\n\t\t\tlog.error(\"\", e);\n\t\t}\n\n\t}\n\n}\n"
  },
  {
    "path": "src/cn/mayongfa/activemq/MessageSender.java",
    "content": "package cn.mayongfa.activemq;\n\nimport java.util.HashMap;\nimport java.util.Map;\n\nimport javax.jms.JMSException;\nimport javax.jms.Message;\nimport javax.jms.Session;\nimport javax.jms.TextMessage;\n\nimport org.apache.log4j.Logger;\nimport org.springframework.beans.factory.annotation.Autowired;\nimport org.springframework.jms.core.JmsTemplate;\nimport org.springframework.jms.core.MessageCreator;\nimport org.springframework.stereotype.Component;\n\nimport com.google.gson.Gson;\n\n/**\n * ActiveMQ 消息生产类\n * \n * @author Mafly\n *\n */\n@Component\npublic class MessageSender {\n\n\tprivate Logger log = Logger.getLogger(MessageSender.class);\n\n\t@Autowired\n\tprivate JmsTemplate jmsTemplate;\n\n\tprivate String Queue = \"default_queue\";\n\n\tprivate String GoldQueue = \"gold_queue\";\n\n\tprivate Gson gson = new Gson();\n\n\t/**\n\t * 用户登录消息\n\t */\n\tpublic void userLogin(long id, String username) {\n\t\tMap<String, Object> map = new HashMap<String, Object>();\n\t\tmap.put(\"userid\", id);\n\t\tmap.put(\"username\", username);\n\n\t\tSystem.out.println(\"发送了一条消息。\");\n\t\t// 发送到金币队列\n\t\tsendMessage(gson.toJson(map), 1);\n\t}\n\n\t/**\n\t * 发送到消息队列\n\t * \n\t * @param messgae\n\t * @param type\n\t *            类型，0:默认队列 1：金币队列 ...\n\t */\n\tpublic void sendMessage(final String messgae, int type) {\n\t\ttry {\n\t\t\tString destination = this.Queue;\n\t\t\tif (type == 1) {\n\t\t\t\tdestination = GoldQueue;\n\t\t\t}\n\t\t\tjmsTemplate.send(destination, new MessageCreator() {\n\t\t\t\t@Override\n\t\t\t\tpublic Message createMessage(Session session) throws JMSException {\n\t\t\t\t\tTextMessage textMessage = session.createTextMessage(messgae);\n\t\t\t\t\treturn textMessage;\n\t\t\t\t}\n\t\t\t});\n\t\t} catch (Exception e) {\n\t\t\tlog.error(\"\", e);\n\t\t}\n\t}\n}\n"
  },
  {
    "path": "src/cn/mayongfa/api/controller/UserController.java",
    "content": "package cn.mayongfa.api.controller;\n\nimport java.util.Date;\nimport java.util.HashMap;\nimport java.util.List;\nimport java.util.Map;\n\nimport javax.servlet.http.HttpServletRequest;\nimport javax.servlet.http.HttpServletResponse;\n\nimport org.apache.log4j.Logger;\nimport org.springframework.beans.factory.annotation.Autowired;\nimport org.springframework.stereotype.Controller;\nimport org.springframework.web.bind.annotation.CrossOrigin;\nimport org.springframework.web.bind.annotation.RequestMapping;\nimport org.springframework.web.bind.annotation.RequestMethod;\nimport org.springframework.web.bind.annotation.RequestParam;\nimport org.springframework.web.bind.annotation.ResponseBody;\n\nimport com.google.gson.Gson;\n\nimport cn.mayongfa.common.MD5Util;\nimport cn.mayongfa.common.StrUtil;\nimport cn.mayongfa.model.UserBasis;\nimport cn.mayongfa.service.UserBasisService;\n\n@Controller\n@RequestMapping(\"/api/user/*\")\npublic class UserController {\n\n\tprivate static Logger log = Logger.getLogger(UserController.class);\n\t@Autowired\n\tprivate UserBasisService userBasisService;\n\n\t/**\n\t * get\n\t * \n\t * @param oRequest\n\t * @param oResponse\n\t * @return\n\t */\n\t@ResponseBody\n\t@RequestMapping(value = \"get\", produces = \"application/json;charset=UTF-8\", method = { RequestMethod.GET })\n\tpublic String get(@RequestParam(\"id\") long id) {\n\t\tint code = -1;\n\t\tString msg = \"\";\n\t\tUserBasis entity = userBasisService.getEntity(id);\n\t\ttry {\n\t\t\tif (entity != null && entity.getId() > 0) {\n\t\t\t\tcode = 1;\n\t\t\t\tmsg = \"请求成功!\";\n\t\t\t}\n\t\t} catch (Exception e) {\n\t\t\tlog.error(\"出错啦！\", e);\n\t\t}\n\n\t\tMap<String, Object> responseMap = new HashMap<String, Object>();\n\t\tresponseMap.put(\"code\", code);\n\t\tresponseMap.put(\"msg\", msg);\n\t\tresponseMap.put(\"params\", entity);\n\t\tresponseMap.put(\"rows\", \"\");\n\t\treturn new Gson().toJson(responseMap);\n\t}\n\n\t/**\n\t * getlist\n\t * \n\t * @param oRequest\n\t * @param oResponse\n\t * @return\n\t */\n\t@CrossOrigin(origins = \"*\", maxAge = 3600)\n\t@ResponseBody\n\t@RequestMapping(value = \"getlist\", produces = \"application/json;charset=UTF-8\", method = { RequestMethod.GET })\n\tpublic String getList() {\n\t\tint code = -1;\n\t\tString msg = \"\";\n\n\t\tList<UserBasis> userList = userBasisService.getList();\n\t\tif (userList != null && userList.size() > 0) {\n\t\t\tcode = 1;\n\t\t\tmsg = \"请求成功!\";\n\t\t}\n\t\t// 演示异常\n\t\tuserBasisService.getListCount(null);\n\n\t\tMap<String, Object> responseMap = new HashMap<String, Object>();\n\t\tresponseMap.put(\"code\", code);\n\t\tresponseMap.put(\"msg\", msg);\n\t\tresponseMap.put(\"params\", \"\");\n\t\tresponseMap.put(\"rows\", userList);\n\t\treturn new Gson().toJson(responseMap);\n\t}\n\n\t/**\n\t * post\n\t * \n\t * @param oRequest\n\t * @param oResponse\n\t * @return\n\t */\n\t@ResponseBody\n\t@RequestMapping(value = \"post\", produces = \"application/json;charset=UTF-8\", method = { RequestMethod.POST })\n\tpublic String post(HttpServletRequest oRequest, HttpServletResponse oResponse) {\n\t\tint code = -1;\n\t\tString msg = \"\";\n\t\tString name = oRequest.getParameter(\"name\") != null ? oRequest.getParameter(\"name\").toString() : \"\";\n\t\tString password = oRequest.getParameter(\"password\") != null ? oRequest.getParameter(\"password\").toString() : \"\";\n\t\tString phone = oRequest.getParameter(\"phone\") != null ? oRequest.getParameter(\"phone\").toString() : \"\";\n\n\t\tif (StrUtil.isNullOrEmpty(name)) {\n\t\t\tmsg = \"请填写用户姓名！\";\n\t\t} else if (StrUtil.isNullOrEmpty(password)) {\n\t\t\tmsg = \"请填写密码！\";\n\t\t} else {\n\t\t\tUserBasis entity = new UserBasis();\n\t\t\tentity.setId(StrUtil.DEFAULT_NULL);\n\t\t\tentity.setName(name);\n\t\t\tentity.setPassword(MD5Util.GetMD5Code32(password));\n\t\t\tentity.setPhone(phone);\n\t\t\tentity.setStatus(1);\n\t\t\tentity.setUpdatetime(new Date());\n\t\t\tentity.setCreatetime(new Date());\n\t\t\tlong id = userBasisService.Save(entity);\n\t\t\tif (id > 0) {\n\t\t\t\tcode = 1;\n\t\t\t\tmsg = \"添加成功！\";\n\t\t\t}\n\t\t}\n\n\t\tMap<String, Object> responseMap = new HashMap<String, Object>();\n\t\tresponseMap.put(\"code\", code);\n\t\tresponseMap.put(\"msg\", msg);\n\t\tresponseMap.put(\"params\", \"\");\n\t\tresponseMap.put(\"rows\", \"\");\n\t\treturn new Gson().toJson(responseMap);\n\t}\n\n\t/**\n\t * delete\n\t * \n\t * @param oRequest\n\t * @param oResponse\n\t * @return\n\t */\n\t@ResponseBody\n\t@RequestMapping(value = \"delete\", produces = \"application/json;charset=UTF-8\", method = { RequestMethod.DELETE })\n\tpublic String delete(@RequestParam(\"id\") long id) {\n\t\tint code = -1;\n\t\tString msg = \"\";\n\t\tif (userBasisService.Delete(id)) {\n\t\t\tcode = 1;\n\t\t\tmsg = \"删除成功！\";\n\t\t} else {\n\t\t\tmsg = \"删除失败！\";\n\t\t}\n\n\t\tMap<String, Object> responseMap = new HashMap<String, Object>();\n\t\tresponseMap.put(\"code\", code);\n\t\tresponseMap.put(\"msg\", msg);\n\t\tresponseMap.put(\"params\", \"\");\n\t\tresponseMap.put(\"rows\", \"\");\n\t\treturn new Gson().toJson(responseMap);\n\t}\n\n\t/**\n\t * put\n\t * \n\t * @param oRequest\n\t * @param oResponse\n\t * @return\n\t */\n\t@ResponseBody\n\t@RequestMapping(value = \"put\", produces = \"application/json;charset=UTF-8\", method = { RequestMethod.POST })\n\tpublic String put(HttpServletRequest oRequest, HttpServletResponse oResponse) {\n\t\tint code = -1;\n\t\tString msg = \"\";\n\n\t\tlong id = StrUtil.toLong(oRequest.getParameter(\"id\"), StrUtil.DEFAULT_NULL);\n\t\tString name = oRequest.getParameter(\"name\") != null ? oRequest.getParameter(\"name\").toString() : \"\";\n\n\t\tString phone = oRequest.getParameter(\"phone\") != null ? oRequest.getParameter(\"phone\").toString() : \"\";\n\n\t\tif (id == StrUtil.DEFAULT_NULL) {\n\t\t\tmsg = \"请选择用户！\";\n\t\t} else if (StrUtil.isNullOrEmpty(name)) {\n\t\t\tmsg = \"请填写用户姓名！\";\n\t\t} else if (StrUtil.isNullOrEmpty(phone)) {\n\t\t\t// msg = \"请填写电话！\";\n\t\t} else {\n\t\t\tUserBasis entity = userBasisService.getEntity(id);\n\t\t\tif (entity != null && entity.getId() == id) {\n\t\t\t\tentity.setName(name);\n\t\t\t\tentity.setPhone(phone);\n\t\t\t\tentity.setUpdatetime(new Date());\n\t\t\t\tid = userBasisService.Save(entity);\n\t\t\t\tif (id > 0) {\n\t\t\t\t\tcode = 1;\n\t\t\t\t\tmsg = \"更新成功！\";\n\t\t\t\t} else {\n\t\t\t\t\tmsg = \"更新失败！\";\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tmsg = \"用户不存在！\";\n\t\t\t}\n\t\t}\n\n\t\tMap<String, Object> responseMap = new HashMap<String, Object>();\n\t\tresponseMap.put(\"code\", code);\n\t\tresponseMap.put(\"msg\", msg);\n\t\tresponseMap.put(\"params\", \"\");\n\t\tresponseMap.put(\"rows\", \"\");\n\t\treturn new Gson().toJson(responseMap);\n\t}\n}\n"
  },
  {
    "path": "src/cn/mayongfa/cache/MemcachedBasis.java",
    "content": "package cn.mayongfa.cache;\n\nimport org.springframework.beans.factory.annotation.Autowired;\nimport org.springframework.stereotype.Component;\n\nimport net.rubyeye.xmemcached.MemcachedClient;\n\n@Component\npublic class MemcachedBasis {\n\n\t@Autowired\n\tprotected MemcachedClient memcachedClient;\n\t\n\t/**\n\t * 失效时间（秒）3600*24 一天\n\t */\n\tprotected int Exptime = 3600 * 24;\n\t\n\t/**\n\t * 基础数据失效时间（秒）3600*24*7 一周\n\t */\n\tprotected int DataExptime = this.Exptime * 7;\n\t\n\tprotected String Prefix = \"SPRINGDEMO:\";\n}\n"
  },
  {
    "path": "src/cn/mayongfa/cache/UserBasisCache.java",
    "content": "package cn.mayongfa.cache;\n\nimport java.util.concurrent.TimeoutException;\n\nimport org.apache.log4j.Logger;\nimport org.springframework.beans.factory.annotation.Autowired;\nimport org.springframework.stereotype.Component;\n\nimport cn.mayongfa.dao.UserBasisDao;\nimport cn.mayongfa.model.UserBasis;\nimport net.rubyeye.xmemcached.exception.MemcachedException;\n\n@Component\npublic class UserBasisCache extends MemcachedBasis {\n\n\tprivate Logger log = Logger.getLogger(UserBasisCache.class);\n\t@Autowired\n\tprivate UserBasisDao userBasisDao;\n\n\t/**\n\t * 设置缓存\n\t * \n\t * @param model\n\t *            用户model\n\t * @return\n\t */\n\tpublic Boolean set(UserBasis model) {\n\t\tBoolean result = false;\n\t\ttry {\n\t\t\tresult = memcachedClient.set(getCacheKey(model.getId()), super.Exptime, model);\n\t\t} catch (TimeoutException | InterruptedException | MemcachedException e) {\n\t\t\tlog.error(\"\", e);\n\t\t}\n\t\treturn result;\n\t}\n\n\t/**\n\t * 获取缓存\n\t * \n\t * @param id\n\t *            用户ID\n\t * @return\n\t */\n\tpublic UserBasis get(long id) {\n\t\tUserBasis entity = new UserBasis();\n\t\ttry {\n\t\t\tentity = memcachedClient.get(getCacheKey(id));\n\t\t\tif (entity == null || entity.getId() <= 0) {\n\t\t\t\tentity = userBasisDao.getEntity(id);\n\t\t\t\tthis.set(entity);\n\t\t\t}\n\t\t} catch (TimeoutException | InterruptedException | MemcachedException e) {\n\t\t\tlog.error(\"\", e);\n\t\t\tentity = userBasisDao.getEntity(id);\n\t\t}\n\t\treturn entity;\n\t}\n\n\t/**\n\t * 删除缓存\n\t * \n\t * @param id\n\t *            用户ID\n\t * @return\n\t */\n\tpublic Boolean delete(long id) {\n\t\ttry {\n\t\t\treturn memcachedClient.delete(getCacheKey(id));\n\t\t} catch (TimeoutException | InterruptedException | MemcachedException e) {\n\t\t\tlog.error(\"\", e);\n\t\t}\n\t\treturn false;\n\t}\n\n\t/**\n\t * 获取缓存 Key\n\t * \n\t * @param id\n\t *            用户ID\n\t * @return\n\t */\n\tprivate String getCacheKey(long id) {\n\t\treturn super.Prefix + \"UserBasis:\" + id;\n\t}\n}\n"
  },
  {
    "path": "src/cn/mayongfa/common/DateUtil.java",
    "content": "package cn.mayongfa.common;\r\n\r\nimport java.text.ParseException;\r\nimport java.text.SimpleDateFormat;\r\nimport java.util.Date;\r\n\r\nimport org.apache.log4j.Logger;\r\n\r\npublic class DateUtil {\r\n\r\n\tprivate static Logger log = Logger.getLogger(DateUtil.class);\r\n\t/**\r\n\t * date类型转换为String类型\r\n\t * @param data Date类型的时间\r\n\t * @param formatType 格式为yyyy-MM-dd HH:mm:ss//yyyy年MM月dd日 HH时mm分ss秒\r\n\t * @return\r\n\t */\r\n\tpublic static String dateToString(Date date, String formatType) {\r\n\t\tSimpleDateFormat sdf=new SimpleDateFormat(formatType);\r\n\t\t//java.util.Date date=new java.util.Date();\r\n\t\treturn sdf.format(date);\r\n\t}\r\n \r\n\t/**\r\n\t * long类型转换为String类型\r\n\t * @param currentTime 要转换的long类型的时间\r\n\t * @param formatType 要转换的string类型的时间格式\r\n\t * @return\r\n\t * @throws ParseException\r\n\t */\r\n\tpublic static String longToString(long currentTime, String formatType){\r\n\t\t/*SimpleDateFormat sf = new SimpleDateFormat(formatType);\r\n\t\tDate date = new Date(currentTime);\r\n\t\treturn sf.format(date);*/\r\n\t\tSimpleDateFormat oldFormat = new SimpleDateFormat(\"yyyyMMddHHmmss\");\r\n\t\tSimpleDateFormat newFormat = new SimpleDateFormat(formatType);\r\n\t\tDate date = null;\r\n\t\ttry {\r\n\t\t\tdate = oldFormat.parse(currentTime+\"\");\r\n\t\t} catch (Exception e) {\r\n\t\t\tlog.error(\"\", e);\r\n\t\t\tdate = new Date();\r\n\t\t\te.printStackTrace();\r\n\t\t}\r\n\t\treturn newFormat.format(date);\r\n\t}\r\n\t\r\n\t/**\r\n\t * long类型转换为String类型\r\n\t * @param currentTime 要转换的long类型的时间\r\n\t * @param formatType 要转换的string类型的时间格式\r\n\t * @return\r\n\t * @throws ParseException\r\n\t */\r\n\tpublic static String longToString(long currentTime, String oldFormatType, String formatType)\r\n\t\t\tthrows ParseException {\r\n\t\tString strTime = StrUtil.toStr(currentTime, StrUtil.DEFAULT_DATE); // long类型转成String\r\n\t\tDate date = stringToDate(strTime, oldFormatType);\r\n\t\treturn dateToString(date, formatType);\r\n\t}\r\n\r\n\t/**\r\n\t * string类型转换为date类型\r\n\t * @param strTime 的时间格式必须要与formatType的时间格式相同\r\n\t * @param formatType  要转换的string类型的时间，formatType要转换的格式yyyy-MM-dd HH:mm:ss//yyyy年MM月dd日HH时mm分ss秒\r\n\t * @return\r\n\t * @throws ParseException\r\n\t */\r\n\tpublic static Date stringToDate(String strTime, String formatType) {\r\n\t\ttry {\r\n\t\t\tSimpleDateFormat formatter = new SimpleDateFormat(formatType);\r\n\t\t\tDate date = null;\r\n\t\t\tdate = formatter.parse(strTime);\r\n\t\t\treturn date;\r\n\t\t} catch (Exception e) {\r\n\t\t\tlog.error(\"\", e);\r\n\t\t\treturn new Date();\r\n\t\t}\r\n\t\t\r\n\t}\r\n\r\n\t/**\r\n\t * long转换为Date类型\r\n\t * @param currentTime 要转换的long类型的时间\r\n\t * @param formatType 要转换的时间格式yyyy-MM-dd HH:mm:ss//yyyy年MM月dd日 HH时mm分ss秒\r\n\t * @return\r\n\t * @throws ParseException\r\n\t */\r\n\tpublic static Date longToDate(long currentTime, String formatType) {\r\n\t\ttry {\r\n\t\t\tDate dateOld = new Date(currentTime); // 根据long类型的毫秒数生命一个date类型的时间\r\n\t\t\tString sDateTime = dateToString(dateOld, formatType); // 把date类型的时间转换为string\r\n\t\t\tDate date = stringToDate(sDateTime, formatType); // 把String类型转换为Date类型\r\n\t\t\treturn date;\r\n\t\t} catch (Exception e) {\r\n\t\t\tlog.error(\"\", e);\r\n\t\t\treturn new Date();\r\n\t\t}\t\t\r\n\t}\r\n\r\n\t/**\r\n\t * string类型转换为long类型\r\n\t * @param strTime 要转换的String类型的时间\r\n\t * @param formatType 时间格式的时间格式和formatType的时间格式必须相同\r\n\t * @return\r\n\t * @throws ParseException\r\n\t */\r\n\tpublic static long stringToLong(String strTime, String formatType) {\r\n\t\ttry {\r\n\t\t\tDate date = stringToDate(strTime, formatType); // String类型转成date类型\r\n\t\t\tif (date == null) {\r\n\t\t\t\treturn 0;\r\n\t\t\t} else {\r\n\t\t\t\tlong currentTime = dateToLong(date); // date类型转成long类型\r\n\t\t\t\treturn currentTime;\r\n\t\t\t}\r\n\t\t} catch (Exception e) {\r\n\t\t\tlog.error(\"\", e);\r\n\t\t\treturn 0;\r\n\t\t}\r\n\t\t\r\n\t}\r\n\r\n\t/**\r\n\t * date类型转换为long类型\r\n\t * @param date 要转换的date类型的时间\r\n\t * @return\r\n\t */\r\n\tpublic static long dateToLong(Date date) {\r\n\t\treturn StrUtil.toLong(dateToString(date,\"yyyyMMddHHmmss\"), StrUtil.DEFAULT_ALL);\r\n\t}\r\n\t\r\n\t/**\r\n\t * 获取龙long类型时间\r\n\t * @return yyyyMMddHHmmss\r\n\t */\r\n\tpublic static long dateToLong() {\r\n\t\treturn StrUtil.toLong(dateToString(new Date(),\"yyyyMMddHHmmss\"), StrUtil.DEFAULT_ALL);\r\n\t}\r\n\t\r\n\t/**\r\n\t * 时间戳转Long类型时间\r\n\t * @param unix 时间戳\r\n\t * @return 若转换失败，返回当前时间\r\n\t */\r\n\tpublic static long unixToLong(long unix){\r\n\t\tSimpleDateFormat format =  new SimpleDateFormat(\"yyyyMMddHHmmss\");\r\n\t\ttry{\r\n\t\t\treturn Long.parseLong(format.format(unix));\r\n\t\t}catch(Exception e){\r\n\t\t\tlog.error(\"\", e);\r\n\t\t\treturn DateUtil.dateToLong();\r\n\t\t}\r\n\t}\r\n\t\r\n\t/**\r\n\t * 分析Long类型的时间距离当前时间多久\r\n\t * @param time Long类型的时间。yyyyMMddHHmmss\r\n\t * @return 若转换异常，返回DateUtil.longToString(time, \"yyyy-MM-dd\")\r\n\t */\r\n\tpublic static String getTimePosition(long time){\r\n\t\t SimpleDateFormat format =  new SimpleDateFormat(\"yyyyMMddHHmmss\");  \r\n\t      Date date;\r\n\t\ttry {\r\n\t\t\tdate = format.parse(time + \"\");\r\n\t\t\tlong conversionTime = date.getTime();\r\n\t\t\tlong currentTime = System.currentTimeMillis();\r\n\t\t\tlong relativeTime = currentTime - conversionTime;\r\n\t\t\tif(relativeTime < 30*60*1000){\r\n\t\t\t\treturn \"刚刚\";\r\n\t\t\t}else if(relativeTime < 60*60*1000){\r\n\t\t\t\treturn \"30分钟前\";\r\n\t\t\t}else{\r\n\t\t\t\treturn DateUtil.longToString(time, \"yyyy-MM-dd\");\r\n\t\t\t}\r\n\t\t} catch (ParseException e) {\r\n\t\t\tlog.error(\"\", e);\r\n\t\t\treturn DateUtil.longToString(time, \"yyyy-MM-dd\");\r\n\t\t} \r\n\t}\r\n}\r\n"
  },
  {
    "path": "src/cn/mayongfa/common/DynamicDataSource.java",
    "content": "package cn.mayongfa.common;\n\nimport org.springframework.jdbc.datasource.lookup.AbstractRoutingDataSource;\n\nimport cn.mayongfa.common.JdbcContextHolder;\n\npublic class DynamicDataSource extends AbstractRoutingDataSource {\n\n\t@Override\n\tprotected Object determineCurrentLookupKey() {\n\t\t// 获取当前数据源连接\n\t\treturn JdbcContextHolder.getJdbcType();\n\t}\n}\n"
  },
  {
    "path": "src/cn/mayongfa/common/ExceptionHandler.java",
    "content": "package cn.mayongfa.common;\n\nimport java.io.IOException;\nimport java.util.HashMap;\nimport java.util.Map;\n\nimport javax.servlet.http.HttpServletRequest;\nimport javax.servlet.http.HttpServletResponse;\n\nimport org.apache.log4j.Logger;\nimport org.springframework.stereotype.Component;\nimport org.springframework.web.servlet.HandlerExceptionResolver;\nimport org.springframework.web.servlet.ModelAndView;\n\nimport com.google.gson.Gson;\n\n@Component\npublic class ExceptionHandler implements HandlerExceptionResolver {\n\n\tprivate static Logger log = Logger.getLogger(ExceptionHandler.class);\n\n\t@Override\n\tpublic ModelAndView resolveException(HttpServletRequest request, HttpServletResponse response, Object handler,\n\t\t\tException exception) {\n\t\tlog.error(\"ExceptionHandler 捕获的异常：\", exception);\n\n\t\tString requestType = request.getHeader(\"X-Requested-With\");\n        String type = \"api\";    //TODO:\n\t\tif (!type.equals(\"api\") && StrUtil.isNullOrEmpty(requestType)) {\n\t\t\t// 非API请求\n\n\t\t\treturn new ModelAndView(\"redirect:/500.html\");\n\t\t} else {// JSON格式返回\n\n\t\t\tMap<String, Object> responseMap = new HashMap<String, Object>();\n\t\t\tresponseMap.put(\"code\", -1);\n\t\t\tresponseMap.put(\"msg\", \"系统异常，请稍后重试！\");\n\t\t\tresponseMap.put(\"params\", \"\");\n\t\t\tresponseMap.put(\"rows\", \"\");\n\t\t\tString json = new Gson().toJson(responseMap);\n\t\t\tresponse.setCharacterEncoding(\"UTF-8\");\n\t\t\tresponse.setContentType(\"application/json; charset=utf-8\");\n\t\t\ttry {\n\t\t\t\tresponse.getWriter().write(json);\n\t\t\t\tresponse.getWriter().flush();\n\t\t\t\treturn null;\n\t\t\t} catch (IOException e) {\n\t\t\t\tlog.error(\"\", e);\n\t\t\t}\n\t\t}\n\t\treturn new ModelAndView(\"redirect:/500.html\");\n\t}\n\n}\n"
  },
  {
    "path": "src/cn/mayongfa/common/IdWorker.java",
    "content": "package cn.mayongfa.common;\r\n\r\nimport org.apache.log4j.Logger;\r\n\r\n/**\r\n * \r\n * 以后，根据数据id，即可计算出该数据，产自哪个数据中心的.\r\n * \r\n * @author Administrator\r\n *\r\n */\r\npublic class IdWorker {\r\n\t/**\r\n\t * 下面3个参数，不同部署的地方，系统，都要修改为不同的参数值.\r\n\t */\r\n\tprivate long datacenterId = 1;\r\n\tprivate long workerId = 1;\r\n\tprivate static final String USERAGENT = \"springdemo\";\r\n\tprivate long sequence = 0L;\r\n\tprivate static final Logger logger = Logger.getLogger(IdWorker.class);\r\n\r\n\t/**\r\n     *\r\n     */\r\n\tprivate final long twepoch = 1288834974657L;\r\n\t// 机器标识位数\r\n\tprivate final long workerIdBits = 5L;\r\n\t// 数据中心标识位数\r\n\tprivate final long datacenterIdBits = 5L;\r\n\t// 机器ID最大值\r\n\tprivate final long maxWorkerId = -1L ^ (-1L << workerIdBits);\r\n\t// 数据中心ID最大值\r\n\tprivate final long maxDatacenterId = -1L ^ (-1L << datacenterIdBits);\r\n\t// 毫秒内自增位\r\n\tprivate final long sequenceBits = 12L;\r\n\t// 机器ID偏左移12位\r\n\tprivate final long workerIdShift = sequenceBits;\r\n\t// 数据中心ID左移17位\r\n\tprivate final long datacenterIdShift = sequenceBits + workerIdBits;\r\n\t// 时间毫秒左移22位\r\n\tprivate final long timestampLeftShift = sequenceBits + workerIdBits\r\n\t\t\t+ datacenterIdBits;\r\n\tprivate final long sequenceMask = -1L ^ (-1L << sequenceBits);\r\n\r\n\tprivate long lastTimestamp = -1L;\r\n\r\n\t/**\r\n\t *\r\n\t * @param workerId\r\n\t * @param datacenterId\r\n\t */\r\n\tpublic IdWorker(long workerId, long datacenterId) {\r\n\t\tif (workerId > maxWorkerId || workerId < 0) {\r\n\t\t\tthrow new IllegalArgumentException(String.format(\r\n\t\t\t\t\t\"workerId can't be greater than %d or less than 0.\",\r\n\t\t\t\t\tmaxWorkerId));\r\n\t\t}\r\n\t\tif (datacenterId > maxDatacenterId || datacenterId < 0) {\r\n\t\t\tthrow new IllegalArgumentException(String.format(\r\n\t\t\t\t\t\"datacenterId can't be greater than %d or less than 0.\",\r\n\t\t\t\t\tmaxDatacenterId));\r\n\t\t}\r\n\r\n\t\tthis.workerId = workerId;\r\n\t\tthis.datacenterId = datacenterId;\r\n\t}\r\n\r\n\tpublic IdWorker() {\r\n\r\n\t\tif (workerId > maxWorkerId || workerId < 0) {\r\n\t\t\tthrow new IllegalArgumentException(String.format(\r\n\t\t\t\t\t\"workerId can't be greater than %d or less than 0.\",\r\n\t\t\t\t\tmaxWorkerId));\r\n\t\t}\r\n\t\tif (datacenterId > maxDatacenterId || datacenterId < 0) {\r\n\t\t\tthrow new IllegalArgumentException(String.format(\r\n\t\t\t\t\t\"datacenterId can't be greater than %d or less than 0.\",\r\n\t\t\t\t\tmaxDatacenterId));\r\n\t\t}\r\n\t\t//this.workerId = workerId;\r\n\t\t//this.datacenterId = datacenterId;\r\n\t}\r\n\r\n\t/**\r\n\t *\r\n\t * @return\r\n\t */\r\n\tprotected synchronized long nextId() {\r\n\r\n\t\tlong id = 0L;\r\n\r\n\t\tlong timestamp = timeGen();\r\n\t\t// 时间错误\r\n\t\tif (timestamp < lastTimestamp) {\r\n\t\t\tthrow new RuntimeException(\r\n\t\t\t\t\tString.format(\r\n\t\t\t\t\t\t\t\"clock moved backwards. refusing to generate id for %d milliseconds.\",\r\n\t\t\t\t\t\t\tlastTimestamp - timestamp));\r\n\t\t}\r\n\t\tif (timestamp == lastTimestamp) {\r\n\t\t\t// 当前毫秒内，则+1\r\n\t\t\tsequence = (1 + sequence) & sequenceMask;\r\n\t\t\tif (0 == sequence) {\r\n\t\t\t\t// 当前毫秒内计数满了，则等待下一秒\r\n\t\t\t\ttimestamp = tilNextMillis(lastTimestamp);\r\n\t\t\t}\r\n\t\t} else {\r\n\t\t\tsequence = 0;\r\n\t\t}\r\n\t\tlastTimestamp = timestamp;\r\n\t\t// ID偏移组合生成最终的ID，并返回ID\r\n\t\tid = ((timestamp - twepoch) << timestampLeftShift)\r\n\t\t\t\t| (datacenterId << datacenterIdShift)\r\n\t\t\t\t| (workerId << workerIdShift) | sequence;\r\n\r\n\t\treturn id;\r\n\t}\r\n\r\n\t/**\r\n\t * 等待下一个毫秒的到来\r\n\t * \r\n\t * @param lastTimestamp\r\n\t * @return\r\n\t */\r\n\tprotected long tilNextMillis(long lastTimestamp) {\r\n\r\n\t\tlong timestamp = timeGen();\r\n\r\n\t\twhile (timestamp <= lastTimestamp) {\r\n\t\t\ttimestamp = timeGen();\r\n\t\t}\r\n\r\n\t\treturn timestamp;\r\n\t}\r\n\r\n\t/**\r\n\t *\r\n\t * @return\r\n\t */\r\n\tprotected long timeGen() {\r\n\r\n\t\treturn System.currentTimeMillis();\r\n\t}\r\n\r\n\tpublic long get_worker_id() throws Exception {\r\n\t\treturn workerId;\r\n\t}\r\n\r\n\tpublic long get_timestamp() throws Exception {\r\n\t\treturn System.currentTimeMillis();\r\n\t}\r\n\r\n\tpublic long get_id(String useragent) throws Exception {\r\n\t\tif (!USERAGENT.equals(useragent)) {\r\n\t\t\tthrow new Exception(\"invalid useragent.\");\r\n\t\t}\r\n\t\tlong id = nextId();\r\n\t\tlogger.info(String.format(\"id: %s  user_agent: %s  worker_id: %s  data_center_id: %s\",id, useragent, workerId, datacenterId));\r\n\t\treturn id;\r\n\t}\r\n\r\n\tpublic long get_datacenter_id() throws Exception {\r\n\t\treturn datacenterId;\r\n\t}\r\n}\r\n"
  },
  {
    "path": "src/cn/mayongfa/common/IdWorkerManage.java",
    "content": "package cn.mayongfa.common;\r\n\r\npublic class IdWorkerManage {\r\n\r\n\tprivate static IdWorker IdWorkerInstance = null;\r\n\r\n\tstatic {\r\n\r\n\t\tIdWorkerManage.IdWorkerInstance = new IdWorker();\r\n\t}\r\n\r\n\t/**\r\n\t * single 单例模式\r\n\t * \r\n\t * @return\r\n\t */\r\n\tprivate static IdWorker getIdWorkerInstance() {\r\n\r\n\t\tif (IdWorkerManage.IdWorkerInstance == null) {\r\n\t\t\tIdWorkerManage.IdWorkerInstance = new IdWorker();\r\n\t\t}\r\n\t\treturn IdWorkerManage.IdWorkerInstance;\r\n\t}\r\n\r\n\t/**\r\n\t * single 单例模式\r\n\t * \r\n\t * @return\r\n\t */\r\n\tpublic static long getId() throws Exception {\r\n\t\treturn IdWorkerManage.getIdWorkerInstance().get_id(\"springdemo\");\r\n\t}\r\n\t\r\n\t/*\r\n\tpublic static void main(String[] args) {\r\n\t\tfor (int i = 0; i < 101; i++) {\r\n\t\t\ttry {\r\n\t\t\t\tSystem.out.println(IdWorkerManage.getId());\r\n\t\t\t} catch (Exception e) {\r\n\t\t\t\t// TODO Auto-generated catch block\r\n\t\t\t\te.printStackTrace();\r\n\t\t\t}\r\n\t\t}\r\n\t}*/\r\n\r\n}\r\n"
  },
  {
    "path": "src/cn/mayongfa/common/JdbcContextHolder.java",
    "content": "package cn.mayongfa.common;\n\npublic class JdbcContextHolder {\n\t\n\tprivate static final ThreadLocal<String> contextHolder = new ThreadLocal<String>();\n\n\tpublic static void setJdbcType(String jdbcType) {\n\t\tcontextHolder.set(jdbcType);\n\t}\n\n\tpublic static void setSlave() {\n\t\tsetJdbcType(\"slave\");\n\t}\n\n\tpublic static void setMaster() {\n\t\tclearJdbcType();\n\t}\n\n\tpublic static String getJdbcType() {\n\t\treturn (String) contextHolder.get();\n\t}\n\n\tpublic static void clearJdbcType() {\n\t\tcontextHolder.remove();\n\t}\n}\n"
  },
  {
    "path": "src/cn/mayongfa/common/MD5Util.java",
    "content": "package cn.mayongfa.common;\r\n\r\nimport java.security.MessageDigest;\r\n\r\nimport org.apache.log4j.Logger;\r\n\r\npublic class MD5Util {\r\n\r\n\tprivate static Logger log = Logger.getLogger(MD5Util.class);\r\n\r\n\tpublic static String GetMD5Code16(String strObj) {\r\n\t\treturn GetMD5Code32(strObj).substring(8, 24);\r\n\t}\r\n\r\n\tpublic static String GetMD5Code32(String strObj) {\r\n\t\tString resultString = null;\r\n\t\ttry {\r\n\t\t\tresultString = new String(strObj);\r\n\t\t\tMessageDigest md = MessageDigest.getInstance(\"MD5\");\r\n\t\t\t// md.digest() 该函数返回值为存放哈希值结果的byte数组\r\n\t\t\tresultString = byteToString(md.digest(strObj.getBytes(\"UTF-8\")));\r\n\t\t} catch (Exception ex) {\r\n\t\t\tlog.error(\"\", ex);\r\n\t\t}\r\n\t\treturn resultString;\r\n\t}\r\n\r\n\t// 转换字节数组为16进制字串\r\n\tprivate static String byteToString(byte[] bByte) {\r\n\t\tStringBuffer sBuffer = new StringBuffer();\r\n\t\tfor (int i = 0; i < bByte.length; i++) {\r\n\t\t\tsBuffer.append(byteToArrayString(bByte[i]));\r\n\t\t}\r\n\t\treturn sBuffer.toString();\r\n\t}\r\n\r\n\t// 返回形式为数字跟字符串\r\n\tprivate static String byteToArrayString(byte bByte) {\r\n\t\tint iRet = bByte;\r\n\t\t// System.out.println(\"iRet=\"+iRet);\r\n\t\tif (iRet < 0) {\r\n\t\t\tiRet += 256;\r\n\t\t}\r\n\t\tint iD1 = iRet / 16;\r\n\t\tint iD2 = iRet % 16;\r\n\t\treturn strDigits[iD1] + strDigits[iD2];\r\n\t}\r\n\r\n\tprivate final static String[] strDigits = { \"0\", \"1\", \"2\", \"3\", \"4\", \"5\", \"6\", \"7\", \"8\", \"9\", \"a\", \"b\", \"c\", \"d\",\r\n\t\t\t\"e\", \"f\" };\r\n}\r\n"
  },
  {
    "path": "src/cn/mayongfa/common/StrUtil.java",
    "content": "package cn.mayongfa.common;\r\n\r\nimport java.io.UnsupportedEncodingException;\r\nimport java.math.BigDecimal;\r\nimport java.util.ArrayList;\r\nimport java.util.Arrays;\r\nimport java.util.Collections;\r\nimport java.util.HashMap;\r\nimport java.util.List;\r\nimport java.util.Map;\r\nimport java.util.regex.Matcher;\r\nimport java.util.regex.Pattern;\r\n\r\nimport com.google.gson.Gson;\r\nimport com.google.gson.reflect.TypeToken;\r\n\r\n/**\r\n * 字符串处理类\r\n * \r\n * @Version 1.0\r\n * @Remark\r\n */\r\npublic final class StrUtil {\r\n\t/** 7位ASCII字符，也叫作ISO646-US、Unicode字符集的基本拉丁块 */\r\n\tprivate static final String US_ASCII = \"US-ASCII\";\r\n\r\n\t/** ISO 拉丁字母表 No.1，也叫作 ISO-LATIN-1 */\r\n\tprivate static final String ISO_8859_1 = \"ISO-8859-1\";\r\n\r\n\t/** 8 位 UCS 转换格式 */\r\n\tprivate static final String UTF_8 = \"UTF-8\";\r\n\r\n\t/** 16 位 UCS 转换格式，Big Endian（最低地址存放高位字节）字节顺序 */\r\n\tprivate static final String UTF_16BE = \"UTF-16BE\";\r\n\r\n\t/** 16 位 UCS 转换格式，Little-endian（最高地址存放低位字节）字节顺序 */\r\n\tprivate static final String UTF_16LE = \"UTF-16LE\";\r\n\r\n\t/** 16 位 UCS 转换格式，字节顺序由可选的字节顺序标记来标识 */\r\n\tprivate static final String UTF_16 = \"UTF-16\";\r\n\r\n\t/** 中文超大字符集 */\r\n\tprivate static final String GBK = \"GBK\";\r\n\r\n\t/** 默认全部值 1111 */\r\n\tpublic static final long DEFAULT_ALL = (long) 1111;// 如下拉选择的全部 选项\r\n\tpublic static final int DEFAULT_ALL_Int = 1111;// 如下拉选择的全部\r\n\r\n\t/** 默认空值 0001 */\r\n\tpublic static final long DEFAULT_NULL = (long) 0001;// 在值转换时候，如 字符转为\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t// long类型时候，先判断字符是否为空，如果为空返回这个\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t// ，或者转换异常时候。\r\n\r\n\t/** 默认值 9999 */\r\n\tpublic static final long DEFAULT_VALUE = (long) 9999;// 如数据库非null字段情况下，给一个默认值\r\n\r\n\t/** 默认值 0001-01-01 */\r\n\tpublic static final String DEFAULT_DATE = \"0001-01-01\";// 日期为空的时候默认值，给一个默认值\r\n\r\n\t/**\r\n\t * 将字符编码转换成GBK码\r\n\t * \r\n\t * @param sStr\r\n\t * @return String\r\n\t * @throws UnsupportedEncodingException\r\n\t */\r\n\tpublic final static String toGBK(String sStr) throws UnsupportedEncodingException {\r\n\t\treturn changeCharset(sStr, GBK);\r\n\t}\r\n\r\n\t/**\r\n\t * 将字符编码转换成UTF-8码\r\n\t * \r\n\t * @param sStr\r\n\t * @return String\r\n\t * @throws UnsupportedEncodingException\r\n\t */\r\n\tpublic final static String toUTF8(String sStr) throws UnsupportedEncodingException {\r\n\t\treturn changeCharset(sStr, UTF_8);\r\n\t}\r\n\r\n\t/**\r\n\t * 将字符编码转换成US-ASCII码\r\n\t * \r\n\t * @param sStr\r\n\t * @return String\r\n\t * @throws UnsupportedEncodingException\r\n\t */\r\n\tpublic final static String toASCII(String sStr) throws UnsupportedEncodingException {\r\n\t\treturn changeCharset(sStr, US_ASCII);\r\n\t}\r\n\r\n\t/**\r\n\t * 将字符编码转换成UTF-16码\r\n\t * \r\n\t * @param sStr\r\n\t * @return String\r\n\t * @throws UnsupportedEncodingException\r\n\t */\r\n\tpublic final static String toUTF16(String sStr) throws UnsupportedEncodingException {\r\n\t\treturn changeCharset(sStr, UTF_16);\r\n\t}\r\n\r\n\t/**\r\n\t * 字符串编码转换的实现方法\r\n\t * \r\n\t * @param sStr\r\n\t *            待转换编码的字符串\r\n\t * @param sNewCharset\r\n\t *            目标编码\r\n\t * @return String\r\n\t * @throws UnsupportedEncodingException\r\n\t */\r\n\tpublic final static String changeCharset(String sStr, String sNewCharset) throws UnsupportedEncodingException {\r\n\t\t// 用默认字符编码解码字符串。\r\n\t\tbyte[] aBits = sStr.getBytes();\r\n\t\t// 用新的字符编码生成字符串\r\n\t\treturn new String(aBits, sNewCharset);\r\n\t}\r\n\r\n\t/**\r\n\t * 将字符编码转换成ISO-8859-1码\r\n\t * \r\n\t * @param sStr\r\n\t * @return String\r\n\t * @throws UnsupportedEncodingException\r\n\t */\r\n\tpublic final static String toISO_8859_1(String sStr) throws UnsupportedEncodingException {\r\n\t\treturn changeCharset(sStr, ISO_8859_1);\r\n\t}\r\n\r\n\t/**\r\n\t * 将字符编码转换成UTF-16BE码\r\n\t * \r\n\t * @param sStr\r\n\t * @return String\r\n\t * @throws UnsupportedEncodingException\r\n\t */\r\n\tpublic final static String toUTF16BE(String sStr) throws UnsupportedEncodingException {\r\n\t\treturn changeCharset(sStr, UTF_16BE);\r\n\t}\r\n\r\n\t/**\r\n\t * 将字符编码转换成UTF-16LE码\r\n\t * \r\n\t * @param sStr\r\n\t * @return String\r\n\t * @throws UnsupportedEncodingException\r\n\t */\r\n\tpublic final static String toUTF16LE(String sStr) throws UnsupportedEncodingException {\r\n\t\treturn changeCharset(sStr, UTF_16LE);\r\n\t}\r\n\r\n\t/**\r\n\t * 字符串编码转换的实现方法\r\n\t * \r\n\t * @param sStr\r\n\t *            待转换编码的字符串\r\n\t * @param sOldCharset\r\n\t *            原编码\r\n\t * @param sNewCharset\r\n\t *            目标编码\r\n\t * @return String\r\n\t * @throws UnsupportedEncodingException\r\n\t */\r\n\tpublic final static String changeCharset(String sStr, String sOldCharset, String sNewCharset)\r\n\t\t\tthrows UnsupportedEncodingException {\r\n\t\t// 用旧的字符编码解码字符串。解码可能会出现异常。\r\n\t\tbyte[] aBits = sStr.getBytes(sOldCharset);\r\n\t\t// 用新的字符编码生成字符串\r\n\t\treturn new String(aBits, sNewCharset);\r\n\t}\r\n\r\n\t/**\r\n\t * 返回正则表达式的结果集\r\n\t * \r\n\t * @param sStr\r\n\t * @param sPattern\r\n\t * @return List<String>\r\n\t */\r\n\tpublic final static List<String> getRegexResult(String sStr, String sPattern) {\r\n\t\tArrayList<String> aList = new ArrayList<String>();\r\n\t\tPattern oPattern = Pattern.compile(sPattern);\r\n\t\tMatcher oMatcher = oPattern.matcher(sStr);\r\n\t\twhile (oMatcher.find()) {\r\n\t\t\tfor (int i = 1, nTotal = oMatcher.groupCount(); i <= nTotal; i++) {\r\n\t\t\t\taList.add(oMatcher.group(i));\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\treturn aList;\r\n\t}\r\n\r\n\t/**\r\n\t * 字符串正则表达式替换\r\n\t * \r\n\t * @param sSource\r\n\t * @param sReplace\r\n\t * @param sPattern\r\n\t * @return String\r\n\t */\r\n\tpublic final static String getRegexReplaceResult(String sSource, String sReplace, String sPattern) {\r\n\t\tPattern oPattern = Pattern.compile(sPattern);\r\n\t\tMatcher oMatcher = oPattern.matcher(sSource);\r\n\r\n\t\treturn oMatcher.replaceAll(sReplace);\r\n\t}\r\n\r\n\t/**\r\n\t * 正则表达式检查结果\r\n\t * \r\n\t * @param sStr\r\n\t * @param sPattern\r\n\t * @return boolean\r\n\t */\r\n\tpublic final static boolean checkMather(String sStr, String sPattern) {\r\n\t\tPattern oPattern = Pattern.compile(sPattern);\r\n\t\tMatcher oMather = oPattern.matcher(sStr);\r\n\t\treturn oMather.matches();\r\n\t}\r\n\r\n\t/**\r\n\t * 如果字符串为空则用默认值\r\n\t * \r\n\t * @param sStr\r\n\t * @param sDefault\r\n\t * @return String\r\n\t */\r\n\tpublic final static String toStr(Object sStr, String sDefault) {\r\n\t\treturn sStr == null ? sDefault : sStr.toString().trim();\r\n\t}\r\n\r\n\t/**\r\n\t * 如果字符串为空则用默认值\r\n\t * \r\n\t * @param sStr\r\n\t * @param sDefault\r\n\t * @return String\r\n\t */\r\n\tpublic final static String toStrNOTrim(Object sStr, String sDefault) {\r\n\t\treturn sStr == null ? sDefault : sStr.toString();\r\n\t}\r\n\r\n\t/**\r\n\t * 把字符串转换成整数\r\n\t * \r\n\t * @param sValue\r\n\t * @param nDefault\r\n\t * @return int\r\n\t */\r\n\tpublic final static int toInt(String sValue, int nDefault) {\r\n\t\tif (sValue == null || sValue.isEmpty())\r\n\t\t\treturn nDefault;\r\n\t\ttry {\r\n\t\t\treturn Integer.valueOf(sValue);\r\n\t\t} catch (Exception ex) {\r\n\t\t\treturn nDefault;\r\n\t\t}\r\n\r\n\t}\r\n\r\n\t/**\r\n\t * 把字符串转换成Long数\r\n\t * \r\n\t * @param sValue\r\n\t * @param nDefault\r\n\t * @return int\r\n\t */\r\n\tpublic final static Long toLong(String sValue, Long nDefault) {\r\n\t\tif (sValue == null || sValue.isEmpty())\r\n\t\t\treturn nDefault;\r\n\t\ttry {\r\n\t\t\treturn Long.valueOf(sValue);\r\n\t\t} catch (Exception ex) {\r\n\t\t\treturn nDefault;\r\n\t\t}\r\n\r\n\t}\r\n\r\n\t/**\r\n\t * 把字符串转换成小数\r\n\t * \r\n\t * @param sValue\r\n\t * @param nDefault\r\n\t * @return Float\r\n\t */\r\n\tpublic final static Float toFloat(String sValue, Float nDefault) {\r\n\t\tif (sValue == null || sValue.isEmpty())\r\n\t\t\treturn nDefault;\r\n\t\treturn Float.valueOf(sValue);\r\n\t}\r\n\r\n\t/**\r\n\t * 把字符串转换成双精度小数\r\n\t * \r\n\t * @param sValue\r\n\t * @param nDefault\r\n\t * @return Double\r\n\t */\r\n\tpublic final static Double toDouble(String sValue, Double nDefault) {\r\n\t\tif (sValue == null || sValue.isEmpty())\r\n\t\t\treturn nDefault;\r\n\t\treturn Double.valueOf(sValue);\r\n\t}\r\n\r\n\t/**\r\n\t * 把字符串转换成浮点\r\n\t * \r\n\t * @param sValue\r\n\t * @param nDefault\r\n\t * @return float\r\n\t */\r\n\tpublic final static float toFloat(String sValue, float nDefault) {\r\n\t\tif (sValue == null || sValue.isEmpty())\r\n\t\t\treturn nDefault;\r\n\t\treturn Float.valueOf(sValue);\r\n\t}\r\n\r\n\t/**\r\n\t * 把字符串转换成 布尔型\r\n\t * \r\n\t * @param sValue\r\n\t * @param nDefault\r\n\t * @return boolean\r\n\t */\r\n\tpublic final static boolean toBoolean(String sValue, boolean nDefault) {\r\n\t\tif (sValue == null || sValue.isEmpty())\r\n\t\t\treturn nDefault;\r\n\t\treturn Boolean.valueOf(sValue);\r\n\t}\r\n\r\n\t/**\r\n\t * 数据显示小数点问题\r\n\t * \r\n\t * @param d\r\n\t * @return\r\n\t */\r\n\tpublic final static String doubleToStr(Double dd) {\r\n\t\tif (null == dd) {\r\n\t\t\treturn \"\";\r\n\t\t}\r\n\t\tdouble d = dd;\r\n\t\tdouble c = d - (int) d;\r\n\t\tif (c == 0)\r\n\t\t\treturn (int) d + \"\";\r\n\t\telse {\r\n\t\t\tBigDecimal b = new BigDecimal(d);\r\n\t\t\tBigDecimal one = new BigDecimal(\"1\");\r\n\t\t\tc = b.divide(one, 2, BigDecimal.ROUND_HALF_UP).doubleValue();\r\n\t\t\treturn String.valueOf(c);\r\n\t\t}\r\n\t}\r\n\r\n\tpublic final static String floatToStr(float d) {\r\n\t\tif (Math.round(d) - d == 0) {\r\n\t\t\treturn String.valueOf((long) d);\r\n\t\t}\r\n\t\treturn String.valueOf(d);\r\n\t}\r\n\r\n\t/**\r\n\t * 字符串 ： 解决数据库入库时候的非法符号 转 HTML 符号\r\n\t * \r\n\t * @param sStr\r\n\t * @param sDefault\r\n\t * @return\r\n\t */\r\n\tpublic final static String toHtml(Object sStr, String sDefault) {\r\n\t\tString sValue = sStr == null ? sDefault : sStr.toString();\r\n\t\tsValue = sValue.replaceAll(\"<\", \"&lt;\");\r\n\t\tsValue = sValue.replaceAll(\">\", \"&gt;\");\r\n\t\tsValue = sValue.replaceAll(\"&\", \"&amp;\");\r\n\t\treturn sValue;\r\n\t}\r\n\r\n\t/**\r\n\t * 获取八位不重复随机码（取当前时间戳转化为16进制）\r\n\t * \r\n\t * @param time\r\n\t * @return\r\n\t */\r\n\tpublic final static String toHex(long time) {\r\n\t\treturn Integer.toHexString((int) time);\r\n\t}\r\n\r\n\tpublic static String getVerificationCode(int count, Boolean isLetter) {\r\n\t\tString[] beforeLetterShuffle = new String[] { \"A\", \"B\", \"C\", \"D\", \"E\", \"F\", \"G\", \"H\", \"I\", \"J\", \"K\", \"L\", \"M\",\r\n\t\t\t\t\"N\", \"O\", \"P\", \"Q\", \"R\", \"S\", \"T\", \"U\", \"V\", \"W\", \"X\", \"Y\", \"Z\" };\r\n\t\tString[] beforeNumberShuffle = new String[] { \"1\", \"2\", \"3\", \"4\", \"5\", \"6\", \"7\", \"8\", \"9\", \"8\" };\r\n\t\tList<String> list = Arrays.asList(isLetter ? beforeLetterShuffle : beforeNumberShuffle);\r\n\t\tCollections.shuffle(list);\r\n\t\tStringBuilder sb = new StringBuilder();\r\n\t\tfor (int i = 0; i < list.size(); i++) {\r\n\t\t\tsb.append(list.get(i));\r\n\t\t}\r\n\t\tString afterShuffle = sb.toString();\r\n\t\tString result = afterShuffle.substring(0, count);\r\n\t\treturn result;\r\n\t}\r\n\r\n\t/**\r\n\t * 检测字符串是否为空(null,\"\",\"null\")\r\n\t * \r\n\t * @param value\r\n\t * @return 为空则返回true，否则返回false\r\n\t */\r\n\tpublic final static boolean isNullOrEmpty(String value) {\r\n\t\treturn value == null || \"\".equals(value.trim()) || \"null\".equals(value.trim());\r\n\t}\r\n\r\n\t/**\r\n\t * 判断在values数组中是否存在value元素\r\n\t * \r\n\t * @param values\r\n\t *            数组\r\n\t * @param value\r\n\t *            字符串\r\n\t * @return 存在，返回true。反之，false。\r\n\t */\r\n\tpublic static boolean contains(String[] values, String value) {\r\n\t\tif (values != null && values.length > 0) {\r\n\t\t\tfor (String s : values) {\r\n\t\t\t\tif (s != null) {\r\n\t\t\t\t\tif (s.equals(value)) {\r\n\t\t\t\t\t\treturn true;\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\t\treturn false;\r\n\t}\r\n\r\n\t/**\r\n\t * json字符串转换为List<Map<String, Object>>\r\n\t * \r\n\t * @param jsonString\r\n\t * @return\r\n\t */\r\n\tpublic final static List<Map<String, Object>> toMapList(String jsonString) {\r\n\t\tList<Map<String, Object>> mapList = new ArrayList<>();\r\n\t\tif (!StrUtil.isNullOrEmpty(jsonString)) {\r\n\t\t\tmapList = new Gson().fromJson(jsonString, new TypeToken<ArrayList<Map<String, Object>>>() {\r\n\t\t\t}.getType());\r\n\t\t}\r\n\t\treturn mapList;\r\n\t}\r\n\r\n\t/**\r\n\t * json字符串转换为Map<String, Object>\r\n\t * \r\n\t * @param jsonString\r\n\t * @return\r\n\t */\r\n\tpublic final static Map<String, Object> toMap(String jsonString) {\r\n\t\tMap<String, Object> map = new HashMap<>();\r\n\t\tif (!StrUtil.isNullOrEmpty(jsonString)) {\r\n\t\t\tmap = new Gson().fromJson(jsonString, new TypeToken<Map<String, Object>>() {\r\n\t\t\t}.getType());\r\n\t\t}\r\n\t\treturn map;\r\n\t}\r\n}\r\n"
  },
  {
    "path": "src/cn/mayongfa/controller/AccountController.java",
    "content": "package cn.mayongfa.controller;\n\nimport java.util.HashMap;\nimport java.util.Map;\n\nimport org.springframework.beans.factory.annotation.Autowired;\nimport org.springframework.stereotype.Controller;\nimport org.springframework.web.bind.annotation.RequestMapping;\nimport org.springframework.web.bind.annotation.RequestMethod;\nimport org.springframework.web.bind.annotation.RequestParam;\nimport org.springframework.web.bind.annotation.ResponseBody;\n\nimport com.google.gson.Gson;\n\nimport cn.mayongfa.activemq.MessageSender;\nimport cn.mayongfa.common.MD5Util;\nimport cn.mayongfa.common.StrUtil;\nimport cn.mayongfa.interceptor.Authority;\nimport cn.mayongfa.interceptor.AuthorityType;\nimport cn.mayongfa.model.UserBasis;\nimport cn.mayongfa.service.UserBasisService;\n\n@Controller\n@Authority(AuthorityType.NoValidate)\n@RequestMapping(\"/account/*\")\npublic class AccountController {\n\n\t@Autowired\n\tprivate UserBasisService userBasisService;\n\t@Autowired\n\tprivate MessageSender messageSender;\n\n\t/**\n\t * login\n\t * \n\t */\n\t@Authority(AuthorityType.Validate)\n\t@ResponseBody\n\t@RequestMapping(value = \"login\", produces = \"application/json;charset=UTF-8\", method = { RequestMethod.POST })\n\tpublic String login(@RequestParam(\"phone\") String phone, @RequestParam(\"password\") String password) {\n\t\tint code = -1;\n\t\tString msg = \"\";\n\n\t\tif (StrUtil.isNullOrEmpty(phone)) {\n\t\t\tmsg = \"请填写用户帐号！\";\n\t\t} else if (StrUtil.isNullOrEmpty(password)) {\n\t\t\tmsg = \"请填写密码！\";\n\t\t} else {\n\t\t\tUserBasis entity = userBasisService.getEntity(phone);\n\t\t\tif (entity != null && entity.getId() > 0) {\n\t\t\t\tif (entity.getPassword().equals(MD5Util.GetMD5Code32(password))) {\n\t\t\t\t\tcode = 1;\n\t\t\t\t\tmsg = \"登录成功！\";\n\n\t\t\t\t\tmessageSender.userLogin(entity.getId(), entity.getName());\n\t\t\t\t\t// TODO:\n\n\t\t\t\t} else {\n\t\t\t\t\tmsg = \"用户密码错误！\";\n\t\t\t\t\t\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tmsg = \"用户不存在！\";\n\t\t\t}\n\t\t}\n\n\t\tMap<String, Object> responseMap = new HashMap<String, Object>();\n\t\tresponseMap.put(\"code\", code);\n\t\tresponseMap.put(\"msg\", msg);\n\t\tresponseMap.put(\"params\", \"\");\n\t\tresponseMap.put(\"rows\", \"\");\n\t\treturn new Gson().toJson(responseMap);\n\t}\n}\n"
  },
  {
    "path": "src/cn/mayongfa/dao/UserBasisDao.java",
    "content": "package cn.mayongfa.dao;\r\n\r\nimport java.sql.ResultSet;\r\nimport java.sql.SQLException;\r\nimport java.util.ArrayList;\r\nimport java.util.List;\r\nimport java.util.Map;\r\n\r\nimport org.springframework.beans.factory.annotation.Autowired;\r\nimport org.springframework.jdbc.core.JdbcTemplate;\r\nimport org.springframework.jdbc.core.RowCallbackHandler;\r\nimport org.springframework.stereotype.Repository;\r\n\r\nimport cn.mayongfa.common.DateUtil;\r\nimport cn.mayongfa.common.IdWorkerManage;\r\nimport cn.mayongfa.common.StrUtil;\r\nimport cn.mayongfa.model.UserBasis;\r\n\r\n@Repository\r\npublic class UserBasisDao {\r\n\r\n\t@Autowired\r\n\tprivate JdbcTemplate jdbcTemplate;\r\n\r\n\t/**\r\n\t * 保存\r\n\t * \r\n\t * @param entity\r\n\t *            ID=0 新增\r\n\t * @return\r\n\t */\r\n\tpublic long Save(UserBasis entity) {\r\n\t\tlong ID = 0;\r\n\t\ttry {\r\n\t\t\tif (entity.getId() == StrUtil.DEFAULT_NULL) {\r\n\t\t\t\t// 新增\r\n\t\t\t\tentity.setId(IdWorkerManage.getId());\r\n\t\t\t\tString strSql = \"insert into userbasis (id,name,password,phone,status,createtime,updatetime) values (?,?,?,?,?,?,?)\";\r\n\r\n\t\t\t\tObject obj[] = { entity.getId(), entity.getName(), entity.getPassword(), entity.getPhone(),\r\n\t\t\t\t\t\tentity.getStatus(), entity.getCreatetime(), entity.getUpdatetime() };\r\n\t\t\t\tint ret = jdbcTemplate.update(strSql, obj);\r\n\t\t\t\tif (ret > 0) {\r\n\t\t\t\t\tID = entity.getId();\r\n\t\t\t\t}\r\n\t\t\t} else {\r\n\t\t\t\t// 修改\r\n\t\t\t\tString strSql = \"update userbasis set id=?,name=?,password=?,phone=?,status=?,updatetime=? where id=?\";\r\n\t\t\t\tObject obj[] = { entity.getId(), entity.getName(), entity.getPassword(), entity.getPhone(),\r\n\t\t\t\t\t\tentity.getStatus(), entity.getUpdatetime(), entity.getId() };\r\n\t\t\t\tint ret = jdbcTemplate.update(strSql, obj);\r\n\t\t\t\tif (ret > 0) {\r\n\t\t\t\t\tID = entity.getId();\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t} catch (Exception e) {\r\n\t\t\tthrow new RuntimeException(e);\r\n\t\t}\r\n\t\treturn ID;\r\n\t}\r\n\r\n\t/**\r\n\t * 删除\r\n\t * \r\n\t * @param ID\r\n\t * @return\r\n\t */\r\n\tpublic Boolean Delete(long ID) {\r\n\t\tString strSql = \"delete from userbasis where id=?\";\r\n\t\tObject obj[] = { DateUtil.dateToLong(), ID };\r\n\t\tint ret = jdbcTemplate.update(strSql, obj);\r\n\t\treturn ret > 0;\r\n\t}\r\n\r\n\t/**\r\n\t * 获取\r\n\t * \r\n\t * @param ID\r\n\t * @return\r\n\t */\r\n\tpublic UserBasis getEntity(long ID) {\r\n\t\tfinal UserBasis entity = new UserBasis();\r\n\t\tString strSql = \"select id,name,password,phone,status,createtime,updatetime from userbasis where id=?\";\r\n\t\tjdbcTemplate.query(strSql, new Object[] { ID }, new RowCallbackHandler() {\r\n\t\t\tpublic void processRow(ResultSet rs) throws SQLException {\r\n\t\t\t\tentity.setId(rs.getLong(\"id\"));\r\n\t\t\t\tentity.setName(rs.getString(\"name\"));\r\n\t\t\t\tentity.setPassword(rs.getString(\"password\"));\r\n\t\t\t\tentity.setPhone(rs.getString(\"phone\"));\r\n\t\t\t\tentity.setStatus(rs.getInt(\"status\"));\r\n\t\t\t\tentity.setCreatetime(rs.getDate(\"createtime\"));\r\n\t\t\t\tentity.setUpdatetime(rs.getDate(\"updatetime\"));\r\n\t\t\t}\r\n\t\t});\r\n\t\treturn entity;\r\n\t}\r\n\r\n\t/**\r\n\t * 获取\r\n\t * \r\n\t * @param ID\r\n\t * @return\r\n\t */\r\n\tpublic UserBasis getEntity(String phone) {\r\n\t\tfinal UserBasis entity = new UserBasis();\r\n\t\tString strSql = \"select id,name,password,phone,status,createtime,updatetime from userbasis where phone=?\";\r\n\t\tjdbcTemplate.query(strSql, new Object[] { phone }, new RowCallbackHandler() {\r\n\t\t\tpublic void processRow(ResultSet rs) throws SQLException {\r\n\t\t\t\tentity.setId(rs.getLong(\"id\"));\r\n\t\t\t\tentity.setName(rs.getString(\"name\"));\r\n\t\t\t\tentity.setPassword(rs.getString(\"password\"));\r\n\t\t\t\tentity.setPhone(rs.getString(\"phone\"));\r\n\t\t\t\tentity.setStatus(rs.getInt(\"status\"));\r\n\t\t\t\tentity.setCreatetime(rs.getDate(\"createtime\"));\r\n\t\t\t\tentity.setUpdatetime(rs.getDate(\"updatetime\"));\r\n\t\t\t}\r\n\t\t});\r\n\t\treturn entity;\r\n\t}\r\n\r\n\t/**\r\n\t * 根据条件获取\r\n\t * \r\n\t * @return\r\n\t */\r\n\tpublic List<UserBasis> getList(Map<String, Object> whereMap, String OrderBy, int nStart, int nLimit) {\r\n\t\tfinal ArrayList<UserBasis> list = new ArrayList<UserBasis>();\r\n\t\tString basisSql = \"select id,name,password,phone,status,createtime,updatetime from userbasis \";\r\n\t\tString strSql = \"select id from userbasis where 1=1\";\r\n\t\tStringBuffer whereSql = new StringBuffer();\r\n\t\tList<Object> whereobj = new ArrayList<Object>();\r\n\t\tif (whereMap.containsKey(\"id\")) {\r\n\t\t\tlong id = (long) whereMap.get(\"id\");\r\n\t\t\twhereSql.append(\" and id=?\");\r\n\t\t\twhereobj.add(id);\r\n\t\t}\r\n\t\tif (whereMap.containsKey(\"name\")) {\r\n\t\t\tString name = (String) whereMap.get(\"name\");\r\n\t\t\twhereSql.append(\" and name=?\");\r\n\t\t\twhereobj.add(name);\r\n\t\t}\r\n\t\tif (whereMap.containsKey(\"password\")) {\r\n\t\t\tString password = (String) whereMap.get(\"password\");\r\n\t\t\twhereSql.append(\" and password=?\");\r\n\t\t\twhereobj.add(password);\r\n\t\t}\r\n\t\tif (whereMap.containsKey(\"phone\")) {\r\n\t\t\tString phone = (String) whereMap.get(\"phone\");\r\n\t\t\twhereSql.append(\" and phone=?\");\r\n\t\t\twhereobj.add(phone);\r\n\t\t}\r\n\t\tif (whereMap.containsKey(\"status\")) {\r\n\t\t\tint status = (int) whereMap.get(\"status\");\r\n\t\t\twhereSql.append(\" and status=?\");\r\n\t\t\twhereobj.add(status);\r\n\t\t}\r\n\t\tif (OrderBy == \"\")\r\n\t\t\tOrderBy = \"createtime asc\";\r\n\t\twhereSql.append(\" order by \" + OrderBy + \" limit \" + nStart + \",\" + nLimit);\r\n\t\tstrSql = strSql + whereSql;\r\n\t\tObject obj[] = whereobj.toArray(new Object[whereobj.size()]);\r\n\t\tbasisSql += \" INNER JOIN (\" + strSql + \") userbasis_id USING (id)\";\r\n\t\tjdbcTemplate.query(basisSql, obj, new RowCallbackHandler() {\r\n\t\t\tpublic void processRow(ResultSet rs) throws SQLException {\r\n\t\t\t\tUserBasis entity = new UserBasis();\r\n\t\t\t\tentity.setId(rs.getLong(\"id\"));\r\n\t\t\t\tentity.setName(rs.getString(\"name\"));\r\n\t\t\t\tentity.setPassword(rs.getString(\"password\"));\r\n\t\t\t\tentity.setPhone(rs.getString(\"phone\"));\r\n\t\t\t\tentity.setStatus(rs.getInt(\"status\"));\r\n\t\t\t\tentity.setCreatetime(rs.getDate(\"createtime\"));\r\n\t\t\t\tentity.setUpdatetime(rs.getDate(\"updatetime\"));\r\n\t\t\t\tlist.add(entity);\r\n\t\t\t}\r\n\t\t});\r\n\t\treturn list;\r\n\t}\r\n\r\n\t/**\r\n\t * 根据条件获取数据条数\r\n\t * \r\n\t * @return\r\n\t */\r\n\tpublic int getListCount(Map<String, Object> whereMap) {\r\n\t\tString strSql = \"select count(id) from userbasis where 1=1\";\r\n\t\tStringBuffer whereSql = new StringBuffer();\r\n\t\tList<Object> whereobj = new ArrayList<Object>();\r\n\t\tif (whereMap.containsKey(\"id\")) {\r\n\t\t\tlong id = (long) whereMap.get(\"id\");\r\n\t\t\twhereSql.append(\" and id=?\");\r\n\t\t\twhereobj.add(id);\r\n\t\t}\r\n\t\tif (whereMap.containsKey(\"name\")) {\r\n\t\t\tString name = (String) whereMap.get(\"name\");\r\n\t\t\twhereSql.append(\" and name=?\");\r\n\t\t\twhereobj.add(name);\r\n\t\t}\r\n\t\tif (whereMap.containsKey(\"password\")) {\r\n\t\t\tString password = (String) whereMap.get(\"password\");\r\n\t\t\twhereSql.append(\" and password=?\");\r\n\t\t\twhereobj.add(password);\r\n\t\t}\r\n\t\tif (whereMap.containsKey(\"phone\")) {\r\n\t\t\tString phone = (String) whereMap.get(\"phone\");\r\n\t\t\twhereSql.append(\" and phone=?\");\r\n\t\t\twhereobj.add(phone);\r\n\t\t}\r\n\t\tif (whereMap.containsKey(\"status\")) {\r\n\t\t\tint status = (int) whereMap.get(\"status\");\r\n\t\t\twhereSql.append(\" and status=?\");\r\n\t\t\twhereobj.add(status);\r\n\t\t}\r\n\t\tstrSql = strSql + whereSql;\r\n\t\tObject obj[] = whereobj.toArray(new Object[whereobj.size()]);\r\n\t\treturn jdbcTemplate.queryForObject(strSql, obj, Integer.class);\r\n\t}\r\n\r\n\t/**\r\n\t * 获取所有\r\n\t * \r\n\t * @return\r\n\t */\r\n\tpublic List<UserBasis> getList() {\r\n\t\tfinal ArrayList<UserBasis> list = new ArrayList<UserBasis>();\r\n\t\tString strSql = \"select id,name,password,phone,status,createtime,updatetime from userbasis \";\r\n\t\tjdbcTemplate.query(strSql, new Object[] {}, new RowCallbackHandler() {\r\n\t\t\tpublic void processRow(ResultSet rs) throws SQLException {\r\n\t\t\t\tUserBasis entity = new UserBasis();\r\n\t\t\t\tentity.setId(rs.getLong(\"id\"));\r\n\t\t\t\tentity.setName(rs.getString(\"name\"));\r\n\t\t\t\tentity.setPassword(rs.getString(\"password\"));\r\n\t\t\t\tentity.setPhone(rs.getString(\"phone\"));\r\n\t\t\t\tentity.setStatus(rs.getInt(\"status\"));\r\n\t\t\t\tentity.setCreatetime(rs.getDate(\"createtime\"));\r\n\t\t\t\tentity.setUpdatetime(rs.getDate(\"updatetime\"));\r\n\t\t\t\tlist.add(entity);\r\n\t\t\t}\r\n\t\t});\r\n\t\treturn list;\r\n\t}\r\n\r\n}\r\n"
  },
  {
    "path": "src/cn/mayongfa/interceptor/Authority.java",
    "content": "package cn.mayongfa.interceptor;\n\nimport java.lang.annotation.Documented;\nimport java.lang.annotation.ElementType;\nimport java.lang.annotation.Retention;\nimport java.lang.annotation.RetentionPolicy;\nimport java.lang.annotation.Target;\n\n@Retention(RetentionPolicy.RUNTIME)\n@Target(value = { ElementType.METHOD, ElementType.TYPE })\n@Documented\npublic @interface Authority {\n\t// 默认验证\n\tAuthorityType value() default AuthorityType.Validate;\n\n}\n"
  },
  {
    "path": "src/cn/mayongfa/interceptor/AuthorityAnnotationInterceptor.java",
    "content": "package cn.mayongfa.interceptor;\n\nimport java.lang.reflect.Method;\nimport java.util.HashMap;\nimport java.util.Map;\n\nimport javax.servlet.http.HttpServletRequest;\nimport javax.servlet.http.HttpServletResponse;\n\nimport org.springframework.web.method.HandlerMethod;\nimport org.springframework.web.servlet.handler.HandlerInterceptorAdapter;\n\nimport com.google.gson.Gson;\n\n/**\n * 权限认证拦截器\n *\n */\npublic class AuthorityAnnotationInterceptor extends HandlerInterceptorAdapter {\n\n\t@Override\n\tpublic boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler)\n\t\t\tthrows Exception {\n\n\t\tif (handler instanceof HandlerMethod) {\n\t\t\tHandlerMethod hm = (HandlerMethod) handler;\n\n\t\t\tClass<?> clazz = hm.getBeanType();\n\t\t\tMethod m = hm.getMethod();\n\t\t\ttry {\n\t\t\t\tif (clazz != null && m != null) {\n\t\t\t\t\tboolean isClzAnnotation = clazz.isAnnotationPresent(Authority.class);\n\t\t\t\t\tboolean isMethondAnnotation = m.isAnnotationPresent(Authority.class);\n\t\t\t\t\tAuthority authority = null;\n\t\t\t\t\t// 如果方法和类声明中同时存在这个注解，那么方法中的会覆盖类中的设定。\n\t\t\t\t\tif (isMethondAnnotation) {\n\t\t\t\t\t\tauthority = m.getAnnotation(Authority.class);\n\t\t\t\t\t} else if (isClzAnnotation) {\n\t\t\t\t\t\tauthority = clazz.getAnnotation(Authority.class);\n\t\t\t\t\t}\n\t\t\t\t\tint code = -1;\n\t\t\t\t\tString msg = \"\";\n\t\t\t\t\tif (authority != null) {\n\t\t\t\t\t\tif (AuthorityType.NoValidate == authority.value()) {\n\t\t\t\t\t\t\t// 标记为不验证,放行\n\t\t\t\t\t\t\treturn true;\n\t\t\t\t\t\t} else if (AuthorityType.NoAuthority == authority.value()) {\n\t\t\t\t\t\t\t// 不验证权限，验证是否登录\n\t\t\t\t\t\t\t// TODO:\n\t\t\t\t\t\t\treturn true;\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t// 验证登录及权限\n\t\t\t\t\t\t\t// TODO:\n\n\t\t\t\t\t\t\tcode = 1;\n\t\t\t\t\t\t\tmsg = \"验证成功！\";\n\t\t\t\t\t\t\treturn true;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\t// //跳转\n\t\t\t\t\t// String url = \"\";\n\t\t\t\t\t// response.getWriter().write(\"<script>top.location.href='\"\n\t\t\t\t\t// + url + \"'</script>\");\n\t\t\t\t\t// return false;\n\n\t\t\t\t\t// 未通过验证，返回提示json\n\t\t\t\t\tMap<String, Object> responseMap = new HashMap<String, Object>();\n\t\t\t\t\tresponseMap.put(\"code\", code);\n\t\t\t\t\tresponseMap.put(\"msg\", msg);\n\t\t\t\t\tresponseMap.put(\"params\", \"\");\n\t\t\t\t\tresponseMap.put(\"rows\", \"\");\n\t\t\t\t\tString json = new Gson().toJson(responseMap);\n\t\t\t\t\tresponse.setCharacterEncoding(\"UTF-8\");\n\t\t\t\t\tresponse.setContentType(\"application/json; charset=utf-8\");\n\t\t\t\t\tresponse.getWriter().write(json);\n\t\t\t\t\treturn false;\n\t\t\t\t}\n\t\t\t} catch (Exception e) {\n\t\t\t}\n\t\t}\n\t\treturn false;\n\t}\n}\n"
  },
  {
    "path": "src/cn/mayongfa/interceptor/AuthorityType.java",
    "content": "package cn.mayongfa.interceptor;\r\n\r\npublic enum AuthorityType {\r\n\r\n\t// 登录和权限都验证 默认\r\n\tValidate,\r\n\r\n\t// 不验证\r\n\tNoValidate,\r\n\r\n\t// 不验证权限\r\n\tNoAuthority;\r\n}\r\n"
  },
  {
    "path": "src/cn/mayongfa/interceptor/DataSource.java",
    "content": "package cn.mayongfa.interceptor;\r\n\r\nimport java.lang.annotation.Documented;\r\nimport java.lang.annotation.ElementType;\r\nimport java.lang.annotation.Retention;\r\nimport java.lang.annotation.RetentionPolicy;\r\nimport java.lang.annotation.Target;\r\n\r\n@Retention(RetentionPolicy.RUNTIME)  \r\n@Target(ElementType.METHOD)\r\n@Documented\r\npublic @interface DataSource {  \r\n\t\r\n    DataSourceType value() default DataSourceType.Master;\r\n    \r\n}  \r\n\r\n"
  },
  {
    "path": "src/cn/mayongfa/interceptor/DataSourceChoose.java",
    "content": "package cn.mayongfa.interceptor;\n\nimport java.lang.reflect.Method;\n\nimport org.aspectj.lang.JoinPoint;\nimport org.aspectj.lang.reflect.MethodSignature;\n\nimport cn.mayongfa.common.JdbcContextHolder;\n\npublic class DataSourceChoose {\n\n\t//方法执行前\n\tpublic void before(JoinPoint point){\n\t\tObject target = point.getTarget();  \n        String method = point.getSignature().getName();  \n        Class<?>[] classz = target.getClass().getInterfaces();  \n        MethodSignature methodSignature = (MethodSignature)point.getSignature();\n        Class<?>[] parameterTypes = methodSignature.getMethod().getParameterTypes();\n        try {\n            Method m = classz[0].getMethod(method, parameterTypes);  \n            if (m!=null && m.isAnnotationPresent(DataSource.class)) {  \n                DataSource data = m.getAnnotation(DataSource.class);  \n                JdbcContextHolder.clearJdbcType();\n                JdbcContextHolder.setJdbcType(data.value().getName());\n            }  \n        } catch (Exception e) {  \n            // TODO: handle exception  \n        } \n\t}\n}\n"
  },
  {
    "path": "src/cn/mayongfa/interceptor/DataSourceType.java",
    "content": "package cn.mayongfa.interceptor;\n\npublic enum DataSourceType {\n\n\t// 主库\n\tMaster(\"master\"),\n\n\t// 从库\n\tSlave(\"slave\"),\n\n\t// 金币主库\n\tGoldMaster(\"master\"),\n\n\t// 金币从库\n\tGoldSlave(\"slave\");\n\n\tprivate DataSourceType(String name) {\n\t\tthis.name = name;\n\t}\n\n\tprivate String name;\n\n\tpublic String getName() {\n\t\treturn name;\n\t}\n\n\tpublic void setName(String name) {\n\t\tthis.name = name;\n\t}\n}\n"
  },
  {
    "path": "src/cn/mayongfa/interceptor/TestInterceptor.java",
    "content": "package cn.mayongfa.interceptor;\n\nimport javax.servlet.http.HttpServletRequest;\nimport javax.servlet.http.HttpServletResponse;\n\nimport org.springframework.web.servlet.ModelAndView;\nimport org.springframework.web.servlet.handler.HandlerInterceptorAdapter;\n\npublic class TestInterceptor extends HandlerInterceptorAdapter {\n\n\t@Override\n\tpublic void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex)\n\t\t\tthrows Exception {\n\t\t// 请求处理完成之后\n\t\tSystem.out.println(\"请求处理完成啦！\");\n\t\tsuper.afterCompletion(request, response, handler, ex);\n\t}\n\n\t@Override\n\tpublic void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler,\n\t\t\tModelAndView modelAndView) throws Exception {\n\t\t// 处理器执行完毕之后\n\t\tSystem.out.println(\"处理器执行完毕啦！\");\n\t\tsuper.postHandle(request, response, handler, modelAndView);\n\t}\n\n\t@Override\n\tpublic boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler)\n\t\t\tthrows Exception {\n\t\t// 处理器实际执行之前\n\t\tSystem.out.println(\"处理器执行之前！\");\n\t\treturn super.preHandle(request, response, handler);\n\t}\n\n}\n"
  },
  {
    "path": "src/cn/mayongfa/model/UserBasis.java",
    "content": "package cn.mayongfa.model;\r\n\r\nimport java.io.Serializable;\r\n\r\n@SuppressWarnings(\"serial\")\r\npublic class UserBasis implements Serializable{\r\n\r\n\r\n\tprivate long id;\r\n\r\n\tprivate String name;\r\n\r\n\tprivate String password;\r\n\r\n\tprivate String phone;\r\n\r\n\tprivate int status;\r\n\r\n\tprivate java.util.Date createtime;\r\n\r\n\tprivate java.util.Date updatetime;\r\n\r\n\tpublic void setId(long value) {\r\n\t\tthis.id = value;\r\n\t}\r\n\tpublic long getId() {\r\n\t\treturn this.id;\r\n\t}\r\n\t\r\n\tpublic void setName(String value) {\r\n\t\tthis.name = value;\r\n\t}\r\n\tpublic String getName() {\r\n\t\treturn this.name;\r\n\t}\r\n\t\r\n\tpublic void setPassword(String value) {\r\n\t\tthis.password = value;\r\n\t}\r\n\tpublic String getPassword() {\r\n\t\treturn this.password;\r\n\t}\r\n\t\r\n\tpublic void setPhone(String value) {\r\n\t\tthis.phone = value;\r\n\t}\r\n\tpublic String getPhone() {\r\n\t\treturn this.phone;\r\n\t}\r\n\t\r\n\tpublic void setStatus(int value) {\r\n\t\tthis.status = value;\r\n\t}\r\n\tpublic int getStatus() {\r\n\t\treturn this.status;\r\n\t}\r\n\t\r\n\tpublic void setCreatetime(java.util.Date value) {\r\n\t\tthis.createtime = value;\r\n\t}\r\n\tpublic java.util.Date getCreatetime() {\r\n\t\treturn this.createtime;\r\n\t}\r\n\t\r\n\tpublic void setUpdatetime(java.util.Date value) {\r\n\t\tthis.updatetime = value;\r\n\t}\r\n\tpublic java.util.Date getUpdatetime() {\r\n\t\treturn this.updatetime;\r\n\t}\r\n\t\r\n\t\r\n}\r\n\r\n"
  },
  {
    "path": "src/cn/mayongfa/quartz/GlodQuartz.java",
    "content": "package cn.mayongfa.quartz;\n\nimport org.springframework.scheduling.annotation.Scheduled;\nimport org.springframework.stereotype.Component;\n\n/**\n * 业务相关的作业调度\n * \n           字段               允许值                           允许的特殊字符\n\t秒\t \t0-59\t \t, - * /\n\t分\t \t0-59\t \t, - * /\n\t小时\t \t0-23\t \t, - * /\n\t日期\t \t1-31\t \t, - * ? / L W C\n\t月份\t \t1-12 或者 JAN-DEC\t \t, - * /\n\t星期\t \t1-7 或者 SUN-SAT\t \t, - * ? / L C #\n\t年（可选）\t \t留空, 1970-2099\t \t, - * /\n\t\n\t*  字符代表所有可能的值\n\t/  字符用来指定数值的增量\n\tL  字符仅被用于天（月）和天（星期）两个子表达式，表示一个月的最后一天或者一个星期的最后一天\n\t6L 可以表示倒数第６天\n\t\n *\n */\n@Component\npublic class GlodQuartz {\n\n\t/**\n\t * 用户自动加金币\n\t * 每天凌晨一点执行一次\n\t */\n\t@Scheduled(cron = \"0 0 1 * * ? \")\n\tpublic void addUserGold() {\n\t\tSystem.out.println(\"凌晨一点了，你睡了么？\");\n\t}\n\t/**\n\t * 每隔5秒定时清理缓存\n\t */\n\t@Scheduled(cron = \"*/5 * * * * ? \")\n\tpublic void cacheClear() {\n\t\t//System.out.println(\"时间又过去5秒了，真令人伤感...\");\n\t}\n}\n"
  },
  {
    "path": "src/cn/mayongfa/service/UserBasisService.java",
    "content": "package cn.mayongfa.service;\r\n\r\nimport java.util.List;\r\nimport java.util.Map;\r\n\r\nimport cn.mayongfa.interceptor.DataSource;\r\nimport cn.mayongfa.interceptor.DataSourceType;\r\nimport cn.mayongfa.model.UserBasis;\r\n\r\npublic interface UserBasisService {\r\n\r\n\t/**\r\n\t * 保存\r\n\t * @param entity\r\n\t * @return\r\n\t */\r\n\t@DataSource\r\n\tpublic long Save(UserBasis entity);\r\n\t\r\n\t/**\r\n\t * 删除\r\n\t * @param ID\r\n\t * @return\r\n\t */\r\n\t@DataSource\r\n\tpublic Boolean Delete(long ID);\r\n\t\r\n\t/**\r\n\t * 获取信息\r\n\t * @param ID\r\n\t * @return\r\n\t */\r\n\t@DataSource(DataSourceType.Slave)\r\n\tpublic UserBasis getEntity(long ID);\r\n\t\r\n\t/**\r\n\t * 获取信息\r\n\t * @param phone\r\n\t * @return\r\n\t */\r\n\t@DataSource(DataSourceType.Slave)\r\n\tpublic UserBasis getEntity(String phone);\r\n\t\r\n\t/**\r\n\t * 根据条件获取\r\n\t * @return\r\n\t */\r\n\t@DataSource(DataSourceType.Slave)\r\n\tpublic List<UserBasis> getList(Map<String, Object> whereMap, String OrderBy, int nStart, int nLimit);\r\n\t\r\n\t/**\r\n\t * 根据条件获取数据条数\r\n\t * @return\r\n\t */\r\n\t@DataSource(DataSourceType.Slave)\r\n\tpublic int getListCount(Map<String, Object> whereMap);\r\n\t\r\n\t/**\r\n\t * 获取所有\r\n\t * @return\r\n\t */\r\n\t@DataSource(DataSourceType.Slave)\r\n\tpublic List<UserBasis> getList();\r\n}"
  },
  {
    "path": "src/cn/mayongfa/service/imp/UserBasisServiceImp.java",
    "content": "package cn.mayongfa.service.imp;\n\nimport java.util.List;\nimport java.util.Map;\n\nimport org.springframework.beans.factory.annotation.Autowired;\nimport org.springframework.stereotype.Service;\n\nimport cn.mayongfa.cache.UserBasisCache;\nimport cn.mayongfa.dao.UserBasisDao;\nimport cn.mayongfa.model.UserBasis;\nimport cn.mayongfa.service.UserBasisService;\n\n@Service\npublic class UserBasisServiceImp implements UserBasisService {\n\n\t@Autowired\n\tprivate UserBasisDao UserBasisdao;\n\t@Autowired\n\tprivate UserBasisCache UserBasiscache;\n\n\t@Override\n\tpublic long Save(UserBasis entity) {\n\t\tlong id = UserBasisdao.Save(entity);\n\t\tif (id > 0) {\n\t\t\tUserBasiscache.set(entity);\n\t\t}\n\t\treturn id;\n\t}\n\n\t@Override\n\tpublic Boolean Delete(long ID) {\n\t\tboolean result = UserBasisdao.Delete(ID);\n\t\tif (result) {\n\t\t\tUserBasiscache.delete(ID);\n\t\t}\n\t\treturn result;\n\t}\n\n\t@Override\n\tpublic UserBasis getEntity(long ID) {\n\t\treturn UserBasiscache.get(ID);\n\t}\n\n\t@Override\n\tpublic UserBasis getEntity(String phone) {\n\t\treturn UserBasisdao.getEntity(phone);\n\t}\n\n\t@Override\n\tpublic int getListCount(Map<String, Object> whereMap) {\n\t\tthrow new RuntimeException();\n\t\t// return UserBasisdao.getListCount(whereMap);\n\t}\n\t\n\t@Override\n\tpublic List<UserBasis> getList(Map<String, Object> whereMap, String OrderBy, int nStart, int nLimit) {\n\t\treturn UserBasisdao.getList(whereMap, OrderBy, nStart, nLimit);\n\t}\n\n\t@Override\n\tpublic List<UserBasis> getList() {\n\t\treturn UserBasisdao.getList();\n\t}\n\n}"
  },
  {
    "path": "src/global.properties",
    "content": "\r\njxb.global.defaultavatar=\r\njxb.global.defaultphoto=\r\n"
  },
  {
    "path": "src/jdbc.properties",
    "content": "master.jdbc.driverClassName=com.mysql.jdbc.Driver\nmaster.jdbc.url=jdbc:mysql://127.0.0.1:3306/springdemo?useUnicode=true&characterEncoding=UTF-8\nmaster.jdbc.username=root\nmaster.jdbc.password=123456\n\nslave.jdbc.driverClassName=com.mysql.jdbc.Driver\nslave.jdbc.url=jdbc:mysql://172.16.100.222:3306/springdemo?useUnicode=true&characterEncoding=UTF-8\nslave.jdbc.username=read\nslave.jdbc.password=123456\n\n\ngoldMaster.jdbc.driverClassName=com.mysql.jdbc.Driver\ngoldMaster.jdbc.url=jdbc:mysql://127.0.0.1:3306/springdemo?useUnicode=true&characterEncoding=UTF-8\ngoldMaster.jdbc.username=root\ngoldMaster.jdbc.password=123456\n\ngoldSlave.jdbc.driverClassName=com.mysql.jdbc.Driver\ngoldSlave.jdbc.url=jdbc:mysql://172.16.100.222:3306/springdemo?useUnicode=true&characterEncoding=UTF-8\ngoldSlave.jdbc.username=read\ngoldSlave.jdbc.password=123456"
  },
  {
    "path": "src/log4j.properties",
    "content": "# Priorities are: DEBUG, INFO, WARN, ERROR, or FATAL.\r\nlog4j.rootCategory=INFO, CONSOLE,Druid\r\n#log4j.rootCategory=INFO, FILE\r\n#log4j.logger.cn.com.pkit=DEBUG\r\nlogs.dir=${catalina.base}/logs/xdjxb/\r\nlogs.filename=logs\r\nfileBufferSize=20480\r\n\r\n#log to File\r\nlog4j.appender.FILE=org.apache.log4j.DailyRollingFileAppender\r\nlog4j.appender.FILE.File=${logs.dir}/${logs.filename}\r\nlog4j.appender.FILE.encoding=UTF-8\r\nlog4j.appender.FILE.Append=true\r\nlog4j.appender.FILE.LocationInfo=true\r\nlog4j.appender.FILE.DatePattern='.'yyyy-MM-dd'.log'\r\nlog4j.appender.FILE.layout=org.apache.log4j.PatternLayout\r\nlog4j.appender.FILE.layout.ConversionPattern=[%-5p] %d(%r) --> %l: %m %x %n\r\nlog4j.appender.FILE.bufferSize=${fileBufferSize}\r\n\r\n# CONSOLE is set to be a ConsoleAppender using a PatternLayout.\r\nlog4j.appender.CONSOLE=org.apache.log4j.ConsoleAppender\r\nlog4j.appender.CONSOLE.Threshold=DEBUG\r\nlog4j.appender.CONSOLE.layout=org.apache.log4j.PatternLayout\r\nlog4j.appender.CONSOLE.layout.ConversionPattern=- %m%n\r\n\r\n#Druid log to File\r\nlog4j.logger.druid.sql=warn,Druid\r\nlog4j.logger.druid.sql.DataSource=warn,Druid\r\nlog4j.logger.druid.sql.Connection=warn,Druid\r\nlog4j.logger.druid.sql.Statement=warn,Druid\r\nlog4j.logger.druid.sql.ResultSet=warn,Druid\r\n\r\nlog4j.appender.Druid=org.apache.log4j.DailyRollingFileAppender\r\nlog4j.appender.Druid.File=${logs.dir}/slowsql\r\nlog4j.appender.Druid.encoding=UTF-8\r\nlog4j.appender.Druid.Append=true\r\nlog4j.appender.Druid.LocationInfo=true\r\nlog4j.appender.Druid.Threshold=warn\r\nlog4j.appender.Druid.DatePattern='.'yyyy-MM-dd'.log'\r\nlog4j.appender.Druid.layout=org.apache.log4j.PatternLayout\r\nlog4j.appender.Druid.layout.ConversionPattern=[%-5p] %d(%r) - %m %n\r\nlog4j.appender.Druid.bufferSize=${fileBufferSize}"
  },
  {
    "path": "src/memcached.properties",
    "content": "#\\u8FDE\\u63A5\\u6C60\\u5927\\u5C0F\\u5373\\u5BA2\\u6237\\u7AEF\\u4E2A\\u6570  \nmemcached.connectionPoolSize=10  \nmemcached.failureMode=true  \n\n#server1  \nserver1.memcached.host=127.0.0.1\nserver1.memcached.port=11211\nserver1.memcached.weight=4\n\n#server2  \nserver2.memcached.host=127.0.0.1\nserver2.memcached.port=11211\nserver2.memcached.weight=6"
  }
]