Sfoglia il codice sorgente

Add 完成租户模块

YueYunyun 2 anni fa
parent
commit
415bf3ed9e
36 ha cambiato i file con 1066 aggiunte e 1081 eliminazioni
  1. 0 403
      SERVER/VberAdminPlusV3/.flattened-pom.xml
  2. 0 39
      SERVER/VberAdminPlusV3/vber-common/.flattened-pom.xml
  3. 0 81
      SERVER/VberAdminPlusV3/vber-common/vber-common-core/.flattened-pom.xml
  4. 0 33
      SERVER/VberAdminPlusV3/vber-common/vber-common-doc/.flattened-pom.xml
  5. 0 25
      SERVER/VberAdminPlusV3/vber-common/vber-common-excel/.flattened-pom.xml
  6. 0 29
      SERVER/VberAdminPlusV3/vber-common/vber-common-idempotent/.flattened-pom.xml
  7. 0 43
      SERVER/VberAdminPlusV3/vber-common/vber-common-job/.flattened-pom.xml
  8. 0 25
      SERVER/VberAdminPlusV3/vber-common/vber-common-log/.flattened-pom.xml
  9. 0 29
      SERVER/VberAdminPlusV3/vber-common/vber-common-mail/.flattened-pom.xml
  10. 0 51
      SERVER/VberAdminPlusV3/vber-common/vber-common-mybatis/.flattened-pom.xml
  11. 0 33
      SERVER/VberAdminPlusV3/vber-common/vber-common-oss/.flattened-pom.xml
  12. 0 29
      SERVER/VberAdminPlusV3/vber-common/vber-common-redis/.flattened-pom.xml
  13. 0 33
      SERVER/VberAdminPlusV3/vber-common/vber-common-satoken/.flattened-pom.xml
  14. 0 21
      SERVER/VberAdminPlusV3/vber-common/vber-common-security/.flattened-pom.xml
  15. 0 27
      SERVER/VberAdminPlusV3/vber-common/vber-common-sms/.flattened-pom.xml
  16. 0 29
      SERVER/VberAdminPlusV3/vber-common/vber-common-social/.flattened-pom.xml
  17. 0 29
      SERVER/VberAdminPlusV3/vber-common/vber-common-tenant/.flattened-pom.xml
  18. 0 55
      SERVER/VberAdminPlusV3/vber-common/vber-common-web/.flattened-pom.xml
  19. 0 33
      SERVER/VberAdminPlusV3/vber-common/vber-common-websocket/.flattened-pom.xml
  20. 7 7
      SERVER/VberAdminPlusV3/vber-modules/vber-system/src/main/java/com/vber/system/controller/system/SysTenantController.java
  21. 5 3
      SERVER/VberAdminPlusV3/vber-modules/vber-system/src/main/java/com/vber/system/domain/bo/SysTenantBo.java
  22. 7 2
      SERVER/VberAdminPlusV3/vber-modules/vber-system/src/main/java/com/vber/system/domain/vo/SysTenantVo.java
  23. 12 9
      SERVER/VberAdminPlusV3/vber-modules/vber-system/src/main/java/com/vber/system/service/impl/SysTenantServiceImpl.java
  24. 7 0
      UI/VAP_V3.VUE/src/api/system/_menu.ts
  25. 94 0
      UI/VAP_V3.VUE/src/api/system/_tenant.ts
  26. 80 0
      UI/VAP_V3.VUE/src/api/system/_tenantPackage.ts
  27. 7 1
      UI/VAP_V3.VUE/src/api/system/index.ts
  28. 1 0
      UI/VAP_V3.VUE/src/core/types/User.ts
  29. 64 0
      UI/VAP_V3.VUE/src/layouts/main/header/navbar/DynamicTenant.vue
  30. 2 0
      UI/VAP_V3.VUE/src/layouts/main/header/navbar/Index.vue
  31. 4 1
      UI/VAP_V3.VUE/src/layouts/main/header/navbar/UserAccountMenu.vue
  32. 19 1
      UI/VAP_V3.VUE/src/stores/_auth.ts
  33. 10 9
      UI/VAP_V3.VUE/src/views/account/login.vue
  34. 1 1
      UI/VAP_V3.VUE/src/views/system/role/index.vue
  35. 409 0
      UI/VAP_V3.VUE/src/views/system/tenant/index.vue
  36. 337 0
      UI/VAP_V3.VUE/src/views/system/tenantPackage/index.vue

+ 0 - 403
SERVER/VberAdminPlusV3/.flattened-pom.xml

