精华内容
下载资源
问答
  • 本工具能够自动生成公共方法 中间件 验证器 模型 控制器 视图 demo 的代码及文件。 ...2、[模型]模型会根据表来创建,一张表对应一个数据层模型,如果你使用到服务... 5、[视图],目前只有生成表格、表单的代码,生成代码
  • Springboot+layui+代码生成全套forked

    千次阅读 2020-06-18 15:11:15
    以下是一个开源框架,Springboot+layui,已经包含组织、用户、菜单、权限、自动生成代码等功能。(fork的,也有部分功能的测试) ...
     
     
    

    1. 目标

    是为了使用一个“工具”来完成CURD的绝大部分工作,提供一个可以快速完成功能的小系统。

    以下是一个开源框架,Springboot+layui,已经包含组织、用户、菜单、权限、自动生成代码等功能。(fork的,也有部分功能的测试)
    https://gitee.com/kelvin11/springboot-plus
    E:\gitlab\kelvin\springboot-layui-management
    已完成的一个case:E:\tmp\办公\设计\xiandafu-springboot-plus-master\springboot-plus(内部MQTT)

    2. 组织架构、用户、角色、权限梳理

    一些查询的cache,给注释掉了

    什么是角色数据授权?

    数据权限怎么实现的?对应的数字怎么理解?

    • 功能点与菜单权限

    • 功能点与按钮权限

    • 配置了“含”数据权限的菜单,里面的管理功能比如修改等按钮展示不出来

    选择“只查看自己”之后,会执行下面的sql

    ┏━━━━━ Debug [coreRoleFunction._gen_selectByTemplate_page] ━━━
    ┣ SQL:	 select * from `core_role_function` where 1=1 and `ROLE_ID`=? and `FUNCTION_ID`=? limit ? , ?
    ┣ 参数:	 [174, 185, 0, 1]
    ┣ 位置:	 com.ibeetl.admin.console.service.FunctionConsoleService.updateFunctionAccessByRole(FunctionConsoleService.java:140)
    ┣ 时间:	 1ms
    ┣ 结果:	 [1]
    ┗━━━━━ Debug [coreRoleFunction._gen_selectByTemplate_page] ━━━
    
    ┏━━━━━ Debug [coreRoleFunction._gen_updateById] ━━━
    ┣ SQL:	 update `core_role_function` set `ROLE_ID`=?,`FUNCTION_ID`=?,`DATA_ACCESS_TYPE`=?,`DATA_ACCESS_POLICY`=? where `ID` = ?
    ┣ 参数:	 [174, 185, 1, null, 208]
    ┣ 位置:	 com.ibeetl.admin.console.service.FunctionConsoleService.updateFunctionAccessByRole(FunctionConsoleService.java:143)
    ┣ 时间:	 2ms
    ┣ 更新:	 [1]
    ┗━━━━━ Debug [coreRoleFunction._gen_updateById] ━━━
    

    2.1. 用户与角色

    然后再进行新增的操作

    2.2. 功能点、角色、菜单、角色功能授权、角色数据授权

    功能点是菜单和角色权限的基础,想做菜单、菜单权限、数据权限,需要:

    1. 先建立对应的功能点。如果是想建菜单,那么需要先建一个功能点(ps:“功能地址”是菜单地址,“功能类型”是普通功能)
    2. 菜单项新增。“菜单地址”选择对应的功能点;“菜单类型”如果是“导航”,那么代表的是此项下有下一级菜单,如果是“菜单”代表是实际的菜单级别页面。
    3. 在“角色功能授权”,授权角色可以访问的功能点,那么功能点对应的菜单也就可见了
    4. 在“角色数据授权”,如果功能点的“功能类型”是“含数据权限”,那么在给角色授权完功能点之后,可以在“角色数据授权”进一步设置功能点的数据权限,详细功能参考下一小节内容。

    2.3. 角色数据授权

    背景是数据权限分以下多个可选:

    对角色“华邦管理员”,其数据权限“用户列表”,设定为“查看同公司(不含子公司)”

    2.3.1. 角色数据授权(页面配置)

    2.3.1.1. 只查看自己 — 有异常

    这个case有报错,回头再分析出错原因

    2.3.1.2. 查看同公司(不含子公司)

    2.3.1.3. 同结构

    只能看到跟自己同一层的用户

    此时,如果在“江苏华邦网络科技”这个分公司下新增一个“华邦用户2”,那么可见如下:

    2.3.1.4. 部门和子部门下所有

    2.3.1.5. 所有机构

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-jK73rVjI-1592464192855)(C:\Users\Lenovo\AppData\Roaming\Typora\typora-user-images\image-20200611165808572.png)]

    2.3.1.6. 集团下所有 — 有异常

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-tqJBj6uW-1592464192874)(C:\Users\Lenovo\AppData\Roaming\Typora\typora-user-images\image-20200611165901373.png)]

    2.3.1.7. 母公司

    2.3.1.8. 集团部门

    2.3.2. 角色数据授权(怎么更新Update)

    修改数据权限如下图,看执行了什么sql语句

    ┏━━━━━ Debug [coreRoleFunction._gen_selectByTemplate_page] ━━━
    ┣ SQL:	 select * from `core_role_function` where 1=1 and `ROLE_ID`=? and `FUNCTION_ID`=? limit ? , ?
    ┣ 参数:	 [174, 2, 0, 1]
    ┣ 位置:	 com.ibeetl.admin.console.service.FunctionConsoleService.updateFunctionAccessByRole(FunctionConsoleService.java:140)
    ┣ 时间:	 1ms
    ┣ 结果:	 [1]
    ┗━━━━━ Debug [coreRoleFunction._gen_selectByTemplate_page] ━━━
    
    ┏━━━━━ Debug [coreRoleFunction._gen_updateById] ━━━
    ┣ SQL:	 update `core_role_function` set `ROLE_ID`=?,`FUNCTION_ID`=?,`DATA_ACCESS_TYPE`=?,`DATA_ACCESS_POLICY`=? where `ID` = ?
    ┣ 参数:	 [174, 2, 2, null, 212]
    ┣ 位置:	 com.ibeetl.admin.console.service.FunctionConsoleService.updateFunctionAccessByRole(FunctionConsoleService.java:143)
    ┣ 时间:	 10ms
    ┣ 更新:	 [1]
    ┗━━━━━ Debug [coreRoleFunction._gen_updateById] ━━━
    
    

    就是将core_role_function表中这个id,设置其DATA_ACCESS_TYPE。DATA_ACCESS_TYPE的枚举见上图

    2.3.3. 角色数据授权,是怎么生效的?

    就是比如在“用户管理”菜单页面中,有查询“用户列表”的功能(function_id为2,code为user.query),探索是如何生效的。

    在DataAccessFunction中

    3. beetl相关技术-SQL

    http://ibeetl.com/guide/#/beetlsql/quickstart

    ======> 考虑beetlsql可能并不是特别常用的ORM框架,替换此框架可能需要比较多的时间(需要改Dao类,Dao类继承了BaseMapper…)

    ======> 考虑引入Mybatis-plus,对于既有的dao代码不做改造,新功能通过新的mybatis方案实现

    综合来看:可能需要熟悉beetlsql来快速实现功能,另外也需要尝试接入mybatis

    3.1. 尝试写一个beetlsql分页查询功能

    查询user_console表数据,需要实现以下功能:

    1. 根据构建的CoreUser对象,动态的设置查询条件(为null的不作为查询条件,不为null的才会查询)
    2. 分页查询,每页3条,查询第1页
    3. 模糊查询,CoreUser中name包含“1”的用户查出来
    4. 根据用户姓名升序排序
      解决思路:通过LambdaQuery来进行查询(或者是考虑通过BaseMapper来实现----这种方式作者不推荐了)
        @Test
        public void testOne() throws Exception {
            CoreUser queryTemplateDto = new CoreUser();
            queryTemplateDto.setJobType0("JT_01");//JT_01 JT_02;如果不传就没有这个查询条件
            LambdaQuery<CoreUser> query = userConsoleDao.createLambdaQuery()
                    .andLike(CoreUser::getName,"%1%")   // 实现功能点3
                    .andEq(CoreUser::getJobType0, Query.filterEmpty(queryTemplateDto.getJobType0()))   // 实现功能点1
                    .asc(CoreUser::getName);   // 实现功能点4
            query.page(1, 3);   // 实现功能点2
    //        List<CoreUser> userList = query.page(2, 2).getList();
    //        for (CoreUser user: userList) {
    //            System.out.println(user);
    //        }
        }
    

    3.2. 新表:生成PO、创建Dao、执行查询流程

    3.2.1. 生成PO

        @Test
        public void testGenerateCode() throws Exception {
            // 或者直接生成java文件
            GenConfig config = new GenConfig();
            config.preferBigDecimal(true);
            config.setPreferDate(true);
            sqlManager.genPojoCodeToConsole("test_product");// 快速生成,显示到控制台
        }
    

    3.2.2. 创建Dao

    直接继承BaseMapper即可,注意设置泛型类

    3.2.3. 执行查询

    @Test
        public void testNewPO() {
            LambdaQuery<TestProduct> query = testProductDao.createLambdaQuery()
                    .desc(TestProduct::getDelFlag);
            List<TestProduct> productList = query.select();
            for (TestProduct tmp : productList) {
                System.out.println(tmp.getProductName());
            }
    
        }
    

    3.3. 自定义sql查询

    3.3.1. 查询单表

    List<TestMachine> machineList = testMachineDao.execute("SELECT * FROM test_machine WHERE machine_name LIKE ?", "%Dell%");
    

    3.3.2. 查询返回特定POJO

    • 新建dto类,用来接收查询结果

      public class MyMachine{
          private String machineName;
      
          public String getMachineName() {
              return machineName;
          }
      
          public void setMachineName(String machineName) {
              this.machineName = machineName;
          }
      
          @Override
          public String toString() {
              return "MyMachine{" +
                      "machineName='" + machineName + '\'' +
                      '}';
          }
      }
      
    • 在src/main/resource目录下,建testMachine.md文件,内容是

      getTestMachineA
      ===
      
      	select * from test_machine
      	
      
    • 在testMachineDao.java新增getMachineA()方法

      @SqlResource("springbootplus.testMachine")
      public interface TestMachineDao extends BaseMapper<TestMachine>{
          public PageQuery<TestMachine> queryByCondition(PageQuery query);
          public void batchDelTestMachineByIds( List<Long> ids);
      
          public List<MyMachine> getTestMachineA();
      }
      
    • 运行测试方法

      @RunWith(SpringRunner.class)
      @SpringBootTest(classes = {MainApplication.class})// 指定启动类
      public class ApplicationTests {
      
          @Autowired
          TestMachineDao machineDao;
      
          /**
           * 生成PO类的代码
           * @throws Exception
           */
          @Test
          public void testSql() throws Exception {
              List<MyMachine> getTestMachineA = machineDao.getTestMachineA();
              System.out.println("111");
          }
      
      }
      
    • 目录结构与运行情况截图如下

    4. 生成子系统

    原则上作者不建议在admin-console或admin-core修改代码。推荐是先自动生成一个项目(其实是module),此module是依赖admin-console和admin-core的,然后导入此module

    4.1. 生成新模块

    4.2. 导入模块module

    从新的module启动即可

    但是,发现项目目录有点奇怪

    所以考虑重新生成一下,然后新module目录选择到当前admin-core的同级目录(目的是git管理比较简单一点,项目代码都在一起)

    然后一样,导入module即可,测试启动新项目MainApplication,可访问管理系统

    4.3. 在子系统中做一个查询接口

    无需额外的配置,可以直接使用LambdaQuery

    5. 生成页面+service+dao+PO

    5.1. 自动生成代码

    生成的路径选择在“E:\gitlab\kelvin\springboot-layui-management\springbootplus”,这个就是我新建的项目目录,这样的话,新建出来的文件会自动放在此目录下,需要注意的是自动生成的代码package,分别是dao、entity、service、web这些目录

    按此方式,从html&js到controller、service、dao、entity都已经生成好了

    5.2. 新建“机器管理”功能点

    5.3. 新建“机器管理”菜单

    5.4. 访问“机器管理”页面

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-aqOOfp18-1592464193052)(C:\Users\Lenovo\AppData\Roaming\Typora\typora-user-images\image-20200618091302500.png)]

    看后台报错

    发现是没有重启服务…重启后即可访问…

    有个小问题就是有些字段不需要在页面上展示,比如“增加”的时候,不需要填写“添加时间”和“更新时间”

    目前这个还没有看到解决的方法,估计是需要手动修改,毕竟如果不配置展示,就需要在db中改为可空或插入一些默认值,这个可能需要自行实现。

    展开全文
  • 代码一键自动生成,拿走不谢

    万次阅读 多人点赞 2020-04-05 19:49:27
    分享代码自动生成工具,穿插swagger,主要是目的,还是提高开发效率

    程序猿学社的GitHub,欢迎Star
    github技术专题
    本文已记录到github

    前言

    隔壁老王: 社长,我工作有一段时间咯,我看其他的同事,上班都很悠闲,而且,那些实体类,感觉有模板似的,有点像机器生成的,是不是有什么工具,可以自动生成代码。
    社长: 有的,嘻嘻,MP的AutoGenerator 插件,一键生成代码,并且,可以集成swagger,加上对应的注释,大大提高你的开发效率。
    隔壁老王: 这么优秀,难怪,我看我们项目组的那些人,这么多时间撩妹。

    起源

    社长刚刚开始工作的时候,那时候,dao,entity,service,controller都要自己去编写。而这部分代码,都是有一定的规范,有需求,就有对应的产品应运而生,AutoGenerator 是 MyBatis-Plus 的代码生成器,通过 AutoGenerator 可以快速生成 Entity、Mapper、Mapper XML、Service、Controller 等各个模块的代码,极大的提升了开发效率。

    环境

    springboot 2.2.6.RELEASE
    mybatis-plus 3.3.0
    spring-boot-starter-swagger 1.5.1.RELEASE

    • 环境版本最好保持一致,不然,你可以收获意外的惊喜

    实战

    • 如遇到不清楚的,文件如何存放的,可以参考我的结构

    sql脚本

    /*
     Navicat Premium Data Transfer
    
     Source Server         : 本地
     Source Server Type    : MySQL
     Source Server Version : 50722
     Source Host           : localhost:3306
     Source Schema         : pro
    
     Target Server Type    : MySQL
     Target Server Version : 50722
     File Encoding         : 65001
    
     Date: 05/04/2020 19:17:01
    */
    
    SET NAMES utf8mb4;
    SET FOREIGN_KEY_CHECKS = 0;
    
    -- ----------------------------
    -- Table structure for student
    -- ----------------------------
    DROP TABLE IF EXISTS `student`;
    CREATE TABLE `student`  (
      `id` int(111) NOT NULL AUTO_INCREMENT COMMENT '编号',
      `name` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '姓名',
      `age` int(11) NULL DEFAULT NULL COMMENT '年龄',
      PRIMARY KEY (`id`) USING BTREE
    ) ENGINE = InnoDB AUTO_INCREMENT = 4 CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = Dynamic;
    
    -- ----------------------------
    -- Records of student
    -- ----------------------------
    INSERT INTO `student` VALUES (1, '社长', 18);
    INSERT INTO `student` VALUES (2, '老王', 20);
    INSERT INTO `student` VALUES (3, '兰陵王', 11);
    
    SET FOREIGN_KEY_CHECKS = 1;
    

    pom.xml

    <?xml version="1.0" encoding="UTF-8"?>
    <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
             xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
        <modelVersion>4.0.0</modelVersion>
        <parent>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-parent</artifactId>
            <version>2.2.6.RELEASE</version>
            <relativePath/> <!-- lookup parent from repository -->
        </parent>
        <groupId>com.cxyxs</groupId>
        <artifactId>auto</artifactId>
        <version>0.0.1-SNAPSHOT</version>
        <name>auto</name>
        <description>Demo project for Spring Boot</description>
    
        <properties>
            <java.version>1.8</java.version>
        </properties>
    
        <dependencies>
            <!--web依赖-->
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter-web</artifactId>
            </dependency>
    
            <!--junit测试-->
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter-test</artifactId>
                <scope>test</scope>
            </dependency>
    
            <dependency>
                <groupId>com.baomidou</groupId>
                <artifactId>mybatis-plus-boot-starter</artifactId>
                <version>3.3.0</version>
            </dependency>
    
            <!--代码生成模式插件  3.0.3以后需要手动设置依赖-->
            <dependency>
                <groupId>com.baomidou</groupId>
                <artifactId>mybatis-plus-generator</artifactId>
                <version>3.3.1.tmp</version>
            </dependency>
    
            <!--代码生成模板-->
            <dependency>
                <groupId>org.apache.velocity</groupId>
                <artifactId>velocity-engine-core</artifactId>
                <version>2.2</version>
            </dependency>
    
            <!--简化代码插件-->
            <dependency>
                <groupId>org.projectlombok</groupId>
                <artifactId>lombok</artifactId>
                <optional>true</optional>
            </dependency>
    
            <!--mysql驱动-->
            <dependency>
                <groupId>mysql</groupId>
                <artifactId>mysql-connector-java</artifactId>
                <version>8.0.18</version>
            </dependency>
    
            <!-- druid阿里巴巴数据库连接池 -->
            <dependency>
                <groupId>com.alibaba</groupId>
                <artifactId>druid</artifactId>
                <version>1.1.6</version>
            </dependency>
    
            <!-- 热部署 -->
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-devtools</artifactId>
                <optional>true</optional>
            </dependency>
    
            <!--swagger2-->
            <dependency>
                <groupId>com.spring4all</groupId>
                <artifactId>spring-boot-starter-swagger</artifactId>
                <version>1.5.1.RELEASE</version>
            </dependency>
        </dependencies>
    
        <build>
            <!--打包后的项目名-->
            <finalName>codeauto</finalName>
            <!--解决mapper文件不到class文件夹的问题-->
            <resources>
                <resource>
                    <directory>src/main/resources</directory>
                    <includes>
                        <include>**/*</include>
                    </includes>
                    <filtering>true</filtering>
                </resource>
                <resource>
                    <directory>src\main\java</directory>
                    <includes>
                        <include>**/*.xml</include>
                    </includes>
                </resource>
            </resources>
    
    
            <plugins>
                <plugin>
                    <groupId>org.springframework.boot</groupId>
                    <artifactId>spring-boot-maven-plugin</artifactId>
                </plugin>
    
                <!-- 1、设置jar的入口类 -->
                <plugin>
                    <groupId>org.apache.maven.plugins</groupId>
                    <artifactId>maven-jar-plugin</artifactId>
                    <configuration>
                        <archive>
                            <manifest>
                                <addClasspath>true</addClasspath>
                                <classpathPrefix>lib/</classpathPrefix>
                                <mainClass>com.cxyxs.auto.AutoApplication</mainClass>
                            </manifest>
                        </archive>
                    </configuration>
                </plugin>
    
    
                <!--2、把附属的jar打到jar内部的lib目录中 -->
                <plugin>
                    <groupId>org.apache.maven.plugins</groupId>
                    <artifactId>maven-dependency-plugin</artifactId>
                    <executions>
                        <execution>
                            <id>copy-dependencies</id>
                            <phase>package</phase>
                            <goals>
                                <goal>copy-dependencies</goal>
                            </goals>
                            <configuration>
                                <outputDirectory>${project.build.directory}/lib</outputDirectory>
                            </configuration>
                        </execution>
                    </executions>
                </plugin>
    
    
                <!-- 3、打包过程忽略Junit测试 -->
                <plugin>
                    <groupId>org.apache.maven.plugins</groupId>
                    <artifactId>maven-surefire-plugin</artifactId>
                    <configuration>
                        <skip>true</skip>
                    </configuration>
                </plugin>
            </plugins>
        </build>
    </project>
    
    • MyBatis-Plus 从 3.0.3 之后移除了代码生成器与模板引擎的默认依赖,需要手动添加相关依赖:
    • 为方便以后前后端对接,集成了swagger
    • 可达成jar包,直接build就行,build里面的配置,就是为了打成jar包

    application.yml

    server:
      port: 8888
    
    spring:
      datasource:
        # 配置数据源
        driver-class-name: com.mysql.cj.jdbc.Driver
        # 使用druid连接池
        type: com.alibaba.druid.pool.DruidDataSource
        url: jdbc:mysql://127.0.0.1:3306/pro?useUnicode=true&characterEncoding=utf8&useJDBCCompliantTimezoneShift=true&useLegacyDatetimeCode=false&serverTimezone=GMT%2B8
        username: root
        password: root
    
    ###增加日志输出,方便定位问题
    logging:
      level:
        root : warn
        com.cxyxs.mybatisplus.dao: trace
      ###控制台输出格式
      pattern:
        console: '%p%m%n'
    
    mybatis-plus:
      mapper-locations: classpath*:/com/cxyxs/auto/mapper/xml/*.xml
      global-config:
        db-config:
          ###逻辑未删除的值
          logic-not-delete-value: 0
          ###逻辑已删除的值
          logic-delete-value: 1
    
    
      ####扫描swagger注解
      swagger:
        base-package: com.cxyxs
    
    • 配置数据库的信息,以自己的配置为主
    • mapper-locations 是根据自动生成代码的规则而定义的
    • swagger 配置swagger注解,扫描范围

    启动类

    package com.cxyxs.auto;
    
    import com.spring4all.swagger.EnableSwagger2Doc;
    import org.mybatis.spring.annotation.MapperScan;
    import org.springframework.boot.SpringApplication;
    import org.springframework.boot.autoconfigure.SpringBootApplication;
    
    @SpringBootApplication
    @MapperScan("com.cxyxs.auto.mapper")
    @EnableSwagger2Doc
    public class AutoApplication {
    
        public static void main(String[] args) {
            SpringApplication.run(AutoApplication.class, args);
        }
    }
    
    • @MapperScan配置扫描dao包的位置(以我们常用的思维),社长习惯以mapper命名
    • @EnableSwagger2Doc 启用swagger注解

    代码自动生成

    package com.cxyxs.auto;
    
    import com.baomidou.mybatisplus.annotation.DbType;
    import com.baomidou.mybatisplus.annotation.FieldFill;
    import com.baomidou.mybatisplus.generator.AutoGenerator;
    import com.baomidou.mybatisplus.generator.config.DataSourceConfig;
    import com.baomidou.mybatisplus.generator.config.GlobalConfig;
    import com.baomidou.mybatisplus.generator.config.PackageConfig;
    import com.baomidou.mybatisplus.generator.config.StrategyConfig;
    import com.baomidou.mybatisplus.generator.config.po.TableFill;
    import com.baomidou.mybatisplus.generator.config.rules.DateType;
    import com.baomidou.mybatisplus.generator.config.rules.NamingStrategy;
    import org.junit.runner.RunWith;
    import org.springframework.boot.test.context.SpringBootTest;
    import org.springframework.test.context.junit4.SpringRunner;
    
    import java.util.ArrayList;
    import java.util.List;
    
    /**
     * Description:
     * Author: wude
     * Date:  2020/4/5 9:14
     * Modified By:
     */
    @RunWith(SpringRunner.class)
    @SpringBootTest
    public class CodeGenerationTests {
        public static void main(String[] args) {
            // 代码生成器
            AutoGenerator mpg = new AutoGenerator();
    
            // 全局配置
            GlobalConfig gc = new GlobalConfig();
            //当前路径
            String projectPath = System.getProperty("user.dir");
            //输出路径
            gc.setOutputDir(projectPath + "/src/main/java");
            gc.setAuthor("程序猿学社");    //设置作者
            //生成代码后,是否打开文件夹
            gc.setOpen(false);
            gc.setFileOverride(false);  //是否覆盖原来代码,个人建议设置为false,别覆盖,危险系数太高
            gc.setServiceName("%sService");   //去掉service的I前缀,一般只需要设置service就行
    /*        gc.setMapperName("%sMapper");
            gc.setXmlName("%sMapper");
            gc.setServiceImplName("%sServiceImpl");
            gc.setControllerName("%sController");*/
    
            gc.setDateType(DateType.ONLY_DATE);   //日期格式
            gc.setSwagger2(true);       // 实体属性 Swagger2 注解,实体类上会增加注释
            mpg.setGlobalConfig(gc);
    
            // 数据源配置
            DataSourceConfig dsc = new DataSourceConfig();
            dsc.setUrl("jdbc:mysql://127.0.0.1:3306/pro?useUnicode=true&characterEncoding=utf8&useJDBCCompliantTimezoneShift=true&useLegacyDatetimeCode=false&serverTimezone=GMT%2B8");
            // dsc.setSchemaName("public");
            dsc.setDriverName("com.mysql.cj.jdbc.Driver");
            dsc.setUsername("root");
            dsc.setPassword("root");
            dsc.setDbType(DbType.MYSQL);    //指定数据库的类型
            mpg.setDataSource(dsc);
    
            // 包配置
            PackageConfig pc = new PackageConfig();
            pc.setParent("com.cxyxs.auto");   //自定义包的路径
            //pc.setModuleName("module");   //模块名称  设置后,会生成com.cxyxs.test.module,里面存放之前设置的mapper,entity
            pc.setEntity("entity");
            pc.setMapper("mapper");
            pc.setService("service");
            pc.setController("controller");
            mpg.setPackageInfo(pc);
    
            // 策略配置
            StrategyConfig strategy = new StrategyConfig();
            strategy.setInclude("student");    //设置映射的表名,可以设置多个表
    
            //表前缀设置  cxyxs_student
            //strategy.setTablePrefix(new String[]{"cxyxs_"});
            //包的命名规则,使用驼峰规则
            strategy.setNaming(NamingStrategy.underline_to_camel);
            //列的名称,使用驼峰规则
            strategy.setColumnNaming(NamingStrategy.underline_to_camel);
            //是否使用lombok
            strategy.setEntityLombokModel(true);
            //驼峰命名
            strategy.setRestControllerStyle(true);
            strategy.setLogicDeleteFieldName("is_delete");   //逻辑删除,假删除会用到
    
            //自动填充字段,在项目开发过程中,例如创建时间,修改时间,每次,都需要我们来指定,太麻烦了,设置为自动填充规则,就不需要我们赋值咯
            TableFill fillInsert = new TableFill("create_time", FieldFill.INSERT);
            TableFill fillUpdate= new TableFill("update_time", FieldFill.UPDATE);
            List fillLists = new ArrayList();
            fillLists.add(fillInsert);
            fillLists.add(fillUpdate);
            strategy.setTableFillList(fillLists);
            //乐观锁
            //strategy.setVersionFieldName("version");
            mpg.setStrategy(strategy);
    
            mpg.execute();  //执行
        }
    }
    

    直接启动main方法 ,见证奇迹的时候到咯。

    • contoller,entity,mapper,service代码都给我们生成好咯。
    • swagger注释都给我们生成好咯,而且代码也很规范,让我们自己来写,可能会遇到很多很低级的错误。
    • 虽说,代码自动生成很智能,智能的前提,是有规范的,数据库命令,最高遵守相关的规范,这里就不过多阐述咯

    controller类

    package com.cxyxs.auto.controller;
    
    
    import com.cxyxs.auto.entity.Student;
    import com.cxyxs.auto.mapper.StudentMapper;
    import com.cxyxs.auto.util.Result;
    import io.swagger.annotations.ApiOperation;
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.web.bind.annotation.GetMapping;
    import org.springframework.web.bind.annotation.RequestMapping;
    
    import org.springframework.web.bind.annotation.RestController;
    
    import java.util.List;
    
    /**
     * <p>
     *  前端控制器
     * </p>
     *
     * @author 程序猿学社
     * @since 2020-04-05
     */
    @RestController
    @RequestMapping("/student")
    public class StudentController {
        @Autowired
        private StudentMapper studentMapper;
    
        @GetMapping("/test")
        @ApiOperation(value = "测试接口",notes = "测试")
        public List<Student> getStudent1(Student stu){
            List<Student> lists = studentMapper.selectList(null);
            return lists;
        }
    }
    
    • StudentController这个类,是自动生成的,增加一个方法,来看看效果。

    测试

    http://localhost:8888/swagger-ui.html

    • 通过页面可以发现有一个basic-error-controller,实际上,我们代码里面没有定义这个,有强迫症的,可以百度解决方法,配置一下,这里社长,就不配置咯。
    • 通过可视化界面,前端可以看到返回的参数注释
    • 传参也有注释

    点击try it out按钮

    • 跟前端需要对接的传参和返回参数都有注释,那个接口,用来干嘛的,都有注释文档。就没有后台什么事咯

    在公众号"程序猿学社",后台回复关键字"代码自动生成",获取源码


    原创不易,不要白嫖,觉得有用的社友,给我点赞,让更多的老铁看到这篇文章。
    因技术能力有限,如文中有不合理的地方,希望各位大佬指出,在下方评论留言,谢谢,希望大家一起进步,一起成长。

    作者:程序猿学社
    原创公众号:『程序猿学社』,专注于java技术栈,分享java各个技术系列专题,以及各个技术点的面试题。
    原创不易,转载请注明来源(注明:来源于公众号:程序猿学社, 作者:程序猿学社)。

    展开全文
  • SSM+Layui+PageHelper+代码生成器整合java项目,mybatis配置半自动生成
  • 加入QQ群讨论: RuoYiPlus简介 在RuoYi项目基础上改造,通过多模块的方式整合其他J2EE项目中经常被...三步启动后台管理系统,layui开发UI,八成代码自动生成: 下载您的子工程: : 解压后引入该maven项目,并修改appli
  • 点击跳转>>>>Layui官网 Layui的使用 下载压缩包: 使用Layui提供的组件来在前端展示数据 第一步:写前端代码,这里定义一个table标签,下面的script标签用来生成删除和编辑的按钮,最终效果在后面: ...

    点击跳转>>>>Layui官网

    Layui的使用

    下载压缩包:

    List item

    在这里插入图片描述
    在这里插入图片描述

    使用Layui提供的组件来在前端展示数据

    • 第一步:写前端代码,这里定义一个table标签,下面的script标签用来生成删除和编辑的按钮,最终效果在后面:
      在这里插入图片描述
    <table id="roleTable"  lay-filter="test"></table>
    <script type="text/html" id="barDemo">
        <a class="layui-btn layui-btn-xs" lay-event="edit">编辑</a>
        <a class="layui-btn layui-btn-danger layui-btn-xs" lay-event="del">删除</a>
    </script>
    • 第二步,导入Layui的js和css文件
      在这里插入图片描述
      在这里插入图片描述
    <link rel="stylesheet" href="${pageContext.request.contextPath}/layui/css/layui.css" />
    <script src="${pageContext.request.contextPath}/layui/layui.js"></script>
    • 第三步:写js脚本来实现对table的渲染和请求数据展示

    在这里插入图片描述

    layui.use('table',function(){
        var table = layui.table;
        table.render({
            elem:"#roleTable",
            height:400,
            even:true,
            toolbar:"default",
            url:"${pageContext.request.contextPath}/dept/getAllDepts",
            page:true,
            limits:[2,5,10,20],
            limit:5,
            cols:[[
                {type: 'checkbox', fixed: 'left',width:50},
                {field: 'deptno', title: '编号', width:80, sort: true,fixed:'left'},
                {field: 'dname', title: '部门名称', width:100,fixed:'left'},
                {field: 'local', title: '部门区域', width:150},
                {title: '操作', width:120,toolbar:"#barDemo"},
            ]]
        });
    • 第四步:我们表格中有编辑和删除按钮,使用对其进行监听,所以Layui提供了监听事件:

    在这里插入图片描述

    //监听行工具事件
    table.on('tool(test)', function(obj){
        //注:tool 是工具条事件名,test 是 table 原始容器的属性 lay-filter="对应的值"
        var data = obj.data //获得当前行数据
            ,layEvent = obj.event; //获得 lay-event 对应的值
        if(layEvent === 'del'){
            layer.confirm('真的删除行么', function(index){
                obj.del(); //删除对应行(tr)的DOM结构
                layer.close(index);
                //向服务端发送删除指令
                $.ajax({
                    url:"${pageContext.request.contextPath}/dept/deleteDeptByDeptId",
                    type:"post",
                    data:{"deptno":data.deptno},
                    dataType:"json",
                    cache:false,
                    success:function(rs){
                        if(rs.status==200){
                            swal("信息提示:", rs.msg, "success");
                            showRoles();
                        }else{
                            swal("信息提示:", rs.msg, "error");
                        }
                    }
                });
            });
        } else if(layEvent === 'edit'){
            //跳转到修改页面
            window.location="${pageContext.request.contextPath}/dept/update-dept?deptno="+data.deptno;
        }
    });
    • 最终完整的前端代码如下:
    $(document).ready(function () {
        showRoles();
    })
    function showRoles(){
        layui.use('table',function(){
            var table = layui.table;
            table.render({
                elem:"#roleTable",
                height:400,
                even:true,
                toolbar:"default",
                url:"${pageContext.request.contextPath}/dept/getAllDepts",
                page:true,
                limits:[2,5,10,20],
                limit:5,
                cols:[[
                    {type: 'checkbox', fixed: 'left',width:50},
                    {field: 'deptno', title: '编号', width:80, sort: true,fixed:'left'},
                    {field: 'dname', title: '部门名称', width:100,fixed:'left'},
                    {field: 'local', title: '部门区域', width:150},
                    {title: '操作', width:120,toolbar:"#barDemo"},
                ]]
            });
            //监听行工具事件
            table.on('tool(test)', function(obj){
                //注:tool 是工具条事件名,test 是 table 原始容器的属性 lay-filter="对应的值"
                var data = obj.data //获得当前行数据
                    ,layEvent = obj.event; //获得 lay-event 对应的值
                if(layEvent === 'del'){
                    layer.confirm('真的删除行么', function(index){
                        obj.del(); //删除对应行(tr)的DOM结构
                        layer.close(index);
                        //向服务端发送删除指令
                        $.ajax({
                            url:"${pageContext.request.contextPath}/dept/deleteDeptByDeptId",
                            type:"post",
                            data:{"deptno":data.deptno},
                            dataType:"json",
                            cache:false,
                            success:function(rs){
                                if(rs.status==200){
                                    swal("信息提示:", rs.msg, "success");
                                    showRoles();
                                }else{
                                    swal("信息提示:", rs.msg, "error");
                                }
                            }
                        });
                    });
                } else if(layEvent === 'edit'){
                    //跳转到修改页面
                    window.location="${pageContext.request.contextPath}/dept/update-dept?deptno="+data.deptno;
                }
            });
        });
    }
    • 第五步:控制器中处理请求:
      在这里插入图片描述

    在这里插入图片描述

    @ResponseBody
    @RequestMapping("/getAllDepts")
    public LayuiTable<Dept> getAllDepts(int page, int limit){
        System.out.println("访问了");
        return deptService.getAllDepts(page,limit);
    }
    • 第六步:书写service层实现代码:
    @Override
    public LayuiTable<Dept> getAllDepts(int page, int limit) {
        PageHelper.startPage(page,limit);
        DeptExample deptExample=new DeptExample();
        List<Dept> deptList = deptMapper.selectByExample(deptExample);
        PageInfo<Dept> pageInfo=new PageInfo<>(deptList);
        LayuiTable<Dept> layuiTable=new LayuiTable<>();
        layuiTable.setCode(0);
        layuiTable.setMsg("");
        layuiTable.setCount(pageInfo.getTotal());
        layuiTable.setData(pageInfo.getList());
        return layuiTable;
    }
    • 最终实现前端效果:

    在这里插入图片描述

    下面书写另外一种:将编辑和删除放在第一行。

    • 先看效果:

    在这里插入图片描述

    • 这样就十分方便了,可以实现批量删除的操作
    • 第一步:修改table标签

    在这里插入图片描述

    <table id="employeeTable"  lay-filter="test"></table>
    <script type="text/html" id="barDemo">
        <div class="layui-btn-container">
            <button class="layui-btn layui-btn-sm" lay-event="add">添加</button>
            <button class="layui-btn layui-btn-sm" lay-event="update">编辑</button>
            <button class="layui-btn layui-btn-sm" lay-event="delete">删除</button>
        </div>
    </script>
    • 第二步:修改js代码:

    在这里插入图片描述

    $(document).ready(function() {
                 showemployees();
    });
    
    function showemployees() {
           layui.use('table',function(){
               var table = layui.table;
               table.render({
                   elem:"#employeeTable",
                   height:400,
                   even:true,
                   toolbar:"#barDemo",
                   url:"${pageContext.request.contextPath}/employee/getAllEmployees",
                   page:true,
                   limits:[2,5,10,20],
                   limit:5,
                   cols:[[
                       {type: 'checkbox', fixed: 'left',width:50},
                       {field: 'eid', title: '编号', width:80, sort: true,fixed:'left'},
                       {field: 'ename', title: '员工姓名', width:100,fixed:'left'},
                       {field: 'esex', title: '性别', width:80},
                       {field: 'eage', title: '年龄', width:80},
                       {field: 'telephone', title: '电话', width:120},
                       {field: 'pnum', title: '身份证号', width:120},
                       {field: 'hiredate', title: '入职时间', width:120,templet:function (data) {
                               return get_data(data.hiredate);
                           }},
                       {field: 'username', title: '用户名', width:120},
                       {field: 'remark', title: '备注', width:120},
                       {field: 'deptName', title: '部门名称', width:100},
                       {field: 'roleName', title: '角色名称', width:100}
                   ]]
               });
               //监听行工具事件
               table.on('toolbar(test)', function(obj){
                   var checkStatus = table.checkStatus(obj.config.id);
                   switch(obj.event){
                       case 'add':
                         window.location="${pageContext.request.contextPath}/employee/save-employee"
                           break;
                       case 'update':
                           var data = checkStatus.data;
                           if (data.length!=1){
                               layer.msg('只能选择一条数据进行编辑!!!');
                           }else {
                               window.location="${pageContext.request.contextPath}/employee/update-employee?eid="+data[0].eid
                           }
                           break;
                       case 'delete':
                           var data = checkStatus.data;
                           var Ids=new Array();
                           for(var i=0;i<data.length;i++){
                               Ids.push(data[i].eid);
                           }
                           deleteEmplyoee(Ids);
                           break;
                   };
               });
           });
       }
    • 第三步:后端代码不变,查询所有数据用符合Layui规范的json类型返回
    • 第五步:这里删除按钮的前端代码,如下:
    function deleteEmplyoee(Ids){
        swal({
            title : "您确定要删除该资源吗?",
            text : "删除后不可恢复,请谨慎操作!",
            type : "warning",
            showCancelButton : true,
            confirmButtonColor : "#DD6B55",
            confirmButtonText : "删除",
            closeOnConfirm : false
        }, function() {
            $.ajax({
                url:"${pageContext.request.contextPath}/employee/deleteEmployee",
                type:"post",
                data:{"Ids":Ids},
                dataType:"json",
                cache:false,
                success:function(rs){
                    if(rs.status==200){
                        swal("删除成功!", "您已经永久删除了这条信息。", "success");
                        // 刷新数据
                        window.location="${pageContext.request.contextPath}/employee/list-employee"
                    }else{
                        swal("删除失败!", "您已经永久删除了这条信息。", "error");
                    }
                }
            });
    
        });
    }
    • 删除功能的后台代码如下:
    public OAResult deleteEmployee(Integer[] id) {
    
        int i1=0,i2=0;
        for (Integer integer : id) {
            //删除中间表的数据
            EmpRoleExample empRoleExample=new EmpRoleExample();
            EmpRoleExample.Criteria criteria = empRoleExample.createCriteria();
            //先删除中间表
            criteria.andEmpFkEqualTo(integer);
            i1+=empRoleMapper.deleteByExample(empRoleExample);
            try {
                //再删除员工表
                i2 += employeeMapper.deleteByPrimaryKey(integer);
            }catch (Exception e){
                e.printStackTrace();
            }
        }
        if (i1>=1&&i2>=1){
            return OAResult.ok(200,"删除成功");
        }
        return OAResult.ok(400,"删除失败");
    }
    展开全文
  • layui代码生成图片实例: layui下载地址 HTML代码快速生成实例: html生成器下载地址 演示:

    layui代码生成图片实例:

    layui生成器下载地址

     

     

    HTML代码快速生成实例:

    html生成器下载地址

     

    视频 演示:

    layui代码快速生成

     

     

    展开全文
  • 主页表格定义示例: //首先声明加载JS layui.use(['admin', 'table', 'util', 'layer', 'form', 'laydate', 'laytpl', 'cityselect'], function () { var $ = layui.$ , admin = layui.admin ...
  • layui.use(['form', 'layer'],function(){ var form = layui.form, layer = layui.layer; form.render();//关键代码 });
  • layui select框代码实现自动下拉

    千次阅读 2019-02-14 14:46:08
    项目使用的layui框架,这个框架有个缺点就是一些H5标签使不上用场,比如datalist...,所以...//代码自动点击 select 的下拉按钮 $('select[id="projectName"]').next().find('.layui-select-title i...
  • Ⅱ、代码生成 1、创建表 如笔者的文章中的 blog SET FOREIGN_KEY_CHECKS= 0 ; DROP TABLE IF EXISTS `t_blog` ; CREATE TABLE `t_blog` ( `id` int ( 11 ) NOT NULL AUTO_...
  • Layui生成动态数据表格

    千次阅读 2019-06-09 14:55:35
    Layui中的数据表格用于对表格进行一些列功能和动态化数据操作,涵盖了日常业务所涉及的几乎全部需求。支持固定表头、固定行、固定列左/列右,支持拖拽改变列宽度,支持排序,支持多级表头,支持单元格的自定义模板,...
  • 通过代码生成工具可自动生成Model、View、Controller等各层文件,前端文件进行简单配置即可实现访问。数据库、代码文件附在下方链接。 代码文件链接: https://download.csdn.net/download/secretstarlyp/49136799 ...
  • LayUI+JavaScript生成动态表单及提交

    千次阅读 2019-08-29 10:49:21
    LayUI动态表单是在Vue+Element-UI动态表单生成及提交之前做的 LayUI效果如下: 引入需要的文件 <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <!-- 引入...
  • Layui调用json获取表格动态数据代码,treetable是一款功能强大的树形表格插件,支持全部展开,全部折叠,刷新表格,修改,删除等功能。
  • TP5 layui 生成动态数据表格

    千次阅读 2019-03-26 15:11:39
    很简单很普通的功能,不想解释太多,代码也是拿来即用 控制器: 前台 index.html代码: <div class="header"> <hr> <div class="demoTable" style="display: block;margin:10px 50px 10px 50px...
  • 使用Layui快速创建页面

    千次阅读 2018-09-28 14:15:51
    为什么使用LayuiLayui 是一款采用自身模块规范编写的前端 UI 框架,遵循原生 HTML/CSS/JS 的书写组织形式...Layui的目录结构如上图所示,包含css、font、images、lay、lay.js几大模块,它经过了自动化构建,更适...
  • 如何使用 WTP自动生成代码? http://wtmdoc.walkingtec.cn/#/QuickStart/FirstProject 框架提供了4类ViewModel,涵盖了主流Web应用程序常见的功能,分别是: BaseCRUDVM 提供最常见的数据增删改的功能 ...
  • Layui实现动态生成select中的option项,同时设置select下拉框选中项 项目场景: 主要用于为民族select下拉框动态生成option值,同时在实现编辑功能时,表单中的select下拉框的选中项为后台传过来的数据。 举例: 如...
  • 一键自动生成MVC.rar

    2021-02-06 11:04:26
    一键自动生成MVC代码layui前端
  • layui框架使用与代码编写

    千次阅读 2018-11-22 06:53:10
    layui框架使用与代码编写 一、layui增加操作工具列 ShowLeakList = ListPager.extend({ init : function(container, primaryKey, url){ //列表容器 this.container = container; //主键字段 this....
  • 首先要找到 layui -> lay -> modules文件夹下的table.js文件,在如下的地方加入红线内的代码,不一定是F开头 然后调用layui的 table.reload() 方法
  • 这时想到的是layui框架自带的tree.js 尝试着去翻看源码,由于比较写的比较惊喜 经过不断尝试的情况下,终于找到了解决的方法 如下: 我们找到layui文件中的tree.js 2. 在layui.tree文件中搜索 if (“add” == f) ...
  • 一键生成前后端代码生成即可启动 框架: magicalcoder包括youyaboot和H5布局器 包含: springboot最为后台框架 jquery layui eleui等ui框架可以选择 作用: 一键生成管理后台的各种增删改查功能,表单验证,单表多...
  • 这次添加了生成layui的查询 package com.qsk.utils; import java.io.File; import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.FileWriter; import java.io.IOException; ...
  • layui 左侧导航生成tab

    2020-07-01 08:55:50
    layui 左侧导航生成tab layui.define(['jquery', 'element'], function(exports) { var $ = layui.jquery, element = layui.element, device = layui.device(), tabMenu = function() { this.config = { item:...
  • 整体的效果:一、首先百度搜索layui的地址,然后下载layui的压缩包,,将压缩包的文件解压缩,然后将解压缩后的文件复制到你的编译器上;二、建立一个html文件,引入layui.css 和 layui.js两个文件,一定要将地址写...
  • JavaWeb专业版,企业级开发框架SpringBoot+Layui+Thymeleaf+MybatisPlus开发权限(RBAC)及内容管理框架,框架中集成了权限管理、模块管理,数据库管理、富文本编辑器(已集成ueditor,kindeditor),后台支持多主题切换、...
  • 导入对应表)4、代码生成列表中找到需要表(可预览、修改、删除生成配置)5、点击生成代码会得到一个ruoyi.zip, 执行sql文件,按照包内目录结构复制到自己的项目中即可 最近开发若依项目,不知道怎么操作,多亏有...
  • layui2.55版本终于出来了tree功能,但是使用上面不尽人意。这里就解决一个真实使用时会遇到的问题。 问题: 点击添加节点 假如我们之间点取消的话 选中的节点会自动添加一个节点 名称为未命名 解决办法: 第...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 2,132
精华内容 852
关键字:

layui自动生成代码