- 升级到 spring boot 2.0
 
项目可以打成jar部署,也可以打成war部署,默认使用jar
<groupId>com.goblin</groupId>
    <artifactId>goblin-restful-client</artifactId>
    <!--<packaging>war</packaging>-->
<packaging>jar</packaging>也可以用Docker部署,要求
- 本地含有Docker,启动状态
 - Docker包含JDK1.8,如没有安装即可
 
docker pull javamaven打包命令 : mvn clean package docker:build
项目所用技术
- Spring
 - Spring Boot
 - Spring MVC
 - Spring Session(已不使用,项目无状态)
 - Spring Security
 - Spring Cache
 - Spring Boot Admin
 - Hibernate Validator
 - Mybatis Plus
 - Redis
 - Swagger(已废弃)
 - Pagehelper
 - Druid
 - Log4j2
 - WebSocket
 - JWT(JSON Web Tokens)
 - WebSocket
 - jasypt 配置文件加密
 
项目包含了
- 分布式锁
 - 分布式唯一code构建
 - 分布式session共享(已不使用,项目无状态)
 - 异步处理
 - Aop缓存
 - 基础CRUD
 - 物理分页
 - 异步日志,多线程下用户的会话跟踪
 - Swagger restful api
 - 异常统一处理
 - Cors解决跨域
 - 注入攻击拦截器
 - 多环境配置
 - 基本工具类
 - jwt认证
 - Spring Security基础权限管理
 - 细粒度权限控制(粒度控制到字段)
 - 验证码
 - Spring Boot Admin 管理和监视
 - 极简分布式任务调度
 - WebSocket 简单示例
 
要求 :
- JDK 1.8
 - redis 默认使用 127.0.0.1:6379
 - mysql root/12345678 127.0.0.1:3306 数据库名称 : goblin,基础sql见init.sql
 - lombok 插件(eclipse IntelliJ IDEA),不然项目可能会报错,但是不影响运行
 
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:按钮)
这样的字段在实体中使用枚举类型
相应的枚举,注释必须完整 注:
- 枚举放入domain.enum包下
 
/**
 * 资源类型(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的分页,使用PageHelper,mybatis plus分页对多表查询的分页支持不够
 
示例 :
// 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 ) );
}示例 :
// 排除指定字段
@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" );
}# 见 resource_api_uri_show_fields 字段
SELECT * FROM manage_role_permission_resource;
接口对内使用Exception处理 AssertUtils
AssertUtils.isTrue( condition , "操作失败." );接口对外使用if else流程控制
- 
引入依赖
- pom.xml
 
 
<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- 
加密
- JasyptStringEncryptorTest.java
 
 
@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 );
	}
}- 
使用
- 格式 : ENC(需要解密的字符串)
 
 
spring:
  datasource:
    username: ENC(jEmjzNoC9rTYorAj5mI84A==)
    password: ENC(jEmjzNoC9rTYorAj5mI84A==)- goblin-parent 控制版本
 
其实这些模块,在这里体现不出什么,这里就一个goblin-manage-system服务,其实可以全部写到goblin-manage-system里面就行了,这样看起来就简单很多. 因为自己用过Spring Cloud进行开发,这里只是为了以后多服务方便.
- goblin-basic-config 公共配置模块
 - goblin-cache 缓存模块
 - goblin-common 工具模块
 - goblin-security 安全模块
 
- goblin-generator
 
- goblin-admin-ui
 
- goblin-manage-system 主服务
 - goblin-scheduling 分布式调度服务,非常简单
 
执行 resources/init-mysql.sql(库名goblin,创建数据库时,记得设置编码为:UTF-8)
默认使用 127.0.0.1:6379
以下都可单独运行
用于监控服务,http://localhost:8888
- 
DemoController 注入攻击,api返回指定/排除字段示例
 - 
DistributedDemoController 分布式锁以及异步处理的demo
 - 
EnumDemoController mybatis 枚举处理
 - 
LogDemoController aop
 - 
UserValidatorDemoController HibernateValidator 例子
 - 
WebSocketDemoController WebSocket例子
 
简单调度


