feat(代码生成微服务、人力资源微服务): 代码生成模板调整及增加人力资源微服务

1.调整了代码生成模板:文件头注释、表列名与实体属性名称对应关系
2.增加了人力资源微服务,员工管理相关的管理代码全部生成完成
5个文件已添加
13个文件已修改
470 ■■■■■ 已修改文件
febs-server/febs-server-generator/src/main/java/cc/mrbird/febs/server/generator/helper/GeneratorHelper.java 3 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
febs-server/febs-server-generator/src/main/resources/generator/templates/controller.ftl 104 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
febs-server/febs-server-generator/src/main/resources/generator/templates/entity.ftl 36 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
febs-server/febs-server-generator/src/main/resources/generator/templates/mapper.ftl 14 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
febs-server/febs-server-generator/src/main/resources/generator/templates/service.ftl 80 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
febs-server/febs-server-generator/src/main/resources/generator/templates/serviceImpl.ftl 79 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
febs-server/febs-server-generator/src/main/resources/mapper/GeneratorMapper.xml 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
febs-server/febs-server-hr/src/main/java/cc/mrbird/febs/server/hr/FebsServerHrApplication.java 28 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
febs-server/febs-server-hr/src/main/java/cc/mrbird/febs/server/hr/runner/StartedUpRunner.java 27 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
febs-server/febs-server-hr/src/main/resources/ValidationMessages.properties 6 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
febs-server/febs-server-hr/src/main/resources/banner.txt 8 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
febs-server/febs-server-hr/src/main/resources/bootstrap.yml 28 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
febs-server/febs-server-job/src/main/java/cc/mrbird/febs/server/job/entity/Job.java 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
febs-server/febs-server-job/src/main/resources/mapper/JobMapper.xml 16 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
febs-server/febs-server-system/src/main/resources/mapper/LoginLogMapper.xml 3 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
febs-server/febs-server-system/src/main/resources/mapper/MenuMapper.xml 26 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
febs-server/febs-server-system/src/main/resources/mapper/RoleMapper.xml 6 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
febs-server/pom.xml 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
febs-server/febs-server-generator/src/main/java/cc/mrbird/febs/server/generator/helper/GeneratorHelper.java
@@ -53,7 +53,8 @@
        data.put("hasDate", false);
        data.put("hasBigDecimal", false);
        columns.forEach(c -> {
            c.setField(FebsUtil.underscoreToCamel(StringUtils.lowerCase(c.getName())));
            // c.setField(FebsUtil.underscoreToCamel(StringUtils.lowerCase(c.getName())));
            c.setField(c.getName());
            if (StringUtils.containsAny(c.getType(), FieldType.DATE, FieldType.DATETIME, FieldType.TIMESTAMP)) {
                data.put("hasDate", true);
            }
febs-server/febs-server-generator/src/main/resources/generator/templates/controller.ftl
@@ -16,11 +16,15 @@
import java.util.Map;
/**
 * ${tableComment} Controller
 *
 * @author ${author}
 * @date ${date}
 */
*
* name:${className}
* package:${basePackage}.${controllerPackage}
* description:${tableComment}控制器
*
* @author ${author}
* @date ${date}
* @since JDK1.8
*/
@Slf4j
@Validated
@RestController
@@ -28,54 +32,54 @@
@RequiredArgsConstructor
public class ${className}Controller {
    private final I${className}Service ${className?uncap_first}Service;
private final I${className}Service ${className?uncap_first}Service;
    @GetMapping
    @PreAuthorize("hasAuthority('${className?uncap_first}:list')")
    public FebsResponse getAll${className}s(${className} ${className?uncap_first}) {
        return new FebsResponse().data(${className?uncap_first}Service.find${className}s(${className?uncap_first}));
    }
@GetMapping
@PreAuthorize("hasAuthority('${className?uncap_first}:list')")
public FebsResponse getAll${className}s(${className} ${className?uncap_first}) {
return new FebsResponse().data(${className?uncap_first}Service.find${className}s(${className?uncap_first}));
}
    @GetMapping("list")
    @PreAuthorize("hasAuthority('${className?uncap_first}:list')")
    public FebsResponse ${className?uncap_first}List(QueryRequest request, ${className} ${className?uncap_first}) {
        Map<String, Object> dataTable = FebsUtil.getDataTable(this.${className?uncap_first}Service.find${className}s(request, ${className?uncap_first}));
        return new FebsResponse().data(dataTable);
    }
@GetMapping("list")
@PreAuthorize("hasAuthority('${className?uncap_first}:list')")
public FebsResponse ${className?uncap_first}List(QueryRequest request, ${className} ${className?uncap_first}) {
Map<String, Object> dataTable = FebsUtil.getDataTable(this.${className?uncap_first}Service.find${className}s(request, ${className?uncap_first}));
return new FebsResponse().data(dataTable);
}
    @PostMapping
    @PreAuthorize("hasAuthority('${className?uncap_first}:add')")
    public void add${className}(@Valid ${className} ${className?uncap_first}) throws FebsException {
        try {
            this.${className?uncap_first}Service.create${className}(${className?uncap_first});
        } catch (Exception e) {
            String message = "新增${className}失败";
            log.error(message, e);
            throw new FebsException(message);
        }
    }
@PostMapping
@PreAuthorize("hasAuthority('${className?uncap_first}:add')")
public void add${className}(@Valid ${className} ${className?uncap_first}) throws FebsException {
try {
this.${className?uncap_first}Service.create${className}(${className?uncap_first});
} catch (Exception e) {
String message = "新增${className}失败";
log.error(message, e);
throw new FebsException(message);
}
}
    @DeleteMapping
    @PreAuthorize("hasAuthority('${className?uncap_first}:delete')")
    public void delete${className}(${className} ${className?uncap_first}) throws FebsException {
        try {
            this.${className?uncap_first}Service.delete${className}(${className?uncap_first});
        } catch (Exception e) {
            String message = "删除${className}失败";
            log.error(message, e);
            throw new FebsException(message);
        }
    }
@DeleteMapping
@PreAuthorize("hasAuthority('${className?uncap_first}:delete')")
public void delete${className}(${className} ${className?uncap_first}) throws FebsException {
try {
this.${className?uncap_first}Service.delete${className}(${className?uncap_first});
} catch (Exception e) {
String message = "删除${className}失败";
log.error(message, e);
throw new FebsException(message);
}
}
    @PutMapping
    @PreAuthorize("hasAuthority('${className?uncap_first}:update')")
    public void update${className}(${className} ${className?uncap_first}) throws FebsException {
        try {
            this.${className?uncap_first}Service.update${className}(${className?uncap_first});
        } catch (Exception e) {
            String message = "修改${className}失败";
            log.error(message, e);
            throw new FebsException(message);
        }
    }
@PutMapping
@PreAuthorize("hasAuthority('${className?uncap_first}:update')")
public void update${className}(${className} ${className?uncap_first}) throws FebsException {
try {
this.${className?uncap_first}Service.update${className}(${className?uncap_first});
} catch (Exception e) {
String message = "修改${className}失败";
log.error(message, e);
throw new FebsException(message);
}
}
}
febs-server/febs-server-generator/src/main/resources/generator/templates/entity.ftl
@@ -1,10 +1,10 @@
package ${basePackage}.${entityPackage};
<#if hasDate = true>
import java.util.Date;
    import java.util.Date;
</#if>
<#if hasBigDecimal = true>
import java.math.BigDecimal;
    import java.math.BigDecimal;
</#if>
import lombok.Data;
import com.baomidou.mybatisplus.annotation.IdType;
@@ -13,10 +13,14 @@
import com.baomidou.mybatisplus.annotation.TableName;
/**
* ${tableComment} Entity
*
* name:${className}
* package:${basePackage}.${controllerPackage}
* description:${tableComment}数据表映射实体
*
* @author ${author}
* @date ${date}
* @since JDK1.8
*/
@Data
@TableName("${tableName}")
@@ -24,42 +28,42 @@
<#if columns??>
    <#list columns as column>
    /**
     * ${column.remark}
     */
        /**
        * ${column.remark}
        */
        <#if column.isKey = true>
    @TableId(value = "${column.name}", type = IdType.AUTO)
            @TableId(value = "${column.name}", type = IdType.AUTO)
        <#else>
    @TableField("${column.name}")
            @TableField("${column.name}")
        </#if>
        <#if (column.type = 'varchar' || column.type = 'text' || column.type = 'uniqueidentifier'
        || column.type = 'varchar2' || column.type = 'nvarchar' || column.type = 'VARCHAR2'
        || column.type = 'VARCHAR'|| column.type = 'CLOB' || column.type = 'char')>
    private String ${column.field?uncap_first};
            private String ${column.field?uncap_first};
        </#if>
        <#if column.type = 'timestamp' || column.type = 'date' || column.type = 'datetime'||column.type = 'TIMESTAMP' || column.type = 'DATE' || column.type = 'DATETIME'>
    private Date ${column.field?uncap_first};
            private Date ${column.field?uncap_first};
        </#if>
        <#if column.type = 'int' || column.type = 'smallint'>
    private Integer ${column.field?uncap_first};
        <#if column.type = 'int' || column.type = 'smallint'|| column.type = 'bit'>
            private Integer ${column.field?uncap_first};
        </#if>
        <#if column.type = 'double'>
    private Double ${column.field?uncap_first};
            private Double ${column.field?uncap_first};
        </#if>
        <#if column.type = 'bigint'>
    private Long ${column.field?uncap_first};
            private Long ${column.field?uncap_first};
        </#if>
        <#if column.type = 'tinyint'>
    private Byte ${column.field?uncap_first};
            private Byte ${column.field?uncap_first};
        </#if>
        <#if column.type = 'decimal' || column.type = 'numeric'>
    private BigDecimal ${column.field?uncap_first};
            private BigDecimal ${column.field?uncap_first};
        </#if>
    </#list>
</#if>
febs-server/febs-server-generator/src/main/resources/generator/templates/mapper.ftl
@@ -4,11 +4,15 @@
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
/**
 * ${tableComment} Mapper
 *
 * @author ${author}
 * @date ${date}
 */
*
* name:${className}
* package:${basePackage}.${controllerPackage}
* description:${tableComment}实体Mapper
*
* @author ${author}
* @date ${date}
* @since JDK1.8
*/
public interface ${className}Mapper extends BaseMapper<${className}> {
}
febs-server/febs-server-generator/src/main/resources/generator/templates/service.ftl
@@ -9,47 +9,51 @@
import java.util.List;
/**
 * ${tableComment} Service接口
 *
 * @author ${author}
 * @date ${date}
 */
*
* name:${className}
* package:${basePackage}.${controllerPackage}
* description:${tableComment}服务接口
*
* @author ${author}
* @date ${date}
* @since JDK1.8
*/
public interface I${className}Service extends IService<${className}> {
    /**
     * 查询(分页)
     *
     * @param request QueryRequest
     * @param ${className?uncap_first} ${className?uncap_first}
     * @return IPage<${className}>
     */
    IPage<${className}> find${className}s(QueryRequest request, ${className} ${className?uncap_first});
/**
* 查询(分页)
*
* @param request QueryRequest
* @param ${className?uncap_first} ${className?uncap_first}
* @return IPage<${className}>
*/
IPage<${className}> find${className}s(QueryRequest request, ${className} ${className?uncap_first});
    /**
     * 查询(所有)
     *
     * @param ${className?uncap_first} ${className?uncap_first}
     * @return List<${className}>
     */
    List<${className}> find${className}s(${className} ${className?uncap_first});
/**
* 查询(所有)
*
* @param ${className?uncap_first} ${className?uncap_first}
* @return List<${className}>
*/
List<${className}> find${className}s(${className} ${className?uncap_first});
    /**
     * 新增
     *
     * @param ${className?uncap_first} ${className?uncap_first}
     */
    void create${className}(${className} ${className?uncap_first});
/**
* 新增
*
* @param ${className?uncap_first} ${className?uncap_first}
*/
void create${className}(${className} ${className?uncap_first});
    /**
     * 修改
     *
     * @param ${className?uncap_first} ${className?uncap_first}
     */
    void update${className}(${className} ${className?uncap_first});
/**
* 修改
*
* @param ${className?uncap_first} ${className?uncap_first}
*/
void update${className}(${className} ${className?uncap_first});
    /**
     * 删除
     *
     * @param ${className?uncap_first} ${className?uncap_first}
     */
    void delete${className}(${className} ${className?uncap_first});
/**
* 删除
*
* @param ${className?uncap_first} ${className?uncap_first}
*/
void delete${className}(${className} ${className?uncap_first});
}
febs-server/febs-server-generator/src/main/resources/generator/templates/serviceImpl.ftl
@@ -16,50 +16,55 @@
import java.util.List;
/**
 * ${tableComment} Service实现
 *
 * @author ${author}
 * @date ${date}
 */
*
* name:${className}
* package:${basePackage}.${controllerPackage}
* description:${tableComment}服务接口实现
*
* @author ${author}
* @date ${date}
* @since JDK1.8
*/
@Service
@RequiredArgsConstructor
@Transactional(propagation = Propagation.SUPPORTS, readOnly = true)
public class ${className}ServiceImpl extends ServiceImpl<${className}Mapper, ${className}> implements I${className}Service {
public class ${className}ServiceImpl extends ServiceImpl
<${className}Mapper, ${className}> implements I${className}Service {
    private final ${className}Mapper ${className?uncap_first}Mapper;
private final ${className}Mapper ${className?uncap_first}Mapper;
    @Override
    public IPage<${className}> find${className}s(QueryRequest request, ${className} ${className?uncap_first}) {
        LambdaQueryWrapper<${className}> queryWrapper = new LambdaQueryWrapper<>();
        // TODO 设置查询条件
        Page<${className}> page = new Page<>(request.getPageNum(), request.getPageSize());
        return this.page(page, queryWrapper);
    }
@Override
public IPage<${className}> find${className}s(QueryRequest request, ${className} ${className?uncap_first}) {
LambdaQueryWrapper<${className}> queryWrapper = new LambdaQueryWrapper<>();
// TODO 设置查询条件
Page<${className}> page = new Page<>(request.getPageNum(), request.getPageSize());
return this.page(page, queryWrapper);
}
    @Override
    public List<${className}> find${className}s(${className} ${className?uncap_first}) {
        LambdaQueryWrapper<${className}> queryWrapper = new LambdaQueryWrapper<>();
        // TODO 设置查询条件
        return this.baseMapper.selectList(queryWrapper);
    }
@Override
public List<${className}> find${className}s(${className} ${className?uncap_first}) {
LambdaQueryWrapper<${className}> queryWrapper = new LambdaQueryWrapper<>();
// TODO 设置查询条件
return this.baseMapper.selectList(queryWrapper);
}
    @Override
    @Transactional(rollbackFor = Exception.class)
    public void create${className}(${className} ${className?uncap_first}) {
        this.save(${className?uncap_first});
    }
@Override
@Transactional(rollbackFor = Exception.class)
public void create${className}(${className} ${className?uncap_first}) {
this.save(${className?uncap_first});
}
    @Override
    @Transactional(rollbackFor = Exception.class)
    public void update${className}(${className} ${className?uncap_first}) {
        this.saveOrUpdate(${className?uncap_first});
    }
@Override
@Transactional(rollbackFor = Exception.class)
public void update${className}(${className} ${className?uncap_first}) {
this.saveOrUpdate(${className?uncap_first});
}
    @Override
    @Transactional(rollbackFor = Exception.class)
    public void delete${className}(${className} ${className?uncap_first}) {
        LambdaQueryWrapper<${className}> wapper = new LambdaQueryWrapper<>();
        // TODO 设置删除条件
        this.remove(wapper);
    }
@Override
@Transactional(rollbackFor = Exception.class)
public void delete${className}(${className} ${className?uncap_first}) {
LambdaQueryWrapper<${className}> wapper = new LambdaQueryWrapper<>();
// TODO 设置删除条件
this.remove(wapper);
}
}
febs-server/febs-server-generator/src/main/resources/mapper/GeneratorMapper.xml
@@ -28,9 +28,9 @@
        SELECT
        COLUMN_NAME name,
        CASE
            COLUMN_key
        COLUMN_key
        WHEN 'PRI' THEN
                1 ELSE 0
        1 ELSE 0
        END isKey,
        DATA_TYPE type,
        COLUMN_COMMENT remark
febs-server/febs-server-hr/src/main/java/cc/mrbird/febs/server/hr/FebsServerHrApplication.java
New file
@@ -0,0 +1,28 @@
package cc.mrbird.febs.server.hr;
import cc.mrbird.febs.common.security.starter.annotation.EnableFebsCloudResourceServer;
import com.codingapi.txlcn.tc.config.EnableDistributedTransaction;
import org.mybatis.spring.annotation.MapperScan;
import org.springframework.boot.WebApplicationType;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.builder.SpringApplicationBuilder;
import org.springframework.scheduling.annotation.EnableAsync;
import org.springframework.transaction.annotation.EnableTransactionManagement;
/**
 * @author MrBird
 */
@EnableAsync
@SpringBootApplication
@EnableFebsCloudResourceServer
@EnableTransactionManagement
@EnableDistributedTransaction
@MapperScan("cc.mrbird.febs.server.hr.mapper")
public class FebsServerHrApplication {
    public static void main(String[] args) {
        new SpringApplicationBuilder(FebsServerHrApplication.class)
                .web(WebApplicationType.SERVLET)
                .run(args);
    }
}
febs-server/febs-server-hr/src/main/java/cc/mrbird/febs/server/hr/runner/StartedUpRunner.java
New file
@@ -0,0 +1,27 @@
package cc.mrbird.febs.server.hr.runner;
import cc.mrbird.febs.common.core.utils.FebsUtil;
import lombok.RequiredArgsConstructor;
import org.springframework.boot.ApplicationArguments;
import org.springframework.boot.ApplicationRunner;
import org.springframework.context.ConfigurableApplicationContext;
import org.springframework.core.env.Environment;
import org.springframework.stereotype.Component;
/**
 * @author MrBird
 */
@Component
@RequiredArgsConstructor
public class StartedUpRunner implements ApplicationRunner {
    private final ConfigurableApplicationContext context;
    private final Environment environment;
    @Override
    public void run(ApplicationArguments args) {
        if (context.isActive()) {
            FebsUtil.printSystemUpBanner(environment);
        }
    }
}
febs-server/febs-server-hr/src/main/resources/ValidationMessages.properties
New file
@@ -0,0 +1,6 @@
required=\u4E0D\u80FD\u4E3A\u7A7A
range=\u6709\u6548\u957f\u5ea6{min}\u5230{max}\u4e2a\u5b57\u7b26
email=\u90ae\u7bb1\u683c\u5f0f\u4e0d\u5408\u6cd5
mobile=\u624b\u673a\u53f7\u4e0d\u5408\u6cd5
noMoreThan=\u957f\u5ea6\u4e0d\u80fd\u8d85\u8fc7{max}\u4e2a\u5b57\u7b26
invalid=\u503c\u4e0d\u5408\u6cd5
febs-server/febs-server-hr/src/main/resources/banner.txt
New file
@@ -0,0 +1,8 @@
|------------------------------|
|    ____  ____  ___   __      |
|   | |_  | |_  | |_) ( (`     |
|   |_|   |_|__ |_|_) _)_)     |
|                              |
|   ${spring.application.name}           |
|   Spring-Boot: ${spring-boot.version} |
|------------------------------|
febs-server/febs-server-hr/src/main/resources/bootstrap.yml
New file
@@ -0,0 +1,28 @@
spring:
  application:
    name: FEBS-Server-Hr
  cloud:
    nacos:
      config:
        server-addr: ${nacos.url}:8848
        group: DEFAULT_GROUP
        prefix: febs-server-Hr
        file-extension: yaml
      discovery:
        server-addr: ${nacos.url}:8848
logging:
  level:
    org:
      springframework:
        boot:
          actuate:
            endpoint:
              EndpointId: error
    com:
      alibaba:
        cloud:
          nacos:
            client:
              NacosPropertySourceBuilder: error
febs-server/febs-server-job/src/main/java/cc/mrbird/febs/server/job/entity/Job.java
@@ -59,6 +59,7 @@
    private Date createTime;
    private transient String createTimeFrom;
    private transient String createTimeTo;
    public enum ScheduleStatus {
        /**
         * 正常
febs-server/febs-server-job/src/main/resources/mapper/JobMapper.xml
@@ -2,14 +2,14 @@
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="cc.mrbird.febs.server.job.mapper.JobMapper">
    <select id="queryList" resultType="job">
        select job_id          jobId,
               bean_name       beanName,
               method_name     methodName,
               params,
               cron_expression cronExpression,
               status,
               remark,
               create_time     createTime
        select job_id jobId,
        bean_name beanName,
        method_name methodName,
        params,
        cron_expression cronExpression,
        status,
        remark,
        create_time createTime
        from t_job
        order by job_id
    </select>
febs-server/febs-server-system/src/main/resources/mapper/LoginLogMapper.xml
@@ -10,7 +10,8 @@
    </select>
    <select id="findTodayIp" resultType="long">
        SELECT count(DISTINCT(ip)) FROM t_login_log WHERE login_time between CURDATE() and DATE_ADD(CURDATE(), INTERVAL 1 DAY)
        SELECT count(DISTINCT(ip)) FROM t_login_log WHERE login_time between CURDATE() and DATE_ADD(CURDATE(), INTERVAL
        1 DAY)
    </select>
    <select id="findLastTenDaysVisitCount" resultType="map" parameterType="string">
febs-server/febs-server-system/src/main/resources/mapper/MenuMapper.xml
@@ -5,26 +5,26 @@
    <select id="findUserPermissions" resultType="menu">
        select distinct m.perms
        from t_role r
                 left join t_user_role ur on (r.role_id = ur.role_id)
                 left join t_user u on (u.user_id = ur.user_id)
                 left join t_role_menu rm on (rm.role_id = r.role_id)
                 left join t_menu m on (m.menu_id = rm.menu_id)
        left join t_user_role ur on (r.role_id = ur.role_id)
        left join t_user u on (u.user_id = ur.user_id)
        left join t_role_menu rm on (rm.role_id = r.role_id)
        left join t_menu m on (m.menu_id = rm.menu_id)
        where u.username = #{userName}
          and m.perms is not null
          and m.perms &lt;&gt; ''
        and m.perms is not null
        and m.perms &lt;&gt; ''
    </select>
    <select id="findUserMenus" resultType="menu">
        select m.*
        from t_menu m
        where m.type &lt;&gt; 1
          and m.MENU_ID in
              (select distinct rm.menu_id
               from t_role_menu rm
                        left join t_role r on (rm.role_id = r.role_id)
                        left join t_user_role ur on (ur.role_id = r.role_id)
                        left join t_user u on (u.user_id = ur.user_id)
               where u.username = #{userName})
        and m.MENU_ID in
        (select distinct rm.menu_id
        from t_role_menu rm
        left join t_role r on (rm.role_id = r.role_id)
        left join t_user_role ur on (ur.role_id = r.role_id)
        left join t_user u on (u.user_id = ur.user_id)
        where u.username = #{userName})
        order by m.order_num
    </select>
</mapper>
febs-server/febs-server-system/src/main/resources/mapper/RoleMapper.xml
@@ -14,13 +14,13 @@
    <select id="findUserRole" resultMap="roleMap">
        SELECT
            r.*
        r.*
        FROM
            t_role r
        t_role r
        LEFT JOIN t_user_role ur ON (r.role_id = ur.role_id)
        LEFT JOIN t_user u ON (u.user_id = ur.user_id)
        WHERE
            u.username = #{username}
        u.username = #{username}
    </select>
    <select id="findRolePage" parameterType="role" resultType="role">
febs-server/pom.xml
@@ -22,6 +22,7 @@
        <module>febs-server-test</module>
        <module>febs-server-generator</module>
        <module>febs-server-job</module>
        <module>febs-server-hr</module>
    </modules>
    <dependencies>