Explorar el Código

推进生成模板

邵洋 hace 1 año
padre
commit
86f863badd
Se han modificado 48 ficheros con 2807 adiciones y 1649 borrados
  1. 13 0
      background-service/pom.xml
  2. 11 11
      background-service/zksy-admin/pom.xml
  3. 1 0
      background-service/zksy-admin/src/main/java/com/zksy/BackgroundApplication.java
  4. 18 0
      background-service/zksy-admin/src/main/java/com/zksy/web/controller/Test11Controller.java
  5. 98 0
      background-service/zksy-admin/src/main/java/com/zksy/web/controller/basicData/XcrMajorMembersController.java
  6. 9 0
      background-service/zksy-admin/src/main/java/com/zksy/web/controller/system/SysLoginController.java
  7. 97 96
      background-service/zksy-admin/src/main/java/com/zksy/web/core/config/SwaggerConfig.java
  8. 6 61
      background-service/zksy-admin/src/main/resources/application-dev.yml
  9. 0 130
      background-service/zksy-admin/src/main/resources/application.yml
  10. 92 1
      background-service/zksy-admin/src/main/resources/bootstrap.yaml
  11. 0 0
      background-service/zksy-admin/src/main/resources/logback.xml.bak
  12. 9 0
      background-service/zksy-common/pom.xml
  13. 27 0
      background-service/zksy-common/src/main/java/com/zksy/common/core/domain/BasePo.java
  14. 26 0
      background-service/zksy-common/src/main/java/com/zksy/common/domain/ConditionVo.java
  15. 58 0
      background-service/zksy-common/src/main/java/com/zksy/common/utils/SearchUtil.java
  16. 132 132
      background-service/zksy-framework/src/main/java/com/zksy/framework/config/MyBatisConfig.java
  17. 63 0
      background-service/zksy-framework/src/main/java/com/zksy/framework/config/MybatisPlusConfig.java
  18. 1 1
      background-service/zksy-framework/src/main/java/com/zksy/framework/config/SecurityConfig.java
  19. 36 0
      background-service/zksy-framework/src/main/java/com/zksy/framework/web/service/SysLoginService.java
  20. 13 10
      background-service/zksy-generator/src/main/java/com/zksy/generator/util/VelocityUtils.java
  21. 2 2
      background-service/zksy-generator/src/main/resources/generator.yml
  22. 115 0
      background-service/zksy-generator/src/main/resources/vm/java/bak/controller.java.vm
  23. 103 0
      background-service/zksy-generator/src/main/resources/vm/java/bak/domain.java.vm
  24. 91 0
      background-service/zksy-generator/src/main/resources/vm/java/bak/mapper.java.vm
  25. 61 0
      background-service/zksy-generator/src/main/resources/vm/java/bak/service.java.vm
  26. 169 0
      background-service/zksy-generator/src/main/resources/vm/java/bak/serviceImpl.java.vm
  27. 75 0
      background-service/zksy-generator/src/main/resources/vm/java/bak/sub-domain.java.vm
  28. 62 79
      background-service/zksy-generator/src/main/resources/vm/java/controller.java.vm
  29. 45 86
      background-service/zksy-generator/src/main/resources/vm/java/domain.java.vm
  30. 4 81
      background-service/zksy-generator/src/main/resources/vm/java/mapper.java.vm
  31. 4 51
      background-service/zksy-generator/src/main/resources/vm/java/service.java.vm
  32. 6 157
      background-service/zksy-generator/src/main/resources/vm/java/serviceImpl.java.vm
  33. 55 53
      background-service/zksy-generator/src/main/resources/vm/java/sub-domain.java.vm
  34. 9 5
      background-service/zksy-generator/src/main/resources/vm/js/api.js.vm
  35. 44 0
      background-service/zksy-generator/src/main/resources/vm/js/bak/api.js.vm
  36. 590 0
      background-service/zksy-generator/src/main/resources/vm/vue/v3/bak/index.vue.vm
  37. 344 543
      background-service/zksy-generator/src/main/resources/vm/vue/v3/index.vue.vm
  38. 7 135
      background-service/zksy-generator/src/main/resources/vm/xml/mapper.xml.vm
  39. 214 0
      background-service/zksy-system/src/main/java/com/zksy/basicData/domain/XcrMajorMembers.java
  40. 14 0
      background-service/zksy-system/src/main/java/com/zksy/basicData/mapper/XcrMajorMembersMapper.java
  41. 14 0
      background-service/zksy-system/src/main/java/com/zksy/basicData/service/IXcrMajorMembersService.java
  42. 18 0
      background-service/zksy-system/src/main/java/com/zksy/basicData/service/impl/XcrMajorMembersServiceImpl.java
  43. 36 0
      background-service/zksy-system/src/main/resources/mapper/basicData/XcrMajorMembersMapper.xml
  44. 1 1
      data-service/pom.xml
  45. 10 10
      data-service/src/main/java/com/zksy/data/controller/TestController.java
  46. 2 2
      pom.xml
  47. 1 1
      xh-common/pom.xml
  48. 1 1
      xh-gateway/pom.xml

+ 13 - 0
background-service/pom.xml

@@ -27,6 +27,8 @@
         <poi.version>4.1.2</poi.version>
         <velocity.version>2.3</velocity.version>
         <jwt.version>0.9.1</jwt.version>
+        <knife4j.version>4.1.0</knife4j.version>
+        <mybatis-plus.version>3.5.1</mybatis-plus.version>
     </properties>
 
     <!-- 依赖声明 -->
@@ -183,6 +185,17 @@
                 <version>${zksy.version}</version>
             </dependency>
 
+            <dependency>
+                <groupId>com.github.xiaoymin</groupId>
+                <artifactId>knife4j-openapi2-spring-boot-starter</artifactId>
+                <version>${knife4j.version}</version>
+            </dependency>
+
+            <dependency>
+                <groupId>com.baomidou</groupId>
+                <artifactId>mybatis-plus-boot-starter</artifactId>
+                <version>${mybatis-plus.version}</version>
+            </dependency>
         </dependencies>
     </dependencyManagement>
 

+ 11 - 11
background-service/zksy-admin/pom.xml

@@ -25,17 +25,17 @@
         </dependency>
 
         <!-- swagger3-->
-        <dependency>
-            <groupId>io.springfox</groupId>
-            <artifactId>springfox-boot-starter</artifactId>
-        </dependency>
+<!--        <dependency>-->
+<!--            <groupId>io.springfox</groupId>-->
+<!--            <artifactId>springfox-boot-starter</artifactId>-->
+<!--        </dependency>-->
 
-        <!-- 防止进入swagger页面报类型转换错误,排除3.0.0中的引用,手动增加1.6.2版本 -->
-        <dependency>
-            <groupId>io.swagger</groupId>
-            <artifactId>swagger-models</artifactId>
-            <version>1.6.2</version>
-        </dependency>
+<!--        &lt;!&ndash; 防止进入swagger页面报类型转换错误,排除3.0.0中的引用,手动增加1.6.2版本 &ndash;&gt;-->
+<!--        <dependency>-->
+<!--            <groupId>io.swagger</groupId>-->
+<!--            <artifactId>swagger-models</artifactId>-->
+<!--            <version>1.6.2</version>-->
+<!--        </dependency>-->
 
 <!--         &lt;!&ndash; Mysql驱动包 &ndash;&gt;-->
 <!--        <dependency>-->
@@ -123,7 +123,7 @@
                     <failOnMissingWebXml>false</failOnMissingWebXml>
                     <warName>${project.artifactId}</warName>
                 </configuration>   
-           </plugin>   
+           </plugin>
         </plugins>
         <finalName>${project.artifactId}</finalName>
     </build>

+ 1 - 0
background-service/zksy-admin/src/main/java/com/zksy/BackgroundApplication.java

@@ -1,5 +1,6 @@
 package com.zksy;
 
+import org.mybatis.spring.annotation.MapperScan;
 import org.springframework.boot.SpringApplication;
 import org.springframework.boot.autoconfigure.SpringBootApplication;
 import org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration;

+ 18 - 0
background-service/zksy-admin/src/main/java/com/zksy/web/controller/Test11Controller.java

@@ -0,0 +1,18 @@
+package com.zksy.web.controller;
+
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+@RestController
+@RequestMapping("/test")
+@Api("测试")
+public class Test11Controller {
+    @GetMapping("/a")
+    @ApiOperation("性与暴力")
+    public String hello(){
+        return "性与暴力";
+    }
+}

+ 98 - 0
background-service/zksy-admin/src/main/java/com/zksy/web/controller/basicData/XcrMajorMembersController.java

@@ -0,0 +1,98 @@
+package com.zksy.web.controller.basicData;
+
+import com.zksy.common.core.controller.BaseController;
+import com.zksy.basicData.domain.XcrMajorMembers;
+import com.zksy.basicData.service.IXcrMajorMembersService;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.zksy.common.core.domain.AjaxResult;
+import com.zksy.common.utils.SearchUtil;
+import com.zksy.common.annotation.Log;
+import com.zksy.common.enums.BusinessType;
+import com.zksy.common.utils.poi.ExcelUtil;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.security.access.prepost.PreAuthorize;
+import org.springframework.web.bind.annotation.*;
+
+import javax.servlet.http.HttpServletResponse;
+import java.util.List;
+
+/**
+ * 主要成员信息Controller
+ *
+ * @author Administrator
+ * @date 2024-10-31
+ */
+@RestController
+@RequestMapping("/basicData/xcrMajorMembers")
+@Api(tags = "主要成员信息", description = "主要成员信息desc")
+public class XcrMajorMembersController extends BaseController{
+
+    @Autowired
+    private IXcrMajorMembersService service;
+
+    @GetMapping("/getById/{borrowId}")
+    @ApiOperation(value = "主要成员信息搜索getById")
+    @PreAuthorize("@ss.hasPermi('basicData:xcrMajorMembers:list')")
+    public XcrMajorMembers getById(@PathVariable String borrowId) {
+        return service.getById(borrowId);
+    }
+
+    @GetMapping("/findByPage")
+    @ApiOperation(value = "主要成员信息分页")
+    @PreAuthorize("@ss.hasPermi('basicData:xcrMajorMembers:list')")
+    public Page findByPage(long pageNum, long pageSize, String conditionJson) throws Exception {
+        return service.page(new Page<>(pageNum, pageSize), SearchUtil.parseWhereSql(conditionJson));
+    }
+
+    @GetMapping("/getList")
+    @ApiOperation(value = "主要成员信息查询所有")
+    @PreAuthorize("@ss.hasPermi('basicData:xcrMajorMembers:list')")
+    public List<XcrMajorMembers> getList(String conditionJson) throws Exception {
+        return service.list(SearchUtil.parseWhereSql(conditionJson));
+    }
+
+    /**
+     * 新增主要成员信息
+     */
+    @PostMapping("/save")
+    @ApiOperation(value = "主要成员信息新增")
+    @Log(title = "新增主要成员信息", businessType = BusinessType.INSERT)
+    public boolean save(@RequestBody XcrMajorMembers xcrMajorMembers) {
+        return service.save(xcrMajorMembers);
+    }
+
+    /**
+     * 修改主要成员信息
+     */
+    @PostMapping("/updateById")
+    @ApiOperation(value = "主要成员信息修改")
+    @Log(title = "修改主要成员信息", businessType = BusinessType.UPDATE)
+    public boolean updateById(@RequestBody XcrMajorMembers xcrMajorMembers) {
+        return service.updateById(xcrMajorMembers);
+    }
+
+
+    @Log(title = "主要成员信息", businessType = BusinessType.DELETE)
+    @PostMapping("/delete")
+    @ApiOperation(value = "删除主要成员信息", notes = "删除主要成员信息")
+    public AjaxResult delete(@RequestBody List<String> ids)
+    {
+        return toAjax(service.removeByIds(ids));
+    }
+
+    /**
+     * 导出主要成员信息列表
+     */
+    @PreAuthorize("@ss.hasPermi('basicData:xcrMajorMembers:export')")
+    @Log(title = "主要成员信息", businessType = BusinessType.EXPORT)
+    @PostMapping("/export")
+    public void export(HttpServletResponse response,String conditionJson) throws Exception
+    {
+        List<XcrMajorMembers> list = service.list(SearchUtil.parseWhereSql(conditionJson));
+        ExcelUtil<XcrMajorMembers> util = new ExcelUtil<XcrMajorMembers>(XcrMajorMembers.class);
+        util.exportExcel(response, list, "主要成员信息数据");
+    }
+}

+ 9 - 0
background-service/zksy-admin/src/main/java/com/zksy/web/controller/system/SysLoginController.java

@@ -51,6 +51,15 @@ public class SysLoginController
         return ajax;
     }
 
+    @PostMapping("/loginNoNeedAuth")
+    public AjaxResult loginNoNeedAuth(@RequestBody LoginBody loginBody) {
+        AjaxResult ajax = AjaxResult.success();
+        // 生成令牌
+        String token = loginService.loginNoNeedAuth(loginBody.getUsername(), loginBody.getPassword());
+        ajax.put(Constants.TOKEN, token);
+        return ajax;
+    }
+
     /**
      * 获取用户信息
      * 

+ 97 - 96
background-service/zksy-admin/src/main/java/com/zksy/web/core/config/SwaggerConfig.java

@@ -27,99 +27,100 @@ import springfox.documentation.spring.web.plugins.Docket;
  * 
  * @author ruoyi
  */
-@Configuration
-public class SwaggerConfig
-{
-    /** 系统基础配置 */
-    @Autowired
-    private RuoYiConfig ruoyiConfig;
-
-    /** 是否开启swagger */
-    @Value("${swagger.enabled}")
-    private boolean enabled;
-
-    /** 设置请求的统一前缀 */
-    @Value("${swagger.pathMapping}")
-    private String pathMapping;
-
-    /**
-     * 创建API
-     */
-    @Bean
-    public Docket createRestApi()
-    {
-        return new Docket(DocumentationType.OAS_30)
-                // 是否启用Swagger
-                .enable(enabled)
-                // 用来创建该API的基本信息,展示在文档的页面中(自定义展示的信息)
-                .apiInfo(apiInfo())
-                // 设置哪些接口暴露给Swagger展示
-                .select()
-                // 扫描所有有注解的api,用这种方式更灵活
-                .apis(RequestHandlerSelectors.withMethodAnnotation(ApiOperation.class))
-                // 扫描指定包中的swagger注解
-                // .apis(RequestHandlerSelectors.basePackage("com.zksy.project.tool.swagger"))
-                // 扫描所有 .apis(RequestHandlerSelectors.any())
-                .paths(PathSelectors.any())
-                .build()
-                /* 设置安全模式,swagger可以设置访问token */
-                .securitySchemes(securitySchemes())
-                .securityContexts(securityContexts())
-                .pathMapping(pathMapping);
-    }
-
-    /**
-     * 安全模式,这里指定token通过Authorization头请求头传递
-     */
-    private List<SecurityScheme> securitySchemes()
-    {
-        List<SecurityScheme> apiKeyList = new ArrayList<SecurityScheme>();
-        apiKeyList.add(new ApiKey("Authorization", "Authorization", In.HEADER.toValue()));
-        return apiKeyList;
-    }
-
-    /**
-     * 安全上下文
-     */
-    private List<SecurityContext> securityContexts()
-    {
-        List<SecurityContext> securityContexts = new ArrayList<>();
-        securityContexts.add(
-                SecurityContext.builder()
-                        .securityReferences(defaultAuth())
-                        .operationSelector(o -> o.requestMappingPattern().matches("/.*"))
-                        .build());
-        return securityContexts;
-    }
-
-    /**
-     * 默认的安全上引用
-     */
-    private List<SecurityReference> defaultAuth()
-    {
-        AuthorizationScope authorizationScope = new AuthorizationScope("global", "accessEverything");
-        AuthorizationScope[] authorizationScopes = new AuthorizationScope[1];
-        authorizationScopes[0] = authorizationScope;
-        List<SecurityReference> securityReferences = new ArrayList<>();
-        securityReferences.add(new SecurityReference("Authorization", authorizationScopes));
-        return securityReferences;
-    }
-
-    /**
-     * 添加摘要信息
-     */
-    private ApiInfo apiInfo()
-    {
-        // 用ApiInfoBuilder进行定制
-        return new ApiInfoBuilder()
-                // 设置标题
-                .title("标题:若依管理系统_接口文档")
-                // 描述
-                .description("描述:用于管理集团旗下公司的人员信息,具体包括XXX,XXX模块...")
-                // 作者信息
-                .contact(new Contact(ruoyiConfig.getName(), null, null))
-                // 版本
-                .version("版本号:" + ruoyiConfig.getVersion())
-                .build();
-    }
-}
+//@Configuration
+//public class SwaggerConfig
+//{
+//    /** 系统基础配置 */
+//    @Autowired
+//    private RuoYiConfig ruoyiConfig;
+//
+//    /** 是否开启swagger */
+//    @Value("${swagger.enabled}")
+//    private boolean enabled;
+//
+//    /** 设置请求的统一前缀 */
+//    @Value("${swagger.pathMapping}")
+//    private String pathMapping;
+//
+//    /**
+//     * 创建API
+//     */
+//    @Bean
+//    public Docket createRestApi()
+//    {
+//        return new Docket(DocumentationType.OAS_30)
+//                // 是否启用Swagger
+//                .enable(enabled)
+//                // 用来创建该API的基本信息,展示在文档的页面中(自定义展示的信息)
+//                .apiInfo(apiInfo())
+//                // 设置哪些接口暴露给Swagger展示
+//                .select()
+//                // 扫描所有有注解的api,用这种方式更灵活
+////                .apis(RequestHandlerSelectors.withMethodAnnotation(ApiOperation.class))
+//                // 扫描指定包中的swagger注解
+//                // .apis(RequestHandlerSelectors.basePackage("com.zksy.project.tool.swagger"))
+//                // 扫描所有
+//                 .apis(RequestHandlerSelectors.any())
+//                .paths(PathSelectors.any())
+//                .build()
+//                /* 设置安全模式,swagger可以设置访问token */
+//                .securitySchemes(securitySchemes())
+//                .securityContexts(securityContexts())
+//                .pathMapping(pathMapping);
+//    }
+//
+//    /**
+//     * 安全模式,这里指定token通过Authorization头请求头传递
+//     */
+//    private List<SecurityScheme> securitySchemes()
+//    {
+//        List<SecurityScheme> apiKeyList = new ArrayList<SecurityScheme>();
+//        apiKeyList.add(new ApiKey("Authorization", "Authorization", In.HEADER.toValue()));
+//        return apiKeyList;
+//    }
+//
+//    /**
+//     * 安全上下文
+//     */
+//    private List<SecurityContext> securityContexts()
+//    {
+//        List<SecurityContext> securityContexts = new ArrayList<>();
+//        securityContexts.add(
+//                SecurityContext.builder()
+//                        .securityReferences(defaultAuth())
+//                        .operationSelector(o -> o.requestMappingPattern().matches("/.*"))
+//                        .build());
+//        return securityContexts;
+//    }
+//
+//    /**
+//     * 默认的安全上引用
+//     */
+//    private List<SecurityReference> defaultAuth()
+//    {
+//        AuthorizationScope authorizationScope = new AuthorizationScope("global", "accessEverything");
+//        AuthorizationScope[] authorizationScopes = new AuthorizationScope[1];
+//        authorizationScopes[0] = authorizationScope;
+//        List<SecurityReference> securityReferences = new ArrayList<>();
+//        securityReferences.add(new SecurityReference("Authorization", authorizationScopes));
+//        return securityReferences;
+//    }
+//
+//    /**
+//     * 添加摘要信息
+//     */
+//    private ApiInfo apiInfo()
+//    {
+//        // 用ApiInfoBuilder进行定制
+//        return new ApiInfoBuilder()
+//                // 设置标题
+//                .title("标题:若依管理系统_接口文档")
+//                // 描述
+//                .description("描述:用于管理集团旗下公司的人员信息,具体包括XXX,XXX模块...")
+//                // 作者信息
+//                .contact(new Contact(ruoyiConfig.getName(), null, null))
+//                // 版本
+//                .version("版本号:" + ruoyiConfig.getVersion())
+//                .build();
+//    }
+//}

