Explorar o código

:tada: 2.0.0.RC6

smallchill %!s(int64=7) %!d(string=hai) anos
pai
achega
89333724e4
Modificáronse 58 ficheiros con 742 adicións e 141 borrados
  1. 1 1
      Dockerfile
  2. 6 6
      LICENSE
  3. 20 18
      doc/sql/bladex-saber-mysql.sql
  4. 23 21
      doc/sql/bladex-sword-mysql.sql
  5. 60 0
      doc/sql/bladex-tenant-mysql-update-RC5.sql
  6. 9 9
      pom.xml
  7. 1 0
      src/main/java/org/springblade/common/config/BladeConfiguration.java
  8. 53 5
      src/main/java/org/springblade/core/secure/utils/SecureUtil.java
  9. 5 3
      src/main/java/org/springblade/modules/auth/AuthController.java
  10. 2 2
      src/main/java/org/springblade/modules/develop/controller/CodeController.java
  11. 18 2
      src/main/java/org/springblade/modules/develop/support/BladeCodeGenerator.java
  12. 8 5
      src/main/java/org/springblade/modules/system/controller/DeptController.java
  13. 0 1
      src/main/java/org/springblade/modules/system/controller/DictController.java
  14. 2 2
      src/main/java/org/springblade/modules/system/controller/RoleController.java
  15. 119 0
      src/main/java/org/springblade/modules/system/controller/TenantController.java
  16. 6 3
      src/main/java/org/springblade/modules/system/controller/UserController.java
  17. 6 0
      src/main/java/org/springblade/modules/system/entity/Dept.java
  18. 6 0
      src/main/java/org/springblade/modules/system/entity/Role.java
  19. 66 0
      src/main/java/org/springblade/modules/system/entity/Tenant.java
  20. 2 2
      src/main/java/org/springblade/modules/system/entity/User.java
  21. 2 1
      src/main/java/org/springblade/modules/system/mapper/DeptMapper.java
  22. 4 1
      src/main/java/org/springblade/modules/system/mapper/DeptMapper.xml
  23. 8 1
      src/main/java/org/springblade/modules/system/mapper/DictMapper.xml
  24. 2 2
      src/main/java/org/springblade/modules/system/mapper/MenuMapper.xml
  25. 2 1
      src/main/java/org/springblade/modules/system/mapper/RoleMapper.java
  26. 4 1
      src/main/java/org/springblade/modules/system/mapper/RoleMapper.xml
  27. 41 0
      src/main/java/org/springblade/modules/system/mapper/TenantMapper.java
  28. 25 0
      src/main/java/org/springblade/modules/system/mapper/TenantMapper.xml
  29. 2 1
      src/main/java/org/springblade/modules/system/mapper/UserMapper.java
  30. 2 1
      src/main/java/org/springblade/modules/system/mapper/UserMapper.xml
  31. 2 1
      src/main/java/org/springblade/modules/system/service/IDeptService.java
  32. 2 1
      src/main/java/org/springblade/modules/system/service/IRoleService.java
  33. 47 0
      src/main/java/org/springblade/modules/system/service/ITenantService.java
  34. 2 1
      src/main/java/org/springblade/modules/system/service/IUserService.java
  35. 2 2
      src/main/java/org/springblade/modules/system/service/impl/DeptServiceImpl.java
  36. 0 1
      src/main/java/org/springblade/modules/system/service/impl/DictServiceImpl.java
  37. 2 2
      src/main/java/org/springblade/modules/system/service/impl/RoleServiceImpl.java
  38. 95 0
      src/main/java/org/springblade/modules/system/service/impl/TenantServiceImpl.java
  39. 2 2
      src/main/java/org/springblade/modules/system/service/impl/UserServiceImpl.java
  40. 2 1
      src/main/resources/templates/entity.java.vm
  41. 1 11
      src/main/resources/templates/mapper.xml.vm
  42. 2 0
      src/main/resources/templates/saber/crud.vue.vm
  43. 11 0
      src/main/resources/templates/sql/menu.sql.vm
  44. 2 0
      src/main/resources/templates/sword/add.js.vm
  45. 3 1
      src/main/resources/templates/sword/edit.js.vm
  46. 3 1
      src/main/resources/templates/sword/list.js.vm
  47. 6 2
      src/main/resources/templates/sword/model.js.vm
  48. 2 0
      src/main/resources/templates/sword/view.js.vm
  49. 18 9
      src/test/java/org/springblade/test/CodeGenerator.java
  50. 2 1
      src/test/resources/templates/entity.java.vm
  51. 1 11
      src/test/resources/templates/mapper.xml.vm
  52. 2 0
      src/test/resources/templates/saber/crud.vue.vm
  53. 11 0
      src/test/resources/templates/sql/menu.sql.vm
  54. 2 0
      src/test/resources/templates/sword/add.js.vm
  55. 3 1
      src/test/resources/templates/sword/edit.js.vm
  56. 3 1
      src/test/resources/templates/sword/list.js.vm
  57. 6 2
      src/test/resources/templates/sword/model.js.vm
  58. 3 1
      src/test/resources/templates/sword/view.js.vm

+ 1 - 1
Dockerfile

@@ -8,7 +8,7 @@ WORKDIR /blade
 
 
 EXPOSE 8800
 EXPOSE 8800
 
 
-ADD ./target/blade.jar ./app.jar
+ADD ./target/BladeX-Boot.jar ./app.jar
 
 
 ENTRYPOINT ["java", "-Djava.security.egd=file:/dev/./urandom", "-jar", "app.jar"]
 ENTRYPOINT ["java", "-Djava.security.egd=file:/dev/./urandom", "-jar", "app.jar"]
 
 

+ 6 - 6
LICENSE

@@ -1,7 +1,7 @@
 BladeX商业授权许可协议
 BladeX商业授权许可协议
 
 
 一、 知识产权:
 一、 知识产权:
-BladeX系列产品知识产权归如梦技术团队独立所有
+BladeX系列产品知识产权归BladeX团队独立所有
 
 
 二、 许可:
 二、 许可:
 1. 在您完全接受并遵守本协议的基础上,本协议授予您使用BladeX的某些权利和非独占性许可。
 1. 在您完全接受并遵守本协议的基础上,本协议授予您使用BladeX的某些权利和非独占性许可。
@@ -20,14 +20,14 @@ BladeX系列产品知识产权归如梦技术团队独立所有
 您在使用本产品或服务时,不得将本产品产品或服务用于任何非法用途或本协议条款、条件和声明禁止的用途。
 您在使用本产品或服务时,不得将本产品产品或服务用于任何非法用途或本协议条款、条件和声明禁止的用途。
 
 
 五、 免责说明:
 五、 免责说明:
-1. 本产品按“现状”授予许可,您须自行承担使用本产品的风险。如梦技术团队不对此提供任何明示、暗示或任何其它形式的担保和表示。在任何情况下,对于因使用或无法使用本软件而导致的任何损失(包括但不仅限于商业利润损失、业务中断或业务信息丢失),如梦技术团队无需向您或任何第三方负责,即使如梦技术团队已被告知可能会造成此类损失。在任何情况下, 如梦技术团队均不就任何直接的、间接的、附带的、后果性的、特别的、惩戒性的和处罚性的损害赔偿承担任何责任,无论该主张是基于保证、合同、侵权(包括疏忽)或是基于其他原因作出。
+1. 本产品按“现状”授予许可,您须自行承担使用本产品的风险。BladeX团队不对此提供任何明示、暗示或任何其它形式的担保和表示。在任何情况下,对于因使用或无法使用本软件而导致的任何损失(包括但不仅限于商业利润损失、业务中断或业务信息丢失),BladeX团队无需向您或任何第三方负责,即使BladeX团队已被告知可能会造成此类损失。在任何情况下, BladeX团队均不就任何直接的、间接的、附带的、后果性的、特别的、惩戒性的和处罚性的损害赔偿承担任何责任,无论该主张是基于保证、合同、侵权(包括疏忽)或是基于其他原因作出。
 2. 本产品可能内置有第三方服务,您应自行评估使用这些第三方服务的风险,由使用此类第三方服务而产生的纠纷,全部责任由您自行承担。
 2. 本产品可能内置有第三方服务,您应自行评估使用这些第三方服务的风险,由使用此类第三方服务而产生的纠纷,全部责任由您自行承担。
-3. 如梦技术团队不对使用本产品构建的网站中任何信息内容以及导致的任何版权纠纷、法律争议和后果承担任何责任,全部责任由您自行承担。
-4. 如梦技术团队可能会经常提供产品更新或升级,但如梦技术团队没有为根据本协议许可的产品提供维护或更新的责任。
+3. BladeX团队不对使用本产品构建的网站中任何信息内容以及导致的任何版权纠纷、法律争议和后果承担任何责任,全部责任由您自行承担。
+4. BladeX团队可能会经常提供产品更新或升级,但BladeX团队没有为根据本协议许可的产品提供维护或更新的责任。
 
 
 六、 权利和所有权的保留:
 六、 权利和所有权的保留:
-如梦技术团队保留所有未在本协议中明确授予您的所有权利。如梦技术团队保留随时更新本协议的权利,并只需公示于对应产品项目的LICENSE文件,无需征得您的事先同意且无需另行通知,更新后的内容应于公示即时生效。您可以随时访问产品地址并查阅最新版许可条款,在更新生效后您继续使用本产品则被视作您已接受了新的条款。
+BladeX团队保留所有未在本协议中明确授予您的所有权利。BladeX团队保留随时更新本协议的权利,并只需公示于对应产品项目的LICENSE文件,无需征得您的事先同意且无需另行通知,更新后的内容应于公示即时生效。您可以随时访问产品地址并查阅最新版许可条款,在更新生效后您继续使用本产品则被视作您已接受了新的条款。
 
 
 七、 协议终止
 七、 协议终止
 1. 您一旦开始复制、下载、安装或者使用本产品,即被视为完全理解并接受本协议的各项条款,在享有上述条款授予的许可权力同时,也受到相关的约束和限制,本协议许可范围以外的行为,将直接违反本协议并构成侵权。
 1. 您一旦开始复制、下载、安装或者使用本产品,即被视为完全理解并接受本协议的各项条款,在享有上述条款授予的许可权力同时,也受到相关的约束和限制,本协议许可范围以外的行为,将直接违反本协议并构成侵权。
-2. 一旦您违反本协议的条款,如梦技术团队随时可能终止本协议、收回许可和授权,并要求您承担相应法律和经济责任。
+2. 一旦您违反本协议的条款,BladeX团队随时可能终止本协议、收回许可和授权,并要求您承担相应法律和经济责任。

A diferenza do arquivo foi suprimida porque é demasiado grande
+ 20 - 18
doc/sql/bladex-saber-mysql.sql


A diferenza do arquivo foi suprimida porque é demasiado grande
+ 23 - 21
doc/sql/bladex-sword-mysql.sql


+ 60 - 0
doc/sql/bladex-tenant-mysql-update-RC5.sql