@@ -1,403 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<project xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://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>
-  <groupId>com.vap</groupId>
-  <artifactId>VberAdminPlus</artifactId>
-  <version>3.0.0</version>
-  <packaging>pom</packaging>
-  <name>${project.artifactId}</name>
-  <description>VberAdminPlus后台管理系统</description>
-  <modules>
-    <module>vber-common</module>
-    <module>vber-modules</module>
-    <module>vber-extend</module>
-    <module>vber-admin</module>
-  </modules>
-  <properties>
-    <spring-boot-admin.version>3.1.8</spring-boot-admin.version>
-    <maven-compiler-plugin.verison>3.11.0</maven-compiler-plugin.verison>
-    <powerjob.version>4.3.6</powerjob.version>
-    <shardingsphere.version>5.3.2</shardingsphere.version>
-    <easyexcel.version>3.3.3</easyexcel.version>
-    <dynamic-ds.version>4.2.0</dynamic-ds.version>
-    <hutool.version>5.8.22</hutool.version>
-    <spring-boot.version>3.1.7</spring-boot.version>
-    <p6spy.version>3.9.1</p6spy.version>
-    <flatten-maven-plugin.version>1.3.0</flatten-maven-plugin.version>
-    <okhttp.version>4.10.0</okhttp.version>
-    <springdoc.version>2.2.0</springdoc.version>
-    <poi.version>5.2.3</poi.version>
-    <mapstruct-plus.version>1.3.5</mapstruct-plus.version>
-    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
-    <fastjson.version>1.2.83</fastjson.version>
-    <aws-java-sdk-s3.version>1.12.600</aws-java-sdk-s3.version>
-    <alibaba-ttl.version>2.14.4</alibaba-ttl.version>
-    <therapi-javadoc.version>0.15.0</therapi-javadoc.version>
-    <lock4j.version>2.2.5</lock4j.version>
-    <sms4j.version>2.2.0</sms4j.version>
-    <maven-jar-plugin.version>3.2.2</maven-jar-plugin.version>
-    <java.version>17</java.version>
-    <bouncycastle.version>1.76</bouncycastle.version>
-    <spring-boot.mybatis>3.0.3</spring-boot.mybatis>
-    <mybatis-plus.version>3.5.4</mybatis-plus.version>
-    <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
-    <revision>3.0.0</revision>
-    <lombok.version>1.18.30</lombok.version>
-    <maven-surefire-plugin.version>3.1.2</maven-surefire-plugin.version>
-    <mapstruct-plus.lombok.version>0.2.0</mapstruct-plus.lombok.version>
-    <ip2region.version>2.7.0</ip2region.version>
-    <satoken.version>1.37.0</satoken.version>
-    <redisson.version>3.24.3</redisson.version>
-    <justauth.version>1.16.6</justauth.version>
-    <maven-war-plugin.version>3.2.2</maven-war-plugin.version>
-    <velocity.version>2.3</velocity.version>
-  </properties>
-  <dependencyManagement>
-    <dependencies>
-      <dependency>
-        <groupId>org.springframework.boot</groupId>
-        <artifactId>spring-boot-dependencies</artifactId>
-        <version>${spring-boot.version}</version>
-        <type>pom</type>
-        <scope>import</scope>
-      </dependency>
-      <dependency>
-        <groupId>cn.hutool</groupId>
-        <artifactId>hutool-bom</artifactId>
-        <version>${hutool.version}</version>
-        <type>pom</type>
-        <scope>import</scope>
-      </dependency>
-      <dependency>
-        <groupId>me.zhyd.oauth</groupId>
-        <artifactId>JustAuth</artifactId>
-        <version>${justauth.version}</version>
-      </dependency>
-      <dependency>
-        <groupId>org.springdoc</groupId>
-        <artifactId>springdoc-openapi-starter-webmvc-api</artifactId>
-        <version>${springdoc.version}</version>
-      </dependency>
-      <dependency>
-        <groupId>com.github.therapi</groupId>
-        <artifactId>therapi-runtime-javadoc</artifactId>
-        <version>${therapi-javadoc.version}</version>
-      </dependency>
-      <dependency>
-        <groupId>org.projectlombok</groupId>
-        <artifactId>lombok</artifactId>
-        <version>${lombok.version}</version>
-      </dependency>
-      <dependency>
-        <groupId>org.apache.poi</groupId>
-        <artifactId>poi</artifactId>
-        <version>${poi.version}</version>
-      </dependency>
-      <dependency>
-        <groupId>org.apache.poi</groupId>
-        <artifactId>poi-ooxml</artifactId>
-        <version>${poi.version}</version>
-      </dependency>
-      <dependency>
-        <groupId>org.apache.velocity</groupId>
-        <artifactId>velocity-engine-core</artifactId>
-        <version>${velocity.version}</version>
-      </dependency>
-      <dependency>
-        <groupId>cn.dev33</groupId>
-        <artifactId>sa-token-spring-boot3-starter</artifactId>
-        <version>${satoken.version}</version>
-      </dependency>
-      <dependency>
-        <groupId>cn.dev33</groupId>
-        <artifactId>sa-token-jwt</artifactId>
-        <version>${satoken.version}</version>
-        <exclusions>
-          <exclusion>
-            <groupId>cn.hutool</groupId>
-            <artifactId>hutool-all</artifactId>
-          </exclusion>
-        </exclusions>
-      </dependency>
-      <dependency>
-        <groupId>cn.dev33</groupId>
-        <artifactId>sa-token-core</artifactId>
-        <version>${satoken.version}</version>
-      </dependency>
-      <dependency>
-        <groupId>com.baomidou</groupId>
-        <artifactId>dynamic-datasource-spring-boot3-starter</artifactId>
-        <version>${dynamic-ds.version}</version>
-      </dependency>
-      <dependency>
-        <groupId>org.mybatis.spring.boot</groupId>
-        <artifactId>mybatis-spring-boot-starter</artifactId>
-        <version>${spring-boot.mybatis}</version>
-      </dependency>
-      <dependency>
-        <groupId>com.baomidou</groupId>
-        <artifactId>mybatis-plus-boot-starter</artifactId>
-        <version>${mybatis-plus.version}</version>
-      </dependency>
-      <dependency>
-        <groupId>com.baomidou</groupId>
-        <artifactId>mybatis-plus-annotation</artifactId>
-        <version>${mybatis-plus.version}</version>
-      </dependency>
-      <dependency>
-        <groupId>org.apache.shardingsphere</groupId>
-        <artifactId>shardingsphere-jdbc-core</artifactId>
-        <version>${shardingsphere.version}</version>
-      </dependency>
-      <dependency>
-        <groupId>p6spy</groupId>
-        <artifactId>p6spy</artifactId>
-        <version>${p6spy.version}</version>
-      </dependency>
-      <dependency>
-        <groupId>com.squareup.okhttp3</groupId>
-        <artifactId>okhttp</artifactId>
-        <version>${okhttp.version}</version>
-      </dependency>
-      <dependency>
-        <groupId>com.amazonaws</groupId>
-        <artifactId>aws-java-sdk-s3</artifactId>
-        <version>${aws-java-sdk-s3.version}</version>
-      </dependency>
-      <dependency>
-        <groupId>de.codecentric</groupId>
-        <artifactId>spring-boot-admin-starter-server</artifactId>
-        <version>${spring-boot-admin.version}</version>
-      </dependency>
-      <dependency>
-        <groupId>de.codecentric</groupId>
-        <artifactId>spring-boot-admin-starter-client</artifactId>
-        <version>${spring-boot-admin.version}</version>
-      </dependency>
-      <dependency>
-        <groupId>com.alibaba</groupId>
-        <artifactId>transmittable-thread-local</artifactId>
-        <version>${alibaba-ttl.version}</version>
-      </dependency>
-      <dependency>
-        <groupId>com.alibaba</groupId>
-        <artifactId>fastjson</artifactId>
-        <version>${fastjson.version}</version>
-      </dependency>
-      <dependency>
-        <groupId>com.alibaba</groupId>
-        <artifactId>easyexcel</artifactId>
-        <version>${easyexcel.version}</version>
-        <exclusions>
-          <exclusion>
-            <groupId>org.apache.poi</groupId>
-            <artifactId>poi-ooxml-schemas</artifactId>
-          </exclusion>
-        </exclusions>
-      </dependency>
-      <dependency>
-        <groupId>org.redisson</groupId>
-        <artifactId>redisson-spring-boot-starter</artifactId>
-        <version>${redisson.version}</version>
-      </dependency>
-      <dependency>
-        <groupId>com.baomidou</groupId>
-        <artifactId>lock4j-redisson-spring-boot-starter</artifactId>
-        <version>${lock4j.version}</version>
-      </dependency>
-      <dependency>
-        <groupId>tech.powerjob</groupId>
-        <artifactId>powerjob-worker-spring-boot-starter</artifactId>
-        <version>${powerjob.version}</version>
-      </dependency>
-      <dependency>
-        <groupId>tech.powerjob</groupId>
-        <artifactId>powerjob-official-processors</artifactId>
-        <version>${powerjob.version}</version>
-      </dependency>
-      <dependency>
-        <groupId>org.bouncycastle</groupId>
-        <artifactId>bcprov-jdk15to18</artifactId>
-        <version>${bouncycastle.version}</version>
-      </dependency>
-      <dependency>
-        <groupId>io.github.linpeilie</groupId>
-        <artifactId>mapstruct-plus-spring-boot-starter</artifactId>
-        <version>${mapstruct-plus.version}</version>
-      </dependency>
-      <dependency>
-        <groupId>org.lionsoul</groupId>
-        <artifactId>ip2region</artifactId>
-        <version>${ip2region.version}</version>
-      </dependency>
-      <dependency>
-        <groupId>org.dromara.sms4j</groupId>
-        <artifactId>sms4j-spring-boot-starter</artifactId>
-        <version>${sms4j.version}</version>
-      </dependency>
-      <dependency>
-        <groupId>com.vap</groupId>
-        <artifactId>vber-common-bom</artifactId>
-        <version>3.0.0</version>
-        <type>pom</type>
-        <scope>import</scope>
-      </dependency>
-      <dependency>
-        <groupId>com.vap</groupId>
-        <artifactId>vber-system</artifactId>
-        <version>3.0.0</version>
-      </dependency>
-      <dependency>
-        <groupId>com.vap</groupId>
-        <artifactId>vber-job</artifactId>
-        <version>3.0.0</version>
-      </dependency>
-      <dependency>
-        <groupId>com.vap</groupId>
-        <artifactId>vber-generator</artifactId>
-        <version>3.0.0</version>
-      </dependency>
-    </dependencies>
-  </dependencyManagement>
-  <repositories>
-    <repository>
-      <releases>
-        <enabled>true</enabled>
-      </releases>
-      <id>public</id>
-      <name>huawei nexus</name>
-      <url>https://mirrors.huaweicloud.com/repository/maven/</url>
-    </repository>
-  </repositories>
-  <pluginRepositories>
-    <pluginRepository>
-      <releases>
-        <enabled>true</enabled>
-      </releases>
-      <snapshots>
-        <enabled>false</enabled>
-      </snapshots>
-      <id>public</id>
-      <name>huawei nexus</name>
-      <url>https://mirrors.huaweicloud.com/repository/maven/</url>
-    </pluginRepository>
-  </pluginRepositories>
-  <build>
-    <resources>
-      <resource>
-        <filtering>false</filtering>
-        <directory>src/main/resources</directory>
-      </resource>
-      <resource>
-        <filtering>true</filtering>
-        <directory>src/main/resources</directory>
-        <includes>
-          <include>application*</include>
-          <include>bootstrap*</include>
-          <include>banner*</include>
-        </includes>
-      </resource>
-    </resources>
-    <plugins>
-      <plugin>
-        <artifactId>maven-compiler-plugin</artifactId>
-        <version>${maven-compiler-plugin.verison}</version>
-        <configuration>
-          <source>${java.version}</source>
-          <target>${java.version}</target>
-          <encoding>${project.build.sourceEncoding}</encoding>
-          <annotationProcessorPaths>
-            <path>
-              <groupId>com.github.therapi</groupId>
-              <artifactId>therapi-runtime-javadoc-scribe</artifactId>
-              <version>${therapi-javadoc.version}</version>
-            </path>
-            <path>
-              <groupId>org.projectlombok</groupId>
-              <artifactId>lombok</artifactId>
-              <version>${lombok.version}</version>
-            </path>
-            <path>
-              <groupId>org.springframework.boot</groupId>
-              <artifactId>spring-boot-configuration-processor</artifactId>
-              <version>${spring-boot.version}</version>
-            </path>
-            <path>
-              <groupId>io.github.linpeilie</groupId>
-              <artifactId>mapstruct-plus-processor</artifactId>
-              <version>${mapstruct-plus.version}</version>
-            </path>
-            <path>
-              <groupId>org.projectlombok</groupId>
-              <artifactId>lombok-mapstruct-binding</artifactId>
-              <version>${mapstruct-plus.lombok.version}</version>
-            </path>
-          </annotationProcessorPaths>
-          <compilerArgs>
-            <arg>-parameters</arg>
-          </compilerArgs>
-        </configuration>
-      </plugin>
-      <plugin>
-        <artifactId>maven-surefire-plugin</artifactId>
-        <version>${maven-surefire-plugin.version}</version>
-        <configuration>
-          <groups>${profiles.active}</groups>
-          <excludedGroups>exclude</excludedGroups>
-        </configuration>
-      </plugin>
-      <plugin>
-        <groupId>org.codehaus.mojo</groupId>
-        <artifactId>flatten-maven-plugin</artifactId>
-        <version>${flatten-maven-plugin.version}</version>
-        <executions>
-          <execution>
-            <id>flatten</id>
-            <phase>process-resources</phase>
-            <goals>
-              <goal>flatten</goal>
-            </goals>
-          </execution>
-          <execution>
-            <id>flatten.clean</id>
-            <phase>clean</phase>
-            <goals>
-              <goal>clean</goal>
-            </goals>
-          </execution>
-        </executions>
-        <configuration>
-          <updatePomFile>true</updatePomFile>
-          <flattenMode>resolveCiFriendliesOnly</flattenMode>
-        </configuration>
-      </plugin>
-    </plugins>
-  </build>
-  <profiles>
-    <profile>
-      <id>local</id>
-      <properties>
-        <profiles.active>local</profiles.active>
-        <logging.level>info</logging.level>
-      </properties>
-    </profile>
-    <profile>
-      <id>dev</id>
-      <activation>
-        <activeByDefault>true</activeByDefault>
-      </activation>
-      <properties>
-        <profiles.active>dev</profiles.active>
-        <logging.level>info</logging.level>
-      </properties>
-    </profile>
-    <profile>
-      <id>prod</id>
-      <properties>
-        <profiles.active>prod</profiles.active>
-        <logging.level>warn</logging.level>
-      </properties>
-    </profile>
-  </profiles>
-</project>

+ 0 - 39
SERVER/VberAdminPlusV3/vber-common/.flattened-pom.xml

@@ -1,39 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<project xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://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.vap</groupId>
-    <artifactId>VberAdminPlus</artifactId>
-    <version>3.0.0</version>
-  </parent>
-  <groupId>com.vap</groupId>
-  <artifactId>vber-common</artifactId>
-  <version>3.0.0</version>
-  <packaging>pom</packaging>
-  <name>${project.artifactId}</name>
-  <description>公共模块</description>
-  <modules>
-    <module>vber-common-bom</module>
-    <module>vber-common-core</module>
-    <module>vber-common-doc</module>
-    <module>vber-common-excel</module>
-    <module>vber-common-redis</module>
-    <module>vber-common-idempotent</module>
-    <module>vber-common-job</module>
-    <module>vber-common-satoken</module>
-    <module>vber-common-log</module>
-    <module>vber-common-security</module>
-    <module>vber-common-sms</module>
-    <module>vber-common-social</module>
-    <module>vber-common-tenant</module>
-    <module>vber-common-web</module>
-    <module>vber-common-websocket</module>
-    <module>vber-common-mail</module>
-    <module>vber-common-mybatis</module>
-    <module>vber-common-oss</module>
-    <module>vber-common-ratelimiter</module>
-    <module>vber-common-encrypt</module>
-    <module>vber-common-translation</module>
-  </modules>
-</project>

+ 0 - 81
SERVER/VberAdminPlusV3/vber-common/vber-common-core/.flattened-pom.xml