+ 6 - 61
background-service/zksy-admin/src/main/resources/application-dev.yml

@@ -1,61 +1,6 @@
-# 数据源配置
-spring:
-    datasource:
-        type: com.alibaba.druid.pool.DruidDataSource
-        driverClassName: com.mysql.cj.jdbc.Driver
-        druid:
-            # 主库数据源
-            master:
-                url: jdbc:mysql://47.107.107.47:3307/xh_credit_rating?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8
-                username: root
-                password: 123
-            # 从库数据源
-            slave:
-                # 从数据源开关/默认关闭
-                enabled: false
-                url: 
-                username: 
-                password: 
-            # 初始连接数
-            initialSize: 5
-            # 最小连接池数量
-            minIdle: 10
-            # 最大连接池数量
-            maxActive: 20
-            # 配置获取连接等待超时的时间
-            maxWait: 60000
-            # 配置连接超时时间
-            connectTimeout: 30000
-            # 配置网络超时时间
-            socketTimeout: 60000
-            # 配置间隔多久才进行一次检测,检测需要关闭的空闲连接,单位是毫秒
-            timeBetweenEvictionRunsMillis: 60000
-            # 配置一个连接在池中最小生存的时间,单位是毫秒
-            minEvictableIdleTimeMillis: 300000
-            # 配置一个连接在池中最大生存的时间,单位是毫秒
-            maxEvictableIdleTimeMillis: 900000
-            # 配置检测连接是否有效
-            validationQuery: SELECT 1 FROM DUAL
-            testWhileIdle: true
-            testOnBorrow: false
-            testOnReturn: false
-            webStatFilter: 
-                enabled: true
-            statViewServlet:
-                enabled: true
-                # 设置白名单,不填则允许所有访问
-                allow:
-                url-pattern: /druid/*
-                # 控制台管理用户名和密码
-                login-username: ruoyi
-                login-password: 123456
-            filter:
-                stat:
-                    enabled: true
-                    # 慢SQL记录
-                    log-slow-sql: true
-                    slow-sql-millis: 1000
-                    merge-sql: true
-                wall:
-                    config:
-                        multi-statement-allow: true
+minio:
+    endpoint: http://47.107.107.47:9000
+    accessKey: minio
+    secretKey: minio123
+    bucket: zksy-file
+    readPath: http://47.107.107.47:9000

+ 0 - 130
background-service/zksy-admin/src/main/resources/application.yml

@@ -1,130 +0,0 @@
-# 项目相关配置
-ruoyi:
-  # 名称
-  name: 新晃
-  # 版本
-  version: 1.0.0
-  # 版权年份
-  copyrightYear: 2024
-  # 文件路径 示例( Windows配置D:/ruoyi/uploadPath,Linux配置 /home/ruoyi/uploadPath)
-  profile: D:/ruoyi/uploadPath
-  # 获取ip地址开关
-  addressEnabled: false
-  # 验证码类型 math 数字计算 char 字符验证
-  captchaType: math
-
-# 开发环境配置
-server:
-  # 服务器的HTTP端口,默认为8080
-  port: 18902
-  servlet:
-    # 应用的访问路径
-    context-path: /
-  tomcat:
-    # tomcat的URI编码
-    uri-encoding: UTF-8
-    # 连接数满后的排队数,默认为100
-    accept-count: 1000
-    threads:
-      # tomcat最大线程数,默认为200
-      max: 800
-      # Tomcat启动初始化的线程数,默认值10
-      min-spare: 100
-
-# 日志配置
-logging:
-  level:
-    com.zksy: debug
-    org.springframework: warn
-
-# 用户配置
-user:
-  password:
-    # 密码最大错误次数
-    maxRetryCount: 5
-    # 密码锁定时间(默认10分钟)
-    lockTime: 10
-
-# Spring配置
-spring:
-  mvc:
-    pathmatch:
-      matching-strategy: ant_path_matcher
-  # 资源信息
-  messages:
-    # 国际化资源文件路径
-    basename: i18n/messages
-  # 文件上传
-  servlet:
-    multipart:
-      # 单个文件大小
-      max-file-size: 10MB
-      # 设置总上传的文件大小
-      max-request-size: 20MB
-  # 服务模块
-  devtools:
-    restart:
-      # 热部署开关
-      enabled: true
-  # redis 配置
-  redis:
-    # 地址
-    host: 47.107.107.47
-    # 端口,默认为6379
-    port: 6379
-    # 数据库索引
-    database: 0
-    # 密码
-    password:
-    # 连接超时时间
-    timeout: 10s
-    lettuce:
-      pool:
-        # 连接池中的最小空闲连接
-        min-idle: 0
-        # 连接池中的最大空闲连接
-        max-idle: 8
-        # 连接池的最大数据库连接数
-        max-active: 8
-        # #连接池最大阻塞等待时间(使用负值表示没有限制)
-        max-wait: -1ms
-
-# token配置
-token:
-  # 令牌自定义标识
-  header: Authorization
-  # 令牌密钥
-  secret: abcdefghijklmnopqrstuvwxyz
-  # 令牌有效期(默认30分钟)
-  expireTime: 30
-
-# MyBatis配置
-mybatis:
-  # 搜索指定包别名
-  typeAliasesPackage: com.zksy.**.domain
-  # 配置mapper的扫描,找到所有的mapper.xml映射文件
-  mapperLocations: classpath*:mapper/**/*Mapper.xml
-  # 加载全局的配置文件
-  configLocation: classpath:mybatis/mybatis-config.xml
-
-# PageHelper分页插件
-pagehelper:
-  helperDialect: mysql
-  supportMethodsArguments: true
-  params: count=countSql
-
-# Swagger配置
-swagger:
-  # 是否开启swagger
-  enabled: true
-  # 请求前缀
-  pathMapping: /dev-api
-
-# 防止XSS攻击
-xss:
-  # 过滤开关
-  enabled: true
-  # 排除链接(多个用逗号分隔)
-  excludes: /system/notice
-  # 匹配链接
-  urlPatterns: /system/*,/monitor/*,/tool/*

+ 92 - 1
background-service/zksy-admin/src/main/resources/bootstrap.yaml

@@ -1,3 +1,4 @@
+# Spring配置
 spring:
   application:
     name: background-service
@@ -14,4 +15,94 @@ spring:
       discovery:
         server-addr: 47.107.107.47:8848
         namespace: 630f2a98-b955-4861-ab57-ac6ec110ed04
-      server-addr: 47.107.107.47:8848
+      server-addr: 47.107.107.47:8848
+      config:
+        namespace: 630f2a98-b955-4861-ab57-ac6ec110ed04
+        server-addr: 47.107.107.47:8848
+        file-extension: yaml
+        shared-configs:
+          - dataId: background-service.yaml
+          - dataId: xh-shared-log.yaml
+  mvc:
+    pathmatch:
+      matching-strategy: ant_path_matcher
+  # 资源信息
+  messages:
+    # 国际化资源文件路径
+    basename: i18n/messages
+  # 文件上传
+  servlet:
+    multipart:
+      # 单个文件大小
+      max-file-size: 10MB
+      # 设置总上传的文件大小
+      max-request-size: 20MB
+  # 服务模块
+  devtools:
+    restart:
+      # 热部署开关
+      enabled: true
+ruoyi:
+  # 名称
+  name: 新晃
+  # 版本
+  version: 1.0.0
+  # 版权年份
+  copyrightYear: 2024
+  # 文件路径 示例( Windows配置D:/ruoyi/uploadPath,Linux配置 /home/ruoyi/uploadPath)
+  profile: D:/ruoyi/uploadPath
+  # 获取ip地址开关
+  addressEnabled: false
+  # 验证码类型 math 数字计算 char 字符验证
+  captchaType: math
+
+# 开发环境配置
+server:
+  # 服务器的HTTP端口,默认为8080
+  servlet:
+    # 应用的访问路径
+    context-path: /
+  tomcat:
+    # tomcat的URI编码
+    uri-encoding: UTF-8
+    # 连接数满后的排队数,默认为100
+    accept-count: 1000
+    threads:
+      # tomcat最大线程数,默认为200
+      max: 800
+      # Tomcat启动初始化的线程数,默认值10
+      min-spare: 100
+
+# 日志配置
+#logging:
+#  level:
+#    com.zksy: debug
+#    org.springframework: warn
+
+# 用户配置
+user:
+  password:
+    # 密码最大错误次数
+    maxRetryCount: 5
+    # 密码锁定时间(默认10分钟)
+    lockTime: 10
+
+
+
+# token配置
+token:
+  # 令牌自定义标识
+  header: Authorization
+  # 令牌密钥
+  secret: abcdefghijklmnopqrstuvwxyz
+  # 令牌有效期(默认30分钟)
+  expireTime: 30
+
+# 防止XSS攻击
+xss:
+  # 过滤开关
+  enabled: true
+  # 排除链接(多个用逗号分隔)
+  excludes: /system/notice
+  # 匹配链接
+  urlPatterns: /system/*,/monitor/*,/tool/*

+ 0 - 0
background-service/zksy-admin/src/main/resources/logback.xml → background-service/zksy-admin/src/main/resources/logback.xml.bak


+ 9 - 0
background-service/zksy-common/pom.xml

@@ -119,6 +119,15 @@
             <artifactId>javax.servlet-api</artifactId>
         </dependency>
 
+        <dependency>
+            <groupId>com.github.xiaoymin</groupId>
+            <artifactId>knife4j-openapi2-spring-boot-starter</artifactId>
+        </dependency>
+
+        <dependency>
+            <groupId>com.baomidou</groupId>
+            <artifactId>mybatis-plus-boot-starter</artifactId>
+        </dependency>
     </dependencies>
 
 </project>

+ 27 - 0
background-service/zksy-common/src/main/java/com/zksy/common/core/domain/BasePo.java

@@ -0,0 +1,27 @@
+package com.zksy.common.core.domain;
+
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.zksy.common.annotation.Excel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.AllArgsConstructor;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+@Data
+@AllArgsConstructor
+@NoArgsConstructor
+public class BasePo {
+
+    @ApiModelProperty(value = "主键")
+    /** 主键 */
+    @TableId(type = IdType.AUTO)
+    private Long xhCodeId;
+    /**
+     * 统一社会信用代码
+     */
+    @ApiModelProperty(value = "统一社会信用代码")
+    @Excel(name = "统一社会信用代码")
+    private String uniCode;
+
+}

+ 26 - 0
background-service/zksy-common/src/main/java/com/zksy/common/domain/ConditionVo.java

@@ -0,0 +1,26 @@
+package com.zksy.common.domain;
+
+import lombok.Data;
+
+import java.io.Serializable;
+
+/**
+ * @author nahida
+ * @since 2020-03-16
+ */
+@Data
+public class ConditionVo implements Serializable {
+    private static final long serialVersionUID = -5099378457111419832L;
+    /**
+     * 数据库字段名
+     */
+    private String column;
+    /**
+     * 字段值
+     */
+    private String value;
+    /**
+     * 连接类型,如llike,equals,gt,ge,lt,le
+     */
+    private String type;
+}

+ 58 - 0
background-service/zksy-common/src/main/java/com/zksy/common/utils/SearchUtil.java

@@ -0,0 +1,58 @@
+package com.zksy.common.utils;
+
+
+import com.alibaba.fastjson2.JSON;
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.baomidou.mybatisplus.core.toolkit.StringUtils;
+import com.zksy.common.domain.ConditionVo;
+
+import java.net.URLDecoder;
+import java.util.List;
+/**
+ * @author zkh
+ * @since 2020-03-16
+ */
+public class SearchUtil {
+    public static QueryWrapper parseWhereSql(String conditionJson) throws Exception{
+        QueryWrapper<?> queryWrapper = new QueryWrapper();
+        String[] empty = {"none"};
+        if(StringUtils.isNotBlank(conditionJson)){
+            conditionJson = URLDecoder.decode(conditionJson, "UTF-8");
+            List<ConditionVo> conditionList = JSON.parseArray(conditionJson,ConditionVo.class);
+            if(conditionList.size()>0){
+                for(ConditionVo conditionVo : conditionList){
+                    switch (conditionVo.getType()){
+                        case "eq": queryWrapper.eq(conditionVo.getColumn(),conditionVo.getValue());break;
+                        case "ne": queryWrapper.ne(conditionVo.getColumn(),conditionVo.getValue());break;
+                        case "between": queryWrapper.between(conditionVo.getColumn(), conditionVo.getValue() == null ? empty : conditionVo.getValue().split(",")[0],conditionVo.getValue().split(",")[1]);break;
+                        case "like": queryWrapper.like(conditionVo.getColumn(),conditionVo.getValue());break;
+                        case "leftLike": queryWrapper.likeLeft(conditionVo.getColumn(),conditionVo.getValue());break;
+                        case "rightLike": queryWrapper.likeRight(conditionVo.getColumn(),conditionVo.getValue());break;
+                        case "notLike": queryWrapper.notLike(conditionVo.getColumn(),conditionVo.getValue());break;
+                        case "exists": queryWrapper.exists(conditionVo.getValue());break;
+                        case "notExists": queryWrapper.notExists(conditionVo.getValue());break;
+                        case "gt": queryWrapper.gt(conditionVo.getColumn(),conditionVo.getValue());break;
+                        case "lt": queryWrapper.lt(conditionVo.getColumn(),conditionVo.getValue());break;
+                        case "ge": queryWrapper.ge(conditionVo.getColumn(),conditionVo.getValue());break;
+                        case "le": queryWrapper.le(conditionVo.getColumn(),conditionVo.getValue());break;
+                        case "or": queryWrapper.or();break;
+                        case "orLike2":
+                            String[] columns = conditionVo.getColumn().split(",");
+                            queryWrapper.and(wrapper ->
+                                    wrapper.and(swrapper -> swrapper.like(columns[0], conditionVo.getValue()).or().like(columns[1], conditionVo.getValue())));
+                            break;
+                        case "in": queryWrapper.in(conditionVo.getColumn(), conditionVo.getValue() == null ? empty : conditionVo.getValue().split(","));break;
+                        case "notIn": queryWrapper.notIn(conditionVo.getColumn(), conditionVo.getValue() == null ? empty : conditionVo.getValue().split(","));break;
+                        case "isNull": queryWrapper.isNull(conditionVo.getColumn());break;
+                        case "isNotNull": queryWrapper.isNotNull(conditionVo.getColumn());break;
+                        case "orderByAsc": queryWrapper.orderByAsc(conditionVo.getColumn());break;
+                        case "orderByDesc": queryWrapper.orderByDesc(conditionVo.getColumn());break;
+                        default:
+                    }
+                }
+            }
+        }
+        return queryWrapper;
+    }
+
+}

+ 132 - 132
background-service/zksy-framework/src/main/java/com/zksy/framework/config/MyBatisConfig.java

@@ -1,132 +1,132 @@
-package com.zksy.framework.config;
-
-import java.io.IOException;
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.HashSet;
-import java.util.List;
-import javax.sql.DataSource;
-import org.apache.ibatis.io.VFS;
-import org.apache.ibatis.session.SqlSessionFactory;
-import org.mybatis.spring.SqlSessionFactoryBean;
-import org.mybatis.spring.boot.autoconfigure.SpringBootVFS;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.context.annotation.Bean;
-import org.springframework.context.annotation.Configuration;
-import org.springframework.core.env.Environment;
-import org.springframework.core.io.DefaultResourceLoader;
-import org.springframework.core.io.Resource;
-import org.springframework.core.io.support.PathMatchingResourcePatternResolver;
-import org.springframework.core.io.support.ResourcePatternResolver;
-import org.springframework.core.type.classreading.CachingMetadataReaderFactory;
-import org.springframework.core.type.classreading.MetadataReader;
-import org.springframework.core.type.classreading.MetadataReaderFactory;
-import org.springframework.util.ClassUtils;
-import com.zksy.common.utils.StringUtils;
-
-/**
- * Mybatis支持*匹配扫描包
- * 
- * @author ruoyi
- */
-@Configuration
-public class MyBatisConfig
-{
-    @Autowired
-    private Environment env;
-
-    static final String DEFAULT_RESOURCE_PATTERN = "**/*.class";
-
-    public static String setTypeAliasesPackage(String typeAliasesPackage)
-    {
-        ResourcePatternResolver resolver = (ResourcePatternResolver) new PathMatchingResourcePatternResolver();
-        MetadataReaderFactory metadataReaderFactory = new CachingMetadataReaderFactory(resolver);
-        List<String> allResult = new ArrayList<String>();
-        try
-        {
-            for (String aliasesPackage : typeAliasesPackage.split(","))
-            {
-                List<String> result = new ArrayList<String>();
-                aliasesPackage = ResourcePatternResolver.CLASSPATH_ALL_URL_PREFIX
-                        + ClassUtils.convertClassNameToResourcePath(aliasesPackage.trim()) + "/" + DEFAULT_RESOURCE_PATTERN;
-                Resource[] resources = resolver.getResources(aliasesPackage);
-                if (resources != null && resources.length > 0)
-                {
-                    MetadataReader metadataReader = null;
-                    for (Resource resource : resources)
-                    {
-                        if (resource.isReadable())
-                        {
-                            metadataReader = metadataReaderFactory.getMetadataReader(resource);
-                            try
-                            {
-                                result.add(Class.forName(metadataReader.getClassMetadata().getClassName()).getPackage().getName());
-                            }
-                            catch (ClassNotFoundException e)
-                            {
-                                e.printStackTrace();
-                            }
-                        }
-                    }
-                }
-                if (result.size() > 0)
-                {
-                    HashSet<String> hashResult = new HashSet<String>(result);
-                    allResult.addAll(hashResult);
-                }
-            }
-            if (allResult.size() > 0)
-            {
-                typeAliasesPackage = String.join(",", (String[]) allResult.toArray(new String[0]));
-            }
-            else
-            {
-                throw new RuntimeException("mybatis typeAliasesPackage 路径扫描错误,参数typeAliasesPackage:" + typeAliasesPackage + "未找到任何包");
-            }
-        }
-        catch (IOException e)
-        {
-            e.printStackTrace();
-        }
-        return typeAliasesPackage;
-    }
-
-    public Resource[] resolveMapperLocations(String[] mapperLocations)
-    {
-        ResourcePatternResolver resourceResolver = new PathMatchingResourcePatternResolver();
-        List<Resource> resources = new ArrayList<Resource>();
-        if (mapperLocations != null)
-        {
-            for (String mapperLocation : mapperLocations)
-            {
-                try
-                {
-                    Resource[] mappers = resourceResolver.getResources(mapperLocation);
-                    resources.addAll(Arrays.asList(mappers));
-                }
-                catch (IOException e)
-                {
-                    // ignore
-                }
-            }
-        }
-        return resources.toArray(new Resource[resources.size()]);
-    }
-
-    @Bean
-    public SqlSessionFactory sqlSessionFactory(DataSource dataSource) throws Exception
-    {
-        String typeAliasesPackage = env.getProperty("mybatis.typeAliasesPackage");
-        String mapperLocations = env.getProperty("mybatis.mapperLocations");
-        String configLocation = env.getProperty("mybatis.configLocation");
-        typeAliasesPackage = setTypeAliasesPackage(typeAliasesPackage);
-        VFS.addImplClass(SpringBootVFS.class);
-
-        final SqlSessionFactoryBean sessionFactory = new SqlSessionFactoryBean();
-        sessionFactory.setDataSource(dataSource);
-        sessionFactory.setTypeAliasesPackage(typeAliasesPackage);
-        sessionFactory.setMapperLocations(resolveMapperLocations(StringUtils.split(mapperLocations, ",")));
-        sessionFactory.setConfigLocation(new DefaultResourceLoader().getResource(configLocation));
-        return sessionFactory.getObject();
-    }
-}
+//package com.zksy.framework.config;
+//
+//import java.io.IOException;
+//import java.util.ArrayList;
+//import java.util.Arrays;
+//import java.util.HashSet;
+//import java.util.List;
+//import javax.sql.DataSource;
+//import org.apache.ibatis.io.VFS;
+//import org.apache.ibatis.session.SqlSessionFactory;
+//import org.mybatis.spring.SqlSessionFactoryBean;
+//import org.mybatis.spring.boot.autoconfigure.SpringBootVFS;
+//import org.springframework.beans.factory.annotation.Autowired;
+//import org.springframework.context.annotation.Bean;
+//import org.springframework.context.annotation.Configuration;
+//import org.springframework.core.env.Environment;
+//import org.springframework.core.io.DefaultResourceLoader;
+//import org.springframework.core.io.Resource;
+//import org.springframework.core.io.support.PathMatchingResourcePatternResolver;
+//import org.springframework.core.io.support.ResourcePatternResolver;
+//import org.springframework.core.type.classreading.CachingMetadataReaderFactory;
+//import org.springframework.core.type.classreading.MetadataReader;
+//import org.springframework.core.type.classreading.MetadataReaderFactory;
+//import org.springframework.util.ClassUtils;
+//import com.zksy.common.utils.StringUtils;
+//
+///**
+// * Mybatis支持*匹配扫描包
+// *
+// * @author ruoyi
+// */
+//@Configuration
+//public class MyBatisConfig
+//{
+//    @Autowired
+//    private Environment env;
+//
+//    static final String DEFAULT_RESOURCE_PATTERN = "**/*.class";
+//
+//    public static String setTypeAliasesPackage(String typeAliasesPackage)
+//    {
+//        ResourcePatternResolver resolver = (ResourcePatternResolver) new PathMatchingResourcePatternResolver();
+//        MetadataReaderFactory metadataReaderFactory = new CachingMetadataReaderFactory(resolver);
+//        List<String> allResult = new ArrayList<String>();
+//        try
+//        {
+//            for (String aliasesPackage : typeAliasesPackage.split(","))
+//            {
+//                List<String> result = new ArrayList<String>();
+//                aliasesPackage = ResourcePatternResolver.CLASSPATH_ALL_URL_PREFIX
+//                        + ClassUtils.convertClassNameToResourcePath(aliasesPackage.trim()) + "/" + DEFAULT_RESOURCE_PATTERN;
+//                Resource[] resources = resolver.getResources(aliasesPackage);
+//                if (resources != null && resources.length > 0)
+//                {
+//                    MetadataReader metadataReader = null;
+//                    for (Resource resource : resources)
+//                    {
+//                        if (resource.isReadable())
+//                        {
+//                            metadataReader = metadataReaderFactory.getMetadataReader(resource);
+//                            try
+//                            {
+//                                result.add(Class.forName(metadataReader.getClassMetadata().getClassName()).getPackage().getName());
+//                            }
+//                            catch (ClassNotFoundException e)
+//                            {
+//                                e.printStackTrace();
+//                            }
+//                        }
+//                    }
+//                }
+//                if (result.size() > 0)
+//                {
+//                    HashSet<String> hashResult = new HashSet<String>(result);
+//                    allResult.addAll(hashResult);
+//                }
+//            }
+//            if (allResult.size() > 0)
+//            {
+//                typeAliasesPackage = String.join(",", (String[]) allResult.toArray(new String[0]));
+//            }
+//            else
+//            {
+//                throw new RuntimeException("mybatis typeAliasesPackage 路径扫描错误,参数typeAliasesPackage:" + typeAliasesPackage + "未找到任何包");
+//            }
+//        }
+//        catch (IOException e)
+//        {
+//            e.printStackTrace();
+//        }
+//        return typeAliasesPackage;
+//    }
+//
+//    public Resource[] resolveMapperLocations(String[] mapperLocations)
+//    {
+//        ResourcePatternResolver resourceResolver = new PathMatchingResourcePatternResolver();
+//        List<Resource> resources = new ArrayList<Resource>();
+//        if (mapperLocations != null)
+//        {
+//            for (String mapperLocation : mapperLocations)
+//            {
+//                try
+//                {
+//                    Resource[] mappers = resourceResolver.getResources(mapperLocation);
+//                    resources.addAll(Arrays.asList(mappers));
+//                }
+//                catch (IOException e)
+//                {
+//                    // ignore
+//                }
+//            }
+//        }
+//        return resources.toArray(new Resource[resources.size()]);
+//    }
+//
+//    @Bean
+//    public SqlSessionFactory sqlSessionFactory(DataSource dataSource) throws Exception
+//    {
+//        String typeAliasesPackage = env.getProperty("mybatis.typeAliasesPackage");
+//        String mapperLocations = env.getProperty("mybatis.mapperLocations");
+//        String configLocation = env.getProperty("mybatis.configLocation");
+//        typeAliasesPackage = setTypeAliasesPackage(typeAliasesPackage);
+//        VFS.addImplClass(SpringBootVFS.class);
+//
+//        final SqlSessionFactoryBean sessionFactory = new SqlSessionFactoryBean();
+//        sessionFactory.setDataSource(dataSource);
+//        sessionFactory.setTypeAliasesPackage(typeAliasesPackage);
+//        sessionFactory.setMapperLocations(resolveMapperLocations(StringUtils.split(mapperLocations, ",")));
+//        sessionFactory.setConfigLocation(new DefaultResourceLoader().getResource(configLocation));
+//        return sessionFactory.getObject();
+//    }
+//}

