Ver Fonte

Add 完成代码生成模块

YueYunyun há 2 anos atrás
pai
commit
5739bdf14c
74 ficheiros alterados com 3955 adições e 2758 exclusões
  1. 401 402
      SERVER/VberAdminPlusV3/.flattened-pom.xml
  2. 8 7
      SERVER/VberAdminPlusV3/.script/sql/admin.sql
  3. 0 100
      SERVER/VberAdminPlusV3/vber-admin/.flattened-pom.xml
  4. 1 1
      SERVER/VberAdminPlusV3/vber-admin/src/main/resources/application.yml
  5. 35 36
      SERVER/VberAdminPlusV3/vber-common/.flattened-pom.xml
  6. 77 78
      SERVER/VberAdminPlusV3/vber-common/vber-common-core/.flattened-pom.xml
  7. 29 30
      SERVER/VberAdminPlusV3/vber-common/vber-common-doc/.flattened-pom.xml
  8. 0 38
      SERVER/VberAdminPlusV3/vber-common/vber-common-encrypt/.flattened-pom.xml
  9. 21 22
      SERVER/VberAdminPlusV3/vber-common/vber-common-excel/.flattened-pom.xml
  10. 25 26
      SERVER/VberAdminPlusV3/vber-common/vber-common-idempotent/.flattened-pom.xml
  11. 39 40
      SERVER/VberAdminPlusV3/vber-common/vber-common-job/.flattened-pom.xml
  12. 21 22
      SERVER/VberAdminPlusV3/vber-common/vber-common-log/.flattened-pom.xml
  13. 25 26
      SERVER/VberAdminPlusV3/vber-common/vber-common-mail/.flattened-pom.xml
  14. 47 48
      SERVER/VberAdminPlusV3/vber-common/vber-common-mybatis/.flattened-pom.xml
  15. 25 26
      SERVER/VberAdminPlusV3/vber-common/vber-common-oss/.flattened-pom.xml
  16. 5 1
      SERVER/VberAdminPlusV3/vber-common/vber-common-oss/pom.xml
  17. 0 26
      SERVER/VberAdminPlusV3/vber-common/vber-common-ratelimiter/.flattened-pom.xml
  18. 25 26
      SERVER/VberAdminPlusV3/vber-common/vber-common-redis/.flattened-pom.xml
  19. 29 30
      SERVER/VberAdminPlusV3/vber-common/vber-common-satoken/.flattened-pom.xml
  20. 17 18
      SERVER/VberAdminPlusV3/vber-common/vber-common-security/.flattened-pom.xml
  21. 23 24
      SERVER/VberAdminPlusV3/vber-common/vber-common-sms/.flattened-pom.xml
  22. 25 26
      SERVER/VberAdminPlusV3/vber-common/vber-common-social/.flattened-pom.xml
  23. 25 26
      SERVER/VberAdminPlusV3/vber-common/vber-common-tenant/.flattened-pom.xml
  24. 0 21
      SERVER/VberAdminPlusV3/vber-common/vber-common-translation/.flattened-pom.xml
  25. 51 52
      SERVER/VberAdminPlusV3/vber-common/vber-common-web/.flattened-pom.xml
  26. 29 30
      SERVER/VberAdminPlusV3/vber-common/vber-common-websocket/.flattened-pom.xml
  27. 0 21
      SERVER/VberAdminPlusV3/vber-extend/.flattened-pom.xml
  28. 0 56
      SERVER/VberAdminPlusV3/vber-extend/vber-monitor-admin/.flattened-pom.xml
  29. 1 1
      SERVER/VberAdminPlusV3/vber-extend/vber-monitor-admin/Dockerfile
  30. 0 64
      SERVER/VberAdminPlusV3/vber-extend/vber-powerjob-server/.flattened-pom.xml
  31. 1 1
      SERVER/VberAdminPlusV3/vber-extend/vber-powerjob-server/Dockerfile
  32. 0 22
      SERVER/VberAdminPlusV3/vber-modules/.flattened-pom.xml
  33. 0 42
      SERVER/VberAdminPlusV3/vber-modules/vber-generator/.flattened-pom.xml
  34. 12 0
      SERVER/VberAdminPlusV3/vber-modules/vber-generator/src/main/java/com/vber/generator/config/GenConfig.java
  35. 1 0
      SERVER/VberAdminPlusV3/vber-modules/vber-generator/src/main/java/com/vber/generator/constant/GenConstants.java
  36. 16 3
      SERVER/VberAdminPlusV3/vber-modules/vber-generator/src/main/java/com/vber/generator/controller/GenController.java
  37. 102 0
      SERVER/VberAdminPlusV3/vber-modules/vber-generator/src/main/java/com/vber/generator/domain/GenMenu.java
  38. 2 12
      SERVER/VberAdminPlusV3/vber-modules/vber-generator/src/main/java/com/vber/generator/domain/GenTable.java
  39. 23 1
      SERVER/VberAdminPlusV3/vber-modules/vber-generator/src/main/java/com/vber/generator/domain/GenTableColumn.java
  40. 15 0
      SERVER/VberAdminPlusV3/vber-modules/vber-generator/src/main/java/com/vber/generator/mapper/GenMenuMapper.java
  41. 2 0
      SERVER/VberAdminPlusV3/vber-modules/vber-generator/src/main/java/com/vber/generator/mapper/GenTableColumnMapper.java
  42. 2 0
      SERVER/VberAdminPlusV3/vber-modules/vber-generator/src/main/java/com/vber/generator/mapper/GenTableMapper.java
  43. 167 37
      SERVER/VberAdminPlusV3/vber-modules/vber-generator/src/main/java/com/vber/generator/service/GenTableServiceImpl.java
  44. 12 4
      SERVER/VberAdminPlusV3/vber-modules/vber-generator/src/main/java/com/vber/generator/service/IGenTableService.java
  45. 3 0
      SERVER/VberAdminPlusV3/vber-modules/vber-generator/src/main/java/com/vber/generator/util/GenUtils.java
  46. 48 44
      SERVER/VberAdminPlusV3/vber-modules/vber-generator/src/main/java/com/vber/generator/util/VelocityUtils.java
  47. 2 1
      SERVER/VberAdminPlusV3/vber-modules/vber-generator/src/main/resources/generator.yml
  48. 8 0
      SERVER/VberAdminPlusV3/vber-modules/vber-generator/src/main/resources/mapper/generator/GenMenuMapper.xml
  49. 1 0
      SERVER/VberAdminPlusV3/vber-modules/vber-generator/src/main/resources/mapper/generator/GenTableMapper.xml
  50. 12 0
      SERVER/VberAdminPlusV3/vber-modules/vber-generator/src/main/resources/vm/java/bo.java.vm
  51. 2 4
      SERVER/VberAdminPlusV3/vber-modules/vber-generator/src/main/resources/vm/java/controller.java.vm
  52. 1 0
      SERVER/VberAdminPlusV3/vber-modules/vber-generator/src/main/resources/vm/java/mapper.java.vm
  53. 68 63
      SERVER/VberAdminPlusV3/vber-modules/vber-generator/src/main/resources/vm/ts/api.ts.vm
  54. 0 539
      SERVER/VberAdminPlusV3/vber-modules/vber-generator/src/main/resources/vm/vue/index-tree.vue.vm
  55. 0 520
      SERVER/VberAdminPlusV3/vber-modules/vber-generator/src/main/resources/vm/vue/index.vue.vm
  56. 552 0
      SERVER/VberAdminPlusV3/vber-modules/vber-generator/src/main/resources/vm/vue/view-tree.vue.vm
  57. 484 0
      SERVER/VberAdminPlusV3/vber-modules/vber-generator/src/main/resources/vm/vue/view.vue.vm
  58. 0 26
      SERVER/VberAdminPlusV3/vber-modules/vber-job/.flattened-pom.xml
  59. 0 78
      SERVER/VberAdminPlusV3/vber-modules/vber-system/.flattened-pom.xml
  60. 2 2
      SERVER/VberAdminPlusV3/vber-modules/vber-system/src/main/java/com/vber/system/service/impl/SysOssConfigServiceImpl.java
  61. 7 0
      SERVER/VberAdminPlusV3/vber-modules/vber-system/src/main/resources/mapper/system/TeDemoMapper.xml
  62. 7 0
      SERVER/VberAdminPlusV3/vber-modules/vber-system/src/main/resources/mapper/system/TestOssMapper.xml
  63. 4 1
      UI/VAP_V3.VUE/src/api/index.ts
  64. 11 2
      UI/VAP_V3.VUE/src/api/system/_dict.ts
  65. 91 0
      UI/VAP_V3.VUE/src/api/tool/_gen.ts
  66. 11 0
      UI/VAP_V3.VUE/src/api/tool/index.ts
  67. 0 1
      UI/VAP_V3.VUE/src/components/select/VbSelect.vue
  68. 42 31
      UI/VAP_V3.VUE/src/core/services/RequestService.ts
  69. 69 0
      UI/VAP_V3.VUE/src/views/tool/gen/_EditTable.vue
  70. 146 0
      UI/VAP_V3.VUE/src/views/tool/gen/_ImportTable.vue
  71. 308 0
      UI/VAP_V3.VUE/src/views/tool/gen/__BaseForm.vue
  72. 235 0
      UI/VAP_V3.VUE/src/views/tool/gen/__FieldTable.vue
  73. 166 0
      UI/VAP_V3.VUE/src/views/tool/gen/__GenForm.vue
  74. 336 0
      UI/VAP_V3.VUE/src/views/tool/gen/index.vue

+ 401 - 402
SERVER/VberAdminPlusV3/.flattened-pom.xml

@@ -1,404 +1,403 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<project xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
-         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">
-    <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 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>

+ 8 - 7
SERVER/VberAdminPlusV3/.script/sql/admin.sql

@@ -611,19 +611,19 @@ insert into sys_menu
 values ('1101', '生成查询', '141', '1', '#', '', '', 1, 0, 'F', '0', '0', 'tool:gen:query', 'eye', '', '', 100, 1,
         sysdate(), null, null, '');
 insert into sys_menu