@@ -1,81 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<project xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://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.vap</groupId>
-    <artifactId>vber-common</artifactId>
-    <version>3.0.0</version>
-  </parent>
-  <groupId>com.vap</groupId>
-  <artifactId>vber-common-core</artifactId>
-  <version>3.0.0</version>
-  <description>核心模块</description>
-  <dependencies>
-    <dependency>
-      <groupId>org.springframework</groupId>
-      <artifactId>spring-context-support</artifactId>
-    </dependency>
-    <dependency>
-      <groupId>org.springframework</groupId>
-      <artifactId>spring-web</artifactId>
-    </dependency>
-    <dependency>
-      <groupId>org.springframework.boot</groupId>
-      <artifactId>spring-boot-starter-validation</artifactId>
-    </dependency>
-    <dependency>
-      <groupId>org.springframework.boot</groupId>
-      <artifactId>spring-boot-starter-aop</artifactId>
-    </dependency>
-    <dependency>
-      <groupId>org.apache.commons</groupId>
-      <artifactId>commons-lang3</artifactId>
-    </dependency>
-    <dependency>
-      <groupId>jakarta.servlet</groupId>
-      <artifactId>jakarta.servlet-api</artifactId>
-    </dependency>
-    <dependency>
-      <groupId>cn.hutool</groupId>
-      <artifactId>hutool-core</artifactId>
-    </dependency>
-    <dependency>
-      <groupId>cn.hutool</groupId>
-      <artifactId>hutool-http</artifactId>
-    </dependency>
-    <dependency>
-      <groupId>cn.hutool</groupId>
-      <artifactId>hutool-extra</artifactId>
-    </dependency>
-    <dependency>
-      <groupId>org.projectlombok</groupId>
-      <artifactId>lombok</artifactId>
-    </dependency>
-    <dependency>
-      <groupId>org.springframework.boot</groupId>
-      <artifactId>spring-boot-configuration-processor</artifactId>
-    </dependency>
-    <dependency>
-      <groupId>org.springframework.boot</groupId>
-      <artifactId>spring-boot-properties-migrator</artifactId>
-      <scope>runtime</scope>
-    </dependency>
-    <dependency>
-      <groupId>io.github.linpeilie</groupId>
-      <artifactId>mapstruct-plus-spring-boot-starter</artifactId>
-    </dependency>
-    <dependency>
-      <groupId>org.lionsoul</groupId>
-      <artifactId>ip2region</artifactId>
-    </dependency>
-    <dependency>
-      <groupId>com.fasterxml.jackson.core</groupId>
-      <artifactId>jackson-databind</artifactId>
-    </dependency>
-    <dependency>
-      <groupId>com.fasterxml.jackson.datatype</groupId>
-      <artifactId>jackson-datatype-jsr310</artifactId>
-    </dependency>
-  </dependencies>
-</project>

+ 0 - 33
SERVER/VberAdminPlusV3/vber-common/vber-common-doc/.flattened-pom.xml

@@ -1,33 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<project xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://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.vap</groupId>
-    <artifactId>vber-common</artifactId>
-    <version>3.0.0</version>
-  </parent>
-  <groupId>com.vap</groupId>
-  <artifactId>vber-common-doc</artifactId>
-  <version>3.0.0</version>
-  <name>${project.artifactId}</name>
-  <description>系统接口</description>
-  <dependencies>
-    <dependency>
-      <groupId>com.vap</groupId>
-      <artifactId>vber-common-core</artifactId>
-    </dependency>
-    <dependency>
-      <groupId>org.springdoc</groupId>
-      <artifactId>springdoc-openapi-starter-webmvc-api</artifactId>
-    </dependency>
-    <dependency>
-      <groupId>com.github.therapi</groupId>
-      <artifactId>therapi-runtime-javadoc</artifactId>
-    </dependency>
-    <dependency>
-      <groupId>com.fasterxml.jackson.module</groupId>
-      <artifactId>jackson-module-kotlin</artifactId>
-    </dependency>
-  </dependencies>
-</project>

+ 0 - 25
SERVER/VberAdminPlusV3/vber-common/vber-common-excel/.flattened-pom.xml

@@ -1,25 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<project xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://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.vap</groupId>
-    <artifactId>vber-common</artifactId>
-    <version>3.0.0</version>
-  </parent>
-  <groupId>com.vap</groupId>
-  <artifactId>vber-common-excel</artifactId>
-  <version>3.0.0</version>
-  <name>${project.artifactId}</name>
-  <description>Excel导入导出模块</description>
-  <dependencies>
-    <dependency>
-      <groupId>com.vap</groupId>
-      <artifactId>vber-common-core</artifactId>
-    </dependency>
-    <dependency>
-      <groupId>com.alibaba</groupId>
-      <artifactId>easyexcel</artifactId>
-    </dependency>
-  </dependencies>
-</project>

+ 0 - 29
SERVER/VberAdminPlusV3/vber-common/vber-common-idempotent/.flattened-pom.xml

@@ -1,29 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<project xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://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.vap</groupId>
-    <artifactId>vber-common</artifactId>
-    <version>3.0.0</version>
-  </parent>
-  <groupId>com.vap</groupId>
-  <artifactId>vber-common-idempotent</artifactId>
-  <version>3.0.0</version>
-  <name>${project.artifactId}</name>
-  <description>幂等功能</description>
-  <dependencies>
-    <dependency>
-      <groupId>com.vap</groupId>
-      <artifactId>vber-common-redis</artifactId>
-    </dependency>
-    <dependency>
-      <groupId>cn.hutool</groupId>
-      <artifactId>hutool-crypto</artifactId>
-    </dependency>
-    <dependency>
-      <groupId>cn.dev33</groupId>
-      <artifactId>sa-token-core</artifactId>
-    </dependency>
-  </dependencies>
-</project>

+ 0 - 43
SERVER/VberAdminPlusV3/vber-common/vber-common-job/.flattened-pom.xml

@@ -1,43 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<project xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://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.vap</groupId>
-    <artifactId>vber-common</artifactId>
-    <version>3.0.0</version>
-  </parent>
-  <groupId>com.vap</groupId>
-  <artifactId>vber-common-job</artifactId>
-  <version>3.0.0</version>
-  <name>${project.artifactId}</name>
-  <description>job 定时任务</description>
-  <dependencies>
-    <dependency>
-      <groupId>com.vap</groupId>
-      <artifactId>vber-common-core</artifactId>
-    </dependency>
-    <dependency>
-      <groupId>org.springframework.boot</groupId>
-      <artifactId>spring-boot-autoconfigure</artifactId>
-    </dependency>
-    <dependency>
-      <groupId>tech.powerjob</groupId>
-      <artifactId>powerjob-worker-spring-boot-starter</artifactId>
-      <exclusions>
-        <exclusion>
-          <groupId>tech.powerjob</groupId>
-          <artifactId>powerjob-remote-impl-akka</artifactId>
-        </exclusion>
-      </exclusions>
-    </dependency>
-    <dependency>
-      <groupId>tech.powerjob</groupId>
-      <artifactId>powerjob-official-processors</artifactId>
-    </dependency>
-    <dependency>
-      <groupId>org.projectlombok</groupId>
-      <artifactId>lombok</artifactId>
-    </dependency>
-  </dependencies>
-</project>

+ 0 - 25
SERVER/VberAdminPlusV3/vber-common/vber-common-log/.flattened-pom.xml

@@ -1,25 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<project xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://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.vap</groupId>
-    <artifactId>vber-common</artifactId>
-    <version>3.0.0</version>
-  </parent>
-  <groupId>com.vap</groupId>
-  <artifactId>vber-common-log</artifactId>
-  <version>3.0.0</version>
-  <name>${project.artifactId}</name>
-  <description>log 日志</description>
-  <dependencies>
-    <dependency>
-      <groupId>com.vap</groupId>
-      <artifactId>vber-common-satoken</artifactId>
-    </dependency>
-    <dependency>
-      <groupId>com.alibaba</groupId>
-      <artifactId>transmittable-thread-local</artifactId>
-    </dependency>
-  </dependencies>
-</project>

+ 0 - 29
SERVER/VberAdminPlusV3/vber-common/vber-common-mail/.flattened-pom.xml

@@ -1,29 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<project xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://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.vap</groupId>
-    <artifactId>vber-common</artifactId>
-    <version>3.0.0</version>
-  </parent>
-  <groupId>com.vap</groupId>
-  <artifactId>vber-common-mail</artifactId>
-  <version>3.0.0</version>
-  <name>${project.artifactId}</name>
-  <description>mail邮件模块</description>
-  <dependencies>
-    <dependency>
-      <groupId>com.vap</groupId>
-      <artifactId>vber-common-core</artifactId>
-    </dependency>
-    <dependency>
-      <groupId>jakarta.mail</groupId>
-      <artifactId>jakarta.mail-api</artifactId>
-    </dependency>
-    <dependency>
-      <groupId>org.eclipse.angus</groupId>
-      <artifactId>jakarta.mail</artifactId>
-    </dependency>
-  </dependencies>
-</project>

+ 0 - 51
SERVER/VberAdminPlusV3/vber-common/vber-common-mybatis/.flattened-pom.xml

@@ -1,51 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<project xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://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.vap</groupId>
-    <artifactId>vber-common</artifactId>
-    <version>3.0.0</version>
-  </parent>
-  <groupId>com.vap</groupId>
-  <artifactId>vber-common-mybatis</artifactId>
-  <version>3.0.0</version>
-  <name>${project.artifactId}</name>
-  <description>数据库服务</description>
-  <dependencies>
-    <dependency>
-      <groupId>com.vap</groupId>
-      <artifactId>vber-common-core</artifactId>
-    </dependency>
-    <dependency>
-      <groupId>com.vap</groupId>
-      <artifactId>vber-common-satoken</artifactId>
-    </dependency>
-    <dependency>
-      <groupId>com.baomidou</groupId>
-      <artifactId>dynamic-datasource-spring-boot3-starter</artifactId>
-    </dependency>
-    <dependency>
-      <groupId>org.apache.shardingsphere</groupId>
-      <artifactId>shardingsphere-jdbc-core</artifactId>
-    </dependency>
-    <dependency>
-      <groupId>org.mybatis.spring.boot</groupId>
-      <artifactId>mybatis-spring-boot-starter</artifactId>
-    </dependency>
-    <dependency>
-      <groupId>com.baomidou</groupId>
-      <artifactId>mybatis-plus-boot-starter</artifactId>
-      <exclusions>
-        <exclusion>
-          <groupId>org.mybatis</groupId>
-          <artifactId>mybatis-spring</artifactId>
-        </exclusion>
-      </exclusions>
-    </dependency>
-    <dependency>
-      <groupId>p6spy</groupId>
-      <artifactId>p6spy</artifactId>
-    </dependency>
-  </dependencies>
-</project>

+ 0 - 33
SERVER/VberAdminPlusV3/vber-common/vber-common-oss/.flattened-pom.xml

@@ -1,33 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<project xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://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.vap</groupId>
-    <artifactId>vber-common</artifactId>
-    <version>3.0.0</version>
-  </parent>
-  <groupId>com.vap</groupId>
-  <artifactId>vber-common-oss</artifactId>
-  <version>3.0.0</version>
-  <name>${project.artifactId}</name>
-  <description>oss服务</description>
-  <dependencies>
-    <dependency>
-      <groupId>com.vap</groupId>
-      <artifactId>vber-common-core</artifactId>
-    </dependency>
-    <dependency>
-      <groupId>com.vap</groupId>
-      <artifactId>vber-common-redis</artifactId>
-    </dependency>
-    <dependency>
-      <groupId>com.amazonaws</groupId>
-      <artifactId>aws-java-sdk-s3</artifactId>
-    </dependency>
-    <dependency>
-      <groupId>cn.hutool</groupId>
-      <artifactId>hutool-crypto</artifactId>
-    </dependency>
-  </dependencies>
-</project>

+ 0 - 29
SERVER/VberAdminPlusV3/vber-common/vber-common-redis/.flattened-pom.xml