+ 63 - 0
background-service/zksy-framework/src/main/java/com/zksy/framework/config/MybatisPlusConfig.java

@@ -0,0 +1,63 @@
+package com.zksy.framework.config;
+
+import com.baomidou.mybatisplus.annotation.DbType;
+import com.baomidou.mybatisplus.extension.plugins.MybatisPlusInterceptor;
+import com.baomidou.mybatisplus.extension.plugins.inner.BlockAttackInnerInterceptor;
+import com.baomidou.mybatisplus.extension.plugins.inner.OptimisticLockerInnerInterceptor;
+import com.baomidou.mybatisplus.extension.plugins.inner.PaginationInnerInterceptor;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.transaction.annotation.EnableTransactionManagement;
+import com.baomidou.mybatisplus.core.config.GlobalConfig.DbConfig;
+
+/**
+ * Mybatis Plus 配置
+ *
+ * @author ruoyi
+ */
+@EnableTransactionManagement(proxyTargetClass = true)
+@Configuration
+public class MybatisPlusConfig
+{
+    @Bean
+    public MybatisPlusInterceptor mybatisPlusInterceptor()
+    {
+        MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor();
+        // 分页插件
+        interceptor.addInnerInterceptor(paginationInnerInterceptor());
+        // 乐观锁插件
+        interceptor.addInnerInterceptor(optimisticLockerInnerInterceptor());
+        // 阻断插件
+        interceptor.addInnerInterceptor(blockAttackInnerInterceptor());
+        return interceptor;
+    }
+
+    /**
+     * 分页插件,自动识别数据库类型 https://baomidou.com/guide/interceptor-pagination.html
+     */
+    public PaginationInnerInterceptor paginationInnerInterceptor()
+    {
+        PaginationInnerInterceptor paginationInnerInterceptor = new PaginationInnerInterceptor();
+        // 设置数据库类型为mysql
+        paginationInnerInterceptor.setDbType(DbType.MYSQL);
+        // 设置最大单页限制数量,默认 500 条,-1 不受限制
+        paginationInnerInterceptor.setMaxLimit(-1L);
+        return paginationInnerInterceptor;
+    }
+
+    /**
+     * 乐观锁插件 https://baomidou.com/guide/interceptor-optimistic-locker.html
+     */
+    public OptimisticLockerInnerInterceptor optimisticLockerInnerInterceptor()
+    {
+        return new OptimisticLockerInnerInterceptor();
+    }
+
+    /**
+     * 如果是对全表的删除或更新操作,就会终止该操作 https://baomidou.com/guide/interceptor-block-attack.html
+     */
+    public BlockAttackInnerInterceptor blockAttackInnerInterceptor()
+    {
+        return new BlockAttackInnerInterceptor();
+    }
+}

+ 1 - 1
background-service/zksy-framework/src/main/java/com/zksy/framework/config/SecurityConfig.java

