yonge 5 سال پیش
کامیت
27b8e1f0ee
100فایلهای تغییر یافته به همراه5519 افزوده شده و 0 حذف شده
  1. 10 0
      .gitignore
  2. 32 0
      codegen/pom.xml
  3. 60 0
      codegen/src/main/java/com/yonge/crud/CodegenApplication.java
  4. 111 0
      codegen/src/main/java/com/yonge/crud/core/Configuration.java
  5. 144 0
      codegen/src/main/java/com/yonge/crud/core/CrudSession.java
  6. 60 0
      codegen/src/main/java/com/yonge/crud/core/CrudSessionFactory.java
  7. 93 0
      codegen/src/main/java/com/yonge/crud/core/FreemarkerTemplateEngine.java
  8. 84 0
      codegen/src/main/java/com/yonge/crud/core/GenerateConfiguration.java
  9. 59 0
      codegen/src/main/java/com/yonge/crud/core/db/ConnectionFactory.java
  10. 117 0
      codegen/src/main/java/com/yonge/crud/core/db/DatabaseIntrospector.java
  11. 127 0
      codegen/src/main/java/com/yonge/crud/core/db/model/Column.java
  12. 86 0
      codegen/src/main/java/com/yonge/crud/core/db/model/Table.java
  13. 234 0
      codegen/src/main/java/com/yonge/crud/core/generator/ModuleGenerateIntrospector.java
  14. 41 0
      codegen/src/main/java/com/yonge/crud/core/generator/module/JavaFileGenerator.java
  15. 129 0
      codegen/src/main/java/com/yonge/crud/core/generator/module/SpringGenerator.java
  16. 82 0
      codegen/src/main/java/com/yonge/crud/core/generator/module/SqlMapConfigGenerator.java
  17. 160 0
      codegen/src/main/java/com/yonge/crud/core/util/JavaBeansUtil.java
  18. 169 0
      codegen/src/main/java/com/yonge/crud/core/util/XmlUtil.java
  19. 17 0
      codegen/src/main/resources/generateConfigration.xml
  20. 10 0
      codegen/src/main/resources/template/dao.ftl
  21. 44 0
      codegen/src/main/resources/template/pojo.ftl
  22. 9 0
      codegen/src/main/resources/template/service.ftl
  23. 22 0
      codegen/src/main/resources/template/service_impl.ftl
  24. 36 0
      codegen/src/main/resources/template/spring.ftl
  25. 64 0
      codegen/src/main/resources/template/sqlmap.ftl
  26. 11 0
      codegen/src/main/resources/template/sqlmapConfig.ftl
  27. 35 0
      mec-auth/mec-auth-api/pom.xml
  28. 15 0
      mec-auth/mec-auth-api/src/main/java/com/ym/mec/auth/api/client/SysUserFeignService.java
  29. 51 0
      mec-auth/mec-auth-api/src/main/java/com/ym/mec/auth/api/dto/SysUserInfo.java
  30. 92 0
      mec-auth/mec-auth-api/src/main/java/com/ym/mec/auth/api/entity/SysDept.java
  31. 37 0
      mec-auth/mec-auth-api/src/main/java/com/ym/mec/auth/api/entity/SysDeptRelation.java
  32. 158 0
      mec-auth/mec-auth-api/src/main/java/com/ym/mec/auth/api/entity/SysMenu.java
  33. 136 0
      mec-auth/mec-auth-api/src/main/java/com/ym/mec/auth/api/entity/SysOauthClientDetails.java
  34. 92 0
      mec-auth/mec-auth-api/src/main/java/com/ym/mec/auth/api/entity/SysRole.java
  35. 48 0
      mec-auth/mec-auth-api/src/main/java/com/ym/mec/auth/api/entity/SysRoleDept.java
  36. 37 0
      mec-auth/mec-auth-api/src/main/java/com/ym/mec/auth/api/entity/SysRoleMenu.java
  37. 169 0
      mec-auth/mec-auth-api/src/main/java/com/ym/mec/auth/api/entity/SysUser.java
  38. 37 0
      mec-auth/mec-auth-api/src/main/java/com/ym/mec/auth/api/entity/SysUserRole.java
  39. 36 0
      mec-auth/mec-auth-api/src/main/java/com/ym/mec/auth/api/enums/SysUserType.java
  40. 57 0
      mec-auth/mec-auth-server/pom.xml
  41. 34 0
      mec-auth/mec-auth-server/src/main/java/com/ym/mec/auth/AuthServerApplication.java
  42. 80 0
      mec-auth/mec-auth-server/src/main/java/com/ym/mec/auth/config/AuthorizationServerConfig.java
  43. 40 0
      mec-auth/mec-auth-server/src/main/java/com/ym/mec/auth/config/ResourceServerConfig.java
  44. 91 0
      mec-auth/mec-auth-server/src/main/java/com/ym/mec/auth/config/WebSecurityConfig.java
  45. 44 0
      mec-auth/mec-auth-server/src/main/java/com/ym/mec/auth/config/provider/service/BaseUserDetailsService.java
  46. 49 0
      mec-auth/mec-auth-server/src/main/java/com/ym/mec/auth/config/token/PhoneAuthenticationToken.java
  47. 96 0
      mec-auth/mec-auth-server/src/main/java/com/ym/mec/auth/controller/TokenController.java
  48. 82 0
      mec-auth/mec-auth-server/src/main/java/com/ym/mec/auth/controller/UserController.java
  49. 36 0
      mec-auth/mec-auth-server/src/main/java/com/ym/mec/auth/controller/queryInfo/SysUserQueryInfo.java
  50. 9 0
      mec-auth/mec-auth-server/src/main/java/com/ym/mec/auth/dal/dao/SysDeptDao.java
  51. 9 0
      mec-auth/mec-auth-server/src/main/java/com/ym/mec/auth/dal/dao/SysDeptRelationDao.java
  52. 9 0
      mec-auth/mec-auth-server/src/main/java/com/ym/mec/auth/dal/dao/SysMenuDao.java
  53. 9 0
      mec-auth/mec-auth-server/src/main/java/com/ym/mec/auth/dal/dao/SysOauthClientDetailsDao.java
  54. 9 0
      mec-auth/mec-auth-server/src/main/java/com/ym/mec/auth/dal/dao/SysRoleDao.java
  55. 9 0
      mec-auth/mec-auth-server/src/main/java/com/ym/mec/auth/dal/dao/SysRoleDeptDao.java
  56. 16 0
      mec-auth/mec-auth-server/src/main/java/com/ym/mec/auth/dal/dao/SysRoleMenuDao.java
  57. 21 0
      mec-auth/mec-auth-server/src/main/java/com/ym/mec/auth/dal/dao/SysUserDao.java
  58. 16 0
      mec-auth/mec-auth-server/src/main/java/com/ym/mec/auth/dal/dao/SysUserRoleDao.java
  59. 25 0
      mec-auth/mec-auth-server/src/main/java/com/ym/mec/auth/dal/dao/UserLoginDao.java
  60. 24 0
      mec-auth/mec-auth-server/src/main/java/com/ym/mec/auth/dal/dao/UserLoginLogDao.java
  61. 41 0
      mec-auth/mec-auth-server/src/main/java/com/ym/mec/auth/dal/enums/UserGenderEnum.java
  62. 50 0
      mec-auth/mec-auth-server/src/main/java/com/ym/mec/auth/dal/enums/UserStatus.java
  63. 106 0
      mec-auth/mec-auth-server/src/main/java/com/ym/mec/auth/dal/model/UserLogin.java
  64. 65 0
      mec-auth/mec-auth-server/src/main/java/com/ym/mec/auth/dal/model/UserLoginLog.java
  65. 150 0
      mec-auth/mec-auth-server/src/main/java/com/ym/mec/auth/filter/BaseAuthenticationFilter.java
  66. 27 0
      mec-auth/mec-auth-server/src/main/java/com/ym/mec/auth/handler/BaseAuthenticationFailureEvenHandler.java
  67. 108 0
      mec-auth/mec-auth-server/src/main/java/com/ym/mec/auth/handler/BaseAuthenticationSuccessEventHandler.java
  68. 8 0
      mec-auth/mec-auth-server/src/main/java/com/ym/mec/auth/service/SysDeptRelationService.java
  69. 8 0
      mec-auth/mec-auth-server/src/main/java/com/ym/mec/auth/service/SysDeptService.java
  70. 8 0
      mec-auth/mec-auth-server/src/main/java/com/ym/mec/auth/service/SysMenuService.java
  71. 8 0
      mec-auth/mec-auth-server/src/main/java/com/ym/mec/auth/service/SysOauthClientDetailsService.java
  72. 8 0
      mec-auth/mec-auth-server/src/main/java/com/ym/mec/auth/service/SysRoleDeptService.java
  73. 23 0
      mec-auth/mec-auth-server/src/main/java/com/ym/mec/auth/service/SysRoleMenuService.java
  74. 8 0
      mec-auth/mec-auth-server/src/main/java/com/ym/mec/auth/service/SysRoleService.java
  75. 16 0
      mec-auth/mec-auth-server/src/main/java/com/ym/mec/auth/service/SysUserRoleService.java
  76. 44 0
      mec-auth/mec-auth-server/src/main/java/com/ym/mec/auth/service/SysUserService.java
  77. 23 0
      mec-auth/mec-auth-server/src/main/java/com/ym/mec/auth/service/impl/SysDeptRelationServiceImpl.java
  78. 23 0
      mec-auth/mec-auth-server/src/main/java/com/ym/mec/auth/service/impl/SysDeptServiceImpl.java
  79. 23 0
      mec-auth/mec-auth-server/src/main/java/com/ym/mec/auth/service/impl/SysMenuServiceImpl.java
  80. 23 0
      mec-auth/mec-auth-server/src/main/java/com/ym/mec/auth/service/impl/SysOauthClientDetailsServiceImpl.java
  81. 23 0
      mec-auth/mec-auth-server/src/main/java/com/ym/mec/auth/service/impl/SysRoleDeptServiceImpl.java
  82. 42 0
      mec-auth/mec-auth-server/src/main/java/com/ym/mec/auth/service/impl/SysRoleMenuServiceImpl.java
  83. 23 0
      mec-auth/mec-auth-server/src/main/java/com/ym/mec/auth/service/impl/SysRoleServiceImpl.java
  84. 30 0
      mec-auth/mec-auth-server/src/main/java/com/ym/mec/auth/service/impl/SysUserRoleServiceImpl.java
  85. 98 0
      mec-auth/mec-auth-server/src/main/java/com/ym/mec/auth/service/impl/SysUserServiceImpl.java
  86. 56 0
      mec-auth/mec-auth-server/src/main/resources/application.yml
  87. 21 0
      mec-auth/mec-auth-server/src/main/resources/config/mybatis/Global.mapper.xml
  88. 58 0
      mec-auth/mec-auth-server/src/main/resources/config/mybatis/SysDeptMapper.xml
  89. 53 0
      mec-auth/mec-auth-server/src/main/resources/config/mybatis/SysDeptRelationMapper.xml
  90. 64 0
      mec-auth/mec-auth-server/src/main/resources/config/mybatis/SysMenuMapper.xml
  91. 62 0
      mec-auth/mec-auth-server/src/main/resources/config/mybatis/SysOauthClientDetailsMapper.xml
  92. 54 0
      mec-auth/mec-auth-server/src/main/resources/config/mybatis/SysRoleDeptMapper.xml
  93. 58 0
      mec-auth/mec-auth-server/src/main/resources/config/mybatis/SysRoleMapper.xml
  94. 57 0
      mec-auth/mec-auth-server/src/main/resources/config/mybatis/SysRoleMenuMapper.xml
  95. 90 0
      mec-auth/mec-auth-server/src/main/resources/config/mybatis/SysUserMapper.xml
  96. 57 0
      mec-auth/mec-auth-server/src/main/resources/config/mybatis/SysUserRoleMapper.xml
  97. 34 0
      mec-auth/pom.xml
  98. 50 0
      mec-common/pom.xml
  99. 73 0
      mec-common/src/main/java/com/ym/mec/common/cache/Cache.java
  100. 27 0
      mec-common/src/main/java/com/ym/mec/common/cache/CacheException.java

+ 10 - 0
.gitignore

@@ -0,0 +1,10 @@
+*.class
+.metadata
+target
+*.classpath
+.settings
+.project
+/p2p-biz/test-output
+bin
+/manage-center/src/main/resources/config/properties/generatorConfig.xml
+/p2p-utils/.gitignore

+ 32 - 0
codegen/pom.xml

@@ -0,0 +1,32 @@
+<?xml version="1.0"?>
+<project
+	xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"
+	xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
+	<modelVersion>4.0.0</modelVersion>
+	<parent>
+		<groupId>com.ym</groupId>
+		<artifactId>mec</artifactId>
+		<version>1.0</version>
+	</parent>
+
+	<groupId>com.yonge</groupId>
+	<artifactId>codegen</artifactId>
+	<name>codegen</name>
+	<url>http://maven.apache.org</url>
+
+	<properties>
+		<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
+	</properties>
+
+	<dependencies>
+		<dependency>
+			<groupId>org.freemarker</groupId>
+			<artifactId>freemarker</artifactId>
+		</dependency>
+		
+		<dependency>
+            <groupId>mysql</groupId>
+            <artifactId>mysql-connector-java</artifactId>
+        </dependency>
+	</dependencies>
+</project>

+ 60 - 0
codegen/src/main/java/com/yonge/crud/CodegenApplication.java

@@ -0,0 +1,60 @@
+package com.yonge.crud;
+
+import java.util.List;
+
+import javax.xml.bind.JAXBContext;
+import javax.xml.bind.JAXBElement;
+import javax.xml.bind.JAXBException;
+import javax.xml.bind.Unmarshaller;
+import javax.xml.transform.stream.StreamSource;
+
+import org.springframework.boot.autoconfigure.SpringBootApplication;
+
+import com.yonge.crud.core.Configuration;
+import com.yonge.crud.core.CrudSession;
+import com.yonge.crud.core.CrudSessionFactory;
+import com.yonge.crud.core.GenerateConfiguration;
+import com.yonge.crud.core.db.model.Table;
+
+@SpringBootApplication
+public class CodegenApplication {
+
+	public static void main(String[] args) throws JAXBException {
+		//SpringApplication.run(CodegenApplication.class, args);
+
+		/*
+		 * Configuration config = new Configuration("oracle.jdbc.driver.OracleDriver", "jdbc:oracle:thin:@192.168.10.134:1521:orcl", "margin_gy",
+		 * "margin_gy", null, "margin_gy");
+		 */
+
+		// "src/generateConfigration.xml"
+		GenerateConfiguration genConfig = toObject("src/main/resources/generateConfigration.xml", GenerateConfiguration.class);
+
+		Configuration config = genConfig.getDbConfiguration();
+
+		CrudSessionFactory sessionFactory = config.buildCrudSessionFactory();
+		CrudSession session = sessionFactory.openSession();
+		List<Table> tables = session.getTables();
+		String srcBase = genConfig.getSrcBase();
+		String pojoPackageName = genConfig.getPojoPackageName();
+		String daoPackageName = genConfig.getDaoPackageName();
+		String servicePackageName = genConfig.getServicePackageName();
+		String sqlmapPackageName = genConfig.getSqlmapPackageName();
+		String sqlmapConfigPackageName = genConfig.getSqlmapConfigPackageName();
+		for (Table table : tables) {
+			session.reverse(table, srcBase, pojoPackageName, sqlmapPackageName, daoPackageName, servicePackageName);
+
+		}
+		// 生成sqlmapConfig
+		session.generateSqlmapConfig(tables, srcBase, sqlmapConfigPackageName, sqlmapPackageName);
+		session.closeSession();
+	}
+
+	public static <T> T toObject(String systemId, Class<T> clazz) throws JAXBException {
+		JAXBContext jc = JAXBContext.newInstance(clazz);
+		Unmarshaller unmarshaller = jc.createUnmarshaller();
+		StreamSource xml = new StreamSource(systemId);
+		JAXBElement<T> je = unmarshaller.unmarshal(xml, clazz);
+		return je.getValue();
+	}
+}

+ 111 - 0
codegen/src/main/java/com/yonge/crud/core/Configuration.java

@@ -0,0 +1,111 @@
+package com.yonge.crud.core;
+
+import org.apache.commons.lang3.StringUtils;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+public class Configuration {
+
+	private static final Logger LOGGER = LoggerFactory
+			.getLogger(Configuration.class);
+
+	private String driverClass;
+
+	private String url;
+
+	private String username;
+
+	private String password;
+
+	private String catalog;
+
+	private String schema;
+
+	public Configuration() {
+		// TODO Auto-generated constructor stub
+	}
+
+	public Configuration(String driverClass, String url, String username,
+			String password, String catalog, String schema) {
+		if (StringUtils.isBlank(driverClass)) {
+			LOGGER.warn("driverClass不能为空");
+			return;
+		}
+		if (StringUtils.isBlank(url)) {
+			LOGGER.warn("url不能为空");
+			return;
+		}
+		if (StringUtils.isBlank(username)) {
+			LOGGER.warn("username不能为空");
+			return;
+		}
+		if (StringUtils.isBlank(password)) {
+			LOGGER.warn("password不能为空");
+			return;
+		}
+		if (StringUtils.isBlank(schema)) {
+			LOGGER.warn("schema不能为空");
+			return;
+		}
+		this.driverClass = driverClass;
+		this.url = url;
+		this.username = username;
+		this.password = password;
+		if (catalog != null) {
+			this.catalog = catalog.toUpperCase();
+		}
+		this.schema = schema.toUpperCase();
+	}
+
+	public String getDriverClass() {
+		return driverClass;
+	}
+
+	public void setDriverClass(String driverClass) {
+		this.driverClass = driverClass;
+	}
+
+	public String getUrl() {
+		return url;
+	}
+
+	public void setUrl(String url) {
+		this.url = url;
+	}
+
+	public String getUsername() {
+		return username;
+	}
+
+	public void setUsername(String username) {
+		this.username = username;
+	}
+
+	public String getPassword() {
+		return password;
+	}
+
+	public void setPassword(String password) {
+		this.password = password;
+	}
+
+	public String getCatalog() {
+		return catalog;
+	}
+
+	public void setCatalog(String catalog) {
+		this.catalog = catalog;
+	}
+
+	public String getSchema() {
+		return schema;
+	}
+
+	public void setSchema(String schema) {
+		this.schema = schema;
+	}
+
+	public CrudSessionFactory buildCrudSessionFactory() {
+		return new CrudSessionFactory(this);
+	}
+}

+ 144 - 0
codegen/src/main/java/com/yonge/crud/core/CrudSession.java

@@ -0,0 +1,144 @@
+package com.yonge.crud.core;
+
+import java.sql.Connection;
+import java.sql.DatabaseMetaData;
+import java.sql.SQLException;
+import java.util.List;
+
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import com.yonge.crud.core.db.DatabaseIntrospector;
+import com.yonge.crud.core.db.model.Table;
+import com.yonge.crud.core.generator.ModuleGenerateIntrospector;
+
+public class CrudSession {
+
+	private static final Logger LOGGER = LoggerFactory
+			.getLogger(CrudSession.class);
+
+	private Connection connection;
+
+	private DatabaseMetaData dbMetaData;
+
+	private String catalog;
+
+	private String schema;
+
+	private CrudSessionFactory sessionFactory;
+
+	CrudSession(Connection connection, String catalog, String schema,
+			CrudSessionFactory sessionFactory) {
+		if (connection == null) {
+			LOGGER.warn("没有获取连接,不能打开session");
+			return;
+		}
+		this.connection = connection;
+		this.catalog = catalog;
+		this.schema = schema;
+		this.sessionFactory = sessionFactory;
+		try {
+			this.dbMetaData = connection.getMetaData();
+		} catch (SQLException e) {
+			LOGGER.warn("获取数据库连接的元数据失败", e);
+		}
+	}
+
+	/**
+	 * 关闭会话
+	 */
+	public void closeSession() {
+		if (connection != null) {
+			try {
+				connection.close();
+			} catch (SQLException e) {
+				LOGGER.warn("数据库连接关闭失败", e);
+			}
+		}
+	}
+
+	/**
+	 * 获取工厂信息
+	 * 
+	 * @return
+	 */
+	public CrudSessionFactory getFactory() {
+		return sessionFactory;
+	}
+
+	/**
+	 * 获取所有表信息
+	 * 
+	 * @return
+	 */
+	public List<Table> getTables() {
+		DatabaseIntrospector dbIntrospector = new DatabaseIntrospector(
+				dbMetaData);
+		return dbIntrospector.getTables(catalog, schema);
+	}
+
+	/**
+	 * 数据库表的反向工程
+	 * 
+	 * @param table
+	 *            表对象
+	 * @param srcBase
+	 *            生成目录的根路径
+	 * @param pojoPackageName
+	 *            存放pojo的包名称
+	 * @param sqlmapPackageName
+	 *            存放sqlmap的包名称
+	 * @param daoPackageName
+	 *            存放dao的包名称
+	 */
+	public void reverse(Table table, String srcBase, String pojoPackageName,
+			String sqlmapPackageName, String daoPackageName,
+			String servicePackageName) {
+		ModuleGenerateIntrospector
+				.generatePOJO(table, srcBase, pojoPackageName);
+		ModuleGenerateIntrospector.generatSqlmap(this.getFactory()
+				.getMetadata().getDriverClass(), table, srcBase,
+				sqlmapPackageName, daoPackageName);
+		ModuleGenerateIntrospector.generateDaoAndService(table, srcBase,
+				daoPackageName, servicePackageName);
+	}
+
+	/**
+	 * 生成spring的配置文件
+	 * 
+	 * @param tables
+	 *            需要生成spring配置文件对应的表
+	 * @param srcBase
+	 *            根目录
+	 * @param packageName
+	 *            配置文件的包路径
+	 * @param daoPackageName
+	 *            dao的包路径
+	 * @param servicePackageName
+	 *            service的包路径
+	 */
+	public void generateSpringConfig(List<Table> tables, String srcBase,
+			String packageName, String daoPackageName, String servicePackageName) {
+		ModuleGenerateIntrospector.generateSpring(tables, srcBase, packageName,
+				daoPackageName, servicePackageName);
+	}
+
+	/**
+	 * 生成sqlmapConfig文件
+	 * 
+	 * @param tables
+	 *            相关表信息
+	 * @param srcBase
+	 *            生成目标的根目录
+	 * @param packageName
+	 *            sqlmapConfig文件的包路径
+	 * @param sqlmapPackageName
+	 *            sqlmap文件的包路径
+	 */
+	public void generateSqlmapConfig(List<Table> tables, String srcBase,
+			String packageName, String sqlmapPackageName) {
+		ModuleGenerateIntrospector.generateSqlMapConfig(tables, srcBase,
+				sqlmapPackageName, packageName);
+	}
+
+}

+ 60 - 0
codegen/src/main/java/com/yonge/crud/core/CrudSessionFactory.java

@@ -0,0 +1,60 @@
+package com.yonge.crud.core;
+
+import java.sql.Connection;
+import java.sql.SQLException;
+
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import com.yonge.crud.core.db.ConnectionFactory;
+
+public class CrudSessionFactory {
+
+	private static final Logger LOGGER = LoggerFactory
+			.getLogger(CrudSessionFactory.class);
+
+	private CrudSession session;
+
+	private Connection connection;
+
+	private String catalog;
+
+	private String schema;
+
+	private Configuration config;
+
+	CrudSessionFactory(Configuration config) {
+		LOGGER.debug("数据库的连接信息:url={} user={} password={}", config.getUrl(),
+				config.getUsername(), config.getPassword());
+		try {
+			this.config = config;
+			this.catalog = config.getCatalog();
+			this.schema = config.getSchema();
+			connection = ConnectionFactory.getInstance().getConnection(
+					config.getDriverClass(), config.getUrl(),
+					config.getUsername(), config.getPassword());
+			session = new CrudSession(connection, catalog, schema, this);
+		} catch (SQLException e) {
+			LOGGER.warn("数据库连接创建失败", e);
+		}
+	}
+
+	/**
+	 * 开启一个会话
+	 */
+	public synchronized CrudSession openSession() {
+		if (session == null) {
+			session = new CrudSession(connection, catalog, schema, this);
+		}
+		return session;
+	}
+
+	/**
+	 * 获取元数据
+	 * 
+	 * @return
+	 */
+	public Configuration getMetadata() {
+		return config;
+	}
+}

+ 93 - 0
codegen/src/main/java/com/yonge/crud/core/FreemarkerTemplateEngine.java