@@ -0,0 +1,60 @@
+-- ----------------------------
+-- 租户字段增加
+-- ----------------------------
+ALTER TABLE `bladex`.`blade_notice`
+    ADD COLUMN `tenant_code` varchar(12) NULL DEFAULT '000000' COMMENT '租户编号' AFTER `id`;
+ALTER TABLE `bladex`.`blade_dept`
+    ADD COLUMN `tenant_code` varchar(12) NULL DEFAULT '000000' COMMENT '租户编号' AFTER `id`;
+ALTER TABLE `bladex`.`blade_role`
+    ADD COLUMN `tenant_code` varchar(12) NULL DEFAULT '000000' COMMENT '租户编号' AFTER `id`;
+ALTER TABLE `bladex`.`blade_user`
+    ADD COLUMN `tenant_code` varchar(12) NULL DEFAULT '000000' COMMENT '租户编号' AFTER `id`;
+ALTER TABLE `bladex`.`blade_log_api`
+    ADD COLUMN `tenant_code` varchar(12) NULL DEFAULT '000000' COMMENT '租户编号' AFTER `id`;
+ALTER TABLE `bladex`.`blade_log_error`
+    ADD COLUMN `tenant_code` varchar(12) NULL DEFAULT '000000' COMMENT '租户编号' AFTER `id`;
+ALTER TABLE `bladex`.`blade_log_usual`
+    ADD COLUMN `tenant_code` varchar(12) NULL DEFAULT '000000' COMMENT '租户编号' AFTER `id`;
+
+
+-- ----------------------------
+-- 租户菜单增加
+-- ----------------------------
+INSERT INTO `blade_menu`(`tenant_code`, `parent_id`, `code`, `name`, `alias`, `path`, `source`, `sort`, `category`, `action`, `is_open`, `remark`, `is_deleted`)
+VALUES ('000000', 56, 'tenant', '租户管理', 'menu', '/blade-system/tenant', NULL, 1, 1, 0, 1, NULL, 0);
+set @parentid = (SELECT LAST_INSERT_ID());
+INSERT INTO `blade_menu`(`tenant_code`, `parent_id`, `code`, `name`, `alias`, `path`, `source`, `sort`, `category`, `action`, `is_open`, `remark`, `is_deleted`)
+VALUES ('000000', @parentid, 'tenant_add', '新增', 'add', '/blade-system/tenant/add', 'plus', 1, 2, 1, 1, NULL, 0);
+INSERT INTO `blade_menu`(`tenant_code`, `parent_id`, `code`, `name`, `alias`, `path`, `source`, `sort`, `category`, `action`, `is_open`, `remark`, `is_deleted`)
+VALUES ('000000', @parentid, 'tenant_edit', '修改', 'edit', '/blade-system/tenant/edit', 'form', 1, 2, 1, 1, NULL, 0);
+INSERT INTO `blade_menu`(`tenant_code`, `parent_id`, `code`, `name`, `alias`, `path`, `source`, `sort`, `category`, `action`, `is_open`, `remark`, `is_deleted`)
+VALUES ('000000', @parentid, 'tenant_delete', '删除', 'delete', '/blade-system/tenant/delete', 'delete', 1, 2, 1, 1, NULL, 0);
+INSERT INTO `blade_menu`(`tenant_code`, `parent_id`, `code`, `name`, `alias`, `path`, `source`, `sort`, `category`, `action`, `is_open`, `remark`, `is_deleted`)
+VALUES ('000000', @parentid, 'tenant_view', '查看', 'view', '/blade-system/tenant/view', 'file-text', 1, 2, 1, 1, NULL, 0);
+
+-- ----------------------------
+-- 租户表创建
+-- ----------------------------
+DROP TABLE IF EXISTS `blade_tenant`;
+CREATE TABLE `blade_tenant`  (
+ `id` int(11) NOT NULL AUTO_INCREMENT COMMENT '主键',
+ `tenant_code` varchar(12) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '租户编号',
+ `tenant_name` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '租户名称',
+ `linkman` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '联系人',
+ `contact_number` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '联系电话',
+ `address` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '联系地址',
+ `create_user` int(11) NULL DEFAULT NULL COMMENT '创建人',
+ `create_time` datetime(0) NULL DEFAULT NULL COMMENT '创建时间',
+ `update_user` int(11) NULL DEFAULT NULL COMMENT '修改人',
+ `update_time` datetime(0) NULL DEFAULT NULL COMMENT '修改时间',
+ `status` int(2) NULL DEFAULT NULL COMMENT '状态',
+ `is_deleted` int(2) NULL DEFAULT 0 COMMENT '是否已删除',
+ PRIMARY KEY (`id`) USING BTREE
+) ENGINE = InnoDB AUTO_INCREMENT = 2 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci;
+
+-- ----------------------------
+-- 租户表数据插入
+-- ----------------------------
+BEGIN;
+INSERT INTO `blade_tenant` VALUES (1, '000000', '管理组', 'admin', '666666', '管理组', 1, '2019-01-01 00:00:39', 1, '2019-01-01 00:00:39', 1, 0);
+COMMIT;

+ 9 - 9
pom.xml

@@ -7,17 +7,16 @@
     <groupId>org.springblade</groupId>
     <groupId>org.springblade</groupId>
     <artifactId>BladeX-Boot</artifactId>
     <artifactId>BladeX-Boot</artifactId>
     <packaging>jar</packaging>
     <packaging>jar</packaging>
-    <version>2.0.0.RC5</version>
+    <version>2.0.0.RC6</version>
 
 
     <properties>
     <properties>
-        <bladex.tool.version>2.0.0.RC5</bladex.tool.version>
-        <bladex.project.version>2.0.0.RC5</bladex.project.version>
+        <bladex.tool.version>2.0.0.RC6</bladex.tool.version>
 
 
         <java.version>1.8</java.version>
         <java.version>1.8</java.version>
         <swagger.version>2.9.2</swagger.version>
         <swagger.version>2.9.2</swagger.version>
         <swagger.models.version>1.5.21</swagger.models.version>
         <swagger.models.version>1.5.21</swagger.models.version>
-        <swagger.bootstrapui.version>1.8.9</swagger.bootstrapui.version>
-        <mybatis.plus.version>3.0.7.1</mybatis.plus.version>
+        <swagger.bootstrapui.version>1.9.0</swagger.bootstrapui.version>
+        <mybatis.plus.version>3.1.0</mybatis.plus.version>
         <protostuff.version>1.6.0</protostuff.version>
         <protostuff.version>1.6.0</protostuff.version>
 
 
         <spring.boot.version>2.1.3.RELEASE</spring.boot.version>
         <spring.boot.version>2.1.3.RELEASE</spring.boot.version>
@@ -49,10 +48,6 @@
     </dependencyManagement>
     </dependencyManagement>
 
 
     <dependencies>
     <dependencies>
-        <dependency>
-            <groupId>org.springframework.kafka</groupId>
-            <artifactId>spring-kafka</artifactId>
-        </dependency>
         <dependency>
         <dependency>
             <groupId>org.springblade</groupId>
             <groupId>org.springblade</groupId>
             <artifactId>blade-core-boot</artifactId>
             <artifactId>blade-core-boot</artifactId>
@@ -69,6 +64,11 @@
             <artifactId>blade-starter-swagger</artifactId>
             <artifactId>blade-starter-swagger</artifactId>
             <version>${bladex.tool.version}</version>
             <version>${bladex.tool.version}</version>
         </dependency>
         </dependency>
+        <dependency>
+            <groupId>org.springblade</groupId>
+            <artifactId>blade-starter-tenant</artifactId>
+            <version>${bladex.tool.version}</version>
+        </dependency>
         <dependency>
         <dependency>
             <groupId>org.springblade</groupId>
             <groupId>org.springblade</groupId>
             <artifactId>blade-core-auto</artifactId>
             <artifactId>blade-core-auto</artifactId>

+ 1 - 0
src/main/java/org/springblade/common/config/BladeConfiguration.java