@@ -111,7 +111,7 @@ public class SecurityConfig
             .authorizeHttpRequests((requests) -> {
                 permitAllUrl.getUrls().forEach(url -> requests.antMatchers(url).permitAll());
                 // 对于登录login 注册register 验证码captchaImage 允许匿名访问
-                requests.antMatchers("/login", "/register", "/captchaImage").permitAll()
+                requests.antMatchers("/login", "/register", "/captchaImage","/loginNoNeedAuth").permitAll()
                     // 静态资源,可匿名访问
                     .antMatchers(HttpMethod.GET, "/", "/*.html", "/**/*.html", "/**/*.css", "/**/*.js", "/profile/**").permitAll()
                     .antMatchers("/swagger-ui.html", "/swagger-resources/**", "/webjars/**", "/*/api-docs", "/druid/**").permitAll()

+ 36 - 0
background-service/zksy-framework/src/main/java/com/zksy/framework/web/service/SysLoginService.java

@@ -52,6 +52,42 @@ public class SysLoginService
     @Autowired
     private ISysConfigService configService;
 
+    public String loginNoNeedAuth(String username, String password){
+        // 登录前置校验
+        loginPreCheck(username, password);
+        // 用户验证
+        Authentication authentication = null;
+        try
+        {
+            UsernamePasswordAuthenticationToken authenticationToken = new UsernamePasswordAuthenticationToken(username, password);
+            AuthenticationContextHolder.setContext(authenticationToken);
+            // 该方法会去调用UserDetailsServiceImpl.loadUserByUsername
+            authentication = authenticationManager.authenticate(authenticationToken);
+        }
+        catch (Exception e)
+        {
+            if (e instanceof BadCredentialsException)
+            {
+                AsyncManager.me().execute(AsyncFactory.recordLogininfor(username, Constants.LOGIN_FAIL, MessageUtils.message("user.password.not.match")));
+                throw new UserPasswordNotMatchException();
+            }
+            else
+            {
+                AsyncManager.me().execute(AsyncFactory.recordLogininfor(username, Constants.LOGIN_FAIL, e.getMessage()));
+                throw new ServiceException(e.getMessage());
+            }
+        }
+        finally
+        {
+            AuthenticationContextHolder.clearContext();
+        }
+        AsyncManager.me().execute(AsyncFactory.recordLogininfor(username, Constants.LOGIN_SUCCESS, MessageUtils.message("user.login.success")));
+        LoginUser loginUser = (LoginUser) authentication.getPrincipal();
+        recordLoginInfo(loginUser.getUserId());
+        // 生成token
+        return tokenService.createToken(loginUser);
+    }
+
     /**
      * 登录验证
      * 

+ 13 - 10
background-service/zksy-generator/src/main/java/com/zksy/generator/util/VelocityUtils.java

@@ -57,7 +57,8 @@ public class VelocityUtils
         velocityContext.put("datetime", DateUtils.getDate());
         velocityContext.put("pkColumn", genTable.getPkColumn());
         velocityContext.put("importList", getImportList(genTable));
-        velocityContext.put("permissionPrefix", getPermissionPrefix(moduleName, businessName));
+        //velocityContext.put("permissionPrefix", getPermissionPrefix(moduleName, businessName));
+        velocityContext.put("permissionPrefix", getPermissionPrefix(moduleName, StringUtils.uncapitalize(genTable.getClassName())));
         velocityContext.put("columns", genTable.getColumns());
         velocityContext.put("table", genTable);
         velocityContext.put("dicts", getDicts(genTable));
@@ -135,11 +136,11 @@ public class VelocityUtils
             useWebType = "vm/vue/v3";
         }
         List<String> templates = new ArrayList<String>();
-        templates.add("vm/java/domain.java.vm");
-        templates.add("vm/java/mapper.java.vm");
-        templates.add("vm/java/service.java.vm");
-        templates.add("vm/java/serviceImpl.java.vm");
-        templates.add("vm/java/controller.java.vm");
+        templates.add("vm/java/domain.java.vm" );
+        templates.add("vm/java/mapper.java.vm" );
+        templates.add("vm/java/service.java.vm" );
+        templates.add("vm/java/serviceImpl.java.vm" );
+        templates.add("vm/java/controller.java.vm" );
         templates.add("vm/xml/mapper.xml.vm");
         templates.add("vm/sql/sql.vm");
         templates.add("vm/js/api.js.vm");
@@ -154,7 +155,7 @@ public class VelocityUtils
         else if (GenConstants.TPL_SUB.equals(tplCategory))
         {
             templates.add(useWebType + "/index.vue.vm");
-            templates.add("vm/java/sub-domain.java.vm");
+            templates.add("vm/java/bak/sub-domain.java.vm" );
         }
         return templates;
     }
@@ -172,6 +173,8 @@ public class VelocityUtils
         String moduleName = genTable.getModuleName();
         // 大写类名
         String className = genTable.getClassName();
+        // 小写类名
+        String className2 = StringUtils.uncapitalize(genTable.getClassName());
         // 业务名称
         String businessName = genTable.getBusinessName();
 
@@ -213,15 +216,15 @@ public class VelocityUtils
         }
         else if (template.contains("api.js.vm"))
         {
-            fileName = StringUtils.format("{}/api/{}/{}.js", vuePath, moduleName, businessName);
+            fileName = StringUtils.format("{}/api/{}/{}.js", vuePath, moduleName, className2);
         }
         else if (template.contains("index.vue.vm"))
         {
-            fileName = StringUtils.format("{}/views/{}/{}/index.vue", vuePath, moduleName, businessName);
+            fileName = StringUtils.format("{}/views/{}/{}/index.vue", vuePath, moduleName, className2);
         }
         else if (template.contains("index-tree.vue.vm"))
         {
-            fileName = StringUtils.format("{}/views/{}/{}/index.vue", vuePath, moduleName, businessName);
+            fileName = StringUtils.format("{}/views/{}/{}/index.vue", vuePath, moduleName, className2);
         }
         return fileName;
     }

+ 2 - 2
background-service/zksy-generator/src/main/resources/generator.yml

@@ -1,9 +1,9 @@
 # 代码生成
 gen:
   # 作者
-  author: ruoyi
+  author: Administrator
   # 默认生成包路径 system 需改成自己的模块名称 如 system monitor tool
-  packageName: com.zksy.system
+  packageName: com.zksy.basicData
   # 自动去除表前缀,默认是false
   autoRemovePre: false
   # 表前缀(生成类名不会包含表前缀,多个用逗号分隔)

+ 115 - 0
background-service/zksy-generator/src/main/resources/vm/java/bak/controller.java.vm

@@ -0,0 +1,115 @@
+package ${packageName}.controller;
+
+import java.util.List;
+import javax.servlet.http.HttpServletResponse;
+import org.springframework.security.access.prepost.PreAuthorize;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.PutMapping;
+import org.springframework.web.bind.annotation.DeleteMapping;
+import org.springframework.web.bind.annotation.PathVariable;
+import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+import com.zksy.common.annotation.Log;
+import com.zksy.common.core.controller.BaseController;
+import com.zksy.common.core.domain.AjaxResult;
+import com.zksy.common.enums.BusinessType;
+import ${packageName}.domain.${ClassName};
+import ${packageName}.service.I${ClassName}Service;
+import com.zksy.common.utils.poi.ExcelUtil;
+#if($table.crud || $table.sub)
+import com.zksy.common.core.page.TableDataInfo;
+#elseif($table.tree)
+#end
+
+/**
+ * ${functionName}Controller
+ * 
+ * @author ${author}
+ * @date ${datetime}
+ */
+@RestController
+@RequestMapping("/${moduleName}/${businessName}")
+public class ${ClassName}Controller extends BaseController
+{
+    @Autowired
+    private I${ClassName}Service ${className}Service;
+
+    /**
+     * 查询${functionName}列表
+     */
+    @PreAuthorize("@ss.hasPermi('${permissionPrefix}:list')")
+    @GetMapping("/list")
+#if($table.crud || $table.sub)
+    public TableDataInfo list(${ClassName} ${className})
+    {
+        startPage();
+        List<${ClassName}> list = ${className}Service.select${ClassName}List(${className});
+        return getDataTable(list);
+    }
+#elseif($table.tree)
+    public AjaxResult list(${ClassName} ${className})
+    {
+        List<${ClassName}> list = ${className}Service.select${ClassName}List(${className});
+        return success(list);
+    }
+#end
+
+    /**
+     * 导出${functionName}列表
+     */
+    @PreAuthorize("@ss.hasPermi('${permissionPrefix}:export')")
+    @Log(title = "${functionName}", businessType = BusinessType.EXPORT)
+    @PostMapping("/export")
+    public void export(HttpServletResponse response, ${ClassName} ${className})
+    {
+        List<${ClassName}> list = ${className}Service.select${ClassName}List(${className});
+        ExcelUtil<${ClassName}> util = new ExcelUtil<${ClassName}>(${ClassName}.class);
+        util.exportExcel(response, list, "${functionName}数据");
+    }
+
+    /**
+     * 获取${functionName}详细信息
+     */
+    @PreAuthorize("@ss.hasPermi('${permissionPrefix}:query')")
+    @GetMapping(value = "/{${pkColumn.javaField}}")
+    public AjaxResult getInfo(@PathVariable("${pkColumn.javaField}") ${pkColumn.javaType} ${pkColumn.javaField})
+    {
+        return success(${className}Service.select${ClassName}By${pkColumn.capJavaField}(${pkColumn.javaField}));
+    }
+
+    /**
+     * 新增${functionName}
+     */
+    @PreAuthorize("@ss.hasPermi('${permissionPrefix}:add')")
+    @Log(title = "${functionName}", businessType = BusinessType.INSERT)
+    @PostMapping
+    public AjaxResult add(@RequestBody ${ClassName} ${className})
+    {
+        return toAjax(${className}Service.insert${ClassName}(${className}));
+    }
+
+    /**
+     * 修改${functionName}
+     */
+    @PreAuthorize("@ss.hasPermi('${permissionPrefix}:edit')")
+    @Log(title = "${functionName}", businessType = BusinessType.UPDATE)
+    @PutMapping
+    public AjaxResult edit(@RequestBody ${ClassName} ${className})
+    {
+        return toAjax(${className}Service.update${ClassName}(${className}));
+    }
+
+    /**
+     * 删除${functionName}
+     */
+    @PreAuthorize("@ss.hasPermi('${permissionPrefix}:remove')")
+    @Log(title = "${functionName}", businessType = BusinessType.DELETE)
+	@DeleteMapping("/{${pkColumn.javaField}s}")
+    public AjaxResult remove(@PathVariable ${pkColumn.javaType}[] ${pkColumn.javaField}s)
+    {
+        return toAjax(${className}Service.delete${ClassName}By${pkColumn.capJavaField}s(${pkColumn.javaField}s));
+    }
+}

+ 103 - 0
background-service/zksy-generator/src/main/resources/vm/java/bak/domain.java.vm

@@ -0,0 +1,103 @@
+package ${packageName}.domain;
+
+#foreach ($import in $importList)
+import ${import};
+#end
+import org.apache.commons.lang3.builder.ToStringBuilder;
+import org.apache.commons.lang3.builder.ToStringStyle;
+import com.zksy.common.annotation.Excel;
+#if($table.crud || $table.sub)
+#elseif($table.tree)
+#end
+
+/**
+ * ${functionName}对象 ${tableName}
+ * 
+ * @author ${author}
+ * @date ${datetime}
+ */
+#if($table.crud || $table.sub)
+#set($Entity="BaseEntity")
+#elseif($table.tree)
+#set($Entity="TreeEntity")
+#end
+public class ${ClassName} extends ${Entity}
+{
+    private static final long serialVersionUID = 1L;
+
+#foreach ($column in $columns)
+#if(!$table.isSuperColumn($column.javaField))
+    /** $column.columnComment */
+#if($column.list)
+#set($parentheseIndex=$column.columnComment.indexOf("("))
+#if($parentheseIndex != -1)
+#set($comment=$column.columnComment.substring(0, $parentheseIndex))
+#else
+#set($comment=$column.columnComment)
+#end
+#if($parentheseIndex != -1)
+    @Excel(name = "${comment}", readConverterExp = "$column.readConverterExp()")
+#elseif($column.javaType == 'Date')
+    @JsonFormat(pattern = "yyyy-MM-dd")
+    @Excel(name = "${comment}", width = 30, dateFormat = "yyyy-MM-dd")
+#else
+    @Excel(name = "${comment}")
+#end
+#end
+    private $column.javaType $column.javaField;
+
+#end
+#end
+#if($table.sub)
+    /** $table.subTable.functionName信息 */
+    private List<${subClassName}> ${subclassName}List;
+
+#end
+#foreach ($column in $columns)
+#if(!$table.isSuperColumn($column.javaField))
+#if($column.javaField.length() > 2 && $column.javaField.substring(1,2).matches("[A-Z]"))
+#set($AttrName=$column.javaField)
+#else
+#set($AttrName=$column.javaField.substring(0,1).toUpperCase() + ${column.javaField.substring(1)})
+#end
+    public void set${AttrName}($column.javaType $column.javaField) 
+    {
+        this.$column.javaField = $column.javaField;
+    }
+
+    public $column.javaType get${AttrName}() 
+    {
+        return $column.javaField;
+    }
+#end
+#end
+
+#if($table.sub)
+    public List<${subClassName}> get${subClassName}List()
+    {
+        return ${subclassName}List;
+    }
+
+    public void set${subClassName}List(List<${subClassName}> ${subclassName}List)
+    {
+        this.${subclassName}List = ${subclassName}List;
+    }
+
+#end
+    @Override
+    public String toString() {
+        return new ToStringBuilder(this,ToStringStyle.MULTI_LINE_STYLE)
+#foreach ($column in $columns)
+#if($column.javaField.length() > 2 && $column.javaField.substring(1,2).matches("[A-Z]"))
+#set($AttrName=$column.javaField)
+#else
+#set($AttrName=$column.javaField.substring(0,1).toUpperCase() + ${column.javaField.substring(1)})
+#end
+            .append("${column.javaField}", get${AttrName}())
+#end
+#if($table.sub)
+            .append("${subclassName}List", get${subClassName}List())
+#end
+            .toString();
+    }
+}

+ 91 - 0
background-service/zksy-generator/src/main/resources/vm/java/bak/mapper.java.vm

@@ -0,0 +1,91 @@
+package ${packageName}.mapper;
+
+import java.util.List;
+import ${packageName}.domain.${ClassName};
+#if($table.sub)
+import ${packageName}.domain.${subClassName};
+#end
+
+/**
+ * ${functionName}Mapper接口
+ * 
+ * @author ${author}
+ * @date ${datetime}
+ */
+public interface ${ClassName}Mapper 
+{
+    /**
+     * 查询${functionName}
+     * 
+     * @param ${pkColumn.javaField} ${functionName}主键
+     * @return ${functionName}
+     */
+    public ${ClassName} select${ClassName}By${pkColumn.capJavaField}(${pkColumn.javaType} ${pkColumn.javaField});
+
+    /**
+     * 查询${functionName}列表
+     * 
+     * @param ${className} ${functionName}
+     * @return ${functionName}集合
+     */
+    public List<${ClassName}> select${ClassName}List(${ClassName} ${className});
+
+    /**
+     * 新增${functionName}
+     * 
+     * @param ${className} ${functionName}
+     * @return 结果
+     */
+    public int insert${ClassName}(${ClassName} ${className});
+
+    /**
+     * 修改${functionName}
+     * 
+     * @param ${className} ${functionName}
+     * @return 结果
+     */
+    public int update${ClassName}(${ClassName} ${className});
+
+    /**
+     * 删除${functionName}
+     * 
+     * @param ${pkColumn.javaField} ${functionName}主键
+     * @return 结果
+     */
+    public int delete${ClassName}By${pkColumn.capJavaField}(${pkColumn.javaType} ${pkColumn.javaField});
+
+    /**
+     * 批量删除${functionName}
+     * 
+     * @param ${pkColumn.javaField}s 需要删除的数据主键集合
+     * @return 结果
+     */
+    public int delete${ClassName}By${pkColumn.capJavaField}s(${pkColumn.javaType}[] ${pkColumn.javaField}s);
+#if($table.sub)
+
+    /**
+     * 批量删除${subTable.functionName}
+     * 
+     * @param ${pkColumn.javaField}s 需要删除的数据主键集合
+     * @return 结果
+     */
+    public int delete${subClassName}By${subTableFkClassName}s(${pkColumn.javaType}[] ${pkColumn.javaField}s);
+    
+    /**
+     * 批量新增${subTable.functionName}
+     * 
+     * @param ${subclassName}List ${subTable.functionName}列表
+     * @return 结果
+     */
+    public int batch${subClassName}(List<${subClassName}> ${subclassName}List);
+    
+
+    /**
+     * 通过${functionName}主键删除${subTable.functionName}信息
+     * 
+     * @param ${pkColumn.javaField} ${functionName}ID
+     * @return 结果
+     */
+    public int delete${subClassName}By${subTableFkClassName}(${pkColumn.javaType} ${pkColumn.javaField});
+#end
+}

+ 61 - 0
background-service/zksy-generator/src/main/resources/vm/java/bak/service.java.vm

@@ -0,0 +1,61 @@
+package ${packageName}.service;
+
+import java.util.List;
+import ${packageName}.domain.${ClassName};
+
+/**
+ * ${functionName}Service接口
+ * 
+ * @author ${author}
+ * @date ${datetime}
+ */
+public interface I${ClassName}Service 
+{
+    /**
+     * 查询${functionName}
+     * 
+     * @param ${pkColumn.javaField} ${functionName}主键
+     * @return ${functionName}
+     */
+    public ${ClassName} select${ClassName}By${pkColumn.capJavaField}(${pkColumn.javaType} ${pkColumn.javaField});
+
+    /**
+     * 查询${functionName}列表
+     * 
+     * @param ${className} ${functionName}
+     * @return ${functionName}集合
+     */
+    public List<${ClassName}> select${ClassName}List(${ClassName} ${className});
+
+    /**
+     * 新增${functionName}
+     * 
+     * @param ${className} ${functionName}
+     * @return 结果
+     */
+    public int insert${ClassName}(${ClassName} ${className});
+
+    /**
+     * 修改${functionName}
+     * 
+     * @param ${className} ${functionName}
+     * @return 结果
+     */
+    public int update${ClassName}(${ClassName} ${className});
+
+    /**
+     * 批量删除${functionName}
+     * 
+     * @param ${pkColumn.javaField}s 需要删除的${functionName}主键集合
+     * @return 结果
+     */
+    public int delete${ClassName}By${pkColumn.capJavaField}s(${pkColumn.javaType}[] ${pkColumn.javaField}s);
+
+    /**
+     * 删除${functionName}信息
+     * 
+     * @param ${pkColumn.javaField} ${functionName}主键
+     * @return 结果
+     */
+    public int delete${ClassName}By${pkColumn.capJavaField}(${pkColumn.javaType} ${pkColumn.javaField});
+}

+ 169 - 0
background-service/zksy-generator/src/main/resources/vm/java/bak/serviceImpl.java.vm

@@ -0,0 +1,169 @@
+package ${packageName}.service.impl;
+
+import java.util.List;
+#foreach ($column in $columns)
+#if($column.javaField == 'createTime' || $column.javaField == 'updateTime')
+import com.zksy.common.utils.DateUtils;
+#break
+#end
+#end
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+#if($table.sub)
+import java.util.ArrayList;
+import com.zksy.common.utils.StringUtils;
+import org.springframework.transaction.annotation.Transactional;
+import ${packageName}.domain.${subClassName};
+#end
+import ${packageName}.mapper.${ClassName}Mapper;
+import ${packageName}.domain.${ClassName};
+import ${packageName}.service.I${ClassName}Service;
+
+/**
+ * ${functionName}Service业务层处理
+ * 
+ * @author ${author}
+ * @date ${datetime}
+ */
+@Service
+public class ${ClassName}ServiceImpl implements I${ClassName}Service 
+{
+    @Autowired
+    private ${ClassName}Mapper ${className}Mapper;
+
+    /**
+     * 查询${functionName}
+     * 
+     * @param ${pkColumn.javaField} ${functionName}主键
+     * @return ${functionName}
+     */
+    @Override
+    public ${ClassName} select${ClassName}By${pkColumn.capJavaField}(${pkColumn.javaType} ${pkColumn.javaField})
+    {
+        return ${className}Mapper.select${ClassName}By${pkColumn.capJavaField}(${pkColumn.javaField});
+    }
+
+    /**
+     * 查询${functionName}列表
+     * 
+     * @param ${className} ${functionName}
+     * @return ${functionName}
+     */
+    @Override
+    public List<${ClassName}> select${ClassName}List(${ClassName} ${className})
+    {
+        return ${className}Mapper.select${ClassName}List(${className});
+    }
+
+    /**
+     * 新增${functionName}
+     * 
+     * @param ${className} ${functionName}
+     * @return 结果
+     */
+#if($table.sub)
+    @Transactional
+#end
+    @Override
+    public int insert${ClassName}(${ClassName} ${className})
+    {
+#foreach ($column in $columns)
+#if($column.javaField == 'createTime')
+        ${className}.setCreateTime(DateUtils.getNowDate());
+#end
+#end
+#if($table.sub)
+        int rows = ${className}Mapper.insert${ClassName}(${className});
+        insert${subClassName}(${className});
+        return rows;
+#else
+        return ${className}Mapper.insert${ClassName}(${className});
+#end
+    }
+
+    /**
+     * 修改${functionName}
+     * 
+     * @param ${className} ${functionName}
+     * @return 结果
+     */
+#if($table.sub)
+    @Transactional
+#end
+    @Override
+    public int update${ClassName}(${ClassName} ${className})
+    {
+#foreach ($column in $columns)
+#if($column.javaField == 'updateTime')
+        ${className}.setUpdateTime(DateUtils.getNowDate());
+#end
+#end
+#if($table.sub)
+        ${className}Mapper.delete${subClassName}By${subTableFkClassName}(${className}.get${pkColumn.capJavaField}());
+        insert${subClassName}(${className});
+#end
+        return ${className}Mapper.update${ClassName}(${className});
+    }
+
+    /**
+     * 批量删除${functionName}
+     * 
+     * @param ${pkColumn.javaField}s 需要删除的${functionName}主键
+     * @return 结果
+     */
+#if($table.sub)
+    @Transactional
+#end
+    @Override
+    public int delete${ClassName}By${pkColumn.capJavaField}s(${pkColumn.javaType}[] ${pkColumn.javaField}s)
+    {
+#if($table.sub)
+        ${className}Mapper.delete${subClassName}By${subTableFkClassName}s(${pkColumn.javaField}s);
+#end
+        return ${className}Mapper.delete${ClassName}By${pkColumn.capJavaField}s(${pkColumn.javaField}s);
+    }
+
+    /**
+     * 删除${functionName}信息
+     * 
+     * @param ${pkColumn.javaField} ${functionName}主键
+     * @return 结果
+     */
+#if($table.sub)
+    @Transactional
+#end
+    @Override
+    public int delete${ClassName}By${pkColumn.capJavaField}(${pkColumn.javaType} ${pkColumn.javaField})
+    {
+#if($table.sub)
+        ${className}Mapper.delete${subClassName}By${subTableFkClassName}(${pkColumn.javaField});
+#end
+        return ${className}Mapper.delete${ClassName}By${pkColumn.capJavaField}(${pkColumn.javaField});
+    }
+#if($table.sub)
+
+    /**
+     * 新增${subTable.functionName}信息
+     * 
+     * @param ${className} ${functionName}对象
+     */
+    public void insert${subClassName}(${ClassName} ${className})
+    {
+        List<${subClassName}> ${subclassName}List = ${className}.get${subClassName}List();
+        ${pkColumn.javaType} ${pkColumn.javaField} = ${className}.get${pkColumn.capJavaField}();
+        if (StringUtils.isNotNull(${subclassName}List))
+        {
+            List<${subClassName}> list = new ArrayList<${subClassName}>();
+            for (${subClassName} ${subclassName} : ${subclassName}List)
+            {
+                ${subclassName}.set${subTableFkClassName}(${pkColumn.javaField});
+                list.add(${subclassName});
+            }
+            if (list.size() > 0)
+            {
+                ${className}Mapper.batch${subClassName}(list);
+            }
+        }
+    }
+#end
+}

+ 75 - 0
background-service/zksy-generator/src/main/resources/vm/java/bak/sub-domain.java.vm

@@ -0,0 +1,75 @@
+package ${packageName}.domain;
+
+#foreach ($import in $subImportList)
+import ${import};
+#end
+import org.apache.commons.lang3.builder.ToStringBuilder;
+import org.apache.commons.lang3.builder.ToStringStyle;
+import com.zksy.common.annotation.Excel;
+
+/**
+ * ${subTable.functionName}对象 ${subTableName}
+ * 
+ * @author ${author}
+ * @date ${datetime}
+ */
+public class ${subClassName} extends BaseEntity
+{
+    private static final long serialVersionUID = 1L;
+
+#foreach ($column in $subTable.columns)
+#if(!$table.isSuperColumn($column.javaField))
+    /** $column.columnComment */
+#if($column.list)
+#set($parentheseIndex=$column.columnComment.indexOf("("))
+#if($parentheseIndex != -1)
+#set($comment=$column.columnComment.substring(0, $parentheseIndex))
+#else
+#set($comment=$column.columnComment)
+#end
+#if($parentheseIndex != -1)
+    @Excel(name = "${comment}", readConverterExp = "$column.readConverterExp()")
+#elseif($column.javaType == 'Date')
+    @JsonFormat(pattern = "yyyy-MM-dd")
+    @Excel(name = "${comment}", width = 30, dateFormat = "yyyy-MM-dd")
+#else
+    @Excel(name = "${comment}")
+#end
+#end
+    private $column.javaType $column.javaField;
+
+#end
+#end
+#foreach ($column in $subTable.columns)
+#if(!$table.isSuperColumn($column.javaField))
+#if($column.javaField.length() > 2 && $column.javaField.substring(1,2).matches("[A-Z]"))
+#set($AttrName=$column.javaField)
+#else
+#set($AttrName=$column.javaField.substring(0,1).toUpperCase() + ${column.javaField.substring(1)})
+#end
+    public void set${AttrName}($column.javaType $column.javaField) 
+    {
+        this.$column.javaField = $column.javaField;
+    }
+
+    public $column.javaType get${AttrName}() 
+    {
+        return $column.javaField;
+    }
+#end
+#end
+
+    @Override
+    public String toString() {
+        return new ToStringBuilder(this,ToStringStyle.MULTI_LINE_STYLE)
+#foreach ($column in $subTable.columns)
+#if($column.javaField.length() > 2 && $column.javaField.substring(1,2).matches("[A-Z]"))
+#set($AttrName=$column.javaField)
+#else
+#set($AttrName=$column.javaField.substring(0,1).toUpperCase() + ${column.javaField.substring(1)})
+#end
+            .append("${column.javaField}", get${AttrName}())
+#end
+            .toString();
+    }
+}

+ 62 - 79
background-service/zksy-generator/src/main/resources/vm/java/controller.java.vm

@@ -1,115 +1,98 @@
-package ${packageName}.controller;
+package com.zksy.web.controller.basicData;
 
-import java.util.List;
-import javax.servlet.http.HttpServletResponse;
-import org.springframework.security.access.prepost.PreAuthorize;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.web.bind.annotation.GetMapping;
-import org.springframework.web.bind.annotation.PostMapping;
-import org.springframework.web.bind.annotation.PutMapping;
-import org.springframework.web.bind.annotation.DeleteMapping;
-import org.springframework.web.bind.annotation.PathVariable;
-import org.springframework.web.bind.annotation.RequestBody;
-import org.springframework.web.bind.annotation.RequestMapping;
-import org.springframework.web.bind.annotation.RestController;
-import com.zksy.common.annotation.Log;
 import com.zksy.common.core.controller.BaseController;
+import com.zksy.basicData.domain.${ClassName};
+import com.zksy.basicData.service.I${ClassName}Service;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.zksy.common.core.domain.AjaxResult;
+import com.zksy.common.utils.SearchUtil;
+import com.zksy.common.annotation.Log;
 import com.zksy.common.enums.BusinessType;
-import ${packageName}.domain.${ClassName};
-import ${packageName}.service.I${ClassName}Service;
 import com.zksy.common.utils.poi.ExcelUtil;
-#if($table.crud || $table.sub)
-import com.zksy.common.core.page.TableDataInfo;
-#elseif($table.tree)
-#end
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.security.access.prepost.PreAuthorize;
+import org.springframework.web.bind.annotation.*;
+
+import javax.servlet.http.HttpServletResponse;
+import java.util.List;
 
 /**
  * ${functionName}Controller
- * 
+ *
  * @author ${author}
  * @date ${datetime}
  */
 @RestController
-@RequestMapping("/${moduleName}/${businessName}")
-public class ${ClassName}Controller extends BaseController
-{
+@RequestMapping("/${moduleName}/${className}")
+@Api(tags = "${functionName}", description = "${functionName}desc")
+public class ${ClassName}Controller extends BaseController{
+
     @Autowired
-    private I${ClassName}Service ${className}Service;
+    private I${ClassName}Service service;
 
-    /**
-     * 查询${functionName}列表
-     */
+    @GetMapping("/getById/{borrowId}")
+    @ApiOperation(value = "${functionName}搜索getById")
     @PreAuthorize("@ss.hasPermi('${permissionPrefix}:list')")
-    @GetMapping("/list")
-#if($table.crud || $table.sub)
-    public TableDataInfo list(${ClassName} ${className})
-    {
-        startPage();
-        List<${ClassName}> list = ${className}Service.select${ClassName}List(${className});
-        return getDataTable(list);
+    public ${ClassName} getById(@PathVariable String borrowId) {
+        return service.getById(borrowId);
     }
-#elseif($table.tree)
-    public AjaxResult list(${ClassName} ${className})
-    {
-        List<${ClassName}> list = ${className}Service.select${ClassName}List(${className});
-        return success(list);
-    }
-#end
 
-    /**
-     * 导出${functionName}列表
-     */
-    @PreAuthorize("@ss.hasPermi('${permissionPrefix}:export')")
-    @Log(title = "${functionName}", businessType = BusinessType.EXPORT)
-    @PostMapping("/export")
-    public void export(HttpServletResponse response, ${ClassName} ${className})
-    {
-        List<${ClassName}> list = ${className}Service.select${ClassName}List(${className});
-        ExcelUtil<${ClassName}> util = new ExcelUtil<${ClassName}>(${ClassName}.class);
-        util.exportExcel(response, list, "${functionName}数据");
+    @GetMapping("/findByPage")
+    @ApiOperation(value = "${functionName}分页")
+    @PreAuthorize("@ss.hasPermi('${permissionPrefix}:list')")
+    public Page findByPage(long pageNum, long pageSize, String conditionJson) throws Exception {
+        return service.page(new Page<>(pageNum, pageSize), SearchUtil.parseWhereSql(conditionJson));
     }
 
-    /**
-     * 获取${functionName}详细信息
-     */
-    @PreAuthorize("@ss.hasPermi('${permissionPrefix}:query')")
-    @GetMapping(value = "/{${pkColumn.javaField}}")
-    public AjaxResult getInfo(@PathVariable("${pkColumn.javaField}") ${pkColumn.javaType} ${pkColumn.javaField})
-    {
-        return success(${className}Service.select${ClassName}By${pkColumn.capJavaField}(${pkColumn.javaField}));
+    @GetMapping("/getList")
+    @ApiOperation(value = "${functionName}查询所有")
+    @PreAuthorize("@ss.hasPermi('${permissionPrefix}:list')")
+    public List<${ClassName}> getList(String conditionJson) throws Exception {
+        return service.list(SearchUtil.parseWhereSql(conditionJson));
     }
 
     /**
      * 新增${functionName}
      */
-    @PreAuthorize("@ss.hasPermi('${permissionPrefix}:add')")
-    @Log(title = "${functionName}", businessType = BusinessType.INSERT)
-    @PostMapping
-    public AjaxResult add(@RequestBody ${ClassName} ${className})
-    {
-        return toAjax(${className}Service.insert${ClassName}(${className}));
+    @PostMapping("/save")
+    @ApiOperation(value = "${functionName}新增")
+    @Log(title = "新增${functionName}", businessType = BusinessType.INSERT)
+    public boolean save(@RequestBody ${ClassName} ${className}) {
+        return service.save(${className});
     }
 
     /**
      * 修改${functionName}
      */
-    @PreAuthorize("@ss.hasPermi('${permissionPrefix}:edit')")
-    @Log(title = "${functionName}", businessType = BusinessType.UPDATE)
-    @PutMapping
-    public AjaxResult edit(@RequestBody ${ClassName} ${className})
+    @PostMapping("/updateById")
+    @ApiOperation(value = "${functionName}修改")
+    @Log(title = "修改${functionName}", businessType = BusinessType.UPDATE)
+    public boolean updateById(@RequestBody ${ClassName} ${className}) {
+        return service.updateById(${className});
+    }
+
+
+    @Log(title = "${functionName}", businessType = BusinessType.DELETE)
+    @PostMapping("/delete")
+    @ApiOperation(value = "删除${functionName}", notes = "删除${functionName}")
+    public AjaxResult delete(@RequestBody List<String> ids)
     {
-        return toAjax(${className}Service.update${ClassName}(${className}));
+        return toAjax(service.removeByIds(ids));
     }
 
     /**
-     * 删除${functionName}
+     * 导出${functionName}列表
      */
-    @PreAuthorize("@ss.hasPermi('${permissionPrefix}:remove')")
-    @Log(title = "${functionName}", businessType = BusinessType.DELETE)
-	@DeleteMapping("/{${pkColumn.javaField}s}")
-    public AjaxResult remove(@PathVariable ${pkColumn.javaType}[] ${pkColumn.javaField}s)
+    @PreAuthorize("@ss.hasPermi('${permissionPrefix}:export')")
+    @Log(title = "${functionName}", businessType = BusinessType.EXPORT)
+    @PostMapping("/export")
+    public void export(HttpServletResponse response,String conditionJson) throws Exception
     {
-        return toAjax(${className}Service.delete${ClassName}By${pkColumn.capJavaField}s(${pkColumn.javaField}s));
+        List<${ClassName}> list = service.list(SearchUtil.parseWhereSql(conditionJson));
+        ExcelUtil<${ClassName}> util = new ExcelUtil<${ClassName}>(${ClassName}.class);
+        util.exportExcel(response, list, "${functionName}数据");
     }
-}
+}

+ 45 - 86
background-service/zksy-generator/src/main/resources/vm/java/domain.java.vm

@@ -1,103 +1,62 @@
 package ${packageName}.domain;
 
-#foreach ($import in $importList)
-import ${import};
-#end
-import org.apache.commons.lang3.builder.ToStringBuilder;
-import org.apache.commons.lang3.builder.ToStringStyle;
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.fasterxml.jackson.annotation.JsonProperty;
 import com.zksy.common.annotation.Excel;
-#if($table.crud || $table.sub)
-#elseif($table.tree)
-#end
-
+import com.fasterxml.jackson.annotation.JsonFormat;
+import lombok.AllArgsConstructor;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import lombok.NoArgsConstructor;
+import lombok.experimental.Accessors;
+import com.baomidou.mybatisplus.annotation.TableName;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import java.util.Date;
+import com.zksy.common.core.domain.BasePo;
 /**
  * ${functionName}对象 ${tableName}
- * 
+ *
  * @author ${author}
  * @date ${datetime}
  */
-#if($table.crud || $table.sub)
-#set($Entity="BaseEntity")
-#elseif($table.tree)
-#set($Entity="TreeEntity")
-#end
-public class ${ClassName} extends ${Entity}
-{
-    private static final long serialVersionUID = 1L;
+@Data
+@EqualsAndHashCode(callSuper = false)
+@Accessors(chain = true)
+@TableName("${tableName}")
+@AllArgsConstructor
+@NoArgsConstructor
+@ApiModel(value = "${table.functionName}")
+public class ${ClassName} extends BasePo {
+
+private static final long serialVersionUID=1L;
 
 #foreach ($column in $columns)
-#if(!$table.isSuperColumn($column.javaField))
+    #if(!$table.isSuperColumn($column.javaField) && $column.javaField != "xhCodeId" && $column.javaField != "uniCode")
     /** $column.columnComment */
-#if($column.list)
-#set($parentheseIndex=$column.columnComment.indexOf("("))
-#if($parentheseIndex != -1)
-#set($comment=$column.columnComment.substring(0, $parentheseIndex))
-#else
-#set($comment=$column.columnComment)
-#end
-#if($parentheseIndex != -1)
-    @Excel(name = "${comment}", readConverterExp = "$column.readConverterExp()")
-#elseif($column.javaType == 'Date')
-    @JsonFormat(pattern = "yyyy-MM-dd")
-    @Excel(name = "${comment}", width = 30, dateFormat = "yyyy-MM-dd")
-#else
-    @Excel(name = "${comment}")
-#end
-#end
+        #if($column.list)
+            #set($parentheseIndex=$column.columnComment.indexOf("("))
+            #if($parentheseIndex != -1)
+                #set($comment=$column.columnComment.substring(0, $parentheseIndex))
+            #else
+                #set($comment=$column.columnComment)
+            #end
+            #if($parentheseIndex != -1)
+            @Excel(name = "${comment}", readConverterExp = "$column.readConverterExp()")
+            #elseif($column.javaType == 'Date')
+            @JsonFormat(pattern = "yyyy-MM-dd")
+            @Excel(name = "${comment}", width = 30, dateFormat = "yyyy-MM-dd")
+            #elseif(!$comment.contains("id") && !$comment.contains("Id") && !$comment.contains("ID") && !$comment.contains("主键"))
+            @Excel(name = "${comment}")
+            #end
+            @ApiModelProperty("${comment}")
+            @TableField("${column.columnName}")
+            @JsonProperty("${column.javaField}")
+        #end
     private $column.javaType $column.javaField;
 
+    #end
 #end
-#end
-#if($table.sub)
-    /** $table.subTable.functionName信息 */
-    private List<${subClassName}> ${subclassName}List;
-
-#end
-#foreach ($column in $columns)
-#if(!$table.isSuperColumn($column.javaField))
-#if($column.javaField.length() > 2 && $column.javaField.substring(1,2).matches("[A-Z]"))
-#set($AttrName=$column.javaField)
-#else
-#set($AttrName=$column.javaField.substring(0,1).toUpperCase() + ${column.javaField.substring(1)})
-#end
-    public void set${AttrName}($column.javaType $column.javaField) 
-    {
-        this.$column.javaField = $column.javaField;
-    }
-
-    public $column.javaType get${AttrName}() 
-    {
-        return $column.javaField;
-    }
-#end
-#end
-
-#if($table.sub)
-    public List<${subClassName}> get${subClassName}List()
-    {
-        return ${subclassName}List;
-    }
 
-    public void set${subClassName}List(List<${subClassName}> ${subclassName}List)
-    {
-        this.${subclassName}List = ${subclassName}List;
-    }
 
-#end
-    @Override
-    public String toString() {
-        return new ToStringBuilder(this,ToStringStyle.MULTI_LINE_STYLE)
-#foreach ($column in $columns)
-#if($column.javaField.length() > 2 && $column.javaField.substring(1,2).matches("[A-Z]"))
-#set($AttrName=$column.javaField)
-#else
-#set($AttrName=$column.javaField.substring(0,1).toUpperCase() + ${column.javaField.substring(1)})
-#end
-            .append("${column.javaField}", get${AttrName}())
-#end
-#if($table.sub)
-            .append("${subclassName}List", get${subClassName}List())
-#end
-            .toString();
-    }
 }

+ 4 - 81
background-service/zksy-generator/src/main/resources/vm/java/mapper.java.vm

@@ -1,91 +1,14 @@
 package ${packageName}.mapper;
 
-import java.util.List;
-import ${packageName}.domain.${ClassName};
-#if($table.sub)
-import ${packageName}.domain.${subClassName};
-#end
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.zksy.basicData.domain.${ClassName};
 
 /**
  * ${functionName}Mapper接口
- * 
+ *
  * @author ${author}
  * @date ${datetime}
  */
-public interface ${ClassName}Mapper 
-{
-    /**
-     * 查询${functionName}
-     * 
-     * @param ${pkColumn.javaField} ${functionName}主键
-     * @return ${functionName}
-     */
-    public ${ClassName} select${ClassName}By${pkColumn.capJavaField}(${pkColumn.javaType} ${pkColumn.javaField});
+public interface ${ClassName}Mapper extends BaseMapper<${ClassName}> {
 
-    /**
-     * 查询${functionName}列表
-     * 
-     * @param ${className} ${functionName}
-     * @return ${functionName}集合
-     */
-    public List<${ClassName}> select${ClassName}List(${ClassName} ${className});
-
-    /**
-     * 新增${functionName}
-     * 
-     * @param ${className} ${functionName}
-     * @return 结果
-     */
-    public int insert${ClassName}(${ClassName} ${className});
-
-    /**
-     * 修改${functionName}
-     * 
-     * @param ${className} ${functionName}
-     * @return 结果
-     */
-    public int update${ClassName}(${ClassName} ${className});
-
-    /**
-     * 删除${functionName}
-     * 
-     * @param ${pkColumn.javaField} ${functionName}主键
-     * @return 结果
-     */
-    public int delete${ClassName}By${pkColumn.capJavaField}(${pkColumn.javaType} ${pkColumn.javaField});
-
-    /**
-     * 批量删除${functionName}
-     * 
-     * @param ${pkColumn.javaField}s 需要删除的数据主键集合
-     * @return 结果
-     */
-    public int delete${ClassName}By${pkColumn.capJavaField}s(${pkColumn.javaType}[] ${pkColumn.javaField}s);
-#if($table.sub)
-
-    /**
-     * 批量删除${subTable.functionName}
-     * 
-     * @param ${pkColumn.javaField}s 需要删除的数据主键集合
-     * @return 结果
-     */
-    public int delete${subClassName}By${subTableFkClassName}s(${pkColumn.javaType}[] ${pkColumn.javaField}s);
-    
-    /**
-     * 批量新增${subTable.functionName}
-     * 
-     * @param ${subclassName}List ${subTable.functionName}列表
-     * @return 结果
-     */
-    public int batch${subClassName}(List<${subClassName}> ${subclassName}List);
-    
-
-    /**
-     * 通过${functionName}主键删除${subTable.functionName}信息
-     * 
-     * @param ${pkColumn.javaField} ${functionName}ID
-     * @return 结果
-     */
-    public int delete${subClassName}By${subTableFkClassName}(${pkColumn.javaType} ${pkColumn.javaField});
-#end
 }

+ 4 - 51
background-service/zksy-generator/src/main/resources/vm/java/service.java.vm

@@ -1,61 +1,14 @@
 package ${packageName}.service;
 
-import java.util.List;
-import ${packageName}.domain.${ClassName};
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.zksy.basicData.domain.${ClassName};
 
 /**
  * ${functionName}Service接口
- * 
+ *
  * @author ${author}
  * @date ${datetime}
  */
-public interface I${ClassName}Service 
-{
-    /**
-     * 查询${functionName}
-     * 
-     * @param ${pkColumn.javaField} ${functionName}主键
-     * @return ${functionName}
-     */
-    public ${ClassName} select${ClassName}By${pkColumn.capJavaField}(${pkColumn.javaType} ${pkColumn.javaField});
+public interface I${ClassName}Service extends IService<${ClassName}> {
 
-    /**
-     * 查询${functionName}列表
-     * 
-     * @param ${className} ${functionName}
-     * @return ${functionName}集合
-     */
-    public List<${ClassName}> select${ClassName}List(${ClassName} ${className});
-
-    /**
-     * 新增${functionName}
-     * 
-     * @param ${className} ${functionName}
-     * @return 结果
-     */
-    public int insert${ClassName}(${ClassName} ${className});
-
-    /**
-     * 修改${functionName}
-     * 
-     * @param ${className} ${functionName}
-     * @return 结果
-     */
-    public int update${ClassName}(${ClassName} ${className});
-
-    /**
-     * 批量删除${functionName}
-     * 
-     * @param ${pkColumn.javaField}s 需要删除的${functionName}主键集合
-     * @return 结果
-     */
-    public int delete${ClassName}By${pkColumn.capJavaField}s(${pkColumn.javaType}[] ${pkColumn.javaField}s);
-
-    /**
-     * 删除${functionName}信息
-     * 
-     * @param ${pkColumn.javaField} ${functionName}主键
-     * @return 结果
-     */
-    public int delete${ClassName}By${pkColumn.capJavaField}(${pkColumn.javaType} ${pkColumn.javaField});
 }

+ 6 - 157
background-service/zksy-generator/src/main/resources/vm/java/serviceImpl.java.vm

@@ -1,169 +1,18 @@
 package ${packageName}.service.impl;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.zksy.basicData.domain.${ClassName};
+import com.zksy.basicData.mapper.${ClassName}Mapper;
+import com.zksy.basicData.service.I${ClassName}Service;
 
-import java.util.List;
-#foreach ($column in $columns)
-#if($column.javaField == 'createTime' || $column.javaField == 'updateTime')
-import com.zksy.common.utils.DateUtils;
-#break
-#end
-#end
-import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
-#if($table.sub)
-import java.util.ArrayList;
-import com.zksy.common.utils.StringUtils;
-import org.springframework.transaction.annotation.Transactional;
-import ${packageName}.domain.${subClassName};
-#end
-import ${packageName}.mapper.${ClassName}Mapper;
-import ${packageName}.domain.${ClassName};
-import ${packageName}.service.I${ClassName}Service;
 
 /**
  * ${functionName}Service业务层处理
- * 
+ *
  * @author ${author}
  * @date ${datetime}
  */
 @Service
-public class ${ClassName}ServiceImpl implements I${ClassName}Service 
-{
-    @Autowired
-    private ${ClassName}Mapper ${className}Mapper;
+public class ${ClassName}ServiceImpl extends ServiceImpl<${ClassName}Mapper, ${ClassName}> implements I${ClassName}Service {
 
-    /**
-     * 查询${functionName}
-     * 
-     * @param ${pkColumn.javaField} ${functionName}主键
-     * @return ${functionName}
-     */
-    @Override
-    public ${ClassName} select${ClassName}By${pkColumn.capJavaField}(${pkColumn.javaType} ${pkColumn.javaField})
-    {
-        return ${className}Mapper.select${ClassName}By${pkColumn.capJavaField}(${pkColumn.javaField});
-    }
-
-    /**
-     * 查询${functionName}列表
-     * 
-     * @param ${className} ${functionName}
-     * @return ${functionName}
-     */
-    @Override
-    public List<${ClassName}> select${ClassName}List(${ClassName} ${className})
-    {
-        return ${className}Mapper.select${ClassName}List(${className});
-    }
-
-    /**
-     * 新增${functionName}
-     * 
-     * @param ${className} ${functionName}
-     * @return 结果
-     */
-#if($table.sub)
-    @Transactional
-#end
-    @Override
-    public int insert${ClassName}(${ClassName} ${className})
-    {
-#foreach ($column in $columns)
-#if($column.javaField == 'createTime')
-        ${className}.setCreateTime(DateUtils.getNowDate());
-#end
-#end
-#if($table.sub)
-        int rows = ${className}Mapper.insert${ClassName}(${className});
-        insert${subClassName}(${className});
-        return rows;
-#else
-        return ${className}Mapper.insert${ClassName}(${className});
-#end
-    }
-
-    /**
-     * 修改${functionName}
-     * 
-     * @param ${className} ${functionName}
-     * @return 结果
-     */
-#if($table.sub)
-    @Transactional
-#end
-    @Override
-    public int update${ClassName}(${ClassName} ${className})
-    {
-#foreach ($column in $columns)
-#if($column.javaField == 'updateTime')
-        ${className}.setUpdateTime(DateUtils.getNowDate());
-#end
-#end
-#if($table.sub)
-        ${className}Mapper.delete${subClassName}By${subTableFkClassName}(${className}.get${pkColumn.capJavaField}());
-        insert${subClassName}(${className});
-#end
-        return ${className}Mapper.update${ClassName}(${className});
-    }
-
-    /**
-     * 批量删除${functionName}
-     * 
-     * @param ${pkColumn.javaField}s 需要删除的${functionName}主键
-     * @return 结果
-     */
-#if($table.sub)
-    @Transactional
-#end
-    @Override
-    public int delete${ClassName}By${pkColumn.capJavaField}s(${pkColumn.javaType}[] ${pkColumn.javaField}s)
-    {
-#if($table.sub)
-        ${className}Mapper.delete${subClassName}By${subTableFkClassName}s(${pkColumn.javaField}s);
-#end
-        return ${className}Mapper.delete${ClassName}By${pkColumn.capJavaField}s(${pkColumn.javaField}s);
-    }
-
-    /**
-     * 删除${functionName}信息
-     * 
-     * @param ${pkColumn.javaField} ${functionName}主键
-     * @return 结果
-     */
-#if($table.sub)
-    @Transactional
-#end
-    @Override
-    public int delete${ClassName}By${pkColumn.capJavaField}(${pkColumn.javaType} ${pkColumn.javaField})
-    {
-#if($table.sub)
-        ${className}Mapper.delete${subClassName}By${subTableFkClassName}(${pkColumn.javaField});
-#end
-        return ${className}Mapper.delete${ClassName}By${pkColumn.capJavaField}(${pkColumn.javaField});
-    }
-#if($table.sub)
-
-    /**
-     * 新增${subTable.functionName}信息
-     * 
-     * @param ${className} ${functionName}对象
-     */
-    public void insert${subClassName}(${ClassName} ${className})
-    {
-        List<${subClassName}> ${subclassName}List = ${className}.get${subClassName}List();
-        ${pkColumn.javaType} ${pkColumn.javaField} = ${className}.get${pkColumn.capJavaField}();
-        if (StringUtils.isNotNull(${subclassName}List))
-        {
-            List<${subClassName}> list = new ArrayList<${subClassName}>();
-            for (${subClassName} ${subclassName} : ${subclassName}List)
-            {
-                ${subclassName}.set${subTableFkClassName}(${pkColumn.javaField});
-                list.add(${subclassName});
-            }
-            if (list.size() > 0)
-            {
-                ${className}Mapper.batch${subClassName}(list);
-            }
-        }
-    }
-#end
 }

+ 55 - 53
background-service/zksy-generator/src/main/resources/vm/java/sub-domain.java.vm

@@ -1,75 +1,77 @@
 package ${packageName}.domain;
 
-#foreach ($import in $subImportList)
-import ${import};
-#end
-import org.apache.commons.lang3.builder.ToStringBuilder;
-import org.apache.commons.lang3.builder.ToStringStyle;
+    #foreach ($import in $subImportList)
+    import ${import};
+    #end
 import com.zksy.common.annotation.Excel;
 
 /**
  * ${subTable.functionName}对象 ${subTableName}
- * 
+ *
  * @author ${author}
  * @date ${datetime}
  */
+@Data
+@EqualsAndHashCode(callSuper = false)
+@Accessors(chain = true)
+@ApiModel(value = "${table.comment}")
 public class ${subClassName} extends BaseEntity
-{
-    private static final long serialVersionUID = 1L;
+        {
+private static final long serialVersionUID = 1L;
 
 #foreach ($column in $subTable.columns)
-#if(!$table.isSuperColumn($column.javaField))
+    #if(!$table.isSuperColumn($column.javaField))
     /** $column.columnComment */
-#if($column.list)
-#set($parentheseIndex=$column.columnComment.indexOf("("))
-#if($parentheseIndex != -1)
-#set($comment=$column.columnComment.substring(0, $parentheseIndex))
-#else
-#set($comment=$column.columnComment)
-#end
-#if($parentheseIndex != -1)
-    @Excel(name = "${comment}", readConverterExp = "$column.readConverterExp()")
-#elseif($column.javaType == 'Date')
-    @JsonFormat(pattern = "yyyy-MM-dd")
-    @Excel(name = "${comment}", width = 30, dateFormat = "yyyy-MM-dd")
-#else
-    @Excel(name = "${comment}")
-#end
-#end
+        #if($column.list)
+            #set($parentheseIndex=$column.columnComment.indexOf("("))
+            #if($parentheseIndex != -1)
+                #set($comment=$column.columnComment.substring(0, $parentheseIndex))
+            #else
+                #set($comment=$column.columnComment)
+            #end
+            #if($parentheseIndex != -1)
+            @Excel(name = "${comment}", readConverterExp = "$column.readConverterExp()")
+            #elseif($column.javaType == 'Date')
+            @JsonFormat(pattern = "yyyy-MM-dd")
+            @Excel(name = "${comment}", width = 30, dateFormat = "yyyy-MM-dd")
+            #else
+            @Excel(name = "${comment}")
+            #end
+        #end
     private $column.javaType $column.javaField;
 
-#end
+    #end
 #end
 #foreach ($column in $subTable.columns)
-#if(!$table.isSuperColumn($column.javaField))
-#if($column.javaField.length() > 2 && $column.javaField.substring(1,2).matches("[A-Z]"))
-#set($AttrName=$column.javaField)
-#else
-#set($AttrName=$column.javaField.substring(0,1).toUpperCase() + ${column.javaField.substring(1)})
-#end
-    public void set${AttrName}($column.javaType $column.javaField) 
-    {
-        this.$column.javaField = $column.javaField;
-    }
+    #if(!$table.isSuperColumn($column.javaField))
+        #if($column.javaField.length() > 2 && $column.javaField.substring(1,2).matches("[A-Z]"))
+            #set($AttrName=$column.javaField)
+        #else
+            #set($AttrName=$column.javaField.substring(0,1).toUpperCase() + ${column.javaField.substring(1)})
+        #end
+    public void set${AttrName}($column.javaType $column.javaField)
+            {
+            this.$column.javaField = $column.javaField;
+            }
 
-    public $column.javaType get${AttrName}() 
-    {
-        return $column.javaField;
-    }
-#end
+    public $column.javaType get${AttrName}()
+            {
+            return $column.javaField;
+            }
+    #end
 #end
 
-    @Override
-    public String toString() {
+@Override
+public String toString() {
         return new ToStringBuilder(this,ToStringStyle.MULTI_LINE_STYLE)
-#foreach ($column in $subTable.columns)
-#if($column.javaField.length() > 2 && $column.javaField.substring(1,2).matches("[A-Z]"))
-#set($AttrName=$column.javaField)
-#else
-#set($AttrName=$column.javaField.substring(0,1).toUpperCase() + ${column.javaField.substring(1)})
-#end
+    #foreach ($column in $subTable.columns)
+        #if($column.javaField.length() > 2 && $column.javaField.substring(1,2).matches("[A-Z]"))
+            #set($AttrName=$column.javaField)
+        #else
+            #set($AttrName=$column.javaField.substring(0,1).toUpperCase() + ${column.javaField.substring(1)})
+        #end
             .append("${column.javaField}", get${AttrName}())
-#end
-            .toString();
-    }
-}
+    #end
+        .toString();
+        }
+        }

+ 9 - 5
background-service/zksy-generator/src/main/resources/vm/js/api.js.vm

@@ -3,7 +3,7 @@ import request from '@/utils/request'
 // 查询${functionName}列表
 export function list${BusinessName}(query) {
   return request({
-    url: '/${moduleName}/${businessName}/list',
+    url: '/${moduleName}/${className}/findByPage',
     method: 'get',
     params: query
   })
@@ -12,7 +12,7 @@ export function list${BusinessName}(query) {
 // 查询${functionName}详细
 export function get${BusinessName}(${pkColumn.javaField}) {
   return request({
-    url: '/${moduleName}/${businessName}/' + ${pkColumn.javaField},
+    url: '/${moduleName}/${className}/' + ${pkColumn.javaField},
     method: 'get'
   })
 }
@@ -20,7 +20,7 @@ export function get${BusinessName}(${pkColumn.javaField}) {
 // 新增${functionName}
 export function add${BusinessName}(data) {
   return request({
-    url: '/${moduleName}/${businessName}',
+    url: '/${moduleName}/${className}',
     method: 'post',
     data: data
   })
@@ -29,7 +29,7 @@ export function add${BusinessName}(data) {
 // 修改${functionName}
 export function update${BusinessName}(data) {
   return request({
-    url: '/${moduleName}/${businessName}',
+    url: '/${moduleName}/${className}',
     method: 'put',
     data: data
   })
@@ -38,7 +38,11 @@ export function update${BusinessName}(data) {
 // 删除${functionName}
 export function del${BusinessName}(${pkColumn.javaField}) {
   return request({
-    url: '/${moduleName}/${businessName}/' + ${pkColumn.javaField},
+    url: '/${moduleName}/${className}/deleteAll',
     method: 'delete'
   })
 }
+// 批量删除行政许可
+export function del${BusinessName}Batch(ids) {
+  return request.post('/${moduleName}/${className}/delete',ids)
+}

+ 44 - 0
background-service/zksy-generator/src/main/resources/vm/js/bak/api.js.vm

@@ -0,0 +1,44 @@
+import request from '@/utils/request'
+
+// 查询${functionName}列表
+export function list${BusinessName}(query) {
+  return request({
+    url: '/${moduleName}/${businessName}/list',
+    method: 'get',
+    params: query
+  })
+}
+
+// 查询${functionName}详细
+export function get${BusinessName}(${pkColumn.javaField}) {
+  return request({
+    url: '/${moduleName}/${businessName}/' + ${pkColumn.javaField},
+    method: 'get'
+  })
+}
+
+// 新增${functionName}
+export function add${BusinessName}(data) {
+  return request({
+    url: '/${moduleName}/${businessName}',
+    method: 'post',
+    data: data
+  })
+}
+
+// 修改${functionName}
+export function update${BusinessName}(data) {
+  return request({
+    url: '/${moduleName}/${businessName}',
+    method: 'put',
+    data: data
+  })
+}
+
+// 删除${functionName}
+export function del${BusinessName}(${pkColumn.javaField}) {
+  return request({
+    url: '/${moduleName}/${businessName}/' + ${pkColumn.javaField},
+    method: 'delete'
+  })
+}

+ 590 - 0
background-service/zksy-generator/src/main/resources/vm/vue/v3/bak/index.vue.vm

@@ -0,0 +1,590 @@
+<template>
+  <div class="app-container">
+    <el-form :model="queryParams" ref="queryRef" :inline="true" v-show="showSearch" 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")
+      <el-form-item label="${comment}" prop="${column.javaField}">
+        <el-input
+          v-model="queryParams.${column.javaField}"
+          placeholder="请输入${comment}"
+          clearable
+          @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-date-picker>
+      </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"
+          type="daterange"
+          range-separator="-"
+          start-placeholder="开始日期"
+          end-placeholder="结束日期"
+        ></el-date-picker>
+      </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>
+
+    <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>
+
+    <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}" />
+#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)
+      <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-button link type="primary" icon="Edit" @click="handleUpdate(scope.row)" v-hasPermi="['${moduleName}:${businessName}:edit']">修改</el-button>
+          <el-button link type="primary" icon="Delete" @click="handleDelete(scope.row)" v-hasPermi="['${moduleName}:${businessName}:remove']">删除</el-button>
+        </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"
+    />
+
+    <!-- 添加或修改${functionName}对话框 -->
+    <el-dialog :title="title" v-model="open" width="500px" append-to-body>
+      <el-form ref="${businessName}Ref" :model="form" :rules="rules" label-width="80px">
+#foreach($column in $columns)
+#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)
+#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="date"
+            value-format="YYYY-MM-DD"
+            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
+#end
+#if($table.sub)
+        <el-divider content-position="center">${subTable.functionName}信息</el-divider>
+        <el-row :gutter="10" class="mb8">
+          <el-col :span="1.5">
+            <el-button type="primary" icon="Plus" @click="handleAdd${subClassName}">添加</el-button>
+          </el-col>
+          <el-col :span="1.5">
+            <el-button type="danger" icon="Delete" @click="handleDelete${subClassName}">删除</el-button>
+          </el-col>
+        </el-row>
+        <el-table :data="${subclassName}List" :row-class-name="row${subClassName}Index" @selection-change="handle${subClassName}SelectionChange" ref="${subclassName}">
+          <el-table-column type="selection" width="50" align="center" />
+          <el-table-column label="序号" align="center" prop="index" width="50"/>
+#foreach($column in $subTable.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 || $javaField == ${subTableFkclassName})
+#elseif($column.list && $column.htmlType == "input")
+          <el-table-column label="$comment" prop="${javaField}" width="150">
+            <template #default="scope">
+              <el-input v-model="scope.row.$javaField" placeholder="请输入$comment" />
+            </template>
+          </el-table-column>
+#elseif($column.list && $column.htmlType == "datetime")
+          <el-table-column label="$comment" prop="${javaField}" width="240">
+            <template #default="scope">
+              <el-date-picker clearable
+                v-model="scope.row.$javaField"
+                type="date"
+                value-format="YYYY-MM-DD"
+                placeholder="请选择$comment">
+              </el-date-picker>
+            </template>
+          </el-table-column>
+#elseif($column.list && ($column.htmlType == "select" || $column.htmlType == "radio") && "" != $column.dictType)
+          <el-table-column label="$comment" prop="${javaField}" width="150">
+            <template #default="scope">
+              <el-select v-model="scope.row.$javaField" placeholder="请选择$comment">
+                <el-option
+                  v-for="dict in $column.dictType"
+                  :key="dict.value"
+                  :label="dict.label"
+                  :value="dict.value"
+                ></el-option>
+              </el-select>
+            </template>
+          </el-table-column>
+#elseif($column.list && ($column.htmlType == "select" || $column.htmlType == "radio") && "" == $column.dictType)
+          <el-table-column label="$comment" prop="${javaField}" width="150">
+            <template #default="scope">
+              <el-select v-model="scope.row.$javaField" placeholder="请选择$comment">
+                <el-option label="请选择字典生成" value="" />
+              </el-select>
+            </template>
+          </el-table-column>
+#end
+#end
+        </el-table>
+#end
+      </el-form>
+      <template #footer>
+        <div class="dialog-footer">
+          <el-button type="primary" @click="submitForm">确 定</el-button>
+          <el-button @click="cancel">取 消</el-button>
+        </div>
+      </template>
+    </el-dialog>
+  </div>
+</template>
+
+<script setup name="${BusinessName}">
+import { list${BusinessName}, get${BusinessName}, del${BusinessName}, add${BusinessName}, update${BusinessName} } from "@/api/${moduleName}/${businessName}";
+
+const { proxy } = getCurrentInstance();
+#if(${dicts} != '')
+#set($dictsNoSymbol=$dicts.replace("'", ""))
+const { ${dictsNoSymbol} } = proxy.useDict(${dicts});
+#end
+
+const ${businessName}List = ref([]);
+#if($table.sub)
+const ${subclassName}List = ref([]);
+#end
+const open = ref(false);
+const loading = ref(true);
+const showSearch = ref(true);
+const ids = ref([]);
+#if($table.sub)
+const checked${subClassName} = ref([]);
+#end
+const single = ref(true);
+const multiple = ref(true);
+const total = ref(0);
+const title = ref("");
+#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([]);
+#end
+#end
+
+const data = reactive({
+  form: {},
+  queryParams: {
+    pageNum: 1,
+    pageSize: 10,
+    #foreach ($column in $columns)
+#if($column.query)
+    $column.javaField: null#if($foreach.count != $columns.size()),#end
+#end
+#end
+  },
+  rules: {
+    #foreach ($column in $columns)
+#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
+  }
+});
+
+const { queryParams, form, rules } = toRefs(data);
+
+/** 查询${functionName}列表 */
+function getList() {
+  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)})
+  if (null != daterange${AttrName} && '' != daterange${AttrName}) {
+    queryParams.value.params["begin${AttrName}"] = daterange${AttrName}.value[0];
+    queryParams.value.params["end${AttrName}"] = daterange${AttrName}.value[1];
+  }
+#end
+#end
+  list${BusinessName}(queryParams.value).then(response => {
+    ${businessName}List.value = response.rows;
+    total.value = response.total;
+    loading.value = false;
+  });
+}
+
+// 取消按钮
+function cancel() {
+  open.value = false;
+  reset();
+}
+
+// 表单重置
+function reset() {
+  form.value = {
+#foreach ($column in $columns)
+#if($column.htmlType == "checkbox")
+    $column.javaField: []#if($foreach.count != $columns.size()),#end
+#else
+    $column.javaField: null#if($foreach.count != $columns.size()),#end
+#end
+#end
+  };
+#if($table.sub)
+  ${subclassName}List.value = [];
+#end
+  proxy.resetForm("${businessName}Ref");
+}
+
+/** 搜索按钮操作 */
+function handleQuery() {
+  queryParams.value.pageNum = 1;
+  getList();
+}
+
+/** 重置按钮操作 */
+function 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
+  proxy.resetForm("queryRef");
+  handleQuery();
+}
+
+// 多选框选中数据
+function handleSelectionChange(selection) {
+  ids.value = selection.map(item => item.${pkColumn.javaField});
+  single.value = selection.length != 1;
+  multiple.value = !selection.length;
+}
+
+/** 新增按钮操作 */
+function handleAdd() {
+  reset();
+  open.value = true;
+  title.value = "添加${functionName}";
+}
+
+/** 修改按钮操作 */
+function handleUpdate(row) {
+  reset();
+  const _${pkColumn.javaField} = row.${pkColumn.javaField} || ids.value
+  get${BusinessName}(_${pkColumn.javaField}).then(response => {
+    form.value = response.data;
+#foreach ($column in $columns)
+#if($column.htmlType == "checkbox")
+    form.value.$column.javaField = form.value.${column.javaField}.split(",");
+#end
+#end
+#if($table.sub)
+    ${subclassName}List.value = response.data.${subclassName}List;
+#end
+    open.value = true;
+    title.value = "修改${functionName}";
+  });
+}
+
+/** 提交按钮 */
+function submitForm() {
+  proxy.#[[$]]#refs["${businessName}Ref"].validate(valid => {
+    if (valid) {
+#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
+      if (form.value.${pkColumn.javaField} != null) {
+        update${BusinessName}(form.value).then(response => {
+          proxy.#[[$modal]]#.msgSuccess("修改成功");
+          open.value = false;
+          getList();
+        });
+      } else {
+        add${BusinessName}(form.value).then(response => {
+          proxy.#[[$modal]]#.msgSuccess("新增成功");
+          open.value = false;
+          getList();
+        });
+      }
+    }
+  });
+}
+
+/** 删除按钮操作 */
+function handleDelete(row) {
+  const _${pkColumn.javaField}s = row.${pkColumn.javaField} || ids.value;
+  proxy.#[[$modal]]#.confirm('是否确认删除${functionName}编号为"' + _${pkColumn.javaField}s + '"的数据项?').then(function() {
+    return del${BusinessName}(_${pkColumn.javaField}s);
+  }).then(() => {
+    getList();
+    proxy.#[[$modal]]#.msgSuccess("删除成功");
+  }).catch(() => {});
+}
+
+#if($table.sub)
+/** ${subTable.functionName}序号 */
+function row${subClassName}Index({ row, rowIndex }) {
+  row.index = rowIndex + 1;
+}
+
+/** ${subTable.functionName}添加按钮操作 */
+function handleAdd${subClassName}() {
+  let obj = {};
+#foreach($column in $subTable.columns)
+#if($column.pk || $column.javaField == ${subTableFkclassName})
+#elseif($column.list && "" != $javaField)
+  obj.$column.javaField = "";
+#end
+#end
+  ${subclassName}List.value.push(obj);
+}
+
+/** ${subTable.functionName}删除按钮操作 */
+function handleDelete${subClassName}() {
+  if (checked${subClassName}.value.length == 0) {
+    proxy.#[[$modal]]#.msgError("请先选择要删除的${subTable.functionName}数据");
+  } else {
+    const ${subclassName}s = ${subclassName}List.value;
+    const checked${subClassName}s = checked${subClassName}.value;
+    ${subclassName}List.value = ${subclassName}s.filter(function(item) {
+      return checked${subClassName}s.indexOf(item.index) == -1
+    });
+  }
+}
+
+/** 复选框选中数据 */
+function handle${subClassName}SelectionChange(selection) {
+  checked${subClassName}.value = selection.map(item => item.index)
+}
+
+#end
+/** 导出按钮操作 */
+function handleExport() {
+  proxy.download('${moduleName}/${businessName}/export', {
+    ...queryParams.value
+  }, `${businessName}_#[[${new Date().getTime()}]]#.xlsx`)
+}
+
+getList();
+</script>

+ 344 - 543
background-service/zksy-generator/src/main/resources/vm/vue/v3/index.vue.vm

@@ -1,65 +1,70 @@
 <template>
   <div class="app-container">
     <el-form :model="queryParams" ref="queryRef" :inline="true" v-show="showSearch" 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")
-      <el-form-item label="${comment}" prop="${column.javaField}">
-        <el-input
-          v-model="queryParams.${column.javaField}"
-          placeholder="请输入${comment}"
-          clearable
-          @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-date-picker>
-      </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"
-          type="daterange"
-          range-separator="-"
-          start-placeholder="开始日期"
-          end-placeholder="结束日期"
-        ></el-date-picker>
-      </el-form-item>
-#end
-#end
-#end
+        #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.javaField == "uniCode" || $column.javaField.contains(
+                    "Name")) && $column.htmlType == "input")
+                  <el-form-item label="${comment}" prop="${column.javaField}" label-width="200">
+                    <el-input
+                        v-model="queryParams.${column.javaField}"
+                        placeholder="请输入${comment}"
+                        clearable
+                        @keyup.enter="handleQuery"
+                    />
+                  </el-form-item>
+                #elseif(($column.javaField == "uniCode" || $column.javaField.contains(
+                    "Name")) && ($column.htmlType == "select" || $column.htmlType == "radio") && "" != $dictType)
+                  <el-form-item label="${comment}" prop="${column.javaField}" label-width="200">
+                    <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.javaField == "uniCode" || $column.javaField.contains(
+                    "Name")) && ($column.htmlType == "select" || $column.htmlType == "radio") && $dictType)
+                  <el-form-item label="${comment}" prop="${column.javaField}" label-width="200">
+                    <el-select v-model="queryParams.${column.javaField}" placeholder="请选择${comment}" clearable>
+                      <el-option label="请选择字典生成" value=""/>
+                    </el-select>
+                  </el-form-item>
+                #elseif(($column.javaField == "uniCode" || $column.javaField.contains(
+                    "Name")) && $column.htmlType == "datetime" && $column.queryType != "BETWEEN")
+                  <el-form-item label="${comment}" prop="${column.javaField}" label-width="200">
+                    <el-date-picker clearable
+                                    v-model="queryParams.${column.javaField}"
+                                    type="date"
+                                    value-format="YYYY-MM-DD"
+                                    placeholder="请选择${comment}">
+                    </el-date-picker>
+                  </el-form-item>
+                #elseif(($column.javaField == "uniCode" || $column.javaField.contains(
+                    "Name")) && $column.htmlType == "datetime" && $column.queryType == "BETWEEN")
+                  <el-form-item label="${comment}" style="width: 308px" label-width="200">
+                    <el-date-picker
+                        v-model="daterange${AttrName}"
+                        value-format="YYYY-MM-DD"
+                        type="daterange"
+                        range-separator="-"
+                        start-placeholder="开始日期"
+                        end-placeholder="结束日期"
+                    ></el-date-picker>
+                  </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>
@@ -69,273 +74,90 @@
     <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>