@@ -0,0 +1,93 @@
+package com.yonge.crud.core;
+
+import java.io.BufferedWriter;
+import java.io.File;
+import java.io.FileWriter;
+import java.io.IOException;
+import java.util.Map;
+
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import freemarker.template.Configuration;
+import freemarker.template.DefaultObjectWrapper;
+import freemarker.template.Template;
+
+public class FreemarkerTemplateEngine {
+	private static final Logger LOGGER = LoggerFactory
+			.getLogger(FreemarkerTemplateEngine.class);
+
+	private static Configuration cfg;
+
+	static {
+		cfg = new Configuration();
+		cfg.setOutputEncoding("UTF-8");
+		cfg.setClassForTemplateLoading(FreemarkerTemplateEngine.class,
+				"/template/");
+		cfg.setObjectWrapper(new DefaultObjectWrapper());
+	}
+
+	public void render(Map<String, Object> data, String templateFile,
+			File outputFile) {
+		FileWriter fw = null;
+		BufferedWriter bw = null;
+		try {
+			Template temp = cfg.getTemplate(templateFile);
+			fw = new FileWriter(outputFile);
+			bw = new BufferedWriter(fw);
+			temp.process(data, bw);
+			bw.flush();
+		} catch (Exception e) {
+			LOGGER.warn(String.format("将数据%1$s通过FreeMarker模板%2$s生成文件%3$s失败",
+					data, templateFile, outputFile), e);
+		} finally {
+			if (bw != null) {
+				try {
+					bw.close();
+				} catch (IOException e) {
+					LOGGER.warn("BufferedWriter关闭异常");
+				}
+			}
+			if (fw != null) {
+				try {
+					fw.close();
+				} catch (IOException e) {
+					LOGGER.warn("FileWriter关闭异常");
+				}
+			}
+		}
+	}
+
+	public void render(Map<String, Object> data, String templateFile,
+			String outputFile) {
+		FileWriter fw = null;
+		BufferedWriter bw = null;
+		try {
+			Template temp = cfg.getTemplate(templateFile);
+			File file = new File(outputFile);
+			fw = new FileWriter(file);
+			bw = new BufferedWriter(fw);
+			temp.process(data, bw);
+			bw.flush();
+		} catch (Exception e) {
+			LOGGER.warn(String.format("将数据%1$s通过FreeMarker模板%2$s生成文件%3$s失败",
+					data, templateFile, outputFile), e);
+		} finally {
+			if (bw != null) {
+				try {
+					bw.close();
+				} catch (IOException e) {
+					LOGGER.warn("BufferedWriter关闭异常");
+				}
+			}
+			if (fw != null) {
+				try {
+					fw.close();
+				} catch (IOException e) {
+					LOGGER.warn("FileWriter关闭异常");
+				}
+			}
+		}
+	}
+
+}

+ 84 - 0
codegen/src/main/java/com/yonge/crud/core/GenerateConfiguration.java

@@ -0,0 +1,84 @@
+package com.yonge.crud.core;
+
+public class GenerateConfiguration {
+
+	private Configuration dbConfiguration;
+
+	private String srcBase;
+
+	private String pojoPackageName;
+
+	private String daoPackageName;
+
+	private String servicePackageName;
+
+	private String sqlmapPackageName;
+
+	private String sqlmapConfigPackageName;
+
+	private String springConfigPackageName;
+
+	public Configuration getDbConfiguration() {
+		return dbConfiguration;
+	}
+
+	public void setDbConfiguration(Configuration dbConfiguration) {
+		this.dbConfiguration = dbConfiguration;
+	}
+
+	public String getSrcBase() {
+		return srcBase;
+	}
+
+	public void setSrcBase(String srcBase) {
+		this.srcBase = srcBase;
+	}
+
+	public String getPojoPackageName() {
+		return pojoPackageName;
+	}
+
+	public void setPojoPackageName(String pojoPackageName) {
+		this.pojoPackageName = pojoPackageName;
+	}
+
+	public String getDaoPackageName() {
+		return daoPackageName;
+	}
+
+	public void setDaoPackageName(String daoPackageName) {
+		this.daoPackageName = daoPackageName;
+	}
+
+	public String getServicePackageName() {
+		return servicePackageName;
+	}
+
+	public void setServicePackageName(String servicePackageName) {
+		this.servicePackageName = servicePackageName;
+	}
+
+	public String getSqlmapPackageName() {
+		return sqlmapPackageName;
+	}
+
+	public void setSqlmapPackageName(String sqlmapPackageName) {
+		this.sqlmapPackageName = sqlmapPackageName;
+	}
+
+	public String getSqlmapConfigPackageName() {
+		return sqlmapConfigPackageName;
+	}
+
+	public void setSqlmapConfigPackageName(String sqlmapConfigPackageName) {
+		this.sqlmapConfigPackageName = sqlmapConfigPackageName;
+	}
+
+	public String getSpringConfigPackageName() {
+		return springConfigPackageName;
+	}
+
+	public void setSpringConfigPackageName(String springConfigPackageName) {
+		this.springConfigPackageName = springConfigPackageName;
+	}
+}

+ 59 - 0
codegen/src/main/java/com/yonge/crud/core/db/ConnectionFactory.java

@@ -0,0 +1,59 @@
+package com.yonge.crud.core.db;
+
+import java.sql.Connection;
+import java.sql.Driver;
+import java.sql.SQLException;
+import java.util.Properties;
+
+import org.apache.commons.lang3.StringUtils;
+
+public class ConnectionFactory {
+
+	private static ConnectionFactory instance = new ConnectionFactory();
+
+	private static final String ORACLE_DRIVER = "oracle.jdbc.driver.OracleDriver";
+
+	public static ConnectionFactory getInstance() {
+		return instance;
+	}
+
+	private ConnectionFactory() {
+		super();
+	}
+
+	public Connection getConnection(String driverClass, String url,
+			String username, String password) throws SQLException {
+		Driver driver = getDriver(driverClass);
+
+		Properties props = new Properties();
+
+		props.setProperty("user", username);
+
+		props.setProperty("password", password);
+
+		// 只有oracle才需要这个参数
+		if (StringUtils.equals(driverClass, ORACLE_DRIVER)) {
+			props.setProperty("remarksReporting", "true");
+		}
+
+		Connection conn = driver.connect(url, props);
+
+		if (conn == null) {
+			throw new SQLException("连接获取失败");
+		}
+
+		return conn;
+	}
+
+	private Driver getDriver(String driverClass) {
+		Driver driver = null;
+		try {
+			Class<?> clazz = Class.forName(driverClass);
+			driver = (Driver) clazz.newInstance();
+		} catch (Exception e) {
+			throw new RuntimeException("类加载器加载driver失败", e);
+		}
+
+		return driver;
+	}
+}

+ 117 - 0
codegen/src/main/java/com/yonge/crud/core/db/DatabaseIntrospector.java

@@ -0,0 +1,117 @@
+package com.yonge.crud.core.db;
+
+import java.sql.DatabaseMetaData;
+import java.sql.ResultSet;
+import java.sql.SQLException;
+import java.util.ArrayList;
+import java.util.List;
+
+import org.apache.commons.lang3.StringUtils;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import com.yonge.crud.core.db.model.Column;
+import com.yonge.crud.core.db.model.Table;
+import com.yonge.crud.core.util.JavaBeansUtil;
+
+public class DatabaseIntrospector {
+	private static final Logger LOGGER = LoggerFactory.getLogger(DatabaseIntrospector.class);
+
+	private DatabaseMetaData dbMetaData;
+
+	public DatabaseIntrospector(DatabaseMetaData dbMetaData) {
+		this.dbMetaData = dbMetaData;
+	}
+
+	public List<Table> getTables(String catalog, String schema) {
+		List<Table> tables = new ArrayList<Table>();
+		if (dbMetaData == null) {
+			LOGGER.warn("DatabaseMetaData对象不能为空");
+			return tables;
+		}
+		ResultSet resultSet = null;
+		try {
+			resultSet = dbMetaData.getTables(catalog, schema, null, new String[] { "TABLE" });
+			Table table = null;
+			while (resultSet.next()) {
+				table = new Table();
+				table.setName(resultSet.getString("TABLE_NAME"));
+				table.setCatalog(resultSet.getString("TABLE_CAT"));
+				table.setRemarks(resultSet.getString("REMARKS"));
+				table.setSchema(resultSet.getString("TABLE_SCHEM"));
+				table.setClassName(JavaBeansUtil.getCamelCaseString(table.getName(), true));
+
+				table.setColumns(getColumns(table));
+				tables.add(table);
+			}
+		} catch (SQLException e) {
+			LOGGER.warn("获取数据库表失败", e);
+		} finally {
+			if (resultSet != null) {
+				try {
+					resultSet.close();
+				} catch (SQLException e) {
+					LOGGER.warn("关闭ResultSet对象出现异常", e);
+				}
+			}
+		}
+		return tables;
+	}
+
+	private List<Column> getColumns(Table table) {
+		List<Column> columns = new ArrayList<Column>();
+		if (table == null) {
+			LOGGER.warn("参数不能为空");
+			return columns;
+		}
+		String tableName = table.getName();
+		String schema = table.getSchema();
+		String name = tableName.toUpperCase();
+		if (dbMetaData == null) {
+			LOGGER.warn("DatabaseMetaData对象不能为空");
+		}
+		ResultSet resultSet = null;
+		Column column = null;
+		try {
+			resultSet = dbMetaData.getPrimaryKeys(table.getCatalog(), schema, tableName);
+			List<String> keyColumns = new ArrayList<String>();
+			while (resultSet.next()) {
+				keyColumns.add(resultSet.getString("COLUMN_NAME"));
+			}
+
+			resultSet = dbMetaData.getColumns(table.getCatalog(), schema, tableName, null);
+			while (resultSet.next()) {
+				column = new Column();
+				// 获得字段名称
+				column.setFieldName(resultSet.getString("COLUMN_NAME"));
+				// 获得字段类型名称
+				column.setJdbcTypeName(resultSet.getString("TYPE_NAME"));
+				// 数据类型
+				column.setDataType(resultSet.getInt("DATA_TYPE"));
+				// 获得字段大小
+				column.setLength(resultSet.getInt("COLUMN_SIZE"));
+				column.setNullable((resultSet.getInt("NULLABLE") == DatabaseMetaData.columnNullable));
+				column.setScale(resultSet.getInt("DECIMAL_DIGITS"));
+				column.setRemarks(resultSet.getString("REMARKS"));
+				for (String key : keyColumns) {
+					if (StringUtils.equalsIgnoreCase(key, column.getFieldName())) {
+						column.setIsPrimaryKey(true);
+					}
+				}
+				columns.add(column);
+			}
+		} catch (SQLException e) {
+			LOGGER.warn("在" + schema + "中获取" + name + "表字段出现异常", e);
+		} finally {
+			if (resultSet != null) {
+				try {
+					resultSet.close();
+				} catch (SQLException e) {
+					LOGGER.warn("关闭ResultSet对象出现异常", e);
+				}
+			}
+		}
+		return columns;
+	}
+
+}

+ 127 - 0
codegen/src/main/java/com/yonge/crud/core/db/model/Column.java

@@ -0,0 +1,127 @@
+package com.yonge.crud.core.db.model;
+
+public class Column {
+
+	/** 字段名称 */
+	private String fieldName;
+
+	/** 是否是主键 */
+	private boolean isPrimaryKey;
+
+	/** 属性名称 */
+	private String propertyName;
+
+	/** JDBC类型 名称 */
+	private String jdbcTypeName;
+
+	/** java类型 */
+	private String javaTypeName;
+
+	/** 数据类型 */
+	private int dataType;
+
+	/** 字段长度 */
+	private int length;
+
+	/** 是否可以为空 */
+	private boolean nullable;
+
+	private int scale;
+
+	/** 描述 */
+	private String remarks;
+
+	public String getFieldName() {
+		return fieldName;
+	}
+
+	public void setFieldName(String fieldName) {
+		this.fieldName = fieldName;
+	}
+
+	public boolean isPrimaryKey() {
+		return isPrimaryKey;
+	}
+
+	public void setIsPrimaryKey(boolean isPrimaryKey) {
+		this.isPrimaryKey = isPrimaryKey;
+	}
+
+	public String getPropertyName() {
+		return propertyName;
+	}
+
+	public void setPropertyName(String propertyName) {
+		this.propertyName = propertyName;
+	}
+
+	public String getJdbcTypeName() {
+		return jdbcTypeName;
+	}
+
+	public void setJdbcTypeName(String jdbcTypeName) {
+		this.jdbcTypeName = jdbcTypeName;
+	}
+
+	public String getJavaTypeName() {
+		return javaTypeName;
+	}
+
+	public void setJavaTypeName(String javaTypeName) {
+		this.javaTypeName = javaTypeName;
+	}
+
+	public int getDataType() {
+		return dataType;
+	}
+
+	public void setDataType(int dataType) {
+		this.dataType = dataType;
+	}
+
+	public int getLength() {
+		return length;
+	}
+
+	public void setLength(int length) {
+		this.length = length;
+	}
+
+	public boolean isNullable() {
+		return nullable;
+	}
+
+	public void setNullable(boolean nullable) {
+		this.nullable = nullable;
+	}
+
+	public int getScale() {
+		return scale;
+	}
+
+	public void setScale(int scale) {
+		this.scale = scale;
+	}
+
+	public String getRemarks() {
+		return remarks;
+	}
+
+	public void setRemarks(String remarks) {
+		this.remarks = remarks;
+	}
+
+	public String toString() {
+		StringBuilder sb = new StringBuilder();
+		sb.append("fieldName = " + fieldName)
+				.append(" isPrimaryKey = " + isPrimaryKey)
+				.append(" propertyName = " + propertyName)
+				.append(" jdbcTypeName = " + jdbcTypeName)
+				.append(" javaTypeName = " + javaTypeName)
+				.append(" dataType = " + dataType)
+				.append(" length = " + length)
+				.append(" nullable = " + nullable).append(" scale = " + scale)
+				.append(" remarks = " + remarks);
+		return sb.toString();
+	}
+}

+ 86 - 0
codegen/src/main/java/com/yonge/crud/core/db/model/Table.java

@@ -0,0 +1,86 @@
+package com.yonge.crud.core.db.model;
+
+import java.util.ArrayList;
+import java.util.List;
+
+public class Table {
+
+	private String name;
+
+	private String schema;
+
+	private String catalog;
+
+	private String remarks;
+
+	private String className;
+
+	private String packageName;
+
+	private List<Column> columns = new ArrayList<Column>();
+
+	public String getName() {
+		return name;
+	}
+
+	public void setName(String name) {
+		this.name = name;
+	}
+
+	public String getSchema() {
+		return schema;
+	}
+
+	public void setSchema(String schema) {
+		this.schema = schema;
+	}
+
+	public String getCatalog() {
+		return catalog;
+	}
+
+	public void setCatalog(String catalog) {
+		this.catalog = catalog;
+	}
+
+	public String getRemarks() {
+		return remarks;
+	}
+
+	public void setRemarks(String remarks) {
+		this.remarks = remarks;
+	}
+
+	public List<Column> getColumns() {
+		return columns;
+	}
+
+	public void setColumns(List<Column> columns) {
+		this.columns = columns;
+	}
+
+	public String getClassName() {
+		return className;
+	}
+
+	public void setClassName(String className) {
+		this.className = className;
+	}
+
+	public String getPackageName() {
+		return packageName;
+	}
+
+	public void setPackageName(String packageName) {
+		this.packageName = packageName;
+	}
+
+	public String toString() {
+		StringBuilder sb = new StringBuilder();
+		sb.append("name = " + name).append(" catalog = " + catalog)
+				.append(" schema = " + schema).append(" remarks = " + remarks)
+				.append(" packageName = " + packageName)
+				.append(" className = " + className);
+		return sb.toString();
+	}
+}

+ 234 - 0
codegen/src/main/java/com/yonge/crud/core/generator/ModuleGenerateIntrospector.java

@@ -0,0 +1,234 @@
+package com.yonge.crud.core.generator;
+
+import java.io.File;
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.Map.Entry;
+
+import org.apache.commons.lang3.StringUtils;
+
+import com.yonge.crud.core.db.model.Column;
+import com.yonge.crud.core.db.model.Table;
+import com.yonge.crud.core.generator.module.JavaFileGenerator;
+import com.yonge.crud.core.generator.module.SpringGenerator;
+import com.yonge.crud.core.generator.module.SqlMapConfigGenerator;
+import com.yonge.crud.core.util.JavaBeansUtil;
+
+public class ModuleGenerateIntrospector {
+
+	private static final String DAO_TEMPLATE_NAME = "dao.ftl";
+
+	private static final String POJO_TEMPLATE_NAME = "pojo.ftl";
+
+	private static final String SERVICE_IMPL_TEMPLATE_NAME = "service_impl.ftl";
+
+	private static final String SERVICE_TEMPLATE_NAME = "service.ftl";
+
+	private static final String SQLMAP_TEMPLATE_NAME = "sqlmap.ftl";
+
+	private static final String SQLMAPCONFIG_TEMPLATE_NAME = "sqlmapConfig.ftl";
+
+	private static final String SPRING_TEMPLATE = "spring.ftl";
+
+	private static final String POJO_FILE_SUFFIX = ".java";
+
+	private static final String SQLMAP_FILE_PREFIX = "SqlMap_";
+
+	private static final String XML_FILE_SUFFIX = ".xml";
+
+	private static final String DAO_FILE_SUFFIX = "Dao.java";
+
+	private static final String SERVICE_FILE_SUFFIX = "Service.java";
+
+	private static final String SERVICE_IMPL_FILE_SUFFIX = "ServiceImpl.java";
+
+	private static final String SQLMAP_CONFIG_FILE = "SqlMapConfig.xml";
+
+	private static final String SPRING_CONFIG_FILE = "spring-crud.xml";
+
+	public static void generatePOJO(Table table, String srcBase,
+			String packageName) {
+		List<Column> columns = table.getColumns();
+		for (Column col : columns) {
+			// 转换类型
+			col.setJavaTypeName(JavaBeansUtil.fromJdbcToJava(col));
+			// 转换属性名称
+			col.setPropertyName(JavaBeansUtil.getCamelCaseString(
+					col.getFieldName(), false));
+		}
+		table.setColumns(columns);
+		table.setPackageName(packageName);
+		Map<String, Object> params = new HashMap<String, Object>();
+		params.put("props", columns);
+		params.put("table", table);
+		// 生成pojo
+		JavaFileGenerator entiryGenerator = new JavaFileGenerator();
+		entiryGenerator.generate(params, srcBase, packageName,
+				table.getClassName() + POJO_FILE_SUFFIX, POJO_TEMPLATE_NAME);
+	}
+
+	public static void generatSqlmap(String driverClass, Table table,
+			String srcBase, String sqlMapPackageName, String daoPackageName) {
+		Map<String, Object> params = new HashMap<String, Object>();
+		String className = table.getClassName();
+		params.put("namespace", daoPackageName + "." + className + "Dao");
+		params.put("fullClassName", table.getPackageName() + "." + className);
+		params.put("alias", className);
+		params.put("columns", table.getColumns());
+
+		String tableName = table.getName();
+		params.put("tableName", tableName);
+
+		// 构建sql语句
+		String fields = "", properties = "", criteria = "", orderbyStr = "";
+		Map<String, String> fieldPropMapping = new HashMap<String, String>();
+		int keys = 0;
+		for (Column col : table.getColumns()) {
+			fields += (col.getFieldName() + ",");
+			properties += ("#{" + col.getPropertyName() + "},");
+			fieldPropMapping.put(col.getFieldName(), col.getPropertyName());
+			if (col.isPrimaryKey()) {
+				criteria += (col.getFieldName() + " = #{"
+						+ col.getPropertyName() + "} AND ");
+				++keys;
+				orderbyStr += (col.getFieldName() + ",");
+			}
+		}
+		if (keys > 1) {
+			params.put("paramType", Map.class.getName());
+		}
+		// 清除最后一个"AND"
+		if (StringUtils.isNotBlank(criteria)) {
+			criteria = criteria.substring(0, criteria.length() - 4);
+		}
+		// 删除最后一个“,”
+		fields = fields.substring(0, fields.length() - 1);
+		properties = properties.substring(0, properties.length() - 1);
+
+		String queryBaseSQL = "SELECT * FROM " + tableName;
+		// 全查询
+		String queryFullSQL = queryBaseSQL;
+		if (StringUtils.isNotBlank(orderbyStr)) {
+			orderbyStr = orderbyStr.substring(0, orderbyStr.length() - 1);
+			queryFullSQL += " ORDER BY " + orderbyStr;
+		}
+		params.put("queryFullSQL", queryFullSQL);
+		// 插入
+		String insertSQL = "INSERT INTO " + tableName + " (" + fields
+				+ ") VALUES(" + properties + ")";
+		params.put("insertSQL", insertSQL);
+		if (StringUtils.isNotBlank(criteria)) {
+			// 修改
+			String updateSQL = "UPDATE " + tableName + " SET ";
+			for (Entry<String, String> entry : fieldPropMapping.entrySet()) {
+				updateSQL += (entry.getKey() + " = #{" + entry.getValue() + "},");
+			}
+			// 删除最后一个“,”
+			updateSQL = updateSQL.substring(0, updateSQL.length() - 1);
+			updateSQL += (" WHERE " + criteria);
+			params.put("updateSQL", updateSQL);
+			// 根据主键查询
+			String querySingleSQL = queryBaseSQL + " WHERE " + criteria;
+			params.put("querySingleSQL", querySingleSQL);
+			// 根据主键删除
+			String deleteSQL = "DELETE FROM " + tableName + " WHERE "
+					+ criteria;
+			params.put("deleteSQL", deleteSQL);
+		}
+		// 分页查询语句
+		String queryPage = "";
+
+		if (StringUtils.equals(driverClass, "com.mysql.jdbc.Driver")) {
+			// mysql
+			queryPage = queryFullSQL + " <include refid=\"global.limit\"/>";
+		} else if (StringUtils.equals(driverClass,
+				"oracle.jdbc.driver.OracleDriver")) {
+			// oracle
+			queryPage = "SELECT * FROM (SELECT A.*,ROWNUM FROM " + tableName
+					+ " A WHERE ROWNUM <= #endLine# ORDER BY " + orderbyStr
+					+ ") WHERE ROWNUM >= #startLine#";
+		} else if (StringUtils.equals(driverClass, "com.ibm.db2.jcc.DB2Driver")) {
+			// db2
+			queryPage = "SELECT * FROM (SELECT B.*,ROWNUMBER() OVER(ORDER BY "
+					+ orderbyStr
+					+ ") AS RN FROM "
+					+ tableName
+					+ " AS B) AS A WHERE A.RN BETWEEN #startLine# AND #endLine#";
+		}
+		if (StringUtils.isNotBlank(queryPage)) {
+			params.put("queryPage", queryPage);
+		}
+		// 生成sqlmap
+		JavaFileGenerator sqlMapGenerator = new JavaFileGenerator();
+		sqlMapGenerator.generate(params, srcBase, sqlMapPackageName,
+				className+"Mapper" + XML_FILE_SUFFIX,
+				SQLMAP_TEMPLATE_NAME);
+	}
+
+	public static void generateSqlMapConfig(List<Table> tables, String srcBase,
+			String sqlmapPackageName, String sqlMapConfigPackageName) {
+		Map<String, Object> params = new HashMap<String, Object>();
+		params.put("sqlmapPackageName", sqlmapPackageName);
+		params.put("tables", tables);
+		// 生成sqlmap-config
+		SqlMapConfigGenerator sqlMapConfigGenerator = new SqlMapConfigGenerator();
+		sqlMapConfigGenerator.createSqlMapConfigFile(sqlmapPackageName, tables,
+				params, srcBase, sqlMapConfigPackageName, SQLMAP_CONFIG_FILE,
+				SQLMAPCONFIG_TEMPLATE_NAME);
+	}
+
+	public static void generateDaoAndService(Table table, String srcBase,
+			String daoPackageName, String servicePackageName) {
+		Map<String, Object> params = new HashMap<String, Object>();
+		String className = table.getClassName();
+		String pojoFullClassName = table.getPackageName() + "."
+				+ table.getClassName();
+
+		List<Column> primarykeys = new ArrayList<Column>();
+		for (Column col : table.getColumns()) {
+			if (col.isPrimaryKey()) {
+				primarykeys.add(col);
+			}
+		}
+		String paramType = null;
+		if (primarykeys.size() == 1) {
+			paramType = primarykeys.get(0).getJavaTypeName();
+		} else if (primarykeys.size() > 1) {
+			paramType = Map.class.getName();
+		}
+		params.put("pojoFullClassName", pojoFullClassName);
+		params.put("className", className);
+		params.put("paramType", paramType);
+		params.put("daoPackageName", daoPackageName);
+
+		JavaFileGenerator daoGenerator = new JavaFileGenerator();
+		daoGenerator.generate(params, srcBase, daoPackageName, className
+				+ DAO_FILE_SUFFIX, DAO_TEMPLATE_NAME);
+
+		params.put("servicePackageName", servicePackageName);
+
+		JavaFileGenerator serviceGenerator = new JavaFileGenerator();
+		serviceGenerator.generate(params, srcBase, servicePackageName,
+				className + SERVICE_FILE_SUFFIX, SERVICE_TEMPLATE_NAME);
+
+		JavaFileGenerator serviceImplGenerator = new JavaFileGenerator();
+		serviceImplGenerator.generate(params, srcBase, servicePackageName
+				+ File.separator + "impl",
+				className + SERVICE_IMPL_FILE_SUFFIX,
+				SERVICE_IMPL_TEMPLATE_NAME);
+	}
+
+	public static void generateSpring(List<Table> tables, String srcBase,
+			String packageName, String daoPackageName, String servicePackageName) {
+		Map<String, Object> params = new HashMap<String, Object>();
+		params.put("daoPackageName", daoPackageName);
+		params.put("servicePackageName", servicePackageName);
+		params.put("tables", tables);
+		SpringGenerator springGenerator = new SpringGenerator();
+		springGenerator.createSpringFile(daoPackageName, servicePackageName,
+				tables, params, srcBase, packageName, SPRING_CONFIG_FILE,
+				SPRING_TEMPLATE);
+	}
+}

