Spring Boot 基础骨架

项目可以打成jar部署,也可以打成war部署,默认使用jar

<groupId>com.goblin</groupId>
    <artifactId>goblin-restful-client</artifactId>
    <!--<packaging>war</packaging>-->
<packaging>jar</packaging>

也可以用Docker部署,要求

maven打包命令 : mvn clean package docker:build

项目所用技术

项目包含了

要求 :

权限

Spring Security在这里仅仅只是用来认证(登录认证).

细粒度的权限是自行实现,resources/manage_system.pdm可以自行查看 manage_permission_resource, manage_role, manage_role_permission_resource, manage_user, manage_user_role 代码中 AdminPermissionInterceptor 进行拦截控制,具体看代码实现,都有注释.

这里没有后台页面,权限的管理需要自行设计页面处理,或者自己插入脚本.

项目无状态

不使用session

com.goblin.ContextUtils

用户相关数据从 ContextUtils 中获取

数据交互

org.springframework.http.ResponseEntity

使用ResponseEntity对数据进行封装

代码生成器

goblin-generator
|---src
|   |---test
         |---com
              |---goblin
                   |---generator
                       |---...

注意,所有状态,类型等字段,请使用枚举

比如 : String resourceType(API:接口,MENU:菜单,BUTTON:按钮)
这样的字段在实体中使用枚举类型

创建枚举

相应的枚举,注释必须完整 注:

/**
 * 资源类型(API:接口,MENU:菜单,BUTTON:按钮)
 * <p>
 * 对应字段 {@link com.goblin.domain.PermissionResource#resourceType}
 */
@Getter
public enum ResourceType implements IEnum {

    API( "API" , "接口" ),
    MENU( "MENU" , "菜单" ),
    BUTTON( "BUTTON" , "按钮" );

    /** 数据库存储值 **/
    private String value;
    /** 相应注释 **/
    private String comment;

    ResourceType ( String value , String comment ) {
        this.value = value;
        this.comment = comment;
    }

    /**
     * {@link JsonValue} 指定序列化为该字段,也就是显示时以该字段显示
     */
    @JsonValue
    public String getComment () {
        return comment;
    }
}

实体中声明

public class PermissionResource {
    private Long id;
    private ResourceType resourceType;
    // ... ... 
}

配置枚举包位置

mybatis-plus:
  type-enums-package: com.goblin.manage.bean.domain.enums

使用 mybatis plus

文档 http://mp.baomidou.com

查询分页(PageHelper)

https://pagehelper.github.io

示例 :

// controller
@GetMapping
public ResponseEntity< PageInfo > listPage ( PageRowBounds pageRowBounds ) {
    return ResponseEntityPro.ok(userService.listPage( pageRowBounds ) );
}

// service
public PageInfo listPage ( PageRowBounds pageRowBounds ) {
    PageHelper.startPage( pageRowBounds.getOffset(), pageRowBounds.getLimit() );
    return new PageInfo( super.selectList( null ) );
}

api返回指定/排除字段

示例 :

// 排除指定字段
@GetMapping
public ResponseEntity< PageInfo > listPage ( PageRowBounds pageRowBounds ) {
    return ResponseEntityPro.ok(userService.listPage( pageRowBounds ) ,"-password,-realName" );
}

// 只返回指定字段
@GetMapping
public ResponseEntity< PageInfo > listPage ( PageRowBounds pageRowBounds ) {
    return ResponseEntityPro.ok(userService.listPage( pageRowBounds ) ,"password,realName" );
}

api权限返回指定/排除字段

# 见 resource_api_uri_show_fields 字段
SELECT * FROM manage_role_permission_resource;

流程控制

接口对内使用Exception处理 AssertUtils

AssertUtils.isTrue( condition , "操作失败." );

接口对外使用if else流程控制

配置文件加密

<dependency>
    <groupId>com.github.ulisesbocchio</groupId>
    <artifactId>jasypt-spring-boot-starter</artifactId>
    <version>版本 https://github.com/ulisesbocchio/jasypt-spring-boot 获取最新的</version>
</dependency>
jasypt:
  encryptor:
    password: goblin
@RunWith( SpringRunner.class )
@SpringBootTest
public class JasyptStringEncryptorTest {

    @Autowired
    private StringEncryptor stringEncryptor;

    @Test
    public void name () throws Exception {
        final String username = stringEncryptor.encrypt( "root" );
        final String password = stringEncryptor.encrypt( "root" );

        System.err.println( "username = " + username );
        System.err.println( "password = " + password );

    }
}
spring:
  datasource:
    username: ENC(jEmjzNoC9rTYorAj5mI84A==)
    password: ENC(jEmjzNoC9rTYorAj5mI84A==)

项目介绍

版本

启动

初始化数据库

执行 resources/init-mysql.sql(库名goblin,创建数据库时,记得设置编码为:UTF-8)

启动redis

默认使用 127.0.0.1:6379

项目

以下都可单独运行

goblin-admin-ui

用于监控服务,http://localhost:8888

goblin-manage-system

http://localhost:8080

goblin-scheduling

简单调度