+            type="warning"
+            plain
+            icon="Download"
+            @click="handleExport"
+            :disabled="!${businessName}List.length"
+            v-hasPermi="['${moduleName}:${businessName}:export']"
+        >导出
+        </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>
 
-    <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}" />
-#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)
-      <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-button link type="primary" icon="Edit" @click="handleUpdate(scope.row)" v-hasPermi="['${moduleName}:${businessName}:edit']">修改</el-button>
-          <el-button link type="primary" icon="Delete" @click="handleDelete(scope.row)" v-hasPermi="['${moduleName}:${businessName}:remove']">删除</el-button>
-        </template>
-      </el-table-column>
+    <el-table v-loading="loading" :data="${businessName}List" height="650" @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}" />
+            #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)
+              <el-table-column label="${comment}" align="center" prop="${javaField}" width="100">
+                <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($javaField == "uniCode")
+                  <el-table-column label="${comment}" align="center" prop="${javaField}" width="200"/>
+                #else
+                  <el-table-column label="${comment}" align="center" prop="${javaField}" :show-overflow-tooltip='true'/>
+                #end
+            #end
+        #end
     </el-table>
-    
-    <pagination
-      v-show="total>0"
-      :total="total"
-      v-model:page="queryParams.pageNum"
-      v-model:limit="queryParams.pageSize"
-      @pagination="getList"
-    />
 