@@ -1,29 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<project xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://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.vap</groupId>
-    <artifactId>vber-common</artifactId>
-    <version>3.0.0</version>
-  </parent>
-  <groupId>com.vap</groupId>
-  <artifactId>vber-common-redis</artifactId>
-  <version>3.0.0</version>
-  <name>${project.artifactId}</name>
-  <description>redis缓存服务</description>
-  <dependencies>
-    <dependency>
-      <groupId>com.vap</groupId>
-      <artifactId>vber-common-core</artifactId>
-    </dependency>
-    <dependency>
-      <groupId>org.redisson</groupId>
-      <artifactId>redisson-spring-boot-starter</artifactId>
-    </dependency>
-    <dependency>
-      <groupId>com.baomidou</groupId>
-      <artifactId>lock4j-redisson-spring-boot-starter</artifactId>
-    </dependency>
-  </dependencies>
-</project>

+ 0 - 33
SERVER/VberAdminPlusV3/vber-common/vber-common-satoken/.flattened-pom.xml

@@ -1,33 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<project xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://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.vap</groupId>
-    <artifactId>vber-common</artifactId>
-    <version>3.0.0</version>
-  </parent>
-  <groupId>com.vap</groupId>
-  <artifactId>vber-common-satoken</artifactId>
-  <version>3.0.0</version>
-  <name>${project.artifactId}</name>
-  <description>sa-token模块</description>
-  <dependencies>
-    <dependency>
-      <groupId>com.vap</groupId>
-      <artifactId>vber-common-core</artifactId>
-    </dependency>
-    <dependency>
-      <groupId>com.vap</groupId>
-      <artifactId>vber-common-redis</artifactId>
-    </dependency>
-    <dependency>
-      <groupId>cn.dev33</groupId>
-      <artifactId>sa-token-spring-boot3-starter</artifactId>
-    </dependency>
-    <dependency>
-      <groupId>cn.dev33</groupId>
-      <artifactId>sa-token-jwt</artifactId>
-    </dependency>
-  </dependencies>
-</project>

+ 0 - 21
SERVER/VberAdminPlusV3/vber-common/vber-common-security/.flattened-pom.xml

@@ -1,21 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<project xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://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.vap</groupId>
-    <artifactId>vber-common</artifactId>
-    <version>3.0.0</version>
-  </parent>
-  <groupId>com.vap</groupId>
-  <artifactId>vber-common-security</artifactId>
-  <version>3.0.0</version>
-  <name>${project.artifactId}</name>
-  <description>security 安全模块</description>
-  <dependencies>
-    <dependency>
-      <groupId>com.vap</groupId>
-      <artifactId>vber-common-satoken</artifactId>
-    </dependency>
-  </dependencies>
-</project>

+ 0 - 27
SERVER/VberAdminPlusV3/vber-common/vber-common-sms/.flattened-pom.xml

@@ -1,27 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<project xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://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.vap</groupId>
-    <artifactId>vber-common</artifactId>
-    <version>3.0.0</version>
-  </parent>
-  <groupId>com.vap</groupId>
-  <artifactId>vber-common-sms</artifactId>
-  <version>3.0.0</version>
-  <name>${project.artifactId}</name>
-  <description>sms 短信模块</description>
-  <dependencies>
-    <dependency>
-      <groupId>org.dromara.sms4j</groupId>
-      <artifactId>sms4j-spring-boot-starter</artifactId>
-      <exclusions>
-        <exclusion>
-          <groupId>com.alibaba</groupId>
-          <artifactId>fastjson</artifactId>
-        </exclusion>
-      </exclusions>
-    </dependency>
-  </dependencies>
-</project>

+ 0 - 29
SERVER/VberAdminPlusV3/vber-common/vber-common-social/.flattened-pom.xml

@@ -1,29 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<project xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://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.vap</groupId>
-    <artifactId>vber-common</artifactId>
-    <version>3.0.0</version>
-  </parent>
-  <groupId>com.vap</groupId>
-  <artifactId>vber-common-social</artifactId>
-  <version>3.0.0</version>
-  <name>${project.artifactId}</name>
-  <description>social授权认证</description>
-  <dependencies>
-    <dependency>
-      <groupId>com.vap</groupId>
-      <artifactId>vber-common-core</artifactId>
-    </dependency>
-    <dependency>
-      <groupId>com.vap</groupId>
-      <artifactId>vber-common-redis</artifactId>
-    </dependency>
-    <dependency>
-      <groupId>me.zhyd.oauth</groupId>
-      <artifactId>JustAuth</artifactId>
-    </dependency>
-  </dependencies>
-</project>

+ 0 - 29
SERVER/VberAdminPlusV3/vber-common/vber-common-tenant/.flattened-pom.xml

@@ -1,29 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<project xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://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.vap</groupId>
-    <artifactId>vber-common</artifactId>
-    <version>3.0.0</version>
-  </parent>
-  <groupId>com.vap</groupId>
-  <artifactId>vber-common-tenant</artifactId>
-  <version>3.0.0</version>
-  <name>${project.artifactId}</name>
-  <description>tenant 租户模块</description>
-  <dependencies>
-    <dependency>
-      <groupId>com.vap</groupId>
-      <artifactId>vber-common-mybatis</artifactId>
-    </dependency>
-    <dependency>
-      <groupId>com.vap</groupId>
-      <artifactId>vber-common-redis</artifactId>
-    </dependency>
-    <dependency>
-      <groupId>com.alibaba</groupId>
-      <artifactId>transmittable-thread-local</artifactId>
-    </dependency>
-  </dependencies>
-</project>

+ 0 - 55
SERVER/VberAdminPlusV3/vber-common/vber-common-web/.flattened-pom.xml

@@ -1,55 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<project xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://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.vap</groupId>
-    <artifactId>vber-common</artifactId>
-    <version>3.0.0</version>
-  </parent>
-  <groupId>com.vap</groupId>
-  <artifactId>vber-common-web</artifactId>
-  <version>3.0.0</version>
-  <name>${project.artifactId}</name>
-  <description>web服务</description>
-  <dependencies>
-    <dependency>
-      <groupId>com.vap</groupId>
-      <artifactId>vber-common-core</artifactId>
-    </dependency>
-    <dependency>
-      <groupId>com.vap</groupId>
-      <artifactId>vber-common-redis</artifactId>
-    </dependency>
-    <dependency>
-      <groupId>org.springframework.boot</groupId>
-      <artifactId>spring-boot-starter-web</artifactId>
-      <exclusions>
-        <exclusion>
-          <groupId>org.springframework.boot</groupId>
-          <artifactId>spring-boot-starter-tomcat</artifactId>
-        </exclusion>
-      </exclusions>
-    </dependency>
-    <dependency>
-      <groupId>org.springframework.boot</groupId>
-      <artifactId>spring-boot-starter-undertow</artifactId>
-    </dependency>
-    <dependency>
-      <groupId>org.springframework.boot</groupId>
-      <artifactId>spring-boot-starter-actuator</artifactId>
-    </dependency>
-    <dependency>
-      <groupId>cn.hutool</groupId>
-      <artifactId>hutool-captcha</artifactId>
-    </dependency>
-    <dependency>
-      <groupId>cn.hutool</groupId>
-      <artifactId>hutool-crypto</artifactId>
-    </dependency>
-    <dependency>
-      <groupId>com.alibaba</groupId>
-      <artifactId>transmittable-thread-local</artifactId>
-    </dependency>
-  </dependencies>
-</project>

+ 0 - 33
SERVER/VberAdminPlusV3/vber-common/vber-common-websocket/.flattened-pom.xml

@@ -1,33 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<project xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://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.vap</groupId>
-    <artifactId>vber-common</artifactId>
-    <version>3.0.0</version>
-  </parent>
-  <groupId>com.vap</groupId>
-  <artifactId>vber-common-websocket</artifactId>
-  <version>3.0.0</version>
-  <name>${project.artifactId}</name>
-  <description>websocket 模块</description>
-  <dependencies>
-    <dependency>
-      <groupId>com.vap</groupId>
-      <artifactId>vber-common-core</artifactId>
-    </dependency>
-    <dependency>
-      <groupId>com.vap</groupId>
-      <artifactId>vber-common-redis</artifactId>
-    </dependency>
-    <dependency>
-      <groupId>com.vap</groupId>
-      <artifactId>vber-common-satoken</artifactId>
-    </dependency>
-    <dependency>
-      <groupId>org.springframework.boot</groupId>
-      <artifactId>spring-boot-starter-websocket</artifactId>
-    </dependency>
-  </dependencies>
-</project>

+ 7 - 7
SERVER/VberAdminPlusV3/vber-modules/vber-system/src/main/java/com/vber/system/controller/system/SysTenantController.java

@@ -3,11 +3,6 @@ package com.vber.system.controller.system;
 import cn.dev33.satoken.annotation.SaCheckPermission;
 import cn.dev33.satoken.annotation.SaCheckRole;
 import com.baomidou.lock.annotation.Lock4j;
-import jakarta.servlet.http.HttpServletResponse;
-import jakarta.validation.constraints.NotBlank;
-import jakarta.validation.constraints.NotEmpty;
-import jakarta.validation.constraints.NotNull;
-import lombok.RequiredArgsConstructor;
 import com.vber.common.core.constant.TenantConstants;
 import com.vber.common.core.domain.R;
 import com.vber.common.core.validate.AddGroup;
@@ -24,6 +19,11 @@ import com.vber.common.web.core.BaseController;
 import com.vber.system.domain.bo.SysTenantBo;
 import com.vber.system.domain.vo.SysTenantVo;
 import com.vber.system.service.ISysTenantService;
+import jakarta.servlet.http.HttpServletResponse;
+import jakarta.validation.constraints.NotBlank;
+import jakarta.validation.constraints.NotEmpty;
+import jakarta.validation.constraints.NotNull;
+import lombok.RequiredArgsConstructor;
 import org.springframework.validation.annotation.Validated;
 import org.springframework.web.bind.annotation.*;
 
