Full Code of xkcoding/spring-boot-demo for AI

master 87a142f9604c cached
875 files
2.0 MB
591.3k tokens
1828 symbols
1 requests
Download .txt
Showing preview only (2,354K chars total). Download the full file or copy to clipboard to get everything.
Repository: xkcoding/spring-boot-demo
Branch: master
Commit: 87a142f9604c
Files: 875
Total size: 2.0 MB

Directory structure:
gitextract_ajnuvaj3/

├── .codacy.yml
├── .editorconfig
├── .gitee/
│   ├── ISSUE_TEMPLATE/
│   │   ├── bug_report.md
│   │   └── feature_request.md
│   └── PULL_REQUEST_TEMPLATE.md
├── .github/
│   ├── FUNDING.yml
│   ├── ISSUE_TEMPLATE/
│   │   ├── bug_report.md
│   │   └── feature_request.md
│   ├── PULL_REQUEST_TEMPLATE.md
│   └── workflows/
│       └── maven.yml
├── .gitignore
├── .travis.yml
├── LICENSE
├── README.en.md
├── README.md
├── TODO.en.md
├── TODO.md
├── demo-activiti/
│   ├── .gitignore
│   ├── pom.xml
│   └── src/
│       ├── main/
│       │   ├── java/
│       │   │   └── com/
│       │   │       └── xkcoding/
│       │   │           └── activiti/
│       │   │               ├── SpringBootDemoActivitiApplication.java
│       │   │               ├── config/
│       │   │               │   └── SecurityConfiguration.java
│       │   │               └── util/
│       │   │                   └── SecurityUtil.java
│       │   └── resources/
│       │       ├── application.yml
│       │       └── processes/
│       │           └── team01.bpmn
│       └── test/
│           └── java/
│               └── com/
│                   └── xkcoding/
│                       └── activiti/
│                           └── SpringBootDemoActivitiApplicationTests.java
├── demo-actuator/
│   ├── .gitignore
│   ├── README.md
│   ├── pom.xml
│   └── src/
│       ├── main/
│       │   ├── java/
│       │   │   └── com/
│       │   │       └── xkcoding/
│       │   │           └── actuator/
│       │   │               └── SpringBootDemoActuatorApplication.java
│       │   └── resources/
│       │       └── application.yml
│       └── test/
│           └── java/
│               └── com/
│                   └── xkcoding/
│                       └── actuator/
│                           └── SpringBootDemoActuatorApplicationTests.java
├── demo-admin/
│   ├── README.md
│   ├── admin-client/
│   │   ├── .gitignore
│   │   ├── README.md
│   │   ├── pom.xml
│   │   └── src/
│   │       ├── main/
│   │       │   ├── java/
│   │       │   │   └── com/
│   │       │   │       └── xkcoding/
│   │       │   │           └── admin/
│   │       │   │               └── client/
│   │       │   │                   ├── SpringBootDemoAdminClientApplication.java
│   │       │   │                   └── controller/
│   │       │   │                       └── IndexController.java
│   │       │   └── resources/
│   │       │       └── application.yml
│   │       └── test/
│   │           └── java/
│   │               └── com/
│   │                   └── xkcoding/
│   │                       └── admin/
│   │                           └── client/
│   │                               └── SpringBootDemoAdminClientApplicationTests.java
│   ├── admin-server/
│   │   ├── .gitignore
│   │   ├── README.md
│   │   ├── pom.xml
│   │   └── src/
│   │       ├── main/
│   │       │   ├── java/
│   │       │   │   └── com/
│   │       │   │       └── xkcoding/
│   │       │   │           └── admin/
│   │       │   │               └── server/
│   │       │   │                   └── SpringBootDemoAdminServerApplication.java
│   │       │   └── resources/
│   │       │       └── application.yml
│   │       └── test/
│   │           └── java/
│   │               └── com/
│   │                   └── xkcoding/
│   │                       └── admin/
│   │                           └── server/
│   │                               └── SpringBootDemoAdminServerApplicationTests.java
│   └── pom.xml
├── demo-async/
│   ├── .gitignore
│   ├── README.md
│   ├── pom.xml
│   └── src/
│       ├── main/
│       │   ├── java/
│       │   │   └── com/
│       │   │       └── xkcoding/
│       │   │           └── async/
│       │   │               ├── SpringBootDemoAsyncApplication.java
│       │   │               └── task/
│       │   │                   └── TaskFactory.java
│       │   └── resources/
│       │       └── application.yml
│       └── test/
│           └── java/
│               └── com/
│                   └── xkcoding/
│                       └── async/
│                           ├── SpringBootDemoAsyncApplicationTests.java
│                           └── task/
│                               └── TaskFactoryTest.java
├── demo-cache-ehcache/
│   ├── .gitignore
│   ├── README.md
│   ├── pom.xml
│   └── src/
│       ├── main/
│       │   ├── java/
│       │   │   └── com/
│       │   │       └── xkcoding/
│       │   │           └── cache/
│       │   │               └── ehcache/
│       │   │                   ├── SpringBootDemoCacheEhcacheApplication.java
│       │   │                   ├── entity/
│       │   │                   │   └── User.java
│       │   │                   └── service/
│       │   │                       ├── UserService.java
│       │   │                       └── impl/
│       │   │                           └── UserServiceImpl.java
│       │   └── resources/
│       │       ├── application.yml
│       │       └── ehcache.xml
│       └── test/
│           └── java/
│               └── com/
│                   └── xkcoding/
│                       └── cache/
│                           └── ehcache/
│                               ├── SpringBootDemoCacheEhcacheApplicationTests.java
│                               └── service/
│                                   └── UserServiceTest.java
├── demo-cache-redis/
│   ├── .gitignore
│   ├── README.md
│   ├── pom.xml
│   └── src/
│       ├── main/
│       │   ├── java/
│       │   │   └── com/
│       │   │       └── xkcoding/
│       │   │           └── cache/
│       │   │               └── redis/
│       │   │                   ├── SpringBootDemoCacheRedisApplication.java
│       │   │                   ├── config/
│       │   │                   │   └── RedisConfig.java
│       │   │                   ├── entity/
│       │   │                   │   └── User.java
│       │   │                   └── service/
│       │   │                       ├── UserService.java
│       │   │                       └── impl/
│       │   │                           └── UserServiceImpl.java
│       │   └── resources/
│       │       └── application.yml
│       └── test/
│           └── java/
│               └── com/
│                   └── xkcoding/
│                       └── cache/
│                           └── redis/
│                               ├── RedisTest.java
│                               ├── SpringBootDemoCacheRedisApplicationTests.java
│                               └── service/
│                                   └── UserServiceTest.java
├── demo-codegen/
│   ├── .gitignore
│   ├── README.md
│   ├── pom.xml
│   └── src/
│       ├── main/
│       │   ├── java/
│       │   │   └── com/
│       │   │       └── xkcoding/
│       │   │           └── codegen/
│       │   │               ├── SpringBootDemoCodegenApplication.java
│       │   │               ├── common/
│       │   │               │   ├── IResultCode.java
│       │   │               │   ├── PageResult.java
│       │   │               │   ├── R.java
│       │   │               │   └── ResultCode.java
│       │   │               ├── constants/
│       │   │               │   └── GenConstants.java
│       │   │               ├── controller/
│       │   │               │   └── CodeGenController.java
│       │   │               ├── entity/
│       │   │               │   ├── ColumnEntity.java
│       │   │               │   ├── GenConfig.java
│       │   │               │   ├── TableEntity.java
│       │   │               │   └── TableRequest.java
│       │   │               ├── service/
│       │   │               │   ├── CodeGenService.java
│       │   │               │   └── impl/
│       │   │               │       └── CodeGenServiceImpl.java
│       │   │               └── utils/
│       │   │                   ├── CodeGenUtil.java
│       │   │                   └── DbUtil.java
│       │   └── resources/
│       │       ├── application.yml
│       │       ├── generator.properties
│       │       ├── jdbc_type.properties
│       │       ├── logback-spring.xml
│       │       ├── static/
│       │       │   ├── index.html
│       │       │   └── libs/
│       │       │       ├── datejs/
│       │       │       │   └── date-zh-CN.js
│       │       │       └── iview/
│       │       │           └── iview.css
│       │       └── template/
│       │           ├── Controller.java.vm
│       │           ├── Entity.java.vm
│       │           ├── Mapper.java.vm
│       │           ├── Mapper.xml.vm
│       │           ├── Service.java.vm
│       │           ├── ServiceImpl.java.vm
│       │           └── api.js.vm
│       └── test/
│           └── java/
│               └── com/
│                   └── xkcoding/
│                       └── codegen/
│                           ├── CodeGenServiceTest.java
│                           └── SpringBootDemoCodegenApplicationTests.java
├── demo-docker/
│   ├── .gitignore
│   ├── Dockerfile
│   ├── README.md
│   ├── pom.xml
│   └── src/
│       ├── main/
│       │   ├── java/
│       │   │   └── com/
│       │   │       └── xkcoding/
│       │   │           └── docker/
│       │   │               ├── SpringBootDemoDockerApplication.java
│       │   │               └── controller/
│       │   │                   └── HelloController.java
│       │   └── resources/
│       │       └── application.yml
│       └── test/
│           └── java/
│               └── com/
│                   └── xkcoding/
│                       └── docker/
│                           └── SpringBootDemoDockerApplicationTests.java
├── demo-dubbo/
│   ├── .gitignore
│   ├── README.md
│   ├── dubbo-common/
│   │   ├── .gitignore
│   │   ├── README.md
│   │   ├── pom.xml
│   │   └── src/
│   │       └── main/
│   │           └── java/
│   │               └── com/
│   │                   └── xkcoding/
│   │                       └── dubbo/
│   │                           └── common/
│   │                               └── service/
│   │                                   └── HelloService.java
│   ├── dubbo-consumer/
│   │   ├── .gitignore
│   │   ├── README.md
│   │   ├── pom.xml
│   │   └── src/
│   │       ├── main/
│   │       │   ├── java/
│   │       │   │   └── com/
│   │       │   │       └── xkcoding/
│   │       │   │           └── dubbo/
│   │       │   │               └── consumer/
│   │       │   │                   ├── SpringBootDemoDubboConsumerApplication.java
│   │       │   │                   └── controller/
│   │       │   │                       └── HelloController.java
│   │       │   └── resources/
│   │       │       └── application.yml
│   │       └── test/
│   │           └── java/
│   │               └── com/
│   │                   └── xkcoding/
│   │                       └── dubbo/
│   │                           └── consumer/
│   │                               └── SpringBootDemoDubboConsumerApplicationTests.java
│   ├── dubbo-provider/
│   │   ├── .gitignore
│   │   ├── README.md
│   │   ├── pom.xml
│   │   └── src/
│   │       ├── main/
│   │       │   ├── java/
│   │       │   │   └── com/
│   │       │   │       └── xkcoding/
│   │       │   │           └── dubbo/
│   │       │   │               └── provider/
│   │       │   │                   ├── SpringBootDemoDubboProviderApplication.java
│   │       │   │                   └── service/
│   │       │   │                       └── HelloServiceImpl.java
│   │       │   └── resources/
│   │       │       └── application.yml
│   │       └── test/
│   │           └── java/
│   │               └── com/
│   │                   └── xkcoding/
│   │                       └── dubbo/
│   │                           └── provider/
│   │                               └── SpringBootDemoDubboProviderApplicationTests.java
│   └── pom.xml
├── demo-dynamic-datasource/
│   ├── .gitignore
│   ├── README.md
│   ├── db/
│   │   ├── init.sql
│   │   └── user.sql
│   ├── pom.xml
│   └── src/
│       ├── main/
│       │   ├── java/
│       │   │   └── com/
│       │   │       └── xkcoding/
│       │   │           └── dynamic/
│       │   │               └── datasource/
│       │   │                   ├── SpringBootDemoDynamicDatasourceApplication.java
│       │   │                   ├── annotation/
│       │   │                   │   └── DefaultDatasource.java
│       │   │                   ├── aspect/
│       │   │                   │   └── DatasourceSelectorAspect.java
│       │   │                   ├── config/
│       │   │                   │   ├── DatasourceConfiguration.java
│       │   │                   │   ├── MyMapper.java
│       │   │                   │   └── MybatisConfiguration.java
│       │   │                   ├── controller/
│       │   │                   │   ├── DatasourceConfigController.java
│       │   │                   │   └── UserController.java
│       │   │                   ├── datasource/
│       │   │                   │   ├── DatasourceConfigCache.java
│       │   │                   │   ├── DatasourceConfigContextHolder.java
│       │   │                   │   ├── DatasourceHolder.java
│       │   │                   │   ├── DatasourceManager.java
│       │   │                   │   ├── DatasourceScheduler.java
│       │   │                   │   └── DynamicDataSource.java
│       │   │                   ├── mapper/
│       │   │                   │   ├── DatasourceConfigMapper.java
│       │   │                   │   └── UserMapper.java
│       │   │                   ├── model/
│       │   │                   │   ├── DatasourceConfig.java
│       │   │                   │   └── User.java
│       │   │                   └── utils/
│       │   │                       └── SpringUtil.java
│       │   └── resources/
│       │       └── application.yml
│       └── test/
│           └── java/
│               └── com/
│                   └── xkcoding/
│                       └── dynamic/
│                           └── datasource/
│                               └── SpringBootDemoDynamicDatasourceApplicationTests.java
├── demo-elasticsearch/
│   ├── .gitignore
│   ├── README.md
│   ├── pom.xml
│   └── src/
│       ├── main/
│       │   ├── java/
│       │   │   └── com/
│       │   │       └── xkcoding/
│       │   │           └── elasticsearch/
│       │   │               ├── SpringBootDemoElasticsearchApplication.java
│       │   │               ├── constants/
│       │   │               │   └── EsConsts.java
│       │   │               ├── model/
│       │   │               │   └── Person.java
│       │   │               └── repository/
│       │   │                   └── PersonRepository.java
│       │   └── resources/
│       │       └── application.yml
│       └── test/
│           └── java/
│               └── com/
│                   └── xkcoding/
│                       └── elasticsearch/
│                           ├── SpringBootDemoElasticsearchApplicationTests.java
│                           ├── repository/
│                           │   └── PersonRepositoryTest.java
│                           └── template/
│                               └── TemplateTest.java
├── demo-elasticsearch-rest-high-level-client/
│   ├── .gitignore
│   ├── README.md
│   ├── pom.xml
│   └── src/
│       ├── main/
│       │   ├── java/
│       │   │   └── com/
│       │   │       └── xkcoding/
│       │   │           └── elasticsearch/
│       │   │               ├── ElasticsearchApplication.java
│       │   │               ├── common/
│       │   │               │   ├── Result.java
│       │   │               │   └── ResultCode.java
│       │   │               ├── config/
│       │   │               │   ├── ElasticsearchAutoConfiguration.java
│       │   │               │   └── ElasticsearchProperties.java
│       │   │               ├── contants/
│       │   │               │   └── ElasticsearchConstant.java
│       │   │               ├── exception/
│       │   │               │   └── ElasticsearchException.java
│       │   │               ├── model/
│       │   │               │   └── Person.java
│       │   │               └── service/
│       │   │                   ├── PersonService.java
│       │   │                   ├── base/
│       │   │                   │   └── BaseElasticsearchService.java
│       │   │                   └── impl/
│       │   │                       └── PersonServiceImpl.java
│       │   └── resources/
│       │       └── application.yml
│       └── test/
│           └── java/
│               └── com/
│                   └── xkcoding/
│                       └── elasticsearch/
│                           └── ElasticsearchApplicationTests.java
├── demo-email/
│   ├── .gitignore
│   ├── README.md
│   ├── pom.xml
│   └── src/
│       ├── main/
│       │   ├── java/
│       │   │   └── com/
│       │   │       └── xkcoding/
│       │   │           └── email/
│       │   │               ├── SpringBootDemoEmailApplication.java
│       │   │               └── service/
│       │   │                   ├── MailService.java
│       │   │                   └── impl/
│       │   │                       └── MailServiceImpl.java
│       │   └── resources/
│       │       ├── application.yml
│       │       ├── email/
│       │       │   └── test.html
│       │       └── templates/
│       │           └── welcome.html
│       └── test/
│           └── java/
│               └── com/
│                   └── xkcoding/
│                       └── email/
│                           ├── PasswordTest.java
│                           ├── SpringBootDemoEmailApplicationTests.java
│                           └── service/
│                               └── MailServiceTest.java
├── demo-exception-handler/
│   ├── .gitignore
│   ├── README.md
│   ├── pom.xml
│   └── src/
│       ├── main/
│       │   ├── java/
│       │   │   └── com/
│       │   │       └── xkcoding/
│       │   │           └── exception/
│       │   │               └── handler/
│       │   │                   ├── SpringBootDemoExceptionHandlerApplication.java
│       │   │                   ├── constant/
│       │   │                   │   └── Status.java
│       │   │                   ├── controller/
│       │   │                   │   └── TestController.java
│       │   │                   ├── exception/
│       │   │                   │   ├── BaseException.java
│       │   │                   │   ├── JsonException.java
│       │   │                   │   └── PageException.java
│       │   │                   ├── handler/
│       │   │                   │   └── DemoExceptionHandler.java
│       │   │                   └── model/
│       │   │                       └── ApiResponse.java
│       │   └── resources/
│       │       ├── application.yml
│       │       └── templates/
│       │           └── error.html
│       └── test/
│           └── java/
│               └── com/
│                   └── xkcoding/
│                       └── exception/
│                           └── handler/
│                               └── SpringBootDemoExceptionHandlerApplicationTests.java
├── demo-flyway/
│   ├── .gitignore
│   ├── README.md
│   ├── pom.xml
│   └── src/
│       ├── main/
│       │   ├── java/
│       │   │   └── com/
│       │   │       └── xkcoding/
│       │   │           └── flyway/
│       │   │               └── SpringBootDemoFlywayApplication.java
│       │   └── resources/
│       │       ├── application.yml
│       │       └── db/
│       │           └── migration/
│       │               ├── V1_0__INIT.sql
│       │               └── V1_1__ALTER.sql
│       └── test/
│           └── java/
│               └── com/
│                   └── xkcoding/
│                       └── AppTest.java
├── demo-graylog/
│   ├── .gitignore
│   ├── README.md
│   ├── pom.xml
│   └── src/
│       ├── main/
│       │   ├── java/
│       │   │   └── com/
│       │   │       └── xkcoding/
│       │   │           └── graylog/
│       │   │               └── SpringBootDemoGraylogApplication.java
│       │   └── resources/
│       │       ├── application.yml
│       │       └── logback-spring.xml
│       └── test/
│           └── java/
│               └── com/
│                   └── xkcoding/
│                       └── graylog/
│                           └── SpringBootDemoGraylogApplicationTests.java
├── demo-helloworld/
│   ├── .gitignore
│   ├── README.md
│   ├── pom.xml
│   └── src/
│       ├── main/
│       │   ├── java/
│       │   │   └── com/
│       │   │       └── xkcoding/
│       │   │           └── helloworld/
│       │   │               └── SpringBootDemoHelloworldApplication.java
│       │   └── resources/
│       │       └── application.yml
│       └── test/
│           └── java/
│               └── com/
│                   └── xkcoding/
│                       └── helloworld/
│                           └── SpringBootDemoHelloworldApplicationTests.java
├── demo-https/
│   ├── .gitignore
│   ├── README.md
│   ├── pom.xml
│   └── src/
│       ├── main/
│       │   ├── java/
│       │   │   └── com/
│       │   │       └── xkcoding/
│       │   │           └── https/
│       │   │               ├── SpringBootDemoHttpsApplication.java
│       │   │               └── config/
│       │   │                   └── HttpsConfig.java
│       │   └── resources/
│       │       ├── application.yml
│       │       ├── server.keystore
│       │       └── static/
│       │           └── index.html
│       └── test/
│           └── java/
│               └── com/
│                   └── xkcoding/
│                       └── https/
│                           └── SpringBootDemoHttpsApplicationTests.java
├── demo-ldap/
│   ├── .gitignore
│   ├── README.md
│   ├── pom.xml
│   └── src/
│       ├── main/
│       │   ├── java/
│       │   │   └── com/
│       │   │       └── xkcoding/
│       │   │           └── ldap/
│       │   │               ├── LdapDemoApplication.java
│       │   │               ├── api/
│       │   │               │   ├── Result.java
│       │   │               │   └── ResultCode.java
│       │   │               ├── entity/
│       │   │               │   └── Person.java
│       │   │               ├── exception/
│       │   │               │   └── ServiceException.java
│       │   │               ├── repository/
│       │   │               │   └── PersonRepository.java
│       │   │               ├── request/
│       │   │               │   └── LoginRequest.java
│       │   │               ├── service/
│       │   │               │   ├── PersonService.java
│       │   │               │   └── impl/
│       │   │               │       └── PersonServiceImpl.java
│       │   │               └── util/
│       │   │                   └── LdapUtils.java
│       │   └── resources/
│       │       └── application.yml
│       └── test/
│           └── java/
│               └── com/
│                   └── xkcoding/
│                       └── ldap/
│                           └── LdapDemoApplicationTests.java
├── demo-log-aop/
│   ├── .gitignore
│   ├── README.md
│   ├── pom.xml
│   └── src/
│       ├── main/
│       │   ├── java/
│       │   │   └── com/
│       │   │       └── xkcoding/
│       │   │           └── log/
│       │   │               └── aop/
│       │   │                   ├── SpringBootDemoLogAopApplication.java
│       │   │                   ├── aspectj/
│       │   │                   │   └── AopLog.java
│       │   │                   └── controller/
│       │   │                       └── TestController.java
│       │   └── resources/
│       │       ├── application.yml
│       │       └── logback-spring.xml
│       └── test/
│           └── java/
│               └── com/
│                   └── xkcoding/
│                       └── log/
│                           └── aop/
│                               └── SpringBootDemoLogAopApplicationTests.java
├── demo-logback/
│   ├── .gitignore
│   ├── README.md
│   ├── pom.xml
│   └── src/
│       ├── main/
│       │   ├── java/
│       │   │   └── com/
│       │   │       └── xkcoding/
│       │   │           └── logback/
│       │   │               └── SpringBootDemoLogbackApplication.java
│       │   └── resources/
│       │       ├── application.yml
│       │       └── logback-spring.xml
│       └── test/
│           └── java/
│               └── com/
│                   └── xkcoding/
│                       └── logback/
│                           └── SpringBootDemoLogbackApplicationTests.java
├── demo-mongodb/
│   ├── .gitignore
│   ├── README.md
│   ├── pom.xml
│   └── src/
│       ├── main/
│       │   ├── java/
│       │   │   └── com/
│       │   │       └── xkcoding/
│       │   │           └── mongodb/
│       │   │               ├── SpringBootDemoMongodbApplication.java
│       │   │               ├── model/
│       │   │               │   └── Article.java
│       │   │               └── repository/
│       │   │                   └── ArticleRepository.java
│       │   └── resources/
│       │       └── application.yml
│       └── test/
│           └── java/
│               └── com/
│                   └── xkcoding/
│                       └── mongodb/
│                           ├── SpringBootDemoMongodbApplicationTests.java
│                           └── repository/
│                               └── ArticleRepositoryTest.java
├── demo-mq-kafka/
│   ├── .gitignore
│   ├── README.md
│   ├── pom.xml
│   └── src/
│       ├── main/
│       │   ├── java/
│       │   │   └── com/
│       │   │       └── xkcoding/
│       │   │           └── mq/
│       │   │               └── kafka/
│       │   │                   ├── SpringBootDemoMqKafkaApplication.java
│       │   │                   ├── config/
│       │   │                   │   └── KafkaConfig.java
│       │   │                   ├── constants/
│       │   │                   │   └── KafkaConsts.java
│       │   │                   └── handler/
│       │   │                       └── MessageHandler.java
│       │   └── resources/
│       │       └── application.yml
│       └── test/
│           └── java/
│               └── com/
│                   └── xkcoding/
│                       └── mq/
│                           └── kafka/
│                               └── SpringBootDemoMqKafkaApplicationTests.java
├── demo-mq-rabbitmq/
│   ├── .gitignore
│   ├── README.md
│   ├── pom.xml
│   └── src/
│       ├── main/
│       │   ├── java/
│       │   │   └── com/
│       │   │       └── xkcoding/
│       │   │           └── mq/
│       │   │               └── rabbitmq/
│       │   │                   ├── SpringBootDemoMqRabbitmqApplication.java
│       │   │                   ├── config/
│       │   │                   │   └── RabbitMqConfig.java
│       │   │                   ├── constants/
│       │   │                   │   └── RabbitConsts.java
│       │   │                   ├── handler/
│       │   │                   │   ├── DelayQueueHandler.java
│       │   │                   │   ├── DirectQueueOneHandler.java
│       │   │                   │   ├── QueueThreeHandler.java
│       │   │                   │   └── QueueTwoHandler.java
│       │   │                   └── message/
│       │   │                       └── MessageStruct.java
│       │   └── resources/
│       │       └── application.yml
│       └── test/
│           └── java/
│               └── com/
│                   └── xkcoding/
│                       └── mq/
│                           └── rabbitmq/
│                               └── SpringBootDemoMqRabbitmqApplicationTests.java
├── demo-mq-rocketmq/
│   ├── .gitignore
│   ├── README.md
│   ├── pom.xml
│   └── src/
│       ├── main/
│       │   ├── java/
│       │   │   └── com/
│       │   │       └── xkcoding/
│       │   │           └── mq/
│       │   │               └── rocketmq/
│       │   │                   └── SpringBootDemoMqRocketmqApplication.java
│       │   └── resources/
│       │       └── application.properties
│       └── test/
│           └── java/
│               └── com/
│                   └── xkcoding/
│                       └── mq/
│                           └── rocketmq/
│                               └── SpringBootDemoMqRocketmqApplicationTests.java
├── demo-multi-datasource-jpa/
│   ├── .gitignore
│   ├── README.md
│   ├── pom.xml
│   └── src/
│       ├── main/
│       │   ├── java/
│       │   │   └── com/
│       │   │       └── xkcoding/
│       │   │           └── multi/
│       │   │               └── datasource/
│       │   │                   └── jpa/
│       │   │                       ├── SpringBootDemoMultiDatasourceJpaApplication.java
│       │   │                       ├── config/
│       │   │                       │   ├── PrimaryDataSourceConfig.java
│       │   │                       │   ├── PrimaryJpaConfig.java
│       │   │                       │   ├── SecondDataSourceConfig.java
│       │   │                       │   ├── SecondJpaConfig.java
│       │   │                       │   └── SnowflakeConfig.java
│       │   │                       ├── entity/
│       │   │                       │   ├── primary/
│       │   │                       │   │   └── PrimaryMultiTable.java
│       │   │                       │   └── second/
│       │   │                       │       └── SecondMultiTable.java
│       │   │                       └── repository/
│       │   │                           ├── primary/
│       │   │                           │   └── PrimaryMultiTableRepository.java
│       │   │                           └── second/
│       │   │                               └── SecondMultiTableRepository.java
│       │   └── resources/
│       │       └── application.yml
│       └── test/
│           └── java/
│               └── com/
│                   └── xkcoding/
│                       └── multi/
│                           └── datasource/
│                               └── jpa/
│                                   └── SpringBootDemoMultiDatasourceJpaApplicationTests.java
├── demo-multi-datasource-mybatis/
│   ├── .gitignore
│   ├── README.md
│   ├── pom.xml
│   ├── sql/
│   │   └── db.sql
│   └── src/
│       ├── main/
│       │   ├── java/
│       │   │   └── com/
│       │   │       └── xkcoding/
│       │   │           └── multi/
│       │   │               └── datasource/
│       │   │                   └── mybatis/
│       │   │                       ├── SpringBootDemoMultiDatasourceMybatisApplication.java
│       │   │                       ├── mapper/
│       │   │                       │   └── UserMapper.java
│       │   │                       ├── model/
│       │   │                       │   └── User.java
│       │   │                       └── service/
│       │   │                           ├── UserService.java
│       │   │                           └── impl/
│       │   │                               └── UserServiceImpl.java
│       │   └── resources/
│       │       └── application.yml
│       └── test/
│           └── java/
│               └── com/
│                   └── xkcoding/
│                       └── multi/
│                           └── datasource/
│                               └── mybatis/
│                                   ├── SpringBootDemoMultiDatasourceMybatisApplicationTests.java
│                                   └── service/
│                                       └── impl/
│                                           └── UserServiceImplTest.java
├── demo-neo4j/
│   ├── .gitignore
│   ├── README.md
│   ├── pom.xml
│   └── src/
│       ├── main/
│       │   ├── java/
│       │   │   └── com/
│       │   │       └── xkcoding/
│       │   │           └── neo4j/
│       │   │               ├── SpringBootDemoNeo4jApplication.java
│       │   │               ├── config/
│       │   │               │   └── CustomIdStrategy.java
│       │   │               ├── constants/
│       │   │               │   └── NeoConsts.java
│       │   │               ├── model/
│       │   │               │   ├── Class.java
│       │   │               │   ├── Lesson.java
│       │   │               │   ├── Student.java
│       │   │               │   └── Teacher.java
│       │   │               ├── payload/
│       │   │               │   ├── ClassmateInfoGroupByLesson.java
│       │   │               │   └── TeacherStudent.java
│       │   │               ├── repository/
│       │   │               │   ├── ClassRepository.java
│       │   │               │   ├── LessonRepository.java
│       │   │               │   ├── StudentRepository.java
│       │   │               │   └── TeacherRepository.java
│       │   │               └── service/
│       │   │                   └── NeoService.java
│       │   └── resources/
│       │       └── application.yml
│       └── test/
│           └── java/
│               └── com/
│                   └── xkcoding/
│                       └── neo4j/
│                           ├── Neo4jTest.java
│                           └── SpringBootDemoNeo4jApplicationTests.java
├── demo-oauth/
│   ├── .gitignore
│   ├── README.md
│   ├── oauth-authorization-server/
│   │   ├── README.adoc
│   │   ├── pom.xml
│   │   └── src/
│   │       ├── main/
│   │       │   ├── java/
│   │       │   │   └── com/
│   │       │   │       └── xkcoding/
│   │       │   │           └── oauth/
│   │       │   │               ├── SpringBootDemoOauthApplication.java
│   │       │   │               ├── config/
│   │       │   │               │   ├── ClientLoginFailureHandler.java
│   │       │   │               │   ├── ClientLogoutSuccessHandler.java
│   │       │   │               │   ├── Oauth2AuthorizationServerConfig.java
│   │       │   │               │   ├── Oauth2AuthorizationTokenConfig.java
│   │       │   │               │   ├── WebSecurityConfig.java
│   │       │   │               │   └── package-info.java
│   │       │   │               ├── controller/
│   │       │   │               │   ├── AuthorizationController.java
│   │       │   │               │   ├── Oauth2Controller.java
│   │       │   │               │   └── package-info.java
│   │       │   │               ├── entity/
│   │       │   │               │   ├── SysClientDetails.java
│   │       │   │               │   ├── SysRole.java
│   │       │   │               │   └── SysUser.java
│   │       │   │               ├── repostiory/
│   │       │   │               │   ├── SysClientDetailsRepository.java
│   │       │   │               │   └── SysUserRepository.java
│   │       │   │               └── service/
│   │       │   │                   ├── SysClientDetailsService.java
│   │       │   │                   ├── SysUserService.java
│   │       │   │                   ├── impl/
│   │       │   │                   │   ├── SysClientDetailsServiceImpl.java
│   │       │   │                   │   └── SysUserServiceImpl.java
│   │       │   │                   └── package-info.java
│   │       │   └── resources/
│   │       │       ├── application.yml
│   │       │       ├── oauth2.jks
│   │       │       ├── public.txt
│   │       │       └── templates/
│   │       │           ├── authorization.html
│   │       │           ├── common/
│   │       │           │   └── common.html
│   │       │           ├── error.html
│   │       │           ├── login.html
│   │       │           ├── logout.html
│   │       │           └── registerTemplate.html
│   │       └── test/
│   │           ├── java/
│   │           │   └── com/
│   │           │       └── xkcoding/
│   │           │           └── oauth/
│   │           │               ├── PasswordEncodeTest.java
│   │           │               ├── oauth/
│   │           │               │   ├── AuthorizationCodeGrantTests.java
│   │           │               │   ├── AuthorizationServerInfo.java
│   │           │               │   └── ResourceOwnerPasswordGrantTests.java
│   │           │               └── repostiory/
│   │           │                   ├── SysClientDetailsTest.java
│   │           │                   └── SysUserRepositoryTest.java
│   │           └── resources/
│   │               ├── application.yml
│   │               ├── import.sql
│   │               └── schema.sql
│   ├── oauth-resource-server/
│   │   ├── README.adoc
│   │   ├── pom.xml
│   │   └── src/
│   │       ├── main/
│   │       │   ├── java/
│   │       │   │   └── com/
│   │       │   │       └── xkcoding/
│   │       │   │           └── oauth/
│   │       │   │               ├── SpringBootDemoResourceApplication.java
│   │       │   │               ├── config/
│   │       │   │               │   ├── OauthResourceServerConfig.java
│   │       │   │               │   └── OauthResourceTokenConfig.java
│   │       │   │               └── controller/
│   │       │   │                   └── TestController.java
│   │       │   └── resources/
│   │       │       └── application.yml
│   │       └── test/
│   │           └── java/
│   │               └── com/
│   │                   └── xkcoding/
│   │                       └── oauth/
│   │                           ├── AuthorizationTest.java
│   │                           └── controller/
│   │                               └── TestControllerTest.java
│   └── pom.xml
├── demo-orm-beetlsql/
│   ├── .gitignore
│   ├── README.md
│   ├── pom.xml
│   └── src/
│       ├── main/
│       │   ├── java/
│       │   │   └── com/
│       │   │       └── xkcoding/
│       │   │           └── orm/
│       │   │               └── beetlsql/
│       │   │                   ├── SpringBootDemoOrmBeetlsqlApplication.java
│       │   │                   ├── config/
│       │   │                   │   └── BeetlConfig.java
│       │   │                   ├── dao/
│       │   │                   │   └── UserDao.java
│       │   │                   ├── entity/
│       │   │                   │   └── User.java
│       │   │                   └── service/
│       │   │                       ├── UserService.java
│       │   │                       └── impl/
│       │   │                           └── UserServiceImpl.java
│       │   └── resources/
│       │       ├── application.yml
│       │       └── db/
│       │           ├── data.sql
│       │           └── schema.sql
│       └── test/
│           └── java/
│               └── com/
│                   └── xkcoding/
│                       └── orm/
│                           └── beetlsql/
│                               ├── SpringBootDemoOrmBeetlsqlApplicationTests.java
│                               └── service/
│                                   └── UserServiceTest.java
├── demo-orm-jdbctemplate/
│   ├── .gitignore
│   ├── README.md
│   ├── pom.xml
│   └── src/
│       ├── main/
│       │   ├── java/
│       │   │   └── com/
│       │   │       └── xkcoding/
│       │   │           └── orm/
│       │   │               └── jdbctemplate/
│       │   │                   ├── SpringBootDemoOrmJdbctemplateApplication.java
│       │   │                   ├── annotation/
│       │   │                   │   ├── Column.java
│       │   │                   │   ├── Ignore.java
│       │   │                   │   ├── Pk.java
│       │   │                   │   └── Table.java
│       │   │                   ├── constant/
│       │   │                   │   └── Const.java
│       │   │                   ├── controller/
│       │   │                   │   └── UserController.java
│       │   │                   ├── dao/
│       │   │                   │   ├── UserDao.java
│       │   │                   │   └── base/
│       │   │                   │       └── BaseDao.java
│       │   │                   ├── entity/
│       │   │                   │   └── User.java
│       │   │                   └── service/
│       │   │                       ├── IUserService.java
│       │   │                       └── impl/
│       │   │                           └── UserServiceImpl.java
│       │   └── resources/
│       │       ├── application.yml
│       │       └── db/
│       │           ├── data.sql
│       │           └── schema.sql
│       └── test/
│           └── java/
│               └── com/
│                   └── xkcoding/
│                       └── orm/
│                           └── jdbctemplate/
│                               └── SpringBootDemoOrmJdbctemplateApplicationTests.java
├── demo-orm-jpa/
│   ├── .gitignore
│   ├── README.md
│   ├── pom.xml
│   └── src/
│       ├── main/
│       │   ├── java/
│       │   │   └── com/
│       │   │       └── xkcoding/
│       │   │           └── orm/
│       │   │               └── jpa/
│       │   │                   ├── SpringBootDemoOrmJpaApplication.java
│       │   │                   ├── config/
│       │   │                   │   └── JpaConfig.java
│       │   │                   ├── entity/
│       │   │                   │   ├── Department.java
│       │   │                   │   ├── User.java
│       │   │                   │   └── base/
│       │   │                   │       └── AbstractAuditModel.java
│       │   │                   └── repository/
│       │   │                       ├── DepartmentDao.java
│       │   │                       └── UserDao.java
│       │   └── resources/
│       │       ├── application.yml
│       │       └── db/
│       │           ├── data.sql
│       │           └── schema.sql
│       └── test/
│           └── java/
│               └── com/
│                   └── xkcoding/
│                       └── orm/
│                           └── jpa/
│                               ├── SpringBootDemoOrmJpaApplicationTests.java
│                               └── repository/
│                                   ├── DepartmentDaoTest.java
│                                   └── UserDaoTest.java
├── demo-orm-mybatis/
│   ├── .gitignore
│   ├── README.md
│   ├── pom.xml
│   └── src/
│       ├── main/
│       │   ├── java/
│       │   │   └── com/
│       │   │       └── xkcoding/
│       │   │           └── orm/
│       │   │               └── mybatis/
│       │   │                   ├── SpringBootDemoOrmMybatisApplication.java
│       │   │                   ├── entity/
│       │   │                   │   └── User.java
│       │   │                   └── mapper/
│       │   │                       └── UserMapper.java
│       │   └── resources/
│       │       ├── application.yml
│       │       ├── db/
│       │       │   ├── data.sql
│       │       │   └── schema.sql
│       │       └── mappers/
│       │           └── UserMapper.xml
│       └── test/
│           └── java/
│               └── com/
│                   └── xkcoding/
│                       └── orm/
│                           └── mybatis/
│                               ├── SpringBootDemoOrmMybatisApplicationTests.java
│                               └── mapper/
│                                   └── UserMapperTest.java
├── demo-orm-mybatis-mapper-page/
│   ├── .gitignore
│   ├── README.md
│   ├── pom.xml
│   └── src/
│       ├── main/
│       │   ├── java/
│       │   │   └── com/
│       │   │       └── xkcoding/
│       │   │           └── orm/
│       │   │               └── mybatis/
│       │   │                   └── MapperAndPage/
│       │   │                       ├── SpringBootDemoOrmMybatisMapperPageApplication.java
│       │   │                       ├── entity/
│       │   │                       │   └── User.java
│       │   │                       └── mapper/
│       │   │                           └── UserMapper.java
│       │   └── resources/
│       │       ├── application.yml
│       │       └── db/
│       │           ├── data.sql
│       │           └── schema.sql
│       └── test/
│           └── java/
│               └── com/
│                   └── xkcoding/
│                       └── orm/
│                           └── mybatis/
│                               └── MapperAndPage/
│                                   ├── SpringBootDemoOrmMybatisMapperPageApplicationTests.java
│                                   └── mapper/
│                                       └── UserMapperTest.java
├── demo-orm-mybatis-plus/
│   ├── .gitignore
│   ├── README.md
│   ├── pom.xml
│   └── src/
│       ├── main/
│       │   ├── java/
│       │   │   └── com/
│       │   │       └── xkcoding/
│       │   │           └── orm/
│       │   │               └── mybatis/
│       │   │                   └── plus/
│       │   │                       ├── SpringBootDemoOrmMybatisPlusApplication.java
│       │   │                       ├── config/
│       │   │                       │   ├── CommonFieldHandler.java
│       │   │                       │   └── MybatisPlusConfig.java
│       │   │                       ├── entity/
│       │   │                       │   ├── Role.java
│       │   │                       │   └── User.java
│       │   │                       ├── mapper/
│       │   │                       │   ├── RoleMapper.java
│       │   │                       │   └── UserMapper.java
│       │   │                       └── service/
│       │   │                           ├── UserService.java
│       │   │                           └── impl/
│       │   │                               └── UserServiceImpl.java
│       │   └── resources/
│       │       ├── application.yml
│       │       └── db/
│       │           ├── data.sql
│       │           └── schema.sql
│       └── test/
│           └── java/
│               └── com/
│                   └── xkcoding/
│                       └── orm/
│                           └── mybatis/
│                               └── plus/
│                                   ├── SpringBootDemoOrmMybatisPlusApplicationTests.java
│                                   ├── activerecord/
│                                   │   └── ActiveRecordTest.java
│                                   └── service/
│                                       └── UserServiceTest.java
├── demo-pay/
│   ├── .gitignore
│   ├── README.md
│   ├── pom.xml
│   └── src/
│       ├── main/
│       │   ├── java/
│       │   │   └── com/
│       │   │       └── xkcoding/
│       │   │           └── pay/
│       │   │               └── SpringBootDemoPayApplication.java
│       │   └── resources/
│       │       └── application.yml
│       └── test/
│           └── java/
│               └── com/
│                   └── xkcoding/
│                       └── pay/
│                           └── SpringBootDemoPayApplicationTests.java
├── demo-properties/
│   ├── .gitignore
│   ├── README.md
│   ├── pom.xml
│   └── src/
│       ├── main/
│       │   ├── java/
│       │   │   └── com/
│       │   │       └── xkcoding/
│       │   │           └── properties/
│       │   │               ├── SpringBootDemoPropertiesApplication.java
│       │   │               ├── controller/
│       │   │               │   └── PropertyController.java
│       │   │               └── property/
│       │   │                   ├── ApplicationProperty.java
│       │   │                   └── DeveloperProperty.java
│       │   └── resources/
│       │       ├── META-INF/
│       │       │   └── additional-spring-configuration-metadata.json
│       │       ├── application-dev.yml
│       │       ├── application-prod.yml
│       │       └── application.yml
│       └── test/
│           └── java/
│               └── com/
│                   └── xkcoding/
│                       └── properties/
│                           └── SpringBootDemoPropertiesApplicationTests.java
├── demo-ratelimit-guava/
│   ├── .gitignore
│   ├── README.md
│   ├── pom.xml
│   └── src/
│       ├── main/
│       │   ├── java/
│       │   │   └── com/
│       │   │       └── xkcoding/
│       │   │           └── ratelimit/
│       │   │               └── guava/
│       │   │                   ├── SpringBootDemoRatelimitGuavaApplication.java
│       │   │                   ├── annotation/
│       │   │                   │   └── RateLimiter.java
│       │   │                   ├── aspect/
│       │   │                   │   └── RateLimiterAspect.java
│       │   │                   ├── controller/
│       │   │                   │   └── TestController.java
│       │   │                   └── handler/
│       │   │                       └── GlobalExceptionHandler.java
│       │   └── resources/
│       │       └── application.yml
│       └── test/
│           └── java/
│               └── com/
│                   └── xkcoding/
│                       └── ratelimit/
│                           └── guava/
│                               └── SpringBootDemoRatelimitGuavaApplicationTests.java
├── demo-ratelimit-redis/
│   ├── .gitignore
│   ├── README.md
│   ├── pom.xml
│   └── src/
│       ├── main/
│       │   ├── java/
│       │   │   └── com/
│       │   │       └── xkcoding/
│       │   │           └── ratelimit/
│       │   │               └── redis/
│       │   │                   ├── SpringBootDemoRatelimitRedisApplication.java
│       │   │                   ├── annotation/
│       │   │                   │   └── RateLimiter.java
│       │   │                   ├── aspect/
│       │   │                   │   └── RateLimiterAspect.java
│       │   │                   ├── config/
│       │   │                   │   └── RedisConfig.java
│       │   │                   ├── controller/
│       │   │                   │   └── TestController.java
│       │   │                   ├── handler/
│       │   │                   │   └── GlobalExceptionHandler.java
│       │   │                   └── util/
│       │   │                       └── IpUtil.java
│       │   └── resources/
│       │       ├── application.yml
│       │       └── scripts/
│       │           └── redis/
│       │               └── limit.lua
│       └── test/
│           └── java/
│               └── com/
│                   └── xkcoding/
│                       └── ratelimit/
│                           └── redis/
│                               └── SpringBootDemoRatelimiterRedisApplicationTests.java
├── demo-rbac-security/
│   ├── .gitignore
│   ├── README.md
│   ├── pom.xml
│   ├── sql/
│   │   └── security.sql
│   └── src/
│       ├── main/
│       │   ├── java/
│       │   │   └── com/
│       │   │       └── xkcoding/
│       │   │           └── rbac/
│       │   │               └── security/
│       │   │                   ├── SpringBootDemoRbacSecurityApplication.java
│       │   │                   ├── common/
│       │   │                   │   ├── ApiResponse.java
│       │   │                   │   ├── BaseException.java
│       │   │                   │   ├── Consts.java
│       │   │                   │   ├── IStatus.java
│       │   │                   │   ├── PageResult.java
│       │   │                   │   └── Status.java
│       │   │                   ├── config/
│       │   │                   │   ├── CustomConfig.java
│       │   │                   │   ├── IdConfig.java
│       │   │                   │   ├── IgnoreConfig.java
│       │   │                   │   ├── JwtAuthenticationFilter.java
│       │   │                   │   ├── JwtConfig.java
│       │   │                   │   ├── RbacAuthorityService.java
│       │   │                   │   ├── RedisConfig.java
│       │   │                   │   ├── SecurityConfig.java
│       │   │                   │   ├── SecurityHandlerConfig.java
│       │   │                   │   └── WebMvcConfig.java
│       │   │                   ├── controller/
│       │   │                   │   ├── AuthController.java
│       │   │                   │   ├── MonitorController.java
│       │   │                   │   └── TestController.java
│       │   │                   ├── exception/
│       │   │                   │   ├── SecurityException.java
│       │   │                   │   └── handler/
│       │   │                   │       └── GlobalExceptionHandler.java
│       │   │                   ├── model/
│       │   │                   │   ├── Permission.java
│       │   │                   │   ├── Role.java
│       │   │                   │   ├── RolePermission.java
│       │   │                   │   ├── User.java
│       │   │                   │   ├── UserRole.java
│       │   │                   │   └── unionkey/
│       │   │                   │       ├── RolePermissionKey.java
│       │   │                   │       └── UserRoleKey.java
│       │   │                   ├── payload/
│       │   │                   │   ├── LoginRequest.java
│       │   │                   │   └── PageCondition.java
│       │   │                   ├── repository/
│       │   │                   │   ├── PermissionDao.java
│       │   │                   │   ├── RoleDao.java
│       │   │                   │   ├── RolePermissionDao.java
│       │   │                   │   ├── UserDao.java
│       │   │                   │   └── UserRoleDao.java
│       │   │                   ├── service/
│       │   │                   │   ├── CustomUserDetailsService.java
│       │   │                   │   └── MonitorService.java
│       │   │                   ├── util/
│       │   │                   │   ├── JwtUtil.java
│       │   │                   │   ├── PageUtil.java
│       │   │                   │   ├── RedisUtil.java
│       │   │                   │   ├── ResponseUtil.java
│       │   │                   │   └── SecurityUtil.java
│       │   │                   └── vo/
│       │   │                       ├── JwtResponse.java
│       │   │                       ├── OnlineUser.java
│       │   │                       └── UserPrincipal.java
│       │   └── resources/
│       │       └── application.yml
│       └── test/
│           └── java/
│               └── com/
│                   └── xkcoding/
│                       └── rbac/
│                           └── security/
│                               ├── SpringBootDemoRbacSecurityApplicationTests.java
│                               ├── repository/
│                               │   ├── DataInitTest.java
│                               │   └── UserDaoTest.java
│                               └── util/
│                                   └── RedisUtilTest.java
├── demo-rbac-shiro/
│   ├── .gitignore
│   ├── pom.xml
│   ├── sql/
│   │   └── shiro.sql
│   └── src/
│       ├── main/
│       │   ├── java/
│       │   │   └── com/
│       │   │       └── xkcoding/
│       │   │           └── rbac/
│       │   │               └── shiro/
│       │   │                   ├── SpringBootDemoRbacShiroApplication.java
│       │   │                   ├── common/
│       │   │                   │   ├── IResultCode.java
│       │   │                   │   ├── R.java
│       │   │                   │   └── ResultCode.java
│       │   │                   ├── config/
│       │   │                   │   └── MybatisPlusConfig.java
│       │   │                   └── controller/
│       │   │                       └── TestController.java
│       │   └── resources/
│       │       ├── application.yml
│       │       └── spy.properties
│       └── test/
│           └── java/
│               └── com/
│                   └── xkcoding/
│                       └── rbac/
│                           └── shiro/
│                               └── SpringBootDemoRbacShiroApplicationTests.java
├── demo-session/
│   ├── .gitignore
│   ├── README.md
│   ├── pom.xml
│   └── src/
│       ├── main/
│       │   ├── java/
│       │   │   └── com/
│       │   │       └── xkcoding/
│       │   │           └── session/
│       │   │               ├── SpringBootDemoSessionApplication.java
│       │   │               ├── config/
│       │   │               │   └── WebMvcConfig.java
│       │   │               ├── constants/
│       │   │               │   └── Consts.java
│       │   │               ├── controller/
│       │   │               │   └── PageController.java
│       │   │               └── interceptor/
│       │   │                   └── SessionInterceptor.java
│       │   └── resources/
│       │       ├── application.yml
│       │       └── templates/
│       │           ├── index.html
│       │           └── login.html
│       └── test/
│           └── java/
│               └── com/
│                   └── xkcoding/
│                       └── session/
│                           └── SpringBootDemoSessionApplicationTests.java
├── demo-sharding-jdbc/
│   ├── .gitignore
│   ├── README.md
│   ├── pom.xml
│   ├── sql/
│   │   └── schema.sql
│   └── src/
│       ├── main/
│       │   ├── java/
│       │   │   └── com/
│       │   │       └── xkcoding/
│       │   │           └── sharding/
│       │   │               └── jdbc/
│       │   │                   ├── SpringBootDemoShardingJdbcApplication.java
│       │   │                   ├── config/
│       │   │                   │   ├── CustomSnowflakeKeyGenerator.java
│       │   │                   │   └── DataSourceShardingConfig.java
│       │   │                   ├── mapper/
│       │   │                   │   └── OrderMapper.java
│       │   │                   └── model/
│       │   │                       └── Order.java
│       │   └── resources/
│       │       └── application.yml
│       └── test/
│           └── java/
│               └── com/
│                   └── xkcoding/
│                       └── sharding/
│                           └── jdbc/
│                               └── SpringBootDemoShardingJdbcApplicationTests.java
├── demo-social/
│   ├── .gitignore
│   ├── README.md
│   ├── pom.xml
│   └── src/
│       ├── main/
│       │   ├── java/
│       │   │   └── com/
│       │   │       └── xkcoding/
│       │   │           └── social/
│       │   │               ├── SpringBootDemoSocialApplication.java
│       │   │               └── controller/
│       │   │                   └── OauthController.java
│       │   └── resources/
│       │       └── application.yml
│       └── test/
│           └── java/
│               └── com/
│                   └── xkcoding/
│                       └── social/
│                           └── SpringBootDemoSocialApplicationTests.java
├── demo-swagger/
│   ├── .gitignore
│   ├── README.md
│   ├── pom.xml
│   └── src/
│       ├── main/
│       │   ├── java/
│       │   │   └── com/
│       │   │       └── xkcoding/
│       │   │           └── swagger/
│       │   │               ├── SpringBootDemoSwaggerApplication.java
│       │   │               ├── common/
│       │   │               │   ├── ApiResponse.java
│       │   │               │   ├── DataType.java
│       │   │               │   └── ParamType.java
│       │   │               ├── config/
│       │   │               │   └── Swagger2Config.java
│       │   │               ├── controller/
│       │   │               │   └── UserController.java
│       │   │               └── entity/
│       │   │                   └── User.java
│       │   └── resources/
│       │       └── application.yml
│       └── test/
│           └── java/
│               └── com/
│                   └── xkcoding/
│                       └── swagger/
│                           └── SpringBootDemoSwaggerApplicationTests.java
├── demo-swagger-beauty/
│   ├── .gitignore
│   ├── README.md
│   ├── pom.xml
│   └── src/
│       ├── main/
│       │   ├── java/
│       │   │   └── com/
│       │   │       └── xkcoding/
│       │   │           └── swagger/
│       │   │               └── beauty/
│       │   │                   ├── SpringBootDemoSwaggerBeautyApplication.java
│       │   │                   ├── common/
│       │   │                   │   └── ApiResponse.java
│       │   │                   ├── controller/
│       │   │                   │   └── UserController.java
│       │   │                   └── entity/
│       │   │                       └── User.java
│       │   └── resources/
│       │       └── application.yml
│       └── test/
│           └── java/
│               └── com/
│                   └── xkcoding/
│                       └── swagger/
│                           └── beauty/
│                               └── SpringBootDemoSwaggerBeautyApplicationTests.java
├── demo-task/
│   ├── .gitignore
│   ├── README.md
│   ├── pom.xml
│   └── src/
│       ├── main/
│       │   ├── java/
│       │   │   └── com/
│       │   │       └── xkcoding/
│       │   │           └── task/
│       │   │               ├── SpringBootDemoTaskApplication.java
│       │   │               ├── config/
│       │   │               │   └── TaskConfig.java
│       │   │               └── job/
│       │   │                   └── TaskJob.java
│       │   └── resources/
│       │       └── application.yml
│       └── test/
│           └── java/
│               └── com/
│                   └── xkcoding/
│                       └── task/
│                           └── SpringBootDemoTaskApplicationTests.java
├── demo-task-quartz/
│   ├── .gitignore
│   ├── README.md
│   ├── init/
│   │   └── dbTables/
│   │       ├── tables_cloudscape.sql
│   │       ├── tables_cubrid.sql
│   │       ├── tables_db2.sql
│   │       ├── tables_db2_v72.sql
│   │       ├── tables_db2_v8.sql
│   │       ├── tables_db2_v95.sql
│   │       ├── tables_derby.sql
│   │       ├── tables_derby_previous.sql
│   │       ├── tables_firebird.sql
│   │       ├── tables_h2.sql
│   │       ├── tables_hsqldb.sql
│   │       ├── tables_hsqldb_old.sql
│   │       ├── tables_informix.sql
│   │       ├── tables_mysql.sql
│   │       ├── tables_mysql_innodb.sql
│   │       ├── tables_oracle.sql
│   │       ├── tables_pointbase.sql
│   │       ├── tables_postgres.sql
│   │       ├── tables_sapdb.sql
│   │       ├── tables_solid.sql
│   │       ├── tables_sqlServer.sql
│   │       └── tables_sybase.sql
│   ├── pom.xml
│   └── src/
│       ├── main/
│       │   ├── java/
│       │   │   └── com/
│       │   │       └── xkcoding/
│       │   │           └── task/
│       │   │               └── quartz/
│       │   │                   ├── SpringBootDemoTaskQuartzApplication.java
│       │   │                   ├── common/
│       │   │                   │   └── ApiResponse.java
│       │   │                   ├── controller/
│       │   │                   │   └── JobController.java
│       │   │                   ├── entity/
│       │   │                   │   ├── domain/
│       │   │                   │   │   └── JobAndTrigger.java
│       │   │                   │   └── form/
│       │   │                   │       └── JobForm.java
│       │   │                   ├── job/
│       │   │                   │   ├── HelloJob.java
│       │   │                   │   ├── TestJob.java
│       │   │                   │   └── base/
│       │   │                   │       └── BaseJob.java
│       │   │                   ├── mapper/
│       │   │                   │   └── JobMapper.java
│       │   │                   ├── service/
│       │   │                   │   ├── JobService.java
│       │   │                   │   └── impl/
│       │   │                   │       └── JobServiceImpl.java
│       │   │                   └── util/
│       │   │                       └── JobUtil.java
│       │   └── resources/
│       │       ├── application.yml
│       │       ├── mappers/
│       │       │   └── JobMapper.xml
│       │       └── static/
│       │           └── job.html
│       └── test/
│           └── java/
│               └── com/
│                   └── xkcoding/
│                       └── task/
│                           └── quartz/
│                               └── SpringBootDemoTaskQuartzApplicationTests.java
├── demo-task-xxl-job/
│   ├── .gitignore
│   ├── README.md
│   ├── pom.xml
│   └── src/
│       └── main/
│           ├── java/
│           │   └── com/
│           │       └── xkcoding/
│           │           └── task/
│           │               └── xxl/
│           │                   └── job/
│           │                       ├── SpringBootDemoTaskXxlJobApplication.java
│           │                       ├── config/
│           │                       │   ├── XxlJobConfig.java
│           │                       │   └── props/
│           │                       │       └── XxlJobProps.java
│           │                       ├── controller/
│           │                       │   └── ManualOperateController.java
│           │                       └── task/
│           │                           └── DemoTask.java
│           └── resources/
│               └── application.yml
├── demo-template-beetl/
│   ├── .gitignore
│   ├── README.md
│   ├── pom.xml
│   └── src/
│       ├── main/
│       │   ├── java/
│       │   │   └── com/
│       │   │       └── xkcoding/
│       │   │           └── template/
│       │   │               └── beetl/
│       │   │                   ├── SpringBootDemoTemplateBeetlApplication.java
│       │   │                   ├── controller/
│       │   │                   │   ├── IndexController.java
│       │   │                   │   └── UserController.java
│       │   │                   └── model/
│       │   │                       └── User.java
│       │   └── resources/
│       │       ├── application.yml
│       │       └── templates/
│       │           ├── common/
│       │           │   └── head.html
│       │           └── page/
│       │               ├── index.btl
│       │               └── login.btl
│       └── test/
│           └── java/
│               └── com/
│                   └── xkcoding/
│                       └── template/
│                           └── beetl/
│                               └── SpringBootDemoTemplateBeetlApplicationTests.java
├── demo-template-enjoy/
│   ├── .gitignore
│   ├── README.md
│   ├── pom.xml
│   └── src/
│       ├── main/
│       │   ├── java/
│       │   │   └── com/
│       │   │       └── xkcoding/
│       │   │           └── template/
│       │   │               └── enjoy/
│       │   │                   ├── SpringBootDemoTemplateEnjoyApplication.java
│       │   │                   ├── config/
│       │   │                   │   └── EnjoyConfig.java
│       │   │                   ├── controller/
│       │   │                   │   ├── IndexController.java
│       │   │                   │   └── UserController.java
│       │   │                   └── model/
│       │   │                       └── User.java
│       │   └── resources/
│       │       ├── application.yml
│       │       └── templates/
│       │           ├── common/
│       │           │   └── head.html
│       │           └── page/
│       │               ├── index.html
│       │               └── login.html
│       └── test/
│           └── java/
│               └── com/
│                   └── xkcoding/
│                       └── template/
│                           └── enjoy/
│                               └── SpringBootDemoTemplateEnjoyApplicationTests.java
├── demo-template-freemarker/
│   ├── .gitignore
│   ├── README.md
│   ├── pom.xml
│   └── src/
│       ├── main/
│       │   ├── java/
│       │   │   └── com/
│       │   │       └── xkcoding/
│       │   │           └── template/
│       │   │               └── freemarker/
│       │   │                   ├── SpringBootDemoTemplateFreemarkerApplication.java
│       │   │                   ├── controller/
│       │   │                   │   ├── IndexController.java
│       │   │                   │   └── UserController.java
│       │   │                   └── model/
│       │   │                       └── User.java
│       │   └── resources/
│       │       ├── application.yml
│       │       └── templates/
│       │           ├── common/
│       │           │   └── head.ftl
│       │           └── page/
│       │               ├── index.ftl
│       │               └── login.ftl
│       └── test/
│           └── java/
│               └── com/
│                   └── xkcoding/
│                       └── template/
│                           └── freemarker/
│                               └── SpringBootDemoTemplateFreemarkerApplicationTests.java
├── demo-template-thymeleaf/
│   ├── .gitignore
│   ├── README.md
│   ├── pom.xml
│   └── src/
│       ├── main/
│       │   ├── java/
│       │   │   └── com/
│       │   │       └── xkcoding/
│       │   │           └── template/
│       │   │               └── thymeleaf/
│       │   │                   ├── SpringBootDemoTemplateThymeleafApplication.java
│       │   │                   ├── controller/
│       │   │                   │   ├── IndexController.java
│       │   │                   │   └── UserController.java
│       │   │                   └── model/
│       │   │                       └── User.java
│       │   └── resources/
│       │       ├── application.yml
│       │       └── templates/
│       │           ├── common/
│       │           │   └── head.html
│       │           └── page/
│       │               ├── index.html
│       │               └── login.html
│       └── test/
│           └── java/
│               └── com/
│                   └── xkcoding/
│                       └── template/
│                           └── thymeleaf/
│                               └── SpringBootDemoTemplateThymeleafApplicationTests.java
├── demo-tio/
│   ├── .gitignore
│   ├── README.md
│   ├── pom.xml
│   └── src/
│       ├── main/
│       │   ├── java/
│       │   │   └── com/
│       │   │       └── xkcoding/
│       │   │           └── springbootdemotio/
│       │   │               └── SpringBootDemoTioApplication.java
│       │   └── resources/
│       │       └── application.properties
│       └── test/
│           └── java/
│               └── com/
│                   └── xkcoding/
│                       └── springbootdemotio/
│                           └── SpringBootDemoTioApplicationTests.java
├── demo-uflo/
│   ├── .gitignore
│   ├── pom.xml
│   └── src/
│       ├── main/
│       │   ├── java/
│       │   │   └── com/
│       │   │       └── xkcoding/
│       │   │           └── uflo/
│       │   │               └── SpringBootDemoUfloApplication.java
│       │   └── resources/
│       │       └── application.properties
│       └── test/
│           └── java/
│               └── com/
│                   └── xkcoding/
│                       └── uflo/
│                           └── SpringBootDemoUfloApplicationTests.java
├── demo-upload/
│   ├── .gitignore
│   ├── README.md
│   ├── pom.xml
│   └── src/
│       ├── main/
│       │   ├── java/
│       │   │   └── com/
│       │   │       └── xkcoding/
│       │   │           └── upload/
│       │   │               ├── SpringBootDemoUploadApplication.java
│       │   │               ├── config/
│       │   │               │   └── UploadConfig.java
│       │   │               ├── controller/
│       │   │               │   ├── IndexController.java
│       │   │               │   └── UploadController.java
│       │   │               └── service/
│       │   │                   ├── IQiNiuService.java
│       │   │                   └── impl/
│       │   │                       └── QiNiuServiceImpl.java
│       │   └── resources/
│       │       ├── application.yml
│       │       └── templates/
│       │           └── index.html
│       └── test/
│           └── java/
│               └── com/
│                   └── xkcoding/
│                       └── upload/
│                           └── SpringBootDemoUploadApplicationTests.java
├── demo-ureport2/
│   ├── .gitignore
│   ├── README.md
│   ├── doc/
│   │   ├── sql/
│   │   │   └── t_user_ureport2.sql
│   │   └── ureport2/
│   │       └── user_inner_datasource.ureport.xml
│   ├── pom.xml
│   └── src/
│       ├── main/
│       │   ├── java/
│       │   │   └── com/
│       │   │       └── xkcoding/
│       │   │           └── ureport2/
│       │   │               ├── SpringBootDemoUreport2Application.java
│       │   │               └── config/
│       │   │                   └── InnerDatasource.java
│       │   └── resources/
│       │       └── application.yml
│       └── test/
│           └── java/
│               └── com/
│                   └── xkcoding/
│                       └── ureport2/
│                           └── SpringBootDemoUreport2ApplicationTests.java
├── demo-urule/
│   ├── .gitignore
│   ├── pom.xml
│   └── src/
│       ├── main/
│       │   ├── java/
│       │   │   └── com/
│       │   │       └── xkcoding/
│       │   │           └── urule/
│       │   │               └── SpringBootDemoUruleApplication.java
│       │   └── resources/
│       │       └── application.properties
│       └── test/
│           └── java/
│               └── com/
│                   └── xkcoding/
│                       └── urule/
│                           └── SpringBootDemoUruleApplicationTests.java
├── demo-war/
│   ├── .gitignore
│   ├── README.md
│   ├── pom.xml
│   └── src/
│       ├── main/
│       │   ├── java/
│       │   │   └── com/
│       │   │       └── xkcoding/
│       │   │           └── war/
│       │   │               └── SpringBootDemoWarApplication.java
│       │   └── resources/
│       │       └── application.yml
│       └── test/
│           └── java/
│               └── com/
│                   └── xkcoding/
│                       └── war/
│                           └── SpringBootDemoWarApplicationTests.java
├── demo-websocket/
│   ├── .gitignore
│   ├── README.md
│   ├── pom.xml
│   └── src/
│       ├── main/
│       │   ├── java/
│       │   │   └── com/
│       │   │       └── xkcoding/
│       │   │           └── websocket/
│       │   │               ├── SpringBootDemoWebsocketApplication.java
│       │   │               ├── common/
│       │   │               │   └── WebSocketConsts.java
│       │   │               ├── config/
│       │   │               │   └── WebSocketConfig.java
│       │   │               ├── controller/
│       │   │               │   └── ServerController.java
│       │   │               ├── model/
│       │   │               │   ├── Server.java
│       │   │               │   └── server/
│       │   │               │       ├── Cpu.java
│       │   │               │       ├── Jvm.java
│       │   │               │       ├── Mem.java
│       │   │               │       ├── Sys.java
│       │   │               │       └── SysFile.java
│       │   │               ├── payload/
│       │   │               │   ├── KV.java
│       │   │               │   ├── ServerVO.java
│       │   │               │   └── server/
│       │   │               │       ├── CpuVO.java
│       │   │               │       ├── JvmVO.java
│       │   │               │       ├── MemVO.java
│       │   │               │       ├── SysFileVO.java
│       │   │               │       └── SysVO.java
│       │   │               ├── task/
│       │   │               │   └── ServerTask.java
│       │   │               └── util/
│       │   │                   ├── IpUtil.java
│       │   │                   └── ServerUtil.java
│       │   └── resources/
│       │       ├── application.yml
│       │       └── static/
│       │           ├── js/
│       │           │   └── stomp.js
│       │           └── server.html
│       └── test/
│           └── java/
│               └── com/
│                   └── xkcoding/
│                       └── websocket/
│                           └── SpringBootDemoWebsocketApplicationTests.java
├── demo-websocket-socketio/
│   ├── .gitignore
│   ├── README.md
│   ├── pom.xml
│   └── src/
│       ├── main/
│       │   ├── java/
│       │   │   └── com/
│       │   │       └── xkcoding/
│       │   │           └── websocket/
│       │   │               └── socketio/
│       │   │                   ├── SpringBootDemoWebsocketSocketioApplication.java
│       │   │                   ├── config/
│       │   │                   │   ├── DbTemplate.java
│       │   │                   │   ├── Event.java
│       │   │                   │   ├── ServerConfig.java
│       │   │                   │   └── WsConfig.java
│       │   │                   ├── controller/
│       │   │                   │   └── MessageController.java
│       │   │                   ├── handler/
│       │   │                   │   └── MessageEventHandler.java
│       │   │                   ├── init/
│       │   │                   │   └── ServerRunner.java
│       │   │                   └── payload/
│       │   │                       ├── BroadcastMessageRequest.java
│       │   │                       ├── GroupMessageRequest.java
│       │   │                       ├── JoinRequest.java
│       │   │                       └── SingleMessageRequest.java
│       │   └── resources/
│       │       ├── application.yml
│       │       └── static/
│       │           ├── bootstrap.css
│       │           ├── index.html
│       │           └── js/
│       │               └── socket.io/
│       │                   └── socket.io.js
│       └── test/
│           └── java/
│               └── com/
│                   └── xkcoding/
│                       └── websocket/
│                           └── socketio/
│                               └── SpringBootDemoWebsocketSocketioApplicationTests.java
├── demo-zookeeper/
│   ├── .gitignore
│   ├── README.md
│   ├── pom.xml
│   └── src/
│       ├── main/
│       │   ├── java/
│       │   │   └── com/
│       │   │       └── xkcoding/
│       │   │           └── zookeeper/
│       │   │               ├── SpringBootDemoZookeeperApplication.java
│       │   │               ├── annotation/
│       │   │               │   ├── LockKeyParam.java
│       │   │               │   └── ZooLock.java
│       │   │               ├── aspectj/
│       │   │               │   └── ZooLockAspect.java
│       │   │               └── config/
│       │   │                   ├── ZkConfig.java
│       │   │                   └── props/
│       │   │                       └── ZkProps.java
│       │   └── resources/
│       │       └── application.yml
│       └── test/
│           └── java/
│               └── com/
│                   └── xkcoding/
│                       └── zookeeper/
│                           └── SpringBootDemoZookeeperApplicationTests.java
├── jd.md
└── pom.xml

================================================
FILE CONTENTS
================================================

================================================
FILE: .codacy.yml
================================================
---
exclude_paths:
  - '**.md'
  - '**/**.md'
  - '**.sql'
  - '**.html'
  - '**/static/**'
  - '**/templates/**'
  - '**/test/**'


================================================
FILE: .editorconfig
================================================
# 开发组IDE 编辑器标准
root = true

[*]
indent_size = 2
charset = utf-8
indent_style = space
end_of_line = lf
insert_final_newline = true
trim_trailing_whitespace = true

[*.{groovy, java, kt, kts, xsd}]
indent_size = 4


================================================
FILE: .gitee/ISSUE_TEMPLATE/bug_report.md
================================================
---
name: 报告缺陷
about: 报告缺陷以帮助我们改进
title: "[BUG]"
labels: bug
assignees: xkcoding
---

**请先看[《提问的智慧》](https://github.com/ryanhanwu/How-To-Ask-Questions-The-Smart-Way/blob/master/README-zh_CN.md?utm_source=hacpai.com)**,并尝试到 **[issue 列表](https://github.com/xkcoding/spring-boot-demo/issues)** 搜寻是否已经有人遇到过同样的问题。

----

### 描述问题

请尽量清晰精准地描述你碰到的问题。

```bash
日志内容
```

### 期待的结果

请尽量清晰精准地描述你所期待的结果。

### 截屏或录像

如果可能,请尽量附加截图或录像来描述你遇到的问题。

### 其他信息

请提供其他附加信息帮助我们诊断问题。


================================================
FILE: .gitee/ISSUE_TEMPLATE/feature_request.md
================================================
---
name: 请求新功能
about: 提出你期待的功能特性
title: "[FEATURE]"
labels: feature
assignees: xkcoding
---

### 你在什么场景下需要该功能?

请尽量清晰精准地描述你碰到的问题。

### 描述可能的解决方案

请尽量清晰精准地描述你期待我们要做的,描述你想到的实现方案。

### 描述你认为的候选方案

请尽量清晰精准地描述你能接受的候选解决方案。

### 其他信息

请提供关于该功能建议的其他附加信息。


================================================
FILE: .gitee/PULL_REQUEST_TEMPLATE.md
================================================
* PR 修复缺陷请先开 `issue` **[报告缺陷](https://github.com/xkcoding/spring-boot-demo/issues/new?template=bug_report.md)**
* PR 提交新特性请先开 `issue` **[报告新特性](https://github.com/xkcoding/spring-boot-demo/issues/new?template=feature_request.md)**
* PR 请提交到 `dev` 开发分支上
* 我们对编码风格有着较为严格的要求,请在阅读代码后模仿类似风格提交
* 欢迎通过 PR 给我们补充案例


================================================
FILE: .github/FUNDING.yml
================================================
custom: https://docs.xkcoding.com/SPONSER.html


================================================
FILE: .github/ISSUE_TEMPLATE/bug_report.md
================================================
---
name: 报告缺陷
about: 报告缺陷以帮助我们改进
title: "[BUG]"
labels: bug
assignees: xkcoding
---

**请先看[《提问的智慧》](https://github.com/ryanhanwu/How-To-Ask-Questions-The-Smart-Way/blob/master/README-zh_CN.md?utm_source=hacpai.com)**,并尝试到 **[issue 列表](https://github.com/xkcoding/spring-boot-demo/issues)** 搜寻是否已经有人遇到过同样的问题。

----

### 描述问题

请尽量清晰精准地描述你碰到的问题。

```bash
日志内容
```

### 期待的结果

请尽量清晰精准地描述你所期待的结果。

### 截屏或录像

如果可能,请尽量附加截图或录像来描述你遇到的问题。

### 其他信息

请提供其他附加信息帮助我们诊断问题。


================================================
FILE: .github/ISSUE_TEMPLATE/feature_request.md
================================================
---
name: 请求新功能
about: 提出你期待的功能特性
title: "[FEATURE]"
labels: feature
assignees: xkcoding
---

### 你在什么场景下需要该功能?

请尽量清晰精准地描述你碰到的问题。

### 描述可能的解决方案

请尽量清晰精准地描述你期待我们要做的,描述你想到的实现方案。

### 描述你认为的候选方案

请尽量清晰精准地描述你能接受的候选解决方案。

### 其他信息

请提供关于该功能建议的其他附加信息。


================================================
FILE: .github/PULL_REQUEST_TEMPLATE.md
================================================
* PR 修复缺陷请先开 `issue` **[报告缺陷](https://github.com/xkcoding/spring-boot-demo/issues/new?template=bug_report.md)**
* PR 提交新特性请先开 `issue` **[报告新特性](https://github.com/xkcoding/spring-boot-demo/issues/new?template=feature_request.md)**
* PR 请提交到 `dev` 开发分支上
* 我们对编码风格有着较为严格的要求,请在阅读代码后模仿类似风格提交
* 欢迎通过 PR 给我们补充案例


================================================
FILE: .github/workflows/maven.yml
================================================
name: GitHub CI
on:
  push:
    branches:
      - master
  pull_request:
jobs:
  build:
    runs-on: ubuntu-latest
    steps:
    - uses: actions/checkout@v1
    - name: Set up JDK 1.8
      uses: actions/setup-java@v1
      with:
        java-version: 1.8
    - name: Build with Maven
      run: mvn clean package -DskipTests=true -Dmaven.javadoc.skip=true -B -V


================================================
FILE: .gitignore
================================================
# Created by .ignore support plugin (hsz.mobi)
### xkcoding-后端 template
### Spring Boot ###
target/
!.mvn/wrapper/maven-wrapper.jar

### STS ###
.apt_generated
.classpath
.factorypath
.project
.settings
.springBeans
.sts4-cache

### IntelliJ IDEA ###
.idea
*.iws
*.iml
*.ipr
out/
gen/

### NetBeans ###
/nbproject/private/
/build/
/nbbuild/
/dist/
/nbdist/
/.nb-gradle/

### LOGS ###
logs/
*.log

### Mac OS ###
.DS_Store

### VS CODE ###
.vscode/


================================================
FILE: .travis.yml
================================================
# 语言
language: java
# 执行脚本
script: "mvn clean package -DskipTests=true -Dmaven.javadoc.skip=true -B -V"
# 通知
notifications:
  email:
    recipients:
      - 237497819@qq.com
    on_success: always # default: change
    on_failure: always # default: always
# 缓存
cache:
  directories:
    - '$HOME/.m2/repository'

branches:
  only:
    - master


================================================
FILE: LICENSE
================================================
MIT License

Copyright (c) 2018 Yangkai.Shen

Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.


================================================
FILE: README.en.md
================================================
<h1 align="center"><a href="https://github.com/xkcoding" target="_blank">Spring Boot Demo</a></h1>
<p align="center">
  <a href="https://travis-ci.com/xkcoding/spring-boot-demo"><img alt="Travis-CI" src="https://travis-ci.com/xkcoding/spring-boot-demo.svg?branch=master"/></a>
  <a href="https://www.codacy.com/app/xkcoding/spring-boot-demo?utm_source=github.com&amp;utm_medium=referral&amp;utm_content=xkcoding/spring-boot-demo&amp;utm_campaign=Badge_Grade"><img alt="Codacy" src="https://api.codacy.com/project/badge/Grade/1f2e3d437b174bfc943dae1600332ec1"/></a>
  <a href="https://xkcoding.com"><img alt="author" src="https://img.shields.io/badge/author-Yangkai.Shen-blue.svg"/></a>
  <a href="https://www.oracle.com/technetwork/java/javase/downloads/index.html"><img alt="JDK" src="https://img.shields.io/badge/JDK-1.8.0_162-orange.svg"/></a>
  <a href="https://docs.spring.io/spring-boot/docs/2.1.0.RELEASE/reference/html/"><img alt="Spring Boot" src="https://img.shields.io/badge/Spring Boot-2.1.0.RELEASE-brightgreen.svg"/></a>
  <a href="https://github.com/xkcoding/spring-boot-demo/blob/master/LICENSE"><img alt="LICENSE" src="https://img.shields.io/github/license/xkcoding/spring-boot-demo.svg"/></a>
</p>

<p align="center">
  <a href="https://github.com/xkcoding/spring-boot-demo/stargazers"><img alt="star" src="https://img.shields.io/github/stars/xkcoding/spring-boot-demo.svg?label=Stars&style=social"/></a>
  <a href="https://github.com/xkcoding/spring-boot-demo/network/members"><img alt="star" src="https://img.shields.io/github/forks/xkcoding/spring-boot-demo.svg?label=Fork&style=social"/></a>
  <a href="https://github.com/xkcoding/spring-boot-demo/watchers"><img alt="star" src="https://img.shields.io/github/watchers/xkcoding/spring-boot-demo.svg?label=Watch&style=social"/></a>
</p>

<p align="center">
  <span>English | <a href="./README.md">中文</a></span>
</p>

## Introduction

`spring boot demo` is a project for learning and practicing `spring boot`, including `66` demos, and `55` of them have been done.

This project has integrated actuator (`monitoring`), admin (`visual monitoring`), logback (`log`), aopLog (`recording web request logs through AOP`), global exception handling (`json level and page level` ), freemarker (`template engine`), thymeleaf (`template engine`), Beetl (`template engine`), Enjoy (`template engine`), JdbcTemplate (`general JDBC operate database`), JPA (`powerful ORM framework `), mybatis (`powerful ORM framework`), Generic Mapper (`mybatis quick operation `), PageHelper (`powerful mybatis pagination plugin`), mybatis-plus (`mybatis quick operation`), BeetlSQL (`powerful ORM framework `), upload (`local file upload and qiniu cloud file upload`), redis (`cache`), ehcache (`cache`), email (`send various types of mail`), task (`basic scheduled tasks`), quartz (`dynamic management scheduled tasks`), xxl-job (`distributed scheduled tasks`), swagger (`API interface management and tests`), security (`RBAC-based Dynamic Rights Authentication`), SpringSession (`session sharing`), Zookeeper (`implement distributed locks by AOP`), RabbitMQ (`message queue`), Kafka (`message queue`), websocket (` server pushes the monitoring server status to front end `), socket.io (`chat room`), ureport2 (`Chinese-style report`), packaged into a `war` file, integrate ElasticSearch (`basic operations and advanced queries`), Async ( `asynchronous tasks`), integrated Dubbo (`with official starter`), MongoDB (`document database`), neo4j (`graph database`), docker (`container`), `JPA Multi-Datasource`, `Mybatis Multi-Datasource`, `code generator`', GrayLog (`log collection`), JustAuth (`third-party login`), LDAP(`CURD`), `Dynamically add/switch datasources`, Standalone RateLimiting(`AOP + Guava RateLimiter`), Distributed Ratelimiting(`AOP + Redis + Lua`), ElasticSearch 7.x(`use official Rest High Level Client`), HTTPS, Flyway(`initialize databases`),UReport2(`Chinese complex report `).

> If you have demos to contribute or needs to meet, it is very welcome to submit a [issue](https://github.com/xkcoding/spring-boot-demo/issues/new) and I will add it to my [TODO](./TODO.en.md) list.

## Branch Introduction

- branch master: Based on Spring Boot version `2.1.0.RELEASE`. Every module's parent dependency is the pom.xml at root directory in convenience of managing common dependencies and learning spring boot.
- branch v-1.5.x: Based on Spring Boot version `1.5.8.RELEASE`. Every module's parent dependency is spring-boot-demo-parent. But since the feedback shows that it is not much friendly to many new learners, this branch will not be mantained any more. All of the demos will be moved to branch master. Everyone could still study at this branch but it's suggested to study at branch master while Spring Boot has much new content over version `2.x`.

## Environment

- **JDK 1.8 +**
- **Maven 3.5 +**
- **IntelliJ IDEA ULTIMATE 2018.2 +** (*Note: Please use IDEA and make sure plugin `lombok` installed.*)
- **Mysql 5.7 +** (*Please use version 5.7 or higher because mysql has some new features and is not backward compatible at version 5.7. Althought this project will try to avoid this incompatibility*)

## Getting Started

> Note: If you has been forked this project, need to sync the project's code, please see: https://xkcoding.com/2018/09/18/how-to-update-the-fork-project.html

1. `git clone https://github.com/xkcoding/spring-boot-demo.git`
2. Open the cloned project in IDEA
3. Import the `pom.xml` file from the root directory using `Maven Projects` panel
4. If you can not find `Maven Projects` panel, try to tick `View -> Tool Buttons` on and the `Maven Projects` panel will appear on the right side of IDEA.
5. Find each Application class to run each module.
6. **`Note: Each demo has a detailed README file. Remember to check it before running the demo~`**
7. **`Note: In some condition you have to execute sql to prepare data before running demo, don't forget it~`**

## Stargazers over time

[![Stargazers over time](https://starchart.cc/xkcoding/spring-boot-demo.svg)](https://starchart.cc/xkcoding/spring-boot-demo)

## Appendix

### Recommended  Open source

- `JustAuth`:The most comprehensive open source library for third-party logins in history,https://github.com/justauth/JustAuth
- `Mica`:Spring Boot microservices efficient development toolset,https://github.com/lets-mica/mica
- `awesome-collector`:https://github.com/P-P-X/awesome-collector
- `SpringBlade`:Complete micro-service online solution (required for enterprise development),https://github.com/chillzhuang/SpringBlade
- `Pig`:The universe's strongest micro-service certification authorized scaffolding (architect necessary),https://github.com/pigxcloud/pig

### TODO

View the [TODO](./TODO.en.md) file

### Introduction of each Module

| Module Name                                                  | Module Description                                           |
| ------------------------------------------------------------ | ------------------------------------------------------------ |
| [demo-helloworld](./demo-helloworld)                         | a helloworld demo.                                           |
| [demo-properties](./demo-properties)                         | a demo to read the contents of configuration file.           |
| [demo-actuator](./demo-actuator)                             | a demo to integrate spring-boot-starter-actuator for monitoring the starting status and the running status of application. |
| [demo-admin-client](./demo-admin/admin-client)               | a client demo to  integrate spring-boot-admin for visually monitoring the running status of application, it can be used with spring-boot-starter-actuator. |
| [demo-admin-server](./demo-admin/admin-server)               | a server demo to  integrate spring-boot-admin for visually monitoring the running status of the spring-boot program, it can be used with spring-boot-starter-actuator. |
| [demo-logback](./demo-logback)                               | a demo to integrate the logback for logging.                 |
| [demo-log-aop](./demo-log-aop)                               | a demo to record web request logs using AOP aspect.          |
| [demo-exception-handler](./demo-exception-handler)           | a demo to demonstrate global exception handling, including 2 types, the first one returns  json data, and the second one jumps to error page. |
| [demo-template-freemarker](./demo-template-freemarker)       | a demo to integrate Freemarker template engine.              |
| [demo-template-thymeleaf](./demo-template-thymeleaf)         | a demo to integrate Thymeleaf template engine.               |
| [demo-template-beetl](./demo-template-beetl)                 | a demo to integrate Beetl template engine.                   |
| [demo-template-enjoy](./demo-template-enjoy)                 | a demo to integrate Enjoy template engine.                   |
| [demo-orm-jdbctemplate](./demo-orm-jdbctemplate)             | a demo to integrate the Jdbc Template for operating database and easily encapsulate the generic Dao layer. |
| [demo-orm-jpa](./demo-orm-jpa)                               | a demo to integrate spring-boot-starter-data-jpa for operating database. |
| [demo-orm-mybatis](./demo-orm-mybatis)                       | a demo to integrate native mybatis by using [mybatis-spring-boot-starter](https://github.com/mybatis/spring-boot-starter) dependency. |
| [demo-orm-mybatis-mapper-page](./demo-orm-mybatis-mapper-page) | a demo to integrate [Mapper](https://github.com/abel533/Mapper) and [PageHelper](https://github.com/pagehelper/Mybatis-PageHelper) by using [mapper-spring-boot-starter](https://github.com/abel533/Mapper/tree/master/spring-boot-starter) and [pagehelper-spring-boot-starter](https://github.com/pagehelper/pagehelper-spring-boot) dependencies. |
| [demo-orm-mybatis-plus](./demo-orm-mybatis-plus)             | a demo to integrate [mybatis-plus](https://mybatis.plus/en/) by using [mybatis-plus-boot-starter](http://mp.baomidou.com/) dependency, integrate BaseMapper / BaseService / ActiveRecord to operate database. |
| [demo-orm-beetlsql](./demo-orm-beetlsql)                     | a demo to integrate [beetl-sql](http://ibeetl.com/guide/#beetlsql) by using [beetl-framework-starter](http://ibeetl.com/guide/#beetlsql) dependency. |
| [demo-upload](./demo-upload)                                 | a file upload demo, including local file upload and qiniu cloud file upload. |
| [demo-cache-redis](./demo-cache-redis)                       | a demo to integrate redis, operate data in redis, and use redis to cache data. |
| [demo-cache-ehcache](./demo-cache-ehcache)                   | a demo to integrate ehcache, and use ehcache to cache data.  |
| [demo-email](./demo-email)                                   | a demo to integrate email, including sending simple text email, HTML email (including template HTML email), attachment email, and static resource email. |
| [demo-task](./demo-task)                                     | a demo to show easy to use scheduled task.                   |
| [demo-task-quartz](./demo-task-quartz)                       | a demo to integrate quartz for managing scheduled tasks, including adding new scheduled tasks, deleting scheduled tasks, suspending scheduled tasks, restoring scheduled tasks, modifying scheduled task startup times, and timing task list queries, and `providing front-end pages`. |
| [demo-task-xxl-job](./demo-task-xxl-job)                     | a demo to integrate [xxl-job](http://www.xuxueli.com/xxl-job/en/#/) for distributed scheduled tasks and provide methods to manage scheduled tasks bypass `xxl-job-admin`, including scheduled task lists, trigger lists, new scheduled tasks, deleted scheduled tasks, stopped scheduled tasks, and started scheduled tasks. Modify the scheduled task and manually trigger the scheduled task. |
| [demo-swagger](./demo-swagger)                               | a demo to integrate native `swagger` to manage and test API interfaces. |
| [demo-swagger-beauty](./demo-swagger-beauty)                 | a demo to integrate third part of swagger dependency [swagger-bootstrap-ui](https://github.com/xiaoymin/Swagger-Bootstrap-UI) to beautify document style and manage and test API interfaces. |
| [demo-rbac-security](./demo-rbac-security)                   | a demo to integrate spring security implement privilege management based on RBAC privilege model, supports custom filtering request, dynamic privilege authentication, uses JWT security authentication, supports online population statistics, manually kicks out users, etc. |
| [demo-rbac-shiro](./demo-rbac-shiro)                         | <span style="color:pink;">NOT FINISHED YET!</span> <br />a demo to integrate shiro for authentication management. |
| [demo-session](./demo-session)                               | a demo to integrate Spring Session to implement Session sharing, restart program Session does not expire. |
| [demo-oauth](./demo-oauth)                                   | <span style="color:pink;">NOT FINISHED YET!</span> <br />a demo to implement the oauth server and  to implement oauth2 protocol such as the authorization code, access token. |
| [demo-social](./demo-social)                                 | a demo to integrate third-party login by using `justauth-spring-boot-starter` dependency to achieve QQ login, GitHub login, WeChat login, Google login, Microsoft login, Xiaomi login, enterprise WeChat login. |
| [demo-zookeeper](./demo-zookeeper)                           | a demo to integrate Zookeeper and AOP to implement distributed lock. |
| [demo-mq-rabbitmq](./demo-mq-rabbitmq)                       | a demo to integrate RabbitMQ implementation for message delivery and reception based on direct queue mode, fanout mode, topic mode, delay queue. |
| [demo-mq-rocketmq](./demo-mq-rocketmq)                       | <span style="color:pink;">NOT FINISHED YET!</span> <br />a demo to integrate RocketMQ implementation for message delivery and reception. |
| [demo-mq-kafka](./demo-mq-kafka)                             | a demo to integrate Kafka implementation for message delivery and reception. |
| [demo-websocket](./demo-websocket)                           | a demo to integrate websocket, the backend actively pushes the server running status to front end. |
| [demo-websocket-socketio](./demo-websocket-socketio)         | a demo to integrate websocket by using `netty-socketio`, implement a simple chat room. |
| [demo-ureport2](./demo-ureport2)                             | <span style="color:pink;">NOT FINISHED YET!</span> <br />a demo to integrate [ureport2](https://github.com/youseries/ureport) to implement complex, customized Chinese-style reports. |
| [demo-uflo](./demo-uflo)                                     | <span style="color:pink;">NOT FINISHED YET!</span> <br />a demo to integrate [uflo](https://github.com/youseries/uflo)(process engine like Activiti and Flowable) to quickly implement a lightweight process engine. |
| [demo-urule](./demo-urule)                                   | <span style="color:pink;">NOT FINISHED YET!</span> <br />a demo to integrate [urule](https://github.com/youseries/urule)(rule engine like drools) fast implementation rule engine. |
| [demo-activiti](./demo-activiti)                             | <span style="color:pink;">NOT FINISHED YET!</span> <br />a demo to integrate Activiti 7 process engine. |
| [demo-async](./demo-async)                                   | asynchronous execution of tasks by using natively provided asynchronous task support. |
| [demo-war](./demo-war)                                       | packaged into a war format configuration                     |
| [demo-elasticsearch](./demo-elasticsearch)                   | a demo to integrate ElasticSearch by using `spring-boot-starter-data-elasticsearch` to implement advanced techniques for using ElasticSearch, including creating indexes, configuring mappings, deleting indexes, adding and deleting basic operations, complex queries, advanced queries, aggregate queries, etc. |
| [demo-dubbo](./demo-dubbo)                                   | a demo to integrate Dubbo, common module `spring-boot-demo-dubbo-common`, service provider `spring-boot-demo-dubbo-provider`, service consumer `spring-boot-demo-dubbo-consumer`. |
| [demo-mongodb](./demo-mongodb)                               | a demo to integrate MongoDB and use the official starter to CRUD. |
| [demo-neo4j](./demo-neo4j)                                   | a demo to integrate Neo4j graph database to implement a campus character relationship network. |
| [demo-docker](./demo-docker)                                 | docker container.                                            |
| [demo-multi-datasource-jpa](./demo-multi-datasource-jpa)     | a demo to implement JPA multi-datasource.                    |
| [demo-multi-datasource-mybatis](./demo-multi-datasource-mybatis) | a demo to implement Mybatis multi-datasource by using an open source solution from Mybatis-Plus. |
| [demo-sharding-jdbc](./demo-sharding-jdbc)                   | a demo to use `sharding-jdbc` to implement sub-database and sub-tables, while ORM uses Mybatis-Plus. |
| [demo-tio](./demo-tio)                                       | <span style="color:pink;">NOT FINISHED YET!</span> <br />a demo to integrate t-io(a network programming framework like netty). |
| demo-grpc                                                    | <span style="color:pink;">NOT FINISHED YET!</span> <br />a demo to integrate Google grpc, need to be configure tls/ssl, see [ISSUE#5](https://github.com/xkcoding/spring-boot-demo/issues/5). |
| [demo-codegen](./demo-codegen)                               | a demo to integrate velocity template engine to implement code generator, improve development efficiency. |
| [demo-graylog](./demo-graylog)                               | a demo to integrate graylog for unified log collection.      |
| demo-sso                                                     | <span style="color:pink;">NOT FINISHED YET!</span> <br />a demo to integrate Single Sign On, see [ISSUE#12](https://github.com/xkcoding/spring-boot-demo/issues/12). |
| [demo-ldap](./demo-ldap)                                     | a demo to integrate LDAP to use `spring-boot-starter-data-ldap` to implement  CURD operations and give the login demo, see [ISSUE#23](https://github.com/xkcoding/spring-boot-demo/issues/23), thanks [@fxbin](https://github.com/fxbin). |
| [demo-dynamic-datasource](./demo-dynamic-datasource)         | a demo to add datasource dynamically, switch datasource dynamically. |
| [demo-ratelimit-guava](./demo-ratelimit-guava)               | a demo to use use Guava RateLimiter to protect API  by standalone rate limiting. |
| [demo-ratelimit-redis](./demo-ratelimit-redis)               | a demo to use Redis and Lua script implementation to protect API by distributed rate limiting. |
| [demo-https](./demo-https)                                   | a demo to integrate HTTPS.                                   |
| [demo-elasticsearch-rest-high-level-client](./demo-elasticsearch-rest-high-level-client) | a demo to integrate ElasticSearch 7.x version by using official Rest High Level Client to operate ES data. |
| [demo-flyway](./demo-flyway)                                 | a demo to integrate Flyway to initialize tables and data in database, Flyway also support the sql script version control. |
| [demo-ureport2](./demo-ureport2)                             | a demo to integrate Ureport2 to design the Chinese complex report file. |

### Thanks

- <a href="https://www.jetbrains.com/?from=spring-boot-demo"><img src="http://static.xkcoding.com/spring-boot-demo/064312.jpg" width="100px" alt="jetbrains">**Thanks JetBrains Offer Open Source Free License**</a>
-  [Thanks MyBatisCodeHelper-Pro(The Best Code Generator Plugin) Offer Permanent Activation Code](https://gejun123456.github.io/MyBatisCodeHelper-Pro/#/?id=mybatiscodehelper-pro)

### License

[MIT](http://opensource.org/licenses/MIT)

Copyright (c) 2018 Yangkai.Shen


================================================
FILE: README.md
================================================
<h1 align="center"><a href="https://github.com/xkcoding" target="_blank">Spring Boot Demo</a></h1>
<p align="center">
  <a href="https://travis-ci.com/xkcoding/spring-boot-demo"><img alt="Travis-CI" src="https://travis-ci.com/xkcoding/spring-boot-demo.svg?branch=master"/></a>
  <a href="https://www.codacy.com/app/xkcoding/spring-boot-demo?utm_source=github.com&amp;utm_medium=referral&amp;utm_content=xkcoding/spring-boot-demo&amp;utm_campaign=Badge_Grade"><img alt="Codacy" src="https://api.codacy.com/project/badge/Grade/1f2e3d437b174bfc943dae1600332ec1"/></a>
  <a href="https://xkcoding.com"><img alt="author" src="https://img.shields.io/badge/author-Yangkai.Shen-blue.svg"/></a>
  <a href="https://www.oracle.com/technetwork/java/javase/downloads/index.html"><img alt="JDK" src="https://img.shields.io/badge/JDK-1.8.0_162-orange.svg"/></a>
  <a href="https://docs.spring.io/spring-boot/docs/2.1.0.RELEASE/reference/html/"><img alt="Spring Boot" src="https://img.shields.io/badge/Spring Boot-2.1.0.RELEASE-brightgreen.svg"/></a>
  <a href="https://github.com/xkcoding/spring-boot-demo/blob/master/LICENSE"><img alt="LICENSE" src="https://img.shields.io/github/license/xkcoding/spring-boot-demo.svg"/></a>
</p>

<p align="center">
  <a href="https://github.com/xkcoding/spring-boot-demo/stargazers"><img alt="star" src="https://img.shields.io/github/stars/xkcoding/spring-boot-demo.svg?label=Stars&style=social"/></a>
  <a href="https://github.com/xkcoding/spring-boot-demo/network/members"><img alt="star" src="https://img.shields.io/github/forks/xkcoding/spring-boot-demo.svg?label=Fork&style=social"/></a>
  <a href="https://github.com/xkcoding/spring-boot-demo/watchers"><img alt="star" src="https://img.shields.io/github/watchers/xkcoding/spring-boot-demo.svg?label=Watch&style=social"/></a>
</p>

<p align="center">
  <span>中文 | <a href="./README.en.md">English</a></span>
</p>

## 项目简介

`spring boot demo` 是一个用来深度学习并实战 `spring boot` 的项目,目前总共包含 **`66`** 个集成demo,已经完成 **`55`** 个。

该项目已成功集成 actuator(`监控`)、admin(`可视化监控`)、logback(`日志`)、aopLog(`通过AOP记录web请求日志`)、统一异常处理(`json级别和页面级别`)、freemarker(`模板引擎`)、thymeleaf(`模板引擎`)、Beetl(`模板引擎`)、Enjoy(`模板引擎`)、JdbcTemplate(`通用JDBC操作数据库`)、JPA(`强大的ORM框架`)、mybatis(`强大的ORM框架`)、通用Mapper(`快速操作Mybatis`)、PageHelper(`通用的Mybatis分页插件`)、mybatis-plus(`快速操作Mybatis`)、BeetlSQL(`强大的ORM框架`)、upload(`本地文件上传和七牛云文件上传`)、redis(`缓存`)、ehcache(`缓存`)、email(`发送各种类型邮件`)、task(`基础定时任务`)、quartz(`动态管理定时任务`)、xxl-job(`分布式定时任务`)、swagger(`API接口管理测试`)、security(`基于RBAC的动态权限认证`)、SpringSession(`Session共享`)、Zookeeper(`结合AOP实现分布式锁`)、RabbitMQ(`消息队列`)、Kafka(`消息队列`)、websocket(`服务端推送监控服务器运行信息`)、socket.io(`聊天室`)、ureport2(`中国式报表`)、打包成`war`文件、集成 ElasticSearch(`基本操作和高级查询`)、Async(`异步任务`)、集成Dubbo(`采用官方的starter`)、MongoDB(`文档数据库`)、neo4j(`图数据库`)、docker(`容器化`)、`JPA多数据源`、`Mybatis多数据源`、`代码生成器`、GrayLog(`日志收集`)、JustAuth(`第三方登录`)、LDAP(`增删改查`)、`动态添加/切换数据源`、单机限流(`AOP + Guava RateLimiter`)、分布式限流(`AOP + Redis + Lua`)、ElasticSearch 7.x(`使用官方 Rest High Level Client`)、HTTPS、Flyway(`数据库初始化`)、UReport2(`中国式复杂报表`)。

> 如果大家还有想要集成的demo,也可在 [issue](https://github.com/xkcoding/spring-boot-demo/issues/new) 里提需求。我会额外添加在 [TODO](./TODO.md) 列表里。✊

## 分支介绍

- master 分支:基于 Spring Boot 版本 `2.1.0.RELEASE`,每个 Module 的 parent 依赖根目录下的 pom.xml,主要用于管理每个 Module 的通用依赖版本,方便大家学习。
- v-1.5.x 分支:基于 Spring Boot 版本 `1.5.8.RELEASE`,每个 Module 均依赖 spring-boot-demo-parent,有挺多同学们反映这种方式对新手不是很友好,运行起来有些难度,因此 ***此分支(v-1.5.x)会停止开发维护*** ,所有内容会慢慢以 master 分支的形式同步过去,此分支暂未完成的,也会直接在 master 分支上加,在此分支学习的同学们,仍然可以在此分支学习,但是建议后期切换到master分支,会更加容易,毕竟官方已经将 Spring Boot 升级到 2.x 版本。🙂

## 开发环境

- **JDK 1.8 +**
- **Maven 3.5 +**
- **IntelliJ IDEA ULTIMATE 2018.2 +** (*注意:务必使用 IDEA 开发,同时保证安装 `lombok` 插件*)
- **Mysql 5.7 +** (*尽量保证使用 5.7 版本以上,因为 5.7 版本加了一些新特性,同时不向下兼容。本 demo 里会尽量避免这种不兼容的地方,但还是建议尽量保证 5.7 版本以上*)

## 运行方式

> 提示:如果是 fork 的朋友,同步代码的请参考:https://xkcoding.com/2018/09/18/how-to-update-the-fork-project.html

1. `git clone https://github.com/xkcoding/spring-boot-demo.git`
2. 使用 IDEA 打开 clone 下来的项目
3. 在 IDEA 中 Maven Projects 的面板导入项目根目录下 的 `pom.xml` 文件
4. Maven Projects 找不到的童鞋,可以勾上 IDEA 顶部工具栏的 View -> Tool Buttons ,然后 Maven Projects 的面板就会出现在 IDEA 的右侧
5. 找到各个 Module 的 Application 类就可以运行各个 demo 了
6. **`注意:每个 demo 均有详细的 README 配套,食用 demo 前记得先看看哦~`**
7. **`注意:运行各个 demo 之前,有些是需要事先初始化数据库数据的,亲们别忘记了哦~`**

## 项目趋势

[![Stargazers over time](https://starchart.cc/xkcoding/spring-boot-demo.svg)](https://starchart.cc/xkcoding/spring-boot-demo)

## 其他

###  团队纳新

组内招人啦,HC 巨多,Base 杭州,感兴趣的小伙伴,查看 [岗位详情](./jd.md)

### 开源推荐

![11628591293_.pic_hd](https://static.aliyun.xkcoding.com/2021/08/14/11628591293pichd.jpg?x-oss-process=style/tag_compress)

- `JustAuth`:史上最全的整合第三方登录的开源库,https://github.com/justauth/JustAuth
- `Mica`:SpringBoot 微服务高效开发工具集,https://github.com/lets-mica/mica
- `awesome-collector`:https://github.com/P-P-X/awesome-collector
- `SpringBlade`:完整的线上解决方案(企业开发必备),https://github.com/chillzhuang/SpringBlade
- `Pig`:宇宙最强微服务认证授权脚手架(架构师必备),https://github.com/pigxcloud/pig

### 开发计划

查看 [TODO](./TODO.md) 文件

### 各 Module 介绍

| Module 名称                                                  | Module 介绍                                                  |
| ------------------------------------------------------------ | ------------------------------------------------------------ |
| [demo-helloworld](./demo-helloworld)                         | spring-boot 的一个 helloworld                                |
| [demo-properties](./demo-properties)                         | spring-boot 读取配置文件中的内容                             |
| [demo-actuator](./demo-actuator)                             | spring-boot 集成 spring-boot-starter-actuator 用于监控 spring-boot 的启动和运行状态 |
| [demo-admin-client](./demo-admin/admin-client)               | spring-boot 集成 spring-boot-admin 来可视化的监控 spring-boot 程序的运行状态,可以与 actuator 互相搭配使用,客户端示例 |
| [demo-admin-server](./demo-admin/admin-server)               | spring-boot 集成 spring-boot-admin 来可视化的监控 spring-boot 程序的运行状态,可以与 actuator 互相搭配使用,服务端示例 |
| [demo-logback](./demo-logback)                               | spring-boot 集成 logback 日志                                |
| [demo-log-aop](./demo-log-aop)                               | spring-boot 使用 AOP 切面的方式记录 web 请求日志             |
| [demo-exception-handler](./demo-exception-handler)           | spring-boot 统一异常处理,包括2种,第一种返回统一的 json 格式,第二种统一跳转到异常页面 |
| [demo-template-freemarker](./demo-template-freemarker)       | spring-boot 集成 Freemarker 模板引擎                         |
| [demo-template-thymeleaf](./demo-template-thymeleaf)         | spring-boot 集成 Thymeleaf 模板引擎                          |
| [demo-template-beetl](./demo-template-beetl)                 | spring-boot 集成 Beetl 模板引擎                              |
| [demo-template-enjoy](./demo-template-enjoy)                 | spring-boot 集成 Enjoy 模板引擎                              |
| [demo-orm-jdbctemplate](./demo-orm-jdbctemplate)             | spring-boot 集成 Jdbc Template 操作数据库,并简易封装通用 Dao 层 |
| [demo-orm-jpa](./demo-orm-jpa)                               | spring-boot 集成 spring-boot-starter-data-jpa 操作数据库     |
| [demo-orm-mybatis](./demo-orm-mybatis)                       | spring-boot 集成原生mybatis,使用 [mybatis-spring-boot-starter](https://github.com/mybatis/spring-boot-starter) 集成 |
| [demo-orm-mybatis-mapper-page](./demo-orm-mybatis-mapper-page) | spring-boot 集成[通用Mapper](https://github.com/abel533/Mapper)和[PageHelper](https://github.com/pagehelper/Mybatis-PageHelper),使用 [mapper-spring-boot-starter](https://github.com/abel533/Mapper/tree/master/spring-boot-starter) 和 [pagehelper-spring-boot-starter](https://github.com/pagehelper/pagehelper-spring-boot) 集成 |
| [demo-orm-mybatis-plus](./demo-orm-mybatis-plus)             | spring-boot 集成 [mybatis-plus](https://mybatis.plus/),使用 [mybatis-plus-boot-starter](http://mp.baomidou.com/) 集成,集成 BaseMapper、BaseService、ActiveRecord 操作数据库 |
| [demo-orm-beetlsql](./demo-orm-beetlsql)                     | spring-boot 集成 [beetl-sql](http://ibeetl.com/guide/#beetlsql),使用 [beetl-framework-starter](http://ibeetl.com/guide/#beetlsql) 集成 |
| [demo-upload](./demo-upload)                                 | spring-boot 文件上传示例,包含本地文件上传以及七牛云文件上传 |
| [demo-cache-redis](./demo-cache-redis)                       | spring-boot 整合 redis,操作redis中的数据,并使用redis缓存数据 |
| [demo-cache-ehcache](./demo-cache-ehcache)                   | spring-boot 整合 ehcache,使用 ehcache 缓存数据              |
| [demo-email](./demo-email)                                   | spring-boot 整合 email,包括发送简单文本邮件、HTML邮件(包括模板HTML邮件)、附件邮件、静态资源邮件 |
| [demo-task](./demo-task)                                     | spring-boot 快速实现定时任务                                 |
| [demo-task-quartz](./demo-task-quartz)                       | spring-boot 整合 quartz,并实现对定时任务的管理,包括新增定时任务,删除定时任务,暂停定时任务,恢复定时任务,修改定时任务启动时间,以及定时任务列表查询,`提供前端页面` |
| [demo-task-xxl-job](./demo-task-xxl-job)                     | spring-boot 整合[xxl-job](http://www.xuxueli.com/xxl-job/en/#/),并提供绕过 `xxl-job-admin` 对定时任务的管理的方法,包括定时任务列表,触发器列表,新增定时任务,删除定时任务,停止定时任务,启动定时任务,修改定时任务,手动触发定时任务 |
| [demo-swagger](./demo-swagger)                               | spring-boot 集成原生的 `swagger` 用于统一管理、测试 API 接口 |
| [demo-swagger-beauty](./demo-swagger-beauty)                 | spring-boot 集成第三方 `swagger` [swagger-bootstrap-ui](https://github.com/xiaoymin/Swagger-Bootstrap-UI) 美化API文档样式,用于统一管理、测试 API 接口 |
| [demo-rbac-security](./demo-rbac-security)                   | spring-boot 集成 spring security 完成基于RBAC权限模型的权限管理,支持自定义过滤请求,动态权限认证,使用 JWT 安全认证,支持在线人数统计,手动踢出用户等操作 |
| [demo-rbac-shiro](./demo-rbac-shiro)                         | spring-boot 集成 shiro 实现权限管理<br /> <span style="color:pink;">待完成</span> |
| [demo-session](./demo-session)                               | spring-boot 集成 Spring Session 实现Session共享、重启程序Session不失效 |
| [demo-oauth](./demo-oauth)                                   | spring-boot 实现 oauth 服务器功能,实现授权码机制<br /> <span style="color:pink;">待完成</span> |
| [demo-social](./demo-social)                                 | spring-boot 集成第三方登录,集成 `justauth-spring-boot-starter` 实现QQ登录、GitHub登录、微信登录、谷歌登录、微软登录、小米登录、企业微信登录。 |
| [demo-zookeeper](./demo-zookeeper)                           | spring-boot 集成 Zookeeper 结合AOP实现分布式锁               |
| [demo-mq-rabbitmq](./demo-mq-rabbitmq)                       | spring-boot 集成 RabbitMQ 实现基于直接队列模式、分列模式、主题模式、延迟队列的消息发送和接收 |
| [demo-mq-rocketmq](./demo-mq-rocketmq)                       | spring-boot 集成 RocketMQ,实现消息的发送和接收<br /> <span style="color:pink;">待完成</span> |
| [demo-mq-kafka](./demo-mq-kafka)                             | spring-boot 集成 kafka,实现消息的发送和接收                 |
| [demo-websocket](./demo-websocket)                           | spring-boot 集成 websocket,后端主动推送前端服务器运行信息   |
| [demo-websocket-socketio](./demo-websocket-socketio)         | spring-boot 使用 netty-socketio 集成 websocket,实现一个简单的聊天室 |
| [demo-ureport2](./demo-ureport2)                             | spring-boot 集成 ureport2 实现复杂的自定义的中国式报表<br /> <span style="color:pink;">待完成</span> |
| [demo-uflo](./demo-uflo)                                     | spring-boot 集成 uflo 快速实现轻量级流程引擎<br /> <span style="color:pink;">待完成</span> |
| [demo-urule](./demo-urule)                                   | spring-boot 集成 urule 快速实现规则引擎<br /> <span style="color:pink;">待完成</span> |
| [demo-activiti](./demo-activiti)                             | spring-boot 集成 activiti 7  流程引擎<br /> <span style="color:pink;">待完成</span> |
| [demo-async](./demo-async)                                   | spring-boot 使用原生提供的异步任务支持,实现异步执行任务     |
| [demo-war](./demo-war)                                       | spring-boot 打成 war 包的配置                                |
| [demo-elasticsearch](./demo-elasticsearch)                   | spring-boot 集成 ElasticSearch,集成 `spring-boot-starter-data-elasticsearch` 完成对 ElasticSearch 的高级使用技巧,包括创建索引、配置映射、删除索引、增删改查基本操作、复杂查询、高级查询、聚合查询等 |
| [demo-dubbo](./demo-dubbo)                                   | spring-boot 集成 Dubbo,分别为公共模块 `spring-boot-demo-dubbo-common`、服务提供方`spring-boot-demo-dubbo-provider`、服务调用方`spring-boot-demo-dubbo-consumer` |
| [demo-mongodb](./demo-mongodb)                               | spring-boot 集成 MongoDB,使用官方的 starter 实现增删改查    |
| [demo-neo4j](./demo-neo4j)                                   | spring-boot 集成 Neo4j 图数据库,实现一个校园人物关系网的demo |
| [demo-docker](./demo-docker)                                 | spring-boot 容器化                                           |
| [demo-multi-datasource-jpa](./demo-multi-datasource-jpa)     | spring-boot 使用JPA集成多数据源                              |
| [demo-multi-datasource-mybatis](./demo-multi-datasource-mybatis) | spring-boot 使用Mybatis集成多数据源,使用 Mybatis-Plus 提供的开源解决方案实现 |
| [demo-sharding-jdbc](./demo-sharding-jdbc)                   | spring-boot 使用 `sharding-jdbc` 实现分库分表,同时ORM采用 Mybatis-Plus |
| [demo-tio](./demo-tio)                                       | spring-boot 集成 tio 网络编程框架<br /> <span style="color:pink;">待完成</span> |
| demo-grpc                                                    | spring-boot 集成grpc,配置tls/ssl,参见[ISSUE#5](https://github.com/xkcoding/spring-boot-demo/issues/5)<br /> <span style="color:pink;">待完成</span> |
| [demo-codegen](./demo-codegen)                               | spring-boot 集成 velocity 模板技术实现的代码生成器,简化开发 |
| [demo-graylog](./demo-graylog)                               | spring-boot 集成 graylog 实现日志统一收集                    |
| demo-sso                                                     | spring-boot 集成 SSO 单点登录,参见 [ISSUE#12](https://github.com/xkcoding/spring-boot-demo/issues/12)<br /> <span style="color:pink;">待完成</span> |
| [demo-ldap](./demo-ldap)                                     | spring-boot 集成 LDAP,集成 `spring-boot-starter-data-ldap` 完成对 Ldap 的基本 CURD操作, 并给出以登录为实战的 API 示例,参见 [ISSUE#23](https://github.com/xkcoding/spring-boot-demo/issues/23),感谢 [@fxbin](https://github.com/fxbin) |
| [demo-dynamic-datasource](./demo-dynamic-datasource)         | spring-boot 动态添加数据源、动态切换数据源                   |
| [demo-ratelimit-guava](./demo-ratelimit-guava)               | spring-boot 使用 Guava RateLimiter 实现单机版限流,保护 API  |
| [demo-ratelimit-redis](./demo-ratelimit-redis)               | spring-boot 使用 Redis + Lua 脚本实现分布式限流,保护 API    |
| [demo-https](./demo-https)                                   | spring-boot 集成 HTTPS                                       |
| [demo-elasticsearch-rest-high-level-client](./demo-elasticsearch-rest-high-level-client) | spring boot 集成 ElasticSearch 7.x 版本,使用官方 Rest High Level Client 操作 ES 数据 |
| [demo-flyway](./demo-flyway)                                 | spring boot 集成 Flyway,项目启动时初始化数据库表结构,同时支持数据库脚本版本控制 |
| [demo-ureport2](./demo-ureport2)                             | spring boot 集成 Ureport2,实现中国式复杂报表设计            |


### 特别感谢

- 感谢 [七牛云](https://portal.qiniu.com/signup?utm_source=kaiyuan&utm_media=xkcoding) 提供的免费云存储与 CDN 加速支持
- 感谢史上最牛的代码生成插件 [MyBatisCodeHelper-Pro](https://gejun123456.github.io/MyBatisCodeHelper-Pro/#/?id=mybatiscodehelper-pro) 提供的永久激活码
- <a href="https://www.jetbrains.com/?from=spring-boot-demo"><img src="http://static.xkcoding.com/spring-boot-demo/064312.jpg" width="100px" alt="jetbrains">**感谢 JetBrains 提供的免费开源 License**</a>

### License

[MIT](http://opensource.org/licenses/MIT)

Copyright (c) 2018 Yangkai.Shen


================================================
FILE: TODO.en.md
================================================
# spring-boot-demo Project TODO List

## Module plan (completed: 55 / 66)

- [x] ~~demo-helloworld(helloworld example)~~
- [x] ~~demo-properties (read configuration file information)~~
- [x] ~~demo-actuator (endpoint monitoring for Spring boot)~~
- [x] ~~demo-admin-client (for Spring boot visual control client)~~
- [x] ~~demo-admin-server (for Spring boot visual control server)~~
- [x] ~~demo-logback (integrated logback log)~~
- [x] ~~demo-log-aop (use AOP to intercept request log information)~~
- [x] ~~demo-exception-handler (unified exception handling)~~
- [x] ~~demo-template-freemarker (using template engine - Freemarker)~~
- [x] ~~demo-template-thymeleaf (using template engine - thymeleaf)~~
- [x] ~~demo-template-beetl (using template engine - beetl)~~
- [x] ~~demo-template-enjoy (using template engine - JFinal-Enjoy)~~
- [x] ~~demo-upload (upload - integrated local upload and seven cattle cloud upload)~~
- [x] ~~demo-orm-jdbctemplate (operating SQL relational database - JdbcTemplate)~~
- [x] ~~demo-orm-jpa (operating SQL Relational Database - JPA)~~
- [x] ~~demo-orm-mybatis (operating SQL relational database - mybatis)~~
- [x] ~~demo-orm-mybatis-mapper-page (operating SQL relational database - integrating mybatis generic Mapper, PageHelper)~~
- [x] ~~demo-orm-mybatis-plus (operating SQL relational database - integrating mybatis-plus, Mapper, ActiveRecord)~~
- [x] ~~demo-orm-beetlsql (operating SQL relational database - beetlSQL)~~
- [x] ~~demo-cache-redis (using redis for caching)~~
- [x] ~~demo-cache-ehcache (using Ehcache for caching)~~
- [x] ~~demo-email (integrated mail service)~~
- [x] ~~demo-task (scheduled task - Task implementation)~~
- [x] ~~demo-task-quartz (scheduled task - Quartz implementation)~~
- [x] ~~demo-task-xxl-job (scheduled task - XXL-JOB for Distributed Scheduling)~~
- [x] ~~demo-swagger (integrated Swagger for API interface test management)~~
- [x] ~~demo-swagger-beauty (integrated custom and more beautiful Swagger test management of API interface)~~
- [x] ~~demo-rbac-security (implementing RBAC-based permission model - Spring Security)~~
- [ ] demo-rbac-shiro (implementing RBAC-based permission model - shiro)
- [x] ~~demo-session(unified Session Management)~~
- [ ] demo-oauth (OAuth2 certification)
- [x] ~~demo-social (integrated JustAuth implements third-party authorization verification, and implements third-party logins such as QQ, WeChat, GitHub, Google, Xiaomi, etc.)~~
- [x] ~~demo-zookeeper (use zookeeper to implement distributed locks with AOP)~~
- [x] ~~demo-mq-rabbitmq (integrated messaging middleware - RabbitMQ)~~
- [ ] demo-mq-rocketmq (integrated messaging middleware - RocketMQ)
- [x] ~~demo-mq-kafka (integrated message middleware - Kafka)~~
- [x] ~~demo-websocket (integrated websocket service)~~
- [x] ~~demo-websocket-socketio (integrated socketio implements websocket service)~~
- [x] ~~demo-ureport2 (integrated ureport2 implements a custom complex Chinese-style reporting engine)~~
- [ ] demo-uflo (integrated uflo implementation process control engine)
- [ ] demo-urule (integrated urule implementation rules engine)
- [ ] demo-activiti (integrated of Activiti to implement process control engine)
- [x] ~~demo-async (Spring boot implements asynchronous calls)~~
- [x] ~~demo-dubbo (integrated dubbo)~~
- [x] ~~demo-war (packaged into a war package)~~
- [x] ~~demo-elasticsearch (integrated ElasticSearch)~~
- [x] ~~demo-mongodb (integrated MongoDb)~~
- [x] ~~demo-neo4j (integrated neo4j graph database)~~
- [x] ~~demo-docker (packaged into docker image)~~
- [x] ~~demo-multi-datasource-jpa (integrated JPA multi data source)~~
- [x] ~~demo-multi-datasource-mybatis (integrated with mybatis multi-data source)~~
- [x] ~~demo-sharding-jdbc (integrated sharding-jdbc implementation sub-library table)~~
- [ ] demo-tio (integrated t-io)
- [ ] demo-grpc (integrated grpc, configure tls/ssl) see [ISSUE#5](https://github.com/xkcoding/spring-boot-demo/issues/5)
- [x] ~~demo-codegen (integrated velocity auto-generated code)~~
- [x] ~~demo-graylog (integrated gralog log management)~~
- [ ] demo-sso (integrated single sign on) see [ISSUE#12](https://github.com/xkcoding/spring-boot-demo/issues/12)
- [x] ~~demo-ldap (integrated ldap)see [ISSUE#23](https://github.com/xkcoding/spring-boot-demo/issues/23)~~
- [x] ~~demo-dynamic-datasource(add datasource dynamically, switch datasource dynamically)~~
- [x] ~~demo-ratelimit-guava(use Guava RateLimiter to protect API by standalone rate limiting)~~
- [x] ~~demo-ratelimit-redis(use Redis and Lua script implementation to protect API by distributed rate limiting)~~
- [x] ~~demo-https(integrated HTTPS)~~
- [x] ~~demo-elasticsearch-rest-high-level-client(integrated Elasticsearch 7.x version,use official Rest High Level Client to operate ES data)~~
- [ ] demo-springbatch(data process)
- [ ] demo-security-justauth(use JustAuth to login GitHub,and use Spring-Security to manage login state)
- [x] ~~demo-flyway(integrated Flyway to initialize tables and data in database, Flyway also support the sql script version control)~~

## Remarks

Try to ensure that the corresponding demos are integrated in the order above.



================================================
FILE: TODO.md
================================================
# spring-boot-demo 项目待办列表

## 模块计划(已完成:55 / 66)

- [x] ~~demo-helloworld(Helloworld 示例)~~
- [x] ~~demo-properties(读取配置文件信息)~~
- [x] ~~demo-actuator(对 Spring boot 的端点监控)~~
- [x] ~~demo-admin-client(对 Spring boot 可视化管控 客户端)~~
- [x] ~~demo-admin-server(对 Spring boot 可视化管控 服务端)~~
- [x] ~~demo-logback(集成 logback 日志)~~
- [x] ~~demo-log-aop(使用 AOP 拦截请求日志信息)~~
- [x] ~~demo-exception-handler(统一异常处理)~~
- [x] ~~demo-template-freemarker(使用模板引擎 - Freemarker)~~
- [x] ~~demo-template-thymeleaf(使用模板引擎 - thymeleaf)~~
- [x] ~~demo-template-beetl(使用模板引擎 - beetl)~~
- [x] ~~demo-template-enjoy(使用模板引擎 - JFinal-Enjoy)~~
- [x] ~~demo-upload(上传 - 集成本地上传和七牛云上传)~~
- [x] ~~demo-orm-jdbctemplate(操作 SQL 关系型数据库 - JdbcTemplate)~~
- [x] ~~demo-orm-jpa(操作 SQL 关系型数据库 - JPA)~~
- [x] ~~demo-orm-mybatis(操作 SQL 关系型数据库 - mybatis)~~
- [x] ~~demo-orm-mybatis-mapper-page(操作 SQL 关系型数据库 - 集成mybatis通用Mapper,PageHelper)~~
- [x] ~~demo-orm-mybatis-plus(操作 SQL 关系型数据库 - 集成mybatis-plus,Mapper操作、ActiveRecord操作)~~
- [x] ~~demo-orm-beetlsql(操作 SQL 关系型数据库 - beetlSQL)~~
- [x] ~~demo-cache-redis(使用 redis 进行缓存)~~
- [x] ~~demo-cache-ehcache(使用 Ehcache 进行缓存)~~
- [x] ~~demo-email(集成邮件服务)~~
- [x] ~~demo-task(定时任务 - Task 实现)~~
- [x] ~~demo-task-quartz(定时任务 - Quartz 实现)~~
- [x] ~~demo-task-xxl-job(定时任务 - XXL-JOB 实现分布式调度)~~
- [x] ~~demo-swagger(集成 Swagger 对 API 接口进行测试管理)~~
- [x] ~~demo-swagger-beauty(集成自定义且更加美观的 Swagger 对 API 接口进行测试管理)~~
- [x] ~~demo-rbac-security(实现基于 RBAC 的权限模型 - Spring Security)~~
- [ ] demo-rbac-shiro(实现基于 RBAC 的权限模型 - shiro)
- [x] ~~demo-session(统一 Session 管理)~~
- [ ] demo-oauth(OAuth2 认证)
- [x] ~~demo-social(集成 JustAuth 实现第三方授权验证,实现 QQ、微信、GitHub、谷歌、小米等第三方登录)~~
- [x] ~~demo-zookeeper(使用 zookeeper 结合AOP实现分布式锁)~~
- [x] ~~demo-mq-rabbitmq(集成消息中间件 - RabbitMQ)~~
- [ ] demo-mq-rocketmq(集成消息中间件 - RocketMQ)
- [x] ~~demo-mq-kafka(集成消息中间件 - Kafka)~~
- [x] ~~demo-websocket(集成 websocket 服务)~~
- [x] ~~demo-websocket-socketio(集成 socketio 实现 websocket 服务)~~
- [x] ~~demo-ureport2 (集成 ureport2 实现自定义的复杂中国式报表引擎)~~
- [ ] demo-uflo(集成  uflo 实现流程控制引擎)
- [ ] demo-urule(集成  urule 实现规则引擎)
- [ ] demo-activiti(集成 Activiti 实现流程控制引擎)
- [x] ~~demo-async(Spring boot 实现异步调用)~~
- [x] ~~demo-dubbo(集成 dubbo)~~
- [x] ~~demo-war(打包成war包)~~
- [x] ~~demo-elasticsearch(集成 ElasticSearch)~~
- [x] ~~demo-mongodb(集成 MongoDb)~~
- [x] ~~demo-neo4j(集成 neo4j 图数据库)~~
- [x] ~~demo-docker(打包成 docker 镜像)~~
- [x] ~~demo-multi-datasource-jpa(集成JPA多数据源)~~
- [x] ~~demo-multi-datasource-mybatis(集成mybatis多数据源)~~
- [x] ~~demo-sharding-jdbc(集成 sharding-jdbc 实现分库分表)~~
- [ ] demo-tio(集成 tio)
- [ ] demo-grpc(集成grpc,配置tls/ssl)参见[ISSUE#5](https://github.com/xkcoding/spring-boot-demo/issues/5)
- [x] ~~demo-codegen(集成 velocity 自动生成代码)~~
- [x] ~~demo-graylog(集成 gralog 日志管理)~~
- [ ] demo-sso(集成单点登录)参见 [ISSUE#12](https://github.com/xkcoding/spring-boot-demo/issues/12)
- [x] ~~demo-ldap (集成 ldap)参见 [ISSUE#23](https://github.com/xkcoding/spring-boot-demo/issues/23)~~
- [x] ~~demo-dynamic-datasource(动态添加数据源,切换数据源)~~
- [x] ~~demo-ratelimit-guava(单机限流保护API,集成 Guava 的 RateLimiter)~~
- [x] ~~demo-ratelimit-redis(分布式限流保护API,使用 Redis + lua 脚本实现)~~
- [x] ~~demo-https(集成 HTTPS)~~
- [x] ~~demo-elasticsearch-rest-high-level-client(集成 Elasticsearch 7.x 版本,使用官方 rest high level client操作 ES 数据)~~
- [ ] demo-springbatch(数据处理)
- [ ] demo-security-justauth(使用 JustAuth 登录 GitHub,使用 Security 管理登录状态)
- [x] ~~demo-flyway(集成 Flyway,项目启动时初始化数据库表结构,同时支持数据库脚本版本控制)~~

## 备注

尽量保证按照上面的顺序集成相应的 demo。


================================================
FILE: demo-activiti/.gitignore
================================================
/target/
!.mvn/wrapper/maven-wrapper.jar

### STS ###
.apt_generated
.classpath
.factorypath
.project
.settings
.springBeans
.sts4-cache

### IntelliJ IDEA ###
.idea
*.iws
*.iml
*.ipr

### NetBeans ###
/nbproject/private/
/build/
/nbbuild/
/dist/
/nbdist/
/.nb-gradle/

================================================
FILE: demo-activiti/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 http://maven.apache.org/xsd/maven-4.0.0.xsd">
  <modelVersion>4.0.0</modelVersion>

  <artifactId>demo-activiti</artifactId>
  <version>1.0.0-SNAPSHOT</version>
  <packaging>jar</packaging>

  <name>demo-activiti</name>
  <description>Demo project for Spring Boot</description>

  <parent>
    <groupId>com.xkcoding</groupId>
    <artifactId>spring-boot-demo</artifactId>
    <version>1.0.0-SNAPSHOT</version>
  </parent>

  <properties>
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
    <java.version>1.8</java.version>
  </properties>

  <dependencies>
    <dependency>
      <groupId>org.springframework.boot</groupId>
      <artifactId>spring-boot-starter-web</artifactId>
    </dependency>

    <!-- activiti 自动建表 -->
    <dependency>
      <groupId>org.springframework.boot</groupId>
      <artifactId>spring-boot-starter-jdbc</artifactId>
    </dependency>

    <dependency>
      <groupId>org.activiti</groupId>
      <artifactId>activiti-spring-boot-starter</artifactId>
      <version>7.1.0.M2</version>
    </dependency>

    <dependency>
      <groupId>org.springframework.boot</groupId>
      <artifactId>spring-boot-starter-test</artifactId>
      <scope>test</scope>
    </dependency>

    <dependency>
      <groupId>mysql</groupId>
      <artifactId>mysql-connector-java</artifactId>
    </dependency>

    <dependency>
      <groupId>org.projectlombok</groupId>
      <artifactId>lombok</artifactId>
      <optional>true</optional>
    </dependency>
  </dependencies>

  <build>
    <finalName>demo-activiti</finalName>
    <plugins>
      <plugin>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-maven-plugin</artifactId>
      </plugin>
    </plugins>
  </build>

</project>


================================================
FILE: demo-activiti/src/main/java/com/xkcoding/activiti/SpringBootDemoActivitiApplication.java
================================================
package com.xkcoding.activiti;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

/**
 * <p>
 * 启动器
 * </p>
 *
 * @author yangkai.shen
 * @date Created in 2019-03-31 22:24
 */
@SpringBootApplication
public class SpringBootDemoActivitiApplication {

    public static void main(String[] args) {
        SpringApplication.run(SpringBootDemoActivitiApplication.class, args);
    }

}



================================================
FILE: demo-activiti/src/main/java/com/xkcoding/activiti/config/SecurityConfiguration.java
================================================
package com.xkcoding.activiti.config;

import lombok.extern.slf4j.Slf4j;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.security.config.annotation.authentication.builders.AuthenticationManagerBuilder;
import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter;
import org.springframework.security.core.authority.SimpleGrantedAuthority;
import org.springframework.security.core.userdetails.User;
import org.springframework.security.core.userdetails.UserDetailsService;
import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder;
import org.springframework.security.crypto.password.PasswordEncoder;
import org.springframework.security.provisioning.InMemoryUserDetailsManager;

import java.util.Arrays;
import java.util.List;
import java.util.stream.Collectors;

/**
 * <p>
 * 安全配置类
 * </p>
 *
 * @author yangkai.shen
 * @date Created in 2019-07-01 18:40
 */
@Slf4j
@Configuration
public class SecurityConfiguration extends WebSecurityConfigurerAdapter {

    @Override
    protected void configure(AuthenticationManagerBuilder auth) throws Exception {
        auth.userDetailsService(userDetailsService());
    }

    @Bean
    protected UserDetailsService myUserDetailsService() {
        InMemoryUserDetailsManager inMemoryUserDetailsManager = new InMemoryUserDetailsManager();

        String[][] usersGroupsAndRoles = {{"salaboy", "password", "ROLE_ACTIVITI_USER", "GROUP_activitiTeam"}, {"ryandawsonuk", "password", "ROLE_ACTIVITI_USER", "GROUP_activitiTeam"}, {"erdemedeiros", "password", "ROLE_ACTIVITI_USER", "GROUP_activitiTeam"}, {"other", "password", "ROLE_ACTIVITI_USER", "GROUP_otherTeam"}, {"admin", "password", "ROLE_ACTIVITI_ADMIN"}};

        for (String[] user : usersGroupsAndRoles) {
            List<String> authoritiesStrings = Arrays.asList(Arrays.copyOfRange(user, 2, user.length));
            log.info("> Registering new user: " + user[0] + " with the following Authorities[" + authoritiesStrings + "]");
            inMemoryUserDetailsManager.createUser(new User(user[0], passwordEncoder().encode(user[1]), authoritiesStrings.stream().map(SimpleGrantedAuthority::new).collect(Collectors.toList())));
        }


        return inMemoryUserDetailsManager;
    }

    @Bean
    public PasswordEncoder passwordEncoder() {
        return new BCryptPasswordEncoder();
    }
}


================================================
FILE: demo-activiti/src/main/java/com/xkcoding/activiti/util/SecurityUtil.java
================================================
package com.xkcoding.activiti.util;

import lombok.RequiredArgsConstructor;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.security.core.Authentication;
import org.springframework.security.core.GrantedAuthority;
import org.springframework.security.core.context.SecurityContextHolder;
import org.springframework.security.core.context.SecurityContextImpl;
import org.springframework.security.core.userdetails.UserDetails;
import org.springframework.security.core.userdetails.UserDetailsService;
import org.springframework.stereotype.Component;

import java.util.Collection;

/**
 * <p>
 * 认证工具
 * </p>
 *
 * @author yangkai.shen
 * @date Created in 2019-07-01 18:38
 */
@Component
@RequiredArgsConstructor(onConstructor_ = @Autowired)
public class SecurityUtil {

    private final UserDetailsService userDetailsService;

    public void logInAs(String username) {

        UserDetails user = userDetailsService.loadUserByUsername(username);
        if (user == null) {
            throw new IllegalStateException("User " + username + " doesn't exist, please provide a valid user");
        }

        SecurityContextHolder.setContext(new SecurityContextImpl(new Authentication() {
            @Override
            public Collection<? extends GrantedAuthority> getAuthorities() {
                return user.getAuthorities();
            }

            @Override
            public Object getCredentials() {
                return user.getPassword();
            }

            @Override
            public Object getDetails() {
                return user;
            }

            @Override
            public Object getPrincipal() {
                return user;
            }

            @Override
            public boolean isAuthenticated() {
                return true;
            }

            @Override
            public void setAuthenticated(boolean isAuthenticated) throws IllegalArgumentException {

            }

            @Override
            public String getName() {
                return user.getUsername();
            }
        }));
        org.activiti.engine.impl.identity.Authentication.setAuthenticatedUserId(username);
    }
}


================================================
FILE: demo-activiti/src/main/resources/application.yml
================================================
spring:
  datasource:
    url: jdbc:mysql://localhost:3306/spring-boot-demo
    username: root
    password: root
    hikari:
      data-source-properties:
        useSSL: false
        serverTimezone: GMT+8
        useUnicode: true
        characterEncoding: utf8
        # 这个必须要加,否则 Activiti 自动建表会失败
        nullCatalogMeansCurrent: true
  activiti:
    history-level: full
    db-history-used: true

================================================
FILE: demo-activiti/src/main/resources/processes/team01.bpmn
================================================
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<definitions xmlns="http://www.omg.org/spec/BPMN/20100524/MODEL" xmlns:activiti="http://activiti.org/bpmn" xmlns:bpmndi="http://www.omg.org/spec/BPMN/20100524/DI" xmlns:omgdc="http://www.omg.org/spec/DD/20100524/DC" xmlns:omgdi="http://www.omg.org/spec/DD/20100524/DI" xmlns:tns="http://www.activiti.org/test" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:yaoqiang="http://bpmn.sourceforge.net" exporter="Yaoqiang BPMN Editor" exporterVersion="5.3" expressionLanguage="http://www.w3.org/1999/XPath" id="m1544167269809" name="" targetNamespace="http://www.activiti.org/test" typeLanguage="http://www.w3.org/2001/XMLSchema" xsi:schemaLocation="http://www.omg.org/spec/BPMN/20100524/MODEL http://bpmn.sourceforge.net/schemas/BPMN20.xsd">
  <process id="myProcess_1" isClosed="false" isExecutable="true" processType="None">
    <extensionElements>
      <yaoqiang:description/>
      <yaoqiang:pageFormat height="841.8897637795276" imageableHeight="831.8897637795276" imageableWidth="588.1102362204724" imageableX="5.0" imageableY="5.0" orientation="0" width="598.1102362204724"/>
      <yaoqiang:page background="#FFFFFF" horizontalCount="1" verticalCount="1"/>
    </extensionElements>
    <startEvent id="_2" isInterrupting="true" name="StartEvent" parallelMultiple="false">
      <outgoing>_6</outgoing>
      <outputSet/>
    </startEvent>
    <userTask activiti:candidateGroups="activitiTeam" activiti:exclusive="true" completionQuantity="1" id="_3" implementation="##unspecified" isForCompensation="false" name="first" startQuantity="1">
      <incoming>_6</incoming>
      <outgoing>_7</outgoing>
    </userTask>
    <userTask activiti:candidateGroups="activitiTeam" activiti:exclusive="true" completionQuantity="1" id="_4" implementation="##unspecified" isForCompensation="false" name="second" startQuantity="1">
      <incoming>_7</incoming>
      <outgoing>_8</outgoing>
    </userTask>
    <endEvent id="_5" name="EndEvent">
      <incoming>_8</incoming>
      <inputSet/>
    </endEvent>
    <sequenceFlow id="_6" sourceRef="_2" targetRef="_3"/>
    <sequenceFlow id="_7" sourceRef="_3" targetRef="_4"/>
    <sequenceFlow id="_8" sourceRef="_4" targetRef="_5"/>
  </process>
  <bpmndi:BPMNDiagram id="Yaoqiang_Diagram-myProcess_1" name="New Diagram" resolution="96.0">
    <bpmndi:BPMNPlane bpmnElement="myProcess_1">
      <bpmndi:BPMNShape bpmnElement="_2" id="Yaoqiang-_2">
        <omgdc:Bounds height="32.0" width="32.0" x="65.0" y="80.0"/>
        <bpmndi:BPMNLabel>
          <omgdc:Bounds height="18.96" width="60.0" x="51.0" y="120.52"/>
        </bpmndi:BPMNLabel>
      </bpmndi:BPMNShape>
      <bpmndi:BPMNShape bpmnElement="_3" id="Yaoqiang-_3">
        <omgdc:Bounds height="55.0" width="85.0" x="170.0" y="115.0"/>
        <bpmndi:BPMNLabel>
          <omgdc:Bounds height="18.96" width="28.0" x="198.5" y="135.02"/>
        </bpmndi:BPMNLabel>
      </bpmndi:BPMNShape>
      <bpmndi:BPMNShape bpmnElement="_4" id="Yaoqiang-_4">
        <omgdc:Bounds height="55.0" width="85.0" x="310.0" y="155.0"/>
        <bpmndi:BPMNLabel>
          <omgdc:Bounds height="18.96" width="45.0" x="330.0" y="175.02"/>
        </bpmndi:BPMNLabel>
      </bpmndi:BPMNShape>
      <bpmndi:BPMNShape bpmnElement="_5" id="Yaoqiang-_5">
        <omgdc:Bounds height="32.0" width="32.0" x="505.0" y="220.0"/>
        <bpmndi:BPMNLabel>
          <omgdc:Bounds height="18.96" width="55.0" x="493.5" y="260.52"/>
        </bpmndi:BPMNLabel>
      </bpmndi:BPMNShape>
      <bpmndi:BPMNEdge bpmnElement="_8" id="Yaoqiang-_8">
        <omgdi:waypoint x="395.0" y="182.5"/>
        <omgdi:waypoint x="505.0" y="236.0"/>
        <bpmndi:BPMNLabel>
          <omgdc:Bounds height="18.96" width="6.0" x="447.0" y="199.77"/>
        </bpmndi:BPMNLabel>
      </bpmndi:BPMNEdge>
      <bpmndi:BPMNEdge bpmnElement="_7" id="Yaoqiang-_7">
        <omgdi:waypoint x="255.0" y="142.5"/>
        <omgdi:waypoint x="310.0" y="182.5"/>
        <bpmndi:BPMNLabel>
          <omgdc:Bounds height="18.96" width="6.0" x="279.5" y="153.02"/>
        </bpmndi:BPMNLabel>
      </bpmndi:BPMNEdge>
      <bpmndi:BPMNEdge bpmnElement="_6" id="Yaoqiang-_6">
        <omgdi:waypoint x="97.0" y="96.0"/>
        <omgdi:waypoint x="170.0" y="142.5"/>
        <bpmndi:BPMNLabel>
          <omgdc:Bounds height="18.96" width="6.0" x="130.5" y="109.77"/>
        </bpmndi:BPMNLabel>
      </bpmndi:BPMNEdge>
    </bpmndi:BPMNPlane>
  </bpmndi:BPMNDiagram>
</definitions>


================================================
FILE: demo-activiti/src/test/java/com/xkcoding/activiti/SpringBootDemoActivitiApplicationTests.java
================================================
package com.xkcoding.activiti;

import com.xkcoding.activiti.util.SecurityUtil;
import org.activiti.api.process.model.ProcessDefinition;
import org.activiti.api.process.runtime.ProcessRuntime;
import org.activiti.api.runtime.shared.query.Page;
import org.activiti.api.runtime.shared.query.Pageable;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.junit4.SpringRunner;

@RunWith(SpringRunner.class)
@SpringBootTest
public class SpringBootDemoActivitiApplicationTests {

    @Autowired
    private ProcessRuntime processRuntime;
    @Autowired
    private SecurityUtil securityUtil;

    @Test
    public void contextLoads() {
        securityUtil.logInAs("salaboy");
        Page<ProcessDefinition> processDefinitionPage = processRuntime.processDefinitions(Pageable.of(0, 10));
        processDefinitionPage.getContent().forEach(System.out::println);
    }

}



================================================
FILE: demo-actuator/.gitignore
================================================
/target/
!.mvn/wrapper/maven-wrapper.jar

### STS ###
.apt_generated
.classpath
.factorypath
.project
.settings
.springBeans
.sts4-cache

### IntelliJ IDEA ###
.idea
*.iws
*.iml
*.ipr

### NetBeans ###
/nbproject/private/
/build/
/nbbuild/
/dist/
/nbdist/
/.nb-gradle/

================================================
FILE: demo-actuator/README.md
================================================
# spring-boot-demo-actuator

> 本 demo 主要演示了如何在 Spring Boot 中通过 actuator 检查项目运行情况

## pom.xml

```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 http://maven.apache.org/xsd/maven-4.0.0.xsd">
	<modelVersion>4.0.0</modelVersion>

	<artifactId>spring-boot-demo-actuator</artifactId>
	<version>1.0.0-SNAPSHOT</version>
	<packaging>jar</packaging>

	<name>spring-boot-demo-actuator</name>
	<description>Demo project for Spring Boot</description>

	<parent>
		<groupId>com.xkcoding</groupId>
		<artifactId>spring-boot-demo</artifactId>
		<version>1.0.0-SNAPSHOT</version>
	</parent>

	<properties>
		<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
		<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
		<java.version>1.8</java.version>
	</properties>

	<dependencies>
		<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-starter-actuator</artifactId>
		</dependency>

		<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-starter-security</artifactId>
		</dependency>

		<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-starter-web</artifactId>
		</dependency>

		<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-starter-test</artifactId>
			<scope>test</scope>
		</dependency>

		<dependency>
			<groupId>org.springframework.security</groupId>
			<artifactId>spring-security-test</artifactId>
			<scope>test</scope>
		</dependency>
	</dependencies>

	<build>
		<finalName>spring-boot-demo-actuator</finalName>
		<plugins>
			<plugin>
				<groupId>org.springframework.boot</groupId>
				<artifactId>spring-boot-maven-plugin</artifactId>
			</plugin>
		</plugins>
	</build>

</project>
```

## application.yml

```yaml
server:
  port: 8080
  servlet:
    context-path: /demo
# 若要访问端点信息,需要配置用户名和密码
spring:
  security:
    user:
      name: xkcoding
      password: 123456
management:
  # 端点信息接口使用的端口,为了和主系统接口使用的端口进行分离
  server:
    port: 8090
    servlet:
      context-path: /sys
  # 端点健康情况,默认值"never",设置为"always"可以显示硬盘使用情况和线程情况
  endpoint:
    health:
      show-details: always
  # 设置端点暴露的哪些内容,默认["health","info"],设置"*"代表暴露所有可访问的端点
  endpoints:
    web:
      exposure:
        include: '*'
```

## 端点暴露地址

将项目运行起来之后,会在**控制台**里查看所有可以访问的端口信息
1. 打开浏览器,访问:http://localhost:8090/sys/actuator/mappings ,输入用户名(xkcoding)密码(123456)即可看到所有的mapping信息
2. 访问:http://localhost:8090/sys/actuator/beans ,输入用户名(xkcoding)密码(123456)即可看到所有 Spring 管理的Bean
3. 其余可访问的路径,参见文档

## 参考

- actuator文档:https://docs.spring.io/spring-boot/docs/2.0.5.RELEASE/reference/htmlsingle/#production-ready
- 具体可以访问哪些路径,参考: https://docs.spring.io/spring-boot/docs/2.0.5.RELEASE/reference/htmlsingle/#production-ready-endpoints

================================================
FILE: demo-actuator/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 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <artifactId>demo-actuator</artifactId>
    <version>1.0.0-SNAPSHOT</version>
    <packaging>jar</packaging>

    <name>demo-actuator</name>
    <description>Demo project for Spring Boot</description>

    <parent>
        <groupId>com.xkcoding</groupId>
        <artifactId>spring-boot-demo</artifactId>
        <version>1.0.0-SNAPSHOT</version>
    </parent>

    <properties>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
		<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
		<java.version>1.8</java.version>
	</properties>

	<dependencies>
		<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-starter-actuator</artifactId>
		</dependency>

		<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-starter-security</artifactId>
		</dependency>

		<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-starter-web</artifactId>
		</dependency>

		<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-starter-test</artifactId>
			<scope>test</scope>
		</dependency>

		<dependency>
			<groupId>org.springframework.security</groupId>
			<artifactId>spring-security-test</artifactId>
			<scope>test</scope>
		</dependency>
	</dependencies>

    <build>
        <finalName>demo-actuator</finalName>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
        </plugins>
    </build>

</project>


================================================
FILE: demo-actuator/src/main/java/com/xkcoding/actuator/SpringBootDemoActuatorApplication.java
================================================
package com.xkcoding.actuator;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

/**
 * <p>
 * 启动类
 * </p>
 *
 * @author yangkai.shen
 * @date Created in 2018-9-29 14:27
 */
@SpringBootApplication
public class SpringBootDemoActuatorApplication {

    public static void main(String[] args) {
        SpringApplication.run(SpringBootDemoActuatorApplication.class, args);
    }
}


================================================
FILE: demo-actuator/src/main/resources/application.yml
================================================
server:
  port: 8080
  servlet:
    context-path: /demo
# 若要访问端点信息,需要配置用户名和密码
spring:
  security:
    user:
      name: xkcoding
      password: 123456
management:
  # 端点信息接口使用的端口,为了和主系统接口使用的端口进行分离
  server:
    port: 8090
    servlet:
      context-path: /sys
  # 端点健康情况,默认值"never",设置为"always"可以显示硬盘使用情况和线程情况
  endpoint:
    health:
      show-details: always
  # 设置端点暴露的哪些内容,默认["health","info"],设置"*"代表暴露所有可访问的端点
  endpoints:
    web:
      exposure:
        include: '*'

================================================
FILE: demo-actuator/src/test/java/com/xkcoding/actuator/SpringBootDemoActuatorApplicationTests.java
================================================
package com.xkcoding.actuator;

import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.junit4.SpringRunner;

@RunWith(SpringRunner.class)
@SpringBootTest
public class SpringBootDemoActuatorApplicationTests {

    @Test
    public void contextLoads() {
    }

}


================================================
FILE: demo-admin/README.md
================================================
# spring-boot-demo-admin

> 本 demo 主要演示了 Spring Boot 如何集成 Admin 管控台,监控管理 Spring Boot 应用,分别为 admin 服务端和 admin 客户端,两个模块。

## 运行步骤

1. 进入 `spring-boot-demo-admin-server` 服务端,启动管控台服务端程序
2. 进入 `spring-boot-demo-admin-client` 客户端,启动客户端程序,注册到服务端
3. 观察服务端里,客户端程序的运行状态等信息

## pom.xml

```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 http://maven.apache.org/xsd/maven-4.0.0.xsd">
  <parent>
    <artifactId>spring-boot-demo</artifactId>
    <groupId>com.xkcoding</groupId>
    <version>1.0.0-SNAPSHOT</version>
  </parent>
  <modelVersion>4.0.0</modelVersion>

  <artifactId>spring-boot-demo-admin</artifactId>
  <packaging>pom</packaging>

  <properties>
    <spring-boot-admin.version>2.1.0</spring-boot-admin.version>
  </properties>

  <modules>
    <module>spring-boot-demo-admin-client</module>
    <module>spring-boot-demo-admin-server</module>
  </modules>

  <dependencyManagement>
    <dependencies>
      <dependency>
        <groupId>de.codecentric</groupId>
        <artifactId>spring-boot-admin-dependencies</artifactId>
        <version>${spring-boot-admin.version}</version>
        <type>pom</type>
        <scope>import</scope>
      </dependency>
    </dependencies>
  </dependencyManagement>

</project>
```



================================================
FILE: demo-admin/admin-client/.gitignore
================================================
/target/
!.mvn/wrapper/maven-wrapper.jar

### STS ###
.apt_generated
.classpath
.factorypath
.project
.settings
.springBeans
.sts4-cache

### IntelliJ IDEA ###
.idea
*.iws
*.iml
*.ipr

### NetBeans ###
/nbproject/private/
/build/
/nbbuild/
/dist/
/nbdist/
/.nb-gradle/

================================================
FILE: demo-admin/admin-client/README.md
================================================
# spring-boot-demo-admin-client

> 本 demo 主要演示了普通项目如何集成 Spring Boot Admin,并把自己的运行状态交给 Spring Boot Admin 进行展现。

## pom.xml

```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 http://maven.apache.org/xsd/maven-4.0.0.xsd">
  <modelVersion>4.0.0</modelVersion>

  <artifactId>spring-boot-demo-admin-client</artifactId>
  <version>1.0.0-SNAPSHOT</version>
  <packaging>jar</packaging>

  <name>spring-boot-demo-admin-client</name>
  <description>Demo project for Spring Boot</description>

  <parent>
    <groupId>com.xkcoding</groupId>
    <artifactId>spring-boot-demo-admin</artifactId>
    <version>1.0.0-SNAPSHOT</version>
  </parent>

  <properties>
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
    <java.version>1.8</java.version>
  </properties>

  <dependencies>
    <dependency>
      <groupId>org.springframework.boot</groupId>
      <artifactId>spring-boot-starter-web</artifactId>
    </dependency>

    <dependency>
      <groupId>de.codecentric</groupId>
      <artifactId>spring-boot-admin-starter-client</artifactId>
    </dependency>

    <dependency>
      <groupId>org.springframework.boot</groupId>
      <artifactId>spring-boot-starter-security</artifactId>
    </dependency>

    <dependency>
      <groupId>org.springframework.boot</groupId>
      <artifactId>spring-boot-starter-test</artifactId>
      <scope>test</scope>
    </dependency>
  </dependencies>

  <build>
    <finalName>spring-boot-demo-admin-client</finalName>
    <plugins>
      <plugin>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-maven-plugin</artifactId>
      </plugin>
    </plugins>
  </build>

</project>
```

## application.yml

```yaml
server:
  port: 8080
  servlet:
    context-path: /demo
spring:
  application:
    # Spring Boot Admin展示的客户端项目名,不设置,会使用自动生成的随机id
    name: spring-boot-demo-admin-client
  boot:
    admin:
      client:
        # Spring Boot Admin 服务端地址
        url: "http://localhost:8000/"
        instance:
          metadata:
            # 客户端端点信息的安全认证信息
            user.name: ${spring.security.user.name}
            user.password: ${spring.security.user.password}
  security:
    user:
      name: xkcoding
      password: 123456
management:
  endpoint:
    health:
      # 端点健康情况,默认值"never",设置为"always"可以显示硬盘使用情况和线程情况
      show-details: always
  endpoints:
    web:
      exposure:
        # 设置端点暴露的哪些内容,默认["health","info"],设置"*"代表暴露所有可访问的端点
        include: "*"
```



================================================
FILE: demo-admin/admin-client/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 http://maven.apache.org/xsd/maven-4.0.0.xsd">
  <parent>
    <groupId>com.xkcoding</groupId>
    <artifactId>demo-admin</artifactId>
    <version>1.0.0-SNAPSHOT</version>
  </parent>
  <modelVersion>4.0.0</modelVersion>

  <artifactId>admin-client</artifactId>
  <version>1.0.0-SNAPSHOT</version>
  <packaging>jar</packaging>

  <name>admin-client</name>
  <description>Demo project for Spring Boot</description>

  <properties>
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
    <java.version>1.8</java.version>
  </properties>

  <dependencies>
    <dependency>
      <groupId>org.springframework.boot</groupId>
      <artifactId>spring-boot-starter-web</artifactId>
    </dependency>

    <dependency>
      <groupId>de.codecentric</groupId>
      <artifactId>spring-boot-admin-starter-client</artifactId>
    </dependency>

    <dependency>
      <groupId>org.springframework.boot</groupId>
      <artifactId>spring-boot-starter-security</artifactId>
    </dependency>

    <dependency>
      <groupId>org.springframework.boot</groupId>
      <artifactId>spring-boot-starter-test</artifactId>
      <scope>test</scope>
    </dependency>
  </dependencies>

  <build>
    <finalName>admin-client</finalName>
    <plugins>
      <plugin>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-maven-plugin</artifactId>
      </plugin>
    </plugins>
  </build>

</project>


================================================
FILE: demo-admin/admin-client/src/main/java/com/xkcoding/admin/client/SpringBootDemoAdminClientApplication.java
================================================
package com.xkcoding.admin.client;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

/**
 * <p>
 * 启动类
 * </p>
 *
 * @author yangkai.shen
 * @date Created in 2018-10-8 14:16
 */
@SpringBootApplication
public class SpringBootDemoAdminClientApplication {

    public static void main(String[] args) {
        SpringApplication.run(SpringBootDemoAdminClientApplication.class, args);
    }
}


================================================
FILE: demo-admin/admin-client/src/main/java/com/xkcoding/admin/client/controller/IndexController.java
================================================
package com.xkcoding.admin.client.controller;

import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;

/**
 * <p>
 * 首页
 * </p>
 *
 * @author yangkai.shen
 * @date Created in 2018-10-08 14:15
 */
@RestController
public class IndexController {
    @GetMapping(value = {"", "/"})
    public String index() {
        return "This is a Spring Boot Admin Client.";
    }
}


================================================
FILE: demo-admin/admin-client/src/main/resources/application.yml
================================================
server:
  port: 8080
  servlet:
    context-path: /demo
spring:
  application:
    # Spring Boot Admin展示的客户端项目名,不设置,会使用自动生成的随机id
    name: spring-boot-demo-admin-client
  boot:
    admin:
      client:
        # Spring Boot Admin 服务端地址
        url: "http://localhost:8000/"
        instance:
          metadata:
            # 客户端端点信息的安全认证信息
            user.name: ${spring.security.user.name}
            user.password: ${spring.security.user.password}
  security:
    user:
      name: xkcoding
      password: 123456
management:
  endpoint:
    health:
      # 端点健康情况,默认值"never",设置为"always"可以显示硬盘使用情况和线程情况
      show-details: always
  endpoints:
    web:
      exposure:
        # 设置端点暴露的哪些内容,默认["health","info"],设置"*"代表暴露所有可访问的端点
        include: "*"


================================================
FILE: demo-admin/admin-client/src/test/java/com/xkcoding/admin/client/SpringBootDemoAdminClientApplicationTests.java
================================================
package com.xkcoding.admin.client;

import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.junit4.SpringRunner;

@RunWith(SpringRunner.class)
@SpringBootTest
public class SpringBootDemoAdminClientApplicationTests {

    @Test
    public void contextLoads() {
    }

}


================================================
FILE: demo-admin/admin-server/.gitignore
================================================
/target/
!.mvn/wrapper/maven-wrapper.jar

### STS ###
.apt_generated
.classpath
.factorypath
.project
.settings
.springBeans
.sts4-cache

### IntelliJ IDEA ###
.idea
*.iws
*.iml
*.ipr

### NetBeans ###
/nbproject/private/
/build/
/nbbuild/
/dist/
/nbdist/
/.nb-gradle/

================================================
FILE: demo-admin/admin-server/README.md
================================================
# spring-boot-demo-admin-server

> 本 demo 主要演示了如何搭建一个 Spring Boot Admin 的服务端项目,可视化展示自己客户端项目的运行状态。

## pom.xml

```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 http://maven.apache.org/xsd/maven-4.0.0.xsd">
  <modelVersion>4.0.0</modelVersion>

  <artifactId>spring-boot-demo-admin-server</artifactId>
  <version>1.0.0-SNAPSHOT</version>
  <packaging>jar</packaging>

  <name>spring-boot-demo-admin-server</name>
  <description>Demo project for Spring Boot</description>

  <parent>
    <groupId>com.xkcoding</groupId>
    <artifactId>spring-boot-demo-admin</artifactId>
    <version>1.0.0-SNAPSHOT</version>
  </parent>

  <properties>
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
    <java.version>1.8</java.version>
  </properties>

  <dependencies>
    <dependency>
      <groupId>org.springframework.boot</groupId>
      <artifactId>spring-boot-starter-web</artifactId>
    </dependency>

    <dependency>
      <groupId>de.codecentric</groupId>
      <artifactId>spring-boot-admin-starter-server</artifactId>
    </dependency>

    <dependency>
      <groupId>org.springframework.boot</groupId>
      <artifactId>spring-boot-starter-test</artifactId>
      <scope>test</scope>
    </dependency>
  </dependencies>

  <build>
    <finalName>spring-boot-demo-admin-server</finalName>
    <plugins>
      <plugin>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-maven-plugin</artifactId>
      </plugin>
    </plugins>
  </build>

</project>
```

## SpringBootDemoAdminServerApplication.java

```java
/**
 * <p>
 * 启动类
 * </p>
 *
 * @author yangkai.shen
 * @date Created in 2018-10-08 14:08
 */
@EnableAdminServer
@SpringBootApplication
public class SpringBootDemoAdminServerApplication {

	public static void main(String[] args) {
		SpringApplication.run(SpringBootDemoAdminServerApplication.class, args);
	}
}
```

## application.yml

```yaml
server:
  port: 8000
```



================================================
FILE: demo-admin/admin-server/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 http://maven.apache.org/xsd/maven-4.0.0.xsd">
  <parent>
    <groupId>com.xkcoding</groupId>
    <artifactId>demo-admin</artifactId>
    <version>1.0.0-SNAPSHOT</version>
  </parent>
  <modelVersion>4.0.0</modelVersion>

  <artifactId>demo-admin-server</artifactId>
  <version>1.0.0-SNAPSHOT</version>
  <packaging>jar</packaging>

  <name>admin-server</name>
  <description>Demo project for Spring Boot</description>

  <properties>
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
    <java.version>1.8</java.version>
  </properties>

  <dependencies>
    <dependency>
      <groupId>org.springframework.boot</groupId>
      <artifactId>spring-boot-starter-web</artifactId>
    </dependency>

    <dependency>
      <groupId>de.codecentric</groupId>
      <artifactId>spring-boot-admin-starter-server</artifactId>
    </dependency>

    <dependency>
      <groupId>org.springframework.boot</groupId>
      <artifactId>spring-boot-starter-test</artifactId>
      <scope>test</scope>
    </dependency>
  </dependencies>

  <build>
    <finalName>admin-server</finalName>
    <plugins>
      <plugin>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-maven-plugin</artifactId>
      </plugin>
    </plugins>
  </build>

</project>


================================================
FILE: demo-admin/admin-server/src/main/java/com/xkcoding/admin/server/SpringBootDemoAdminServerApplication.java
================================================
package com.xkcoding.admin.server;

import de.codecentric.boot.admin.server.config.EnableAdminServer;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

/**
 * <p>
 * 启动类
 * </p>
 *
 * @author yangkai.shen
 * @date Created in 2018-10-08 14:08
 */
@EnableAdminServer
@SpringBootApplication
public class SpringBootDemoAdminServerApplication {

    public static void main(String[] args) {
        SpringApplication.run(SpringBootDemoAdminServerApplication.class, args);
    }
}


================================================
FILE: demo-admin/admin-server/src/main/resources/application.yml
================================================
server:
  port: 8000


================================================
FILE: demo-admin/admin-server/src/test/java/com/xkcoding/admin/server/SpringBootDemoAdminServerApplicationTests.java
================================================
package com.xkcoding.admin.server;

import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.junit4.SpringRunner;

@RunWith(SpringRunner.class)
@SpringBootTest
public class SpringBootDemoAdminServerApplicationTests {

    @Test
    public void contextLoads() {
    }

}


================================================
FILE: demo-admin/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 http://maven.apache.org/xsd/maven-4.0.0.xsd">
  <parent>
    <artifactId>spring-boot-demo</artifactId>
    <groupId>com.xkcoding</groupId>
    <version>1.0.0-SNAPSHOT</version>
  </parent>
  <modelVersion>4.0.0</modelVersion>

  <artifactId>demo-admin</artifactId>
  <packaging>pom</packaging>

  <properties>
    <spring-boot-admin.version>2.1.0</spring-boot-admin.version>
  </properties>

  <modules>
    <module>admin-client</module>
    <module>admin-server</module>
  </modules>

  <dependencyManagement>
    <dependencies>
      <dependency>
        <groupId>de.codecentric</groupId>
        <artifactId>spring-boot-admin-dependencies</artifactId>
        <version>${spring-boot-admin.version}</version>
        <type>pom</type>
        <scope>import</scope>
      </dependency>
    </dependencies>
  </dependencyManagement>

</project>


================================================
FILE: demo-async/.gitignore
================================================
/target/
!.mvn/wrapper/maven-wrapper.jar

### STS ###
.apt_generated
.classpath
.factorypath
.project
.settings
.springBeans
.sts4-cache

### IntelliJ IDEA ###
.idea
*.iws
*.iml
*.ipr

### NetBeans ###
/nbproject/private/
/build/
/nbbuild/
/dist/
/nbdist/
/.nb-gradle/

================================================
FILE: demo-async/README.md
================================================
# spring-boot-demo-async

> 此 demo 主要演示了 Spring Boot 如何使用原生提供的异步任务支持,实现异步执行任务。

## pom.xml

```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 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <artifactId>spring-boot-demo-async</artifactId>
    <version>1.0.0-SNAPSHOT</version>
    <packaging>jar</packaging>

    <name>spring-boot-demo-async</name>
    <description>Demo project for Spring Boot</description>

    <parent>
        <groupId>com.xkcoding</groupId>
        <artifactId>spring-boot-demo</artifactId>
        <version>1.0.0-SNAPSHOT</version>
    </parent>

    <properties>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
        <java.version>1.8</java.version>
    </properties>

    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter</artifactId>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>

        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <optional>true</optional>
        </dependency>
    </dependencies>

    <build>
        <finalName>spring-boot-demo-async</finalName>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
        </plugins>
    </build>

</project>
```

## application.yml

```yaml
spring:
  task:
    execution:
      pool:
        # 最大线程数
        max-size: 16
        # 核心线程数
        core-size: 16
        # 存活时间
        keep-alive: 10s
        # 队列大小
        queue-capacity: 100
        # 是否允许核心线程超时
        allow-core-thread-timeout: true
      # 线程名称前缀
      thread-name-prefix: async-task-
```

## SpringBootDemoAsyncApplication.java

```java
/**
 * <p>
 * 启动器
 * </p>
 *
 * @author yangkai.shen
 * @date Created in 2018-12-29 10:28
 */
@EnableAsync
@SpringBootApplication
public class SpringBootDemoAsyncApplication {

    public static void main(String[] args) {
        SpringApplication.run(SpringBootDemoAsyncApplication.class, args);
    }

}
```

## TaskFactory.java

```java
/**
 * <p>
 * 任务工厂
 * </p>
 *
 * @author yangkai.shen
 * @date Created in 2018-12-29 10:37
 */
@Component
@Slf4j
public class TaskFactory {

    /**
     * 模拟5秒的异步任务
     */
    @Async
    public Future<Boolean> asyncTask1() throws InterruptedException {
        doTask("asyncTask1", 5);
        return new AsyncResult<>(Boolean.TRUE);
    }

    /**
     * 模拟2秒的异步任务
     */
    @Async
    public Future<Boolean> asyncTask2() throws InterruptedException {
        doTask("asyncTask2", 2);
        return new AsyncResult<>(Boolean.TRUE);
    }

    /**
     * 模拟3秒的异步任务
     */
    @Async
    public Future<Boolean> asyncTask3() throws InterruptedException {
        doTask("asyncTask3", 3);
        return new AsyncResult<>(Boolean.TRUE);
    }

    /**
     * 模拟5秒的同步任务
     */
    public void task1() throws InterruptedException {
        doTask("task1", 5);
    }

    /**
     * 模拟2秒的同步任务
     */
    public void task2() throws InterruptedException {
        doTask("task2", 2);
    }

    /**
     * 模拟3秒的同步任务
     */
    public void task3() throws InterruptedException {
        doTask("task3", 3);
    }

    private void doTask(String taskName, Integer time) throws InterruptedException {
        log.info("{}开始执行,当前线程名称【{}】", taskName, Thread.currentThread().getName());
        TimeUnit.SECONDS.sleep(time);
        log.info("{}执行成功,当前线程名称【{}】", taskName, Thread.currentThread().getName());
    }
}
```

## TaskFactoryTest.java

```java
/**
 * <p>
 * 测试任务
 * </p>
 *
 * @author yangkai.shen
 * @date Created in 2018-12-29 10:49
 */
@Slf4j
public class TaskFactoryTest extends SpringBootDemoAsyncApplicationTests {
    @Autowired
    private TaskFactory task;

    /**
     * 测试异步任务
     */
    @Test
    public void asyncTaskTest() throws InterruptedException, ExecutionException {
        long start = System.currentTimeMillis();
        Future<Boolean> asyncTask1 = task.asyncTask1();
        Future<Boolean> asyncTask2 = task.asyncTask2();
        Future<Boolean> asyncTask3 = task.asyncTask3();

        // 调用 get() 阻塞主线程
        asyncTask1.get();
        asyncTask2.get();
        asyncTask3.get();
        long end = System.currentTimeMillis();

        log.info("异步任务全部执行结束,总耗时:{} 毫秒", (end - start));
    }

    /**
     * 测试同步任务
     */
    @Test
    public void taskTest() throws InterruptedException {
        long start = System.currentTimeMillis();
        task.task1();
        task.task2();
        task.task3();
        long end = System.currentTimeMillis();

        log.info("同步任务全部执行结束,总耗时:{} 毫秒", (end - start));
    }
}
```

## 运行结果

### 异步任务

```bash
2018-12-29 10:57:28.511  INFO 3134 --- [   async-task-3] com.xkcoding.async.task.TaskFactory      : asyncTask3开始执行,当前线程名称【async-task-3】
2018-12-29 10:57:28.511  INFO 3134 --- [   async-task-1] com.xkcoding.async.task.TaskFactory      : asyncTask1开始执行,当前线程名称【async-task-1】
2018-12-29 10:57:28.511  INFO 3134 --- [   async-task-2] com.xkcoding.async.task.TaskFactory      : asyncTask2开始执行,当前线程名称【async-task-2】
2018-12-29 10:57:30.514  INFO 3134 --- [   async-task-2] com.xkcoding.async.task.TaskFactory      : asyncTask2执行成功,当前线程名称【async-task-2】
2018-12-29 10:57:31.516  INFO 3134 --- [   async-task-3] com.xkcoding.async.task.TaskFactory      : asyncTask3执行成功,当前线程名称【async-task-3】
2018-12-29 10:57:33.517  INFO 3134 --- [   async-task-1] com.xkcoding.async.task.TaskFactory      : asyncTask1执行成功,当前线程名称【async-task-1】
2018-12-29 10:57:33.517  INFO 3134 --- [           main] com.xkcoding.async.task.TaskFactoryTest  : 异步任务全部执行结束,总耗时:5015 毫秒
```

### 同步任务

```bash
2018-12-29 10:55:49.830  INFO 3079 --- [           main] com.xkcoding.async.task.TaskFactory      : task1开始执行,当前线程名称【main】
2018-12-29 10:55:54.834  INFO 3079 --- [           main] com.xkcoding.async.task.TaskFactory      : task1执行成功,当前线程名称【main】
2018-12-29 10:55:54.835  INFO 3079 --- [           main] com.xkcoding.async.task.TaskFactory      : task2开始执行,当前线程名称【main】
2018-12-29 10:55:56.839  INFO 3079 --- [           main] com.xkcoding.async.task.TaskFactory      : task2执行成功,当前线程名称【main】
2018-12-29 10:55:56.839  INFO 3079 --- [           main] com.xkcoding.async.task.TaskFactory      : task3开始执行,当前线程名称【main】
2018-12-29 10:55:59.843  INFO 3079 --- [           main] com.xkcoding.async.task.TaskFactory      : task3执行成功,当前线程名称【main】
2018-12-29 10:55:59.843  INFO 3079 --- [           main] com.xkcoding.async.task.TaskFactoryTest  : 同步任务全部执行结束,总耗时:10023 毫秒
```

## 参考

- Spring Boot 异步任务线程池的配置 参考官方文档:https://docs.spring.io/spring-boot/docs/2.1.0.RELEASE/reference/htmlsingle/#boot-features-task-execution-scheduling


================================================
FILE: demo-async/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 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <artifactId>demo-async</artifactId>
    <version>1.0.0-SNAPSHOT</version>
    <packaging>jar</packaging>

    <name>demo-async</name>
    <description>Demo project for Spring Boot</description>

    <parent>
        <groupId>com.xkcoding</groupId>
        <artifactId>spring-boot-demo</artifactId>
        <version>1.0.0-SNAPSHOT</version>
    </parent>

    <properties>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
        <java.version>1.8</java.version>
    </properties>

    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter</artifactId>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>

        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <optional>true</optional>
        </dependency>
    </dependencies>

    <build>
        <finalName>demo-async</finalName>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
        </plugins>
    </build>

</project>


================================================
FILE: demo-async/src/main/java/com/xkcoding/async/SpringBootDemoAsyncApplication.java
================================================
package com.xkcoding.async;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.scheduling.annotation.EnableAsync;

/**
 * <p>
 * 启动器
 * </p>
 *
 * @author yangkai.shen
 * @date Created in 2018-12-29 10:28
 */
@EnableAsync
@SpringBootApplication
public class SpringBootDemoAsyncApplication {

    public static void main(String[] args) {
        SpringApplication.run(SpringBootDemoAsyncApplication.class, args);
    }

}



================================================
FILE: demo-async/src/main/java/com/xkcoding/async/task/TaskFactory.java
================================================
package com.xkcoding.async.task;

import lombok.extern.slf4j.Slf4j;
import org.springframework.scheduling.annotation.Async;
import org.springframework.scheduling.annotation.AsyncResult;
import org.springframework.stereotype.Component;

import java.util.concurrent.Future;
import java.util.concurrent.TimeUnit;

/**
 * <p>
 * 任务工厂
 * </p>
 *
 * @author yangkai.shen
 * @date Created in 2018-12-29 10:37
 */
@Component
@Slf4j
public class TaskFactory {

    /**
     * 模拟5秒的异步任务
     */
    @Async
    public Future<Boolean> asyncTask1() throws InterruptedException {
        doTask("asyncTask1", 5);
        return new AsyncResult<>(Boolean.TRUE);
    }

    /**
     * 模拟2秒的异步任务
     */
    @Async
    public Future<Boolean> asyncTask2() throws InterruptedException {
        doTask("asyncTask2", 2);
        return new AsyncResult<>(Boolean.TRUE);
    }

    /**
     * 模拟3秒的异步任务
     */
    @Async
    public Future<Boolean> asyncTask3() throws InterruptedException {
        doTask("asyncTask3", 3);
        return new AsyncResult<>(Boolean.TRUE);
    }

    /**
     * 模拟5秒的同步任务
     */
    public void task1() throws InterruptedException {
        doTask("task1", 5);
    }

    /**
     * 模拟2秒的同步任务
     */
    public void task2() throws InterruptedException {
        doTask("task2", 2);
    }

    /**
     * 模拟3秒的同步任务
     */
    public void task3() throws InterruptedException {
        doTask("task3", 3);
    }

    private void doTask(String taskName, Integer time) throws InterruptedException {
        log.info("{}开始执行,当前线程名称【{}】", taskName, Thread.currentThread().getName());
        TimeUnit.SECONDS.sleep(time);
        log.info("{}执行成功,当前线程名称【{}】", taskName, Thread.currentThread().getName());
    }
}


================================================
FILE: demo-async/src/main/resources/application.yml
================================================
spring:
  task:
    execution:
      pool:
        # 最大线程数
        max-size: 16
        # 核心线程数
        core-size: 16
        # 存活时间
        keep-alive: 10s
        # 队列大小
        queue-capacity: 100
        # 是否允许核心线程超时
        allow-core-thread-timeout: true
      # 线程名称前缀
      thread-name-prefix: async-task-

================================================
FILE: demo-async/src/test/java/com/xkcoding/async/SpringBootDemoAsyncApplicationTests.java
================================================
package com.xkcoding.async;

import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.junit4.SpringRunner;

@RunWith(SpringRunner.class)
@SpringBootTest
public class SpringBootDemoAsyncApplicationTests {

    @Test
    public void contextLoads() {
    }

}



================================================
FILE: demo-async/src/test/java/com/xkcoding/async/task/TaskFactoryTest.java
================================================
package com.xkcoding.async.task;

import com.xkcoding.async.SpringBootDemoAsyncApplicationTests;
import lombok.extern.slf4j.Slf4j;
import org.junit.Test;
import org.springframework.beans.factory.annotation.Autowired;

import java.util.concurrent.ExecutionException;
import java.util.concurrent.Future;

/**
 * <p>
 * 测试任务
 * </p>
 *
 * @author yangkai.shen
 * @date Created in 2018-12-29 10:49
 */
@Slf4j
public class TaskFactoryTest extends SpringBootDemoAsyncApplicationTests {
    @Autowired
    private TaskFactory task;

    /**
     * 测试异步任务
     */
    @Test
    public void asyncTaskTest() throws InterruptedException, ExecutionException {
        long start = System.currentTimeMillis();
        Future<Boolean> asyncTask1 = task.asyncTask1();
        Future<Boolean> asyncTask2 = task.asyncTask2();
        Future<Boolean> asyncTask3 = task.asyncTask3();

        // 调用 get() 阻塞主线程
        asyncTask1.get();
        asyncTask2.get();
        asyncTask3.get();
        long end = System.currentTimeMillis();

        log.info("异步任务全部执行结束,总耗时:{} 毫秒", (end - start));
    }

    /**
     * 测试同步任务
     */
    @Test
    public void taskTest() throws InterruptedException {
        long start = System.currentTimeMillis();
        task.task1();
        task.task2();
        task.task3();
        long end = System.currentTimeMillis();

        log.info("同步任务全部执行结束,总耗时:{} 毫秒", (end - start));
    }
}


================================================
FILE: demo-cache-ehcache/.gitignore
================================================
/target/
!.mvn/wrapper/maven-wrapper.jar

### STS ###
.apt_generated
.classpath
.factorypath
.project
.settings
.springBeans
.sts4-cache

### IntelliJ IDEA ###
.idea
*.iws
*.iml
*.ipr

### NetBeans ###
/nbproject/private/
/build/
/nbbuild/
/dist/
/nbdist/
/.nb-gradle/

================================================
FILE: demo-cache-ehcache/README.md
================================================
# spring-boot-demo-cache-ehcache

> 此 demo 主要演示了 Spring Boot 如何集成 ehcache 使用缓存。

## pom.xml

```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 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <artifactId>spring-boot-demo-cache-ehcache</artifactId>
    <version>1.0.0-SNAPSHOT</version>
    <packaging>jar</packaging>

    <name>spring-boot-demo-cache-ehcache</name>
    <description>Demo project for Spring Boot</description>

    <parent>
        <groupId>com.xkcoding</groupId>
        <artifactId>spring-boot-demo</artifactId>
        <version>1.0.0-SNAPSHOT</version>
    </parent>

    <properties>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
        <java.version>1.8</java.version>
    </properties>

    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter</artifactId>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-cache</artifactId>
        </dependency>

        <dependency>
            <groupId>net.sf.ehcache</groupId>
            <artifactId>ehcache</artifactId>
        </dependency>

        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <optional>true</optional>
        </dependency>

        <dependency>
            <groupId>com.google.guava</groupId>
            <artifactId>guava</artifactId>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>
    </dependencies>

    <build>
        <finalName>spring-boot-demo-cache-ehcache</finalName>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
        </plugins>
    </build>

</project>
```

## SpringBootDemoCacheEhcacheApplication.java

```java
/**
 * <p>
 * 启动类
 * </p>
 *
 * @author yangkai.shen
 * @date Created in 2018-11-16 17:02
 */
@SpringBootApplication
@EnableCaching
public class SpringBootDemoCacheEhcacheApplication {

    public static void main(String[] args) {
        SpringApplication.run(SpringBootDemoCacheEhcacheApplication.class, args);
    }
}
```

## application.yml

```yaml
spring:
  cache:
    type: ehcache
    ehcache:
      config: classpath:ehcache.xml
logging:
  level:
    com.xkcoding: debug
```

## ehcache.xml

```xml
<!-- ehcache配置 -->
<ehcache
        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
        xsi:noNamespaceSchemaLocation="http://ehcache.org/ehcache.xsd"
        updateCheck="false">
    <!--缓存路径,用户目录下的base_ehcache目录-->
    <diskStore path="user.home/base_ehcache"/>

    <defaultCache
            maxElementsInMemory="20000"
            eternal="false"
            timeToIdleSeconds="120"
            timeToLiveSeconds="120"
            overflowToDisk="true"
            maxElementsOnDisk="10000000"
            diskPersistent="false"
            diskExpiryThreadIntervalSeconds="120"
            memoryStoreEvictionPolicy="LRU"/>

    <!--
    缓存文件名:user,同样的可以配置多个缓存
    maxElementsInMemory:内存中最多存储
    eternal:外部存储
    overflowToDisk:超出缓存到磁盘
    diskPersistent:磁盘持久化
    timeToLiveSeconds:缓存时间
    diskExpiryThreadIntervalSeconds:磁盘过期时间
    -->
    <cache name="user"
           maxElementsInMemory="20000"
           eternal="true"
           overflowToDisk="true"
           diskPersistent="false"
           timeToLiveSeconds="0"
           diskExpiryThreadIntervalSeconds="120"/>

</ehcache>
```

## UserServiceImpl.java

```java
/**
 * <p>
 * UserService
 * </p>
 *
 * @author yangkai.shen
 * @date Created in 2018-11-16 16:54
 */
@Service
@Slf4j
public class UserServiceImpl implements UserService {
    /**
     * 模拟数据库
     */
    private static final Map<Long, User> DATABASES = Maps.newConcurrentMap();

    /**
     * 初始化数据
     */
    static {
        DATABASES.put(1L, new User(1L, "user1"));
        DATABASES.put(2L, new User(2L, "user2"));
        DATABASES.put(3L, new User(3L, "user3"));
    }

    /**
     * 保存或修改用户
     *
     * @param user 用户对象
     * @return 操作结果
     */
    @CachePut(value = "user", key = "#user.id")
    @Override
    public User saveOrUpdate(User user) {
        DATABASES.put(user.getId(), user);
        log.info("保存用户【user】= {}", user);
        return user;
    }

    /**
     * 获取用户
     *
     * @param id key值
     * @return 返回结果
     */
    @Cacheable(value = "user", key = "#id")
    @Override
    public User get(Long id) {
        // 我们假设从数据库读取
        log.info("查询用户【id】= {}", id);
        return DATABASES.get(id);
    }

    /**
     * 删除
     *
     * @param id key值
     */
    @CacheEvict(value = "user", key = "#id")
    @Override
    public void delete(Long id) {
        DATABASES.remove(id);
        log.info("删除用户【id】= {}", id);
    }
}
```

## UserServiceTest.java

```java
/**
 * <p>
 * ehcache缓存测试
 * </p>
 *
 * @author yangkai.shen
 * @date Created in 2018-11-16 16:58
 */
@Slf4j
public class UserServiceTest extends SpringBootDemoCacheEhcacheApplicationTests {

    @Autowired
    private UserService userService;

    /**
     * 获取两次,查看日志验证缓存
     */
    @Test
    public void getTwice() {
        // 模拟查询id为1的用户
        User user1 = userService.get(1L);
        log.debug("【user1】= {}", user1);

        // 再次查询
        User user2 = userService.get(1L);
        log.debug("【user2】= {}", user2);
        // 查看日志,只打印一次日志,证明缓存生效
    }

    /**
     * 先存,再查询,查看日志验证缓存
     */
    @Test
    public void getAfterSave() {
        userService.saveOrUpdate(new User(4L, "user4"));

        User user = userService.get(4L);
        log.debug("【user】= {}", user);
        // 查看日志,只打印保存用户的日志,查询是未触发查询日志,因此缓存生效
    }

    /**
     * 测试删除,查看redis是否存在缓存数据
     */
    @Test
    public void deleteUser() {
        // 查询一次,使ehcache中存在缓存数据
        userService.get(1L);
        // 删除,查看ehcache是否存在缓存数据
        userService.delete(1L);
    }
}
```

## 参考

- Ehcache 官网:http://www.ehcache.org/documentation/
- Spring Boot 官方文档:https://docs.spring.io/spring-boot/docs/2.1.0.RELEASE/reference/htmlsingle/#boot-features-caching-provider-ehcache2
- 博客:https://juejin.im/post/5b308de9518825748b56ae1d


================================================
FILE: demo-cache-ehcache/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 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <artifactId>demo-cache-ehcache</artifactId>
    <version>1.0.0-SNAPSHOT</version>
    <packaging>jar</packaging>

    <name>demo-cache-ehcache</name>
    <description>Demo project for Spring Boot</description>

    <parent>
        <groupId>com.xkcoding</groupId>
        <artifactId>spring-boot-demo</artifactId>
        <version>1.0.0-SNAPSHOT</version>
    </parent>

    <properties>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
        <java.version>1.8</java.version>
    </properties>

    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter</artifactId>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-cache</artifactId>
        </dependency>

        <dependency>
            <groupId>net.sf.ehcache</groupId>
            <artifactId>ehcache</artifactId>
        </dependency>

        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <optional>true</optional>
        </dependency>

        <dependency>
            <groupId>com.google.guava</groupId>
            <artifactId>guava</artifactId>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>
    </dependencies>

    <build>
        <finalName>demo-cache-ehcache</finalName>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
        </plugins>
    </build>

</project>


================================================
FILE: demo-cache-ehcache/src/main/java/com/xkcoding/cache/ehcache/SpringBootDemoCacheEhcacheApplication.java
================================================
package com.xkcoding.cache.ehcache;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cache.annotation.EnableCaching;

/**
 * <p>
 * 启动类
 * </p>
 *
 * @author yangkai.shen
 * @date Created in 2018-11-16 17:02
 */
@SpringBootApplication
@EnableCaching
public class SpringBootDemoCacheEhcacheApplication {

    public static void main(String[] args) {
        SpringApplication.run(SpringBootDemoCacheEhcacheApplication.class, args);
    }
}


================================================
FILE: demo-cache-ehcache/src/main/java/com/xkcoding/cache/ehcache/entity/User.java
================================================
package com.xkcoding.cache.ehcache.entity;

import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;

import java.io.Serializable;

/**
 * <p>
 * 用户实体
 * </p>
 *
 * @author yangkai.shen
 * @date Created in 2018-11-16 16:53
 */
@Data
@AllArgsConstructor
@NoArgsConstructor
public class User implements Serializable {
    private static final long serialVersionUID = 2892248514883451461L;
    /**
     * 主键id
     */
    private Long id;
    /**
     * 姓名
     */
    private String name;
}


================================================
FILE: demo-cache-ehcache/src/main/java/com/xkcoding/cache/ehcache/service/UserService.java
================================================
package com.xkcoding.cache.ehcache.service;

import com.xkcoding.cache.ehcache.entity.User;

/**
 * <p>
 * UserService
 * </p>
 *
 * @author yangkai.shen
 * @date Created in 2018-11-16 16:53
 */
public interface UserService {
    /**
     * 保存或修改用户
     *
     * @param user 用户对象
     * @return 操作结果
     */
    User saveOrUpdate(User user);

    /**
     * 获取用户
     *
     * @param id key值
     * @return 返回结果
     */
    User get(Long id);

    /**
     * 删除
     *
     * @param id key值
     */
    void delete(Long id);
}


================================================
FILE: demo-cache-ehcache/src/main/java/com/xkcoding/cache/ehcache/service/impl/UserServiceImpl.java
================================================
package com.xkcoding.cache.ehcache.service.impl;

import com.google.common.collect.Maps;
import com.xkcoding.cache.ehcache.entity.User;
import com.xkcoding.cache.ehcache.service.UserService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.cache.annotation.CacheEvict;
import org.springframework.cache.annotation.CachePut;
import org.springframework.cache.annotation.Cacheable;
import org.springframework.stereotype.Service;

import java.util.Map;

/**
 * <p>
 * UserService
 * </p>
 *
 * @author yangkai.shen
 * @date Created in 2018-11-16 16:54
 */
@Service
@Slf4j
public class UserServiceImpl implements UserService {
    /**
     * 模拟数据库
     */
    private static final Map<Long, User> DATABASES = Maps.newConcurrentMap();

    /**
     * 初始化数据
     */
    static {
        DATABASES.put(1L, new User(1L, "user1"));
        DATABASES.put(2L, new User(2L, "user2"));
        DATABASES.put(3L, new User(3L, "user3"));
    }

    /**
     * 保存或修改用户
     *
     * @param user 用户对象
     * @return 操作结果
     */
    @CachePut(value = "user", key = "#user.id")
    @Override
    public User saveOrUpdate(User user) {
        DATABASES.put(user.getId(), user);
        log.info("保存用户【user】= {}", user);
        return user;
    }

    /**
     * 获取用户
     *
     * @param id key值
     * @return 返回结果
     */
    @Cacheable(value = "user", key = "#id")
    @Override
    public User get(Long id) {
        // 我们假设从数据库读取
        log.info("查询用户【id】= {}", id);
        return DATABASES.get(id);
    }

    /**
     * 删除
     *
     * @param id key值
     */
    @CacheEvict(value = "user", key = "#id")
    @Override
    public void delete(Long id) {
        DATABASES.remove(id);
        log.info("删除用户【id】= {}", id);
    }
}


================================================
FILE: demo-cache-ehcache/src/main/resources/application.yml
================================================
spring:
  cache:
    type: ehcache
    ehcache:
      config: classpath:ehcache.xml
logging:
  level:
    com.xkcoding: debug

================================================
FILE: demo-cache-ehcache/src/main/resources/ehcache.xml
================================================
<!-- ehcache配置 -->
<ehcache
        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
        xsi:noNamespaceSchemaLocation="http://ehcache.org/ehcache.xsd"
        updateCheck="false">
    <!--缓存路径,用户目录下的base_ehcache目录-->
    <diskStore path="user.home/base_ehcache"/>

    <defaultCache
            maxElementsInMemory="20000"
            eternal="false"
            timeToIdleSeconds="120"
            timeToLiveSeconds="120"
            overflowToDisk="true"
            maxElementsOnDisk="10000000"
            diskPersistent="false"
            diskExpiryThreadIntervalSeconds="120"
            memoryStoreEvictionPolicy="LRU"/>

    <!--
    缓存文件名:user,同样的可以配置多个缓存
    maxElementsInMemory:内存中最多存储
    eternal:外部存储
    overflowToDisk:超出缓存到磁盘
    diskPersistent:磁盘持久化
    timeToLiveSeconds:缓存时间
    diskExpiryThreadIntervalSeconds:磁盘过期时间
    -->
    <cache name="user"
           maxElementsInMemory="20000"
           eternal="true"
           overflowToDisk="true"
           diskPersistent="false"
           timeToLiveSeconds="0"
           diskExpiryThreadIntervalSeconds="120"/>

</ehcache>

================================================
FILE: demo-cache-ehcache/src/test/java/com/xkcoding/cache/ehcache/SpringBootDemoCacheEhcacheApplicationTests.java
================================================
package com.xkcoding.cache.ehcache;

import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.junit4.SpringRunner;

@RunWith(SpringRunner.class)
@SpringBootTest
public class SpringBootDemoCacheEhcacheApplicationTests {

    @Test
    public void contextLoads() {
    }

}


================================================
FILE: demo-cache-ehcache/src/test/java/com/xkcoding/cache/ehcache/service/UserServiceTest.java
================================================
package com.xkcoding.cache.ehcache.service;

import com.xkcoding.cache.ehcache.SpringBootDemoCacheEhcacheApplicationTests;
import com.xkcoding.cache.ehcache.entity.User;
import lombok.extern.slf4j.Slf4j;
import org.junit.Test;
import org.springframework.beans.factory.annotation.Autowired;

/**
 * <p>
 * ehcache缓存测试
 * </p>
 *
 * @author yangkai.shen
 * @date Created in 2018-11-16 16:58
 */
@Slf4j
public class UserServiceTest extends SpringBootDemoCacheEhcacheApplicationTests {

    @Autowired
    private UserService userService;

    /**
     * 获取两次,查看日志验证缓存
     */
    @Test
    public void getTwice() {
        // 模拟查询id为1的用户
        User user1 = userService.get(1L);
        log.debug("【user1】= {}", user1);

        // 再次查询
        User user2 = userService.get(1L);
        log.debug("【user2】= {}", user2);
        // 查看日志,只打印一次日志,证明缓存生效
    }

    /**
     * 先存,再查询,查看日志验证缓存
     */
    @Test
    public void getAfterSave() {
        userService.saveOrUpdate(new User(4L, "user4"));

        User user = userService.get(4L);
        log.debug("【user】= {}", user);
        // 查看日志,只打印保存用户的日志,查询是未触发查询日志,因此缓存生效
    }

    /**
     * 测试删除,查看redis是否存在缓存数据
     */
    @Test
    public void deleteUser() {
        // 查询一次,使ehcache中存在缓存数据
        userService.get(1L);
        // 删除,查看ehcache是否存在缓存数据
        userService.delete(1L);
    }
}


================================================
FILE: demo-cache-redis/.gitignore
================================================
/target/
!.mvn/wrapper/maven-wrapper.jar

### STS ###
.apt_generated
.classpath
.factorypath
.project
.settings
.springBeans
.sts4-cache

### IntelliJ IDEA ###
.idea
*.iws
*.iml
*.ipr

### NetBeans ###
/nbproject/private/
/build/
/nbbuild/
/dist/
/nbdist/
/.nb-gradle/

================================================
FILE: demo-cache-redis/README.md
================================================
# spring-boot-demo-cache-redis

> 此 demo 主要演示了 Spring Boot 如何整合 redis,操作redis中的数据,并使用redis缓存数据。连接池使用  Lettuce。

## pom.xml

```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 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <artifactId>spring-boot-demo-cache-redis</artifactId>
    <version>1.0.0-SNAPSHOT</version>
    <packaging>jar</packaging>

    <name>spring-boot-demo-cache-redis</name>
    <description>Demo project for Spring Boot</description>

    <parent>
        <groupId>com.xkcoding</groupId>
        <artifactId>spring-boot-demo</artifactId>
        <version>1.0.0-SNAPSHOT</version>
    </parent>

    <properties>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
        <java.version>1.8</java.version>
    </properties>

    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter</artifactId>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-data-redis</artifactId>
        </dependency>

        <!-- 对象池,使用redis时必须引入 -->
        <dependency>
            <groupId>org.apache.commons</groupId>
            <artifactId>commons-pool2</artifactId>
        </dependency>

        <!-- 引入 jackson 对象json转换 -->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-json</artifactId>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>

        <dependency>
            <groupId>com.google.guava</groupId>
            <artifactId>guava</artifactId>
        </dependency>

        <dependency>
            <groupId>cn.hutool</groupId>
            <artifactId>hutool-all</artifactId>
        </dependency>

        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <optional>true</optional>
        </dependency>
    </dependencies>

    <build>
        <finalName>spring-boot-demo-cache-redis</finalName>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
        </plugins>
    </build>

</project>
```

## application.yml

```yaml
spring:
  redis:
    host: localhost
    # 连接超时时间(记得添加单位,Duration)
    timeout: 10000ms
    # Redis默认情况下有16个分片,这里配置具体使用的分片
    # database: 0
    lettuce:
      pool:
        # 连接池最大连接数(使用负值表示没有限制) 默认 8
        max-active: 8
        # 连接池最大阻塞等待时间(使用负值表示没有限制) 默认 -1
        max-wait: -1ms
        # 连接池中的最大空闲连接 默认 8
        max-idle: 8
        # 连接池中的最小空闲连接 默认 0
        min-idle: 0
  cache:
    # 一般来说是不用配置的,Spring Cache 会根据依赖的包自行装配
    type: redis
logging:
  level:
    com.xkcoding: debug
```

## RedisConfig.java

```java
/**
 * <p>
 * redis配置
 * </p>
 *
 * @author yangkai.shen
 * @date Created in 2018-11-15 16:41
 */
@Configuration
@AutoConfigureAfter(RedisAutoConfiguration.class)
@EnableCaching
public class RedisConfig {

    /**
     * 默认情况下的模板只能支持RedisTemplate<String, String>,也就是只能存入字符串,因此支持序列化
     */
    @Bean
    public RedisTemplate<String, Serializable> redisCacheTemplate(LettuceConnectionFactory redisConnectionFactory) {
        RedisTemplate<String, Serializable> template = new RedisTemplate<>();
        template.setKeySerializer(new StringRedisSerializer());
        template.setValueSerializer(new GenericJackson2JsonRedisSerializer());
        template.setConnectionFactory(redisConnectionFactory);
        return template;
    }

    /**
     * 配置使用注解的时候缓存配置,默认是序列化反序列化的形式,加上此配置则为 json 形式
     */
    @Bean
    public CacheManager cacheManager(RedisConnectionFactory factory) {
        // 配置序列化
        RedisCacheConfiguration config = RedisCacheConfiguration.defaultCacheConfig();
        RedisCacheConfiguration redisCacheConfiguration = config.serializeKeysWith(RedisSerializationContext.SerializationPair.fromSerializer(new StringRedisSerializer())).serializeValuesWith(RedisSerializationContext.SerializationPair.fromSerializer(new GenericJackson2JsonRedisSerializer()));

        return RedisCacheManager.builder(factory).cacheDefaults(redisCacheConfiguration).build();
    }
}
```

## UserServiceImpl.java

```java
/**
 * <p>
 * UserService
 * </p>
 *
 * @author yangkai.shen
 * @date Created in 2018-11-15 16:45
 */
@Service
@Slf4j
public class UserServiceImpl implements UserService {
    /**
     * 模拟数据库
     */
    private static final Map<Long, User> DATABASES = Maps.newConcurrentMap();

    /**
     * 初始化数据
     */
    static {
        DATABASES.put(1L, new User(1L, "user1"));
        DATABASES.put(2L, new User(2L, "user2"));
        DATABASES.put(3L, new User(3L, "user3"));
    }

    /**
     * 保存或修改用户
     *
     * @param user 用户对象
     * @return 操作结果
     */
    @CachePut(value = "user", key = "#user.id")
    @Override
    public User saveOrUpdate(User user) {
        DATABASES.put(user.getId(), user);
        log.info("保存用户【user】= {}", user);
        return user;
    }

    /**
     * 获取用户
     *
     * @param id key值
     * @return 返回结果
     */
    @Cacheable(value = "user", key = "#id")
    @Override
    public User get(Long id) {
        // 我们假设从数据库读取
        log.info("查询用户【id】= {}", id);
        return DATABASES.get(id);
    }

    /**
     * 删除
     *
     * @param id key值
     */
    @CacheEvict(value = "user", key = "#id")
    @Override
    public void delete(Long id) {
        DATABASES.remove(id);
        log.info("删除用户【id】= {}", id);
    }
}
```

## RedisTest.java

> 主要测试使用 `RedisTemplate` 操作 `Redis` 中的数据:
>
> - opsForValue:对应 String(字符串)
> - opsForZSet:对应 ZSet(有序集合)
> - opsForHash:对应 Hash(哈希)
> - opsForList:对应 List(列表)
> - opsForSet:对应 Set(集合)
> - opsForGeo:** 对应 GEO(地理位置)

```java
/**
 * <p>
 * Redis测试
 * </p>
 *
 * @author yangkai.shen
 * @date Created in 2018-11-15 17:17
 */
@Slf4j
public class RedisTest extends SpringBootDemoCacheRedisApplicationTests {

    @Autowired
    private StringRedisTemplate stringRedisTemplate;

    @Autowired
    private RedisTemplate<String, Serializable> redisCacheTemplate;

    /**
     * 测试 Redis 操作
     */
    @Test
    public void get() {
        // 测试线程安全,程序结束查看redis中count的值是否为1000
        ExecutorService executorService = Executors.newFixedThreadPool(1000);
        IntStream.range(0, 1000).forEach(i -> executorService.execute(() -> stringRedisTemplate.opsForValue().increment("count", 1)));

        stringRedisTemplate.opsForValue().set("k1", "v1");
        String k1 = stringRedisTemplate.opsForValue().get("k1");
        log.debug("【k1】= {}", k1);

        // 以下演示整合,具体Redis命令可以参考官方文档
        String key = "xkcoding:user:1";
        redisCacheTemplate.opsForValue().set(key, new User(1L, "user1"));
        // 对应 String(字符串)
        User user = (User) redisCacheTemplate.opsForValue().get(key);
        log.debug("【user】= {}", user);
    }
}

```

## UserServiceTest.java

> 主要测试使用Redis缓存是否起效

```java
/**
 * <p>
 * Redis - 缓存测试
 * </p>
 *
 * @author yangkai.shen
 * @date Created in 2018-11-15 16:53
 */
@Slf4j
public class UserServiceTest extends SpringBootDemoCacheRedisApplicationTests {
    @Autowired
    private UserService userService;

    /**
     * 获取两次,查看日志验证缓存
     */
    @Test
    public void getTwice() {
        // 模拟查询id为1的用户
        User user1 = userService.get(1L);
        log.debug("【user1】= {}", user1);

        // 再次查询
        User user2 = userService.get(1L);
        log.debug("【user2】= {}", user2);
        // 查看日志,只打印一次日志,证明缓存生效
    }

    /**
     * 先存,再查询,查看日志验证缓存
     */
    @Test
    public void getAfterSave() {
        userService.saveOrUpdate(new User(4L, "测试中文"));

        User user = userService.get(4L);
        log.debug("【user】= {}", user);
        // 查看日志,只打印保存用户的日志,查询是未触发查询日志,因此缓存生效
    }

    /**
     * 测试删除,查看redis是否存在缓存数据
     */
    @Test
    public void deleteUser() {
        // 查询一次,使redis中存在缓存数据
        userService.get(1L);
        // 删除,查看redis是否存在缓存数据
        userService.delete(1L);
    }

}
```

## 参考

- spring-data-redis 官方文档:https://docs.spring.io/spring-data/redis/docs/2.0.1.RELEASE/reference/html/
- redis 文档:https://redis.io/documentation
- redis 中文文档:http://www.redis.cn/commands.html


================================================
FILE: demo-cache-redis/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 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <artifactId>demo-cache-redis</artifactId>
    <version>1.0.0-SNAPSHOT</version>
    <packaging>jar</packaging>

    <name>demo-cache-redis</name>
    <description>Demo project for Spring Boot</description>

    <parent>
        <groupId>com.xkcoding</groupId>
        <artifactId>spring-boot-demo</artifactId>
        <version>1.0.0-SNAPSHOT</version>
    </parent>

    <properties>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
        <java.version>1.8</java.version>
    </properties>

    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter</artifactId>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-data-redis</artifactId>
        </dependency>

        <!-- 对象池,使用redis时必须引入 -->
        <dependency>
            <groupId>org.apache.commons</groupId>
            <artifactId>commons-pool2</artifactId>
        </dependency>

        <!-- 引入 jackson 对象json转换 -->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-json</artifactId>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>

        <dependency>
            <groupId>com.google.guava</groupId>
            <artifactId>guava</artifactId>
        </dependency>

        <dependency>
            <groupId>cn.hutool</groupId>
            <artifactId>hutool-all</artifactId>
        </dependency>

        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <optional>true</optional>
        </dependency>
    </dependencies>

    <build>
        <finalName>demo-cache-redis</finalName>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
        </plugins>
    </build>

</project>


================================================
FILE: demo-cache-redis/src/main/java/com/xkcoding/cache/redis/SpringBootDemoCacheRedisApplication.java
================================================
package com.xkcoding.cache.redis;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

@SpringBootApplication
public class SpringBootDemoCacheRedisApplication {

    public static void main(String[] args) {
        SpringApplication.run(SpringBootDemoCacheRedisApplication.class, args);
    }
}


================================================
FILE: demo-cache-redis/src/main/java/com/xkcoding/cache/redis/config/RedisConfig.java
================================================
package com.xkcoding.cache.redis.config;

import org.springframework.boot.autoconfigure.AutoConfigureAfter;
import org.springframework.boot.autoconfigure.data.redis.RedisAutoConfiguration;
import org.springframework.cache.CacheManager;
import org.springframework.cache.annotation.EnableCaching;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.data.redis.cache.RedisCacheConfiguration;
import org.springframework.data.redis.cache.RedisCacheManager;
import org.springframework.data.redis.connection.RedisConnectionFactory;
import org.springframework.data.redis.connection.lettuce.LettuceConnectionFactory;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.data.redis.serializer.GenericJackson2JsonRedisSerializer;
import org.springframework.data.redis.serializer.RedisSerializationContext;
import org.springframework.data.redis.serializer.StringRedisSerializer;

import java.io.Serializable;

/**
 * <p>
 * redis配置
 * </p>
 *
 * @author yangkai.shen
 * @date Created in 2018-11-15 16:41
 */
@Configuration
@AutoConfigureAfter(RedisAutoConfiguration.class)
@EnableCaching
public class RedisConfig {

    /**
     * 默认情况下的模板只能支持RedisTemplate<String, String>,也就是只能存入字符串,因此支持序列化
     */
    @Bean
    public RedisTemplate<String, Serializable> redisCacheTemplate(LettuceConnectionFactory redisConnectionFactory) {
        RedisTemplate<String, Serializable> template = new RedisTemplate<>();
        template.setKeySerializer(new StringRedisSerializer());
        template.setValueSerializer(new GenericJackson2JsonRedisSerializer());
        template.setConnectionFactory(redisConnectionFactory);
        return template;
    }

    /**
     * 配置使用注解的时候缓存配置,默认是序列化反序列化的形式,加上此配置则为 json 形式
     */
    @Bean
    public CacheManager cacheManager(RedisConnectionFactory factory) {
        // 配置序列化
        RedisCacheConfiguration config = RedisCacheConfiguration.defaultCacheConfig();
        RedisCacheConfiguration redisCacheConfiguration = config.serializeKeysWith(RedisSerializationContext.SerializationPair.fromSerializer(new StringRedisSerializer())).serializeValuesWith(RedisSerializationContext.SerializationPair.fromSerializer(new GenericJackson2JsonRedisSerializer()));

        return RedisCacheManager.builder(factory).cacheDefaults(redisCacheConfiguration).build();
    }
}


================================================
FILE: demo-cache-redis/src/main/java/com/xkcoding/cache/redis/entity/User.java
================================================
package com.xkcoding.cache.redis.entity;

import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;

import java.io.Serializable;

/**
 * <p>
 * 用户实体
 * </p>
 *
 * @author yangkai.shen
 * @date Created in 2018-11-15 16:39
 */
@Data
@AllArgsConstructor
@NoArgsConstructor
public class User implements Serializable {
    private static final long serialVersionUID = 2892248514883451461L;
    /**
     * 主键id
     */
    private Long id;
    /**
     * 姓名
     */
    private String name;
}


================================================
FILE: demo-cache-redis/src/main/java/com/xkcoding/cache/redis/service/UserService.java
================================================
package com.xkcoding.cache.redis.service;

import com.xkcoding.cache.redis.entity.User;

/**
 * <p>
 * UserService
 * </p>
 *
 * @author yangkai.shen
 * @date Created in 2018-11-15 16:45
 */
public interface UserService {
    /**
     * 保存或修改用户
     *
     * @param user 用户对象
     * @return 操作结果
     */
    User saveOrUpdate(User user);

    /**
     * 获取用户
     *
     * @param id key值
     * @return 返回结果
     */
    User get(Long id);

    /**
     * 删除
     *
     * @param id key值
     */
    void delete(Long id);
}


================================================
FILE: demo-cache-redis/src/main/java/com/xkcoding/cache/redis/service/impl/UserServiceImpl.java
================================================
package com.xkcoding.cache.redis.service.impl;

import com.google.common.collect.Maps;
import com.xkcoding.cache.redis.entity.User;
import com.xkcoding.cache.redis.service.UserService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.cache.annotation.CacheEvict;
import org.springframework.cache.annotation.CachePut;
import org.springframework.cache.annotation.Cacheable;
import org.springframework.stereotype.Service;

import java.util.Map;

/**
 * <p>
 * UserService
 * </p>
 *
 * @author yangkai.shen
 * @date Created in 2018-11-15 16:45
 */
@Service
@Slf4j
public class UserServiceImpl implements UserService {
    /**
     * 模拟数据库
     */
    private static final Map<Long, User> DATABASES = Maps.newConcurrentMap();

    /**
     * 初始化数据
     */
    static {
        DATABASES.put(1L, new User(1L, "user1"));
        DATABASES.put(2L, new User(2L, "user2"));
        DATABASES.put(3L, new User(3L, "user3"));
    }

    /**
     * 保存或修改用户
     *
     * @param user 用户对象
     * @return 操作结果
     */
    @CachePut(value = "user", key = "#user.id")
    @Override
    public User saveOrUpdate(User user) {
        DATABASES.put(user.getId(), user);
        log.info("保存用户【user】= {}", user);
        return user;
    }

    /**
     * 获取用户
     *
     * @param id key值
     * @return 返回结果
     */
    @Cacheable(value = "user", key = "#id")
    @Override
    public User get(Long id) {
        // 我们假设从数据库读取
        log.info("查询用户【id】= {}", id);
        return DATABASES.get(id);
    }

    /**
     * 删除
     *
     * @param id key值
     */
    @CacheEvict(value = "user", key = "#id")
    @Override
    public void delete(Long id) {
        DATABASES.remove(id);
        log.info("删除用户【id】= {}", id);
    }
}


================================================
FILE: demo-cache-redis/src/main/resources/application.yml
================================================
spring:
  redis:
    host: localhost
    # 连接超时时间(记得添加单位,Duration)
    timeout: 10000ms
    # Redis默认情况下有16个分片,这里配置具体使用的分片
    # database: 0
    lettuce:
      pool:
        # 连接池最大连接数(使用负值表示没有限制) 默认 8
        max-active: 8
        # 连接池最大阻塞等待时间(使用负值表示没有限制) 默认 -1
        max-wait: -1ms
        # 连接池中的最大空闲连接 默认 8
        max-idle: 8
        # 连接池中的最小空闲连接 默认 0
        min-idle: 0
  cache:
    # 一般来说是不用配置的,Spring Cache 会根据依赖的包自行装配
    type: redis
logging:
  level:
    com.xkcoding: debug


================================================
FILE: demo-cache-redis/src/test/java/com/xkcoding/cache/redis/RedisTest.java
================================================
package com.xkcoding.cache.redis;

import com.xkcoding.cache.redis.entity.User;
import lombok.extern.slf4j.Slf4j;
import org.junit.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.data.redis.core.StringRedisTemplate;

import java.io.Serializable;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.stream.IntStream;

/**
 * <p>
 * Redis测试
 * </p>
 *
 * @author yangkai.shen
 * @date Created in 2018-11-15 17:17
 */
@Slf4j
public class RedisTest extends SpringBootDemoCacheRedisApplicationTests {

    @Autowired
    private StringRedisTemplate stringRedisTemplate;

    @Autowired
    private RedisTemplate<String, Serializable> redisCacheTemplate;

    /**
     * 测试 Redis 操作
     */
    @Test
    public void get() {
        // 测试线程安全,程序结束查看redis中count的值是否为1000
        ExecutorService executorService = Executors.newFixedThreadPool(1000);
        IntStream.range(0, 1000).forEach(i -> executorService.execute(() -> stringRedisTemplate.opsForValue().increment("count", 1)));

        stringRedisTemplate.opsForValue().set("k1", "v1");
        String k1 = stringRedisTemplate.opsForValue().get("k1");
        log.debug("【k1】= {}", k1);

        // 以下演示整合,具体Redis命令可以参考官方文档
        String key = "xkcoding:user:1";
        redisCacheTemplate.opsForValue().set(key, new User(1L, "user1"));
        // 对应 String(字符串)
        User user = (User) redisCacheTemplate.opsForValue().get(key);
        log.debug("【user】= {}", user);
    }
}


================================================
FILE: demo-cache-redis/src/test/java/com/xkcoding/cache/redis/SpringBootDemoCacheRedisApplicationTests.java
================================================
package com.xkcoding.cache.redis;

import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.junit4.SpringRunner;

@RunWith(SpringRunner.class)
@SpringBootTest
public class SpringBootDemoCacheRedisApplicationTests {

    @Test
    public void contextLoads() {
    }

}


================================================
FILE: demo-cache-redis/src/test/java/com/xkcoding/cache/redis/service/UserServiceTest.java
================================================
package com.xkcoding.cache.redis.service;

import com.xkcoding.cache.redis.SpringBootDemoCacheRedisApplicationTests;
import com.xkcoding.cache.redis.entity.User;
import lombok.extern.slf4j.Slf4j;
import org.junit.Test;
import org.springframework.beans.factory.annotation.Autowired;

/**
 * <p>
 * Redis - 缓存测试
 * </p>
 *
 * @author yangkai.shen
 * @date Created in 2018-11-15 16:53
 */
@Slf4j
public class UserServiceTest extends SpringBootDemoCacheRedisApplicationTests {
    @Autowired
    private UserService userService;

    /**
     * 获取两次,查看日志验证缓存
     */
    @Test
    public void getTwice() {
        // 模拟查询id为1的用户
        User user1 = userService.get(1L);
        log.debug("【user1】= {}", user1);

        // 再次查询
        User user2 = userService.get(1L);
        log.debug("【user2】= {}", user2);
        // 查看日志,只打印一次日志,证明缓存生效
    }

    /**
     * 先存,再查询,查看日志验证缓存
     */
    @Test
    public void getAfterSave() {
        userService.saveOrUpdate(new User(4L, "测试中文"));

        User user = userService.get(4L);
        log.debug("【user】= {}", user);
        // 查看日志,只打印保存用户的日志,查询是未触发查询日志,因此缓存生效
    }

    /**
     * 测试删除,查看redis是否存在缓存数据
     */
    @Test
    public void deleteUser() {
        // 查询一次,使redis中存在缓存数据
        userService.get(1L);
        // 删除,查看redis是否存在缓存数据
        userService.delete(1L);
    }

}


================================================
FILE: demo-codegen/.gitignore
================================================
/target/
!.mvn/wrapper/maven-wrapper.jar

### STS ###
.apt_generated
.classpath
.factorypath
.project
.settings
.springBeans
.sts4-cache

### IntelliJ IDEA ###
.idea
*.iws
*.iml
*.ipr

### NetBeans ###
/nbproject/private/
/nbbuild/
/dist/
/nbdist/
/.nb-gradle/
/build/

### VS Code ###
.vscode/


================================================
FILE: demo-codegen/README.md
================================================
# spring-boot-demo-codegen

> 此 demo 主要演示了 Spring Boot 使用**模板技术**生成代码,并提供前端页面,可生成 Entity/Mapper/Service/Controller 等代码。

## 1. 主要功能

1. 使用 `velocity` 代码生成
2. 暂时支持mysql数据库的代码生成
3. 提供前端页面展示,并下载代码压缩包

> 注意:① Entity里使用lombok,简化代码 ② Mapper 和 Service 层集成 Mybatis-Plus 简化代码

## 2. 运行

1. 运行 `SpringBootDemoCodegenApplication` 启动项目
2. 打开浏览器,输入 http://localhost:8080/demo/index.html
3. 输入查询条件,生成代码

## 3. 关键代码

### 3.1. pom.xml

```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 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <artifactId>spring-boot-demo-codegen</artifactId>
    <version>1.0.0-SNAPSHOT</version>
    <packaging>jar</packaging>

    <name>spring-boot-demo-codegen</name>
    <description>Demo project for Spring Boot</description>

    <parent>
        <groupId>com.xkcoding</groupId>
        <artifactId>spring-boot-demo</artifactId>
        <version>1.0.0-SNAPSHOT</version>
    </parent>

    <properties>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
        <java.version>1.8</java.version>
    </properties>

    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
            <exclusions>
                <exclusion>
                    <groupId>org.springframework.boot</groupId>
                    <artifactId>spring-boot-starter-tomcat</artifactId>
                </exclusion>
            </exclusions>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-undertow</artifactId>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>

        <dependency>
            <groupId>com.zaxxer</groupId>
            <artifactId>HikariCP</artifactId>
        </dependency>

        <!--velocity代码生成使用模板 -->
        <dependency>
            <groupId>org.apache.velocity</groupId>
            <artifactId>velocity</artifactId>
            <version>1.7</version>
        </dependency>

        <dependency>
            <groupId>org.apache.commons</groupId>
            <artifactId>commons-text</artifactId>
            <version>1.6</version>
        </dependency>

        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
        </dependency>

        <dependency>
            <groupId>cn.hutool</groupId>
            <artifactId>hutool-all</artifactId>
        </dependency>

        <dependency>
            <groupId>com.google.guava</groupId>
            <artifactId>guava</artifactId>
        </dependency>

        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <optional>true</optional>
        </dependency>
    </dependencies>

    <build>
        <finalName>spring-boot-demo-codegen</finalName>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
        </plugins>
    </build>

</project>
```

### 3.2. 代码生成器配置

```properties
#代码生成器,配置信息
mainPath=com.xkcoding
#包名
package=com.xkcoding
moduleName=generator
#作者
author=Yangkai.Shen
#表前缀(类名不会包含表前缀)
tablePrefix=tb_
#类型转换,配置信息
tinyint=Integer
smallint=Integer
mediumint=Integer
int=Integer
integer=Integer
bigint=Long
float=Float
double=Double
decimal=BigDecimal
bit=Boolean
char=String
varchar=String
tinytext=String
text=String
mediumtext=String
longtext=String
date=LocalDateTime
datetime=LocalDateTime
timestamp=LocalDateTime
```

### 3.3. CodeGenUtil.java

```java
/**
 * <p>
 * 代码生成器   工具类
 * </p>
 *
 * @author yangkai.shen
 * @date Created in 2019-03-22 09:27
 */
@Slf4j
@UtilityClass
public class CodeGenUtil {

    private final String ENTITY_JAVA_VM = "Entity.java.vm";
    private final String MAPPER_JAVA_VM = "Mapper.java.vm";
    private final String SERVICE_JAVA_VM = "Service.java.vm";
    private final String SERVICE_IMPL_JAVA_VM = "ServiceImpl.java.vm";
    private final String CONTROLLER_JAVA_VM = "Controller.java.vm";
    private final String MAPPER_XML_VM = "Mapper.xml.vm";
    private final String API_JS_VM = "api.js.vm";

    private List<String> getTemplates() {
        List<String> templates = new ArrayList<>();
        templates.add("template/Entity.java.vm");
        templates.add("template/Mapper.java.vm");
        templates.add("template/Mapper.xml.vm");
        templates.add("template/Service.java.vm");
        templates.add("template/ServiceImpl.java.vm");
        templates.add("template/Controller.java.vm");

        templates.add("template/api.js.vm");
        return templates;
    }

    /**
     * 生成代码
     */
    public void generatorCode(GenConfig genConfig, Entity table, List<Entity> columns, ZipOutputStream zip) {
        //配置信息
        Props props = getConfig();
        boolean hasBigDecimal = false;
        //表信息
        TableEntity tableEntity = new TableEntity();
        tableEntity.setTableName(table.getStr("tableName"));

        if (StrUtil.isNotBlank(genConfig.getComments())) {
            tableEntity.setComments(genConfig.getComments());
        } else {
            tableEntity.setComments(table.getStr("tableComment"));
        }

        String tablePrefix;
        if (StrUtil.isNotBlank(genConfig.getTablePrefix())) {
            tablePrefix = genConfig.getTablePrefix();
        } else {
            tablePrefix = props.getStr("tablePrefix");
        }

        //表名转换成Java类名
        String className = tableToJava(tableEntity.getTableName(), tablePrefix);
        tableEntity.setCaseClassName(className);
        tableEntity.setLowerClassName(StrUtil.lowerFirst(className));

        //列信息
        List<ColumnEntity> columnList = Lists.newArrayList();
        for (Entity column : columns) {
            ColumnEntity columnEntity = new ColumnEntity();
            columnEntity.setColumnName(column.getStr("columnName"));
            columnEntity.setDataType(column.getStr("dataType"));
            columnEntity.setComments(column.getStr("columnComment"));
            columnEntity.setExtra(column.getStr("extra"));

            //列名转换成Java属性名
            String attrName = columnToJava(columnEntity.getColumnName());
            columnEntity.setCaseAttrName(attrName);
            columnEntity.setLowerAttrName(StrUtil.lowerFirst(attrName));

            //列的数据类型,转换成Java类型
            String attrType = props.getStr(columnEntity.getDataType(), "unknownType");
            columnEntity.setAttrType(attrType);
            if (!hasBigDecimal && "BigDecimal".equals(attrType)) {
                hasBigDecimal = true;
            }
            //是否主键
            if ("PRI".equalsIgnoreCase(column.getStr("columnKey")) && tableEntity.getPk() == null) {
                tableEntity.setPk(columnEntity);
            }

            columnList.add(columnEntity);
        }
        tableEntity.setColumns(columnList);

        //没主键,则第一个字段为主键
        if (tableEntity.getPk() == null) {
            tableEntity.setPk(tableEntity.getColumns().get(0));
        }

        //设置velocity资源加载器
        Properties prop = new Properties();
        prop.put("file.resource.loader.class", "org.apache.velocity.runtime.resource.loader.ClasspathResourceLoader");
        Velocity.init(prop);
        //封装模板数据
        Map<String, Object> map = new HashMap<>(16);
        map.put("tableName", tableEntity.getTableName());
        map.put("pk", tableEntity.getPk());
        map.put("className", tableEntity.getCaseClassName());
        map.put("classname", tableEntity.getLowerClassName());
        map.put("pathName", tableEntity.getLowerClassName().toLowerCase());
        map.put("columns", tableEntity.getColumns());
        map.put("hasBigDecimal", hasBigDecimal);
        map.put("datetime", DateUtil.now());
        map.put("year", DateUtil.year(new Date()));

        if (StrUtil.isNotBlank(genConfig.getComments())) {
            map.put("comments", genConfig.getComments());
        } else {
            map.put("comments", tableEntity.getComments());
        }

        if (StrUtil.isNotBlank(genConfig.getAuthor())) {
            map.put("author", genConfig.getAuthor());
        } else {
            map.put("author", props.getStr("author"));
        }

        if (StrUtil.isNotBlank(genConfig.getModuleName())) {
            map.put("moduleName", genConfig.getModuleName());
        } else {
            map.put("moduleName", props.getStr("moduleName"));
        }

        if (StrUtil.isNotBlank(genConfig.getPackageName())) {
            map.put("package", genConfig.getPackageName());
            map.put("mainPath", genConfig.getPackageName());
        } else {
            map.put("package", props.getStr("package"));
            map.put("mainPath", props.getStr("mainPath"));
        }
        VelocityContext context = new VelocityContext(map);

        //获取模板列表
        List<String> templates = getTemplates();
        for (String template : templates) {
            //渲染模板
            StringWriter sw = new StringWriter();
            Template tpl = Velocity.getTemplate(template, CharsetUtil.UTF_8);
            tpl.merge(context, sw);

            try {
                //添加到zip
                zip.putNextEntry(new ZipEntry(Objects.requireNonNull(getFileName(template, tableEntity.getCaseClassName(), map
                        .get("package")
                        .toString(), map.get("moduleName").toString()))));
                IoUtil.write(zip, StandardCharsets.UTF_8, false, sw.toString());
                IoUtil.close(sw);
                zip.closeEntry();
            } catch (IOException e) {
                throw new RuntimeException("渲染模板失败,表名:" + tableEntity.getTableName(), e);
            }
        }
    }


    /**
     * 列名转换成Java属性名
     */
    private String columnToJava(String columnName) {
        return WordUtils.capitalizeFully(columnName, new char[]{'_'}).replace("_", "");
    }

    /**
     * 表名转换成Java类名
     */
    private String tableToJava(String tableName, String tablePrefix) {
        if (StrUtil.isNotBlank(tablePrefix)) {
            tableName = tableName.replaceFirst(tablePrefix, "");
        }
        return columnToJava(tableName);
    }

    /**
     * 获取配置信息
     */
    private Props getConfig() {
        Props props = new Props("generator.properties");
        props.autoLoad(true);
        return props;
    }

    /**
     * 获取文件名
     */
    private String getFileName(String template, String className, String packageName, String moduleName) {
        // 包路径
        String packagePath = GenConstants.SIGNATURE + File.separator + "src" + File.separator + "main" + File.separator + "java" + File.separator;
        // 资源路径
        String resourcePath = GenConstants.SIGNATURE + File.separator + "src" + File.separator + "main" + File.separator + "resources" + File.separator;
        // api路径
        String apiPath = GenConstants.SIGNATURE + File.separator + "api" + File.separator;

        if (StrUtil.isNotBlank(packageName)) {
            packagePath += packageName.replace(".", File.separator) + File.separator + moduleName + File.separator;
        }

        if (template.contains(ENTITY_JAVA_VM)) {
            return packagePath + "entity" + File.separator + className + ".java";
        }

        if (template.contains(MAPPER_JAVA_VM)) {
            return packagePath + "mapper" + File.separator + className + "Mapper.java";
        }

        if (template.contains(SERVICE_JAVA_VM)) {
            return packagePath + "service" + File.separator + className + "Service.java";
        }

        if (template.contains(SERVICE_IMPL_JAVA_VM)) {
            return packagePath + "service" + File.separator + "impl" + File.separator + className + "ServiceImpl.java";
        }

        if (template.contains(CONTROLLER_JAVA_VM)) {
            return packagePath + "controller" + File.separator + className + "Controller.java";
        }

        if (template.contains(MAPPER_XML_VM)) {
            return resourcePath + "mapper" + File.separator + className + "Mapper.xml";
        }

        if (template.contains(API_JS_VM)) {
            return apiPath + className.toLowerCase() + ".js";
        }

        return null;
    }
}
```

### 3.4. 其余代码参见demo

## 4. 演示

<video id="video" controls="" preload="none">
      <source id="mp4" src="https://static.xkcoding.com/code/spring-boot-demo/codegen/codegen.mp4" type="video/mp4">
      <p>您的浏览器版本过低,不支持播放视频演示,可下载演示视频观看,https://static.xkcoding.com/code/spring-boot-demo/codegen/codegen.mp4</p>
    </video>

## 5. 参考

- [基于人人开源 自动构建项目_V1](https://qq343509740.gitee.io/2018/12/20/%E7%AC%94%E8%AE%B0/%E8%87%AA%E5%8A%A8%E6%9E%84%E5%BB%BA%E9%A1%B9%E7%9B%AE/%E5%9F%BA%E4%BA%8E%E4%BA%BA%E4%BA%BA%E5%BC%80%E6%BA%90%20%E8%87%AA%E5%8A%A8%E6%9E%84%E5%BB%BA%E9%A1%B9%E7%9B%AE_V1/)

- [Mybatis-Plus代码生成器](https://mybatis.plus/guide/generator.html#%E6%B7%BB%E5%8A%A0%E4%BE%9D%E8%B5%96)


================================================
FILE: demo-codegen/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 http://maven.apache.org/xsd/maven-4.0.0.xsd">
  <modelVersion>4.0.0</modelVersion>

  <artifactId>demo-codegen</artifactId>
  <version>1.0.0-SNAPSHOT</version>
  <packaging>jar</packaging>

    <name>demo-codegen</name>
  <description>Demo project for Spring Boot</description>

  <parent>
    <groupId>com.xkcoding</groupId>
    <artifactId>spring-boot-demo</artifactId>
    <version>1.0.0-SNAPSHOT</version>
  </parent>

  <properties>
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
    <java.version>1.8</java.version>
  </properties>

  <dependencies>
    <dependency>
      <groupId>org.springframework.boot</groupId>
      <artifactId>spring-boot-starter-web</artifactId>
      <exclusions>
        <exclusion>
          <groupId>org.springframework.boot</groupId>
          <artifactId>spring-boot-starter-tomcat</artifactId>
        </exclusion>
      </exclusions>
    </dependency>

    <dependency>
      <groupId>org.springframework.boot</groupId>
      <artifactId>spring-boot-starter-undertow</artifactId>
    </dependency>

    <dependency>
      <groupId>org.springframework.boot</groupId>
      <artifactId>spring-boot-starter-test</artifactId>
      <scope>test</scope>
    </dependency>

    <dependency>
      <groupId>com.zaxxer</groupId>
      <artifactId>HikariCP</artifactId>
    </dependency>

    <!--velocity代码生成使用模板 -->
    <dependency>
      <groupId>org.apache.velocity</groupId>
      <artifactId>velocity-engine-core</artifactId>
      <version>2.1</version>
    </dependency>

    <dependency>
      <groupId>org.apache.commons</groupId>
      <artifactId>commons-text</artifactId>
      <version>1.6</version>
    </dependency>

    <dependency>
      <groupId>mysql</groupId>
      <artifactId>mysql-connector-java</artifactId>
    </dependency>

    <dependency>
      <groupId>cn.hutool</groupId>
      <artifactId>hutool-all</artifactId>
    </dependency>

    <dependency>
      <groupId>com.google.guava</groupId>
      <artifactId>guava</artifactId>
    </dependency>

    <dependency>
      <groupId>org.projectlombok</groupId>
      <artifactId>lombok</artifactId>
      <optional>true</optional>
    </dependency>
  </dependencies>

  <build>
      <finalName>demo-codegen</finalName>
    <plugins>
      <plugin>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-maven-plugin</artifactId>
      </plugin>
    </plugins>
  </build>

</project>


================================================
FILE: demo-codegen/src/main/java/com/xkcoding/codegen/SpringBootDemoCodegenApplication.java
================================================
package com.xkcoding.codegen;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

/**
 * <p>
 * 启动器
 * </p>
 *
 * @author yangkai.shen
 * @date Created in 2019-03-22 09:10
 */
@SpringBootApplication
public class SpringBootDemoCodegenApplication {

    public static void main(String[] args) {
        SpringApplication.run(SpringBootDemoCodegenApplication.class, args);
    }

}


================================================
FILE: demo-codegen/src/main/java/com/xkcoding/codegen/common/IResultCode.java
================================================
package com.xkcoding.codegen.common;

/**
 * <p>
 * 统一状态码接口
 * </p>
 *
 * @author yangkai.shen
 * @date Created in 2019-03-21 16:28
 */
public interface IResultCode {
    /**
     * 获取状态码
     *
     * @return 状态码
     */
    Integer getCode();

    /**
     * 获取返回消息
     *
     * @return 返回消息
     */
    String getMessage();
}


================================================
FILE: demo-codegen/src/main/java/com/xkcoding/codegen/common/PageResult.java
================================================
package com.xkcoding.codegen.common;

import lombok.AllArgsConstructor;
import lombok.Data;

import java.util.List;

/**
 * <p>
 * 分页结果集
 * </p>
 *
 * @author yangkai.shen
 * @date Created in 2019-03-22 11:24
 */
@Data
@AllArgsConstructor
public class PageResult<T> {
    /**
     * 总条数
     */
    private Long total;

    /**
     * 页码
     */
    private int pageNumber;

    /**
     * 每页结果数
     */
    private int pageSize;

    /**
     * 结果集
     */
    private List<T> list;
}


================================================
FILE: demo-codegen/src/main/java/com/xkcoding/codegen/common/R.java
================================================
package com.xkcoding.codegen.common;

import lombok.Data;
import lombok.NoArgsConstructor;

/**
 * <p>
 * 统一API对象返回
 * </p>
 *
 * @author yangkai.shen
 * @date Created in 2019-03-22 10:13
 */
@Data
@NoArgsConstructor
public class R<T> {
    /**
     * 状态码
     */
    private Integer code;

    /**
     * 返回消息
     */
    private String message;

    /**
     * 状态
     */
    private boolean status;

    /**
     * 返回数据
     */
    private T data;

    public R(Integer code, String message, boolean status, T data) {
        this.code = code;
        this.message = message;
        this.status = status;
        this.data = data;
    }

    public R(IResultCode resultCode, boolean status, T data) {
        this.code = resultCode.getCode();
        this.message = resultCode.getMessage();
        this.status = status;
        this.data = data;
    }

    public R(IResultCode resultCode, boolean status) {
        this.code = resultCode.getCode();
        this.message = resultCode.getMessage();
        this.status = status;
        this.data = null;
    }

    public static <T> R success() {
        return new R<>(ResultCode.OK, true);
    }

    public static <T> R message(String message) {
        return new R<>(ResultCode.OK.getCode(), message, true, null);
    }

    public static <T> R success(T data) {
        return new R<>(ResultCode.OK, true, data);
    }

    public static <T> R fail() {
        return new R<>(ResultCode.ERROR, false);
    }

    public static <T> R fail(IResultCode resultCode) {
        return new R<>(resultCode, false);
    }

    public static <T> R fail(Integer code, String message) {
        return new R<>(code, message, false, null);
    }

    public static <T> R fail(IResultCode resultCode, T data) {
        return new R<>(resultCode, false, data);
    }

    public static <T> R fail(Integer code, String message, T data) {
        return new R<>(code, message, false, data);
    }

}


================================================
FILE: demo-codegen/src/main/java/com/xkcoding/codegen/common/ResultCode.java
================================================
package com.xkcoding.codegen.common;

import lombok.Getter;

/**
 * <p>
 * 通用状态枚举
 * </p>
 *
 * @author yangkai.shen
 * @date Created in 2019-03-22 10:13
 */
@Getter
public enum ResultCode implements IResultCode {
    /**
     * 成功
     */
    OK(200, "成功"),
    /**
     * 失败
     */
    ERROR(500, "失败");

    /**
     * 返回码
     */
    private Integer code;

    /**
     * 返回消息
     */
    private String message;

    ResultCode(Integer code, String message) {
        this.code = code;
        this.message = message;
    }

}


================================================
FILE: demo-codegen/src/main/java/com/xkcoding/codegen/constants/GenConstants.java
================================================
package com.xkcoding.codegen.constants;

/**
 * <p>
 * 常量池
 * </p>
 *
 * @author yangkai.shen
 * @date Created in 2019-03-22 10:04
 */
public interface GenConstants {
    /**
     * 签名
     */
    String SIGNATURE = "xkcoding代码生成";
}


================================================
FILE: demo-codegen/src/main/java/com/xkcoding/codegen/controller/CodeGenController.java
================================================
package com.xkcoding.codegen.controller;

import cn.hutool.core.io.IoUtil;
import com.xkcoding.codegen.common.R;
import com.xkcoding.codegen.entity.GenConfig;
import com.xkcoding.codegen.entity.TableRequest;
import com.xkcoding.codegen.service.CodeGenService;
import lombok.AllArgsConstructor;
import lombok.SneakyThrows;
import org.springframework.http.HttpHeaders;
import org.springframework.web.bind.annotation.*;

import javax.servlet.http.HttpServletResponse;

/**
 * <p>
 * 代码生成器
 * </p>
 *
 * @author yangkai.shen
 * @date Created in 2019-03-22 10:11
 */
@RestController
@AllArgsConstructor
@RequestMapping("/generator")
public class CodeGenController {
    private final CodeGenService codeGenService;

    /**
     * 列表
     *
     * @param request 参数集
     * @return 数据库表
     */
    @GetMapping("/table")
    public R listTables(TableRequest request) {
        return R.success(codeGenService.listTables(request));
    }

    /**
     * 生成代码
     */
    @SneakyThrows
    @PostMapping("")
    public void generatorCode(@RequestBody GenConfig genConfig, HttpServletResponse response) {
        byte[] data = codeGenService.generatorCode(genConfig);

        response.reset();
        response.setHeader(HttpHeaders.CONTENT_DISPOSITION, String.format("attachment; filename=%s.zip", genConfig.getTableName()));
        response.addHeader(HttpHeaders.CONTENT_LENGTH, String.valueOf(data.length));
        response.setContentType("application/octet-stream; charset=UTF-8");

        IoUtil.write(response.getOutputStream(), Boolean.TRUE, data);
    }
}


================================================
FILE: demo-codegen/src/main/java/com/xkcoding/codegen/entity/ColumnEntity.java
================================================
package com.xkcoding.codegen.entity;

import lombok.Data;

/**
 * <p>
 * 列属性: https://blog.csdn.net/lkforce/article/details/79557482
 * </p>
 *
 * @author yangkai.shen
 * @date Created in 2019-03-22 09:46
 */
@Data
public class ColumnEntity {
    /**
     * 列表
     */
    private String columnName;
    /**
     * 数据类型
     */
    private String dataType;
    /**
     * 备注
     */
    private String comments;
    /**
     * 驼峰属性
     */
    private String caseAttrName;
    /**
     * 普通属性
     */
    private String lowerAttrName;
    /**
     * 属性类型
     */
    private String attrType;
    /**
     * jdbc类型
     */
    private String jdbcType;
    /**
     * 其他信息
     */
    private String extra;
}


================================================
FILE: demo-codegen/src/main/java/com/xkcoding/codegen/entity/GenConfig.java
================================================
package com.xkcoding.codegen.entity;

import lombok.Data;

/**
 * <p>
 * 生成配置
 * </p>
 *
 * @author yangkai.shen
 * @date Created in 2019-03-22 09:47
 */
@Data
public class GenConfig {
    /**
     * 请求参数
     */
    private TableRequest request;
    /**
     * 包名
     */
    private String packageName;
    /**
     * 作者
     */
    private String author;
    /**
     * 模块名称
     */
    private String moduleName;
    /**
     * 表前缀
     */
    private String tablePrefix;
    /**
     * 表名称
     */
    private String tableName;
    /**
     * 表备注
     */
    private String comments;
}


================================================
FILE: demo-codegen/src/main/java/com/xkcoding/codegen/entity/TableEntity.java
================================================
package com.xkcoding.codegen.entity;

import lombok.Data;

import java.util.List;

/**
 * <p>
 * 表属性: https://blog.csdn.net/lkforce/article/details/79557482
 * </p>
 *
 * @author yangkai.shen
 * @date Created in 2019-03-22 09:47
 */
@Data
public class TableEntity {
    /**
     * 名称
     */
    private String tableName;
    /**
     * 备注
     */
    private String comments;
    /**
     * 主键
     */
    private ColumnEntity pk;
    /**
     * 列名
     */
    private List<ColumnEntity> columns;
    /**
     * 驼峰类型
     */
    private String caseClassName;
    /**
     * 普通类型
     */
    private String lowerClassName;
}


================================================
FILE: demo-codegen/src/main/java/com/xkcoding/codegen/entity/TableRequest.java
================================================
package com.xkcoding.codegen.entity;

import lombok.Data;

/**
 * <p>
 * 表格请求参数
 * </p>
 *
 * @author yangkai.shen
 * @date Created in 2019-03-22 10:24
 */
@Data
public class TableRequest {
    /**
     * 当前页
     */
    private Integer currentPage;
    /**
     * 每页条数
     */
    private Integer pageSize;
    /**
     * jdbc-前缀
     */
    private String prepend;
    /**
     * jdbc-url
     */
    private String url;
    /**
     * 用户名
     */
    private String username;
    /**
     * 密码
     */
    private String password;
    /**
     * 表名
     */
    private String tableName;
}


================================================
FILE: demo-codegen/src/main/java/com/xkcoding/codegen/service/CodeGenService.java
================================================
package com.xkcoding.codegen.service;

import cn.hutool.db.Entity;
import com.xkcoding.codegen.common.PageResult;
import com.xkcoding.codegen.entity.GenConfig;
import com.xkcoding.codegen.entity.TableRequest;

/**
 * <p>
 * 代码生成器
 * </p>
 *
 * @author yangkai.shen
 * @date Created in 2019-03-22 10:15
 */
public interface CodeGenService {
    /**
     * 生成代码
     *
     * @param genConfig 生成配置
     * @return 代码压缩文件
     */
    byte[] generatorCode(GenConfig genConfig);

    /**
     * 分页查询表信息
     *
     * @param request 请求参数
     * @return 表名分页信息
     */
    PageResult<Entity> listTables(TableRequest request);
}


================================================
FILE: demo-codegen/src/main/java/com/xkcoding/codegen/service/impl/CodeGenServiceImpl.java
================================================
package com.xkcoding.codegen.service.impl;

import cn.hutool.core.io.IoUtil;
import cn.hutool.core.util.StrUtil;
import cn.hutool.db.Db;
import cn.hutool.db.Entity;
import cn.hutool.db.Page;
import com.xkcoding.codegen.common.PageResult;
import com.xkcoding.codegen.entity.GenConfig;
import com.xkcoding.codegen.entity.TableRequest;
import com.xkcoding.codegen.service.CodeGenService;
import com.xkcoding.codegen.utils.CodeGenUtil;
import com.xkcoding.codegen.utils.DbUtil;
import com.zaxxer.hikari.HikariDataSource;
import lombok.AllArgsConstructor;
import lombok.SneakyThrows;
import org.springframework.stereotype.Service;

import java.io.ByteArrayOutputStream;
import java.math.BigDecimal;
import java.util.List;
import java.util.zip.ZipOutputStream;

/**
 * <p>
 * 代码生成器
 * </p>
 *
 * @author yangkai.shen
 * @date Created in 2019-03-22 10:15
 */
@Service
@AllArgsConstructor
public class CodeGenServiceImpl implements CodeGenService {
    private final String TABLE_SQL_TEMPLATE = "select table_name tableName, engine, table_comment tableComment, create_time createTime from information_schema.tables where table_schema = (select database()) %s order by create_time desc";

    private final String COLUMN_SQL_TEMPLATE = "select column_name columnName, data_type dataType, column_comment columnComment, column_key columnKey, extra from information_schema.columns where table_name = ? and table_schema = (select database()) order by ordinal_position";

    private final String COUNT_SQL_TEMPLATE = "select count(1) from (%s)tmp";

    private final String PAGE_SQL_TEMPLATE = " limit ?,?";

    /**
     * 分页查询表信息
     *
     * @param request 请求参数
     * @return 表名分页信息
     */
    @Override
    @SneakyThrows
    public PageResult<Entity> listTables(TableRequest request) {
        HikariDataSource dataSource = DbUtil.buildFromTableRequest(request);
        Db db = new Db(dataSource);

        Page page = new Page(request.getCurrentPage(), request.getPageSize());
        int start = page.getStartPosition();
        int pageSize = page.getPageSize();

        String paramSql = StrUtil.EMPTY;
        if (StrUtil.isNotBlank(request.getTableName())) {
            paramSql = "and table_name like concat('%', ?, '%')";
        }
        String sql = String.format(TABLE_SQL_TEMPLATE, paramSql);
        String countSql = String.format(COUNT_SQL_TEMPLATE, sql);

        List<Entity> query;
        BigDecimal count;
        if (StrUtil.isNotBlank(request.getTableName())) {
            query = db.query(sql + PAGE_SQL_TEMPLATE, request.getTableName(), start, pageSize);
            count = (BigDecimal) db.queryNumber(countSql, request.getTableName());
        } else {
            query = db.query(sql + PAGE_SQL_TEMPLATE, start, pageSize);
            count = (BigDecimal) db.queryNumber(countSql);
        }

        PageResult<Entity> pageResult = new PageResult<>(count.longValue(), page.getPageNumber(), page.getPageSize(), query);

        dataSource.close();
        return pageResult;
    }

    /**
     * 生成代码
     *
     * @param genConfig 生成配置
     * @return 代码压缩文件
     */
    @Override
    public byte[] generatorCode(GenConfig genConfig) {
        ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
        ZipOutputStream zip = new ZipOutputStream(outputStream);

        //查询表信息
        Entity table = queryTable(genConfig.getRequest());
        //查询列信息
        List<Entity> columns = queryColumns(genConfig.getRequest());
        //生成代码
        CodeGenUtil.generatorCode(genConfig, table, columns, zip);
        IoUtil.close(zip);
        return outputStream.toByteArray();
    }

    @SneakyThrows
    private Entity queryTable(TableRequest request) {
        HikariDataSource dataSource = DbUtil.buildFromTableRequest(request);
        Db db = new Db(dataSource);

        String paramSql = StrUtil.EMPTY;
        if (StrUtil.isNotBlank(request.getTableName())) {
            paramSql = "and table_name = ?";
        }
        String sql = String.format(TABLE_SQL_TEMPLATE, paramSql);
        Entity entity = db.queryOne(sql, request.getTableName());

        dataSource.close();
        return entity;
    }

    @SneakyThrows
    private List<Entity> queryColumns(TableRequest request) {
        HikariDataSource dataSource = DbUtil.buildFromTableRequest(request);
        Db db = new Db(dataSource);

        List<Entity> query = db.query(COLUMN_SQL_TEMPLATE, request.getTableName());

        dataSource.close();
        return query;
    }

}


================================================
FILE: demo-codegen/src/main/java/com/xkcoding/codegen/utils/CodeGenUtil.java
================================================
package com.xkcoding.codegen.utils;

import cn.hutool.core.date.DateUtil;
import cn.hutool.core.io.IoUtil;
import cn.hutool.core.util.CharsetUtil;
import cn.hutool.core.util.StrUtil;
import cn.hutool.db.Entity;
import cn.hutool.setting.dialect.Props;
import com.google.common.collect.Lists;
import com.xkcoding.codegen.constants.GenConstants;
import com.xkcoding.codegen.entity.ColumnEntity;
import com.xkcoding.codegen.entity.GenConfig;
import com.xkcoding.codegen.entity.TableEntity;
import lombok.experimental.UtilityClass;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.text.WordUtils;
import org.apache.velocity.Template;
import org.apache.velocity.VelocityContext;
import org.apache.velocity.app.Velocity;

import java.io.File;
import java.io.IOException;
import java.io.StringWriter;
import java.nio.charset.StandardCharsets;
import java.util.*;
import java.util.zip.ZipEntry;
import java.util.zip.ZipOutputStream;

/**
 * <p>
 * 代码生成器   工具类
 * </p>
 *
 * @author yangkai.shen
 * @date Created in 2019-03-22 09:27
 */
@Slf4j
@UtilityClass
public class CodeGenUtil {

    private final String ENTITY_JAVA_VM = "Entity.java.vm";
    private final String MAPPER_JAVA_VM = "Mapper.java.vm";
    private final String SERVICE_JAVA_VM = "Service.java.vm";
    private final String SERVICE_IMPL_JAVA_VM = "ServiceImpl.java.vm";
    private final String CONTROLLER_JAVA_VM = "Controller.java.vm";
    private final String MAPPER_XML_VM = "Mapper.xml.vm";
    private final String API_JS_VM = "api.js.vm";

    private List<String> getTemplates() {
        List<String> templates = new ArrayList<>();
        templates.add("template/Entity.java.vm");
        templates.add("template/Mapper.java.vm");
        templates.add("template/Mapper.xml.vm");
        templates.add("template/Service.java.vm");
        templates.add("template/ServiceImpl.java.vm");
        templates.add("template/Controller.java.vm");

        templates.add("template/api.js.vm");
        return templates;
    }

    /**
     * 生成代码
     */
    public void generatorCode(GenConfig genConfig, Entity table, List<Entity> columns, ZipOutputStream zip) {
        //配置信息
        Props propsDB2Java = getConfig("generator.properties");
        Props propsDB2Jdbc = getConfig("jdbc_type.properties");

        boolean hasBigDecimal = false;
        //表信息
        TableEntity tableEntity = new TableEntity();
        tableEntity.setTableName(table.getStr("tableName"));

        if (StrUtil.isNotBlank(genConfig.getComments())) {
            tableEntity.setComments(genConfig.getComments());
        } else {
            tableEntity.setComments(table.getStr("tableComment"));
        }

        String tablePrefix;
        if (StrUtil.isNotBlank(genConfig.getTablePrefix())) {
            tablePrefix = genConfig.getTablePrefix();
        } else {
            tablePrefix = propsDB2Java.getStr("tablePrefix");
        }

        //表名转换成Java类名
        String className = tableToJava(tableEntity.getTableName(), tablePrefix);
        tableEntity.setCaseClassName(className);
        tableEntity.setLowerClassName(StrUtil.lowerFirst(className));

        //列信息
        List<ColumnEntity> columnList = Lists.newArrayList();
        for (Entity column : columns) {
            ColumnEntity columnEntity = new ColumnEntity();
            columnEntity.setColumnName(column.getStr("columnName"));
            columnEntity.setDataType(column.getStr("dataType"));
            columnEntity.setComments(column.getStr("columnComment"));
            columnEntity.setExtra(column.getStr("extra"));

            //列名转换成Java属性名
            String attrName = columnToJava(columnEntity.getColumnName());
            columnEntity.setCaseAttrName(attrName);
            columnEntity.setLowerAttrName(StrUtil.lowerFirst(attrName));

            //列的数据类型,转换成Java类型
            String attrType = propsDB2Java.getStr(columnEntity.getDataType(), "unknownType");
            columnEntity.setAttrType(attrType);
            String jdbcType = propsDB2Jdbc.getStr(columnEntity.getDataType(), "unknownType");
            columnEntity.setJdbcType(jdbcType);
            if (!hasBigDecimal && "BigDecimal".equals(attrType)) {
                hasBigDecimal = true;
            }
            //是否主键
            if ("PRI".equalsIgnoreCase(column.getStr("columnKey")) && tableEntity.getPk() == null) {
                tableEntity.setPk(columnEntity);
            }

            columnList.add(columnEntity);
        }
        tableEntity.setColumns(columnList);

        //没主键,则第一个字段为主键
        if (tableEntity.getPk() == null) {
            tableEntity.setPk(tableEntity.getColumns().get(0));
        }

        //设置velocity资源加载器
        Properties prop = new Properties();
        prop.put("file.resource.loader.class", "org.apache.velocity.runtime.resource.loader.ClasspathResourceLoader");
        Velocity.init(prop);
        //封装模板数据
        Map<String, Object> map = new HashMap<>(16);
        map.put("tableName", tableEntity.getTableName());
        map.put("pk", tableEntity.getPk());
        map.put("className", tableEntity.getCaseClassName());
        map.put("classname", tableEntity.getLowerClassName());
        map.put("pathName", tableEntity.getLowerClassName().toLowerCase());
        map.put("columns", tableEntity.getColumns());
        map.put("hasBigDecimal", hasBigDecimal);
        map.put("datetime", DateUtil.now());
        map.put("year", DateUtil.year(new Date()));

        if (StrUtil.isNotBlank(genConfig.getComments())) {
            map.put("comments", genConfig.getComments());
        } else {
            map.put("comments", tableEntity.getComments());
        }

        if (StrUtil.isNotBlank(genConfig.getAuthor())) {
            map.put("author", genConfig.getAuthor());
        } else {
            map.put("author", propsDB2Java.getStr("author"));
        }

        if (StrUtil.isNotBlank(genConfig.getModuleName())) {
            map.put("moduleName", genConfig.getModuleName());
        } else {
            map.put("moduleName", propsDB2Java.getStr("moduleName"));
        }

        if (StrUtil.isNotBlank(genConfig.getPackageName())) {
            map.put("package", genConfig.getPackageName());
            map.put("mainPath", genConfig.getPackageName());
        } else {
            map.put("package", propsDB2Java.getStr("package"));
            map.put("mainPath", propsDB2Java.getStr("mainPath"));
        }
        VelocityContext context = new VelocityContext(map);

        //获取模板列表
        List<String> templates = getTemplates();
        for (String template : templates) {
            //渲染模板
            StringWriter sw = new StringWriter();
            Template tpl = Velocity.getTemplate(template, CharsetUtil.UTF_8);
            tpl.merge(context, sw);

            try {
                //添加到zip
                zip.putNextEntry(new ZipEntry(Objects.requireNonNull(getFileName(template, tableEntity.getCaseClassName(), map.get("package").toString(), map.get("moduleName").toString()))));
                IoUtil.write(zip, StandardCharsets.UTF_8, false, sw.toString());
                IoUtil.close(sw);
                zip.closeEntry();
            } catch (IOException e) {
                throw new RuntimeException("渲染模板失败,表名:" + tableEntity.getTableName(), e);
            }
        }
    }


    /**
     * 列名转换成Java属性名
     */
    private String columnToJava(String columnName) {
        return WordUtils.capitalizeFully(columnName, new char[]{'_'}).replace("_", "");
    }

    /**
     * 表名转换成Java类名
     */
    private String tableToJava(String tableName, String tablePrefix) {
        if (StrUtil.isNotBlank(tablePrefix)) {
            tableName = tableName.replaceFirst(tablePrefix, "");
        }
        return columnToJava(tableName);
    }

    /**
     * 获取配置信息
     */
    private Props getConfig(String fileName) {
        Props props = new Props(fileName);
        props.autoLoad(true);
        return props;
    }

    /**
     * 获取文件名
     */
    private String getFileName(String template, String className, String packageName, String moduleName) {
        // 包路径
        String packagePath = GenConstants.SIGNATURE + File.separator + "src" + File.separator + "main" + File.separator + "java" + File.separator;
        // 资源路径
        String resourcePath = GenConstants.SIGNATURE + File.separator + "src" + File.separator + "main" + File.separator + "resources" + File.separator;
        // api路径
        String apiPath = GenConstants.SIGNATURE + File.separator + "api" + File.separator;

        if (StrUtil.isNotBlank(packageName)) {
            packagePath += packageName.replace(".", File.separator) + File.separator + moduleName + File.separator;
        }

        if (template.contains(ENTITY_JAVA_VM)) {
            return packagePath + "entity" + File.separator + className + ".java";
        }

        if (template.contains(MAPPER_JAVA_VM)) {
            return packagePath + "mapper" + File.separator + className + "Mapper.java";
        }

        if (template.contains(SERVICE_JAVA_VM)) {
            return packagePath + "service" + File.separator + className + "Service.java";
        }

        if (template.contains(SERVICE_IMPL_JAVA_VM)) {
            return packagePath + "service" + File.separator + "impl" + File.separator + className + "ServiceImpl.java";
        }

        if (template.contains(CONTROLLER_JAVA_VM)) {
            return packagePath + "controller" + File.separator + className + "Controller.java";
        }

        if (template.contains(MAPPER_XML_VM)) {
            return resourcePath + "mapper" + File.separator + className + "Mapper.xml";
        }

        if (template.contains(API_JS_VM)) {
            return apiPath + className.toLowerCase() + ".js";
        }

        return null;
    }
}


================================================
FILE: demo-codegen/src/main/java/com/xkcoding/codegen/utils/DbUtil.java
================================================
package com.xkcoding.codegen.utils;

import com.xkcoding.codegen.entity.TableRequest;
import com.zaxxer.hikari.HikariDataSource;
import lombok.experimental.UtilityClass;
import lombok.extern.slf4j.Slf4j;

/**
 * <p>
 * 数据库工具类
 * </p>
 *
 * @author yangkai.shen
 * @date Created in 2019-03-22 10:26
 */
@Slf4j
@UtilityClass
public class DbUtil {
    public HikariDataSource buildFromTableRequest(TableRequest request) {
        HikariDataSource dataSource = new HikariDataSource();
        dataSource.setJdbcUrl(request.getPrepend() + request.getUrl());
        dataSource.setUsername(request.getUsername());
        dataSource.setPassword(request.getPassword());
        return dataSource;
    }

}


================================================
FILE: demo-codegen/src/main/resources/application.yml
================================================
server:
  port: 8080
  servlet:
    context-path: /demo

================================================
FILE: demo-codegen/src/main/resources/generator.properties
================================================
#\u4EE3\u7801\u751F\u6210\u5668\uFF0C\u914D\u7F6E\u4FE1\u606F
mainPath=com.xkcoding
#\u5305\u540D
package=com.xkcoding
moduleName=generator
#\u4F5C\u8005
author=Yangkai.Shen
#\u8868\u524D\u7F00(\u7C7B\u540D\u4E0D\u4F1A\u5305\u542B\u8868\u524D\u7F00)
tablePrefix=tb_
#\u7C7B\u578B\u8F6C\u6362\uFF0C\u914D\u7F6E\u4FE1\u606F
tinyint=Integer
smallint=Integer
mediumint=Integer
int=Integer
integer=Integer
bigint=Long
float=Float
double=Double
decimal=BigDecimal
bit=Boolean
char=String
varchar=String
tinytext=String
text=String
mediumtext=String
longtext=String
date=LocalDateTime
datetime=LocalDateTime
timestamp=LocalDateTime


================================================
FILE: demo-codegen/src/main/resources/jdbc_type.properties
================================================
tinyint=TINYINT
smallint=SMALLINT
mediumint=MEDIUMINT
int=INTEGER
integer=INTEGER
bigint=BIGINT
float=FLOAT
double=DOUBLE
decimal=DECIMAL
bit=BIT
char=CHAR
varchar=VARCHAR
tinytext=VARCHAR
text=VARCHAR
mediumtext=VARCHAR
longtext=VARCHAR
date=DATE
datetime=DATETIME
timestamp=TIMESTAMP
blob=BLOB
longblob=LONGBLOB


================================================
FILE: demo-codegen/src/main/resources/logback-spring.xml
================================================
<?xml version="1.0" encoding="UTF-8"?>
<configuration>
  <property name="FILE_ERROR_PATTERN"
            value="${FILE_LOG_PATTERN:-%d{${LOG_DATEFORMAT_PATTERN:-yyyy-MM-dd HH:mm:ss.SSS}} ${LOG_LEVEL_PATTERN:-%5p} ${PID:- } --- [%t] %-40.40logger{39} %file:%line: %m%n${LOG_EXCEPTION_CONVERSION_WORD:-%wEx}}"/>
  <include resource="org/springframework/boot/logging/logback/defaults.xml"/>
	<appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender">
		<filter class="ch.qos.logback.classic.filter.LevelFilter">
			<level>INFO</level>
		</filter>
		<encoder>
			<pattern>${CONSOLE_LOG_PATTERN}</pattern>
			<charset>UTF-8</charset>
		</encoder>
	</appender>

	<appender name="FILE_INFO" class="ch.qos.logback.core.rolling.RollingFileAppender">
		<!--如果只是想要 Info 级别的日志,只是过滤 info 还是会输出 Error 日志,因为 Error 的级别高, 所以我们使用下面的策略,可以避免输出 Error 的日志-->
		<filter class="ch.qos.logback.classic.filter.LevelFilter">
			<!--过滤 Error-->
			<level>ERROR</level>
			<!--匹配到就禁止-->
			<onMatch>DENY</onMatch>
			<!--没有匹配到就允许-->
			<onMismatch>ACCEPT</onMismatch>
		</filter>
		<!--日志名称,如果没有File 属性,那么只会使用FileNamePattern的文件路径规则如果同时有<File>和<FileNamePattern>,那么当天日志是<File>,明天会自动把今天的日志改名为今天的日期。即,<File> 的日志都是当天的。-->
		<!--<File>logs/info.demo-logback.log</File>-->
		<!--滚动策略,按照时间滚动 TimeBasedRollingPolicy-->
		<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
			<!--文件路径,定义了日志的切分方式——把每一天的日志归档到一个文件中,以防止日志填满整个磁盘空间-->
			<FileNamePattern>logs/demo-logback/info.created_on_%d{yyyy-MM-dd}.part_%i.log</FileNamePattern>
			<!--只保留最近90天的日志-->
			<maxHistory>90</maxHistory>
			<!--用来指定日志文件的上限大小,那么到了这个值,就会删除旧的日志-->
			<!--<totalSizeCap>1GB</totalSizeCap>-->
			<timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
				<!-- maxFileSize:这是活动文件的大小,默认值是10MB,本篇设置为1KB,只是为了演示 -->
				<maxFileSize>2MB</maxFileSize>
			</timeBasedFileNamingAndTriggeringPolicy>
		</rollingPolicy>
		<!--<triggeringPolicy class="ch.qos.logback.core.rolling.SizeBasedTriggeringPolicy">-->
		<!--<maxFileSize>1KB</maxFileSize>-->
		<!--</triggeringPolicy>-->
		<encoder>
			<pattern>${FILE_LOG_PATTERN}</pattern>
			<charset>UTF-8</charset> <!-- 此处设置字符集 -->
		</encoder>
	</appender>

	<appender name="FILE_ERROR" class="ch.qos.logback.core.rolling.RollingFileAppender">
		<!--如果只是想要 Error 级别的日志,那么需要过滤一下,默认是 info 级别的,ThresholdFilter-->
		<filter class="ch.qos.logback.classic.filter.ThresholdFilter">
			<level>Error</level>
		</filter>
		<!--日志名称,如果没有File 属性,那么只会使用FileNamePattern的文件路径规则如果同时有<File>和<FileNamePattern>,那么当天日志是<File>,明天会自动把今天的日志改名为今天的日期。即,<File> 的日志都是当天的。-->
		<!--<File>logs/error.demo-logback.log</File>-->
		<!--滚动策略,按照时间滚动 TimeBasedRollingPolicy-->
		<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
			<!--文件路径,定义了日志的切分方式——把每一天的日志归档到一个文件中,以防止日志填满整个磁盘空间-->
			<FileNamePattern>logs/demo-logback/error.created_on_%d{yyyy-MM-dd}.part_%i.log</FileNamePattern>
			<!--只保留最近90天的日志-->
			<maxHistory>90</maxHistory>
			<timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
				<!-- maxFileSize:这是活动文件的大小,默认值是10MB,本篇设置为1KB,只是为了演示 -->
				<maxFileSize>2MB</maxFileSize>
			</timeBasedFileNamingAndTriggeringPolicy>
		</rollingPolicy>
		<encoder>
			<pattern>${FILE_ERROR_PATTERN}</pattern>
			<charset>UTF-8</charset> <!-- 此处设置字符集 -->
		</encoder>
	</appender>

	<root level="info">
		<appender-ref ref="CONSOLE"/>
		<appender-ref ref="FILE_INFO"/>
		<appender-ref ref="FILE_ERROR"/>
	</root>
</configuration>


================================================
FILE: demo-codegen/src/main/resources/static/index.html
================================================
<!DOCTYPE html>
<html>
<head>
    <meta charset="utf-8">
    <title>代码生成器</title>
    <!-- import Vue.js -->
    <script src="libs/vue/vue.min.js"></script>
    <!-- import stylesheet -->
    <link rel="stylesheet" href="libs/iview/iview.css">
    <!-- import iView -->
    <script src="libs/iview/iview.min.js"></script>
    <!-- import axios -->
    <script src="libs/axios/axios.min.js"></script>
    <!-- import date -->
    <script src="libs/datejs/date-zh-CN.js"></script>
    <style>
        html, body {
            height: 100%;
        }

        #app {
            height: inherit;
        }

        .xkcoding-layout {
            height: inherit;
        }

        .layout-header-center {
            text-align: center;
        }

        .layout-footer-center {
            color: #999999;
            text-align: center;
        }
    </style>
</head>
<body>
<div id="app">
    <Layout class="xkcoding-layout">
        <Header class="layout-header-center">
            <h1>代码生成</h1>
        </Header>
        <Content :style="{padding: '0 50px'}">
            <Card>
                <Row :gutter="16">
                    <i-form ref="formTableRequest" :model="tableRequest" label-position="right" label-width="50"
                            :rules="tableRequestValidate">
                        <i-col span="9">
                            <form-item label="URL" prop="url" required>
                                <i-input v-model="tableRequest.url" placeholder="<host>:<port>/<dbName>">
                                    <i-select v-model="tableRequest.prepend" slot="prepend" style="width: 150px;">
                                        <i-option :value="mysqlPrepend">{{mysqlPrepend}}</i-option>
                                        <i-option :value="oraclePrepend">{{oraclePrepend}}</i-option>
                                        <i-option :value="mssqlPrepend">{{mssqlPrepend}}</i-option>
                                    </i-select>
                                </i-input>
                            </form-item>
                        </i-col>
                        <i-col span="4">
                            <form-item label="用户名" prop="username" label-width="60" required>
                                <i-input v-model="tableRequest.username" placeholder="请输入数据库用户名"></i-input>
                            </form-item>
                        </i-col>
                        <i-col span="4">
                            <form-item label="密码" prop="password" required>
                                <i-input v-model="tableRequest.password" type="password"
                                         placeholder="请输入数据库密码"></i-input>
                            </form-item>
                        </i-col>
                        <i-col span="5">
                            <form-item label="表名" prop="tableName" label-width="40">
                                <i-input v-model="tableRequest.tableName" placeholder="请输入数据库表名"></i-input>
                            </form-item>
                        </i-col>

                        <i-col span="2" style="text-align: center">
                            <i-button type="primary" long icon="ios-search" @click="search('formTableRequest')">查询
                            </i-button>
                        </i-col>
                    </i-form>
                </Row>
                <br>
                <Row>
                    <i-col>
                        <i-table border :columns="columns" :data="data">
                            <template slot-scope="{ row }" slot="tableName">
                                <strong>{{ row.tableName }}</strong>
                            </template>
                            <template slot-scope="{ row }" slot="action">
                                <i-button type="primary" icon="md-code-download" @click="showConfig(row.tableName)">生成代码
                                </i-button>
                            </template>
                        </i-table>
                    </i-col>
                </Row>
                <br>
                <Row>
                    <i-col>
                        <Page :total="total"
                              :current.sync="tableRequest.currentPage"
                              @on-change="changePage"
                              @on-page-size-change="changePageSize"
                              show-sizer
                              show-elevator
                              show-total
                              :page-size-opts="[10, 20, 30]"></Page>
                    </i-col>
                </Row>
            </Card>
        </Content>
        <Footer class="layout-footer-center">2019 &copy; xkcoding</Footer>
    </Layout>

    <Modal v-model="showConfigDialog"
           :closable="false">
        <div slot="header" style="text-align:center">
            <h2>生成配置</h2>
        </div>
        <i-form ref="form" :model="genConfig">
            <Row :gutter="16">
                <i-col span="12">
                    <form-item label="表名" prop="tableName" label-width="40">
                        <i-input v-model="genConfig.tableName" disabled></i-input>
                    </form-item>
                </i-col>
                <i-col span="12">
                    <form-item label="包名" prop="packageName" label-width="40">
                        <i-input v-model="genConfig.packageName" placeholder="可为空,加载系统默认配置"></i-input>
                    </form-item>
                </i-col>
            </Row>
            <Row :gutter="16">
                <i-col span="12">
                    <form-item label="作者" prop="author" label-width="40">
                        <i-input v-model="genConfig.author" placeholder="可为空,加载系统默认配置"></i-input>
                    </form-item>
                </i-col>
                <i-col span="12">
                    <form-item label="模块" prop="moduleName" label-width="40">
                        <i-input v-model="genConfig.moduleName" placeholder="可为空,加载系统默认配置"></i-input>
                    </form-item>
                </i-col>
            </Row>
            <Row :gutter="16">
                <i-col span="12">
                    <form-item label="前缀" prop="tablePrefix" label-width="40">
                        <i-input v-model="genConfig.tablePrefix" placeholder="可为空,加载系统默认配置"></i-input>
                    </form-item>
                </i-col>
                <i-col span="12">
                    <form-item label="注释" prop="comments" label-width="40">
                        <i-input v-model="genConfig.comments" placeholder="可为空,加载数据库表注释"></i-input>
                    </form-item>
                </i-col>
            </Row>
        </i-form>
        <div slot="footer" style="text-align:center">
            <i-button icon="md-trash" size="large" @click="cancel">取消</i-button>
            <i-button type="success" icon="md-cloud-download" size="large" @click="download">生成代码</i-button>
        </div>
    </Modal>
</div>
<script>
  const http = axios.create({
    baseURL: '/demo'
  });

  const MYSQL_PREPEND = "jdbc:mysql://";
  const MSSQL_PREPEND = "jdbc:jtds:sqlserver://";
  const ORACLE_PREPEND = "jdbc:oracle:thin:@//";

  new Vue({
    el: "#app",
    data: {
      showConfigDialog: false,
      genConfig: {
        request: {
          pre
Download .txt
gitextract_ajnuvaj3/

├── .codacy.yml
├── .editorconfig
├── .gitee/
│   ├── ISSUE_TEMPLATE/
│   │   ├── bug_report.md
│   │   └── feature_request.md
│   └── PULL_REQUEST_TEMPLATE.md
├── .github/
│   ├── FUNDING.yml
│   ├── ISSUE_TEMPLATE/
│   │   ├── bug_report.md
│   │   └── feature_request.md
│   ├── PULL_REQUEST_TEMPLATE.md
│   └── workflows/
│       └── maven.yml
├── .gitignore
├── .travis.yml
├── LICENSE
├── README.en.md
├── README.md
├── TODO.en.md
├── TODO.md
├── demo-activiti/
│   ├── .gitignore
│   ├── pom.xml
│   └── src/
│       ├── main/
│       │   ├── java/
│       │   │   └── com/
│       │   │       └── xkcoding/
│       │   │           └── activiti/
│       │   │               ├── SpringBootDemoActivitiApplication.java
│       │   │               ├── config/
│       │   │               │   └── SecurityConfiguration.java
│       │   │               └── util/
│       │   │                   └── SecurityUtil.java
│       │   └── resources/
│       │       ├── application.yml
│       │       └── processes/
│       │           └── team01.bpmn
│       └── test/
│           └── java/
│               └── com/
│                   └── xkcoding/
│                       └── activiti/
│                           └── SpringBootDemoActivitiApplicationTests.java
├── demo-actuator/
│   ├── .gitignore
│   ├── README.md
│   ├── pom.xml
│   └── src/
│       ├── main/
│       │   ├── java/
│       │   │   └── com/
│       │   │       └── xkcoding/
│       │   │           └── actuator/
│       │   │               └── SpringBootDemoActuatorApplication.java
│       │   └── resources/
│       │       └── application.yml
│       └── test/
│           └── java/
│               └── com/
│                   └── xkcoding/
│                       └── actuator/
│                           └── SpringBootDemoActuatorApplicationTests.java
├── demo-admin/
│   ├── README.md
│   ├── admin-client/
│   │   ├── .gitignore
│   │   ├── README.md
│   │   ├── pom.xml
│   │   └── src/
│   │       ├── main/
│   │       │   ├── java/
│   │       │   │   └── com/
│   │       │   │       └── xkcoding/
│   │       │   │           └── admin/
│   │       │   │               └── client/
│   │       │   │                   ├── SpringBootDemoAdminClientApplication.java
│   │       │   │                   └── controller/
│   │       │   │                       └── IndexController.java
│   │       │   └── resources/
│   │       │       └── application.yml
│   │       └── test/
│   │           └── java/
│   │               └── com/
│   │                   └── xkcoding/
│   │                       └── admin/
│   │                           └── client/
│   │                               └── SpringBootDemoAdminClientApplicationTests.java
│   ├── admin-server/
│   │   ├── .gitignore
│   │   ├── README.md
│   │   ├── pom.xml
│   │   └── src/
│   │       ├── main/
│   │       │   ├── java/
│   │       │   │   └── com/
│   │       │   │       └── xkcoding/
│   │       │   │           └── admin/
│   │       │   │               └── server/
│   │       │   │                   └── SpringBootDemoAdminServerApplication.java
│   │       │   └── resources/
│   │       │       └── application.yml
│   │       └── test/
│   │           └── java/
│   │               └── com/
│   │                   └── xkcoding/
│   │                       └── admin/
│   │                           └── server/
│   │                               └── SpringBootDemoAdminServerApplicationTests.java
│   └── pom.xml
├── demo-async/
│   ├── .gitignore
│   ├── README.md
│   ├── pom.xml
│   └── src/
│       ├── main/
│       │   ├── java/
│       │   │   └── com/
│       │   │       └── xkcoding/
│       │   │           └── async/
│       │   │               ├── SpringBootDemoAsyncApplication.java
│       │   │               └── task/
│       │   │                   └── TaskFactory.java
│       │   └── resources/
│       │       └── application.yml
│       └── test/
│           └── java/
│               └── com/
│                   └── xkcoding/
│                       └── async/
│                           ├── SpringBootDemoAsyncApplicationTests.java
│                           └── task/
│                               └── TaskFactoryTest.java
├── demo-cache-ehcache/
│   ├── .gitignore
│   ├── README.md
│   ├── pom.xml
│   └── src/
│       ├── main/
│       │   ├── java/
│       │   │   └── com/
│       │   │       └── xkcoding/
│       │   │           └── cache/
│       │   │               └── ehcache/
│       │   │                   ├── SpringBootDemoCacheEhcacheApplication.java
│       │   │                   ├── entity/
│       │   │                   │   └── User.java
│       │   │                   └── service/
│       │   │                       ├── UserService.java
│       │   │                       └── impl/
│       │   │                           └── UserServiceImpl.java
│       │   └── resources/
│       │       ├── application.yml
│       │       └── ehcache.xml
│       └── test/
│           └── java/
│               └── com/
│                   └── xkcoding/
│                       └── cache/
│                           └── ehcache/
│                               ├── SpringBootDemoCacheEhcacheApplicationTests.java
│                               └── service/
│                                   └── UserServiceTest.java
├── demo-cache-redis/
│   ├── .gitignore
│   ├── README.md
│   ├── pom.xml
│   └── src/
│       ├── main/
│       │   ├── java/
│       │   │   └── com/
│       │   │       └── xkcoding/
│       │   │           └── cache/
│       │   │               └── redis/
│       │   │                   ├── SpringBootDemoCacheRedisApplication.java
│       │   │                   ├── config/
│       │   │                   │   └── RedisConfig.java
│       │   │                   ├── entity/
│       │   │                   │   └── User.java
│       │   │                   └── service/
│       │   │                       ├── UserService.java
│       │   │                       └── impl/
│       │   │                           └── UserServiceImpl.java
│       │   └── resources/
│       │       └── application.yml
│       └── test/
│           └── java/
│               └── com/
│                   └── xkcoding/
│                       └── cache/
│                           └── redis/
│                               ├── RedisTest.java
│                               ├── SpringBootDemoCacheRedisApplicationTests.java
│                               └── service/
│                                   └── UserServiceTest.java
├── demo-codegen/
│   ├── .gitignore
│   ├── README.md
│   ├── pom.xml
│   └── src/
│       ├── main/
│       │   ├── java/
│       │   │   └── com/
│       │   │       └── xkcoding/
│       │   │           └── codegen/
│       │   │               ├── SpringBootDemoCodegenApplication.java
│       │   │               ├── common/
│       │   │               │   ├── IResultCode.java
│       │   │               │   ├── PageResult.java
│       │   │               │   ├── R.java
│       │   │               │   └── ResultCode.java
│       │   │               ├── constants/
│       │   │               │   └── GenConstants.java
│       │   │               ├── controller/
│       │   │               │   └── CodeGenController.java
│       │   │               ├── entity/
│       │   │               │   ├── ColumnEntity.java
│       │   │               │   ├── GenConfig.java
│       │   │               │   ├── TableEntity.java
│       │   │               │   └── TableRequest.java
│       │   │               ├── service/
│       │   │               │   ├── CodeGenService.java
│       │   │               │   └── impl/
│       │   │               │       └── CodeGenServiceImpl.java
│       │   │               └── utils/
│       │   │                   ├── CodeGenUtil.java
│       │   │                   └── DbUtil.java
│       │   └── resources/
│       │       ├── application.yml
│       │       ├── generator.properties
│       │       ├── jdbc_type.properties
│       │       ├── logback-spring.xml
│       │       ├── static/
│       │       │   ├── index.html
│       │       │   └── libs/
│       │       │       ├── datejs/
│       │       │       │   └── date-zh-CN.js
│       │       │       └── iview/
│       │       │           └── iview.css
│       │       └── template/
│       │           ├── Controller.java.vm
│       │           ├── Entity.java.vm
│       │           ├── Mapper.java.vm
│       │           ├── Mapper.xml.vm
│       │           ├── Service.java.vm
│       │           ├── ServiceImpl.java.vm
│       │           └── api.js.vm
│       └── test/
│           └── java/
│               └── com/
│                   └── xkcoding/
│                       └── codegen/
│                           ├── CodeGenServiceTest.java
│                           └── SpringBootDemoCodegenApplicationTests.java
├── demo-docker/
│   ├── .gitignore
│   ├── Dockerfile
│   ├── README.md
│   ├── pom.xml
│   └── src/
│       ├── main/
│       │   ├── java/
│       │   │   └── com/
│       │   │       └── xkcoding/
│       │   │           └── docker/
│       │   │               ├── SpringBootDemoDockerApplication.java
│       │   │               └── controller/
│       │   │                   └── HelloController.java
│       │   └── resources/
│       │       └── application.yml
│       └── test/
│           └── java/
│               └── com/
│                   └── xkcoding/
│                       └── docker/
│                           └── SpringBootDemoDockerApplicationTests.java
├── demo-dubbo/
│   ├── .gitignore
│   ├── README.md
│   ├── dubbo-common/
│   │   ├── .gitignore
│   │   ├── README.md
│   │   ├── pom.xml
│   │   └── src/
│   │       └── main/
│   │           └── java/
│   │               └── com/
│   │                   └── xkcoding/
│   │                       └── dubbo/
│   │                           └── common/
│   │                               └── service/
│   │                                   └── HelloService.java
│   ├── dubbo-consumer/
│   │   ├── .gitignore
│   │   ├── README.md
│   │   ├── pom.xml
│   │   └── src/
│   │       ├── main/
│   │       │   ├── java/
│   │       │   │   └── com/
│   │       │   │       └── xkcoding/
│   │       │   │           └── dubbo/
│   │       │   │               └── consumer/
│   │       │   │                   ├── SpringBootDemoDubboConsumerApplication.java
│   │       │   │                   └── controller/
│   │       │   │                       └── HelloController.java
│   │       │   └── resources/
│   │       │       └── application.yml
│   │       └── test/
│   │           └── java/
│   │               └── com/
│   │                   └── xkcoding/
│   │                       └── dubbo/
│   │                           └── consumer/
│   │                               └── SpringBootDemoDubboConsumerApplicationTests.java
│   ├── dubbo-provider/
│   │   ├── .gitignore
│   │   ├── README.md
│   │   ├── pom.xml
│   │   └── src/
│   │       ├── main/
│   │       │   ├── java/
│   │       │   │   └── com/
│   │       │   │       └── xkcoding/
│   │       │   │           └── dubbo/
│   │       │   │               └── provider/
│   │       │   │                   ├── SpringBootDemoDubboProviderApplication.java
│   │       │   │                   └── service/
│   │       │   │                       └── HelloServiceImpl.java
│   │       │   └── resources/
│   │       │       └── application.yml
│   │       └── test/
│   │           └── java/
│   │               └── com/
│   │                   └── xkcoding/
│   │                       └── dubbo/
│   │                           └── provider/
│   │                               └── SpringBootDemoDubboProviderApplicationTests.java
│   └── pom.xml
├── demo-dynamic-datasource/
│   ├── .gitignore
│   ├── README.md
│   ├── db/
│   │   ├── init.sql
│   │   └── user.sql
│   ├── pom.xml
│   └── src/
│       ├── main/
│       │   ├── java/
│       │   │   └── com/
│       │   │       └── xkcoding/
│       │   │           └── dynamic/
│       │   │               └── datasource/
│       │   │                   ├── SpringBootDemoDynamicDatasourceApplication.java
│       │   │                   ├── annotation/
│       │   │                   │   └── DefaultDatasource.java
│       │   │                   ├── aspect/
│       │   │                   │   └── DatasourceSelectorAspect.java
│       │   │                   ├── config/
│       │   │                   │   ├── DatasourceConfiguration.java
│       │   │                   │   ├── MyMapper.java
│       │   │                   │   └── MybatisConfiguration.java
│       │   │                   ├── controller/
│       │   │                   │   ├── DatasourceConfigController.java
│       │   │                   │   └── UserController.java
│       │   │                   ├── datasource/
│       │   │                   │   ├── DatasourceConfigCache.java
│       │   │                   │   ├── DatasourceConfigContextHolder.java
│       │   │                   │   ├── DatasourceHolder.java
│       │   │                   │   ├── DatasourceManager.java
│       │   │                   │   ├── DatasourceScheduler.java
│       │   │                   │   └── DynamicDataSource.java
│       │   │                   ├── mapper/
│       │   │                   │   ├── DatasourceConfigMapper.java
│       │   │                   │   └── UserMapper.java
│       │   │                   ├── model/
│       │   │                   │   ├── DatasourceConfig.java
│       │   │                   │   └── User.java
│       │   │                   └── utils/
│       │   │                       └── SpringUtil.java
│       │   └── resources/
│       │       └── application.yml
│       └── test/
│           └── java/
│               └── com/
│                   └── xkcoding/
│                       └── dynamic/
│                           └── datasource/
│                               └── SpringBootDemoDynamicDatasourceApplicationTests.java
├── demo-elasticsearch/
│   ├── .gitignore
│   ├── README.md
│   ├── pom.xml
│   └── src/
│       ├── main/
│       │   ├── java/
│       │   │   └── com/
│       │   │       └── xkcoding/
│       │   │           └── elasticsearch/
│       │   │               ├── SpringBootDemoElasticsearchApplication.java
│       │   │               ├── constants/
│       │   │               │   └── EsConsts.java
│       │   │               ├── model/
│       │   │               │   └── Person.java
│       │   │               └── repository/
│       │   │                   └── PersonRepository.java
│       │   └── resources/
│       │       └── application.yml
│       └── test/
│           └── java/
│               └── com/
│                   └── xkcoding/
│                       └── elasticsearch/
│                           ├── SpringBootDemoElasticsearchApplicationTests.java
│                           ├── repository/
│                           │   └── PersonRepositoryTest.java
│                           └── template/
│                               └── TemplateTest.java
├── demo-elasticsearch-rest-high-level-client/
│   ├── .gitignore
│   ├── README.md
│   ├── pom.xml
│   └── src/
│       ├── main/
│       │   ├── java/
│       │   │   └── com/
│       │   │       └── xkcoding/
│       │   │           └── elasticsearch/
│       │   │               ├── ElasticsearchApplication.java
│       │   │               ├── common/
│       │   │               │   ├── Result.java
│       │   │               │   └── ResultCode.java
│       │   │               ├── config/
│       │   │               │   ├── ElasticsearchAutoConfiguration.java
│       │   │               │   └── ElasticsearchProperties.java
│       │   │               ├── contants/
│       │   │               │   └── ElasticsearchConstant.java
│       │   │               ├── exception/
│       │   │               │   └── ElasticsearchException.java
│       │   │               ├── model/
│       │   │               │   └── Person.java
│       │   │               └── service/
│       │   │                   ├── PersonService.java
│       │   │                   ├── base/
│       │   │                   │   └── BaseElasticsearchService.java
│       │   │                   └── impl/
│       │   │                       └── PersonServiceImpl.java
│       │   └── resources/
│       │       └── application.yml
│       └── test/
│           └── java/
│               └── com/
│                   └── xkcoding/
│                       └── elasticsearch/
│                           └── ElasticsearchApplicationTests.java
├── demo-email/
│   ├── .gitignore
│   ├── README.md
│   ├── pom.xml
│   └── src/
│       ├── main/
│       │   ├── java/
│       │   │   └── com/
│       │   │       └── xkcoding/
│       │   │           └── email/
│       │   │               ├── SpringBootDemoEmailApplication.java
│       │   │               └── service/
│       │   │                   ├── MailService.java
│       │   │                   └── impl/
│       │   │                       └── MailServiceImpl.java
│       │   └── resources/
│       │       ├── application.yml
│       │       ├── email/
│       │       │   └── test.html
│       │       └── templates/
│       │           └── welcome.html
│       └── test/
│           └── java/
│               └── com/
│                   └── xkcoding/
│                       └── email/
│                           ├── PasswordTest.java
│                           ├── SpringBootDemoEmailApplicationTests.java
│                           └── service/
│                               └── MailServiceTest.java
├── demo-exception-handler/
│   ├── .gitignore
│   ├── README.md
│   ├── pom.xml
│   └── src/
│       ├── main/
│       │   ├── java/
│       │   │   └── com/
│       │   │       └── xkcoding/
│       │   │           └── exception/
│       │   │               └── handler/
│       │   │                   ├── SpringBootDemoExceptionHandlerApplication.java
│       │   │                   ├── constant/
│       │   │                   │   └── Status.java
│       │   │                   ├── controller/
│       │   │                   │   └── TestController.java
│       │   │                   ├── exception/
│       │   │                   │   ├── BaseException.java
│       │   │                   │   ├── JsonException.java
│       │   │                   │   └── PageException.java
│       │   │                   ├── handler/
│       │   │                   │   └── DemoExceptionHandler.java
│       │   │                   └── model/
│       │   │                       └── ApiResponse.java
│       │   └── resources/
│       │       ├── application.yml
│       │       └── templates/
│       │           └── error.html
│       └── test/
│           └── java/
│               └── com/
│                   └── xkcoding/
│                       └── exception/
│                           └── handler/
│                               └── SpringBootDemoExceptionHandlerApplicationTests.java
├── demo-flyway/
│   ├── .gitignore
│   ├── README.md
│   ├── pom.xml
│   └── src/
│       ├── main/
│       │   ├── java/
│       │   │   └── com/
│       │   │       └── xkcoding/
│       │   │           └── flyway/
│       │   │               └── SpringBootDemoFlywayApplication.java
│       │   └── resources/
│       │       ├── application.yml
│       │       └── db/
│       │           └── migration/
│       │               ├── V1_0__INIT.sql
│       │               └── V1_1__ALTER.sql
│       └── test/
│           └── java/
│               └── com/
│                   └── xkcoding/
│                       └── AppTest.java
├── demo-graylog/
│   ├── .gitignore
│   ├── README.md
│   ├── pom.xml
│   └── src/
│       ├── main/
│       │   ├── java/
│       │   │   └── com/
│       │   │       └── xkcoding/
│       │   │           └── graylog/
│       │   │               └── SpringBootDemoGraylogApplication.java
│       │   └── resources/
│       │       ├── application.yml
│       │       └── logback-spring.xml
│       └── test/
│           └── java/
│               └── com/
│                   └── xkcoding/
│                       └── graylog/
│                           └── SpringBootDemoGraylogApplicationTests.java
├── demo-helloworld/
│   ├── .gitignore
│   ├── README.md
│   ├── pom.xml
│   └── src/
│       ├── main/
│       │   ├── java/
│       │   │   └── com/
│       │   │       └── xkcoding/
│       │   │           └── helloworld/
│       │   │               └── SpringBootDemoHelloworldApplication.java
│       │   └── resources/
│       │       └── application.yml
│       └── test/
│           └── java/
│               └── com/
│                   └── xkcoding/
│                       └── helloworld/
│                           └── SpringBootDemoHelloworldApplicationTests.java
├── demo-https/
│   ├── .gitignore
│   ├── README.md
│   ├── pom.xml
│   └── src/
│       ├── main/
│       │   ├── java/
│       │   │   └── com/
│       │   │       └── xkcoding/
│       │   │           └── https/
│       │   │               ├── SpringBootDemoHttpsApplication.java
│       │   │               └── config/
│       │   │                   └── HttpsConfig.java
│       │   └── resources/
│       │       ├── application.yml
│       │       ├── server.keystore
│       │       └── static/
│       │           └── index.html
│       └── test/
│           └── java/
│               └── com/
│                   └── xkcoding/
│                       └── https/
│                           └── SpringBootDemoHttpsApplicationTests.java
├── demo-ldap/
│   ├── .gitignore
│   ├── README.md
│   ├── pom.xml
│   └── src/
│       ├── main/
│       │   ├── java/
│       │   │   └── com/
│       │   │       └── xkcoding/
│       │   │           └── ldap/
│       │   │               ├── LdapDemoApplication.java
│       │   │               ├── api/
│       │   │               │   ├── Result.java
│       │   │               │   └── ResultCode.java
│       │   │               ├── entity/
│       │   │               │   └── Person.java
│       │   │               ├── exception/
│       │   │               │   └── ServiceException.java
│       │   │               ├── repository/
│       │   │               │   └── PersonRepository.java
│       │   │               ├── request/
│       │   │               │   └── LoginRequest.java
│       │   │               ├── service/
│       │   │               │   ├── PersonService.java
│       │   │               │   └── impl/
│       │   │               │       └── PersonServiceImpl.java
│       │   │               └── util/
│       │   │                   └── LdapUtils.java
│       │   └── resources/
│       │       └── application.yml
│       └── test/
│           └── java/
│               └── com/
│                   └── xkcoding/
│                       └── ldap/
│                           └── LdapDemoApplicationTests.java
├── demo-log-aop/
│   ├── .gitignore
│   ├── README.md
│   ├── pom.xml
│   └── src/
│       ├── main/
│       │   ├── java/
│       │   │   └── com/
│       │   │       └── xkcoding/
│       │   │           └── log/
│       │   │               └── aop/
│       │   │                   ├── SpringBootDemoLogAopApplication.java
│       │   │                   ├── aspectj/
│       │   │                   │   └── AopLog.java
│       │   │                   └── controller/
│       │   │                       └── TestController.java
│       │   └── resources/
│       │       ├── application.yml
│       │       └── logback-spring.xml
│       └── test/
│           └── java/
│               └── com/
│                   └── xkcoding/
│                       └── log/
│                           └── aop/
│                               └── SpringBootDemoLogAopApplicationTests.java
├── demo-logback/
│   ├── .gitignore
│   ├── README.md
│   ├── pom.xml
│   └── src/
│       ├── main/
│       │   ├── java/
│       │   │   └── com/
│       │   │       └── xkcoding/
│       │   │           └── logback/
│       │   │               └── SpringBootDemoLogbackApplication.java
│       │   └── resources/
│       │       ├── application.yml
│       │       └── logback-spring.xml
│       └── test/
│           └── java/
│               └── com/
│                   └── xkcoding/
│                       └── logback/
│                           └── SpringBootDemoLogbackApplicationTests.java
├── demo-mongodb/
│   ├── .gitignore
│   ├── README.md
│   ├── pom.xml
│   └── src/
│       ├── main/
│       │   ├── java/
│       │   │   └── com/
│       │   │       └── xkcoding/
│       │   │           └── mongodb/
│       │   │               ├── SpringBootDemoMongodbApplication.java
│       │   │               ├── model/
│       │   │               │   └── Article.java
│       │   │               └── repository/
│       │   │                   └── ArticleRepository.java
│       │   └── resources/
│       │       └── application.yml
│       └── test/
│           └── java/
│               └── com/
│                   └── xkcoding/
│                       └── mongodb/
│                           ├── SpringBootDemoMongodbApplicationTests.java
│                           └── repository/
│                               └── ArticleRepositoryTest.java
├── demo-mq-kafka/
│   ├── .gitignore
│   ├── README.md
│   ├── pom.xml
│   └── src/
│       ├── main/
│       │   ├── java/
│       │   │   └── com/
│       │   │       └── xkcoding/
│       │   │           └── mq/
│       │   │               └── kafka/
│       │   │                   ├── SpringBootDemoMqKafkaApplication.java
│       │   │                   ├── config/
│       │   │                   │   └── KafkaConfig.java
│       │   │                   ├── constants/
│       │   │                   │   └── KafkaConsts.java
│       │   │                   └── handler/
│       │   │                       └── MessageHandler.java
│       │   └── resources/
│       │       └── application.yml
│       └── test/
│           └── java/
│               └── com/
│                   └── xkcoding/
│                       └── mq/
│                           └── kafka/
│                               └── SpringBootDemoMqKafkaApplicationTests.java
├── demo-mq-rabbitmq/
│   ├── .gitignore
│   ├── README.md
│   ├── pom.xml
│   └── src/
│       ├── main/
│       │   ├── java/
│       │   │   └── com/
│       │   │       └── xkcoding/
│       │   │           └── mq/
│       │   │               └── rabbitmq/
│       │   │                   ├── SpringBootDemoMqRabbitmqApplication.java
│       │   │                   ├── config/
│       │   │                   │   └── RabbitMqConfig.java
│       │   │                   ├── constants/
│       │   │                   │   └── RabbitConsts.java
│       │   │                   ├── handler/
│       │   │                   │   ├── DelayQueueHandler.java
│       │   │                   │   ├── DirectQueueOneHandler.java
│       │   │                   │   ├── QueueThreeHandler.java
│       │   │                   │   └── QueueTwoHandler.java
│       │   │                   └── message/
│       │   │                       └── MessageStruct.java
│       │   └── resources/
│       │       └── application.yml
│       └── test/
│           └── java/
│               └── com/
│                   └── xkcoding/
│                       └── mq/
│                           └── rabbitmq/
│                               └── SpringBootDemoMqRabbitmqApplicationTests.java
├── demo-mq-rocketmq/
│   ├── .gitignore
│   ├── README.md
│   ├── pom.xml
│   └── src/
│       ├── main/
│       │   ├── java/
│       │   │   └── com/
│       │   │       └── xkcoding/
│       │   │           └── mq/
│       │   │               └── rocketmq/
│       │   │                   └── SpringBootDemoMqRocketmqApplication.java
│       │   └── resources/
│       │       └── application.properties
│       └── test/
│           └── java/
│               └── com/
│                   └── xkcoding/
│                       └── mq/
│                           └── rocketmq/
│                               └── SpringBootDemoMqRocketmqApplicationTests.java
├── demo-multi-datasource-jpa/
│   ├── .gitignore
│   ├── README.md
│   ├── pom.xml
│   └── src/
│       ├── main/
│       │   ├── java/
│       │   │   └── com/
│       │   │       └── xkcoding/
│       │   │           └── multi/
│       │   │               └── datasource/
│       │   │                   └── jpa/
│       │   │                       ├── SpringBootDemoMultiDatasourceJpaApplication.java
│       │   │                       ├── config/
│       │   │                       │   ├── PrimaryDataSourceConfig.java
│       │   │                       │   ├── PrimaryJpaConfig.java
│       │   │                       │   ├── SecondDataSourceConfig.java
│       │   │                       │   ├── SecondJpaConfig.java
│       │   │                       │   └── SnowflakeConfig.java
│       │   │                       ├── entity/
│       │   │                       │   ├── primary/
│       │   │                       │   │   └── PrimaryMultiTable.java
│       │   │                       │   └── second/
│       │   │                       │       └── SecondMultiTable.java
│       │   │                       └── repository/
│       │   │                           ├── primary/
│       │   │                           │   └── PrimaryMultiTableRepository.java
│       │   │                           └── second/
│       │   │                               └── SecondMultiTableRepository.java
│       │   └── resources/
│       │       └── application.yml
│       └── test/
│           └── java/
│               └── com/
│                   └── xkcoding/
│                       └── multi/
│                           └── datasource/
│                               └── jpa/
│                                   └── SpringBootDemoMultiDatasourceJpaApplicationTests.java
├── demo-multi-datasource-mybatis/
│   ├── .gitignore
│   ├── README.md
│   ├── pom.xml
│   ├── sql/
│   │   └── db.sql
│   └── src/
│       ├── main/
│       │   ├── java/
│       │   │   └── com/
│       │   │       └── xkcoding/
│       │   │           └── multi/
│       │   │               └── datasource/
│       │   │                   └── mybatis/
│       │   │                       ├── SpringBootDemoMultiDatasourceMybatisApplication.java
│       │   │                       ├── mapper/
│       │   │                       │   └── UserMapper.java
│       │   │                       ├── model/
│       │   │                       │   └── User.java
│       │   │                       └── service/
│       │   │                           ├── UserService.java
│       │   │                           └── impl/
│       │   │                               └── UserServiceImpl.java
│       │   └── resources/
│       │       └── application.yml
│       └── test/
│           └── java/
│               └── com/
│                   └── xkcoding/
│                       └── multi/
│                           └── datasource/
│                               └── mybatis/
│                                   ├── SpringBootDemoMultiDatasourceMybatisApplicationTests.java
│                                   └── service/
│                                       └── impl/
│                                           └── UserServiceImplTest.java
├── demo-neo4j/
│   ├── .gitignore
│   ├── README.md
│   ├── pom.xml
│   └── src/
│       ├── main/
│       │   ├── java/
│       │   │   └── com/
│       │   │       └── xkcoding/
│       │   │           └── neo4j/
│       │   │               ├── SpringBootDemoNeo4jApplication.java
│       │   │               ├── config/
│       │   │               │   └── CustomIdStrategy.java
│       │   │               ├── constants/
│       │   │               │   └── NeoConsts.java
│       │   │               ├── model/
│       │   │               │   ├── Class.java
│       │   │               │   ├── Lesson.java
│       │   │               │   ├── Student.java
│       │   │               │   └── Teacher.java
│       │   │               ├── payload/
│       │   │               │   ├── ClassmateInfoGroupByLesson.java
│       │   │               │   └── TeacherStudent.java
│       │   │               ├── repository/
│       │   │               │   ├── ClassRepository.java
│       │   │               │   ├── LessonRepository.java
│       │   │               │   ├── StudentRepository.java
│       │   │               │   └── TeacherRepository.java
│       │   │               └── service/
│       │   │                   └── NeoService.java
│       │   └── resources/
│       │       └── application.yml
│       └── test/
│           └── java/
│               └── com/
│                   └── xkcoding/
│                       └── neo4j/
│                           ├── Neo4jTest.java
│                           └── SpringBootDemoNeo4jApplicationTests.java
├── demo-oauth/
│   ├── .gitignore
│   ├── README.md
│   ├── oauth-authorization-server/
│   │   ├── README.adoc
│   │   ├── pom.xml
│   │   └── src/
│   │       ├── main/
│   │       │   ├── java/
│   │       │   │   └── com/
│   │       │   │       └── xkcoding/
│   │       │   │           └── oauth/
│   │       │   │               ├── SpringBootDemoOauthApplication.java
│   │       │   │               ├── config/
│   │       │   │               │   ├── ClientLoginFailureHandler.java
│   │       │   │               │   ├── ClientLogoutSuccessHandler.java
│   │       │   │               │   ├── Oauth2AuthorizationServerConfig.java
│   │       │   │               │   ├── Oauth2AuthorizationTokenConfig.java
│   │       │   │               │   ├── WebSecurityConfig.java
│   │       │   │               │   └── package-info.java
│   │       │   │               ├── controller/
│   │       │   │               │   ├── AuthorizationController.java
│   │       │   │               │   ├── Oauth2Controller.java
│   │       │   │               │   └── package-info.java
│   │       │   │               ├── entity/
│   │       │   │               │   ├── SysClientDetails.java
│   │       │   │               │   ├── SysRole.java
│   │       │   │               │   └── SysUser.java
│   │       │   │               ├── repostiory/
│   │       │   │               │   ├── SysClientDetailsRepository.java
│   │       │   │               │   └── SysUserRepository.java
│   │       │   │               └── service/
│   │       │   │                   ├── SysClientDetailsService.java
│   │       │   │                   ├── SysUserService.java
│   │       │   │                   ├── impl/
│   │       │   │                   │   ├── SysClientDetailsServiceImpl.java
│   │       │   │                   │   └── SysUserServiceImpl.java
│   │       │   │                   └── package-info.java
│   │       │   └── resources/
│   │       │       ├── application.yml
│   │       │       ├── oauth2.jks
│   │       │       ├── public.txt
│   │       │       └── templates/
│   │       │           ├── authorization.html
│   │       │           ├── common/
│   │       │           │   └── common.html
│   │       │           ├── error.html
│   │       │           ├── login.html
│   │       │           ├── logout.html
│   │       │           └── registerTemplate.html
│   │       └── test/
│   │           ├── java/
│   │           │   └── com/
│   │           │       └── xkcoding/
│   │           │           └── oauth/
│   │           │               ├── PasswordEncodeTest.java
│   │           │               ├── oauth/
│   │           │               │   ├── AuthorizationCodeGrantTests.java
│   │           │               │   ├── AuthorizationServerInfo.java
│   │           │               │   └── ResourceOwnerPasswordGrantTests.java
│   │           │               └── repostiory/
│   │           │                   ├── SysClientDetailsTest.java
│   │           │                   └── SysUserRepositoryTest.java
│   │           └── resources/
│   │               ├── application.yml
│   │               ├── import.sql
│   │               └── schema.sql
│   ├── oauth-resource-server/
│   │   ├── README.adoc
│   │   ├── pom.xml
│   │   └── src/
│   │       ├── main/
│   │       │   ├── java/
│   │       │   │   └── com/
│   │       │   │       └── xkcoding/
│   │       │   │           └── oauth/
│   │       │   │               ├── SpringBootDemoResourceApplication.java
│   │       │   │               ├── config/
│   │       │   │               │   ├── OauthResourceServerConfig.java
│   │       │   │               │   └── OauthResourceTokenConfig.java
│   │       │   │               └── controller/
│   │       │   │                   └── TestController.java
│   │       │   └── resources/
│   │       │       └── application.yml
│   │       └── test/
│   │           └── java/
│   │               └── com/
│   │                   └── xkcoding/
│   │                       └── oauth/
│   │                           ├── AuthorizationTest.java
│   │                           └── controller/
│   │                               └── TestControllerTest.java
│   └── pom.xml
├── demo-orm-beetlsql/
│   ├── .gitignore
│   ├── README.md
│   ├── pom.xml
│   └── src/
│       ├── main/
│       │   ├── java/
│       │   │   └── com/
│       │   │       └── xkcoding/
│       │   │           └── orm/
│       │   │               └── beetlsql/
│       │   │                   ├── SpringBootDemoOrmBeetlsqlApplication.java
│       │   │                   ├── config/
│       │   │                   │   └── BeetlConfig.java
│       │   │                   ├── dao/
│       │   │                   │   └── UserDao.java
│       │   │                   ├── entity/
│       │   │                   │   └── User.java
│       │   │                   └── service/
│       │   │                       ├── UserService.java
│       │   │                       └── impl/
│       │   │                           └── UserServiceImpl.java
│       │   └── resources/
│       │       ├── application.yml
│       │       └── db/
│       │           ├── data.sql
│       │           └── schema.sql
│       └── test/
│           └── java/
│               └── com/
│                   └── xkcoding/
│                       └── orm/
│                           └── beetlsql/
│                               ├── SpringBootDemoOrmBeetlsqlApplicationTests.java
│                               └── service/
│                                   └── UserServiceTest.java
├── demo-orm-jdbctemplate/
│   ├── .gitignore
│   ├── README.md
│   ├── pom.xml
│   └── src/
│       ├── main/
│       │   ├── java/
│       │   │   └── com/
│       │   │       └── xkcoding/
│       │   │           └── orm/
│       │   │               └── jdbctemplate/
│       │   │                   ├── SpringBootDemoOrmJdbctemplateApplication.java
│       │   │                   ├── annotation/
│       │   │                   │   ├── Column.java
│       │   │                   │   ├── Ignore.java
│       │   │                   │   ├── Pk.java
│       │   │                   │   └── Table.java
│       │   │                   ├── constant/
│       │   │                   │   └── Const.java
│       │   │                   ├── controller/
│       │   │                   │   └── UserController.java
│       │   │                   ├── dao/
│       │   │                   │   ├── UserDao.java
│       │   │                   │   └── base/
│       │   │                   │       └── BaseDao.java
│       │   │                   ├── entity/
│       │   │                   │   └── User.java
│       │   │                   └── service/
│       │   │                       ├── IUserService.java
│       │   │                       └── impl/
│       │   │                           └── UserServiceImpl.java
│       │   └── resources/
│       │       ├── application.yml
│       │       └── db/
│       │           ├── data.sql
│       │           └── schema.sql
│       └── test/
│           └── java/
│               └── com/
│                   └── xkcoding/
│                       └── orm/
│                           └── jdbctemplate/
│                               └── SpringBootDemoOrmJdbctemplateApplicationTests.java
├── demo-orm-jpa/
│   ├── .gitignore
│   ├── README.md
│   ├── pom.xml
│   └── src/
│       ├── main/
│       │   ├── java/
│       │   │   └── com/
│       │   │       └── xkcoding/
│       │   │           └── orm/
│       │   │               └── jpa/
│       │   │                   ├── SpringBootDemoOrmJpaApplication.java
│       │   │                   ├── config/
│       │   │                   │   └── JpaConfig.java
│       │   │                   ├── entity/
│       │   │                   │   ├── Department.java
│       │   │                   │   ├── User.java
│       │   │                   │   └── base/
│       │   │                   │       └── AbstractAuditModel.java
│       │   │                   └── repository/
│       │   │                       ├── DepartmentDao.java
│       │   │                       └── UserDao.java
│       │   └── resources/
│       │       ├── application.yml
│       │       └── db/
│       │           ├── data.sql
│       │           └── schema.sql
│       └── test/
│           └── java/
│               └── com/
│                   └── xkcoding/
│                       └── orm/
│                           └── jpa/
│                               ├── SpringBootDemoOrmJpaApplicationTests.java
│                               └── repository/
│                                   ├── DepartmentDaoTest.java
│                                   └── UserDaoTest.java
├── demo-orm-mybatis/
│   ├── .gitignore
│   ├── README.md
│   ├── pom.xml
│   └── src/
│       ├── main/
│       │   ├── java/
│       │   │   └── com/
│       │   │       └── xkcoding/
│       │   │           └── orm/
│       │   │               └── mybatis/
│       │   │                   ├── SpringBootDemoOrmMybatisApplication.java
│       │   │                   ├── entity/
│       │   │                   │   └── User.java
│       │   │                   └── mapper/
│       │   │                       └── UserMapper.java
│       │   └── resources/
│       │       ├── application.yml
│       │       ├── db/
│       │       │   ├── data.sql
│       │       │   └── schema.sql
│       │       └── mappers/
│       │           └── UserMapper.xml
│       └── test/
│           └── java/
│               └── com/
│                   └── xkcoding/
│                       └── orm/
│                           └── mybatis/
│                               ├── SpringBootDemoOrmMybatisApplicationTests.java
│                               └── mapper/
│                                   └── UserMapperTest.java
├── demo-orm-mybatis-mapper-page/
│   ├── .gitignore
│   ├── README.md
│   ├── pom.xml
│   └── src/
│       ├── main/
│       │   ├── java/
│       │   │   └── com/
│       │   │       └── xkcoding/
│       │   │           └── orm/
│       │   │               └── mybatis/
│       │   │                   └── MapperAndPage/
│       │   │                       ├── SpringBootDemoOrmMybatisMapperPageApplication.java
│       │   │                       ├── entity/
│       │   │                       │   └── User.java
│       │   │                       └── mapper/
│       │   │                           └── UserMapper.java
│       │   └── resources/
│       │       ├── application.yml
│       │       └── db/
│       │           ├── data.sql
│       │           └── schema.sql
│       └── test/
│           └── java/
│               └── com/
│                   └── xkcoding/
│                       └── orm/
│                           └── mybatis/
│                               └── MapperAndPage/
│                                   ├── SpringBootDemoOrmMybatisMapperPageApplicationTests.java
│                                   └── mapper/
│                                       └── UserMapperTest.java
├── demo-orm-mybatis-plus/
│   ├── .gitignore
│   ├── README.md
│   ├── pom.xml
│   └── src/
│       ├── main/
│       │   ├── java/
│       │   │   └── com/
│       │   │       └── xkcoding/
│       │   │           └── orm/
│       │   │               └── mybatis/
│       │   │                   └── plus/
│       │   │                       ├── SpringBootDemoOrmMybatisPlusApplication.java
│       │   │                       ├── config/
│       │   │                       │   ├── CommonFieldHandler.java
│       │   │                       │   └── MybatisPlusConfig.java
│       │   │                       ├── entity/
│       │   │                       │   ├── Role.java
│       │   │                       │   └── User.java
│       │   │                       ├── mapper/
│       │   │                       │   ├── RoleMapper.java
│       │   │                       │   └── UserMapper.java
│       │   │                       └── service/
│       │   │                           ├── UserService.java
│       │   │                           └── impl/
│       │   │                               └── UserServiceImpl.java
│       │   └── resources/
│       │       ├── application.yml
│       │       └── db/
│       │           ├── data.sql
│       │           └── schema.sql
│       └── test/
│           └── java/
│               └── com/
│                   └── xkcoding/
│                       └── orm/
│                           └── mybatis/
│                               └── plus/
│                                   ├── SpringBootDemoOrmMybatisPlusApplicationTests.java
│                                   ├── activerecord/
│                                   │   └── ActiveRecordTest.java
│                                   └── service/
│                                       └── UserServiceTest.java
├── demo-pay/
│   ├── .gitignore
│   ├── README.md
│   ├── pom.xml
│   └── src/
│       ├── main/
│       │   ├── java/
│       │   │   └── com/
│       │   │       └── xkcoding/
│       │   │           └── pay/
│       │   │               └── SpringBootDemoPayApplication.java
│       │   └── resources/
│       │       └── application.yml
│       └── test/
│           └── java/
│               └── com/
│                   └── xkcoding/
│                       └── pay/
│                           └── SpringBootDemoPayApplicationTests.java
├── demo-properties/
│   ├── .gitignore
│   ├── README.md
│   ├── pom.xml
│   └── src/
│       ├── main/
│       │   ├── java/
│       │   │   └── com/
│       │   │       └── xkcoding/
│       │   │           └── properties/
│       │   │               ├── SpringBootDemoPropertiesApplication.java
│       │   │               ├── controller/
│       │   │               │   └── PropertyController.java
│       │   │               └── property/
│       │   │                   ├── ApplicationProperty.java
│       │   │                   └── DeveloperProperty.java
│       │   └── resources/
│       │       ├── META-INF/
│       │       │   └── additional-spring-configuration-metadata.json
│       │       ├── application-dev.yml
│       │       ├── application-prod.yml
│       │       └── application.yml
│       └── test/
│           └── java/
│               └── com/
│                   └── xkcoding/
│                       └── properties/
│                           └── SpringBootDemoPropertiesApplicationTests.java
├── demo-ratelimit-guava/
│   ├── .gitignore
│   ├── README.md
│   ├── pom.xml
│   └── src/
│       ├── main/
│       │   ├── java/
│       │   │   └── com/
│       │   │       └── xkcoding/
│       │   │           └── ratelimit/
│       │   │               └── guava/
│       │   │                   ├── SpringBootDemoRatelimitGuavaApplication.java
│       │   │                   ├── annotation/
│       │   │                   │   └── RateLimiter.java
│       │   │                   ├── aspect/
│       │   │                   │   └── RateLimiterAspect.java
│       │   │                   ├── controller/
│       │   │                   │   └── TestController.java
│       │   │                   └── handler/
│       │   │                       └── GlobalExceptionHandler.java
│       │   └── resources/
│       │       └── application.yml
│       └── test/
│           └── java/
│               └── com/
│                   └── xkcoding/
│                       └── ratelimit/
│                           └── guava/
│                               └── SpringBootDemoRatelimitGuavaApplicationTests.java
├── demo-ratelimit-redis/
│   ├── .gitignore
│   ├── README.md
│   ├── pom.xml
│   └── src/
│       ├── main/
│       │   ├── java/
│       │   │   └── com/
│       │   │       └── xkcoding/
│       │   │           └── ratelimit/
│       │   │               └── redis/
│       │   │                   ├── SpringBootDemoRatelimitRedisApplication.java
│       │   │                   ├── annotation/
│       │   │                   │   └── RateLimiter.java
│       │   │                   ├── aspect/
│       │   │                   │   └── RateLimiterAspect.java
│       │   │                   ├── config/
│       │   │                   │   └── RedisConfig.java
│       │   │                   ├── controller/
│       │   │                   │   └── TestController.java
│       │   │                   ├── handler/
│       │   │                   │   └── GlobalExceptionHandler.java
│       │   │                   └── util/
│       │   │                       └── IpUtil.java
│       │   └── resources/
│       │       ├── application.yml
│       │       └── scripts/
│       │           └── redis/
│       │               └── limit.lua
│       └── test/
│           └── java/
│               └── com/
│                   └── xkcoding/
│                       └── ratelimit/
│                           └── redis/
│                               └── SpringBootDemoRatelimiterRedisApplicationTests.java
├── demo-rbac-security/
│   ├── .gitignore
│   ├── README.md
│   ├── pom.xml
│   ├── sql/
│   │   └── security.sql
│   └── src/
│       ├── main/
│       │   ├── java/
│       │   │   └── com/
│       │   │       └── xkcoding/
│       │   │           └── rbac/
│       │   │               └── security/
│       │   │                   ├── SpringBootDemoRbacSecurityApplication.java
│       │   │                   ├── common/
│       │   │                   │   ├── ApiResponse.java
│       │   │                   │   ├── BaseException.java
│       │   │                   │   ├── Consts.java
│       │   │                   │   ├── IStatus.java
│       │   │                   │   ├── PageResult.java
│       │   │                   │   └── Status.java
│       │   │                   ├── config/
│       │   │                   │   ├── CustomConfig.java
│       │   │                   │   ├── IdConfig.java
│       │   │                   │   ├── IgnoreConfig.java
│       │   │                   │   ├── JwtAuthenticationFilter.java
│       │   │                   │   ├── JwtConfig.java
│       │   │                   │   ├── RbacAuthorityService.java
│       │   │                   │   ├── RedisConfig.java
│       │   │                   │   ├── SecurityConfig.java
│       │   │                   │   ├── SecurityHandlerConfig.java
│       │   │                   │   └── WebMvcConfig.java
│       │   │                   ├── controller/
│       │   │                   │   ├── AuthController.java
│       │   │                   │   ├── MonitorController.java
│       │   │                   │   └── TestController.java
│       │   │                   ├── exception/
│       │   │                   │   ├── SecurityException.java
│       │   │                   │   └── handler/
│       │   │                   │       └── GlobalExceptionHandler.java
│       │   │                   ├── model/
│       │   │                   │   ├── Permission.java
│       │   │                   │   ├── Role.java
│       │   │                   │   ├── RolePermission.java
│       │   │                   │   ├── User.java
│       │   │                   │   ├── UserRole.java
│       │   │                   │   └── unionkey/
│       │   │                   │       ├── RolePermissionKey.java
│       │   │                   │       └── UserRoleKey.java
│       │   │                   ├── payload/
│       │   │                   │   ├── LoginRequest.java
│       │   │                   │   └── PageCondition.java
│       │   │                   ├── repository/
│       │   │                   │   ├── PermissionDao.java
│       │   │                   │   ├── RoleDao.java
│       │   │                   │   ├── RolePermissionDao.java
│       │   │                   │   ├── UserDao.java
│       │   │                   │   └── UserRoleDao.java
│       │   │                   ├── service/
│       │   │                   │   ├── CustomUserDetailsService.java
│       │   │                   │   └── MonitorService.java
│       │   │                   ├── util/
│       │   │                   │   ├── JwtUtil.java
│       │   │                   │   ├── PageUtil.java
│       │   │                   │   ├── RedisUtil.java
│       │   │                   │   ├── ResponseUtil.java
│       │   │                   │   └── SecurityUtil.java
│       │   │                   └── vo/
│       │   │                       ├── JwtResponse.java
│       │   │                       ├── OnlineUser.java
│       │   │                       └── UserPrincipal.java
│       │   └── resources/
│       │       └── application.yml
│       └── test/
│           └── java/
│               └── com/
│                   └── xkcoding/
│                       └── rbac/
│                           └── security/
│                               ├── SpringBootDemoRbacSecurityApplicationTests.java
│                               ├── repository/
│                               │   ├── DataInitTest.java
│                               │   └── UserDaoTest.java
│                               └── util/
│                                   └── RedisUtilTest.java
├── demo-rbac-shiro/
│   ├── .gitignore
│   ├── pom.xml
│   ├── sql/
│   │   └── shiro.sql
│   └── src/
│       ├── main/
│       │   ├── java/
│       │   │   └── com/
│       │   │       └── xkcoding/
│       │   │           └── rbac/
│       │   │               └── shiro/
│       │   │                   ├── SpringBootDemoRbacShiroApplication.java
│       │   │                   ├── common/
│       │   │                   │   ├── IResultCode.java
│       │   │                   │   ├── R.java
│       │   │                   │   └── ResultCode.java
│       │   │                   ├── config/
│       │   │                   │   └── MybatisPlusConfig.java
│       │   │                   └── controller/
│       │   │                       └── TestController.java
│       │   └── resources/
│       │       ├── application.yml
│       │       └── spy.properties
│       └── test/
│           └── java/
│               └── com/
│                   └── xkcoding/
│                       └── rbac/
│                           └── shiro/
│                               └── SpringBootDemoRbacShiroApplicationTests.java
├── demo-session/
│   ├── .gitignore
│   ├── README.md
│   ├── pom.xml
│   └── src/
│       ├── main/
│       │   ├── java/
│       │   │   └── com/
│       │   │       └── xkcoding/
│       │   │           └── session/
│       │   │               ├── SpringBootDemoSessionApplication.java
│       │   │               ├── config/
│       │   │               │   └── WebMvcConfig.java
│       │   │               ├── constants/
│       │   │               │   └── Consts.java
│       │   │               ├── controller/
│       │   │               │   └── PageController.java
│       │   │               └── interceptor/
│       │   │                   └── SessionInterceptor.java
│       │   └── resources/
│       │       ├── application.yml
│       │       └── templates/
│       │           ├── index.html
│       │           └── login.html
│       └── test/
│           └── java/
│               └── com/
│                   └── xkcoding/
│                       └── session/
│                           └── SpringBootDemoSessionApplicationTests.java
├── demo-sharding-jdbc/
│   ├── .gitignore
│   ├── README.md
│   ├── pom.xml
│   ├── sql/
│   │   └── schema.sql
│   └── src/
│       ├── main/
│       │   ├── java/
│       │   │   └── com/
│       │   │       └── xkcoding/
│       │   │           └── sharding/
│       │   │               └── jdbc/
│       │   │                   ├── SpringBootDemoShardingJdbcApplication.java
│       │   │                   ├── config/
│       │   │                   │   ├── CustomSnowflakeKeyGenerator.java
│       │   │                   │   └── DataSourceShardingConfig.java
│       │   │                   ├── mapper/
│       │   │                   │   └── OrderMapper.java
│       │   │                   └── model/
│       │   │                       └── Order.java
│       │   └── resources/
│       │       └── application.yml
│       └── test/
│           └── java/
│               └── com/
│                   └── xkcoding/
│                       └── sharding/
│                           └── jdbc/
│                               └── SpringBootDemoShardingJdbcApplicationTests.java
├── demo-social/
│   ├── .gitignore
│   ├── README.md
│   ├── pom.xml
│   └── src/
│       ├── main/
│       │   ├── java/
│       │   │   └── com/
│       │   │       └── xkcoding/
│       │   │           └── social/
│       │   │               ├── SpringBootDemoSocialApplication.java
│       │   │               └── controller/
│       │   │                   └── OauthController.java
│       │   └── resources/
│       │       └── application.yml
│       └── test/
│           └── java/
│               └── com/
│                   └── xkcoding/
│                       └── social/
│                           └── SpringBootDemoSocialApplicationTests.java
├── demo-swagger/
│   ├── .gitignore
│   ├── README.md
│   ├── pom.xml
│   └── src/
│       ├── main/
│       │   ├── java/
│       │   │   └── com/
│       │   │       └── xkcoding/
│       │   │           └── swagger/
│       │   │               ├── SpringBootDemoSwaggerApplication.java
│       │   │               ├── common/
│       │   │               │   ├── ApiResponse.java
│       │   │               │   ├── DataType.java
│       │   │               │   └── ParamType.java
│       │   │               ├── config/
│       │   │               │   └── Swagger2Config.java
│       │   │               ├── controller/
│       │   │               │   └── UserController.java
│       │   │               └── entity/
│       │   │                   └── User.java
│       │   └── resources/
│       │       └── application.yml
│       └── test/
│           └── java/
│               └── com/
│                   └── xkcoding/
│                       └── swagger/
│                           └── SpringBootDemoSwaggerApplicationTests.java
├── demo-swagger-beauty/
│   ├── .gitignore
│   ├── README.md
│   ├── pom.xml
│   └── src/
│       ├── main/
│       │   ├── java/
│       │   │   └── com/
│       │   │       └── xkcoding/
│       │   │           └── swagger/
│       │   │               └── beauty/
│       │   │                   ├── SpringBootDemoSwaggerBeautyApplication.java
│       │   │                   ├── common/
│       │   │                   │   └── ApiResponse.java
│       │   │                   ├── controller/
│       │   │                   │   └── UserController.java
│       │   │                   └── entity/
│       │   │                       └── User.java
│       │   └── resources/
│       │       └── application.yml
│       └── test/
│           └── java/
│               └── com/
│                   └── xkcoding/
│                       └── swagger/
│                           └── beauty/
│                               └── SpringBootDemoSwaggerBeautyApplicationTests.java
├── demo-task/
│   ├── .gitignore
│   ├── README.md
│   ├── pom.xml
│   └── src/
│       ├── main/
│       │   ├── java/
│       │   │   └── com/
│       │   │       └── xkcoding/
│       │   │           └── task/
│       │   │               ├── SpringBootDemoTaskApplication.java
│       │   │               ├── config/
│       │   │               │   └── TaskConfig.java
│       │   │               └── job/
│       │   │                   └── TaskJob.java
│       │   └── resources/
│       │       └── application.yml
│       └── test/
│           └── java/
│               └── com/
│                   └── xkcoding/
│                       └── task/
│                           └── SpringBootDemoTaskApplicationTests.java
├── demo-task-quartz/
│   ├── .gitignore
│   ├── README.md
│   ├── init/
│   │   └── dbTables/
│   │       ├── tables_cloudscape.sql
│   │       ├── tables_cubrid.sql
│   │       ├── tables_db2.sql
│   │       ├── tables_db2_v72.sql
│   │       ├── tables_db2_v8.sql
│   │       ├── tables_db2_v95.sql
│   │       ├── tables_derby.sql
│   │       ├── tables_derby_previous.sql
│   │       ├── tables_firebird.sql
│   │       ├── tables_h2.sql
│   │       ├── tables_hsqldb.sql
│   │       ├── tables_hsqldb_old.sql
│   │       ├── tables_informix.sql
│   │       ├── tables_mysql.sql
│   │       ├── tables_mysql_innodb.sql
│   │       ├── tables_oracle.sql
│   │       ├── tables_pointbase.sql
│   │       ├── tables_postgres.sql
│   │       ├── tables_sapdb.sql
│   │       ├── tables_solid.sql
│   │       ├── tables_sqlServer.sql
│   │       └── tables_sybase.sql
│   ├── pom.xml
│   └── src/
│       ├── main/
│       │   ├── java/
│       │   │   └── com/
│       │   │       └── xkcoding/
│       │   │           └── task/
│       │   │               └── quartz/
│       │   │                   ├── SpringBootDemoTaskQuartzApplication.java
│       │   │                   ├── common/
│       │   │                   │   └── ApiResponse.java
│       │   │                   ├── controller/
│       │   │                   │   └── JobController.java
│       │   │                   ├── entity/
│       │   │                   │   ├── domain/
│       │   │                   │   │   └── JobAndTrigger.java
│       │   │                   │   └── form/
│       │   │                   │       └── JobForm.java
│       │   │                   ├── job/
│       │   │                   │   ├── HelloJob.java
│       │   │                   │   ├── TestJob.java
│       │   │                   │   └── base/
│       │   │                   │       └── BaseJob.java
│       │   │                   ├── mapper/
│       │   │                   │   └── JobMapper.java
│       │   │                   ├── service/
│       │   │                   │   ├── JobService.java
│       │   │                   │   └── impl/
│       │   │                   │       └── JobServiceImpl.java
│       │   │                   └── util/
│       │   │                       └── JobUtil.java
│       │   └── resources/
│       │       ├── application.yml
│       │       ├── mappers/
│       │       │   └── JobMapper.xml
│       │       └── static/
│       │           └── job.html
│       └── test/
│           └── java/
│               └── com/
│                   └── xkcoding/
│                       └── task/
│                           └── quartz/
│                               └── SpringBootDemoTaskQuartzApplicationTests.java
├── demo-task-xxl-job/
│   ├── .gitignore
│   ├── README.md
│   ├── pom.xml
│   └── src/
│       └── main/
│           ├── java/
│           │   └── com/
│           │       └── xkcoding/
│           │           └── task/
│           │               └── xxl/
│           │                   └── job/
│           │                       ├── SpringBootDemoTaskXxlJobApplication.java
│           │                       ├── config/
│           │                       │   ├── XxlJobConfig.java
│           │                       │   └── props/
│           │                       │       └── XxlJobProps.java
│           │                       ├── controller/
│           │                       │   └── ManualOperateController.java
│           │                       └── task/
│           │                           └── DemoTask.java
│           └── resources/
│               └── application.yml
├── demo-template-beetl/
│   ├── .gitignore
│   ├── README.md
│   ├── pom.xml
│   └── src/
│       ├── main/
│       │   ├── java/
│       │   │   └── com/
│       │   │       └── xkcoding/
│       │   │           └── template/
│       │   │               └── beetl/
│       │   │                   ├── SpringBootDemoTemplateBeetlApplication.java
│       │   │                   ├── controller/
│       │   │                   │   ├── IndexController.java
│       │   │                   │   └── UserController.java
│       │   │                   └── model/
│       │   │                       └── User.java
│       │   └── resources/
│       │       ├── application.yml
│       │       └── templates/
│       │           ├── common/
│       │           │   └── head.html
│       │           └── page/
│       │               ├── index.btl
│       │               └── login.btl
│       └── test/
│           └── java/
│               └── com/
│                   └── xkcoding/
│                       └── template/
│                           └── beetl/
│                               └── SpringBootDemoTemplateBeetlApplicationTests.java
├── demo-template-enjoy/
│   ├── .gitignore
│   ├── README.md
│   ├── pom.xml
│   └── src/
│       ├── main/
│       │   ├── java/
│       │   │   └── com/
│       │   │       └── xkcoding/
│       │   │           └── template/
│       │   │               └── enjoy/
│       │   │                   ├── SpringBootDemoTemplateEnjoyApplication.java
│       │   │                   ├── config/
│       │   │                   │   └── EnjoyConfig.java
│       │   │                   ├── controller/
│       │   │                   │   ├── IndexController.java
│       │   │                   │   └── UserController.java
│       │   │                   └── model/
│       │   │                       └── User.java
│       │   └── resources/
│       │       ├── application.yml
│       │       └── templates/
│       │           ├── common/
│       │           │   └── head.html
│       │           └── page/
│       │               ├── index.html
│       │               └── login.html
│       └── test/
│           └── java/
│               └── com/
│                   └── xkcoding/
│                       └── template/
│                           └── enjoy/
│                               └── SpringBootDemoTemplateEnjoyApplicationTests.java
├── demo-template-freemarker/
│   ├── .gitignore
│   ├── README.md
│   ├── pom.xml
│   └── src/
│       ├── main/
│       │   ├── java/
│       │   │   └── com/
│       │   │       └── xkcoding/
│       │   │           └── template/
│       │   │               └── freemarker/
│       │   │                   ├── SpringBootDemoTemplateFreemarkerApplication.java
│       │   │                   ├── controller/
│       │   │                   │   ├── IndexController.java
│       │   │                   │   └── UserController.java
│       │   │                   └── model/
│       │   │                       └── User.java
│       │   └── resources/
│       │       ├── application.yml
│       │       └── templates/
│       │           ├── common/
│       │           │   └── head.ftl
│       │           └── page/
│       │               ├── index.ftl
│       │               └── login.ftl
│       └── test/
│           └── java/
│               └── com/
│                   └── xkcoding/
│                       └── template/
│                           └── freemarker/
│                               └── SpringBootDemoTemplateFreemarkerApplicationTests.java
├── demo-template-thymeleaf/
│   ├── .gitignore
│   ├── README.md
│   ├── pom.xml
│   └── src/
│       ├── main/
│       │   ├── java/
│       │   │   └── com/
│       │   │       └── xkcoding/
│       │   │           └── template/
│       │   │               └── thymeleaf/
│       │   │                   ├── SpringBootDemoTemplateThymeleafApplication.java
│       │   │                   ├── controller/
│       │   │                   │   ├── IndexController.java
│       │   │                   │   └── UserController.java
│       │   │                   └── model/
│       │   │                       └── User.java
│       │   └── resources/
│       │       ├── application.yml
│       │       └── templates/
│       │           ├── common/
│       │           │   └── head.html
│       │           └── page/
│       │               ├── index.html
│       │               └── login.html
│       └── test/
│           └── java/
│               └── com/
│                   └── xkcoding/
│                       └── template/
│                           └── thymeleaf/
│                               └── SpringBootDemoTemplateThymeleafApplicationTests.java
├── demo-tio/
│   ├── .gitignore
│   ├── README.md
│   ├── pom.xml
│   └── src/
│       ├── main/
│       │   ├── java/
│       │   │   └── com/
│       │   │       └── xkcoding/
│       │   │           └── springbootdemotio/
│       │   │               └── SpringBootDemoTioApplication.java
│       │   └── resources/
│       │       └── application.properties
│       └── test/
│           └── java/
│               └── com/
│                   └── xkcoding/
│                       └── springbootdemotio/
│                           └── SpringBootDemoTioApplicationTests.java
├── demo-uflo/
│   ├── .gitignore
│   ├── pom.xml
│   └── src/
│       ├── main/
│       │   ├── java/
│       │   │   └── com/
│       │   │       └── xkcoding/
│       │   │           └── uflo/
│       │   │               └── SpringBootDemoUfloApplication.java
│       │   └── resources/
│       │       └── application.properties
│       └── test/
│           └── java/
│               └── com/
│                   └── xkcoding/
│                       └── uflo/
│                           └── SpringBootDemoUfloApplicationTests.java
├── demo-upload/
│   ├── .gitignore
│   ├── README.md
│   ├── pom.xml
│   └── src/
│       ├── main/
│       │   ├── java/
│       │   │   └── com/
│       │   │       └── xkcoding/
│       │   │           └── upload/
│       │   │               ├── SpringBootDemoUploadApplication.java
│       │   │               ├── config/
│       │   │               │   └── UploadConfig.java
│       │   │               ├── controller/
│       │   │               │   ├── IndexController.java
│       │   │               │   └── UploadController.java
│       │   │               └── service/
│       │   │                   ├── IQiNiuService.java
│       │   │                   └── impl/
│       │   │                       └── QiNiuServiceImpl.java
│       │   └── resources/
│       │       ├── application.yml
│       │       └── templates/
│       │           └── index.html
│       └── test/
│           └── java/
│               └── com/
│                   └── xkcoding/
│                       └── upload/
│                           └── SpringBootDemoUploadApplicationTests.java
├── demo-ureport2/
│   ├── .gitignore
│   ├── README.md
│   ├── doc/
│   │   ├── sql/
│   │   │   └── t_user_ureport2.sql
│   │   └── ureport2/
│   │       └── user_inner_datasource.ureport.xml
│   ├── pom.xml
│   └── src/
│       ├── main/
│       │   ├── java/
│       │   │   └── com/
│       │   │       └── xkcoding/
│       │   │           └── ureport2/
│       │   │               ├── SpringBootDemoUreport2Application.java
│       │   │               └── config/
│       │   │                   └── InnerDatasource.java
│       │   └── resources/
│       │       └── application.yml
│       └── test/
│           └── java/
│               └── com/
│                   └── xkcoding/
│                       └── ureport2/
│                           └── SpringBootDemoUreport2ApplicationTests.java
├── demo-urule/
│   ├── .gitignore
│   ├── pom.xml
│   └── src/
│       ├── main/
│       │   ├── java/
│       │   │   └── com/
│       │   │       └── xkcoding/
│       │   │           └── urule/
│       │   │               └── SpringBootDemoUruleApplication.java
│       │   └── resources/
│       │       └── application.properties
│       └── test/
│           └── java/
│               └── com/
│                   └── xkcoding/
│                       └── urule/
│                           └── SpringBootDemoUruleApplicationTests.java
├── demo-war/
│   ├── .gitignore
│   ├── README.md
│   ├── pom.xml
│   └── src/
│       ├── main/
│       │   ├── java/
│       │   │   └── com/
│       │   │       └── xkcoding/
│       │   │           └── war/
│       │   │               └── SpringBootDemoWarApplication.java
│       │   └── resources/
│       │       └── application.yml
│       └── test/
│           └── java/
│               └── com/
│                   └── xkcoding/
│                       └── war/
│                           └── SpringBootDemoWarApplicationTests.java
├── demo-websocket/
│   ├── .gitignore
│   ├── README.md
│   ├── pom.xml
│   └── src/
│       ├── main/
│       │   ├── java/
│       │   │   └── com/
│       │   │       └── xkcoding/
│       │   │           └── websocket/
│       │   │               ├── SpringBootDemoWebsocketApplication.java
│       │   │               ├── common/
│       │   │               │   └── WebSocketConsts.java
│       │   │               ├── config/
│       │   │               │   └── WebSocketConfig.java
│       │   │               ├── controller/
│       │   │               │   └── ServerController.java
│       │   │               ├── model/
│       │   │               │   ├── Server.java
│       │   │               │   └── server/
│       │   │               │       ├── Cpu.java
│       │   │               │       ├── Jvm.java
│       │   │               │       ├── Mem.java
│       │   │               │       ├── Sys.java
│       │   │               │       └── SysFile.java
│       │   │               ├── payload/
│       │   │               │   ├── KV.java
│       │   │               │   ├── ServerVO.java
│       │   │               │   └── server/
│       │   │               │       ├── CpuVO.java
│       │   │               │       ├── JvmVO.java
│       │   │               │       ├── MemVO.java
│       │   │               │       ├── SysFileVO.java
│       │   │               │       └── SysVO.java
│       │   │               ├── task/
│       │   │               │   └── ServerTask.java
│       │   │               └── util/
│       │   │                   ├── IpUtil.java
│       │   │                   └── ServerUtil.java
│       │   └── resources/
│       │       ├── application.yml
│       │       └── static/
│       │           ├── js/
│       │           │   └── stomp.js
│       │           └── server.html
│       └── test/
│           └── java/
│               └── com/
│                   └── xkcoding/
│                       └── websocket/
│                           └── SpringBootDemoWebsocketApplicationTests.java
├── demo-websocket-socketio/
│   ├── .gitignore
│   ├── README.md
│   ├── pom.xml
│   └── src/
│       ├── main/
│       │   ├── java/
│       │   │   └── com/
│       │   │       └── xkcoding/
│       │   │           └── websocket/
│       │   │               └── socketio/
│       │   │                   ├── SpringBootDemoWebsocketSocketioApplication.java
│       │   │                   ├── config/
│       │   │                   │   ├── DbTemplate.java
│       │   │                   │   ├── Event.java
│       │   │                   │   ├── ServerConfig.java
│       │   │                   │   └── WsConfig.java
│       │   │                   ├── controller/
│       │   │                   │   └── MessageController.java
│       │   │                   ├── handler/
│       │   │                   │   └── MessageEventHandler.java
│       │   │                   ├── init/
│       │   │                   │   └── ServerRunner.java
│       │   │                   └── payload/
│       │   │                       ├── BroadcastMessageRequest.java
│       │   │                       ├── GroupMessageRequest.java
│       │   │                       ├── JoinRequest.java
│       │   │                       └── SingleMessageRequest.java
│       │   └── resources/
│       │       ├── application.yml
│       │       └── static/
│       │           ├── bootstrap.css
│       │           ├── index.html
│       │           └── js/
│       │               └── socket.io/
│       │                   └── socket.io.js
│       └── test/
│           └── java/
│               └── com/
│                   └── xkcoding/
│                       └── websocket/
│                           └── socketio/
│                               └── SpringBootDemoWebsocketSocketioApplicationTests.java
├── demo-zookeeper/
│   ├── .gitignore
│   ├── README.md
│   ├── pom.xml
│   └── src/
│       ├── main/
│       │   ├── java/
│       │   │   └── com/
│       │   │       └── xkcoding/
│       │   │           └── zookeeper/
│       │   │               ├── SpringBootDemoZookeeperApplication.java
│       │   │               ├── annotation/
│       │   │               │   ├── LockKeyParam.java
│       │   │               │   └── ZooLock.java
│       │   │               ├── aspectj/
│       │   │               │   └── ZooLockAspect.java
│       │   │               └── config/
│       │   │                   ├── ZkConfig.java
│       │   │                   └── props/
│       │   │                       └── ZkProps.java
│       │   └── resources/
│       │       └── application.yml
│       └── test/
│           └── java/
│               └── com/
│                   └── xkcoding/
│                       └── zookeeper/
│                           └── SpringBootDemoZookeeperApplicationTests.java
├── jd.md
└── pom.xml
Download .txt
SYMBOL INDEX (1828 symbols across 507 files)

FILE: demo-activiti/src/main/java/com/xkcoding/activiti/SpringBootDemoActivitiApplication.java
  class SpringBootDemoActivitiApplication (line 14) | @SpringBootApplication
    method main (line 17) | public static void main(String[] args) {

FILE: demo-activiti/src/main/java/com/xkcoding/activiti/config/SecurityConfiguration.java
  class SecurityConfiguration (line 27) | @Slf4j
    method configure (line 31) | @Override
    method myUserDetailsService (line 36) | @Bean
    method passwordEncoder (line 52) | @Bean

FILE: demo-activiti/src/main/java/com/xkcoding/activiti/util/SecurityUtil.java
  class SecurityUtil (line 23) | @Component
    method logInAs (line 29) | public void logInAs(String username) {

FILE: demo-activiti/src/test/java/com/xkcoding/activiti/SpringBootDemoActivitiApplicationTests.java
  class SpringBootDemoActivitiApplicationTests (line 14) | @RunWith(SpringRunner.class)
    method contextLoads (line 23) | @Test

FILE: demo-actuator/src/main/java/com/xkcoding/actuator/SpringBootDemoActuatorApplication.java
  class SpringBootDemoActuatorApplication (line 14) | @SpringBootApplication
    method main (line 17) | public static void main(String[] args) {

FILE: demo-actuator/src/test/java/com/xkcoding/actuator/SpringBootDemoActuatorApplicationTests.java
  class SpringBootDemoActuatorApplicationTests (line 8) | @RunWith(SpringRunner.class)
    method contextLoads (line 12) | @Test

FILE: demo-admin/admin-client/src/main/java/com/xkcoding/admin/client/SpringBootDemoAdminClientApplication.java
  class SpringBootDemoAdminClientApplication (line 14) | @SpringBootApplication
    method main (line 17) | public static void main(String[] args) {

FILE: demo-admin/admin-client/src/main/java/com/xkcoding/admin/client/controller/IndexController.java
  class IndexController (line 14) | @RestController
    method index (line 16) | @GetMapping(value = {"", "/"})

FILE: demo-admin/admin-client/src/test/java/com/xkcoding/admin/client/SpringBootDemoAdminClientApplicationTests.java
  class SpringBootDemoAdminClientApplicationTests (line 8) | @RunWith(SpringRunner.class)
    method contextLoads (line 12) | @Test

FILE: demo-admin/admin-server/src/main/java/com/xkcoding/admin/server/SpringBootDemoAdminServerApplication.java
  class SpringBootDemoAdminServerApplication (line 15) | @EnableAdminServer
    method main (line 19) | public static void main(String[] args) {

FILE: demo-admin/admin-server/src/test/java/com/xkcoding/admin/server/SpringBootDemoAdminServerApplicationTests.java
  class SpringBootDemoAdminServerApplicationTests (line 8) | @RunWith(SpringRunner.class)
    method contextLoads (line 12) | @Test

FILE: demo-async/src/main/java/com/xkcoding/async/SpringBootDemoAsyncApplication.java
  class SpringBootDemoAsyncApplication (line 15) | @EnableAsync
    method main (line 19) | public static void main(String[] args) {

FILE: demo-async/src/main/java/com/xkcoding/async/task/TaskFactory.java
  class TaskFactory (line 19) | @Component
    method asyncTask1 (line 26) | @Async
    method asyncTask2 (line 35) | @Async
    method asyncTask3 (line 44) | @Async
    method task1 (line 53) | public void task1() throws InterruptedException {
    method task2 (line 60) | public void task2() throws InterruptedException {
    method task3 (line 67) | public void task3() throws InterruptedException {
    method doTask (line 71) | private void doTask(String taskName, Integer time) throws InterruptedE...

FILE: demo-async/src/test/java/com/xkcoding/async/SpringBootDemoAsyncApplicationTests.java
  class SpringBootDemoAsyncApplicationTests (line 8) | @RunWith(SpringRunner.class)
    method contextLoads (line 12) | @Test

FILE: demo-async/src/test/java/com/xkcoding/async/task/TaskFactoryTest.java
  class TaskFactoryTest (line 19) | @Slf4j
    method asyncTaskTest (line 27) | @Test
    method taskTest (line 46) | @Test

FILE: demo-cache-ehcache/src/main/java/com/xkcoding/cache/ehcache/SpringBootDemoCacheEhcacheApplication.java
  class SpringBootDemoCacheEhcacheApplication (line 15) | @SpringBootApplication
    method main (line 19) | public static void main(String[] args) {

FILE: demo-cache-ehcache/src/main/java/com/xkcoding/cache/ehcache/entity/User.java
  class User (line 17) | @Data

FILE: demo-cache-ehcache/src/main/java/com/xkcoding/cache/ehcache/service/UserService.java
  type UserService (line 13) | public interface UserService {
    method saveOrUpdate (line 20) | User saveOrUpdate(User user);
    method get (line 28) | User get(Long id);
    method delete (line 35) | void delete(Long id);

FILE: demo-cache-ehcache/src/main/java/com/xkcoding/cache/ehcache/service/impl/UserServiceImpl.java
  class UserServiceImpl (line 22) | @Service
    method saveOrUpdate (line 45) | @CachePut(value = "user", key = "#user.id")
    method get (line 59) | @Cacheable(value = "user", key = "#id")
    method delete (line 72) | @CacheEvict(value = "user", key = "#id")

FILE: demo-cache-ehcache/src/test/java/com/xkcoding/cache/ehcache/SpringBootDemoCacheEhcacheApplicationTests.java
  class SpringBootDemoCacheEhcacheApplicationTests (line 8) | @RunWith(SpringRunner.class)
    method contextLoads (line 12) | @Test

FILE: demo-cache-ehcache/src/test/java/com/xkcoding/cache/ehcache/service/UserServiceTest.java
  class UserServiceTest (line 17) | @Slf4j
    method getTwice (line 26) | @Test
    method getAfterSave (line 41) | @Test
    method deleteUser (line 53) | @Test

FILE: demo-cache-redis/src/main/java/com/xkcoding/cache/redis/SpringBootDemoCacheRedisApplication.java
  class SpringBootDemoCacheRedisApplication (line 6) | @SpringBootApplication
    method main (line 9) | public static void main(String[] args) {

FILE: demo-cache-redis/src/main/java/com/xkcoding/cache/redis/config/RedisConfig.java
  class RedisConfig (line 28) | @Configuration
    method redisCacheTemplate (line 36) | @Bean
    method cacheManager (line 48) | @Bean

FILE: demo-cache-redis/src/main/java/com/xkcoding/cache/redis/entity/User.java
  class User (line 17) | @Data

FILE: demo-cache-redis/src/main/java/com/xkcoding/cache/redis/service/UserService.java
  type UserService (line 13) | public interface UserService {
    method saveOrUpdate (line 20) | User saveOrUpdate(User user);
    method get (line 28) | User get(Long id);
    method delete (line 35) | void delete(Long id);

FILE: demo-cache-redis/src/main/java/com/xkcoding/cache/redis/service/impl/UserServiceImpl.java
  class UserServiceImpl (line 22) | @Service
    method saveOrUpdate (line 45) | @CachePut(value = "user", key = "#user.id")
    method get (line 59) | @Cacheable(value = "user", key = "#id")
    method delete (line 72) | @CacheEvict(value = "user", key = "#id")

FILE: demo-cache-redis/src/test/java/com/xkcoding/cache/redis/RedisTest.java
  class RedisTest (line 23) | @Slf4j
    method get (line 35) | @Test

FILE: demo-cache-redis/src/test/java/com/xkcoding/cache/redis/SpringBootDemoCacheRedisApplicationTests.java
  class SpringBootDemoCacheRedisApplicationTests (line 8) | @RunWith(SpringRunner.class)
    method contextLoads (line 12) | @Test

FILE: demo-cache-redis/src/test/java/com/xkcoding/cache/redis/service/UserServiceTest.java
  class UserServiceTest (line 17) | @Slf4j
    method getTwice (line 25) | @Test
    method getAfterSave (line 40) | @Test
    method deleteUser (line 52) | @Test

FILE: demo-codegen/src/main/java/com/xkcoding/codegen/SpringBootDemoCodegenApplication.java
  class SpringBootDemoCodegenApplication (line 14) | @SpringBootApplication
    method main (line 17) | public static void main(String[] args) {

FILE: demo-codegen/src/main/java/com/xkcoding/codegen/common/IResultCode.java
  type IResultCode (line 11) | public interface IResultCode {
    method getCode (line 17) | Integer getCode();
    method getMessage (line 24) | String getMessage();

FILE: demo-codegen/src/main/java/com/xkcoding/codegen/common/PageResult.java
  class PageResult (line 16) | @Data

FILE: demo-codegen/src/main/java/com/xkcoding/codegen/common/R.java
  class R (line 14) | @Data
    method R (line 37) | public R(Integer code, String message, boolean status, T data) {
    method R (line 44) | public R(IResultCode resultCode, boolean status, T data) {
    method R (line 51) | public R(IResultCode resultCode, boolean status) {
    method success (line 58) | public static <T> R success() {
    method message (line 62) | public static <T> R message(String message) {
    method success (line 66) | public static <T> R success(T data) {
    method fail (line 70) | public static <T> R fail() {
    method fail (line 74) | public static <T> R fail(IResultCode resultCode) {
    method fail (line 78) | public static <T> R fail(Integer code, String message) {
    method fail (line 82) | public static <T> R fail(IResultCode resultCode, T data) {
    method fail (line 86) | public static <T> R fail(Integer code, String message, T data) {

FILE: demo-codegen/src/main/java/com/xkcoding/codegen/common/ResultCode.java
  type ResultCode (line 13) | @Getter
    method ResultCode (line 34) | ResultCode(Integer code, String message) {

FILE: demo-codegen/src/main/java/com/xkcoding/codegen/constants/GenConstants.java
  type GenConstants (line 11) | public interface GenConstants {

FILE: demo-codegen/src/main/java/com/xkcoding/codegen/controller/CodeGenController.java
  class CodeGenController (line 23) | @RestController
    method listTables (line 35) | @GetMapping("/table")
    method generatorCode (line 43) | @SneakyThrows

FILE: demo-codegen/src/main/java/com/xkcoding/codegen/entity/ColumnEntity.java
  class ColumnEntity (line 13) | @Data

FILE: demo-codegen/src/main/java/com/xkcoding/codegen/entity/GenConfig.java
  class GenConfig (line 13) | @Data

FILE: demo-codegen/src/main/java/com/xkcoding/codegen/entity/TableEntity.java
  class TableEntity (line 15) | @Data

FILE: demo-codegen/src/main/java/com/xkcoding/codegen/entity/TableRequest.java
  class TableRequest (line 13) | @Data

FILE: demo-codegen/src/main/java/com/xkcoding/codegen/service/CodeGenService.java
  type CodeGenService (line 16) | public interface CodeGenService {
    method generatorCode (line 23) | byte[] generatorCode(GenConfig genConfig);
    method listTables (line 31) | PageResult<Entity> listTables(TableRequest request);

FILE: demo-codegen/src/main/java/com/xkcoding/codegen/service/impl/CodeGenServiceImpl.java
  class CodeGenServiceImpl (line 32) | @Service
    method listTables (line 49) | @Override
    method generatorCode (line 88) | @Override
    method queryTable (line 103) | @SneakyThrows
    method queryColumns (line 119) | @SneakyThrows

FILE: demo-codegen/src/main/java/com/xkcoding/codegen/utils/CodeGenUtil.java
  class CodeGenUtil (line 37) | @Slf4j
    method getTemplates (line 49) | private List<String> getTemplates() {
    method generatorCode (line 65) | public void generatorCode(GenConfig genConfig, Entity table, List<Enti...
    method columnToJava (line 196) | private String columnToJava(String columnName) {
    method tableToJava (line 203) | private String tableToJava(String tableName, String tablePrefix) {
    method getConfig (line 213) | private Props getConfig(String fileName) {
    method getFileName (line 222) | private String getFileName(String template, String className, String p...

FILE: demo-codegen/src/main/java/com/xkcoding/codegen/utils/DbUtil.java
  class DbUtil (line 16) | @Slf4j
    method buildFromTableRequest (line 19) | public HikariDataSource buildFromTableRequest(TableRequest request) {

FILE: demo-codegen/src/main/resources/static/libs/datejs/date-zh-CN.js
  function f (line 40) | function f(n){return n<10?'0'+n:n;}

FILE: demo-codegen/src/test/java/com/xkcoding/codegen/CodeGenServiceTest.java
  class CodeGenServiceTest (line 29) | @RunWith(SpringRunner.class)
    method testTablePage (line 36) | @Test
    method testGeneratorCode (line 50) | @Test

FILE: demo-codegen/src/test/java/com/xkcoding/codegen/SpringBootDemoCodegenApplicationTests.java
  class SpringBootDemoCodegenApplicationTests (line 8) | @RunWith(SpringRunner.class)
    method contextLoads (line 12) | @Test

FILE: demo-docker/src/main/java/com/xkcoding/docker/SpringBootDemoDockerApplication.java
  class SpringBootDemoDockerApplication (line 14) | @SpringBootApplication
    method main (line 17) | public static void main(String[] args) {

FILE: demo-docker/src/main/java/com/xkcoding/docker/controller/HelloController.java
  class HelloController (line 15) | @RestController
    method hello (line 18) | @GetMapping

FILE: demo-docker/src/test/java/com/xkcoding/docker/SpringBootDemoDockerApplicationTests.java
  class SpringBootDemoDockerApplicationTests (line 8) | @RunWith(SpringRunner.class)
    method contextLoads (line 12) | @Test

FILE: demo-dubbo/dubbo-common/src/main/java/com/xkcoding/dubbo/common/service/HelloService.java
  type HelloService (line 11) | public interface HelloService {
    method sayHello (line 18) | String sayHello(String name);

FILE: demo-dubbo/dubbo-consumer/src/main/java/com/xkcoding/dubbo/consumer/SpringBootDemoDubboConsumerApplication.java
  class SpringBootDemoDubboConsumerApplication (line 15) | @SpringBootApplication
    method main (line 19) | public static void main(String[] args) {

FILE: demo-dubbo/dubbo-consumer/src/main/java/com/xkcoding/dubbo/consumer/controller/HelloController.java
  class HelloController (line 18) | @RestController
    method sayHello (line 24) | @GetMapping("/sayHello")

FILE: demo-dubbo/dubbo-consumer/src/test/java/com/xkcoding/dubbo/consumer/SpringBootDemoDubboConsumerApplicationTests.java
  class SpringBootDemoDubboConsumerApplicationTests (line 8) | @RunWith(SpringRunner.class)
    method contextLoads (line 12) | @Test

FILE: demo-dubbo/dubbo-provider/src/main/java/com/xkcoding/dubbo/provider/SpringBootDemoDubboProviderApplication.java
  class SpringBootDemoDubboProviderApplication (line 15) | @EnableDubboConfiguration
    method main (line 19) | public static void main(String[] args) {

FILE: demo-dubbo/dubbo-provider/src/main/java/com/xkcoding/dubbo/provider/service/HelloServiceImpl.java
  class HelloServiceImpl (line 16) | @Service
    method sayHello (line 26) | @Override

FILE: demo-dubbo/dubbo-provider/src/test/java/com/xkcoding/dubbo/provider/SpringBootDemoDubboProviderApplicationTests.java
  class SpringBootDemoDubboProviderApplicationTests (line 8) | @RunWith(SpringRunner.class)
    method contextLoads (line 12) | @Test

FILE: demo-dynamic-datasource/db/init.sql
  type `datasource_config` (line 1) | CREATE TABLE IF NOT EXISTS `datasource_config`

FILE: demo-dynamic-datasource/db/user.sql
  type `test_user` (line 1) | CREATE TABLE IF NOT EXISTS `test_user`

FILE: demo-dynamic-datasource/src/main/java/com/xkcoding/dynamic/datasource/SpringBootDemoDynamicDatasourceApplication.java
  class SpringBootDemoDynamicDatasourceApplication (line 23) | @SpringBootApplication
    method main (line 28) | public static void main(String[] args) {
    method run (line 32) | @Override

FILE: demo-dynamic-datasource/src/main/java/com/xkcoding/dynamic/datasource/aspect/DatasourceSelectorAspect.java
  class DatasourceSelectorAspect (line 31) | @Aspect
    method datasourcePointcut (line 35) | @Pointcut("execution(public * com.xkcoding.dynamic.datasource.controll...
    method doBefore (line 42) | @Before("datasourcePointcut()")
    method doAfter (line 69) | @AfterReturning("datasourcePointcut()")

FILE: demo-dynamic-datasource/src/main/java/com/xkcoding/dynamic/datasource/config/DatasourceConfiguration.java
  class DatasourceConfiguration (line 19) | @Configuration
    method dataSource (line 22) | @Bean

FILE: demo-dynamic-datasource/src/main/java/com/xkcoding/dynamic/datasource/config/MyMapper.java
  type MyMapper (line 15) | @RegisterMapper

FILE: demo-dynamic-datasource/src/main/java/com/xkcoding/dynamic/datasource/config/MybatisConfiguration.java
  class MybatisConfiguration (line 21) | @Configuration
    method getSqlSessionFactory (line 30) | @Bean(name = "sqlSessionFactory")

FILE: demo-dynamic-datasource/src/main/java/com/xkcoding/dynamic/datasource/controller/DatasourceConfigController.java
  class DatasourceConfigController (line 19) | @RestController
    method insertConfig (line 27) | @PostMapping("/config")
    method removeConfig (line 38) | @DeleteMapping("/config/{id}")

FILE: demo-dynamic-datasource/src/main/java/com/xkcoding/dynamic/datasource/controller/UserController.java
  class UserController (line 20) | @RestController
    method getUserList (line 28) | @GetMapping("/user")

FILE: demo-dynamic-datasource/src/main/java/com/xkcoding/dynamic/datasource/datasource/DatasourceConfigCache.java
  type DatasourceConfigCache (line 16) | public enum DatasourceConfigCache {
    method addConfig (line 33) | public synchronized void addConfig(Long id, DatasourceConfig config) {
    method getConfig (line 43) | public synchronized DatasourceConfig getConfig(Long id) {
    method removeConfig (line 53) | public synchronized void removeConfig(Long id) {

FILE: demo-dynamic-datasource/src/main/java/com/xkcoding/dynamic/datasource/datasource/DatasourceConfigContextHolder.java
  class DatasourceConfigContextHolder (line 11) | public class DatasourceConfigContextHolder {
    method setDefaultDatasource (line 17) | public static void setDefaultDatasource() {
    method getCurrentDatasourceConfig (line 27) | public static Long getCurrentDatasourceConfig() {
    method setCurrentDatasourceConfig (line 36) | public static void setCurrentDatasourceConfig(Long id) {

FILE: demo-dynamic-datasource/src/main/java/com/xkcoding/dynamic/datasource/datasource/DatasourceHolder.java
  type DatasourceHolder (line 16) | public enum DatasourceHolder {
    method DatasourceHolder (line 25) | DatasourceHolder() {
    method addDatasource (line 45) | public synchronized void addDatasource(Long id, HikariDataSource dataS...
    method getDatasource (line 56) | public synchronized HikariDataSource getDatasource(Long id) {
    method clearExpiredDatasource (line 68) | public synchronized void clearExpiredDatasource() {
    method removeDatasource (line 84) | public synchronized void removeDatasource(Long id) {

FILE: demo-dynamic-datasource/src/main/java/com/xkcoding/dynamic/datasource/datasource/DatasourceManager.java
  class DatasourceManager (line 16) | public class DatasourceManager {
    method DatasourceManager (line 33) | public DatasourceManager(HikariDataSource dataSource) {
    method isExpired (line 43) | public boolean isExpired() {
    method refreshTime (line 54) | public void refreshTime() {

FILE: demo-dynamic-datasource/src/main/java/com/xkcoding/dynamic/datasource/datasource/DatasourceScheduler.java
  type DatasourceScheduler (line 16) | public enum DatasourceScheduler {
    method DatasourceScheduler (line 25) | DatasourceScheduler() {
    method create (line 29) | private void create() {
    method shutdown (line 34) | private void shutdown() {
    method schedule (line 40) | public void schedule(Runnable task, long delay) {

FILE: demo-dynamic-datasource/src/main/java/com/xkcoding/dynamic/datasource/datasource/DynamicDataSource.java
  class DynamicDataSource (line 20) | @Slf4j
    method getConnection (line 22) | @Override
    method initDatasource (line 42) | private HikariDataSource initDatasource(Long id) {

FILE: demo-dynamic-datasource/src/main/java/com/xkcoding/dynamic/datasource/mapper/DatasourceConfigMapper.java
  type DatasourceConfigMapper (line 15) | @Mapper

FILE: demo-dynamic-datasource/src/main/java/com/xkcoding/dynamic/datasource/mapper/UserMapper.java
  type UserMapper (line 15) | @Mapper

FILE: demo-dynamic-datasource/src/main/java/com/xkcoding/dynamic/datasource/model/DatasourceConfig.java
  class DatasourceConfig (line 19) | @Data
    method buildJdbcUrl (line 65) | public String buildJdbcUrl() {

FILE: demo-dynamic-datasource/src/main/java/com/xkcoding/dynamic/datasource/model/User.java
  class User (line 19) | @Data

FILE: demo-dynamic-datasource/src/main/java/com/xkcoding/dynamic/datasource/utils/SpringUtil.java
  class SpringUtil (line 19) | @Slf4j
    method getApplicationContext (line 29) | public static ApplicationContext getApplicationContext() {
    method setApplicationContext (line 36) | @Override
    method getBean (line 44) | @SuppressWarnings("unchecked")
    method getBean (line 52) | public static <T> T getBean(Class<T> requiredType) {
    method clearHolder (line 59) | public static void clearHolder() {
    method publishEvent (line 71) | public static void publishEvent(ApplicationEvent event) {
    method destroy (line 81) | @Override

FILE: demo-dynamic-datasource/src/test/java/com/xkcoding/dynamic/datasource/SpringBootDemoDynamicDatasourceApplicationTests.java
  class SpringBootDemoDynamicDatasourceApplicationTests (line 8) | @RunWith(SpringRunner.class)
    method contextLoads (line 12) | @Test

FILE: demo-elasticsearch-rest-high-level-client/src/main/java/com/xkcoding/elasticsearch/ElasticsearchApplication.java
  class ElasticsearchApplication (line 13) | @SpringBootApplication
    method main (line 16) | public static void main(String[] args) {

FILE: demo-elasticsearch-rest-high-level-client/src/main/java/com/xkcoding/elasticsearch/common/Result.java
  class Result (line 15) | @Data
    method Result (line 35) | public Result() {
    method Result (line 38) | private Result(ResultCode resultCode) {
    method Result (line 42) | private Result(ResultCode resultCode, T data) {
    method Result (line 46) | private Result(int errcode, String errmsg) {
    method Result (line 50) | private Result(int errcode, String errmsg, T data) {
    method success (line 63) | public static <T> Result<T> success() {
    method success (line 75) | public static <T> Result<T> success(@Nullable T data) {

FILE: demo-elasticsearch-rest-high-level-client/src/main/java/com/xkcoding/elasticsearch/common/ResultCode.java
  type ResultCode (line 13) | @Getter

FILE: demo-elasticsearch-rest-high-level-client/src/main/java/com/xkcoding/elasticsearch/config/ElasticsearchAutoConfiguration.java
  class ElasticsearchAutoConfiguration (line 30) | @Configuration
    method restHighLevelClient (line 39) | @Bean
    method getRestHighLevelClient (line 68) | private static RestHighLevelClient getRestHighLevelClient(RestClientBu...

FILE: demo-elasticsearch-rest-high-level-client/src/main/java/com/xkcoding/elasticsearch/config/ElasticsearchProperties.java
  class ElasticsearchProperties (line 21) | @Data
    class Index (line 83) | @Data
    class Account (line 101) | @Data

FILE: demo-elasticsearch-rest-high-level-client/src/main/java/com/xkcoding/elasticsearch/contants/ElasticsearchConstant.java
  type ElasticsearchConstant (line 10) | public interface ElasticsearchConstant {

FILE: demo-elasticsearch-rest-high-level-client/src/main/java/com/xkcoding/elasticsearch/exception/ElasticsearchException.java
  class ElasticsearchException (line 13) | public class ElasticsearchException extends RuntimeException {
    method ElasticsearchException (line 21) | public ElasticsearchException(ResultCode resultCode) {
    method ElasticsearchException (line 25) | public ElasticsearchException(String message) {
    method ElasticsearchException (line 29) | public ElasticsearchException(Integer errcode, String errmsg) {
    method ElasticsearchException (line 35) | public ElasticsearchException(String message, Throwable cause) {
    method ElasticsearchException (line 39) | public ElasticsearchException(Throwable cause) {
    method ElasticsearchException (line 43) | public ElasticsearchException(String message, Throwable cause, boolean...

FILE: demo-elasticsearch-rest-high-level-client/src/main/java/com/xkcoding/elasticsearch/model/Person.java
  class Person (line 18) | @Data

FILE: demo-elasticsearch-rest-high-level-client/src/main/java/com/xkcoding/elasticsearch/service/PersonService.java
  type PersonService (line 15) | public interface PersonService {
    method createIndex (line 23) | void createIndex(String index);
    method deleteIndex (line 31) | void deleteIndex(String index);
    method insert (line 40) | void insert(String index, List<Person> list);
    method update (line 49) | void update(String index, List<Person> list);
    method delete (line 57) | void delete(String index, @Nullable Person person);
    method searchList (line 66) | List<Person> searchList(String index);

FILE: demo-elasticsearch-rest-high-level-client/src/main/java/com/xkcoding/elasticsearch/service/base/BaseElasticsearchService.java
  class BaseElasticsearchService (line 33) | @Slf4j
    method createIndexRequest (line 58) | protected void createIndexRequest(String index) {
    method deleteIndexRequest (line 79) | protected void deleteIndexRequest(String index) {
    method buildDeleteIndexRequest (line 94) | private static DeleteIndexRequest buildDeleteIndexRequest(String index) {
    method buildIndexRequest (line 107) | protected static IndexRequest buildIndexRequest(String index, String i...
    method updateRequest (line 119) | protected void updateRequest(String index, String id, Object object) {
    method deleteRequest (line 135) | protected void deleteRequest(String index, String id) {
    method search (line 151) | protected SearchResponse search(String index) {

FILE: demo-elasticsearch-rest-high-level-client/src/main/java/com/xkcoding/elasticsearch/service/impl/PersonServiceImpl.java
  class PersonServiceImpl (line 26) | @Service
    method createIndex (line 29) | @Override
    method deleteIndex (line 34) | @Override
    method insert (line 39) | @Override
    method update (line 60) | @Override
    method delete (line 67) | @Override
    method searchList (line 78) | @Override

FILE: demo-elasticsearch-rest-high-level-client/src/test/java/com/xkcoding/elasticsearch/ElasticsearchApplicationTests.java
  class ElasticsearchApplicationTests (line 16) | @RunWith(SpringRunner.class)
    method deleteIndexTest (line 26) | @Test
    method createIndexTest (line 34) | @Test
    method insertTest (line 42) | @Test
    method updateTest (line 55) | @Test
    method deleteTest (line 66) | @Test
    method searchListTest (line 74) | @Test

FILE: demo-elasticsearch/src/main/java/com/xkcoding/elasticsearch/SpringBootDemoElasticsearchApplication.java
  class SpringBootDemoElasticsearchApplication (line 14) | @SpringBootApplication
    method main (line 17) | public static void main(String[] args) {

FILE: demo-elasticsearch/src/main/java/com/xkcoding/elasticsearch/constants/EsConsts.java
  type EsConsts (line 11) | public interface EsConsts {

FILE: demo-elasticsearch/src/main/java/com/xkcoding/elasticsearch/model/Person.java
  class Person (line 22) | @Document(indexName = EsConsts.INDEX_NAME, type = EsConsts.TYPE_NAME, sh...

FILE: demo-elasticsearch/src/main/java/com/xkcoding/elasticsearch/repository/PersonRepository.java
  type PersonRepository (line 16) | public interface PersonRepository extends ElasticsearchRepository<Person...
    method findByAgeBetween (line 25) | List<Person> findByAgeBetween(Integer min, Integer max);

FILE: demo-elasticsearch/src/test/java/com/xkcoding/elasticsearch/SpringBootDemoElasticsearchApplicationTests.java
  class SpringBootDemoElasticsearchApplicationTests (line 8) | @RunWith(SpringRunner.class)
    method contextLoads (line 12) | @Test

FILE: demo-elasticsearch/src/test/java/com/xkcoding/elasticsearch/repository/PersonRepositoryTest.java
  class PersonRepositoryTest (line 35) | @Slf4j
    method save (line 43) | @Test
    method saveList (line 53) | @Test
    method update (line 66) | @Test
    method delete (line 78) | @Test
    method select (line 93) | @Test
    method customSelectRangeOfAge (line 101) | @Test
    method advanceSelect (line 109) | @Test
    method customAdvanceSelect (line 121) | @Test
    method agg (line 140) | @Test
    method advanceAgg (line 160) | @Test

FILE: demo-elasticsearch/src/test/java/com/xkcoding/elasticsearch/template/TemplateTest.java
  class TemplateTest (line 17) | public class TemplateTest extends SpringBootDemoElasticsearchApplication...
    method testCreateIndex (line 24) | @Test
    method testDeleteIndex (line 36) | @Test

FILE: demo-email/src/main/java/com/xkcoding/email/SpringBootDemoEmailApplication.java
  class SpringBootDemoEmailApplication (line 14) | @SpringBootApplication
    method main (line 17) | public static void main(String[] args) {

FILE: demo-email/src/main/java/com/xkcoding/email/service/MailService.java
  type MailService (line 13) | public interface MailService {
    method sendSimpleMail (line 22) | void sendSimpleMail(String to, String subject, String content, String....
    method sendHtmlMail (line 33) | void sendHtmlMail(String to, String subject, String content, String......
    method sendAttachmentsMail (line 45) | void sendAttachmentsMail(String to, String subject, String content, St...
    method sendResourceMail (line 58) | void sendResourceMail(String to, String subject, String content, Strin...

FILE: demo-email/src/main/java/com/xkcoding/email/service/impl/MailServiceImpl.java
  class MailServiceImpl (line 25) | @Service
    method sendSimpleMail (line 40) | @Override
    method sendHtmlMail (line 62) | @Override
    method sendAttachmentsMail (line 86) | @Override
    method sendResourceMail (line 116) | @Override

FILE: demo-email/src/test/java/com/xkcoding/email/PasswordTest.java
  class PasswordTest (line 15) | public class PasswordTest extends SpringBootDemoEmailApplicationTests {
    method testGeneratePassword (line 22) | @Test

FILE: demo-email/src/test/java/com/xkcoding/email/SpringBootDemoEmailApplicationTests.java
  class SpringBootDemoEmailApplicationTests (line 8) | @RunWith(SpringRunner.class)
    method contextLoads (line 12) | @Test

FILE: demo-email/src/test/java/com/xkcoding/email/service/MailServiceTest.java
  class MailServiceTest (line 23) | public class MailServiceTest extends SpringBootDemoEmailApplicationTests {
    method sendSimpleMail (line 34) | @Test
    method sendHtmlMail (line 44) | @Test
    method sendHtmlMail2 (line 60) | @Test
    method sendAttachmentsMail (line 85) | @Test
    method sendResourceMail (line 96) | @Test

FILE: demo-exception-handler/src/main/java/com/xkcoding/exception/handler/SpringBootDemoExceptionHandlerApplication.java
  class SpringBootDemoExceptionHandlerApplication (line 14) | @SpringBootApplication
    method main (line 17) | public static void main(String[] args) {

FILE: demo-exception-handler/src/main/java/com/xkcoding/exception/handler/constant/Status.java
  type Status (line 13) | @Getter
    method Status (line 33) | Status(Integer code, String message) {

FILE: demo-exception-handler/src/main/java/com/xkcoding/exception/handler/controller/TestController.java
  class TestController (line 20) | @Controller
    method jsonException (line 23) | @GetMapping("/json")
    method pageException (line 29) | @GetMapping("/page")

FILE: demo-exception-handler/src/main/java/com/xkcoding/exception/handler/exception/BaseException.java
  class BaseException (line 15) | @Data
    method BaseException (line 21) | public BaseException(Status status) {
    method BaseException (line 27) | public BaseException(Integer code, String message) {

FILE: demo-exception-handler/src/main/java/com/xkcoding/exception/handler/exception/JsonException.java
  class JsonException (line 14) | @Getter
    method JsonException (line 17) | public JsonException(Status status) {
    method JsonException (line 21) | public JsonException(Integer code, String message) {

FILE: demo-exception-handler/src/main/java/com/xkcoding/exception/handler/exception/PageException.java
  class PageException (line 14) | @Getter
    method PageException (line 17) | public PageException(Status status) {
    method PageException (line 21) | public PageException(Integer code, String message) {

FILE: demo-exception-handler/src/main/java/com/xkcoding/exception/handler/handler/DemoExceptionHandler.java
  class DemoExceptionHandler (line 20) | @ControllerAdvice
    method jsonErrorHandler (line 31) | @ExceptionHandler(value = JsonException.class)
    method pageErrorHandler (line 44) | @ExceptionHandler(value = PageException.class)

FILE: demo-exception-handler/src/main/java/com/xkcoding/exception/handler/model/ApiResponse.java
  class ApiResponse (line 15) | @Data
    method ApiResponse (line 35) | private ApiResponse() {
    method ApiResponse (line 46) | private ApiResponse(Integer code, String message, Object data) {
    method of (line 60) | public static ApiResponse of(Integer code, String message, Object data) {
    method ofSuccess (line 70) | public static ApiResponse ofSuccess(Object data) {
    method ofMessage (line 80) | public static ApiResponse ofMessage(String message) {
    method ofStatus (line 90) | public static ApiResponse ofStatus(Status status) {
    method ofStatus (line 101) | public static ApiResponse ofStatus(Status status, Object data) {
    method ofException (line 113) | public static <T extends BaseException> ApiResponse ofException(T t, O...
    method ofException (line 124) | public static <T extends BaseException> ApiResponse ofException(T t) {

FILE: demo-exception-handler/src/test/java/com/xkcoding/exception/handler/SpringBootDemoExceptionHandlerApplicationTests.java
  class SpringBootDemoExceptionHandlerApplicationTests (line 8) | @RunWith(SpringRunner.class)
    method contextLoads (line 12) | @Test

FILE: demo-flyway/src/main/java/com/xkcoding/flyway/SpringBootDemoFlywayApplication.java
  class SpringBootDemoFlywayApplication (line 14) | @SpringBootApplication
    method main (line 17) | public static void main(String[] args) {

FILE: demo-flyway/src/main/resources/db/migration/V1_0__INIT.sql
  type `t_user` (line 2) | CREATE TABLE `t_user` (

FILE: demo-flyway/src/test/java/com/xkcoding/AppTest.java
  class AppTest (line 10) | public class AppTest {
    method shouldAnswerWithTrue (line 14) | @Test

FILE: demo-graylog/src/main/java/com/xkcoding/graylog/SpringBootDemoGraylogApplication.java
  class SpringBootDemoGraylogApplication (line 14) | @SpringBootApplication
    method main (line 17) | public static void main(String[] args) {

FILE: demo-graylog/src/test/java/com/xkcoding/graylog/SpringBootDemoGraylogApplicationTests.java
  class SpringBootDemoGraylogApplicationTests (line 8) | @RunWith(SpringRunner.class)
    method contextLoads (line 12) | @Test

FILE: demo-helloworld/src/main/java/com/xkcoding/helloworld/SpringBootDemoHelloworldApplication.java
  class SpringBootDemoHelloworldApplication (line 18) | @SpringBootApplication
    method main (line 22) | public static void main(String[] args) {
    method sayHello (line 32) | @GetMapping("/hello")

FILE: demo-helloworld/src/test/java/com/xkcoding/helloworld/SpringBootDemoHelloworldApplicationTests.java
  class SpringBootDemoHelloworldApplicationTests (line 8) | @RunWith(SpringRunner.class)
    method contextLoads (line 12) | @Test

FILE: demo-https/src/main/java/com/xkcoding/https/SpringBootDemoHttpsApplication.java
  class SpringBootDemoHttpsApplication (line 14) | @SpringBootApplication
    method main (line 17) | public static void main(String[] args) {

FILE: demo-https/src/main/java/com/xkcoding/https/config/HttpsConfig.java
  class HttpsConfig (line 19) | @Configuration
    method connector (line 24) | @Bean
    method tomcatServletWebServerFactory (line 34) | @Bean

FILE: demo-https/src/test/java/com/xkcoding/https/SpringBootDemoHttpsApplicationTests.java
  class SpringBootDemoHttpsApplicationTests (line 6) | @SpringBootTest
    method contextLoads (line 9) | @Test

FILE: demo-ldap/src/main/java/com/xkcoding/ldap/LdapDemoApplication.java
  class LdapDemoApplication (line 13) | @SpringBootApplication
    method main (line 16) | public static void main(String[] args) {

FILE: demo-ldap/src/main/java/com/xkcoding/ldap/api/Result.java
  class Result (line 15) | @Data
    method Result (line 35) | public Result() {
    method Result (line 38) | private Result(ResultCode resultCode) {
    method Result (line 42) | private Result(ResultCode resultCode, T data) {
    method Result (line 46) | private Result(int errcode, String errmsg) {
    method Result (line 50) | private Result(int errcode, String errmsg, T data) {
    method success (line 63) | public static <T> Result<T> success() {
    method success (line 75) | public static <T> Result<T> success(@Nullable T data) {

FILE: demo-ldap/src/main/java/com/xkcoding/ldap/api/ResultCode.java
  type ResultCode (line 13) | @Getter

FILE: demo-ldap/src/main/java/com/xkcoding/ldap/entity/Person.java
  class Person (line 19) | @Data

FILE: demo-ldap/src/main/java/com/xkcoding/ldap/exception/ServiceException.java
  class ServiceException (line 13) | public class ServiceException extends RuntimeException {
    method ServiceException (line 21) | public ServiceException(ResultCode resultCode) {
    method ServiceException (line 25) | public ServiceException(String message) {
    method ServiceException (line 29) | public ServiceException(Integer errcode, String errmsg) {
    method ServiceException (line 35) | public ServiceException(String message, Throwable cause) {
    method ServiceException (line 39) | public ServiceException(Throwable cause) {
    method ServiceException (line 43) | public ServiceException(String message, Throwable cause, boolean enabl...

FILE: demo-ldap/src/main/java/com/xkcoding/ldap/repository/PersonRepository.java
  type PersonRepository (line 16) | @Repository
    method findByUid (line 25) | Person findByUid(String uid);

FILE: demo-ldap/src/main/java/com/xkcoding/ldap/request/LoginRequest.java
  class LoginRequest (line 13) | @Data

FILE: demo-ldap/src/main/java/com/xkcoding/ldap/service/PersonService.java
  type PersonService (line 14) | public interface PersonService {
    method login (line 22) | Result login(LoginRequest request);
    method listAllPerson (line 29) | Result listAllPerson();
    method save (line 36) | void save(Person person);
    method delete (line 43) | void delete(Person person);

FILE: demo-ldap/src/main/java/com/xkcoding/ldap/service/impl/PersonServiceImpl.java
  class PersonServiceImpl (line 25) | @Slf4j
    method login (line 37) | @Override
    method listAllPerson (line 65) | @Override
    method save (line 77) | @Override
    method delete (line 88) | @Override

FILE: demo-ldap/src/main/java/com/xkcoding/ldap/util/LdapUtils.java
  class LdapUtils (line 15) | public class LdapUtils {
    method verify (line 25) | public static boolean verify(String ldapPassword, String inputPassword...
    method asciiToString (line 69) | public static String asciiToString(String value) {

FILE: demo-ldap/src/test/java/com/xkcoding/ldap/LdapDemoApplicationTests.java
  class LdapDemoApplicationTests (line 21) | @RunWith(SpringRunner.class)
    method contextLoads (line 28) | @Test
    method loginTest (line 35) | @Test
    method listAllPersonTest (line 45) | @Test
    method saveTest (line 54) | @Test
    method deleteTest (line 77) | @Test

FILE: demo-log-aop/src/main/java/com/xkcoding/log/aop/SpringBootDemoLogAopApplication.java
  class SpringBootDemoLogAopApplication (line 14) | @SpringBootApplication
    method main (line 17) | public static void main(String[] args) {

FILE: demo-log-aop/src/main/java/com/xkcoding/log/aop/aspectj/AopLog.java
  class AopLog (line 38) | @Aspect
    method log (line 45) | @Pointcut("execution(public * com.xkcoding.log.aop.controller.*Control...
    method aroundLog (line 57) | @Around("log()")
    method getNameAndValue (line 95) | private Map<String, Object> getNameAndValue(ProceedingJoinPoint joinPo...
    method getIp (line 121) | public static String getIp(HttpServletRequest request) {
    class Log (line 148) | @Data

FILE: demo-log-aop/src/main/java/com/xkcoding/log/aop/controller/TestController.java
  class TestController (line 23) | @Slf4j
    method test (line 33) | @GetMapping("/test")
    method testJson (line 43) | @PostMapping("/testJson")

FILE: demo-log-aop/src/test/java/com/xkcoding/log/aop/SpringBootDemoLogAopApplicationTests.java
  class SpringBootDemoLogAopApplicationTests (line 8) | @RunWith(SpringRunner.class)
    method contextLoads (line 12) | @Test

FILE: demo-logback/src/main/java/com/xkcoding/logback/SpringBootDemoLogbackApplication.java
  class SpringBootDemoLogbackApplication (line 16) | @SpringBootApplication
    method main (line 20) | public static void main(String[] args) {

FILE: demo-logback/src/test/java/com/xkcoding/logback/SpringBootDemoLogbackApplicationTests.java
  class SpringBootDemoLogbackApplicationTests (line 8) | @RunWith(SpringRunner.class)
    method contextLoads (line 12) | @Test

FILE: demo-mongodb/src/main/java/com/xkcoding/mongodb/SpringBootDemoMongodbApplication.java
  class SpringBootDemoMongodbApplication (line 17) | @SpringBootApplication
    method main (line 20) | public static void main(String[] args) {
    method snowflake (line 24) | @Bean

FILE: demo-mongodb/src/main/java/com/xkcoding/mongodb/model/Article.java
  class Article (line 19) | @Data

FILE: demo-mongodb/src/main/java/com/xkcoding/mongodb/repository/ArticleRepository.java
  type ArticleRepository (line 16) | public interface ArticleRepository extends MongoRepository<Article, Long> {
    method findByTitleLike (line 23) | List<Article> findByTitleLike(String title);

FILE: demo-mongodb/src/test/java/com/xkcoding/mongodb/SpringBootDemoMongodbApplicationTests.java
  class SpringBootDemoMongodbApplicationTests (line 8) | @RunWith(SpringRunner.class)
    method contextLoads (line 12) | @Test

FILE: demo-mongodb/src/test/java/com/xkcoding/mongodb/repository/ArticleRepositoryTest.java
  class ArticleRepositoryTest (line 32) | @Slf4j
    method testSave (line 46) | @Test
    method testSaveList (line 56) | @Test
    method testUpdate (line 70) | @Test
    method testDelete (line 83) | @Test
    method testThumbUp (line 95) | @Test
    method testThumbUp2 (line 108) | @Test
    method testQuery (line 123) | @Test
    method testFindByTitleLike (line 136) | @Test

FILE: demo-mq-kafka/src/main/java/com/xkcoding/mq/kafka/SpringBootDemoMqKafkaApplication.java
  class SpringBootDemoMqKafkaApplication (line 14) | @SpringBootApplication
    method main (line 17) | public static void main(String[] args) {

FILE: demo-mq-kafka/src/main/java/com/xkcoding/mq/kafka/config/KafkaConfig.java
  class KafkaConfig (line 22) | @Configuration
    method kafkaTemplate (line 29) | @Bean
    method producerFactory (line 34) | @Bean
    method kafkaListenerContainerFactory (line 39) | @Bean
    method consumerFactory (line 49) | @Bean
    method ackContainerFactory (line 54) | @Bean("ackContainerFactory")

FILE: demo-mq-kafka/src/main/java/com/xkcoding/mq/kafka/constants/KafkaConsts.java
  type KafkaConsts (line 11) | public interface KafkaConsts {

FILE: demo-mq-kafka/src/main/java/com/xkcoding/mq/kafka/handler/MessageHandler.java
  class MessageHandler (line 18) | @Component
    method handleMessage (line 22) | @KafkaListener(topics = KafkaConsts.TOPIC_TEST, containerFactory = "ac...

FILE: demo-mq-kafka/src/test/java/com/xkcoding/mq/kafka/SpringBootDemoMqKafkaApplicationTests.java
  class SpringBootDemoMqKafkaApplicationTests (line 11) | @RunWith(SpringRunner.class)
    method testSend (line 20) | @Test

FILE: demo-mq-rabbitmq/src/main/java/com/xkcoding/mq/rabbitmq/SpringBootDemoMqRabbitmqApplication.java
  class SpringBootDemoMqRabbitmqApplication (line 14) | @SpringBootApplication
    method main (line 17) | public static void main(String[] args) {

FILE: demo-mq-rabbitmq/src/main/java/com/xkcoding/mq/rabbitmq/config/RabbitMqConfig.java
  class RabbitMqConfig (line 22) | @Slf4j
    method rabbitTemplate (line 26) | @Bean
    method directOneQueue (line 40) | @Bean
    method queueTwo (line 48) | @Bean
    method queueThree (line 56) | @Bean
    method fanoutExchange (line 64) | @Bean
    method fanoutBinding1 (line 75) | @Bean
    method fanoutBinding2 (line 86) | @Bean
    method topicExchange (line 97) | @Bean
    method topicBinding1 (line 109) | @Bean
    method topicBinding2 (line 120) | @Bean
    method topicBinding3 (line 131) | @Bean
    method delayQueue (line 139) | @Bean
    method delayExchange (line 147) | @Bean
    method delayBinding (line 160) | @Bean

FILE: demo-mq-rabbitmq/src/main/java/com/xkcoding/mq/rabbitmq/constants/RabbitConsts.java
  type RabbitConsts (line 11) | public interface RabbitConsts {

FILE: demo-mq-rabbitmq/src/main/java/com/xkcoding/mq/rabbitmq/handler/DelayQueueHandler.java
  class DelayQueueHandler (line 23) | @Slf4j
    method directHandlerManualAck (line 28) | @RabbitHandler

FILE: demo-mq-rabbitmq/src/main/java/com/xkcoding/mq/rabbitmq/handler/DirectQueueOneHandler.java
  class DirectQueueOneHandler (line 23) | @Slf4j
    method directHandlerAutoAck (line 32) | public void directHandlerAutoAck(MessageStruct message) {
    method directHandlerManualAck (line 36) | @RabbitHandler

FILE: demo-mq-rabbitmq/src/main/java/com/xkcoding/mq/rabbitmq/handler/QueueThreeHandler.java
  class QueueThreeHandler (line 23) | @Slf4j
    method directHandlerManualAck (line 28) | @RabbitHandler

FILE: demo-mq-rabbitmq/src/main/java/com/xkcoding/mq/rabbitmq/handler/QueueTwoHandler.java
  class QueueTwoHandler (line 23) | @Slf4j
    method directHandlerManualAck (line 28) | @RabbitHandler

FILE: demo-mq-rabbitmq/src/main/java/com/xkcoding/mq/rabbitmq/message/MessageStruct.java
  class MessageStruct (line 18) | @Data

FILE: demo-mq-rabbitmq/src/test/java/com/xkcoding/mq/rabbitmq/SpringBootDemoMqRabbitmqApplicationTests.java
  class SpringBootDemoMqRabbitmqApplicationTests (line 13) | @RunWith(SpringRunner.class)
    method sendDirect (line 22) | @Test
    method sendFanout (line 30) | @Test
    method sendTopic1 (line 38) | @Test
    method sendTopic2 (line 46) | @Test
    method sendTopic3 (line 54) | @Test
    method sendDelay (line 62) | @Test

FILE: demo-mq-rocketmq/src/main/java/com/xkcoding/mq/rocketmq/SpringBootDemoMqRocketmqApplication.java
  class SpringBootDemoMqRocketmqApplication (line 6) | @SpringBootApplication
    method main (line 9) | public static void main(String[] args) {

FILE: demo-mq-rocketmq/src/test/java/com/xkcoding/mq/rocketmq/SpringBootDemoMqRocketmqApplicationTests.java
  class SpringBootDemoMqRocketmqApplicationTests (line 8) | @RunWith(SpringRunner.class)
    method contextLoads (line 12) | @Test

FILE: demo-multi-datasource-jpa/src/main/java/com/xkcoding/multi/datasource/jpa/SpringBootDemoMultiDatasourceJpaApplication.java
  class SpringBootDemoMultiDatasourceJpaApplication (line 14) | @SpringBootApplication
    method main (line 17) | public static void main(String[] args) {

FILE: demo-multi-datasource-jpa/src/main/java/com/xkcoding/multi/datasource/jpa/config/PrimaryDataSourceConfig.java
  class PrimaryDataSourceConfig (line 21) | @Configuration
    method dataSourceProperties (line 29) | @Primary
    method dataSource (line 42) | @Primary
    method jdbcTemplate (line 54) | @Primary

FILE: demo-multi-datasource-jpa/src/main/java/com/xkcoding/multi/datasource/jpa/config/PrimaryJpaConfig.java
  class PrimaryJpaConfig (line 28) | @Configuration
    method jpaProperties (line 47) | @Primary
    method entityManagerFactory (line 62) | @Primary
    method entityManager (line 82) | @Primary
    method transactionManager (line 94) | @Primary

FILE: demo-multi-datasource-jpa/src/main/java/com/xkcoding/multi/datasource/jpa/config/SecondDataSourceConfig.java
  class SecondDataSourceConfig (line 20) | @Configuration
    method dataSourceProperties (line 28) | @Bean(name = "secondDataSourceProperties")
    method dataSource (line 40) | @Bean(name = "secondDataSource")
    method jdbcTemplate (line 51) | @Bean(name = "secondJdbcTemplate")

FILE: demo-multi-datasource-jpa/src/main/java/com/xkcoding/multi/datasource/jpa/config/SecondJpaConfig.java
  class SecondJpaConfig (line 27) | @Configuration
    method jpaProperties (line 46) | @Bean(name = "secondJpaProperties")
    method entityManagerFactory (line 60) | @Bean(name = "secondEntityManagerFactory")
    method entityManager (line 79) | @Bean(name = "secondEntityManager")
    method transactionManager (line 90) | @Bean(name = "secondTransactionManager")

FILE: demo-multi-datasource-jpa/src/main/java/com/xkcoding/multi/datasource/jpa/config/SnowflakeConfig.java
  class SnowflakeConfig (line 16) | @Configuration
    method snowflake (line 18) | @Bean

FILE: demo-multi-datasource-jpa/src/main/java/com/xkcoding/multi/datasource/jpa/entity/primary/PrimaryMultiTable.java
  class PrimaryMultiTable (line 20) | @Data

FILE: demo-multi-datasource-jpa/src/main/java/com/xkcoding/multi/datasource/jpa/entity/second/SecondMultiTable.java
  class SecondMultiTable (line 20) | @Data

FILE: demo-multi-datasource-jpa/src/main/java/com/xkcoding/multi/datasource/jpa/repository/primary/PrimaryMultiTableRepository.java
  type PrimaryMultiTableRepository (line 15) | @Repository

FILE: demo-multi-datasource-jpa/src/main/java/com/xkcoding/multi/datasource/jpa/repository/second/SecondMultiTableRepository.java
  type SecondMultiTableRepository (line 15) | @Repository

FILE: demo-multi-datasource-jpa/src/test/java/com/xkcoding/multi/datasource/jpa/SpringBootDemoMultiDatasourceJpaApplicationTests.java
  class SpringBootDemoMultiDatasourceJpaApplicationTests (line 18) | @RunWith(SpringRunner.class)
    method testInsert (line 29) | @Test
    method testUpdate (line 39) | @Test
    method testDelete (line 51) | @Test
    method testSelect (line 58) | @Test

FILE: demo-multi-datasource-mybatis/sql/db.sql
  type `multi_user` (line 2) | CREATE TABLE `multi_user`(

FILE: demo-multi-datasource-mybatis/src/main/java/com/xkcoding/multi/datasource/mybatis/SpringBootDemoMultiDatasourceMybatisApplication.java
  class SpringBootDemoMultiDatasourceMybatisApplication (line 15) | @SpringBootApplication
    method main (line 19) | public static void main(String[] args) {

FILE: demo-multi-datasource-mybatis/src/main/java/com/xkcoding/multi/datasource/mybatis/mapper/UserMapper.java
  type UserMapper (line 14) | public interface UserMapper extends BaseMapper<User> {

FILE: demo-multi-datasource-mybatis/src/main/java/com/xkcoding/multi/datasource/mybatis/model/User.java
  class User (line 21) | @Data

FILE: demo-multi-datasource-mybatis/src/main/java/com/xkcoding/multi/datasource/mybatis/service/UserService.java
  type UserService (line 14) | public interface UserService extends IService<User> {
    method addUser (line 21) | void addUser(User user);

FILE: demo-multi-datasource-mybatis/src/main/java/com/xkcoding/multi/datasource/mybatis/service/impl/UserServiceImpl.java
  class UserServiceImpl (line 18) | @Service
    method addUser (line 27) | @DS("master")

FILE: demo-multi-datasource-mybatis/src/test/java/com/xkcoding/multi/datasource/mybatis/SpringBootDemoMultiDatasourceMybatisApplicationTests.java
  class SpringBootDemoMultiDatasourceMybatisApplicationTests (line 8) | @RunWith(SpringRunner.class)
    method contextLoads (line 12) | @Test

FILE: demo-multi-datasource-mybatis/src/test/java/com/xkcoding/multi/datasource/mybatis/service/impl/UserServiceImplTest.java
  class UserServiceImplTest (line 22) | @Slf4j
    method addUser (line 30) | @Test
    method testListUser (line 42) | @Test

FILE: demo-neo4j/src/main/java/com/xkcoding/neo4j/SpringBootDemoNeo4jApplication.java
  class SpringBootDemoNeo4jApplication (line 14) | @SpringBootApplication
    method main (line 17) | public static void main(String[] args) {

FILE: demo-neo4j/src/main/java/com/xkcoding/neo4j/config/CustomIdStrategy.java
  class CustomIdStrategy (line 14) | public class CustomIdStrategy implements IdStrategy {
    method generateId (line 15) | @Override

FILE: demo-neo4j/src/main/java/com/xkcoding/neo4j/constants/NeoConsts.java
  type NeoConsts (line 11) | public interface NeoConsts {

FILE: demo-neo4j/src/main/java/com/xkcoding/neo4j/model/Class.java
  class Class (line 19) | @Data

FILE: demo-neo4j/src/main/java/com/xkcoding/neo4j/model/Lesson.java
  class Lesson (line 19) | @Data

FILE: demo-neo4j/src/main/java/com/xkcoding/neo4j/model/Student.java
  class Student (line 21) | @Data

FILE: demo-neo4j/src/main/java/com/xkcoding/neo4j/model/Teacher.java
  class Teacher (line 17) | @Data

FILE: demo-neo4j/src/main/java/com/xkcoding/neo4j/payload/ClassmateInfoGroupByLesson.java
  class ClassmateInfoGroupByLesson (line 17) | @Data

FILE: demo-neo4j/src/main/java/com/xkcoding/neo4j/payload/TeacherStudent.java
  class TeacherStudent (line 17) | @Data

FILE: demo-neo4j/src/main/java/com/xkcoding/neo4j/repository/ClassRepository.java
  type ClassRepository (line 16) | public interface ClassRepository extends Neo4jRepository<Class, String> {
    method findByName (line 23) | Optional<Class> findByName(String name);

FILE: demo-neo4j/src/main/java/com/xkcoding/neo4j/repository/LessonRepository.java
  type LessonRepository (line 14) | public interface LessonRepository extends Neo4jRepository<Lesson, String> {

FILE: demo-neo4j/src/main/java/com/xkcoding/neo4j/repository/StudentRepository.java
  type StudentRepository (line 22) | public interface StudentRepository extends Neo4jRepository<Student, Stri...
    method findByName (line 30) | Optional<Student> findByName(String name, @Depth int depth);
    method countByClassName (line 38) | @Query("MATCH (s:Student)-[r:R_STUDENT_OF_CLASS]->(c:Class{name:{class...
    method findByClassmateGroupByLesson (line 47) | @Query("match (s:Student)-[:R_LESSON_OF_STUDENT]->(l:Lesson)<-[:R_LESS...
    method findTeacherStudentByClass (line 55) | @Query("match (s:Student)-[:R_STUDENT_OF_CLASS]->(:Class)-[:R_BOSS_OF_...
    method findTeacherStudentByLesson (line 63) | @Query("match ((s:Student)-[:R_LESSON_OF_STUDENT]->(:Lesson)-[:R_TEACH...

FILE: demo-neo4j/src/main/java/com/xkcoding/neo4j/repository/TeacherRepository.java
  type TeacherRepository (line 14) | public interface TeacherRepository extends Neo4jRepository<Teacher, Stri...

FILE: demo-neo4j/src/main/java/com/xkcoding/neo4j/service/NeoService.java
  class NeoService (line 36) | @Service
    method initData (line 56) | @Transactional
    method delete (line 104) | @Transactional
    method findLessonsFromStudent (line 128) | public List<Lesson> findLessonsFromStudent(String studentName, int dep...
    method studentCount (line 139) | public Long studentCount(String className) {
    method findClassmatesGroupByLesson (line 152) | public Map<String, List<Student>> findClassmatesGroupByLesson() {
    method findTeacherStudent (line 166) | public Map<String, Set<Student>> findTeacherStudent() {

FILE: demo-neo4j/src/test/java/com/xkcoding/neo4j/Neo4jTest.java
  class Neo4jTest (line 24) | @Slf4j
    method testSave (line 32) | @Test
    method testDelete (line 40) | @Test
    method testFindLessonsByStudent (line 48) | @Test
    method testCountStudent (line 60) | @Test
    method testFindClassmates (line 71) | @Test
    method testFindTeacherStudent (line 80) | @Test

FILE: demo-neo4j/src/test/java/com/xkcoding/neo4j/SpringBootDemoNeo4jApplicationTests.java
  class SpringBootDemoNeo4jApplicationTests (line 8) | @RunWith(SpringRunner.class)
    method contextLoads (line 12) | @Test

FILE: demo-oauth/oauth-authorization-server/src/main/java/com/xkcoding/oauth/SpringBootDemoOauthApplication.java
  class SpringBootDemoOauthApplication (line 14) | @SpringBootApplication
    method main (line 17) | public static void main(String[] args) {

FILE: demo-oauth/oauth-authorization-server/src/main/java/com/xkcoding/oauth/config/ClientLoginFailureHandler.java
  class ClientLoginFailureHandler (line 20) | @Slf4j
    method onAuthenticationFailure (line 23) | @Override

FILE: demo-oauth/oauth-authorization-server/src/main/java/com/xkcoding/oauth/config/ClientLogoutSuccessHandler.java
  class ClientLogoutSuccessHandler (line 19) | @Slf4j
    method onLogoutSuccess (line 23) | @Override

FILE: demo-oauth/oauth-authorization-server/src/main/java/com/xkcoding/oauth/config/Oauth2AuthorizationServerConfig.java
  class Oauth2AuthorizationServerConfig (line 22) | @Configuration
    method configure (line 32) | @Override
    method configure (line 37) | @Override
    method configure (line 43) | @Override

FILE: demo-oauth/oauth-authorization-server/src/main/java/com/xkcoding/oauth/config/Oauth2AuthorizationTokenConfig.java
  class Oauth2AuthorizationTokenConfig (line 23) | @Configuration
    method tokenStore (line 33) | @Bean
    method jwtAccessTokenConverter (line 44) | @Bean
    method keyPair (line 57) | @Bean
    method passwordEncoder (line 70) | @Bean

FILE: demo-oauth/oauth-authorization-server/src/main/java/com/xkcoding/oauth/config/WebSecurityConfig.java
  class WebSecurityConfig (line 17) | @EnableWebSecurity
    method configure (line 25) | @Override
    method authenticationManagerBean (line 36) | @Override

FILE: demo-oauth/oauth-authorization-server/src/main/java/com/xkcoding/oauth/controller/AuthorizationController.java
  class AuthorizationController (line 20) | @Controller
    method getAccessConfirmation (line 32) | @GetMapping("/oauth/confirm_access")

FILE: demo-oauth/oauth-authorization-server/src/main/java/com/xkcoding/oauth/controller/Oauth2Controller.java
  class Oauth2Controller (line 20) | @Controller
    method loginView (line 30) | @GetMapping("/login")
    method logoutView (line 42) | @GetMapping("/logout")

FILE: demo-oauth/oauth-authorization-server/src/main/java/com/xkcoding/oauth/entity/SysClientDetails.java
  class SysClientDetails (line 23) | @Data
    method isSecretRequired (line 90) | @Override
    method isScoped (line 100) | @Override
    method getScope (line 110) | @Override
    method getAuthorizedGrantTypes (line 120) | @Override
    method getResourceIds (line 125) | @Override
    method getRegisteredRedirectUri (line 136) | @Override
    method getAuthorities (line 152) | @Override
    method isAutoApprove (line 163) | @Override
    method getAdditionalInformation (line 183) | @Override
    method stringToSet (line 188) | private Set<String> stringToSet(String s) {

FILE: demo-oauth/oauth-authorization-server/src/main/java/com/xkcoding/oauth/entity/SysRole.java
  class SysRole (line 18) | @Data

FILE: demo-oauth/oauth-authorization-server/src/main/java/com/xkcoding/oauth/entity/SysUser.java
  class SysUser (line 22) | @Data

FILE: demo-oauth/oauth-authorization-server/src/main/java/com/xkcoding/oauth/repostiory/SysClientDetailsRepository.java
  type SysClientDetailsRepository (line 15) | public interface SysClientDetailsRepository extends JpaRepository<SysCli...
    method findFirstByClientId (line 23) | Optional<SysClientDetails> findFirstByClientId(String clientId);
    method deleteByClientId (line 30) | @Modifying

FILE: demo-oauth/oauth-authorization-server/src/main/java/com/xkcoding/oauth/repostiory/SysUserRepository.java
  type SysUserRepository (line 14) | public interface SysUserRepository extends JpaRepository<SysUser, Long> {
    method findFirstByUsername (line 22) | Optional<SysUser> findFirstByUsername(String username);

FILE: demo-oauth/oauth-authorization-server/src/main/java/com/xkcoding/oauth/service/SysClientDetailsService.java
  type SysClientDetailsService (line 18) | public interface SysClientDetailsService extends ClientDetailsService {
    method findByClientId (line 26) | SysClientDetails findByClientId(String clientId);
    method addClientDetails (line 34) | void addClientDetails(SysClientDetails clientDetails) throws ClientAlr...
    method updateClientDetails (line 42) | void updateClientDetails(SysClientDetails clientDetails) throws NoSuch...
    method updateClientSecret (line 51) | void updateClientSecret(String clientId, String clientSecret) throws N...
    method removeClientDetails (line 59) | void removeClientDetails(String clientId) throws NoSuchClientException;
    method findAll (line 66) | List<SysClientDetails> findAll();

FILE: demo-oauth/oauth-authorization-server/src/main/java/com/xkcoding/oauth/service/SysUserService.java
  type SysUserService (line 15) | public interface SysUserService extends UserDetailsService {
    method findAll (line 21) | List<SysUser> findAll();
    method findById (line 29) | SysUser findById(Long id);
    method createUser (line 36) | void createUser(SysUser sysUser);
    method updateUser (line 43) | void updateUser(SysUser sysUser);
    method updatePassword (line 51) | void updatePassword(Long id, String password);
    method deleteUser (line 58) | void deleteUser(Long id);

FILE: demo-oauth/oauth-authorization-server/src/main/java/com/xkcoding/oauth/service/impl/SysClientDetailsServiceImpl.java
  class SysClientDetailsServiceImpl (line 22) | @Service
    method loadClientByClientId (line 29) | @Override
    method findByClientId (line 34) | @Override
    method addClientDetails (line 39) | @Override
    method updateClientDetails (line 48) | @Override
    method updateClientSecret (line 55) | @Override
    method removeClientDetails (line 62) | @Override
    method findAll (line 67) | @Override

FILE: demo-oauth/oauth-authorization-server/src/main/java/com/xkcoding/oauth/service/impl/SysUserServiceImpl.java
  class SysUserServiceImpl (line 23) | @Service
    method loadUserByUsername (line 30) | @Override
    method findAll (line 38) | @Override
    method findById (line 43) | @Override
    method createUser (line 48) | @Override
    method updateUser (line 54) | @Override
    method updatePassword (line 60) | @Override
    method deleteUser (line 67) | @Override

FILE: demo-oauth/oauth-authorization-server/src/test/java/com/xkcoding/oauth/PasswordEncodeTest.java
  class PasswordEncodeTest (line 13) | public class PasswordEncodeTest {
    method getPasswordWhenPassed (line 17) | @Test

FILE: demo-oauth/oauth-authorization-server/src/test/java/com/xkcoding/oauth/oauth/AuthorizationCodeGrantTests.java
  class AuthorizationCodeGrantTests (line 31) | public class AuthorizationCodeGrantTests {
    method setUp (line 36) | @BeforeEach
    method testCannotConnectWithoutToken (line 46) | @Test
    method testAttemptedTokenAcquisitionWithNoRedirect (line 52) | @Test
    method testCodeAcquisitionWithCorrectContext (line 63) | @Test

FILE: demo-oauth/oauth-authorization-server/src/test/java/com/xkcoding/oauth/oauth/AuthorizationServerInfo.java
  class AuthorizationServerInfo (line 21) | @SuppressWarnings("all")
    method AuthorizationServerInfo (line 27) | public AuthorizationServerInfo() {
    method getForString (line 46) | public ResponseEntity<String> getForString(String path, final HttpHead...
    method getForString (line 50) | public ResponseEntity<String> getForString(String path) {
    method postForStatus (line 54) | public ResponseEntity<Void> postForStatus(String path, HttpHeaders hea...
    method getUrl (line 62) | public static String getUrl(String path) {
    method postForHeaders (line 66) | public HttpHeaders postForHeaders(String path, MultiValueMap<String, S...
    class NullRequestCallback (line 88) | private static final class NullRequestCallback implements RequestCallb...
      method doWithRequest (line 89) | public void doWithRequest(ClientHttpRequest request) {

FILE: demo-oauth/oauth-authorization-server/src/test/java/com/xkcoding/oauth/oauth/ResourceOwnerPasswordGrantTests.java
  class ResourceOwnerPasswordGrantTests (line 19) | public class ResourceOwnerPasswordGrantTests {
    method testConnectDirectlyToResourceServer (line 21) | @Test
    method accessToken (line 26) | public static String accessToken() {

FILE: demo-oauth/oauth-authorization-server/src/test/java/com/xkcoding/oauth/repostiory/SysClientDetailsTest.java
  class SysClientDetailsTest (line 16) | @DataJpaTest
    method autowiredSuccessWhenPassed (line 21) | @Test

FILE: demo-oauth/oauth-authorization-server/src/test/java/com/xkcoding/oauth/repostiory/SysUserRepositoryTest.java
  class SysUserRepositoryTest (line 20) | @DataJpaTest
    method autowiredSuccessWhenPassed (line 26) | @Test
    method queryUserAndRoleWhenPassed (line 31) | @Test

FILE: demo-oauth/oauth-authorization-server/src/test/resources/schema.sql
  type sys_client_details (line 1) | create table sys_client_details
  type sys_role (line 16) | create table sys_role
  type sys_user (line 23) | create table sys_user
  type sys_user_role (line 30) | create table sys_user_role

FILE: demo-oauth/oauth-resource-server/src/main/java/com/xkcoding/oauth/SpringBootDemoResourceApplication.java
  class SpringBootDemoResourceApplication (line 14) | @EnableResourceServer
    method main (line 17) | public static void main(String[] args) {

FILE: demo-oauth/oauth-resource-server/src/main/java/com/xkcoding/oauth/config/OauthResourceServerConfig.java
  class OauthResourceServerConfig (line 20) | @Configuration
    method configure (line 29) | @Override
    method configure (line 34) | @Override

FILE: demo-oauth/oauth-resource-server/src/main/java/com/xkcoding/oauth/config/OauthResourceTokenConfig.java
  class OauthResourceTokenConfig (line 27) | @Slf4j
    method tokenStore (line 40) | @Bean
    method jwtAccessTokenConverter (line 50) | @Bean
    method getPubKey (line 63) | private String getPubKey() {
    method getKeyFromAuthorizationServer (line 74) | private String getKeyFromAuthorizationServer() {
    method encodeClient (line 95) | private String encodeClient() {

FILE: demo-oauth/oauth-resource-server/src/main/java/com/xkcoding/oauth/controller/TestController.java
  class TestController (line 13) | @RestController
    method admin (line 21) | @PreAuthorize("hasRole('ADMIN')")
    method test (line 32) | @PreAuthorize("hasRole('TEST')")
    method read (line 43) | @PreAuthorize("#oauth2.hasScope('READ')")
    method write (line 54) | @PreAuthorize("#oauth2.hasScope('WRITE')")

FILE: demo-oauth/oauth-resource-server/src/test/java/com/xkcoding/oauth/AuthorizationTest.java
  class AuthorizationTest (line 18) | public class AuthorizationTest {
    method oauth2RestTemplate (line 21) | protected OAuth2RestTemplate oauth2RestTemplate(String username, Strin...
    method testAccessTokenWhenPassed (line 33) | @Test

FILE: demo-oauth/oauth-resource-server/src/test/java/com/xkcoding/oauth/controller/TestControllerTest.java
  class TestControllerTest (line 24) | public class TestControllerTest extends AuthorizationTest {
    method testAdminRoleSucceedAndTestRoleFailedWhenPassed (line 28) | @Test
    method testTestRoleSucceedWhenPassed (line 38) | @Test
    method testScopeReadWhenPassed (line 48) | @Test
    method testScopeWriteWhenPassed (line 58) | @Test
    method testScopeWhenPassed (line 68) | @Test

FILE: demo-orm-beetlsql/src/main/java/com/xkcoding/orm/beetlsql/SpringBootDemoOrmBeetlsqlApplication.java
  class SpringBootDemoOrmBeetlsqlApplication (line 14) | @SpringBootApplication
    method main (line 17) | public static void main(String[] args) {

FILE: demo-orm-beetlsql/src/main/java/com/xkcoding/orm/beetlsql/config/BeetlConfig.java
  class BeetlConfig (line 18) | @Configuration
    method getDataSource (line 24) | @Bean(name = "datasource")

FILE: demo-orm-beetlsql/src/main/java/com/xkcoding/orm/beetlsql/dao/UserDao.java
  type UserDao (line 15) | @Component

FILE: demo-orm-beetlsql/src/main/java/com/xkcoding/orm/beetlsql/entity/User.java
  class User (line 20) | @Data

FILE: demo-orm-beetlsql/src/main/java/com/xkcoding/orm/beetlsql/service/UserService.java
  type UserService (line 16) | public interface UserService {
    method saveUser (line 23) | User saveUser(User user);
    method saveUserList (line 31) | void saveUserList(List<User> users);
    method deleteUser (line 38) | void deleteUser(Long id);
    method updateUser (line 46) | User updateUser(User user);
    method getUser (line 54) | User getUser(Long id);
    method getUserList (line 61) | List<User> getUserList();
    method getUserByPage (line 70) | PageQuery<User> getUserByPage(Integer currentPage, Integer pageSize);

FILE: demo-orm-beetlsql/src/main/java/com/xkcoding/orm/beetlsql/service/impl/UserServiceImpl.java
  class UserServiceImpl (line 22) | @Service
    method UserServiceImpl (line 28) | @Autowired
    method saveUser (line 38) | @Override
    method saveUserList (line 49) | @Override
    method deleteUser (line 59) | @Override
    method updateUser (line 70) | @Override
    method getUser (line 85) | @Override
    method getUserList (line 95) | @Override
    method getUserByPage (line 107) | @Override

FILE: demo-orm-beetlsql/src/main/resources/db/schema.sql
  type `orm_user` (line 2) | CREATE TABLE `orm_user` (

FILE: demo-orm-beetlsql/src/test/java/com/xkcoding/orm/beetlsql/SpringBootDemoOrmBeetlsqlApplicationTests.java
  class SpringBootDemoOrmBeetlsqlApplicationTests (line 8) | @RunWith(SpringRunner.class)
    method contextLoads (line 12) | @Test

FILE: demo-orm-beetlsql/src/test/java/com/xkcoding/orm/beetlsql/service/UserServiceTest.java
  class UserServiceTest (line 28) | @Slf4j
    method saveUser (line 33) | @Test
    method saveUserList (line 43) | @Test
    method deleteUser (line 55) | @Test
    method updateUser (line 62) | @Test
    method getUser (line 71) | @Test
    method getUserList (line 78) | @Test
    method getUserByPage (line 85) | @Test

FILE: demo-orm-jdbctemplate/src/main/java/com/xkcoding/orm/jdbctemplate/SpringBootDemoOrmJdbctemplateApplication.java
  class SpringBootDemoOrmJdbctemplateApplication (line 14) | @SpringBootApplication
    method main (line 17) | public static void main(String[] args) {

FILE: demo-orm-jdbctemplate/src/main/java/com/xkcoding/orm/jdbctemplate/constant/Const.java
  type Const (line 11) | public interface Const {

FILE: demo-orm-jdbctemplate/src/main/java/com/xkcoding/orm/jdbctemplate/controller/UserController.java
  class UserController (line 20) | @RestController
    method UserController (line 25) | @Autowired
    method save (line 30) | @PostMapping("/user")
    method delete (line 36) | @DeleteMapping("/user/{id}")
    method update (line 42) | @PutMapping("/user/{id}")
    method getUser (line 48) | @GetMapping("/user/{id}")
    method getUser (line 54) | @GetMapping("/user")

FILE: demo-orm-jdbctemplate/src/main/java/com/xkcoding/orm/jdbctemplate/dao/UserDao.java
  class UserDao (line 19) | @Repository
    method UserDao (line 22) | @Autowired
    method insert (line 33) | public Integer insert(User user) {
    method delete (line 43) | public Integer delete(Long id) {
    method update (line 54) | public Integer update(User user, Long id) {
    method selectById (line 64) | public User selectById(Long id) {
    method selectUserList (line 74) | public List<User> selectUserList(User user) {

FILE: demo-orm-jdbctemplate/src/main/java/com/xkcoding/orm/jdbctemplate/dao/base/BaseDao.java
  class BaseDao (line 36) | @Slf4j
    method BaseDao (line 41) | @SuppressWarnings(value = "unchecked")
    method insert (line 54) | protected Integer insert(T t, Boolean ignoreNull) {
    method deleteById (line 81) | protected Integer deleteById(P pk) {
    method updateById (line 97) | protected Integer updateById(T t, P pk, Boolean ignoreNull) {
    method findOneById (line 125) | public T findOneById(P pk) {
    method findByExample (line 140) | public List<T> findByExample(T t) {
    method getTableName (line 166) | private String getTableName(T t) {
    method getTableName (line 180) | private String getTableName() {
    method getColumns (line 195) | private List<String> getColumns(List<Field> fieldList) {
    method getField (line 218) | private List<Field> getField(T t, Boolean ignoreNull) {

FILE: demo-orm-jdbctemplate/src/main/java/com/xkcoding/orm/jdbctemplate/entity/User.java
  class User (line 19) | @Data

FILE: demo-orm-jdbctemplate/src/main/java/com/xkcoding/orm/jdbctemplate/service/IUserService.java
  type IUserService (line 15) | public interface IUserService {
    method save (line 22) | Boolean save(User user);
    method delete (line 30) | Boolean delete(Long id);
    method update (line 39) | Boolean update(User user, Long id);
    method getUser (line 47) | User getUser(Long id);
    method getUser (line 55) | List<User> getUser(User user);

FILE: demo-orm-jdbctemplate/src/main/java/com/xkcoding/orm/jdbctemplate/service/impl/UserServiceImpl.java
  class UserServiceImpl (line 26) | @Service
    method UserServiceImpl (line 30) | @Autowired
    method save (line 41) | @Override
    method delete (line 57) | @Override
    method update (line 69) | @Override
    method getUser (line 90) | @Override
    method getUser (line 101) | @Override

FILE: demo-orm-jdbctemplate/src/main/resources/db/schema.sql
  type `orm_user` (line 2) | CREATE TABLE `orm_user` (

FILE: demo-orm-jdbctemplate/src/test/java/com/xkcoding/orm/jdbctemplate/SpringBootDemoOrmJdbctemplateApplicationTests.java
  class SpringBootDemoOrmJdbctemplateApplicationTests (line 8) | @RunWith(SpringRunner.class)
    method contextLoads (line 12) | @Test

FILE: demo-orm-jpa/src/main/java/com/xkcoding/orm/jpa/SpringBootDemoOrmJpaApplication.java
  class SpringBootDemoOrmJpaApplication (line 14) | @SpringBootApplication
    method main (line 17) | public static void main(String[] args) {

FILE: demo-orm-jpa/src/main/java/com/xkcoding/orm/jpa/config/JpaConfig.java
  class JpaConfig (line 26) | @Configuration
    method dataSource (line 31) | @Bean
    method entityManagerFactory (line 37) | @Bean
    method jpaTransactionManager (line 48) | @Bean

FILE: demo-orm-jpa/src/main/java/com/xkcoding/orm/jpa/entity/Department.java
  class Department (line 17) | @EqualsAndHashCode(callSuper = true)

FILE: demo-orm-jpa/src/main/java/com/xkcoding/orm/jpa/entity/User.java
  class User (line 18) | @EqualsAndHashCode(callSuper = true)

FILE: demo-orm-jpa/src/main/java/com/xkcoding/orm/jpa/entity/base/AbstractAuditModel.java
  class AbstractAuditModel (line 20) | @MappedSuperclass

FILE: demo-orm-jpa/src/main/java/com/xkcoding/orm/jpa/repository/DepartmentDao.java
  type DepartmentDao (line 18) | @Repository
    method findDepartmentsByLevels (line 26) | List<Department> findDepartmentsByLevels(Integer level);

FILE: demo-orm-jpa/src/main/java/com/xkcoding/orm/jpa/repository/UserDao.java
  type UserDao (line 15) | @Repository

FILE: demo-orm-jpa/src/main/resources/db/schema.sql
  type `orm_user` (line 2) | CREATE TABLE `orm_user` (
  type `orm_department` (line 17) | CREATE TABLE `orm_department` (
  type `orm_user_dept` (line 28) | CREATE TABLE `orm_user_dept` (

FILE: demo-orm-jpa/src/test/java/com/xkcoding/orm/jpa/SpringBootDemoOrmJpaApplicationTests.java
  class SpringBootDemoOrmJpaApplicationTests (line 8) | @RunWith(SpringRunner.class)
    method contextLoads (line 12) | @Test

FILE: demo-orm-jpa/src/test/java/com/xkcoding/orm/jpa/repository/DepartmentDaoTest.java
  class DepartmentDaoTest (line 24) | @Slf4j
    method testSave (line 34) | @Test

FILE: demo-orm-jpa/src/test/java/com/xkcoding/orm/jpa/repository/UserDaoTest.java
  class UserDaoTest (line 29) | @Slf4j
    method testSave (line 37) | @Test
    method testDelete (line 52) | @Test
    method testUpdate (line 63) | @Test
    method testQueryOne (line 75) | @Test
    method testQueryAll (line 85) | @Test
    method testQueryPage (line 95) | @Test
    method initData (line 114) | private void initData() {

FILE: demo-orm-mybatis-mapper-page/src/main/java/com/xkcoding/orm/mybatis/MapperAndPage/SpringBootDemoOrmMybatisMapperPageApplication.java
  class SpringBootDemoOrmMybatisMapperPageApplication (line 15) | @SpringBootApplication
    method main (line 19) | public static void main(String[] args) {

FILE: demo-orm-mybatis-mapper-page/src/main/java/com/xkcoding/orm/mybatis/MapperAndPage/entity/User.java
  class User (line 22) | @Data

FILE: demo-orm-mybatis-mapper-page/src/main/java/com/xkcoding/orm/mybatis/MapperAndPage/mapper/UserMapper.java
  type UserMapper (line 16) | @Component

FILE: demo-orm-mybatis-mapper-page/src/main/resources/db/schema.sql
  type `orm_user` (line 2) | CREATE TABLE `orm_user` (

FILE: demo-orm-mybatis-mapper-page/src/test/java/com/xkcoding/orm/mybatis/MapperAndPage/SpringBootDemoOrmMybatisMapperPageApplicationTests.java
  class SpringBootDemoOrmMybatisMapperPageApplicationTests (line 8) | @RunWith(SpringRunner.class)
    method contextLoads (line 12) | @Test

FILE: demo-orm-mybatis-mapper-page/src/test/java/com/xkcoding/orm/mybatis/MapperAndPage/mapper/UserMapperTest.java
  class UserMapperTest (line 29) | @Slf4j
    method testInsert (line 38) | @Test
    method testInsertList (line 50) | @Test
    method testDelete (line 67) | @Test
    method testUpdate (line 79) | @Test
    method testQueryOne (line 95) | @Test
    method testQueryAll (line 105) | @Test
    method testQueryByPageAndSort (line 115) | @Test
    method testQueryByCondition (line 133) | @Test
    method initData (line 155) | private void initData() {

FILE: demo-orm-mybatis-plus/src/main/java/com/xkcoding/orm/mybatis/plus/SpringBootDemoOrmMybatisPlusApplication.java
  class SpringBootDemoOrmMybatisPlusApplication (line 14) | @SpringBootApplication
    method main (line 17) | public static void main(String[] args) {

FILE: demo-orm-mybatis-plus/src/main/java/com/xkcoding/orm/mybatis/plus/config/CommonFieldHandler.java
  class CommonFieldHandler (line 18) | @Slf4j
    method insertFill (line 22) | @Override
    method updateFill (line 29) | @Override

FILE: demo-orm-mybatis-plus/src/main/java/com/xkcoding/orm/mybatis/plus/config/MybatisPlusConfig.java
  class MybatisPlusConfig (line 18) | @Configuration
    method performanceInterceptor (line 25) | @Bean
    method paginationInterceptor (line 33) | @Bean

FILE: demo-orm-mybatis-plus/src/main/java/com/xkcoding/orm/mybatis/plus/entity/Role.java
  class Role (line 19) | @Data
    method pkVal (line 38) | @Override

FILE: demo-orm-mybatis-plus/src/main/java/com/xkcoding/orm/mybatis/plus/entity/User.java
  class User (line 24) | @Data

FILE: demo-orm-mybatis-plus/src/main/java/com/xkcoding/orm/mybatis/plus/mapper/RoleMapper.java
  type RoleMapper (line 14) | public interface RoleMapper extends BaseMapper<Role> {

FILE: demo-orm-mybatis-plus/src/main/java/com/xkcoding/orm/mybatis/plus/mapper/UserMapper.java
  type UserMapper (line 15) | @Component

FILE: demo-orm-mybatis-plus/src/main/java/com/xkcoding/orm/mybatis/plus/service/UserService.java
  type UserService (line 14) | public interface UserService extends IService<User> {

FILE: demo-orm-mybatis-plus/src/main/java/com/xkcoding/orm/mybatis/plus/service/impl/UserServiceImpl.java
  class UserServiceImpl (line 17) | @Service

FILE: demo-orm-mybatis-plus/src/main/resources/db/schema.sql
  type `orm_user` (line 2) | CREATE TABLE `orm_user` (
  type `orm_role` (line 16) | CREATE TABLE `orm_role` (

FILE: demo-orm-mybatis-plus/src/test/java/com/xkcoding/orm/mybatis/plus/SpringBootDemoOrmMybatisPlusApplicationTests.java
  class SpringBootDemoOrmMybatisPlusApplicationTests (line 8) | @RunWith(SpringRunner.class)
    method contextLoads (line 12) | @Test

FILE: demo-orm-mybatis-plus/src/test/java/com/xkcoding/orm/mybatis/plus/activerecord/ActiveRecordTest.java
  class ActiveRecordTest (line 21) | @Slf4j
    method testActiveRecordInsert (line 26) | @Test
    method testActiveRecordUpdate (line 38) | @Test
    method testActiveRecordSelect (line 47) | @Test
    method testActiveRecordDelete (line 60) | @Test

FILE: demo-orm-mybatis-plus/src/test/java/com/xkcoding/orm/mybatis/plus/service/UserServiceTest.java
  class UserServiceTest (line 29) | @Slf4j
    method testSave (line 37) | @Test
    method testSaveList (line 49) | @Test
    method testDelete (line 66) | @Test
    method testUpdate (line 77) | @Test
    method testQueryOne (line 92) | @Test
    method testQueryAll (line 102) | @Test
    method testQueryByPageAndSort (line 112) | @Test
    method testQueryByCondition (line 127) | @Test
    method initData (line 143) | private void initData() {

FILE: demo-orm-mybatis/src/main/java/com/xkcoding/orm/mybatis/SpringBootDemoOrmMybatisApplication.java
  class SpringBootDemoOrmMybatisApplication (line 15) | @MapperScan(basePackages = {"com.xkcoding.orm.mybatis.mapper"})
    method main (line 19) | public static void main(String[] args) {

FILE: demo-orm-mybatis/src/main/java/com/xkcoding/orm/mybatis/entity/User.java
  class User (line 19) | @Data

FILE: demo-orm-mybatis/src/main/java/com/xkcoding/orm/mybatis/mapper/UserMapper.java
  type UserMapper (line 19) | @Mapper
    method selectAllUser (line 28) | @Select("SELECT * FROM orm_user")
    method selectUserById (line 37) | @Select("SELECT * FROM orm_user WHERE id = #{id}")
    method saveUser (line 46) | int saveUser(@Param("user") User user);
    method deleteById (line 54) | int deleteById(@Param("id") Long id);

FILE: demo-orm-mybatis/src/main/resources/db/schema.sql
  type `orm_user` (line 2) | CREATE TABLE `orm_user` (

FILE: demo-orm-mybatis/src/test/java/com/xkcoding/orm/mybatis/SpringBootDemoOrmMybatisApplicationTests.java
  class SpringBootDemoOrmMybatisApplicationTests (line 8) | @RunWith(SpringRunner.class)
    method contextLoads (line 12) | @Test

FILE: demo-orm-mybatis/src/test/java/com/xkcoding/orm/mybatis/mapper/UserMapperTest.java
  class UserMapperTest (line 24) | @Slf4j
    method selectAllUser (line 32) | @Test
    method selectUserById (line 42) | @Test
    method saveUser (line 52) | @Test
    method deleteById (line 63) | @Test

FILE: demo-pay/src/main/java/com/xkcoding/pay/SpringBootDemoPayApplication.java
  class SpringBootDemoPayApplication (line 15) | @SpringBootApplication
    method main (line 19) | public static void main(String[] args) {

FILE: demo-pay/src/test/java/com/xkcoding/pay/SpringBootDemoPayApplicationTests.java
  class SpringBootDemoPayApplicationTests (line 8) | @RunWith(SpringRunner.class)
    method contextLoads (line 12) | @Test

FILE: demo-properties/src/main/java/com/xkcoding/properties/SpringBootDemoPropertiesApplication.java
  class SpringBootDemoPropertiesApplication (line 14) | @SpringBootApplication
    method main (line 17) | public static void main(String[] args) {

FILE: demo-properties/src/main/java/com/xkcoding/properties/controller/PropertyController.java
  class PropertyController (line 18) | @RestController
    method PropertyController (line 23) | @Autowired
    method index (line 29) | @GetMapping("/property")

FILE: demo-properties/src/main/java/com/xkcoding/properties/property/ApplicationProperty.java
  class ApplicationProperty (line 15) | @Data

FILE: demo-properties/src/main/java/com/xkcoding/properties/property/DeveloperProperty.java
  class DeveloperProperty (line 15) | @Data

FILE: demo-properties/src/test/java/com/xkcoding/properties/SpringBootDemoPropertiesApplicationTests.java
  class SpringBootDemoPropertiesApplicationTests (line 8) | @RunWith(SpringRunner.class)
    method contextLoads (line 12) | @Test

FILE: demo-ratelimit-guava/src/main/java/com/xkcoding/ratelimit/guava/SpringBootDemoRatelimitGuavaApplication.java
  class SpringBootDemoRatelimitGuavaApplication (line 14) | @SpringBootApplication
    method main (line 17) | public static void main(String[] args) {

FILE: demo-ratelimit-guava/src/main/java/com/xkcoding/ratelimit/guava/aspect/RateLimiterAspect.java
  class RateLimiterAspect (line 25) | @Slf4j
    method rateLimit (line 31) | @Pointcut("@annotation(com.xkcoding.ratelimit.guava.annotation.RateLim...
    method pointcut (line 36) | @Around("rateLimit()")

FILE: demo-ratelimit-guava/src/main/java/com/xkcoding/ratelimit/guava/controller/TestController.java
  class TestController (line 17) | @Slf4j
    method test1 (line 21) | @RateLimiter(value = 1.0, timeout = 300)
    method test2 (line 28) | @GetMapping("/test2")
    method test3 (line 34) | @RateLimiter(value = 2.0, timeout = 300)

FILE: demo-ratelimit-guava/src/main/java/com/xkcoding/ratelimit/guava/handler/GlobalExceptionHandler.java
  class GlobalExceptionHandler (line 15) | @RestControllerAdvice
    method handler (line 18) | @ExceptionHandler(RuntimeException.class)

FILE: demo-ratelimit-guava/src/test/java/com/xkcoding/ratelimit/guava/SpringBootDemoRatelimitGuavaApplicationTests.java
  class SpringBootDemoRatelimitGuavaApplicationTests (line 8) | @RunWith(SpringRunner.class)
    method contextLoads (line 12) | @Test

FILE: demo-ratelimit-redis/src/main/java/com/xkcoding/ratelimit/redis/SpringBootDemoRatelimitRedisApplication.java
  class SpringBootDemoRatelimitRedisApplication (line 14) | @SpringBootApplication
    method main (line 17) | public static void main(String[] args) {

FILE: demo-ratelimit-redis/src/main/java/com/xkcoding/ratelimit/redis/aspect/RateLimiterAspect.java
  class RateLimiterAspect (line 32) | @Slf4j
    method rateLimit (line 42) | @Pointcut("@annotation(com.xkcoding.ratelimit.redis.annotation.RateLim...
    method pointcut (line 47) | @Around("rateLimit()")
    method shouldLimited (line 75) | private boolean shouldLimited(String key, long max, long timeout, Time...

FILE: demo-ratelimit-redis/src/main/java/com/xkcoding/ratelimit/redis/config/RedisConfig.java
  class RedisConfig (line 18) | @Configuration
    method limitRedisScript (line 20) | @Bean

FILE: demo-ratelimit-redis/src/main/java/com/xkcoding/ratelimit/redis/controller/TestController.java
  class TestController (line 17) | @Slf4j
    method test1 (line 21) | @RateLimiter(value = 5)
    method test2 (line 28) | @GetMapping("/test2")
    method test3 (line 34) | @RateLimiter(value = 2, key = "测试自定义key")

FILE: demo-ratelimit-redis/src/main/java/com/xkcoding/ratelimit/redis/handler/GlobalExceptionHandler.java
  class GlobalExceptionHandler (line 16) | @Slf4j
    method handler (line 20) | @ExceptionHandler(RuntimeException.class)

FILE: demo-ratelimit-redis/src/main/java/com/xkcoding/ratelimit/redis/util/IpUtil.java
  class IpUtil (line 18) | @Slf4j
    method getIpAddr (line 28) | public static String getIpAddr() {

FILE: demo-ratelimit-redis/src/test/java/com/xkcoding/ratelimit/redis/SpringBootDemoRatelimiterRedisApplicationTests.java
  class SpringBootDemoRatelimiterRedisApplicationTests (line 8) | @RunWith(SpringRunner.class)
    method contextLoads (line 12) | @Test

FILE: demo-rbac-security/sql/security.sql
  type `sec_permission` (line 24) | CREATE TABLE `sec_permission`
  type `sec_role` (line 62) | CREATE TABLE `sec_role`
  type `sec_role_permission` (line 88) | CREATE TABLE `sec_role_permission`
  type `sec_user` (line 122) | CREATE TABLE `sec_user`
  type `sec_user_role` (line 158) | CREATE TABLE `sec_user_role`

FILE: demo-rbac-security/src/main/java/com/xkcoding/rbac/security/SpringBootDemoRbacSecurityApplication.java
  class SpringBootDemoRbacSecurityApplication (line 14) | @SpringBootApplication
    method main (line 17) | public static void main(String[] args) {

FILE: demo-rbac-security/src/main/java/com/xkcoding/rbac/security/common/ApiResponse.java
  class ApiResponse (line 15) | @Data
    method ApiResponse (line 37) | private ApiResponse() {
    method ApiResponse (line 48) | private ApiResponse(Integer code, String message, Object data) {
    method of (line 62) | public static ApiResponse of(Integer code, String message, Object data) {
    method ofSuccess (line 71) | public static ApiResponse ofSuccess() {
    method ofSuccess (line 81) | public static ApiResponse ofSuccess(Object data) {
    method ofMessage (line 91) | public static ApiResponse ofMessage(String message) {
    method ofStatus (line 101) | public static ApiResponse ofStatus(Status status) {
    method ofStatus (line 112) | public static ApiResponse ofStatus(IStatus status, Object data) {
    method ofException (line 123) | public static <T extends BaseException> ApiResponse ofException(T t) {

FILE: demo-rbac-security/src/main/java/com/xkcoding/rbac/security/common/BaseException.java
  class BaseException (line 14) | @EqualsAndHashCode(callSuper = true)
    method BaseException (line 21) | public BaseException(Status status) {
    method BaseException (line 27) | public BaseException(Status status, Object data) {
    method BaseException (line 32) | public BaseException(Integer code, String message) {
    method BaseException (line 38) | public BaseException(Integer code, String message, Object data) {

FILE: demo-rbac-security/src/main/java/com/xkcoding/rbac/security/common/Consts.java
  type Consts (line 11) | public interface Consts {

FILE: demo-rbac-security/src/main/java/com/xkcoding/rbac/security/common/IStatus.java
  type IStatus (line 11) | public interface IStatus {
    method getCode (line 18) | Integer getCode();
    method getMessage (line 25) | String getMessage();

FILE: demo-rbac-security/src/main/java/com/xkcoding/rbac/security/common/PageResult.java
  class PageResult (line 18) | @Data
    method of (line 34) | public static <T> PageResult of(List<T> rows, Long total) {

FILE: demo-rbac-security/src/main/java/com/xkcoding/rbac/security/common/Status.java
  type Status (line 13) | @Getter
    method Status (line 105) | Status(Integer code, String message) {
    method fromCode (line 110) | public static Status fromCode(Integer code) {
    method toString (line 120) | @Override

FILE: demo-rbac-security/src/main/java/com/xkcoding/rbac/security/config/CustomConfig.java
  class CustomConfig (line 14) | @ConfigurationProperties(prefix = "custom.config")

FILE: demo-rbac-security/src/main/java/com/xkcoding/rbac/security/config/IdConfig.java
  class IdConfig (line 16) | @Configuration
    method snowflake (line 21) | @Bean

FILE: demo-rbac-security/src/main/java/com/xkcoding/rbac/security/config/IgnoreConfig.java
  class IgnoreConfig (line 16) | @Data

FILE: demo-rbac-security/src/main/java/com/xkcoding/rbac/security/config/JwtAuthenticationFilter.java
  class JwtAuthenticationFilter (line 38) | @Component
    method doFilterInternal (line 50) | @Override
    method checkIgnores (line 85) | private boolean checkIgnores(HttpServletRequest request) {

FILE: demo-rbac-security/src/main/java/com/xkcoding/rbac/security/config/JwtConfig.java
  class JwtConfig (line 14) | @ConfigurationProperties(prefix = "jwt.config")

FILE: demo-rbac-security/src/main/java/com/xkcoding/rbac/security/config/RbacAuthorityService.java
  class RbacAuthorityService (line 39) | @Component
    method hasPermission (line 50) | public boolean hasPermission(HttpServletRequest request, Authenticatio...
    method checkRequest (line 92) | private void checkRequest(HttpServletRequest request) {
    method allUrlMapping (line 120) | private Multimap<String, String> allUrlMapping() {

FILE: demo-rbac-security/src/main/java/com/xkcoding/rbac/security/config/RedisConfig.java
  class RedisConfig (line 23) | @Configuration
    method redisCacheTemplate (line 31) | @Bean

FILE: demo-rbac-security/src/main/java/com/xkcoding/rbac/security/config/SecurityConfig.java
  class SecurityConfig (line 28) | @Configuration
    method encoder (line 44) | @Bean
    method authenticationManagerBean (line 49) | @Override
    method configure (line 55) | @Override
    method configure (line 60) | @Override
    method configure (line 100) | @Override

FILE: demo-rbac-security/src/main/java/com/xkcoding/rbac/security/config/SecurityHandlerConfig.java
  class SecurityHandlerConfig (line 17) | @Configuration
    method accessDeniedHandler (line 20) | @Bean

FILE: demo-rbac-security/src/main/java/com/xkcoding/rbac/security/config/WebMvcConfig.java
  class WebMvcConfig (line 15) | @Configuration
    method addCorsMappings (line 20) | @Override

FILE: demo-rbac-security/src/main/java/com/xkcoding/rbac/security/controller/AuthController.java
  class AuthController (line 31) | @Slf4j
    method login (line 45) | @PostMapping("/login")
    method logout (line 55) | @PostMapping("/logout")

FILE: demo-rbac-security/src/main/java/com/xkcoding/rbac/security/controller/MonitorController.java
  class MonitorController (line 27) | @Slf4j
    method onlineUser (line 39) | @GetMapping("/online/user")
    method kickoutOnlineUser (line 51) | @DeleteMapping("/online/user/kickout")

FILE: demo-rbac-security/src/main/java/com/xkcoding/rbac/security/controller/TestController.java
  class TestController (line 15) | @Slf4j
    method list (line 19) | @GetMapping
    method add (line 25) | @PostMapping
    method update (line 31) | @PutMapping("/{id}")

FILE: demo-rbac-security/src/main/java/com/xkcoding/rbac/security/exception/SecurityException.java
  class SecurityException (line 16) | @EqualsAndHashCode(callSuper = true)
    method SecurityException (line 19) | public SecurityException(Status status) {
    method SecurityException (line 23) | public SecurityException(Status status, Object data) {
    method SecurityException (line 27) | public SecurityException(Integer code, String message) {
    method SecurityException (line 31) | public SecurityException(Integer code, String message, Object data) {

FILE: demo-rbac-security/src/main/java/com/xkcoding/rbac/security/exception/handler/GlobalExceptionHandler.java
  class GlobalExceptionHandler (line 30) | @ControllerAdvice
    method handlerException (line 34) | @ExceptionHandler(value = Exception.class)

FILE: demo-rbac-security/src/main/java/com/xkcoding/rbac/security/model/Permission.java
  class Permission (line 18) | @Data

FILE: demo-rbac-security/src/main/java/com/xkcoding/rbac/security/model/Role.java
  class Role (line 18) | @Data

FILE: demo-rbac-security/src/main/java/com/xkcoding/rbac/security/model/RolePermission.java
  class RolePermission (line 18) | @Data

FILE: demo-rbac-security/src/main/java/com/xkcoding/rbac/security/model/User.java
  class User (line 18) | @Data

FILE: demo-rbac-security/src/main/java/com/xkcoding/rbac/security/model/UserRole.java
  class UserRole (line 18) | @Data

FILE: demo-rbac-security/src/main/java/com/xkcoding/rbac/security/model/unionkey/RolePermissionKey.java
  class RolePermissionKey (line 17) | @Data

FILE: demo-rbac-security/src/main/java/com/xkcoding/rbac/security/model/unionkey/UserRoleKey.java
  class UserRoleKey (line 17) | @Embeddable

FILE: demo-rbac-security/src/main/java/com/xkcoding/rbac/security/payload/LoginRequest.java
  class LoginRequest (line 15) | @Data

FILE: demo-rbac-security/src/main/java/com/xkcoding/rbac/security/payload/PageCondition.java
  class PageCondition (line 13) | @Data

FILE: demo-rbac-security/src/main/java/com/xkcoding/rbac/security/repository/PermissionDao.java
  type PermissionDao (line 19) | public interface PermissionDao extends JpaRepository<Permission, Long>, ...
    method selectByRoleIdList (line 27) | @Query(value = "SELECT DISTINCT sec_permission.* FROM sec_permission,s...

FILE: demo-rbac-security/src/main/java/com/xkcoding/rbac/security/repository/RoleDao.java
  type RoleDao (line 19) | public interface RoleDao extends JpaRepository<Role, Long>, JpaSpecifica...
    method selectByUserId (line 26) | @Query(value = "SELECT sec_role.* FROM sec_role,sec_user,sec_user_role...

FILE: demo-rbac-security/src/main/java/com/xkcoding/rbac/security/repository/RolePermissionDao.java
  type RolePermissionDao (line 16) | public interface RolePermissionDao extends JpaRepository<RolePermission,...

FILE: demo-rbac-security/src/main/java/com/xkcoding/rbac/security/repository/UserDao.java
  type UserDao (line 18) | public interface UserDao extends JpaRepository<User, Long>, JpaSpecifica...
    method findByUsernameOrEmailOrPhone (line 27) | Optional<User> findByUsernameOrEmailOrPhone(String username, String em...
    method findByUsernameIn (line 35) | List<User> findByUsernameIn(List<String> usernameList);

FILE: demo-rbac-security/src/main/java/com/xkcoding/rbac/security/repository/UserRoleDao.java
  type UserRoleDao (line 16) | public interface UserRoleDao extends JpaRepository<UserRole, UserRoleKey...

FILE: demo-rbac-security/src/main/java/com/xkcoding/rbac/security/service/CustomUserDetailsService.java
  class CustomUserDetailsService (line 27) | @Service
    method loadUserByUsername (line 38) | @Override

FILE: demo-rbac-security/src/main/java/com/xkcoding/rbac/security/service/MonitorService.java
  class MonitorService (line 28) | @Slf4j
    method onlineUser (line 43) | public PageResult<OnlineUser> onlineUser(PageCondition pageCondition) {
    method kickout (line 65) | public void kickout(List<String> names) {

FILE: demo-rbac-security/src/main/java/com/xkcoding/rbac/security/util/JwtUtil.java
  class JwtUtil (line 34) | @EnableConfigurationProperties(JwtConfig.class)
    method createJWT (line 54) | public String createJWT(Boolean rememberMe, Long id, String subject, L...
    method createJWT (line 77) | public String createJWT(Authentication authentication, Boolean remembe...
    method parseJWT (line 88) | public Claims parseJWT(String jwt) {
    method invalidateJWT (line 130) | public void invalidateJWT(HttpServletRequest request) {
    method getUsernameFromJWT (line 143) | public String getUsernameFromJWT(String jwt) {
    method getJwtFromRequest (line 154) | public String getJwtFromRequest(HttpServletRequest request) {

FILE: demo-rbac-security/src/main/java/com/xkcoding/rbac/security/util/PageUtil.java
  class PageUtil (line 17) | public class PageUtil {
    method checkPageCondition (line 25) | public static <T extends PageCondition> void checkPageCondition(T cond...
    method ofPageRequest (line 45) | public static <T extends PageCondition> PageRequest ofPageRequest(T co...

FILE: demo-rbac-security/src/main/java/com/xkcoding/rbac/security/util/RedisUtil.java
  class RedisUtil (line 26) | @Component
    method findKeysForPage (line 40) | public PageResult<String> findKeysForPage(String patternKey, int curre...
    method delete (line 74) | public void delete(String key) {
    method delete (line 83) | public void delete(Collection<String> keys) {

FILE: demo-rbac-security/src/main/java/com/xkcoding/rbac/security/util/ResponseUtil.java
  class ResponseUtil (line 21) | @Slf4j
    method renderJson (line 31) | public static void renderJson(HttpServletResponse response, IStatus st...
    method renderJson (line 52) | public static void renderJson(HttpServletResponse response, BaseExcept...

FILE: demo-rbac-security/src/main/java/com/xkcoding/rbac/security/util/SecurityUtil.java
  class SecurityUtil (line 17) | public class SecurityUtil {
    method getCurrentUsername (line 23) | public static String getCurrentUsername() {
    method getCurrentUser (line 33) | public static UserPrincipal getCurrentUser() {

FILE: demo-rbac-security/src/main/java/com/xkcoding/rbac/security/vo/JwtResponse.java
  class JwtResponse (line 15) | @Data
    method JwtResponse (line 28) | public JwtResponse(String token) {

FILE: demo-rbac-security/src/main/java/com/xkcoding/rbac/security/vo/OnlineUser.java
  class OnlineUser (line 17) | @Data
    method create (line 55) | public static OnlineUser create(User user) {

FILE: demo-rbac-security/src/main/java/com/xkcoding/rbac/security/vo/UserPrincipal.java
  class UserPrincipal (line 29) | @Data
    method create (line 99) | public static UserPrincipal create(User user, List<Role> roles, List<P...
    method getAuthorities (line 107) | @Override
    method getPassword (line 112) | @Override
    method getUsername (line 117) | @Override
    method isAccountNonExpired (line 122) | @Override
    method isAccountNonLocked (line 127) | @Override
    method isCredentialsNonExpired (line 132) | @Override
    method isEnabled (line 137) | @Override

FILE: demo-rbac-security/src/test/java/com/xkcoding/rbac/security/SpringBootDemoRbacSecurityApplicationTests.java
  class SpringBootDemoRbacSecurityApplicationTests (line 8) | @RunWith(SpringRunner.class)
    method contextLoads (line 12) | @Test

FILE: demo-rbac-security/src/test/java/com/xkcoding/rbac/security/repository/DataInitTest.java
  class DataInitTest (line 22) | public class DataInitTest extends SpringBootDemoRbacSecurityApplicationT...
    method initTest (line 44) | @Test
    method init (line 49) | private void init() {
    method createRolePermissionRelation (line 79) | private void createRolePermissionRelation(Long roleId, Long permission...
    method createPermission (line 88) | private Permission createPermission(String url, String name, Integer t...
    method createUserRoleRelation (line 102) | private void createUserRoleRelation(Long userId, Long roleId) {
    method createRole (line 111) | private Role createRole(boolean isAdmin) {
    method createUser (line 122) | private User createUser(boolean isAdmin) {

FILE: demo-rbac-security/src/test/java/com/xkcoding/rbac/security/repository/UserDaoTest.java
  class UserDaoTest (line 21) | @Slf4j
    method findByUsernameIn (line 26) | @Test

FILE: demo-rbac-security/src/test/java/com/xkcoding/rbac/security/util/RedisUtilTest.java
  class RedisUtilTest (line 19) | @Slf4j
    method findKeysForPage (line 24) | @Test

FILE: demo-rbac-shiro/sql/shiro.sql
  type `shiro_user` (line 24) | CREATE TABLE `shiro_user`
  type `shiro_role` (line 49) | CREATE TABLE `shiro_role`
  type `shiro_user_role` (line 65) | CREATE TABLE `shiro_user_role`
  type `shiro_permission` (line 77) | CREATE TABLE `shiro_permission`
  type `shiro_role_permission` (line 95) | CREATE TABLE `shiro_role_permission`

FILE: demo-rbac-shiro/src/main/java/com/xkcoding/rbac/shiro/SpringBootDemoRbacShiroApplication.java
  class SpringBootDemoRbacShiroApplication (line 15) | @SpringBootApplication
    method main (line 19) | public static void main(String[] args) {

FILE: demo-rbac-shiro/src/main/java/com/xkcoding/rbac/shiro/common/IResultCode.java
  type IResultCode (line 11) | public interface IResultCode {
    method getCode (line 17) | Integer getCode();
    method getMessage (line 24) | String getMessage();

FILE: demo-rbac-shiro/src/main/java/com/xkcoding/rbac/shiro/common/R.java
  class R (line 14) | @Data
    method R (line 37) | public R(Integer code, String message, boolean status, T data) {
    method R (line 44) | public R(IResultCode resultCode, boolean status, T data) {
    method R (line 51) | public R(IResultCode resultCode, boolean status) {
    method success (line 58) | public static <T> R success() {
    method message (line 62) | public static <T> R message(String message) {
    method success (line 66) | public static <T> R success(T data) {
    method fail (line 70) | public static <T> R fail() {
    method fail (line 74) | public static <T> R fail(IResultCode resultCode) {
    method fail (line 78) | public static <T> R fail(Integer code, String message) {
    method fail (line 82) | public static <T> R fail(IResultCode resultCode, T data) {
    method fail (line 86) | public static <T> R fail(Integer code, String message, T data) {

FILE: demo-rbac-shiro/src/main/java/com/xkcoding/rbac/shiro/common/ResultCode.java
  type ResultCode (line 13) | @Getter
    method ResultCode (line 34) | ResultCode(Integer code, String message) {

FILE: demo-rbac-shiro/src/main/java/com/xkcoding/rbac/shiro/config/MybatisPlusConfig.java
  class MybatisPlusConfig (line 21) | @Configuration
    method paginationInterceptor (line 24) | @Bean
    method performanceInterceptor (line 39) | @Bean

FILE: demo-rbac-shiro/src/main/java/com/xkcoding/rbac/shiro/controller/TestController.java
  class TestController (line 16) | @RestController
    method test (line 20) | @GetMapping("")

FILE: demo-rbac-shiro/src/test/java/com/xkcoding/rbac/shiro/SpringBootDemoRbacShiroApplicationTests.java
  class SpringBootDemoRbacShiroApplicationTests (line 8) | @RunWith(SpringRunner.class)
    method contextLoads (line 12) | @Test

FILE: demo-session/src/main/java/com/xkcoding/session/SpringBootDemoSessionApplication.java
  class SpringBootDemoSessionApplication (line 14) | @SpringBootApplication
    method main (line 17) | public static void main(String[] args) {

FILE: demo-session/src/main/java/com/xkcoding/session/config/WebMvcConfig.java
  class WebMvcConfig (line 18) | @Configuration
    method addInterceptors (line 23) | @Override

FILE: demo-session/src/main/java/com/xkcoding/session/constants/Consts.java
  type Consts (line 11) | public interface Consts {

FILE: demo-session/src/main/java/com/xkcoding/session/controller/PageController.java
  class PageController (line 22) | @Controller
    method index (line 30) | @GetMapping("/index")
    method login (line 45) | @GetMapping("/login")
    method doLogin (line 56) | @GetMapping("/doLogin")

FILE: demo-session/src/main/java/com/xkcoding/session/interceptor/SessionInterceptor.java
  class SessionInterceptor (line 19) | @Component
    method preHandle (line 21) | @Override

FILE: demo-session/src/test/java/com/xkcoding/session/SpringBootDemoSessionApplicationTests.java
  class SpringBootDemoSessionApplicationTests (line 8) | @RunWith(SpringRunner.class)
    method contextLoads (line 12) | @Test

FILE: demo-sharding-jdbc/sql/schema.sql
  type `t_order_0` (line 3) | CREATE TABLE `t_order_0`
  type `t_order_1` (line 14) | CREATE TABLE `t_order_1`
  type `t_order_2` (line 25) | CREATE TABLE `t_order_2`
  type `t_order_0` (line 38) | CREATE TABLE `t_order_0`
  type `t_order_1` (line 49) | CREATE TABLE `t_order_1`
  type `t_order_2` (line 60) | CREATE TABLE `t_order_2`

FILE: demo-sharding-jdbc/src/main/java/com/xkcoding/sharding/jdbc/SpringBootDemoShardingJdbcApplication.java
  class SpringBootDemoShardingJdbcApplication (line 16) | @SpringBootApplication
    method main (line 21) | public static void main(String[] args) {

FILE: demo-sharding-jdbc/src/main/java/com/xkcoding/sharding/jdbc/config/CustomSnowflakeKeyGenerator.java
  class CustomSnowflakeKeyGenerator (line 14) | public class CustomSnowflakeKeyGenerator implements KeyGenerator {
    method CustomSnowflakeKeyGenerator (line 17) | public CustomSnowflakeKeyGenerator(Snowflake snowflake) {
    method generateKey (line 21) | @Override

FILE: demo-sharding-jdbc/src/main/java/com/xkcoding/sharding/jdbc/config/DataSourceShardingConfig.java
  class DataSourceShardingConfig (line 33) | @Configuration
    method transactionManager (line 40) | @Bean
    method dataSource (line 45) | @Bean(name = "dataSource")
    method orderTableRule (line 64) | private TableRuleConfiguration orderTableRule() {
    method dataSourceMap (line 76) | private Map<String, DataSource> dataSourceMap() {
    method customKeyGenerator (line 101) | private KeyGenerator customKeyGenerator() {

FILE: demo-sharding-jdbc/src/main/java/com/xkcoding/sharding/jdbc/mapper/OrderMapper.java
  type OrderMapper (line 15) | @Component

FILE: demo-sharding-jdbc/src/main/java/com/xkcoding/sharding/jdbc/model/Order.java
  class Order (line 17) | @Data

FILE: demo-sharding-jdbc/src/test/java/com/xkcoding/sharding/jdbc/SpringBootDemoShardingJdbcApplicationTests.java
  class SpringBootDemoShardingJdbcApplicationTests (line 26) | @Slf4j
    method testInsert (line 36) | @Test
    method testUpdate (line 49) | @Test
    method testDelete (line 59) | @Test
    method testSelect (line 67) | @Test

FILE: demo-social/src/main/java/com/xkcoding/social/SpringBootDemoSocialApplication.java
  class SpringBootDemoSocialApplication (line 14) | @SpringBootApplication
    method main (line 17) | public static void main(String[] args) {

FILE: demo-social/src/main/java/com/xkcoding/social/controller/OauthController.java
  class OauthController (line 33) | @Slf4j
    method loginType (line 43) | @GetMapping
    method renderAuth (line 56) | @RequestMapping("/login/{oauthType}")
    method login (line 69) | @RequestMapping("/{oauthType}/callback")
    method getAuthSource (line 77) | private AuthSource getAuthSource(String type) {

FILE: demo-social/src/test/java/com/xkcoding/social/SpringBootDemoSocialApplicationTests.java
  class SpringBootDemoSocialApplicationTests (line 8) | @RunWith(SpringRunner.class)
    method contextLoads (line 12) | @Test

FILE: demo-swagger-beauty/src/main/java/com/xkcoding/swagger/beauty/SpringBootDemoSwaggerBeautyApplication.java
  class SpringBootDemoSwaggerBeautyApplication (line 14) | @SpringBootApplication
    method main (line 17) | public static void main(String[] args) {

FILE: demo-swagger-beauty/src/main/java/com/xkcoding/swagger/beauty/common/ApiResponse.java
  class ApiResponse (line 20) | @Data

FILE: demo-swagger-beauty/src/main/java/com/xkcoding/swagger/beauty/controller/UserController.java
  class UserController (line 25) | @RestController
    method getByUserName (line 30) | @GetMapping
    method get (line 38) | @GetMapping("/{id}")
    method delete (line 46) | @DeleteMapping("/{id}")
    method post (line 53) | @PostMapping
    method multipar (line 60) | @PostMapping("/multipar")
    method array (line 68) | @PostMapping("/array")
    method put (line 75) | @PutMapping("/{id}")
    method file (line 81) | @PostMapping("/{id}/file")

FILE: demo-swagger-beauty/src/main/java/com/xkcoding/swagger/beauty/entity/User.java
  class User (line 19) | @Data

FILE: demo-swagger-beauty/src/test/java/com/xkcoding/swagger/beauty/SpringBootDemoSwaggerBeautyApplicationTests.java
  class SpringBootDemoSwaggerBeautyApplicationTests (line 8) | @RunWith(SpringRunner.class)
    method contextLoads (line 12) | @Test

FILE: demo-swagger/src/main/java/com/xkcoding/swagger/SpringBootDemoSwaggerApplication.java
  class SpringBootDemoSwaggerApplication (line 14) | @SpringBootApplication
    method main (line 17) | public static void main(String[] args) {

FILE: demo-swagger/src/main/java/com/xkcoding/swagger/common/ApiResponse.java
  class ApiResponse (line 20) | @Data

FILE: demo-swagger/src/main/java/com/xkcoding/swagger/common/DataType.java
  class DataType (line 11) | public final class DataType {

FILE: demo-swagger/src/main/java/com/xkcoding/swagger/common/ParamType.java
  class ParamType (line 11) | public final class ParamType {

FILE: demo-swagger/src/main/java/com/xkcoding/swagger/config/Swagger2Config.java
  class Swagger2Config (line 22) | @Configuration
    method createRestApi (line 26) | @Bean
    method apiInfo (line 31) | private ApiInfo apiInfo() {

FILE: demo-swagger/src/main/java/com/xkcoding/swagger/controller/UserController.java
  class UserController (line 25) | @RestController
    method getByUserName (line 30) | @GetMapping
    method get (line 38) | @GetMapping("/{id}")
    method delete (line 46) | @DeleteMapping("/{id}")
    method post (line 53) | @PostMapping
    method multipar (line 60) | @PostMapping("/multipar")
    method array (line 68) | @PostMapping("/array")
    method put (line 75) | @PutMapping("/{id}")
    method file (line 81) | @PostMapping("/{id}/file")

FILE: demo-swagger/src/main/java/com/xkcoding/swagger/entity/User.java
  class User (line 19) | @Data

FILE: demo-swagger/src/test/java/com/xkcoding/swagger/SpringBootDemoSwaggerApplicationTests.java
  class SpringBootDemoSwaggerApplicationTests (line 8) | @RunWith(SpringRunner.class)
    method contextLoads (line 12) | @Test

FILE: demo-task-quartz/init/dbTables/tables_cloudscape.sql
  type qrtz_job_details (line 11) | create table qrtz_job_details (
  type qrtz_triggers (line 25) | create table qrtz_triggers(
  type qrtz_simple_triggers (line 46) | create table qrtz_simple_triggers(
  type qrtz_cron_triggers (line 57) | create table qrtz_cron_triggers(
  type qrtz_simprop_triggers (line 67) | CREATE TABLE qrtz_simprop_triggers
  type qrtz_blob_triggers (line 88) | create table qrtz_blob_triggers(
  type qrtz_calendars (line 97) | create table qrtz_calendars(
  type qrtz_paused_trigger_grps (line 104) | create table qrtz_paused_trigger_grps
  type qrtz_fired_triggers (line 111) | create table qrtz_fired_triggers(
  type qrtz_scheduler_state (line 128) | create table qrtz_scheduler_state
  type qrtz_locks (line 137) | create table qrtz_locks

FILE: demo-task-quartz/init/dbTables/tables_cubrid.sql
  type QRTZ_JOB_DETAILS (line 22) | CREATE TABLE QRTZ_JOB_DETAILS
  type QRTZ_TRIGGERS (line 37) | CREATE TABLE QRTZ_TRIGGERS
  type QRTZ_SIMPLE_TRIGGERS (line 60) | CREATE TABLE QRTZ_SIMPLE_TRIGGERS
  type QRTZ_CRON_TRIGGERS (line 73) | CREATE TABLE QRTZ_CRON_TRIGGERS
  type QRTZ_SIMPROP_TRIGGERS (line 85) | CREATE TABLE QRTZ_SIMPROP_TRIGGERS
  type QRTZ_BLOB_TRIGGERS (line 106) | CREATE TABLE QRTZ_BLOB_TRIGGERS
  type QRTZ_CALENDARS (line 117) | CREATE TABLE QRTZ_CALENDARS
  type QRTZ_PAUSED_TRIGGER_GRPS (line 125) | CREATE TABLE QRTZ_PAUSED_TRIGGER_GRPS
  type QRTZ_FIRED_TRIGGERS (line 132) | CREATE TABLE QRTZ_FIRED_TRIGGERS
  type QRTZ_SCHEDULER_STATE (line 150) | CREATE TABLE QRTZ_SCHEDULER_STATE
  type QRTZ_LOCKS (line 159) | CREATE TABLE QRTZ_LOCKS
  type IDX_QRTZ_J_REQ_RECOVERY (line 167) | CREATE INDEX IDX_QRTZ_J_REQ_RECOVERY ON QRTZ_JOB_DETAILS(SCHED_NAME,REQU...
  type IDX_QRTZ_J_GRP (line 168) | CREATE INDEX IDX_QRTZ_J_GRP ON QRTZ_JOB_DETAILS(SCHED_NAME,JOB_GROUP)
  type IDX_QRTZ_T_JG (line 171) | CREATE INDEX IDX_QRTZ_T_JG ON QRTZ_TRIGGERS(SCHED_NAME,JOB_GROUP)
  type IDX_QRTZ_T_C (line 172) | CREATE INDEX IDX_QRTZ_T_C ON QRTZ_TRIGGERS(SCHED_NAME,CALENDAR_NAME)
  type IDX_QRTZ_T_G (line 173) | CREATE INDEX IDX_QRTZ_T_G ON QRTZ_TRIGGERS(SCHED_NAME,TRIGGER_GROUP)
  type IDX_QRTZ_T_STATE (line 174) | CREATE INDEX IDX_QRTZ_T_STATE ON QRTZ_TRIGGERS(SCHED_NAME,TRIGGER_STATE)
  type IDX_QRTZ_T_N_STATE (line 175) | CREATE INDEX IDX_QRTZ_T_N_STATE ON QRTZ_TRIGGERS(SCHED_NAME,TRIGGER_NAME...
  type IDX_QRTZ_T_N_G_STATE (line 176) | CREATE INDEX IDX_QRTZ_T_N_G_STATE ON QRTZ_TRIGGERS(SCHED_NAME,TRIGGER_GR...
  type IDX_QRTZ_T_NEXT_FIRE_TIME (line 177) | CREATE INDEX IDX_QRTZ_T_NEXT_FIRE_TIME ON QRTZ_TRIGGERS(SCHED_NAME,NEXT_...
  type IDX_QRTZ_T_NFT_ST (line 178) | CREATE INDEX IDX_QRTZ_T_NFT_ST ON QRTZ_TRIGGERS(SCHED_NAME,TRIGGER_STATE...
  type IDX_QRTZ_T_NFT_MISFIRE (line 179) | CREATE INDEX IDX_QRTZ_T_NFT_MISFIRE ON QRTZ_TRIGGERS(SCHED_NAME,MISFIRE_...
  type IDX_QRTZ_T_NFT_ST_MISFIRE (line 180) | CREATE INDEX IDX_QRTZ_T_NFT_ST_MISFIRE ON QRTZ_TRIGGERS(SCHED_NAME,MISFI...
  type IDX_QRTZ_T_NFT_ST_MISFIRE_GRP (line 181) | CREATE INDEX IDX_QRTZ_T_NFT_ST_MISFIRE_GRP ON QRTZ_TRIGGERS(SCHED_NAME,M...
  type IDX_QRTZ_FT_TRIG_INST_NAME (line 183) | CREATE INDEX IDX_QRTZ_FT_TRIG_INST_NAME ON QRTZ_FIRED_TRIGGERS(SCHED_NAM...
  type IDX_QRTZ_FT_INST_JOB_REQ_RCVRY (line 184) | CREATE INDEX IDX_QRTZ_FT_INST_JOB_REQ_RCVRY ON QRTZ_FIRED_TRIGGERS(SCHED...
  type IDX_QRTZ_FT_J_G (line 185) | CREATE INDEX IDX_QRTZ_FT_J_G ON QRTZ_FIRED_TRIGGERS(SCHED_NAME,JOB_NAME,...
  type IDX_QRTZ_FT_JG (line 186) | CREATE INDEX IDX_QRTZ_FT_JG ON QRTZ_FIRED_TRIGGERS(SCHED_NAME,JOB_GROUP)
  type IDX_QRTZ_FT_T_G (line 187) | CREATE INDEX IDX_QRTZ_FT_T_G ON QRTZ_FIRED_TRIGGERS(SCHED_NAME,TRIGGER_N...
  type IDX_QRTZ_FT_TG (line 188) | CREATE INDEX IDX_QRTZ_FT_TG ON QRTZ_FIRED_TRIGGERS(SCHED_NAME,TRIGGER_GR...

FILE: demo-task-quartz/init/dbTables/tables_db2_v72.sql
  type qrtz_job_details (line 33) | create table qrtz_job_details (
  type qrtz_triggers (line 47) | create table qrtz_triggers(
  type qrtz_simple_triggers (line 68) | create table qrtz_simple_triggers(
  type qrtz_cron_triggers (line 79) | create table qrtz_cron_triggers(
  type qrtz_simprop_triggers (line 89) | CREATE TABLE qrtz_simprop_triggers
  type qrtz_blob_triggers (line 110) | create table qrtz_blob_triggers(
  type qrtz_calendars (line 119) | create table qrtz_calendars(
  type qrtz_fired_triggers (line 126) | create table qrtz_fired_triggers(
  type qrtz_paused_trigger_grps (line 144) | create table qrtz_paused_trigger_grps(
  type qrtz_scheduler_state (line 150) | create table qrtz_scheduler_state (
  type qrtz_locks (line 158) | create table qrtz_locks

FILE: demo-task-quartz/init/dbTables/tables_db2_v8.sql
  type qrtz_job_details (line 23) | create table qrtz_job_details(
  type qrtz_triggers (line 37) | create table qrtz_triggers(
  type qrtz_simple_triggers (line 58) | create table qrtz_simple_triggers(
  type qrtz_cron_triggers (line 69) | create table qrtz_cron_triggers(
  type qrtz_simprop_triggers (line 79) | CREATE TABLE qrtz_simprop_triggers
  type qrtz_blob_triggers (line 100) | create table qrtz_blob_triggers(
  type qrtz_calendars (line 109) | create table qrtz_calendars(
  type qrtz_fired_triggers (line 116) | create table qrtz_fired_triggers(
  type qrtz_paused_trigger_grps (line 133) | create table qrtz_paused_trigger_grps(
  type qrtz_scheduler_state (line 139) | create table qrtz_scheduler_state(
  type qrtz_locks (line 147) | create table qrtz_locks(

FILE: demo-task-quartz/init/dbTables/tables_db2_v95.sql
  type qrtz_job_details (line 13) | create table qrtz_job_details(
  type qrtz_triggers (line 27) | create table qrtz_triggers(
  type qrtz_simple_triggers (line 48) | create table qrtz_simple_triggers(
  type qrtz_cron_triggers (line 59) | create table qrtz_cron_triggers(
  type qrtz_simprop_triggers (line 69) | CREATE TABLE qrtz_simprop_triggers
  type qrtz_blob_triggers (line 90) | create table qrtz_blob_triggers(
  type qrtz_calendars (line 99) | create table qrtz_calendars(
  type qrtz_fired_triggers (line 106) | create table qrtz_fired_triggers(
  type qrtz_paused_trigger_grps (line 123) | create table qrtz_paused_trigger_grps(
  type qrtz_scheduler_state (line 129) | create table qrtz_scheduler_state(
  type qrtz_locks (line 137) | create table qrtz_locks(

FILE: demo-task-quartz/init/dbTables/tables_derby.sql
  type qrtz_job_details (line 42) | create table qrtz_job_details (
  type qrtz_triggers (line 56) | create table qrtz_triggers(
  type qrtz_simple_triggers (line 77) | create table qrtz_simple_triggers(
  type qrtz_cron_triggers (line 88) | create table qrtz_cron_triggers(
  type qrtz_simprop_triggers (line 98) | create table qrtz_simprop_triggers
  type qrtz_blob_triggers (line 119) | create table qrtz_blob_triggers(
  type qrtz_calendars (line 128) | create table qrtz_calendars(
  type qrtz_paused_trigger_grps (line 135) | create table qrtz_paused_trigger_grps
  type qrtz_fired_triggers (line 142) | create table qrtz_fired_triggers(
  type qrtz_scheduler_state (line 159) | create table qrtz_scheduler_state
  type qrtz_locks (line 168) | create table qrtz_locks

FILE: demo-task-quartz/init/dbTables/tables_derby_previous.sql
  type qrtz_job_details (line 11) | create table qrtz_job_details (
  type qrtz_triggers (line 25) | create table qrtz_triggers (
  type qrtz_simple_triggers (line 46) | create table qrtz_simple_triggers (
  type qrtz_cron_triggers (line 57) | create table qrtz_cron_triggers (
  type qrtz_simprop_triggers (line 67) | create table qrtz_simprop_triggers
  type qrtz_blob_triggers (line 88) | create table qrtz_blob_triggers (
  type qrtz_calendars (line 97) | create table qrtz_calendars (
  type qrtz_paused_trigger_grps (line 104) | create table qrtz_paused_trigger_grps (
  type qrtz_fired_triggers (line 110) | create table qrtz_fired_triggers (
  type qrtz_scheduler_state (line 127) | create table qrtz_scheduler_state (
  type qrtz_locks (line 135) | create table qrtz_locks (

FILE: demo-task-quartz/init/dbTables/tables_firebird.sql
  type QRTZ_JOB_DETAILS (line 20) | CREATE TABLE QRTZ_JOB_DETAILS (
  type QRTZ_TRIGGERS (line 34) | CREATE TABLE QRTZ_TRIGGERS (
  type QRTZ_SIMPLE_TRIGGERS (line 56) | CREATE TABLE QRTZ_SIMPLE_TRIGGERS (
  type QRTZ_SIMPROP_TRIGGERS (line 68) | CREATE TABLE QRTZ_SIMPROP_TRIGGERS
  type QRTZ_CRON_TRIGGERS (line 89) | CREATE TABLE QRTZ_CRON_TRIGGERS (
  type QRTZ_BLOB_TRIGGERS (line 100) | CREATE TABLE QRTZ_BLOB_TRIGGERS (
  type QRTZ_CALENDARS (line 110) | CREATE TABLE QRTZ_CALENDARS (
  type QRTZ_PAUSED_TRIGGER_GRPS (line 117) | CREATE TABLE QRTZ_PAUSED_TRIGGER_GRPS (
  type QRTZ_FIRED_TRIGGERS (line 123) | CREATE TABLE QRTZ_FIRED_TRIGGERS (
  type QRTZ_SCHEDULER_STATE (line 140) | CREATE TABLE QRTZ_SCHEDULER_STATE (
  type QRTZ_LOCKS (line 148) | CREATE TABLE QRTZ_LOCKS (

FILE: demo-task-quartz/init/dbTables/tables_h2.sql
  type QRTZ_CALENDARS (line 11) | CREATE TABLE QRTZ_CALENDARS (
  type QRTZ_CRON_TRIGGERS (line 17) | CREATE TABLE QRTZ_CRON_TRIGGERS (
  type QRTZ_FIRED_TRIGGERS (line 25) | CREATE TABLE QRTZ_FIRED_TRIGGERS (
  type QRTZ_PAUSED_TRIGGER_GRPS (line 41) | CREATE TABLE QRTZ_PAUSED_TRIGGER_GRPS (
  type QRTZ_SCHEDULER_STATE (line 46) | CREATE TABLE QRTZ_SCHEDULER_STATE (
  type QRTZ_LOCKS (line 53) | CREATE TABLE QRTZ_LOCKS (
  type QRTZ_JOB_DETAILS (line 58) | CREATE TABLE QRTZ_JOB_DETAILS (
  type QRTZ_SIMPLE_TRIGGERS (line 71) | CREATE TABLE QRTZ_SIMPLE_TRIGGERS (
  type qrtz_simprop_triggers (line 80) | CREATE TABLE qrtz_simprop_triggers
  type QRTZ_BLOB_TRIGGERS (line 98) | CREATE TABLE QRTZ_BLOB_TRIGGERS (
  type QRTZ_TRIGGERS (line 105) | CREATE TABLE QRTZ_TRIGGERS (

FILE: demo-task-quartz/init/dbTables/tables_hsqldb.sql
  type qrtz_job_details (line 18) | CREATE TABLE qrtz_job_details
  type qrtz_triggers (line 33) | CREATE TABLE qrtz_triggers
  type qrtz_simple_triggers (line 56) | CREATE TABLE qrtz_simple_triggers
  type qrtz_cron_triggers (line 69) | CREATE TABLE qrtz_cron_triggers
  type qrtz_simprop_triggers (line 81) | CREATE TABLE qrtz_simprop_triggers
  type qrtz_blob_triggers (line 102) | CREATE TABLE qrtz_blob_triggers
  type qrtz_calendars (line 113) | CREATE TABLE qrtz_calendars
  type qrtz_paused_trigger_grps (line 121) | CREATE TABLE qrtz_paused_trigger_grps
  type qrtz_fired_triggers (line 128) | CREATE TABLE qrtz_fired_triggers
  type qrtz_scheduler_state (line 146) | CREATE TABLE qrtz_scheduler_state
  type qrtz_locks (line 155) | CREATE TABLE qrtz_locks

FILE: demo-task-quartz/init/dbTables/tables_hsqldb_old.sql
  type qrtz_job_details (line 12) | CREATE TABLE qrtz_job_details
  type qrtz_triggers (line 27) | CREATE TABLE qrtz_triggers
  type qrtz_simple_triggers (line 50) | CREATE TABLE qrtz_simple_triggers
  type qrtz_cron_triggers (line 63) | CREATE TABLE qrtz_cron_triggers
  type qrtz_simprop_triggers (line 75) | CREATE TABLE qrtz_simprop_triggers
  type qrtz_blob_triggers (line 96) | CREATE TABLE qrtz_blob_triggers
  type qrtz_calendars (line 107) | CREATE TABLE qrtz_calendars
  type qrtz_paused_trigger_grps (line 115) | CREATE TABLE qrtz_paused_trigger_grps
  type qrtz_fired_triggers (line 122) | CREATE TABLE qrtz_fired_triggers
  type qrtz_scheduler_state (line 140) | CREATE TABLE qrtz_scheduler_state
  type qrtz_locks (line 149) | CREATE TABLE qrtz_locks

FILE: demo-task-quartz/init/dbTables/tables_informix.sql
  type qblob_triggers (line 8) | CREATE TABLE qblob_triggers (
  type qcalendars (line 19) | CREATE TABLE qcalendars (
  type qcron_triggers (line 29) | CREATE TABLE qcron_triggers (
  type qfired_triggers (line 41) | CREATE TABLE qfired_triggers (
  type qpaused_trigger_grps (line 61) | CREATE TABLE qpaused_trigger_grps (
  type qscheduler_state (line 70) | CREATE TABLE qscheduler_state (
  type qlocks (line 81) | CREATE TABLE qlocks (
  type qjob_details (line 90) | CREATE TABLE qjob_details (
  type qsimple_triggers (line 107) | CREATE TABLE qsimple_triggers (
  type qsimprop_triggers (line 120) | CREATE TABLE qsimprop_triggers
  type qtriggers (line 142) | CREATE TABLE qtriggers (

FILE: demo-task-quartz/init/dbTables/tables_oracle.sql
  type qrtz_job_details (line 36) | CREATE TABLE qrtz_job_details
  type qrtz_triggers (line 50) | CREATE TABLE qrtz_triggers
  type qrtz_simple_triggers (line 72) | CREATE TABLE qrtz_simple_triggers
  type qrtz_cron_triggers (line 84) | CREATE TABLE qrtz_cron_triggers
  type qrtz_simprop_triggers (line 95) | CREATE TABLE qrtz_simprop_triggers
  type qrtz_blob_triggers (line 115) | CREATE TABLE qrtz_blob_triggers
  type qrtz_calendars (line 125) | CREATE TABLE qrtz_calendars
  type qrtz_paused_trigger_grps (line 132) | CREATE TABLE qrtz_paused_trigger_grps
  type qrtz_fired_triggers (line 138) | CREATE TABLE qrtz_fired_triggers
  type qrtz_scheduler_state (line 155) | CREATE TABLE qrtz_scheduler_state
  type qrtz_locks (line 163) | CREATE TABLE qrtz_locks
  type idx_qrtz_j_req_recovery (line 170) | create index idx_qrtz_j_req_recovery on qrtz_job_details(SCHED_NAME,REQU...
  type idx_qrtz_j_grp (line 171) | create index idx_qrtz_j_grp on qrtz_job_details(SCHED_NAME,JOB_GROUP)
  type idx_qrtz_t_j (line 173) | create index idx_qrtz_t_j on qrtz_triggers(SCHED_NAME,JOB_NAME,JOB_GROUP)
  type idx_qrtz_t_jg (line 174) | create index idx_qrtz_t_jg on qrtz_triggers(SCHED_NAME,JOB_GROUP)
  type idx_qrtz_t_c (line 175) | create index idx_qrtz_t_c on qrtz_triggers(SCHED_NAME,CALENDAR_NAME)
  type idx_qrtz_t_g (line 176) | create index idx_qrtz_t_g on qrtz_triggers(SCHED_NAME,TRIGGER_GROUP)
  type idx_qrtz_t_state (line 177) | create index idx_qrtz_t_state on qrtz_triggers(SCHED_NAME,TRIGGER_STATE)
  type idx_qrtz_t_n_state (line 178) | create index idx_qrtz_t_n_state on qrtz_triggers(SCHED_NAME,TRIGGER_NAME...
  type idx_qrtz_t_n_g_state (line 179) | create index idx_qrtz_t_n_g_state on qrtz_triggers(SCHED_NAME,TRIGGER_GR...
  type idx_qrtz_t_next_fire_time (line 180) | create index idx_qrtz_t_next_fire_time on qrtz_triggers(SCHED_NAME,NEXT_...
  type idx_qrtz_t_nft_st (line 181) | create index idx_qrtz_t_nft_st on qrtz_triggers(SCHED_NAME,TRIGGER_STATE...
  type idx_qrtz_t_nft_misfire (line 182) | create index idx_qrtz_t_nft_misfire on qrtz_triggers(SCHED_NAME,MISFIRE_...
  type idx_qrtz_t_nft_st_misfire (line 183) | create index idx_qrtz_t_nft_st_misfire on qrtz_triggers(SCHED_NAME,MISFI...
  type idx_qrtz_t_nft_st_misfire_grp (line 184) | create index idx_qrtz_t_nft_st_misfire_grp on qrtz_triggers(SCHED_NAME,M...
  type idx_qrtz_ft_trig_inst_name (line 186) | create index idx_qrtz_ft_trig_inst_name on qrtz_fired_triggers(SCHED_NAM...
  type idx_qrtz_ft_inst_job_req_rcvry (line 187) | create index idx_qrtz_ft_inst_job_req_rcvry on qrtz_fired_triggers(SCHED...
  type idx_qrtz_ft_j_g (line 188) | create index idx_qrtz_ft_j_g on qrtz_fired_triggers(SCHED_NAME,JOB_NAME,...
  type idx_qrtz_ft_jg (line 189) | create index idx_qrtz_ft_jg on qrtz_fired_triggers(SCHED_NAME,JOB_GROUP)
  type idx_qrtz_ft_t_g (line 190) | create index idx_qrtz_ft_t_g on qrtz_fired_triggers(SCHED_NAME,TRIGGER_N...
  type idx_qrtz_ft_tg (line 191) | create index idx_qrtz_ft_tg on qrtz_fired_triggers(SCHED_NAME,TRIGGER_GR...

FILE: demo-task-quartz/init/dbTables/tables_pointbase.sql
  type qrtz_job_details (line 35) | CREATE TABLE qrtz_job_details
  type qrtz_triggers (line 50) | CREATE TABLE qrtz_triggers
  type qrtz_simple_triggers (line 73) | CREATE TABLE qrtz_simple_triggers
  type qrtz_simprop_triggers (line 87) | CREATE TABLE qrtz_simprop_triggers
  type qrtz_cron_triggers (line 108) | CREATE TABLE qrtz_cron_triggers
  type qrtz_blob_triggers (line 120) | CREATE TABLE qrtz_blob_triggers
  type qrtz_calendars (line 131) | CREATE TABLE qrtz_calendars
  type qrtz_paused_trigger_grps (line 139) | CREATE TABLE qrtz_paused_trigger_grps
  type qrtz_fired_triggers (line 146) | CREATE TABLE qrtz_fired_triggers
  type qrtz_scheduler_state (line 164) | CREATE TABLE qrtz_scheduler_state
  type qrtz_locks (line 173) | CREATE TABLE qrtz_locks

FILE: demo-task-quartz/init/dbTables/tables_postgres.sql
  type qrtz_job_details (line 18) | CREATE TABLE qrtz_job_details
  type qrtz_triggers (line 33) | CREATE TABLE qrtz_triggers
  type qrtz_simple_triggers (line 56) | CREATE TABLE qrtz_simple_triggers
  type qrtz_cron_triggers (line 69) | CREATE TABLE qrtz_cron_triggers
  type qrtz_simprop_triggers (line 81) | CREATE TABLE qrtz_simprop_triggers
  type qrtz_blob_triggers (line 102) | CREATE TABLE qrtz_blob_triggers
  type qrtz_calendars (line 113) | CREATE TABLE qrtz_calendars
  type qrtz_paused_trigger_grps (line 122) | CREATE TABLE qrtz_paused_trigger_grps
  type qrtz_fired_triggers (line 129) | CREATE TABLE qrtz_fired_triggers
  type qrtz_scheduler_state (line 147) | CREATE TABLE qrtz_scheduler_state
  type qrtz_locks (line 156) | CREATE TABLE qrtz_locks
  type idx_qrtz_j_req_recovery (line 163) | create index idx_qrtz_j_req_recovery on qrtz_job_details(SCHED_NAME,REQU...
  type idx_qrtz_j_grp (line 164) | create index idx_qrtz_j_grp on qrtz_job_details(SCHED_NAME,JOB_GROUP)
  type idx_qrtz_t_j (line 166) | create index idx_qrtz_t_j on qrtz_triggers(SCHED_NAME,JOB_NAME,JOB_GROUP)
  type idx_qrtz_t_jg (line 167) | create index idx_qrtz_t_jg on qrtz_triggers(SCHED_NAME,JOB_GROUP)
  type idx_qrtz_t_c (line 168) | create index idx_qrtz_t_c on qrtz_triggers(SCHED_NAME,CALENDAR_NAME)
  type idx_qrtz_t_g (line 169) | create index idx_qrtz_t_g on qrtz_triggers(SCHED_NAME,TRIGGER_GROUP)
  type idx_qrtz_t_state (line 170) | create index idx_qrtz_t_state on qrtz_triggers(SCHED_NAME,TRIGGER_STATE)
  type idx_qrtz_t_n_state (line 171) | create index idx_qrtz_t_n_state on qrtz_triggers(SCHED_NAME,TRIGGER_NAME...
  type idx_qrtz_t_n_g_state (line 172) | create index idx_qrtz_t_n_g_state on qrtz_triggers(SCHED_NAME,TRIGGER_GR...
  type idx_qrtz_t_next_fire_time (line 173) | create index idx_qrtz_t_next_fire_time on qrtz_triggers(SCHED_NAME,NEXT_...
  type idx_qrtz_t_nft_st (line 174) | create index idx_qrtz_t_nft_st on qrtz_triggers(SCHED_NAME,TRIGGER_STATE...
  type idx_qrtz_t_nft_misfire (line 175) | create index idx_qrtz_t_nft_misfire on qrtz_triggers(SCHED_NAME,MISFIRE_...
  type idx_qrtz_t_nft_st_misfire (line 176) | create index idx_qrtz_t_nft_st_misfire on qrtz_triggers(SCHED_NAME,MISFI...
  type idx_qrtz_t_nft_st_misfire_grp (line 177) | create index idx_qrtz_t_nft_st_misfire_grp on qrtz_triggers(SCHED_NAME,M...
  type idx_qrtz_ft_trig_inst_name (line 179) | create index idx_qrtz_ft_trig_inst_name on qrtz_fired_triggers(SCHED_NAM...
  type idx_qrtz_ft_inst_job_req_rcvry (line 180) | create index idx_qrtz_ft_inst_job_req_rcvry on qrtz_fired_triggers(SCHED...
  type idx_qrtz_ft_j_g (line 181) | create index idx_qrtz_ft_j_g on qrtz_fired_triggers(SCHED_NAME,JOB_NAME,...
  type idx_qrtz_ft_jg (line 182) | create index idx_qrtz_ft_jg on qrtz_fired_triggers(SCHED_NAME,JOB_GROUP)
  type idx_qrtz_ft_t_g (line 183) | create index idx_qrtz_ft_t_g on qrtz_fired_triggers(SCHED_NAME,TRIGGER_N...
  type idx_qrtz_ft_tg (line 184) | create index idx_qrtz_ft_tg on qrtz_fired_triggers(SCHED_NAME,TRIGGER_GR...

FILE: demo-task-quartz/init/dbTables/tables_solid.sql
  type qrtz_job_details (line 14) | create table qrtz_job_details (
  type qrtz_triggers (line 28) | create table qrtz_triggers(
  type qrtz_simple_triggers (line 49) | create table qrtz_simple_triggers(
  type qrtz_simprop_triggers (line 60) | CREATE TABLE qrtz_simprop_triggers
  type qrtz_cron_triggers (line 81) | create table qrtz_cron_triggers(
  type qrtz_blob_triggers (line 91) | create table qrtz_blob_triggers(
  type qrtz_calendars (line 100) | create table qrtz_calendars(
  type qrtz_paused_trigger_grps (line 107) | create table qrtz_paused_trigger_grps
  type qrtz_fired_triggers (line 114) | create table qrtz_fired_triggers(
  type qrtz_scheduler_state (line 131) | create table qrtz_scheduler_state
  type qrtz_locks (line 140) | create table qrtz_locks

FILE: demo-task-quartz/init/dbTables/tables_sqlServer.sql
  type dbo (line 90) | CREATE TABLE [dbo].[QRTZ_CALENDARS] (

FILE: demo-task-quartz/src/main/java/com/xkcoding/task/quartz/SpringBootDemoTaskQuartzApplication.java
  class SpringBootDemoTaskQuartzApplication (line 15) | @MapperScan(basePackages = {"com.xkcoding.task.quartz.mapper"})
    method main (line 19) | public static void main(String[] args) {

FILE: demo-task-quartz/src/main/java/com/xkcoding/task/quartz/common/ApiResponse.java
  class ApiResponse (line 16) | @Data
    method ApiResponse (line 28) | public ApiResponse() {
    method ApiResponse (line 31) | private ApiResponse(String message, Object data) {
    method of (line 43) | public static ApiResponse of(String message, Object data) {
    method ok (line 53) | public static ApiResponse ok(Object data) {
    method msg (line 63) | public static ApiResponse msg(String message) {

FILE: demo-task-quartz/src/main/java/com/xkcoding/task/quartz/controller/JobController.java
  class JobController (line 28) | @RestController
    method JobController (line 34) | @Autowired
    method addJob (line 42) | @PostMapping
    method deleteJob (line 56) | @DeleteMapping
    method pauseJob (line 69) | @PutMapping(params = "pause")
    method resumeJob (line 82) | @PutMapping(params = "resume")
    method cronJob (line 95) | @PutMapping(params = "cron")
    method jobList (line 106) | @GetMapping

FILE: demo-task-quartz/src/main/java/com/xkcoding/task/quartz/entity/domain/JobAndTrigger.java
  class JobAndTrigger (line 15) | @Data

FILE: demo-task-quartz/src/main/java/com/xkcoding/task/quartz/entity/form/JobForm.java
  class JobForm (line 16) | @Data

FILE: demo-task-quartz/src/main/java/com/xkcoding/task/quartz/job/HelloJob.java
  class HelloJob (line 16) | @Slf4j
    method execute (line 19) | @Override

FILE: demo-task-quartz/src/main/java/com/xkcoding/task/quartz/job/TestJob.java
  class TestJob (line 16) | @Slf4j
    method execute (line 19) | @Override

FILE: demo-task-quartz/src/main/java/com/xkcoding/task/quartz/job/base/BaseJob.java
  type BaseJob (line 13) | public interface BaseJob extends Job {
    method execute (line 33) | @Override

FILE: demo-task-quartz/src/main/java/com/xkcoding/task/quartz/mapper/JobMapper.java
  type JobMapper (line 16) | @Component
    method list (line 23) | List<JobAndTrigger> list();

FILE: demo-task-quartz/src/main/java/com/xkcoding/task/quartz/service/JobService.java
  type JobService (line 16) | public interface JobService {
    method addJob (line 23) | void addJob(JobForm form) throws Exception;
    method deleteJob (line 31) | void deleteJob(JobForm form) throws SchedulerException;
    method pauseJob (line 39) | void pauseJob(JobForm form) throws SchedulerException;
    method resumeJob (line 47) | void resumeJob(JobForm form) throws SchedulerException;
    method cronJob (line 55) | void cronJob(JobForm form) throws Exception;
    method list (line 64) | PageInfo<JobAndTrigger> list(Integer currentPage, Integer pageSize);

FILE: demo-task-quartz/src/main/java/com/xkcoding/task/quartz/service/impl/JobServiceImpl.java
  class JobServiceImpl (line 25) | @Service
    method JobServiceImpl (line 31) | @Autowired
    method addJob (line 44) | @Override
    method deleteJob (line 73) | @Override
    method pauseJob (line 86) | @Override
    method resumeJob (line 97) | @Override
    method cronJob (line 108) | @Override
    method list (line 135) | @Override

FILE: demo-task-quartz/src/main/java/com/xkcoding/task/quartz/util/JobUtil.java
  class JobUtil (line 13) | public class JobUtil {
    method getClass (line 21) | public static BaseJob getClass(String classname) throws Exception {

FILE: demo-task-quartz/src/test/java/com/xkcoding/task/quartz/SpringBootDemoTaskQuartzApplicationTests.java
  class SpringBootDemoTaskQuartzApplicationTests (line 8) | @RunWith(SpringRunner.class)
    method contextLoads (line 12) | @Test

FILE: demo-task-xxl-job/src/main/java/com/xkcoding/task/xxl/job/SpringBootDemoTaskXxlJobApplication.java
  class SpringBootDemoTaskXxlJobApplication (line 14) | @SpringBootApplication
    method main (line 17) | public static void main(String[] args) {

FILE: demo-task-xxl-job/src/main/java/com/xkcoding/task/xxl/job/config/XxlJobConfig.java
  class XxlJobConfig (line 20) | @Slf4j
    method xxlJobExecutor (line 27) | @Bean(initMethod = "start", destroyMethod = "destroy")

FILE: demo-task-xxl-job/src/main/java/com/xkcoding/task/xxl/job/config/props/XxlJobProps.java
  class XxlJobProps (line 14) | @Data
    class XxlJobAdminProps (line 32) | @Data
    class XxlJobExecutorProps (line 40) | @Data

FILE: demo-task-xxl-job/src/main/java/com/xkcoding/task/xxl/job/controller/ManualOperateController.java
  class ManualOperateController (line 26) | @Slf4j
    method xxlJobGroup (line 38) | @GetMapping("/group")
    method xxlJobList (line 52) | @GetMapping("/list")
    method xxlJobAdd (line 68) | @GetMapping("/add")
    method xxlJobTrigger (line 89) | @GetMapping("/trigger")
    method xxlJobRemove (line 103) | @GetMapping("/remove")
    method xxlJobStop (line 116) | @GetMapping("/stop")
    method xxlJobStart (line 129) | @GetMapping("/start")

FILE: demo-task-xxl-job/src/main/java/com/xkcoding/task/xxl/job/task/DemoTask.java
  class DemoTask (line 20) | @Slf4j
    method execute (line 32) | @Override

FILE: demo-task/src/main/java/com/xkcoding/task/SpringBootDemoTaskApplication.java
  class SpringBootDemoTaskApplication (line 14) | @SpringBootApplication
    method main (line 17) | public static void main(String[] args) {

FILE: demo-task/src/main/java/com/xkcoding/task/config/TaskConfig.java
  class TaskConfig (line 22) | @Configuration
    method configureTasks (line 26) | @Override
    method taskExecutor (line 37) | @Bean

FILE: demo-task/src/main/java/com/xkcoding/task/job/TaskJob.java
  class TaskJob (line 18) | @Component
    method job1 (line 25) | @Scheduled(cron = "0/10 * * * * ?")
    method job2 (line 34) | @Scheduled(fixedRate = 2000)
    method job3 (line 43) | @Scheduled(fixedDelay = 4000, initialDelay = 5000)

FILE: demo-task/src/test/java/com/xkcoding/task/SpringBootDemoTaskApplicationTests.java
  class SpringBootDemoTaskApplicationTests (line 8) | @RunWith(SpringRunner.class)
    method contextLoads (line 12) | @Test

FILE: demo-template-beetl/src/main/java/com/xkcoding/template/beetl/SpringBootDemoTemplateBeetlApplication.java
  class SpringBootDemoTemplateBeetlApplication (line 14) | @SpringBootApplication
    method main (line 17) | public static void main(String[] args) {

FILE: demo-template-beetl/src/main/java/com/xkcoding/template/beetl/controller/IndexController.java
  class IndexController (line 20) | @Controller
    method index (line 24) | @GetMapping(value = {"", "/"})

FILE: demo-template-beetl/src/main/java/com/xkcoding/template/beetl/controller/UserController.java
  class UserController (line 21) | @Controller
    method login (line 25) | @PostMapping("/login")
    method login (line 36) | @GetMapping("/login")

FILE: demo-template-beetl/src/main/java/com/xkcoding/template/beetl/model/User.java
  class User (line 13) | @Data

FILE: demo-template-beetl/src/test/java/com/xkcoding/template/beetl/SpringBootDemoTemplateBeetlApplicationTests.java
  class SpringBootDemoTemplateBeetlApplicationTests (line 8) | @RunWith(SpringRunner.class)
    method contextLoads (line 12) | @Test

FILE: demo-template-enjoy/src/main/java/com/xkcoding/template/enjoy/SpringBootDemoTemplateEnjoyApplication.java
  class SpringBootDemoTemplateEnjoyApplication (line 14) | @SpringBootApplication
    method main (line 17) | public static void main(String[] args) {

FILE: demo-template-enjoy/src/main/java/com/xkcoding/template/enjoy/config/EnjoyConfig.java
  class EnjoyConfig (line 16) | @Configuration
    method getJFinalViewResolver (line 18) | @Bean(name = "jfinalViewResolver")

FILE: demo-template-enjoy/src/main/java/com/xkcoding/template/enjoy/controller/IndexController.java
  class IndexController (line 20) | @Controller
    method index (line 24) | @GetMapping(value = {"", "/"})

FILE: demo-template-enjoy/src/main/java/com/xkcoding/template/enjoy/controller/UserController.java
  class UserController (line 21) | @Controller
    method login (line 25) | @PostMapping("/login")
    method login (line 36) | @GetMapping("/login")

FILE: demo-template-enjoy/src/main/java/com/xkcoding/template/enjoy/model/User.java
  class User (line 13) | @Data

FILE: demo-template-enjoy/src/test/java/com/xkcoding/template/enjoy/SpringBootDemoTemplateEnjoyApplicationTests.java
  class SpringBootDemoTemplateEnjoyApplicationTests (line 8) | @RunWith(SpringRunner.class)
    method contextLoads (line 12) | @Test

FILE: demo-template-freemarker/src/main/java/com/xkcoding/template/freemarker/SpringBootDemoTemplateFreemarkerApplication.java
  class SpringBootDemoTemplateFreemarkerApplication (line 14) | @SpringBootApplication
    method main (line 17) | public static void main(String[] args) {

FILE: demo-template-freemarker/src/main/java/com/xkcoding/template/freemarker/controller/IndexController.java
  class IndexController (line 20) | @Controller
    method index (line 24) | @GetMapping(value = {"", "/"})

FILE: demo-template-freemarker/src/main/java/com/xkcoding/template/freemarker/controller/UserController.java
  class UserController (line 21) | @Controller
    method login (line 25) | @PostMapping("/login")
    method login (line 36) | @GetMapping("/login")

FILE: demo-template-freemarker/src/main/java/com/xkcoding/template/freemarker/model/User.java
  class User (line 13) | @Data

FILE: demo-template-freemarker/src/test/java/com/xkcoding/template/freemarker/SpringBootDemoTemplateFreemarkerApplicationTests.java
  class SpringBootDemoTemplateFreemarkerApplicationTests (line 8) | @RunWith(SpringRunner.class)
    method contextLoads (line 12) | @Test

FILE: demo-template-thymeleaf/src/main/java/com/xkcoding/template/thymeleaf/SpringBootDemoTemplateThymeleafApplication.java
  class SpringBootDemoTemplateThymeleafApplication (line 14) | @SpringBootApplication
    method main (line 17) | public static void main(String[] args) {

FILE: demo-template-thymeleaf/src/main/java/com/xkcoding/template/thymeleaf/controller/IndexController.java
  class IndexController (line 20) | @Controller
    method index (line 24) | @GetMapping(value = {"", "/"})

FILE: demo-template-thymeleaf/src/main/java/com/xkcoding/template/thymeleaf/controller/UserController.java
  class UserController (line 21) | @Controller
    method login (line 25) | @PostMapping("/login")
    method login (line 36) | @GetMapping("/login")

FILE: demo-template-thymeleaf/src/main/java/com/xkcoding/template/thymeleaf/model/User.java
  class User (line 13) | @Data

FILE: demo-template-thymeleaf/src/test/java/com/xkcoding/template/thymeleaf/SpringBootDemoTemplateThymeleafApplicationTests.java
  class SpringBootDemoTemplateThymeleafApplicationTests (line 8) | @RunWith(SpringRunner.class)
    method contextLoads (line 12) | @Test

FILE: demo-tio/src/main/java/com/xkcoding/springbootdemotio/SpringBootDemoTioApplication.java
  class SpringBootDemoTioApplication (line 14) | @SpringBootApplication
    method main (line 17) | public static void main(String[] args) {

FILE: demo-tio/src/test/java/com/xkcoding/springbootdemotio/SpringBootDemoTioApplicationTests.java
  class SpringBootDemoTioApplicationTests (line 8) | @RunWith(SpringRunner.class)
    method contextLoads (line 12) | @Test

FILE: demo-uflo/src/main/java/com/xkcoding/uflo/SpringBootDemoUfloApplication.java
  class SpringBootDemoUfloApplication (line 6) | @SpringBootApplication
    method main (line 9) | public static void main(String[] args) {

FILE: demo-uflo/src/test/java/com/xkcoding/uflo/SpringBootDemoUfloApplicationTests.java
  class SpringBootDemoUfloApplicationTests (line 8) | @RunWith(SpringRunner.class)
    method contextLoads (line 12) | @Test

FILE: demo-upload/src/main/java/com/xkcoding/upload/SpringBootDemoUploadApplication.java
  class SpringBootDemoUploadApplication (line 14) | @SpringBootApplication
    method main (line 17) | public static void main(String[] args) {

FILE: demo-upload/src/main/java/com/xkcoding/upload/config/UploadConfig.java
  class UploadConfig (line 31) | @Configuration
    method UploadConfig (line 44) | @Autowired
    method multipartConfigElement (line 52) | @Bean
    method multipartResolver (line 61) | @Bean(name = DispatcherServlet.MULTIPART_RESOLVER_BEAN_NAME)
    method qiniuConfig (line 72) | @Bean
    method uploadManager (line 80) | @Bean
    method auth (line 88) | @Bean
    method bucketManager (line 96) | @Bean

FILE: demo-upload/src/main/java/com/xkcoding/upload/controller/IndexController.java
  class IndexController (line 14) | @Controller
    method index (line 16) | @GetMapping("")

FILE: demo-upload/src/main/java/com/xkcoding/upload/controller/UploadController.java
  class UploadController (line 32) | @RestController
    method UploadController (line 44) | @Autowired
    method local (line 49) | @PostMapping(value = "/local", consumes = MediaType.MULTIPART_FORM_DAT...
    method yun (line 69) | @PostMapping(value = "/yun", consumes = MediaType.MULTIPART_FORM_DATA_...

FILE: demo-upload/src/main/java/com/xkcoding/upload/service/IQiNiuService.java
  type IQiNiuService (line 16) | public interface IQiNiuService {
    method uploadFile (line 24) | Response uploadFile(File file) throws QiniuException;

FILE: demo-upload/src/main/java/com/xkcoding/upload/service/impl/QiNiuServiceImpl.java
  class QiNiuServiceImpl (line 25) | @Service
    method QiNiuServiceImpl (line 37) | @Autowired
    method uploadFile (line 50) | @Override
    method afterPropertiesSet (line 61) | @Override
    method getUploadToken (line 72) | private String getUploadToken() {

FILE: demo-upload/src/test/java/com/xkcoding/upload/SpringBootDemoUploadApplicationTests.java
  class SpringBootDemoUploadApplicationTests (line 8) | @RunWith(SpringRunner.class)
    method contextLoads (line 12) | @Test

FILE: demo-ureport2/doc/sql/t_user_ureport2.sql
  type `t_user_ureport2` (line 24) | CREATE TABLE `t_user_ureport2` (

FILE: demo-ureport2/src/main/java/com/xkcoding/ureport2/SpringBootDemoUreport2Application.java
  class SpringBootDemoUreport2Application (line 14) | @SpringBootApplication
    method main (line 17) | public static void main(String[] args) {

FILE: demo-ureport2/src/main/java/com/xkcoding/ureport2/config/InnerDatasource.java
  class InnerDatasource (line 19) | @Component
    method name (line 24) | @Override
    method getConnection (line 29) | @SneakyThrows

FILE: demo-ureport2/src/test/java/com/xkcoding/ureport2/SpringBootDemoUreport2ApplicationTests.java
  class SpringBootDemoUreport2ApplicationTests (line 8) | @RunWith(SpringRunner.class)
    method contextLoads (line 12) | @Test

FILE: demo-urule/src/main/java/com/xkcoding/urule/SpringBootDemoUruleApplication.java
  class SpringBootDemoUruleApplication (line 14) | @SpringBootApplication
    method main (line 17) | public static void main(String[] args) {

FILE: demo-urule/src/test/java/com/xkcoding/urule/SpringBootDemoUruleApplicationTests.java
  class SpringBootDemoUruleApplicationTests (line 8) | @RunWith(SpringRunner.class)
    method contextLoads (line 12) | @Test

FILE: demo-war/src/main/java/com/xkcoding/war/SpringBootDemoWarApplication.java
  class SpringBootDemoWarApplication (line 16) | @SpringBootApplication
    method main (line 19) | public static void main(String[] args) {
    method configure (line 26) | @Override

FILE: demo-war/src/test/java/com/xkcoding/war/SpringBootDemoWarApplicationTests.java
  class SpringBootDemoWarApplicationTests (line 8) | @RunWith(SpringRunner.class)
    method contextLoads (line 12) | @Test

FILE: demo-websocket-socketio/src/main/java/com/xkcoding/websocket/socketio/SpringBootDemoWebsocketSocketioApplication.java
  class SpringBootDemoWebsocketSocketioApplication (line 14) | @SpringBootApplication
    method main (line 17) | public static void main(String[] args) {

FILE: demo-websocket-socketio/src/main/java/com/xkcoding/websocket/socketio/config/DbTemplate.java
  class DbTemplate (line 19) | @Component
    method findAll (line 31) | public List<UUID> findAll() {
    method findByUserId (line 41) | public Optional<UUID> findByUserId(String userId) {
    method save (line 51) | public void save(String userId, UUID sessionId) {
    method deleteByUserId (line 60) | public void deleteByUserId(String userId) {

FILE: demo-websocket-socketio/src/main/java/com/xkcoding/websocket/socketio/config/Event.java
  type Event (line 11) | public interface Event {

FILE: demo-websocket-socketio/src/main/java/com/xkcoding/websocket/socketio/config/ServerConfig.java
  class ServerConfig (line 18) | @Configuration
    method server (line 22) | @Bean
    method springAnnotationScanner (line 44) | @Bean

FILE: demo-websocket-socketio/src/main/java/com/xkcoding/websocket/socketio/config/WsConfig.java
  class WsConfig (line 14) | @ConfigurationProperties(prefix = "ws.server")

FILE: demo-websocket-socketio/src/main/java/com/xkcoding/websocket/socketio/controller/MessageController.java
  class MessageController (line 25) | @RestController
    method broadcast (line 32) | @PostMapping("/broadcast")
    method isBlank (line 47) | private boolean isBlank(Object bean) {

FILE: demo-websocket-socketio/src/main/java/com/xkcoding/websocket/socketio/handler/MessageEventHandler.java
  class MessageEventHandler (line 33) | @Component
    method onConnect (line 47) | @OnConnect
    method onDisconnect (line 67) | @OnDisconnect
    method onJoinEvent (line 90) | @OnEvent(value = Event.JOIN)
    method onChatEvent (line 99) | @OnEvent(value = Event.CHAT)
    method onGroupEvent (line 111) | @OnEvent(value = Event.GROUP)
    method sendToSingle (line 133) | public void sendToSingle(UUID sessionId, SingleMessageRequest message) {
    method sendToBroadcast (line 140) | public void sendToBroadcast(BroadcastMessageRequest message) {
    method sendToGroup (line 153) | public void sendToGroup(GroupMessageRequest message) {

FILE: demo-websocket-socketio/src/main/java/com/xkcoding/websocket/socketio/init/ServerRunner.java
  class ServerRunner (line 17) | @Component
    method run (line 23) | @Override

FILE: demo-websocket-socketio/src/main/java/com/xkcoding/websocket/socketio/payload/BroadcastMessageRequest.java
  class BroadcastMessageRequest (line 13) | @Data

FILE: demo-websocket-socketio/src/main/java/com/xkcoding/websocket/socketio/payload/GroupMessageRequest.java
  class GroupMessageRequest (line 13) | @Data

FILE: demo-websocket-socketio/src/main/java/com/xkcoding/websocket/socketio/payload/JoinRequest.java
  class JoinRequest (line 13) | @Data

FILE: demo-websocket-socketio/src/main/java/com/xkcoding/websocket/socketio/payload/SingleMessageRequest.java
  class SingleMessageRequest (line 13) | @Data

FILE: demo-websocket-socketio/src/main/resources/static/js/socket.io/socket.io.js
  function s (line 1) | function s(o,u){if(!n[o]){if(!t[o]){var a=typeof require=="function"&&re...
  function lookup (line 1) | function lookup(uri,opts){if(typeof uri=="object"){opts=uri;uri=undefine...
  function Manager (line 1) | function Manager(uri,opts){if(!(this instanceof Manager))return new Mana...
  function on (line 1) | function on(obj,ev,fn){obj.on(ev,fn);return{destroy:function(){obj.remov...
  function Socket (line 1) | function Socket(io,nsp){this.io=io;this.nsp=nsp;this.json=this;this.ids=...
  function url (line 1) | function url(uri,loc){var obj=uri;var loc=loc||global.location;if(null==...
  function Backoff (line 1) | function Backoff(opts){opts=opts||{};this.ms=opts.min||100;this.max=opts...
  function Emitter (line 1) | function Emitter(obj){if(obj)return mixin(obj)}
  function mixin (line 1) | function mixin(obj){for(var key in Emitter.prototype){obj[key]=Emitter.p...
  function on (line 1) | function on(){self.off(event,on);fn.apply(this,arguments)}
  function debug (line 1) | function debug(name){if(!debug.enabled(name))return function(){};return ...
  function coerce (line 1) | function coerce(val){if(val instanceof Error)return val.stack||val.messa...
  function noop (line 1) | function noop(){}
  function Socket (line 1) | function Socket(uri,opts){if(!(this instanceof Socket))return new Socket...
  function clone (line 1) | function clone(obj){var o={};for(var i in obj){if(obj.hasOwnProperty(i))...
  function onTransportOpen (line 1) | function onTransportOpen(){if(self.onlyBinaryUpgrades){var upgradeLosesB...
  function freezeTransport (line 1) | function freezeTransport(){if(failed)return;failed=true;cleanup();transp...
  function onerror (line 1) | function onerror(err){var error=new Error("probe error: "+err);error.tra...
  function onTransportClose (line 1) | function onTransportClose(){onerror("transport closed")}
  function onclose (line 1) | function onclose(){onerror("socket closed")}
  function onupgrade (line 1) | function onupgrade(to){if(transport&&to.name!=transport.name){debug('"%s...
  function cleanup (line 1) | function cleanup(){transport.removeListener("open",onTransportOpen);tran...
  function close (line 1) | function close(){self.onClose("forced close");debug("socket closing - te...
  function cleanupAndClose (line 1) | function cleanupAndClose(){self.removeListener("upgrade",cleanupAndClose...
  function waitForUpgrade (line 1) | function waitForUpgrade(){self.once("upgrade",cleanupAndClose);self.once...
  function Transport (line 1) | function Transport(opts){this.path=opts.path;this.hostname=opts.hostname...
  function polling (line 1) | function polling(opts){var xhr;var xd=false;var xs=false;var jsonp=false...
  function empty (line 2) | function empty(){}
  function JSONPPolling (line 2) | function JSONPPolling(opts){Polling.call(this,opts);this.query=this.quer...
  function complete (line 2) | function complete(){initIframe();fn()}
  function initIframe (line 2) | function initIframe(){if(self.iframe){try{self.form.removeChild(self.ifr...
  function empty (line 2) | function empty(){}
  function XHR (line 2) | function XHR(opts){Polling.call(this,opts);if(global.location){var isSSL...
  function Request (line 2) | function Request(opts){this.method=opts.method||"GET";this.uri=opts.uri;...
  function unloadHandler (line 2) | function unloadHandler(){for(var i in Request.requests){if(Request.reque...
  function Polling (line 2) | function Polling(opts){var forceBase64=opts&&opts.forceBase64;if(!hasXHR...
  function pause (line 2) | function pause(){debug("paused");self.readyState="paused";onPause()}
  function close (line 2) | function close(){debug("writing close packet");self.write([{type:"close"...
  function WS (line 2) | function WS(opts){var forceBase64=opts&&opts.forceBase64;if(forceBase64)...
  function ondrain (line 2) | function ondrain(){self.writable=true;self.emit("drain")}
  function useColors (line 2) | function useColors(){return"WebkitAppearance"in document.documentElement...
  function formatArgs (line 2) | function formatArgs(){var args=arguments;var useColors=this.useColors;ar...
  function log (line 2) | function log(){return"object"==typeof console&&"function"==typeof consol...
  function save (line 2) | function save(namespaces){try{if(null==namespaces){localStorage.removeIt...
  function load (line 2) | function load(){var r;try{r=localStorage.debug}catch(e){}return r}
  function selectColor (line 2) | function selectColor(){return exports.colors[prevColor++%exports.colors....
  function debug (line 2) | function debug(namespace){function disabled(){}disabled.enabled=false;fu...
  function enable (line 2) | function enable(namespaces){exports.save(namespaces);var split=(namespac...
  function disable (line 2) | function disable(){exports.enable("")}
  function enabled (line 2) | function enabled(name){var i,len;for(i=0,len=exports.skips.length;i<len;...
  function coerce (line 2) | function coerce(val){if(val instanceof Error)return val.stack||val.messa...
  function parse (line 2) | function parse(str){var match=/^((?:\d+)?\.?\d+) *(ms|seconds?|s|minutes...
  function short (line 2) | function short(ms){if(ms>=d)return Math.round(ms/d)+"d";if(ms>=h)return ...
  function long (line 2) | function long(ms){return plural(ms,d,"day")||plural(ms,h,"hour")||plural...
  function plural (line 2) | function plural(ms,n,name){if(ms<n)return;if(ms<n*1.5)return Math.floor(...
  function encodeBase64Object (line 2) | function encodeBase64Object(packet,callback){var message="b"+exports.pac...
  function encodeArrayBuffer (line 2) | function encodeArrayBuffer(packet,supportsBinary,callback){if(!supportsB...
  function encodeBlobAsArrayBuffer (line 2) | function encodeBlobAsArrayBuffer(packet,supportsBinary,callback){if(!sup...
  function encodeBlob (line 2) | function encodeBlob(packet,supportsBinary,callback){if(!supportsBinary){...
  function setLengthHeader (line 2) | function setLengthHeader(message){return message.length+":"+message}
  function encodeOne (line 2) | function encodeOne(packet,doneCallback){exports.encodePacket(packet,!isB...
  function map (line 2) | function map(ary,each,done){var result=new Array(ary.length);var next=af...
  function encodeOne (line 2) | function encodeOne(packet,doneCallback){exports.encodePacket(packet,true...
  function encodeOne (line 2) | function encodeOne(packet,doneCallback){exports.encodePacket(packet,true...
  function after (line 2) | function after(count,callback,err_cb){var bail=false;err_cb=err_cb||noop...
  function noop (line 2) | function noop(){}
  function BlobBuilderConstructor (line 2) | function BlobBuilderConstructor(ary,options){options=options||{};var bb=...
  function hasBinary (line 2) | function hasBinary(data){function _hasBinary(obj){if(!obj)return false;i...
  function ucs2decode (line 2) | function ucs2decode(string){var output=[];var counter=0;var length=strin...
  function ucs2encode (line 3) | function ucs2encode(array){var length=array.length;var index=-1;var valu...
  function createByte (line 3) | function createByte(codePoint,shift){return stringFromCharCode(codePoint...
  function encodeCodePoint (line 3) | function encodeCodePoint(codePoint){if((codePoint&4294967168)==0){return...
  function utf8encode (line 3) | function utf8encode(string){var codePoints=ucs2decode(string);var length...
  function readContinuationByte (line 3) | function readContinuationByte(){if(byteIndex>=byteCount){throw Error("In...
  function decodeSymbol (line 3) | function decodeSymbol(){var byte1;var byte2;var byte3;var byte4;var code...
  function utf8decode (line 3) | function utf8decode(byteString){byteArray=ucs2decode(byteString);byteCou...
  function ws (line 3) | function ws(uri,protocols,opts){var instance;if(protocols){instance=new ...
  function hasBinary (line 3) | function hasBinary(data){function _hasBinary(obj){if(!obj)return false;i...
  function _deconstructPacket (line 3) | function _deconstructPacket(data){if(!data)return data;if(isBuf(data)){v...
  function _reconstructPacket (line 3) | function _reconstructPacket(data){if(data&&data._placeholder){var buf=bu...
  function _removeBlobs (line 3) | function _removeBlobs(obj,curKey,containingObject){if(!obj)return obj;if...
  function Encoder (line 3) | function Encoder(){}
  function encodeAsString (line 3) | function encodeAsString(obj){var str="";var nsp=false;str+=obj.type;if(e...
  function encodeAsBinary (line 3) | function encodeAsBinary(obj,callback){function writeEncoding(bloblessDat...
  function Decoder (line 3) | function Decoder(){this.reconstructor=null}
  function decodeString (line 3) | function decodeString(str){var p={};var i=0;p.type=Number(str.charAt(0))...
  function BinaryReconstructor (line 3) | function BinaryReconstructor(packet){this.reconPack=packet;this.buffers=[]}
  function error (line 3) | function error(data){return{type:exports.ERROR,data:"parser error"}}
  function isBuf (line 3) | function isBuf(obj){return global.Buffer&&global.Buffer.isBuffer(obj)||g...
  function has (line 3) | function has(name){if(has[name]!==undef){return has[name]}var isSupporte...
  function toArray (line 3) | function toArray(list,index){var array=[];index=index||0;for(var i=index...

FILE: demo-websocket-socketio/src/test/java/com/xkcoding/websocket/socketio/SpringBootDemoWebsocketSocketioApplicationTests.java
  class SpringBootDemoWebsocketSocketioApplicationTests (line 8) | @RunWith(SpringRunner.class)
    method contextLoads (line 12) | @Test

FILE: demo-websocket/src/main/java/com/xkcoding/websocket/SpringBootDemoWebsocketApplication.java
  class SpringBootDemoWebsocketApplication (line 15) | @SpringBootApplication
    method main (line 19) | public static void main(String[] args) {

FILE: demo-websocket/src/main/java/com/xkcoding/websocket/common/WebSocketConsts.java
  type WebSocketConsts (line 11) | public interface WebSocketConsts {

FILE: demo-websocket/src/main/java/com/xkcoding/websocket/config/WebSocketConfig.java
  class WebSocketConfig (line 18) | @Configuration
    method registerStompEndpoints (line 23) | @Override
    method configureMessageBroker (line 31) | @Override

FILE: demo-websocket/src/main/java/com/xkcoding/websocket/controller/ServerController.java
  class ServerController (line 19) | @RestController
    method serverInfo (line 23) | @GetMapping

FILE: demo-websocket/src/main/java/com/xkcoding/websocket/model/Server.java
  class Server (line 29) | public class Server {
    method getCpu (line 58) | public Cpu getCpu() {
    method setCpu (line 62) | public void setCpu(Cpu cpu) {
    method getMem (line 66) | public Mem getMem() {
    method setMem (line 70) | public void setMem(Mem mem) {
    method getJvm (line 74) | public Jvm getJvm() {
    method setJvm (line 78) | public void setJvm(Jvm jvm) {
    method getSys (line 82) | public Sys getSys() {
    method setSys (line 86) | public void setSys(Sys sys) {
    method getSysFiles (line 90) | public List<SysFile> getSysFiles() {
    method setSysFiles (line 94) | public void setSysFiles(List<SysFile> sysFiles) {
    method copyTo (line 98) | public void copyTo() throws Exception {
    method setCpuInfo (line 116) | private void setCpuInfo(CentralProcessor processor) {
    method setMemInfo (line 141) | private void setMemInfo(GlobalMemory memory) {
    method setSysInfo (line 150) | private void setSysInfo() {
    method setJvmInfo (line 162) | private void setJvmInfo() throws UnknownHostException {
    method setSysFiles (line 174) | private void setSysFiles(OperatingSystem os) {
    method convertFileSize (line 199) | public String convertFileSize(long size) {

FILE: demo-websocket/src/main/java/com/xkcoding/websocket/model/server/Cpu.java
  class Cpu (line 13) | public class Cpu {
    method getCpuNum (line 44) | public int getCpuNum() {
    method setCpuNum (line 48) | public void setCpuNum(int cpuNum) {
    method getTotal (line 52) | public double getTotal() {
    method setTotal (line 56) | public void setTotal(double total) {
    method getSys (line 60) | public double getSys() {
    method setSys (line 64) | public void setSys(double sys) {
    method getUsed (line 68) | public double getUsed() {
    method setUsed (line 72) | public void setUsed(double used) {
    method getWait (line 76) | public double getWait() {
    method setWait (line 80) | public void setWait(double wait) {
    method getFree (line 84) | public double getFree() {
    method setFree (line 88) | public void setFree(double free) {

FILE: demo-websocket/src/main/java/com/xkcoding/websocket/model/server/Jvm.java
  class Jvm (line 17) | public class Jvm {
    method getTotal (line 53) | public double getTotal() {
    method setTotal (line 57) | public void setTotal(double total) {
    method getMax (line 61) | public double getMax() {
    method setMax (line 65) | public void setMax(double max) {
    method getFree (line 69) | public double getFree() {
    method setFree (line 73) | public void setFree(double free) {
    method getUsed (line 77) | public double getUsed() {
    method getUsage (line 81) | public double getUsage() {
    method getName (line 88) | public String getName() {
    method getVersion (line 92) | public String getVersion() {
    method setVersion (line 96) | public void setVersion(String version) {
    method getHome (line 100) | public String getHome() {
    method setHome (line 104) | public void setHome(String home) {
    method setStartTime (line 108) | public void setStartTime(String startTime) {
    method getStartTime (line 112) | public String getStartTime() {
    method setRunTime (line 117) | public void setRunTime(String runTime) {
    method getRunTime (line 121) | public String getRunTime() {

FILE: demo-websocket/src/main/java/com/xkcoding/websocket/model/server/Mem.java
  class Mem (line 13) | public class Mem {
    method getTotal (line 29) | public double getTotal() {
    method setTotal (line 33) | public void setTotal(long total) {
    method getUsed (line 37) | public double getUsed() {
    method setUsed (line 41) | public void setUsed(long used) {
    method getFree (line 45) | public double getFree() {
    method setFree (line 49) | public void setFree(long free) {
    method getUsage (line 53) | public double getUsage() {

FILE: demo-websocket/src/main/java/com/xkcoding/websocket/model/server/Sys.java
  class Sys (line 11) | public class Sys {
    method getComputerName (line 37) | public String getComputerName() {
    method setComputerName (line 41) | public void setComputerName(String computerName) {
    method getComputerIp (line 45) | public String getComputerIp() {
    method setComputerIp (line 49) | public void setComputerIp(String computerIp) {
    method getUserDir (line 53) | public String getUserDir() {
    method setUserDir (line 57) | public void setUserDir(String userDir) {
    method getOsName (line 61) | public String getOsName() {
    method setOsName (line 65) | public void setOsName(String osName) {
    method getOsArch (line 69) | public String getOsArch() {
    method setOsArch (line 73) | public void setOsArch(String osArch) {

FILE: demo-websocket/src/main/java/com/xkcoding/websocket/model/server/SysFile.java
  class SysFile (line 11) | public class SysFile {
    method getDirName (line 47) | public String getDirName() {
    method setDirName (line 51) | public void setDirName(String dirName) {
    method getSysTypeName (line 55) | public String getSysTypeName() {
    method setSysTypeName (line 59) | public void setSysTypeName(String sysTypeName) {
    method getTypeName (line 63) | public String getTypeName() {
    method setTypeName (line 67) | public void setTypeName(String typeName) {
    method getTotal (line 71) | public String getTotal() {
    method setTotal (line 75) | public void setTotal(String total) {
    method getFree (line 79) | public String getFree() {
    method setFree (line 83) | public void setFree(String free) {
    method getUsed (line 87) | public String getUsed() {
    method setUsed (line 91) | public void setUsed(String used) {
    method getUsage (line 95) | public double getUsage() {
    method setUsage (line 99) | public void setUsage(double usage) {

FILE: demo-websocket/src/main/java/com/xkcoding/websocket/payload/KV.java
  class KV (line 15) | @Data

FILE: demo-websocket/src/main/java/com/xkcoding/websocket/payload/ServerVO.java
  class ServerVO (line 18) | @Data
    method create (line 26) | public ServerVO create(Server server) {

FILE: demo-websocket/src/main/java/com/xkcoding/websocket/payload/server/CpuVO.java
  class CpuVO (line 18) | @Data
    method create (line 22) | public static CpuVO create(Cpu cpu) {

FILE: demo-websocket/src/main/java/com/xkcoding/websocket/payload/server/JvmVO.java
  class JvmVO (line 18) | @Data
    method create (line 22) | public static JvmVO create(Jvm jvm) {

FILE: demo-websocket/src/main/java/com/xkcoding/websocket/payload/server/MemVO.java
  class MemVO (line 18) | @Data
    method create (line 22) | public static MemVO create(Mem mem) {

FILE: demo-websocket/src/main/java/com/xkcoding/websocket/payload/server/SysFileVO.java
  class SysFileVO (line 18) | @Data
    method create (line 22) | public static SysFileVO create(List<SysFile> sysFiles) {

FILE: demo-websocket/src/main/java/com/xkcoding/websocket/payload/server/SysVO.java
  class SysVO (line 18) | @Data
    method create (line 22) | public static SysVO create(Sys sys) {

FILE: demo-websocket/src/main/java/com/xkcoding/websocket/task/ServerTask.java
  class ServerTask (line 26) | @Slf4j
    method websocket (line 35) | @Scheduled(cron = "0/2 * * * * ?")

FILE: demo-websocket/src/main/java/com/xkcoding/websocket/util/IpUtil.java
  class IpUtil (line 15) | public class IpUtil {
    method getIpAddr (line 16) | public static String getIpAddr(HttpServletRequest request) {
    method internalIp (line 41) | public static boolean internalIp(String ip) {
    method internalIp (line 46) | private static boolean internalIp(byte[] addr) {
    method textToNumericFormatV4 (line 81) | public static byte[] textToNumericFormatV4(String text) {
    method getHostIp (line 149) | public static String getHostIp() {
    method getHostName (line 157) | public static String getHostName() {

FILE: demo-websocket/src/main/java/com/xkcoding/websocket/util/ServerUtil.java
  class ServerUtil (line 15) | public class ServerUtil {
    method wrapServerVO (line 22) | public static ServerVO wrapServerVO(Server server) {
    method wrapServerDict (line 34) | public static Dict wrapServerDict(ServerVO serverVO) {

FILE: demo-websocket/src/main/resources/static/js/stomp.js
  function Frame (line 23) | function Frame(command, headers, body) {
  function Client (line 129) | function Client(ws) {

FILE: demo-websocket/src/test/java/com/xkcoding/websocket/SpringBootDemoWebsocketApplicationTests.java
  class SpringBootDemoWebsocketApplicationTests (line 8) | @RunWith(SpringRunner.class)
    method contextLoads (line 12) | @Test

FILE: demo-zookeeper/src/main/java/com/xkcoding/zookeeper/SpringBootDemoZookeeperApplication.java
  class SpringBootDemoZookeeperApplication (line 14) | @SpringBootApplication
    method main (line 17) | public static void main(String[] args) {

FILE: demo-zookeeper/src/main/java/com/xkcoding/zookeeper/aspectj/ZooLockAspect.java
  class ZooLockAspect (line 31) | @Aspect
    method ZooLockAspect (line 41) | @Autowired
    method doLock (line 49) | @Pointcut("@annotation(com.xkcoding.zookeeper.annotation.ZooLock)")
    method around (line 61) | @Around("doLock()")
    method buildLockKey (line 94) | private String buildLockKey(ZooLock lock, Method method, Object[] args...

FILE: demo-zookeeper/src/main/java/com/xkcoding/zookeeper/config/ZkConfig.java
  class ZkConfig (line 21) | @Configuration
    method ZkConfig (line 26) | @Autowired
    method curatorFramework (line 31) | @Bean

FILE: demo-zookeeper/src/main/java/com/xkcoding/zookeeper/config/props/ZkProps.java
  class ZkProps (line 14) | @Data

FILE: demo-zookeeper/src/test/java/com/xkcoding/zookeeper/SpringBootDemoZookeeperApplicationTests.java
  class SpringBootDemoZookeeperApplicationTests (line 20) | @RunWith(SpringRunner.class)
    method getCount (line 25) | public Integer getCount() {
    method test (line 38) | @Test
    method testAopLock (line 48) | @Test
    method testManualLock (line 64) | @Test
    method aopBuy (line 71) | @ZooLock(key = "buy", timeout = 1, timeUnit = TimeUnit.MINUTES)
    method manualBuy (line 78) | public void manualBuy() {
    method doBuy (line 96) | public void doBuy() {
Condensed preview — 875 files, each showing path, character count, and a content snippet. Download the .json file or copy for the full structured content (2,290K chars).
[
  {
    "path": ".codacy.yml",
    "chars": 131,
    "preview": "---\nexclude_paths:\n  - '**.md'\n  - '**/**.md'\n  - '**.sql'\n  - '**.html'\n  - '**/static/**'\n  - '**/templates/**'\n  - '*"
  },
  {
    "path": ".editorconfig",
    "chars": 212,
    "preview": "# 开发组IDE 编辑器标准\nroot = true\n\n[*]\nindent_size = 2\ncharset = utf-8\nindent_style = space\nend_of_line = lf\ninsert_final_newli"
  },
  {
    "path": ".gitee/ISSUE_TEMPLATE/bug_report.md",
    "chars": 461,
    "preview": "---\nname: 报告缺陷\nabout: 报告缺陷以帮助我们改进\ntitle: \"[BUG]\"\nlabels: bug\nassignees: xkcoding\n---\n\n**请先看[《提问的智慧》](https://github.com/"
  },
  {
    "path": ".gitee/ISSUE_TEMPLATE/feature_request.md",
    "chars": 248,
    "preview": "---\nname: 请求新功能\nabout: 提出你期待的功能特性\ntitle: \"[FEATURE]\"\nlabels: feature\nassignees: xkcoding\n---\n\n### 你在什么场景下需要该功能?\n\n请尽量清晰精准"
  },
  {
    "path": ".gitee/PULL_REQUEST_TEMPLATE.md",
    "chars": 306,
    "preview": "* PR 修复缺陷请先开 `issue` **[报告缺陷](https://github.com/xkcoding/spring-boot-demo/issues/new?template=bug_report.md)**\n* PR 提交新"
  },
  {
    "path": ".github/FUNDING.yml",
    "chars": 47,
    "preview": "custom: https://docs.xkcoding.com/SPONSER.html\n"
  },
  {
    "path": ".github/ISSUE_TEMPLATE/bug_report.md",
    "chars": 461,
    "preview": "---\nname: 报告缺陷\nabout: 报告缺陷以帮助我们改进\ntitle: \"[BUG]\"\nlabels: bug\nassignees: xkcoding\n---\n\n**请先看[《提问的智慧》](https://github.com/"
  },
  {
    "path": ".github/ISSUE_TEMPLATE/feature_request.md",
    "chars": 248,
    "preview": "---\nname: 请求新功能\nabout: 提出你期待的功能特性\ntitle: \"[FEATURE]\"\nlabels: feature\nassignees: xkcoding\n---\n\n### 你在什么场景下需要该功能?\n\n请尽量清晰精准"
  },
  {
    "path": ".github/PULL_REQUEST_TEMPLATE.md",
    "chars": 306,
    "preview": "* PR 修复缺陷请先开 `issue` **[报告缺陷](https://github.com/xkcoding/spring-boot-demo/issues/new?template=bug_report.md)**\n* PR 提交新"
  },
  {
    "path": ".github/workflows/maven.yml",
    "chars": 364,
    "preview": "name: GitHub CI\non:\n  push:\n    branches:\n      - master\n  pull_request:\njobs:\n  build:\n    runs-on: ubuntu-latest\n    s"
  },
  {
    "path": ".gitignore",
    "chars": 448,
    "preview": "# Created by .ignore support plugin (hsz.mobi)\n### xkcoding-后端 template\n### Spring Boot ###\ntarget/\n!.mvn/wrapper/maven-"
  },
  {
    "path": ".travis.yml",
    "chars": 344,
    "preview": "# 语言\nlanguage: java\n# 执行脚本\nscript: \"mvn clean package -DskipTests=true -Dmaven.javadoc.skip=true -B -V\"\n# 通知\nnotificatio"
  },
  {
    "path": "LICENSE",
    "chars": 1069,
    "preview": "MIT License\n\nCopyright (c) 2018 Yangkai.Shen\n\nPermission is hereby granted, free of charge, to any person obtaining a co"
  },
  {
    "path": "README.en.md",
    "chars": 20136,
    "preview": "<h1 align=\"center\"><a href=\"https://github.com/xkcoding\" target=\"_blank\">Spring Boot Demo</a></h1>\n<p align=\"center\">\n  "
  },
  {
    "path": "README.md",
    "chars": 15106,
    "preview": "<h1 align=\"center\"><a href=\"https://github.com/xkcoding\" target=\"_blank\">Spring Boot Demo</a></h1>\n<p align=\"center\">\n  "
  },
  {
    "path": "TODO.en.md",
    "chars": 5157,
    "preview": "# spring-boot-demo Project TODO List\n\n## Module plan (completed: 55 / 66)\n\n- [x] ~~demo-helloworld(helloworld example)~~"
  },
  {
    "path": "TODO.md",
    "chars": 3421,
    "preview": "# spring-boot-demo 项目待办列表\n\n## 模块计划(已完成:55 / 66)\n\n- [x] ~~demo-helloworld(Helloworld 示例)~~\n- [x] ~~demo-properties(读取配置文件"
  },
  {
    "path": "demo-activiti/.gitignore",
    "chars": 268,
    "preview": "/target/\n!.mvn/wrapper/maven-wrapper.jar\n\n### STS ###\n.apt_generated\n.classpath\n.factorypath\n.project\n.settings\n.springB"
  },
  {
    "path": "demo-activiti/pom.xml",
    "chars": 2042,
    "preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<project xmlns=\"http://maven.apache.org/POM/4.0.0\" xmlns:xsi=\"http://www.w3.org/2"
  },
  {
    "path": "demo-activiti/src/main/java/com/xkcoding/activiti/SpringBootDemoActivitiApplication.java",
    "chars": 453,
    "preview": "package com.xkcoding.activiti;\n\nimport org.springframework.boot.SpringApplication;\nimport org.springframework.boot.autoc"
  },
  {
    "path": "demo-activiti/src/main/java/com/xkcoding/activiti/config/SecurityConfiguration.java",
    "chars": 2444,
    "preview": "package com.xkcoding.activiti.config;\n\nimport lombok.extern.slf4j.Slf4j;\nimport org.springframework.context.annotation.B"
  },
  {
    "path": "demo-activiti/src/main/java/com/xkcoding/activiti/util/SecurityUtil.java",
    "chars": 2204,
    "preview": "package com.xkcoding.activiti.util;\n\nimport lombok.RequiredArgsConstructor;\nimport org.springframework.beans.factory.ann"
  },
  {
    "path": "demo-activiti/src/main/resources/application.yml",
    "chars": 401,
    "preview": "spring:\n  datasource:\n    url: jdbc:mysql://localhost:3306/spring-boot-demo\n    username: root\n    password: root\n    hi"
  },
  {
    "path": "demo-activiti/src/main/resources/processes/team01.bpmn",
    "chars": 4556,
    "preview": "<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?>\n<definitions xmlns=\"http://www.omg.org/spec/BPMN/20100524/MODEL\""
  },
  {
    "path": "demo-activiti/src/test/java/com/xkcoding/activiti/SpringBootDemoActivitiApplicationTests.java",
    "chars": 1032,
    "preview": "package com.xkcoding.activiti;\n\nimport com.xkcoding.activiti.util.SecurityUtil;\nimport org.activiti.api.process.model.Pr"
  },
  {
    "path": "demo-actuator/.gitignore",
    "chars": 268,
    "preview": "/target/\n!.mvn/wrapper/maven-wrapper.jar\n\n### STS ###\n.apt_generated\n.classpath\n.factorypath\n.project\n.settings\n.springB"
  },
  {
    "path": "demo-actuator/README.md",
    "chars": 2933,
    "preview": "# spring-boot-demo-actuator\n\n> 本 demo 主要演示了如何在 Spring Boot 中通过 actuator 检查项目运行情况\n\n## pom.xml\n\n```xml\n<?xml version=\"1.0\""
  },
  {
    "path": "demo-actuator/pom.xml",
    "chars": 1912,
    "preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<project xmlns=\"http://maven.apache.org/POM/4.0.0\" xmlns:xsi=\"http://www.w3.org/2"
  },
  {
    "path": "demo-actuator/src/main/java/com/xkcoding/actuator/SpringBootDemoActuatorApplication.java",
    "chars": 450,
    "preview": "package com.xkcoding.actuator;\n\nimport org.springframework.boot.SpringApplication;\nimport org.springframework.boot.autoc"
  },
  {
    "path": "demo-actuator/src/main/resources/application.yml",
    "chars": 473,
    "preview": "server:\n  port: 8080\n  servlet:\n    context-path: /demo\n# 若要访问端点信息,需要配置用户名和密码\nspring:\n  security:\n    user:\n      name: "
  },
  {
    "path": "demo-actuator/src/test/java/com/xkcoding/actuator/SpringBootDemoActuatorApplicationTests.java",
    "chars": 363,
    "preview": "package com.xkcoding.actuator;\n\nimport org.junit.Test;\nimport org.junit.runner.RunWith;\nimport org.springframework.boot."
  },
  {
    "path": "demo-admin/README.md",
    "chars": 1394,
    "preview": "# spring-boot-demo-admin\n\n> 本 demo 主要演示了 Spring Boot 如何集成 Admin 管控台,监控管理 Spring Boot 应用,分别为 admin 服务端和 admin 客户端,两个模块。\n\n"
  },
  {
    "path": "demo-admin/admin-client/.gitignore",
    "chars": 268,
    "preview": "/target/\n!.mvn/wrapper/maven-wrapper.jar\n\n### STS ###\n.apt_generated\n.classpath\n.factorypath\n.project\n.settings\n.springB"
  },
  {
    "path": "demo-admin/admin-client/README.md",
    "chars": 2699,
    "preview": "# spring-boot-demo-admin-client\n\n> 本 demo 主要演示了普通项目如何集成 Spring Boot Admin,并把自己的运行状态交给 Spring Boot Admin 进行展现。\n\n## pom.xm"
  },
  {
    "path": "demo-admin/admin-client/pom.xml",
    "chars": 1713,
    "preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<project xmlns=\"http://maven.apache.org/POM/4.0.0\" xmlns:xsi=\"http://www.w3.org/2"
  },
  {
    "path": "demo-admin/admin-client/src/main/java/com/xkcoding/admin/client/SpringBootDemoAdminClientApplication.java",
    "chars": 460,
    "preview": "package com.xkcoding.admin.client;\n\nimport org.springframework.boot.SpringApplication;\nimport org.springframework.boot.a"
  },
  {
    "path": "demo-admin/admin-client/src/main/java/com/xkcoding/admin/client/controller/IndexController.java",
    "chars": 435,
    "preview": "package com.xkcoding.admin.client.controller;\n\nimport org.springframework.web.bind.annotation.GetMapping;\nimport org.spr"
  },
  {
    "path": "demo-admin/admin-client/src/main/resources/application.yml",
    "chars": 754,
    "preview": "server:\n  port: 8080\n  servlet:\n    context-path: /demo\nspring:\n  application:\n    # Spring Boot Admin展示的客户端项目名,不设置,会使用自"
  },
  {
    "path": "demo-admin/admin-client/src/test/java/com/xkcoding/admin/client/SpringBootDemoAdminClientApplicationTests.java",
    "chars": 370,
    "preview": "package com.xkcoding.admin.client;\n\nimport org.junit.Test;\nimport org.junit.runner.RunWith;\nimport org.springframework.b"
  },
  {
    "path": "demo-admin/admin-server/.gitignore",
    "chars": 268,
    "preview": "/target/\n!.mvn/wrapper/maven-wrapper.jar\n\n### STS ###\n.apt_generated\n.classpath\n.factorypath\n.project\n.settings\n.springB"
  },
  {
    "path": "demo-admin/admin-server/README.md",
    "chars": 2178,
    "preview": "# spring-boot-demo-admin-server\n\n> 本 demo 主要演示了如何搭建一个 Spring Boot Admin 的服务端项目,可视化展示自己客户端项目的运行状态。\n\n## pom.xml\n\n```xml\n<?"
  },
  {
    "path": "demo-admin/admin-server/pom.xml",
    "chars": 1572,
    "preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<project xmlns=\"http://maven.apache.org/POM/4.0.0\" xmlns:xsi=\"http://www.w3.org/2"
  },
  {
    "path": "demo-admin/admin-server/src/main/java/com/xkcoding/admin/server/SpringBootDemoAdminServerApplication.java",
    "chars": 546,
    "preview": "package com.xkcoding.admin.server;\n\nimport de.codecentric.boot.admin.server.config.EnableAdminServer;\nimport org.springf"
  },
  {
    "path": "demo-admin/admin-server/src/main/resources/application.yml",
    "chars": 21,
    "preview": "server:\n  port: 8000\n"
  },
  {
    "path": "demo-admin/admin-server/src/test/java/com/xkcoding/admin/server/SpringBootDemoAdminServerApplicationTests.java",
    "chars": 370,
    "preview": "package com.xkcoding.admin.server;\n\nimport org.junit.Test;\nimport org.junit.runner.RunWith;\nimport org.springframework.b"
  },
  {
    "path": "demo-admin/pom.xml",
    "chars": 1060,
    "preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<project xmlns=\"http://maven.apache.org/POM/4.0.0\"\n         xmlns:xsi=\"http://www"
  },
  {
    "path": "demo-async/.gitignore",
    "chars": 268,
    "preview": "/target/\n!.mvn/wrapper/maven-wrapper.jar\n\n### STS ###\n.apt_generated\n.classpath\n.factorypath\n.project\n.settings\n.springB"
  },
  {
    "path": "demo-async/README.md",
    "chars": 7180,
    "preview": "# spring-boot-demo-async\n\n> 此 demo 主要演示了 Spring Boot 如何使用原生提供的异步任务支持,实现异步执行任务。\n\n## pom.xml\n\n```xml\n<?xml version=\"1.0\" e"
  },
  {
    "path": "demo-async/pom.xml",
    "chars": 1737,
    "preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<project xmlns=\"http://maven.apache.org/POM/4.0.0\" xmlns:xsi=\"http://www.w3.org/2"
  },
  {
    "path": "demo-async/src/main/java/com/xkcoding/async/SpringBootDemoAsyncApplication.java",
    "chars": 519,
    "preview": "package com.xkcoding.async;\n\nimport org.springframework.boot.SpringApplication;\nimport org.springframework.boot.autoconf"
  },
  {
    "path": "demo-async/src/main/java/com/xkcoding/async/task/TaskFactory.java",
    "chars": 1721,
    "preview": "package com.xkcoding.async.task;\n\nimport lombok.extern.slf4j.Slf4j;\nimport org.springframework.scheduling.annotation.Asy"
  },
  {
    "path": "demo-async/src/main/resources/application.yml",
    "chars": 313,
    "preview": "spring:\n  task:\n    execution:\n      pool:\n        # 最大线程数\n        max-size: 16\n        # 核心线程数\n        core-size: 16\n  "
  },
  {
    "path": "demo-async/src/test/java/com/xkcoding/async/SpringBootDemoAsyncApplicationTests.java",
    "chars": 358,
    "preview": "package com.xkcoding.async;\n\nimport org.junit.Test;\nimport org.junit.runner.RunWith;\nimport org.springframework.boot.tes"
  },
  {
    "path": "demo-async/src/test/java/com/xkcoding/async/task/TaskFactoryTest.java",
    "chars": 1407,
    "preview": "package com.xkcoding.async.task;\n\nimport com.xkcoding.async.SpringBootDemoAsyncApplicationTests;\nimport lombok.extern.sl"
  },
  {
    "path": "demo-cache-ehcache/.gitignore",
    "chars": 268,
    "preview": "/target/\n!.mvn/wrapper/maven-wrapper.jar\n\n### STS ###\n.apt_generated\n.classpath\n.factorypath\n.project\n.settings\n.springB"
  },
  {
    "path": "demo-cache-ehcache/README.md",
    "chars": 6655,
    "preview": "# spring-boot-demo-cache-ehcache\n\n> 此 demo 主要演示了 Spring Boot 如何集成 ehcache 使用缓存。\n\n## pom.xml\n\n```xml\n<?xml version=\"1.0\" "
  },
  {
    "path": "demo-cache-ehcache/pom.xml",
    "chars": 2194,
    "preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<project xmlns=\"http://maven.apache.org/POM/4.0.0\" xmlns:xsi=\"http://www.w3.org/2"
  },
  {
    "path": "demo-cache-ehcache/src/main/java/com/xkcoding/cache/ehcache/SpringBootDemoCacheEhcacheApplication.java",
    "chars": 538,
    "preview": "package com.xkcoding.cache.ehcache;\n\nimport org.springframework.boot.SpringApplication;\nimport org.springframework.boot."
  },
  {
    "path": "demo-cache-ehcache/src/main/java/com/xkcoding/cache/ehcache/entity/User.java",
    "chars": 519,
    "preview": "package com.xkcoding.cache.ehcache.entity;\n\nimport lombok.AllArgsConstructor;\nimport lombok.Data;\nimport lombok.NoArgsCo"
  },
  {
    "path": "demo-cache-ehcache/src/main/java/com/xkcoding/cache/ehcache/service/UserService.java",
    "chars": 527,
    "preview": "package com.xkcoding.cache.ehcache.service;\n\nimport com.xkcoding.cache.ehcache.entity.User;\n\n/**\n * <p>\n * UserService\n "
  },
  {
    "path": "demo-cache-ehcache/src/main/java/com/xkcoding/cache/ehcache/service/impl/UserServiceImpl.java",
    "chars": 1730,
    "preview": "package com.xkcoding.cache.ehcache.service.impl;\n\nimport com.google.common.collect.Maps;\nimport com.xkcoding.cache.ehcac"
  },
  {
    "path": "demo-cache-ehcache/src/main/resources/application.yml",
    "chars": 125,
    "preview": "spring:\n  cache:\n    type: ehcache\n    ehcache:\n      config: classpath:ehcache.xml\nlogging:\n  level:\n    com.xkcoding: "
  },
  {
    "path": "demo-cache-ehcache/src/main/resources/ehcache.xml",
    "chars": 1105,
    "preview": "<!-- ehcache配置 -->\n<ehcache\n        xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\"\n        xsi:noNamespaceSchemaL"
  },
  {
    "path": "demo-cache-ehcache/src/test/java/com/xkcoding/cache/ehcache/SpringBootDemoCacheEhcacheApplicationTests.java",
    "chars": 372,
    "preview": "package com.xkcoding.cache.ehcache;\n\nimport org.junit.Test;\nimport org.junit.runner.RunWith;\nimport org.springframework."
  },
  {
    "path": "demo-cache-ehcache/src/test/java/com/xkcoding/cache/ehcache/service/UserServiceTest.java",
    "chars": 1346,
    "preview": "package com.xkcoding.cache.ehcache.service;\n\nimport com.xkcoding.cache.ehcache.SpringBootDemoCacheEhcacheApplicationTest"
  },
  {
    "path": "demo-cache-redis/.gitignore",
    "chars": 268,
    "preview": "/target/\n!.mvn/wrapper/maven-wrapper.jar\n\n### STS ###\n.apt_generated\n.classpath\n.factorypath\n.project\n.settings\n.springB"
  },
  {
    "path": "demo-cache-redis/README.md",
    "chars": 8658,
    "preview": "# spring-boot-demo-cache-redis\n\n> 此 demo 主要演示了 Spring Boot 如何整合 redis,操作redis中的数据,并使用redis缓存数据。连接池使用  Lettuce。\n\n## pom.x"
  },
  {
    "path": "demo-cache-redis/pom.xml",
    "chars": 2569,
    "preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<project xmlns=\"http://maven.apache.org/POM/4.0.0\" xmlns:xsi=\"http://www.w3.org/2"
  },
  {
    "path": "demo-cache-redis/src/main/java/com/xkcoding/cache/redis/SpringBootDemoCacheRedisApplication.java",
    "chars": 364,
    "preview": "package com.xkcoding.cache.redis;\n\nimport org.springframework.boot.SpringApplication;\nimport org.springframework.boot.au"
  },
  {
    "path": "demo-cache-redis/src/main/java/com/xkcoding/cache/redis/config/RedisConfig.java",
    "chars": 2405,
    "preview": "package com.xkcoding.cache.redis.config;\n\nimport org.springframework.boot.autoconfigure.AutoConfigureAfter;\nimport org.s"
  },
  {
    "path": "demo-cache-redis/src/main/java/com/xkcoding/cache/redis/entity/User.java",
    "chars": 517,
    "preview": "package com.xkcoding.cache.redis.entity;\n\nimport lombok.AllArgsConstructor;\nimport lombok.Data;\nimport lombok.NoArgsCons"
  },
  {
    "path": "demo-cache-redis/src/main/java/com/xkcoding/cache/redis/service/UserService.java",
    "chars": 523,
    "preview": "package com.xkcoding.cache.redis.service;\n\nimport com.xkcoding.cache.redis.entity.User;\n\n/**\n * <p>\n * UserService\n * </"
  },
  {
    "path": "demo-cache-redis/src/main/java/com/xkcoding/cache/redis/service/impl/UserServiceImpl.java",
    "chars": 1724,
    "preview": "package com.xkcoding.cache.redis.service.impl;\n\nimport com.google.common.collect.Maps;\nimport com.xkcoding.cache.redis.e"
  },
  {
    "path": "demo-cache-redis/src/main/resources/application.yml",
    "chars": 490,
    "preview": "spring:\n  redis:\n    host: localhost\n    # 连接超时时间(记得添加单位,Duration)\n    timeout: 10000ms\n    # Redis默认情况下有16个分片,这里配置具体使用的"
  },
  {
    "path": "demo-cache-redis/src/test/java/com/xkcoding/cache/redis/RedisTest.java",
    "chars": 1586,
    "preview": "package com.xkcoding.cache.redis;\n\nimport com.xkcoding.cache.redis.entity.User;\nimport lombok.extern.slf4j.Slf4j;\nimport"
  },
  {
    "path": "demo-cache-redis/src/test/java/com/xkcoding/cache/redis/SpringBootDemoCacheRedisApplicationTests.java",
    "chars": 368,
    "preview": "package com.xkcoding.cache.redis;\n\nimport org.junit.Test;\nimport org.junit.runner.RunWith;\nimport org.springframework.bo"
  },
  {
    "path": "demo-cache-redis/src/test/java/com/xkcoding/cache/redis/service/UserServiceTest.java",
    "chars": 1332,
    "preview": "package com.xkcoding.cache.redis.service;\n\nimport com.xkcoding.cache.redis.SpringBootDemoCacheRedisApplicationTests;\nimp"
  },
  {
    "path": "demo-codegen/.gitignore",
    "chars": 295,
    "preview": "/target/\n!.mvn/wrapper/maven-wrapper.jar\n\n### STS ###\n.apt_generated\n.classpath\n.factorypath\n.project\n.settings\n.springB"
  },
  {
    "path": "demo-codegen/README.md",
    "chars": 13372,
    "preview": "# spring-boot-demo-codegen\n\n> 此 demo 主要演示了 Spring Boot 使用**模板技术**生成代码,并提供前端页面,可生成 Entity/Mapper/Service/Controller 等代码。\n"
  },
  {
    "path": "demo-codegen/pom.xml",
    "chars": 2732,
    "preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<project xmlns=\"http://maven.apache.org/POM/4.0.0\" xmlns:xsi=\"http://www.w3.org/2"
  },
  {
    "path": "demo-codegen/src/main/java/com/xkcoding/codegen/SpringBootDemoCodegenApplication.java",
    "chars": 449,
    "preview": "package com.xkcoding.codegen;\n\nimport org.springframework.boot.SpringApplication;\nimport org.springframework.boot.autoco"
  },
  {
    "path": "demo-codegen/src/main/java/com/xkcoding/codegen/common/IResultCode.java",
    "chars": 330,
    "preview": "package com.xkcoding.codegen.common;\n\n/**\n * <p>\n * 统一状态码接口\n * </p>\n *\n * @author yangkai.shen\n * @date Created in 2019-"
  },
  {
    "path": "demo-codegen/src/main/java/com/xkcoding/codegen/common/PageResult.java",
    "chars": 486,
    "preview": "package com.xkcoding.codegen.common;\n\nimport lombok.AllArgsConstructor;\nimport lombok.Data;\n\nimport java.util.List;\n\n/**"
  },
  {
    "path": "demo-codegen/src/main/java/com/xkcoding/codegen/common/R.java",
    "chars": 1944,
    "preview": "package com.xkcoding.codegen.common;\n\nimport lombok.Data;\nimport lombok.NoArgsConstructor;\n\n/**\n * <p>\n * 统一API对象返回\n * <"
  },
  {
    "path": "demo-codegen/src/main/java/com/xkcoding/codegen/common/ResultCode.java",
    "chars": 533,
    "preview": "package com.xkcoding.codegen.common;\n\nimport lombok.Getter;\n\n/**\n * <p>\n * 通用状态枚举\n * </p>\n *\n * @author yangkai.shen\n * "
  },
  {
    "path": "demo-codegen/src/main/java/com/xkcoding/codegen/constants/GenConstants.java",
    "chars": 234,
    "preview": "package com.xkcoding.codegen.constants;\n\n/**\n * <p>\n * 常量池\n * </p>\n *\n * @author yangkai.shen\n * @date Created in 2019-0"
  },
  {
    "path": "demo-codegen/src/main/java/com/xkcoding/codegen/controller/CodeGenController.java",
    "chars": 1559,
    "preview": "package com.xkcoding.codegen.controller;\n\nimport cn.hutool.core.io.IoUtil;\nimport com.xkcoding.codegen.common.R;\nimport "
  },
  {
    "path": "demo-codegen/src/main/java/com/xkcoding/codegen/entity/ColumnEntity.java",
    "chars": 707,
    "preview": "package com.xkcoding.codegen.entity;\n\nimport lombok.Data;\n\n/**\n * <p>\n * 列属性: https://blog.csdn.net/lkforce/article/deta"
  },
  {
    "path": "demo-codegen/src/main/java/com/xkcoding/codegen/entity/GenConfig.java",
    "chars": 591,
    "preview": "package com.xkcoding.codegen.entity;\n\nimport lombok.Data;\n\n/**\n * <p>\n * 生成配置\n * </p>\n *\n * @author yangkai.shen\n * @dat"
  },
  {
    "path": "demo-codegen/src/main/java/com/xkcoding/codegen/entity/TableEntity.java",
    "chars": 625,
    "preview": "package com.xkcoding.codegen.entity;\n\nimport lombok.Data;\n\nimport java.util.List;\n\n/**\n * <p>\n * 表属性: https://blog.csdn."
  },
  {
    "path": "demo-codegen/src/main/java/com/xkcoding/codegen/entity/TableRequest.java",
    "chars": 592,
    "preview": "package com.xkcoding.codegen.entity;\n\nimport lombok.Data;\n\n/**\n * <p>\n * 表格请求参数\n * </p>\n *\n * @author yangkai.shen\n * @d"
  },
  {
    "path": "demo-codegen/src/main/java/com/xkcoding/codegen/service/CodeGenService.java",
    "chars": 620,
    "preview": "package com.xkcoding.codegen.service;\n\nimport cn.hutool.db.Entity;\nimport com.xkcoding.codegen.common.PageResult;\nimport"
  },
  {
    "path": "demo-codegen/src/main/java/com/xkcoding/codegen/service/impl/CodeGenServiceImpl.java",
    "chars": 4493,
    "preview": "package com.xkcoding.codegen.service.impl;\n\nimport cn.hutool.core.io.IoUtil;\nimport cn.hutool.core.util.StrUtil;\nimport "
  },
  {
    "path": "demo-codegen/src/main/java/com/xkcoding/codegen/utils/CodeGenUtil.java",
    "chars": 9772,
    "preview": "package com.xkcoding.codegen.utils;\n\nimport cn.hutool.core.date.DateUtil;\nimport cn.hutool.core.io.IoUtil;\nimport cn.hut"
  },
  {
    "path": "demo-codegen/src/main/java/com/xkcoding/codegen/utils/DbUtil.java",
    "chars": 699,
    "preview": "package com.xkcoding.codegen.utils;\n\nimport com.xkcoding.codegen.entity.TableRequest;\nimport com.zaxxer.hikari.HikariDat"
  },
  {
    "path": "demo-codegen/src/main/resources/application.yml",
    "chars": 55,
    "preview": "server:\n  port: 8080\n  servlet:\n    context-path: /demo"
  },
  {
    "path": "demo-codegen/src/main/resources/generator.properties",
    "chars": 625,
    "preview": "#\\u4EE3\\u7801\\u751F\\u6210\\u5668\\uFF0C\\u914D\\u7F6E\\u4FE1\\u606F\nmainPath=com.xkcoding\n#\\u5305\\u540D\npackage=com.xkcoding\nm"
  },
  {
    "path": "demo-codegen/src/main/resources/jdbc_type.properties",
    "chars": 314,
    "preview": "tinyint=TINYINT\nsmallint=SMALLINT\nmediumint=MEDIUMINT\nint=INTEGER\ninteger=INTEGER\nbigint=BIGINT\nfloat=FLOAT\ndouble=DOUBL"
  },
  {
    "path": "demo-codegen/src/main/resources/logback-spring.xml",
    "chars": 3516,
    "preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<configuration>\n  <property name=\"FILE_ERROR_PATTERN\"\n            value=\"${FILE_L"
  },
  {
    "path": "demo-codegen/src/main/resources/static/index.html",
    "chars": 11669,
    "preview": "<!DOCTYPE html>\n<html>\n<head>\n    <meta charset=\"utf-8\">\n    <title>代码生成器</title>\n    <!-- import Vue.js -->\n    <script"
  },
  {
    "path": "demo-codegen/src/main/resources/static/libs/datejs/date-zh-CN.js",
    "chars": 30350,
    "preview": "/**\n * @version: 1.0 Alpha-1\n * @author Coolite Inc. http://www.coolite.com/\n * @date: 2008-05-13\n * @copyright: Copyrig"
  },
  {
    "path": "demo-codegen/src/main/resources/static/libs/iview/iview.css",
    "chars": 308454,
    "preview": ".ivu-load-loop{-webkit-animation:ani-load-loop 1s linear infinite;animation:ani-load-loop 1s linear infinite}@-webkit-ke"
  },
  {
    "path": "demo-codegen/src/main/resources/template/Controller.java.vm",
    "chars": 3453,
    "preview": "package ${package}.${moduleName}.controller;\n\nimport com.baomidou.mybatisplus.core.toolkit.Wrappers;\nimport com.baomidou"
  },
  {
    "path": "demo-codegen/src/main/resources/template/Entity.java.vm",
    "chars": 1057,
    "preview": "package ${package}.${moduleName}.entity;\n\nimport com.baomidou.mybatisplus.annotation.TableId;\nimport com.baomidou.mybati"
  },
  {
    "path": "demo-codegen/src/main/resources/template/Mapper.java.vm",
    "chars": 380,
    "preview": "package ${package}.${moduleName}.mapper;\n\nimport com.baomidou.mybatisplus.core.mapper.BaseMapper;\nimport org.springframe"
  },
  {
    "path": "demo-codegen/src/main/resources/template/Mapper.xml.vm",
    "chars": 645,
    "preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE mapper PUBLIC \"-//mybatis.org//DTD Mapper 3.0//EN\" \"http://mybatis.org/"
  },
  {
    "path": "demo-codegen/src/main/resources/template/Service.java.vm",
    "chars": 324,
    "preview": "package ${package}.${moduleName}.service;\n\nimport com.baomidou.mybatisplus.extension.service.IService;\nimport ${package}"
  },
  {
    "path": "demo-codegen/src/main/resources/template/ServiceImpl.java.vm",
    "chars": 607,
    "preview": "package ${package}.${moduleName}.service.impl;\n\nimport com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;\nimpo"
  },
  {
    "path": "demo-codegen/src/main/resources/template/api.js.vm",
    "chars": 943,
    "preview": "import request from '@/router/axios'\n\n/**\n * 分页查询${comments}\n * @param query 分页查询条件\n */\nexport function fetchList(query)"
  },
  {
    "path": "demo-codegen/src/test/java/com/xkcoding/codegen/CodeGenServiceTest.java",
    "chars": 2313,
    "preview": "package com.xkcoding.codegen;\n\nimport cn.hutool.core.io.IoUtil;\nimport cn.hutool.db.Entity;\nimport com.xkcoding.codegen."
  },
  {
    "path": "demo-codegen/src/test/java/com/xkcoding/codegen/SpringBootDemoCodegenApplicationTests.java",
    "chars": 361,
    "preview": "package com.xkcoding.codegen;\n\nimport org.junit.Test;\nimport org.junit.runner.RunWith;\nimport org.springframework.boot.t"
  },
  {
    "path": "demo-docker/.gitignore",
    "chars": 268,
    "preview": "/target/\n!.mvn/wrapper/maven-wrapper.jar\n\n### STS ###\n.apt_generated\n.classpath\n.factorypath\n.project\n.settings\n.springB"
  },
  {
    "path": "demo-docker/Dockerfile",
    "chars": 359,
    "preview": "# 基础镜像\nFROM openjdk:8-jdk-alpine\n\n# 作者信息\nMAINTAINER \"Yangkai.Shen 237497819@qq.com\"\n\n# 添加一个存储空间\nVOLUME /tmp\n\n# 暴露8080端口\n"
  },
  {
    "path": "demo-docker/README.md",
    "chars": 2950,
    "preview": "# spring-boot-demo-docker\n\n> 本 demo 主要演示了如何容器化一个  Spring Boot 项目。通过 `Dockerfile` 的方式打包成一个 images 。\n\n## Dockerfile\n\n```do"
  },
  {
    "path": "demo-docker/pom.xml",
    "chars": 2645,
    "preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<project xmlns=\"http://maven.apache.org/POM/4.0.0\" xmlns:xsi=\"http://www.w3.org/2"
  },
  {
    "path": "demo-docker/src/main/java/com/xkcoding/docker/SpringBootDemoDockerApplication.java",
    "chars": 445,
    "preview": "package com.xkcoding.docker;\n\nimport org.springframework.boot.SpringApplication;\nimport org.springframework.boot.autocon"
  },
  {
    "path": "demo-docker/src/main/java/com/xkcoding/docker/controller/HelloController.java",
    "chars": 486,
    "preview": "package com.xkcoding.docker.controller;\n\nimport org.springframework.web.bind.annotation.GetMapping;\nimport org.springfra"
  },
  {
    "path": "demo-docker/src/main/resources/application.yml",
    "chars": 55,
    "preview": "server:\n  port: 8080\n  servlet:\n    context-path: /demo"
  },
  {
    "path": "demo-docker/src/test/java/com/xkcoding/docker/SpringBootDemoDockerApplicationTests.java",
    "chars": 359,
    "preview": "package com.xkcoding.docker;\n\nimport org.junit.Test;\nimport org.junit.runner.RunWith;\nimport org.springframework.boot.te"
  },
  {
    "path": "demo-dubbo/.gitignore",
    "chars": 268,
    "preview": "/target/\n!.mvn/wrapper/maven-wrapper.jar\n\n### STS ###\n.apt_generated\n.classpath\n.factorypath\n.project\n.settings\n.springB"
  },
  {
    "path": "demo-dubbo/README.md",
    "chars": 2401,
    "preview": "# spring-boot-demo-dubbo\n\n> 此 demo 主要演示了 Spring Boot 如何集成 Dubbo,demo 分了3个module,分别为公共模块 `spring-boot-demo-dubbo-common`、"
  },
  {
    "path": "demo-dubbo/dubbo-common/.gitignore",
    "chars": 268,
    "preview": "/target/\n!.mvn/wrapper/maven-wrapper.jar\n\n### STS ###\n.apt_generated\n.classpath\n.factorypath\n.project\n.settings\n.springB"
  },
  {
    "path": "demo-dubbo/dubbo-common/README.md",
    "chars": 1243,
    "preview": "# spring-boot-demo-dubbo-common\n\n> 此 module 主要是用于公共部分,主要存放工具类,实体,以及服务提供方/调用方的接口定义\n\n## pom.xml\n\n```xml\n<?xml version=\"1.0"
  },
  {
    "path": "demo-dubbo/dubbo-common/pom.xml",
    "chars": 810,
    "preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<project xmlns=\"http://maven.apache.org/POM/4.0.0\"\n         xmlns:xsi=\"http://www"
  },
  {
    "path": "demo-dubbo/dubbo-common/src/main/java/com/xkcoding/dubbo/common/service/HelloService.java",
    "chars": 285,
    "preview": "package com.xkcoding.dubbo.common.service;\n\n/**\n * <p>\n * Hello服务接口\n * </p>\n *\n * @author yangkai.shen\n * @date Created "
  },
  {
    "path": "demo-dubbo/dubbo-consumer/.gitignore",
    "chars": 268,
    "preview": "/target/\n!.mvn/wrapper/maven-wrapper.jar\n\n### STS ###\n.apt_generated\n.classpath\n.factorypath\n.project\n.settings\n.springB"
  },
  {
    "path": "demo-dubbo/dubbo-consumer/README.md",
    "chars": 3198,
    "preview": "# spring-boot-demo-dubbo-consumer\n\n> 此 module 主要是服务调用方的示例\n\n## pom.xml\n\n```xml\n<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<pr"
  },
  {
    "path": "demo-dubbo/dubbo-consumer/pom.xml",
    "chars": 1954,
    "preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<project xmlns=\"http://maven.apache.org/POM/4.0.0\"\n         xmlns:xsi=\"http://www"
  },
  {
    "path": "demo-dubbo/dubbo-consumer/src/main/java/com/xkcoding/dubbo/consumer/SpringBootDemoDubboConsumerApplication.java",
    "chars": 567,
    "preview": "package com.xkcoding.dubbo.consumer;\n\nimport com.alibaba.dubbo.spring.boot.annotation.EnableDubboConfiguration;\nimport o"
  },
  {
    "path": "demo-dubbo/dubbo-consumer/src/main/java/com/xkcoding/dubbo/consumer/controller/HelloController.java",
    "chars": 803,
    "preview": "package com.xkcoding.dubbo.consumer.controller;\n\nimport com.alibaba.dubbo.config.annotation.Reference;\nimport com.xkcodi"
  },
  {
    "path": "demo-dubbo/dubbo-consumer/src/main/resources/application.yml",
    "chars": 177,
    "preview": "server:\n  port: 8080\n  servlet:\n    context-path: /demo\n\nspring:\n  dubbo:\n    application:\n      name: spring-boot-demo-"
  },
  {
    "path": "demo-dubbo/dubbo-consumer/src/test/java/com/xkcoding/dubbo/consumer/SpringBootDemoDubboConsumerApplicationTests.java",
    "chars": 374,
    "preview": "package com.xkcoding.dubbo.consumer;\n\nimport org.junit.Test;\nimport org.junit.runner.RunWith;\nimport org.springframework"
  },
  {
    "path": "demo-dubbo/dubbo-provider/.gitignore",
    "chars": 268,
    "preview": "/target/\n!.mvn/wrapper/maven-wrapper.jar\n\n### STS ###\n.apt_generated\n.classpath\n.factorypath\n.project\n.settings\n.springB"
  },
  {
    "path": "demo-dubbo/dubbo-provider/README.md",
    "chars": 3181,
    "preview": "# spring-boot-demo-dubbo-provider\n\n> 此 module 主要是服务提供方示例\n\n## pom.xml\n\n```xml\n<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<pro"
  },
  {
    "path": "demo-dubbo/dubbo-provider/pom.xml",
    "chars": 1954,
    "preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<project xmlns=\"http://maven.apache.org/POM/4.0.0\"\n         xmlns:xsi=\"http://www"
  },
  {
    "path": "demo-dubbo/dubbo-provider/src/main/java/com/xkcoding/dubbo/provider/SpringBootDemoDubboProviderApplication.java",
    "chars": 567,
    "preview": "package com.xkcoding.dubbo.provider;\n\nimport com.alibaba.dubbo.spring.boot.annotation.EnableDubboConfiguration;\nimport o"
  },
  {
    "path": "demo-dubbo/dubbo-provider/src/main/java/com/xkcoding/dubbo/provider/service/HelloServiceImpl.java",
    "chars": 646,
    "preview": "package com.xkcoding.dubbo.provider.service;\n\nimport com.alibaba.dubbo.config.annotation.Service;\nimport com.xkcoding.du"
  },
  {
    "path": "demo-dubbo/dubbo-provider/src/main/resources/application.yml",
    "chars": 177,
    "preview": "server:\n  port: 9090\n  servlet:\n    context-path: /demo\n\nspring:\n  dubbo:\n    application:\n      name: spring-boot-demo-"
  },
  {
    "path": "demo-dubbo/dubbo-provider/src/test/java/com/xkcoding/dubbo/provider/SpringBootDemoDubboProviderApplicationTests.java",
    "chars": 374,
    "preview": "package com.xkcoding.dubbo.provider;\n\nimport org.junit.Test;\nimport org.junit.runner.RunWith;\nimport org.springframework"
  },
  {
    "path": "demo-dubbo/pom.xml",
    "chars": 1138,
    "preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<project xmlns=\"http://maven.apache.org/POM/4.0.0\" xmlns:xsi=\"http://www.w3.org/2"
  },
  {
    "path": "demo-dynamic-datasource/.gitignore",
    "chars": 333,
    "preview": "HELP.md\ntarget/\n!.mvn/wrapper/maven-wrapper.jar\n!**/src/main/**\n!**/src/test/**\n\n### STS ###\n.apt_generated\n.classpath\n."
  },
  {
    "path": "demo-dynamic-datasource/README.md",
    "chars": 15677,
    "preview": "# spring-boot-demo-dynamic-datasource\n\n> 此 demo 主要演示了 Spring Boot 项目如何通过接口`动态添加/删除`数据源,添加数据源之后如何`动态切换`数据源,然后使用 mybatis 查"
  },
  {
    "path": "demo-dynamic-datasource/db/init.sql",
    "chars": 769,
    "preview": "CREATE TABLE IF NOT EXISTS `datasource_config`\n(\n    `id`       bigint(13)   NOT NULL AUTO_INCREMENT COMMENT '主键',\n    `"
  },
  {
    "path": "demo-dynamic-datasource/db/user.sql",
    "chars": 650,
    "preview": "CREATE TABLE IF NOT EXISTS `test_user`\n(\n    `id`   bigint(13)   NOT NULL AUTO_INCREMENT COMMENT '主键',\n    `name` varcha"
  },
  {
    "path": "demo-dynamic-datasource/pom.xml",
    "chars": 2071,
    "preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<project xmlns=\"http://maven.apache.org/POM/4.0.0\" xmlns:xsi=\"http://www.w3.org/2"
  },
  {
    "path": "demo-dynamic-datasource/src/main/java/com/xkcoding/dynamic/datasource/SpringBootDemoDynamicDatasourceApplication.java",
    "chars": 1520,
    "preview": "package com.xkcoding.dynamic.datasource;\n\nimport com.xkcoding.dynamic.datasource.datasource.DatasourceConfigCache;\nimpor"
  },
  {
    "path": "demo-dynamic-datasource/src/main/java/com/xkcoding/dynamic/datasource/annotation/DefaultDatasource.java",
    "chars": 308,
    "preview": "package com.xkcoding.dynamic.datasource.annotation;\n\nimport java.lang.annotation.*;\n\n/**\n * <p>\n * 用户标识仅可以使用默认数据源\n * </p"
  },
  {
    "path": "demo-dynamic-datasource/src/main/java/com/xkcoding/dynamic/datasource/aspect/DatasourceSelectorAspect.java",
    "chars": 2742,
    "preview": "package com.xkcoding.dynamic.datasource.aspect;\n\nimport com.xkcoding.dynamic.datasource.annotation.DefaultDatasource;\nim"
  },
  {
    "path": "demo-dynamic-datasource/src/main/java/com/xkcoding/dynamic/datasource/config/DatasourceConfiguration.java",
    "chars": 835,
    "preview": "package com.xkcoding.dynamic.datasource.config;\n\nimport com.xkcoding.dynamic.datasource.datasource.DynamicDataSource;\nim"
  },
  {
    "path": "demo-dynamic-datasource/src/main/java/com/xkcoding/dynamic/datasource/config/MyMapper.java",
    "chars": 384,
    "preview": "package com.xkcoding.dynamic.datasource.config;\n\nimport tk.mybatis.mapper.annotation.RegisterMapper;\nimport tk.mybatis.m"
  },
  {
    "path": "demo-dynamic-datasource/src/main/java/com/xkcoding/dynamic/datasource/config/MybatisConfiguration.java",
    "chars": 1087,
    "preview": "package com.xkcoding.dynamic.datasource.config;\n\nimport lombok.SneakyThrows;\nimport org.apache.ibatis.session.SqlSession"
  },
  {
    "path": "demo-dynamic-datasource/src/main/java/com/xkcoding/dynamic/datasource/controller/DatasourceConfigController.java",
    "chars": 1319,
    "preview": "package com.xkcoding.dynamic.datasource.controller;\n\nimport com.xkcoding.dynamic.datasource.annotation.DefaultDatasource"
  },
  {
    "path": "demo-dynamic-datasource/src/main/java/com/xkcoding/dynamic/datasource/controller/UserController.java",
    "chars": 798,
    "preview": "package com.xkcoding.dynamic.datasource.controller;\n\nimport com.xkcoding.dynamic.datasource.mapper.UserMapper;\nimport co"
  },
  {
    "path": "demo-dynamic-datasource/src/main/java/com/xkcoding/dynamic/datasource/datasource/DatasourceConfigCache.java",
    "chars": 1198,
    "preview": "package com.xkcoding.dynamic.datasource.datasource;\n\nimport com.xkcoding.dynamic.datasource.model.DatasourceConfig;\n\nimp"
  },
  {
    "path": "demo-dynamic-datasource/src/main/java/com/xkcoding/dynamic/datasource/datasource/DatasourceConfigContextHolder.java",
    "chars": 845,
    "preview": "package com.xkcoding.dynamic.datasource.datasource;\n\n/**\n * <p>\n * 数据源标识管理\n * </p>\n *\n * @author yangkai.shen\n * @date C"
  },
  {
    "path": "demo-dynamic-datasource/src/main/java/com/xkcoding/dynamic/datasource/datasource/DatasourceHolder.java",
    "chars": 2104,
    "preview": "package com.xkcoding.dynamic.datasource.datasource;\n\nimport com.zaxxer.hikari.HikariDataSource;\n\nimport java.util.Map;\ni"
  },
  {
    "path": "demo-dynamic-datasource/src/main/java/com/xkcoding/dynamic/datasource/datasource/DatasourceManager.java",
    "chars": 1113,
    "preview": "package com.xkcoding.dynamic.datasource.datasource;\n\nimport com.zaxxer.hikari.HikariDataSource;\nimport lombok.Getter;\n\ni"
  },
  {
    "path": "demo-dynamic-datasource/src/main/java/com/xkcoding/dynamic/datasource/datasource/DatasourceScheduler.java",
    "chars": 1095,
    "preview": "package com.xkcoding.dynamic.datasource.datasource;\n\nimport java.util.concurrent.ScheduledExecutorService;\nimport java.u"
  },
  {
    "path": "demo-dynamic-datasource/src/main/java/com/xkcoding/dynamic/datasource/datasource/DynamicDataSource.java",
    "chars": 2314,
    "preview": "package com.xkcoding.dynamic.datasource.datasource;\n\nimport com.xkcoding.dynamic.datasource.model.DatasourceConfig;\nimpo"
  },
  {
    "path": "demo-dynamic-datasource/src/main/java/com/xkcoding/dynamic/datasource/mapper/DatasourceConfigMapper.java",
    "chars": 404,
    "preview": "package com.xkcoding.dynamic.datasource.mapper;\n\nimport com.xkcoding.dynamic.datasource.config.MyMapper;\nimport com.xkco"
  },
  {
    "path": "demo-dynamic-datasource/src/main/java/com/xkcoding/dynamic/datasource/mapper/UserMapper.java",
    "chars": 365,
    "preview": "package com.xkcoding.dynamic.datasource.mapper;\n\nimport com.xkcoding.dynamic.datasource.config.MyMapper;\nimport com.xkco"
  },
  {
    "path": "demo-dynamic-datasource/src/main/java/com/xkcoding/dynamic/datasource/model/DatasourceConfig.java",
    "chars": 1251,
    "preview": "package com.xkcoding.dynamic.datasource.model;\n\nimport lombok.Data;\n\nimport javax.persistence.Column;\nimport javax.persi"
  },
  {
    "path": "demo-dynamic-datasource/src/main/java/com/xkcoding/dynamic/datasource/model/User.java",
    "chars": 609,
    "preview": "package com.xkcoding.dynamic.datasource.model;\n\nimport lombok.Data;\n\nimport javax.persistence.Column;\nimport javax.persi"
  },
  {
    "path": "demo-dynamic-datasource/src/main/java/com/xkcoding/dynamic/datasource/utils/SpringUtil.java",
    "chars": 2154,
    "preview": "package com.xkcoding.dynamic.datasource.utils;\n\nimport lombok.extern.slf4j.Slf4j;\nimport org.springframework.beans.facto"
  },
  {
    "path": "demo-dynamic-datasource/src/main/resources/application.yml",
    "chars": 271,
    "preview": "server:\n  port: 8080\n  servlet:\n    context-path: /demo\nspring:\n  datasource:\n    url: jdbc:mysql://127.0.0.1:3306/sprin"
  },
  {
    "path": "demo-dynamic-datasource/src/test/java/com/xkcoding/dynamic/datasource/SpringBootDemoDynamicDatasourceApplicationTests.java",
    "chars": 382,
    "preview": "package com.xkcoding.dynamic.datasource;\n\nimport org.junit.Test;\nimport org.junit.runner.RunWith;\nimport org.springframe"
  },
  {
    "path": "demo-elasticsearch/.gitignore",
    "chars": 268,
    "preview": "/target/\n!.mvn/wrapper/maven-wrapper.jar\n\n### STS ###\n.apt_generated\n.classpath\n.factorypath\n.project\n.settings\n.springB"
  },
  {
    "path": "demo-elasticsearch/README.md",
    "chars": 12831,
    "preview": "# spring-boot-demo-elasticsearch\n\n> 此 demo 主要演示了 Spring Boot 如何集成 `spring-boot-starter-data-elasticsearch` 完成对 ElasticSe"
  },
  {
    "path": "demo-elasticsearch/pom.xml",
    "chars": 2205,
    "preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<project xmlns=\"http://maven.apache.org/POM/4.0.0\" xmlns:xsi=\"http://www.w3.org/2"
  },
  {
    "path": "demo-elasticsearch/src/main/java/com/xkcoding/elasticsearch/SpringBootDemoElasticsearchApplication.java",
    "chars": 467,
    "preview": "package com.xkcoding.elasticsearch;\n\nimport org.springframework.boot.SpringApplication;\nimport org.springframework.boot."
  },
  {
    "path": "demo-elasticsearch/src/main/java/com/xkcoding/elasticsearch/constants/EsConsts.java",
    "chars": 297,
    "preview": "package com.xkcoding.elasticsearch.constants;\n\n/**\n * <p>\n * ES常量池\n * </p>\n *\n * @author yangkai.shen\n * @date Created i"
  },
  {
    "path": "demo-elasticsearch/src/main/java/com/xkcoding/elasticsearch/model/Person.java",
    "chars": 1243,
    "preview": "package com.xkcoding.elasticsearch.model;\n\nimport com.xkcoding.elasticsearch.constants.EsConsts;\nimport lombok.AllArgsCo"
  },
  {
    "path": "demo-elasticsearch/src/main/java/com/xkcoding/elasticsearch/repository/PersonRepository.java",
    "chars": 553,
    "preview": "package com.xkcoding.elasticsearch.repository;\n\nimport com.xkcoding.elasticsearch.model.Person;\nimport org.springframewo"
  },
  {
    "path": "demo-elasticsearch/src/main/resources/application.yml",
    "chars": 105,
    "preview": "spring:\n  data:\n    elasticsearch:\n      cluster-name: docker-cluster\n      cluster-nodes: localhost:9300"
  },
  {
    "path": "demo-elasticsearch/src/test/java/com/xkcoding/elasticsearch/SpringBootDemoElasticsearchApplicationTests.java",
    "chars": 373,
    "preview": "package com.xkcoding.elasticsearch;\n\nimport org.junit.Test;\nimport org.junit.runner.RunWith;\nimport org.springframework."
  },
  {
    "path": "demo-elasticsearch/src/test/java/com/xkcoding/elasticsearch/repository/PersonRepositoryTest.java",
    "chars": 8291,
    "preview": "package com.xkcoding.elasticsearch.repository;\n\nimport cn.hutool.core.date.DateUtil;\nimport cn.hutool.json.JSONUtil;\nimp"
  },
  {
    "path": "demo-elasticsearch/src/test/java/com/xkcoding/elasticsearch/template/TemplateTest.java",
    "chars": 1026,
    "preview": "package com.xkcoding.elasticsearch.template;\n\nimport com.xkcoding.elasticsearch.SpringBootDemoElasticsearchApplicationTe"
  },
  {
    "path": "demo-elasticsearch-rest-high-level-client/.gitignore",
    "chars": 268,
    "preview": "/target/\n!.mvn/wrapper/maven-wrapper.jar\n\n### STS ###\n.apt_generated\n.classpath\n.factorypath\n.project\n.settings\n.springB"
  },
  {
    "path": "demo-elasticsearch-rest-high-level-client/README.md",
    "chars": 12240,
    "preview": "# spring-boot-demo-elasticsearch-rest-high-level-client\n\n> 此 demo 主要演示了 Spring Boot 如何集成 `elasticsearch-rest-high-level-"
  },
  {
    "path": "demo-elasticsearch-rest-high-level-client/pom.xml",
    "chars": 3332,
    "preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<project xmlns=\"http://maven.apache.org/POM/4.0.0\"\n         xmlns:xsi=\"http://www"
  },
  {
    "path": "demo-elasticsearch-rest-high-level-client/src/main/java/com/xkcoding/elasticsearch/ElasticsearchApplication.java",
    "chars": 445,
    "preview": "package com.xkcoding.elasticsearch;\n\nimport org.springframework.boot.SpringApplication;\nimport org.springframework.boot."
  },
  {
    "path": "demo-elasticsearch-rest-high-level-client/src/main/java/com/xkcoding/elasticsearch/common/Result.java",
    "chars": 1431,
    "preview": "package com.xkcoding.elasticsearch.common;\n\nimport lombok.Data;\nimport org.springframework.lang.Nullable;\n\nimport java.i"
  },
  {
    "path": "demo-elasticsearch-rest-high-level-client/src/main/java/com/xkcoding/elasticsearch/common/ResultCode.java",
    "chars": 439,
    "preview": "package com.xkcoding.elasticsearch.common;\n\nimport lombok.AllArgsConstructor;\nimport lombok.Getter;\n\n/**\n * ResultCode\n "
  },
  {
    "path": "demo-elasticsearch-rest-high-level-client/src/main/java/com/xkcoding/elasticsearch/config/ElasticsearchAutoConfiguration.java",
    "chars": 4172,
    "preview": "package com.xkcoding.elasticsearch.config;\n\nimport lombok.RequiredArgsConstructor;\nimport org.apache.http.HttpHost;\nimpo"
  },
  {
    "path": "demo-elasticsearch-rest-high-level-client/src/main/java/com/xkcoding/elasticsearch/config/ElasticsearchProperties.java",
    "chars": 1933,
    "preview": "package com.xkcoding.elasticsearch.config;\n\nimport lombok.AllArgsConstructor;\nimport lombok.Builder;\nimport lombok.Data;"
  },
  {
    "path": "demo-elasticsearch-rest-high-level-client/src/main/java/com/xkcoding/elasticsearch/contants/ElasticsearchConstant.java",
    "chars": 250,
    "preview": "package com.xkcoding.elasticsearch.contants;\n\n/**\n * ElasticsearchConstant\n *\n * @author fxbin\n * @version v1.0\n * @sinc"
  },
  {
    "path": "demo-elasticsearch-rest-high-level-client/src/main/java/com/xkcoding/elasticsearch/exception/ElasticsearchException.java",
    "chars": 1120,
    "preview": "package com.xkcoding.elasticsearch.exception;\n\nimport com.xkcoding.elasticsearch.common.ResultCode;\nimport lombok.Getter"
  },
  {
    "path": "demo-elasticsearch-rest-high-level-client/src/main/java/com/xkcoding/elasticsearch/model/Person.java",
    "chars": 779,
    "preview": "package com.xkcoding.elasticsearch.model;\n\nimport lombok.AllArgsConstructor;\nimport lombok.Builder;\nimport lombok.Data;\n"
  },
  {
    "path": "demo-elasticsearch-rest-high-level-client/src/main/java/com/xkcoding/elasticsearch/service/PersonService.java",
    "chars": 1364,
    "preview": "package com.xkcoding.elasticsearch.service;\n\nimport com.xkcoding.elasticsearch.model.Person;\nimport org.springframework."
  },
  {
    "path": "demo-elasticsearch-rest-high-level-client/src/main/java/com/xkcoding/elasticsearch/service/base/BaseElasticsearchService.java",
    "chars": 5887,
    "preview": "package com.xkcoding.elasticsearch.service.base;\n\nimport cn.hutool.core.bean.BeanUtil;\nimport com.xkcoding.elasticsearch"
  },
  {
    "path": "demo-elasticsearch-rest-high-level-client/src/main/java/com/xkcoding/elasticsearch/service/impl/PersonServiceImpl.java",
    "chars": 2694,
    "preview": "package com.xkcoding.elasticsearch.service.impl;\n\nimport cn.hutool.core.bean.BeanUtil;\nimport com.xkcoding.elasticsearch"
  },
  {
    "path": "demo-elasticsearch-rest-high-level-client/src/main/resources/application.yml",
    "chars": 175,
    "preview": "demo:\n  data:\n    elasticsearch:\n      cluster-name: elasticsearch\n      cluster-nodes: 20.20.0.27:9200\n      index:\n   "
  },
  {
    "path": "demo-elasticsearch-rest-high-level-client/src/test/java/com/xkcoding/elasticsearch/ElasticsearchApplicationTests.java",
    "chars": 2293,
    "preview": "package com.xkcoding.elasticsearch;\n\nimport com.xkcoding.elasticsearch.contants.ElasticsearchConstant;\nimport com.xkcodi"
  },
  {
    "path": "demo-email/.gitignore",
    "chars": 268,
    "preview": "/target/\n!.mvn/wrapper/maven-wrapper.jar\n\n### STS ###\n.apt_generated\n.classpath\n.factorypath\n.project\n.settings\n.springB"
  },
  {
    "path": "demo-email/README.md",
    "chars": 12470,
    "preview": "# spring-boot-demo-email\n\n> 此 demo 主要演示了 Spring Boot 如何整合邮件功能,包括发送简单文本邮件、HTML邮件(包括模板HTML邮件)、附件邮件、静态资源邮件。\n\n## pom.xml\n\n``"
  },
  {
    "path": "demo-email/pom.xml",
    "chars": 2008,
    "preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<project xmlns=\"http://maven.apache.org/POM/4.0.0\" xmlns:xsi=\"http://www.w3.org/2"
  },
  {
    "path": "demo-email/src/main/java/com/xkcoding/email/SpringBootDemoEmailApplication.java",
    "chars": 442,
    "preview": "package com.xkcoding.email;\n\nimport org.springframework.boot.SpringApplication;\nimport org.springframework.boot.autoconf"
  },
  {
    "path": "demo-email/src/main/java/com/xkcoding/email/service/MailService.java",
    "chars": 1474,
    "preview": "package com.xkcoding.email.service;\n\nimport javax.mail.MessagingException;\n\n/**\n * <p>\n * 邮件接口\n * </p>\n *\n * @author yan"
  },
  {
    "path": "demo-email/src/main/java/com/xkcoding/email/service/impl/MailServiceImpl.java",
    "chars": 4050,
    "preview": "package com.xkcoding.email.service.impl;\n\nimport cn.hutool.core.util.ArrayUtil;\nimport com.xkcoding.email.service.MailSe"
  },
  {
    "path": "demo-email/src/main/resources/application.yml",
    "chars": 596,
    "preview": "spring:\n  mail:\n    host: smtp.mxhichina.com\n    port: 465\n    username: spring-boot-demo@xkcoding.com\n    # 使用 jasypt 加"
  }
]

// ... and 675 more files (download for full content)

About this extraction

This page contains the full source code of the xkcoding/spring-boot-demo GitHub repository, extracted and formatted as plain text for AI agents and large language models (LLMs). The extraction includes 875 files (2.0 MB), approximately 591.3k tokens, and a symbol index with 1828 extracted functions, classes, methods, constants, and types. Use this with OpenClaw, Claude, ChatGPT, Cursor, Windsurf, or any other AI tool that accepts text input. You can copy the full output to your clipboard or download it as a .txt file.

Extracted by GitExtract — free GitHub repo to text converter for AI. Built by Nikandr Surkov.

Copied to clipboard!