-    <!-- 添加或修改${functionName}对话框 -->
-    <el-dialog :title="title" v-model="open" width="500px" append-to-body>
-      <el-form ref="${businessName}Ref" :model="form" :rules="rules" label-width="80px">
-#foreach($column in $columns)
-#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)
-#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="date"
-            value-format="YYYY-MM-DD"
-            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
-#end
-#if($table.sub)
-        <el-divider content-position="center">${subTable.functionName}信息</el-divider>
-        <el-row :gutter="10" class="mb8">
-          <el-col :span="1.5">
-            <el-button type="primary" icon="Plus" @click="handleAdd${subClassName}">添加</el-button>
-          </el-col>
-          <el-col :span="1.5">
-            <el-button type="danger" icon="Delete" @click="handleDelete${subClassName}">删除</el-button>
-          </el-col>
-        </el-row>
-        <el-table :data="${subclassName}List" :row-class-name="row${subClassName}Index" @selection-change="handle${subClassName}SelectionChange" ref="${subclassName}">
-          <el-table-column type="selection" width="50" align="center" />
-          <el-table-column label="序号" align="center" prop="index" width="50"/>
-#foreach($column in $subTable.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 || $javaField == ${subTableFkclassName})
-#elseif($column.list && $column.htmlType == "input")
-          <el-table-column label="$comment" prop="${javaField}" width="150">
-            <template #default="scope">
-              <el-input v-model="scope.row.$javaField" placeholder="请输入$comment" />
-            </template>
-          </el-table-column>
-#elseif($column.list && $column.htmlType == "datetime")
-          <el-table-column label="$comment" prop="${javaField}" width="240">
-            <template #default="scope">
-              <el-date-picker clearable
-                v-model="scope.row.$javaField"
-                type="date"
-                value-format="YYYY-MM-DD"
-                placeholder="请选择$comment">
-              </el-date-picker>
-            </template>
-          </el-table-column>
-#elseif($column.list && ($column.htmlType == "select" || $column.htmlType == "radio") && "" != $column.dictType)
-          <el-table-column label="$comment" prop="${javaField}" width="150">
-            <template #default="scope">
-              <el-select v-model="scope.row.$javaField" placeholder="请选择$comment">
-                <el-option
-                  v-for="dict in $column.dictType"
-                  :key="dict.value"
-                  :label="dict.label"
-                  :value="dict.value"
-                ></el-option>
-              </el-select>
-            </template>
-          </el-table-column>
-#elseif($column.list && ($column.htmlType == "select" || $column.htmlType == "radio") && "" == $column.dictType)
-          <el-table-column label="$comment" prop="${javaField}" width="150">
-            <template #default="scope">
-              <el-select v-model="scope.row.$javaField" placeholder="请选择$comment">
-                <el-option label="请选择字典生成" value="" />
-              </el-select>
-            </template>
-          </el-table-column>
-#end
-#end
-        </el-table>
-#end
-      </el-form>
+    <div style="position: fixed;bottom: 20px;right: 10px;">
+      <pagination
+          v-show="total>0"
+          :total="total"
+          v-model:page="queryParams.pageNum"
+          v-model:limit="queryParams.pageSize"
+          @pagination="getList"
+      />
+    </div>
+
+    <el-dialog :title="upload.title" v-model="upload.open" width="400px" append-to-body>
+      <el-upload ref="uploadRef" :limit="1" accept=".xlsx, .xls" :headers="upload.headers"
+                 :action="upload.url + '?updateSupport=' + upload.updateSupport" :disabled="upload.isUploading"
+                 :on-progress="handleFileUploadProgress" :on-success="handleFileSuccess" :auto-upload="false" drag>
+        <el-icon class="el-icon--upload">
+          <upload-filled/>
+        </el-icon>
+        <div class="el-upload__text">将文件拖到此处,或<em>点击上传</em></div>
+        <template #tip>
+          <div class="el-upload__tip text-center">
+            <span>仅允许导入xls、xlsx格式文件。</span>
+          </div>
+        </template>
+      </el-upload>
       <template #footer>
         <div class="dialog-footer">