+ 41 - 0
codegen/src/main/java/com/yonge/crud/core/generator/module/JavaFileGenerator.java

@@ -0,0 +1,41 @@
+package com.yonge.crud.core.generator.module;
+
+import java.io.File;
+import java.util.Map;
+
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import com.yonge.crud.core.FreemarkerTemplateEngine;
+
+public final class JavaFileGenerator extends FreemarkerTemplateEngine {
+	private static final Logger LOGGER = LoggerFactory
+			.getLogger(JavaFileGenerator.class);
+
+	public JavaFileGenerator() {
+		super();
+	}
+
+	public void generate(Map<String, Object> data, String srcBase,
+			String packageName, String targetFile, String templateFile) {
+		StringBuilder buf = new StringBuilder();
+		buf.append(srcBase).append(File.separator);
+		buf.append(packageName.replaceAll("\\.", File.separator
+				+ File.separator));// 单个的File.separator会导致无法通过正则表达式解析
+		buf.append(File.separator);
+		File packageDir = new File(buf.toString());
+		if (!packageDir.exists()) {
+			boolean flag = packageDir.mkdirs();
+			if (!flag) {
+				LOGGER.warn("递归创建文件夹{}失败", packageDir);
+				return;
+			}
+		}
+		buf.append(targetFile);
+		String outputFile = buf.toString();
+		LOGGER.debug("根据输入内容[{},{},{}]得到文件名{}", new Object[] { templateFile,
+				srcBase, packageName, outputFile });
+		render(data, templateFile, outputFile);
+	}
+
+}

+ 129 - 0
codegen/src/main/java/com/yonge/crud/core/generator/module/SpringGenerator.java

@@ -0,0 +1,129 @@
+package com.yonge.crud.core.generator.module;
+
+import java.io.File;
+import java.io.IOException;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+import javax.xml.parsers.ParserConfigurationException;
+import javax.xml.xpath.XPathConstants;
+import javax.xml.xpath.XPathExpressionException;
+
+import org.apache.commons.lang3.StringUtils;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.w3c.dom.Document;
+import org.w3c.dom.Element;
+import org.xml.sax.SAXException;
+
+import com.yonge.crud.core.FreemarkerTemplateEngine;
+import com.yonge.crud.core.db.model.Table;
+import com.yonge.crud.core.util.XmlUtil;
+
+public class SpringGenerator extends FreemarkerTemplateEngine {
+
+	private static final Logger LOGGER = LoggerFactory
+			.getLogger(SpringGenerator.class);
+
+	public SpringGenerator() {
+		super();
+	}
+
+	public void createSpringFile(String daoPackageName,
+			String servicePackageName, List<Table> tables,
+			Map<String, Object> data, String srcBase, String packageName,
+			String targetFile, String templateFile) {
+		StringBuilder buf = new StringBuilder();
+		buf.append(srcBase).append(File.separator);
+		buf.append(packageName.replaceAll("\\.", File.separator
+				+ File.separator));// 单个的File.separator会导致无法通过正则表达式解析
+		buf.append(File.separator);
+		File dbDir = new File(buf.toString());
+		if (!dbDir.exists()) {
+			boolean flag = dbDir.mkdirs();
+			if (!flag) {
+				LOGGER.warn("递归创建文件夹{}失败", dbDir);
+				return;
+			}
+		}
+		buf.append(targetFile);
+		String outputFile = buf.toString();
+		File file = new File(outputFile);
+		if (file.exists()) {
+			Map<String, String> nsMap = new HashMap<String, String>();
+			nsMap.put("ns", "http://www.springframework.org/schema/beans");
+			try {
+				Document doc = XmlUtil.parse(file);
+				for (Table table : tables) {
+					String className = table.getClassName();
+					if (StringUtils.isNotBlank(className)) {
+						String className_firstLower = Character
+								.toLowerCase(className.charAt(0))
+								+ className.substring(1);
+						Object obj = XmlUtil.queryNodeValue(doc,
+								"//ns:beans/ns:bean[@id='"
+										+ className_firstLower + "Dao']",
+								XPathConstants.NODE, nsMap);
+						if (obj == null) {
+							// 创建dao
+							Element element = doc.createElement("bean");
+							element.setAttribute("id", className_firstLower
+									+ "Dao");
+							element.setAttribute("class",
+									"com.erayt.solar2.db.DaoProxyFactoryBean");
+							// 创建property元素
+							Element subElement = doc.createElement("property");
+							subElement.setAttribute("name", "daoInterface");
+							subElement.setAttribute("value", daoPackageName
+									+ "." + className + "Dao");
+							element.appendChild(subElement);
+
+							subElement = doc.createElement("property");
+							subElement.setAttribute("name", "sqlMapClient");
+							subElement.setAttribute("ref", "sqlMapClient");
+							element.appendChild(subElement);
+							doc.getDocumentElement().appendChild(element);
+
+						} else {
+							LOGGER.warn(targetFile + "中已经存在" + className
+									+ "的DAO配置");
+						}
+
+						obj = XmlUtil.queryNodeValue(doc,
+								"//ns:beans/ns:bean[@id='"
+										+ className_firstLower + "Service']",
+								XPathConstants.NODE, nsMap);
+						if (obj == null) {
+							// 创建service
+							Element element = doc.createElement("bean");
+							element.setAttribute("id", className_firstLower
+									+ "Service");
+							element.setAttribute("class", servicePackageName
+									+ ".impl." + className + "ServiceImpl");
+							doc.getDocumentElement().appendChild(element);
+						} else {
+							LOGGER.warn(targetFile + "中已经存在" + className
+									+ "的SERVICE配置");
+						}
+					}
+				}
+				// 将dom写入文件
+				XmlUtil.writeXmlFile(doc, outputFile);
+				return;
+			} catch (ParserConfigurationException e) {
+				LOGGER.warn("xml文件解析失败", e);
+			} catch (SAXException e) {
+				LOGGER.warn("xml文件解析失败", e);
+			} catch (IOException e) {
+				LOGGER.warn("xml文件解析失败", e);
+			} catch (XPathExpressionException e) {
+				LOGGER.warn("xpath表达式异常", e);
+			}
+		}
+		LOGGER.debug("根据输入内容[{},{},{}]得到文件名{}", new Object[] { templateFile,
+				srcBase, packageName, outputFile });
+		render(data, templateFile, outputFile);
+	}
+
+}

+ 82 - 0
codegen/src/main/java/com/yonge/crud/core/generator/module/SqlMapConfigGenerator.java

@@ -0,0 +1,82 @@
+package com.yonge.crud.core.generator.module;
+
+import java.io.File;
+import java.io.IOException;
+import java.util.List;
+import java.util.Map;
+
+import javax.xml.parsers.ParserConfigurationException;
+import javax.xml.xpath.XPathConstants;
+import javax.xml.xpath.XPathExpressionException;
+
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.w3c.dom.Document;
+import org.w3c.dom.Element;
+import org.xml.sax.SAXException;
+
+import com.yonge.crud.core.FreemarkerTemplateEngine;
+import com.yonge.crud.core.db.model.Table;
+import com.yonge.crud.core.util.XmlUtil;
+
+public final class SqlMapConfigGenerator extends FreemarkerTemplateEngine {
+	private static final Logger LOGGER = LoggerFactory
+			.getLogger(SqlMapConfigGenerator.class);
+
+	public void createSqlMapConfigFile(String sqlmapPackageName,
+			List<Table> tables, Map<String, Object> data, String srcBase,
+			String packageName, String targetFile, String templateFile) {
+		StringBuilder buf = new StringBuilder();
+		buf.append(srcBase).append(File.separator);
+		buf.append(packageName.replaceAll("\\.", File.separator
+				+ File.separator));// 单个的File.separator会导致无法通过正则表达式解析
+		buf.append(File.separator);
+		File dbDir = new File(buf.toString());
+		if (!dbDir.exists()) {
+			boolean flag = dbDir.mkdirs();
+			if (!flag) {
+				LOGGER.warn("递归创建文件夹{}失败", dbDir);
+				return;
+			}
+		}
+		buf.append(targetFile);
+		String outputFile = buf.toString();
+		// 判断文件是否存在,如果存在,则在原来的基础上追加
+		File file = new File(outputFile);
+		if (file.exists()) {
+			try {
+				Document doc = XmlUtil.parse(file);
+				for (Table table : tables) {
+					String src = sqlmapPackageName.replace('.', '/')
+							+ "/SqlMap_" + table.getName() + ".xml";
+					Object obj = XmlUtil.queryNodeValue(doc,
+							"//sqlMapConfig/sqlMap[@resource='" + src + "']",
+							XPathConstants.NODE, null);
+					if (obj == null) {
+						// 创建一个新的节点
+						Element element = doc.createElement("sqlMap");
+						element.setAttribute("resource", src);
+						doc.getDocumentElement().appendChild(element);
+					} else {
+						LOGGER.warn(targetFile + "中已经存在" + table.getName()
+								+ "配置");
+					}
+				}
+				// 将dom写入文件
+				XmlUtil.writeXmlFile(doc, outputFile);
+				return;
+			} catch (ParserConfigurationException e) {
+				LOGGER.warn("xml文件解析失败", e);
+			} catch (SAXException e) {
+				LOGGER.warn("xml文件解析失败", e);
+			} catch (IOException e) {
+				LOGGER.warn("xml文件解析失败", e);
+			} catch (XPathExpressionException e) {
+				LOGGER.warn("xpath表达式异常", e);
+			}
+		}
+		LOGGER.debug("根据输入内容[{},{},{}]得到文件名{}", new Object[] { data,
+				templateFile, srcBase, outputFile });
+		render(data, templateFile, outputFile);
+	}
+}

+ 160 - 0
codegen/src/main/java/com/yonge/crud/core/util/JavaBeansUtil.java

@@ -0,0 +1,160 @@
+package com.yonge.crud.core.util;
+
+import java.sql.Types;
+import java.util.regex.Pattern;
+
+import com.yonge.crud.core.db.model.Column;
+
+public class JavaBeansUtil {
+
+	private static final Pattern allowedClassNames = Pattern
+			.compile("[a-zA-Z]+");
+
+	public static String fromJdbcToJava(Column column) {
+		String answer = null;
+		switch (column.getDataType()) {
+		case Types.ARRAY:
+		case Types.DATALINK:
+		case Types.DISTINCT:
+		case Types.JAVA_OBJECT:
+		case Types.NULL:
+		case Types.OTHER:
+		case Types.REF:
+		case Types.STRUCT:
+			answer = "Object";
+			break;
+
+		case Types.BIGINT:
+			answer = "Long";
+			break;
+
+		case Types.BINARY:
+		case Types.BLOB:
+		case Types.LONGVARBINARY:
+		case Types.VARBINARY:
+			answer = "byte[]"; //$NON-NLS-1$
+			break;
+
+		case Types.BIT:
+		case Types.BOOLEAN:
+			answer = "boolean";
+			break;
+		case Types.CHAR:
+		case Types.CLOB:
+		case Types.LONGVARCHAR:
+		case Types.VARCHAR:
+			answer = "String";
+			break;
+
+		case Types.DATE:
+		case Types.TIME:
+		case Types.TIMESTAMP:
+			answer = "java.util.Date";
+			break;
+
+		case Types.DECIMAL:
+			if (column.getScale() > 0 || column.getLength() > 18) {
+				answer = "java.math.BigDecimal";
+			} else if (column.getLength() > 9) {
+				answer = "long";
+			} else if (column.getLength() > 4) {
+				answer = "int";
+			} else {
+				answer = "short";
+			}
+			break;
+
+		case Types.DOUBLE:
+			answer = "double";
+			break;
+
+		case Types.FLOAT:
+		case Types.REAL:
+			answer = "float";
+			break;
+
+		case Types.INTEGER:
+		case Types.TINYINT:
+			answer = "Integer";
+			break;
+
+		case Types.NUMERIC:
+			if (column.getScale() > 0 || column.getLength() > 18) {
+				answer = "java.math.BigDecimal";
+			} else if (column.getLength() > 9) {
+				answer = "long";
+			} else if (column.getLength() > 4) {
+				answer = "int";
+			} else {
+				answer = "short";
+			}
+			break;
+
+		case Types.SMALLINT:
+			answer = "short";
+			break;
+
+
+		default:
+			answer = null;
+			break;
+		}
+
+		return answer;
+	}
+
+	public static String getClassName(String tableName) {
+		String className = tableName;
+		if (allowedClassNames.matcher(className).matches()) {
+			className = tableName;
+		} else {
+			for (String chunk : allowedClassNames.split(tableName)) {
+				className = className.replace(chunk, "");
+			}
+		}
+		if (Character.isLowerCase(className.charAt(0))) {
+			className = className.substring(0, 1).toUpperCase()
+					+ className.substring(1);
+		}
+		return className;
+	}
+
+	public static String getCamelCaseString(String inputString,
+			boolean firstCharacterUppercase) {
+		StringBuilder sb = new StringBuilder();
+
+		boolean nextUpperCase = false;
+		for (int i = 0; i < inputString.length(); i++) {
+			char c = inputString.charAt(i);
+
+			switch (c) {
+			case '_':
+			case '-':
+			case '@':
+			case '$':
+			case '#':
+			case ' ':
+				if (sb.length() > 0) {
+					nextUpperCase = true;
+				}
+				break;
+
+			default:
+				if (nextUpperCase) {
+					sb.append(Character.toUpperCase(c));
+					nextUpperCase = false;
+				} else {
+					sb.append(Character.toLowerCase(c));
+				}
+				break;
+			}
+		}
+
+		if (firstCharacterUppercase) {
+			sb.setCharAt(0, Character.toUpperCase(sb.charAt(0)));
+		}
+
+		return sb.toString();
+	}
+
+}

+ 169 - 0
codegen/src/main/java/com/yonge/crud/core/util/XmlUtil.java

@@ -0,0 +1,169 @@
+package com.yonge.crud.core.util;
+
+import java.io.ByteArrayInputStream;
+import java.io.File;
+import java.io.IOException;
+import java.io.InputStream;
+import java.util.Collections;
+import java.util.Iterator;
+import java.util.Map;
+import java.util.WeakHashMap;
+
+import javax.xml.namespace.NamespaceContext;
+import javax.xml.namespace.QName;
+import javax.xml.parsers.DocumentBuilder;
+import javax.xml.parsers.DocumentBuilderFactory;
+import javax.xml.parsers.ParserConfigurationException;
+import javax.xml.transform.OutputKeys;
+import javax.xml.transform.Result;
+import javax.xml.transform.Source;
+import javax.xml.transform.Transformer;
+import javax.xml.transform.TransformerException;
+import javax.xml.transform.TransformerFactory;
+import javax.xml.transform.dom.DOMSource;
+import javax.xml.transform.stream.StreamResult;
+import javax.xml.xpath.XPath;
+import javax.xml.xpath.XPathExpression;
+import javax.xml.xpath.XPathExpressionException;
+import javax.xml.xpath.XPathFactory;
+
+import org.apache.commons.lang3.StringUtils;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.w3c.dom.Document;
+import org.xml.sax.InputSource;
+import org.xml.sax.SAXException;
+
+public class XmlUtil {
+
+	private static final Logger LOGGER = LoggerFactory.getLogger(XmlUtil.class);
+
+	private static final Map<ClassLoader, DocumentBuilderFactory> DOCUMENT_BUILDER_FACTORIES = Collections
+			.synchronizedMap(new WeakHashMap<ClassLoader, DocumentBuilderFactory>());
+
+	/**
+	 * 根据xpath表达式查询目标document中节点的值
+	 * 
+	 * @param doc
+	 *            目标对象
+	 * @param expression
+	 *            xpath表达式
+	 * @param returnType
+	 *            节点值的返回类型(eg:XPathConstants.STRING)
+	 * @param nsMap
+	 *            如果有默认的命名空间,需设置默认的命名空间
+	 * @return
+	 * @throws XPathExpressionException
+	 */
+	public static Object queryNodeValue(final Document doc, String expression,
+			QName returnType, final Map<String, String> nsMap)
+			throws XPathExpressionException {
+		XPathFactory factory = XPathFactory.newInstance();
+		XPath xpath = factory.newXPath();
+
+		xpath.setNamespaceContext(new NamespaceContext() {
+
+			@SuppressWarnings("rawtypes")
+			public Iterator getPrefixes(String namespaceURI) {
+				throw new UnsupportedOperationException();
+			}
+
+			public String getPrefix(String namespaceURI) {
+				throw new UnsupportedOperationException();
+			}
+
+			public String getNamespaceURI(String prefix) {
+				String xmlns = doc.lookupNamespaceURI(prefix);
+				if (StringUtils.isBlank(xmlns)) {
+					xmlns = nsMap.get(prefix);
+				}
+				return xmlns;
+			}
+		});
+
+		XPathExpression expr = xpath.compile(expression);
+
+		return expr.evaluate(doc, returnType);
+	}
+
+	/**
+	 * 将document对象写入filename文件
+	 * 
+	 * @param doc
+	 *            目标对象
+	 * @param filename
+	 *            输出文件名称
+	 */
+	public static void writeXmlFile(Document doc, String filename) {
+		try {
+			// Prepare the DOM document for writing
+			Source source = new DOMSource(doc);
+
+			// Prepare the output file
+			File file = new File(filename);
+			Result result = new StreamResult(file);
+
+			// Write the DOM document to the file
+			Transformer xformer = TransformerFactory.newInstance()
+					.newTransformer();
+			xformer.setOutputProperty(OutputKeys.INDENT, "yes");
+			xformer.transform(source, result);
+		} catch (TransformerException e) {
+			LOGGER.warn("document对象写入文件失败", e);
+		}
+	}
+
+	public static DocumentBuilder getParser()
+			throws ParserConfigurationException {
+		return getDocumentBuilderFactory().newDocumentBuilder();
+	}
+
+	public static Document parse(InputSource is)
+			throws ParserConfigurationException, SAXException, IOException {
+		return getParser().parse(is);
+	}
+
+	public static Document parse(File is) throws ParserConfigurationException,
+			SAXException, IOException {
+		return getParser().parse(is);
+	}
+
+	public static Document parse(InputStream in)
+			throws ParserConfigurationException, SAXException, IOException {
+		if (in == null) {
+			LOGGER.warn("XMLUtils trying to parse a null inputstream");
+		}
+		return getParser().parse(in);
+	}
+
+	public static Document parse(String in)
+			throws ParserConfigurationException, SAXException, IOException {
+		return parse(in.getBytes());
+	}
+
+	public static Document parse(byte[] in)
+			throws ParserConfigurationException, SAXException, IOException {
+		if (in == null) {
+			LOGGER.warn("XMLUtils trying to parse a null bytes");
+			return null;
+		}
+		return getParser().parse(new ByteArrayInputStream(in));
+	}
+
+	private static DocumentBuilderFactory getDocumentBuilderFactory() {
+		ClassLoader loader = Thread.currentThread().getContextClassLoader();
+		if (loader == null) {
+			loader = XmlUtil.class.getClassLoader();
+		}
+		if (loader == null) {
+			return DocumentBuilderFactory.newInstance();
+		}
+		DocumentBuilderFactory factory = DOCUMENT_BUILDER_FACTORIES.get(loader);
+		if (factory == null) {
+			factory = DocumentBuilderFactory.newInstance();
+			factory.setNamespaceAware(true);
+			DOCUMENT_BUILDER_FACTORIES.put(loader, factory);
+		}
+		return factory;
+	}
+}

+ 17 - 0
codegen/src/main/resources/generateConfigration.xml

@@ -0,0 +1,17 @@
+<?xml version="1.0" encoding="utf-8"?>
+<GenerateConfiguration>
+	<dbConfiguration>
+		<driverClass>com.mysql.jdbc.Driver</driverClass>
+		<url>jdbc:mysql://120.26.238.168:3306/mec_dev</url>
+		<username>mec_dev</username>
+		<password>mec_dev</password>
+		<catalog>mec_dev</catalog>
+		<schema>mec_dev</schema>
+	</dbConfiguration>
+	<srcBase>e:/javabean</srcBase>
+	<pojoPackageName>com.ym.mec.auth.api.entity</pojoPackageName>
+	<daoPackageName>com.ym.mec.auth.dal.dao</daoPackageName>
+	<servicePackageName>com.ym.mec.auth.service</servicePackageName>
+	<sqlmapPackageName>resources</sqlmapPackageName>
+	<sqlmapConfigPackageName>resources/config</sqlmapConfigPackageName>
+</GenerateConfiguration>

+ 10 - 0
codegen/src/main/resources/template/dao.ftl