-values ('1102', '生成修改', '141', '2', '#', '', '', 1, 0, 'F', '0', '0', 'tool:gen:edit', 'pencil-square',
+values ('1102', '导入代码', '141', '2', '#', '', '', 1, 0, 'F', '0', '0', 'tool:gen:import', 'cloud-upload',
+        'btn btn-light-primary', 'handleImport', 100, 1, sysdate(), null, null, '');
+insert into sys_menu
+values ('1103', '生成修改', '141', '3', '#', '', '', 1, 0, 'F', '0', '0', 'tool:gen:edit', 'pencil-square',
         'btn btn-light-success', 'handleUpdate@1', 100, 1, sysdate(), null, null, '');
 insert into sys_menu
-values ('1103', '生成删除', '141', '3', '#', '', '', 1, 0, 'F', '0', '0', 'tool:gen:remove', 'dash-square',
+values ('1104', '生成删除', '141', '4', '#', '', '', 1, 0, 'F', '0', '0', 'tool:gen:remove', 'dash-square',
         'btn btn-light-danger', 'handleDelete@0', 100, 1, sysdate(), null, null, '');
 insert into sys_menu
-values ('1104', '导入代码', '141', '2', '#', '', '', 1, 0, 'F', '0', '0', 'tool:gen:import', 'cloud-upload',
-        'btn btn-light-warning', 'handleImport', 100, 1, sysdate(), null, null, '');
-insert into sys_menu
-values ('1105', '预览代码', '141', '4', '#', '', '', 1, 0, 'F', '1', '0', 'tool:gen:preview', 'eye', '', '', 100, 1,
+values ('1105', '预览代码', '141', '5', '#', '', '', 1, 0, 'F', '1', '0', 'tool:gen:preview', 'eye', '', '', 100, 1,
         sysdate(), null, null, '');
 insert into sys_menu
-values ('1106', '生成代码', '141', '5', '#', '', '', 1, 0, 'F', '1', '0', 'tool:gen:code', 'code-slash', '', '', 100, 1,
+values ('1106', '生成代码', '141', '6', '#', '', '', 1, 0, 'F', '1', '0', 'tool:gen:code', 'code-slash', '', '', 100, 1,
         sysdate(), null, null, '');
 
 -- ----------------------------
@@ -1026,6 +1026,7 @@ create table gen_table_column
     is_edit        char(1) comment '是否编辑字段(1是)',
     is_list        char(1) comment '是否列表字段(1是)',
     is_query       char(1) comment '是否查询字段(1是)',
+    is_sort        char(1) comment '是否排序字段(1是)',
     query_type     varchar(200) default 'EQ' comment '查询方式(等于、不等于、大于、小于、范围)',
     html_type      varchar(200) comment '显示类型(文本框、文本域、下拉框、复选框、单选框、日期控件)',
     dict_type      varchar(200) default '' comment '字典类型',

+ 0 - 100
SERVER/VberAdminPlusV3/vber-admin/.flattened-pom.xml

@@ -1,100 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<project xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
-         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">
-    <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-admin</artifactId>
-    <version>3.0.0</version>
-    <name>${project.artifactId}</name>
-    <description>web服务入口</description>
-    <dependencies>
-        <dependency>
-            <groupId>com.mysql</groupId>
-            <artifactId>mysql-connector-j</artifactId>
-        </dependency>
-        <dependency>
-            <groupId>com.oracle.database.jdbc</groupId>
-            <artifactId>ojdbc8</artifactId>
-        </dependency>
-        <dependency>
-            <groupId>org.postgresql</groupId>
-            <artifactId>postgresql</artifactId>
-        </dependency>
-        <dependency>
-            <groupId>com.microsoft.sqlserver</groupId>
-            <artifactId>mssql-jdbc</artifactId>
-        </dependency>
-        <dependency>
-            <groupId>com.vap</groupId>
-            <artifactId>vber-common-doc</artifactId>
-        </dependency>
-        <dependency>
-            <groupId>com.vap</groupId>
-            <artifactId>vber-common-social</artifactId>
-        </dependency>
-        <dependency>
-            <groupId>com.vap</groupId>
-            <artifactId>vber-common-ratelimiter</artifactId>
-        </dependency>
-        <dependency>
-            <groupId>com.vap</groupId>
-            <artifactId>vber-system</artifactId>
-        </dependency>
-        <dependency>
-            <groupId>com.vap</groupId>
-            <artifactId>vber-job</artifactId>
-        </dependency>
-        <dependency>
-            <groupId>com.vap</groupId>
-            <artifactId>vber-generator</artifactId>
-        </dependency>
-        <dependency>
-            <groupId>de.codecentric</groupId>
-            <artifactId>spring-boot-admin-starter-client</artifactId>
-        </dependency>
-        <dependency>
-            <groupId>org.springframework.boot</groupId>
-            <artifactId>spring-boot-starter-test</artifactId>
-            <scope>test</scope>
-        </dependency>
-        <dependency>
-            <groupId>me.zhyd.oauth</groupId>
-            <artifactId>JustAuth</artifactId>
-        </dependency>
-    </dependencies>
-    <build>
-        <finalName>${project.artifactId}</finalName>
-        <plugins>
-            <plugin>
-                <groupId>org.springframework.boot</groupId>
-                <artifactId>spring-boot-maven-plugin</artifactId>
-                <version>${spring-boot.version}</version>
-                <executions>
-                    <execution>
-                        <goals>
-                            <goal>repackage</goal>
-                        </goals>
-                    </execution>
-                </executions>
-            </plugin>
-            <plugin>
-                <artifactId>maven-jar-plugin</artifactId>
-                <version>${maven-jar-plugin.version}</version>
-            </plugin>
-            <plugin>
-                <artifactId>maven-war-plugin</artifactId>
-                <version>${maven-war-plugin.version}</version>
-                <configuration>
-                    <failOnMissingWebXml>false</failOnMissingWebXml>
-                    <warName>${project.artifactId}</warName>
-                </configuration>
-            </plugin>
-        </plugins>
-    </build>
-</project>

+ 1 - 1
SERVER/VberAdminPlusV3/vber-admin/src/main/resources/application.yml

@@ -196,7 +196,7 @@ springdoc:
     version: '版本号: ${vber.version}'
     # 作者信息
     contact:
-      name: Lion Li
+      name: IwbY
       email: crazylionli@163.com
       url: https://gitee.com/dromara/VberAdminPlus
   components:

+ 35 - 36
SERVER/VberAdminPlusV3/vber-common/.flattened-pom.xml

@@ -1,40 +1,39 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<project xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
-         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">
-    <modelVersion>4.0.0</modelVersion>
-    <parent>
-        <groupId>com.vap</groupId>
-        <artifactId>VberAdminPlus</artifactId>
-        <version>3.0.0</version>
-    </parent>
+<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>
+    <artifactId>VberAdminPlus</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>
+  </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>

+ 77 - 78
SERVER/VberAdminPlusV3/vber-common/vber-common-core/.flattened-pom.xml

@@ -1,82 +1,81 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<project xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
-         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">
-    <modelVersion>4.0.0</modelVersion>
-    <parent>
-        <groupId>com.vap</groupId>
-        <artifactId>vber-common</artifactId>
-        <version>3.0.0</version>
-    </parent>
+<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-core</artifactId>
+    <artifactId>vber-common</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>
+  </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>

+ 29 - 30
SERVER/VberAdminPlusV3/vber-common/vber-common-doc/.flattened-pom.xml

@@ -1,34 +1,33 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<project xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
-         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">
-    <modelVersion>4.0.0</modelVersion>
-    <parent>
-        <groupId>com.vap</groupId>
-        <artifactId>vber-common</artifactId>
-        <version>3.0.0</version>
-    </parent>
+<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-doc</artifactId>
+    <artifactId>vber-common</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>
+  </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 - 38
SERVER/VberAdminPlusV3/vber-common/vber-common-encrypt/.flattened-pom.xml

@@ -1,38 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<project xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
-         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">
-    <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-encrypt</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.mybatis.spring.boot</groupId>
-            <artifactId>mybatis-spring-boot-starter</artifactId>
-        </dependency>
-        <dependency>
-            <groupId>org.bouncycastle</groupId>
-            <artifactId>bcprov-jdk15to18</artifactId>
-        </dependency>
-        <dependency>
-            <groupId>cn.hutool</groupId>
-            <artifactId>hutool-crypto</artifactId>
-        </dependency>
-        <dependency>
-            <groupId>org.springframework</groupId>
-            <artifactId>spring-webmvc</artifactId>
-        </dependency>
-    </dependencies>
-</project>

+ 21 - 22
SERVER/VberAdminPlusV3/vber-common/vber-common-excel/.flattened-pom.xml

@@ -1,26 +1,25 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<project xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
-         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">
-    <modelVersion>4.0.0</modelVersion>
-    <parent>
-        <groupId>com.vap</groupId>
-        <artifactId>vber-common</artifactId>
-        <version>3.0.0</version>
-    </parent>
+<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-excel</artifactId>
+    <artifactId>vber-common</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>
+  </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>

+ 25 - 26
SERVER/VberAdminPlusV3/vber-common/vber-common-idempotent/.flattened-pom.xml

@@ -1,30 +1,29 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<project xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
-         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">
-    <modelVersion>4.0.0</modelVersion>
-    <parent>
-        <groupId>com.vap</groupId>
-        <artifactId>vber-common</artifactId>
-        <version>3.0.0</version>
-    </parent>
+<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-idempotent</artifactId>
+    <artifactId>vber-common</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>
+  </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>

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

@@ -1,44 +1,43 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<project xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
-         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">
-    <modelVersion>4.0.0</modelVersion>
-    <parent>
-        <groupId>com.vap</groupId>
-        <artifactId>vber-common</artifactId>
-        <version>3.0.0</version>
-    </parent>
+<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-job</artifactId>
+    <artifactId>vber-common</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>
+  </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>

+ 21 - 22
SERVER/VberAdminPlusV3/vber-common/vber-common-log/.flattened-pom.xml

@@ -1,26 +1,25 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<project xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
-         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">
-    <modelVersion>4.0.0</modelVersion>
-    <parent>
-        <groupId>com.vap</groupId>
-        <artifactId>vber-common</artifactId>
-        <version>3.0.0</version>
-    </parent>
+<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-log</artifactId>
+    <artifactId>vber-common</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>
+  </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>

+ 25 - 26
SERVER/VberAdminPlusV3/vber-common/vber-common-mail/.flattened-pom.xml

@@ -1,30 +1,29 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<project xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
-         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">
-    <modelVersion>4.0.0</modelVersion>
-    <parent>
-        <groupId>com.vap</groupId>
-        <artifactId>vber-common</artifactId>
-        <version>3.0.0</version>
-    </parent>
+<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-mail</artifactId>
+    <artifactId>vber-common</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>
+  </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>

+ 47 - 48
SERVER/VberAdminPlusV3/vber-common/vber-common-mybatis/.flattened-pom.xml

@@ -1,52 +1,51 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<project xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
-         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">
-    <modelVersion>4.0.0</modelVersion>
-    <parent>
-        <groupId>com.vap</groupId>
-        <artifactId>vber-common</artifactId>
-        <version>3.0.0</version>
-    </parent>
+<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-mybatis</artifactId>
+    <artifactId>vber-common</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>
+  </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>

+ 25 - 26
SERVER/VberAdminPlusV3/vber-common/vber-common-oss/.flattened-pom.xml

@@ -1,30 +1,29 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<project xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
-         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">
-    <modelVersion>4.0.0</modelVersion>
-    <parent>
-        <groupId>com.vap</groupId>
-        <artifactId>vber-common</artifactId>
-        <version>3.0.0</version>
-    </parent>
+<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-oss</artifactId>
+    <artifactId>vber-common</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>
-    </dependencies>
+  </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>
+  </dependencies>
 </project>

+ 5 - 1
SERVER/VberAdminPlusV3/vber-common/vber-common-oss/pom.xml

@@ -28,7 +28,11 @@
             <groupId>com.amazonaws</groupId>
             <artifactId>aws-java-sdk-s3</artifactId>
         </dependency>
-    
+        <dependency>
+            <groupId>cn.hutool</groupId>
+            <artifactId>hutool-crypto</artifactId>
+        </dependency>
+
     </dependencies>
 
 </project>

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

@@ -1,26 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<project xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
-         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">
-    <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-ratelimiter</artifactId>
-    <version>3.0.0</version>
-    <name>${project.artifactId}</name>
-    <description>ratelimiter 限流模块</description>
-    <dependencies>
-        <dependency>
-            <groupId>com.vap</groupId>
-            <artifactId>vber-common-core</artifactId>
-        </dependency>
-        <dependency>
-            <groupId>com.vap</groupId>
-            <artifactId>vber-common-redis</artifactId>
-        </dependency>
-    </dependencies>
-</project>

+ 25 - 26
SERVER/VberAdminPlusV3/vber-common/vber-common-redis/.flattened-pom.xml

@@ -1,30 +1,29 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<project xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
-         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">
-    <modelVersion>4.0.0</modelVersion>
-    <parent>
-        <groupId>com.vap</groupId>
-        <artifactId>vber-common</artifactId>
-        <version>3.0.0</version>
-    </parent>
+<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-redis</artifactId>
+    <artifactId>vber-common</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>
+  </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>

+ 29 - 30
SERVER/VberAdminPlusV3/vber-common/vber-common-satoken/.flattened-pom.xml

@@ -1,34 +1,33 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<project xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
-         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">
-    <modelVersion>4.0.0</modelVersion>
-    <parent>
-        <groupId>com.vap</groupId>
-        <artifactId>vber-common</artifactId>
-        <version>3.0.0</version>
-    </parent>
+<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-satoken</artifactId>
+    <artifactId>vber-common</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>
+  </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>

+ 17 - 18
SERVER/VberAdminPlusV3/vber-common/vber-common-security/.flattened-pom.xml

@@ -1,22 +1,21 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<project xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
-         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">
-    <modelVersion>4.0.0</modelVersion>
-    <parent>
-        <groupId>com.vap</groupId>
-        <artifactId>vber-common</artifactId>
-        <version>3.0.0</version>
-    </parent>
+<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-security</artifactId>
+    <artifactId>vber-common</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>
+  </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>

+ 23 - 24
SERVER/VberAdminPlusV3/vber-common/vber-common-sms/.flattened-pom.xml

@@ -1,28 +1,27 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<project xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
-         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">
-    <modelVersion>4.0.0</modelVersion>
-    <parent>
-        <groupId>com.vap</groupId>
-        <artifactId>vber-common</artifactId>
-        <version>3.0.0</version>
-    </parent>
+<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-sms</artifactId>
+    <artifactId>vber-common</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>
+  </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>

+ 25 - 26
SERVER/VberAdminPlusV3/vber-common/vber-common-social/.flattened-pom.xml

@@ -1,30 +1,29 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<project xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
-         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">
-    <modelVersion>4.0.0</modelVersion>
-    <parent>
-        <groupId>com.vap</groupId>
-        <artifactId>vber-common</artifactId>
-        <version>3.0.0</version>
-    </parent>
+<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-social</artifactId>
+    <artifactId>vber-common</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>
+  </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>

+ 25 - 26
SERVER/VberAdminPlusV3/vber-common/vber-common-tenant/.flattened-pom.xml

@@ -1,30 +1,29 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<project xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
-         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">
-    <modelVersion>4.0.0</modelVersion>
-    <parent>
-        <groupId>com.vap</groupId>
-        <artifactId>vber-common</artifactId>
-        <version>3.0.0</version>
-    </parent>
+<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-tenant</artifactId>
+    <artifactId>vber-common</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>
+  </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 - 21
SERVER/VberAdminPlusV3/vber-common/vber-common-translation/.flattened-pom.xml

@@ -1,21 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<project xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
-         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">
-    <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-translation</artifactId>
-    <version>3.0.0</version>
-    <description>translation 通用翻译模块</description>
-    <dependencies>
-        <dependency>
-            <groupId>com.vap</groupId>
-            <artifactId>vber-common-core</artifactId>
-        </dependency>
-    </dependencies>
-</project>

+ 51 - 52
SERVER/VberAdminPlusV3/vber-common/vber-common-web/.flattened-pom.xml

@@ -1,56 +1,55 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<project xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
-         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">
-    <modelVersion>4.0.0</modelVersion>
-    <parent>
-        <groupId>com.vap</groupId>
-        <artifactId>vber-common</artifactId>
-        <version>3.0.0</version>
-    </parent>
+<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-web</artifactId>
+    <artifactId>vber-common</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>
+  </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>

+ 29 - 30
SERVER/VberAdminPlusV3/vber-common/vber-common-websocket/.flattened-pom.xml

@@ -1,34 +1,33 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<project xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
-         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">
-    <modelVersion>4.0.0</modelVersion>
-    <parent>
-        <groupId>com.vap</groupId>
-        <artifactId>vber-common</artifactId>
-        <version>3.0.0</version>
-    </parent>
+<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-websocket</artifactId>
+    <artifactId>vber-common</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>
+  </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>

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

@@ -1,21 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<project xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
-         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">
-    <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-extend</artifactId>
-    <version>3.0.0</version>
-    <packaging>pom</packaging>
-    <name>${project.artifactId}</name>
-    <description>附加模块</description>
-    <modules>
-        <module>vber-powerjob-server</module>
-        <module>vber-monitor-admin</module>
-    </modules>
-</project>

+ 0 - 56
SERVER/VberAdminPlusV3/vber-extend/vber-monitor-admin/.flattened-pom.xml

@@ -1,56 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<project xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
-         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">
-    <modelVersion>4.0.0</modelVersion>
-    <parent>
-        <groupId>com.vap</groupId>
-        <artifactId>vber-extend</artifactId>
-        <version>3.0.0</version>
-    </parent>
-    <groupId>com.vap</groupId>
-    <artifactId>vber-monitor-admin</artifactId>
-    <version>3.0.0</version>
-    <name>${project.artifactId}</name>
-    <description>应用监控 Server</description>
-    <dependencies>
-        <dependency>
-            <groupId>org.springframework.boot</groupId>
-            <artifactId>spring-boot-starter-web</artifactId>
-        </dependency>
-        <dependency>
-            <groupId>org.springframework.boot</groupId>
-            <artifactId>spring-boot-starter-security</artifactId>
-        </dependency>
-        <dependency>
-            <groupId>de.codecentric</groupId>
-            <artifactId>spring-boot-admin-starter-server</artifactId>
-        </dependency>
-        <dependency>
-            <groupId>de.codecentric</groupId>
-            <artifactId>spring-boot-admin-starter-client</artifactId>
-        </dependency>
-        <dependency>
-            <groupId>org.projectlombok</groupId>
-            <artifactId>lombok</artifactId>
-        </dependency>
-    </dependencies>
-    <build>
-        <finalName>${project.artifactId}</finalName>
-        <plugins>
-            <plugin>
-                <groupId>org.springframework.boot</groupId>
-                <artifactId>spring-boot-maven-plugin</artifactId>
-                <version>${spring-boot.version}</version>
-                <executions>
-                    <execution>
-                        <goals>
-                            <goal>repackage</goal>
-                        </goals>
-                    </execution>
-                </executions>
-                <configuration></configuration>
-            </plugin>
-        </plugins>
-    </build>
-</project>

+ 1 - 1
SERVER/VberAdminPlusV3/vber-extend/vber-monitor-admin/Dockerfile

@@ -1,7 +1,7 @@
 #FROM findepi/graalvm:java17-native
 FROM openjdk:17.0.2-oraclelinux8
 
-MAINTAINER Lion Li
+MAINTAINER IwbY
 
 RUN mkdir -p /vber/monitor/logs
 

+ 0 - 64
SERVER/VberAdminPlusV3/vber-extend/vber-powerjob-server/.flattened-pom.xml

@@ -1,64 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<project xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
-         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">
-    <modelVersion>4.0.0</modelVersion>
-    <parent>
-        <groupId>com.vap</groupId>
-        <artifactId>vber-extend</artifactId>
-        <version>3.0.0</version>
-    </parent>
-    <groupId>com.vap</groupId>
-    <artifactId>vber-powerjob-server</artifactId>
-    <version>3.0.0</version>
-    <name>${project.artifactId}</name>
-    <description>任务调度 Server</description>
-    <properties>
-        <spring-boot-admin.version>2.7.11</spring-boot-admin.version>
-        <spring-boot.version>2.7.18</spring-boot.version>
-    </properties>
-    <dependencyManagement>
-        <dependencies>
-            <dependency>
-                <groupId>org.springframework.boot</groupId>
-                <artifactId>spring-boot-starter-parent</artifactId>
-                <version>${spring-boot.version}</version>
-                <type>pom</type>
-                <scope>import</scope>
-            </dependency>
-        </dependencies>
-    </dependencyManagement>
-    <dependencies>
-        <dependency>
-            <groupId>tech.powerjob</groupId>
-            <artifactId>powerjob-server-starter</artifactId>
-            <version>${powerjob.version}</version>
-        </dependency>
-        <dependency>
-            <groupId>de.codecentric</groupId>
-            <artifactId>spring-boot-admin-starter-client</artifactId>
-            <version>${spring-boot-admin.version}</version>
-        </dependency>
-        <dependency>
-            <groupId>org.projectlombok</groupId>
-            <artifactId>lombok</artifactId>
-        </dependency>
-    </dependencies>
-    <build>
-        <finalName>${project.artifactId}</finalName>
-        <plugins>
-            <plugin>
-                <groupId>org.springframework.boot</groupId>
-                <artifactId>spring-boot-maven-plugin</artifactId>
-                <version>${spring-boot.version}</version>
-                <executions>
-                    <execution>
-                        <goals>
-                            <goal>repackage</goal>
-                        </goals>
-                    </execution>
-                </executions>
-            </plugin>
-        </plugins>
-    </build>
-</project>

+ 1 - 1
SERVER/VberAdminPlusV3/vber-extend/vber-powerjob-server/Dockerfile

@@ -1,7 +1,7 @@
 #FROM findepi/graalvm:java17-native
 FROM openjdk:17.0.2-oraclelinux8
 
-MAINTAINER Lion Li
+MAINTAINER IwbY
 
 RUN mkdir -p /vber/powerjob/logs
 

+ 0 - 22
SERVER/VberAdminPlusV3/vber-modules/.flattened-pom.xml

@@ -1,22 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<project xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
-         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">
-    <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-modules</artifactId>
-    <version>3.0.0</version>
-    <packaging>pom</packaging>
-    <name>${project.artifactId}</name>
-    <description>业务模块</description>
-    <modules>
-        <module>vber-system</module>
-        <module>vber-generator</module>
-        <module>vber-job</module>
-    </modules>
-</project>

+ 0 - 42
SERVER/VberAdminPlusV3/vber-modules/vber-generator/.flattened-pom.xml

@@ -1,42 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<project xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
-         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">
-    <modelVersion>4.0.0</modelVersion>
-    <parent>
-        <groupId>com.vap</groupId>
-        <artifactId>vber-modules</artifactId>
-        <version>3.0.0</version>
-    </parent>
-    <groupId>com.vap</groupId>
-    <artifactId>vber-generator</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-doc</artifactId>
-        </dependency>
-        <dependency>
-            <groupId>com.vap</groupId>
-            <artifactId>vber-common-mybatis</artifactId>
-        </dependency>
-        <dependency>
-            <groupId>com.vap</groupId>
-            <artifactId>vber-common-web</artifactId>
-        </dependency>
-        <dependency>
-            <groupId>com.vap</groupId>
-            <artifactId>vber-common-log</artifactId>
-        </dependency>
-        <dependency>
-            <groupId>org.apache.velocity</groupId>
-            <artifactId>velocity-engine-core</artifactId>
-        </dependency>
-    </dependencies>
-</project>

+ 12 - 0
SERVER/VberAdminPlusV3/vber-modules/vber-generator/src/main/java/com/vber/generator/config/GenConfig.java

@@ -30,6 +30,9 @@ public class GenConfig {
      */
     public static boolean autoRemovePre;
 
+    public static String uiPath;
+
+
     /**
      * 表前缀(类名不会包含表前缀)
      */
@@ -70,4 +73,13 @@ public class GenConfig {
     public void setTablePrefix(String tablePrefix) {
         GenConfig.tablePrefix = tablePrefix;
     }
+
+    public static String getUiPath() {
+        return uiPath;
+    }
+
+    @Value("${uiPath}")
+    public void setUiPath(String uiPath) {
+        GenConfig.uiPath = uiPath;
+    }
 }

+ 1 - 0
SERVER/VberAdminPlusV3/vber-modules/vber-generator/src/main/java/com/vber/generator/constant/GenConstants.java

@@ -178,6 +178,7 @@ public interface GenConstants {
      * 相等查询
      */
     String QUERY_EQ = "EQ";
+    String QUERY_BETWEEN = "BETWEEN";
 
     /**
      * 需要

+ 16 - 3
SERVER/VberAdminPlusV3/vber-modules/vber-generator/src/main/java/com/vber/generator/controller/GenController.java

@@ -166,6 +166,19 @@ public class GenController extends BaseController {
         return R.ok();
     }
 
+    /**
+     * 生成菜单
+     *
+     * @param tableId 表ID
+     */
+    @SaCheckPermission("tool:gen:code")
+    @Log(title = "代码生成", businessType = BusinessType.GENCODE)
+    @GetMapping("/genMenu/{tableId}")
+    public R<Void> genMenu(@PathVariable("tableId") Long tableId) {
+        genTableService.generatorMenu(tableId);
+        return R.ok();
+    }
+
     /**
      * 同步数据库
      *
@@ -173,9 +186,9 @@ public class GenController extends BaseController {
      */
     @SaCheckPermission("tool:gen:edit")
     @Log(title = "代码生成", businessType = BusinessType.UPDATE)
-    @GetMapping("/synchDb/{tableId}")
-    public R<Void> synchDb(@PathVariable("tableId") Long tableId) {
-        genTableService.synchDb(tableId);
+    @GetMapping("/syncDb/{tableId}")
+    public R<Void> syncDb(@PathVariable("tableId") Long tableId) {
+        genTableService.syncDb(tableId);
         return R.ok();
     }
 

+ 102 - 0
SERVER/VberAdminPlusV3/vber-modules/vber-generator/src/main/java/com/vber/generator/domain/GenMenu.java

@@ -0,0 +1,102 @@
+package com.vber.generator.domain;
+
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableName;
+import com.vber.common.mybatis.core.domain.BaseEntity;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+
+/**
+ * @author Yue
+ */
+@Data
+@EqualsAndHashCode(callSuper = true)
+@TableName("sys_menu")
+public class GenMenu extends BaseEntity {
+    /**
+     * 菜单ID
+     */
+    @TableId(value = "menu_id")
+    private Long menuId;
+
+    /**
+     * 父菜单ID
+     */
+    private Long parentId;
+
+    /**
+     * 菜单名称
+     */
+    private String menuName;
+
+    /**
+     * 显示顺序
+     */
+    private Integer orderNum;
+
+    /**
+     * 路由地址
+     */
+    private String path;
+
+    /**
+     * 组件路径
+     */
+    private String component;
+
+    /**
+     * 路由参数
+     */
+    private String queryParam;
+
+    /**
+     * 是否为外链(0是 1否)
+     */
+    private String isFrame;
+
+    /**
+     * 是否缓存(0缓存 1不缓存)
+     */
+    private String isCache;
+
+    /**
+     * 类型(M目录 C菜单 F按钮)
+     */
+    private String menuType;
+
+    /**
+     * 显示状态(0显示 1隐藏)
+     */
+    private String visible;
+
+    /**
+     * 菜单状态(0正常 1停用)
+     */
+    private String status;
+
+    /**
+     * 权限字符串
+     */
+    private String perms;
+
+    /**
+     * 按钮样式
+     */
+    private String btnClass;
+
+    /**
+     * 按钮脚本
+     */
+    private String btnScript;
+
+    /**
+     * 菜单图标
+     */
+    private String icon;
+
+    /**
+     * 备注
+     */
+    private String remark;
+
+}

+ 2 - 12
SERVER/VberAdminPlusV3/vber-modules/vber-generator/src/main/java/com/vber/generator/domain/GenTable.java

@@ -48,17 +48,7 @@ public class GenTable extends BaseEntity {
      */
     @NotBlank(message = "表描述不能为空")
     private String tableComment;
-
-    /**
-     * 关联父表的表名
-     */
-    private String subTableName;
-
-    /**
-     * 本表关联父表的外键名
-     */
-    private String subTableFkName;
-
+    
     /**
      * 实体类名称(首字母大写)
      */
@@ -66,7 +56,7 @@ public class GenTable extends BaseEntity {
     private String className;
 
     /**
-     * 使用的模板(crud单表操作 tree树表操作 sub主子表操作
+     * 使用的模板(crud单表操作 tree树表操作)
      */
     private String tplCategory;
 

+ 23 - 1
SERVER/VberAdminPlusV3/vber-modules/vber-generator/src/main/java/com/vber/generator/domain/GenTableColumn.java

@@ -6,11 +6,15 @@ import com.baomidou.mybatisplus.annotation.TableId;
 import com.baomidou.mybatisplus.annotation.TableName;
 import com.vber.common.core.utils.StringUtils;
 import com.vber.common.mybatis.core.domain.BaseEntity;
+import com.vber.generator.constant.GenConstants;
+import com.vber.generator.util.GenUtils;
 import jakarta.validation.constraints.NotBlank;
 import lombok.Data;
 import lombok.EqualsAndHashCode;
 import org.apache.ibatis.type.JdbcType;
 
+import java.util.Arrays;
+
 /**
  * 代码生成业务字段表 gen_table_column
  *
@@ -102,6 +106,11 @@ public class GenTableColumn extends BaseEntity {
     @TableField(updateStrategy = FieldStrategy.IGNORED, jdbcType = JdbcType.VARCHAR)
     private String isQuery;
 
+    /**
+     * 是否排序字段(1是)
+     */
+    @TableField(updateStrategy = FieldStrategy.IGNORED, jdbcType = JdbcType.VARCHAR)
+    private String isSort;
     /**
      * 查询方式(EQ等于、NE不等于、GT大于、LT小于、LIKE模糊、BETWEEN范围)
      */
@@ -172,7 +181,7 @@ public class GenTableColumn extends BaseEntity {
     }
 
     public boolean isEdit() {
-        return isInsert(this.isEdit);
+        return isEdit(this.isEdit);
     }
 
     public boolean isEdit(String isEdit) {
@@ -195,6 +204,19 @@ public class GenTableColumn extends BaseEntity {
         return isQuery != null && StringUtils.equals("1", isQuery);
     }
 
+    public boolean isSorted() {
+        return isSorted(this.isSort);
+    }
+
+    public boolean isSorted(String isSorted) {
+        return isSorted != null && StringUtils.equals("1", isSorted);
+    }
+
+    public boolean isNumColumn() {
+        String dateType = GenUtils.getDbType(this.columnType);
+        return Arrays.asList(GenConstants.COLUMNTYPE_NUMBER).contains(dateType);
+    }
+
     public boolean isSuperColumn() {
         return isSuperColumn(this.javaField);
     }

+ 15 - 0
SERVER/VberAdminPlusV3/vber-modules/vber-generator/src/main/java/com/vber/generator/mapper/GenMenuMapper.java

@@ -0,0 +1,15 @@
+package com.vber.generator.mapper;
+
+import com.baomidou.mybatisplus.annotation.InterceptorIgnore;
+import com.vber.common.mybatis.core.mapper.BaseMapperPlus;
+import com.vber.generator.domain.GenMenu;
+import org.springframework.stereotype.Repository;
+
+
+/**
+ * @author Yue
+ */
+@InterceptorIgnore(dataPermission = "true", tenantLine = "true")
+@Repository
+public interface GenMenuMapper extends BaseMapperPlus<GenMenu, GenMenu> {
+}

+ 2 - 0
SERVER/VberAdminPlusV3/vber-modules/vber-generator/src/main/java/com/vber/generator/mapper/GenTableColumnMapper.java

@@ -5,6 +5,7 @@ import com.baomidou.mybatisplus.annotation.InterceptorIgnore;
 import com.vber.common.mybatis.core.mapper.BaseMapperPlus;
 import com.vber.generator.domain.GenTableColumn;
 import org.apache.ibatis.annotations.Param;
+import org.springframework.stereotype.Repository;
 
 import java.util.List;
 
@@ -14,6 +15,7 @@ import java.util.List;
  * @author Iwb
  */
 @InterceptorIgnore(dataPermission = "true", tenantLine = "true")
+@Repository
 public interface GenTableColumnMapper extends BaseMapperPlus<GenTableColumn, GenTableColumn> {
     /**
      * 根据表名称查询列信息

+ 2 - 0
SERVER/VberAdminPlusV3/vber-modules/vber-generator/src/main/java/com/vber/generator/mapper/GenTableMapper.java

@@ -6,6 +6,7 @@ import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.vber.common.mybatis.core.mapper.BaseMapperPlus;
 import com.vber.generator.domain.GenTable;
 import org.apache.ibatis.annotations.Param;
+import org.springframework.stereotype.Repository;
 
 import java.util.List;
 
@@ -15,6 +16,7 @@ import java.util.List;
  * @author Iwb
  */
 @InterceptorIgnore(dataPermission = "true", tenantLine = "true")
+@Repository
 public interface GenTableMapper extends BaseMapperPlus<GenTable, GenTable> {
 
     /**

+ 167 - 37
SERVER/VberAdminPlusV3/vber-modules/vber-generator/src/main/java/com/vber/generator/service/GenTableServiceImpl.java

@@ -20,9 +20,12 @@ import com.vber.common.json.utils.JsonUtils;
 import com.vber.common.mybatis.core.page.PageQuery;
 import com.vber.common.mybatis.core.page.TableDataInfo;
 import com.vber.common.satoken.utils.LoginHelper;
+import com.vber.generator.config.GenConfig;
 import com.vber.generator.constant.GenConstants;
+import com.vber.generator.domain.GenMenu;
 import com.vber.generator.domain.GenTable;
 import com.vber.generator.domain.GenTableColumn;
+import com.vber.generator.mapper.GenMenuMapper;
 import com.vber.generator.mapper.GenTableColumnMapper;
 import com.vber.generator.mapper.GenTableMapper;
 import com.vber.generator.util.GenUtils;
@@ -33,11 +36,11 @@ import lombok.extern.slf4j.Slf4j;
 import org.apache.velocity.Template;
 import org.apache.velocity.VelocityContext;
 import org.apache.velocity.app.Velocity;
+import org.jetbrains.annotations.NotNull;
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
 
 import java.io.ByteArrayOutputStream;
-import java.io.File;
 import java.io.IOException;
 import java.io.StringWriter;
 import java.nio.charset.StandardCharsets;
@@ -57,6 +60,7 @@ public class GenTableServiceImpl implements IGenTableService {
 
     private final GenTableMapper baseMapper;
     private final GenTableColumnMapper genTableColumnMapper;
+    private final GenMenuMapper genMenuMapper;
     private final IdentifierGenerator identifierGenerator;
 
     /**
@@ -67,11 +71,34 @@ public class GenTableServiceImpl implements IGenTableService {
      * @return 生成地址
      */
     public static String getGenPath(GenTable table, String template) {
-        String genPath = table.getGenPath();
-        if (StringUtils.equals(genPath, "/")) {
-            return System.getProperty("user.dir") + File.separator + "src" + File.separator + VelocityUtils.getFileName(template, table);
+        String filePath = VelocityUtils.getFileName(template, table);
+        String path = table.getGenPath();
+        if (StringUtils.equals(path, "/")) {
+            if (VelocityUtils.isUiFile(template)) {
+                String[] paths = System.getProperty("user.dir").split("SERVER");
+                path = paths[0];
+                String uiPath = GenConfig.getUiPath();
+                uiPath = uiPath.replaceAll("\\\\", "/");
+                if (uiPath.startsWith("/")) {
+                    uiPath = uiPath.substring(1);
+                }
+                if (!uiPath.endsWith("/")) {
+                    uiPath += "/";
+                }
+                path += uiPath;
+                filePath = filePath.replace("vue/", "src/");
+            } else {
+                path = System.getProperty("user.dir") + "/vber-modules/vber-" + table.getModuleName() + "/src/";
+            }
+        } else {
+            path = path.replaceAll("\\\\", "/");
+            if (!path.endsWith("/")) {
+                path += "/";
+            }
         }
-        return genPath + File.separator + VelocityUtils.getFileName(template, table);
+        System.out.println("===>path: " + path);
+        path += filePath;
+        return path;
     }
 
     /**
@@ -225,25 +252,17 @@ public class GenTableServiceImpl implements IGenTableService {
         Map<String, String> dataMap = new LinkedHashMap<>();
         // 查询表信息
         GenTable table = baseMapper.selectGenTableById(tableId);
-        List<Long> menuIds = new ArrayList<>();
-        for (int i = 0; i < 6; i++) {
-            menuIds.add(identifierGenerator.nextId(null).longValue());
-        }
-        table.setMenuIds(menuIds);
-        // 设置主键列信息
-        setPkColumn(table);
-        VelocityInitializer.initVelocity();
 
+        List<String> templates = getTemplates(table);
+        VelocityInitializer.initVelocity();
         VelocityContext context = VelocityUtils.prepareContext(table);
-
-        // 获取模板列表
-        List<String> templates = VelocityUtils.getTemplateList(table.getTplCategory());
         for (String template : templates) {
             // 渲染模板
             StringWriter sw = new StringWriter();
             Template tpl = Velocity.getTemplate(template, Constants.UTF8);
             tpl.merge(context, sw);
             dataMap.put(template, sw.toString());
+            String path = getGenPath(table, template);
         }
         return dataMap;
     }
@@ -272,17 +291,12 @@ public class GenTableServiceImpl implements IGenTableService {
     public void generatorCode(Long tableId) {
         // 查询表信息
         GenTable table = baseMapper.selectGenTableById(tableId);
-        // 设置主键列信息
-        setPkColumn(table);
-
+        List<String> templates = getTemplates(table);
         VelocityInitializer.initVelocity();
-
         VelocityContext context = VelocityUtils.prepareContext(table);
-
         // 获取模板列表
-        List<String> templates = VelocityUtils.getTemplateList(table.getTplCategory());
         for (String template : templates) {
-            if (!StringUtils.containsAny(template, "sql.vm", "api.ts.vm", "types.ts.vm", "index.vue.vm", "index-tree.vue.vm")) {
+            if (!StringUtils.containsAny(template, "sql.vm", "types.ts.vm")) {
                 // 渲染模板
                 StringWriter sw = new StringWriter();
                 Template tpl = Velocity.getTemplate(template, Constants.UTF8);
@@ -297,6 +311,121 @@ public class GenTableServiceImpl implements IGenTableService {
         }
     }
 
+    /**
+     * 生成菜单
+     *
+     * @param tableId 表ID
+     */
+    @DSTransactional
+    @Override
+    public void generatorMenu(Long tableId) {
+        GenTable table = baseMapper.selectGenTableById(tableId);
+        if (table == null) {
+            throw new ServiceException("表不存在");
+        }
+        String menuParentId = VelocityUtils.getMenuParentId(table);
+        Long cId;
+        try {
+            cId = Long.parseLong(menuParentId);
+        } catch (Exception e) {
+            cId = null;
+        }
+        if (cId == null || cId.equals(0L)) {
+            cId = getPatentId(table.getModuleName());
+        }
+
+        Long mId = createMenu(cId, table);
+        createMenuBtn(mId, table);
+    }
+
+    private Long getPatentId(String path) {
+        GenMenu menu = genMenuMapper.selectOne(new LambdaQueryWrapper<GenMenu>().eq(GenMenu::getPath, path));
+        if (menu == null) {
+            menu = new GenMenu();
+            menu.setParentId(0L);
+            menu.setMenuName(path);
+            menu.setPath(path);
+            menu.setOrderNum(0);
+            menu.setQueryParam("");
+            menu.setPerms("");
+            menu.setMenuType("M");
+            menu.setIsFrame("1");
+            menu.setVisible("0");
+            menu.setIsCache("0");
+            menu.setStatus("0");
+            menu.setCreateBy(1L);
+            menu.setCreateOrg(100L);
+            if (genMenuMapper.insert(menu) <= 0) {
+                throw new ServiceException("创建父菜单失败:" + path);
+            }
+        }
+        return menu.getMenuId();
+    }
+
+    private Long createMenu(Long cId, GenTable table) {
+        GenMenu menu = new GenMenu();
+        menu.setParentId(cId);
+        menu.setMenuName(table.getTableComment());
+        menu.setPath(table.getBusinessName());
+        menu.setQueryParam("");
+        menu.setComponent(table.getModuleName() + "/" + table.getBusinessName() + "/index");
+        menu.setPerms(table.getModuleName() + ":" + table.getBusinessName());
+        menu.setMenuType("C");
+        menu.setIsFrame("1");
+        menu.setVisible("0");
+        menu.setIsCache("0");
+        menu.setStatus("0");
+        menu.setCreateBy(1L);
+        menu.setCreateOrg(100L);
+        if (genMenuMapper.insert(menu) <= 0) {
+            throw new ServiceException("创建菜单失败:" + table.getTableName());
+        }
+        return menu.getMenuId();
+    }
+
+    private void createMenuBtn(Long mId, GenTable table) {
+        String btnName = table.getFunctionName();
+        GenMenu query = buildMenuBtn(mId, "查询" + btnName, table.getModuleName() + ":" + table.getBusinessName() + ":query", "eye", "", "");
+        if (genMenuMapper.insert(query) <= 0) {
+            throw new ServiceException("创建查询按钮失败");
+        }
+        GenMenu add = buildMenuBtn(mId, "新增" + btnName, table.getModuleName() + ":" + table.getBusinessName() + ":add", "plus-square", "btn btn-light-primary", "handleCreate");
+        if (genMenuMapper.insert(add) <= 0) {
+            throw new ServiceException("创建新增按钮失败。");
+        }
+        GenMenu update = buildMenuBtn(mId, "修改" + btnName, table.getModuleName() + ":" + table.getBusinessName() + ":edit", "pencil-square", "btn btn-light-success", "handleUpdate@1");
+        if (genMenuMapper.insert(update) <= 0) {
+            throw new ServiceException("创建新增按钮失败。");
+        }
+        GenMenu remove = buildMenuBtn(mId, "删除" + btnName, table.getModuleName() + ":" + table.getBusinessName() + ":remove", "dash-square", "btn btn-light-danger", "handleDelete@0");
+        if (genMenuMapper.insert(remove) <= 0) {
+            throw new ServiceException("创建新增按钮失败。");
+        }
+
+
+    }
+
+    private GenMenu buildMenuBtn(Long mId, String btnName, String perms, String icon, String btnClass, String btnScript) {
+        GenMenu menu = new GenMenu();
+        menu.setParentId(mId);
+        menu.setMenuName(btnName);
+        menu.setPath("#");
+        menu.setPerms(perms);
+        menu.setIcon(icon);
+        menu.setQueryParam("");
+        menu.setMenuType("F");
+        menu.setIsFrame("1");
+        menu.setVisible("0");
+        menu.setIsCache("0");
+        menu.setStatus("0");
+        menu.setBtnClass(btnClass);
+        menu.setBtnScript(btnScript);
+        menu.setCreateBy(1L);
+        menu.setCreateOrg(100L);
+        return menu;
+    }
+
+
     /**
      * 同步数据库
      *
@@ -304,7 +433,7 @@ public class GenTableServiceImpl implements IGenTableService {
      */
     @DSTransactional
     @Override
-    public void synchDb(Long tableId) {
+    public void syncDb(Long tableId) {
         GenTable table = baseMapper.selectGenTableById(tableId);
         List<GenTableColumn> tableColumns = table.getColumns();
         Map<String, GenTableColumn> tableColumnMap = StreamUtils.toIdentityMap(tableColumns, GenTableColumn::getColumnName);
@@ -371,20 +500,9 @@ public class GenTableServiceImpl implements IGenTableService {
     private void generatorCode(Long tableId, ZipOutputStream zip) {
         // 查询表信息
         GenTable table = baseMapper.selectGenTableById(tableId);
-        List<Long> menuIds = new ArrayList<>();
-        for (int i = 0; i < 6; i++) {
-            menuIds.add(identifierGenerator.nextId(null).longValue());
-        }
-        table.setMenuIds(menuIds);
-        // 设置主键列信息
-        setPkColumn(table);
-
+        List<String> templates = getTemplates(table);
         VelocityInitializer.initVelocity();
-
         VelocityContext context = VelocityUtils.prepareContext(table);
-
-        // 获取模板列表
-        List<String> templates = VelocityUtils.getTemplateList(table.getTplCategory());
         for (String template : templates) {
             // 渲染模板
             StringWriter sw = new StringWriter();
@@ -398,11 +516,23 @@ public class GenTableServiceImpl implements IGenTableService {
                 zip.flush();
                 zip.closeEntry();
             } catch (IOException e) {
-                log.error("渲染模板失败,表名:" + table.getTableName(), e);
+                log.error("渲染模板失败,表名:{}", table.getTableName(), e);
             }
         }
     }
 
+    private @NotNull List<String> getTemplates(GenTable table) {
+        List<Long> menuIds = new ArrayList<>();
+        for (int i = 0; i < 6; i++) {
+            menuIds.add(identifierGenerator.nextId(null).longValue());
+        }
+        table.setMenuIds(menuIds);
+        // 设置主键列信息
+        setPkColumn(table);
+        // 获取模板列表
+        return VelocityUtils.getTemplateList(table.getTplCategory());
+    }
+
     /**
      * 修改保存参数校验
      *

+ 12 - 4
SERVER/VberAdminPlusV3/vber-modules/vber-generator/src/main/java/com/vber/generator/service/IGenTableService.java

@@ -96,7 +96,7 @@ public interface IGenTableService {
     /**
      * 生成代码(下载方式)
      *
-     * @param tableId 表名称
+     * @param tableId 表ID
      * @return 数据
      */
     byte[] downloadCode(Long tableId);
@@ -104,16 +104,23 @@ public interface IGenTableService {
     /**
      * 生成代码(自定义路径)
      *
-     * @param tableId 表名称
+     * @param tableId 表ID
      */
     void generatorCode(Long tableId);
 
+    /**
+     * 生成菜单
+     *
+     * @param tableId 表ID
+     */
+    void generatorMenu(Long tableId);
+
     /**
      * 同步数据库
      *
-     * @param tableId 表名称
+     * @param tableId 表ID
      */
-    void synchDb(Long tableId);
+    void syncDb(Long tableId);
 
     /**
      * 批量生成代码(下载方式)
@@ -129,4 +136,5 @@ public interface IGenTableService {
      * @param genTable 业务信息
      */
     void validateEdit(GenTable genTable);
+
 }

+ 3 - 0
SERVER/VberAdminPlusV3/vber-modules/vber-generator/src/main/java/com/vber/generator/util/GenUtils.java

@@ -54,8 +54,11 @@ public class GenUtils {
         } else if (arraysContains(GenConstants.COLUMNTYPE_TIME, dataType)) {
             column.setJavaType(GenConstants.TYPE_DATE);
             column.setHtmlType(GenConstants.HTML_DATETIME);
+            column.setIsSort(GenConstants.REQUIRE);
+            column.setQueryType(GenConstants.QUERY_BETWEEN);
         } else if (arraysContains(GenConstants.COLUMNTYPE_NUMBER, dataType)) {
             column.setHtmlType(GenConstants.HTML_INPUT);
+            column.setIsSort(GenConstants.REQUIRE);
 
             // 如果是浮点型 统一用BigDecimal
             String[] str = StringUtils.split(StringUtils.substringBetween(column.getColumnType(), "(", ")"), StringUtils.SEPARATOR);

+ 48 - 44
SERVER/VberAdminPlusV3/vber-modules/vber-generator/src/main/java/com/vber/generator/util/VelocityUtils.java

@@ -6,7 +6,6 @@ import cn.hutool.core.lang.Dict;
 import com.vber.common.core.utils.DateUtils;
 import com.vber.common.core.utils.StringUtils;
 import com.vber.common.json.utils.JsonUtils;
-import com.vber.common.mybatis.helper.DataBaseHelper;
 import com.vber.generator.constant.GenConstants;
 import com.vber.generator.domain.GenTable;
 import com.vber.generator.domain.GenTableColumn;
@@ -57,6 +56,7 @@ public class VelocityUtils {
         velocityContext.put("functionName", StringUtils.isNotEmpty(functionName) ? functionName : "【请填写功能名称】");
         velocityContext.put("ClassName", genTable.getClassName());
         velocityContext.put("className", StringUtils.uncapitalize(genTable.getClassName()));
+        velocityContext.put("ModuleName", StringUtils.capitalize(genTable.getModuleName()));
         velocityContext.put("moduleName", genTable.getModuleName());
         velocityContext.put("BusinessName", StringUtils.capitalize(genTable.getBusinessName()));
         velocityContext.put("businessName", genTable.getBusinessName());
@@ -70,18 +70,28 @@ public class VelocityUtils {
         velocityContext.put("columns", genTable.getColumns());
         velocityContext.put("table", genTable);
         velocityContext.put("dicts", getDicts(genTable));
-        setMenuVelocityContext(velocityContext, genTable);
+        String parentMenuId = getMenuParentId(genTable);
+        velocityContext.put("parentMenuId", parentMenuId);
         if (GenConstants.TPL_TREE.equals(tplCategory)) {
             setTreeVelocityContext(velocityContext, genTable);
         }
         return velocityContext;
     }
 
-    public static void setMenuVelocityContext(VelocityContext context, GenTable genTable) {
+    /**
+     * 获取上级菜单ID字段
+     *
+     * @param genTable table
+     * @return 上级菜单ID字段
+     */
+    public static String getMenuParentId(GenTable genTable) {
         String options = genTable.getOptions();
         Dict paramsObj = JsonUtils.parseMap(options);
-        String parentMenuId = getParentMenuId(paramsObj);
-        context.put("parentMenuId", parentMenuId);
+        if (CollUtil.isNotEmpty(paramsObj) && paramsObj.containsKey(GenConstants.PARENT_MENU_ID)
+                && StringUtils.isNotEmpty(paramsObj.getStr(GenConstants.PARENT_MENU_ID))) {
+            return paramsObj.getStr(GenConstants.PARENT_MENU_ID);
+        }
+        return DEFAULT_PARENT_MENU_ID;
     }
 
     public static void setTreeVelocityContext(VelocityContext context, GenTable genTable) {
@@ -95,11 +105,13 @@ public class VelocityUtils {
         context.put("treeParentCode", treeParentCode);
         context.put("treeName", treeName);
         context.put("expandColumn", getExpandColumn(genTable));
-        if (paramsObj.containsKey(GenConstants.TREE_PARENT_CODE)) {
-            context.put("tree_parent_code", paramsObj.get(GenConstants.TREE_PARENT_CODE));
-        }
-        if (paramsObj.containsKey(GenConstants.TREE_NAME)) {
-            context.put("tree_name", paramsObj.get(GenConstants.TREE_NAME));
+        if (paramsObj != null) {
+            if (paramsObj.containsKey(GenConstants.TREE_PARENT_CODE)) {
+                context.put("tree_parent_code", paramsObj.get(GenConstants.TREE_PARENT_CODE));
+            }
+            if (paramsObj.containsKey(GenConstants.TREE_NAME)) {
+                context.put("tree_name", paramsObj.get(GenConstants.TREE_NAME));
+            }
         }
     }
 
@@ -118,25 +130,33 @@ public class VelocityUtils {
         templates.add("vm/java/serviceImpl.java.vm");
         templates.add("vm/java/controller.java.vm");
         templates.add("vm/xml/mapper.xml.vm");
-        if (DataBaseHelper.isOracle()) {
-            templates.add("vm/sql/oracle/sql.vm");
-        } else if (DataBaseHelper.isPostgerSql()) {
-            templates.add("vm/sql/postgres/sql.vm");
-        } else if (DataBaseHelper.isSqlServer()) {
-            templates.add("vm/sql/sqlserver/sql.vm");
-        } else {
-            templates.add("vm/sql/sql.vm");
-        }
+//        if (DataBaseHelper.isOracle()) {
+//            templates.add("vm/sql/oracle/sql.vm");
+//        } else if (DataBaseHelper.isPostgerSql()) {
+//            templates.add("vm/sql/postgres/sql.vm");
+//        } else if (DataBaseHelper.isSqlServer()) {
+//            templates.add("vm/sql/sqlserver/sql.vm");
+//        } else {
+//            templates.add("vm/sql/sql.vm");
+//        }
         templates.add("vm/ts/api.ts.vm");
-        templates.add("vm/ts/types.ts.vm");
         if (GenConstants.TPL_CRUD.equals(tplCategory)) {
-            templates.add("vm/vue/index.vue.vm");
+            templates.add("vm/vue/view.vue.vm");
         } else if (GenConstants.TPL_TREE.equals(tplCategory)) {
-            templates.add("vm/vue/index-tree.vue.vm");
+            templates.add("vm/vue/view-tree.vue.vm");
         }
         return templates;
     }
 
+    /**
+     * 判断是否是UI文件
+     *
+     * @param template 模板
+     */
+    public static boolean isUiFile(String template) {
+        return template.contains("api.ts.vm") || template.contains("view.vue.vm") || template.contains("view-tree.vue.vm");
+    }
+
     /**
      * 获取文件名
      */
@@ -154,7 +174,7 @@ public class VelocityUtils {
 
         String javaPath = PROJECT_PATH + "/" + StringUtils.replace(packageName, ".", "/");
         String mybatisPath = MYBATIS_PATH + "/" + moduleName;
-        String vuePath = "vue";
+        String uiPath = "vue";
 
         if (template.contains("domain.java.vm")) {
             fileName = StringUtils.format("{}/domain/{}.java", javaPath, className);
@@ -178,13 +198,11 @@ public class VelocityUtils {
         } else if (template.contains("sql.vm")) {
             fileName = businessName + "Menu.sql";
         } else if (template.contains("api.ts.vm")) {
-            fileName = StringUtils.format("{}/api/{}/{}/index.ts", vuePath, moduleName, businessName);
-        } else if (template.contains("types.ts.vm")) {
-            fileName = StringUtils.format("{}/api/{}/{}/types.ts", vuePath, moduleName, businessName);
-        } else if (template.contains("index.vue.vm")) {
-            fileName = StringUtils.format("{}/views/{}/{}/index.vue", vuePath, moduleName, businessName);
-        } else if (template.contains("index-tree.vue.vm")) {
-            fileName = StringUtils.format("{}/views/{}/{}/index.vue", vuePath, moduleName, businessName);
+            fileName = StringUtils.format("{}/api/{}/_{}.ts", uiPath, moduleName, businessName);
+        } else if (template.contains("view.vue.vm")) {
+            fileName = StringUtils.format("{}/views/{}/{}/index.vue", uiPath, moduleName, businessName);
+        } else if (template.contains("view-tree.vue.vm")) {
+            fileName = StringUtils.format("{}/views/{}/{}/index.vue", uiPath, moduleName, businessName);
         }
         return fileName;
     }
@@ -260,20 +278,6 @@ public class VelocityUtils {
         return StringUtils.format("{}:{}", moduleName, businessName);
     }
 
-    /**
-     * 获取上级菜单ID字段
-     *
-     * @param paramsObj 生成其他选项
-     * @return 上级菜单ID字段
-     */
-    public static String getParentMenuId(Dict paramsObj) {
-        if (CollUtil.isNotEmpty(paramsObj) && paramsObj.containsKey(GenConstants.PARENT_MENU_ID)
-                && StringUtils.isNotEmpty(paramsObj.getStr(GenConstants.PARENT_MENU_ID))) {
-            return paramsObj.getStr(GenConstants.PARENT_MENU_ID);
-        }
-        return DEFAULT_PARENT_MENU_ID;
-    }
-
     /**
      * 获取树编码
      *

+ 2 - 1
SERVER/VberAdminPlusV3/vber-modules/vber-generator/src/main/resources/generator.yml

@@ -1,10 +1,11 @@
 # 代码生成
 gen:
   # 作者
-  author: Lion Li
+  author: IwbY
   # 默认生成包路径 system 需改成自己的模块名称 如 system monitor tool
   packageName: com.vber.system
   # 自动去除表前缀,默认是false
   autoRemovePre: false
   # 表前缀(生成类名不会包含表前缀,多个用逗号分隔)
   tablePrefix: sys_
+  uiPath: UI/VAP_V3.VUE

+ 8 - 0
SERVER/VberAdminPlusV3/vber-modules/vber-generator/src/main/resources/mapper/generator/GenMenuMapper.xml

@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE mapper
+        PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
+        "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.vber.generator.mapper.GenMenuMapper">
+    <resultMap type="com.vber.generator.domain.GenMenu" id="SysMenuResult">
+    </resultMap>
+</mapper>

+ 1 - 0
SERVER/VberAdminPlusV3/vber-modules/vber-generator/src/main/resources/mapper/generator/GenTableMapper.xml

@@ -245,6 +245,7 @@
                c.is_edit,
                c.is_list,
                c.is_query,
+               c.is_sort,
                c.query_type,
                c.html_type,
                c.dict_type,

+ 12 - 0
SERVER/VberAdminPlusV3/vber-modules/vber-generator/src/main/resources/vm/java/bo.java.vm

@@ -1,6 +1,11 @@
 package ${packageName}.domain.bo;
 
 import ${packageName}.domain.${ClassName};
+#if(($javaField.indexOf("Time")>0&&$javaField.indexOf(
+    "Time")==${javaField.length()} - 4)||($javaField.indexOf("Date")>0&&$javaField.indexOf(
+    "Date")==${javaField.length()} - 4))
+import com.fasterxml.jackson.annotation.JsonFormat;
+#end
 import com.vber.common.mybatis.core.domain.BaseEntity;
 import com.vber.common.core.validate.AddGroup;
 import com.vber.common.core.validate.EditGroup;
@@ -42,6 +47,13 @@ public class ${ClassName}Bo extends BaseEntity {
                 @NotNull(message = "$column.columnComment不能为空", groups = { $Group })
                 #end
             #end
+            #if($column.javaField.indexOf("Time")>0&&$column.javaField.indexOf(
+                "Time")==${column.javaField.length()} - 4)
+            @JsonFormat(pattern = "YYYY-MM-DD HH:mm:ss")
+            #elseif($column.javaField.indexOf("Date")>0&&$column.javaField.indexOf(
+                "Date")==${column.javaField.length()} - 4)
+            @JsonFormat(pattern = "YYYY-MM-DD")
+            #end
         private $column.javaType $column.javaField;
 
         #end

+ 2 - 4
SERVER/VberAdminPlusV3/vber-modules/vber-generator/src/main/resources/vm/java/controller.java.vm

@@ -73,8 +73,7 @@ public class ${ClassName}Controller extends BaseController {
      */
     @SaCheckPermission("${permissionPrefix}:query")
     @GetMapping("/{${pkColumn.javaField}}")
-    public R<${ClassName}Vo> getInfo(@NotNull(message = "主键不能为空")
-                                     @PathVariable ${pkColumn.javaType} ${pkColumn.javaField}) {
+    public R<${ClassName}Vo> getInfo(@NotNull(message = "主键不能为空") @PathVariable ${pkColumn.javaType} ${pkColumn.javaField}) {
         return R.ok(${className}Service.queryById(${pkColumn.javaField}));
     }
 
@@ -108,8 +107,7 @@ public class ${ClassName}Controller extends BaseController {
     @SaCheckPermission("${permissionPrefix}:remove")
     @Log(title = "${functionName}", businessType = BusinessType.DELETE)
     @DeleteMapping("/{${pkColumn.javaField}s}")
-    public R<Void> remove(@NotEmpty(message = "主键不能为空")
-                          @PathVariable ${pkColumn.javaType}[] ${pkColumn.javaField}s) {
+    public R<Void> remove(@NotEmpty(message = "主键不能为空") @PathVariable ${pkColumn.javaType}[] ${pkColumn.javaField}s) {
         return toAjax(${className}Service.deleteWithValidByIds(List.of(${pkColumn.javaField}s), true));
     }
 }

+ 1 - 0
SERVER/VberAdminPlusV3/vber-modules/vber-generator/src/main/resources/vm/java/mapper.java.vm

@@ -9,6 +9,7 @@ import org.springframework.stereotype.Repository;
  * ${functionName}Mapper接口
  *
  * @author ${author}
+ * @date ${datetime}
  */
 @Repository
 public interface ${ClassName}Mapper extends BaseMapperPlus<${ClassName}, ${ClassName}Vo> {

+ 68 - 63
SERVER/VberAdminPlusV3/vber-modules/vber-generator/src/main/resources/vm/ts/api.ts.vm

@@ -1,63 +1,68 @@
-import request from '@/utils/request';
-import {AxiosPromise} from 'axios';
-import {${BusinessName}Form, ${BusinessName}Query, ${BusinessName}VO} from '@/api/';
-
-/**
- * 查询${functionName}列表
- * @param query
- * @returns {*}
- */
-
-export const list${BusinessName} = (query?: ${BusinessName}Query): AxiosPromise<${BusinessName}VO[]> => {
-    return request({
-        url: '/${moduleName}/${businessName}/list',
-        method: 'get',
-        params: query
-    });
-};
-
-/**
- * 查询${functionName}详细
- * @param ${pkColumn.javaField}
- */
-export const get${BusinessName} = (${pkColumn.javaField}: string | number): AxiosPromise<${BusinessName}VO> => {
-    return request({
-        url: '/${moduleName}/${businessName}/' + ${pkColumn.javaField},
-        method: 'get'
-    });
-};
-
-/**
- * 新增${functionName}
- * @param data
- */
-export const add${BusinessName} = (data: ${BusinessName}Form) => {
-    return request({
-        url: '/${moduleName}/${businessName}',
-        method: 'post',
-        data: data
-    });
-};
-
-/**
- * 修改${functionName}
- * @param data
- */
-export const update${BusinessName} = (data: ${BusinessName}Form) => {
-    return request({
-        url: '/${moduleName}/${businessName}',
-        method: 'put',
-        data: data
-    });
-};
-
-/**
- * 删除${functionName}
- * @param ${pkColumn.javaField}
- */
-export const del${BusinessName} = (${pkColumn.javaField}: string | number | Array<string | number>) => {
-    return request({
-        url: '/${moduleName}/${businessName}/' + ${pkColumn.javaField},
-        method: 'delete'
-    });
-};
+import Rs from '@/core/services/RequestService'
+
+class ${businessName}Api {
+    tableUrl = "/${moduleName}/${businessName}/list"
+    exportUrl = "/${moduleName}/${businessName}/export"
+
+    // 查询${functionName}列表
+    list = (query: any) => {
+        return Rs.get({
+            url: '/${moduleName}/${businessName}/list',
+            params: query,
+            loading: false
+        })
+    }
+
+    // 查询${functionName}详细
+    get = (${pkColumn.javaField}: string) => {
+        return Rs.get({
+            url: '/${moduleName}/${businessName}/' + ${pkColumn.javaField},
+            loading: false
+        })
+    }
+
+    // 新增或修改${functionName}
+    addOrUpdate = (data: any) => {
+        return new Promise((resolve) => {
+            if (data.${pkColumn.javaField}) {
+                this.update(data).then((res: any) => {
+                    message.msgSuccess("修改成功")
+                    resolve(res)
+                })
+            } else {
+                this.add(data).then((res: any) => {
+                    message.msgSuccess("新增成功")
+                    resolve(res)
+                })
+            }
+        })
+    }
+
+    // 新增${functionName}
+    add = (data: any) => {
+        return Rs.post({
+            url: '/${moduleName}/${businessName}',
+            data: data,
+            successAlert: false,
+        })
+    }
+
+    // 修改${functionName}
+    update = (data: any) => {
+        return Rs.put({
+            url: '/${moduleName}/${businessName}',
+            data: data,
+            successAlert: false,
+        })
+    }
+
+    // 删除${functionName}
+    del = (${pkColumn.javaField}: string | string[]) => {
+        return Rs.del({
+            url: '/${moduleName}/${businessName}/' + ${pkColumn.javaField},
+        })
+    }
+
+}
+
+export default ${businessName}Api

+ 0 - 539
SERVER/VberAdminPlusV3/vber-modules/vber-generator/src/main/resources/vm/vue/index-tree.vue.vm

@@ -1,539 +0,0 @@
-<template>
-  <div class="p-2">
-    <transition :enter-active-class="proxy?.animate.searchAnimate.enter"
-                :leave-active-class="proxy?.animate.searchAnimate.leave">
-      <div class="search" v-show="showSearch">
-        <el-form :model="queryParams" ref="queryFormRef" :inline="true" label-width="68px">
-            #foreach($column in $columns)
-                #if($column.query)
-                    #set($dictType=$column.dictType)
-                    #set($AttrName=$column.javaField.substring(0,1).toUpperCase() + ${column.javaField.substring(1)})
-                    #set($parentheseIndex=$column.columnComment.indexOf("("))
-                    #if($parentheseIndex != -1)
-                        #set($comment=$column.columnComment.substring(0, $parentheseIndex))
-                    #else
-                        #set($comment=$column.columnComment)
-                    #end
-                    #if($column.htmlType == "input" || $column.htmlType == "textarea")
-                      <el-form-item label="${comment}" prop="${column.javaField}">
-                        <el-input v-model="queryParams.${column.javaField}" placeholder="请输入${comment}" clearable
-                                  style="width: 240px" @keyup.enter="handleQuery"/>
-                      </el-form-item>
-                    #elseif(($column.htmlType == "select" || $column.htmlType == "radio") && "" != $dictType)
-                      <el-form-item label="${comment}" prop="${column.javaField}">
-                        <el-select v-model="queryParams.${column.javaField}" placeholder="请选择${comment}" clearable>
-                          <el-option
-                              v-for="dict in ${dictType}"
-                              :key="dict.value"
-                              :label="dict.label"
-                              :value="dict.value"
-                          />
-                        </el-select>
-                      </el-form-item>
-                    #elseif(($column.htmlType == "select" || $column.htmlType == "radio") && $dictType)
-                      <el-form-item label="${comment}" prop="${column.javaField}">
-                        <el-select v-model="queryParams.${column.javaField}" placeholder="请选择${comment}" clearable>
-                          <el-option label="请选择字典生成" value=""/>
-                        </el-select>
-                      </el-form-item>
-                    #elseif($column.htmlType == "datetime" && $column.queryType != "BETWEEN")
-                      <el-form-item label="${comment}" prop="${column.javaField}">
-                        <el-date-picker clearable
-                                        v-model="queryParams.${column.javaField}"
-                                        type="date"
-                                        value-format="YYYY-MM-DD"
-                                        placeholder="选择${comment}"
-                        />
-                      </el-form-item>
-                    #elseif($column.htmlType == "datetime" && $column.queryType == "BETWEEN")
-                      <el-form-item label="${comment}" style="width: 308px">
-                        <el-date-picker
-                            v-model="dateRange${AttrName}"
-                            value-format="YYYY-MM-DD HH:mm:ss"
-                            type="daterange"
-                            range-separator="-"
-                            start-placeholder="开始日期"
-                            end-placeholder="结束日期"
-                            :default-time="[new Date(2000, 1, 1, 0, 0, 0), new Date(2000, 1, 1, 23, 59, 59)]"
-                        />
-                      </el-form-item>
-                    #end
-                #end
-            #end
-          <el-form-item>
-            <el-button type="primary" icon="Search" @click="handleQuery">搜索</el-button>
-            <el-button icon="Refresh" @click="resetQuery">重置</el-button>
-          </el-form-item>
-        </el-form>
-      </div>
-    </transition>
-
-    <el-card shadow="never">
-      <template #header>
-        <el-row :gutter="10" class="mb8">
-          <el-col :span="1.5">
-            <el-button type="primary" plain icon="Plus" @click="handleAdd()"
-                       v-hasPermi="['${moduleName}:${businessName}:add']">新增
-            </el-button>
-          </el-col>
-          <el-col :span="1.5">
-            <el-button type="info" plain icon="Sort" @click="handleToggleExpandAll">展开/折叠</el-button>
-          </el-col>
-          <right-toolbar v-model:showSearch="showSearch" @queryTable="getList"></right-toolbar>
-        </el-row>
-      </template>
-      <el-table
-          v-loading="loading"
-          :data="${businessName}List"
-          row-key="${treeCode}"
-          :default-expand-all="isExpandAll"
-          :tree-props="{children: 'children', hasChildren: 'hasChildren'}"
-          ref="${businessName}TableRef"
-      >
-          #foreach($column in $columns)
-              #set($javaField=$column.javaField)
-              #set($parentheseIndex=$column.columnComment.indexOf("("))
-              #if($parentheseIndex != -1)
-                  #set($comment=$column.columnComment.substring(0, $parentheseIndex))
-              #else
-                  #set($comment=$column.columnComment)
-              #end
-              #if($column.pk)
-              #elseif($column.list && $column.htmlType == "datetime")
-                <el-table-column label="${comment}" align="center" prop="${javaField}" width="180">
-                  <template #default="scope">
-                    <span>{{ parseTime(scope.row.${javaField}, '{y}-{m}-{d}') }}</span>
-                  </template>
-                </el-table-column>
-              #elseif($column.list && $column.htmlType == "imageUpload")
-                <el-table-column label="${comment}" align="center" prop="${javaField}" width="100">
-                  <template #default="scope">
-                    <image-preview :src="scope.row.${javaField}" :width="50" :height="50"/>
-                  </template>
-                </el-table-column>
-              #elseif($column.list && $column.dictType && "" != $column.dictType)
-                <el-table-column label="${comment}" align="center" prop="${javaField}">
-                  <template #default="scope">
-                      #if($column.htmlType == "checkbox")
-                        <dict-tag :options="${column.dictType}"
-                                  :value="scope.row.${javaField} ? scope.row.${javaField}.split(',') : []"/>
-                      #else
-                        <dict-tag :options="${column.dictType}" :value="scope.row.${javaField}"/>
-                      #end
-                  </template>
-                </el-table-column>
-              #elseif($column.list && "" != $javaField)
-                  #if(${foreach.index} == 1)
-                    <el-table-column label="${comment}" prop="${javaField}"/>
-                  #else
-                    <el-table-column label="${comment}" align="center" prop="${javaField}"/>
-                  #end
-              #end
-          #end
-        <el-table-column label="操作" align="center" class-name="small-padding fixed-width">
-          <template #default="scope">
-            <el-tooltip content="修改" placement="top">
-              <el-button link type="primary" icon="Edit" @click="handleUpdate(scope.row)"
-                         v-hasPermi="['${moduleName}:${businessName}:edit']"/>
-            </el-tooltip>
-            <el-tooltip content="新增" placement="top">
-              <el-button link type="primary" icon="Plus" @click="handleAdd(scope.row)"
-                         v-hasPermi="['${moduleName}:${businessName}:add']"/>
-            </el-tooltip>
-            <el-tooltip content="删除" placement="top">
-              <el-button link type="primary" icon="Delete" @click="handleDelete(scope.row)"
-                         v-hasPermi="['${moduleName}:${businessName}:remove']"/>
-            </el-tooltip>
-          </template>
-        </el-table-column>
-      </el-table>
-    </el-card>
-    <!-- 添加或修改${functionName}对话框 -->
-    <el-dialog :title="dialog.title" v-model="dialog.visible" width="500px" append-to-body>
-      <el-form ref="${businessName}FormRef" :model="form" :rules="rules" label-width="80px">
-          #foreach($column in $columns)
-              #set($field=$column.javaField)
-              #if(($column.insert || $column.edit) && !$column.pk)
-                  #set($parentheseIndex=$column.columnComment.indexOf("("))
-                  #if($parentheseIndex != -1)
-                      #set($comment=$column.columnComment.substring(0, $parentheseIndex))
-                  #else
-                      #set($comment=$column.columnComment)
-                  #end
-                  #set($dictType=$column.dictType)
-                  #if("" != $treeParentCode && $column.javaField == $treeParentCode)
-                    <el-form-item label="${comment}" prop="${treeParentCode}">
-                      <el-tree-select
-                          v-model="form.${treeParentCode}"
-                          :data="${businessName}Options"
-                          :props="{ value: '${treeCode}', label: '${treeName}', children: 'children' }"
-                          value-key="${treeCode}"
-                          placeholder="请选择${comment}"
-                          check-strictly
-                      />
-                    </el-form-item>
-                  #elseif($column.htmlType == "input")
-                    <el-form-item label="${comment}" prop="${field}">
-                      <el-input v-model="form.${field}" placeholder="请输入${comment}"/>
-                    </el-form-item>
-                  #elseif($column.htmlType == "imageUpload")
-                    <el-form-item label="${comment}" prop="${field}">
-                      <image-upload v-model="form.${field}"/>
-                    </el-form-item>
-                  #elseif($column.htmlType == "fileUpload")
-                    <el-form-item label="${comment}" prop="${field}">
-                      <file-upload v-model="form.${field}"/>
-                    </el-form-item>
-                  #elseif($column.htmlType == "editor")
-                    <el-form-item label="${comment}">
-                      <editor v-model="form.${field}" :min-height="192"/>
-                    </el-form-item>
-                  #elseif($column.htmlType == "select" && "" != $dictType)
-                    <el-form-item label="${comment}" prop="${field}">
-                      <el-select v-model="form.${field}" placeholder="请选择${comment}">
-                        <el-option
-                            v-for="dict in ${dictType}"
-                            :key="dict.value"
-                            :label="dict.label"
-                            #if($column.javaType == "Integer" || $column.javaType == "Long")
-                            :value="parseInt(dict.value)"
-                            #else
-                            :value="dict.value"
-                            #end
-                        ></el-option>
-                      </el-select>
-                    </el-form-item>
-                  #elseif($column.htmlType == "select" && $dictType)
-                    <el-form-item label="${comment}" prop="${field}">
-                      <el-select v-model="form.${field}" placeholder="请选择${comment}">
-                        <el-option label="请选择字典生成" value=""/>
-                      </el-select>
-                    </el-form-item>
-                  #elseif($column.htmlType == "checkbox" && "" != $dictType)
-                    <el-form-item label="${comment}" prop="${field}">
-                      <el-checkbox-group v-model="form.${field}">
-                        <el-checkbox
-                            v-for="dict in ${dictType}"
-                            :key="dict.value"
-                            :label="dict.value">
-                          {{dict.label}}
-                        </el-checkbox>
-                      </el-checkbox-group>
-                    </el-form-item>
-                  #elseif($column.htmlType == "checkbox" && $dictType)
-                    <el-form-item label="${comment}" prop="${field}">
-                      <el-checkbox-group v-model="form.${field}">
-                        <el-checkbox>请选择字典生成</el-checkbox>
-                      </el-checkbox-group>
-                    </el-form-item>
-                  #elseif($column.htmlType == "radio" && "" != $dictType)
-                    <el-form-item label="${comment}" prop="${field}">
-                      <el-radio-group v-model="form.${field}">
-                        <el-radio
-                            v-for="dict in ${dictType}"
-                            :key="dict.value"
-                            #if($column.javaType == "Integer" || $column.javaType == "Long")
-                            :label="parseInt(dict.value)"
-                            #else
-                            :label="dict.value"
-                            #end
-                        >{{dict.label}}
-                        </el-radio>
-                      </el-radio-group>
-                    </el-form-item>
-                  #elseif($column.htmlType == "radio" && $dictType)
-                    <el-form-item label="${comment}" prop="${field}">
-                      <el-radio-group v-model="form.${field}">
-                        <el-radio label="1">请选择字典生成</el-radio>
-                      </el-radio-group>
-                    </el-form-item>
-                  #elseif($column.htmlType == "datetime")
-                    <el-form-item label="${comment}" prop="${field}">
-                      <el-date-picker clearable
-                                      v-model="form.${field}"
-                                      type="datetime"
-                                      value-format="YYYY-MM-DD HH:mm:ss"
-                                      placeholder="选择${comment}"
-                      />
-                    </el-form-item>
-                  #elseif($column.htmlType == "textarea")
-                    <el-form-item label="${comment}" prop="${field}">
-                      <el-input v-model="form.${field}" type="textarea" placeholder="请输入内容"/>
-                    </el-form-item>
-                  #end
-              #end
-          #end
-      </el-form>
-      <template #footer>
-        <div class="dialog-footer">
-          <el-button :loading="buttonLoading" type="primary" @click="submitForm">确 定</el-button>
-          <el-button @click="cancel">取 消</el-button>
-        </div>
-      </template>
-    </el-dialog>
-  </div>
-</template>
-
-<script setup name="${BusinessName}" lang="ts">
-  import {add${BusinessName}, ${BusinessName}Form, get${BusinessName}, list${BusinessName}, ${BusinessName}Query, update${BusinessName}, ${BusinessName}VO} from "@/api/";
-
-  type ${BusinessName}Option = {
-          ${treeCode}: number;
-          ${treeName}: string;
-    children?: ${BusinessName}Option[];
-  }
-
-  const {proxy} = getCurrentInstance() as ComponentInternalInstance;
-  ;
-
-      #if(${dicts} != '')
-          #set($dictsNoSymbol=$dicts.replace("'", ""))
-      const { ${dictsNoSymbol} } = toRefs<any>(proxy?.useDict(${dicts}));
-      #end
-
-  const ${businessName}List = ref<${BusinessName}VO[]>([]);
-  const ${businessName}Options = ref<${BusinessName}Option[]>([]);
-  const buttonLoading = ref(false);
-  const showSearch = ref(true);
-  const isExpandAll = ref(true);
-  const loading = ref(false);
-
-  const queryFormRef = ref<ElFormInstance>();
-  const ${businessName}FormRef = ref<ElFormInstance>();
-  const ${businessName}TableRef = ref<ElTableInstance>()
-
-  const dialog = reactive<DialogOption>({
-    visible: false,
-    title: ''
-  });
-
-      #foreach ($column in $columns)
-          #if($column.htmlType == "datetime" && $column.queryType == "BETWEEN")
-              #set($AttrName=$column.javaField.substring(0,1).toUpperCase() + ${column.javaField.substring(1)})
-          const dateRange${AttrName} = ref<[DateModelType, DateModelType]>(['', '']);
-          #end
-      #end
-
-  const initFormData: ${BusinessName}Form = {
-      #foreach ($column in $columns)
-          #if($column.insert || $column.edit)
-              #if($column.htmlType == "checkbox")
-                      $column.javaField: []#if($foreach.count != $columns.size()),#end
-              #else
-                      $column.javaField: undefined#if($foreach.count != $columns.size()),#end
-              #end
-          #end
-      #end
-  }
-
-  const data = reactive<PageData<${BusinessName}Form, ${BusinessName}Query>>({
-    form: {...initFormData},
-    queryParams: {
-        #foreach ($column in $columns)
-            #if($column.query)
-                #if($column.htmlType != "datetime" || $column.queryType != "BETWEEN")
-                        $column.javaField: undefined,
-                #end
-            #end
-        #end
-      params: {
-          #foreach ($column in $columns)
-              #if($column.query)
-                  #if($column.htmlType == "datetime" && $column.queryType == "BETWEEN")
-                          $column.javaField: undefined#if($foreach.count != $columns.size()),#end
-                  #end
-              #end
-          #end
-      }
-    },
-    rules: {
-        #foreach ($column in $columns)
-            #if($column.insert || $column.edit)
-                #if($column.required)
-                    #set($parentheseIndex=$column.columnComment.indexOf("("))
-                    #if($parentheseIndex != -1)
-                        #set($comment=$column.columnComment.substring(0, $parentheseIndex))
-                    #else
-                        #set($comment=$column.columnComment)
-                    #end
-                        $column.javaField: [
-                    {
-                      required: true, message: "$comment不能为空", trigger: #if($column.htmlType ==
-                        "select" || $column.htmlType == "radio")"change"#else"blur"#end }
-                  ]#if($foreach.count != $columns.size()),#end
-                #end
-            #end
-        #end
-    }
-  });
-
-  const {queryParams, form, rules} = toRefs(data);
-
-  /** 查询${functionName}列表 */
-  const getList = async () => {
-    loading.value = true;
-      #foreach ($column in $columns)
-          #if($column.htmlType == "datetime" && $column.queryType == "BETWEEN")
-            queryParams.value.params = {};
-              #break
-          #end
-      #end
-      #foreach ($column in $columns)
-          #if($column.htmlType == "datetime" && $column.queryType == "BETWEEN")
-              #set($AttrName=$column.javaField.substring(0,1).toUpperCase() + ${column.javaField.substring(1)})
-            proxy?.addDateRange(queryParams.value, dateRange${AttrName}.value, '${AttrName}');
-          #end
-      #end
-    const res = await list${BusinessName}(queryParams.value);
-    const data = proxy?.handleTree<${BusinessName}VO>(res.data, "${treeCode}", "${treeParentCode}");
-    if (data) {
-            ${businessName}List.value = data;
-      loading.value = false;
-    }
-  }
-
-  /** 查询${functionName}下拉树结构 */
-  const getTreeSelect = async () => {
-    const res = await list${BusinessName}();
-          ${businessName}Options.value = [];
-    const data: ${BusinessName}Option = {${treeCode}: 0, ${treeName}: '顶级节点', children: []};
-    data.children = proxy?.handleTree<${BusinessName}Option>(res.data, "${treeCode}", "${treeParentCode}");
-          ${businessName}Options.value.push(data);
-  }
-
-  // 取消按钮
-  const cancel = () => {
-    reset();
-    dialog.visible = false;
-  }
-
-  // 表单重置
-  const reset = () => {
-    form.value = {...initFormData}
-          ${businessName}FormRef.value?.resetFields();
-  }
-
-  /** 搜索按钮操作 */
-  const handleQuery = () => {
-    getList();
-  }
-
-  /** 重置按钮操作 */
-  const resetQuery = () => {
-      #foreach ($column in $columns)
-          #if($column.htmlType == "datetime" && $column.queryType == "BETWEEN")
-              #set($AttrName=$column.javaField.substring(0,1).toUpperCase() + ${column.javaField.substring(1)})
-            dateRange${AttrName}.value = ['', ''];
-          #end
-      #end
-    queryFormRef.value?.resetFields();
-    handleQuery();
-  }
-
-  /** 新增按钮操作 */
-  const handleAdd = (row?: ${BusinessName}VO) => {
-    reset();
-    getTreeSelect();
-    if (row != null && row.${treeCode}) {
-      form.value.${treeParentCode} = row.${treeCode};
-    } else {
-      form.value.${treeParentCode} = 0;
-    }
-    dialog.visible = true;
-    dialog.title = "添加${functionName}";
-  }
-
-  /** 展开/折叠操作 */
-  const handleToggleExpandAll = () => {
-    isExpandAll.value = !isExpandAll.value;
-    toggleExpandAll(${businessName}List.value, isExpandAll.value)
-  }
-
-  /** 展开/折叠操作 */
-  const toggleExpandAll = (data: ${BusinessName}VO[], status: boolean) => {
-    data.forEach((item) => {
-            ${businessName}TableRef.value?.toggleRowExpansion(item, status)
-      if (item.children && item.children.length > 0) toggleExpandAll(item.children, status)
-    })
-  }
-
-  /** 修改按钮操作 */
-  const handleUpdate = async (row: ${BusinessName}VO) => {
-    reset();
-    await getTreeSelect();
-    if (row != null) {
-      form.value.${treeParentCode} = row.${treeParentCode};
-    }
-    const res = await get${BusinessName}(row.${pkColumn.javaField});
-    Object.assign(form.value, res.data);
-      #foreach ($column in $columns)
-          #if($column.htmlType == "checkbox")
-            form.value.$column.javaField = form.value.${column.javaField}.split(",");
-          #end
-      #end
-    dialog.visible = true;
-    dialog.title = "修改${functionName}";
-  }
-
-  /** 提交按钮 */
-  const submitForm = () => {
-          ${businessName}FormRef.value?.validate(async (valid: boolean) => {
-      if (valid) {
-        buttonLoading.value = true;
-          #foreach ($column in $columns)
-              #if($column.htmlType == "checkbox")
-                form.value.$column.javaField = form.value.${column.javaField}.join(",");
-              #end
-          #end
-        if (form.value.${pkColumn.javaField}) {
-          await update${BusinessName}(form.value).finally(() => buttonLoading.value = false);
-        } else {
-          await add${BusinessName}(form.value).finally(() => buttonLoading.value = false);
-        }
-        proxy?.
-      #
-        [[$modal]]
-      #.
-        msgSuccess("操作成功");
-        dialog.visible = false;
-        getList();
-      }
-    });
-  }
-
-  /** 删除按钮操作 */
-  const handleDelete = async (row: ${BusinessName}VO) => {
-    await proxy?.
-  #
-    [[$modal]]
-  #.
-    confirm('是否确认删除${functionName}编号为"' + row.$
-    {
-      pkColumn.javaField
-    }
-    +'"的数据项?'
-  )
-    ;
-    loading.value = true;
-    await del$
-    {
-      BusinessName
-    }
-    (row.$
-    {
-      pkColumn.javaField
-    }
-  ).
-    finally(() => loading.value = false);
-    await getList();
-    proxy?.
-  #
-    [[$modal]]
-  #.
-    msgSuccess("删除成功");
-  }
-
-  onMounted(() => {
-    getList();
-  });
-</script>

+ 0 - 520
SERVER/VberAdminPlusV3/vber-modules/vber-generator/src/main/resources/vm/vue/index.vue.vm

@@ -1,520 +0,0 @@
-<template>
-  <div class="p-2">
-    <transition :enter-active-class="proxy?.animate.searchAnimate.enter"
-                :leave-active-class="proxy?.animate.searchAnimate.leave">
-      <div class="search" v-show="showSearch">
-        <el-form :model="queryParams" ref="queryFormRef" :inline="true" label-width="68px">
-            #foreach($column in $columns)
-                #if($column.query)
-                    #set($dictType=$column.dictType)
-                    #set($AttrName=$column.javaField.substring(0,1).toUpperCase() + ${column.javaField.substring(1)})
-                    #set($parentheseIndex=$column.columnComment.indexOf("("))
-                    #if($parentheseIndex != -1)
-                        #set($comment=$column.columnComment.substring(0, $parentheseIndex))
-                    #else
-                        #set($comment=$column.columnComment)
-                    #end
-                    #if($column.htmlType == "input" || $column.htmlType == "textarea")
-                      <el-form-item label="${comment}" prop="${column.javaField}">
-                        <el-input v-model="queryParams.${column.javaField}" placeholder="请输入${comment}" clearable
-                                  style="width: 240px" @keyup.enter="handleQuery"/>
-                      </el-form-item>
-                    #elseif(($column.htmlType == "select" || $column.htmlType == "radio") && "" != $dictType)
-                      <el-form-item label="${comment}" prop="${column.javaField}">
-                        <el-select v-model="queryParams.${column.javaField}" placeholder="请选择${comment}" clearable>
-                          <el-option
-                              v-for="dict in ${dictType}"
-                              :key="dict.value"
-                              :label="dict.label"
-                              :value="dict.value"
-                          />
-                        </el-select>
-                      </el-form-item>
-                    #elseif(($column.htmlType == "select" || $column.htmlType == "radio") && $dictType)
-                      <el-form-item label="${comment}" prop="${column.javaField}">
-                        <el-select v-model="queryParams.${column.javaField}" placeholder="请选择${comment}" clearable>
-                          <el-option label="请选择字典生成" value=""/>
-                        </el-select>
-                      </el-form-item>
-                    #elseif($column.htmlType == "datetime" && $column.queryType != "BETWEEN")
-                      <el-form-item label="${comment}" prop="${column.javaField}">
-                        <el-date-picker clearable
-                                        v-model="queryParams.${column.javaField}"
-                                        type="date"
-                                        value-format="YYYY-MM-DD"
-                                        placeholder="请选择${comment}"
-                        />
-                      </el-form-item>
-                    #elseif($column.htmlType == "datetime" && $column.queryType == "BETWEEN")
-                      <el-form-item label="${comment}" style="width: 308px">
-                        <el-date-picker
-                            v-model="dateRange${AttrName}"
-                            value-format="YYYY-MM-DD HH:mm:ss"
-                            type="daterange"
-                            range-separator="-"
-                            start-placeholder="开始日期"
-                            end-placeholder="结束日期"
-                            :default-time="[new Date(2000, 1, 1, 0, 0, 0), new Date(2000, 1, 1, 23, 59, 59)]"
-                        />
-                      </el-form-item>
-                    #end
-                #end
-            #end
-          <el-form-item>
-            <el-button type="primary" icon="Search" @click="handleQuery">搜索</el-button>
-            <el-button icon="Refresh" @click="resetQuery">重置</el-button>
-          </el-form-item>
-        </el-form>
-      </div>
-    </transition>
-
-    <el-card shadow="never">
-      <template #header>
-        <el-row :gutter="10" class="mb8">
-          <el-col :span="1.5">
-            <el-button type="primary" plain icon="Plus" @click="handleAdd"
-                       v-hasPermi="['${moduleName}:${businessName}:add']">新增
-            </el-button>
-          </el-col>
-          <el-col :span="1.5">
-            <el-button type="success" plain icon="Edit" :disabled="single" @click="handleUpdate()"
-                       v-hasPermi="['${moduleName}:${businessName}:edit']">修改
-            </el-button>
-          </el-col>
-          <el-col :span="1.5">
-            <el-button type="danger" plain icon="Delete" :disabled="multiple" @click="handleDelete()"
-                       v-hasPermi="['${moduleName}:${businessName}:remove']">删除
-            </el-button>
-          </el-col>
-          <el-col :span="1.5">
-            <el-button type="warning" plain icon="Download" @click="handleExport"
-                       v-hasPermi="['${moduleName}:${businessName}:export']">导出
-            </el-button>
-          </el-col>
-          <right-toolbar v-model:showSearch="showSearch" @queryTable="getList"></right-toolbar>
-        </el-row>
-      </template>
-
-      <el-table v-loading="loading" :data="${businessName}List" @selection-change="handleSelectionChange">
-        <el-table-column type="selection" width="55" align="center"/>
-          #foreach($column in $columns)
-              #set($javaField=$column.javaField)
-              #set($parentheseIndex=$column.columnComment.indexOf("("))
-              #if($parentheseIndex != -1)
-                  #set($comment=$column.columnComment.substring(0, $parentheseIndex))
-              #else
-                  #set($comment=$column.columnComment)
-              #end
-              #if($column.pk)
-                <el-table-column label="${comment}" align="center" prop="${javaField}" v-if="${column.list}"/>
-              #elseif($column.list && $column.htmlType == "datetime")
-                <el-table-column label="${comment}" align="center" prop="${javaField}" width="180">
-                  <template #default="scope">
-                    <span>{{ parseTime(scope.row.${javaField}, '{y}-{m}-{d}') }}</span>
-                  </template>
-                </el-table-column>
-              #elseif($column.list && $column.htmlType == "imageUpload")
-                <el-table-column label="${comment}" align="center" prop="${javaField}" width="100">
-                  <template #default="scope">
-                    <image-preview :src="scope.row.${javaField}" :width="50" :height="50"/>
-                  </template>
-                </el-table-column>
-              #elseif($column.list && $column.dictType && "" != $column.dictType)
-                <el-table-column label="${comment}" align="center" prop="${javaField}">
-                  <template #default="scope">
-                      #if($column.htmlType == "checkbox")
-                        <dict-tag :options="${column.dictType}"
-                                  :value="scope.row.${javaField} ? scope.row.${javaField}.split(',') : []"/>
-                      #else
-                        <dict-tag :options="${column.dictType}" :value="scope.row.${javaField}"/>
-                      #end
-                  </template>
-                </el-table-column>
-              #elseif($column.list && "" != $javaField)
-                <el-table-column label="${comment}" align="center" prop="${javaField}"/>
-              #end
-          #end
-        <el-table-column label="操作" align="center" class-name="small-padding fixed-width">
-          <template #default="scope">
-            <el-tooltip content="修改" placement="top">
-              <el-button link type="primary" icon="Edit" @click="handleUpdate(scope.row)"
-                         v-hasPermi="['${moduleName}:${businessName}:edit']"></el-button>
-            </el-tooltip>
-            <el-tooltip content="删除" placement="top">
-              <el-button link type="primary" icon="Delete" @click="handleDelete(scope.row)"
-                         v-hasPermi="['${moduleName}:${businessName}:remove']"></el-button>
-            </el-tooltip>
-          </template>
-        </el-table-column>
-      </el-table>
-
-      <pagination
-          v-show="total>0"
-          :total="total"
-          v-model:page="queryParams.pageNum"
-          v-model:limit="queryParams.pageSize"
-          @pagination="getList"
-      />
-    </el-card>
-    <!-- 添加或修改${functionName}对话框 -->
-    <el-dialog :title="dialog.title" v-model="dialog.visible" width="500px" append-to-body>
-      <el-form ref="${businessName}FormRef" :model="form" :rules="rules" label-width="80px">
-          #foreach($column in $columns)
-              #set($field=$column.javaField)
-              #if(($column.insert || $column.edit) && !$column.pk)
-                  #set($parentheseIndex=$column.columnComment.indexOf("("))
-                  #if($parentheseIndex != -1)
-                      #set($comment=$column.columnComment.substring(0, $parentheseIndex))
-                  #else
-                      #set($comment=$column.columnComment)
-                  #end
-                  #set($dictType=$column.dictType)
-                  #if($column.htmlType == "input")
-                    <el-form-item label="${comment}" prop="${field}">
-                      <el-input v-model="form.${field}" placeholder="请输入${comment}"/>
-                    </el-form-item>
-                  #elseif($column.htmlType == "imageUpload")
-                    <el-form-item label="${comment}" prop="${field}">
-                      <image-upload v-model="form.${field}"/>
-                    </el-form-item>
-                  #elseif($column.htmlType == "fileUpload")
-                    <el-form-item label="${comment}" prop="${field}">
-                      <file-upload v-model="form.${field}"/>
-                    </el-form-item>
-                  #elseif($column.htmlType == "editor")
-                    <el-form-item label="${comment}">
-                      <editor v-model="form.${field}" :min-height="192"/>
-                    </el-form-item>
-                  #elseif($column.htmlType == "select" && "" != $dictType)
-                    <el-form-item label="${comment}" prop="${field}">
-                      <el-select v-model="form.${field}" placeholder="请选择${comment}">
-                        <el-option
-                            v-for="dict in ${dictType}"
-                            :key="dict.value"
-                            :label="dict.label"
-                            #if($column.javaType == "Integer" || $column.javaType == "Long")
-                            :value="parseInt(dict.value)"
-                            #else
-                            :value="dict.value"
-                            #end
-                        ></el-option>
-                      </el-select>
-                    </el-form-item>
-                  #elseif($column.htmlType == "select" && $dictType)
-                    <el-form-item label="${comment}" prop="${field}">
-                      <el-select v-model="form.${field}" placeholder="请选择${comment}">
-                        <el-option label="请选择字典生成" value=""/>
-                      </el-select>
-                    </el-form-item>
-                  #elseif($column.htmlType == "checkbox" && "" != $dictType)
-                    <el-form-item label="${comment}" prop="${field}">
-                      <el-checkbox-group v-model="form.${field}">
-                        <el-checkbox
-                            v-for="dict in ${dictType}"
-                            :key="dict.value"
-                            :label="dict.value">
-                          {{dict.label}}
-                        </el-checkbox>
-                      </el-checkbox-group>
-                    </el-form-item>
-                  #elseif($column.htmlType == "checkbox" && $dictType)
-                    <el-form-item label="${comment}" prop="${field}">
-                      <el-checkbox-group v-model="form.${field}">
-                        <el-checkbox>请选择字典生成</el-checkbox>
-                      </el-checkbox-group>
-                    </el-form-item>
-                  #elseif($column.htmlType == "radio" && "" != $dictType)
-                    <el-form-item label="${comment}" prop="${field}">
-                      <el-radio-group v-model="form.${field}">
-                        <el-radio
-                            v-for="dict in ${dictType}"
-                            :key="dict.value"
-                            #if($column.javaType == "Integer" || $column.javaType == "Long")
-                            :label="parseInt(dict.value)"
-                            #else
-                            :label="dict.value"
-                            #end
-                        >{{dict.label}}
-                        </el-radio>
-                      </el-radio-group>
-                    </el-form-item>
-                  #elseif($column.htmlType == "radio" && $dictType)
-                    <el-form-item label="${comment}" prop="${field}">
-                      <el-radio-group v-model="form.${field}">
-                        <el-radio label="1">请选择字典生成</el-radio>
-                      </el-radio-group>
-                    </el-form-item>
-                  #elseif($column.htmlType == "datetime")
-                    <el-form-item label="${comment}" prop="${field}">
-                      <el-date-picker clearable
-                                      v-model="form.${field}"
-                                      type="datetime"
-                                      value-format="YYYY-MM-DD HH:mm:ss"
-                                      placeholder="请选择${comment}">
-                      </el-date-picker>
-                    </el-form-item>
-                  #elseif($column.htmlType == "textarea")
-                    <el-form-item label="${comment}" prop="${field}">
-                      <el-input v-model="form.${field}" type="textarea" placeholder="请输入内容"/>
-                    </el-form-item>
-                  #end
-              #end
-          #end
-      </el-form>
-      <template #footer>
-        <div class="dialog-footer">
-          <el-button :loading="buttonLoading" type="primary" @click="submitForm">确 定</el-button>
-          <el-button @click="cancel">取 消</el-button>
-        </div>
-      </template>
-    </el-dialog>
-  </div>
-</template>
-
-<script setup name="${BusinessName}" lang="ts">
-  import {add${BusinessName}, ${BusinessName}Form, get${BusinessName}, list${BusinessName}, ${BusinessName}Query, update${BusinessName}, ${BusinessName}VO} from '@/api/';
-
-  const {proxy} = getCurrentInstance() as ComponentInternalInstance;
-      #if(${dicts} != '')
-          #set($dictsNoSymbol=$dicts.replace("'", ""))
-      const { ${dictsNoSymbol} } = toRefs<any>(proxy?.useDict(${dicts}));
-      #end
-
-  const ${businessName}List = ref<${BusinessName}VO[]>([]);
-  const buttonLoading = ref(false);
-  const loading = ref(true);
-  const showSearch = ref(true);
-  const ids = ref<Array<string | number>>([]);
-  const single = ref(true);
-  const multiple = ref(true);
-  const total = ref(0);
-      #foreach ($column in $columns)
-          #if($column.htmlType == "datetime" && $column.queryType == "BETWEEN")
-              #set($AttrName=$column.javaField.substring(0,1).toUpperCase() + ${column.javaField.substring(1)})
-          const dateRange${AttrName} = ref<[DateModelType, DateModelType]>(['', '']);
-          #end
-      #end
-
-  const queryFormRef = ref<ElFormInstance>();
-  const ${businessName}FormRef = ref<ElFormInstance>();
-
-  const dialog = reactive<DialogOption>({
-    visible: false,
-    title: ''
-  });
-
-  const initFormData: ${BusinessName}Form = {
-      #foreach ($column in $columns)
-          #if($column.insert || $column.edit)
-              #if($column.htmlType == "checkbox")
-                      $column.javaField: []#if($foreach.count != $columns.size()),#end
-              #else
-                      $column.javaField: undefined#if($foreach.count != $columns.size()),#end
-              #end
-          #end
-      #end
-  }
-  const data = reactive<PageData<${BusinessName}Form, ${BusinessName}Query>>({
-    form: {...initFormData},
-    queryParams: {
-      pageNum: 1,
-      pageSize: 10,
-        #foreach ($column in $columns)
-            #if($column.query)
-                #if($column.htmlType != "datetime" || $column.queryType != "BETWEEN")
-                        $column.javaField: undefined,
-                #end
-            #end
-        #end
-      params: {
-          #foreach ($column in $columns)
-              #if($column.query)
-                  #if($column.htmlType == "datetime" && $column.queryType == "BETWEEN")
-                          $column.javaField: undefined#if($foreach.count != $columns.size()),#end
-                  #end
-              #end
-          #end
-      }
-    },
-    rules: {
-        #foreach ($column in $columns)
-            #if($column.insert || $column.edit)
-                #if($column.required)
-                    #set($parentheseIndex=$column.columnComment.indexOf("("))
-                    #if($parentheseIndex != -1)
-                        #set($comment=$column.columnComment.substring(0, $parentheseIndex))
-                    #else
-                        #set($comment=$column.columnComment)
-                    #end
-                        $column.javaField: [
-                    {
-                      required: true, message: "$comment不能为空", trigger: #if($column.htmlType ==
-                        "select" || $column.htmlType == "radio")"change"#else"blur"#end }
-                  ]#if($foreach.count != $columns.size()),#end
-                #end
-            #end
-        #end
-    }
-  });
-
-  const {queryParams, form, rules} = toRefs(data);
-
-  /** 查询${functionName}列表 */
-  const getList = async () => {
-    loading.value = true;
-      #foreach ($column in $columns)
-          #if($column.htmlType == "datetime" && $column.queryType == "BETWEEN")
-            queryParams.value.params = {};
-              #break
-          #end
-      #end
-      #foreach ($column in $columns)
-          #if($column.htmlType == "datetime" && $column.queryType == "BETWEEN")
-              #set($AttrName=$column.javaField.substring(0,1).toUpperCase() + ${column.javaField.substring(1)})
-            proxy?.addDateRange(queryParams.value, dateRange${AttrName}.value, '${AttrName}');
-          #end
-      #end
-    const res = await list${BusinessName}(queryParams.value);
-          ${businessName}List.value = res.rows;
-    total.value = res.total;
-    loading.value = false;
-  }
-
-  /** 取消按钮 */
-  const cancel = () => {
-    reset();
-    dialog.visible = false;
-  }
-
-  /** 表单重置 */
-  const reset = () => {
-    form.value = {...initFormData};
-          ${businessName}FormRef.value?.resetFields();
-  }
-
-  /** 搜索按钮操作 */
-  const handleQuery = () => {
-    queryParams.value.pageNum = 1;
-    getList();
-  }
-
-  /** 重置按钮操作 */
-  const resetQuery = () => {
-      #foreach ($column in $columns)
-          #if($column.htmlType == "datetime" && $column.queryType == "BETWEEN")
-              #set($AttrName=$column.javaField.substring(0,1).toUpperCase() + ${column.javaField.substring(1)})
-            dateRange${AttrName}.value = ['', ''];
-          #end
-      #end
-    queryFormRef.value?.resetFields();
-    handleQuery();
-  }
-
-  /** 多选框选中数据 */
-  const handleSelectionChange = (selection: ${BusinessName}VO[]) => {
-    ids.value = selection.map(item => item.${pkColumn.javaField});
-    single.value = selection.length != 1;
-    multiple.value = !selection.length;
-  }
-
-  /** 新增按钮操作 */
-  const handleAdd = () => {
-    reset();
-    dialog.visible = true;
-    dialog.title = "添加${functionName}";
-  }
-
-  /** 修改按钮操作 */
-  const handleUpdate = async (row?: ${BusinessName}VO) => {
-    reset();
-    const _${pkColumn.javaField} = row?.${pkColumn.javaField} || ids.value[0]
-    const res = await get${BusinessName}(_${pkColumn.javaField});
-    Object.assign(form.value, res.data);
-      #foreach ($column in $columns)
-          #if($column.htmlType == "checkbox")
-            form.value.$column.javaField = form.value.${column.javaField}.split(",");
-          #end
-      #end
-    dialog.visible = true;
-    dialog.title = "修改${functionName}";
-  }
-
-  /** 提交按钮 */
-  const submitForm = () => {
-          ${businessName}FormRef.value?.validate(async (valid: boolean) => {
-      if (valid) {
-        buttonLoading.value = true;
-          #foreach ($column in $columns)
-              #if($column.htmlType == "checkbox")
-                form.value.$column.javaField = form.value.${column.javaField}.join(",");
-              #end
-          #end
-        if (form.value.${pkColumn.javaField}) {
-          await update${BusinessName}(form.value).finally(() => buttonLoading.value = false);
-        } else {
-          await add${BusinessName}(form.value).finally(() => buttonLoading.value = false);
-        }
-        proxy?.
-      #
-        [[$modal]]
-      #.
-        msgSuccess("修改成功");
-        dialog.visible = false;
-        await getList();
-      }
-    });
-  }
-
-  /** 删除按钮操作 */
-  const handleDelete = async (row?: ${BusinessName}VO) => {
-    const _$
-    {
-      pkColumn.javaField
-    }
-    s = row?.$
-    {
-      pkColumn.javaField
-    }
-  ||
-    ids.value;
-    await proxy?.
-  #
-    [[$modal]]
-  #.
-    confirm('是否确认删除${functionName}编号为"' + _$
-    {
-      pkColumn.javaField
-    }
-    s + '"的数据项?'
-  ).
-    finally(() => loading.value = false);
-    await del$
-    {
-      BusinessName
-    }
-    (_$
-    {
-      pkColumn.javaField
-    }
-    s
-  )
-    ;
-    proxy?.
-  #
-    [[$modal]]
-  #.
-    msgSuccess("删除成功");
-    await getList();
-  }
-
-  /** 导出按钮操作 */
-  const handleExport = () => {
-    proxy?.download('${moduleName}/${businessName}/export', {
-      ...queryParams.value
-    }, `${businessName}_#[[${new Date().getTime()}]]#.xlsx`)
-  }
-
-  onMounted(() => {
-    getList();
-  });
-</script>

+ 552 - 0
SERVER/VberAdminPlusV3/vber-modules/vber-generator/src/main/resources/vm/vue/view-tree.vue.vm

@@ -0,0 +1,552 @@
+<script setup lang="ts" name="${BusinessName}">
+  import apis from "@a"
+      #set($hasDate=false)
+      #foreach ($column in $columns)
+          #if( $column.javaType == "Date")
+              #set($hasDate='import dayjs from "dayjs"')
+          #end
+      #end
+      #if ($hasDate)
+          $hasDate
+      #end
+      #foreach ($column in $columns)
+          #if( $column.dictType ==""&&($column.htmlType == "select" || $column.htmlType == "radio"|| $column.htmlType ==
+              "checkbox"))
+          const ${column.javaField}Options = computed(() => {
+            return [
+              {label: "请选择", value: ""},
+              {label: "", value: ""}
+            ]
+          })
+          #end
+      #end
+
+  const ${businessName}Options = ref<any>([])
+  const tableTreeRef = ref()
+  const modalRef = ref()
+  const opts = reactive({
+    columns: [
+        #foreach ($column in $columns)
+            #set($field=$column.javaField)
+            #set($sort="false")
+            #if($column.sorted)
+                #set($sort="true")
+            #end
+            #set($parentheseIndex=$column.columnComment.indexOf("("))
+            #if($parentheseIndex != -1)
+                #set($comment=$column.columnComment.substring(0, $parentheseIndex))
+            #else
+                #set($comment=$column.columnComment)
+            #end
+            #if($column.pk)
+              {field: "$field", name: "$comment", width: 100, isSort: true, visible: false},
+            #elseif($column.list)
+                #if(($field.indexOf("Time")>0&&$field.indexOf("Time")==${field.length()} - 4)
+                ||($field.indexOf("Date")>0&&$field.indexOf("Date")==${field.length()} - 4))
+                  {field: "$field", name: "$comment", visible: true, isSort: $sort, width: 185},
+                #elseif($field=="remark")
+                  {field: "$field", name: "$comment", visible: true, isSort: $sort, tooltip: true},
+                #elseif($column.dictType)
+                  {field: "$field", name: "$comment", visible: true, isSort: $sort, width: 100},
+                #else
+                  {field: "$field", name: "$comment", visible: true, isSort: $sort, width: "auto"},
+                #end
+            #end
+        #end
+      {field: "actions", name: `操作`, width: 150},
+    ],
+    queryParams: {
+        #foreach ($column in $columns)
+            #set($field=$column.javaField)
+            #if($column.query)
+                #if($column.javaType == "Date" && $column.queryType == "BETWEEN")
+                    #set($AttrName=$field.substring(0,1).toUpperCase() + ${field.substring(1)})
+                  dateRange${AttrName}: undefined,
+                #else
+                        $field: undefined,
+                #end
+            #end
+        #end
+    },
+    searchFormItems: [
+        #foreach($column in $columns)
+            #set($isNumber=$column.numColumn)
+            #set($format="YYYY-MM-DD")
+            #set($field=$column.javaField)
+            #if($column.query)
+                #set($dictType=$column.dictType)
+                #set($AttrName=$field.substring(0,1).toUpperCase() + ${field.substring(1)})
+                #set($parentheseIndex=$column.columnComment.indexOf("("))
+                #if($parentheseIndex != -1)
+                    #set($comment=$column.columnComment.substring(0, $parentheseIndex))
+                #else
+                    #set($comment=$column.columnComment)
+                #end
+              {
+                  #if($column.javaType == "Date" && "BETWEEN" == $column.queryType)
+                    field: "dateRange${AttrName}",
+                  #else
+                    field: "${field}",
+                  #end
+                label: "${comment}",
+                class: "w-100",
+                required: false,
+                  #if($column.htmlType == "input")
+                    placeholder: "请输入${comment}",
+                    component: "I",
+                    listeners: {
+                      keyup: (e: KeyboardEvent) => {
+                        if (e.code == "Enter") {
+                          handleQuery()
+                        }
+                      },
+                    },
+                  #elseif($column.htmlType == "select"|| $column.htmlType == "radio")
+                      #if( "" != $dictType)
+                        component: "Dict",
+                        props: {
+                          placeholder: "请选择${comment}",
+                          dictType: "${dictType}",
+                          type: "select",
+                          valueIsNumber: ${isNumber},
+                        },
+                      #else
+                        component: "VS",
+                        placeholder: "请选择${comment}",
+                        data: () => ${field}Options.value,
+                        props: {
+                          type: "select",
+                          valueIsNumber: ${isNumber},
+                        },
+                      #end
+                  #elseif($column.javaType == "Date")
+                      #set($dateType="date")
+                      #if($field.indexOf("Time")>0&&$field.indexOf("Time")==${field.length()} - 4)
+                          #set($format="YYYY-MM-DD HH:mm:ss")
+                          #set($dateType="datetmie")
+                      #elseif($field.indexOf("Date")>0&&$field.indexOf("Date")==${field.length()} - 4)
+                          #set($format="YYYY-MM-DD")
+                      #end
+                      #if( "BETWEEN" == $column.queryType)
+                        component: "D",
+                        placeholder: "请选择${comment}",
+                        props: {
+                          type: "${dateType}range",
+                          valueFormat: "${format}",
+                          rangeSeparator: "-",
+                          startPlaceholder: "开始日期",
+                          endPlaceholder: "结束日期",
+                        },
+                        listeners: {
+                          change: (v: any) => {
+                            queryParams.value.dateRange${AttrName} = v
+                          },
+                        },
+                        span: 5,
+                      #else
+                        component: "D",
+                        placeholder: "请选择${comment}",
+                        props: {
+                          type: "$dateType",
+                          valueFormat: "${format}",
+                        },
+                      #end
+                  #end
+              },
+            #end
+        #end
+    ] as any,
+    permission: "${permissionPrefix}",
+    handleBtns: [],
+    handleFuns: {
+      handleUpdate: () => {
+        const row = tableTreeRef.value.getSelected()
+        handleUpdate(row)
+      },
+      handleDelete: () => {
+        const rows = tableTreeRef.value.getSelecteds()
+        handleDelete(rows)
+      },
+    },
+    customBtns: [],
+    tableListFun: getTableData,
+    getEntityFun: apis.${moduleName}.${businessName}Api.get,
+    deleteEntityFun: apis.${moduleName}.${businessName}Api.del,
+    exportUrl: apis.${moduleName}.${businessName}Api.exportUrl,
+    exportName: "${BusinessName}",
+    modalTitle: "${functionName}",
+    formItems: [
+        #foreach($column in $columns)
+            #set($isNumber=$column.numColumn)
+            #set($format="YYYY-MM-DD")
+            #set($field=$column.javaField)
+            #if($column.insert && !$column.pk)
+                #set($parentheseIndex=$column.columnComment.indexOf("("))
+                #if($parentheseIndex != -1)
+                    #set($comment=$column.columnComment.substring(0, $parentheseIndex))
+                #else
+                    #set($comment=$column.columnComment)
+                #end
+                #if($field==$treeParentCode)
+                  {
+                    field: "${field}",
+                    label: "${comment}",
+                    class: "w-100",
+                    required: ${column.required},
+                    component: "VST",
+                    placeholder: "请选择${comment}",
+                    data: () => ${businessName}Options.value,
+                    props: {
+                      props: {
+                        id: "${treeCode}",
+                        label: "${treeName}",
+                        children: "children",
+                      }
+                    }
+                  },
+                #elseif(($column.usableColumn) || (!$column.superColumn))
+
+                    #set($dictType=$column.dictType)
+                  {
+                    field: "${field}",
+                    label: "${comment}",
+                    class: "w-100",
+                    required:${column.required},
+                      #if($column.htmlType == "input")
+                        placeholder: "请输入${comment}",
+                        component: "I",
+                      #elseif($column.htmlType == "upload"||$column.htmlType == "image-upload")
+                        component: "VbUpload",
+                      #elseif($column.htmlType == "upload")
+                        component: "VbUpload",
+                        props: {
+                          uploadType: "file",
+                        },
+                      #elseif($column.htmlType == "summernote"||$column.htmlType == "editor")
+                        component: "VE",
+                        props: {
+                          minHeight: 192,
+                        },
+                      #elseif($column.htmlType == "select")
+                          #if( "" != $dictType)
+                            component: "Dict",
+                            props: {
+                              placeholder: "请选择${comment}",
+                              dictType: "${dictType}",
+                              type: "select",
+                              valueIsNumber: ${isNumber},
+                            },
+                          #else
+                            component: "VS",
+                            placeholder: "请选择${comment}",
+                            data: () => ${field}Options.value,
+                            props: {
+                              type: "select",
+                              valueIsNumber: ${isNumber},
+                            },
+                          #end
+                      #elseif($column.htmlType == "checkbox")
+                          #if( "" != $dictType)
+                            component: "Dict",
+                            props: {
+                              dictType: "${dictType}",
+                              type: "checkbox",
+                              valueIsNumber: ${isNumber},
+                            },
+                          #else
+                            component: "VS",
+                            data: () => ${field}Options.value,
+                            props: {
+                              type: "checkbox",
+                              valueIsNumber: ${isNumber},
+                            },
+                          #end
+                      #elseif($column.htmlType == "radio")
+                          #if( "" != $dictType)
+                            component: "Dict",
+                            props: {
+                              dictType: "${dictType}",
+                              type: "radio",
+                              valueIsNumber: ${isNumber},
+                            },
+                          #else
+                            component: "VS",
+                            data: () => ${field}Options.value,
+                            props: {
+                              type: "radio",
+                              valueIsNumber: ${isNumber},
+                            },
+                          #end
+                      #elseif($column.javaType == "Date")
+                          #set($dateType="date")
+                          #if($field.indexOf("Time")>0&&$field.indexOf("Time")==${field.length()} - 4)
+                              #set($format="YYYY-MM-DD HH:mm:ss")
+                              #set($dateType="datetime")
+                          #elseif($field.indexOf("Date")>0&&$field.indexOf("Date")==${field.length()} - 4)
+                              #set($format="YYYY-MM-DD")
+                          #end
+                        component: "D",
+                        props: {
+                          placeholder: "请选择${comment}",
+                          type: "$dateType",
+                          valueFormat: "${format}",
+                        },
+                      #elseif($column.htmlType == "textarea")
+                        placeholder: "请输入${comment}",
+                        component: "I",
+                        props: {
+                          type: "textarea",
+                          rows: 5,
+                        },
+                      #end
+                  },
+                #end
+            #end
+        #end
+    ] as any,
+    resetForm: () => {
+      form.value = emptyFormData.value
+      get${BusinessName}TreeSelect()
+    },
+    labelWidth: "80px",
+    emptyFormData: {
+        #foreach($column in $columns)
+            #set($field=$column.javaField)
+            #if($column.pk)
+                    $column.javaField: undefined,
+            #elseif($column.insert)
+                #if(($column.usableColumn) || (!$column.superColumn))
+                        $column.javaField: undefined,
+                #end
+            #end
+        #end
+    },
+  });
+  const {queryParams, emptyFormData} = toRefs(opts)
+  const form = ref<any>(emptyFormData.value)
+
+  /** 搜索按钮操作 */
+  function handleQuery(query?: any) {
+    query = query || tableTreeRef.value?.getQueryParams() || queryParams.value
+      #foreach ($column in $columns)
+          #if($column.javaType == "Date" && $column.queryType == "BETWEEN")
+              #set($AttrName=$column.javaField.substring(0,1).toUpperCase() + ${column.javaField.substring(1)})
+              #if($AttrName=="CreateTime")
+                addDateRange(query, query.dateRange${AttrName})
+              #else
+                addDateRange(query, query.dateRange${AttrName}, "${AttrName}")
+              #end
+          #end
+      #end
+    tableTreeRef.value?.query(query)
+  }
+
+  /** 重置按钮操作 */
+  function resetQuery(query?: any) {
+    query = query || tableTreeRef.value?.getQueryParams() || queryParams.value
+      #foreach ($column in $columns)
+          #if($column.javaType == "Date" && $column.queryType == "BETWEEN")
+              #set($AttrName=$column.javaField.substring(0,1).toUpperCase() + ${column.javaField.substring(1)})
+            query.dateRange${AttrName} = [] as any
+              #if($AttrName=="CreateTime")
+                addDateRange(query, query.dateRange${AttrName})
+              #else
+                addDateRange(query, query.dateRange${AttrName}, "${AttrName}")
+              #end
+          #else
+          #end
+      #end
+    //
+  }
+
+  /** 新增按钮操作 */
+  function handleCreate(row?: any) {
+    opts.resetForm()
+    if (row != null && row.${treeCode}) {
+      form.value.${treeParentCode} = row.${treeCode}
+    } else {
+      form.value.${treeParentCode} = 100
+    }
+    modalRef.value.changePrefixTitle("添加")
+    modalRef.value.show()
+  }
+
+  /** 修改按钮操作 */
+  function handleUpdate(row: any) {
+    tableTreeRef.value.defaultHandleFuns.handleUpdate("", row)
+      #foreach ($column in $columns)
+          #if($column.htmlType == "checkbox")
+            form.value.$column.javaField = form.value.${column.javaField}.split(",");
+          #end
+      #end
+  }
+
+  /** 删除按钮操作 */
+  function handleDelete(rows: any[]) {
+    tableTreeRef.value.defaultHandleFuns.handleDelete("", rows)
+  }
+
+  /** 提交按钮 */
+  function submitForm() {
+      #foreach ($column in $columns)
+          #if($column.htmlType == "checkbox")
+            form.value.$column.javaField = form.value.${column.javaField}.join(",");
+          #end
+      #end
+      #if($table.sub)
+        form.value.${subclassName}List = ${subclassName}List.value;
+      #end
+    apis.${moduleName}.${businessName}Api.addOrUpdate(form.value).then(() => {
+      handleQuery()
+    });
+  }
+
+  function get${BusinessName}TreeSelect() {
+          ${businessName}Options.value = []
+    apis.${moduleName}.${businessName}Api.list({}).then((res) => {
+      if (!res.data || res.data.length == 0) {
+              ${businessName}Options.value = [{
+                  ${treeCode}: 0,
+                  ${treeName}: "根目录",
+          children: [],
+        }]
+      } else {
+              ${businessName}Options.value = handleTree(res.data, "${treeCode}")
+      }
+    })
+  }
+
+  function getTableData(query: any) {
+    return new Promise((resolve) => {
+      apis.${moduleName}.${businessName}Api.list(query).then((res: any) => {
+        res.data = handleTree(res.data, "${treeCode}")
+        resolve(res)
+      })
+    })
+  }
+</script>
+<template>
+  <div class="app-container">
+    <VbDataTable
+        ref="tableTreeRef"
+        :is-tree="true"
+        keyField="${treeCode}"
+        iconField="${treeName}"
+        parentField="${treeParentCode}"
+        childrenField="children"
+        :no-page="true"
+        :expand-depth="1"
+        :interval-left="10"
+        :check-multiple="false"
+        :has-checkbox="false"
+        :show-right-column-btn="false"
+        :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"
+        :modal="modalRef"
+        :reset-form-fun="opts.resetForm"
+        v-model:form-data="form"
+        v-model:query-params="queryParams"
+        :reset-search-form-fun="resetQuery"
+        :custom-search-fun="handleQuery">
+        #foreach($column in $columns)
+            #set($isNumber=$column.numColumn)
+            #set($javaField=$column.javaField)
+            #set($parentheseIndex=$column.columnComment.indexOf("("))
+            #if($parentheseIndex != -1)
+                #set($comment=$column.columnComment.substring(0, $parentheseIndex))
+            #else
+                #set($comment=$column.columnComment)
+            #end
+            #if($column.list && $column.htmlType == "imageUpload")
+              <template #${javaField}="{ row }">
+                <image-preview :src="row.${javaField}" :width="50" :height="50"/>
+              </template>
+            #elseif($column.list && $javaField.indexOf("Time")>0 && $javaField.indexOf(
+                "Time")==${javaField.length()} - 4)
+              <template #${javaField}="{ row }">
+                {{ dayjs(row.${javaField}).format("YYYY-MM-DD HH:mm:ss") }}
+              </template>
+            #elseif($column.list && $javaField.indexOf("Date")>0 && $javaField.indexOf(
+                "Date")==${javaField.length()} - 4)
+              <template #${javaField}="{ row }">
+                {{ dayjs(row.${javaField}).format("YYYY-MM-DD") }}
+              </template>
+            #elseif($column.list && $column.javaType == "Date")
+              <template #${javaField}="{ row }">
+                {{ dayjs(row.${javaField}).format("YYYY-MM-DD") }}
+              </template>
+            #elseif($column.list && "" != $column.dictType)
+              <template #${javaField}="{ row }">
+                  #if($column.htmlType == "checkbox")
+                    <DictTag type="${column.dictType}" :value-is-number="${isNumber}"
+                             :value="row.${javaField} ? row.${javaField}.split(',') : []"></DictTag>
+                  #else
+                    <DictTag type="${column.dictType}" :value-is-number="${isNumber}"
+                             :value="row.${javaField}"></DictTag>
+                  #end
+              </template>
+            #elseif($column.list && ($column.htmlType == "select" || $column.htmlType == "radio"))
+              <template #${javaField}="{ row }">
+                <VbTag :data="${javaField}Options" :value-is-number="${isNumber}" :value="row.${javaField}"></VbTag>
+              </template>
+            #elseif($column.list && ($column.htmlType == "checkbox"))
+              <template #${javaField}="{ row }">
+                <VbTag :data="${javaField}Options" :value-is-number="${isNumber}"
+                       :value="row.${javaField} ? row.${javaField}.split(',') : []"></VbTag>
+              </template>
+            #end
+        #end
+      <template #actions="{ row }">
+        <vb-tooltip content="新增" placement="top">
+          <el-button
+              link
+              type="primary"
+              @click="handleCreate(row)"
+              v-hasPermission="'${permissionPrefix}:add'">
+            <template #icon>
+              <VbIcon icon-name="plus-square" icon-type="duotone" class="fs-3"></VbIcon>
+            </template>
+          </el-button>
+        </vb-tooltip>
+        <vb-tooltip content="修改" placement="top">
+          <el-button
+              link
+              type="primary"
+              @click="handleUpdate(row)"
+              v-hasPermission="'${permissionPrefix}: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="'${permissionPrefix}: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>

+ 484 - 0
SERVER/VberAdminPlusV3/vber-modules/vber-generator/src/main/resources/vm/vue/view.vue.vm

@@ -0,0 +1,484 @@
+<script setup lang="ts" name="${BusinessName}">
+  import apis from "@a"
+      #set($hasDate=false)
+      #foreach ($column in $columns)
+          #if( $column.javaType == "Date")
+              #set($hasDate='import dayjs from "dayjs"')
+          #end
+      #end
+      #if ($hasDate)
+          $hasDate
+      #end
+      #foreach ($column in $columns)
+          #if( $column.dictType ==""&&($column.htmlType == "select" || $column.htmlType == "radio"|| $column.htmlType ==
+              "checkbox"))
+          const ${column.javaField}Options = computed(() => {
+            return [
+              {label: "请选择", value: ""},
+              {label: "", value: ""}
+            ]
+          })
+          #end
+      #end
+
+  const tableRef = ref()
+  const modalRef = ref()
+  const opts = reactive({
+    columns: [
+        #foreach ($column in $columns)
+            #set($field=$column.javaField)
+            #set($sort="false")
+            #if($column.sorted)
+                #set($sort="true")
+            #end
+            #set($parentheseIndex=$column.columnComment.indexOf("("))
+            #if($parentheseIndex != -1)
+                #set($comment=$column.columnComment.substring(0, $parentheseIndex))
+            #else
+                #set($comment=$column.columnComment)
+            #end
+            #if($column.pk)
+              {field: "$field", name: "$comment", width: 100, isSort: true, visible: false},
+            #elseif($column.list)
+                #if(($field.indexOf("Time")>0&&$field.indexOf("Time")==${field.length()} - 4)
+                ||($field.indexOf("Date")>0&&$field.indexOf("Date")==${field.length()} - 4))
+                  {field: "$field", name: "$comment", visible: true, isSort: $sort, width: 185},
+                #elseif($field=="remark")
+                  {field: "$field", name: "$comment", visible: true, isSort: $sort, tooltip: true},
+                #elseif($column.dictType)
+                  {field: "$field", name: "$comment", visible: true, isSort: $sort, width: 100},
+                #else
+                  {field: "$field", name: "$comment", visible: true, isSort: $sort, width: "auto"},
+                #end
+            #end
+        #end
+      {field: "actions", name: `操作`, width: 150},
+    ],
+    queryParams: {
+        #foreach ($column in $columns)
+            #set($field=$column.javaField)
+            #if($column.query)
+                #if($column.javaType == "Date" && $column.queryType == "BETWEEN")
+                    #set($AttrName=$field.substring(0,1).toUpperCase() + ${field.substring(1)})
+                  dateRange${AttrName}: undefined,
+                #else
+                        $field: undefined,
+                #end
+            #end
+        #end
+    },
+    searchFormItems: [
+        #foreach($column in $columns)
+            #set($isNumber=$column.numColumn)
+            #set($format="YYYY-MM-DD")
+            #set($field=$column.javaField)
+            #if($column.query)
+                #set($dictType=$column.dictType)
+                #set($AttrName=$field.substring(0,1).toUpperCase() + ${field.substring(1)})
+                #set($parentheseIndex=$column.columnComment.indexOf("("))
+                #if($parentheseIndex != -1)
+                    #set($comment=$column.columnComment.substring(0, $parentheseIndex))
+                #else
+                    #set($comment=$column.columnComment)
+                #end
+              {
+                  #if($column.javaType == "Date" && "BETWEEN" == $column.queryType)
+                    field: "dateRange${AttrName}",
+                  #else
+                    field: "${field}",
+                  #end
+                label: "${comment}",
+                class: "w-100",
+                required: false,
+                  #if($column.htmlType == "input")
+                    placeholder: "请输入${comment}",
+                    component: "I",
+                    listeners: {
+                      keyup: (e: KeyboardEvent) => {
+                        if (e.code == "Enter") {
+                          handleQuery()
+                        }
+                      },
+                    },
+                  #elseif($column.htmlType == "select"|| $column.htmlType == "radio")
+                      #if( "" != $dictType)
+                        component: "Dict",
+                        props: {
+                          placeholder: "请选择${comment}",
+                          dictType: "${dictType}",
+                          valueIsNumber: ${isNumber},
+                          type: "select",
+                        },
+                      #else
+                        component: "VS",
+                        placeholder: "请选择${comment}",
+                        data: () => ${field}Options.value,
+                        props: {
+                          valueIsNumber: ${isNumber},
+                          type: "select",
+                        },
+                      #end
+                  #elseif($column.javaType == "Date")
+                      #set($dateType="date")
+                      #if($field.indexOf("Time")>0&&$field.indexOf("Time")==${field.length()} - 4)
+                          #set($format="YYYY-MM-DD HH:mm:ss")
+                          #set($dateType="datetime")
+                      #elseif($field.indexOf("Date")>0&&$field.indexOf("Date")==${field.length()} - 4)
+                          #set($format="YYYY-MM-DD")
+                      #end
+                      #if( "BETWEEN" == $column.queryType)
+                        component: "D",
+                        placeholder: "请选择${comment}",
+                        props: {
+                          type: "${dateType}range",
+                          valueFormat: "${format}",
+                          rangeSeparator: "-",
+                          startPlaceholder: "开始日期",
+                          endPlaceholder: "结束日期",
+                        },
+                        listeners: {
+                          change: (v: any) => {
+                            queryParams.value.dateRange${AttrName} = v
+                          },
+                        },
+                        span: 5,
+                      #else
+                        component: "D",
+                        placeholder: "请选择${comment}",
+                        props: {
+                          type: "${dateType}",
+                          valueFormat: "${format}",
+                        },
+                      #end
+                  #end
+              },
+            #end
+        #end
+    ] as any,
+    permission: "${permissionPrefix}",
+    handleBtns: [],
+    handleFuns: {
+      handleUpdate: () => {
+        const row = tableRef.value.getSelected()
+        handleUpdate(row)
+      },
+      handleDelete: () => {
+        const rows = tableRef.value.getSelecteds()
+        handleDelete(rows)
+      },
+    },
+    customBtns: [],
+    tableListFun: apis.${moduleName}.${businessName}Api.list,
+    getEntityFun: apis.${moduleName}.${businessName}Api.get,
+    deleteEntityFun: apis.${moduleName}.${businessName}Api.del,
+    exportUrl: apis.${moduleName}.${businessName}Api.exportUrl,
+    exportName: "${BusinessName}",
+    modalTitle: "${functionName}",
+    formItems: [
+        #foreach($column in $columns)
+            #set($isNumber=$column.numColumn)
+            #set($format="YYYY-MM-DD")
+            #set($field=$column.javaField)
+            #if($column.insert && !$column.pk)
+                #if(($column.usableColumn) || (!$column.superColumn))
+                    #set($parentheseIndex=$column.columnComment.indexOf("("))
+                    #if($parentheseIndex != -1)
+                        #set($comment=$column.columnComment.substring(0, $parentheseIndex))
+                    #else
+                        #set($comment=$column.columnComment)
+                    #end
+                    #set($dictType=$column.dictType)
+                  {
+                    field: "${field}",
+                    label: "${comment}",
+                    class: "w-100",
+                      #if($column.required)
+                        required: true,
+                      #else
+                        required: false,
+                      #end
+                      #if($column.htmlType == "input")
+                        placeholder: "请输入${comment}",
+                        component: "I",
+                      #elseif($column.htmlType == "upload"||$column.htmlType == "image-upload")
+                        component: "VbUpload",
+                      #elseif($column.htmlType == "upload")
+                        component: "VbUpload",
+                        props: {
+                          uploadType: "file",
+                        },
+                      #elseif($column.htmlType == "summernote"||$column.htmlType == "editor")
+                        component: "VE",
+                        props: {
+                          minHeight: 192,
+                        },
+                      #elseif($column.htmlType == "select")
+                          #if( "" != $dictType)
+                            component: "Dict",
+                            props: {
+                              placeholder: "请选择${comment}",
+                              dictType: "${dictType}",
+                              type: "select",
+                              valueIsNumber: ${isNumber},
+                            },
+                          #else
+                            component: "VS",
+                            placeholder: "请选择${comment}",
+                            data: () => ${field}Options.value,
+                            props: {
+                              type: "select",
+                              valueIsNumber: ${isNumber},
+                            },
+                          #end
+                      #elseif($column.htmlType == "checkbox")
+                          #if( "" != $dictType)
+                            component: "Dict",
+                            props: {
+                              dictType: "${dictType}",
+                              type: "checkbox",
+                              valueIsNumber: ${isNumber},
+                            },
+                          #else
+                            component: "VS",
+                            data: () => ${field}Options.value,
+                            props: {
+                              type: "checkbox",
+                              valueIsNumber: ${isNumber},
+                            },
+                          #end
+                      #elseif($column.htmlType == "radio")
+                          #if( "" != $dictType)
+                            component: "Dict",
+                            props: {
+                              dictType: "${dictType}",
+                              type: "radio",
+                              valueIsNumber: ${isNumber},
+                            },
+                          #else
+                            component: "VS",
+                            data: () => ${field}Options.value,
+                            props: {
+                              type: "radio",
+                              valueIsNumber: ${isNumber},
+                            },
+                          #end
+                      #elseif($column.javaType == "Date")
+                          #set($dateType="date")
+                          #if($field.indexOf("Time")>0&&$field.indexOf("Time")==${field.length()} - 4)
+                              #set($format="YYYY-MM-DD HH:mm:ss")
+                              #set($dateType="datetime")
+                          #elseif($field.indexOf("Date")>0&&$field.indexOf("Date")==${field.length()} - 4)
+                              #set($format="YYYY-MM-DD")
+                          #end
+                        component: "D",
+                        props: {
+                          placeholder: "请选择${comment}",
+                          type: "$dateType",
+                          valueFormat: "${format}",
+                        },
+                      #elseif($column.htmlType == "textarea")
+                        placeholder: "请输入${comment}",
+                        component: "I",
+                        props: {
+                          type: "textarea",
+                          rows: 5,
+                        },
+                      #end
+                  },
+                #end
+            #end
+        #end
+    ] as any,
+    resetForm: () => {
+      form.value = emptyFormData.value
+    },
+    labelWidth: "80px",
+    emptyFormData: {
+        #foreach($column in $columns)
+            #set($field=$column.javaField)
+            #if($column.pk)
+                    $field: undefined,
+            #elseif($column.insert)
+                #if(($column.usableColumn) || (!$column.superColumn))
+                        $field: undefined,
+                #end
+            #end
+        #end
+    },
+  });
+  const {queryParams, emptyFormData} = toRefs(opts)
+  const form = ref<any>(emptyFormData.value)
+
+  /** 搜索按钮操作 */
+  function handleQuery(query?: any) {
+    query = query || tableRef.value?.getQueryParams() || queryParams.value
+      #foreach ($column in $columns)
+          #set($field=$column.javaField)
+          #if($column.javaType == "Date" && $column.queryType == "BETWEEN")
+              #set($AttrName=$field.substring(0,1).toUpperCase() + ${field.substring(1)})
+              #if($AttrName=="CreateTime")
+                addDateRange(query, query.dateRange${AttrName})
+              #else
+                addDateRange(query, query.dateRange${AttrName}, "${AttrName}")
+              #end
+          #end
+      #end
+    tableRef.value?.query(query)
+  }
+
+  /** 重置按钮操作 */
+  function resetQuery(query?: any) {
+    query = query || tableRef.value?.getQueryParams() || queryParams.value
+      #foreach ($column in $columns)
+          #set($field=$column.javaField)
+          #if($column.javaType == "Date" && $column.queryType == "BETWEEN")
+              #set($AttrName=$field.substring(0,1).toUpperCase() + ${field.substring(1)})
+            query.dateRange${AttrName} = [] as any
+              #if($AttrName=="CreateTime")
+                addDateRange(query, query.dateRange${AttrName})
+              #else
+                addDateRange(query, query.dateRange${AttrName}, "${AttrName}")
+              #end
+          #else
+          #end
+      #end
+    //
+  }
+
+  /** 修改按钮操作 */
+  function handleUpdate(row: any) {
+    tableRef.value.defaultHandleFuns.handleUpdate("", row)
+      #foreach ($column in $columns)
+          #set($field=$column.javaField)
+          #if($column.htmlType == "checkbox")
+            form.value.$field = form.value.${field}.split(",");
+          #end
+      #end
+  }
+
+  /** 删除按钮操作 */
+  function handleDelete(rows: any[]) {
+    tableRef.value.defaultHandleFuns.handleDelete("", rows)
+  }
+
+  /** 提交按钮 */
+  function submitForm() {
+      #foreach ($column in $columns)
+          #set($field=$column.javaField)
+          #if($column.htmlType == "checkbox")
+            form.value.$field = form.value.${field}.join(",");
+          #end
+      #end
+      #if($table.sub)
+        form.value.${subclassName}List = ${subclassName}List.value;
+      #end
+    apis.${moduleName}.${businessName}Api.addOrUpdate(form.value).then(() => {
+      handleQuery()
+    });
+  }
+
+</script>
+<template>
+  <div class="app-container">
+    <VbDataTable
+        ref="tableRef"
+        keyField="$pkColumn.javaField"
+        :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">
+        #foreach($column in $columns)
+            #set($isNumber=$column.numColumn)
+            #set($field=$column.javaField)
+            #set($parentheseIndex=$column.columnComment.indexOf("("))
+            #if($parentheseIndex != -1)
+                #set($comment=$column.columnComment.substring(0, $parentheseIndex))
+            #else
+                #set($comment=$column.columnComment)
+            #end
+            #if($column.list && $column.htmlType == "imageUpload")
+              <template #${field}="{ row }">
+                <image-preview :src="row.${field}" :width="50" :height="50"/>
+              </template>
+            #elseif($column.list && $field.indexOf("Time")>0 && $field.indexOf("Time")==${field.length()} - 4)
+              <template #${field}="{ row }">
+                {{ dayjs(row.${field}).format("YYYY-MM-DD HH:mm:ss") }}
+              </template>
+            #elseif($column.list && $field.indexOf("Date")>0 && $field.indexOf("Date")==${field.length()} - 4)
+              <template #${field}="{ row }">
+                {{ dayjs(row.${field}).format("YYYY-MM-DD") }}
+              </template>
+            #elseif($column.list && $column.javaType == "Date")
+              <template #${field}="{ row }">
+                {{ dayjs(row.${field}).format("YYYY-MM-DD") }}
+              </template>
+            #elseif($column.list && "" != $column.dictType)
+              <template #${field}="{ row }">
+                  #if($column.htmlType == "checkbox")
+                    <DictTag type="${column.dictType}" :value-is-number="${isNumber}"
+                             :value="row.${field} ? row.${field}.split(',') : []"></DictTag>
+                  #else
+                    <DictTag type="${column.dictType}" :value-is-number="${isNumber}" :value="row.${field}"></DictTag>
+                  #end
+              </template>
+            #elseif($column.list && ($column.htmlType == "select" || $column.htmlType == "radio"))
+              <template #${field}="{ row }">
+                <VbTag :data="${field}Options" :value-is-number="${isNumber}" :value="row.${field}"></VbTag>
+              </template>
+            #elseif($column.list && ($column.htmlType == "checkbox"))
+              <template #${field}="{ row }">
+                <VbTag :data="${field}Options" :value-is-number="${isNumber}"
+                       :value="row.${field} ? row.${field}.split(',') : []"></VbTag>
+              </template>
+            #end
+        #end
+      <template #actions="{ row }">
+        <vb-tooltip content="修改" placement="top">
+          <el-button
+              link
+              type="primary"
+              @click="handleUpdate(row)"
+              v-hasPermission="'${permissionPrefix}: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="'${permissionPrefix}: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>

+ 0 - 26
SERVER/VberAdminPlusV3/vber-modules/vber-job/.flattened-pom.xml

@@ -1,26 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<project xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
-         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">
-    <modelVersion>4.0.0</modelVersion>
-    <parent>
-        <groupId>com.vap</groupId>
-        <artifactId>vber-modules</artifactId>
-        <version>3.0.0</version>
-    </parent>
-    <groupId>com.vap</groupId>
-    <artifactId>vber-job</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-job</artifactId>
-        </dependency>
-    </dependencies>
-</project>

+ 0 - 78
SERVER/VberAdminPlusV3/vber-modules/vber-system/.flattened-pom.xml

@@ -1,78 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<project xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
-         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">
-    <modelVersion>4.0.0</modelVersion>
-    <parent>
-        <groupId>com.vap</groupId>
-        <artifactId>vber-modules</artifactId>
-        <version>3.0.0</version>
-    </parent>
-    <groupId>com.vap</groupId>
-    <artifactId>vber-system</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-doc</artifactId>
-        </dependency>
-        <dependency>
-            <groupId>com.vap</groupId>
-            <artifactId>vber-common-mybatis</artifactId>
-        </dependency>
-        <dependency>
-            <groupId>com.vap</groupId>
-            <artifactId>vber-common-translation</artifactId>
-        </dependency>
-        <dependency>
-            <groupId>com.vap</groupId>
-            <artifactId>vber-common-oss</artifactId>
-        </dependency>
-        <dependency>
-            <groupId>com.vap</groupId>
-            <artifactId>vber-common-log</artifactId>
-        </dependency>
-        <dependency>
-            <groupId>com.vap</groupId>
-            <artifactId>vber-common-mail</artifactId>
-        </dependency>
-        <dependency>
-            <groupId>com.vap</groupId>
-            <artifactId>vber-common-excel</artifactId>
-        </dependency>
-        <dependency>
-            <groupId>com.vap</groupId>
-            <artifactId>vber-common-sms</artifactId>
-        </dependency>
-        <dependency>
-            <groupId>com.vap</groupId>
-            <artifactId>vber-common-tenant</artifactId>
-        </dependency>
-        <dependency>
-            <groupId>com.vap</groupId>
-            <artifactId>vber-common-security</artifactId>
-        </dependency>
-        <dependency>
-            <groupId>com.vap</groupId>
-            <artifactId>vber-common-web</artifactId>
-        </dependency>
-        <dependency>
-            <groupId>com.vap</groupId>
-            <artifactId>vber-common-idempotent</artifactId>
-        </dependency>
-        <dependency>
-            <groupId>com.vap</groupId>
-            <artifactId>vber-common-encrypt</artifactId>
-        </dependency>
-        <dependency>
-            <groupId>com.vap</groupId>
-            <artifactId>vber-common-websocket</artifactId>
-        </dependency>
-    </dependencies>
-</project>

+ 2 - 2
SERVER/VberAdminPlusV3/vber-modules/vber-system/src/main/java/com/vber/system/service/impl/SysOssConfigServiceImpl.java

@@ -6,8 +6,6 @@ import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
 import com.baomidou.mybatisplus.core.toolkit.Wrappers;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
-import lombok.RequiredArgsConstructor;
-import lombok.extern.slf4j.Slf4j;
 import com.vber.common.core.constant.CacheNames;
 import com.vber.common.core.exception.ServiceException;
 import com.vber.common.core.utils.MapstructUtils;
@@ -23,6 +21,8 @@ import com.vber.system.domain.bo.SysOssConfigBo;
 import com.vber.system.domain.vo.SysOssConfigVo;
 import com.vber.system.mapper.SysOssConfigMapper;
 import com.vber.system.service.ISysOssConfigService;
+import lombok.RequiredArgsConstructor;
+import lombok.extern.slf4j.Slf4j;
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
 

+ 7 - 0
SERVER/VberAdminPlusV3/vber-modules/vber-system/src/main/resources/mapper/system/TeDemoMapper.xml

@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE mapper
+        PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
+        "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.vber.demo.mapper.TeDemoMapper">
+
+</mapper>

+ 7 - 0
SERVER/VberAdminPlusV3/vber-modules/vber-system/src/main/resources/mapper/system/TestOssMapper.xml

@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE mapper
+        PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
+        "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.vber.demo.mapper.TestOssMapper">
+
+</mapper>

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

@@ -1,17 +1,20 @@
 import Login from "./_login"
 import system, { type ISystemApi } from "./system"
 import monitor, { type IMonitorApi } from "./monitor"
+import tool, { type IToolApi } from "./tool"
 
 export interface IAppApi {
 	loginApi: Login
 	system: ISystemApi
 	monitor: IMonitorApi
+	tool: IToolApi
 }
 
 export const apis: IAppApi = {
 	loginApi: new Login(),
 	system,
-	monitor
+	monitor,
+	tool
 }
 
 export default apis

+ 11 - 2
UI/VAP_V3.VUE/src/api/system/_dict.ts

@@ -13,6 +13,15 @@ class dictApi {
 		})
 	}
 
+	// 查询字典类型
+	getTypes = () => {
+		return Rs.get({
+			url: "/system/dict/type/list",
+			params: { pageSize: 10000 },
+			loading: false
+		})
+	}
+
 	// 查询字典类型详细
 	getType = (dictId: string) => {
 		return Rs.get({
@@ -51,9 +60,9 @@ class dictApi {
 	}
 
 	// 获取字典选择框列表
-	optionselect = () => {
+	optionSelect = () => {
 		return Rs.get({
-			url: "/system/dict/type/optionselect"
+			url: "/system/dict/type/optionSelect"
 		})
 	}
 

+ 91 - 0
UI/VAP_V3.VUE/src/api/tool/_gen.ts

@@ -0,0 +1,91 @@
+import Rs from "@@/services/RequestService"
+class genApi {
+	// 查询生成表数据
+	listTable = (query: any) => {
+		return Rs.get({
+			url: "/tool/gen/list",
+			params: query,
+			loading: false
+		})
+	}
+
+	// 查询db数据库列表
+	listDbTable = (query: any) => {
+		return Rs.get({
+			url: "/tool/gen/db/list",
+			params: query,
+			loading: false
+		})
+	}
+
+	// 导入表
+	importTable = (data: { tables: string; dataName: string }) => {
+		return Rs.post({
+			url: "/tool/gen/importTable",
+			params: data
+		})
+	}
+
+	// 查询表详细信息
+	getGenTable = (tableId: string | number) => {
+		return Rs.get({
+			url: "/tool/gen/" + tableId
+		})
+	}
+
+	// 查询表详细信息
+	updateGenTable = (data: any) => {
+		return Rs.put({
+			url: "/tool/gen",
+			data
+		})
+	}
+
+	// 查询表详细信息
+	delTable = (tableId: string | number | Array<string | number>) => {
+		return Rs.del({
+			url: "/tool/gen/" + tableId
+		})
+	}
+
+	// 预览生成代码
+	previewTable = (tableId: string | number) => {
+		return Rs.get({
+			url: "/tool/gen/preview/" + tableId
+		})
+	}
+
+	// 生成代码(自定义路径)
+	genCode = (tableId: string | number) => {
+		return Rs.get({
+			url: "/tool/gen/genCode/" + tableId
+		})
+	}
+
+	downloadCode = (tableId: string | number) => {
+		return Rs.get("/tool/gen/download/" + tableId)
+	}
+
+	// 生成菜单
+	genMenu = (tableId: string | number) => {
+		return Rs.get({
+			url: "/tool/gen/genMenu/" + tableId
+		})
+	}
+
+	// 生成代码(自定义路径)
+	syncDb = (tableId: string | number) => {
+		return Rs.get({
+			url: "/tool/gen/syncDb/" + tableId
+		})
+	}
+
+	// 获取数据源名称
+	getDataNames = () => {
+		return Rs.get({
+			url: "/tool/gen/getDataNames"
+		})
+	}
+}
+
+export default genApi

+ 11 - 0
UI/VAP_V3.VUE/src/api/tool/index.ts

@@ -0,0 +1,11 @@
+import Gen from "./_gen"
+
+export interface IToolApi {
+	genApi: Gen
+}
+
+export const apis: IToolApi = {
+	genApi: new Gen()
+}
+
+export default apis

+ 0 - 1
UI/VAP_V3.VUE/src/components/select/VbSelect.vue

@@ -62,7 +62,6 @@ const options = computed(() => {
 function onChange(v: any) {
 	emits("update:modelValue", v)
 	emits("change", v)
-	console.log("---1", v)
 	return v
 }
 function onChange2(v: any[]) {

+ 42 - 31
UI/VAP_V3.VUE/src/core/services/RequestService.ts

@@ -207,7 +207,7 @@ Rs.interceptors.response.use(
 		}
 	},
 	async (error) => {
-		if (error.config.loading) {
+		if (error.config && error.config.loading) {
 			msgUtil.closeLoading()
 		}
 		let { message } = error
@@ -230,37 +230,48 @@ export function download(url: string, params: any, filename: string, config?: an
 		text: "正在下载数据,请稍候",
 		background: "rgba(0, 0, 0, 0.7)"
 	})
-	return Rs.post(url, params, {
-		transformRequest: [
-			(params) => {
-				return tansParams(params)
-			}
-		],
-		headers: { "Content-Type": "application/x-www-form-urlencoded" },
-		responseType: "blob",
-		...config
-	})
-		.then(async (data: any) => {
-			const isBlob = blobValidate(data)
-			if (isBlob) {
-				const blob = new Blob([data])
-				saveAs(blob, filename)
-			} else {
-				const resText = await data.text()
-				const rspObj = JSON.parse(resText)
-				const errMsg = errorCode[rspObj.code] || rspObj.msg || errorCode.default
-				msgUtil.msgError(errMsg)
-			}
-			// downloadLoadingInstance.close()
-		})
-		.catch((r) => {
-			console.error(r)
-			msgUtil.msgError("下载文件出现错误,请联系管理员!")
-			// downloadLoadingInstance.close()
-		})
-		.finally(() => {
-			downloadLoadingInstance?.close()
+	return new Promise((resolve, reject) => {
+		Rs.request({
+			url,
+			params,
+			transformRequest: [
+				(params) => {
+					if (params && typeof params === "object" && params.length > 0) {
+						return tansParams(params)
+					} else {
+						return params
+					}
+				}
+			],
+			headers: { "Content-Type": "application/x-www-form-urlencoded" },
+			responseType: "blob",
+			...config
 		})
+			.then(async (data: any) => {
+				const isBlob = blobValidate(data)
+				if (isBlob) {
+					const blob = new Blob([data])
+					saveAs(blob, filename)
+					resolve(true)
+				} else {
+					const resText = await data.text()
+					const rspObj = JSON.parse(resText)
+					const errMsg = errorCode[rspObj.code] || rspObj.msg || errorCode.default
+					msgUtil.msgError(errMsg)
+					reject(errMsg)
+				}
+				// downloadLoadingInstance.close()
+			})
+			.catch((r) => {
+				console.error(r)
+				msgUtil.msgError("下载文件出现错误,请联系管理员!")
+				reject(false)
+				// downloadLoadingInstance.close()
+			})
+			.finally(() => {
+				downloadLoadingInstance?.close()
+			})
+	})
 }
 
 export function request(config: RawAxiosRequestConfig): Promise<AxiosResponse> {

+ 69 - 0
UI/VAP_V3.VUE/src/views/tool/gen/_EditTable.vue

@@ -0,0 +1,69 @@
+<script setup lang="ts">
+import apis from "@a"
+import BaseForm from "./__BaseForm.vue"
+import FieldTable from "./__FieldTable.vue"
+//import GenForm from "./__GenForm.vue"
+
+const props = defineProps<{ data: any }>()
+const { data } = toRefs(props)
+
+const baseFormRef = ref()
+//const genFormRef = ref()
+const activeName = ref("field")
+function activeTab(tab: string) {
+	activeName.value = tab
+}
+
+function submit() {
+	return Promise.all([
+		baseFormRef.value?.validateForm()
+		//genFormRef.value?.validateForm()
+	]).then((res) => {
+		if (res.every((item) => item == "")) {
+			console.log("DATA", data.value)
+			const genTable = Object.assign({}, data.value)
+			genTable.params = {
+				parentMenuId: data.value.parentMenuId
+			}
+			if (data.value.tplCategory == "tree") {
+				genTable.params.treeCode = data.value.treeCode
+				genTable.params.treeName = data.value.treeName
+				genTable.params.treeParentCode = data.value.treeParentCode
+			}
+			delete genTable.treeCode
+			delete genTable.treeName
+			delete genTable.treeParentCode
+			delete genTable.parentMenuId
+			delete genTable.menuIds
+			delete genTable.parentMenuName
+			return apis.tool.genApi.updateGenTable(genTable)
+		}
+	})
+}
+
+watch(
+	() => props.data,
+	() => {
+		activeName.value = "field"
+		baseFormRef.value?.resetForm()
+		//genFormRef.value?.resetForm()
+	}
+)
+defineExpose({
+	activeTab,
+	submit
+})
+</script>
+<template>
+	<el-tabs v-model="activeName">
+		<el-tab-pane label="基本信息" name="base">
+			<BaseForm ref="baseFormRef" v-model="data"></BaseForm>
+		</el-tab-pane>
+		<el-tab-pane label="字段信息" name="field">
+			<FieldTable v-model="data.columns"></FieldTable>
+		</el-tab-pane>
+		<!-- <el-tab-pane label="生成信息" name="gen">
+			<GenForm ref="genFormRef" v-model="data"></GenForm>
+		</el-tab-pane> -->
+	</el-tabs>
+</template>

+ 146 - 0
UI/VAP_V3.VUE/src/views/tool/gen/_ImportTable.vue

@@ -0,0 +1,146 @@
+<script setup lang="ts">
+import apis from "@a"
+import dayjs from "dayjs"
+
+const dtSourceOptions = ref<any>([])
+
+const tableRef = ref()
+const modalRef = ref()
+
+const opts = reactive<any>({
+	columns: [
+		{ field: "tableName", name: `表名称` },
+		{ field: "tableComment", name: `表描述`, visible: false },
+		{ field: "createdAt", name: `创建时间`, width: 185 },
+		{ field: "updatedAt", name: `更新时间`, width: 185 }
+	],
+	queryParams: {
+		dataName: undefined,
+		tableName: undefined
+	},
+	searchFormItems: [
+		{
+			field: "dataName",
+			label: "数据源",
+			placeholder: "请选择数据源",
+			required: false,
+			component: "VS",
+			data: () => dtSourceOptions.value,
+			span: 8
+		},
+		{
+			field: "tableName",
+			label: "表名称",
+			placeholder: "请输入表名称",
+			required: false,
+			listeners: {
+				keyup: (e: KeyboardEvent) => {
+					if (e.code == "Enter") {
+						handleQuery()
+					}
+				}
+			},
+			span: 8
+		}
+	],
+	permission: "",
+	handleFuns: {},
+	customBtns: [],
+	tableListFun: apis.tool.genApi.listDbTable,
+	modalTitle: "表",
+	resetForm: () => {
+		form.value = emptyFormData.value
+	},
+	emptyFormData: {
+		tableName: undefined,
+		tableComment: undefined,
+		className: undefined,
+		sort: 0,
+		status: 2,
+		remark: undefined
+	}
+})
+const { queryParams, emptyFormData } = toRefs(opts)
+const form = ref<any>(emptyFormData.value)
+
+/** 查询按钮 */
+function handleQuery(query?: any) {
+	query = query || tableRef.value?.getQueryParams() || queryParams.value
+	tableRef.value?.query(query)
+}
+/** 查询重置按钮 */
+function resetQuery() {}
+
+function handleImport() {
+	const tables = tableRef.value.getSelectedIds()
+	if (tables.length === 0) {
+		message.msgError("请选择要导入的表")
+		return
+	}
+	if (!queryParams.value.dataName) {
+		message.msgError("请选择数据源")
+		return
+	}
+	return apis.tool.genApi.importTable({
+		tables: tables.join(","),
+		dataName: queryParams.value.dataName
+	})
+}
+
+function init() {
+	apis.tool.genApi.getDataNames().then((res: any) => {
+		dtSourceOptions.value = res.data.map((item: any) => {
+			if (item === "master") {
+				queryParams.value.dataName = item
+			}
+			return {
+				label: item,
+				value: item
+			}
+		})
+		if (!queryParams.value.dataName) {
+			queryParams.value.dataName = res.data[0]
+		}
+	})
+}
+
+onMounted(init)
+
+defineExpose({
+	handleQuery,
+	handleImport
+})
+</script>
+
+<template>
+	<div class="app-container">
+		<VbDataTable
+			ref="tableRef"
+			:handle-perm="opts.permission"
+			:handle-funs="opts.handleFuns"
+			:search-form-items="opts.searchFormItems"
+			:page-size="5"
+			:page-size-array="[5, 10, 15]"
+			:columns="opts.columns"
+			:custom-btns="opts.customBtns"
+			:remote-fun="opts.tableListFun"
+			:modal="modalRef"
+			:reset-form-fun="opts.resetForm"
+			v-model:form-data="form"
+			v-model:query-params="queryParams"
+			:check-multiple="true"
+			:has-checkbox="true"
+			:auto-search="false"
+			:init-search="false"
+			:reset-search-form-fun="resetQuery"
+			:custom-search-fun="handleQuery"
+			table-box-height="50vh">
+			<template #createdAt="{ row }">
+				{{ dayjs(row.createdAt).format("YYYY-MM-DD HH:mm:ss") }}
+			</template>
+			<template #updatedAt="{ row }">
+				{{ dayjs(row.updatedAt).format("YYYY-MM-DD HH:mm:ss") }}
+			</template>
+		</VbDataTable>
+	</div>
+</template>

+ 308 - 0
UI/VAP_V3.VUE/src/views/tool/gen/__BaseForm.vue

@@ -0,0 +1,308 @@
+<script setup lang="ts">
+import apis from "@a"
+
+const props = withDefaults(defineProps<{ modelValue: any }>(), {})
+const emits = defineEmits<{ (e: "update:modelValue", v: any): void }>()
+const { modelValue: data } = toRefs(props)
+
+const menuOptions = ref([])
+
+const formRef = ref()
+const rules = {
+	tplCategory: [{ required: true, message: "请选择生成模板", trigger: "blur" }],
+	tableName: [
+		{ required: true, message: "请输入表名称", trigger: "blur" },
+		{ pattern: /^[a-z\._]*$/g, trigger: "blur", message: "只允许小写字母,例如 sys_demo 格式" }
+	],
+	tableComment: [{ required: true, message: "请输入菜单名称", trigger: "blur" }],
+	className: [
+		{ required: true, message: "请输入模型名称", trigger: "blur" },
+		{
+			pattern: /^[A-Z][A-z0-9]*$/g,
+			trigger: "blur",
+			message: "必须以大写字母开头,例如 SysDemo 格式"
+		}
+	],
+	functionAuthor: [
+		{ required: true, message: "请输入作者", trigger: "blur" },
+		{ pattern: /^[A-Za-z]+$/, trigger: "blur", message: "校验规则:  只允许输入字母 a-z 或大写 A-Z" }
+	],
+	packageName: [
+		{ required: true, message: "请输入生成包路径", trigger: "blur" },
+		{ pattern: /^[a-z.]*$/g, trigger: "blur", message: "只允许小写字母,例如 system 格式" }
+	],
+	moduleName: [
+		{ required: true, message: "请输入生成模块名", trigger: "blur" },
+		{ pattern: /^[a-z\-]*[a-z]$/g, trigger: "blur", message: "只允许小写字母,例如 sys-demo 格式" }
+	],
+	businessName: [
+		{ required: true, message: "请输入生成业务名", trigger: "blur" },
+		{
+			pattern: /^[a-z][A-Za-z]+$/,
+			trigger: "blur",
+			message: "校验规则:  只允许输入字母 a-z 或大写 A-Z ,并且小写字母开头"
+		}
+	],
+	functionName: [{ required: true, message: "请输入生成功能名", trigger: "blur" }]
+}
+function resetForm() {
+	formRef.value.resetFields()
+}
+function validateForm() {
+	return new Promise((resolve, reject) => {
+		formRef.value.validate((res) => {
+			if (res) {
+				resolve("")
+			} else {
+				reject("base")
+			}
+		})
+	})
+}
+
+function onTplSelectChange() {}
+
+function init() {
+	apis.system.menuApi.listMenu({}).then((res: any) => {
+		res.data = res.data.map((v: any) => {
+			v.menuId = v.menuId + ""
+			return v
+		})
+		menuOptions.value = handleTree(res.data, "menuId")
+	})
+}
+onMounted(init)
+defineExpose({ resetForm, validateForm })
+</script>
+<template>
+	<el-form
+		style="width: 900px; margin: 5px auto 0"
+		ref="formRef"
+		:model="data"
+		:rules="rules"
+		size="large"
+		label-position="top">
+		<el-row :gutter="20">
+			<el-col :span="8">
+				<el-form-item prop="tableName">
+					<template #label>
+						<vb-tooltip content="数据库表名称⚠️这里必须是蛇形结构" placement="top">
+							<span class="bi bi-question-circle-fill text-muted"></span>
+						</vb-tooltip>
+						<span class="ms-2 fw-bold text-dark">数据表名称 tableName</span>
+					</template>
+					<el-input v-model="data.tableName" placeholder="请输入表名称" />
+				</el-form-item>
+			</el-col>
+			<el-col :span="8">
+				<el-form-item prop="tplCategory" w>
+					<template #label>生成模板</template>
+					<el-select v-model="data.tplCategory" @change="onTplSelectChange" class="w-100">
+						<el-option label="单表(增删改查)" value="crud" />
+						<el-option label="树表(增删改查)" value="tree" />
+					</el-select>
+				</el-form-item>
+			</el-col>
+			<el-col :span="8">
+				<el-form-item>
+					<template #label>
+						上级菜单
+						<el-tooltip content="分配到指定菜单下,例如 系统管理" placement="top">
+							<el-icon><question-filled /></el-icon>
+						</el-tooltip>
+					</template>
+					<el-tree-select
+						v-model="data.parentMenuId"
+						class="w-100"
+						:data="menuOptions"
+						:props="{ value: 'menuId', label: 'menuName', children: 'children' }"
+						value-key="menuId"
+						node-key="menuId"
+						placeholder="选择上级菜单"
+						check-strictly
+						filterable
+						clearable
+						highlight-current />
+				</el-form-item>
+			</el-col>
+			<el-col :span="8">
+				<el-form-item prop="className">
+					<template #label>
+						<span class="ms-2 fw-bold text-dark">实体类名称 className</span>
+					</template>
+					<el-input v-model="data.className" placeholder="请输入" />
+				</el-form-item>
+			</el-col>
+			<el-col :span="8">
+				<el-form-item prop="tableComment">
+					<template #label>
+						<vb-tooltip content="同步的数据库表名称,生成配置数据时,用作菜单名称" placement="top">
+							<span class="bi bi-question-circle-fill text-muted"></span>
+						</vb-tooltip>
+						<span class="ms-2 fw-bold text-dark">菜单名称 tableComment</span>
+					</template>
+					<el-input v-model="data.tableComment" placeholder="请输入菜单名称" />
+				</el-form-item>
+			</el-col>
+			<el-col :span="8">
+				<el-form-item prop="packageName">
+					<template #label>
+						<vb-tooltip content="生成在哪个java包下,例如 com.vber.system" placement="top">
+							<span class="bi bi-question-circle-fill text-muted"></span>
+						</vb-tooltip>
+						<span class="ms-2 fw-bold text-dark">包路径 packageName</span>
+					</template>
+					<el-input v-model="data.packageName" />
+				</el-form-item>
+			</el-col>
+			<el-col :span="8">
+				<el-form-item prop="moduleName">
+					<template #label>
+						<vb-tooltip content="可理解为子系统名,例如 system" placement="top">
+							<span class="bi bi-question-circle-fill text-muted"></span>
+						</vb-tooltip>
+						<span class="ms-2 fw-bold text-dark">模块名 moduleName</span>
+					</template>
+					<el-input v-model="data.moduleName" />
+				</el-form-item>
+			</el-col>
+			<el-col :span="8">
+				<el-form-item prop="businessName">
+					<template #label>
+						<vb-tooltip
+							content="业务模块名称,例如 user [apis.{moduleName}.{businessName}Api.list{BusinessName}]"
+							placement="top">
+							<span class="bi bi-question-circle-fill text-muted"></span>
+						</vb-tooltip>
+						<span class="ms-2 fw-bold text-dark">业务模块名称 businessName</span>
+					</template>
+					<el-input v-model="data.businessName" />
+				</el-form-item>
+			</el-col>
+			<el-col :span="8">
+				<el-form-item prop="functionName">
+					<template #label>
+						<vb-tooltip content="业务模块描述,例如:用户" placement="top">
+							<span class="bi bi-question-circle-fill text-muted"></span>
+						</vb-tooltip>
+						<span class="ms-2 fw-bold text-dark">业务模块描述 functionName</span>
+					</template>
+					<el-input v-model="data.functionName" />
+				</el-form-item>
+			</el-col>
+		</el-row>
+		<!-- <el-col :span="8">
+			<el-form-item label="" prop="functionAuthor">
+				<template #label>
+					<span class="ms-2 fw-bold text-dark">作者</span>
+				</template>
+				<el-input v-model="data.functionAuthor" placeholder="请输入作者名称" />
+			</el-form-item>
+		</el-col> -->
+		<el-row :gutter="20">
+			<el-col :span="8">
+				<el-form-item prop="genType">
+					<template #label>
+						生成代码方式
+						<el-tooltip content="默认为zip压缩包下载,也可以自定义生成路径" placement="top">
+							<el-icon><question-filled /></el-icon>
+						</el-tooltip>
+					</template>
+					<el-radio v-model="data.genType" label="0">zip压缩包</el-radio>
+					<el-radio v-model="data.genType" label="1">自定义路径</el-radio>
+				</el-form-item>
+			</el-col>
+			<el-col :span="16" v-if="data.genType == '1'">
+				<el-form-item prop="genPath">
+					<template #label>
+						自定义路径
+						<el-tooltip content="填写磁盘绝对路径,若不填写,则生成到当前Web项目下" placement="top">
+							<el-icon><question-filled /></el-icon>
+						</el-tooltip>
+					</template>
+					<el-input v-model="data.genPath">
+						<template #append>
+							<el-dropdown>
+								<el-button type="primary">
+									路径快速选择
+									<i class="el-icon-arrow-down el-icon--right"></i>
+								</el-button>
+								<template #dropdown>
+									<el-dropdown-menu>
+										<el-dropdown-item @click="data.genPath = '/'">生成项目文件中</el-dropdown-item>
+										<el-dropdown-item @click="data.genPath = 'D:/Gen'">D盘Gen目录</el-dropdown-item>
+									</el-dropdown-menu>
+								</template>
+							</el-dropdown>
+						</template>
+					</el-input>
+				</el-form-item>
+			</el-col>
+		</el-row>
+		<template v-if="data.tplCategory == 'tree'">
+			<el-row :gutter="20">
+				<el-col :span="8">
+					<el-form-item>
+						<template #label>
+							树编码字段
+							<el-tooltip content="树显示的编码字段名, 如:dept_id" placement="top">
+								<el-icon><question-filled /></el-icon>
+							</el-tooltip>
+						</template>
+						<el-select v-model="data.treeCode" class="w-100" placeholder="请选择">
+							<el-option
+								v-for="(column, index) in data.columns"
+								:key="index"
+								:label="column.columnName + ':' + column.columnComment"
+								:value="column.columnName"></el-option>
+						</el-select>
+					</el-form-item>
+				</el-col>
+				<el-col :span="8">
+					<el-form-item>
+						<template #label>
+							树父编码字段
+							<el-tooltip content="树显示的父编码字段名, 如:parent_Id" placement="top">
+								<el-icon><question-filled /></el-icon>
+							</el-tooltip>
+						</template>
+						<el-select v-model="data.treeParentCode" class="w-100" placeholder="请选择">
+							<el-option
+								v-for="(column, index) in data.columns"
+								:key="index"
+								:label="column.columnName + ':' + column.columnComment"
+								:value="column.columnName"></el-option>
+						</el-select>
+					</el-form-item>
+				</el-col>
+				<el-col :span="8">
+					<el-form-item>
+						<template #label>
+							树名称字段
+							<el-tooltip content="树节点的显示名称字段名, 如:org_name" placement="top">
+								<el-icon><question-filled /></el-icon>
+							</el-tooltip>
+						</template>
+						<el-select v-model="data.treeName" class="w-100" placeholder="请选择">
+							<el-option
+								v-for="(column, index) in data.columns"
+								:key="index"
+								:label="column.columnName + ':' + column.columnComment"
+								:value="column.columnName"></el-option>
+						</el-select>
+					</el-form-item>
+				</el-col>
+			</el-row>
+		</template>
+		<el-row :gutter="20">
+			<el-col :span="24">
+				<el-form-item label="" prop="remark">
+					<template #label>
+						<span class="ms-2 fw-bold text-dark">备注</span>
+					</template>
+					<el-input v-model="data.remark" type="textarea" :rows="3" />
+				</el-form-item>
+			</el-col>
+		</el-row>
+	</el-form>
+</template>

+ 235 - 0
UI/VAP_V3.VUE/src/views/tool/gen/__FieldTable.vue

@@ -0,0 +1,235 @@
+<script setup lang="ts">
+import apis from "@a"
+
+const props = withDefaults(defineProps<{ modelValue: any[] }>(), {})
+const emits = defineEmits<{ (e: "update:modelValue", v: any[]): void }>()
+const { modelValue: data } = toRefs(props)
+
+const tableRef = ref()
+const tableTree = ref<any[]>([])
+const dictOptions = ref<any[]>([])
+
+const opts = reactive<any>({
+	tableListFun: () => {
+		return new Promise((resolve) => {
+			resolve({ data: { rows: data.value } })
+		})
+	},
+	modalTitle: "表",
+	resetForm: () => {
+		form.value = emptyFormData.value
+	},
+	emptyFormData: {
+		tableName: undefined,
+		tableComment: undefined,
+		className: undefined,
+		sort: 0,
+		status: 2,
+		remark: undefined
+	}
+})
+const { emptyFormData } = toRefs(opts)
+const form = ref<any>(emptyFormData.value)
+function UpdateData(data?: any) {
+	data = data ?? tableRef.value?.getData()
+	emits("update:modelValue", data)
+}
+
+function handleChangeConfig(row, index) {
+	tableTree.value.filter(function (item) {
+		if (item.tableName === row.fkTableName) {
+			row.fkCol = item.columns
+			// row.fkCol.unshift({ columnId: 0, columnName: '请选择' })
+		}
+	})
+}
+
+function init() {
+	apis.system.dictApi.getTypes().then((res: any) => {
+		dictOptions.value = res.rows
+	})
+	// apis.tool.genApi.getTableTree().then((res) => {
+	// 	tableTree.value = res.data
+	// 	tableTree.value.unshift({ tableId: 0, tableName: "请选择关系表" })
+	// })
+}
+onMounted(init)
+watch(
+	() => props.modelValue,
+	(val: any) => {
+		val.forEach((v) => {
+			tableTree.value.filter((vv) => {
+				if (vv.tableId == v.fkTableNameClass) {
+					v.fkCol = vv.columns || [{ columnId: 0, columnName: "请选择" }]
+				}
+			})
+		})
+		UpdateData(val)
+	}
+)
+</script>
+
+<template>
+	<div>
+		<el-alert
+			title="⚠️表字段中的id、create_by、update_by、created_at、updated_at、deleted_at的字段在此列表中已经隐藏"
+			type="warning"
+			show-icon />
+		<el-table
+			:data="data"
+			height="50vh"
+			stripe
+			style="width: 100%"
+			:header-cell-style="{ 'text-align': 'center' }"
+			:cell-style="{ 'text-align': 'center' }">
+			<el-table-column fixed label="序号" type="index" width="50" />
+			<el-table-column
+				fixed
+				label="字段列名"
+				prop="columnName"
+				width="140"
+				:show-overflow-tooltip="true" />
+			<el-table-column fixed label="字段描述" width="auto">
+				<template #default="scope">
+					<el-input v-model="scope.row.columnComment" />
+				</template>
+			</el-table-column>
+			<el-table-column
+				label="物理类型"
+				prop="columnType"
+				width="120"
+				:show-overflow-tooltip="true" />
+			<el-table-column label="java类型" width="120">
+				<template #default="scope">
+					<el-select v-model="scope.row.javaType">
+						<el-option label="Long" value="Long" />
+						<el-option label="String" value="String" />
+						<el-option label="Integer" value="Integer" />
+						<el-option label="Double" value="Double" />
+						<el-option label="BigDecimal" value="BigDecimal" />
+						<el-option label="Date" value="Date" />
+						<el-option label="Boolean" value="Boolean" />
+					</el-select>
+				</template>
+			</el-table-column>
+			<el-table-column label="java属性" width="auto">
+				<template #default="scope">
+					<el-input v-model="scope.row.javaField" />
+				</template>
+			</el-table-column>
+			<el-table-column label="添加" width="65">
+				<template #header>
+					<vb-tooltip content="是否在表单中添加/编辑,打√表示需要" placement="top">
+						<span class="bi bi-question-circle-fill text-muted"></span>
+					</vb-tooltip>
+					编辑
+				</template>
+				<template #default="scope">
+					<el-checkbox true-label="1" false-label="0" v-model="scope.row.isInsert"></el-checkbox>
+				</template>
+			</el-table-column>
+			<el-table-column label="" width="65">
+				<template #header>
+					<vb-tooltip content="是否在列表中展示,打√表示需要展示" placement="top">
+						<span class="bi bi-question-circle-fill text-muted"></span>
+					</vb-tooltip>
+					列表
+				</template>
+				<template #default="scope">
+					<el-checkbox v-model="scope.row.isList" true-label="1" false-label="0"></el-checkbox>
+				</template>
+			</el-table-column>
+			<el-table-column label="排序" width="65">
+				<template #header>
+					<vb-tooltip content="是否当做排序条件,打√表示做为排序条件" placement="top">
+						<span class="bi bi-question-circle-fill text-muted"></span>
+					</vb-tooltip>
+					排序
+				</template>
+				<template #default="scope">
+					<el-checkbox v-model="scope.row.isSort" true-label="1" false-label="0" />
+				</template>
+			</el-table-column>
+			<el-table-column label="必填" width="65">
+				<template #header>
+					<vb-tooltip content="是否必填,打√表示需要必填" placement="top">
+						<span class="bi bi-question-circle-fill text-muted"></span>
+					</vb-tooltip>
+					必填
+				</template>
+				<template #default="scope">
+					<el-checkbox v-model="scope.row.isRequired" true-label="1" false-label="0" />
+				</template>
+			</el-table-column>
+			<el-table-column label="" width="65">
+				<template #header>
+					<vb-tooltip content="是否当做搜索条件,打√表示做为搜索条件" placement="top">
+						<span class="bi bi-question-circle-fill text-muted"></span>
+					</vb-tooltip>
+					查询
+				</template>
+				<template #default="scope">
+					<el-checkbox v-model="scope.row.isQuery" true-label="1" false-label="0" />
+				</template>
+			</el-table-column>
+			<el-table-column label="查询方式" width="100">
+				<template #default="scope">
+					<el-select v-model="scope.row.queryType">
+						<el-option label="=" value="EQ" />
+						<el-option label="!=" value="NE" />
+						<el-option label=">" value="GT" />
+						<el-option label=">=" value="GTE" />
+						<el-option label="<" value="LT" />
+						<el-option label="<=" value="LTE" />
+						<el-option label="LIKE" value="LIKE" />
+						<el-option label="BETW" value="BETWEEN" />
+					</el-select>
+				</template>
+			</el-table-column>
+			<el-table-column label="显示类型" width="120">
+				<template #default="scope">
+					<el-select v-model="scope.row.htmlType">
+						<el-option label="文本框" value="input" />
+						<el-option label="下拉框" value="select" />
+						<el-option label="单选框" value="radio" />
+						<el-option label="文件选择" value="file" />
+						<el-option label="复选框" value="checkbox" />
+						<el-option label="日期控件" value="datetime" />
+						<el-option label="文本域" value="textarea" />
+					</el-select>
+				</template>
+			</el-table-column>
+			<el-table-column label="字典类型" width="180">
+				<template #default="scope">
+					<el-select v-model="scope.row.dictType" clearable filterable placeholder="请选择">
+						<el-option
+							v-for="dict in dictOptions"
+							:key="dict.dictType"
+							:label="dict.dictName"
+							:value="dict.dictType">
+							<span style="float: left">{{ dict.dictName }}</span>
+							<span style="margin-left: 10px; float: right; color: #8492a6; font-size: 13px">
+								{{ dict.dictType }}
+							</span>
+						</el-option>
+					</el-select>
+				</template>
+			</el-table-column>
+		</el-table>
+	</div>
+</template>
+
+<style lang="scss">
+.el-table {
+	th {
+		.cell {
+			padding: 0 1px;
+		}
+	}
+	td {
+		.cell {
+			padding: 0 5px;
+		}
+	}
+}
+</style>

+ 166 - 0
UI/VAP_V3.VUE/src/views/tool/gen/__GenForm.vue

@@ -0,0 +1,166 @@
+<script setup lang="ts">
+const props = withDefaults(defineProps<{ modelValue: any }>(), {})
+const emits = defineEmits<{ (e: "update:modelValue", v: any): void }>()
+const { modelValue: data } = toRefs(props)
+
+const formRef = ref()
+const rules = {
+	tplCategory: [{ required: true, message: "请选择生成模板", trigger: "blur" }],
+	packageName: [
+		{ required: true, message: "请输入生成包路径", trigger: "blur" },
+		{ pattern: /^[a-z]*$/g, trigger: "blur", message: "只允许小写字母,例如 system 格式" }
+	],
+	moduleName: [
+		{ required: true, message: "请输入生成模块名", trigger: "blur" },
+		{ pattern: /^[a-z\-]*[a-z]$/g, trigger: "blur", message: "只允许小写字母,例如 sys-demo 格式" }
+	],
+	businessName: [
+		{ required: true, message: "请输入生成业务名", trigger: "blur" },
+		{
+			pattern: /^[a-z][A-Za-z]+$/,
+			trigger: "blur",
+			message: "校验规则:  只允许输入字母 a-z 或大写 A-Z ,并且小写字母开头"
+		}
+	],
+	functionName: [{ required: true, message: "请输入生成功能名", trigger: "blur" }]
+}
+function resetForm() {
+	formRef.value.resetFields()
+}
+function validateForm() {
+	return new Promise((resolve, reject) => {
+		formRef.value.validate((res) => {
+			if (res) {
+				resolve("")
+			} else {
+				reject("gen")
+			}
+		})
+	})
+}
+defineExpose({ resetForm, validateForm })
+</script>
+<template>
+	<el-form
+		style="width: 800px; margin: 5px auto 0"
+		ref="formRef"
+		:model="data"
+		:rules="rules"
+		size="large"
+		label-position="top">
+		<el-row :gutter="20">
+			<el-col :span="12">
+				<el-form-item prop="tplCategory">
+					<template #label>
+						<span class="ms-2 fw-bold text-dark">生成模板</span>
+					</template>
+					<el-select v-model="data.tplCategory">
+						<el-option label="关系表(增删改查)" value="crud" />
+						<!-- <el-option label="关系表(增删改查)" value="mcrud" />
+            <el-option label="树表(增删改查)" value="tree" /> -->
+					</el-select>
+				</el-form-item>
+			</el-col>
+			<el-col :span="12">
+				<el-form-item prop="packageName">
+					<template #label>
+						<vb-tooltip
+							content="应用名,例如:在app文件夹下将该功能发到那个应用中,默认:system"
+							placement="top">
+							<span class="bi bi-question-circle-fill text-muted"></span>
+						</vb-tooltip>
+						<span class="ms-2 fw-bold text-dark">应用名(包名) packageName</span>
+					</template>
+					<el-input v-model="data.packageName" />
+				</el-form-item>
+			</el-col>
+			<el-col :span="12">
+				<el-form-item prop="businessName">
+					<template #label>
+						<vb-tooltip content="可理解为功能英文名,例如 user" placement="top">
+							<span class="bi bi-question-circle-fill text-muted"></span>
+						</vb-tooltip>
+						<span class="ms-2 fw-bold text-dark">业务名 businessName</span>
+					</template>
+					<el-input v-model="data.businessName" />
+				</el-form-item>
+			</el-col>
+			<el-col :span="12">
+				<el-form-item prop="functionName">
+					<template #label>
+						<vb-tooltip content="同步的数据库表备注,用作类描述,例如:用户" placement="top">
+							<span class="bi bi-question-circle-fill text-muted"></span>
+						</vb-tooltip>
+						<span class="ms-2 fw-bold text-dark">功能描述 functionName</span>
+					</template>
+					<el-input v-model="data.functionName" />
+				</el-form-item>
+			</el-col>
+			<el-col :span="12">
+				<el-form-item prop="moduleName">
+					<template #label>
+						<vb-tooltip content="接口路径,例如:api/{sys-user}" placement="top">
+							<span class="bi bi-question-circle-fill text-muted"></span>
+						</vb-tooltip>
+						<span class="ms-2 fw-bold text-dark">接口路径 moduleName</span>
+					</template>
+					<el-input v-model="data.moduleName"></el-input>
+				</el-form-item>
+			</el-col>
+		</el-row>
+		<el-row v-show="data.tplCategory == 'tree'">
+			<h4 class="form-header">其他信息</h4>
+			<el-col :span="12">
+				<el-form-item>
+					<template #label>
+						<vb-tooltip content="树显示的编码字段名, 如:org_id" placement="top">
+							<span class="bi bi-question-circle-fill text-muted"></span>
+						</vb-tooltip>
+						<span class="ms-2 fw-bold text-dark">树编码字段</span>
+					</template>
+					<el-select v-model="data.treeCode" placeholder="请选择">
+						<el-option
+							v-for="column in data.columns"
+							:key="column.columnName"
+							:label="column.columnName + ':' + column.columnComment"
+							:value="column.columnName" />
+					</el-select>
+				</el-form-item>
+			</el-col>
+			<el-col :span="12">
+				<el-form-item>
+					<template #label>
+						<vb-tooltip content="树显示的父编码字段名, 如:parent_Id" placement="top">
+							<span class="bi bi-question-circle-fill text-muted"></span>
+						</vb-tooltip>
+						<span class="ms-2 fw-bold text-dark">树父编码字段</span>
+					</template>
+					<el-select v-model="data.treeParentCode" placeholder="请选择">
+						<el-option
+							v-for="column in data.columns"
+							:key="column.columnName"
+							:label="column.columnName + ':' + column.columnComment"
+							:value="column.columnName" />
+					</el-select>
+				</el-form-item>
+			</el-col>
+			<el-col :span="12">
+				<el-form-item>
+					<template #label>
+						<vb-tooltip content="树节点的显示名称字段名, 如:org_name" placement="top">
+							<span class="bi bi-question-circle-fill text-muted"></span>
+						</vb-tooltip>
+						<span class="ms-2 fw-bold text-dark">树名称字段</span>
+					</template>
+					<el-select v-model="data.treeName" placeholder="请选择">
+						<el-option
+							v-for="column in data.columns"
+							:key="column.columnName"
+							:label="column.columnName + ':' + column.columnComment"
+							:value="column.columnName" />
+					</el-select>
+				</el-form-item>
+			</el-col>
+		</el-row>
+	</el-form>
+</template>

+ 336 - 0
UI/VAP_V3.VUE/src/views/tool/gen/index.vue

@@ -0,0 +1,336 @@
+<script setup lang="ts" name="Gen">
+import apis from "@a"
+import message from "@@/utils/message"
+import dayjs from "dayjs"
+import ImportTable from "./_ImportTable.vue"
+import EditTable from "./_EditTable.vue"
+
+const tableRef = ref()
+const importTableRef = ref()
+const modalRef = ref()
+const importModalRef = ref()
+const previewModalRef = ref()
+const opts = reactive<any>({
+	columns: [
+		{ field: "tableId", name: `表ID`, width: "auto", visible: false },
+		{ field: "tableName", name: `表名称`, width: "auto" },
+		{ field: "className", name: `结构体模型名称` },
+		{ field: "packageName", name: `应用(包)名称` },
+		{ field: "businessName", name: `业务模块名称` },
+		{ field: "tableComment", name: `菜单名称`, width: "auto" },
+		{ field: "functionName", name: `业务模块描述` },
+		{ field: "createdAt", name: `创建时间`, width: 185 },
+		{ field: "actions", name: `操作`, width: 250 }
+	],
+	queryParams: {
+		tableName: undefined,
+		tableComment: undefined
+	},
+	searchFormItems: [
+		{
+			field: "tableName",
+			label: "表名称",
+			placeholder: "请输入表名称",
+			required: false,
+			listeners: {
+				keyup: (e: KeyboardEvent) => {
+					if (e.code == "Enter") {
+						handleQuery()
+					}
+				}
+			}
+		},
+		{
+			field: "tableComment",
+			label: "菜单名称",
+			placeholder: "请输入菜单名称",
+			required: false,
+			listeners: {
+				keyup: (e: KeyboardEvent) => {
+					if (e.code == "Enter") {
+						handleQuery()
+					}
+				}
+			}
+		}
+	],
+	permission: "tool:gen",
+	handleFuns: {
+		handleImport
+	},
+
+	tableListFun: apis.tool.genApi.listTable,
+	getEntityFun: apis.tool.genApi.getGenTable,
+	deleteEntityFun: apis.tool.genApi.delTable,
+	modalTitle: "表",
+	resetForm: () => {
+		form.value = emptyFormData.value
+	},
+	emptyFormData: {
+		tableName: undefined,
+		tableComment: undefined,
+		className: undefined,
+		sort: 0,
+		status: 2,
+		remark: undefined
+	}
+})
+const { queryParams, emptyFormData } = toRefs(opts)
+const form = ref<any>(emptyFormData.value)
+
+const preview = ref<any>({
+	show: false,
+	lang: "go",
+	codes: {},
+	keys: [],
+	activeName: "api.go",
+	key: "",
+	code: ""
+})
+
+const editTableRef = ref()
+const editTableData = ref<any>({})
+
+/** 查询按钮 */
+function handleQuery(query?: any) {
+	query = query || tableRef.value?.getQueryParams() || queryParams.value
+	tableRef.value?.query(query)
+}
+/** 查询重置按钮 */
+function resetQuery() {}
+/** 修改按钮操作 */
+function handleUpdate(row: any) {
+	apis.tool.genApi.getGenTable(row.tableId).then((res) => {
+		editTableData.value = res.data.info
+		modalRef.value?.show()
+	})
+}
+/** 删除按钮操作 */
+function handleDelete(rows: any[]) {
+	tableRef.value.defaultHandleFuns.handleDelete("", rows)
+}
+/** 提交按钮 */
+function submitUpdate() {
+	editTableRef.value
+		.submit()
+		.then(() => {
+			message.msgSuccess("修改成功")
+			modalRef.value?.hide()
+			handleQuery()
+		})
+		.catch((err) => {
+			if (err == "" || err == "field") {
+				message.msgError("表单校验失败")
+				editTableRef.value.activeTab(err)
+			}
+		})
+}
+function handleImport() {
+	importModalRef.value.show()
+	importTableRef.value.handleQuery()
+}
+function handleImportTable() {
+	importTableRef.value.handleImport().then(() => {
+		handleQuery()
+	})
+}
+function handlePreview(row: any) {
+	apis.tool.genApi.previewTable(row.tableId).then((res) => {
+		preview.value.codes = res.data
+		preview.value.keys = Object.keys(res.data)
+		handleCodeChange(preview.value.keys[preview.value.keys.length - 1])
+		previewModalRef.value.show()
+	})
+}
+function handleGenCode(row: any) {
+	console.log("----", row)
+	if (!row?.tableId) {
+		message.msgError("请选择要生成的数据!")
+		return
+	}
+	const msg = row?.genType === "1" ? "生成" : "下载"
+	message.confirm(`确定要${msg}代码吗?`, `${msg}代码`).then(() => {
+		if (row?.genType === "1") {
+			apis.tool.genApi.genCode(row.tableId).then(() => {
+				if (row.genPath == "/") {
+					message.msgSuccess("成功生成到项目中")
+				} else {
+					message.msgSuccess("成功生成到自定义路径:" + row.genPath)
+				}
+			})
+		} else {
+			apis.tool.genApi.downloadCode(row.tableId).then(() => {
+				message.msgSuccess("下载成功")
+			})
+		}
+	})
+}
+function handleGenMenu(row: any) {
+	message.confirm("确定要自动生成菜单到数据库吗?", "生成菜单").then(() => {
+		apis.tool.genApi.genMenu(row.tableId).then(() => {
+			message.msgSuccess("生成成功")
+		})
+	})
+}
+function handleSyncDb(row: any) {
+	apis.tool.genApi.syncDb(row.tableId).then(() => {
+		message.msgSuccess("同步成功")
+	})
+}
+function handleCodeChange(templateName: string) {
+	preview.value.show = false
+	preview.value.lang = "javascript"
+	preview.value.key = templateName
+	preview.value.code = "\r\n" + preview.value.codes[templateName]
+	console.log(preview.value.code)
+	setTimeout(() => {
+		preview.value.show = true
+	}, 10)
+}
+
+function getTemplateName(templateName: string) {
+	if (templateName.includes("java.vm")) {
+		return getName(".java.vm")
+	} else if (templateName.includes("xml.vm")) {
+		return getName(".xml.vm")
+	} else if (templateName.includes("sql.vm")) {
+		return "sql"
+	} else if (templateName.includes("ts.vm")) {
+		return getName(".ts.vm")
+	} else if (templateName.includes("vue.vm")) {
+		return getName(".vue.vm")
+	}
+	function getName(str: string) {
+		return templateName.substring(templateName.lastIndexOf("/") + 1, templateName.indexOf(str))
+	}
+	return templateName
+}
+</script>
+
+<template>
+	<div>
+		<VbDataTable
+			ref="tableRef"
+			:handle-perm="opts.permission"
+			:handle-funs="opts.handleFuns"
+			:search-form-items="opts.searchFormItems"
+			:columns="opts.columns"
+			:custom-btns="opts.customBtns"
+			:remote-fun="opts.tableListFun"
+			:get-entity-fun="opts.getEntityFun"
+			:delete-entity-fun="opts.deleteEntityFun"
+			:modal="modalRef"
+			:reset-form-fun="opts.resetForm"
+			v-model:form-data="form"
+			v-model:query-params="queryParams"
+			:check-multiple="true"
+			:has-checkbox="true"
+			:reset-search-form-fun="resetQuery"
+			:custom-search-fun="handleQuery">
+			<template #createdAt="{ row }">
+				{{ dayjs(row.createdAt).format("YYYY-MM-DD HH:mm:ss") }}
+			</template>
+			<template #actions="{ row }">
+				<vb-tooltip content="修改" placement="top">
+					<el-button link type="primary" @click="handleUpdate(row)">
+						<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="handlePreview(row)">
+						<template #icon>
+							<VbIcon icon-name="eye" icon-type="duotone" class="fs-3"></VbIcon>
+						</template>
+					</el-button>
+				</vb-tooltip>
+				<vb-tooltip content="代码生成" placement="top">
+					<el-button link type="danger" @click="handleGenCode(row)">
+						<template #icon>
+							<VbIcon icon-name="code" icon-type="duotone" class="fs-3"></VbIcon>
+						</template>
+					</el-button>
+				</vb-tooltip>
+				<vb-tooltip content="菜单生成" placement="top">
+					<el-button link type="danger" @click="handleGenMenu(row)">
+						<template #icon>
+							<VbIcon icon-name="underlining" icon-type="duotone" class="fs-3"></VbIcon>
+						</template>
+					</el-button>
+				</vb-tooltip>
+				<vb-tooltip content="表信息同步" placement="top">
+					<el-button link type="warning" @click="handleSyncDb(row)">
+						<template #icon>
+							<VbIcon icon-name="arrows-loop" 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])">
+						<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="修改表信息"
+			modal-dialog-style="width:1800px;max-width:1800px;"
+			modal-body-class="pt-0"
+			:save-auto-close="false"
+			@confirm="submitUpdate"
+			append-to-body>
+			<template #body>
+				<div style="height: 60vh">
+					<EditTable ref="editTableRef" :data="editTableData"></EditTable>
+				</div>
+			</template>
+		</VbModal>
+		<VbModal
+			v-model:modal="importModalRef"
+			title="导入表"
+			modal-dialog-style="width:1000px;max-width:1000px;"
+			modal-body-class="pt-0"
+			@confirm="handleImportTable"
+			append-to-body>
+			<template #body>
+				<ImportTable ref="importTableRef"></ImportTable>
+			</template>
+		</VbModal>
+		<VbModal
+			v-model:modal="previewModalRef"
+			title="代码预览"
+			modal-dialog-style="width:1200px;max-width:1200px;"
+			modal-body-class="pt-0"
+			:close-btn="false"
+			confirm-btn-text="关闭"
+			append-to-body>
+			<template #body>
+				<div>
+					<div class="mt-5 mb-2">
+						<el-tag
+							v-for="(v, i) in preview.keys"
+							style="cursor: pointer"
+							class="mx-2"
+							:effect="v == preview.key ? 'dark' : 'light'"
+							:key="i"
+							size="large"
+							@click="handleCodeChange(v)">
+							{{ getTemplateName(v) }}
+						</el-tag>
+					</div>
+					<transition name="fade" mode="out-in">
+						<div v-if="preview.show">
+							<CodeHighlighter :lang="preview.lang" :field-height="500">
+								{{ preview.code }}
+							</CodeHighlighter>
+						</div>
+					</transition>
+				</div>
+			</template>
+		</VbModal>
+	</div>
+</template>