-          <el-button type="primary" @click="submitForm">确 定</el-button>
-          <el-button @click="cancel">取 消</el-button>
+          <el-button type="primary" @click="submitFileForm">确 定</el-button>
+          <el-button @click="upload.open = false">取 消</el-button>
         </div>
       </template>
     </el-dialog>
@@ -343,248 +165,227 @@
 </template>
 
 <script setup name="${BusinessName}">
-import { list${BusinessName}, get${BusinessName}, del${BusinessName}, add${BusinessName}, update${BusinessName} } from "@/api/${moduleName}/${businessName}";
+  import {
+    list${BusinessName},
+    get${BusinessName},
+    del${BusinessName},
+    del${BusinessName}Batch
+  } from "@/api/${moduleName}/${className}";
+  import {reactive, ref, toRaw} from "vue";
+  import {getToken} from "@/utils/auth";
+  import {ElMessage} from "element-plus";
+  import {likeQueryMethod} from "@/utils/likeQueryMethod";
 
-const { proxy } = getCurrentInstance();
-#if(${dicts} != '')
-#set($dictsNoSymbol=$dicts.replace("'", ""))
-const { ${dictsNoSymbol} } = proxy.useDict(${dicts});
-#end
+  const {proxy} = getCurrentInstance();
+      #if(${dicts} != '')
+          #set($dictsNoSymbol=$dicts.replace("'", ""))
+      const { ${dictsNoSymbol} } = proxy.useDict(${dicts});
+      #end
 
-const ${businessName}List = ref([]);
-#if($table.sub)
-const ${subclassName}List = ref([]);
-#end
-const open = ref(false);
-const loading = ref(true);
-const showSearch = ref(true);
-const ids = ref([]);
-#if($table.sub)
-const checked${subClassName} = ref([]);
-#end
-const single = ref(true);
-const multiple = ref(true);
-const total = ref(0);
-const title = ref("");
-#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([]);
-#end
-#end
+  const ${businessName}List = ref([]);
+      #if($table.sub)
+      const ${subclassName}List = ref([]);
+      #end
+  const open = ref(false);
+  const loading = ref(true);
+  const showSearch = ref(true);
+  const ids = ref([]);
+      #if($table.sub)
+      const checked${subClassName} = ref([]);
+      #end
+  const single = ref(true);
+  const multiple = ref(true);
+  const total = ref(0);
+  const title = ref("");
+      #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([]);
+          #end
+      #end
 
-const data = reactive({
-  form: {},
-  queryParams: {
-    pageNum: 1,
-    pageSize: 10,
-    #foreach ($column in $columns)
-#if($column.query)
-    $column.javaField: null#if($foreach.count != $columns.size()),#end
-#end
-#end
-  },
-  rules: {
-    #foreach ($column in $columns)
-#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
+  const upload = reactive({
+    // 是否显示弹出层(用户导入)
+    open: false,
+    // 弹出层标题(用户导入)
+    title: '',
+    // 是否禁用上传
+    isUploading: false,
+    // 设置上传的请求头部
+    headers: {Authorization: getToken()},
+    // 上传的地址
+    url: import.meta.env.VITE_APP_BASE_API + '/${className}/importData'
+  })
+  const handleFileSuccess = (e) => {
+    if (e.code == 200) {
+      ElMessage({
+        type: "success",
+        message: e.msg
+      })
+      getList()
+      proxy.$refs['uploadRef']?.clearFiles()
+    } else {
+      ElMessage({
+        type: "error",
+        message: e.msg
+      })
+      proxy.$refs['uploadRef']?.clearFiles()
+    }
   }
-});
 
-const { queryParams, form, rules } = toRefs(data);
-
-/** 查询${functionName}列表 */
-function getList() {
-  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)})
-  if (null != daterange${AttrName} && '' != daterange${AttrName}) {
-    queryParams.value.params["begin${AttrName}"] = daterange${AttrName}.value[0];
-    queryParams.value.params["end${AttrName}"] = daterange${AttrName}.value[1];
+  function submitFileForm() {
+    proxy.$refs['uploadRef']?.submit();
+    upload.open = false;
   }
-#end
-#end
-  list${BusinessName}(queryParams.value).then(response => {
-    ${businessName}List.value = response.rows;
-    total.value = response.total;
-    loading.value = false;
-  });
-}
 
-// 取消按钮
-function cancel() {
-  open.value = false;
-  reset();
-}
-
-// 表单重置
-function reset() {
-  form.value = {
-#foreach ($column in $columns)
-#if($column.htmlType == "checkbox")
-    $column.javaField: []#if($foreach.count != $columns.size()),#end
-#else
-    $column.javaField: null#if($foreach.count != $columns.size()),#end
-#end
-#end
-  };
-#if($table.sub)
-  ${subclassName}List.value = [];
-#end
-  proxy.resetForm("${businessName}Ref");
-}
-
-/** 搜索按钮操作 */
-function handleQuery() {
-  queryParams.value.pageNum = 1;
-  getList();
-}
+  function handleImport() {
+    upload.open = true
+  }
 
-/** 重置按钮操作 */
-function 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
-  proxy.resetForm("queryRef");
-  handleQuery();
-}
+  const data = reactive({
+    form: {},
+    queryParams: {
+      pageNum: 1,
+      pageSize: 20,
+        #foreach ($column in $columns)
+            #if($column.query)
+                #if($column.javaField == 'uniCode')
+                        $column.javaField: ''#if($foreach.count != $columns.size()),#end
+                #else
+                        $column.javaField: null#if($foreach.count != $columns.size()),#end
+                #end
+            #end
+        #end
+    },
+    rules: {
+        #foreach ($column in $columns)
+            #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")"change"
+                    #else"blur"#end }
+              ]#if($foreach.count != $columns.size()),#end
+            #end
+        #end
+    }
+  });
 
-// 多选框选中数据
-function handleSelectionChange(selection) {
-  ids.value = selection.map(item => item.${pkColumn.javaField});
-  single.value = selection.length != 1;
-  multiple.value = !selection.length;
-}
+  const {queryParams, form, rules} = toRefs(data);
 
-/** 新增按钮操作 */
-function handleAdd() {
-  reset();
-  open.value = true;
-  title.value = "添加${functionName}";
-}
+  /** 查询${functionName}列表 */
+  function getList() {
+    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)})
+      ##        if (null != daterange${AttrName} && '' != daterange${AttrName}) {
+      ##          queryParams.value.params["begin${AttrName}"] = daterange${AttrName}.value[0];
+      ##          queryParams.value.params["end${AttrName}"] = daterange${AttrName}.value[1];
+      ##        }
+      ##      #end
+      ##    #end
+    let toServerObj = likeQueryMethod('uni_code', queryParams.value.uniCode, queryParams.value.pageNum, queryParams.value.pageSize);
+    list${BusinessName}(toServerObj).then(response => {
+            ${businessName}List.value = response.records;
+      total.value = response.total;
+      loading.value = false;
+    });
+  }
 
-/** 修改按钮操作 */
-function handleUpdate(row) {
-  reset();
-  const _${pkColumn.javaField} = row.${pkColumn.javaField} || ids.value
-  get${BusinessName}(_${pkColumn.javaField}).then(response => {
-    form.value = response.data;
-#foreach ($column in $columns)
-#if($column.htmlType == "checkbox")
-    form.value.$column.javaField = form.value.${column.javaField}.split(",");
-#end
-#end
-#if($table.sub)
-    ${subclassName}List.value = response.data.${subclassName}List;
-#end
-    open.value = true;
-    title.value = "修改${functionName}";
-  });
-}
 
-/** 提交按钮 */
-function submitForm() {
-  proxy.#[[$]]#refs["${businessName}Ref"].validate(valid => {
-    if (valid) {
-#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
-      if (form.value.${pkColumn.javaField} != null) {
-        update${BusinessName}(form.value).then(response => {
-          proxy.#[[$modal]]#.msgSuccess("修改成功");
-          open.value = false;
-          getList();
-        });
-      } else {
-        add${BusinessName}(form.value).then(response => {
-          proxy.#[[$modal]]#.msgSuccess("新增成功");
-          open.value = false;
-          getList();
-        });
-      }
-    }
-  });
-}
+  // 表单重置
+  function reset() {
+    form.value = {
+        #foreach ($column in $columns)
+            #if($column.htmlType == "radio")
+                $column.javaField: #if($column.javaType == "Integer" || $column.javaType == "Long")0
+                #else"0"#end#if($foreach.count != $columns.size()),#end
+            #elseif($column.htmlType == "checkbox")
+                    $column.javaField: []#if($foreach.count != $columns.size()),#end
+            #else
+                #if($column.javaField == 'uniCode')
+                        $column.javaField: ''#if($foreach.count != $columns.size()),#end
+                #else
+                        $column.javaField: null#if($foreach.count != $columns.size()),#end
+                #end
+            #end
+        #end
+    };
+      #if($table.sub)
+              ${subclassName}List.value = [];
+      #end
+    proxy.resetForm("${businessName}Ref");
+  }
 
-/** 删除按钮操作 */
-function handleDelete(row) {
-  const _${pkColumn.javaField}s = row.${pkColumn.javaField} || ids.value;
-  proxy.#[[$modal]]#.confirm('是否确认删除${functionName}编号为"' + _${pkColumn.javaField}s + '"的数据项?').then(function() {
-    return del${BusinessName}(_${pkColumn.javaField}s);
-  }).then(() => {
+  /** 搜索按钮操作 */
+  function handleQuery() {
+    queryParams.value.pageNum = 1;
     getList();
-    proxy.#[[$modal]]#.msgSuccess("删除成功");
-  }).catch(() => {});
-}
-
-#if($table.sub)
-/** ${subTable.functionName}序号 */
-function row${subClassName}Index({ row, rowIndex }) {
-  row.index = rowIndex + 1;
-}
+  }
 
-/** ${subTable.functionName}添加按钮操作 */
-function handleAdd${subClassName}() {
-  let obj = {};
-#foreach($column in $subTable.columns)
-#if($column.pk || $column.javaField == ${subTableFkclassName})
-#elseif($column.list && "" != $javaField)
-  obj.$column.javaField = "";
-#end
-#end
-  ${subclassName}List.value.push(obj);
-}
+  /** 重置按钮操作 */
+  function 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
+    proxy.resetForm("queryRef");
+    handleQuery();
+  }
 