@@ -0,0 +1,10 @@
+[#ftl]
+package ${daoPackageName};
+
+import ${daoPackageName}.base.BaseDAO;
+import ${pojoFullClassName};
+
+public interface ${className}Dao [#if paramType??]extends BaseDAO<${paramType}, ${className}>[/#if] {
+
+	
+}

+ 44 - 0
codegen/src/main/resources/template/pojo.ftl

@@ -0,0 +1,44 @@
+[#ftl]
+package ${table.packageName};
+
+import org.apache.commons.lang3.builder.ToStringBuilder;
+
+/**
+ * 对应数据库表(${table.name}):${table.remarks}
+ */
+public class ${table.className} {
+
+	[#list props as prop]
+	[#if prop.remarks??]
+	/** ${prop.remarks} */
+	[/#if]
+	private ${prop.javaTypeName} ${prop.propertyName};
+	
+	[/#list]
+	[#list props as prop]
+		[#if prop.javaTypeName == 'boolean']
+	public void set${prop.propertyName?cap_first}(${prop.javaTypeName} ${prop.propertyName}){
+		this.${prop.propertyName} = ${prop.propertyName};
+	}
+	
+	public boolean is${prop.propertyName?cap_first}(){
+		return this.${prop.propertyName};
+	}
+			
+		[#else]
+	public void set${prop.propertyName?cap_first}(${prop.javaTypeName} ${prop.propertyName}){
+		this.${prop.propertyName} = ${prop.propertyName};
+	}
+	
+	public ${prop.javaTypeName} get${prop.propertyName?cap_first}(){
+		return this.${prop.propertyName};
+	}
+			
+		[/#if]
+	[/#list]
+	@Override
+	public String toString() {
+		return ToStringBuilder.reflectionToString(this);
+	}
+
+}

+ 9 - 0
codegen/src/main/resources/template/service.ftl

@@ -0,0 +1,9 @@
+[#ftl]
+package ${servicePackageName};
+
+import java.util.List;
+import ${pojoFullClassName};
+
+public interface ${className}Service extends BaseService<${paramType}, ${className}> {
+
+}

+ 22 - 0
codegen/src/main/resources/template/service_impl.ftl

@@ -0,0 +1,22 @@
+[#ftl]
+package ${servicePackageName}.impl;
+
+import java.util.List;
+import org.springframework.beans.factory.annotation.Autowired;
+import ${pojoFullClassName};
+import ${servicePackageName}.${className}Service;
+import ${daoPackageName}.${className}Dao;
+
+@Service
+public class ${className}ServiceImpl extends BaseServiceImpl<${paramType}, ${className}>  implements ${className}Service {
+	
+	[#assign daoName = className + 'Dao']
+	@Autowired
+	private ${daoName} ${daoName?uncap_first};
+
+	@Override
+	public BaseDAO<${paramType}, ${className}> getDAO() {
+		return ${daoName?uncap_first};
+	}
+	
+}

+ 36 - 0
codegen/src/main/resources/template/spring.ftl

@@ -0,0 +1,36 @@
+[#ftl]
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+This file is auto generated by Ant & FreeMarker.
+DO NOT MODIFY IT.All modified content will be lost when next auto generate.
+这个文件是用ANT和FreeMarker自动生成的。
+不要修改此文件。所有改动将在下次重新自动生成时丢失。
+-->
+<beans xmlns="http://www.springframework.org/schema/beans"
+	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:aop="http://www.springframework.org/schema/aop"
+	xmlns:tx="http://www.springframework.org/schema/tx" xmlns:jdbc="http://www.springframework.org/schema/jdbc"
+	xmlns:context="http://www.springframework.org/schema/context"
+	xsi:schemaLocation="http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-2.5.xsd http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.5.xsd http://www.springframework.org/schema/jdbc http://www.springframework.org/schema/jdbc/spring-jdbc-2.5.xsd http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-2.5.xsd http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-2.5.xsd"
+	default-autowire="byName">
+
+	[#-- 
+	<bean id="sqlMapClient" class="org.springframework.orm.ibatis.SqlMapClientFactoryBean">
+		<property name="configLocation" value="${sqlmapConfigPackageName}/SqlMap_Config.xml" />
+		<property name="dataSource" ref ="${r"${dataSource}"}" />
+	</bean>
+	--]
+	
+	
+	<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
+		<property name="dataSource" ref="dataSource" />
+		<property name="configLocation" value="classpath:SqlMapConfig.xml" />
+	</bean>
+	
+	[#list tables as table]
+	<bean id="${table.className?uncap_first}Dao" class="org.mybatis.spring.mapper.MapperFactoryBean">
+		<property name="mapperInterface" value="${daoPackageName}.${table.className}Dao" />
+		<property name="sqlSessionFactory" ref="sqlSessionFactory" />
+	</bean>
+	
+	[/#list]
+</beans>

+ 64 - 0
codegen/src/main/resources/template/sqlmap.ftl

@@ -0,0 +1,64 @@
+[#ftl]
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<!--
+这个文件是自动生成的。
+不要修改此文件。所有改动将在下次重新自动生成时丢失。
+-->
+<mapper namespace="${namespace}">
+	
+	<resultMap type="${fullClassName}" id="${alias}">
+	[#list columns as col]
+		<result column="${col.fieldName}" property="${col.propertyName}" />
+	[/#list]
+	</resultMap>
+	
+	[#if querySingleSQL??]
+	<!-- 根据主键查询一条记录 -->
+	<select id="get" resultMap="${alias}" [#if paramType??]parameterType="${paramType}"[/#if]>
+		${querySingleSQL}
+	</select>
+	[/#if]
+	
+	<!-- 全查询 -->
+	<select id="findAll" resultMap="${alias}">
+		${queryFullSQL}
+	</select>
+	
+	<!-- 向数据库增加一条记录 -->
+	<insert id="insert" parameterType="${fullClassName}" useGeneratedKeys="true" keyColumn="id" keyProperty="id">
+		<!--
+		<selectKey resultClass="int" keyProperty="id" > 
+		SELECT SEQ_WSDEFINITION_ID.nextval AS ID FROM DUAL 
+		</selectKey>
+		-->
+		${insertSQL}
+	</insert>
+	
+	[#if updateSQL??]
+	<!-- 根据主键查询一条记录 -->
+	<update id="update" parameterType="${fullClassName}">
+		${updateSQL}
+	</update>
+	[/#if]
+	
+	[#if deleteSQL??]
+	<!-- 根据主键删除一条记录 -->
+	<delete id="delete" [#if paramType??]parameterType="${paramType}"[/#if]>
+		${deleteSQL}
+	</delete>
+	[/#if]
+	
+	[#if queryPage??]
+	<!-- 分页查询 -->
+	<select id="queryPage" resultMap="${alias}" parameterType="map">
+		${queryPage}
+	</select>
+	[/#if]
+	
+	<!-- 查询当前表的总记录数 -->
+	<select id="queryCount" resultType="int">
+		SELECT COUNT(*) FROM ${tableName}
+	</select>
+</mapper>
+ 

+ 11 - 0
codegen/src/main/resources/template/sqlmapConfig.ftl

@@ -0,0 +1,11 @@
+[#ftl]
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE configuration PUBLIC "-//mybatis.org//DTD SQL Map Config 3.0//EN"  
+	"http://mybatis.org/dtd/mybatis-3-config.dtd">
+<configuration>
+	<mappers>
+	[#list tables as table]
+		<mapper resource="${sqlmapPackageName?replace(".","/")}/SqlMap_${table.name}.xml" />
+	[/#list]
+	</mappers>
+</configuration>

+ 35 - 0
mec-auth/mec-auth-api/pom.xml

@@ -0,0 +1,35 @@
+<?xml version="1.0"?>
+<project
+	xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"
+	xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
+	<modelVersion>4.0.0</modelVersion>
+
+	<parent>
+		<groupId>com.ym</groupId>
+		<artifactId>mec-auth</artifactId>
+		<version>1.0</version>
+	</parent>
+
+	<artifactId>mec-auth-api</artifactId>
+	<name>mec-auth-api</name>
+	<url>http://maven.apache.org</url>
+
+	<properties>
+		<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
+	</properties>
+
+	<dependencies>
+	
+		<dependency>
+			<groupId>org.springframework.cloud</groupId>
+			<artifactId>spring-cloud-starter-openfeign</artifactId>
+		</dependency>
+	
+		<dependency>
+			<groupId>com.ym</groupId>
+			<artifactId>mec-common</artifactId>
+			<version>1.0</version>
+		</dependency>
+		
+	</dependencies>
+</project>

+ 15 - 0
mec-auth/mec-auth-api/src/main/java/com/ym/mec/auth/api/client/SysUserFeignService.java

@@ -0,0 +1,15 @@
+package com.ym.mec.auth.api.client;
+
+import org.springframework.cloud.openfeign.FeignClient;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.PathVariable;
+import org.springframework.web.bind.annotation.RequestHeader;
+
+import com.ym.mec.auth.api.dto.SysUserInfo;
+
+@FeignClient(name = "auth-server")
+public interface SysUserFeignService {
+
+	@GetMapping(value = "query/{username}")
+	public SysUserInfo getUser(@PathVariable("username") String username, @RequestHeader("from") String from);
+}

+ 51 - 0
mec-auth/mec-auth-api/src/main/java/com/ym/mec/auth/api/dto/SysUserInfo.java

@@ -0,0 +1,51 @@
+package com.ym.mec.auth.api.dto;
+
+import java.io.Serializable;
+
+import com.ym.mec.auth.api.entity.SysUser;
+
+public class SysUserInfo implements Serializable {
+
+	/**
+	 * 
+	 */
+	private static final long serialVersionUID = 7022224608947495223L;
+
+	/**
+	 * 用户基本信息
+	 */
+	private SysUser sysUser;
+	/**
+	 * 权限标识集合
+	 */
+	private String[] permissions;
+
+	/**
+	 * 角色集合
+	 */
+	private Integer[] roles;
+
+	public SysUser getSysUser() {
+		return sysUser;
+	}
+
+	public void setSysUser(SysUser sysUser) {
+		this.sysUser = sysUser;
+	}
+
+	public String[] getPermissions() {
+		return permissions;
+	}
+
+	public void setPermissions(String[] permissions) {
+		this.permissions = permissions;
+	}
+
+	public Integer[] getRoles() {
+		return roles;
+	}
+
+	public void setRoles(Integer[] roles) {
+		this.roles = roles;
+	}
+}

+ 92 - 0
mec-auth/mec-auth-api/src/main/java/com/ym/mec/auth/api/entity/SysDept.java

@@ -0,0 +1,92 @@
+package com.ym.mec.auth.api.entity;
+
+import org.apache.commons.lang3.builder.ToStringBuilder;
+
+/**
+ * 对应数据库表(sys_dept):
+ */
+public class SysDept {
+
+	/**  */
+	private Integer deptId;
+	
+	/** 部门名称 */
+	private String name;
+	
+	/** 排序 */
+	private Integer sort;
+	
+	/** 创建时间 */
+	private java.util.Date createTime;
+	
+	/** 修改时间 */
+	private java.util.Date updateTime;
+	
+	/** 是否删除  -1:已删除  0:正常 */
+	private String delFlag;
+	
+	/**  */
+	private Integer parentId;
+	
+	public void setDeptId(Integer deptId){
+		this.deptId = deptId;
+	}
+	
+	public Integer getDeptId(){
+		return this.deptId;
+	}
+			
+	public void setName(String name){
+		this.name = name;
+	}
+	
+	public String getName(){
+		return this.name;
+	}
+			
+	public void setSort(Integer sort){
+		this.sort = sort;
+	}
+	
+	public Integer getSort(){
+		return this.sort;
+	}
+			
+	public void setCreateTime(java.util.Date createTime){
+		this.createTime = createTime;
+	}
+	
+	public java.util.Date getCreateTime(){
+		return this.createTime;
+	}
+			
+	public void setUpdateTime(java.util.Date updateTime){
+		this.updateTime = updateTime;
+	}
+	
+	public java.util.Date getUpdateTime(){
+		return this.updateTime;
+	}
+			
+	public void setDelFlag(String delFlag){
+		this.delFlag = delFlag;
+	}
+	
+	public String getDelFlag(){
+		return this.delFlag;
+	}
+			
+	public void setParentId(Integer parentId){
+		this.parentId = parentId;
+	}
+	
+	public Integer getParentId(){
+		return this.parentId;
+	}
+			
+	@Override
+	public String toString() {
+		return ToStringBuilder.reflectionToString(this);
+	}
+
+}

+ 37 - 0
mec-auth/mec-auth-api/src/main/java/com/ym/mec/auth/api/entity/SysDeptRelation.java

@@ -0,0 +1,37 @@
+package com.ym.mec.auth.api.entity;
+
+import org.apache.commons.lang3.builder.ToStringBuilder;
+
+/**
+ * 对应数据库表(sys_dept_relation):
+ */
+public class SysDeptRelation {
+
+	/** 祖先节点 */
+	private Integer ancestor;
+	
+	/** 后代节点 */
+	private Integer descendant;
+	
+	public void setAncestor(Integer ancestor){
+		this.ancestor = ancestor;
+	}
+	
+	public Integer getAncestor(){
+		return this.ancestor;
+	}
+			
+	public void setDescendant(Integer descendant){
+		this.descendant = descendant;
+	}
+	
+	public Integer getDescendant(){
+		return this.descendant;
+	}
+			
+	@Override
+	public String toString() {
+		return ToStringBuilder.reflectionToString(this);
+	}
+
+}

+ 158 - 0
mec-auth/mec-auth-api/src/main/java/com/ym/mec/auth/api/entity/SysMenu.java

@@ -0,0 +1,158 @@
+package com.ym.mec.auth.api.entity;
+
+import org.apache.commons.lang3.builder.ToStringBuilder;
+
+/**
+ * 对应数据库表(sys_menu):
+ */
+public class SysMenu {
+
+	/** 菜单ID */
+	private Integer menuId;
+
+	/** 菜单名称 */
+	private String name;
+
+	/** 菜单权限标识 */
+	private String permission;
+
+	/** 接口路径 */
+	private String path;
+
+	/** 父菜单ID */
+	private Integer parentId;
+
+	/** 图标 */
+	private String icon;
+
+	/** 前端页面地址 */
+	private String component;
+
+	/** 排序值 */
+	private Integer sort;
+
+	/** 0-开启,1- 关闭 */
+	private String keepAlive;
+
+	/** 菜单类型 (0菜单 1按钮) */
+	private String type;
+
+	/** 创建时间 */
+	private java.util.Date createTime;
+
+	/** 更新时间 */
+	private java.util.Date updateTime;
+
+	/** 逻辑删除标记(0--正常 1--删除) */
+	private String delFlag;
+
+	public void setMenuId(Integer menuId) {
+		this.menuId = menuId;
+	}
+
+	public Integer getMenuId() {
+		return this.menuId;
+	}
+
+	public void setName(String name) {
+		this.name = name;
+	}
+
+	public String getName() {
+		return this.name;
+	}
+
+	public void setPermission(String permission) {
+		this.permission = permission;
+	}
+
+	public String getPermission() {
+		return this.permission;
+	}
+
+	public void setPath(String path) {
+		this.path = path;
+	}
+
+	public String getPath() {
+		return this.path;
+	}
+
+	public void setParentId(Integer parentId) {
+		this.parentId = parentId;
+	}
+
+	public Integer getParentId() {
+		return this.parentId;
+	}
+
+	public void setIcon(String icon) {
+		this.icon = icon;
+	}
+
+	public String getIcon() {
+		return this.icon;
+	}
+
+	public String getComponent() {
+		return component;
+	}
+
+	public void setComponent(String component) {
+		this.component = component;
+	}
+
+	public void setSort(Integer sort) {
+		this.sort = sort;
+	}
+
+	public Integer getSort() {
+		return this.sort;
+	}
+
+	public void setKeepAlive(String keepAlive) {
+		this.keepAlive = keepAlive;
+	}
+
+	public String getKeepAlive() {
+		return this.keepAlive;
+	}
+
+	public void setType(String type) {
+		this.type = type;
+	}
+
+	public String getType() {
+		return this.type;
+	}
+
+	public void setCreateTime(java.util.Date createTime) {
+		this.createTime = createTime;
+	}
+
+	public java.util.Date getCreateTime() {
+		return this.createTime;
+	}
+
+	public void setUpdateTime(java.util.Date updateTime) {
+		this.updateTime = updateTime;
+	}
+
+	public java.util.Date getUpdateTime() {
+		return this.updateTime;
+	}
+
+	public void setDelFlag(String delFlag) {
+		this.delFlag = delFlag;
+	}
+
+	public String getDelFlag() {
+		return this.delFlag;
+	}
+
+	@Override
+	public String toString() {
+		return ToStringBuilder.reflectionToString(this);
+	}
+
+}

+ 136 - 0
mec-auth/mec-auth-api/src/main/java/com/ym/mec/auth/api/entity/SysOauthClientDetails.java

@@ -0,0 +1,136 @@
+package com.ym.mec.auth.api.entity;
+
+import org.apache.commons.lang3.builder.ToStringBuilder;
+
+/**
+ * 对应数据库表(sys_oauth_client_details):
+ */
+public class SysOauthClientDetails {
+
+	/** 客户端ID */
+	private String clientId;
+	
+	/** 资源ID */
+	private String resourceIds;
+	
+	/** 客户端密钥 */
+	private String clientSecret;
+	
+	/** 作用域 */
+	private String scope;
+	
+	/** 授权方式 */
+	private String authorizedGrantTypes;
+	
+	/**  */
+	private String webServerRedirectUri;
+	
+	/**  */
+	private String authorities;
+	
+	/** 请求令牌有效时间 */
+	private Integer accessTokenValidity;
+	
+	/** 刷新令牌有效时间 */
+	private Integer refreshTokenValidity;
+	
+	/** 扩展信息 */
+	private String additionalInformation;
+	
+	/** 是否自动放行 */
+	private String autoapprove;
+	
+	public void setClientId(String clientId){
+		this.clientId = clientId;
+	}
+	
+	public String getClientId(){
+		return this.clientId;
+	}
+			
+	public void setResourceIds(String resourceIds){
+		this.resourceIds = resourceIds;
+	}
+	
+	public String getResourceIds(){
+		return this.resourceIds;
+	}
+			
+	public void setClientSecret(String clientSecret){
+		this.clientSecret = clientSecret;
+	}
+	
+	public String getClientSecret(){
+		return this.clientSecret;
+	}
+			
+	public void setScope(String scope){
+		this.scope = scope;
+	}
+	
+	public String getScope(){
+		return this.scope;
+	}
+			
+	public void setAuthorizedGrantTypes(String authorizedGrantTypes){
+		this.authorizedGrantTypes = authorizedGrantTypes;
+	}
+	
+	public String getAuthorizedGrantTypes(){
+		return this.authorizedGrantTypes;
+	}
+			
+	public void setWebServerRedirectUri(String webServerRedirectUri){
+		this.webServerRedirectUri = webServerRedirectUri;
+	}
+	
+	public String getWebServerRedirectUri(){
+		return this.webServerRedirectUri;
+	}
+			
+	public void setAuthorities(String authorities){
+		this.authorities = authorities;
+	}
+	
+	public String getAuthorities(){
+		return this.authorities;
+	}
+			
+	public void setAccessTokenValidity(Integer accessTokenValidity){
+		this.accessTokenValidity = accessTokenValidity;
+	}
+	
+	public Integer getAccessTokenValidity(){
+		return this.accessTokenValidity;
+	}
+			
+	public void setRefreshTokenValidity(Integer refreshTokenValidity){
+		this.refreshTokenValidity = refreshTokenValidity;
+	}
+	
+	public Integer getRefreshTokenValidity(){
+		return this.refreshTokenValidity;
+	}
+			
+	public void setAdditionalInformation(String additionalInformation){
+		this.additionalInformation = additionalInformation;
+	}
+	
+	public String getAdditionalInformation(){
+		return this.additionalInformation;
+	}
+			
+	public void setAutoapprove(String autoapprove){
+		this.autoapprove = autoapprove;
+	}
+	
+	public String getAutoapprove(){
+		return this.autoapprove;
+	}
+			
+	@Override
+	public String toString() {
+		return ToStringBuilder.reflectionToString(this);
+	}
+
+}

+ 92 - 0
mec-auth/mec-auth-api/src/main/java/com/ym/mec/auth/api/entity/SysRole.java

@@ -0,0 +1,92 @@
+package com.ym.mec.auth.api.entity;
+
+import org.apache.commons.lang3.builder.ToStringBuilder;
+
+/**
+ * 对应数据库表(sys_role):
+ */
+public class SysRole {
+
+	/**  */
+	private Integer roleId;
+	
+	/**  */
+	private String roleName;
+	
+	/**  */
+	private String roleCode;
+	
+	/**  */
+	private String roleDesc;
+	
+	/**  */
+	private java.util.Date createTime;
+	
+	/**  */
+	private java.util.Date updateTime;
+	
+	/** 删除标识(0-正常,1-删除) */
+	private String delFlag;
+	
+	public void setRoleId(Integer roleId){
+		this.roleId = roleId;
+	}
+	
+	public Integer getRoleId(){
+		return this.roleId;
+	}
+			
+	public void setRoleName(String roleName){
+		this.roleName = roleName;
+	}
+	
+	public String getRoleName(){
+		return this.roleName;
+	}
+			
+	public void setRoleCode(String roleCode){
+		this.roleCode = roleCode;
+	}
+	
+	public String getRoleCode(){
+		return this.roleCode;
+	}
+			
+	public void setRoleDesc(String roleDesc){
+		this.roleDesc = roleDesc;
+	}
+	
+	public String getRoleDesc(){
+		return this.roleDesc;
+	}
+			
+	public void setCreateTime(java.util.Date createTime){
+		this.createTime = createTime;
+	}
+	
+	public java.util.Date getCreateTime(){
+		return this.createTime;
+	}
+			
+	public void setUpdateTime(java.util.Date updateTime){
+		this.updateTime = updateTime;
+	}
+	
+	public java.util.Date getUpdateTime(){
+		return this.updateTime;
+	}
+			
+	public void setDelFlag(String delFlag){
+		this.delFlag = delFlag;
+	}
+	
+	public String getDelFlag(){
+		return this.delFlag;
+	}
+			
+	@Override
+	public String toString() {
+		return ToStringBuilder.reflectionToString(this);
+	}
+
+}

+ 48 - 0
mec-auth/mec-auth-api/src/main/java/com/ym/mec/auth/api/entity/SysRoleDept.java

@@ -0,0 +1,48 @@
+package com.ym.mec.auth.api.entity;
+
+import org.apache.commons.lang3.builder.ToStringBuilder;
+
+/**
+ * 对应数据库表(sys_role_dept):
+ */
+public class SysRoleDept {
+
+	/**  */
+	private Integer id;
+	
+	/** 角色ID */
+	private Integer roleId;
+	
+	/** 部门ID */
+	private Integer deptId;
+	
+	public void setId(Integer id){
+		this.id = id;
+	}
+	
+	public Integer getId(){
+		return this.id;
+	}
+			
+	public void setRoleId(Integer roleId){
+		this.roleId = roleId;
+	}
+	
+	public Integer getRoleId(){
+		return this.roleId;
+	}
+			
+	public void setDeptId(Integer deptId){
+		this.deptId = deptId;
+	}
+	
+	public Integer getDeptId(){
+		return this.deptId;
+	}
+			
+	@Override
+	public String toString() {
+		return ToStringBuilder.reflectionToString(this);
+	}
+
+}

+ 37 - 0
mec-auth/mec-auth-api/src/main/java/com/ym/mec/auth/api/entity/SysRoleMenu.java

@@ -0,0 +1,37 @@
+package com.ym.mec.auth.api.entity;
+
+import org.apache.commons.lang3.builder.ToStringBuilder;
+
+/**
+ * 对应数据库表(sys_role_menu):
+ */
+public class SysRoleMenu {
+
+	/** 角色ID */
+	private Integer roleId;
+	
+	/** 菜单ID */
+	private Integer menuId;
+	
+	public void setRoleId(Integer roleId){
+		this.roleId = roleId;
+	}
+	
+	public Integer getRoleId(){
+		return this.roleId;
+	}
+			
+	public void setMenuId(Integer menuId){
+		this.menuId = menuId;
+	}
+	
+	public Integer getMenuId(){
+		return this.menuId;
+	}
+			
+	@Override
+	public String toString() {
+		return ToStringBuilder.reflectionToString(this);
+	}
+
+}

+ 169 - 0
mec-auth/mec-auth-api/src/main/java/com/ym/mec/auth/api/entity/SysUser.java

@@ -0,0 +1,169 @@
+package com.ym.mec.auth.api.entity;
+
+import org.apache.commons.lang3.builder.ToStringBuilder;
+
+/**
+ * 对应数据库表(sys_user):
+ */
+public class SysUser {
+
+	/** 主键ID */
+	private Integer userId;
+
+	/** 用户名 */
+	private String username;
+
+	/**  */
+	private String password;
+
+	/** 随机盐 */
+	private String salt;
+
+	/** 简介 */
+	private String phone;
+
+	/** 头像 */
+	private String avatar;
+
+	/** 部门ID */
+	private Integer deptId;
+
+	/** 创建时间 */
+	private java.util.Date createTime;
+
+	/** 修改时间 */
+	private java.util.Date updateTime;
+
+	/** 0-正常,9-锁定 */
+	private String lockFlag;
+
+	/** 0-正常,1-删除 */
+	private String delFlag;
+
+	/** 微信openid */
+	private String wxOpenid;
+
+	/** QQ openid */
+	private String qqOpenid;
+
+	/** 用户类型 */
+	private String userType;
+
+	public void setUserId(Integer userId) {
+		this.userId = userId;
+	}
+
+	public Integer getUserId() {
+		return this.userId;
+	}
+
+	public void setUsername(String username) {
+		this.username = username;
+	}
+
+	public String getUsername() {
+		return this.username;
+	}
+
+	public void setPassword(String password) {
+		this.password = password;
+	}
+
+	public String getPassword() {
+		return this.password;
+	}
+
+	public void setSalt(String salt) {
+		this.salt = salt;
+	}
+
+	public String getSalt() {
+		return this.salt;
+	}
+
+	public void setPhone(String phone) {
+		this.phone = phone;
+	}
+
+	public String getPhone() {
+		return this.phone;
+	}
+
+	public void setAvatar(String avatar) {
+		this.avatar = avatar;
+	}
+
+	public String getAvatar() {
+		return this.avatar;
+	}
+
+	public void setDeptId(Integer deptId) {
+		this.deptId = deptId;
+	}
+
+	public Integer getDeptId() {
+		return this.deptId;
+	}
+
+	public void setCreateTime(java.util.Date createTime) {
+		this.createTime = createTime;
+	}
+
+	public java.util.Date getCreateTime() {
+		return this.createTime;
+	}
+
+	public void setUpdateTime(java.util.Date updateTime) {
+		this.updateTime = updateTime;
+	}
+
+	public java.util.Date getUpdateTime() {
+		return this.updateTime;
+	}
+
+	public void setLockFlag(String lockFlag) {
+		this.lockFlag = lockFlag;
+	}
+
+	public String getLockFlag() {
+		return this.lockFlag;
+	}
+
+	public void setDelFlag(String delFlag) {
+		this.delFlag = delFlag;
+	}
+
+	public String getDelFlag() {
+		return this.delFlag;
+	}
+
+	public void setWxOpenid(String wxOpenid) {
+		this.wxOpenid = wxOpenid;
+	}
+
+	public String getWxOpenid() {
+		return this.wxOpenid;
+	}
+
+	public void setQqOpenid(String qqOpenid) {
+		this.qqOpenid = qqOpenid;
+	}
+
+	public String getQqOpenid() {
+		return this.qqOpenid;
+	}
+
+	public String getUserType() {
+		return userType;
+	}
+
+	public void setUserType(String userType) {
+		this.userType = userType;
+	}
+
+	@Override
+	public String toString() {
+		return ToStringBuilder.reflectionToString(this);
+	}
+
+}

+ 37 - 0
mec-auth/mec-auth-api/src/main/java/com/ym/mec/auth/api/entity/SysUserRole.java

@@ -0,0 +1,37 @@
+package com.ym.mec.auth.api.entity;
+
+import org.apache.commons.lang3.builder.ToStringBuilder;
+
+/**
+ * 对应数据库表(sys_user_role):
+ */
+public class SysUserRole {
+
+	/** 用户ID */
+	private Integer userId;
+	
+	/** 角色ID */
+	private Integer roleId;
+	
+	public void setUserId(Integer userId){
+		this.userId = userId;
+	}
+	
+	public Integer getUserId(){
+		return this.userId;
+	}
+			
+	public void setRoleId(Integer roleId){
+		this.roleId = roleId;
+	}
+	
+	public Integer getRoleId(){
+		return this.roleId;
+	}
+			
+	@Override
+	public String toString() {
+		return ToStringBuilder.reflectionToString(this);
+	}
+
+}

+ 36 - 0
mec-auth/mec-auth-api/src/main/java/com/ym/mec/auth/api/enums/SysUserType.java

@@ -0,0 +1,36 @@
+package com.ym.mec.auth.api.enums;
+
+import org.apache.commons.lang3.StringUtils;
+
+import com.ym.mec.common.dal.base.BaseStringEnum;
+
+public enum SysUserType implements BaseStringEnum<SysUserType> {
+
+	STUDENT("学生"), TEACHER("老师"), SYSTEM("系统內置");
+
+	private String desc;
+
+	private SysUserType(String desc) {
+	}
+
+	@Override
+	public String getName() {
+		return name();
+	}
+
+	public String getDesc() {
+		return desc;
+	}
+
+	public static SysUserType queryByName(String name) {
+		if (StringUtils.isBlank(name)) {
+			return null;
+		}
+		for (SysUserType sysUserType : SysUserType.values()) {
+			if (name.equals(sysUserType.getName())) {
+				return sysUserType;
+			}
+		}
+		return null;
+	}
+}

+ 57 - 0
mec-auth/mec-auth-server/pom.xml

@@ -0,0 +1,57 @@
+<?xml version="1.0"?>
+<project
+	xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"
+	xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
+	<modelVersion>4.0.0</modelVersion>
+
+	<parent>
+		<groupId>com.ym</groupId>
+		<artifactId>mec-auth</artifactId>
+		<version>1.0</version>
+	</parent>
+
+	<artifactId>mec-auth-server</artifactId>
+	<name>mec-auth-server</name>
+	<url>http://maven.apache.org</url>
+
+	<properties>
+		<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
+	</properties>
+
+	<dependencies>
+		<dependency>
+			<groupId>org.springframework.cloud</groupId>
+			<artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
+		</dependency>
+		
+		<dependency>
+			<groupId>org.springframework.cloud</groupId>
+			<artifactId>spring-cloud-starter-oauth2</artifactId>
+		</dependency>
+		
+		<dependency>
+			<groupId>org.springframework.cloud</groupId>
+			<artifactId>spring-cloud-starter-security</artifactId>
+		</dependency>
+		
+		<!-- swagger-spring-boot -->
+		<dependency>
+			<groupId>com.spring4all</groupId>
+			<artifactId>swagger-spring-boot-starter</artifactId>
+			<version>1.9.0.RELEASE</version>
+		</dependency>
+		
+		<dependency>
+            <groupId>com.alibaba</groupId>
+            <artifactId>druid-spring-boot-starter</artifactId>
+             <version>1.1.10</version>
+        </dependency>
+		
+		<dependency>
+			<groupId>com.ym</groupId>
+			<artifactId>mec-auth-api</artifactId>
+			<version>1.0</version>
+		</dependency>
+
+	</dependencies>
+</project>

+ 34 - 0
mec-auth/mec-auth-server/src/main/java/com/ym/mec/auth/AuthServerApplication.java

@@ -0,0 +1,34 @@
+package com.ym.mec.auth;
+
+import org.mybatis.spring.annotation.MapperScan;
+import org.springframework.boot.SpringApplication;
+import org.springframework.boot.autoconfigure.SpringBootApplication;
+import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
+import org.springframework.cloud.client.loadbalancer.LoadBalanced;
+import org.springframework.cloud.openfeign.EnableFeignClients;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.ComponentScan;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.web.client.RestTemplate;
+
+import com.spring4all.swagger.EnableSwagger2Doc;
+
+@SpringBootApplication
+@EnableDiscoveryClient
+@EnableFeignClients
+@MapperScan("com.ym.mec.auth.dal.dao")
+@ComponentScan(basePackages="com.ym.mec")
+@Configuration
+@EnableSwagger2Doc
+public class AuthServerApplication {
+
+	public static void main(String[] args) {
+		SpringApplication.run(AuthServerApplication.class, args);
+	}
+	
+	@Bean
+	@LoadBalanced
+	public RestTemplate restTemplate(){
+		return new RestTemplate();
+	}
+}

+ 80 - 0
mec-auth/mec-auth-server/src/main/java/com/ym/mec/auth/config/AuthorizationServerConfig.java

@@ -0,0 +1,80 @@
+package com.ym.mec.auth.config;
+
+import javax.sql.DataSource;
+
+import lombok.AllArgsConstructor;
+
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.data.redis.connection.RedisConnectionFactory;
+import org.springframework.security.authentication.AuthenticationManager;
+import org.springframework.security.oauth2.config.annotation.configurers.ClientDetailsServiceConfigurer;
+import org.springframework.security.oauth2.config.annotation.web.configuration.AuthorizationServerConfigurerAdapter;
+import org.springframework.security.oauth2.config.annotation.web.configuration.EnableAuthorizationServer;
+import org.springframework.security.oauth2.config.annotation.web.configurers.AuthorizationServerEndpointsConfigurer;
+import org.springframework.security.oauth2.config.annotation.web.configurers.AuthorizationServerSecurityConfigurer;
+import org.springframework.security.oauth2.provider.client.JdbcClientDetailsService;
+import org.springframework.security.oauth2.provider.token.DefaultTokenServices;
+import org.springframework.security.oauth2.provider.token.store.redis.RedisTokenStore;
+
+import com.ym.mec.common.constant.CommonConstants;
+
+/**
+ * 授权服务器配置
+ */
+@Configuration
+@AllArgsConstructor
+@EnableAuthorizationServer
+public class AuthorizationServerConfig extends AuthorizationServerConfigurerAdapter {
+
+	@Autowired
+	private RedisConnectionFactory connectionFactory;
+
+	@Autowired
+	private AuthenticationManager authenticationManager;
+
+	@Autowired
+	private DataSource dataSource;
+
+	@Override
+	public void configure(AuthorizationServerEndpointsConfigurer endpoints) throws Exception {
+		endpoints.authenticationManager(authenticationManager).tokenServices(defaultTokenServices());
+	}
+
+	@Override
+	public void configure(AuthorizationServerSecurityConfigurer security) throws Exception {
+		security.tokenKeyAccess("permitAll()").checkTokenAccess("isAuthenticated()").allowFormAuthenticationForClients();
+	}
+
+	@Override
+	public void configure(ClientDetailsServiceConfigurer clients) throws Exception {
+
+		JdbcClientDetailsService clientDetailsService = new JdbcClientDetailsService(dataSource);
+
+		clientDetailsService
+				.setSelectClientDetailsSql("select client_id, CONCAT('{noop}',client_secret) as client_secret, resource_ids, scope, authorized_grant_types, web_server_redirect_uri, authorities, access_token_validity, refresh_token_validity, additional_information, autoapprove from sys_oauth_client_details where client_id = ?");
+		clientDetailsService
+				.setFindClientDetailsSql("select client_id, CONCAT('{noop}',client_secret) as client_secret, resource_ids, scope, authorized_grant_types, web_server_redirect_uri, authorities, access_token_validity, refresh_token_validity, additional_information, autoapprove from sys_oauth_client_details order by client_id");
+
+		clients.withClientDetails(clientDetailsService);
+	}
+
+	@Bean
+	public RedisTokenStore redisTokenStore() {
+		RedisTokenStore tokenStore = new RedisTokenStore(connectionFactory);
+		tokenStore.setPrefix(CommonConstants.OAUTH_PREFIX);
+		return tokenStore;
+	}
+
+	@Bean
+	public DefaultTokenServices defaultTokenServices() {
+		DefaultTokenServices tokenServices = new DefaultTokenServices();
+		tokenServices.setTokenStore(redisTokenStore());
+		tokenServices.setSupportRefreshToken(true);
+		tokenServices.setAccessTokenValiditySeconds(60 * 60 * 24); // token有效期自定义设置,默认12小时
+		tokenServices.setRefreshTokenValiditySeconds(60 * 60 * 24 * 30);// 默认30天,这里修改
+		return tokenServices;
+	}
+
+}

+ 40 - 0
mec-auth/mec-auth-server/src/main/java/com/ym/mec/auth/config/ResourceServerConfig.java

@@ -0,0 +1,40 @@
+package com.ym.mec.auth.config;
+
+import javax.servlet.http.HttpServletResponse;
+
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.security.config.annotation.web.builders.HttpSecurity;
+import org.springframework.security.oauth2.config.annotation.web.configuration.EnableResourceServer;
+import org.springframework.security.oauth2.config.annotation.web.configuration.ResourceServerConfigurerAdapter;
+import org.springframework.security.oauth2.config.annotation.web.configurers.ResourceServerSecurityConfigurer;
+
+import com.ym.mec.common.security.BaseAccessDeniedHandler;
+import com.ym.mec.common.security.BaseAuthenticationEntryPoint;
+
+/**
+ * 资源服务器配置
+ */
+@Configuration
+@EnableResourceServer
+public class ResourceServerConfig extends ResourceServerConfigurerAdapter {
+
+	@Autowired
+	private BaseAccessDeniedHandler baseAccessDeniedHandler;
+
+	@Autowired
+	private BaseAuthenticationEntryPoint baseAuthenticationEntryPoint;
+
+	@Override
+	public void configure(HttpSecurity http) throws Exception {
+		http.csrf().disable().exceptionHandling()
+				.authenticationEntryPoint((request, response, authException) -> response.sendError(HttpServletResponse.SC_UNAUTHORIZED)).and()
+				.authorizeRequests().anyRequest().authenticated().and().httpBasic();
+	}
+
+	@Override
+	public void configure(ResourceServerSecurityConfigurer resources) throws Exception {
+		resources.authenticationEntryPoint(baseAuthenticationEntryPoint).accessDeniedHandler(baseAccessDeniedHandler);
+	}
+
+}

+ 91 - 0
mec-auth/mec-auth-server/src/main/java/com/ym/mec/auth/config/WebSecurityConfig.java

@@ -0,0 +1,91 @@
+package com.ym.mec.auth.config;
+
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.security.authentication.AuthenticationManager;
+import org.springframework.security.authentication.dao.DaoAuthenticationProvider;
+import org.springframework.security.config.annotation.authentication.builders.AuthenticationManagerBuilder;
+import org.springframework.security.config.annotation.method.configuration.EnableGlobalMethodSecurity;
+import org.springframework.security.config.annotation.web.builders.HttpSecurity;
+import org.springframework.security.config.annotation.web.builders.WebSecurity;
+import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity;
+import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter;
+import org.springframework.security.crypto.factory.PasswordEncoderFactories;
+import org.springframework.security.crypto.password.PasswordEncoder;
+
+import com.ym.mec.auth.config.provider.service.BaseUserDetailsService;
+import com.ym.mec.auth.filter.BaseAuthenticationFilter;
+import com.ym.mec.auth.handler.BaseAuthenticationFailureEvenHandler;
+import com.ym.mec.auth.handler.BaseAuthenticationSuccessEventHandler;
+
+@Configuration
+@EnableWebSecurity
+@EnableGlobalMethodSecurity(prePostEnabled = true)
+public class WebSecurityConfig extends WebSecurityConfigurerAdapter {
+
+	@Autowired
+	private BaseUserDetailsService baseUserDetailsService;
+
+	@Override
+	protected void configure(AuthenticationManagerBuilder auth) throws Exception {
+		auth.authenticationProvider(daoAuthenticationProvider());
+	}
+
+	@Override
+	protected void configure(HttpSecurity http) throws Exception {
+
+		// 表单登录 方式
+		http
+		// .addFilterAt(getBaseAuthenticationFilter(), UsernamePasswordAuthenticationFilter.class)
+		.formLogin().loginPage("/loginIn").and()
+		// 请求授权
+				.authorizeRequests()
+				// 不需要权限认证的url
+				.antMatchers("/oauth/**").permitAll()
+				// 任何请求
+				.anyRequest()
+				// 需要身份认证
+				.authenticated().and()
+				// 关闭跨站请求防护
+				.csrf().disable();
+	}
+
+	@Override
+	public void configure(WebSecurity web) throws Exception {
+		web.ignoring().antMatchers("/loginIn", "/refreshToken","/v2/api-docs");
+	}
+
+	@Bean
+	@Override
+	public AuthenticationManager authenticationManagerBean() throws Exception {
+		return super.authenticationManagerBean();
+	}
+
+	@Bean
+	public PasswordEncoder passwordEncoder() {
+		return PasswordEncoderFactories.createDelegatingPasswordEncoder();
+	}
+
+	@Bean
+	public DaoAuthenticationProvider daoAuthenticationProvider() {
+		DaoAuthenticationProvider provider = new DaoAuthenticationProvider();
+		// 设置userDetailsService
+		provider.setUserDetailsService(baseUserDetailsService);
+		// 禁止隐藏用户未找到异常
+		provider.setHideUserNotFoundExceptions(false);
+		// 使用BCrypt进行密码的hash
+		provider.setPasswordEncoder(passwordEncoder());
+		return provider;
+	}
+
+	@Bean
+	public BaseAuthenticationFilter getBaseAuthenticationFilter() throws Exception {
+		BaseAuthenticationFilter filter = new BaseAuthenticationFilter();
+		filter.setAuthenticationManager(authenticationManagerBean());
+		filter.setAuthenticationSuccessHandler(new BaseAuthenticationSuccessEventHandler());
+		filter.setAuthenticationFailureHandler(new BaseAuthenticationFailureEvenHandler());
+		return filter;
+	}
+
+}

+ 44 - 0
mec-auth/mec-auth-server/src/main/java/com/ym/mec/auth/config/provider/service/BaseUserDetailsService.java

@@ -0,0 +1,44 @@
+package com.ym.mec.auth.config.provider.service;
+
+import java.util.List;
+
+import org.apache.commons.lang3.StringUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.security.core.GrantedAuthority;
+import org.springframework.security.core.authority.AuthorityUtils;
+import org.springframework.security.core.userdetails.User;
+import org.springframework.security.core.userdetails.UserDetails;
+import org.springframework.security.core.userdetails.UserDetailsService;
+import org.springframework.security.core.userdetails.UsernameNotFoundException;
+import org.springframework.security.crypto.password.PasswordEncoder;
+import org.springframework.stereotype.Service;
+
+import com.ym.mec.auth.api.dto.SysUserInfo;
+import com.ym.mec.auth.api.entity.SysUser;
+import com.ym.mec.auth.service.SysUserService;
+
+@Service
+public class BaseUserDetailsService implements UserDetailsService {
+
+	@Autowired
+	private PasswordEncoder passwordEncoder;
+
+	@Autowired
+	private SysUserService sysUserService;
+
+	private final String BCRYPT = "{bcrypt}";
+
+	@Override
+	public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException {
+
+		SysUserInfo userInfo = sysUserService.queryUserInfoByUsername(username);
+
+		List<GrantedAuthority> authorities = AuthorityUtils.createAuthorityList(userInfo.getPermissions());
+
+		SysUser sysUser = userInfo.getSysUser();
+
+		return new User(username, BCRYPT + sysUser.getPassword(), StringUtils.equals(sysUser.getLockFlag(), "0"), true, true, true,
+				authorities);
+	}
+
+}

+ 49 - 0
mec-auth/mec-auth-server/src/main/java/com/ym/mec/auth/config/token/PhoneAuthenticationToken.java

@@ -0,0 +1,49 @@
+package com.ym.mec.auth.config.token;
+
+import java.util.Collection;
+
+import org.springframework.security.authentication.AbstractAuthenticationToken;
+import org.springframework.security.core.GrantedAuthority;
+
+/**
+ * 手机验证码token
+ */
+public class PhoneAuthenticationToken extends AbstractAuthenticationToken {
+
+	private static final long serialVersionUID = 110L;
+	private final Object principal;
+
+	public PhoneAuthenticationToken(String mobile) {
+		super(null);
+		this.principal = mobile;
+		setAuthenticated(false);
+	}
+
+	public PhoneAuthenticationToken(Object principal, Collection<? extends GrantedAuthority> authorities) {
+		super(authorities);
+		this.principal = principal;
+		super.setAuthenticated(true);
+	}
+
+	public Object getPrincipal() {
+		return this.principal;
+	}
+
+	@Override
+	public Object getCredentials() {
+		return null;
+	}
+
+	public void setAuthenticated(boolean isAuthenticated) throws IllegalArgumentException {
+		if (isAuthenticated) {
+			throw new IllegalArgumentException("Cannot set this token to trusted - use constructor which takes a GrantedAuthority list instead");
+		}
+
+		super.setAuthenticated(false);
+	}
+
+	@Override
+	public void eraseCredentials() {
+		super.eraseCredentials();
+	}
+}

+ 96 - 0
mec-auth/mec-auth-server/src/main/java/com/ym/mec/auth/controller/TokenController.java

@@ -0,0 +1,96 @@
+package com.ym.mec.auth.controller;
+
+import java.io.IOException;
+import java.util.Base64;
+import java.util.Map;
+
+import org.apache.commons.lang3.StringUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.http.HttpEntity;
+import org.springframework.http.HttpHeaders;
+import org.springframework.http.HttpMethod;
+import org.springframework.http.MediaType;
+import org.springframework.http.ResponseEntity;
+import org.springframework.security.oauth2.common.OAuth2AccessToken;
+import org.springframework.security.oauth2.provider.token.DefaultTokenServices;
+import org.springframework.util.LinkedMultiValueMap;
+import org.springframework.util.MultiValueMap;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestHeader;
+import org.springframework.web.bind.annotation.RestController;
+import org.springframework.web.client.RestTemplate;
+
+import com.fasterxml.jackson.databind.ObjectMapper;
+import com.ym.mec.common.controller.BaseController;
+import com.ym.mec.common.entity.HttpResponseResult;
+
+@RestController
+public class TokenController extends BaseController {
+
+	@Autowired
+	private DefaultTokenServices tokenService;
+
+	@Autowired
+	private RestTemplate restTemplate;
+
+	@Autowired
+	private ObjectMapper objectMapper;
+
+	@PostMapping(value = "/loginIn")
+	// @PreAuthorize("hasAnyAuthority('sys_user_manage')")
+	public HttpResponseResult login(String username, String password, String clientId, String clientSecret) throws IOException {
+		String url = "http://auth-server/oauth/token";
+
+		String base64ClientCredentials = Base64.getEncoder().encodeToString((clientId + ":" + clientSecret).getBytes());
+
+		HttpHeaders headers = new HttpHeaders();
+		headers.add("Authorization", "Basic " + base64ClientCredentials);
+		headers.setContentType(MediaType.APPLICATION_FORM_URLENCODED);
+
+		MultiValueMap<String, String> params = new LinkedMultiValueMap<String, String>();
+		params.add("username", username);
+		params.add("password", password);
+		params.add("grant_type", "password");
+
+		HttpEntity<MultiValueMap<String, String>> entity = new HttpEntity<MultiValueMap<String, String>>(params, headers);
+
+		ResponseEntity<String> resp = restTemplate.exchange(url, HttpMethod.POST, entity, String.class);
+
+		return succeed(objectMapper.readValue(resp.getBody(), Map.class));
+	}
+
+	@PostMapping(value = "/refreshToken")
+	public HttpResponseResult refreshToken(String refreshToken, String clientId, String clientSecret) throws IOException {
+		String url = "http://auth-server/oauth/token";
+
+		String base64ClientCredentials = Base64.getEncoder().encodeToString((clientId + ":" + clientSecret).getBytes());
+
+		HttpHeaders headers = new HttpHeaders();
+		headers.add("Authorization", "Basic " + base64ClientCredentials);
+		headers.setContentType(MediaType.APPLICATION_FORM_URLENCODED);
+
+		MultiValueMap<String, String> params = new LinkedMultiValueMap<String, String>();
+		params.add("refresh_token", refreshToken);
+		params.add("grant_type", "refresh_token");
+
+		HttpEntity<MultiValueMap<String, String>> entity = new HttpEntity<MultiValueMap<String, String>>(params, headers);
+
+		ResponseEntity<String> resp = restTemplate.exchange(url, HttpMethod.POST, entity, String.class);
+
+		return succeed(objectMapper.readValue(resp.getBody(), Map.class));
+	}
+
+	@PostMapping(value = "exit")
+	public HttpResponseResult logout(@RequestHeader(value = HttpHeaders.AUTHORIZATION) String authHeader) {
+		if (StringUtils.isBlank(authHeader)) {
+			return failed("退出失败,token 为空");
+		}
+
+		String tokenValue = authHeader.replace(OAuth2AccessToken.BEARER_TYPE, StringUtils.EMPTY).trim();
+
+		tokenService.revokeToken(tokenValue);
+
+		return succeed("退出成功");
+	}
+
+}

+ 82 - 0
mec-auth/mec-auth-server/src/main/java/com/ym/mec/auth/controller/UserController.java

@@ -0,0 +1,82 @@
+package com.ym.mec.auth.controller;
+
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiImplicitParam;
+import io.swagger.annotations.ApiImplicitParams;
+import io.swagger.annotations.ApiOperation;
+import io.swagger.annotations.ApiParam;
+
+import java.util.Date;
+
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder;
+import org.springframework.web.bind.annotation.DeleteMapping;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.PathVariable;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.PutMapping;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+import com.ym.mec.auth.api.entity.SysUser;
+import com.ym.mec.auth.controller.queryInfo.SysUserQueryInfo;
+import com.ym.mec.auth.service.SysUserService;
+import com.ym.mec.common.controller.BaseController;
+
+@RestController()
+@RequestMapping("user")
+@Api(description = "会员服务")
+public class UserController extends BaseController {
+
+	@Autowired
+	private SysUserService sysUserService;
+
+	@ApiOperation("根据用户名查询用户信息接口")
+	@ApiImplicitParam(name = "username", value = "用户名", required = true, dataType = "String", paramType = "path")
+	@GetMapping("/{username}")
+	public Object getUser(@PathVariable("username") String username) {
+		return sysUserService.queryUserInfoByUsername(username);
+	}
+
+	@ApiOperation(value = "分页查询用户信息")
+	@ApiImplicitParams({ @ApiImplicitParam(name = "userType", value = "用户类型", required = false, dataType = "String"),
+			@ApiImplicitParam(name = "createStartDate", value = "开始注册时间", required = true, dataType = "String"),
+			@ApiImplicitParam(name = "createEndDate", value = "结束注册时间", required = true, dataType = "String") })
+	@GetMapping("/queryPage")
+	public Object queryPage(SysUserQueryInfo queryInfo) {
+		return succeed(sysUserService.queryPage(queryInfo));
+	}
+
+	@ApiOperation(value = "根据用户编号查询用户信息接口")
+	@GetMapping("/query/{id}")
+	public Object query(@ApiParam(value = "用户的昵称", required = true) @PathVariable("id") Integer id) {
+		return succeed(sysUserService.get(id));
+	}
+
+	@ApiOperation(value = "新增用户")
+	@PostMapping("/add")
+	public Object add(SysUser sysUser) {
+		Date date = new Date();
+		sysUser.setCreateTime(date);
+		sysUser.setUpdateTime(date);
+		sysUser.setPassword(new BCryptPasswordEncoder().encode(sysUser.getPassword()));
+		sysUserService.insert(sysUser);
+		return succeed();
+	}
+
+	@ApiOperation(value = "删除用户")
+	@DeleteMapping("/del/{id}")
+	public Object del(@ApiParam(value = "用户编号", required = true) @PathVariable("id") Integer id) {
+		return sysUserService.deleteById(id) ? succeed("删除成功") : failed("删除失败");
+	}
+
+	@ApiOperation(value = "修改用户")
+	@PutMapping("/update")
+	public Object update(SysUser sysUser) {
+		Date date = new Date();
+		sysUser.setUpdateTime(date);
+		sysUser.setPassword(new BCryptPasswordEncoder().encode(sysUser.getPassword()));
+		sysUserService.update(sysUser);
+		return succeed();
+	}
+}

+ 36 - 0
mec-auth/mec-auth-server/src/main/java/com/ym/mec/auth/controller/queryInfo/SysUserQueryInfo.java

@@ -0,0 +1,36 @@
+package com.ym.mec.auth.controller.queryInfo;
+
+import com.ym.mec.common.page.QueryInfo;
+
+public class SysUserQueryInfo extends QueryInfo {
+
+	private String userType;
+
+	private String createStartDate;
+
+	private String createEndDate;
+
+	public String getUserType() {
+		return userType;
+	}
+
+	public void setUserType(String userType) {
+		this.userType = userType;
+	}
+
+	public String getCreateStartDate() {
+		return createStartDate;
+	}
+
+	public void setCreateStartDate(String createStartDate) {
+		this.createStartDate = createStartDate;
+	}
+
+	public String getCreateEndDate() {
+		return createEndDate;
+	}
+
+	public void setCreateEndDate(String createEndDate) {
+		this.createEndDate = createEndDate;
+	}
+}

+ 9 - 0
mec-auth/mec-auth-server/src/main/java/com/ym/mec/auth/dal/dao/SysDeptDao.java

@@ -0,0 +1,9 @@
+package com.ym.mec.auth.dal.dao;
+
+import com.ym.mec.auth.api.entity.SysDept;
+import com.ym.mec.common.dal.BaseDAO;
+
+public interface SysDeptDao extends BaseDAO<Integer, SysDept> {
+
+	
+}

+ 9 - 0
mec-auth/mec-auth-server/src/main/java/com/ym/mec/auth/dal/dao/SysDeptRelationDao.java

@@ -0,0 +1,9 @@
+package com.ym.mec.auth.dal.dao;
+
+import com.ym.mec.auth.api.entity.SysDeptRelation;
+import com.ym.mec.common.dal.BaseDAO;
+
+public interface SysDeptRelationDao extends BaseDAO<Integer, SysDeptRelation> {
+
+	
+}

+ 9 - 0
mec-auth/mec-auth-server/src/main/java/com/ym/mec/auth/dal/dao/SysMenuDao.java

@@ -0,0 +1,9 @@
+package com.ym.mec.auth.dal.dao;
+
+import com.ym.mec.auth.api.entity.SysMenu;
+import com.ym.mec.common.dal.BaseDAO;
+
+public interface SysMenuDao extends BaseDAO<Integer, SysMenu> {
+
+	
+}

+ 9 - 0
mec-auth/mec-auth-server/src/main/java/com/ym/mec/auth/dal/dao/SysOauthClientDetailsDao.java

@@ -0,0 +1,9 @@
+package com.ym.mec.auth.dal.dao;
+
+import com.ym.mec.auth.api.entity.SysOauthClientDetails;
+import com.ym.mec.common.dal.BaseDAO;
+
+public interface SysOauthClientDetailsDao extends BaseDAO<String, SysOauthClientDetails> {
+
+	
+}

+ 9 - 0
mec-auth/mec-auth-server/src/main/java/com/ym/mec/auth/dal/dao/SysRoleDao.java

@@ -0,0 +1,9 @@
+package com.ym.mec.auth.dal.dao;
+
+import com.ym.mec.auth.api.entity.SysRole;
+import com.ym.mec.common.dal.BaseDAO;
+
+public interface SysRoleDao extends BaseDAO<Integer, SysRole> {
+
+	
+}

+ 9 - 0
mec-auth/mec-auth-server/src/main/java/com/ym/mec/auth/dal/dao/SysRoleDeptDao.java

@@ -0,0 +1,9 @@
+package com.ym.mec.auth.dal.dao;
+
+import com.ym.mec.auth.api.entity.SysRoleDept;
+import com.ym.mec.common.dal.BaseDAO;
+
+public interface SysRoleDeptDao extends BaseDAO<Integer, SysRoleDept> {
+
+	
+}

+ 16 - 0
mec-auth/mec-auth-server/src/main/java/com/ym/mec/auth/dal/dao/SysRoleMenuDao.java

@@ -0,0 +1,16 @@
+package com.ym.mec.auth.dal.dao;
+
+import java.util.List;
+
+import com.ym.mec.auth.api.entity.SysRoleMenu;
+import com.ym.mec.common.dal.BaseDAO;
+
+public interface SysRoleMenuDao extends BaseDAO<Integer, SysRoleMenu> {
+
+	/**
+	 * 根据角色查询权限列表
+	 * @param roleIdList
+	 * @return
+	 */
+	List<String> queryPermissionsByRoleId(Integer roleId);
+}

+ 21 - 0
mec-auth/mec-auth-server/src/main/java/com/ym/mec/auth/dal/dao/SysUserDao.java

@@ -0,0 +1,21 @@
+package com.ym.mec.auth.dal.dao;
+
+import com.ym.mec.auth.api.entity.SysUser;
+import com.ym.mec.common.dal.BaseDAO;
+
+public interface SysUserDao extends BaseDAO<Integer, SysUser> {
+
+	/**
+	 * 根据用户名查询对象
+	 * @param username
+	 * @return
+	 */
+	SysUser queryByUsername(String username);
+	
+	/**
+	 * 根据手机号查询对象
+	 * @param phone
+	 * @return
+	 */
+	SysUser queryByPhone(String phone);
+}

+ 16 - 0
mec-auth/mec-auth-server/src/main/java/com/ym/mec/auth/dal/dao/SysUserRoleDao.java

@@ -0,0 +1,16 @@
+package com.ym.mec.auth.dal.dao;
+
+import java.util.List;
+
+import com.ym.mec.auth.api.entity.SysUserRole;
+import com.ym.mec.common.dal.BaseDAO;
+
+public interface SysUserRoleDao extends BaseDAO<Integer, SysUserRole> {
+
+	/**
+	 * 查询指定用户具有的角色编号
+	 * @param userId 用户编号
+	 * @return
+	 */
+	List<Integer> queryRoleIdListByUserId(Integer userId);
+}

+ 25 - 0
mec-auth/mec-auth-server/src/main/java/com/ym/mec/auth/dal/dao/UserLoginDao.java

@@ -0,0 +1,25 @@
+package com.ym.mec.auth.dal.dao;
+
+import java.util.Date;
+
+import org.apache.ibatis.annotations.Param;
+
+import com.ym.mec.auth.dal.model.UserLogin;
+import com.ym.mec.common.dal.BaseDAO;
+
+public interface UserLoginDao extends BaseDAO<Long, UserLogin> {
+    /**
+     * 获取用户最后登录时间
+     * @param userId
+     * @return
+     */
+    Date getLastLoginTimeByUid(Long userId);
+
+    /**
+     * 获取用户登录次数
+     * @param userId
+     * @param day  天数
+     * @return
+     */
+    int getUserLoginCount(@Param("userId") Long userId, @Param("day") int day);
+}

+ 24 - 0
mec-auth/mec-auth-server/src/main/java/com/ym/mec/auth/dal/dao/UserLoginLogDao.java

@@ -0,0 +1,24 @@
+package com.ym.mec.auth.dal.dao;
+
+import org.apache.ibatis.annotations.Param;
+
+import com.ym.mec.auth.dal.model.UserLoginLog;
+import com.ym.mec.common.dal.BaseDAO;
+
+public interface UserLoginLogDao extends BaseDAO<Long, UserLoginLog> {
+
+	/**
+	 * 查询用户今日已登陆次数
+	 * @param userId
+	 * @return
+	 */
+	public int queryLoginedTimesOfToday(Long userId);
+
+	/**
+	 * 获取多少天内用户登陆次数
+	 * @param userId
+	 * @param day
+	 * @return
+	 */
+    int findLoginCount(@Param("userId") Long userId, @Param("day") int day);
+}

+ 41 - 0
mec-auth/mec-auth-server/src/main/java/com/ym/mec/auth/dal/enums/UserGenderEnum.java

@@ -0,0 +1,41 @@
+package com.ym.mec.auth.dal.enums;
+
+import com.ym.mec.common.dal.base.BaseIntEnum;
+
+/** 
+ * @author sunzl 
+ * 2015年9月7日 下午1:57:10 
+ * 会员性别枚举
+ */
+public enum UserGenderEnum implements BaseIntEnum<UserGenderEnum> {
+
+	WOMAN(0, "女"), MAN(1, "男");
+
+	private int code;
+
+	private String description;
+
+	private UserGenderEnum(int code, String description) {
+		this.code = code;
+		this.description = description;
+	}
+
+	public static UserGenderEnum get(int code) {
+		for (UserGenderEnum info : UserGenderEnum.values()) {
+			if (info.getCode() == code) {
+				return info;
+			}
+		}
+		return null;
+	}
+
+	public String getDescription() {
+		return description;
+	}
+
+	@Override
+	public int getCode() {
+		return code;
+	}
+
+}

+ 50 - 0
mec-auth/mec-auth-server/src/main/java/com/ym/mec/auth/dal/enums/UserStatus.java

@@ -0,0 +1,50 @@
+package com.ym.mec.auth.dal.enums;
+
+import com.ym.mec.common.dal.base.BaseIntEnum;
+
+/** 
+ * @author sunzl 
+ * 2015年8月25日 下午4:19:00 
+ * 会员状态枚举类
+ */
+public enum UserStatus implements BaseIntEnum<UserStatus>{
+	
+	NOACTIVATED(0,"未激活"),
+	CANCELLED(-1,"注销"),
+	NORMAL(1,"正常"),
+	LOCKED(2,"锁定");
+	
+	private int code;
+	
+	private UserStatus(int code, String remark) {
+		this.code = code;
+		this.remark = remark;
+	}
+
+	private String remark;
+
+	public int getCode() {
+		return code;
+	}
+
+	public void setCode(int code) {
+		this.code = code;
+	}
+
+	public String getRemark() {
+		return remark;
+	}
+
+	public void setRemark(String remark) {
+		this.remark = remark;
+	}
+	
+	public static UserStatus codeOf(int code) {
+		for (UserStatus userStatus : UserStatus.values()) {
+			if (code == userStatus.getCode()) {
+				return userStatus;
+			}
+		}
+		return null;
+	}
+}

+ 106 - 0
mec-auth/mec-auth-server/src/main/java/com/ym/mec/auth/dal/model/UserLogin.java

@@ -0,0 +1,106 @@
+package com.ym.mec.auth.dal.model;
+
+/**
+ * This file is auto generated by Ant & FreeMarker.
+ * DO NOT MODIFY IT.All modified content will be lost when next auto generate. 
+ * 这个文件是用ANT和FreeMarker自动生成的。
+ * 不要修改此文件。所有改动将在下次重新自动生成时丢失。
+ */
+/**
+ * 对应数据库表(p2p_user_login):
+ */
+public class UserLogin {
+
+	/**  */
+	private Long userId;
+	
+	/** 用户登录总次数 */
+	private Integer loginCount;
+	
+	/** 最后登录时间 */
+	private java.util.Date lastLoginTime;
+	
+	/** 最后登录IP */
+	private String lastLoginIp;
+	
+	/** 连续登陆失败的次数 */
+	private Integer failCount;
+	
+	/** 锁定时间 单位:分钟(超过锁定时间自动解锁) */
+	private Integer lockTime;
+	
+	/** 锁定日期 */
+	private java.util.Date lockDate;
+	
+	public void setUserId(Long userId){
+		this.userId = userId;
+	}
+	
+	public Long getUserId(){
+		return this.userId;
+	}
+			
+	public void setLoginCount(Integer loginCount){
+		this.loginCount = loginCount;
+	}
+	
+	public Integer getLoginCount(){
+		return this.loginCount;
+	}
+			
+	public void setLastLoginTime(java.util.Date lastLoginTime){
+		this.lastLoginTime = lastLoginTime;
+	}
+	
+	public java.util.Date getLastLoginTime(){
+		return this.lastLoginTime;
+	}
+			
+	public void setLastLoginIp(String lastLoginIp){
+		this.lastLoginIp = lastLoginIp;
+	}
+	
+	public String getLastLoginIp(){
+		return this.lastLoginIp;
+	}
+			
+	public void setFailCount(Integer failCount){
+		this.failCount = failCount;
+	}
+	
+	public Integer getFailCount(){
+		return this.failCount;
+	}
+			
+	public void setLockTime(Integer lockTime){
+		this.lockTime = lockTime;
+	}
+	
+	public Integer getLockTime(){
+		return this.lockTime;
+	}
+			
+	public void setLockDate(java.util.Date lockDate){
+		this.lockDate = lockDate;
+	}
+	
+	public java.util.Date getLockDate(){
+		return this.lockDate;
+	}
+			
+	public String toString(){
+		StringBuilder buf = new StringBuilder();
+		buf.append("UserLogin [");
+		buf.append("userId=").append(userId).append(",");
+		buf.append("loginCount=").append(loginCount).append(",");
+		buf.append("lastLoginTime=").append(lastLoginTime).append(",");
+		buf.append("lastLoginIp=").append(lastLoginIp).append(",");
+		buf.append("failCount=").append(failCount).append(",");
+		buf.append("lockTime=").append(lockTime).append(",");
+		buf.append("lockDate=").append(lockDate).append(",");
+		buf.setLength(buf.length()-1);
+		buf.append("]");
+		return buf.toString();
+	}
+
+}

+ 65 - 0
mec-auth/mec-auth-server/src/main/java/com/ym/mec/auth/dal/model/UserLoginLog.java

@@ -0,0 +1,65 @@
+package com.ym.mec.auth.dal.model;
+
+import org.apache.commons.lang3.builder.ToStringBuilder;
+
+import com.ym.mec.common.enums.AccessSource;
+
+/**
+ * This file is auto generated by Ant & FreeMarker.
+ * DO NOT MODIFY IT.All modified content will be lost when next auto generate. 
+ * 这个文件是用ANT和FreeMarker自动生成的。
+ * 不要修改此文件。所有改动将在下次重新自动生成时丢失。
+ */
+/**
+ * 对应数据库表(p2p_user_login_log):
+ */
+public class UserLoginLog {
+
+	/**  */
+	private Long userId;
+
+	/**  */
+	private String loginIp;
+
+	/**  */
+	private java.util.Date loginTime;
+
+	private AccessSource source;
+
+	public void setUserId(Long userId) {
+		this.userId = userId;
+	}
+
+	public Long getUserId() {
+		return this.userId;
+	}
+
+	public void setLoginIp(String loginIp) {
+		this.loginIp = loginIp;
+	}
+
+	public String getLoginIp() {
+		return this.loginIp;
+	}
+
+	public void setLoginTime(java.util.Date loginTime) {
+		this.loginTime = loginTime;
+	}
+
+	public java.util.Date getLoginTime() {
+		return this.loginTime;
+	}
+
+	public AccessSource getSource() {
+		return source;
+	}
+
+	public void setSource(AccessSource source) {
+		this.source = source;
+	}
+
+	public String toString() {
+		return ToStringBuilder.reflectionToString(this);
+	}
+
+}

+ 150 - 0
mec-auth/mec-auth-server/src/main/java/com/ym/mec/auth/filter/BaseAuthenticationFilter.java

@@ -0,0 +1,150 @@
+package com.ym.mec.auth.filter;
+
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+
+import org.springframework.security.authentication.AuthenticationServiceException;
+import org.springframework.security.authentication.UsernamePasswordAuthenticationToken;
+import org.springframework.security.core.Authentication;
+import org.springframework.security.core.AuthenticationException;
+import org.springframework.security.web.authentication.AbstractAuthenticationProcessingFilter;
+import org.springframework.security.web.util.matcher.AntPathRequestMatcher;
+import org.springframework.util.Assert;
+
+public class BaseAuthenticationFilter extends AbstractAuthenticationProcessingFilter {
+
+	// ~ Static fields/initializers
+	// =====================================================================================
+
+	private String usernameParameter = "username";
+	private String passwordParameter = "password";
+	private boolean postOnly = true;
+
+	// ~ Constructors
+	// ===================================================================================================
+
+	public BaseAuthenticationFilter() {
+		super(new AntPathRequestMatcher("/login", "POST"));
+	}
+
+	// ~ Methods
+	// ========================================================================================================
+
+	public Authentication attemptAuthentication(HttpServletRequest request,
+			HttpServletResponse response) throws AuthenticationException {
+		if (postOnly && !request.getMethod().equals("POST")) {
+			throw new AuthenticationServiceException(
+					"Authentication method not supported: " + request.getMethod());
+		}
+
+		String username = obtainUsername(request);
+		String password = obtainPassword(request);
+
+		if (username == null) {
+			username = "";
+		}
+
+		if (password == null) {
+			password = "";
+		}
+
+		username = username.trim();
+
+		UsernamePasswordAuthenticationToken authRequest = new UsernamePasswordAuthenticationToken(
+				username, password);
+
+		// Allow subclasses to set the "details" property
+		setDetails(request, authRequest);
+
+		return this.getAuthenticationManager().authenticate(authRequest);
+	}
+
+	/**
+	 * Enables subclasses to override the composition of the password, such as by
+	 * including additional values and a separator.
+	 * <p>
+	 * This might be used for example if a postcode/zipcode was required in addition to
+	 * the password. A delimiter such as a pipe (|) should be used to separate the
+	 * password and extended value(s). The <code>AuthenticationDao</code> will need to
+	 * generate the expected password in a corresponding manner.
+	 * </p>
+	 *
+	 * @param request so that request attributes can be retrieved
+	 *
+	 * @return the password that will be presented in the <code>Authentication</code>
+	 * request token to the <code>AuthenticationManager</code>
+	 */
+	protected String obtainPassword(HttpServletRequest request) {
+		return request.getParameter(passwordParameter);
+	}
+
+	/**
+	 * Enables subclasses to override the composition of the username, such as by
+	 * including additional values and a separator.
+	 *
+	 * @param request so that request attributes can be retrieved
+	 *
+	 * @return the username that will be presented in the <code>Authentication</code>
+	 * request token to the <code>AuthenticationManager</code>
+	 */
+	protected String obtainUsername(HttpServletRequest request) {
+		return request.getParameter(usernameParameter);
+	}
+
+	/**
+	 * Provided so that subclasses may configure what is put into the authentication
+	 * request's details property.
+	 *
+	 * @param request that an authentication request is being created for
+	 * @param authRequest the authentication request object that should have its details
+	 * set
+	 */
+	protected void setDetails(HttpServletRequest request,
+			UsernamePasswordAuthenticationToken authRequest) {
+		authRequest.setDetails(authenticationDetailsSource.buildDetails(request));
+	}
+
+	/**
+	 * Sets the parameter name which will be used to obtain the username from the login
+	 * request.
+	 *
+	 * @param usernameParameter the parameter name. Defaults to "username".
+	 */
+	public void setUsernameParameter(String usernameParameter) {
+		Assert.hasText(usernameParameter, "Username parameter must not be empty or null");
+		this.usernameParameter = usernameParameter;
+	}
+
+	/**
+	 * Sets the parameter name which will be used to obtain the password from the login
+	 * request..
+	 *
+	 * @param passwordParameter the parameter name. Defaults to "password".
+	 */
+	public void setPasswordParameter(String passwordParameter) {
+		Assert.hasText(passwordParameter, "Password parameter must not be empty or null");
+		this.passwordParameter = passwordParameter;
+	}
+
+	/**
+	 * Defines whether only HTTP POST requests will be allowed by this filter. If set to
+	 * true, and an authentication request is received which is not a POST request, an
+	 * exception will be raised immediately and authentication will not be attempted. The
+	 * <tt>unsuccessfulAuthentication()</tt> method will be called as if handling a failed
+	 * authentication.
+	 * <p>
+	 * Defaults to <tt>true</tt> but may be overridden by subclasses.
+	 */
+	public void setPostOnly(boolean postOnly) {
+		this.postOnly = postOnly;
+	}
+
+	public final String getUsernameParameter() {
+		return usernameParameter;
+	}
+
+	public final String getPasswordParameter() {
+		return passwordParameter;
+	}
+
+}

+ 27 - 0
mec-auth/mec-auth-server/src/main/java/com/ym/mec/auth/handler/BaseAuthenticationFailureEvenHandler.java

@@ -0,0 +1,27 @@
+package com.ym.mec.auth.handler;
+
+import java.io.IOException;
+
+import javax.servlet.ServletException;
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.security.core.AuthenticationException;
+import org.springframework.security.web.authentication.ExceptionMappingAuthenticationFailureHandler;
+
+public class BaseAuthenticationFailureEvenHandler extends ExceptionMappingAuthenticationFailureHandler {
+
+	private final static Logger logger = LoggerFactory.getLogger(BaseAuthenticationFailureEvenHandler.class);
+
+	@Override
+	public void onAuthenticationFailure(HttpServletRequest request, HttpServletResponse response, AuthenticationException authenticationException)
+			throws IOException, ServletException {
+
+		Object username = request.getAttribute("SPRING_SECURITY_LAST_USERNAME_KEY");
+
+		logger.info("用户:{} 登录失败,异常:{}", username, authenticationException.getLocalizedMessage());
+		super.onAuthenticationFailure(request, response, authenticationException);
+	}
+}

+ 108 - 0
mec-auth/mec-auth-server/src/main/java/com/ym/mec/auth/handler/BaseAuthenticationSuccessEventHandler.java

@@ -0,0 +1,108 @@
+package com.ym.mec.auth.handler;
+
+import java.io.IOException;
+import java.io.PrintWriter;
+import java.util.Base64;
+import java.util.HashMap;
+
+import javax.servlet.ServletException;
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+
+import org.apache.http.HttpStatus;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.security.authentication.BadCredentialsException;
+import org.springframework.security.core.Authentication;
+import org.springframework.security.oauth2.common.OAuth2AccessToken;
+import org.springframework.security.oauth2.common.exceptions.UnapprovedClientAuthenticationException;
+import org.springframework.security.oauth2.provider.ClientDetails;
+import org.springframework.security.oauth2.provider.ClientDetailsService;
+import org.springframework.security.oauth2.provider.OAuth2Authentication;
+import org.springframework.security.oauth2.provider.OAuth2Request;
+import org.springframework.security.oauth2.provider.TokenRequest;
+import org.springframework.security.oauth2.provider.token.AuthorizationServerTokenServices;
+import org.springframework.security.web.authentication.SavedRequestAwareAuthenticationSuccessHandler;
+
+import com.fasterxml.jackson.databind.ObjectMapper;
+import com.ym.mec.common.constant.CommonConstants;
+import com.ym.mec.common.entity.HttpResponseResult;
+
+public class BaseAuthenticationSuccessEventHandler extends SavedRequestAwareAuthenticationSuccessHandler {
+
+	private final static Logger logger = LoggerFactory.getLogger(BaseAuthenticationSuccessEventHandler.class);
+
+	@Autowired
+	private ClientDetailsService clientDetailsService;
+
+	@Autowired
+	private AuthorizationServerTokenServices defaultAuthorizationServerTokenServices;
+
+	@Autowired
+	private ObjectMapper objectMapper;
+
+	@Override
+	public void onAuthenticationSuccess(HttpServletRequest request, HttpServletResponse response, Authentication authentication) throws ServletException,
+			IOException {
+		logger.info("用户:{} 登录成功", authentication.getPrincipal());
+
+		String header = request.getHeader("Authorization");
+
+		if (header == null || !header.startsWith(CommonConstants.BASIC)) {
+			throw new UnapprovedClientAuthenticationException("请求头中client信息为空");
+		}
+
+		try {
+			String[] tokens = extractAndDecodeHeader(header);
+			String clientId = tokens[0];
+			// String clientSecret = tokens[1];
+
+			ClientDetails clientDetails = clientDetailsService.loadClientByClientId(clientId);
+			TokenRequest tokenRequest = new TokenRequest(new HashMap<String, String>(), clientId, clientDetails.getScope(), "password");
+			OAuth2Request oAuth2Request = tokenRequest.createOAuth2Request(clientDetails);
+
+			OAuth2Authentication oAuth2Authentication = new OAuth2Authentication(oAuth2Request, authentication);
+			OAuth2AccessToken oAuth2AccessToken = defaultAuthorizationServerTokenServices.createAccessToken(oAuth2Authentication);
+			logger.info("获取token 成功:{}", oAuth2AccessToken.getValue());
+
+			response.setCharacterEncoding("utf-8");
+			response.setContentType("application/json; charset=utf-8");
+			PrintWriter printWriter = response.getWriter();
+
+			HttpResponseResult result = new HttpResponseResult(true, HttpStatus.SC_OK, oAuth2AccessToken, "");
+
+			printWriter.append(objectMapper.writeValueAsString(result));
+			printWriter.flush();
+			printWriter.close();
+		} catch (IOException e) {
+			throw new BadCredentialsException("Failed to decode basic authentication token");
+		}
+	}
+
+	/**
+	 * Decodes the header into a username and password.
+	 *
+	 * @throws BadCredentialsException if the Basic header is not present or is not valid
+	 *                                 Base64
+	 */
+	private String[] extractAndDecodeHeader(String header) throws IOException {
+
+		byte[] base64Token = header.substring(6).getBytes("UTF-8");
+		byte[] decoded;
+		try {
+			decoded = Base64.getDecoder().decode(base64Token);
+		} catch (IllegalArgumentException e) {
+			throw new BadCredentialsException("Failed to decode basic authentication token");
+		}
+
+		String token = new String(decoded, "utf-8");
+
+		int delim = token.indexOf(":");
+
+		if (delim == -1) {
+			throw new BadCredentialsException("Invalid basic authentication token");
+		}
+		return new String[] { token.substring(0, delim), token.substring(delim + 1) };
+	}
+}

+ 8 - 0
mec-auth/mec-auth-server/src/main/java/com/ym/mec/auth/service/SysDeptRelationService.java

@@ -0,0 +1,8 @@
+package com.ym.mec.auth.service;
+
+import com.ym.mec.auth.api.entity.SysDeptRelation;
+import com.ym.mec.common.service.BaseService;
+
+public interface SysDeptRelationService extends BaseService<Integer, SysDeptRelation> {
+
+}

+ 8 - 0
mec-auth/mec-auth-server/src/main/java/com/ym/mec/auth/service/SysDeptService.java

@@ -0,0 +1,8 @@
+package com.ym.mec.auth.service;
+
+import com.ym.mec.auth.api.entity.SysDept;
+import com.ym.mec.common.service.BaseService;
+
+public interface SysDeptService extends BaseService<Integer, SysDept> {
+
+}

+ 8 - 0
mec-auth/mec-auth-server/src/main/java/com/ym/mec/auth/service/SysMenuService.java

@@ -0,0 +1,8 @@
+package com.ym.mec.auth.service;
+
+import com.ym.mec.auth.api.entity.SysMenu;
+import com.ym.mec.common.service.BaseService;
+
+public interface SysMenuService extends BaseService<Integer, SysMenu> {
+
+}

+ 8 - 0
mec-auth/mec-auth-server/src/main/java/com/ym/mec/auth/service/SysOauthClientDetailsService.java

@@ -0,0 +1,8 @@
+package com.ym.mec.auth.service;
+
+import com.ym.mec.auth.api.entity.SysOauthClientDetails;
+import com.ym.mec.common.service.BaseService;
+
+public interface SysOauthClientDetailsService extends BaseService<String, SysOauthClientDetails> {
+
+}

+ 8 - 0
mec-auth/mec-auth-server/src/main/java/com/ym/mec/auth/service/SysRoleDeptService.java

@@ -0,0 +1,8 @@
+package com.ym.mec.auth.service;
+
+import com.ym.mec.auth.api.entity.SysRoleDept;
+import com.ym.mec.common.service.BaseService;
+
+public interface SysRoleDeptService extends BaseService<Integer, SysRoleDept> {
+
+}

+ 23 - 0
mec-auth/mec-auth-server/src/main/java/com/ym/mec/auth/service/SysRoleMenuService.java

@@ -0,0 +1,23 @@
+package com.ym.mec.auth.service;
+
+import java.util.List;
+
+import com.ym.mec.auth.api.entity.SysRoleMenu;
+import com.ym.mec.common.service.BaseService;
+
+public interface SysRoleMenuService extends BaseService<Integer, SysRoleMenu> {
+
+	/**
+	 * 根据角色查询权限列表
+	 * @param roleId
+	 * @return
+	 */
+	List<String> queryPermissionsByRoleId(Integer roleId);
+
+	/**
+	 * 根据角色查询权限列表
+	 * @param roleIdList
+	 * @return
+	 */
+	List<String> queryPermissionsByRoleIdList(List<Integer> roleIdList);
+}

+ 8 - 0
mec-auth/mec-auth-server/src/main/java/com/ym/mec/auth/service/SysRoleService.java

@@ -0,0 +1,8 @@
+package com.ym.mec.auth.service;
+
+import com.ym.mec.auth.api.entity.SysRole;
+import com.ym.mec.common.service.BaseService;
+
+public interface SysRoleService extends BaseService<Integer, SysRole> {
+
+}

+ 16 - 0
mec-auth/mec-auth-server/src/main/java/com/ym/mec/auth/service/SysUserRoleService.java

@@ -0,0 +1,16 @@
+package com.ym.mec.auth.service;
+
+import java.util.List;
+
+import com.ym.mec.auth.api.entity.SysUserRole;
+import com.ym.mec.common.service.BaseService;
+
+public interface SysUserRoleService extends BaseService<Integer, SysUserRole> {
+
+	/**
+	 * 查询指定用户具有的角色编号
+	 * @param userId 用户编号
+	 * @return
+	 */
+	List<Integer> queryRoleIdListByUserId(Integer userId);
+}

+ 44 - 0
mec-auth/mec-auth-server/src/main/java/com/ym/mec/auth/service/SysUserService.java

@@ -0,0 +1,44 @@
+package com.ym.mec.auth.service;
+
+import com.ym.mec.auth.api.dto.SysUserInfo;
+import com.ym.mec.auth.api.entity.SysUser;
+import com.ym.mec.common.service.BaseService;
+
+public interface SysUserService extends BaseService<Integer, SysUser> {
+
+	/**
+	 * 根据用户名查询对象
+	 * @param username
+	 * @return
+	 */
+	SysUser queryByUsername(String username);
+
+	/**
+	 * 根据手机号查询对象
+	 * @param phone
+	 * @return
+	 */
+	SysUser queryByPhone(String phone);
+
+	/**
+	 * 根据用户名获取系统用户详细信息
+	 * @param username
+	 * @return
+	 */
+	SysUserInfo queryUserInfoByUsername(String username);
+
+	/**
+	 * 根据手机号获取系统用户详细信息
+	 * @param phone
+	 * @return
+	 */
+	SysUserInfo queryUserInfoByPhone(String phone);
+
+	/**
+	 * 删除指定用户
+	 * @param id
+	 * @return
+	 */
+	boolean deleteById(Integer id);
+
+}

+ 23 - 0
mec-auth/mec-auth-server/src/main/java/com/ym/mec/auth/service/impl/SysDeptRelationServiceImpl.java

@@ -0,0 +1,23 @@
+package com.ym.mec.auth.service.impl;
+
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+import com.ym.mec.auth.api.entity.SysDeptRelation;
+import com.ym.mec.auth.dal.dao.SysDeptRelationDao;
+import com.ym.mec.auth.service.SysDeptRelationService;
+import com.ym.mec.common.dal.BaseDAO;
+import com.ym.mec.common.service.impl.BaseServiceImpl;
+
+@Service
+public class SysDeptRelationServiceImpl extends BaseServiceImpl<Integer, SysDeptRelation> implements SysDeptRelationService {
+
+	@Autowired
+	private SysDeptRelationDao sysDeptRelationDao;
+
+	@Override
+	public BaseDAO<Integer, SysDeptRelation> getDAO() {
+		return sysDeptRelationDao;
+	}
+
+}

+ 23 - 0
mec-auth/mec-auth-server/src/main/java/com/ym/mec/auth/service/impl/SysDeptServiceImpl.java

@@ -0,0 +1,23 @@
+package com.ym.mec.auth.service.impl;
+
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+import com.ym.mec.auth.api.entity.SysDept;
+import com.ym.mec.auth.dal.dao.SysDeptDao;
+import com.ym.mec.auth.service.SysDeptService;
+import com.ym.mec.common.dal.BaseDAO;
+import com.ym.mec.common.service.impl.BaseServiceImpl;
+
+@Service
+public class SysDeptServiceImpl extends BaseServiceImpl<Integer, SysDept>  implements SysDeptService {
+	
+	@Autowired
+	private SysDeptDao sysDeptDao;
+
+	@Override
+	public BaseDAO<Integer, SysDept> getDAO() {
+		return sysDeptDao;
+	}
+	
+}

+ 23 - 0
mec-auth/mec-auth-server/src/main/java/com/ym/mec/auth/service/impl/SysMenuServiceImpl.java

@@ -0,0 +1,23 @@
+package com.ym.mec.auth.service.impl;
+
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+import com.ym.mec.auth.api.entity.SysMenu;
+import com.ym.mec.auth.dal.dao.SysMenuDao;
+import com.ym.mec.auth.service.SysMenuService;
+import com.ym.mec.common.dal.BaseDAO;
+import com.ym.mec.common.service.impl.BaseServiceImpl;
+
+@Service
+public class SysMenuServiceImpl extends BaseServiceImpl<Integer, SysMenu>  implements SysMenuService {
+	
+	@Autowired
+	private SysMenuDao sysMenuDao;
+
+	@Override
+	public BaseDAO<Integer, SysMenu> getDAO() {
+		return sysMenuDao;
+	}
+	
+}

+ 23 - 0
mec-auth/mec-auth-server/src/main/java/com/ym/mec/auth/service/impl/SysOauthClientDetailsServiceImpl.java

@@ -0,0 +1,23 @@
+package com.ym.mec.auth.service.impl;
+
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+import com.ym.mec.auth.api.entity.SysOauthClientDetails;
+import com.ym.mec.auth.dal.dao.SysOauthClientDetailsDao;
+import com.ym.mec.auth.service.SysOauthClientDetailsService;
+import com.ym.mec.common.dal.BaseDAO;
+import com.ym.mec.common.service.impl.BaseServiceImpl;
+
+@Service
+public class SysOauthClientDetailsServiceImpl extends BaseServiceImpl<String, SysOauthClientDetails>  implements SysOauthClientDetailsService {
+	
+	@Autowired
+	private SysOauthClientDetailsDao sysOauthClientDetailsDao;
+
+	@Override
+	public BaseDAO<String, SysOauthClientDetails> getDAO() {
+		return sysOauthClientDetailsDao;
+	}
+	
+}

+ 23 - 0
mec-auth/mec-auth-server/src/main/java/com/ym/mec/auth/service/impl/SysRoleDeptServiceImpl.java

@@ -0,0 +1,23 @@
+package com.ym.mec.auth.service.impl;
+
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+import com.ym.mec.auth.api.entity.SysRoleDept;
+import com.ym.mec.auth.dal.dao.SysRoleDeptDao;
+import com.ym.mec.auth.service.SysRoleDeptService;
+import com.ym.mec.common.dal.BaseDAO;
+import com.ym.mec.common.service.impl.BaseServiceImpl;
+
+@Service
+public class SysRoleDeptServiceImpl extends BaseServiceImpl<Integer, SysRoleDept>  implements SysRoleDeptService {
+	
+	@Autowired
+	private SysRoleDeptDao sysRoleDeptDao;
+
+	@Override
+	public BaseDAO<Integer, SysRoleDept> getDAO() {
+		return sysRoleDeptDao;
+	}
+	
+}

+ 42 - 0
mec-auth/mec-auth-server/src/main/java/com/ym/mec/auth/service/impl/SysRoleMenuServiceImpl.java

@@ -0,0 +1,42 @@
+package com.ym.mec.auth.service.impl;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+import com.ym.mec.auth.api.entity.SysRoleMenu;
+import com.ym.mec.auth.dal.dao.SysRoleMenuDao;
+import com.ym.mec.auth.service.SysRoleMenuService;
+import com.ym.mec.common.dal.BaseDAO;
+import com.ym.mec.common.service.impl.BaseServiceImpl;
+
+@Service
+public class SysRoleMenuServiceImpl extends BaseServiceImpl<Integer, SysRoleMenu> implements SysRoleMenuService {
+
+	@Autowired
+	private SysRoleMenuDao sysRoleMenuDao;
+
+	@Override
+	public BaseDAO<Integer, SysRoleMenu> getDAO() {
+		return sysRoleMenuDao;
+	}
+
+	@Override
+	public List<String> queryPermissionsByRoleId(Integer roleId) {
+		return sysRoleMenuDao.queryPermissionsByRoleId(roleId);
+	}
+
+	@Override
+	public List<String> queryPermissionsByRoleIdList(List<Integer> roleIdList) {
+
+		List<String> list = new ArrayList<String>();
+
+		for (Integer roleId : roleIdList) {
+			list.addAll(queryPermissionsByRoleId(roleId));
+		}
+		return list;
+	}
+
+}

+ 23 - 0
mec-auth/mec-auth-server/src/main/java/com/ym/mec/auth/service/impl/SysRoleServiceImpl.java

@@ -0,0 +1,23 @@
+package com.ym.mec.auth.service.impl;
+
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+import com.ym.mec.auth.api.entity.SysRole;
+import com.ym.mec.auth.dal.dao.SysRoleDao;
+import com.ym.mec.auth.service.SysRoleService;
+import com.ym.mec.common.dal.BaseDAO;
+import com.ym.mec.common.service.impl.BaseServiceImpl;
+
+@Service
+public class SysRoleServiceImpl extends BaseServiceImpl<Integer, SysRole>  implements SysRoleService {
+	
+	@Autowired
+	private SysRoleDao sysRoleDao;
+
+	@Override
+	public BaseDAO<Integer, SysRole> getDAO() {
+		return sysRoleDao;
+	}
+	
+}

+ 30 - 0
mec-auth/mec-auth-server/src/main/java/com/ym/mec/auth/service/impl/SysUserRoleServiceImpl.java

@@ -0,0 +1,30 @@
+package com.ym.mec.auth.service.impl;
+
+import java.util.List;
+
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+import com.ym.mec.auth.api.entity.SysUserRole;
+import com.ym.mec.auth.dal.dao.SysUserRoleDao;
+import com.ym.mec.auth.service.SysUserRoleService;
+import com.ym.mec.common.dal.BaseDAO;
+import com.ym.mec.common.service.impl.BaseServiceImpl;
+
+@Service
+public class SysUserRoleServiceImpl extends BaseServiceImpl<Integer, SysUserRole>  implements SysUserRoleService {
+	
+	@Autowired
+	private SysUserRoleDao sysUserRoleDao;
+
+	@Override
+	public BaseDAO<Integer, SysUserRole> getDAO() {
+		return sysUserRoleDao;
+	}
+
+	@Override
+	public List<Integer> queryRoleIdListByUserId(Integer userId) {
+		return sysUserRoleDao.queryRoleIdListByUserId(userId);
+	}
+	
+}

+ 98 - 0
mec-auth/mec-auth-server/src/main/java/com/ym/mec/auth/service/impl/SysUserServiceImpl.java

@@ -0,0 +1,98 @@
+package com.ym.mec.auth.service.impl;
+
+import java.util.Date;
+import java.util.List;
+
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+import com.ym.mec.auth.api.dto.SysUserInfo;
+import com.ym.mec.auth.api.entity.SysUser;
+import com.ym.mec.auth.dal.dao.SysUserDao;
+import com.ym.mec.auth.service.SysRoleMenuService;
+import com.ym.mec.auth.service.SysUserRoleService;
+import com.ym.mec.auth.service.SysUserService;
+import com.ym.mec.common.dal.BaseDAO;
+import com.ym.mec.common.exception.BizException;
+import com.ym.mec.common.service.impl.BaseServiceImpl;
+
+@Service
+public class SysUserServiceImpl extends BaseServiceImpl<Integer, SysUser> implements SysUserService {
+
+	@Autowired
+	private SysUserDao sysUserDao;
+
+	@Autowired
+	private SysUserRoleService sysUserRoleService;
+
+	@Autowired
+	private SysRoleMenuService sysRoleMenuService;
+
+	@Override
+	public BaseDAO<Integer, SysUser> getDAO() {
+		return sysUserDao;
+	}
+
+	@Override
+	public SysUser queryByUsername(String username) {
+		return sysUserDao.queryByUsername(username);
+	}
+
+	@Override
+	public SysUser queryByPhone(String phone) {
+		return sysUserDao.queryByPhone(phone);
+	}
+
+	@Override
+	public SysUserInfo queryUserInfoByUsername(String username) {
+
+		SysUserInfo userInfo = new SysUserInfo();
+
+		SysUser sysUser = queryByUsername(username);
+
+		userInfo.setSysUser(sysUser);
+
+		List<Integer> roleIdList = sysUserRoleService.queryRoleIdListByUserId(sysUser.getUserId());
+		userInfo.setRoles(roleIdList.toArray(new Integer[roleIdList.size()]));
+
+		List<String> permissionList = sysRoleMenuService.queryPermissionsByRoleIdList(roleIdList);
+		userInfo.setPermissions(permissionList.toArray(new String[permissionList.size()]));
+
+		return userInfo;
+	}
+
+	@Override
+	public SysUserInfo queryUserInfoByPhone(String phone) {
+
+		SysUserInfo userInfo = new SysUserInfo();
+
+		SysUser sysUser = queryByPhone(phone);
+
+		userInfo.setSysUser(sysUser);
+
+		List<Integer> roleIdList = sysUserRoleService.queryRoleIdListByUserId(sysUser.getUserId());
+		userInfo.setRoles(roleIdList.toArray(new Integer[roleIdList.size()]));
+
+		List<String> permissionList = sysRoleMenuService.queryPermissionsByRoleIdList(roleIdList);
+		userInfo.setPermissions(permissionList.toArray(new String[permissionList.size()]));
+
+		return userInfo;
+	}
+
+	@Override
+	public boolean deleteById(Integer id) {
+		SysUser user = get(id);
+
+		if (user == null) {
+			throw new BizException("用户不存在");
+		}
+
+		user.setUpdateTime(new Date());
+		user.setDelFlag("1");
+
+		update(user);
+
+		return true;
+	}
+
+}

+ 56 - 0
mec-auth/mec-auth-server/src/main/resources/application.yml

@@ -0,0 +1,56 @@
+server:
+  port: 8001
+
+eureka:
+  client:
+    serviceUrl:
+      defaultZone: http://admin:admin123@localhost:8761/eureka/eureka/
+
+spring:
+  application:
+    name: auth-server
+    
+  datasource:
+    name: test
+    url: jdbc:mysql://120.26.238.168:3306/mec_dev?useUnicode=true&characterEncoding=UTF8
+    username: mec_dev
+    password: mec_dev
+    # 使用druid数据源
+    type: com.alibaba.druid.pool.DruidDataSource
+    driver-class-name: com.mysql.cj.jdbc.Driver
+    filters: stat
+    maxActive: 20
+    initialSize: 1
+    maxWait: 60000
+    minIdle: 1
+    timeBetweenEvictionRunsMillis: 60000
+    minEvictableIdleTimeMillis: 300000
+    validationQuery: select 'x'
+    testWhileIdle: true
+    testOnBorrow: false
+    testOnReturn: false
+    poolPreparedStatements: true
+    maxOpenPreparedStatements: 20
+    
+  redis:
+    host: 120.26.238.168
+    port: 6379
+    password: ehjinrong
+    database: 0
+    #连接超时时间(毫秒)
+    timeout: 10000
+    pool:
+      #连接池最大连接数(使用负值表示没有限制)
+      max-active: 10
+      #连接池最大阻塞等待时间(使用负值表示没有限制)
+      max-wait: -1
+      #连接池中的最大空闲连接
+      max-idle: 10
+      #连接池中的最小空闲连接
+      min-idle: 0
+    
+mybatis:
+    mapperLocations: classpath:config/mybatis/*.xml
+    
+swagger:
+  base-package: com.ym.mec.auth.controller

+ 21 - 0
mec-auth/mec-auth-server/src/main/resources/config/mybatis/Global.mapper.xml

@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" 
+"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+
+<mapper namespace="global">
+
+	<sql id="limit">
+		<if test="offset != null">
+			 limit #{offset},#{rows}
+		</if>
+	</sql>
+
+	<sql id="orderby">
+		<if test="sort != null and sort != ''">
+			 ORDER BY ${sort}
+			 <if test="order != null and order != ''">
+			 	${order}
+			 </if>
+		</if>
+	</sql>	
+ </mapper>

+ 58 - 0
mec-auth/mec-auth-server/src/main/resources/config/mybatis/SysDeptMapper.xml

@@ -0,0 +1,58 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<!--
+这个文件是自动生成的。
+不要修改此文件。所有改动将在下次重新自动生成时丢失。
+-->
+<mapper namespace="com.ym.mec.auth.dal.dao.SysDeptDao">
+	
+	<resultMap type="com.ym.mec.auth.api.entity.SysDept" id="SysDept">
+		<result column="dept_id" property="deptId" />
+		<result column="name" property="name" />
+		<result column="sort" property="sort" />
+		<result column="create_time" property="createTime" />
+		<result column="update_time" property="updateTime" />
+		<result column="del_flag" property="delFlag" />
+		<result column="parent_id" property="parentId" />
+	</resultMap>
+	
+	<!-- 根据主键查询一条记录 -->
+	<select id="get" resultMap="SysDept" >
+		SELECT * FROM sys_dept WHERE dept_id = #{deptId} 
+	</select>
+	
+	<!-- 全查询 -->
+	<select id="findAll" resultMap="SysDept">
+		SELECT * FROM sys_dept ORDER BY dept_id
+	</select>
+	
+	<!-- 向数据库增加一条记录 -->
+	<insert id="insert" parameterType="com.ym.mec.auth.api.entity.SysDept" useGeneratedKeys="true" keyColumn="id" keyProperty="id">
+		<!--
+		<selectKey resultClass="int" keyProperty="id" > 
+		SELECT SEQ_WSDEFINITION_ID.nextval AS ID FROM DUAL 
+		</selectKey>
+		-->
+		INSERT INTO sys_dept (dept_id,name,sort,create_time,update_time,del_flag,parent_id) VALUES(#{deptId},#{name},#{sort},#{createTime},#{updateTime},#{delFlag},#{parentId})
+	</insert>
+	
+	<!-- 根据主键查询一条记录 -->
+	<update id="update" parameterType="com.ym.mec.auth.api.entity.SysDept">
+		UPDATE sys_dept SET del_flag = #{delFlag},update_time = #{updateTime},create_time = #{createTime},parent_id = #{parentId},name = #{name},sort = #{sort},dept_id = #{deptId} WHERE dept_id = #{deptId} 
+	</update>
+	
+	<!-- 根据主键删除一条记录 -->
+	<delete id="delete" >
+		DELETE FROM sys_dept WHERE dept_id = #{deptId} 
+	</delete>
+	
+	<!-- 分页查询 -->
+	<select id="queryPage" resultMap="SysDept" parameterType="map">
+		SELECT * FROM sys_dept ORDER BY dept_id <include refid="global.limit"/>
+	</select>
+	
+	<!-- 查询当前表的总记录数 -->
+	<select id="queryCount" resultType="int">
+		SELECT COUNT(*) FROM sys_dept
+	</select>
+</mapper>

+ 53 - 0
mec-auth/mec-auth-server/src/main/resources/config/mybatis/SysDeptRelationMapper.xml

@@ -0,0 +1,53 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<!--
+这个文件是自动生成的。
+不要修改此文件。所有改动将在下次重新自动生成时丢失。
+-->
+<mapper namespace="com.ym.mec.auth.dal.dao.SysDeptRelationDao">
+	
+	<resultMap type="com.ym.mec.auth.api.entity.SysDeptRelation" id="SysDeptRelation">
+		<result column="ancestor" property="ancestor" />
+		<result column="descendant" property="descendant" />
+	</resultMap>
+	
+	<!-- 根据主键查询一条记录 -->
+	<select id="get" resultMap="SysDeptRelation" parameterType="java.util.Map">
+		SELECT * FROM sys_dept_relation WHERE ancestor = #{ancestor} AND descendant = #{descendant} 
+	</select>
+	
+	<!-- 全查询 -->
+	<select id="findAll" resultMap="SysDeptRelation">
+		SELECT * FROM sys_dept_relation ORDER BY ancestor,descendant
+	</select>
+	
+	<!-- 向数据库增加一条记录 -->
+	<insert id="insert" parameterType="com.ym.mec.auth.api.entity.SysDeptRelation" useGeneratedKeys="true" keyColumn="id" keyProperty="id">
+		<!--
+		<selectKey resultClass="int" keyProperty="id" > 
+		SELECT SEQ_WSDEFINITION_ID.nextval AS ID FROM DUAL 
+		</selectKey>
+		-->
+		INSERT INTO sys_dept_relation (ancestor,descendant) VALUES(#{ancestor},#{descendant})
+	</insert>
+	
+	<!-- 根据主键查询一条记录 -->
+	<update id="update" parameterType="com.ym.mec.auth.api.entity.SysDeptRelation">
+		UPDATE sys_dept_relation SET ancestor = #{ancestor},descendant = #{descendant} WHERE ancestor = #{ancestor} AND descendant = #{descendant} 
+	</update>
+	
+	<!-- 根据主键删除一条记录 -->
+	<delete id="delete" parameterType="java.util.Map">
+		DELETE FROM sys_dept_relation WHERE ancestor = #{ancestor} AND descendant = #{descendant} 
+	</delete>
+	
+	<!-- 分页查询 -->
+	<select id="queryPage" resultMap="SysDeptRelation" parameterType="map">
+		SELECT * FROM sys_dept_relation ORDER BY ancestor,descendant <include refid="global.limit"/>
+	</select>
+	
+	<!-- 查询当前表的总记录数 -->
+	<select id="queryCount" resultType="int">
+		SELECT COUNT(*) FROM sys_dept_relation
+	</select>
+</mapper>

+ 64 - 0
mec-auth/mec-auth-server/src/main/resources/config/mybatis/SysMenuMapper.xml

@@ -0,0 +1,64 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<!--
+这个文件是自动生成的。
+不要修改此文件。所有改动将在下次重新自动生成时丢失。
+-->
+<mapper namespace="com.ym.mec.auth.dal.dao.SysMenuDao">
+	
+	<resultMap type="com.ym.mec.auth.api.entity.SysMenu" id="SysMenu">
+		<result column="menu_id" property="menuId" />
+		<result column="name" property="name" />
+		<result column="permission" property="permission" />
+		<result column="path" property="path" />
+		<result column="parent_id" property="parentId" />
+		<result column="icon" property="icon" />
+		<result column="component" property="component" />
+		<result column="sort" property="sort" />
+		<result column="keep_alive" property="keepAlive" />
+		<result column="type" property="type" />
+		<result column="create_time" property="createTime" />
+		<result column="update_time" property="updateTime" />
+		<result column="del_flag" property="delFlag" />
+	</resultMap>
+	
+	<!-- 根据主键查询一条记录 -->
+	<select id="get" resultMap="SysMenu" >
+		SELECT * FROM sys_menu WHERE menu_id = #{menuId} 
+	</select>
+	
+	<!-- 全查询 -->
+	<select id="findAll" resultMap="SysMenu">
+		SELECT * FROM sys_menu ORDER BY menu_id
+	</select>
+	
+	<!-- 向数据库增加一条记录 -->
+	<insert id="insert" parameterType="com.ym.mec.auth.api.entity.SysMenu" useGeneratedKeys="true" keyColumn="id" keyProperty="id">
+		<!--
+		<selectKey resultClass="int" keyProperty="id" > 
+		SELECT SEQ_WSDEFINITION_ID.nextval AS ID FROM DUAL 
+		</selectKey>
+		-->
+		INSERT INTO sys_menu (menu_id,name,permission,path,parent_id,icon,component,sort,keep_alive,type,create_time,update_time,del_flag) VALUES(#{menuId},#{name},#{permission},#{path},#{parentId},#{icon},#{component},#{sort},#{keepAlive},#{type},#{createTime},#{updateTime},#{delFlag})
+	</insert>
+	
+	<!-- 根据主键查询一条记录 -->
+	<update id="update" parameterType="com.ym.mec.auth.api.entity.SysMenu">
+		UPDATE sys_menu SET path = #{path},del_flag = #{delFlag},update_time = #{updateTime},create_time = #{createTime},parent_id = #{parentId},name = #{name},icon = #{icon},component = #{component},permission = #{permission},sort = #{sort},keep_alive = #{keepAlive},type = #{type},menu_id = #{menuId} WHERE menu_id = #{menuId} 
+	</update>
+	
+	<!-- 根据主键删除一条记录 -->
+	<delete id="delete" >
+		DELETE FROM sys_menu WHERE menu_id = #{menuId} 
+	</delete>
+	
+	<!-- 分页查询 -->
+	<select id="queryPage" resultMap="SysMenu" parameterType="map">
+		SELECT * FROM sys_menu ORDER BY menu_id <include refid="global.limit"/>
+	</select>
+	
+	<!-- 查询当前表的总记录数 -->
+	<select id="queryCount" resultType="int">
+		SELECT COUNT(*) FROM sys_menu
+	</select>
+</mapper>

+ 62 - 0
mec-auth/mec-auth-server/src/main/resources/config/mybatis/SysOauthClientDetailsMapper.xml

@@ -0,0 +1,62 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<!--
+这个文件是自动生成的。
+不要修改此文件。所有改动将在下次重新自动生成时丢失。
+-->
+<mapper namespace="com.ym.mec.auth.dal.dao.SysOauthClientDetailsDao">
+	
+	<resultMap type="com.ym.mec.auth.api.entity.SysOauthClientDetails" id="SysOauthClientDetails">
+		<result column="client_id" property="clientId" />
+		<result column="resource_ids" property="resourceIds" />
+		<result column="client_secret" property="clientSecret" />
+		<result column="scope" property="scope" />
+		<result column="authorized_grant_types" property="authorizedGrantTypes" />
+		<result column="web_server_redirect_uri" property="webServerRedirectUri" />
+		<result column="authorities" property="authorities" />
+		<result column="access_token_validity" property="accessTokenValidity" />
+		<result column="refresh_token_validity" property="refreshTokenValidity" />
+		<result column="additional_information" property="additionalInformation" />
+		<result column="autoapprove" property="autoapprove" />
+	</resultMap>
+	
+	<!-- 根据主键查询一条记录 -->
+	<select id="get" resultMap="SysOauthClientDetails" >
+		SELECT * FROM sys_oauth_client_details WHERE client_id = #{clientId} 
+	</select>
+	
+	<!-- 全查询 -->
+	<select id="findAll" resultMap="SysOauthClientDetails">
+		SELECT * FROM sys_oauth_client_details ORDER BY client_id
+	</select>
+	
+	<!-- 向数据库增加一条记录 -->
+	<insert id="insert" parameterType="com.ym.mec.auth.api.entity.SysOauthClientDetails" useGeneratedKeys="true" keyColumn="id" keyProperty="id">
+		<!--
+		<selectKey resultClass="int" keyProperty="id" > 
+		SELECT SEQ_WSDEFINITION_ID.nextval AS ID FROM DUAL 
+		</selectKey>
+		-->
+		INSERT INTO sys_oauth_client_details (client_id,resource_ids,client_secret,scope,authorized_grant_types,web_server_redirect_uri,authorities,access_token_validity,refresh_token_validity,additional_information,autoapprove) VALUES(#{clientId},#{resourceIds},#{clientSecret},#{scope},#{authorizedGrantTypes},#{webServerRedirectUri},#{authorities},#{accessTokenValidity},#{refreshTokenValidity},#{additionalInformation},#{autoapprove})
+	</insert>
+	
+	<!-- 根据主键查询一条记录 -->
+	<update id="update" parameterType="com.ym.mec.auth.api.entity.SysOauthClientDetails">
+		UPDATE sys_oauth_client_details SET additional_information = #{additionalInformation},access_token_validity = #{accessTokenValidity},autoapprove = #{autoapprove},scope = #{scope},web_server_redirect_uri = #{webServerRedirectUri},authorized_grant_types = #{authorizedGrantTypes},client_secret = #{clientSecret},resource_ids = #{resourceIds},client_id = #{clientId},authorities = #{authorities},refresh_token_validity = #{refreshTokenValidity} WHERE client_id = #{clientId} 
+	</update>
+	
+	<!-- 根据主键删除一条记录 -->
+	<delete id="delete" >
+		DELETE FROM sys_oauth_client_details WHERE client_id = #{clientId} 
+	</delete>
+	
+	<!-- 分页查询 -->
+	<select id="queryPage" resultMap="SysOauthClientDetails" parameterType="map">
+		SELECT * FROM sys_oauth_client_details ORDER BY client_id <include refid="global.limit"/>
+	</select>
+	
+	<!-- 查询当前表的总记录数 -->
+	<select id="queryCount" resultType="int">
+		SELECT COUNT(*) FROM sys_oauth_client_details
+	</select>
+</mapper>

+ 54 - 0
mec-auth/mec-auth-server/src/main/resources/config/mybatis/SysRoleDeptMapper.xml

@@ -0,0 +1,54 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<!--
+这个文件是自动生成的。
+不要修改此文件。所有改动将在下次重新自动生成时丢失。
+-->
+<mapper namespace="com.ym.mec.auth.dal.dao.SysRoleDeptDao">
+	
+	<resultMap type="com.ym.mec.auth.api.entity.SysRoleDept" id="SysRoleDept">
+		<result column="id" property="id" />
+		<result column="role_id" property="roleId" />
+		<result column="dept_id" property="deptId" />
+	</resultMap>
+	
+	<!-- 根据主键查询一条记录 -->
+	<select id="get" resultMap="SysRoleDept" >
+		SELECT * FROM sys_role_dept WHERE id = #{id} 
+	</select>
+	
+	<!-- 全查询 -->
+	<select id="findAll" resultMap="SysRoleDept">
+		SELECT * FROM sys_role_dept ORDER BY id
+	</select>
+	
+	<!-- 向数据库增加一条记录 -->
+	<insert id="insert" parameterType="com.ym.mec.auth.api.entity.SysRoleDept" useGeneratedKeys="true" keyColumn="id" keyProperty="id">
+		<!--
+		<selectKey resultClass="int" keyProperty="id" > 
+		SELECT SEQ_WSDEFINITION_ID.nextval AS ID FROM DUAL 
+		</selectKey>
+		-->
+		INSERT INTO sys_role_dept (id,role_id,dept_id) VALUES(#{id},#{roleId},#{deptId})
+	</insert>
+	
+	<!-- 根据主键查询一条记录 -->
+	<update id="update" parameterType="com.ym.mec.auth.api.entity.SysRoleDept">
+		UPDATE sys_role_dept SET role_id = #{roleId},id = #{id},dept_id = #{deptId} WHERE id = #{id} 
+	</update>
+	
+	<!-- 根据主键删除一条记录 -->
+	<delete id="delete" >
+		DELETE FROM sys_role_dept WHERE id = #{id} 
+	</delete>
+	
+	<!-- 分页查询 -->
+	<select id="queryPage" resultMap="SysRoleDept" parameterType="map">
+		SELECT * FROM sys_role_dept ORDER BY id <include refid="global.limit"/>
+	</select>
+	
+	<!-- 查询当前表的总记录数 -->
+	<select id="queryCount" resultType="int">
+		SELECT COUNT(*) FROM sys_role_dept
+	</select>
+</mapper>

+ 58 - 0
mec-auth/mec-auth-server/src/main/resources/config/mybatis/SysRoleMapper.xml

@@ -0,0 +1,58 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<!--
+这个文件是自动生成的。
+不要修改此文件。所有改动将在下次重新自动生成时丢失。
+-->
+<mapper namespace="com.ym.mec.auth.dal.dao.SysRoleDao">
+	
+	<resultMap type="com.ym.mec.auth.api.entity.SysRole" id="SysRole">
+		<result column="role_id" property="roleId" />
+		<result column="role_name" property="roleName" />
+		<result column="role_code" property="roleCode" />
+		<result column="role_desc" property="roleDesc" />
+		<result column="create_time" property="createTime" />
+		<result column="update_time" property="updateTime" />
+		<result column="del_flag" property="delFlag" />
+	</resultMap>
+	
+	<!-- 根据主键查询一条记录 -->
+	<select id="get" resultMap="SysRole" >
+		SELECT * FROM sys_role WHERE role_id = #{roleId} 
+	</select>
+	
+	<!-- 全查询 -->
+	<select id="findAll" resultMap="SysRole">
+		SELECT * FROM sys_role ORDER BY role_id
+	</select>
+	
+	<!-- 向数据库增加一条记录 -->
+	<insert id="insert" parameterType="com.ym.mec.auth.api.entity.SysRole" useGeneratedKeys="true" keyColumn="id" keyProperty="id">
+		<!--
+		<selectKey resultClass="int" keyProperty="id" > 
+		SELECT SEQ_WSDEFINITION_ID.nextval AS ID FROM DUAL 
+		</selectKey>
+		-->
+		INSERT INTO sys_role (role_id,role_name,role_code,role_desc,create_time,update_time,del_flag) VALUES(#{roleId},#{roleName},#{roleCode},#{roleDesc},#{createTime},#{updateTime},#{delFlag})
+	</insert>
+	
+	<!-- 根据主键查询一条记录 -->
+	<update id="update" parameterType="com.ym.mec.auth.api.entity.SysRole">
+		UPDATE sys_role SET role_name = #{roleName},del_flag = #{delFlag},update_time = #{updateTime},create_time = #{createTime},role_id = #{roleId},role_code = #{roleCode},role_desc = #{roleDesc} WHERE role_id = #{roleId} 
+	</update>
+	
+	<!-- 根据主键删除一条记录 -->
+	<delete id="delete" >
+		DELETE FROM sys_role WHERE role_id = #{roleId} 
+	</delete>
+	
+	<!-- 分页查询 -->
+	<select id="queryPage" resultMap="SysRole" parameterType="map">
+		SELECT * FROM sys_role ORDER BY role_id <include refid="global.limit"/>
+	</select>
+	
+	<!-- 查询当前表的总记录数 -->
+	<select id="queryCount" resultType="int">
+		SELECT COUNT(*) FROM sys_role
+	</select>
+</mapper>

+ 57 - 0
mec-auth/mec-auth-server/src/main/resources/config/mybatis/SysRoleMenuMapper.xml

@@ -0,0 +1,57 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<!--
+这个文件是自动生成的。
+不要修改此文件。所有改动将在下次重新自动生成时丢失。
+-->
+<mapper namespace="com.ym.mec.auth.dal.dao.SysRoleMenuDao">
+	
+	<resultMap type="com.ym.mec.auth.api.entity.SysRoleMenu" id="SysRoleMenu">
+		<result column="role_id" property="roleId" />
+		<result column="menu_id" property="menuId" />
+	</resultMap>
+	
+	<!-- 根据主键查询一条记录 -->
+	<select id="get" resultMap="SysRoleMenu" parameterType="java.util.Map">
+		SELECT * FROM sys_role_menu WHERE role_id = #{roleId} AND menu_id = #{menuId} 
+	</select>
+	
+	<!-- 全查询 -->
+	<select id="findAll" resultMap="SysRoleMenu">
+		SELECT * FROM sys_role_menu ORDER BY role_id,menu_id
+	</select>
+	
+	<!-- 向数据库增加一条记录 -->
+	<insert id="insert" parameterType="com.ym.mec.auth.api.entity.SysRoleMenu" useGeneratedKeys="true" keyColumn="id" keyProperty="id">
+		<!--
+		<selectKey resultClass="int" keyProperty="id" > 
+		SELECT SEQ_WSDEFINITION_ID.nextval AS ID FROM DUAL 
+		</selectKey>
+		-->
+		INSERT INTO sys_role_menu (role_id,menu_id) VALUES(#{roleId},#{menuId})
+	</insert>
+	
+	<!-- 根据主键查询一条记录 -->
+	<update id="update" parameterType="com.ym.mec.auth.api.entity.SysRoleMenu">
+		UPDATE sys_role_menu SET role_id = #{roleId},menu_id = #{menuId} WHERE role_id = #{roleId} AND menu_id = #{menuId} 
+	</update>
+	
+	<!-- 根据主键删除一条记录 -->
+	<delete id="delete" parameterType="java.util.Map">
+		DELETE FROM sys_role_menu WHERE role_id = #{roleId} AND menu_id = #{menuId} 
+	</delete>
+	
+	<!-- 分页查询 -->
+	<select id="queryPage" resultMap="SysRoleMenu" parameterType="map">
+		SELECT * FROM sys_role_menu ORDER BY role_id,menu_id <include refid="global.limit"/>
+	</select>
+	
+	<!-- 查询当前表的总记录数 -->
+	<select id="queryCount" resultType="int">
+		SELECT COUNT(*) FROM sys_role_menu
+	</select>
+	
+	<select id="queryPermissionsByRoleId" resultType="string" parameterType="int">
+		SELECT m.permission FROM sys_role_menu rm left join sys_menu m on rm.menu_id = m.menu_id where rm.role_id = #{roleId} and m.del_flag = 0
+	</select>
+</mapper>

+ 90 - 0
mec-auth/mec-auth-server/src/main/resources/config/mybatis/SysUserMapper.xml

@@ -0,0 +1,90 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<!--
+这个文件是自动生成的。
+不要修改此文件。所有改动将在下次重新自动生成时丢失。
+-->
+<mapper namespace="com.ym.mec.auth.dal.dao.SysUserDao">
+	
+	<resultMap type="com.ym.mec.auth.api.entity.SysUser" id="SysUser">
+		<result column="user_id" property="userId" />
+		<result column="username" property="username" />
+		<result column="password" property="password" />
+		<result column="salt" property="salt" />
+		<result column="phone" property="phone" />
+		<result column="avatar" property="avatar" />
+		<result column="dept_id" property="deptId" />
+		<result column="create_time" property="createTime" />
+		<result column="update_time" property="updateTime" />
+		<result column="lock_flag" property="lockFlag" />
+		<result column="del_flag" property="delFlag" />
+		<result column="wx_openid" property="wxOpenid" />
+		<result column="qq_openid" property="qqOpenid" />
+		<result column="user_type" property="userType" />
+	</resultMap>
+	
+	<!-- 查询条件 -->
+	<sql id="queryCondition">
+			<if test="userStartDate != null">
+				and create_time &gt;= #{createStartDate}
+			</if>
+			<if test="userEndDate != null">
+				and create_time &lt;= #{createEndDate}
+			</if>
+			<if test="userType != null">
+				and user_type = #{userType}
+			</if>
+	</sql>
+	
+	<!-- 根据主键查询一条记录 -->
+	<select id="get" resultMap="SysUser" >
+		SELECT * FROM sys_user WHERE user_id = #{userId} 
+	</select>
+	
+	<!-- 全查询 -->
+	<select id="findAll" resultMap="SysUser">
+		SELECT * FROM sys_user ORDER BY user_id
+	</select>
+	
+	<!-- 向数据库增加一条记录 -->
+	<insert id="insert" parameterType="com.ym.mec.auth.api.entity.SysUser" useGeneratedKeys="true" keyColumn="id" keyProperty="id">
+		<!--
+		<selectKey resultClass="int" keyProperty="id" > 
+		SELECT SEQ_WSDEFINITION_ID.nextval AS ID FROM DUAL 
+		</selectKey>
+		-->
+		INSERT INTO sys_user (user_id,username,password,salt,phone,avatar,dept_id,create_time,update_time,lock_flag,del_flag,wx_openid,qq_openid,user_type) VALUES(#{userId},#{username},#{password},#{salt},#{phone},#{avatar},#{deptId},#{createTime},#{updateTime},#{lockFlag},#{delFlag},#{wxOpenid},#{qqOpenid},#{userType})
+	</insert>
+	
+	<!-- 根据主键查询一条记录 -->
+	<update id="update" parameterType="com.ym.mec.auth.api.entity.SysUser">
+		UPDATE sys_user SET del_flag = #{delFlag},salt = #{salt},create_time = #{createTime},qq_openid = #{qqOpenid},avatar = #{avatar},lock_flag = #{lockFlag},password = #{password},update_time = #{updateTime},wx_openid = #{wxOpenid},user_id = #{userId},phone = #{phone},dept_id = #{deptId},username = #{username},user_type = #{userType} WHERE user_id = #{userId} 
+	</update>
+	
+	<!-- 根据主键删除一条记录 -->
+	<delete id="delete" >
+		DELETE FROM sys_user WHERE user_id = #{userId} 
+	</delete>
+	
+	<!-- 分页查询 -->
+	<select id="queryPage" resultMap="SysUser" parameterType="map">
+		SELECT * FROM sys_user ORDER BY user_id
+		<include refid="queryCondition" />
+		<include refid="global.orderby" />
+		<include refid="global.limit" />
+	</select>
+	
+	<!-- 查询当前表的总记录数 -->
+	<select id="queryCount" resultType="int">
+		SELECT COUNT(*) FROM sys_user
+		<include refid="queryCondition" />
+	</select>
+	
+	<select id="queryByUsername" resultMap="SysUser">
+		select * from sys_user where username = #{username}
+	</select>
+	
+	<select id="queryByPhone" resultMap="SysUser">
+		select * from sys_user where phone = #{phone}
+	</select>
+</mapper>

+ 57 - 0
mec-auth/mec-auth-server/src/main/resources/config/mybatis/SysUserRoleMapper.xml

@@ -0,0 +1,57 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<!--
+这个文件是自动生成的。
+不要修改此文件。所有改动将在下次重新自动生成时丢失。
+-->
+<mapper namespace="com.ym.mec.auth.dal.dao.SysUserRoleDao">
+	
+	<resultMap type="com.ym.mec.auth.api.entity.SysUserRole" id="SysUserRole">
+		<result column="user_id" property="userId" />
+		<result column="role_id" property="roleId" />
+	</resultMap>
+	
+	<!-- 根据主键查询一条记录 -->
+	<select id="get" resultMap="SysUserRole" parameterType="java.util.Map">
+		SELECT * FROM sys_user_role WHERE user_id = #{userId} AND role_id = #{roleId} 
+	</select>
+	
+	<!-- 全查询 -->
+	<select id="findAll" resultMap="SysUserRole">
+		SELECT * FROM sys_user_role ORDER BY user_id,role_id
+	</select>
+	
+	<!-- 向数据库增加一条记录 -->
+	<insert id="insert" parameterType="com.ym.mec.auth.api.entity.SysUserRole" useGeneratedKeys="true" keyColumn="id" keyProperty="id">
+		<!--
+		<selectKey resultClass="int" keyProperty="id" > 
+		SELECT SEQ_WSDEFINITION_ID.nextval AS ID FROM DUAL 
+		</selectKey>
+		-->
+		INSERT INTO sys_user_role (user_id,role_id) VALUES(#{userId},#{roleId})
+	</insert>
+	
+	<!-- 根据主键查询一条记录 -->
+	<update id="update" parameterType="com.ym.mec.auth.api.entity.SysUserRole">
+		UPDATE sys_user_role SET user_id = #{userId},role_id = #{roleId} WHERE user_id = #{userId} AND role_id = #{roleId} 
+	</update>
+	
+	<!-- 根据主键删除一条记录 -->
+	<delete id="delete" parameterType="java.util.Map">
+		DELETE FROM sys_user_role WHERE user_id = #{userId} AND role_id = #{roleId} 
+	</delete>
+	
+	<!-- 分页查询 -->
+	<select id="queryPage" resultMap="SysUserRole" parameterType="map">
+		SELECT * FROM sys_user_role ORDER BY user_id,role_id <include refid="global.limit"/>
+	</select>
+	
+	<!-- 查询当前表的总记录数 -->
+	<select id="queryCount" resultType="int">
+		SELECT COUNT(*) FROM sys_user_role
+	</select>
+	
+	<select id="queryRoleIdListByUserId" resultType="int" parameterType="int">
+		SELECT ur.role_id FROM sys_user_role ur left join sys_role r on ur.role_id = r.role_id where ur.user_id = #{userId} and r.del_flag = 0
+	</select>
+</mapper>

+ 34 - 0
mec-auth/pom.xml

@@ -0,0 +1,34 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+	xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+	<modelVersion>4.0.0</modelVersion>
+	<parent>
+		<groupId>com.ym</groupId>
+		<artifactId>mec</artifactId>
+		<version>1.0</version>
+	</parent>
+	<artifactId>mec-auth</artifactId>
+	<packaging>pom</packaging>
+	<name>mec-auth</name>
+	<url>http://maven.apache.org</url>
+	<properties>
+		<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
+	</properties>
+	<dependencies>
+		<!-- 引用Mybatis 和 Mysql驱动开始 -->
+		<dependency>
+			<groupId>org.mybatis.spring.boot</groupId>
+			<artifactId>mybatis-spring-boot-starter</artifactId>
+			<version>1.3.2</version>
+		</dependency>
+		<dependency>
+			<groupId>mysql</groupId>
+			<artifactId>mysql-connector-java</artifactId>
+		</dependency>
+	</dependencies>
+	
+	<modules>
+		<module>mec-auth-server</module>
+		<module>mec-auth-api</module>
+	</modules>
+</project>

+ 50 - 0
mec-common/pom.xml

@@ -0,0 +1,50 @@
+<?xml version="1.0"?>
+<project
+	xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"
+	xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
+	<modelVersion>4.0.0</modelVersion>
+	<parent>
+		<groupId>com.ym</groupId>
+		<artifactId>mec</artifactId>
+		<version>1.0</version>
+	</parent>
+
+	<artifactId>mec-common</artifactId>
+	<name>mec-common</name>
+	<url>http://maven.apache.org</url>
+
+	<properties>
+		<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
+	</properties>
+
+	<dependencies>
+		<dependency>
+			<groupId>com.ym</groupId>
+			<artifactId>mec-util</artifactId>
+			<version>1.0</version>
+		</dependency>
+		
+		<dependency>
+			<groupId>org.mybatis.spring.boot</groupId>
+			<artifactId>mybatis-spring-boot-starter</artifactId>
+			<version>1.3.2</version>
+		</dependency>
+		
+		<!-- Redis缓存整合开始 -->
+		<dependency>
+			<groupId>org.springframework.boot</groupId>
+			<artifactId>spring-boot-starter-data-redis</artifactId>
+		</dependency>
+		<!-- Redis缓存整合结束 -->
+		
+		<dependency>
+			<groupId>org.springframework.cloud</groupId>
+			<artifactId>spring-cloud-starter-oauth2</artifactId>
+		</dependency>
+	
+		<dependency>
+			<groupId>org.springframework.cloud</groupId>
+			<artifactId>spring-cloud-starter-openfeign</artifactId>
+		</dependency>
+	</dependencies>
+</project>

+ 73 - 0
mec-common/src/main/java/com/ym/mec/common/cache/Cache.java

@@ -0,0 +1,73 @@
+package com.ym.mec.common.cache;
+
+import java.util.Set;
+
+public interface Cache {
+
+	/**
+	 * 获得缓存值
+	 * 
+	 * @param key
+	 *            缓存key
+	 * @return 缓存值
+	 */
+	Object get(String key) throws CacheException;
+
+	/**
+	 * 设置缓存
+	 * 
+	 * @param key
+	 *            缓存key
+	 * @param value
+	 *            缓存值
+	 */
+	void put(String key, Object value) throws CacheException;
+
+	/**
+	 * 设置缓存
+	 * 
+	 * @param key
+	 *            缓存key
+	 * @param value
+	 *            缓存值
+	 * @param expireTimes
+	 * 		过期时间(单位:秒)
+	 */
+	void put(String key, Object value, int expireTimes) throws CacheException;
+
+	/**
+	 * 删除缓存
+	 * 
+	 * @param key
+	 */
+	void delete(String key) throws CacheException;
+
+	/**
+	 * 判断key是否已经存在
+	 * @param key
+	 * @return
+	 */
+	public boolean exists(String key);
+
+	/**
+	 * 获得所有的key
+	 * 
+	 * @return key集合
+	 */
+	Set<String> keys() throws CacheException;
+
+	/**
+	 * 获得缓存的key-value个数
+	 * 
+	 * @return key-value个数
+	 */
+	long size() throws CacheException;
+
+	/**
+	 * 重置某一个对应key的cache过期时间
+	 * @param key
+	 * @param expireTimes
+	 */
+	void expire(String key, int expireTimes);
+
+}

+ 27 - 0
mec-common/src/main/java/com/ym/mec/common/cache/CacheException.java

@@ -0,0 +1,27 @@
+package com.ym.mec.common.cache;
+
+/**
+ * 缓存异常处理类
+ * 
+ */
+public class CacheException extends RuntimeException {
+
+	private static final long serialVersionUID = 3299789908114028688L;
+
+	public CacheException(String message, Throwable cause) {
+		super(message, cause);
+	}
+
+	public CacheException(String message) {
+		super(message);
+	}
+
+	public CacheException(Throwable cause) {
+		super(cause);
+	}
+
+	public CacheException() {
+		super();
+	}
+
+}

برخی فایل ها در این مقایسه diff نمایش داده نمی شوند زیرا تعداد فایل ها بسیار زیاد است