@@ -89,7 +89,7 @@ public class SysTenantController extends BaseController {
     @PostMapping()
     public R<Void> add(@Validated(AddGroup.class) @RequestBody SysTenantBo bo) {
         if (!tenantService.checkCompanyNameUnique(bo)) {
-            return R.fail("新增租户'" + bo.getCompanyName() + "'失败,企业名称已存在");
+            return R.fail("新增租户'" + bo.getCompanyName() + "'失败,租户名称已存在");
         }
         return toAjax(TenantHelper.ignore(() -> tenantService.insertByBo(bo)));
     }
@@ -105,7 +105,7 @@ public class SysTenantController extends BaseController {
     public R<Void> edit(@Validated(EditGroup.class) @RequestBody SysTenantBo bo) {
         tenantService.checkTenantAllowed(bo.getTenantId());
         if (!tenantService.checkCompanyNameUnique(bo)) {
-            return R.fail("修改租户'" + bo.getCompanyName() + "'失败,公司名称已存在");
+            return R.fail("修改租户'" + bo.getCompanyName() + "'失败,租户名称已存在");
         }
         return toAjax(tenantService.updateByBo(bo));
     }

+ 5 - 3
SERVER/VberAdminPlusV3/vber-modules/vber-system/src/main/java/com/vber/system/domain/bo/SysTenantBo.java

@@ -1,17 +1,18 @@
 package com.vber.system.domain.bo;
 
+import com.fasterxml.jackson.annotation.JsonFormat;
 import com.vber.common.core.validate.AddGroup;
 import com.vber.common.core.validate.EditGroup;
+import com.vber.common.mybatis.core.domain.BaseEntity;
 import com.vber.system.domain.SysTenant;
 import io.github.linpeilie.annotations.AutoMapper;
+import jakarta.validation.constraints.NotBlank;
+import jakarta.validation.constraints.NotNull;
 import lombok.Data;
 import lombok.EqualsAndHashCode;
-import jakarta.validation.constraints.*;
 
 import java.util.Date;
 
-import com.vber.common.mybatis.core.domain.BaseEntity;
-
 /**
  * 租户业务对象 sys_tenant
  *
@@ -98,6 +99,7 @@ public class SysTenantBo extends BaseEntity {
     /**
      * 过期时间
      */
+    @JsonFormat(pattern = "YYYY-MM-DD")
     private Date expireTime;
 
     /**

+ 7 - 2
SERVER/VberAdminPlusV3/vber-modules/vber-system/src/main/java/com/vber/system/domain/vo/SysTenantVo.java

@@ -1,17 +1,18 @@
 package com.vber.system.domain.vo;
 
-import java.util.Date;
-
 import com.alibaba.excel.annotation.ExcelIgnoreUnannotated;
 import com.alibaba.excel.annotation.ExcelProperty;
 import com.vber.common.excel.annotation.ExcelDictFormat;
 import com.vber.common.excel.convert.ExcelDictConvert;
+import com.vber.common.translation.annotation.Translation;
+import com.vber.common.translation.constant.TransConstant;
 import com.vber.system.domain.SysTenant;
 import io.github.linpeilie.annotations.AutoMapper;
 import lombok.Data;
 
 import java.io.Serial;
 import java.io.Serializable;
+import java.util.Date;
 
 
 /**
@@ -93,6 +94,10 @@ public class SysTenantVo implements Serializable {
     @ExcelProperty(value = "租户套餐编号")
     private Long packageId;
 
+    @ExcelProperty(value = "租户套餐")
+    @Translation(type = TransConstant.TENANT_PACKAGE_ID_TO_NAME, mapper = "packageId")
+    private String packageName;
+
     /**
      * 过期时间
      */

+ 12 - 9
SERVER/VberAdminPlusV3/vber-modules/vber-system/src/main/java/com/vber/system/service/impl/SysTenantServiceImpl.java

@@ -7,7 +7,6 @@ import cn.hutool.core.util.RandomUtil;
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.baomidou.mybatisplus.core.toolkit.Wrappers;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
-import lombok.RequiredArgsConstructor;
 import com.vber.common.core.constant.CacheNames;
 import com.vber.common.core.constant.Constants;
 import com.vber.common.core.constant.TenantConstants;
@@ -22,15 +21,13 @@ import com.vber.system.domain.bo.SysTenantBo;
 import com.vber.system.domain.vo.SysTenantVo;
 import com.vber.system.mapper.*;
 import com.vber.system.service.ISysTenantService;
+import lombok.RequiredArgsConstructor;
 import org.springframework.cache.annotation.CacheEvict;
 import org.springframework.cache.annotation.Cacheable;
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
 
-import java.util.ArrayList;
-import java.util.Collection;
-import java.util.Date;
-import java.util.List;
+import java.util.*;
 
 /**
  * 租户Service业务层处理
@@ -90,17 +87,19 @@ public class SysTenantServiceImpl implements ISysTenantService {
     }
 
     private LambdaQueryWrapper<SysTenant> buildQueryWrapper(SysTenantBo bo) {
+        Map<String, Object> params = bo.getParams();
         LambdaQueryWrapper<SysTenant> lqw = Wrappers.lambdaQuery();
         lqw.eq(StringUtils.isNotBlank(bo.getTenantId()), SysTenant::getTenantId, bo.getTenantId());
         lqw.like(StringUtils.isNotBlank(bo.getContactUserName()), SysTenant::getContactUserName, bo.getContactUserName());
         lqw.eq(StringUtils.isNotBlank(bo.getContactPhone()), SysTenant::getContactPhone, bo.getContactPhone());
         lqw.like(StringUtils.isNotBlank(bo.getCompanyName()), SysTenant::getCompanyName, bo.getCompanyName());
         lqw.eq(StringUtils.isNotBlank(bo.getLicenseNumber()), SysTenant::getLicenseNumber, bo.getLicenseNumber());
-        lqw.eq(StringUtils.isNotBlank(bo.getAddress()), SysTenant::getAddress, bo.getAddress());
+        lqw.like(StringUtils.isNotBlank(bo.getAddress()), SysTenant::getAddress, bo.getAddress());
         lqw.eq(StringUtils.isNotBlank(bo.getIntro()), SysTenant::getIntro, bo.getIntro());
         lqw.like(StringUtils.isNotBlank(bo.getDomain()), SysTenant::getDomain, bo.getDomain());
         lqw.eq(bo.getPackageId() != null, SysTenant::getPackageId, bo.getPackageId());
-        lqw.eq(bo.getExpireTime() != null, SysTenant::getExpireTime, bo.getExpireTime());
+        lqw.between(params.get("beginExpireTime") != null && params.get("endExpireTime") != null,
+                SysTenant::getExpireTime, params.get("beginExpireTime"), params.get("endExpireTime"));
         lqw.eq(bo.getAccountCount() != null, SysTenant::getAccountCount, bo.getAccountCount());
         lqw.eq(StringUtils.isNotBlank(bo.getStatus()), SysTenant::getStatus, bo.getStatus());
         lqw.orderByAsc(SysTenant::getId);
@@ -114,7 +113,9 @@ public class SysTenantServiceImpl implements ISysTenantService {
     @Transactional(rollbackFor = Exception.class)
     public Boolean insertByBo(SysTenantBo bo) {
         SysTenant add = MapstructUtils.convert(bo, SysTenant.class);
-
+        if (add == null) {
+            throw new ServiceException("创建租户失败:实体转换失败。");
+        }
         // 获取所有租户编号
         List<String> tenantIds = baseMapper.selectObjs(
                 new LambdaQueryWrapper<SysTenant>().select(SysTenant::getTenantId), x -> {
@@ -124,7 +125,7 @@ public class SysTenantServiceImpl implements ISysTenantService {
         add.setTenantId(tenantId);
         boolean flag = baseMapper.insert(add) > 0;
         if (!flag) {
-            throw new ServiceException("创建租户失败");
+            throw new ServiceException("创建租户失败:插入数据库失败。");
         }
         bo.setId(add.getId());
 
@@ -166,6 +167,7 @@ public class SysTenantServiceImpl implements ISysTenantService {
         userRole.setRoleId(roleId);
         userRoleMapper.insert(userRole);
 
+        // 字典数据
         String defaultTenantId = TenantConstants.DEFAULT_TENANT_ID;
         List<SysDictType> dictTypeList = dictTypeMapper.selectList(
                 new LambdaQueryWrapper<SysDictType>().eq(SysDictType::getTenantId, defaultTenantId));
@@ -182,6 +184,7 @@ public class SysTenantServiceImpl implements ISysTenantService {
         dictTypeMapper.insertBatch(dictTypeList);
         dictDataMapper.insertBatch(dictDataList);
 
+        // 系统配置
         List<SysConfig> sysConfigList = configMapper.selectList(
                 new LambdaQueryWrapper<SysConfig>().eq(SysConfig::getTenantId, defaultTenantId));
         for (SysConfig config : sysConfigList) {

+ 7 - 0
UI/VAP_V3.VUE/src/api/system/_menu.ts

@@ -49,6 +49,13 @@ class menuApi {
 		})
 	}
 
+	// 根据PackageID查询菜单下拉树结构
+	tenantPackageMenuTreeSelect = (packageId: string) => {
+		return Rs.get({
+			url: "/system/menu/tenantPackageMenuTreeSelect/" + packageId
+		})
+	}
+
 	// 新增菜单
 	addMenu = (data: any) => {
 		return Rs.post({

+ 94 - 0
UI/VAP_V3.VUE/src/api/system/_tenant.ts

@@ -0,0 +1,94 @@
+import Rs from "@/core/services/RequestService"
+
+class tenantApi {
+	tableUrl = "/system/tenant/list"
+	exportUrl = "/system/tenant/export"
+
+	// 查询租户列表
+	list = (query: any) => {
+		return Rs.get({
+			url: "/system/tenant/list",
+			params: query,
+			loading: false
+		})
+	}
+
+	// 查询租户详细
+	get = (id: string) => {
+		return Rs.get({
+			url: "/system/tenant/" + id,
+			loading: false
+		})
+	}
+
+	// 新增或修改租户
+	addOrUpdate = (data: any) => {
+		return new Promise((resolve) => {
+			if (data.id) {
+				this.update(data).then((res: any) => {
+					message.msgSuccess("修改成功")
+					resolve(res)
+				})
+			} else {
+				this.add(data).then((res: any) => {
+					message.msgSuccess("新增成功")
+					resolve(res)
+				})
+			}
+		})
+	}
+
+	// 新增租户
+	add = (data: any) => {
+		return Rs.post({
+			url: "/system/tenant",
+			data: data,
+			successAlert: false
+		})
+	}
+
+	// 修改租户
+	update = (data: any) => {
+		return Rs.put({
+			url: "/system/tenant",
+			data: data,
+			successAlert: false
+		})
+	}
+
+	// 删除租户
+	del = (id: string | string[]) => {
+		return Rs.del({
+			url: "/system/tenant/" + id
+		})
+	}
+
+	// 租户状态修改
+	changeStatus = (tenantId: number | string, status: string) => {
+		return Rs.put({
+			url: "/system/tenant/changeStatus",
+			data: { tenantId, status }
+		})
+	}
+	// 同步租户套餐
+	syncTenantPackage = (tenantId: string | number, packageId: string | number) => {
+		return Rs.get({
+			url: "/system/tenant/syncTenantPackage",
+			data: { tenantId, packageId }
+		})
+	}
+	// 动态切换租户
+	dynamicTenant = (tenantId: string | number) => {
+		return Rs.get({
+			url: "/system/tenant/dynamic/" + tenantId
+		})
+	}
+	// 清除动态租户
+	dynamicClear = () => {
+		return Rs.get({
+			url: "/system/tenant/dynamic/clear"
+		})
+	}
+}
+
+export default tenantApi

+ 80 - 0
UI/VAP_V3.VUE/src/api/system/_tenantPackage.ts

@@ -0,0 +1,80 @@
+import Rs from "@/core/services/RequestService"
+
+class tenantPackageApi {
+	tableUrl = "/system/tenant/package/list"
+	exportUrl = "/system/tenant/package/export"
+
+	// 查询租户套餐列表
+	list = (query: any) => {
+		return Rs.get({
+			url: "/system/tenant/package/list",
+			params: query,
+			loading: false
+		})
+	}
+
+	// 查询租户套餐详细
+	get = (packageId: string) => {
+		return Rs.get({
+			url: "/system/tenant/package/" + packageId,
+			loading: false
+		})
+	}
+	// 新增或修改租户套餐
+	addOrUpdate = (data: any) => {
+		return new Promise((resolve) => {
+			if (data.packageId) {
+				this.update(data).then((res: any) => {
+					message.msgSuccess("修改成功")
+					resolve(res)
+				})
+			} else {
+				this.add(data).then((res: any) => {
+					message.msgSuccess("新增成功")
+					resolve(res)
+				})
+			}
+		})
+	}
+
+	// 新增租户套餐
+	add = (data: any) => {
+		return Rs.post({
+			url: "/system/tenant/package",
+			data: data,
+			successAlert: false
+		})
+	}
+
+	// 修改租户套餐
+	update = (data: any) => {
+		return Rs.put({
+			url: "/system/tenant/package",
+			data: data,
+			successAlert: false
+		})
+	}
+
+	// 删除租户套餐
+	del = (packageId: string | string[]) => {
+		return Rs.del({
+			url: "/system/tenant/package/" + packageId
+		})
+	}
+	// 查询租户套餐下拉选列表
+	selectTenantPackage = () => {
+		return Rs.get({
+			url: "/system/tenant/package/selectList",
+			loading: false
+		})
+	}
+	// 租户套餐状态修改
+	changePackageStatus = (packageId: number | string, status: string) => {
+		return Rs.put({
+			url: "/system/tenant/package/changeStatus",
+			data: { packageId, status }
+		})
+	}
+}
+
+export default tenantPackageApi

+ 7 - 1
UI/VAP_V3.VUE/src/api/system/index.ts

@@ -12,6 +12,8 @@ import operLog from "./_operLog"
 import client from "./_client"
 import oss from "./_oss"
 import ossConfig from "./_ossConfig"
+import tenant from "./_tenant"
+import tenantPackage from "./_tenantPackage"
 
 export interface ISystemApi {
 	menuApi: Menu
@@ -28,6 +30,8 @@ export interface ISystemApi {
 	clientApi: client
 	ossApi: oss
 	ossConfigApi: ossConfig
+	tenantApi: tenant
+	tenantPackageApi: tenantPackage
 }
 
 export const apis: ISystemApi = {
@@ -43,8 +47,10 @@ export const apis: ISystemApi = {
 	loginLogApi: new LoginLog(),
 	operLogApi: new operLog(),
 	clientApi: new client(),
+	ossApi: new oss(),
 	ossConfigApi: new ossConfig(),
-	ossApi: new oss()
+	tenantApi: new tenant(),
+	tenantPackageApi: new tenantPackage()
 }
 
 export default apis

+ 1 - 0
UI/VAP_V3.VUE/src/core/types/User.ts

@@ -14,6 +14,7 @@ export interface User {
 	loginIp: string
 	loginDate: string
 	org: Org
+	role: Role
 	orgName: string
 	roles: string[]
 	permissions: string[]

+ 64 - 0
UI/VAP_V3.VUE/src/layouts/main/header/navbar/DynamicTenant.vue

@@ -0,0 +1,64 @@
+<script setup lang="ts">
+import apis from "@a"
+import router from "@r"
+import appStore from "@s"
+
+const tenantEnabled = ref(true)
+const tenantId = ref("")
+const tenantOptions = ref<any>([])
+const show = computed(() => {
+	return appStore.authStore.canChangeTenant()
+})
+
+const initTenant = async () => {
+	apis.loginApi.getTenantList().then((res: any) => {
+		tenantEnabled.value = res.data.tenantEnabled === undefined ? true : res.data.tenantEnabled
+		if (tenantEnabled.value) {
+			tenantOptions.value = res.data.voList
+		}
+	})
+}
+
+function onDynamicTenant() {
+	if (tenantId.value != null && tenantId.value !== "") {
+		apis.system.tenantApi.dynamicTenant(tenantId.value).then((res: any) => {
+			appStore.authStore.setDynamic(true)
+			appStore.tagViewStore.delAllViews()
+			router.push({ path: "/" })
+		})
+	}
+}
+function onDynamicClear() {
+	apis.system.tenantApi.dynamicClear().then((res: any) => {
+		appStore.authStore.setDynamic(false)
+		appStore.tagViewStore.delAllViews()
+		router.push({ path: "/" })
+	})
+}
+function init() {
+	initTenant()
+}
+
+onMounted(init)
+</script>
+<template>
+	<div class="app-navbar-item ms-1 ms-md-3" v-if="show">
+		<el-select
+			v-model="tenantId"
+			clearable
+			filterable
+			reserve-keyword
+			placeholder="请选择租户"
+			@change="onDynamicTenant"
+			@clear="onDynamicClear">
+			<el-option
+				v-for="item in tenantOptions"
+				:key="item.tenantId"
+				:label="item.companyName"
+				:value="item.tenantId"></el-option>
+			<template #prefix>
+				<svg-icon icon-class="company" class="el-input__icon input-icon" />
+			</template>
+		</el-select>
+	</div>
+</template>

+ 2 - 0
UI/VAP_V3.VUE/src/layouts/main/header/navbar/Index.vue

@@ -1,4 +1,5 @@
 <script lang="ts" setup>
+import DynamicTenant from "@/layouts/main/header/navbar/DynamicTenant.vue"
 import NotificationMenu from "@/layouts/main/header/navbar/NotificationsMenu.vue"
 import UserMenu from "@/layouts/main/header/navbar/UserAccountMenu.vue"
 import ThemeModeSwitcher from "@/layouts/main/header/navbar/ThemeModeSwitcher.vue"
@@ -7,6 +8,7 @@ const isDev = import.meta.env.DEV
 
 <template>
 	<div class="app-navbar flex-shrink-0">
+		<DynamicTenant />
 		<NotificationMenu />
 		<ThemeModeSwitcher />
 		<div v-if="isDev" class="app-navbar-item ms-1 ms-md-3">

+ 4 - 1
UI/VAP_V3.VUE/src/layouts/main/header/navbar/UserAccountMenu.vue

@@ -3,6 +3,9 @@ import appStore from "@/stores"
 import apis from "@a"
 const router = useRouter()
 const user = appStore.authStore.user
+const dynamic = computed(() => {
+	return appStore.authStore.isDynamic()
+})
 function clearCache() {
 	appStore.dictStore.cleanDict().then(() => {
 		message.msgSuccess("清除成功")
@@ -59,7 +62,7 @@ function signOut() {
 
 			<div class="separator my-2"></div>
 
-			<div class="menu-item px-5">
+			<div class="menu-item px-5" v-if="!dynamic">
 				<router-link to="/profile" class="menu-link px-5">
 					<VbIcon icon-name="user" icon-type="duotone" class="me-2 fs-3"></VbIcon>
 					个人中心

+ 19 - 1
UI/VAP_V3.VUE/src/stores/_auth.ts

@@ -27,6 +27,7 @@ export const useAuthStore = defineStore("auth", () => {
 		user.value.orgName = u.org?.orgName
 		user.value.remark = u.remark
 		user.value.org = u.org
+		user.value.role = u.roles ? u.roles[0] : []
 		changeAvatar(u.avatar)
 
 		user.value.permissions = data.permissions || []
@@ -120,6 +121,20 @@ export const useAuthStore = defineStore("auth", () => {
 		return localCache.get("tenantId") || "000000"
 	}
 
+	function canChangeTenant() {
+		return (
+			user.value.roles.includes("super_admin") || user.value.permissions.includes("system:tenant")
+		)
+	}
+
+	const dynamic = ref(false)
+	function setDynamic(isDynamic: boolean) {
+		dynamic.value = isDynamic
+	}
+	function isDynamic() {
+		return dynamic.value
+	}
+
 	return {
 		errors,
 		user,
@@ -131,6 +146,9 @@ export const useAuthStore = defineStore("auth", () => {
 		getInfo,
 		changeAvatar,
 		setTenantId,
-		getTenantId
+		getTenantId,
+		canChangeTenant,
+		setDynamic,
+		isDynamic
 	}
 })

+ 10 - 9
UI/VAP_V3.VUE/src/views/account/login.vue

@@ -9,7 +9,7 @@ const userStore = appStore.authStore
 const router = useRouter()
 const loginRef = ref<HTMLFormElement>()
 const title = ref(import.meta.env.VITE_APP_TITLE || "后台管理系统")
-const tenantList = ref<TenantVO[]>([])
+const tenantOptions = ref<TenantVO[]>([])
 const loginForm = ref<LoginData>({
 	tenantId: "000000",
 	username: "admin",
@@ -119,13 +119,14 @@ function getCookie() {
 		console.log("GET_COOKIE", e)
 	}
 }
-const initTenantList = async () => {
-	apis.loginApi.getTenantList().then(({ data }) => {
-		tenantEnabled.value = data.tenantEnabled === undefined ? true : data.tenantEnabled
+
+const initTenant = async () => {
+	apis.loginApi.getTenantList().then((res: any) => {
+		tenantEnabled.value = res.data.tenantEnabled === undefined ? true : res.data.tenantEnabled
 		if (tenantEnabled.value) {
-			tenantList.value = data.voList
-			if (tenantList.value != null && tenantList.value.length !== 0) {
-				loginForm.value.tenantId = tenantList.value[0].tenantId
+			tenantOptions.value = res.data.voList
+			if (tenantOptions.value != null && tenantOptions.value.length !== 0) {
+				loginForm.value.tenantId = tenantOptions.value[0].tenantId
 			}
 		}
 	})
@@ -133,7 +134,7 @@ const initTenantList = async () => {
 function init() {
 	getCode()
 	getCookie()
-	initTenantList()
+	initTenant()
 }
 
 onMounted(init)
@@ -158,7 +159,7 @@ watch(
 					placeholder="请选择/输入公司名称"
 					style="width: 100%">
 					<el-option
-						v-for="item in tenantList"
+						v-for="item in tenantOptions"
 						:key="item.tenantId"
 						:label="item.companyName"
 						:value="item.tenantId"></el-option>

+ 1 - 1
UI/VAP_V3.VUE/src/views/system/role/index.vue

@@ -314,7 +314,7 @@ function handleDelete(rows: any[]) {
 function submitForm() {
 	form.value.menuIds = getMenuAllCheckedKeys()
 	delete form.value.permissions
-	console.log("---", form.value)
+	//console.log("---", form.value)
 	if (form.value.roleId != null) {
 		apis.system.roleApi.updateRole(form.value).then(() => {
 			message.msgSuccess("修改成功")

+ 409 - 0
UI/VAP_V3.VUE/src/views/system/tenant/index.vue

@@ -0,0 +1,409 @@
+<script setup lang="ts" name="Tenant">
+import apis from "@a"
+import dayjs from "dayjs"
+
+const packageOptions = ref<any>([])
+
+const tableRef = ref()
+const modalRef = ref()
+const opts = reactive({
+	columns: [
+		{ field: "id", name: "id", width: 100, isSort: true, visible: false },
+		{ field: "companyName", name: "租户名称", isSort: true, width: 220, tooltip: true },
+		{ field: "address", name: "地址", visible: true, isSort: false, width: "auto", tooltip: true },
+		{ field: "domain", name: "域名", visible: true, isSort: false, width: 200 },
+		{ field: "expireTime", name: "过期时间", visible: true, isSort: true, width: 185 },
+		{ field: "accountCount", name: "用户数量", visible: true, isSort: true, width: 100 },
+		{
+			field: "packageName",
+			name: "租户套餐",
+			visible: true,
+			isSort: false,
+			width: 180,
+			tooltip: true
+		},
+		{ field: "status", name: "租户状态", visible: true, isSort: false, width: 100 },
+		{ field: "actions", name: `操作`, width: 150 }
+	],
+	queryParams: {
+		companyName: undefined,
+		licenseNumber: undefined,
+		address: undefined,
+		dateRangeExpireTime: undefined
+	},
+	searchFormItems: [
+		{
+			field: "companyName",
+			label: "租户名称",
+			class: "w-100",
+			required: false,
+			placeholder: "请输入租户名称",
+			component: "I",
+			listeners: {
+				keyup: (e: KeyboardEvent) => {
+					if (e.code == "Enter") {
+						handleQuery()
+					}
+				}
+			}
+		},
+
+		{
+			field: "address",
+			label: "地址",
+			class: "w-100",
+			required: false,
+			placeholder: "请输入地址",
+			component: "I",
+			listeners: {
+				keyup: (e: KeyboardEvent) => {
+					if (e.code == "Enter") {
+						handleQuery()
+					}
+				}
+			}
+		},
+		{
+			field: "dateRangeExpireTime",
+			label: "过期时间",
+			class: "w-100",
+			required: false,
+			component: "D",
+			placeholder: "请选择过期时间",
+			props: {
+				type: "daterange",
+				valueFormat: "YYYY-MM-DD",
+				rangeSeparator: "-",
+				startPlaceholder: "开始日期",
+				endPlaceholder: "结束日期"
+			},
+			listeners: {
+				change: (v: any) => {
+					queryParams.value.dateRangeExpireTime = v
+				}
+			},
+			span: 6
+		}
+	] as any,
+	permission: "system:tenant",
+	handleBtns: [],
+	handleFuns: {
+		handleCreate,
+		handleUpdate: () => {
+			const row = tableRef.value.getSelected()
+			handleUpdate(row)
+		},
+		handleDelete: () => {
+			const rows = tableRef.value.getSelecteds()
+			handleDelete(rows)
+		}
+	},
+	customBtns: [],
+	tableListFun: apis.system.tenantApi.list,
+	getEntityFun: apis.system.tenantApi.get,
+	deleteEntityFun: apis.system.tenantApi.del,
+	exportUrl: apis.system.tenantApi.exportUrl,
+	exportName: "Tenant",
+	modalTitle: "租户",
+	formItems: [
+		{
+			field: "companyName",
+			label: "租户名称",
+			class: "w-100",
+			required: true,
+			placeholder: "请输入租户名称",
+			component: "I",
+			span: 12
+		},
+		{
+			field: "licenseNumber",
+			label: "社会信用代码",
+			class: "w-100",
+			required: false,
+			placeholder: "请输入统一社会信用代码",
+			component: "I",
+			span: 12
+		},
+		{
+			show: () => type.value == "C",
+			field: "username",
+			label: "用户名",
+			class: "w-100",
+			required: true,
+			placeholder: "请输入用户名",
+			component: "I",
+			span: 12
+		},
+		{
+			show: () => type.value == "C",
+			field: "password",
+			label: "密码",
+			class: "w-100",
+			required: true,
+			placeholder: "请输入密码",
+			component: "I",
+			type: "password",
+			span: 12
+		},
+		{
+			field: "contactUserName",
+			label: "联系人",
+			class: "w-100",
+			required: true,
+			placeholder: "请输入联系人",
+			component: "I",
+			span: 12
+		},
+		{
+			field: "contactPhone",
+			label: "联系电话",
+			class: "w-100",
+			required: true,
+			placeholder: "请输入联系电话",
+			component: "I",
+			span: 12
+		},
+
+		{
+			field: "address",
+			label: "地址",
+			class: "w-100",
+			required: false,
+			placeholder: "请输入地址",
+			component: "I",
+			span: 24
+		},
+
+		{
+			field: "intro",
+			label: "租户简介",
+			class: "w-100",
+			required: false,
+			placeholder: "请输入租户简介",
+			component: "I",
+			props: {
+				type: "textarea",
+				rows: 5
+			}
+		},
+
+		{
+			field: "packageId",
+			label: "租户套餐",
+			class: "w-100",
+			required: false,
+			placeholder: "请选择租户套餐编号",
+			component: "vs",
+			data: () => packageOptions.value,
+			props: {
+				props: {
+					value: "packageId",
+					label: "packageName"
+				}
+			},
+			span: 12
+		},
+		{
+			field: "expireTime",
+			label: "过期时间",
+			class: "w-100",
+			component: "D",
+			props: {
+				placeholder: "请选择过期时间",
+				type: "date",
+				valueFormat: "YYYY-MM-DD"
+			},
+			span: 12
+		},
+		{
+			field: "accountCount",
+			label: "用户数量",
+			class: "w-100",
+			required: true,
+			placeholder: "请输入用户数量(-1代表无限制)",
+			component: "I",
+			span: 12
+		},
+		{
+			field: "domain",
+			label: "域名",
+			class: "w-100",
+			required: false,
+			placeholder: "请输入域名",
+			component: "I",
+			span: 12
+		},
+		{
+			field: "remark",
+			label: "备注",
+			class: "w-100",
+			required: false,
+			placeholder: "请输入备注",
+			component: "I",
+			props: {
+				type: "textarea",
+				rows: 5
+			}
+		}
+	] as any,
+	resetForm: () => {
+		getPackages()
+		form.value = emptyFormData.value
+	},
+	labelWidth: "80px",
+	emptyFormData: {
+		id: undefined,
+		contactUserName: undefined,
+		contactPhone: undefined,
+		companyName: undefined,
+		licenseNumber: undefined,
+		address: undefined,
+		intro: undefined,
+		domain: undefined,
+		remark: undefined,
+		packageId: undefined,
+		expireTime: undefined,
+		accountCount: undefined,
+		status: undefined
+	}
+})
+const { queryParams, emptyFormData } = toRefs(opts)
+const form = ref<any>(emptyFormData.value)
+
+/** 搜索按钮操作 */
+function handleQuery(query?: any) {
+	query = query || tableRef.value?.getQueryParams() || queryParams.value
+	addDateRange(query, query.dateRangeExpireTime, "ExpireTime")
+	addDateRange(query, query.dateRangeCreateTime)
+	addDateRange(query, query.dateRangeUpdateTime, "UpdateTime")
+	tableRef.value?.query(query)
+}
+
+/** 重置按钮操作 */
+function resetQuery(query?: any) {
+	query = query || tableRef.value?.getQueryParams() || queryParams.value
+	query.dateRangeExpireTime = [] as any
+	addDateRange(query, query.dateRangeExpireTime, "ExpireTime")
+	query.dateRangeCreateTime = [] as any
+	addDateRange(query, query.dateRangeCreateTime)
+	query.dateRangeUpdateTime = [] as any
+	addDateRange(query, query.dateRangeUpdateTime, "UpdateTime")
+	//
+}
+const type = ref("C")
+function handleCreate() {
+	type.value = "C"
+	opts.resetForm()
+	form.value.username = ""
+	form.value.password = ""
+	modalRef.value?.show()
+}
+
+/** 修改按钮操作 */
+function handleUpdate(row: any) {
+	type.value = "U"
+	tableRef.value.defaultHandleFuns.handleUpdate("", row)
+}
+
+/** 删除按钮操作 */
+function handleDelete(rows: any[]) {
+	tableRef.value.defaultHandleFuns.handleDelete("", rows)
+}
+
+/** 状态修改  */
+function handleStatusChange(row: any) {
+	const text = row.status === "0" ? "启用" : "停用"
+	message
+		.confirm('确认要"' + text + '""' + row.companyName + '"租户吗?')
+		.then(function () {
+			return apis.system.tenantApi.changeStatus(row.tenantId, row.status)
+		})
+		.then(() => {
+			message.msgSuccess(text + "成功")
+			handleQuery()
+		})
+		.catch(function () {
+			row.status = row.status === "0" ? "1" : "0"
+		})
+}
+/** 提交按钮 */
+function submitForm() {
+	apis.system.tenantApi.addOrUpdate(form.value).then(() => {
+		handleQuery()
+	})
+}
+
+function getPackages() {
+	apis.system.tenantPackageApi.selectTenantPackage().then((res: any) => {
+		packageOptions.value = res.data
+	})
+}
+</script>
+<template>
+	<div class="app-container">
+		<VbDataTable
+			ref="tableRef"
+			keyField="id"
+			:columns="opts.columns"
+			:handle-perm="opts.permission"
+			:handle-btns="opts.handleBtns"
+			:handle-funs="opts.handleFuns"
+			:search-form-items="opts.searchFormItems"
+			:custom-btns="opts.customBtns"
+			:remote-fun="opts.tableListFun"
+			:get-entity-fun="opts.getEntityFun"
+			:delete-entity-fun="opts.deleteEntityFun"
+			:export-url="opts.exportUrl"
+			:export-name="opts.exportName"
+			:modal="modalRef"
+			:reset-form-fun="opts.resetForm"
+			v-model:form-data="form"
+			v-model:query-params="queryParams"
+			:check-multiple="true"
+			:reset-search-form-fun="resetQuery"
+			:custom-search-fun="handleQuery">
+			<template #expireTime="{ row }">
+				{{ row.expireTime ? dayjs(row.expireTime).format("YYYY-MM-DD") : "永久" }}
+			</template>
+			<template #status="{ row }">
+				<el-switch
+					v-model="row.status"
+					active-value="0"
+					inactive-value="1"
+					@change="handleStatusChange(row)"></el-switch>
+			</template>
+			<template #actions="{ row }">
+				<vb-tooltip content="修改" placement="top">
+					<el-button
+						link
+						type="primary"
+						@click="handleUpdate(row)"
+						v-hasPermission="'system:tenant:edit'">
+						<template #icon>
+							<VbIcon icon-name="notepad-edit" icon-type="duotone" class="fs-3"></VbIcon>
+						</template>
+					</el-button>
+				</vb-tooltip>
+				<vb-tooltip content="删除" placement="top">
+					<el-button
+						link
+						type="primary"
+						@click="handleDelete([row])"
+						v-hasPermission="'system:tenant:remove'">
+						<template #icon>
+							<VbIcon icon-name="trash-square" icon-type="duotone" class="fs-3"></VbIcon>
+						</template>
+					</el-button>
+				</vb-tooltip>
+			</template>
+		</VbDataTable>
+		<VbModal
+			v-model:modal="modalRef"
+			:title="opts.modalTitle"
+			:form-data="form"
+			:form-items="opts.formItems"
+			:label-width="opts.labelWidth"
+			append-to-body
+			@confirm="submitForm"></VbModal>
+	</div>
+</template>

+ 337 - 0
UI/VAP_V3.VUE/src/views/system/tenantPackage/index.vue

@@ -0,0 +1,337 @@
+<script setup lang="ts" name="TenantPackage">
+import apis from "@a"
+const menuCheckStrictlyOptions = computed(() => {
+	return [
+		{ label: "请选择", value: "" },
+		{ label: "", value: "" }
+	]
+})
+const menuExpand = ref(false)
+const menuNodeAll = ref(false)
+const menuOptions = ref([])
+
+const tableRef = ref()
+const modalRef = ref()
+const menuRef = ref()
+const opts = reactive({
+	columns: [
+		{ field: "packageId", name: "租户套餐id", width: 100, isSort: true, visible: false },
+		{ field: "packageName", name: "套餐名称", visible: true, isSort: true, width: "auto" },
+		{ field: "status", name: "状态", visible: true, isSort: true, width: 100 },
+		{ field: "actions", name: `操作`, width: 150 }
+	],
+	queryParams: {
+		packageName: undefined,
+		status: undefined
+	},
+	searchFormItems: [
+		{
+			field: "packageName",
+			label: "套餐名称",
+			class: "w-100",
+			required: false,
+			placeholder: "请输入套餐名称",
+			component: "I",
+			listeners: {
+				keyup: (e: KeyboardEvent) => {
+					if (e.code == "Enter") {
+						handleQuery()
+					}
+				}
+			}
+		},
+		{
+			field: "status",
+			label: "状态",
+			class: "w-100",
+			required: false,
+			component: "Dict",
+			props: {
+				placeholder: "请选择状态",
+				dictType: "sys_normal_disable",
+				valueIsNumber: false,
+				type: "select"
+			}
+		}
+	] as any,
+	permission: "system:tenantPackage",
+	handleBtns: [],
+	handleFuns: {
+		handleCreate,
+		handleUpdate: () => {
+			const row = tableRef.value.getSelected()
+			handleUpdate(row)
+		},
+		handleDelete: () => {
+			const rows = tableRef.value.getSelecteds()
+			handleDelete(rows)
+		}
+	},
+	customBtns: [],
+	tableListFun: apis.system.tenantPackageApi.list,
+	getEntityFun: apis.system.tenantPackageApi.get,
+	deleteEntityFun: apis.system.tenantPackageApi.del,
+	exportUrl: apis.system.tenantPackageApi.exportUrl,
+	exportName: "TenantPackage",
+	modalTitle: "租户套餐",
+	formItems: [
+		{
+			field: "packageName",
+			label: "套餐名称",
+			class: "w-100",
+			required: true,
+			placeholder: "请输入套餐名称",
+			component: "I"
+		},
+		{
+			field: "menuIds",
+			label: "关联菜单",
+			class: "w-100",
+			placeholder: "请选择关联菜单",
+			component: "slot"
+		},
+		{
+			field: "remark",
+			label: "备注",
+			class: "w-100",
+			required: false,
+			placeholder: "请输入备注",
+			component: "I",
+			props: {
+				type: "textarea",
+				rows: 5
+			}
+		}
+	] as any,
+	resetForm: () => {
+		form.value = emptyFormData.value
+	},
+	labelWidth: "80px",
+	emptyFormData: {
+		packageId: undefined,
+		packageName: undefined,
+		menuIds: [],
+		remark: undefined,
+		menuCheckStrictly: true,
+		status: "0"
+	}
+})
+const { queryParams, emptyFormData } = toRefs(opts)
+const form = ref<any>(emptyFormData.value)
+
+/** 搜索按钮操作 */
+function handleQuery(query?: any) {
+	query = query || tableRef.value?.getQueryParams() || queryParams.value
+	addDateRange(query, query.dateRangeCreateTime)
+	addDateRange(query, query.dateRangeUpdateTime, "UpdateTime")
+	tableRef.value?.query(query)
+}
+
+/** 重置按钮操作 */
+function resetQuery(query?: any) {
+	query = query || tableRef.value?.getQueryParams() || queryParams.value
+	query.dateRangeCreateTime = [] as any
+	addDateRange(query, query.dateRangeCreateTime)
+	query.dateRangeUpdateTime = [] as any
+	addDateRange(query, query.dateRangeUpdateTime, "UpdateTime")
+	//
+}
+
+/** 添加按钮操 */
+function handleCreate() {
+	opts.resetForm()
+	getMenuTreeSelect()
+	modalRef.value.changePrefixTitle("添加")
+	modalRef.value.show()
+}
+
+/** 修改按钮操作 */
+function handleUpdate(row: any) {
+	const packageId = row.packageId
+	const packageMenu = getPackageMenuTreeSelect(packageId)
+	apis.system.tenantPackageApi.get(packageId).then(({ data }) => {
+		form.value = data
+		nextTick(() => {
+			packageMenu.then((res) => {
+				const checkedKeys = res.checkedKeys
+				checkedKeys.forEach((v: any) => {
+					nextTick(() => {
+						menuRef.value.setChecked(v, true, false)
+					})
+				})
+			})
+		})
+		modalRef.value.changePrefixTitle("修改")
+		modalRef.value.show()
+	})
+}
+
+/** 删除按钮操作 */
+function handleDelete(rows: any[]) {
+	tableRef.value.defaultHandleFuns.handleDelete("", rows)
+}
+
+/** 状态修改  */
+function handleStatusChange(row: any) {
+	const text = row.status === "0" ? "启用" : "停用"
+	message
+		.confirm('确认要"' + text + '""' + row.packageName + '"套餐吗?')
+		.then(function () {
+			return apis.system.tenantPackageApi.changePackageStatus(row.packageId, row.status)
+		})
+		.then(() => {
+			message.msgSuccess(text + "成功")
+			handleQuery()
+		})
+		.catch(function () {
+			row.status = row.status === "0" ? "1" : "0"
+		})
+}
+
+/** 提交按钮 */
+function submitForm() {
+	form.value.menuIds = getMenuAllCheckedKeys()
+	apis.system.tenantPackageApi.addOrUpdate(form.value).then(() => {
+		handleQuery()
+	})
+}
+
+/** 查询菜单树结构 */
+function getMenuTreeSelect() {
+	apis.system.menuApi.treeSelect().then(({ data }) => {
+		menuOptions.value = data
+	})
+}
+/** 根据PackageID查询菜单树结构 */
+function getPackageMenuTreeSelect(packageId: string) {
+	return apis.system.menuApi.tenantPackageMenuTreeSelect(packageId).then(({ data }) => {
+		menuOptions.value = data.menus
+		return data
+	})
+}
+
+/** 树权限(展开/折叠)*/
+function handleCheckedTreeExpand(value: any, type: string) {
+	const treeList: any = menuOptions.value
+	for (let i = 0; i < treeList.length; i++) {
+		menuRef.value.store.nodesMap[treeList[i].id].expanded = value
+	}
+}
+/** 树权限(全选/全不选) */
+function handleCheckedTreeNodeAll(value: any, type: string) {
+	menuRef.value.setCheckedNodes(value ? menuOptions.value : [])
+}
+/** 树权限(父子联动) */
+function handleCheckedTreeConnect(value: any, type: string) {
+	form.value.menuCheckStrictly = !!value
+}
+/** 所有菜单节点数据 */
+function getMenuAllCheckedKeys() {
+	// 目前被选中的菜单节点
+	const checkedKeys: any = menuRef.value.getCheckedKeys()
+	// 半选中的菜单节点
+	const halfCheckedKeys = menuRef.value.getHalfCheckedKeys()
+	checkedKeys.unshift(...halfCheckedKeys)
+	return checkedKeys
+}
+</script>
+<template>
+	<div class="app-container">
+		<VbDataTable
+			ref="tableRef"
+			keyField="packageId"
+			:columns="opts.columns"
+			:handle-perm="opts.permission"
+			:handle-btns="opts.handleBtns"
+			:handle-funs="opts.handleFuns"
+			:search-form-items="opts.searchFormItems"
+			:custom-btns="opts.customBtns"
+			:remote-fun="opts.tableListFun"
+			:get-entity-fun="opts.getEntityFun"
+			:delete-entity-fun="opts.deleteEntityFun"
+			:export-url="opts.exportUrl"
+			:export-name="opts.exportName"
+			:modal="modalRef"
+			:reset-form-fun="opts.resetForm"
+			v-model:form-data="form"
+			v-model:query-params="queryParams"
+			:check-multiple="true"
+			:reset-search-form-fun="resetQuery"
+			:custom-search-fun="handleQuery">
+			<template #menuCheckStrictly="{ row }">
+				<VbTag
+					:data="menuCheckStrictlyOptions"
+					:value-is-number="true"
+					:value="row.menuCheckStrictly"></VbTag>
+			</template>
+			<template #status="{ row }">
+				<el-switch
+					v-model="row.status"
+					active-value="0"
+					inactive-value="1"
+					@change="handleStatusChange(row)"></el-switch>
+			</template>
+			<template #actions="{ row }">
+				<vb-tooltip content="修改" placement="top">
+					<el-button
+						link
+						type="primary"
+						@click="handleUpdate(row)"
+						v-hasPermission="'system:tenantPackage:edit'">
+						<template #icon>
+							<VbIcon icon-name="notepad-edit" icon-type="duotone" class="fs-3"></VbIcon>
+						</template>
+					</el-button>
+				</vb-tooltip>
+				<vb-tooltip content="删除" placement="top">
+					<el-button
+						link
+						type="primary"
+						@click="handleDelete([row])"
+						v-hasPermission="'system:tenantPackage:remove'">
+						<template #icon>
+							<VbIcon icon-name="trash-square" icon-type="duotone" class="fs-3"></VbIcon>
+						</template>
+					</el-button>
+				</vb-tooltip>
+			</template>
+		</VbDataTable>
+		<VbModal
+			v-model:modal="modalRef"
+			:title="opts.modalTitle"
+			:form-data="form"
+			:form-items="opts.formItems"
+			:label-width="opts.labelWidth"
+			append-to-body
+			@confirm="submitForm">
+			<template #menuIds_form>
+				<el-checkbox v-model="menuExpand" @change="handleCheckedTreeExpand($event, 'menu')">
+					展开/折叠
+				</el-checkbox>
+				<el-checkbox v-model="menuNodeAll" @change="handleCheckedTreeNodeAll($event, 'menu')">
+					全选/全不选
+				</el-checkbox>
+				<el-checkbox
+					v-model="form.menuCheckStrictly"
+					@change="handleCheckedTreeConnect($event, 'menu')">
+					父子联动
+				</el-checkbox>
+				<el-tree
+					:data="menuOptions"
+					show-checkbox
+					ref="menuRef"
+					node-key="id"
+					:check-strictly="!form.menuCheckStrictly"
+					empty-text="加载中,请稍候"
+					:props="{ label: 'label', children: 'children' }"
+					style="
+						margin-top: 5px;
+						border: 1px solid #e5e6e7;
+						background: #ffffff none;
+						border-radius: 4px;
+						width: 100%;
+					"></el-tree>
+			</template>
+		</VbModal>
+	</div>
+</template>