-/** ${subTable.functionName}删除按钮操作 */
-function handleDelete${subClassName}() {
-  if (checked${subClassName}.value.length == 0) {
-    proxy.#[[$modal]]#.msgError("请先选择要删除的${subTable.functionName}数据");
-  } else {
-    const ${subclassName}s = ${subclassName}List.value;
-    const checked${subClassName}s = checked${subClassName}.value;
-    ${subclassName}List.value = ${subclassName}s.filter(function(item) {
-      return checked${subClassName}s.indexOf(item.index) == -1
-    });
+  // 多选框选中数据
+  function handleSelectionChange(selection) {
+    ids.value = selection.map(item => item.${pkColumn.javaField});
+    single.value = selection.length != 1;
+    multiple.value = !selection.length;
   }
-}
 
-/** 复选框选中数据 */
-function handle${subClassName}SelectionChange(selection) {
-  checked${subClassName}.value = selection.map(item => item.index)
-}
 
-#end
-/** 导出按钮操作 */
-function handleExport() {
-  proxy.download('${moduleName}/${businessName}/export', {
-    ...queryParams.value
-  }, `${businessName}_#[[${new Date().getTime()}]]#.xlsx`)
-}
+  /** 删除按钮操作 */
+  async function handleDelete(row) {
+    const res = await del${BusinessName}();
+    if(res.code == 200){
+      ElMessage({
+        type:'success',
+        message:'删除成功'
+      })
+      getList();
+    }
+  }
+  /** 批量删除*/
+  const batchDelete = (row)=>{
+    const idsToS = row.xhCodeId || ids.value;
+    (proxy.$modal).confirm('是否确认删除这' + idsToS.length+'条的数据项?').then(function() {
+      return del${BusinessName}Batch(toRaw(idsToS));
+    }).then(() => {
+      getList();
+      proxy.$modal.msgSuccess("删除成功");
+    }).catch(() => {});
+  }
 
-getList();
+  /** 导出按钮操作 */
+  function handleExport() {
+    proxy.download('${className}/exportData', {
+      ...queryParams.value
+    }, `${functionName}_#[[${new Date().getTime()}]]#.xlsx`)
+  }
+  const downloadTemplate = ()=>{
+    proxy.download('${className}/getUploadTemplate',{}, `${functionName}模板.xlsx`)
+  }
+
+  getList();
 </script>

+ 7 - 135
background-service/zksy-generator/src/main/resources/vm/xml/mapper.xml.vm

@@ -1,140 +1,12 @@
 <?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="${packageName}.mapper.${ClassName}Mapper">
-    
-    <resultMap type="${ClassName}" id="${ClassName}Result">
-#foreach ($column in $columns)
-        <result property="${column.javaField}"    column="${column.columnName}"    />
-#end
-    </resultMap>
-#if($table.sub)
-
-    <resultMap id="${ClassName}${subClassName}Result" type="${ClassName}" extends="${ClassName}Result">
-        <collection property="${subclassName}List" ofType="${subClassName}" column="${pkColumn.columnName}" select="select${subClassName}List" />
-    </resultMap>
+        PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
+        "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.zksy.basicData.mapper.${ClassName}Mapper">
 
-    <resultMap type="${subClassName}" id="${subClassName}Result">
-#foreach ($column in $subTable.columns)
-        <result property="${column.javaField}"    column="${column.columnName}"    />
-#end
+    <resultMap type="${ClassName}" id="${ClassName}Result">
+        #foreach ($column in $columns)
+            <result property="${column.javaField}"    column="${column.columnName}"    />
+        #end
     </resultMap>
-#end
-
-    <sql id="select${ClassName}Vo">
-        select#foreach($column in $columns) $column.columnName#if($foreach.count != $columns.size()),#end#end from ${tableName}
-    </sql>
-
-    <select id="select${ClassName}List" parameterType="${ClassName}" resultMap="${ClassName}Result">
-        <include refid="select${ClassName}Vo"/>
-        <where>  
-#foreach($column in $columns)
-#set($queryType=$column.queryType)
-#set($javaField=$column.javaField)
-#set($javaType=$column.javaType)
-#set($columnName=$column.columnName)
-#set($AttrName=$column.javaField.substring(0,1).toUpperCase() + ${column.javaField.substring(1)})
-#if($column.query)
-#if($column.queryType == "EQ")
-            <if test="$javaField != null #if($javaType == 'String' ) and $javaField.trim() != ''#end"> and $columnName = #{$javaField}</if>
-#elseif($queryType == "NE")
-            <if test="$javaField != null #if($javaType == 'String' ) and $javaField.trim() != ''#end"> and $columnName != #{$javaField}</if>
-#elseif($queryType == "GT")
-            <if test="$javaField != null #if($javaType == 'String' ) and $javaField.trim() != ''#end"> and $columnName &gt; #{$javaField}</if>
-#elseif($queryType == "GTE")
-            <if test="$javaField != null #if($javaType == 'String' ) and $javaField.trim() != ''#end"> and $columnName &gt;= #{$javaField}</if>
-#elseif($queryType == "LT")
-            <if test="$javaField != null #if($javaType == 'String' ) and $javaField.trim() != ''#end"> and $columnName &lt; #{$javaField}</if>
-#elseif($queryType == "LTE")
-            <if test="$javaField != null #if($javaType == 'String' ) and $javaField.trim() != ''#end"> and $columnName &lt;= #{$javaField}</if>
-#elseif($queryType == "LIKE")
-            <if test="$javaField != null #if($javaType == 'String' ) and $javaField.trim() != ''#end"> and $columnName like concat('%', #{$javaField}, '%')</if>
-#elseif($queryType == "BETWEEN")
-            <if test="params.begin$AttrName != null and params.begin$AttrName != '' and params.end$AttrName != null and params.end$AttrName != ''"> and $columnName between #{params.begin$AttrName} and #{params.end$AttrName}</if>
-#end
-#end
-#end
-        </where>
-    </select>
-    
-    <select id="select${ClassName}By${pkColumn.capJavaField}" parameterType="${pkColumn.javaType}" resultMap="#if($table.sub)${ClassName}${subClassName}Result#else${ClassName}Result#end">
-#if($table.crud || $table.tree)
-        <include refid="select${ClassName}Vo"/>
-        where ${pkColumn.columnName} = #{${pkColumn.javaField}}
-#elseif($table.sub)
-        select#foreach($column in $columns) $column.columnName#if($foreach.count != $columns.size()),#end#end
-        from ${tableName}
-        where ${pkColumn.columnName} = #{${pkColumn.javaField}}
-#end
-    </select>
-#if($table.sub)
-
-    <select id="select${subClassName}List" resultMap="${subClassName}Result">
-        select#foreach ($column in $subTable.columns) $column.columnName#if($foreach.count != $subTable.columns.size()),#end#end
-        from ${subTableName}
-        where ${subTableFkName} = #{${subTableFkName}}
-    </select>
-#end
-
-    <insert id="insert${ClassName}" parameterType="${ClassName}"#if($pkColumn.increment) useGeneratedKeys="true" keyProperty="$pkColumn.javaField"#end>
-        insert into ${tableName}
-        <trim prefix="(" suffix=")" suffixOverrides=",">
-#foreach($column in $columns)
-#if($column.columnName != $pkColumn.columnName || !$pkColumn.increment)
-            <if test="$column.javaField != null#if($column.javaType == 'String' && $column.required) and $column.javaField != ''#end">$column.columnName,</if>
-#end
-#end
-         </trim>
-        <trim prefix="values (" suffix=")" suffixOverrides=",">
-#foreach($column in $columns)
-#if($column.columnName != $pkColumn.columnName || !$pkColumn.increment)
-            <if test="$column.javaField != null#if($column.javaType == 'String' && $column.required) and $column.javaField != ''#end">#{$column.javaField},</if>
-#end
-#end
-         </trim>
-    </insert>
-
-    <update id="update${ClassName}" parameterType="${ClassName}">
-        update ${tableName}
-        <trim prefix="SET" suffixOverrides=",">
-#foreach($column in $columns)
-#if($column.columnName != $pkColumn.columnName)
-            <if test="$column.javaField != null#if($column.javaType == 'String' && $column.required) and $column.javaField != ''#end">$column.columnName = #{$column.javaField},</if>
-#end
-#end
-        </trim>
-        where ${pkColumn.columnName} = #{${pkColumn.javaField}}
-    </update>
-
-    <delete id="delete${ClassName}By${pkColumn.capJavaField}" parameterType="${pkColumn.javaType}">
-        delete from ${tableName} where ${pkColumn.columnName} = #{${pkColumn.javaField}}
-    </delete>
-
-    <delete id="delete${ClassName}By${pkColumn.capJavaField}s" parameterType="String">
-        delete from ${tableName} where ${pkColumn.columnName} in 
-        <foreach item="${pkColumn.javaField}" collection="array" open="(" separator="," close=")">
-            #{${pkColumn.javaField}}
-        </foreach>
-    </delete>
-#if($table.sub)
-    
-    <delete id="delete${subClassName}By${subTableFkClassName}s" parameterType="String">
-        delete from ${subTableName} where ${subTableFkName} in 
-        <foreach item="${subTableFkclassName}" collection="array" open="(" separator="," close=")">
-            #{${subTableFkclassName}}
-        </foreach>
-    </delete>
-
-    <delete id="delete${subClassName}By${subTableFkClassName}" parameterType="${pkColumn.javaType}">
-        delete from ${subTableName} where ${subTableFkName} = #{${subTableFkclassName}}
-    </delete>
-
-    <insert id="batch${subClassName}">
-        insert into ${subTableName}(#foreach($column in $subTable.columns) $column.columnName#if($foreach.count != $subTable.columns.size()),#end#end) values
-        <foreach item="item" index="index" collection="list" separator=",">
-            (#foreach($column in $subTable.columns) #{item.$column.javaField}#if($foreach.count != $subTable.columns.size()),#end#end)
-        </foreach>
-    </insert>
-#end
 </mapper>

+ 214 - 0
background-service/zksy-system/src/main/java/com/zksy/basicData/domain/XcrMajorMembers.java

@@ -0,0 +1,214 @@
+package com.zksy.basicData.domain;
+
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.fasterxml.jackson.annotation.JsonProperty;
+import com.zksy.common.annotation.Excel;
+import com.fasterxml.jackson.annotation.JsonFormat;
+import lombok.AllArgsConstructor;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import lombok.NoArgsConstructor;
+import lombok.experimental.Accessors;
+import com.baomidou.mybatisplus.annotation.TableName;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import java.util.Date;
+import com.zksy.common.core.domain.BasePo;
+/**
+ * 主要成员信息对象 xcr_major_members
+ *
+ * @author Administrator
+ * @date 2024-11-01
+ */
+@Data
+@EqualsAndHashCode(callSuper = false)
+@Accessors(chain = true)
+@TableName("xcr_major_members")
+@AllArgsConstructor
+@NoArgsConstructor
+@ApiModel(value = "主要成员信息")
+public class XcrMajorMembers extends BasePo {
+
+    private static final long serialVersionUID=1L;
+
+    /** 人员ID */
+    @ApiModelProperty("人员ID")
+    @TableField("ETPS_ID")
+    @JsonProperty("etpsId")
+    private String etpsId;
+
+    /** 人员ID */
+    @ApiModelProperty("人员ID")
+    @TableField("PERSONID")
+    @JsonProperty("PERSONID")
+    private String PERSONID;
+
+    /** 主体身份代码 */
+    @Excel(name = "主体身份代码")
+    @ApiModelProperty("主体身份代码")
+    @TableField("PRIPID")
+    @JsonProperty("PRIPID")
+    private String PRIPID;
+
+    /** 姓名 */
+    @Excel(name = "姓名")
+    @ApiModelProperty("姓名")
+    @TableField("NAME")
+    @JsonProperty("NAME")
+    private String NAME;
+
+    /** 性别 */
+    @Excel(name = "性别")
+    @ApiModelProperty("性别")
+    @TableField("SEX")
+    @JsonProperty("SEX")
+    private String SEX;
+
+    /** 出生日期 */
+    @JsonFormat(pattern = "yyyy-MM-dd")
+    @Excel(name = "出生日期", width = 30, dateFormat = "yyyy-MM-dd")
+    @ApiModelProperty("出生日期")
+    @TableField("NATDATE")
+    @JsonProperty("NATDATE")
+    private Date NATDATE;
+
+    /** 证件类型 */
+    @Excel(name = "证件类型")
+    @ApiModelProperty("证件类型")
+    @TableField("CERTYPE")
+    @JsonProperty("CERTYPE")
+    private String CERTYPE;
+
+    /** 证件号码/代表证编号(DB320) */
+    @Excel(name = "证件号码/代表证编号", readConverterExp = "D=B320")
+    @ApiModelProperty("证件号码/代表证编号")
+    @TableField("CERNO")
+    @JsonProperty("CERNO")
+    private String CERNO;
+
+    /** 职务 */
+    @Excel(name = "职务")
+    @ApiModelProperty("职务")
+    @TableField("POSITION")
+    @JsonProperty("POSITION")
+    private String POSITION;
+
+    /** 职务(中文名称) */
+    @Excel(name = "职务", readConverterExp = "中=文名称")
+    @ApiModelProperty("职务")
+    @TableField("POSITION_CN")
+    @JsonProperty("positionCn")
+    private String positionCn;
+
+    /** 职务产生方式 */
+    @Excel(name = "职务产生方式")
+    @ApiModelProperty("职务产生方式")
+    @TableField("POSBRFORM")
+    @JsonProperty("POSBRFORM")
+    private String POSBRFORM;
+
+    /** 申请前职业状况 */
+    @Excel(name = "申请前职业状况")
+    @ApiModelProperty("申请前职业状况")
+    @TableField("OCCSTBEAPP")
+    @JsonProperty("OCCSTBEAPP")
+    private String OCCSTBEAPP;
+
+    /** 法定代表人标志/首席代表标志/负责人标识 */
+    @Excel(name = "法定代表人标志/首席代表标志/负责人标识")
+    @ApiModelProperty("法定代表人标志/首席代表标志/负责人标识")
+    @TableField("LEREPSIGN")
+    @JsonProperty("LEREPSIGN")
+    private String LEREPSIGN;
+
+    /** 任命单位/委派方 */
+    @Excel(name = "任命单位/委派方")
+    @ApiModelProperty("任命单位/委派方")
+    @TableField("APPOUNIT")
+    @JsonProperty("APPOUNIT")
+    private String APPOUNIT;
+
+    /** 联系电话 */
+    @Excel(name = "联系电话")
+    @ApiModelProperty("联系电话")
+    @TableField("TEL")
+    @JsonProperty("TEL")
+    private String TEL;
+
+    /** 国别(地区) */
+    @Excel(name = "国别(地区)")
+    @ApiModelProperty("国别(地区)")
+    @TableField("COUNTRY")
+    @JsonProperty("COUNTRY")
+    private String COUNTRY;
+
+    /** 固定电话 */
+    @Excel(name = "固定电话")
+    @ApiModelProperty("固定电话")
+    @TableField("TELNUMBER")
+    @JsonProperty("TELNUMBER")
+    private String TELNUMBER;
+
+    /** 移动电话 */
+    @Excel(name = "移动电话")
+    @ApiModelProperty("移动电话")
+    @TableField("MOBTel")
+    @JsonProperty("MOBTel")
+    private String MOBTel;
+
+    /** 电子邮箱 */
+    @Excel(name = "电子邮箱")
+    @ApiModelProperty("电子邮箱")
+    @TableField("EMAIL")
+    @JsonProperty("EMAIL")
+    private String EMAIL;
+
+    /** 住址 */
+    @Excel(name = "住址")
+    @ApiModelProperty("住址")
+    @TableField("HOUSEADD")
+    @JsonProperty("HOUSEADD")
+    private String HOUSEADD;
+
+    /** 入境时间 */
+    @JsonFormat(pattern = "yyyy-MM-dd")
+    @Excel(name = "入境时间", width = 30, dateFormat = "yyyy-MM-dd")
+    @ApiModelProperty("入境时间")
+    @TableField("ARRCHDATE")
+    @JsonProperty("ARRCHDATE")
+    private Date ARRCHDATE;
+
+    /** 代表证期限自/任职起始日期 */
+    @JsonFormat(pattern = "yyyy-MM-dd")
+    @Excel(name = "代表证期限自/任职起始日期", width = 30, dateFormat = "yyyy-MM-dd")
+    @ApiModelProperty("代表证期限自/任职起始日期")
+    @TableField("REPCARFROM")
+    @JsonProperty("REPCARFROM")
+    private Date REPCARFROM;
+
+    /** 代表证期限至/任职截止日期 */
+    @JsonFormat(pattern = "yyyy-MM-dd")
+    @Excel(name = "代表证期限至/任职截止日期", width = 30, dateFormat = "yyyy-MM-dd")
+    @ApiModelProperty("代表证期限至/任职截止日期")
+    @TableField("REPCARTO")
+    @JsonProperty("REPCARTO")
+    private Date REPCARTO;
+
+    /** 邮政编码 */
+    @Excel(name = "邮政编码")
+    @ApiModelProperty("邮政编码")
+    @TableField("POSTALCODE")
+    @JsonProperty("POSTALCODE")
+    private String POSTALCODE;
+
+    /** 数据更新时间 */
+    @JsonFormat(pattern = "yyyy-MM-dd")
+    @Excel(name = "数据更新时间", width = 30, dateFormat = "yyyy-MM-dd")
+    @ApiModelProperty("数据更新时间")
+    @TableField("S_EXT_DATATIME")
+    @JsonProperty("sExtDatatime")
+    private Date sExtDatatime;
+
+
+
+}

+ 14 - 0
background-service/zksy-system/src/main/java/com/zksy/basicData/mapper/XcrMajorMembersMapper.java

@@ -0,0 +1,14 @@
+package com.zksy.basicData.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.zksy.basicData.domain.XcrMajorMembers;
+
+/**
+ * 主要成员信息Mapper接口
+ *
+ * @author Administrator
+ * @date 2024-10-31
+ */
+public interface XcrMajorMembersMapper extends BaseMapper<XcrMajorMembers> {
+
+}

+ 14 - 0
background-service/zksy-system/src/main/java/com/zksy/basicData/service/IXcrMajorMembersService.java

@@ -0,0 +1,14 @@
+package com.zksy.basicData.service;
+
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.zksy.basicData.domain.XcrMajorMembers;
+
+/**
+ * 主要成员信息Service接口
+ *
+ * @author Administrator
+ * @date 2024-10-31
+ */
+public interface IXcrMajorMembersService extends IService<XcrMajorMembers> {
+
+}

+ 18 - 0
background-service/zksy-system/src/main/java/com/zksy/basicData/service/impl/XcrMajorMembersServiceImpl.java

@@ -0,0 +1,18 @@
+package com.zksy.basicData.service.impl;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.zksy.basicData.domain.XcrMajorMembers;
+import com.zksy.basicData.mapper.XcrMajorMembersMapper;
+import com.zksy.basicData.service.IXcrMajorMembersService;
+
+import org.springframework.stereotype.Service;
+
+/**
+ * 主要成员信息Service业务层处理
+ *
+ * @author Administrator
+ * @date 2024-10-31
+ */
+@Service
+public class XcrMajorMembersServiceImpl extends ServiceImpl<XcrMajorMembersMapper, XcrMajorMembers> implements IXcrMajorMembersService {
+
+}

+ 36 - 0
background-service/zksy-system/src/main/resources/mapper/basicData/XcrMajorMembersMapper.xml

@@ -0,0 +1,36 @@
+<?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.zksy.basicData.mapper.XcrMajorMembersMapper">
+
+    <resultMap type="XcrMajorMembers" id="XcrMajorMembersResult">
+            <result property="xhCodeId"    column="xh_code_id"    />
+            <result property="etpsId"    column="ETPS_ID"    />
+            <result property="PERSONID"    column="PERSONID"    />
+            <result property="PRIPID"    column="PRIPID"    />
+            <result property="NAME"    column="NAME"    />
+            <result property="SEX"    column="SEX"    />
+            <result property="NATDATE"    column="NATDATE"    />
+            <result property="CERTYPE"    column="CERTYPE"    />
+            <result property="CERNO"    column="CERNO"    />
+            <result property="POSITION"    column="POSITION"    />
+            <result property="positionCn"    column="POSITION_CN"    />
+            <result property="POSBRFORM"    column="POSBRFORM"    />
+            <result property="OCCSTBEAPP"    column="OCCSTBEAPP"    />
+            <result property="LEREPSIGN"    column="LEREPSIGN"    />
+            <result property="APPOUNIT"    column="APPOUNIT"    />
+            <result property="TEL"    column="TEL"    />
+            <result property="COUNTRY"    column="COUNTRY"    />
+            <result property="TELNUMBER"    column="TELNUMBER"    />
+            <result property="MOBTel"    column="MOBTel"    />
+            <result property="EMAIL"    column="EMAIL"    />
+            <result property="HOUSEADD"    column="HOUSEADD"    />
+            <result property="ARRCHDATE"    column="ARRCHDATE"    />
+            <result property="REPCARFROM"    column="REPCARFROM"    />
+            <result property="REPCARTO"    column="REPCARTO"    />
+            <result property="POSTALCODE"    column="POSTALCODE"    />
+            <result property="sExtDatatime"    column="S_EXT_DATATIME"    />
+            <result property="uniCode"    column="uni_code"    />
+    </resultMap>
+</mapper>

+ 1 - 1
data-service/pom.xml

@@ -6,7 +6,7 @@
     <version>1.0.0</version>
     <parent>
         <groupId>com.zksy</groupId>
-        <artifactId>xh-server-micro</artifactId>
+        <artifactId>xh-service-micro</artifactId>
         <version>1.0.0</version>
     </parent>
     <artifactId>data-service</artifactId>

+ 10 - 10
data-service/src/main/java/com/zksy/data/controller/TestController.java

@@ -4016,16 +4016,16 @@ public class TestController {
     private  XcrDishonestyPunishment19Service xcrDishonestyPunishment19Service;
     @GetMapping("/d")
     public String test3(){
-//        xhRequestUtil.requestXinyonghuanhuai();
-//        xcrAdministrativeLicensingService.saveDataByUniCode("interface/v1/doublePublic/findLicensingList");
-//        xcrAdministrativePenaltyService.saveDataByUniCode("interface/v1/doublePublic/findSanctionList");
-//        xcrXinyonghuaihuaBaseInfoService.saveDataByUniCode("interface/v1/datawarehouse/list");
-//        xcrOtherInfo36Service.saveDataByUniCode("interface/v1/datawarehouse/list");
-//        xcrOtherInfo37Service.saveDataByUniCode("interface/v1/datawarehouse/list");
-//        xcrOtherInfo38Service.saveDataByUniCode("interface/v1/datawarehouse/list");
-//        xcrOtherInfo39Service.saveDataByUniCode("interface/v1/datawarehouse/list");
-//        xcrTrustworthyIncentive42Service.saveDataByUniCode("interface/v1/datawarehouse/list");
-//        xcrDishonestyPunishment19Service.saveDataByUniCode("interface/v1/datawarehouse/list");
+        //xhRequestUtil.requestXinyonghuanhuai();
+        xcrAdministrativeLicensingService.saveDataByUniCode("interface/v1/doublePublic/findLicensingList");
+        xcrAdministrativePenaltyService.saveDataByUniCode("interface/v1/doublePublic/findSanctionList");
+        xcrXinyonghuaihuaBaseInfoService.saveDataByUniCode("interface/v1/datawarehouse/list");
+        xcrOtherInfo36Service.saveDataByUniCode("interface/v1/datawarehouse/list");
+        xcrOtherInfo37Service.saveDataByUniCode("interface/v1/datawarehouse/list");
+        xcrOtherInfo38Service.saveDataByUniCode("interface/v1/datawarehouse/list");
+        xcrOtherInfo39Service.saveDataByUniCode("interface/v1/datawarehouse/list");
+        xcrTrustworthyIncentive42Service.saveDataByUniCode("interface/v1/datawarehouse/list");
+        xcrDishonestyPunishment19Service.saveDataByUniCode("interface/v1/datawarehouse/list");
         return "成功";
     }
     @GetMapping("/e")

+ 2 - 2
pom.xml

@@ -4,7 +4,7 @@
          xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <groupId>com.zksy</groupId>
-   <artifactId>xh-server-micro</artifactId>
+   <artifactId>xh-service-micro</artifactId>
    <packaging>pom</packaging>
    <version>1.0.0</version>
    <modules>
@@ -28,7 +28,7 @@
       <org.projectlombok.version>1.18.20</org.projectlombok.version>
       <spring-cloud.version>2021.0.3</spring-cloud.version>
       <spring-cloud-alibaba.version>2021.0.4.0</spring-cloud-alibaba.version>
-      <mybatis-plus.version>3.4.3</mybatis-plus.version>
+      <mybatis-plus.version>3.5.1</mybatis-plus.version>
       <hutool.version>5.8.11</hutool.version>
       <mysql.version>8.0.23</mysql.version>
       <okhttp.version>4.9.3</okhttp.version>

+ 1 - 1
xh-common/pom.xml

@@ -4,7 +4,7 @@
          xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
     <parent>
         <groupId>com.zksy</groupId>
-        <artifactId>xh-server-micro</artifactId>
+        <artifactId>xh-service-micro</artifactId>
         <version>1.0.0</version>
     </parent>
     <modelVersion>4.0.0</modelVersion>

+ 1 - 1
xh-gateway/pom.xml

@@ -4,7 +4,7 @@
          xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
     <parent>
         <groupId>com.zksy</groupId>
-        <artifactId>xh-server-micro</artifactId>
+        <artifactId>xh-service-micro</artifactId>
         <version>1.0.0</version>
     </parent>
     <modelVersion>4.0.0</modelVersion>