@@ -36,6 +36,7 @@ public class BladeConfiguration implements WebMvcConfigurer {
 		SecureRegistry secureRegistry = new SecureRegistry();
 		SecureRegistry secureRegistry = new SecureRegistry();
 		secureRegistry.excludePathPatterns("/blade-auth/**");
 		secureRegistry.excludePathPatterns("/blade-auth/**");
 		secureRegistry.excludePathPatterns("/blade-log/**");
 		secureRegistry.excludePathPatterns("/blade-log/**");
+		secureRegistry.excludePathPatterns("/blade-system/menu/auth-routes");
 		secureRegistry.excludePathPatterns("/doc.html");
 		secureRegistry.excludePathPatterns("/doc.html");
 		secureRegistry.excludePathPatterns("/js/**");
 		secureRegistry.excludePathPatterns("/js/**");
 		secureRegistry.excludePathPatterns("/webjars/**");
 		secureRegistry.excludePathPatterns("/webjars/**");

+ 53 - 5
src/main/java/org/springblade/core/secure/utils/SecureUtil.java

@@ -21,14 +21,15 @@ import io.jsonwebtoken.JwtBuilder;
 import io.jsonwebtoken.Jwts;
 import io.jsonwebtoken.Jwts;
 import io.jsonwebtoken.SignatureAlgorithm;
 import io.jsonwebtoken.SignatureAlgorithm;
 import org.springblade.core.secure.BladeUser;
 import org.springblade.core.secure.BladeUser;
+import org.springblade.core.tool.utils.Charsets;
 import org.springblade.core.tool.utils.Func;
 import org.springblade.core.tool.utils.Func;
 import org.springblade.core.tool.utils.StringPool;
 import org.springblade.core.tool.utils.StringPool;
 import org.springblade.core.tool.utils.WebUtil;
 import org.springblade.core.tool.utils.WebUtil;
 
 
 import javax.crypto.spec.SecretKeySpec;
 import javax.crypto.spec.SecretKeySpec;
 import javax.servlet.http.HttpServletRequest;
 import javax.servlet.http.HttpServletRequest;
-import javax.xml.bind.DatatypeConverter;
 import java.security.Key;
 import java.security.Key;
+import java.util.Base64;
 import java.util.Calendar;
 import java.util.Calendar;
 import java.util.Date;
 import java.util.Date;
 import java.util.Map;
 import java.util.Map;
@@ -48,8 +49,9 @@ public class SecureUtil {
 	public final static String ROLE_ID = "roleId";
 	public final static String ROLE_ID = "roleId";
 	public final static String USER_NAME = "userName";
 	public final static String USER_NAME = "userName";
 	public final static String ROLE_NAME = "roleName";
 	public final static String ROLE_NAME = "roleName";
+	public final static String TENANT_CODE = "tenantCode";
 	public final static Integer AUTH_LENGTH = 7;
 	public final static Integer AUTH_LENGTH = 7;
-	private static String BASE64_SECURITY = DatatypeConverter.printBase64Binary("BladeX".getBytes());
+	public static String BASE64_SECURITY = Base64.getEncoder().encodeToString("BladeX".getBytes(Charsets.UTF_8));
 
 
 	/**
 	/**
 	 * 获取用户信息
 	 * 获取用户信息
@@ -82,14 +84,18 @@ public class SecureUtil {
 			return null;
 			return null;
 		}
 		}
 		Integer userId = Func.toInt(claims.get(SecureUtil.USER_ID));
 		Integer userId = Func.toInt(claims.get(SecureUtil.USER_ID));
+		String tenantCode = Func.toStr(claims.get(SecureUtil.TENANT_CODE));
 		String roleId = Func.toStr(claims.get(SecureUtil.ROLE_ID));
 		String roleId = Func.toStr(claims.get(SecureUtil.ROLE_ID));
 		String account = Func.toStr(claims.get(SecureUtil.ACCOUNT));
 		String account = Func.toStr(claims.get(SecureUtil.ACCOUNT));
 		String roleName = Func.toStr(claims.get(SecureUtil.ROLE_NAME));
 		String roleName = Func.toStr(claims.get(SecureUtil.ROLE_NAME));
+		String userName = Func.toStr(claims.get(SecureUtil.USER_NAME));
 		BladeUser bladeUser = new BladeUser();
 		BladeUser bladeUser = new BladeUser();
-		bladeUser.setAccount(account);
 		bladeUser.setUserId(userId);
 		bladeUser.setUserId(userId);
+		bladeUser.setTenantCode(tenantCode);
+		bladeUser.setAccount(account);
 		bladeUser.setRoleId(roleId);
 		bladeUser.setRoleId(roleId);
 		bladeUser.setRoleName(roleName);
 		bladeUser.setRoleName(roleName);
+		bladeUser.setUserName(userName);
 		return bladeUser;
 		return bladeUser;
 	}
 	}
 
 
@@ -136,6 +142,48 @@ public class SecureUtil {
 		return (null == user) ? StringPool.EMPTY : user.getAccount();
 		return (null == user) ? StringPool.EMPTY : user.getAccount();
 	}
 	}
 
 
+	/**
+	 * 获取用户名
+	 *
+	 * @return userName
+	 */
+	public static String getUserName() {
+		BladeUser user = getUser();
+		return (null == user) ? StringPool.EMPTY : user.getUserName();
+	}
+
+	/**
+	 * 获取用户名
+	 *
+	 * @param request request
+	 * @return userName
+	 */
+	public static String getUserName(HttpServletRequest request) {
+		BladeUser user = getUser(request);
+		return (null == user) ? StringPool.EMPTY : user.getUserName();
+	}
+
+	/**
+	 * 获取租户编号
+	 *
+	 * @return tenantCode
+	 */
+	public static String getTenantCode() {
+		BladeUser user = getUser();
+		return (null == user) ? StringPool.EMPTY : user.getTenantCode();
+	}
+
+	/**
+	 * 获取租户编号
+	 *
+	 * @param request request
+	 * @return tenantCode
+	 */
+	public static String getTenantCode(HttpServletRequest request) {
+		BladeUser user = getUser(request);
+		return (null == user) ? StringPool.EMPTY : user.getTenantCode();
+	}
+
 	/**
 	/**
 	 * 获取Claims
 	 * 获取Claims
 	 *
 	 *
@@ -182,7 +230,7 @@ public class SecureUtil {
 	public static Claims parseJWT(String jsonWebToken) {
 	public static Claims parseJWT(String jsonWebToken) {
 		try {
 		try {
 			Claims claims = Jwts.parser()
 			Claims claims = Jwts.parser()
-				.setSigningKey(DatatypeConverter.parseBase64Binary(BASE64_SECURITY))
+				.setSigningKey(Base64.getDecoder().decode(BASE64_SECURITY))
 				.parseClaimsJws(jsonWebToken).getBody();
 				.parseClaimsJws(jsonWebToken).getBody();
 			return claims;
 			return claims;
 		} catch (Exception ex) {
 		} catch (Exception ex) {
@@ -206,7 +254,7 @@ public class SecureUtil {
 		Date now = new Date(nowMillis);
 		Date now = new Date(nowMillis);
 
 
 		//生成签名密钥
 		//生成签名密钥
-		byte[] apiKeySecretBytes = DatatypeConverter.parseBase64Binary(BASE64_SECURITY);
+		byte[] apiKeySecretBytes = Base64.getDecoder().decode(BASE64_SECURITY);
 		Key signingKey = new SecretKeySpec(apiKeySecretBytes, signatureAlgorithm.getJcaName());
 		Key signingKey = new SecretKeySpec(apiKeySecretBytes, signatureAlgorithm.getJcaName());
 
 
 		//添加构成JWT的类
 		//添加构成JWT的类

+ 5 - 3
src/main/java/org/springblade/modules/auth/AuthController.java

@@ -54,15 +54,16 @@ public class AuthController {
 
 
 	@ApiLog("登录用户验证")
 	@ApiLog("登录用户验证")
 	@PostMapping("token")
 	@PostMapping("token")
-	@ApiOperation(value = "获取认证token", notes = "传入账号:account,密码:password")
-	public R<AuthInfo> token(@ApiParam(value = "账号", required = true) @RequestParam String account,
+	@ApiOperation(value = "获取认证token", notes = "传入租户编号:tenantCode,账号:account,密码:password")
+	public R<AuthInfo> token(@ApiParam(value = "租户编号", required = true) @RequestParam String tenantCode,
+							 @ApiParam(value = "账号", required = true) @RequestParam String account,
 							 @ApiParam(value = "密码", required = true) @RequestParam String password) {
 							 @ApiParam(value = "密码", required = true) @RequestParam String password) {
 
 
 		if (Func.hasEmpty(account, password)) {
 		if (Func.hasEmpty(account, password)) {
 			return R.fail("接口调用不合法");
 			return R.fail("接口调用不合法");
 		}
 		}
 
 
-		UserInfo userInfo = service.userInfo(account, DigestUtil.encrypt(password));
+		UserInfo userInfo = service.userInfo(tenantCode, account, DigestUtil.encrypt(password));
 
 
 		User user = userInfo.getUser();
 		User user = userInfo.getUser();
 
 
@@ -75,6 +76,7 @@ public class AuthController {
 		Map<String, String> param = new HashMap<>(16);
 		Map<String, String> param = new HashMap<>(16);
 		param.put(SecureUtil.USER_ID, Func.toStr(user.getId()));
 		param.put(SecureUtil.USER_ID, Func.toStr(user.getId()));
 		param.put(SecureUtil.ROLE_ID, user.getRoleId());
 		param.put(SecureUtil.ROLE_ID, user.getRoleId());
+		param.put(SecureUtil.TENANT_CODE, user.getTenantCode());
 		param.put(SecureUtil.ACCOUNT, user.getAccount());
 		param.put(SecureUtil.ACCOUNT, user.getAccount());
 		param.put(SecureUtil.USER_NAME, user.getRealName());
 		param.put(SecureUtil.USER_NAME, user.getRealName());
 		param.put(SecureUtil.ROLE_NAME, Func.join(userInfo.getRoles()));
 		param.put(SecureUtil.ROLE_NAME, Func.join(userInfo.getRoles()));

+ 2 - 2
src/main/java/org/springblade/modules/develop/controller/CodeController.java

@@ -26,7 +26,7 @@ import org.springblade.core.tool.api.R;
 import org.springblade.core.tool.utils.Func;
 import org.springblade.core.tool.utils.Func;
 import org.springblade.modules.develop.entity.Code;
 import org.springblade.modules.develop.entity.Code;
 import org.springblade.modules.develop.service.ICodeService;
 import org.springblade.modules.develop.service.ICodeService;
-import org.springblade.modules.develop.support.BladeGenerator;
+import org.springblade.modules.develop.support.BladeCodeGenerator;
 import org.springframework.web.bind.annotation.*;
 import org.springframework.web.bind.annotation.*;
 import springfox.documentation.annotations.ApiIgnore;
 import springfox.documentation.annotations.ApiIgnore;
 
 
@@ -100,7 +100,7 @@ public class CodeController extends BladeController {
 	public R genCode(@ApiParam(value = "主键集合", required = true) @RequestParam String ids, @RequestParam(defaultValue = "sword") String system) {
 	public R genCode(@ApiParam(value = "主键集合", required = true) @RequestParam String ids, @RequestParam(defaultValue = "sword") String system) {
 		Collection<Code> codes = codeService.listByIds(Func.toIntList(ids));
 		Collection<Code> codes = codeService.listByIds(Func.toIntList(ids));
 		codes.forEach(code -> {
 		codes.forEach(code -> {
-			BladeGenerator generator = new BladeGenerator();
+			BladeCodeGenerator generator = new BladeCodeGenerator();
 			generator.setSystemName(system);
 			generator.setSystemName(system);
 			generator.setServiceName(code.getServiceName());
 			generator.setServiceName(code.getServiceName());
 			generator.setPackageName(code.getPackageName());
 			generator.setPackageName(code.getPackageName());

+ 18 - 2
src/main/java/org/springblade/modules/develop/support/BladeGenerator.java → src/main/java/org/springblade/modules/develop/support/BladeCodeGenerator.java

@@ -46,11 +46,15 @@ import java.util.*;
  */
  */
 @Data
 @Data
 @Slf4j
 @Slf4j
-public class BladeGenerator {
+public class BladeCodeGenerator {
 	/**
 	/**
 	 * 代码所在系统
 	 * 代码所在系统
 	 */
 	 */
 	private String systemName = CommonConstant.SWORD_NAME;
 	private String systemName = CommonConstant.SWORD_NAME;
+	/**
+	 * 代码模块名称
+	 */
+	private String codeName;
 	/**
 	/**
 	 * 代码所在服务名
 	 * 代码所在服务名
 	 */
 	 */
@@ -87,6 +91,10 @@ public class BladeGenerator {
 	 * 基础业务字段
 	 * 基础业务字段
 	 */
 	 */
 	private String[] superEntityColumns = {"id", "create_time", "create_user", "update_time", "update_user", "status", "is_deleted"};
 	private String[] superEntityColumns = {"id", "create_time", "create_user", "update_time", "update_user", "status", "is_deleted"};
+	/**
+	 * 租户字段
+	 */
+	private String tenantColumn = "tenant_code";
 	/**
 	/**
 	 * 是否启用swagger
 	 * 是否启用swagger
 	 */
 	 */
@@ -175,16 +183,24 @@ public class BladeGenerator {
 		InjectionConfig cfg = new InjectionConfig() {
 		InjectionConfig cfg = new InjectionConfig() {
 			@Override
 			@Override
 			public void initMap() {
 			public void initMap() {
+				map.put("codeName", codeName);
 				map.put("serviceName", serviceName);
 				map.put("serviceName", serviceName);
 				map.put("servicePackage", servicePackage);
 				map.put("servicePackage", servicePackage);
+				map.put("tenantColumn", tenantColumn);
 				this.setMap(map);
 				this.setMap(map);
 			}
 			}
 		};
 		};
 		List<FileOutConfig> focList = new ArrayList<>();
 		List<FileOutConfig> focList = new ArrayList<>();
+		focList.add(new FileOutConfig("/templates/sql/menu.sql.vm") {
+			@Override
+			public String outputFile(TableInfo tableInfo) {
+				map.put("entityKey", (tableInfo.getEntityName().toLowerCase()));
+				return getOutputDir() + "/" + "/sql/menu.mysql";
+			}
+		});
 		focList.add(new FileOutConfig("/templates/entityVO.java.vm") {
 		focList.add(new FileOutConfig("/templates/entityVO.java.vm") {
 			@Override
 			@Override
 			public String outputFile(TableInfo tableInfo) {
 			public String outputFile(TableInfo tableInfo) {
-				map.put("entityKey", StringUtil.humpToLine(tableInfo.getEntityName()));
 				return getOutputDir() + "/" + packageName.replace(".", "/") + "/" + "vo" + "/" + tableInfo.getEntityName() + "VO" + StringPool.DOT_JAVA;
 				return getOutputDir() + "/" + packageName.replace(".", "/") + "/" + "vo" + "/" + tableInfo.getEntityName() + "VO" + StringPool.DOT_JAVA;
 			}
 			}
 		});
 		});

+ 8 - 5
src/main/java/org/springblade/modules/system/controller/DeptController.java

@@ -16,11 +16,14 @@
  */
  */
 package org.springblade.modules.system.controller;
 package org.springblade.modules.system.controller;
 
 
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import io.swagger.annotations.*;
 import io.swagger.annotations.*;
 import lombok.AllArgsConstructor;
 import lombok.AllArgsConstructor;
 import org.springblade.core.boot.ctrl.BladeController;
 import org.springblade.core.boot.ctrl.BladeController;
 import org.springblade.core.mp.support.Condition;
 import org.springblade.core.mp.support.Condition;
+import org.springblade.core.secure.BladeUser;
 import org.springblade.core.tool.api.R;
 import org.springblade.core.tool.api.R;
+import org.springblade.core.tool.constant.BladeConstant;
 import org.springblade.core.tool.node.INode;
 import org.springblade.core.tool.node.INode;
 import org.springblade.core.tool.utils.Func;
 import org.springblade.core.tool.utils.Func;
 import org.springblade.modules.system.entity.Dept;
 import org.springblade.modules.system.entity.Dept;
@@ -39,7 +42,6 @@ import java.util.Map;
  *
  *
  * @author Chill
  * @author Chill
  */
  */
-@ApiIgnore
 @RestController
 @RestController
 @AllArgsConstructor
 @AllArgsConstructor
 @RequestMapping("/blade-system/dept")
 @RequestMapping("/blade-system/dept")
@@ -68,8 +70,9 @@ public class DeptController extends BladeController {
 		@ApiImplicitParam(name = "fullName", value = "部门全称", paramType = "query", dataType = "string")
 		@ApiImplicitParam(name = "fullName", value = "部门全称", paramType = "query", dataType = "string")
 	})
 	})
 	@ApiOperation(value = "列表", notes = "传入dept", position = 2)
 	@ApiOperation(value = "列表", notes = "传入dept", position = 2)
-	public R<List<INode>> list(@ApiIgnore @RequestParam Map<String, Object> dept) {
-		List<Dept> list = deptService.list(Condition.getQueryWrapper(dept, Dept.class));
+	public R<List<INode>> list(@ApiIgnore @RequestParam Map<String, Object> dept, BladeUser bladeUser) {
+		QueryWrapper<Dept> queryWrapper = Condition.getQueryWrapper(dept, Dept.class);
+		List<Dept> list = deptService.list((!bladeUser.getTenantCode().equals(BladeConstant.ADMIN_TENANT_CODE)) ? queryWrapper.lambda().eq(Dept::getTenantCode, bladeUser.getTenantCode()) : queryWrapper);
 		DeptWrapper deptWrapper = new DeptWrapper();
 		DeptWrapper deptWrapper = new DeptWrapper();
 		return R.data(deptWrapper.listNodeVO(list));
 		return R.data(deptWrapper.listNodeVO(list));
 	}
 	}
@@ -81,8 +84,8 @@ public class DeptController extends BladeController {
 	 */
 	 */
 	@GetMapping("/tree")
 	@GetMapping("/tree")
 	@ApiOperation(value = "树形结构", notes = "树形结构", position = 3)
 	@ApiOperation(value = "树形结构", notes = "树形结构", position = 3)
-	public R<List<DeptVO>> tree() {
-		List<DeptVO> tree = deptService.tree();
+	public R<List<DeptVO>> tree(String tenantCode) {
+		List<DeptVO> tree = deptService.tree(tenantCode);
 		return R.data(tree);
 		return R.data(tree);
 	}
 	}
 
 

+ 0 - 1
src/main/java/org/springblade/modules/system/controller/DictController.java

@@ -43,7 +43,6 @@ import static org.springblade.common.cache.CacheNames.DICT_VALUE;
  *
  *
  * @author Chill
  * @author Chill
  */
  */
-@ApiIgnore
 @RestController
 @RestController
 @AllArgsConstructor
 @AllArgsConstructor
 @RequestMapping("/blade-system/dict")
 @RequestMapping("/blade-system/dict")

+ 2 - 2
src/main/java/org/springblade/modules/system/controller/RoleController.java

@@ -79,8 +79,8 @@ public class RoleController extends BladeController {
 	 */
 	 */
 	@GetMapping("/tree")
 	@GetMapping("/tree")
 	@ApiOperation(value = "树形结构", notes = "树形结构", position = 3)
 	@ApiOperation(value = "树形结构", notes = "树形结构", position = 3)
-	public R<List<RoleVO>> tree() {
-		List<RoleVO> tree = roleService.tree();
+	public R<List<RoleVO>> tree(String tenantCode) {
+		List<RoleVO> tree = roleService.tree(tenantCode);
 		return R.data(tree);
 		return R.data(tree);
 	}
 	}
 
 

+ 119 - 0
src/main/java/org/springblade/modules/system/controller/TenantController.java

@@ -0,0 +1,119 @@
+/*
+ *      Copyright (c) 2018-2028, Chill Zhuang All rights reserved.
+ *
+ *  Redistribution and use in source and binary forms, with or without
+ *  modification, are permitted provided that the following conditions are met:
+ *
+ *  Redistributions of source code must retain the above copyright notice,
+ *  this list of conditions and the following disclaimer.
+ *  Redistributions in binary form must reproduce the above copyright
+ *  notice, this list of conditions and the following disclaimer in the
+ *  documentation and/or other materials provided with the distribution.
+ *  Neither the name of the dreamlu.net developer nor the names of its
+ *  contributors may be used to endorse or promote products derived from
+ *  this software without specific prior written permission.
+ *  Author: Chill 庄骞 (smallchill@163.com)
+ */
+package org.springblade.modules.system.controller;
+
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import io.swagger.annotations.*;
+import lombok.AllArgsConstructor;
+import org.springblade.core.boot.ctrl.BladeController;
+import org.springblade.core.mp.support.Condition;
+import org.springblade.core.mp.support.Query;
+import org.springblade.core.secure.BladeUser;
+import org.springblade.core.tool.api.R;
+import org.springblade.core.tool.constant.BladeConstant;
+import org.springblade.core.tool.utils.Func;
+import org.springblade.modules.system.entity.Tenant;
+import org.springblade.modules.system.service.ITenantService;
+import org.springframework.web.bind.annotation.*;
+import springfox.documentation.annotations.ApiIgnore;
+
+import javax.validation.Valid;
+import java.util.List;
+import java.util.Map;
+
+/**
+ * 控制器
+ *
+ * @author Chill
+ */
+@RestController
+@AllArgsConstructor
+@RequestMapping("/blade-system/tenant")
+@ApiIgnore
+@Api(value = "租户管理", tags = "接口")
+public class TenantController extends BladeController {
+
+	private ITenantService tenantService;
+
+	/**
+	 * 详情
+	 */
+	@GetMapping("/detail")
+	@ApiOperation(value = "详情", notes = "传入tenant", position = 1)
+	public R<Tenant> detail(Tenant tenant) {
+		Tenant detail = tenantService.getOne(Condition.getQueryWrapper(tenant));
+		return R.data(detail);
+	}
+
+	/**
+	 * 分页
+	 */
+	@GetMapping("/list")
+	@ApiImplicitParams({
+		@ApiImplicitParam(name = "tenantCode", value = "参数名称", paramType = "query", dataType = "string"),
+		@ApiImplicitParam(name = "tenantName", value = "角色别名", paramType = "query", dataType = "string"),
+		@ApiImplicitParam(name = "contactNumber", value = "联系电话", paramType = "query", dataType = "string")
+	})
+	@ApiOperation(value = "分页", notes = "传入tenant", position = 2)
+	public R<IPage<Tenant>> list(@ApiIgnore @RequestParam Map<String, Object> tenant, Query query, BladeUser bladeUser) {
+		QueryWrapper<Tenant> queryWrapper = Condition.getQueryWrapper(tenant, Tenant.class);
+		IPage<Tenant> pages = tenantService.page(Condition.getPage(query), (!bladeUser.getTenantCode().equals(BladeConstant.ADMIN_TENANT_CODE)) ? queryWrapper.lambda().eq(Tenant::getTenantCode, bladeUser.getTenantCode()) : queryWrapper);
+		return R.data(pages);
+	}
+
+	/**
+	 * 下拉数据源
+	 */
+	@GetMapping("/select")
+	@ApiOperation(value = "下拉数据源", notes = "传入tenant", position = 3)
+	public R<List<Tenant>> select(Tenant tenant) {
+		List<Tenant> list = tenantService.list(Condition.getQueryWrapper(tenant));
+		return R.data(list);
+	}
+
+	/**
+	 * 自定义分页
+	 */
+	@GetMapping("/page")
+	@ApiOperation(value = "分页", notes = "传入tenant", position = 4)
+	public R<IPage<Tenant>> page(Tenant tenant, Query query) {
+		IPage<Tenant> pages = tenantService.selectTenantPage(Condition.getPage(query), tenant);
+		return R.data(pages);
+	}
+
+	/**
+	 * 新增或修改
+	 */
+	@PostMapping("/submit")
+	@ApiOperation(value = "新增或修改", notes = "传入tenant", position = 7)
+	public R submit(@Valid @RequestBody Tenant tenant) {
+		return R.status(tenantService.saveTenant(tenant));
+	}
+
+
+	/**
+	 * 删除
+	 */
+	@PostMapping("/remove")
+	@ApiOperation(value = "逻辑删除", notes = "传入ids", position = 8)
+	public R remove(@ApiParam(value = "主键集合", required = true) @RequestParam String ids) {
+		return R.status(tenantService.deleteLogic(Func.toIntList(ids)));
+	}
+
+
+}

+ 6 - 3
src/main/java/org/springblade/modules/system/controller/UserController.java

@@ -17,6 +17,7 @@
 package org.springblade.modules.system.controller;
 package org.springblade.modules.system.controller;
 
 
 
 
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.baomidou.mybatisplus.core.metadata.IPage;
 import io.swagger.annotations.ApiImplicitParam;
 import io.swagger.annotations.ApiImplicitParam;
 import io.swagger.annotations.ApiImplicitParams;
 import io.swagger.annotations.ApiImplicitParams;
@@ -25,7 +26,9 @@ import io.swagger.annotations.ApiParam;
 import lombok.AllArgsConstructor;
 import lombok.AllArgsConstructor;
 import org.springblade.core.mp.support.Condition;
 import org.springblade.core.mp.support.Condition;
 import org.springblade.core.mp.support.Query;
 import org.springblade.core.mp.support.Query;
+import org.springblade.core.secure.BladeUser;
 import org.springblade.core.tool.api.R;
 import org.springblade.core.tool.api.R;
+import org.springblade.core.tool.constant.BladeConstant;
 import org.springblade.core.tool.utils.DigestUtil;
 import org.springblade.core.tool.utils.DigestUtil;
 import org.springblade.core.tool.utils.Func;
 import org.springblade.core.tool.utils.Func;
 import org.springblade.modules.system.entity.User;
 import org.springblade.modules.system.entity.User;
@@ -74,12 +77,12 @@ public class UserController {
 		@ApiImplicitParam(name = "realName", value = "姓名", paramType = "query", dataType = "string")
 		@ApiImplicitParam(name = "realName", value = "姓名", paramType = "query", dataType = "string")
 	})
 	})
 	@ApiOperation(value = "列表", notes = "传入account和realName", position = 2)
 	@ApiOperation(value = "列表", notes = "传入account和realName", position = 2)
-	public R<IPage<UserVO>> list(@ApiIgnore @RequestParam Map<String, Object> user, Query query) {
-		IPage<User> pages = userService.page(Condition.getPage(query), Condition.getQueryWrapper(user, User.class));
+	public R<IPage<UserVO>> list(@ApiIgnore @RequestParam Map<String, Object> user, Query query, BladeUser bladeUser) {
+		QueryWrapper<User> queryWrapper = Condition.getQueryWrapper(user, User.class);
+		IPage<User> pages = userService.page(Condition.getPage(query), (!bladeUser.getTenantCode().equals(BladeConstant.ADMIN_TENANT_CODE)) ? queryWrapper.lambda().eq(User::getTenantCode, bladeUser.getTenantCode()) : queryWrapper);
 		UserWrapper userWrapper = new UserWrapper(userService, dictService);
 		UserWrapper userWrapper = new UserWrapper(userService, dictService);
 		return R.data(userWrapper.pageVO(pages));
 		return R.data(userWrapper.pageVO(pages));
 	}
 	}
-
 	/**
 	/**
 	 * 新增或修改
 	 * 新增或修改
 	 */
 	 */

+ 6 - 0
src/main/java/org/springblade/modules/system/entity/Dept.java

@@ -45,6 +45,12 @@ public class Dept implements Serializable {
 	@TableId(value = "id", type = IdType.AUTO)
 	@TableId(value = "id", type = IdType.AUTO)
 	private Integer id;
 	private Integer id;
 
 
+	/**
+	 * 租户编号
+	 */
+	@ApiModelProperty(value = "租户编号")
+	private String tenantCode;
+
 	/**
 	/**
 	 * 父主键
 	 * 父主键
 	 */
 	 */

+ 6 - 0
src/main/java/org/springblade/modules/system/entity/Role.java

@@ -45,6 +45,12 @@ public class Role implements Serializable {
 	@TableId(value = "id", type = IdType.AUTO)
 	@TableId(value = "id", type = IdType.AUTO)
 	private Integer id;
 	private Integer id;
 
 
+	/**
+	 * 租户编号
+	 */
+	@ApiModelProperty(value = "租户编号")
+	private String tenantCode;
+
 	/**
 	/**
 	 * 父主键
 	 * 父主键
 	 */
 	 */

+ 66 - 0
src/main/java/org/springblade/modules/system/entity/Tenant.java

@@ -0,0 +1,66 @@
+/*
+ *      Copyright (c) 2018-2028, Chill Zhuang All rights reserved.
+ *
+ *  Redistribution and use in source and binary forms, with or without
+ *  modification, are permitted provided that the following conditions are met:
+ *
+ *  Redistributions of source code must retain the above copyright notice,
+ *  this list of conditions and the following disclaimer.
+ *  Redistributions in binary form must reproduce the above copyright
+ *  notice, this list of conditions and the following disclaimer in the
+ *  documentation and/or other materials provided with the distribution.
+ *  Neither the name of the dreamlu.net developer nor the names of its
+ *  contributors may be used to endorse or promote products derived from
+ *  this software without specific prior written permission.
+ *  Author: Chill 庄骞 (smallchill@163.com)
+ */
+package org.springblade.modules.system.entity;
+
+import com.baomidou.mybatisplus.annotation.TableName;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import org.springblade.core.mp.base.BaseEntity;
+
+/**
+ * 实体类
+ *
+ * @author Chill
+ */
+@Data
+@TableName("blade_tenant")
+@EqualsAndHashCode(callSuper = true)
+@ApiModel(value = "Tenant对象", description = "Tenant对象")
+public class Tenant extends BaseEntity {
+
+	private static final long serialVersionUID = 1L;
+
+	/**
+	 * 租户编号
+	 */
+	@ApiModelProperty(value = "租户编号")
+	private String tenantCode;
+	/**
+	 * 租户名称
+	 */
+	@ApiModelProperty(value = "租户名称")
+	private String tenantName;
+	/**
+	 * 联系人
+	 */
+	@ApiModelProperty(value = "联系人")
+	private String linkman;
+	/**
+	 * 联系电话
+	 */
+	@ApiModelProperty(value = "联系电话")
+	private String contactNumber;
+	/**
+	 * 联系地址
+	 */
+	@ApiModelProperty(value = "联系地址")
+	private String address;
+
+
+}

+ 2 - 2
src/main/java/org/springblade/modules/system/entity/User.java

@@ -19,7 +19,7 @@ package org.springblade.modules.system.entity;
 import com.baomidou.mybatisplus.annotation.TableName;
 import com.baomidou.mybatisplus.annotation.TableName;
 import lombok.Data;
 import lombok.Data;
 import lombok.EqualsAndHashCode;
 import lombok.EqualsAndHashCode;
-import org.springblade.core.mp.base.BaseEntity;
+import org.springblade.core.tenant.mp.TenantEntity;
 
 
 import java.time.LocalDateTime;
 import java.time.LocalDateTime;
 
 
@@ -31,7 +31,7 @@ import java.time.LocalDateTime;
 @Data
 @Data
 @TableName("blade_user")
 @TableName("blade_user")
 @EqualsAndHashCode(callSuper = true)
 @EqualsAndHashCode(callSuper = true)
-public class User extends BaseEntity {
+public class User extends TenantEntity {
 
 
 	private static final long serialVersionUID = 1L;
 	private static final long serialVersionUID = 1L;
 
 

+ 2 - 1
src/main/java/org/springblade/modules/system/mapper/DeptMapper.java

@@ -42,8 +42,9 @@ public interface DeptMapper extends BaseMapper<Dept> {
 	/**
 	/**
 	 * 获取树形节点
 	 * 获取树形节点
 	 *
 	 *
+	 * @param tenantCode
 	 * @return
 	 * @return
 	 */
 	 */
-	List<DeptVO> tree();
+	List<DeptVO> tree(String tenantCode);
 
 
 }
 }

+ 4 - 1
src/main/java/org/springblade/modules/system/mapper/DeptMapper.xml

@@ -32,7 +32,10 @@
     </select>
     </select>
 
 
     <select id="tree" resultMap="treeNodeResultMap">
     <select id="tree" resultMap="treeNodeResultMap">
-        select id, parent_id, dept_name as title, id as `value`, id as `key` from blade_dept where is_deleted = 0
+        select id, parent_id, dept_name as title, id as 'value', id as 'key' from blade_dept where is_deleted = 0
+        <if test="_parameter!=null">
+            and tenant_code = #{_parameter}
+        </if>
     </select>
     </select>
 
 
 </mapper>
 </mapper>

+ 8 - 1
src/main/java/org/springblade/modules/system/mapper/DictMapper.xml

@@ -38,12 +38,19 @@
         from blade_dict where code = #{param1} and dict_key = #{param2} limit 1
         from blade_dict where code = #{param1} and dict_key = #{param2} limit 1
     </select>
     </select>
 
 
+    <!-- oracle 版本 -->
+    <!--<select id="getValue" resultType="java.lang.String">
+        select
+            dict_value
+        from blade_dict where code = #{param1, jdbcType=VARCHAR} and dict_key = #{param2} rownum 1
+    </select>-->
+
     <select id="getList" resultMap="dictResultMap">
     <select id="getList" resultMap="dictResultMap">
         select code, dict_key, dict_value, sort, remark from blade_dict where code = #{param1}
         select code, dict_key, dict_value, sort, remark from blade_dict where code = #{param1}
     </select>
     </select>
 
 
     <select id="tree" resultMap="treeNodeResultMap">
     <select id="tree" resultMap="treeNodeResultMap">
-        select id, parent_id, dict_value as title, id as `value`, id as `key` from blade_dict where is_deleted = 0
+        select id, parent_id, dict_value as title, id as 'value', id as 'key' from blade_dict where is_deleted = 0
     </select>
     </select>
 
 
 </mapper>
 </mapper>

+ 2 - 2
src/main/java/org/springblade/modules/system/mapper/MenuMapper.xml

@@ -38,7 +38,7 @@
     </select>
     </select>
 
 
     <select id="tree" resultMap="treeNodeResultMap">
     <select id="tree" resultMap="treeNodeResultMap">
-        select id, parent_id, name as title, id as `value`, id as `key` from blade_menu where is_deleted = 0 and category = 1
+        select id, parent_id, name as title, id as 'value', id as 'key' from blade_menu where is_deleted = 0 and category = 1
     </select>
     </select>
 
 
     <select id="allMenu" resultMap="menuResultMap">
     <select id="allMenu" resultMap="menuResultMap">
@@ -109,7 +109,7 @@
     </select>
     </select>
 
 
     <select id="grantTree" resultMap="treeNodeResultMap">
     <select id="grantTree" resultMap="treeNodeResultMap">
-        select id, parent_id, name as title, id as `value`, id as `key` from blade_menu where is_deleted = 0
+        select id, parent_id, name as title, id as 'value', id as 'key' from blade_menu where is_deleted = 0
     </select>
     </select>
 
 
     <select id="authRoutes" resultType="org.springblade.modules.system.dto.MenuDTO">
     <select id="authRoutes" resultType="org.springblade.modules.system.dto.MenuDTO">

+ 2 - 1
src/main/java/org/springblade/modules/system/mapper/RoleMapper.java

@@ -42,8 +42,9 @@ public interface RoleMapper extends BaseMapper<Role> {
 	/**
 	/**
 	 * 获取树形节点
 	 * 获取树形节点
 	 *
 	 *
+	 * @param tenantCode
 	 * @return
 	 * @return
 	 */
 	 */
-	List<RoleVO> tree();
+	List<RoleVO> tree(String tenantCode);
 
 
 }
 }

+ 4 - 1
src/main/java/org/springblade/modules/system/mapper/RoleMapper.xml

@@ -31,7 +31,10 @@
     </select>
     </select>
 
 
     <select id="tree" resultMap="treeNodeResultMap">
     <select id="tree" resultMap="treeNodeResultMap">
-        select id, parent_id, role_name as title, id as `value`, id as `key` from blade_role where is_deleted = 0
+        select id, parent_id, role_name as title, id as 'value', id as 'key' from blade_role where is_deleted = 0
+        <if test="_parameter!=null">
+            and tenant_code = #{_parameter}
+        </if>
     </select>
     </select>
 
 
 </mapper>
 </mapper>

+ 41 - 0
src/main/java/org/springblade/modules/system/mapper/TenantMapper.java

@@ -0,0 +1,41 @@
+/*
+ *      Copyright (c) 2018-2028, Chill Zhuang All rights reserved.
+ *
+ *  Redistribution and use in source and binary forms, with or without
+ *  modification, are permitted provided that the following conditions are met:
+ *
+ *  Redistributions of source code must retain the above copyright notice,
+ *  this list of conditions and the following disclaimer.
+ *  Redistributions in binary form must reproduce the above copyright
+ *  notice, this list of conditions and the following disclaimer in the
+ *  documentation and/or other materials provided with the distribution.
+ *  Neither the name of the dreamlu.net developer nor the names of its
+ *  contributors may be used to endorse or promote products derived from
+ *  this software without specific prior written permission.
+ *  Author: Chill 庄骞 (smallchill@163.com)
+ */
+package org.springblade.modules.system.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import org.springblade.modules.system.entity.Tenant;
+
+import java.util.List;
+
+/**
+ *  Mapper 接口
+ *
+ * @author Chill
+ */
+public interface TenantMapper extends BaseMapper<Tenant> {
+
+	/**
+	 * 自定义分页
+	 *
+	 * @param page
+	 * @param tenant
+	 * @return
+	 */
+	List<Tenant> selectTenantPage(IPage page, Tenant tenant);
+
+}

+ 25 - 0
src/main/java/org/springblade/modules/system/mapper/TenantMapper.xml

@@ -0,0 +1,25 @@
+<?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="org.springblade.modules.system.mapper.TenantMapper">
+
+    <!-- 通用查询映射结果 -->
+    <resultMap id="tenantResultMap" type="org.springblade.modules.system.entity.Tenant">
+        <result column="id" property="id"/>
+        <result column="create_user" property="createUser"/>
+        <result column="create_time" property="createTime"/>
+        <result column="update_user" property="updateUser"/>
+        <result column="update_time" property="updateTime"/>
+        <result column="status" property="status"/>
+        <result column="is_deleted" property="isDeleted"/>
+        <result column="tenant_name" property="tenantName"/>
+        <result column="linkman" property="linkman"/>
+        <result column="contact_number" property="contactNumber"/>
+        <result column="address" property="address"/>
+    </resultMap>
+
+
+    <select id="selectTenantPage" resultMap="tenantResultMap">
+        select * from blade_tenant where is_deleted = 0
+    </select>
+
+</mapper>

+ 2 - 1
src/main/java/org/springblade/modules/system/mapper/UserMapper.java

@@ -41,11 +41,12 @@ public interface UserMapper extends BaseMapper<User> {
 	/**
 	/**
 	 * 获取用户
 	 * 获取用户
 	 *
 	 *
+	 * @param tenantCode
 	 * @param account
 	 * @param account
 	 * @param password
 	 * @param password
 	 * @return
 	 * @return
 	 */
 	 */
-	User getUser(String account, String password);
+	User getUser(String tenantCode, String account, String password);
 
 
 	/**
 	/**
 	 * 获取角色名
 	 * 获取角色名

+ 2 - 1
src/main/java/org/springblade/modules/system/mapper/UserMapper.xml

@@ -5,6 +5,7 @@
     <!-- 通用查询映射结果 -->
     <!-- 通用查询映射结果 -->
     <resultMap id="userResultMap" type="org.springblade.modules.system.entity.User">
     <resultMap id="userResultMap" type="org.springblade.modules.system.entity.User">
         <result column="id" property="id"/>
         <result column="id" property="id"/>
+        <result column="tenant_code" property="tenantCode"/>
         <result column="create_user" property="createUser"/>
         <result column="create_user" property="createUser"/>
         <result column="create_time" property="createTime"/>
         <result column="create_time" property="createTime"/>
         <result column="update_user" property="updateUser"/>
         <result column="update_user" property="updateUser"/>
@@ -45,7 +46,7 @@
         FROM
         FROM
             blade_user
             blade_user
         WHERE
         WHERE
-            account = #{param1} AND password = #{param2}
+            tenant_code = #{param1} and account = #{param2} AND password = #{param3}
     </select>
     </select>
 
 
     <select id="getRoleName" resultType="java.lang.String">
     <select id="getRoleName" resultType="java.lang.String">

+ 2 - 1
src/main/java/org/springblade/modules/system/service/IDeptService.java

@@ -42,8 +42,9 @@ public interface IDeptService extends IService<Dept> {
 	/**
 	/**
 	 * 树形结构
 	 * 树形结构
 	 *
 	 *
+	 * @param tenantCode
 	 * @return
 	 * @return
 	 */
 	 */
-	List<DeptVO> tree();
+	List<DeptVO> tree(String tenantCode);
 
 
 }
 }

+ 2 - 1
src/main/java/org/springblade/modules/system/service/IRoleService.java

@@ -43,9 +43,10 @@ public interface IRoleService extends IService<Role> {
 	/**
 	/**
 	 * 树形结构
 	 * 树形结构
 	 *
 	 *
+	 * @param tenantCode
 	 * @return
 	 * @return
 	 */
 	 */
-	List<RoleVO> tree();
+	List<RoleVO> tree(String tenantCode);
 
 
 	/**
 	/**
 	 * 权限配置
 	 * 权限配置

+ 47 - 0
src/main/java/org/springblade/modules/system/service/ITenantService.java

@@ -0,0 +1,47 @@
+/*
+ *      Copyright (c) 2018-2028, Chill Zhuang All rights reserved.
+ *
+ *  Redistribution and use in source and binary forms, with or without
+ *  modification, are permitted provided that the following conditions are met:
+ *
+ *  Redistributions of source code must retain the above copyright notice,
+ *  this list of conditions and the following disclaimer.
+ *  Redistributions in binary form must reproduce the above copyright
+ *  notice, this list of conditions and the following disclaimer in the
+ *  documentation and/or other materials provided with the distribution.
+ *  Neither the name of the dreamlu.net developer nor the names of its
+ *  contributors may be used to endorse or promote products derived from
+ *  this software without specific prior written permission.
+ *  Author: Chill 庄骞 (smallchill@163.com)
+ */
+package org.springblade.modules.system.service;
+
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import org.springblade.core.mp.base.BaseService;
+import org.springblade.modules.system.entity.Tenant;
+
+/**
+ * 服务类
+ *
+ * @author Chill
+ */
+public interface ITenantService extends BaseService<Tenant> {
+
+	/**
+	 * 自定义分页
+	 *
+	 * @param page
+	 * @param tenant
+	 * @return
+	 */
+	IPage<Tenant> selectTenantPage(IPage<Tenant> page, Tenant tenant);
+
+	/**
+	 * 新增
+	 *
+	 * @param tenant
+	 * @return
+	 */
+	boolean saveTenant(Tenant tenant);
+
+}

+ 2 - 1
src/main/java/org/springblade/modules/system/service/IUserService.java

@@ -43,11 +43,12 @@ public interface IUserService extends BaseService<User> {
 	/**
 	/**
 	 * 用户信息
 	 * 用户信息
 	 *
 	 *
+	 * @param tenantCode
 	 * @param account
 	 * @param account
 	 * @param password
 	 * @param password
 	 * @return
 	 * @return
 	 */
 	 */
-	UserInfo userInfo(String account, String password);
+	UserInfo userInfo(String tenantCode, String account, String password);
 
 
 	/**
 	/**
 	 * 给用户设置角色
 	 * 给用户设置角色

+ 2 - 2
src/main/java/org/springblade/modules/system/service/impl/DeptServiceImpl.java

@@ -41,8 +41,8 @@ public class DeptServiceImpl extends ServiceImpl<DeptMapper, Dept> implements ID
 	}
 	}
 
 
 	@Override
 	@Override
-	public List<DeptVO> tree() {
-		return ForestNodeMerger.merge(baseMapper.tree());
+	public List<DeptVO> tree(String tenantCode) {
+		return ForestNodeMerger.merge(baseMapper.tree(tenantCode));
 	}
 	}
 
 
 }
 }

+ 0 - 1
src/main/java/org/springblade/modules/system/service/impl/DictServiceImpl.java

@@ -77,5 +77,4 @@ public class DictServiceImpl extends ServiceImpl<DictMapper, Dict> implements ID
 		}
 		}
 		return saveOrUpdate(dict);
 		return saveOrUpdate(dict);
 	}
 	}
-
 }
 }

+ 2 - 2
src/main/java/org/springblade/modules/system/service/impl/RoleServiceImpl.java

@@ -52,8 +52,8 @@ public class RoleServiceImpl extends ServiceImpl<RoleMapper, Role> implements IR
 	}
 	}
 
 
 	@Override
 	@Override
-	public List<RoleVO> tree() {
-		return ForestNodeMerger.merge(baseMapper.tree());
+	public List<RoleVO> tree(String tenantCode) {
+		return ForestNodeMerger.merge(baseMapper.tree(tenantCode));
 	}
 	}
 
 
 	@Override
 	@Override

+ 95 - 0
src/main/java/org/springblade/modules/system/service/impl/TenantServiceImpl.java

@@ -0,0 +1,95 @@
+/*
+ *      Copyright (c) 2018-2028, Chill Zhuang All rights reserved.
+ *
+ *  Redistribution and use in source and binary forms, with or without
+ *  modification, are permitted provided that the following conditions are met:
+ *
+ *  Redistributions of source code must retain the above copyright notice,
+ *  this list of conditions and the following disclaimer.
+ *  Redistributions in binary form must reproduce the above copyright
+ *  notice, this list of conditions and the following disclaimer in the
+ *  documentation and/or other materials provided with the distribution.
+ *  Neither the name of the dreamlu.net developer nor the names of its
+ *  contributors may be used to endorse or promote products derived from
+ *  this software without specific prior written permission.
+ *  Author: Chill 庄骞 (smallchill@163.com)
+ */
+package org.springblade.modules.system.service.impl;
+
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.core.toolkit.Wrappers;
+import lombok.AllArgsConstructor;
+import org.springblade.core.mp.base.BaseServiceImpl;
+import org.springblade.core.tenant.TenantId;
+import org.springblade.core.tool.constant.BladeConstant;
+import org.springblade.core.tool.utils.Func;
+import org.springblade.modules.system.entity.Dept;
+import org.springblade.modules.system.entity.Role;
+import org.springblade.modules.system.entity.Tenant;
+import org.springblade.modules.system.mapper.DeptMapper;
+import org.springblade.modules.system.mapper.RoleMapper;
+import org.springblade.modules.system.mapper.TenantMapper;
+import org.springblade.modules.system.service.ITenantService;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+
+import java.util.List;
+import java.util.stream.Collectors;
+
+/**
+ * 服务实现类
+ *
+ * @author Chill
+ */
+@Service
+@AllArgsConstructor
+public class TenantServiceImpl extends BaseServiceImpl<TenantMapper, Tenant> implements ITenantService {
+
+	private final TenantId tenantId;
+	private final RoleMapper roleMapper;
+	private final DeptMapper deptMapper;
+
+	@Override
+	public IPage<Tenant> selectTenantPage(IPage<Tenant> page, Tenant tenant) {
+		return page.setRecords(baseMapper.selectTenantPage(page, tenant));
+	}
+
+	@Override
+	@Transactional(rollbackFor = Exception.class)
+	public boolean saveTenant(Tenant tenant) {
+		if (Func.isEmpty(tenant.getId())) {
+			List<Tenant> tenants = baseMapper.selectList(Wrappers.<Tenant>query().lambda().eq(Tenant::getIsDeleted, BladeConstant.DB_NOT_DELETED));
+			List<String> codes = tenants.stream().map(Tenant::getTenantCode).collect(Collectors.toList());
+			String tenantCode = getTenantCode(codes);
+			tenant.setTenantCode(tenantCode);
+			// 新建租户对应的默认角色
+			Role role = new Role();
+			role.setTenantCode(tenantCode);
+			role.setParentId(1);
+			role.setRoleName("管理员");
+			role.setRoleAlias("admin");
+			role.setSort(2);
+			role.setIsDeleted(0);
+			roleMapper.insert(role);
+			// 新建租户对应的默认部门
+			Dept dept = new Dept();
+			dept.setTenantCode(tenantCode);
+			dept.setParentId(0);
+			dept.setDeptName(tenant.getTenantName());
+			dept.setFullName(tenant.getTenantName());
+			dept.setSort(2);
+			dept.setIsDeleted(0);
+			deptMapper.insert(dept);
+		}
+		return super.saveOrUpdate(tenant);
+	}
+
+	private String getTenantCode(List<String> codes) {
+		String code = tenantId.generate();
+		if (codes.contains(code)) {
+			return getTenantCode(codes);
+		}
+		return code;
+	}
+
+}

+ 2 - 2
src/main/java/org/springblade/modules/system/service/impl/UserServiceImpl.java

@@ -46,9 +46,9 @@ public class UserServiceImpl extends BaseServiceImpl<UserMapper, User> implement
 	}
 	}
 
 
 	@Override
 	@Override
-	public UserInfo userInfo(String account, String password) {
+	public UserInfo userInfo(String tenantCode, String account, String password) {
 		UserInfo userInfo = new UserInfo();
 		UserInfo userInfo = new UserInfo();
-		User user = baseMapper.getUser(account, password);
+		User user = baseMapper.getUser(tenantCode, account, password);
 		userInfo.setUser(user);
 		userInfo.setUser(user);
 		if (Func.isNotEmpty(user)) {
 		if (Func.isNotEmpty(user)) {
 			List<String> roleAlias = baseMapper.getRoleAlias(Func.toStrArray(user.getRoleId()));
 			List<String> roleAlias = baseMapper.getRoleAlias(Func.toStrArray(user.getRoleId()));

+ 2 - 1
src/main/resources/templates/entity.java.vm

@@ -59,6 +59,7 @@ public class $!{entity} implements Serializable {
 
 
 ## ----------  BEGIN 字段循环遍历  ----------
 ## ----------  BEGIN 字段循环遍历  ----------
 #foreach($field in $!{table.fields})
 #foreach($field in $!{table.fields})
+#if($!{field.name}!=$!{cfg.tenantColumn})
 #if($!{field.keyFlag})
 #if($!{field.keyFlag})
 #set($keyPropertyName=$!{field.propertyName})
 #set($keyPropertyName=$!{field.propertyName})
 #end
 #end
@@ -99,7 +100,7 @@ public class $!{entity} implements Serializable {
   @TableLogic
   @TableLogic
 #end
 #end
   private $!{field.propertyType} $!{field.propertyName};
   private $!{field.propertyType} $!{field.propertyName};
-
+#end
 #end
 #end
 ## ----------  END 字段循环遍历  ----------
 ## ----------  END 字段循环遍历  ----------
 
 

+ 1 - 11
src/main/resources/templates/mapper.xml.vm

@@ -19,26 +19,16 @@
         <result column="$!{field.name}" property="$!{field.propertyName}"/>
         <result column="$!{field.name}" property="$!{field.propertyName}"/>
 #end
 #end
 #foreach($field in $!{table.fields})
 #foreach($field in $!{table.fields})
-#if(!$!{field.keyFlag})##生成普通字段
+#if(!$!{field.keyFlag} && $!{field.name} != $!{cfg.tenantColumn})##生成普通字段
         <result column="$!{field.name}" property="$!{field.propertyName}"/>
         <result column="$!{field.name}" property="$!{field.propertyName}"/>
 #end
 #end
 #end
 #end
     </resultMap>
     </resultMap>
 
 
 #end
 #end
-#if($!{baseColumnList})
-    <!-- 通用查询结果列 -->
-    <sql id="baseColumnList">
-        select
-    #foreach($field in $!{table.commonFields})
-    #if($!{field.name} == $!{field.propertyName})$!{field.name}#else$!{field.name} AS $!{field.propertyName}#end,
-    #end
-    $!{table.fieldNames}
-    </sql>
 
 
     <select id="select$!{entity}Page" resultMap="$!{table.entityPath}ResultMap">
     <select id="select$!{entity}Page" resultMap="$!{table.entityPath}ResultMap">
         select * from $!{table.name} where is_deleted = 0
         select * from $!{table.name} where is_deleted = 0
     </select>
     </select>
 
 
-#end
 </mapper>
 </mapper>

+ 2 - 0
src/main/resources/templates/saber/crud.vue.vm

@@ -48,6 +48,7 @@
           selection: true,
           selection: true,
           column: [
           column: [
 #foreach($field in $!{table.fields})
 #foreach($field in $!{table.fields})
+#if($!{field.name}!=$!{cfg.tenantColumn})
             {
             {
               label: "$!{field.comment}",
               label: "$!{field.comment}",
               prop: "$!{field.propertyName}",
               prop: "$!{field.propertyName}",
@@ -57,6 +58,7 @@
                 trigger: "blur"
                 trigger: "blur"
               }]
               }]
             },
             },
+#end
 #end
 #end
           ]
           ]
         },
         },

+ 11 - 0
src/main/resources/templates/sql/menu.sql.vm

@@ -0,0 +1,11 @@
+INSERT INTO `blade_menu`(`tenant_code`, `parent_id`, `code`, `name`, `alias`, `path`, `source`, `sort`, `category`, `action`, `is_open`, `remark`, `is_deleted`)
+VALUES ('000000', 0, '$!{cfg.entityKey}', '$!{cfg.codeName}', 'menu', '/$!{cfg.servicePackage}/$!{cfg.entityKey}', NULL, 1, 1, 0, 1, NULL, 0);
+set @parentid = (SELECT LAST_INSERT_ID());
+INSERT INTO `blade_menu`(`tenant_code`, `parent_id`, `code`, `name`, `alias`, `path`, `source`, `sort`, `category`, `action`, `is_open`, `remark`, `is_deleted`)
+VALUES ('000000', @parentid, '$!{cfg.entityKey}_add', '新增', 'add', '/$!{cfg.servicePackage}/$!{cfg.entityKey}/add', 'plus', 1, 2, 1, 1, NULL, 0);
+INSERT INTO `blade_menu`(`tenant_code`, `parent_id`, `code`, `name`, `alias`, `path`, `source`, `sort`, `category`, `action`, `is_open`, `remark`, `is_deleted`)
+VALUES ('000000', @parentid, '$!{cfg.entityKey}_edit', '修改', 'edit', '/$!{cfg.servicePackage}/$!{cfg.entityKey}/edit', 'form', 2, 2, 1, 2, NULL, 0);
+INSERT INTO `blade_menu`(`tenant_code`, `parent_id`, `code`, `name`, `alias`, `path`, `source`, `sort`, `category`, `action`, `is_open`, `remark`, `is_deleted`)
+VALUES ('000000', @parentid, '$!{cfg.entityKey}_delete', '删除', 'delete', '/api/$!{cfg.serviceName}/$!{cfg.entityKey}/remove', 'delete', 3, 2, 1, 3, NULL, 0);
+INSERT INTO `blade_menu`(`tenant_code`, `parent_id`, `code`, `name`, `alias`, `path`, `source`, `sort`, `category`, `action`, `is_open`, `remark`, `is_deleted`)
+VALUES ('000000', @parentid, '$!{cfg.entityKey}_view', '查看', 'view', '/$!{cfg.servicePackage}/$!{cfg.entityKey}/view', 'file-text', 4, 2, 1, 2, NULL, 0);

+ 2 - 0
src/main/resources/templates/sword/add.js.vm

@@ -52,6 +52,7 @@ class $!{entity}Add extends PureComponent {
         <Form hideRequiredMark style={{ marginTop: 8 }}>
         <Form hideRequiredMark style={{ marginTop: 8 }}>
           <Card className={styles.card} bordered={false}>
           <Card className={styles.card} bordered={false}>
 #foreach($field in $!{table.fields})
 #foreach($field in $!{table.fields})
+#if($!{field.name}!=$!{cfg.tenantColumn})
             <FormItem {...formItemLayout} label="$!{field.comment}">
             <FormItem {...formItemLayout} label="$!{field.comment}">
               {getFieldDecorator('$!{field.propertyName}', {
               {getFieldDecorator('$!{field.propertyName}', {
                 rules: [
                 rules: [
@@ -62,6 +63,7 @@ class $!{entity}Add extends PureComponent {
                 ],
                 ],
               })(<Input placeholder="请输入$!{field.comment}" />)}
               })(<Input placeholder="请输入$!{field.comment}" />)}
             </FormItem>
             </FormItem>
+#end
 #end
 #end
           </Card>
           </Card>
         </Form>
         </Form>

+ 3 - 1
src/main/resources/templates/sword/edit.js.vm

@@ -10,7 +10,7 @@ const FormItem = Form.Item;
 
 
 @connect(({ $!{table.entityPath}, loading }) => ({
 @connect(({ $!{table.entityPath}, loading }) => ({
   $!{table.entityPath},
   $!{table.entityPath},
-  submitting: loading.effects['code/submit'],
+  submitting: loading.effects['$!{table.entityPath}/submit'],
 }))
 }))
 @Form.create()
 @Form.create()
 class $!{entity}Edit extends PureComponent {
 class $!{entity}Edit extends PureComponent {
@@ -75,6 +75,7 @@ class $!{entity}Edit extends PureComponent {
         <Form hideRequiredMark style={{ marginTop: 8 }}>
         <Form hideRequiredMark style={{ marginTop: 8 }}>
           <Card className={styles.card} bordered={false}>
           <Card className={styles.card} bordered={false}>
 #foreach($field in $!{table.fields})
 #foreach($field in $!{table.fields})
+#if($!{field.name}!=$!{cfg.tenantColumn})
             <FormItem {...formItemLayout} label="$!{field.comment}">
             <FormItem {...formItemLayout} label="$!{field.comment}">
               {getFieldDecorator('$!{field.propertyName}', {
               {getFieldDecorator('$!{field.propertyName}', {
                 rules: [
                 rules: [
@@ -86,6 +87,7 @@ class $!{entity}Edit extends PureComponent {
                 initialValue: detail.$!{field.propertyName},
                 initialValue: detail.$!{field.propertyName},
               })(<Input placeholder="请输入$!{field.comment}" />)}
               })(<Input placeholder="请输入$!{field.comment}" />)}
             </FormItem>
             </FormItem>
+#end
 #end
 #end
           </Card>
           </Card>
         </Form>
         </Form>

+ 3 - 1
src/main/resources/templates/sword/list.js.vm

@@ -10,7 +10,7 @@ const FormItem = Form.Item;
 
 
 @connect(({ $!{table.entityPath}, loading }) => ({
 @connect(({ $!{table.entityPath}, loading }) => ({
   $!{table.entityPath},
   $!{table.entityPath},
-  loading: loading.models.param,
+  loading: loading.models.$!{table.entityPath},
 }))
 }))
 @Form.create()
 @Form.create()
 class $!{entity} extends PureComponent {
 class $!{entity} extends PureComponent {
@@ -57,10 +57,12 @@ class $!{entity} extends PureComponent {
 
 
     const columns = [
     const columns = [
 #foreach($field in $!{table.fields})
 #foreach($field in $!{table.fields})
+#if($!{field.name}!=$!{cfg.tenantColumn})
       {
       {
         title: '$!{field.comment}',
         title: '$!{field.comment}',
         dataIndex: '$!{field.propertyName}',
         dataIndex: '$!{field.propertyName}',
       },
       },
+#end
 #end
 #end
     ];
     ];
 
 

+ 6 - 2
src/main/resources/templates/sword/model.js.vm

@@ -20,8 +20,12 @@ export default {
         yield put({
         yield put({
           type: 'saveList',
           type: 'saveList',
           payload: {
           payload: {
-            list: response.data,
-            pagination: false,
+            list: response.data.records,
+            pagination: {
+              total: response.data.total,
+              current: response.data.current,
+              pageSize: response.data.size,
+            },
           },
           },
         });
         });
       }
       }

+ 2 - 0
src/main/resources/templates/sword/view.js.vm

@@ -61,9 +61,11 @@ class $!{entity}View extends PureComponent {
         <Form hideRequiredMark style={{ marginTop: 8 }}>
         <Form hideRequiredMark style={{ marginTop: 8 }}>
           <Card className={styles.card} bordered={false}>
           <Card className={styles.card} bordered={false}>
 #foreach($field in $!{table.fields})
 #foreach($field in $!{table.fields})
+#if($!{field.name}!=$!{cfg.tenantColumn})
             <FormItem {...formItemLayout} label="$!{field.comment}">
             <FormItem {...formItemLayout} label="$!{field.comment}">
               <span>{detail.$!{field.propertyName}}</span>
               <span>{detail.$!{field.propertyName}}</span>
             </FormItem>
             </FormItem>
+#end
 #end
 #end
           </Card>
           </Card>
         </Form>
         </Form>

+ 18 - 9
src/test/java/org/springblade/test/CodeGenerator.java

@@ -17,7 +17,7 @@
 package org.springblade.test;
 package org.springblade.test;
 
 
 
 
-import org.springblade.modules.develop.support.BladeGenerator;
+import org.springblade.modules.develop.support.BladeCodeGenerator;
 
 
 /**
 /**
  * 代码生成器
  * 代码生成器
@@ -26,18 +26,26 @@ import org.springblade.modules.develop.support.BladeGenerator;
  */
  */
 public class CodeGenerator {
 public class CodeGenerator {
 
 
+	/**
+	 * 代码生成的模块名
+	 */
+	public static String CODE_NAME = "自定义模块";
+	/**
+	 * 代码所在服务名
+	 */
+	public static String SERVICE_NAME = "blade-desk";
 	/**
 	/**
 	 * 代码生成的包名
 	 * 代码生成的包名
 	 */
 	 */
-	public static String PACKAGE_NAME = "org.springblade.demo";
+	public static String PACKAGE_NAME = "org.springblade.desk";
 	/**
 	/**
 	 * 前端代码生成所属系统
 	 * 前端代码生成所属系统
 	 */
 	 */
-	public static String SYSTEM_NAME = "saber";
+	public static String SYSTEM_NAME = "sword";
 	/**
 	/**
 	 * 前端代码生成地址
 	 * 前端代码生成地址
 	 */
 	 */
-	public static String PACKAGE_WEB_DIR = "/Users/chill/Workspaces/dev/Saber";
+	public static String PACKAGE_WEB_DIR = "/Users/chill/Workspaces/product/Sword";
 	/**
 	/**
 	 * 需要去掉的表前缀
 	 * 需要去掉的表前缀
 	 */
 	 */
@@ -53,18 +61,19 @@ public class CodeGenerator {
 	/**
 	/**
 	 * 是否包含基础业务字段
 	 * 是否包含基础业务字段
 	 */
 	 */
-	public static Boolean HAS_SUPER_ENTITY = Boolean.FALSE;
+	public static Boolean HAS_SUPER_ENTITY = Boolean.TRUE;
 	/**
 	/**
 	 * 基础业务字段
 	 * 基础业务字段
 	 */
 	 */
-	public static String[] SUPER_ENTITY_COLUNMS = {"id", "create_time", "create_user", "update_time", "update_user", "status", "is_deleted"};
-
+	public static String[] SUPER_ENTITY_COLUMNS = {"id", "create_time", "create_user", "update_time", "update_user", "status", "is_deleted"};
 
 
 	/**
 	/**
 	 * RUN THIS
 	 * RUN THIS
 	 */
 	 */
 	public static void main(String[] args) {
 	public static void main(String[] args) {
-		BladeGenerator generator = new BladeGenerator();
+		BladeCodeGenerator generator = new BladeCodeGenerator();
+		generator.setCodeName(CODE_NAME);
+		generator.setServiceName(SERVICE_NAME);
 		generator.setSystemName(SYSTEM_NAME);
 		generator.setSystemName(SYSTEM_NAME);
 		generator.setPackageName(PACKAGE_NAME);
 		generator.setPackageName(PACKAGE_NAME);
 		generator.setPackageWebDir(PACKAGE_WEB_DIR);
 		generator.setPackageWebDir(PACKAGE_WEB_DIR);
@@ -72,7 +81,7 @@ public class CodeGenerator {
 		generator.setIncludeTables(INCLUDE_TABLES);
 		generator.setIncludeTables(INCLUDE_TABLES);
 		generator.setExcludeTables(EXCLUDE_TABLES);
 		generator.setExcludeTables(EXCLUDE_TABLES);
 		generator.setHasSuperEntity(HAS_SUPER_ENTITY);
 		generator.setHasSuperEntity(HAS_SUPER_ENTITY);
-		generator.setSuperEntityColumns(SUPER_ENTITY_COLUNMS);
+		generator.setSuperEntityColumns(SUPER_ENTITY_COLUMNS);
 		generator.run();
 		generator.run();
 	}
 	}
 
 

+ 2 - 1
src/test/resources/templates/entity.java.vm

@@ -59,6 +59,7 @@ public class $!{entity} implements Serializable {
 
 
 ## ----------  BEGIN 字段循环遍历  ----------
 ## ----------  BEGIN 字段循环遍历  ----------
 #foreach($field in $!{table.fields})
 #foreach($field in $!{table.fields})
+#if($!{field.name}!=$!{cfg.tenantColumn})
 #if($!{field.keyFlag})
 #if($!{field.keyFlag})
 #set($keyPropertyName=$!{field.propertyName})
 #set($keyPropertyName=$!{field.propertyName})
 #end
 #end
@@ -99,7 +100,7 @@ public class $!{entity} implements Serializable {
   @TableLogic
   @TableLogic
 #end
 #end
   private $!{field.propertyType} $!{field.propertyName};
   private $!{field.propertyType} $!{field.propertyName};
-
+#end
 #end
 #end
 ## ----------  END 字段循环遍历  ----------
 ## ----------  END 字段循环遍历  ----------
 
 

+ 1 - 11
src/test/resources/templates/mapper.xml.vm

@@ -19,26 +19,16 @@
         <result column="$!{field.name}" property="$!{field.propertyName}"/>
         <result column="$!{field.name}" property="$!{field.propertyName}"/>
 #end
 #end
 #foreach($field in $!{table.fields})
 #foreach($field in $!{table.fields})
-#if(!$!{field.keyFlag})##生成普通字段
+#if(!$!{field.keyFlag} && $!{field.name} != $!{cfg.tenantColumn})##生成普通字段
         <result column="$!{field.name}" property="$!{field.propertyName}"/>
         <result column="$!{field.name}" property="$!{field.propertyName}"/>
 #end
 #end
 #end
 #end
     </resultMap>
     </resultMap>
 
 
 #end
 #end
-#if($!{baseColumnList})
-    <!-- 通用查询结果列 -->
-    <sql id="baseColumnList">
-        select
-    #foreach($field in $!{table.commonFields})
-    #if($!{field.name} == $!{field.propertyName})$!{field.name}#else$!{field.name} AS $!{field.propertyName}#end,
-    #end
-    $!{table.fieldNames}
-    </sql>
 
 
     <select id="select$!{entity}Page" resultMap="$!{table.entityPath}ResultMap">
     <select id="select$!{entity}Page" resultMap="$!{table.entityPath}ResultMap">
         select * from $!{table.name} where is_deleted = 0
         select * from $!{table.name} where is_deleted = 0
     </select>
     </select>
 
 
-#end
 </mapper>
 </mapper>

+ 2 - 0
src/test/resources/templates/saber/crud.vue.vm

@@ -48,6 +48,7 @@
           selection: true,
           selection: true,
           column: [
           column: [
 #foreach($field in $!{table.fields})
 #foreach($field in $!{table.fields})
+#if($!{field.name}!=$!{cfg.tenantColumn})
             {
             {
               label: "$!{field.comment}",
               label: "$!{field.comment}",
               prop: "$!{field.propertyName}",
               prop: "$!{field.propertyName}",
@@ -57,6 +58,7 @@
                 trigger: "blur"
                 trigger: "blur"
               }]
               }]
             },
             },
+#end
 #end
 #end
           ]
           ]
         },
         },

+ 11 - 0
src/test/resources/templates/sql/menu.sql.vm

@@ -0,0 +1,11 @@
+INSERT INTO `blade_menu`(`tenant_code`, `parent_id`, `code`, `name`, `alias`, `path`, `source`, `sort`, `category`, `action`, `is_open`, `remark`, `is_deleted`)
+VALUES ('000000', 0, '$!{cfg.entityKey}', '$!{cfg.codeName}', 'menu', '/$!{cfg.servicePackage}/$!{cfg.entityKey}', NULL, 1, 1, 0, 1, NULL, 0);
+set @parentid = (SELECT LAST_INSERT_ID());
+INSERT INTO `blade_menu`(`tenant_code`, `parent_id`, `code`, `name`, `alias`, `path`, `source`, `sort`, `category`, `action`, `is_open`, `remark`, `is_deleted`)
+VALUES ('000000', @parentid, '$!{cfg.entityKey}_add', '新增', 'add', '/$!{cfg.servicePackage}/$!{cfg.entityKey}/add', 'plus', 1, 2, 1, 1, NULL, 0);
+INSERT INTO `blade_menu`(`tenant_code`, `parent_id`, `code`, `name`, `alias`, `path`, `source`, `sort`, `category`, `action`, `is_open`, `remark`, `is_deleted`)
+VALUES ('000000', @parentid, '$!{cfg.entityKey}_edit', '修改', 'edit', '/$!{cfg.servicePackage}/$!{cfg.entityKey}/edit', 'form', 2, 2, 1, 2, NULL, 0);
+INSERT INTO `blade_menu`(`tenant_code`, `parent_id`, `code`, `name`, `alias`, `path`, `source`, `sort`, `category`, `action`, `is_open`, `remark`, `is_deleted`)
+VALUES ('000000', @parentid, '$!{cfg.entityKey}_delete', '删除', 'delete', '/api/$!{cfg.serviceName}/$!{cfg.entityKey}/remove', 'delete', 3, 2, 1, 3, NULL, 0);
+INSERT INTO `blade_menu`(`tenant_code`, `parent_id`, `code`, `name`, `alias`, `path`, `source`, `sort`, `category`, `action`, `is_open`, `remark`, `is_deleted`)
+VALUES ('000000', @parentid, '$!{cfg.entityKey}_view', '查看', 'view', '/$!{cfg.servicePackage}/$!{cfg.entityKey}/view', 'file-text', 4, 2, 1, 2, NULL, 0);

+ 2 - 0
src/test/resources/templates/sword/add.js.vm

@@ -52,6 +52,7 @@ class $!{entity}Add extends PureComponent {
         <Form hideRequiredMark style={{ marginTop: 8 }}>
         <Form hideRequiredMark style={{ marginTop: 8 }}>
           <Card className={styles.card} bordered={false}>
           <Card className={styles.card} bordered={false}>
 #foreach($field in $!{table.fields})
 #foreach($field in $!{table.fields})
+#if($!{field.name}!=$!{cfg.tenantColumn})
             <FormItem {...formItemLayout} label="$!{field.comment}">
             <FormItem {...formItemLayout} label="$!{field.comment}">
               {getFieldDecorator('$!{field.propertyName}', {
               {getFieldDecorator('$!{field.propertyName}', {
                 rules: [
                 rules: [
@@ -62,6 +63,7 @@ class $!{entity}Add extends PureComponent {
                 ],
                 ],
               })(<Input placeholder="请输入$!{field.comment}" />)}
               })(<Input placeholder="请输入$!{field.comment}" />)}
             </FormItem>
             </FormItem>
+#end
 #end
 #end
           </Card>
           </Card>
         </Form>
         </Form>

+ 3 - 1
src/test/resources/templates/sword/edit.js.vm

@@ -10,7 +10,7 @@ const FormItem = Form.Item;
 
 
 @connect(({ $!{table.entityPath}, loading }) => ({
 @connect(({ $!{table.entityPath}, loading }) => ({
   $!{table.entityPath},
   $!{table.entityPath},
-  submitting: loading.effects['code/submit'],
+  submitting: loading.effects['$!{table.entityPath}/submit'],
 }))
 }))
 @Form.create()
 @Form.create()
 class $!{entity}Edit extends PureComponent {
 class $!{entity}Edit extends PureComponent {
@@ -75,6 +75,7 @@ class $!{entity}Edit extends PureComponent {
         <Form hideRequiredMark style={{ marginTop: 8 }}>
         <Form hideRequiredMark style={{ marginTop: 8 }}>
           <Card className={styles.card} bordered={false}>
           <Card className={styles.card} bordered={false}>
 #foreach($field in $!{table.fields})
 #foreach($field in $!{table.fields})
+#if($!{field.name}!=$!{cfg.tenantColumn})
             <FormItem {...formItemLayout} label="$!{field.comment}">
             <FormItem {...formItemLayout} label="$!{field.comment}">
               {getFieldDecorator('$!{field.propertyName}', {
               {getFieldDecorator('$!{field.propertyName}', {
                 rules: [
                 rules: [
@@ -86,6 +87,7 @@ class $!{entity}Edit extends PureComponent {
                 initialValue: detail.$!{field.propertyName},
                 initialValue: detail.$!{field.propertyName},
               })(<Input placeholder="请输入$!{field.comment}" />)}
               })(<Input placeholder="请输入$!{field.comment}" />)}
             </FormItem>
             </FormItem>
+#end
 #end
 #end
           </Card>
           </Card>
         </Form>
         </Form>

+ 3 - 1
src/test/resources/templates/sword/list.js.vm

@@ -10,7 +10,7 @@ const FormItem = Form.Item;
 
 
 @connect(({ $!{table.entityPath}, loading }) => ({
 @connect(({ $!{table.entityPath}, loading }) => ({
   $!{table.entityPath},
   $!{table.entityPath},
-  loading: loading.models.param,
+  loading: loading.models.$!{table.entityPath},
 }))
 }))
 @Form.create()
 @Form.create()
 class $!{entity} extends PureComponent {
 class $!{entity} extends PureComponent {
@@ -57,10 +57,12 @@ class $!{entity} extends PureComponent {
 
 
     const columns = [
     const columns = [
 #foreach($field in $!{table.fields})
 #foreach($field in $!{table.fields})
+#if($!{field.name}!=$!{cfg.tenantColumn})
       {
       {
         title: '$!{field.comment}',
         title: '$!{field.comment}',
         dataIndex: '$!{field.propertyName}',
         dataIndex: '$!{field.propertyName}',
       },
       },
+#end
 #end
 #end
     ];
     ];
 
 

+ 6 - 2
src/test/resources/templates/sword/model.js.vm

@@ -20,8 +20,12 @@ export default {
         yield put({
         yield put({
           type: 'saveList',
           type: 'saveList',
           payload: {
           payload: {
-            list: response.data,
-            pagination: false,
+            list: response.data.records,
+            pagination: {
+              total: response.data.total,
+              current: response.data.current,
+              pageSize: response.data.size,
+            },
           },
           },
         });
         });
       }
       }

+ 3 - 1
src/test/resources/templates/sword/view.js.vm

@@ -30,7 +30,7 @@ class $!{entity}View extends PureComponent {
         params: { id },
         params: { id },
       },
       },
     } = this.props;
     } = this.props;
-    router.push(`/$!{cfg.servicePackage}/$!{table.entityPath}/edit/${id}`);
+    router.push(`/$!{cfg.servicePackage}/$!{table.entityPath}/edit/$!{id}`);
   };
   };
 
 
   render() {
   render() {
@@ -61,9 +61,11 @@ class $!{entity}View extends PureComponent {
         <Form hideRequiredMark style={{ marginTop: 8 }}>
         <Form hideRequiredMark style={{ marginTop: 8 }}>
           <Card className={styles.card} bordered={false}>
           <Card className={styles.card} bordered={false}>
 #foreach($field in $!{table.fields})
 #foreach($field in $!{table.fields})
+#if($!{field.name}!=$!{cfg.tenantColumn})
             <FormItem {...formItemLayout} label="$!{field.comment}">
             <FormItem {...formItemLayout} label="$!{field.comment}">
               <span>{detail.$!{field.propertyName}}</span>
               <span>{detail.$!{field.propertyName}}</span>
             </FormItem>
             </FormItem>
+#end
 #end
 #end
           </Card>
           </Card>
         </Form>
         </Form>

Algúns arquivos non se mostraron porque demasiados arquivos cambiaron neste cambio