├── doc ├── db.png ├── api.png ├── flow.png ├── home.png ├── img.png ├── logo.png ├── sql.png ├── detail.png ├── login.png ├── param.png ├── dev_flow.png └── img_test.png ├── crabc-spring-boot-starter ├── src │ └── main │ │ ├── resources │ │ └── META-INF │ │ │ └── spring │ │ │ └── org.springframework.boot.autoconfigure.AutoConfiguration.imports │ │ └── java │ │ └── cn │ │ └── crabc │ │ └── core │ │ └── starter │ │ └── CrabcConfiguration.java └── pom.xml ├── crabc-boot ├── crabc-core │ ├── src │ │ └── main │ │ │ ├── resources │ │ │ ├── static │ │ │ │ ├── favicon.ico │ │ │ │ ├── img │ │ │ │ │ ├── dm.cce965ce.png │ │ │ │ │ ├── date.21f75fbd.png │ │ │ │ │ ├── int.a5310681.png │ │ │ │ │ ├── logo.5b711e72.png │ │ │ │ │ ├── mysql.d0b2b66e.png │ │ │ │ │ ├── str.6fa72a12.png │ │ │ │ │ ├── tidb.a4541ba6.png │ │ │ │ │ ├── view.a42893a4.png │ │ │ │ │ ├── hangao.d06c49da.png │ │ │ │ │ ├── schema.54faa0ab.png │ │ │ │ │ ├── sybase.bd4c3356.png │ │ │ │ │ ├── background.69e03cfa.png │ │ │ │ │ ├── logo_white.75f3d478.png │ │ │ │ │ ├── oceanbase.18fa38e1.png │ │ │ │ │ ├── opengauss.db700a9a.png │ │ │ │ │ ├── postgresql.308137b5.png │ │ │ │ │ ├── procedure.9fac5eb8.png │ │ │ │ │ ├── sqlserver.bbcde60d.png │ │ │ │ │ └── starrocks.0da796a0.png │ │ │ │ ├── js │ │ │ │ │ ├── app.ab531c38.js.gz │ │ │ │ │ ├── chunk-0ebc32a1.0ad3a7c3.js.gz │ │ │ │ │ ├── chunk-14fd1e98.56e09680.js.gz │ │ │ │ │ ├── chunk-18c402ac.555fb276.js.gz │ │ │ │ │ ├── chunk-32872501.a44d378f.js.gz │ │ │ │ │ ├── chunk-6513e1a4.1a338eda.js.gz │ │ │ │ │ ├── chunk-6c44c3fc.79539f3e.js.gz │ │ │ │ │ ├── chunk-c55438c0.5616867d.js.gz │ │ │ │ │ ├── chunk-32872501.a44d378f.js.LICENSE.txt │ │ │ │ │ ├── chunk-2d2253ae.116a7315.js │ │ │ │ │ ├── chunk-2d0da6a8.05a7c49d.js │ │ │ │ │ ├── chunk-2d221c57.e92aa7e2.js │ │ │ │ │ ├── app.ab531c38.js.LICENSE.txt │ │ │ │ │ ├── chunk-3ebec14d.b740b144.js │ │ │ │ │ └── chunk-15a47081.80bdbdbd.js │ │ │ │ ├── css │ │ │ │ │ ├── app.76572a5f.css.gz │ │ │ │ │ ├── chunk-c55438c0.a90b675f.css.gz │ │ │ │ │ ├── chunk-0ebc32a1.547ed69d.css │ │ │ │ │ ├── chunk-18c402ac.0e7a30b4.css │ │ │ │ │ ├── chunk-3b326e8c.86e8c762.css │ │ │ │ │ ├── chunk-3ebec14d.56372288.css │ │ │ │ │ ├── chunk-15a47081.b74c2b12.css │ │ │ │ │ └── chunk-e3006f32.752f55a0.css │ │ │ │ ├── fonts │ │ │ │ │ ├── iconfont.9079cca9.ttf │ │ │ │ │ ├── iconfont.db9f4bb2.eot │ │ │ │ │ └── iconfont.2b1b8e0b.woff │ │ │ │ ├── assets │ │ │ │ │ ├── gitee.24a06c29.svg │ │ │ │ │ ├── doc.394d01aa.svg │ │ │ │ │ ├── format.efe4dc0b.svg │ │ │ │ │ └── github.6a7758ca.svg │ │ │ │ └── index.html │ │ │ └── mapper │ │ │ │ ├── BaseAppApiMapper.xml │ │ │ │ ├── BaseGroupMapper.xml │ │ │ │ ├── BaseApiParamMapper.xml │ │ │ │ └── BaseApiLogMapper.xml │ │ │ └── java │ │ │ └── cn │ │ │ └── crabc │ │ │ └── core │ │ │ └── app │ │ │ ├── entity │ │ │ ├── vo │ │ │ │ ├── ColumnParseVo.java │ │ │ │ ├── GroupVO.java │ │ │ │ ├── ApiComboBoxVO.java │ │ │ │ ├── ApiParamsVO.java │ │ │ │ ├── SqlParseVO.java │ │ │ │ ├── GroupApiVO.java │ │ │ │ ├── PreviewVO.java │ │ │ │ ├── BaseGroupVO.java │ │ │ │ ├── ApiInfoVO.java │ │ │ │ ├── RequestParamsVO.java │ │ │ │ └── BaseApiInfoVO.java │ │ │ ├── BaseGroup.java │ │ │ ├── param │ │ │ │ ├── ApiLogParam.java │ │ │ │ ├── ApiTestParam.java │ │ │ │ ├── UserParam.java │ │ │ │ └── ApiInfoParam.java │ │ │ ├── BaseAppApi.java │ │ │ ├── dto │ │ │ │ ├── ColumnDTO.java │ │ │ │ └── ApiInfoDTO.java │ │ │ ├── BaseEntity.java │ │ │ ├── BaseDatasource.java │ │ │ ├── BaseApiSql.java │ │ │ ├── BaseUser.java │ │ │ ├── BaseApp.java │ │ │ ├── BaseApiLog.java │ │ │ ├── BaseApiParam.java │ │ │ └── BaseApiInfo.java │ │ │ ├── service │ │ │ ├── system │ │ │ │ ├── IBaseApiParamService.java │ │ │ │ ├── IBaseApiLogService.java │ │ │ │ ├── IBaseGroupService.java │ │ │ │ ├── IBaseUserService.java │ │ │ │ ├── IBaseAppService.java │ │ │ │ ├── impl │ │ │ │ │ ├── IBaseApiLogServiceImpl.java │ │ │ │ │ ├── BaseAppServiceImpl.java │ │ │ │ │ ├── BaseUserServiceImpl.java │ │ │ │ │ └── BaseApiParamServiceImpl.java │ │ │ │ ├── IBaseDataSourceService.java │ │ │ │ └── IBaseApiInfoService.java │ │ │ └── core │ │ │ │ ├── IBaseDataService.java │ │ │ │ └── impl │ │ │ │ └── BaseDataServiceImpl.java │ │ │ ├── mapper │ │ │ ├── BaseAppApiMapper.java │ │ │ ├── BaseApiLogMapper.java │ │ │ ├── BaseUserMapper.java │ │ │ ├── BaseAppMapper.java │ │ │ ├── BaseGroupMapper.java │ │ │ ├── BaseDataSourceMapper.java │ │ │ ├── BaseApiParamMapper.java │ │ │ └── BaseApiInfoMapper.java │ │ │ ├── enums │ │ │ ├── ApiAuthEnum.java │ │ │ ├── ApiStateEnum.java │ │ │ ├── ResultTypeEnum.java │ │ │ └── SqlTypeEnum.java │ │ │ ├── util │ │ │ ├── PageInfo.java │ │ │ ├── ApiThreadLocal.java │ │ │ ├── SM3Util.java │ │ │ ├── UserThreadLocal.java │ │ │ ├── Md5Utils.java │ │ │ ├── JwtUtil.java │ │ │ └── Result.java │ │ │ ├── config │ │ │ ├── LoadingData.java │ │ │ ├── WebConfiguration.java │ │ │ ├── CacheConfig.java │ │ │ ├── InterceptorConfig.java │ │ │ └── DataSourceConfig.java │ │ │ ├── controller │ │ │ ├── ApiLogController.java │ │ │ ├── CommonController.java │ │ │ ├── BaseGroupController.java │ │ │ ├── BaseAppController.java │ │ │ └── DataSourceController.java │ │ │ ├── filter │ │ │ ├── JwtInterceptor.java │ │ │ ├── ApiFilter.java │ │ │ └── BaseRequestWrapper.java │ │ │ └── exception │ │ │ └── ExceptionHandler.java │ └── pom.xml ├── crabc-datasource │ ├── src │ │ └── main │ │ │ └── java │ │ │ └── cn │ │ │ └── crabc │ │ │ └── core │ │ │ └── datasource │ │ │ ├── exception │ │ │ └── CustomException.java │ │ │ ├── util │ │ │ └── PageInfo.java │ │ │ ├── driver │ │ │ ├── jdbc │ │ │ │ └── JdbcDataSourceDriver.java │ │ │ └── DataSourceManager.java │ │ │ ├── enums │ │ │ └── ErrorStatusEnum.java │ │ │ ├── constant │ │ │ └── BaseConstant.java │ │ │ └── mapper │ │ │ ├── BaseDataHandleMapper.java │ │ │ └── BaseSelectProvider.java │ └── pom.xml ├── crabc-spi │ ├── src │ │ └── main │ │ │ └── java │ │ │ └── cn │ │ │ └── crabc │ │ │ └── core │ │ │ └── spi │ │ │ ├── PluginException.java │ │ │ ├── Mapper.java │ │ │ ├── bean │ │ │ ├── Schema.java │ │ │ ├── Column.java │ │ │ └── Table.java │ │ │ ├── DataSourceDriver.java │ │ │ ├── MetaDataMapper.java │ │ │ └── StatementMapper.java │ └── pom.xml ├── crabc-admin │ ├── src │ │ └── main │ │ │ ├── resources │ │ │ ├── mybatis-config.xml │ │ │ ├── application.yml │ │ │ └── logback.xml │ │ │ └── java │ │ │ └── cn │ │ │ └── crabc │ │ │ └── core │ │ │ └── admin │ │ │ └── AdminApplication.java │ └── pom.xml └── pom.xml ├── Dockerfile ├── docker-compose.yml ├── .gitignore └── pom.xml /doc/db.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pingapi/crabc-api/HEAD/doc/db.png -------------------------------------------------------------------------------- /doc/api.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pingapi/crabc-api/HEAD/doc/api.png -------------------------------------------------------------------------------- /doc/flow.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pingapi/crabc-api/HEAD/doc/flow.png -------------------------------------------------------------------------------- /doc/home.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pingapi/crabc-api/HEAD/doc/home.png -------------------------------------------------------------------------------- /doc/img.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pingapi/crabc-api/HEAD/doc/img.png -------------------------------------------------------------------------------- /doc/logo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pingapi/crabc-api/HEAD/doc/logo.png -------------------------------------------------------------------------------- /doc/sql.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pingapi/crabc-api/HEAD/doc/sql.png -------------------------------------------------------------------------------- /doc/detail.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pingapi/crabc-api/HEAD/doc/detail.png -------------------------------------------------------------------------------- /doc/login.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pingapi/crabc-api/HEAD/doc/login.png -------------------------------------------------------------------------------- /doc/param.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pingapi/crabc-api/HEAD/doc/param.png -------------------------------------------------------------------------------- /doc/dev_flow.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pingapi/crabc-api/HEAD/doc/dev_flow.png -------------------------------------------------------------------------------- /doc/img_test.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pingapi/crabc-api/HEAD/doc/img_test.png -------------------------------------------------------------------------------- /crabc-spring-boot-starter/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports: -------------------------------------------------------------------------------- 1 | cn.crabc.core.starter.CrabcConfiguration -------------------------------------------------------------------------------- /crabc-boot/crabc-core/src/main/resources/static/favicon.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pingapi/crabc-api/HEAD/crabc-boot/crabc-core/src/main/resources/static/favicon.ico -------------------------------------------------------------------------------- /crabc-boot/crabc-core/src/main/resources/static/img/dm.cce965ce.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pingapi/crabc-api/HEAD/crabc-boot/crabc-core/src/main/resources/static/img/dm.cce965ce.png -------------------------------------------------------------------------------- /crabc-boot/crabc-core/src/main/resources/static/img/date.21f75fbd.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pingapi/crabc-api/HEAD/crabc-boot/crabc-core/src/main/resources/static/img/date.21f75fbd.png -------------------------------------------------------------------------------- /crabc-boot/crabc-core/src/main/resources/static/img/int.a5310681.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pingapi/crabc-api/HEAD/crabc-boot/crabc-core/src/main/resources/static/img/int.a5310681.png -------------------------------------------------------------------------------- /crabc-boot/crabc-core/src/main/resources/static/img/logo.5b711e72.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pingapi/crabc-api/HEAD/crabc-boot/crabc-core/src/main/resources/static/img/logo.5b711e72.png -------------------------------------------------------------------------------- /crabc-boot/crabc-core/src/main/resources/static/img/mysql.d0b2b66e.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pingapi/crabc-api/HEAD/crabc-boot/crabc-core/src/main/resources/static/img/mysql.d0b2b66e.png -------------------------------------------------------------------------------- /crabc-boot/crabc-core/src/main/resources/static/img/str.6fa72a12.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pingapi/crabc-api/HEAD/crabc-boot/crabc-core/src/main/resources/static/img/str.6fa72a12.png -------------------------------------------------------------------------------- /crabc-boot/crabc-core/src/main/resources/static/img/tidb.a4541ba6.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pingapi/crabc-api/HEAD/crabc-boot/crabc-core/src/main/resources/static/img/tidb.a4541ba6.png -------------------------------------------------------------------------------- /crabc-boot/crabc-core/src/main/resources/static/img/view.a42893a4.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pingapi/crabc-api/HEAD/crabc-boot/crabc-core/src/main/resources/static/img/view.a42893a4.png -------------------------------------------------------------------------------- /crabc-boot/crabc-core/src/main/resources/static/js/app.ab531c38.js.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pingapi/crabc-api/HEAD/crabc-boot/crabc-core/src/main/resources/static/js/app.ab531c38.js.gz -------------------------------------------------------------------------------- /crabc-boot/crabc-core/src/main/resources/static/css/app.76572a5f.css.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pingapi/crabc-api/HEAD/crabc-boot/crabc-core/src/main/resources/static/css/app.76572a5f.css.gz -------------------------------------------------------------------------------- /crabc-boot/crabc-core/src/main/resources/static/img/hangao.d06c49da.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pingapi/crabc-api/HEAD/crabc-boot/crabc-core/src/main/resources/static/img/hangao.d06c49da.png -------------------------------------------------------------------------------- /crabc-boot/crabc-core/src/main/resources/static/img/schema.54faa0ab.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pingapi/crabc-api/HEAD/crabc-boot/crabc-core/src/main/resources/static/img/schema.54faa0ab.png -------------------------------------------------------------------------------- /crabc-boot/crabc-core/src/main/resources/static/img/sybase.bd4c3356.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pingapi/crabc-api/HEAD/crabc-boot/crabc-core/src/main/resources/static/img/sybase.bd4c3356.png -------------------------------------------------------------------------------- /crabc-boot/crabc-core/src/main/resources/static/fonts/iconfont.9079cca9.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pingapi/crabc-api/HEAD/crabc-boot/crabc-core/src/main/resources/static/fonts/iconfont.9079cca9.ttf -------------------------------------------------------------------------------- /crabc-boot/crabc-core/src/main/resources/static/fonts/iconfont.db9f4bb2.eot: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pingapi/crabc-api/HEAD/crabc-boot/crabc-core/src/main/resources/static/fonts/iconfont.db9f4bb2.eot -------------------------------------------------------------------------------- /crabc-boot/crabc-core/src/main/resources/static/img/background.69e03cfa.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pingapi/crabc-api/HEAD/crabc-boot/crabc-core/src/main/resources/static/img/background.69e03cfa.png -------------------------------------------------------------------------------- /crabc-boot/crabc-core/src/main/resources/static/img/logo_white.75f3d478.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pingapi/crabc-api/HEAD/crabc-boot/crabc-core/src/main/resources/static/img/logo_white.75f3d478.png -------------------------------------------------------------------------------- /crabc-boot/crabc-core/src/main/resources/static/img/oceanbase.18fa38e1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pingapi/crabc-api/HEAD/crabc-boot/crabc-core/src/main/resources/static/img/oceanbase.18fa38e1.png -------------------------------------------------------------------------------- /crabc-boot/crabc-core/src/main/resources/static/img/opengauss.db700a9a.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pingapi/crabc-api/HEAD/crabc-boot/crabc-core/src/main/resources/static/img/opengauss.db700a9a.png -------------------------------------------------------------------------------- /crabc-boot/crabc-core/src/main/resources/static/img/postgresql.308137b5.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pingapi/crabc-api/HEAD/crabc-boot/crabc-core/src/main/resources/static/img/postgresql.308137b5.png -------------------------------------------------------------------------------- /crabc-boot/crabc-core/src/main/resources/static/img/procedure.9fac5eb8.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pingapi/crabc-api/HEAD/crabc-boot/crabc-core/src/main/resources/static/img/procedure.9fac5eb8.png -------------------------------------------------------------------------------- /crabc-boot/crabc-core/src/main/resources/static/img/sqlserver.bbcde60d.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pingapi/crabc-api/HEAD/crabc-boot/crabc-core/src/main/resources/static/img/sqlserver.bbcde60d.png -------------------------------------------------------------------------------- /crabc-boot/crabc-core/src/main/resources/static/img/starrocks.0da796a0.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pingapi/crabc-api/HEAD/crabc-boot/crabc-core/src/main/resources/static/img/starrocks.0da796a0.png -------------------------------------------------------------------------------- /crabc-boot/crabc-core/src/main/resources/static/fonts/iconfont.2b1b8e0b.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pingapi/crabc-api/HEAD/crabc-boot/crabc-core/src/main/resources/static/fonts/iconfont.2b1b8e0b.woff -------------------------------------------------------------------------------- /crabc-boot/crabc-core/src/main/resources/static/js/chunk-0ebc32a1.0ad3a7c3.js.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pingapi/crabc-api/HEAD/crabc-boot/crabc-core/src/main/resources/static/js/chunk-0ebc32a1.0ad3a7c3.js.gz -------------------------------------------------------------------------------- /crabc-boot/crabc-core/src/main/resources/static/js/chunk-14fd1e98.56e09680.js.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pingapi/crabc-api/HEAD/crabc-boot/crabc-core/src/main/resources/static/js/chunk-14fd1e98.56e09680.js.gz -------------------------------------------------------------------------------- /crabc-boot/crabc-core/src/main/resources/static/js/chunk-18c402ac.555fb276.js.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pingapi/crabc-api/HEAD/crabc-boot/crabc-core/src/main/resources/static/js/chunk-18c402ac.555fb276.js.gz -------------------------------------------------------------------------------- /crabc-boot/crabc-core/src/main/resources/static/js/chunk-32872501.a44d378f.js.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pingapi/crabc-api/HEAD/crabc-boot/crabc-core/src/main/resources/static/js/chunk-32872501.a44d378f.js.gz -------------------------------------------------------------------------------- /crabc-boot/crabc-core/src/main/resources/static/js/chunk-6513e1a4.1a338eda.js.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pingapi/crabc-api/HEAD/crabc-boot/crabc-core/src/main/resources/static/js/chunk-6513e1a4.1a338eda.js.gz -------------------------------------------------------------------------------- /crabc-boot/crabc-core/src/main/resources/static/js/chunk-6c44c3fc.79539f3e.js.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pingapi/crabc-api/HEAD/crabc-boot/crabc-core/src/main/resources/static/js/chunk-6c44c3fc.79539f3e.js.gz -------------------------------------------------------------------------------- /crabc-boot/crabc-core/src/main/resources/static/js/chunk-c55438c0.5616867d.js.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pingapi/crabc-api/HEAD/crabc-boot/crabc-core/src/main/resources/static/js/chunk-c55438c0.5616867d.js.gz -------------------------------------------------------------------------------- /crabc-boot/crabc-core/src/main/resources/static/css/chunk-c55438c0.a90b675f.css.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pingapi/crabc-api/HEAD/crabc-boot/crabc-core/src/main/resources/static/css/chunk-c55438c0.a90b675f.css.gz -------------------------------------------------------------------------------- /crabc-boot/crabc-core/src/main/resources/static/js/chunk-32872501.a44d378f.js.LICENSE.txt: -------------------------------------------------------------------------------- 1 | /** 2 | * @fileOverview 3 | * @name asn1-1.0.js 4 | * @author Kenji Urushima kenji.urushima@gmail.com 5 | * @version asn1 1.0.13 (2017-Jun-02) 6 | * @since jsrsasign 2.1 7 | * @license MIT License 8 | */ 9 | -------------------------------------------------------------------------------- /crabc-boot/crabc-core/src/main/java/cn/crabc/core/app/entity/vo/ColumnParseVo.java: -------------------------------------------------------------------------------- 1 | package cn.crabc.core.app.entity.vo; 2 | 3 | import lombok.Getter; 4 | import lombok.Setter; 5 | 6 | @Setter 7 | @Getter 8 | public class ColumnParseVo { 9 | 10 | private String colName; 11 | 12 | private String colType; 13 | 14 | private Integer itemIndex; 15 | 16 | } 17 | -------------------------------------------------------------------------------- /crabc-boot/crabc-core/src/main/java/cn/crabc/core/app/service/system/IBaseApiParamService.java: -------------------------------------------------------------------------------- 1 | package cn.crabc.core.app.service.system; 2 | 3 | import cn.crabc.core.app.entity.vo.ApiParamsVO; 4 | 5 | /** 6 | * API参数 服务接口 7 | * 8 | * @author yuqf 9 | */ 10 | public interface IBaseApiParamService { 11 | 12 | ApiParamsVO getApiDetailsParams(Long apiId); 13 | } 14 | -------------------------------------------------------------------------------- /Dockerfile: -------------------------------------------------------------------------------- 1 | FROM eclipse-temurin:21-jdk-alpine 2 | LABEL version="3.5.2" 3 | 4 | COPY crabc-admin.jar /app.jar 5 | ENV LANG="en_US.UTF-8" 6 | EXPOSE 9377 7 | 8 | ENV DB_URL=${db_url} DB_USER=${db_user} DB_PWD=${db_pwd} 9 | 10 | CMD ["java", "-jar", "/app.jar", "--spring.datasource.url=${DB_URL}", "--spring.datasource.username=${DB_USER}", "--spring.datasource.password=${DB_PWD}"] -------------------------------------------------------------------------------- /crabc-boot/crabc-core/src/main/java/cn/crabc/core/app/entity/vo/GroupVO.java: -------------------------------------------------------------------------------- 1 | package cn.crabc.core.app.entity.vo; 2 | 3 | import lombok.Getter; 4 | import lombok.Setter; 5 | 6 | import java.util.List; 7 | 8 | @Setter 9 | @Getter 10 | public class GroupVO { 11 | private Integer groupId; 12 | private String groupName; 13 | private Integer parentId; 14 | private List children; 15 | 16 | } 17 | -------------------------------------------------------------------------------- /crabc-boot/crabc-core/src/main/java/cn/crabc/core/app/entity/vo/ApiComboBoxVO.java: -------------------------------------------------------------------------------- 1 | package cn.crabc.core.app.entity.vo; 2 | 3 | import lombok.Getter; 4 | import lombok.Setter; 5 | 6 | @Setter 7 | @Getter 8 | public class ApiComboBoxVO { 9 | 10 | private Long apiId; 11 | 12 | private String apiName; 13 | 14 | private String apiType; 15 | 16 | private String apiStatus; 17 | 18 | private Integer groupId; 19 | } 20 | -------------------------------------------------------------------------------- /crabc-boot/crabc-core/src/main/java/cn/crabc/core/app/entity/vo/ApiParamsVO.java: -------------------------------------------------------------------------------- 1 | package cn.crabc.core.app.entity.vo; 2 | 3 | import lombok.Getter; 4 | import lombok.Setter; 5 | 6 | import java.util.List; 7 | 8 | /** 9 | * api详情参数 10 | */ 11 | @Setter 12 | @Getter 13 | public class ApiParamsVO { 14 | 15 | // 请求参数 16 | List reqParams; 17 | 18 | //响应参数 19 | List resParams; 20 | } 21 | -------------------------------------------------------------------------------- /crabc-boot/crabc-core/src/main/resources/static/js/chunk-2d2253ae.116a7315.js: -------------------------------------------------------------------------------- 1 | (window.webpackJsonp=window.webpackJsonp||[]).push([["chunk-2d2253ae"],{e409:function(t,e,s){"use strict";s.r(e);var n={name:"Exception403",methods:{toHome:function(){this.$router.push({path:"/"})}}},u=s("2877"),o=Object(u.a)(n,(function(){return(0,this._self._c)("a-result",{attrs:{status:"403",title:"403","sub-title":this.$t("layouts.error403")}})}),[],!1,null,null,null);e.default=o.exports}}]); -------------------------------------------------------------------------------- /crabc-boot/crabc-core/src/main/java/cn/crabc/core/app/entity/BaseGroup.java: -------------------------------------------------------------------------------- 1 | package cn.crabc.core.app.entity; 2 | 3 | import lombok.Getter; 4 | import lombok.Setter; 5 | 6 | /** 7 | * api分组 8 | * 9 | * @author yuqf 10 | */ 11 | @Setter 12 | @Getter 13 | public class BaseGroup extends BaseEntity{ 14 | 15 | private Integer groupId; 16 | 17 | private String groupName; 18 | 19 | private String groupDesc; 20 | 21 | private Integer parentId; 22 | } 23 | -------------------------------------------------------------------------------- /crabc-boot/crabc-core/src/main/java/cn/crabc/core/app/entity/vo/SqlParseVO.java: -------------------------------------------------------------------------------- 1 | package cn.crabc.core.app.entity.vo; 2 | 3 | 4 | import lombok.Getter; 5 | import lombok.Setter; 6 | 7 | import java.util.Set; 8 | 9 | @Setter 10 | @Getter 11 | public class SqlParseVO { 12 | 13 | private Set reqColumns; 14 | 15 | private Set resColumns; 16 | 17 | private String sqlScript; 18 | 19 | private String datasourceType; 20 | 21 | } 22 | -------------------------------------------------------------------------------- /crabc-boot/crabc-core/src/main/java/cn/crabc/core/app/entity/param/ApiLogParam.java: -------------------------------------------------------------------------------- 1 | package cn.crabc.core.app.entity.param; 2 | 3 | import lombok.Getter; 4 | import lombok.Setter; 5 | 6 | /** 7 | * API日志查询请求参数 8 | * 9 | * @author yuqf 10 | */ 11 | @Setter 12 | @Getter 13 | public class ApiLogParam { 14 | private String result; 15 | 16 | private String keyword; 17 | 18 | private String startTime; 19 | 20 | private String endTime; 21 | 22 | private Integer pageNum; 23 | 24 | private Integer pageSize; 25 | } 26 | -------------------------------------------------------------------------------- /crabc-boot/crabc-core/src/main/java/cn/crabc/core/app/entity/BaseAppApi.java: -------------------------------------------------------------------------------- 1 | package cn.crabc.core.app.entity; 2 | 3 | import lombok.Getter; 4 | import lombok.Setter; 5 | 6 | import java.util.Date; 7 | import java.util.List; 8 | 9 | /** 10 | * 应用和API关联关系 11 | * 12 | * @author yuqf 13 | */ 14 | @Setter 15 | @Getter 16 | public class BaseAppApi { 17 | 18 | private Long appId; 19 | 20 | private Long apiId; 21 | 22 | private String createBy; 23 | 24 | private Date createTime; 25 | 26 | private List apiIds; 27 | 28 | } 29 | -------------------------------------------------------------------------------- /crabc-boot/crabc-datasource/src/main/java/cn/crabc/core/datasource/exception/CustomException.java: -------------------------------------------------------------------------------- 1 | package cn.crabc.core.datasource.exception; 2 | 3 | /** 4 | * 自定义异常结构 5 | * 6 | * @author yuqf 7 | */ 8 | public class CustomException extends RuntimeException { 9 | 10 | private int code; 11 | private String msg; 12 | 13 | public CustomException(int code, String message) { 14 | this.code = code; 15 | this.msg = message; 16 | } 17 | 18 | public int getCode() { 19 | return code; 20 | } 21 | 22 | public String getMsg() { 23 | return msg; 24 | } 25 | } 26 | -------------------------------------------------------------------------------- /crabc-boot/crabc-core/src/main/java/cn/crabc/core/app/entity/param/ApiTestParam.java: -------------------------------------------------------------------------------- 1 | package cn.crabc.core.app.entity.param; 2 | 3 | import lombok.Getter; 4 | import lombok.Setter; 5 | 6 | @Setter 7 | @Getter 8 | public class ApiTestParam { 9 | 10 | private String sqlScript; 11 | 12 | private String datasourceId; 13 | 14 | private String datasourceType; 15 | 16 | private String schemaName; 17 | 18 | private String sqlParams; 19 | 20 | private Integer pageSetup; 21 | 22 | private String resultType; 23 | 24 | private Object requestParams; 25 | 26 | private String bodyData; 27 | 28 | } 29 | -------------------------------------------------------------------------------- /crabc-boot/crabc-core/src/main/resources/static/js/chunk-2d0da6a8.05a7c49d.js: -------------------------------------------------------------------------------- 1 | (window.webpackJsonp=window.webpackJsonp||[]).push([["chunk-2d0da6a8"],{"6c05":function(t,e,o){"use strict";o.r(e);var n={name:"Exception500",methods:{toHome:function(){this.$router.push({path:"/"})}}},r=o("2877"),u=Object(r.a)(n,(function(){var t=this,e=t._self._c;return e("a-result",{attrs:{status:"500",title:"500","sub-title":t.$t("layouts.error500")},scopedSlots:t._u([{key:"extra",fn:function(){return[e("a-button",{attrs:{type:"primary"},on:{click:t.toHome}},[t._v(" "+t._s(t.$t("layouts.returnHome"))+" ")])]},proxy:!0}])})}),[],!1,null,null,null);e.default=u.exports}}]); -------------------------------------------------------------------------------- /crabc-boot/crabc-core/src/main/resources/static/js/chunk-2d221c57.e92aa7e2.js: -------------------------------------------------------------------------------- 1 | (window.webpackJsonp=window.webpackJsonp||[]).push([["chunk-2d221c57"],{cc89:function(t,e,o){"use strict";o.r(e);var n={name:"Exception404",methods:{toHome:function(){this.$router.push({path:"/"})}}},r=o("2877"),u=Object(r.a)(n,(function(){var t=this,e=t._self._c;return e("a-result",{attrs:{status:"404",title:"404","sub-title":t.$t("layouts.error404")},scopedSlots:t._u([{key:"extra",fn:function(){return[e("a-button",{attrs:{type:"primary"},on:{click:t.toHome}},[t._v(" "+t._s(t.$t("layouts.returnHome"))+" ")])]},proxy:!0}])})}),[],!1,null,null,null);e.default=u.exports}}]); -------------------------------------------------------------------------------- /crabc-boot/crabc-core/src/main/java/cn/crabc/core/app/entity/vo/GroupApiVO.java: -------------------------------------------------------------------------------- 1 | package cn.crabc.core.app.entity.vo; 2 | 3 | import lombok.Getter; 4 | import lombok.Setter; 5 | 6 | import java.io.Serializable; 7 | import java.util.ArrayList; 8 | import java.util.List; 9 | import java.util.Objects; 10 | 11 | /** 12 | * 分组下的API 13 | */ 14 | @Setter 15 | @Getter 16 | public class GroupApiVO implements Serializable { 17 | private Integer groupId; 18 | private String groupName; 19 | private Integer apiId; 20 | private String apiName; 21 | private Integer parentId; 22 | 23 | private List child = new ArrayList<>(); 24 | } 25 | -------------------------------------------------------------------------------- /crabc-boot/crabc-core/src/main/java/cn/crabc/core/app/entity/vo/PreviewVO.java: -------------------------------------------------------------------------------- 1 | package cn.crabc.core.app.entity.vo; 2 | 3 | import lombok.Getter; 4 | import lombok.Setter; 5 | 6 | import java.io.Serializable; 7 | import java.util.List; 8 | import java.util.Map; 9 | import java.util.Set; 10 | 11 | /** 12 | * SQL运行预览结果 13 | * 14 | * @author yuqf 15 | */ 16 | @Setter 17 | @Getter 18 | public class PreviewVO implements Serializable { 19 | private static final long serialVersionUID = 1L; 20 | /** 21 | * 标题字段名 22 | */ 23 | Set metadata; 24 | 25 | /** 26 | * 数据 27 | */ 28 | List> data; 29 | 30 | } 31 | -------------------------------------------------------------------------------- /crabc-boot/crabc-core/src/main/java/cn/crabc/core/app/entity/dto/ColumnDTO.java: -------------------------------------------------------------------------------- 1 | package cn.crabc.core.app.entity.dto; 2 | 3 | import lombok.Getter; 4 | import lombok.Setter; 5 | 6 | import java.io.Serializable; 7 | 8 | /** 9 | * 字段信息 10 | * 11 | * @author yuqf 12 | */ 13 | @Setter 14 | @Getter 15 | public class ColumnDTO implements Serializable { 16 | /** 名称 */ 17 | private String columnName; 18 | /** 类型 */ 19 | private String columnType; 20 | /** 别名 */ 21 | private String alias; 22 | /** 操作符 */ 23 | private String operator; 24 | 25 | private String nullable; 26 | 27 | private String value; 28 | 29 | private String remarks; 30 | } 31 | -------------------------------------------------------------------------------- /crabc-boot/crabc-spi/src/main/java/cn/crabc/core/spi/PluginException.java: -------------------------------------------------------------------------------- 1 | package cn.crabc.core.spi; 2 | 3 | /** 4 | * 插件异常结构 5 | * 6 | * @author yuqf 7 | */ 8 | public class PluginException extends RuntimeException { 9 | 10 | private int code; 11 | private String msg; 12 | 13 | public PluginException(int code, String message) { 14 | this.code = code; 15 | this.msg = message; 16 | } 17 | public PluginException(String message) { 18 | this.code = 55000; 19 | this.msg = message; 20 | } 21 | 22 | public int getCode() { 23 | return code; 24 | } 25 | 26 | public String getMsg() { 27 | return msg; 28 | } 29 | } 30 | -------------------------------------------------------------------------------- /crabc-boot/crabc-core/src/main/resources/static/css/chunk-0ebc32a1.547ed69d.css: -------------------------------------------------------------------------------- 1 | .page-message-select[data-v-7cedfe25]{padding-right:12px}.page-measage-table[data-v-7cedfe25]{margin-top:20px}.search-name[data-v-7cedfe25]{display:flex;align-items:center}.search-name span[data-v-7cedfe25]{display:inline-block;width:80px}[data-v-17090271] .redSpan{color:red}.page-message-select[data-v-17090271]{padding-right:12px}.page-message-select .page-measage-title[data-v-17090271]{margin-right:10px;margin-left:20px}.page-measage-table[data-v-17090271]{margin-top:20px}.search-name[data-v-17090271]{display:flex;align-items:center}.search-name span[data-v-17090271]{display:inline-block;width:80px}.switcher[data-v-390fb9b4]{position:absolute;top:1.2em} -------------------------------------------------------------------------------- /crabc-boot/crabc-core/src/main/java/cn/crabc/core/app/mapper/BaseAppApiMapper.java: -------------------------------------------------------------------------------- 1 | package cn.crabc.core.app.mapper; 2 | 3 | import cn.crabc.core.app.entity.BaseAppApi; 4 | import org.apache.ibatis.annotations.Mapper; 5 | import org.apache.ibatis.annotations.Param; 6 | 7 | import java.util.List; 8 | 9 | @Mapper 10 | public interface BaseAppApiMapper { 11 | 12 | /** 13 | * 新增关系 14 | * 15 | * @param list 16 | * @return 17 | */ 18 | Integer insert(List list); 19 | 20 | /** 21 | * 删除关系 22 | * 23 | * @param appId 24 | * @param userId 25 | * @return 26 | */ 27 | Integer delete(@Param("appId") Long appId, @Param("userId") String userId); 28 | } 29 | -------------------------------------------------------------------------------- /crabc-boot/crabc-spi/pom.xml: -------------------------------------------------------------------------------- 1 | 2 | 5 | 6 | crabc-boot 7 | cn.crabc 8 | ${revision} 9 | 10 | 4.0.0 11 | 12 | crabc-spi 13 | 14 | 21 15 | 21 16 | 17 | 18 | -------------------------------------------------------------------------------- /crabc-boot/crabc-admin/src/main/resources/mybatis-config.xml: -------------------------------------------------------------------------------- 1 | 2 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | -------------------------------------------------------------------------------- /crabc-boot/crabc-core/src/main/java/cn/crabc/core/app/entity/param/UserParam.java: -------------------------------------------------------------------------------- 1 | package cn.crabc.core.app.entity.param; 2 | 3 | import lombok.Getter; 4 | import lombok.Setter; 5 | 6 | /** 7 | * 用户请求对象 8 | * 9 | * @author yuqf 10 | */ 11 | @Setter 12 | @Getter 13 | public class UserParam { 14 | 15 | private Long userId; 16 | 17 | private String username; 18 | 19 | /** 用户昵称 */ 20 | private String nickname; 21 | 22 | /** 用户邮箱 */ 23 | private String email; 24 | 25 | /** 手机号码 */ 26 | private String phone; 27 | 28 | /** 用户性别 */ 29 | private String sex; 30 | 31 | /** 用户头像 */ 32 | private String picture; 33 | 34 | /** 密码 */ 35 | private String password; 36 | 37 | private String newPassword; 38 | } 39 | -------------------------------------------------------------------------------- /crabc-boot/crabc-core/src/main/resources/mapper/BaseAppApiMapper.xml: -------------------------------------------------------------------------------- 1 | 2 | 5 | 6 | 7 | 8 | insert into base_app_api(app_id,api_id,create_by,create_time) 9 | values 10 | 11 | (#{app.appId},#{app.apiId},#{app.createBy},#{app.createTime}) 12 | 13 | 14 | 15 | 16 | delete from base_app_api where app_id =#{appId} and create_by=#{userId} 17 | 18 | 19 | -------------------------------------------------------------------------------- /crabc-boot/crabc-core/src/main/java/cn/crabc/core/app/entity/BaseEntity.java: -------------------------------------------------------------------------------- 1 | package cn.crabc.core.app.entity; 2 | 3 | import lombok.Data; 4 | import lombok.Getter; 5 | import lombok.Setter; 6 | 7 | import java.io.Serial; 8 | import java.io.Serializable; 9 | import java.util.Date; 10 | 11 | /** 12 | * 实体类基类 13 | * 14 | * @author yuqf 15 | */ 16 | @Setter 17 | @Getter 18 | public class BaseEntity implements Serializable { 19 | @Serial 20 | private static final long serialVersionUID = 1L; 21 | 22 | /** 23 | * 创建者 24 | */ 25 | private String createBy; 26 | /** 27 | * 创建时间 28 | */ 29 | private Date createTime; 30 | /** 31 | * 更新者 32 | */ 33 | private String updateBy; 34 | /** 35 | * 更新时间 36 | */ 37 | private Date updateTime; 38 | 39 | } 40 | -------------------------------------------------------------------------------- /crabc-boot/pom.xml: -------------------------------------------------------------------------------- 1 | 2 | 5 | 4.0.0 6 | 7 | crabc 8 | cn.crabc 9 | ${revision} 10 | 11 | pom 12 | crabc-boot 13 | ${revision} 14 | 15 | 16 | crabc-core 17 | crabc-spi 18 | crabc-datasource 19 | crabc-admin 20 | 21 | 22 | -------------------------------------------------------------------------------- /crabc-boot/crabc-core/src/main/java/cn/crabc/core/app/service/system/IBaseApiLogService.java: -------------------------------------------------------------------------------- 1 | package cn.crabc.core.app.service.system; 2 | 3 | import cn.crabc.core.app.entity.BaseApiLog; 4 | import cn.crabc.core.app.entity.param.ApiLogParam; 5 | import cn.crabc.core.datasource.util.PageInfo; 6 | 7 | 8 | /** 9 | * API日志 服务接口 10 | * 11 | * @author yuqf 12 | */ 13 | public interface IBaseApiLogService { 14 | 15 | /** 16 | * 添加日志 17 | * 18 | * @param log 19 | * @return 20 | */ 21 | Integer addLog(BaseApiLog log); 22 | 23 | /** 24 | * 日志列表 25 | * 26 | * @param param 27 | * @return 28 | */ 29 | PageInfo page(ApiLogParam param); 30 | 31 | /** 32 | * 日志详情 33 | * 34 | * @param logId 35 | * @return 36 | */ 37 | BaseApiLog logDetail(Long logId); 38 | } 39 | -------------------------------------------------------------------------------- /crabc-boot/crabc-core/src/main/java/cn/crabc/core/app/enums/ApiAuthEnum.java: -------------------------------------------------------------------------------- 1 | package cn.crabc.core.app.enums; 2 | 3 | /** 4 | * API认证方式枚举 5 | * 6 | * @author yuqf 7 | */ 8 | public enum ApiAuthEnum { 9 | NONE("none", "无认证"), 10 | CODE("app_code", "code认证"), 11 | APP_SECRET("app_secret", "密钥认证"); 12 | 13 | private String name; 14 | private String value; 15 | 16 | ApiAuthEnum(String name, String value) { 17 | this.name = name; 18 | this.value = value; 19 | } 20 | 21 | public String getName() { 22 | return name; 23 | } 24 | 25 | public void setName(String name) { 26 | this.name = name; 27 | } 28 | 29 | public String getValue() { 30 | return value; 31 | } 32 | 33 | public void setValue(String value) { 34 | this.value = value; 35 | } 36 | 37 | } 38 | -------------------------------------------------------------------------------- /crabc-boot/crabc-spi/src/main/java/cn/crabc/core/spi/Mapper.java: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright 2023, crabc.cn (creabc@qq.com) 3 | * 4 | * Licensed under the Apache License, Version 2.0 (the "License"); 5 | * you may not use this file except in compliance with the License. 6 | * You may obtain a copy of the License at 7 | * 8 | * http://www.apache.org/licenses/LICENSE-2.0 9 | * 10 | * Unless required by applicable law or agreed to in writing, software 11 | * distributed under the License is distributed on an "AS IS" BASIS, 12 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 | * See the License for the specific language governing permissions and 14 | * limitations under the License. 15 | */ 16 | package cn.crabc.core.spi; 17 | 18 | /** 19 | * Mapper 20 | * 21 | * @author yuqf 22 | */ 23 | public interface Mapper { 24 | } 25 | -------------------------------------------------------------------------------- /crabc-boot/crabc-core/src/main/java/cn/crabc/core/app/entity/vo/BaseGroupVO.java: -------------------------------------------------------------------------------- 1 | package cn.crabc.core.app.entity.vo; 2 | 3 | import cn.crabc.core.app.entity.BaseGroup; 4 | 5 | import java.util.ArrayList; 6 | import java.util.List; 7 | 8 | /** 9 | * 分组对象 10 | * 11 | */ 12 | public class BaseGroupVO extends BaseGroup { 13 | 14 | private List children = new ArrayList<>(); 15 | 16 | private List apis = new ArrayList<>(); 17 | 18 | public List getChildren() { 19 | return children; 20 | } 21 | 22 | public void setChildren(List children) { 23 | this.children = children; 24 | } 25 | 26 | public List getApis() { 27 | return apis; 28 | } 29 | 30 | public void setApis(List apis) { 31 | this.apis = apis; 32 | } 33 | } 34 | -------------------------------------------------------------------------------- /crabc-boot/crabc-core/src/main/java/cn/crabc/core/app/entity/BaseDatasource.java: -------------------------------------------------------------------------------- 1 | package cn.crabc.core.app.entity; 2 | 3 | import cn.crabc.core.spi.bean.BaseDataSource; 4 | import com.fasterxml.jackson.annotation.JsonIgnoreProperties; 5 | import lombok.Getter; 6 | import lombok.Setter; 7 | 8 | import java.util.Date; 9 | 10 | /** 11 | * 12 | * 数据源配置 13 | * 14 | * @author yuqf 15 | */ 16 | @Setter 17 | @Getter 18 | @JsonIgnoreProperties(value = {"secretKey"}) 19 | public class BaseDatasource extends BaseDataSource { 20 | 21 | /** 22 | * 租户 23 | */ 24 | private Integer tenantId; 25 | 26 | private String createBy; 27 | /** 28 | * 创建时间 29 | */ 30 | private Date createTime; 31 | /** 32 | * 更新者 33 | */ 34 | private String updateBy; 35 | /** 36 | * 更新时间 37 | */ 38 | private Date updateTime; 39 | } 40 | -------------------------------------------------------------------------------- /crabc-boot/crabc-core/src/main/java/cn/crabc/core/app/mapper/BaseApiLogMapper.java: -------------------------------------------------------------------------------- 1 | package cn.crabc.core.app.mapper; 2 | 3 | import cn.crabc.core.app.entity.BaseApiLog; 4 | import cn.crabc.core.app.entity.param.ApiLogParam; 5 | import org.apache.ibatis.annotations.Mapper; 6 | 7 | import java.util.List; 8 | 9 | /** 10 | * API访问日志 Mapper接口 11 | * 12 | * @author yuqf 13 | */ 14 | @Mapper 15 | public interface BaseApiLogMapper { 16 | 17 | /** 18 | * 添加日志 19 | * 20 | * @param log 21 | * @return 22 | */ 23 | Integer insert(BaseApiLog log); 24 | 25 | /** 26 | * 日志列表 27 | * 28 | * @param param 29 | * @return 30 | */ 31 | List selectList(ApiLogParam param); 32 | 33 | /** 34 | * 日志详情 35 | * 36 | * @param logId 37 | * @return 38 | */ 39 | BaseApiLog selectOne(Long logId); 40 | } 41 | -------------------------------------------------------------------------------- /crabc-boot/crabc-core/src/main/java/cn/crabc/core/app/entity/BaseApiSql.java: -------------------------------------------------------------------------------- 1 | package cn.crabc.core.app.entity; 2 | 3 | import lombok.Getter; 4 | import lombok.Setter; 5 | 6 | /** 7 | * API SQL配置 8 | * 9 | * @author yuqf 10 | */ 11 | @Setter 12 | @Getter 13 | public class BaseApiSql extends BaseEntity { 14 | 15 | /** 16 | * 自增主键ID 17 | */ 18 | private Long sqlId; 19 | 20 | /** api主键 */ 21 | private Long apiId; 22 | 23 | /** 24 | * sql语句脚本 25 | */ 26 | private String sqlScript; 27 | 28 | /** 29 | * 分页设置,不分页:0、只分页:page、分页并统计:pageCount 30 | */ 31 | private Integer pageSetup; 32 | 33 | /** 34 | * 数据源Id 35 | */ 36 | private Integer datasourceId; 37 | 38 | /** 39 | * schema 40 | */ 41 | private String schemaName; 42 | 43 | /** 44 | * 数据源类型 45 | */ 46 | private String datasourceType; 47 | 48 | } 49 | -------------------------------------------------------------------------------- /crabc-boot/crabc-core/src/main/java/cn/crabc/core/app/enums/ApiStateEnum.java: -------------------------------------------------------------------------------- 1 | package cn.crabc.core.app.enums; 2 | 3 | /** 4 | * API生命周期状态枚举 5 | * 6 | * @author yuqf 7 | */ 8 | public enum ApiStateEnum { 9 | EDIT("edit", "编辑"), 10 | AUDIT("audit", "审批"), 11 | RELEASE("release", "发布"), 12 | DESTROY("destroy", "销毁"), 13 | HISTORY("history", "历史"); 14 | 15 | private String name; 16 | private String value; 17 | 18 | ApiStateEnum(String name, String value) { 19 | this.name = name; 20 | this.value = value; 21 | } 22 | 23 | public String getName() { 24 | return name; 25 | } 26 | 27 | public void setName(String name) { 28 | this.name = name; 29 | } 30 | 31 | public String getValue() { 32 | return value; 33 | } 34 | 35 | public void setValue(String value) { 36 | this.value = value; 37 | } 38 | 39 | } 40 | -------------------------------------------------------------------------------- /crabc-boot/crabc-core/src/main/java/cn/crabc/core/app/entity/dto/ApiInfoDTO.java: -------------------------------------------------------------------------------- 1 | package cn.crabc.core.app.entity.dto; 2 | 3 | import cn.crabc.core.app.entity.BaseApiInfo; 4 | import cn.crabc.core.app.entity.BaseApiParam; 5 | import cn.crabc.core.app.entity.BaseApp; 6 | import lombok.Getter; 7 | import lombok.Setter; 8 | 9 | import java.util.ArrayList; 10 | import java.util.Date; 11 | import java.util.List; 12 | 13 | /** 14 | * API相关的详情信息 15 | * 16 | * @author yuqf 17 | */ 18 | @Setter 19 | @Getter 20 | public class ApiInfoDTO extends BaseApiInfo { 21 | 22 | /** 23 | * 请求时间 24 | */ 25 | private Date requestDate; 26 | 27 | private Long requestTime; 28 | 29 | private String userId; 30 | 31 | /** 32 | * 有权限的应用 33 | */ 34 | private List appList = new ArrayList<>(); 35 | 36 | /** 37 | * API参数 38 | */ 39 | private List requestParams; 40 | 41 | } 42 | -------------------------------------------------------------------------------- /crabc-boot/crabc-core/src/main/java/cn/crabc/core/app/entity/param/ApiInfoParam.java: -------------------------------------------------------------------------------- 1 | package cn.crabc.core.app.entity.param; 2 | 3 | import cn.crabc.core.app.entity.BaseApiInfo; 4 | import cn.crabc.core.app.entity.BaseApiParam; 5 | import cn.crabc.core.app.entity.BaseApiSql; 6 | import lombok.Getter; 7 | import lombok.Setter; 8 | 9 | import java.util.List; 10 | 11 | /** 12 | * API请求参数 13 | * 14 | * @author yuqf 15 | */ 16 | @Setter 17 | @Getter 18 | public class ApiInfoParam { 19 | 20 | /** 21 | * 基本信息 22 | */ 23 | private BaseApiInfo baseInfo; 24 | 25 | /** 26 | * sql 27 | */ 28 | private BaseApiSql sqlInfo; 29 | 30 | /** 31 | * 请求参数 32 | */ 33 | private List requestParam; 34 | 35 | /** 36 | * 返回参数 37 | */ 38 | private List responseParam; 39 | /** 40 | * 查询引擎 41 | */ 42 | private String queryEngine; 43 | } 44 | -------------------------------------------------------------------------------- /crabc-boot/crabc-core/src/main/java/cn/crabc/core/app/entity/vo/ApiInfoVO.java: -------------------------------------------------------------------------------- 1 | package cn.crabc.core.app.entity.vo; 2 | 3 | import cn.crabc.core.app.entity.BaseApiInfo; 4 | import cn.crabc.core.app.entity.BaseApiParam; 5 | import cn.crabc.core.app.entity.BaseApiSql; 6 | import lombok.Getter; 7 | import lombok.Setter; 8 | 9 | import java.util.ArrayList; 10 | import java.util.List; 11 | 12 | /** 13 | * API详情 14 | */ 15 | @Setter 16 | @Getter 17 | public class ApiInfoVO { 18 | /** 19 | * 基本信息 20 | */ 21 | private BaseApiInfo baseInfo; 22 | 23 | /** 24 | * sql 25 | */ 26 | private BaseApiSql sqlInfo; 27 | /** 28 | * 查询引擎 29 | */ 30 | private String queryEngine; 31 | 32 | /** 33 | * 请求参数 34 | */ 35 | private List requestParam = new ArrayList<>(); 36 | 37 | /** 38 | * 返回参数 39 | */ 40 | private List responseParam = new ArrayList<>(); 41 | 42 | } 43 | -------------------------------------------------------------------------------- /docker-compose.yml: -------------------------------------------------------------------------------- 1 | version: "3" 2 | services: 3 | crabcdb: 4 | image: mysql:latest 5 | networks: 6 | - crabc_network 7 | command: 8 | --character-set-server=utf8mb4 9 | --collation-server=utf8mb4_unicode_ci 10 | --default-authentication-plugin=mysql_native_password 11 | volumes: 12 | - /opt/crabc/mysql:/var/lib/mysql 13 | # 加载库表数据 14 | - /opt/crabc/mysql/init:/docker-entrypoint-initdb.d 15 | environment: 16 | - MYSQL_ROOT_PASSWORD:=admin123 17 | - MYSQL_USER=admin 18 | - MYSQL_PASSWORD=admin123 19 | crabc-admin: 20 | image: crabc/crabc-admin:latest 21 | container_name: crabc-admin 22 | depends_on: 23 | - crabcdb 24 | networks: 25 | - crabc_network 26 | ports: 27 | - "9377:9377" 28 | environment: 29 | - db_url=jdbc:mysql://crabcdb:3306/crabc 30 | - db_user=admindb 31 | - db_pwd=admin123 32 | 33 | networks: 34 | crabc_network: -------------------------------------------------------------------------------- /crabc-boot/crabc-core/src/main/java/cn/crabc/core/app/util/PageInfo.java: -------------------------------------------------------------------------------- 1 | package cn.crabc.core.app.util; 2 | 3 | import com.github.pagehelper.PageSerializable; 4 | 5 | import java.util.List; 6 | 7 | /** 8 | * 分页对象 9 | * 10 | * @author yuqf 11 | */ 12 | public class PageInfo extends PageSerializable { 13 | private int pageNum; 14 | private int pageSize; 15 | 16 | public PageInfo() { 17 | } 18 | 19 | public PageInfo(List list,int pageNum,int pageSize) { 20 | super(list); 21 | this.pageNum = pageNum; 22 | this.pageSize = pageSize; 23 | } 24 | 25 | public int getPageNum() { 26 | return pageNum; 27 | } 28 | 29 | public void setPageNum(int pageNum) { 30 | this.pageNum = pageNum; 31 | } 32 | 33 | public int getPageSize() { 34 | return pageSize; 35 | } 36 | 37 | public void setPageSize(int pageSize) { 38 | this.pageSize = pageSize; 39 | } 40 | } 41 | -------------------------------------------------------------------------------- /crabc-boot/crabc-core/src/main/java/cn/crabc/core/app/entity/vo/RequestParamsVO.java: -------------------------------------------------------------------------------- 1 | package cn.crabc.core.app.entity.vo; 2 | 3 | import lombok.Getter; 4 | import lombok.Setter; 5 | 6 | import java.util.List; 7 | 8 | @Setter 9 | @Getter 10 | public class RequestParamsVO { 11 | /** 12 | * 参数名 13 | */ 14 | private String paramName; 15 | 16 | /** 17 | * 参数模型,request,response 18 | */ 19 | private String paramModel; 20 | 21 | /** 22 | * 是否必填 23 | */ 24 | private String required; 25 | 26 | /** 27 | * 操作 28 | */ 29 | private String operation; 30 | 31 | /** 32 | * 参数类型 33 | */ 34 | private String paramType; 35 | 36 | /** 37 | * 参数默认值 38 | */ 39 | private String defaultValue; 40 | 41 | /** 42 | * 参数示例值 43 | */ 44 | private String example; 45 | 46 | /** 47 | * 参数备注 48 | */ 49 | private String paramDesc; 50 | 51 | private List children; 52 | } 53 | -------------------------------------------------------------------------------- /crabc-boot/crabc-datasource/src/main/java/cn/crabc/core/datasource/util/PageInfo.java: -------------------------------------------------------------------------------- 1 | package cn.crabc.core.datasource.util; 2 | 3 | import com.github.pagehelper.PageSerializable; 4 | 5 | import java.util.List; 6 | 7 | /** 8 | * 分页对象 9 | * 10 | * @author yuqf 11 | * 12 | */ 13 | public class PageInfo extends PageSerializable { 14 | private int pageNum; 15 | private int pageSize; 16 | 17 | public PageInfo() { 18 | } 19 | 20 | public PageInfo(List list, int pageNum, int pageSize) { 21 | super(list); 22 | this.pageNum = pageNum; 23 | this.pageSize = pageSize; 24 | } 25 | 26 | public int getPageNum() { 27 | return pageNum; 28 | } 29 | 30 | public void setPageNum(int pageNum) { 31 | this.pageNum = pageNum; 32 | } 33 | 34 | public int getPageSize() { 35 | return pageSize; 36 | } 37 | 38 | public void setPageSize(int pageSize) { 39 | this.pageSize = pageSize; 40 | } 41 | } 42 | -------------------------------------------------------------------------------- /crabc-boot/crabc-core/src/main/java/cn/crabc/core/app/mapper/BaseUserMapper.java: -------------------------------------------------------------------------------- 1 | package cn.crabc.core.app.mapper; 2 | 3 | import cn.crabc.core.app.entity.BaseUser; 4 | import org.apache.ibatis.annotations.Mapper; 5 | import org.apache.ibatis.annotations.Param; 6 | 7 | import java.util.List; 8 | 9 | /** 10 | * 用户信息 接口 11 | * 12 | * @author yuqf 13 | */ 14 | @Mapper 15 | public interface BaseUserMapper { 16 | 17 | /** 18 | * 用户列表 19 | * @return 20 | */ 21 | List selectList(String userName); 22 | 23 | /** 24 | * 查询用户信息 25 | * @param userId 26 | * @param userName 27 | * @return 28 | */ 29 | BaseUser selectOne(@Param("userId") Long userId, @Param("userName") String userName); 30 | 31 | /** 32 | * 编辑用户 33 | * @param baseUser 34 | * @return 35 | */ 36 | Integer updateUser(BaseUser baseUser); 37 | 38 | /** 39 | * 新增用户 40 | * @param baseUser 41 | * @return 42 | */ 43 | Integer insertUser(BaseUser baseUser); 44 | } 45 | -------------------------------------------------------------------------------- /crabc-boot/crabc-core/src/main/java/cn/crabc/core/app/config/LoadingData.java: -------------------------------------------------------------------------------- 1 | package cn.crabc.core.app.config; 2 | 3 | import cn.crabc.core.app.service.system.IBaseApiInfoService; 4 | import org.springframework.beans.factory.InitializingBean; 5 | import org.springframework.beans.factory.annotation.Autowired; 6 | import org.springframework.scheduling.annotation.Scheduled; 7 | import org.springframework.stereotype.Component; 8 | 9 | /** 10 | * 加载数据 11 | */ 12 | @Component 13 | public class LoadingData implements InitializingBean { 14 | @Autowired 15 | private IBaseApiInfoService iBaseApiInfoService; 16 | 17 | /** 18 | * 启动加载 19 | * @throws Exception 20 | */ 21 | @Override 22 | public void afterPropertiesSet() throws Exception { 23 | iBaseApiInfoService.initApi(); 24 | } 25 | 26 | /** 27 | * 定时加载 28 | */ 29 | @Scheduled(cron = "${crabc.corn.api:0 0/5 * * * ?}") // 每5分钟全量加载一次 30 | public void task() { 31 | iBaseApiInfoService.initApi(); 32 | } 33 | 34 | } 35 | -------------------------------------------------------------------------------- /crabc-boot/crabc-core/src/main/java/cn/crabc/core/app/entity/BaseUser.java: -------------------------------------------------------------------------------- 1 | package cn.crabc.core.app.entity; 2 | 3 | 4 | import com.fasterxml.jackson.annotation.JsonIgnoreProperties; 5 | import lombok.Getter; 6 | import lombok.Setter; 7 | 8 | /** 9 | * 用户信息 10 | * 11 | * @author yuqf 12 | */ 13 | @Setter 14 | @Getter 15 | @JsonIgnoreProperties(value = {"password"}) 16 | public class BaseUser extends BaseEntity { 17 | 18 | /** 用户ID */ 19 | private Long userId; 20 | 21 | /** 角色 */ 22 | private String role; 23 | 24 | /** 用户账号 */ 25 | private String username; 26 | 27 | /** 用户昵称 */ 28 | private String nickname; 29 | 30 | /** 用户邮箱 */ 31 | private String email; 32 | 33 | /** 手机号码 */ 34 | private String phone; 35 | 36 | /** 用户性别 */ 37 | private String sex; 38 | 39 | /** 用户头像 */ 40 | private String picture; 41 | 42 | /** 密码 */ 43 | private String password; 44 | 45 | /** 帐号状态(0正常 1停用) */ 46 | private String status; 47 | 48 | private String remark; 49 | } 50 | -------------------------------------------------------------------------------- /crabc-boot/crabc-core/src/main/resources/static/assets/gitee.24a06c29.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /crabc-boot/crabc-spi/src/main/java/cn/crabc/core/spi/bean/Schema.java: -------------------------------------------------------------------------------- 1 | package cn.crabc.core.spi.bean; 2 | 3 | import java.io.Serializable; 4 | 5 | /** 6 | * Schema属性 7 | * 8 | * @author yuqf 9 | */ 10 | public class Schema implements Serializable { 11 | private static final long serialVersionUID = 1L; 12 | /** 数据源Id */ 13 | private String datasourceId; 14 | /** 库 */ 15 | private String catalog; 16 | /** 模式 */ 17 | private String schema; 18 | 19 | public String getCatalog() { 20 | return catalog; 21 | } 22 | 23 | public void setCatalog(String catalog) { 24 | this.catalog = catalog; 25 | } 26 | 27 | public String getDatasourceId() { 28 | return datasourceId; 29 | } 30 | 31 | public void setDatasourceId(String datasourceId) { 32 | this.datasourceId = datasourceId; 33 | } 34 | 35 | public String getSchema() { 36 | return schema; 37 | } 38 | 39 | public void setSchema(String schema) { 40 | this.schema = schema; 41 | } 42 | } 43 | -------------------------------------------------------------------------------- /crabc-boot/crabc-core/src/main/java/cn/crabc/core/app/service/system/IBaseGroupService.java: -------------------------------------------------------------------------------- 1 | package cn.crabc.core.app.service.system; 2 | 3 | import cn.crabc.core.app.entity.BaseGroup; 4 | import cn.crabc.core.app.entity.vo.BaseGroupVO; 5 | 6 | import java.util.List; 7 | 8 | /** 9 | * api分组 服务接口 10 | * 11 | * @author yuqf 12 | */ 13 | public interface IBaseGroupService { 14 | 15 | /** 16 | * 新增分组 17 | * @param group 18 | * @return 19 | */ 20 | Integer addGroup(BaseGroup group); 21 | 22 | /** 23 | * 编辑分组 24 | * @param group 25 | * @param userId 26 | * @return 27 | */ 28 | Integer updateGroup(BaseGroup group, String userId); 29 | 30 | /** 31 | * 删除分组 32 | * @param groupId 33 | * @param userId 34 | * @return 35 | */ 36 | Integer delteGroup(Integer groupId, String userId); 37 | 38 | /** 39 | * 分组树 40 | * @param userId 41 | * @param apiId 42 | * @return 43 | */ 44 | List groupTree(String userId, Long apiId); 45 | } 46 | -------------------------------------------------------------------------------- /crabc-boot/crabc-core/src/main/java/cn/crabc/core/app/service/system/IBaseUserService.java: -------------------------------------------------------------------------------- 1 | package cn.crabc.core.app.service.system; 2 | 3 | import cn.crabc.core.app.entity.BaseUser; 4 | import cn.crabc.core.datasource.util.PageInfo; 5 | 6 | /** 7 | * 用户信息 接口 8 | * 9 | * @author yuqf 10 | */ 11 | public interface IBaseUserService { 12 | 13 | /** 14 | * 用户分页列表 15 | * @return 16 | */ 17 | PageInfo page(String userName, Integer pageNum, Integer pageSize); 18 | 19 | /** 20 | * 查询用户信息 21 | * @param userName 22 | * @return 23 | */ 24 | BaseUser getUserByName(String userName); 25 | 26 | /** 27 | * 查询用户信息 28 | * @param userId 29 | * @return 30 | */ 31 | BaseUser getUserById(Long userId); 32 | 33 | /** 34 | * 编辑用户 35 | * @param baseUser 36 | * @return 37 | */ 38 | Integer updateUser(BaseUser baseUser); 39 | 40 | /** 41 | * 新增用户 42 | * @param baseUser 43 | * @return 44 | */ 45 | Integer addUser(BaseUser baseUser); 46 | } 47 | -------------------------------------------------------------------------------- /crabc-boot/crabc-admin/src/main/resources/application.yml: -------------------------------------------------------------------------------- 1 | # Tomcat 2 | server: 3 | port: 9377 4 | spring: 5 | application: 6 | name: crabc-admin 7 | main: 8 | banner-mode: off 9 | jackson: 10 | date-format: yyyy-MM-dd HH:mm:ss 11 | time-zone: GMT+8 12 | datasource: 13 | type: com.alibaba.druid.pool.DruidDataSource 14 | url: jdbc:mysql://127.0.0.1:3306/crabc?characterEncoding=UTF-8&serverTimezone=Asia/Shanghai&useSSL=false&allowPublicKeyRetrieval=true 15 | username: root 16 | password: root 17 | # mybatis配置 18 | mybatis: 19 | # 搜索指定包别名 20 | typeAliasesPackage: cn.crabc.core.admin.entity 21 | # 配置mapper的扫描,找到所有的mapper.xml映射文件 22 | mapperLocations: classpath*:mapper/**/*.xml 23 | config-location: classpath:mybatis-config.xml 24 | # configuration: 25 | # log-impl: org.apache.ibatis.logging.stdout.StdOutImpl 26 | 27 | pagehelper: 28 | autoRuntimeDialect: true # 开启多数据源分页识别 29 | 30 | # es健康检查 31 | management: 32 | health: 33 | elasticsearch: 34 | enabled: false 35 | # 签名认证过期时间 36 | crabc: 37 | auth: 38 | expiresTime: 10 -------------------------------------------------------------------------------- /crabc-boot/crabc-core/src/main/java/cn/crabc/core/app/entity/BaseApp.java: -------------------------------------------------------------------------------- 1 | package cn.crabc.core.app.entity; 2 | 3 | 4 | import lombok.Getter; 5 | import lombok.Setter; 6 | 7 | /** 8 | * 应用秘密 9 | * 10 | * @author yuqf 11 | */ 12 | @Setter 13 | @Getter 14 | public class BaseApp extends BaseEntity { 15 | 16 | /** 17 | * 应用ID 18 | */ 19 | private Long appId; 20 | /** 21 | * 应用名 22 | */ 23 | private String appName; 24 | /** 25 | * 应用描述 26 | */ 27 | private String appDesc; 28 | /** 29 | * 认证code 30 | */ 31 | private String appCode; 32 | /** 33 | * 密钥ID 34 | */ 35 | private String appKey; 36 | /** 37 | * 密钥 38 | */ 39 | private String appSecret; 40 | /** 41 | * 策略类型:白名单:white、黑名单black 42 | */ 43 | private String strategyType; 44 | /** 45 | * ip地址,分号分割 46 | */ 47 | private String ips; 48 | /** 49 | * 状态:1启用,0,禁用 50 | */ 51 | private Integer enabled; 52 | /** 53 | * 关联的apiId 54 | */ 55 | private Long apiId; 56 | } 57 | -------------------------------------------------------------------------------- /crabc-boot/crabc-core/src/main/java/cn/crabc/core/app/service/core/IBaseDataService.java: -------------------------------------------------------------------------------- 1 | package cn.crabc.core.app.service.core; 2 | 3 | import cn.crabc.core.app.entity.vo.PreviewVO; 4 | import cn.crabc.core.spi.bean.BaseDataSource; 5 | import java.util.Map; 6 | 7 | /** 8 | * 通用方法服务类 9 | * 10 | * @author yuqf 11 | */ 12 | public interface IBaseDataService { 13 | /** 14 | * 测试数据库 15 | * 16 | * @param dataSource 17 | * @return 18 | */ 19 | String testConnection(BaseDataSource dataSource); 20 | 21 | /** 22 | * SQL预览 23 | * 24 | * @param datasourceId 25 | * @param schema 26 | * @param sql 27 | * @return 28 | */ 29 | PreviewVO sqlPreview(String datasourceId, String datasourceType,String schema, String sql); 30 | 31 | /** 32 | * 测试API 33 | * 34 | * @param datasourceId 35 | * @param schema 36 | * @param sql 37 | * @param params 38 | * @return 39 | */ 40 | Object execute(String datasourceId,String schema, String datasourceType, String sql, Map params); 41 | } 42 | -------------------------------------------------------------------------------- /crabc-boot/crabc-datasource/src/main/java/cn/crabc/core/datasource/driver/jdbc/JdbcDataSourceDriver.java: -------------------------------------------------------------------------------- 1 | package cn.crabc.core.datasource.driver.jdbc; 2 | 3 | import cn.crabc.core.datasource.mapper.BaseDataHandleMapper; 4 | import cn.crabc.core.spi.MetaDataMapper; 5 | import cn.crabc.core.spi.StatementMapper; 6 | 7 | /** 8 | * JDBC通用操作实现类 9 | * 10 | * @author yuqf 11 | */ 12 | public class JdbcDataSourceDriver extends DefaultDataSourceDriver { 13 | private BaseDataHandleMapper baseDataHandleMapper; 14 | private JdbcStatement jdbcStatement; 15 | private JdbcMetaData jdbcMetaData; 16 | 17 | public JdbcDataSourceDriver(BaseDataHandleMapper baseDataHandleMapper) { 18 | this.baseDataHandleMapper = baseDataHandleMapper; 19 | jdbcStatement = new JdbcStatement(baseDataHandleMapper); 20 | jdbcMetaData = new JdbcMetaData(); 21 | } 22 | 23 | @Override 24 | public MetaDataMapper getMetaData() { 25 | return jdbcMetaData; 26 | } 27 | 28 | @Override 29 | public StatementMapper getStatement() { 30 | return jdbcStatement; 31 | } 32 | } 33 | -------------------------------------------------------------------------------- /crabc-spring-boot-starter/src/main/java/cn/crabc/core/starter/CrabcConfiguration.java: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright 2023, crabc.cn (creabc@qq.com) 3 | * 4 | * Licensed under the Apache License, Version 2.0 (the "License"); 5 | * you may not use this file except in compliance with the License. 6 | * You may obtain a copy of the License at 7 | * 8 | * http://www.apache.org/licenses/LICENSE-2.0 9 | * 10 | * Unless required by applicable law or agreed to in writing, software 11 | * distributed under the License is distributed on an "AS IS" BASIS, 12 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 | * See the License for the specific language governing permissions and 14 | * limitations under the License. 15 | */ 16 | package cn.crabc.core.starter; 17 | 18 | import org.mybatis.spring.annotation.MapperScan; 19 | import org.springframework.context.annotation.ComponentScan; 20 | import org.springframework.context.annotation.Configuration; 21 | 22 | @MapperScan({"cn.crabc.core.*.mapper"}) 23 | @ComponentScan("cn.crabc.core") 24 | @Configuration 25 | public class CrabcConfiguration { 26 | } 27 | -------------------------------------------------------------------------------- /crabc-boot/crabc-core/src/main/java/cn/crabc/core/app/mapper/BaseAppMapper.java: -------------------------------------------------------------------------------- 1 | package cn.crabc.core.app.mapper; 2 | 3 | import cn.crabc.core.app.entity.BaseApp; 4 | import org.apache.ibatis.annotations.Mapper; 5 | 6 | import java.util.List; 7 | 8 | /** 9 | * 应用配置 Mapper接口 10 | * 11 | * @author yuqf 12 | */ 13 | @Mapper 14 | public interface BaseAppMapper { 15 | 16 | /** 17 | * 应用列表 18 | * @return 19 | */ 20 | List selectList(String appName); 21 | 22 | /** 23 | * 应用和API的关系 24 | * @return 25 | */ 26 | List selectApiApp(Long apiId); 27 | 28 | /** 29 | * 应用对象 30 | * @param appId 31 | * @return 32 | */ 33 | BaseApp selectOne(Long appId); 34 | 35 | /** 36 | * 新增应用 37 | * @param app 38 | * @return 39 | */ 40 | Integer insert(BaseApp app); 41 | 42 | /** 43 | * 编辑应用 44 | * @param app 45 | * @return 46 | */ 47 | Integer update(BaseApp app); 48 | 49 | /** 50 | * 删除应用 51 | * @param appId 52 | * @return 53 | */ 54 | Integer delete(Long appId); 55 | } 56 | -------------------------------------------------------------------------------- /crabc-boot/crabc-core/src/main/java/cn/crabc/core/app/service/system/IBaseAppService.java: -------------------------------------------------------------------------------- 1 | package cn.crabc.core.app.service.system; 2 | 3 | import cn.crabc.core.app.entity.BaseApp; 4 | import cn.crabc.core.datasource.util.PageInfo; 5 | 6 | import java.util.List; 7 | 8 | /** 9 | * 应用 服务接口 10 | * 11 | * @author yuqf 12 | */ 13 | public interface IBaseAppService { 14 | 15 | /** 16 | * 应用分页列表 17 | * @param appName 18 | * @param appCode 19 | * @param pageNum 20 | * @param pageSize 21 | * @return 22 | */ 23 | PageInfo appPage(String appName, String appCode, Integer pageNum, Integer pageSize); 24 | 25 | /** 26 | * 列表 27 | * @param appName 28 | * @return 29 | */ 30 | List appList(String appName); 31 | 32 | /** 33 | * 新增应用 34 | * @param app 35 | * @return 36 | */ 37 | Integer addApp(BaseApp app); 38 | 39 | /** 40 | * 编辑应用 41 | * @param app 42 | * @return 43 | */ 44 | Integer updateApp(BaseApp app); 45 | 46 | /** 47 | * 删除应用 48 | * @param appId 49 | * @return 50 | */ 51 | Integer deleteApp(Long appId); 52 | 53 | } 54 | -------------------------------------------------------------------------------- /crabc-boot/crabc-core/src/main/java/cn/crabc/core/app/enums/ResultTypeEnum.java: -------------------------------------------------------------------------------- 1 | package cn.crabc.core.app.enums; 2 | 3 | /** 4 | * 返回结果类型 操作枚举 5 | * 6 | * @author yuqf 7 | */ 8 | public enum ResultTypeEnum { 9 | ONE("one", "对象"), 10 | ARRAY("array", "数组"), 11 | EXCEL("excel", "excel文件"); 12 | 13 | private String name; 14 | private String value; 15 | 16 | ResultTypeEnum(String name, String value) { 17 | this.name = name; 18 | this.value = value; 19 | } 20 | 21 | /** 22 | * 校验是否存在类型 23 | * @param name 24 | * @return 25 | */ 26 | public static boolean checkType(String name){ 27 | for (ResultTypeEnum type : values()){ 28 | if (type.getName().equals(name.toLowerCase())){ 29 | return true; 30 | } 31 | } 32 | return false; 33 | } 34 | public String getName() { 35 | return name; 36 | } 37 | 38 | public void setName(String name) { 39 | this.name = name; 40 | } 41 | 42 | public String getValue() { 43 | return value; 44 | } 45 | 46 | public void setValue(String value) { 47 | this.value = value; 48 | } 49 | 50 | } 51 | -------------------------------------------------------------------------------- /crabc-boot/crabc-core/src/main/java/cn/crabc/core/app/entity/BaseApiLog.java: -------------------------------------------------------------------------------- 1 | package cn.crabc.core.app.entity; 2 | 3 | import lombok.Getter; 4 | import lombok.Setter; 5 | 6 | import java.io.Serializable; 7 | import java.util.Date; 8 | 9 | /** 10 | * api访问日志 11 | * 12 | * @author yuqf 13 | */ 14 | @Setter 15 | @Getter 16 | public class BaseApiLog implements Serializable { 17 | 18 | private Long logId; 19 | /** 20 | * api业务唯一ID 21 | */ 22 | private Long apiId; 23 | /** 24 | * 接口名称 25 | */ 26 | private String apiName; 27 | /** 28 | * 接口路径 29 | */ 30 | private String apiPath; 31 | /** 32 | * 请求方式 get、post、put、delete、aptch 33 | */ 34 | private String apiMethod; 35 | /** 36 | * 授权类型:none、code、secret 37 | */ 38 | private String authType; 39 | private String appName; 40 | private String requestIp; 41 | private String queryParam; 42 | private String requestBody; 43 | private String responseBody; 44 | private Integer bodySize; 45 | private String requestStatus; 46 | private Date requestTime; 47 | private Date responseTime; 48 | private Long costTime; 49 | private Integer responseCode; 50 | } 51 | -------------------------------------------------------------------------------- /crabc-boot/crabc-core/src/main/java/cn/crabc/core/app/util/ApiThreadLocal.java: -------------------------------------------------------------------------------- 1 | package cn.crabc.core.app.util; 2 | 3 | import cn.crabc.core.app.entity.dto.ApiInfoDTO; 4 | import cn.crabc.core.app.filter.AuthInterceptor; 5 | import org.slf4j.Logger; 6 | import org.slf4j.LoggerFactory; 7 | 8 | /** 9 | * 上下文 当前用户API信息 10 | * 11 | * @author yuqf 12 | */ 13 | public class ApiThreadLocal { 14 | private static final Logger log = LoggerFactory.getLogger(ApiThreadLocal.class); 15 | private static ThreadLocal apiInfo =new ThreadLocal<>(); 16 | 17 | /** 18 | * API存入上下文中 19 | * @param api 20 | */ 21 | public static void set(ApiInfoDTO api){ 22 | log.info("--> 设置上下文API信息,{}",api.getApiPath()); 23 | apiInfo.set(api); 24 | } 25 | 26 | /** 27 | * 用户API数据 28 | */ 29 | public static ApiInfoDTO get(){ 30 | return apiInfo.get(); 31 | } 32 | 33 | /** 34 | * 获取apiId 35 | */ 36 | public static Long getApiId(){ 37 | return apiInfo.get().getApiId(); 38 | } 39 | 40 | /** 41 | * 清除 42 | */ 43 | public static void remove(){ 44 | log.info("<-- 清除上下文API信息"); 45 | apiInfo.remove(); 46 | } 47 | } 48 | -------------------------------------------------------------------------------- /crabc-boot/crabc-core/src/main/java/cn/crabc/core/app/controller/ApiLogController.java: -------------------------------------------------------------------------------- 1 | package cn.crabc.core.app.controller; 2 | 3 | import cn.crabc.core.app.entity.param.ApiLogParam; 4 | import cn.crabc.core.app.service.system.IBaseApiLogService; 5 | import cn.crabc.core.datasource.util.PageInfo; 6 | import cn.crabc.core.app.util.Result; 7 | import org.springframework.beans.factory.annotation.Autowired; 8 | import org.springframework.web.bind.annotation.PostMapping; 9 | import org.springframework.web.bind.annotation.RequestBody; 10 | import org.springframework.web.bind.annotation.RequestMapping; 11 | import org.springframework.web.bind.annotation.RestController; 12 | 13 | /** 14 | * API访问日志 15 | * 16 | * @author yuqf 17 | */ 18 | @RestController 19 | @RequestMapping("/api/box/sys/api/log") 20 | public class ApiLogController { 21 | 22 | @Autowired 23 | private IBaseApiLogService iBaseApiLogService; 24 | 25 | /** 26 | * 日志分页 27 | * @param apiLogParam 28 | * @return 29 | */ 30 | @PostMapping("/page") 31 | public Result logList(@RequestBody ApiLogParam apiLogParam) { 32 | PageInfo page = iBaseApiLogService.page(apiLogParam); 33 | return Result.success(page); 34 | } 35 | } 36 | -------------------------------------------------------------------------------- /crabc-boot/crabc-core/src/main/java/cn/crabc/core/app/enums/SqlTypeEnum.java: -------------------------------------------------------------------------------- 1 | package cn.crabc.core.app.enums; 2 | 3 | /** 4 | * SQL DML操作枚举 5 | * 6 | * @author yuqf 7 | */ 8 | public enum SqlTypeEnum { 9 | SELECT("select", "查询"), 10 | INSERT("insert", "插入"), 11 | UPDATE("update", "修改"), 12 | DELETE("delete", "删除"); 13 | 14 | private String name; 15 | private String value; 16 | 17 | SqlTypeEnum(String name, String value) { 18 | this.name = name; 19 | this.value = value; 20 | } 21 | 22 | /** 23 | * 校验是否存在类型 24 | * @param name 25 | * @return 26 | */ 27 | public static boolean checkType(String name){ 28 | for (SqlTypeEnum type : values()){ 29 | if (type.getName().equals(name.toLowerCase())){ 30 | return true; 31 | } 32 | } 33 | return false; 34 | } 35 | public String getName() { 36 | return name; 37 | } 38 | 39 | public void setName(String name) { 40 | this.name = name; 41 | } 42 | 43 | public String getValue() { 44 | return value; 45 | } 46 | 47 | public void setValue(String value) { 48 | this.value = value; 49 | } 50 | 51 | } 52 | -------------------------------------------------------------------------------- /crabc-boot/crabc-core/src/main/java/cn/crabc/core/app/mapper/BaseGroupMapper.java: -------------------------------------------------------------------------------- 1 | package cn.crabc.core.app.mapper; 2 | 3 | import cn.crabc.core.app.entity.BaseGroup; 4 | import cn.crabc.core.app.entity.vo.BaseGroupVO; 5 | import cn.crabc.core.app.entity.vo.GroupApiVO; 6 | import org.apache.ibatis.annotations.Mapper; 7 | 8 | import java.util.List; 9 | 10 | /** 11 | * api分组 接口 12 | * 13 | * @author yuqf 14 | */ 15 | @Mapper 16 | public interface BaseGroupMapper { 17 | 18 | /** 19 | * 新增分组 20 | */ 21 | Integer insert(BaseGroup group); 22 | 23 | /** 24 | * 编辑分组 25 | */ 26 | Integer update(BaseGroup group); 27 | 28 | /** 29 | * 删除分组 30 | * @param groupId 31 | */ 32 | Integer delete(Integer groupId); 33 | 34 | /** 35 | * 删除用户分组 36 | * @param userId 37 | */ 38 | Integer deleteAll(String userId); 39 | 40 | /** 41 | * 查询分组列表 42 | * @param userId 43 | */ 44 | List selectList(String userId); 45 | 46 | /** 47 | * 查询详情 48 | * @param groupId 49 | */ 50 | 51 | BaseGroup selectOne(Integer groupId); 52 | 53 | /** 54 | * 获取分组下API 55 | * 56 | * @return 57 | */ 58 | List selectGroupApi(); 59 | } 60 | -------------------------------------------------------------------------------- /crabc-boot/crabc-core/src/main/java/cn/crabc/core/app/mapper/BaseDataSourceMapper.java: -------------------------------------------------------------------------------- 1 | package cn.crabc.core.app.mapper; 2 | 3 | 4 | import cn.crabc.core.app.entity.BaseDatasource; 5 | import cn.crabc.core.spi.bean.BaseDataSource; 6 | import org.apache.ibatis.annotations.Mapper; 7 | 8 | import java.util.List; 9 | 10 | /** 11 | * 数据源 Mapper接口 12 | * 13 | * @author yuqf 14 | */ 15 | @Mapper 16 | public interface BaseDataSourceMapper { 17 | 18 | List list(); 19 | 20 | /** 21 | * 22 | * 数据源列表 23 | * @param dataSourceName 24 | * @return 25 | */ 26 | List selectList(String dataSourceName); 27 | /** 28 | * 查询数据源详情 29 | * @param datasourceId 30 | * @return 31 | */ 32 | BaseDatasource selectOne(Integer datasourceId); 33 | 34 | /** 35 | * 插入数据源 36 | * @param dataSource 37 | * @return 38 | */ 39 | Integer insertDataSource(BaseDatasource dataSource); 40 | 41 | /** 42 | * 更新数据源 43 | * @param dataSource 44 | * @return 45 | */ 46 | Integer updateDataSource(BaseDatasource dataSource); 47 | 48 | /** 49 | * 删除数据源 50 | * @param datasourceId 51 | * @return 52 | */ 53 | Integer deleteDataSource(Integer datasourceId); 54 | } 55 | -------------------------------------------------------------------------------- /crabc-boot/crabc-core/src/main/resources/static/css/chunk-18c402ac.0e7a30b4.css: -------------------------------------------------------------------------------- 1 | [data-v-30924560] .redSpan{color:red}.consumer-components-box[data-v-30924560]{background:#fff}.consumer-components-box .consumer-components-head[data-v-30924560]{padding:20px 0}.consumer-components-box .consumer-components-head .consumer-components-head-top[data-v-30924560]{display:flex;flex-wrap:wrap}.consumer-components-box .consumer-components-head .consumer-components-head-top>span[data-v-30924560]{margin:0 20px 0 0}.consumer-components-box .consumer-components-input[data-v-30924560]{width:160px}.consumer-components-box .consumer-components-head-bottom[data-v-30924560]{margin:20px 0}.consumer-components-box .search-btn[data-v-30924560]{margin-left:30px;margin-right:10px}.consumer-components-box .consumer-components-table[data-v-30924560]{margin:0 auto}.consumer-components-box .ant-table-pagination.ant-pagination[data-v-30924560]{position:relative;bottom:10px!important}[data-v-30924560] .ant-table-body .ant-btn{padding:0;margin-right:20px}.jurisdiction-box-head[data-v-fe85c69e]{width:100vw;height:100%;background:#fff;padding-top:30px;padding-left:22px;padding-bottom:20px}.jurisdiction-box-title[data-v-fe85c69e]{font-size:28px;font-weight:600;color:#333;line-height:60px}[data-v-fe85c69e] .ant-tabs-nav-scroll{background:#fff;padding-left:17px} -------------------------------------------------------------------------------- /crabc-boot/crabc-core/src/main/resources/static/assets/doc.394d01aa.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | ####################### java ############################## 2 | 3 | # Compiled class file 4 | *.class 5 | 6 | # Log file 7 | *.log 8 | 9 | # BlueJ files 10 | *.ctxt 11 | 12 | # Mobile Tools for Java (J2ME) 13 | .mtj.tmp/ 14 | 15 | # Package Files # 16 | #*.jar 17 | #*.war 18 | #*.ear 19 | #*.zip 20 | #*.tar.gz 21 | #*.rar 22 | 23 | # virtual machine crash logs, see http://www.java.com/en/download/help/error_hotspot.xml 24 | hs_err_pid* 25 | 26 | 27 | 28 | ####################### Build Tools ############################## 29 | target/ 30 | pom.xml.tag 31 | pom.xml.releaseBackup 32 | pom.xml.versionsBackup 33 | pom.xml.next 34 | release.properties 35 | dependency-reduced-pom.xml 36 | buildNumber.properties 37 | .mvn/timing.properties 38 | 39 | # Avoid ignoring Maven wrapper jar file (.jar files are usually ignored) 40 | !/.mvn/wrapper/maven-wrapper.jar 41 | 42 | .gradle 43 | /build/ 44 | 45 | ####################### svn ############################## 46 | .svn 47 | 48 | 49 | ####################### eclipse ############################## 50 | .project 51 | .settings 52 | bin/ 53 | logs/ 54 | .classpath 55 | 56 | 57 | ####################### idea ############################## 58 | .idea 59 | *.iws 60 | *.iml 61 | *.ipr 62 | 63 | 64 | ####################### other ############################## 65 | .tern-project 66 | *.swp 67 | 68 | .flattened-pom.xml 69 | *.log 70 | tmp/ -------------------------------------------------------------------------------- /crabc-boot/crabc-core/src/main/java/cn/crabc/core/app/mapper/BaseApiParamMapper.java: -------------------------------------------------------------------------------- 1 | package cn.crabc.core.app.mapper; 2 | 3 | import cn.crabc.core.app.entity.BaseApiParam; 4 | import cn.crabc.core.app.entity.vo.RequestParamsVO; 5 | import org.apache.ibatis.annotations.Mapper; 6 | import org.apache.ibatis.annotations.Param; 7 | 8 | import java.util.List; 9 | 10 | /** 11 | * API参数 Mapper接口 12 | * 13 | * @author yuqf 14 | */ 15 | @Mapper 16 | public interface BaseApiParamMapper { 17 | 18 | /** 19 | * API请求参数 20 | * @param apiId 21 | * @return 22 | */ 23 | List selectReqParams(Long apiId); 24 | 25 | /** 26 | * 查询API参数列表 27 | * @param apiId 28 | * @return 29 | */ 30 | List selectList(Long apiId); 31 | 32 | /** 33 | * 查询api详情参数 34 | * @param apiId 35 | * @return 36 | */ 37 | List selectApiParams(Long apiId); 38 | 39 | /** 40 | * 新增参数 41 | * @param param 42 | * @return 43 | */ 44 | Long insert(BaseApiParam param); 45 | 46 | /** 47 | * 批量新增 48 | * @param list 49 | * @return 50 | */ 51 | Long insertBatch(@Param("list") List list, @Param("apiId") Long apiId); 52 | 53 | /** 54 | * 删除API参数 55 | * @param apiId 56 | * @return 57 | */ 58 | Integer delete(Long apiId); 59 | } 60 | -------------------------------------------------------------------------------- /crabc-boot/crabc-core/src/main/resources/static/css/chunk-3b326e8c.86e8c762.css: -------------------------------------------------------------------------------- 1 | .err-alert[data-v-34e4b5fe]{margin-bottom:24px;margin-left:100px;margin-right:100px}.user-layout-login[data-v-34e4b5fe]{padding:10px;height:220px}.user-layout-login label[data-v-34e4b5fe]{font-size:14px}.user-layout-login .input-username[data-v-34e4b5fe] .ant-input{font-size:14px;border-radius:4px}.user-layout-login .getCaptcha[data-v-34e4b5fe]{display:block;width:100%;height:40px}.user-layout-login .forge-password[data-v-34e4b5fe]{font-size:14px}.user-layout-login button.login-button[data-v-34e4b5fe]{padding:0 15px;font-size:16px;height:40px;width:100%}.user-layout-login .user-login-other[data-v-34e4b5fe]{text-align:left;margin-top:24px;line-height:22px}.user-layout-login .user-login-other .item-icon[data-v-34e4b5fe]{font-size:24px;color:rgba(0,0,0,.2);margin-left:16px;vertical-align:middle;cursor:pointer;transition:color .3s}.user-layout-login .user-login-other .item-icon[data-v-34e4b5fe]:hover{color:#008ff8}.user-layout-login .user-login-other .register[data-v-34e4b5fe]{float:right}[data-v-34e4b5fe] .ant-tabs-bar{margin-bottom:10px}[data-v-34e4b5fe] .ant-tabs-nav{display:block}[data-v-34e4b5fe] .ant-tabs-nav .ant-tabs-tab{font-size:16px;width:50%;margin:0;font-weight:400}[data-v-34e4b5fe] .ant-tabs-nav .ant-tabs-ink-bar{height:1px}.login[data-v-34e4b5fe]{height:300px;width:100%;margin:0 auto}.login iframe[data-v-34e4b5fe]{height:300px;width:100%;border:none} -------------------------------------------------------------------------------- /crabc-boot/crabc-core/src/main/java/cn/crabc/core/app/service/system/impl/IBaseApiLogServiceImpl.java: -------------------------------------------------------------------------------- 1 | package cn.crabc.core.app.service.system.impl; 2 | 3 | import cn.crabc.core.app.entity.BaseApiLog; 4 | import cn.crabc.core.app.entity.param.ApiLogParam; 5 | import cn.crabc.core.app.mapper.BaseApiLogMapper; 6 | import cn.crabc.core.app.service.system.IBaseApiLogService; 7 | import cn.crabc.core.datasource.util.PageInfo; 8 | import com.github.pagehelper.PageHelper; 9 | import org.springframework.beans.factory.annotation.Autowired; 10 | import org.springframework.stereotype.Service; 11 | 12 | import java.util.List; 13 | 14 | /** 15 | * api日志 服务实现 16 | * 17 | * @author yuqf 18 | */ 19 | @Service 20 | public class IBaseApiLogServiceImpl implements IBaseApiLogService { 21 | 22 | @Autowired 23 | private BaseApiLogMapper baseApiLogMapper; 24 | 25 | @Override 26 | public Integer addLog(BaseApiLog log) { 27 | return baseApiLogMapper.insert(log); 28 | } 29 | 30 | @Override 31 | public PageInfo page(ApiLogParam param) { 32 | PageHelper.startPage(param.getPageNum(), param.getPageSize()); 33 | List list = baseApiLogMapper.selectList(param); 34 | return new PageInfo<>(list, param.getPageNum(), param.getPageSize()); 35 | } 36 | 37 | @Override 38 | public BaseApiLog logDetail(Long logId) { 39 | return baseApiLogMapper.selectOne(logId); 40 | } 41 | } 42 | -------------------------------------------------------------------------------- /crabc-boot/crabc-core/src/main/resources/static/js/app.ab531c38.js.LICENSE.txt: -------------------------------------------------------------------------------- 1 | /* 2 | object-assign 3 | (c) Sindre Sorhus 4 | @license MIT 5 | */ 6 | 7 | /* NProgress, (c) 2013, 2014 Rico Sta. Cruz - http://ricostacruz.com/nprogress 8 | * @license MIT */ 9 | 10 | /*! 11 | Copyright (c) 2018 Jed Watson. 12 | Licensed under the MIT License (MIT), see 13 | http://jedwatson.github.io/classnames 14 | */ 15 | 16 | /*! 17 | * EventEmitter v5.1.0 - git.io/ee 18 | * Unlicense - http://unlicense.org/ 19 | * Oliver Caldwell - http://oli.me.uk/ 20 | * @preserve 21 | */ 22 | 23 | /*! 24 | * Vue.js v2.7.14 25 | * (c) 2014-2022 Evan You 26 | * Released under the MIT License. 27 | */ 28 | 29 | /*! 30 | * clipboard.js v2.0.11 31 | * https://clipboardjs.com/ 32 | * 33 | * Licensed MIT © Zeno Rocha 34 | */ 35 | 36 | /*! regenerator-runtime -- Copyright (c) 2014-present, Facebook, Inc. -- license (MIT): https://github.com/babel/babel/blob/main/packages/babel-helpers/LICENSE */ 37 | 38 | /** 39 | * @license 40 | * Lodash 41 | * Copyright OpenJS Foundation and other contributors 42 | * Released under MIT license 43 | * Based on Underscore.js 1.8.3 44 | * Copyright Jeremy Ashkenas, DocumentCloud and Investigative Reporters & Editors 45 | */ 46 | 47 | /** 48 | * vuex v3.1.1 49 | * (c) 2019 Evan You 50 | * @license MIT 51 | */ 52 | 53 | //! moment.js 54 | 55 | //! moment.js locale configuration 56 | -------------------------------------------------------------------------------- /crabc-boot/crabc-core/src/main/java/cn/crabc/core/app/entity/BaseApiParam.java: -------------------------------------------------------------------------------- 1 | package cn.crabc.core.app.entity; 2 | 3 | import lombok.Getter; 4 | import lombok.Setter; 5 | 6 | /** 7 | * API参数 8 | * 9 | * @author yuqf 10 | */ 11 | @Setter 12 | @Getter 13 | public class BaseApiParam { 14 | 15 | private static final long serialVersionUID = 1L; 16 | 17 | /** 18 | * 自增主键ID 19 | */ 20 | private Long paramId; 21 | 22 | /** api主键 */ 23 | private Long apiId; 24 | 25 | /** 26 | * 参数名 27 | */ 28 | private String paramName; 29 | 30 | /** 31 | * 映射字段名 32 | */ 33 | private String columnName; 34 | 35 | /** 36 | * 参数模型,request,response 37 | */ 38 | private String paramModel; 39 | 40 | /** 41 | * 是否必填 42 | */ 43 | private Boolean required; 44 | 45 | /** 46 | * 操作 47 | */ 48 | private String operation; 49 | 50 | /** 51 | * 参数类型 52 | */ 53 | private String paramType; 54 | 55 | /** 56 | * 参数默认值 57 | */ 58 | private String defaultValue; 59 | 60 | /** 61 | * 参数示例值 62 | */ 63 | private String example; 64 | 65 | /** 66 | * 参数备注 67 | */ 68 | private String paramDesc; 69 | 70 | /** 71 | * 数据源Id 72 | */ 73 | private Integer datasourceId; 74 | 75 | /** 76 | * schema 77 | */ 78 | private String schemaName; 79 | 80 | /** 81 | * 表名 82 | */ 83 | private String tableName; 84 | 85 | } 86 | -------------------------------------------------------------------------------- /crabc-boot/crabc-core/src/main/java/cn/crabc/core/app/util/SM3Util.java: -------------------------------------------------------------------------------- 1 | package cn.crabc.core.app.util; 2 | import org.bouncycastle.crypto.digests.SM3Digest; 3 | import org.bouncycastle.jce.provider.BouncyCastleProvider; 4 | 5 | import java.nio.charset.StandardCharsets; 6 | import java.security.Security; 7 | import java.util.HexFormat; 8 | 9 | /** 10 | * 国密SM3加密工具类 11 | * 12 | * @author yuqf 13 | */ 14 | public class SM3Util { 15 | 16 | static { 17 | Security.addProvider(new BouncyCastleProvider()); 18 | } 19 | 20 | /** 21 | * 字符串的SM3算法哈希值 22 | * @param data 输入字符串 23 | * @return 十六进制格式的哈希值 24 | */ 25 | public static String hash(String data) { 26 | return hash(data.getBytes()); 27 | } 28 | 29 | /** 30 | * 节数组的SM3算法哈希值 31 | * @param bytes 输入字节数组 32 | * @return 十六进制格式的哈希值 33 | */ 34 | public static String hash(byte[] bytes) { 35 | SM3Digest digest = new SM3Digest(); 36 | digest.update(bytes, 0, bytes.length); 37 | byte[] result = new byte[digest.getDigestSize()]; 38 | digest.doFinal(result, 0); 39 | return HexFormat.of().formatHex(result); 40 | } 41 | 42 | /** 43 | * 验证SM3签名哈希值 44 | * @param data 待签名字符串 45 | * @param sign 预期哈希值 46 | * @return 是否验证通过 47 | */ 48 | public static boolean verify(String data, String sign) { 49 | String hash = hash(data.getBytes(StandardCharsets.UTF_8)); 50 | return hash.equalsIgnoreCase(sign); 51 | } 52 | } 53 | -------------------------------------------------------------------------------- /crabc-boot/crabc-admin/src/main/java/cn/crabc/core/admin/AdminApplication.java: -------------------------------------------------------------------------------- 1 | 2 | /* 3 | * Copyright 2023, crabc.cn (creabc@qq.com) 4 | * 5 | * Licensed under the Apache License, Version 2.0 (the "License"); 6 | * you may not use this file except in compliance with the License. 7 | * You may obtain a copy of the License at 8 | * 9 | * http://www.apache.org/licenses/LICENSE-2.0 10 | * 11 | * Unless required by applicable law or agreed to in writing, software 12 | * distributed under the License is distributed on an "AS IS" BASIS, 13 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 14 | * See the License for the specific language governing permissions and 15 | * limitations under the License. 16 | */ 17 | package cn.crabc.core.admin; 18 | 19 | import org.mybatis.spring.annotation.MapperScan; 20 | import org.springframework.boot.SpringApplication; 21 | import org.springframework.boot.autoconfigure.SpringBootApplication; 22 | import org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration; 23 | import org.springframework.context.annotation.ComponentScan; 24 | 25 | /** 26 | * 基础通用开发平台-启动类 27 | * 28 | * @author yuqf 29 | */ 30 | @MapperScan({"cn.crabc.core.*.mapper"}) 31 | @ComponentScan("cn.crabc.core") 32 | @SpringBootApplication(exclude = {DataSourceAutoConfiguration.class}) 33 | public class AdminApplication { 34 | public static void main(String[] args) { 35 | SpringApplication.run(AdminApplication.class, args); 36 | System.out.println("crabc-admin start success!!!"); 37 | } 38 | } 39 | -------------------------------------------------------------------------------- /crabc-boot/crabc-core/src/main/java/cn/crabc/core/app/config/WebConfiguration.java: -------------------------------------------------------------------------------- 1 | 2 | package cn.crabc.core.app.config; 3 | 4 | import org.springframework.boot.web.server.ConfigurableWebServerFactory; 5 | import org.springframework.boot.web.server.ErrorPage; 6 | import org.springframework.boot.web.server.WebServerFactoryCustomizer; 7 | import org.springframework.context.annotation.Bean; 8 | import org.springframework.context.annotation.Configuration; 9 | import org.springframework.http.HttpStatus; 10 | import org.springframework.web.servlet.config.annotation.CorsRegistry; 11 | import org.springframework.web.servlet.config.annotation.WebMvcConfigurer; 12 | 13 | /** 14 | * web配置 15 | * 16 | * @author yuqf 17 | */ 18 | @Configuration 19 | public class WebConfiguration implements WebMvcConfigurer { 20 | 21 | /** 22 | * 跳转首页 23 | * 24 | * @return 25 | */ 26 | @Bean 27 | public WebServerFactoryCustomizer webServerFactoryCustomizer() { 28 | return factory -> { 29 | ErrorPage error404Page = new ErrorPage(HttpStatus.NOT_FOUND, "/index.html"); 30 | factory.addErrorPages(error404Page); 31 | }; 32 | } 33 | 34 | /** 35 | * 跨域处理 36 | * @param registry 37 | */ 38 | @Override 39 | public void addCorsMappings(CorsRegistry registry) { 40 | registry.addMapping("/**") 41 | .allowedOriginPatterns("*") 42 | .allowCredentials(false) 43 | .allowedMethods("*") 44 | .allowedHeaders("*"); 45 | } 46 | } 47 | -------------------------------------------------------------------------------- /crabc-boot/crabc-core/src/main/resources/static/assets/format.efe4dc0b.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /crabc-spring-boot-starter/pom.xml: -------------------------------------------------------------------------------- 1 | 2 | 5 | 4.0.0 6 | 7 | crabc 8 | cn.crabc 9 | ${revision} 10 | 11 | crabc-spring-boot-starter 12 | 13 | 21 14 | 21 15 | UTF-8 16 | 17 | 18 | 19 | cn.crabc 20 | crabc-core 21 | ${project.version} 22 | 23 | 24 | org.springframework.boot 25 | spring-boot-starter 26 | 27 | 28 | org.springframework.boot 29 | spring-boot-autoconfigure 30 | 31 | 32 | org.springframework.boot 33 | spring-boot-configuration-processor 34 | true 35 | 36 | 37 | -------------------------------------------------------------------------------- /crabc-boot/crabc-core/src/main/resources/static/assets/github.6a7758ca.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /crabc-boot/crabc-core/src/main/java/cn/crabc/core/app/config/CacheConfig.java: -------------------------------------------------------------------------------- 1 | package cn.crabc.core.app.config; 2 | 3 | import com.github.benmanes.caffeine.cache.Cache; 4 | import com.github.benmanes.caffeine.cache.Caffeine; 5 | import org.springframework.cache.CacheManager; 6 | import org.springframework.cache.caffeine.CaffeineCacheManager; 7 | import org.springframework.context.annotation.Bean; 8 | import org.springframework.context.annotation.Configuration; 9 | 10 | import java.util.concurrent.TimeUnit; 11 | 12 | @Configuration 13 | public class CacheConfig { 14 | 15 | /** 16 | * 临时缓存对象(5分钟) 17 | * @return 18 | */ 19 | @Bean("dataCache") 20 | public Cache dataCache() { 21 | return Caffeine.newBuilder() 22 | .expireAfterWrite(300, TimeUnit.SECONDS) 23 | .build(); 24 | } 25 | 26 | /** 27 | * 缓存API对象 10小时 28 | * @return 29 | */ 30 | @Bean("apiCache") 31 | public Cache apiCaffeine() { 32 | return Caffeine.newBuilder() 33 | .expireAfterAccess(10, TimeUnit.HOURS) 34 | .build(); 35 | } 36 | 37 | 38 | /** 39 | * 元数据配置缓存管理器 40 | * 41 | * @return 42 | */ 43 | @Bean("metaDataManager") 44 | public CacheManager metaDataCacheManager() { 45 | CaffeineCacheManager cacheManager = new CaffeineCacheManager(); 46 | Caffeine caffeine = Caffeine.newBuilder() 47 | // 设置最后一次写入或访问后经过固定时间过期 48 | .expireAfterAccess(1800, TimeUnit.SECONDS); 49 | cacheManager.setCaffeine(caffeine); 50 | return cacheManager; 51 | } 52 | 53 | } 54 | -------------------------------------------------------------------------------- /crabc-boot/crabc-core/src/main/java/cn/crabc/core/app/entity/vo/BaseApiInfoVO.java: -------------------------------------------------------------------------------- 1 | package cn.crabc.core.app.entity.vo; 2 | 3 | import cn.crabc.core.app.entity.BaseEntity; 4 | import lombok.Getter; 5 | import lombok.Setter; 6 | 7 | import java.util.Date; 8 | 9 | /** 10 | * API基本信息 11 | * 12 | * @author yuqf 13 | */ 14 | @Setter 15 | @Getter 16 | public class BaseApiInfoVO extends BaseEntity { 17 | 18 | /** 19 | * api业务唯一ID 20 | */ 21 | private Long apiId; 22 | /** 23 | * 接口名称 24 | */ 25 | private String apiName; 26 | /** 27 | * 接口路径 28 | */ 29 | private String apiPath; 30 | /** 31 | * 请求方式 get、post、put、delete、aptch 32 | */ 33 | private String apiMethod; 34 | /** 35 | * API类型:sql、table 36 | */ 37 | private String apiType; 38 | /** 39 | * 授权类型:none、code、secret 40 | */ 41 | private String authType; 42 | 43 | /** 44 | * 权限级别:public、default、private 45 | */ 46 | private String apiLevel; 47 | 48 | /** 49 | * 开放启用 1/0 50 | */ 51 | private Integer enabled; 52 | 53 | /** 54 | * API描述 55 | */ 56 | private String remarks; 57 | 58 | /** 59 | * 版本 60 | */ 61 | private String version; 62 | 63 | /** 64 | * sql类型,select、insert、update、delete 65 | */ 66 | private String sqlType; 67 | 68 | /** 69 | * 分页设置,不分页:0、只分页:page、分页并统计:pageCount 70 | */ 71 | private Integer pageSetup; 72 | 73 | private String sqlScript; 74 | 75 | private String showSqlScript; 76 | /** 77 | * 发布时间 78 | */ 79 | private Date releaseTime; 80 | 81 | private Integer applyed; 82 | 83 | } 84 | -------------------------------------------------------------------------------- /crabc-boot/crabc-spi/src/main/java/cn/crabc/core/spi/DataSourceDriver.java: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright 2023, crabc.cn (creabc@qq.com) 3 | * 4 | * Licensed under the Apache License, Version 2.0 (the "License"); 5 | * you may not use this file except in compliance with the License. 6 | * You may obtain a copy of the License at 7 | * 8 | * http://www.apache.org/licenses/LICENSE-2.0 9 | * 10 | * Unless required by applicable law or agreed to in writing, software 11 | * distributed under the License is distributed on an "AS IS" BASIS, 12 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 | * See the License for the specific language governing permissions and 14 | * limitations under the License. 15 | */ 16 | package cn.crabc.core.spi; 17 | 18 | import cn.crabc.core.spi.bean.BaseDataSource; 19 | 20 | /** 21 | * 数据源驱动 22 | * 23 | * @author yuqf 24 | */ 25 | public interface DataSourceDriver { 26 | 27 | /** 28 | * 数据源名称 29 | * 30 | * @return 31 | */ 32 | String getName(); 33 | 34 | /** 35 | * 测试连接 36 | * 37 | * @param dataSource 38 | * @return 39 | */ 40 | String test(BaseDataSource dataSource); 41 | 42 | /** 43 | * 初始化 44 | * 45 | * @param dataSource 46 | */ 47 | void init(BaseDataSource dataSource); 48 | 49 | /** 50 | * 销毁 51 | * 52 | * @param dataSourceId 53 | */ 54 | void destroy(String dataSourceId); 55 | 56 | /** 57 | * 元数据对象 58 | * 59 | * @return 60 | */ 61 | MetaDataMapper getMetaData(); 62 | 63 | /** 64 | * 处理对象 65 | * 66 | * @return 67 | */ 68 | StatementMapper getStatement(); 69 | } 70 | -------------------------------------------------------------------------------- /crabc-boot/crabc-core/src/main/resources/static/css/chunk-3ebec14d.56372288.css: -------------------------------------------------------------------------------- 1 | .account-settings-info-main[data-v-253c29fe]{width:100%;display:flex;height:100%;overflow:auto}.account-settings-info-main.mobile[data-v-253c29fe]{display:block}.account-settings-info-main.mobile .account-settings-info-left[data-v-253c29fe]{border-right:unset;border-bottom:1px solid #e8e8e8;width:100%;height:50px;overflow-x:auto;overflow-y:scroll}.account-settings-info-main.mobile .account-settings-info-right[data-v-253c29fe]{padding:20px 40px}.account-settings-info-main .account-settings-info-left[data-v-253c29fe]{border-right:1px solid #e8e8e8;width:175px}.account-settings-info-main .account-settings-info-right[data-v-253c29fe]{flex:1 1;padding:8px 30px;width:calc(100% - 175px)}.account-settings-info-main .account-settings-info-right .account-settings-info-title[data-v-253c29fe]{color:rgba(0,0,0,.85);font-size:20px;font-weight:500;line-height:28px;margin-bottom:12px}.account-settings-info-main .account-settings-info-right .account-settings-info-view[data-v-253c29fe]{padding-top:12px}.account-settings-info-title span[data-v-253c29fe]{font-size:16px}.account-list-item[data-v-253c29fe]{padding-left:22px!important}.account-list-item.active[data-v-253c29fe]{color:#008ff8!important;background:#ebf6ff!important;border-right:3px solid #008ff8}.info-box[data-v-253c29fe]{padding-left:20px;display:flex;align-items:center;margin-bottom:14px}.info-box img[data-v-253c29fe]{width:22px;height:22px;border-radius:50%;background:#000;margin-right:8px}.menu-title[data-v-253c29fe]{color:#999595}[data-v-253c29fe] .ant-menu-item-selected{background:none!important}[data-v-253c29fe] .ant-menu-inline .ant-menu-item:after{border:none!important}[data-v-253c29fe] .ant-menu-item-selected{color:rgba(0,0,0,.65)} -------------------------------------------------------------------------------- /crabc-boot/crabc-core/src/main/java/cn/crabc/core/app/service/system/IBaseDataSourceService.java: -------------------------------------------------------------------------------- 1 | package cn.crabc.core.app.service.system; 2 | 3 | import cn.crabc.core.app.entity.BaseDatasource; 4 | import cn.crabc.core.datasource.util.PageInfo; 5 | import cn.crabc.core.spi.bean.BaseDataSource; 6 | 7 | import java.util.List; 8 | 9 | /** 10 | * 数据源 服务接口 11 | * 12 | * @author yuqf 13 | */ 14 | public interface IBaseDataSourceService { 15 | 16 | void init(); 17 | /** 18 | * 数据源列表 19 | * @return 20 | */ 21 | List getList(); 22 | 23 | /** 24 | * 数据源 分页列表 25 | * @param dataSourceName 26 | * @param pageNum 27 | * @param pageSize 28 | * @return 29 | */ 30 | PageInfo getDataSourcePage(String dataSourceName, int pageNum, int pageSize); 31 | 32 | /** 33 | * 数据源列表 34 | * @param dataSourceName 35 | * @return 36 | */ 37 | List getDataSourceList(String dataSourceName); 38 | 39 | /** 40 | * 查询数据源详情 41 | * @param dataSourceId 42 | * @return 43 | */ 44 | BaseDatasource getDataSource(Integer dataSourceId); 45 | 46 | /** 47 | * 添加数据源 48 | * @param dataSource 49 | * @return 50 | */ 51 | Integer addDataSource(BaseDatasource dataSource); 52 | /** 53 | * 更新数据源 54 | * @param dataSource 55 | * @return 56 | */ 57 | Integer updateDataSource(BaseDatasource dataSource); 58 | /** 59 | * 删除数据源 60 | * @param dataSourceId 61 | * @return 62 | */ 63 | Integer deleteDataSource(Integer dataSourceId); 64 | 65 | /** 66 | * 测试数据源连接 67 | * @param dataSource 68 | * @return 1(成功) 或 errorMessage 69 | */ 70 | String test(BaseDatasource dataSource); 71 | } 72 | -------------------------------------------------------------------------------- /crabc-boot/crabc-core/src/main/java/cn/crabc/core/app/controller/CommonController.java: -------------------------------------------------------------------------------- 1 | package cn.crabc.core.app.controller; 2 | 3 | 4 | import cn.crabc.core.app.entity.vo.ApiParamsVO; 5 | import cn.crabc.core.app.entity.vo.BaseApiInfoVO; 6 | import cn.crabc.core.app.service.system.IBaseApiInfoService; 7 | import cn.crabc.core.app.service.system.IBaseApiParamService; 8 | import cn.crabc.core.app.util.Result; 9 | import org.springframework.beans.factory.annotation.Autowired; 10 | import org.springframework.web.bind.annotation.GetMapping; 11 | import org.springframework.web.bind.annotation.RequestMapping; 12 | import org.springframework.web.bind.annotation.RestController; 13 | 14 | /** 15 | * API公共信息 16 | * 17 | * @author yuqf 18 | */ 19 | @RestController 20 | @RequestMapping("/api/box/sys/common") 21 | public class CommonController { 22 | 23 | @Autowired 24 | private IBaseApiInfoService apiInfoService; 25 | @Autowired 26 | private IBaseApiParamService apiParamService; 27 | 28 | /** 29 | * API详情信息 30 | * 31 | * @param apiId 32 | * @return 33 | */ 34 | @GetMapping("/api/details") 35 | public Result detail(Long apiId) { 36 | Integer applyCount = 1; 37 | BaseApiInfoVO apiDetail = apiInfoService.getApiDetail(apiId); 38 | if ("0".equals(apiDetail.getShowSqlScript())){ 39 | apiDetail.setSqlScript("***"); 40 | } 41 | apiDetail.setApplyed(applyCount); 42 | return Result.success(apiDetail); 43 | } 44 | 45 | /** 46 | * API参数 47 | * 48 | * @param apiId 49 | * @return 50 | */ 51 | @GetMapping("/api/params") 52 | public Result params(Long apiId) { 53 | ApiParamsVO apiDetailsParams = apiParamService.getApiDetailsParams(apiId); 54 | return Result.success(apiDetailsParams); 55 | } 56 | } 57 | -------------------------------------------------------------------------------- /crabc-boot/crabc-datasource/src/main/java/cn/crabc/core/datasource/enums/ErrorStatusEnum.java: -------------------------------------------------------------------------------- 1 | package cn.crabc.core.datasource.enums; 2 | 3 | /** 4 | * 错误状态枚举 5 | * 6 | * @author yuqf 7 | */ 8 | public enum ErrorStatusEnum { 9 | SYSTEM_ERROR( 50001, "系统繁忙,请稍后重试"), 10 | SYSTEM_UPGRADE( 50002, "系统升级中"), 11 | API_INVALID( 40001, "无效的接口"), 12 | API_UN_AUTH( 40002, "无访问接口权限"), 13 | API_EXPIRE( 40003, "接口授权已过期"), 14 | API_LIMIT(40004, "接口已被限流"), 15 | API_FUSING(40005, "接口已被熔断"), 16 | API_OFFLINE(40006, "接口已下线"), 17 | API_COUNT_OUT(40007, "接口调用次数已达上线"), 18 | APP_UN_AUTH(40008, "该应用没有访问权限"), 19 | IP_INVALID( 40010, "IP地址不在有效范围内"), 20 | API_SQL_ERROR( 40011, "SQL执行失败,请检查SQL是否正常"), 21 | PARAM_NOT_FOUNT( 41000, "必传参数不能为空"), 22 | JWT_UN_AUTH( 402, "用户未登录"), 23 | JWT_LOGIN_EXPIRE( 401, "登录失效,请重新登录"), 24 | SHA_PARAM_NOT_FOUNT( 41006, "认证参数(appkey/timestamp/sign)不能为空"), 25 | SHA_APPKEY_NOT_FOUNT( 41007, "认证参数appKey不能为空"), 26 | SHA_TIMESTAMP_EXPIRE( 41008, "认证参数timestamp失效"), 27 | FORBID_OPERATE(44000, "无效操作"), 28 | API_NOT_FOUNT(44001, "无效的API"), 29 | API_NOT_OPERATE(44002, "API已发布上线,请先下线后在进行编辑"), 30 | USER_REPEAT(44002, "用户名已存在"), 31 | DATASOURCE_NOT_FOUNT(44003, "无效的数据源"), 32 | APP_NOT_FOUNT(44004, "无效的应用"); 33 | 34 | 35 | private int code; 36 | private String massage; 37 | 38 | ErrorStatusEnum(Integer code, String massage) { 39 | this.code = code; 40 | this.massage = massage; 41 | } 42 | 43 | public int getCode() { 44 | return code; 45 | } 46 | 47 | public void setCode(int code) { 48 | this.code = code; 49 | } 50 | 51 | public String getMassage() { 52 | return massage; 53 | } 54 | 55 | public void setMassage(String massage) { 56 | this.massage = massage; 57 | } 58 | } 59 | -------------------------------------------------------------------------------- /crabc-boot/crabc-core/src/main/java/cn/crabc/core/app/util/UserThreadLocal.java: -------------------------------------------------------------------------------- 1 | package cn.crabc.core.app.util; 2 | 3 | import java.util.Map; 4 | 5 | /** 6 | * 上下文 当前用户基本信息 7 | * 8 | * @author yuqf 9 | */ 10 | public class UserThreadLocal { 11 | 12 | private static final ThreadLocal> userInfo = new ThreadLocal<>(); 13 | 14 | /** 15 | * 用户信息存入 上下文中 16 | * 17 | * @param user 18 | */ 19 | public static void set(Map user) { 20 | userInfo.set(user); 21 | } 22 | 23 | /** 24 | * 用户对象 25 | * 26 | * @return 27 | */ 28 | public static Map get() { 29 | return userInfo.get(); 30 | } 31 | 32 | /** 33 | * 获取用户ID 34 | * 35 | * @return 36 | */ 37 | public static String getUserId() { 38 | Map map = userInfo.get(); 39 | return map == null ? "0" : map.get("userId").toString(); 40 | } 41 | 42 | /** 43 | * 是否管理员 44 | * @return 45 | */ 46 | public static boolean isAdmin() { 47 | Map map = userInfo.get(); 48 | if (map != null && "admin".equalsIgnoreCase(map.get("role").toString())) { 49 | return true; 50 | } else { 51 | return false; 52 | } 53 | } 54 | 55 | /** 56 | * 是否超级管理员 57 | * @return 58 | */ 59 | public static boolean isSuperAdmin() { 60 | Map map = userInfo.get(); 61 | if (map != null && "1".equals(map.get("userId").toString()) && "admin".equalsIgnoreCase(map.get("role").toString())) { 62 | return true; 63 | } else { 64 | return false; 65 | } 66 | } 67 | 68 | /** 69 | * 清除 70 | */ 71 | public static void remove() { 72 | userInfo.remove(); 73 | } 74 | } 75 | -------------------------------------------------------------------------------- /crabc-boot/crabc-core/src/main/java/cn/crabc/core/app/util/Md5Utils.java: -------------------------------------------------------------------------------- 1 | package cn.crabc.core.app.util; 2 | 3 | import org.slf4j.Logger; 4 | import org.slf4j.LoggerFactory; 5 | 6 | import java.nio.charset.StandardCharsets; 7 | import java.security.MessageDigest; 8 | 9 | /** 10 | * Md5加密工具类 11 | * 12 | */ 13 | public class Md5Utils 14 | { 15 | private static final Logger log = LoggerFactory.getLogger(Md5Utils.class); 16 | 17 | private static byte[] md5(String s) 18 | { 19 | MessageDigest algorithm; 20 | try 21 | { 22 | algorithm = MessageDigest.getInstance("MD5"); 23 | algorithm.reset(); 24 | algorithm.update(s.getBytes("UTF-8")); 25 | byte[] messageDigest = algorithm.digest(); 26 | return messageDigest; 27 | } 28 | catch (Exception e) 29 | { 30 | log.error("MD5 Error...", e); 31 | } 32 | return null; 33 | } 34 | 35 | private static final String toHex(byte hash[]) 36 | { 37 | if (hash == null) 38 | { 39 | return null; 40 | } 41 | StringBuffer buf = new StringBuffer(hash.length * 2); 42 | int i; 43 | 44 | for (i = 0; i < hash.length; i++) 45 | { 46 | if ((hash[i] & 0xff) < 0x10) 47 | { 48 | buf.append("0"); 49 | } 50 | buf.append(Long.toString(hash[i] & 0xff, 16)); 51 | } 52 | return buf.toString(); 53 | } 54 | 55 | public static String hash(String s) 56 | { 57 | try 58 | { 59 | return new String(toHex(md5(s)).getBytes(StandardCharsets.UTF_8), StandardCharsets.UTF_8); 60 | } 61 | catch (Exception e) 62 | { 63 | log.error("not supported charset...{}", e); 64 | return s; 65 | } 66 | } 67 | } 68 | -------------------------------------------------------------------------------- /crabc-boot/crabc-core/src/main/java/cn/crabc/core/app/filter/JwtInterceptor.java: -------------------------------------------------------------------------------- 1 | package cn.crabc.core.app.filter; 2 | 3 | import cn.crabc.core.app.util.JwtUtil; 4 | import cn.crabc.core.app.util.UserThreadLocal; 5 | import cn.crabc.core.datasource.enums.ErrorStatusEnum; 6 | import cn.crabc.core.datasource.exception.CustomException; 7 | import io.jsonwebtoken.Claims; 8 | import jakarta.servlet.http.HttpServletRequest; 9 | import jakarta.servlet.http.HttpServletResponse; 10 | import org.springframework.beans.factory.annotation.Value; 11 | import org.springframework.lang.Nullable; 12 | import org.springframework.web.servlet.HandlerInterceptor; 13 | 14 | /** 15 | * 登录拦截器 16 | * 17 | * @author yuqf 18 | */ 19 | public class JwtInterceptor implements HandlerInterceptor { 20 | 21 | @Override 22 | public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) { 23 | // 放行OPTIONS请求 24 | if ("OPTIONS".equals(request.getMethod().toUpperCase())) { 25 | return true; 26 | } 27 | 28 | // 获取并校验token 29 | String token = JwtUtil.getToken(request); 30 | if (token == null) { 31 | throw new CustomException(ErrorStatusEnum.JWT_LOGIN_EXPIRE.getCode(), ErrorStatusEnum.JWT_UN_AUTH.getMassage()); 32 | } 33 | 34 | // 解析token 35 | Claims claims = JwtUtil.parseToken(token); 36 | if (claims == null) { 37 | throw new CustomException(ErrorStatusEnum.JWT_LOGIN_EXPIRE.getCode(), ErrorStatusEnum.JWT_UN_AUTH.getMassage()); 38 | } 39 | // 设置用户信息到线程上下文 40 | UserThreadLocal.set(claims); 41 | return true; 42 | } 43 | 44 | @Override 45 | public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, @Nullable Exception ex) throws Exception { 46 | // 清除用户上下文信息 47 | UserThreadLocal.remove(); 48 | } 49 | } 50 | -------------------------------------------------------------------------------- /crabc-boot/crabc-core/src/main/resources/static/css/chunk-15a47081.b74c2b12.css: -------------------------------------------------------------------------------- 1 | [data-v-190efa6e] .jv-container{background-color:#282c34}.hljs[data-v-190efa6e]{font-size:15px}.info[data-v-190efa6e]{border-radius:10px;line-height:20px;padding:10px;margin:10px;background-color:#fff}[data-v-190efa6e] .my-awesome-json-theme{background:#282c34;white-space:nowrap;color:#fff;font-size:14px}[data-v-190efa6e] .my-awesome-json-theme .jv-ellipsis{color:#999;background-color:#eee;display:inline-block;line-height:.9;font-size:.9em;padding:0 4px 2px 4px;border-radius:3px;vertical-align:2px;cursor:pointer;-webkit-user-select:none;-moz-user-select:none;user-select:none}[data-v-190efa6e] .my-awesome-json-theme .jv-button{color:#49b3ff}[data-v-190efa6e] .my-awesome-json-theme .jv-key{color:#94d9f5}[data-v-190efa6e] .my-awesome-json-theme .jv-item.jv-array{color:#fff}[data-v-190efa6e] .my-awesome-json-theme .jv-item.jv-boolean{color:#fc1e70}[data-v-190efa6e] .my-awesome-json-theme .jv-item.jv-function{color:#067bca}[data-v-190efa6e] .my-awesome-json-theme .jv-item.jv-number{color:#91bd9b}[data-v-190efa6e] .my-awesome-json-theme .jv-item.jv-number-float{color:#fc1e70}[data-v-190efa6e] .my-awesome-json-theme .jv-item.jv-number-integer{color:#91bd9b}[data-v-190efa6e] .my-awesome-json-theme .jv-item.jv-object{color:#fff}[data-v-190efa6e] .my-awesome-json-theme .jv-item.jv-undefined{color:#e08331}[data-v-190efa6e] .my-awesome-json-theme .jv-item.jv-string{color:#c6967c;word-break:break-word;white-space:normal}[data-v-190efa6e] .my-awesome-json-theme .jv-code .jv-toggle:before{padding:0 2px;border-radius:2px}[data-v-190efa6e] .my-awesome-json-theme .jv-code .jv-toggle:hover:before{background:#fff}.userlog-detail li[data-v-5ff4cbbd]{display:flex;margin:10px 0}.userlog-detail li .userlog-title-detail[data-v-5ff4cbbd]{color:#787575;width:80px}.userlog-detail li .log-content[data-v-5ff4cbbd]{width:300px}.codeClass[data-v-5ff4cbbd]{min-height:100px;max-height:500px;width:70vw;overflow:auto} -------------------------------------------------------------------------------- /crabc-boot/crabc-core/src/main/java/cn/crabc/core/app/filter/ApiFilter.java: -------------------------------------------------------------------------------- 1 | package cn.crabc.core.app.filter; 2 | 3 | import cn.crabc.core.app.util.ApiThreadLocal; 4 | import cn.crabc.core.app.util.UserThreadLocal; 5 | import jakarta.servlet.*; 6 | import jakarta.servlet.http.HttpServletRequest; 7 | import jakarta.servlet.http.HttpServletResponse; 8 | import org.springframework.http.MediaType; 9 | import org.springframework.web.util.ContentCachingResponseWrapper; 10 | 11 | import java.io.IOException; 12 | 13 | public class ApiFilter implements Filter { 14 | @Override 15 | public void init(FilterConfig filterConfig) throws ServletException { 16 | Filter.super.init(filterConfig); 17 | } 18 | 19 | @Override 20 | public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException { 21 | HttpServletRequest request = (HttpServletRequest)servletRequest; 22 | HttpServletResponse response = (HttpServletResponse) servletResponse; 23 | ContentCachingResponseWrapper responseWrapper = null; 24 | try { 25 | // 包装类 26 | if (request.getContentType() != null && request.getContentType().contains(MediaType.APPLICATION_JSON_VALUE)) { 27 | BaseRequestWrapper requestWrapper = new BaseRequestWrapper(request); 28 | responseWrapper = new ContentCachingResponseWrapper(response); 29 | filterChain.doFilter(requestWrapper, responseWrapper); 30 | } else { 31 | filterChain.doFilter(servletRequest, servletResponse); 32 | } 33 | }finally { 34 | ApiThreadLocal.remove(); 35 | if (responseWrapper != null) { 36 | responseWrapper.copyBodyToResponse(); 37 | } 38 | } 39 | } 40 | 41 | @Override 42 | public void destroy() { 43 | Filter.super.destroy(); 44 | } 45 | 46 | } 47 | -------------------------------------------------------------------------------- /crabc-boot/crabc-spi/src/main/java/cn/crabc/core/spi/MetaDataMapper.java: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright 2023, crabc.cn (creabc@qq.com) 3 | * 4 | * Licensed under the Apache License, Version 2.0 (the "License"); 5 | * you may not use this file except in compliance with the License. 6 | * You may obtain a copy of the License at 7 | * 8 | * http://www.apache.org/licenses/LICENSE-2.0 9 | * 10 | * Unless required by applicable law or agreed to in writing, software 11 | * distributed under the License is distributed on an "AS IS" BASIS, 12 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 | * See the License for the specific language governing permissions and 14 | * limitations under the License. 15 | */ 16 | package cn.crabc.core.spi; 17 | 18 | import cn.crabc.core.spi.bean.Column; 19 | import cn.crabc.core.spi.bean.Schema; 20 | import cn.crabc.core.spi.bean.Table; 21 | 22 | import java.util.List; 23 | 24 | /** 25 | * 元数据操作 Mapper 26 | * 27 | * @author yuqf 28 | */ 29 | public interface MetaDataMapper extends Mapper { 30 | 31 | /** 32 | * 获取数据源的Catalog 33 | * 34 | * @param dataSourceId 35 | * @return 36 | */ 37 | List getCatalogs(String dataSourceId); 38 | 39 | /** 40 | * 获取数据源Schema 41 | * 42 | * @param dataSourceId 43 | * @param catalog 44 | * @return 45 | */ 46 | List getSchemas(String dataSourceId, String catalog); 47 | 48 | /** 49 | * 获取数据表列表 50 | * 51 | * @param dataSourceId 52 | * @param catalog 53 | * @param schema 54 | * @return 55 | */ 56 | List getTables(String dataSourceId, String catalog, String schema); 57 | 58 | /** 59 | * 获取数据表字段列表 60 | * 61 | * @param dataSourceId 62 | * @param catalog 63 | * @param schema 64 | * @param table 65 | * @return 66 | */ 67 | List getColumns(String dataSourceId, String catalog, String schema, String table); 68 | } 69 | -------------------------------------------------------------------------------- /crabc-boot/crabc-core/src/main/java/cn/crabc/core/app/controller/BaseGroupController.java: -------------------------------------------------------------------------------- 1 | package cn.crabc.core.app.controller; 2 | 3 | import cn.crabc.core.app.entity.BaseGroup; 4 | import cn.crabc.core.app.entity.vo.BaseGroupVO; 5 | import cn.crabc.core.app.service.system.IBaseGroupService; 6 | import cn.crabc.core.app.util.Result; 7 | import cn.crabc.core.app.util.UserThreadLocal; 8 | import org.springframework.beans.factory.annotation.Autowired; 9 | import org.springframework.web.bind.annotation.*; 10 | 11 | import java.util.List; 12 | 13 | /** 14 | * api分组 15 | */ 16 | 17 | @RestController 18 | @RequestMapping("/api/box/sys/group") 19 | public class BaseGroupController { 20 | 21 | @Autowired 22 | private IBaseGroupService iBaseGroupService; 23 | 24 | /** 25 | * 分组树 26 | * @return 27 | */ 28 | @GetMapping("/tree") 29 | public Result groupTree(Long apiId){ 30 | List baseGroups = iBaseGroupService.groupTree(UserThreadLocal.getUserId(), apiId); 31 | return Result.success(baseGroups); 32 | } 33 | 34 | /** 35 | * 新增分组 36 | * @param baseGroup 37 | * @return 38 | */ 39 | @PostMapping 40 | public Result addGroup(@RequestBody BaseGroup baseGroup){ 41 | baseGroup.setCreateBy(UserThreadLocal.getUserId()); 42 | iBaseGroupService.addGroup(baseGroup); 43 | return Result.success(); 44 | } 45 | 46 | /** 47 | * 编辑分组 48 | * @param baseGroup 49 | * @return 50 | */ 51 | @PutMapping 52 | public Result updateGroup(@RequestBody BaseGroup baseGroup){ 53 | iBaseGroupService.updateGroup(baseGroup,UserThreadLocal.getUserId()); 54 | return Result.success(); 55 | } 56 | 57 | /** 58 | * 删除分组 59 | * @param groupId 60 | * @return 61 | */ 62 | @DeleteMapping("/{groupId}") 63 | public Result deleteGroup(@PathVariable Integer groupId){ 64 | iBaseGroupService.delteGroup(groupId, UserThreadLocal.getUserId()); 65 | return Result.success(); 66 | } 67 | } 68 | -------------------------------------------------------------------------------- /crabc-boot/crabc-core/src/main/java/cn/crabc/core/app/config/InterceptorConfig.java: -------------------------------------------------------------------------------- 1 | package cn.crabc.core.app.config; 2 | 3 | import cn.crabc.core.app.filter.ApiFilter; 4 | import cn.crabc.core.app.filter.AuthInterceptor; 5 | import cn.crabc.core.app.filter.JwtInterceptor; 6 | import org.springframework.boot.web.servlet.FilterRegistrationBean; 7 | import org.springframework.context.annotation.Bean; 8 | import org.springframework.context.annotation.Configuration; 9 | import org.springframework.web.servlet.config.annotation.InterceptorRegistry; 10 | import org.springframework.web.servlet.config.annotation.WebMvcConfigurer; 11 | 12 | 13 | 14 | /** 15 | * 注册拦截器 16 | * 17 | * @author yuqf 18 | */ 19 | @Configuration 20 | public class InterceptorConfig implements WebMvcConfigurer { 21 | 22 | @Bean 23 | public AuthInterceptor apiInterceptor() { 24 | return new AuthInterceptor(); 25 | } 26 | 27 | @Bean 28 | public JwtInterceptor jwtInterceptor() { 29 | return new JwtInterceptor(); 30 | } 31 | 32 | @Override 33 | public void addInterceptors(InterceptorRegistry registry) { 34 | // 登录拦截器 35 | registry.addInterceptor(jwtInterceptor()) 36 | .addPathPatterns("/api/box/**") // 需要拦截的请求 37 | .excludePathPatterns("/api/box/sys/user/login", "/api/box/sys/user/loginout", "/api/box/sys/user/register"); // 不拦截的请求 38 | 39 | // API开放接口拦截器 40 | registry.addInterceptor(apiInterceptor()) 41 | .addPathPatterns("/api/web/**"); // 需要拦截的请求 42 | } 43 | 44 | /** 45 | * 日志过滤器 46 | * @return 47 | */ 48 | @SuppressWarnings({ "rawtypes", "unchecked" }) 49 | @Bean 50 | public FilterRegistrationBean builderRegistrationBean(){ 51 | FilterRegistrationBean registration = new FilterRegistrationBean(); 52 | registration.setFilter(new ApiFilter()); 53 | registration.addUrlPatterns("/api/web/*"); 54 | registration.setName("apiFilter"); 55 | registration.setOrder(-1); 56 | return registration; 57 | } 58 | } 59 | -------------------------------------------------------------------------------- /crabc-boot/crabc-admin/pom.xml: -------------------------------------------------------------------------------- 1 | 2 | 5 | 4.0.0 6 | 7 | cn.crabc 8 | crabc-boot 9 | ${revision} 10 | 11 | 12 | crabc-admin 13 | 14 | 21 15 | 21 16 | UTF-8 17 | 18 | 19 | 20 | cn.crabc 21 | crabc-core 22 | ${project.version} 23 | 24 | 25 | 26 | ${project.artifactId}-${project.version} 27 | 28 | 29 | org.springframework.boot 30 | spring-boot-maven-plugin 31 | ${spring-boot.version} 32 | 33 | 34 | 35 | repackage 36 | 37 | 38 | 39 | 40 | 41 | org.apache.maven.plugins 42 | maven-compiler-plugin 43 | 3.8.1 44 | 45 | 46 | -parameters 47 | 48 | 49 | 50 | 51 | 52 | -------------------------------------------------------------------------------- /crabc-boot/crabc-core/src/main/java/cn/crabc/core/app/filter/BaseRequestWrapper.java: -------------------------------------------------------------------------------- 1 | package cn.crabc.core.app.filter; 2 | 3 | import jakarta.servlet.ReadListener; 4 | import jakarta.servlet.ServletInputStream; 5 | import jakarta.servlet.http.HttpServletRequest; 6 | import jakarta.servlet.http.HttpServletRequestWrapper; 7 | import org.apache.tomcat.util.http.fileupload.IOUtils; 8 | 9 | 10 | import java.io.*; 11 | 12 | /** 13 | * 请求包装类 14 | * 15 | * 16 | */ 17 | public class BaseRequestWrapper extends HttpServletRequestWrapper { 18 | private byte[] requestBody; 19 | //Http请求对象 20 | private HttpServletRequest request; 21 | 22 | public BaseRequestWrapper(HttpServletRequest request) { 23 | super(request); 24 | this.request = request; 25 | } 26 | 27 | /** 28 | * @return 29 | * @throws IOException 30 | */ 31 | @Override 32 | public ServletInputStream getInputStream() throws IOException { 33 | if (null == this.requestBody) { 34 | ByteArrayOutputStream baos = new ByteArrayOutputStream(); 35 | IOUtils.copy(request.getInputStream(), baos); 36 | this.requestBody = baos.toByteArray(); 37 | } 38 | 39 | final ByteArrayInputStream bais = new ByteArrayInputStream(requestBody); 40 | return new ServletInputStream() { 41 | 42 | @Override 43 | public boolean isFinished() { 44 | return false; 45 | } 46 | 47 | @Override 48 | public boolean isReady() { 49 | return false; 50 | } 51 | 52 | @Override 53 | public void setReadListener(ReadListener readListener) { 54 | 55 | } 56 | 57 | @Override 58 | public int read() { 59 | 60 | return bais.read(); 61 | } 62 | }; 63 | } 64 | 65 | public byte[] getRequestBody() { 66 | return requestBody; 67 | } 68 | 69 | @Override 70 | public BufferedReader getReader() throws IOException { 71 | return new BufferedReader(new InputStreamReader(this.getInputStream())); 72 | } 73 | 74 | } 75 | -------------------------------------------------------------------------------- /crabc-boot/crabc-datasource/src/main/java/cn/crabc/core/datasource/constant/BaseConstant.java: -------------------------------------------------------------------------------- 1 | package cn.crabc.core.datasource.constant; 2 | 3 | import java.util.Arrays; 4 | import java.util.List; 5 | 6 | /** 7 | * 常量类 8 | * 9 | * @author yuqf 10 | */ 11 | public class BaseConstant { 12 | 13 | /** 14 | * SQL脚本 15 | */ 16 | public final static String BASE_SQL = "base_sql"; 17 | 18 | /** 19 | * 数据源ID 20 | */ 21 | public final static String DATA_SOURCE_ID = "data_source_id"; 22 | 23 | /** 24 | * 页码 25 | */ 26 | public final static String PAGE_NUM = "pageNum"; 27 | 28 | /** 29 | * 每页大小 30 | */ 31 | public final static String PAGE_SIZE = "pageSize"; 32 | 33 | /** 34 | * 分页设置 35 | */ 36 | public final static String PAGE_SETUP = "pageSetup"; 37 | 38 | /** 39 | * 数据源类型 40 | */ 41 | public final static String DATA_SOURCE_TYPE = "data_source_type"; 42 | 43 | /** 44 | * 分页统计 45 | */ 46 | public final static Integer PAGE_COUNT = 2; 47 | 48 | /** 49 | * 只分页 50 | */ 51 | public final static Integer PAGE_ONLY = 1; 52 | 53 | /** 54 | * redis 55 | */ 56 | public final static String REDIS_CACHE = "redis"; 57 | 58 | /** 59 | * API数据缓存 60 | */ 61 | public static final String CACHE_API_DETAIL = "api_detail"; 62 | 63 | public static final String CACHE_METADATA_CATALOG = "metadata_catalog:"; 64 | /** 65 | * redis缓存schema 66 | */ 67 | public static final String CACHE_METADATA_SCHEMA = "metadata_schema:"; 68 | /** 69 | * redis缓存表 70 | */ 71 | public static final String CACHE_METADATA_TABLE = "metadata_table:"; 72 | /** 73 | * redis缓存字段 74 | */ 75 | public static final String CACHE_METADATA_COLUMN = "metadata_column:"; 76 | /** 77 | * SQL执行方式 78 | */ 79 | public static final String BASE_API_EXEC_TYPE = "base_api_exec_type:"; 80 | 81 | /** 82 | * 需要指定catalog的数据源 83 | */ 84 | public static final List CATALOG_DATA_SOURCE = Arrays.asList("sybase","mysql","mariadb","doris","starrocks","tidb","tdsql","clickhouse"); 85 | 86 | } 87 | -------------------------------------------------------------------------------- /crabc-boot/crabc-datasource/src/main/java/cn/crabc/core/datasource/mapper/BaseDataHandleMapper.java: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright 2023, crabc.cn (creabc@qq.com) 3 | * 4 | * Licensed under the Apache License, Version 2.0 (the "License"); 5 | * you may not use this file except in compliance with the License. 6 | * You may obtain a copy of the License at 7 | * 8 | * http://www.apache.org/licenses/LICENSE-2.0 9 | * 10 | * Unless required by applicable law or agreed to in writing, software 11 | * distributed under the License is distributed on an "AS IS" BASIS, 12 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 | * See the License for the specific language governing permissions and 14 | * limitations under the License. 15 | */ 16 | package cn.crabc.core.datasource.mapper; 17 | 18 | import org.apache.ibatis.annotations.InsertProvider; 19 | import org.apache.ibatis.annotations.Mapper; 20 | import org.apache.ibatis.annotations.SelectProvider; 21 | import org.apache.ibatis.annotations.UpdateProvider; 22 | 23 | import java.util.List; 24 | import java.util.Map; 25 | 26 | /** 27 | * 通用数据操作 Mapper 28 | * 29 | * @author yuqf 30 | */ 31 | @Mapper 32 | public interface BaseDataHandleMapper { 33 | 34 | /** 35 | * 查询类SQL 36 | * @param params 37 | * @return 38 | */ 39 | @SelectProvider(type = BaseSelectProvider.class, method = "executeQuery") 40 | List> executeQuery(Map params); 41 | 42 | /** 43 | * 新增类SQL 44 | * @param params 45 | * @return 46 | */ 47 | @InsertProvider(type = BaseSelectProvider.class, method = "executeInsert") 48 | Integer executeInsert(Map params); 49 | 50 | /** 51 | * 修改类SQL 52 | * @param params 53 | * @return 54 | */ 55 | @UpdateProvider(type = BaseSelectProvider.class, method = "executeUpdate") 56 | Integer executeUpdate(Map params); 57 | 58 | /** 59 | * 删除类SQL 60 | * @param params 61 | * @return 62 | */ 63 | @UpdateProvider(type = BaseSelectProvider.class, method = "executeDelete") 64 | Integer executeDelete(Map params); 65 | } 66 | -------------------------------------------------------------------------------- /crabc-boot/crabc-core/src/main/resources/static/css/chunk-e3006f32.752f55a0.css: -------------------------------------------------------------------------------- 1 | [data-v-190efa6e] .jv-container{background-color:#282c34}.hljs[data-v-190efa6e]{font-size:15px}.info[data-v-190efa6e]{border-radius:10px;line-height:20px;padding:10px;margin:10px;background-color:#fff}[data-v-190efa6e] .my-awesome-json-theme{background:#282c34;white-space:nowrap;color:#fff;font-size:14px}[data-v-190efa6e] .my-awesome-json-theme .jv-ellipsis{color:#999;background-color:#eee;display:inline-block;line-height:.9;font-size:.9em;padding:0 4px 2px 4px;border-radius:3px;vertical-align:2px;cursor:pointer;-webkit-user-select:none;-moz-user-select:none;user-select:none}[data-v-190efa6e] .my-awesome-json-theme .jv-button{color:#49b3ff}[data-v-190efa6e] .my-awesome-json-theme .jv-key{color:#94d9f5}[data-v-190efa6e] .my-awesome-json-theme .jv-item.jv-array{color:#fff}[data-v-190efa6e] .my-awesome-json-theme .jv-item.jv-boolean{color:#fc1e70}[data-v-190efa6e] .my-awesome-json-theme .jv-item.jv-function{color:#067bca}[data-v-190efa6e] .my-awesome-json-theme .jv-item.jv-number{color:#91bd9b}[data-v-190efa6e] .my-awesome-json-theme .jv-item.jv-number-float{color:#fc1e70}[data-v-190efa6e] .my-awesome-json-theme .jv-item.jv-number-integer{color:#91bd9b}[data-v-190efa6e] .my-awesome-json-theme .jv-item.jv-object{color:#fff}[data-v-190efa6e] .my-awesome-json-theme .jv-item.jv-undefined{color:#e08331}[data-v-190efa6e] .my-awesome-json-theme .jv-item.jv-string{color:#c6967c;word-break:break-word;white-space:normal}[data-v-190efa6e] .my-awesome-json-theme .jv-code .jv-toggle:before{padding:0 2px;border-radius:2px}[data-v-190efa6e] .my-awesome-json-theme .jv-code .jv-toggle:hover:before{background:#fff}.page-message-select .page-measage-title[data-v-14a91c88]{margin-left:30px}.page-message-select .page-measage-title.mr-10[data-v-14a91c88]{padding-right:10px}.page-measage-table[data-v-14a91c88]{margin-top:20px}.search-name[data-v-14a91c88]{display:flex;align-items:center}.search-name span[data-v-14a91c88]{display:inline-block;width:80px}.codeClass[data-v-14a91c88]{min-height:20vh;max-height:47vh;width:800px;overflow:auto}.res-copy-title[data-v-14a91c88]{cursor:pointer}.res-copy-title .res-copy-span[data-v-14a91c88]{color:#008ff8;float:right}.tex-right[data-v-14a91c88]{text-align:right} -------------------------------------------------------------------------------- /crabc-boot/crabc-core/src/main/java/cn/crabc/core/app/controller/BaseAppController.java: -------------------------------------------------------------------------------- 1 | package cn.crabc.core.app.controller; 2 | 3 | import cn.crabc.core.app.entity.BaseApp; 4 | import cn.crabc.core.app.service.system.IBaseAppService; 5 | import cn.crabc.core.datasource.util.PageInfo; 6 | import cn.crabc.core.app.util.Result; 7 | import org.springframework.beans.factory.annotation.Autowired; 8 | import org.springframework.web.bind.annotation.*; 9 | 10 | import java.util.List; 11 | 12 | /** 13 | * 应用管理 14 | * 15 | */ 16 | @RestController 17 | @RequestMapping("/api/box/sys/app") 18 | public class BaseAppController { 19 | 20 | @Autowired 21 | private IBaseAppService iBaseAppService; 22 | 23 | @GetMapping("/page") 24 | public Result page(String appName, String appCode, Integer pageNum, Integer pageSize){ 25 | PageInfo page = iBaseAppService.appPage(appName, appCode, pageNum, pageSize); 26 | return Result.success(page); 27 | } 28 | 29 | /** 30 | * 应用列表 31 | * @param appName 32 | * @return 33 | */ 34 | @GetMapping("/list") 35 | public Result list(String appName){ 36 | List appList = iBaseAppService.appList(appName); 37 | return Result.success(appList); 38 | } 39 | 40 | /** 41 | * 新增应用 42 | * @param baseApp 43 | * @return 44 | */ 45 | @PostMapping 46 | public Result addApp(@RequestBody BaseApp baseApp){ 47 | return Result.success(iBaseAppService.addApp(baseApp)); 48 | } 49 | 50 | /** 51 | * 编辑应用 52 | * @param baseApp 53 | * @return 54 | */ 55 | @PutMapping 56 | public Result updateApp(@RequestBody BaseApp baseApp){ 57 | return Result.success(iBaseAppService.updateApp(baseApp)); 58 | } 59 | 60 | /** 61 | * 修改状态 62 | * @param baseApp 63 | * @return 64 | */ 65 | @PutMapping("/state") 66 | public Result updateState(@RequestBody BaseApp baseApp){ 67 | return Result.success(iBaseAppService.updateApp(baseApp)); 68 | } 69 | 70 | /** 71 | * 删除应用 72 | * @param appId 73 | * @return 74 | */ 75 | @DeleteMapping("/{appId}") 76 | public Result deleteApp(@PathVariable Long appId){ 77 | return Result.success(iBaseAppService.deleteApp(appId)); 78 | } 79 | 80 | } 81 | -------------------------------------------------------------------------------- /crabc-boot/crabc-admin/src/main/resources/logback.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | ${log.pattern} 9 | 10 | 11 | 12 | 13 | ${log.path}/info.log 14 | 15 | ${log.path}/info.%d{yyyy-MM-dd}.log 16 | 60 17 | 18 | 19 | ${log.pattern} 20 | 21 | 22 | INFO 23 | ACCEPT 24 | DENY 25 | 26 | 27 | 28 | 29 | ${log.path}/error.log 30 | 31 | ${log.path}/error.%d{yyyy-MM-dd}.log 32 | 60 33 | 34 | 35 | ${log.pattern} 36 | 37 | 38 | ERROR 39 | ACCEPT 40 | DENY 41 | 42 | 43 | 44 | 45 | 46 | 47 | 48 | 49 | 50 | 51 | 52 | 53 | 54 | 55 | 56 | 57 | 58 | 59 | -------------------------------------------------------------------------------- /crabc-boot/crabc-core/src/main/java/cn/crabc/core/app/service/system/impl/BaseAppServiceImpl.java: -------------------------------------------------------------------------------- 1 | package cn.crabc.core.app.service.system.impl; 2 | 3 | import cn.crabc.core.app.entity.BaseApp; 4 | import cn.crabc.core.app.mapper.BaseAppMapper; 5 | import cn.crabc.core.app.service.system.IBaseAppService; 6 | import cn.crabc.core.datasource.util.PageInfo; 7 | import cn.crabc.core.app.util.UserThreadLocal; 8 | import cn.crabc.core.datasource.enums.ErrorStatusEnum; 9 | import cn.crabc.core.datasource.exception.CustomException; 10 | import com.github.pagehelper.PageHelper; 11 | import org.springframework.beans.factory.annotation.Autowired; 12 | import org.springframework.stereotype.Service; 13 | 14 | import java.util.Date; 15 | import java.util.List; 16 | 17 | /** 18 | * 应用 服务实现 19 | * 20 | * @author yuqf 21 | */ 22 | @Service 23 | public class BaseAppServiceImpl implements IBaseAppService { 24 | 25 | @Autowired 26 | private BaseAppMapper baseAppMapper; 27 | 28 | @Override 29 | public PageInfo appPage(String appName, String appCode, Integer pageNum, Integer pageSize) { 30 | PageHelper.startPage(pageNum, pageSize); 31 | List list = baseAppMapper.selectList(appName); 32 | return new PageInfo<>(list, pageNum, pageSize); 33 | } 34 | 35 | @Override 36 | public List appList(String appName) { 37 | return baseAppMapper.selectList(appName); 38 | } 39 | 40 | @Override 41 | public Integer addApp(BaseApp app) { 42 | app.setStrategyType("white"); 43 | app.setEnabled(1); 44 | app.setCreateBy(UserThreadLocal.getUserId()); 45 | app.setCreateTime(new Date()); 46 | app.setUpdateTime(new Date()); 47 | return baseAppMapper.insert(app); 48 | } 49 | 50 | @Override 51 | public Integer updateApp(BaseApp app) { 52 | BaseApp baseApp = baseAppMapper.selectOne(app.getAppId()); 53 | if (baseApp == null) { 54 | throw new CustomException(ErrorStatusEnum.APP_NOT_FOUNT.getCode(), ErrorStatusEnum.APP_NOT_FOUNT.getMassage()); 55 | } 56 | app.setUpdateTime(new Date()); 57 | app.setUpdateBy(UserThreadLocal.getUserId()); 58 | return baseAppMapper.update(app); 59 | } 60 | 61 | @Override 62 | public Integer deleteApp(Long appId) { 63 | return baseAppMapper.delete(appId); 64 | } 65 | 66 | 67 | 68 | } 69 | -------------------------------------------------------------------------------- /crabc-boot/crabc-core/src/main/java/cn/crabc/core/app/entity/BaseApiInfo.java: -------------------------------------------------------------------------------- 1 | package cn.crabc.core.app.entity; 2 | 3 | import lombok.Getter; 4 | import lombok.Setter; 5 | 6 | import java.util.Date; 7 | 8 | /** 9 | * API基本信息 10 | * 11 | * @author yuqf 12 | */ 13 | @Setter 14 | @Getter 15 | public class BaseApiInfo extends BaseEntity { 16 | 17 | /** 18 | * api业务唯一ID 19 | */ 20 | private Long apiId; 21 | /** 22 | * 接口名称 23 | */ 24 | private String apiName; 25 | /** 26 | * 接口路径 27 | */ 28 | private String apiPath; 29 | /** 30 | * 请求方式 get、post、put、delete、aptch 31 | */ 32 | private String apiMethod; 33 | /** 34 | * API类型:sql、table 35 | */ 36 | private String apiType; 37 | /** 38 | * 授权类型:none、code、secret 39 | */ 40 | private String authType; 41 | /** 42 | * 接口状态:编辑edit、审批audit、发布release、销毁destroy 43 | */ 44 | private String apiStatus; 45 | 46 | /** 47 | * 开放启用 1/0 48 | */ 49 | private Integer enabled; 50 | /** 51 | * 分组ID 52 | */ 53 | private Integer groupId; 54 | /** 55 | * 租户ID 56 | */ 57 | private String tenantId; 58 | 59 | /** 60 | * API描述 61 | */ 62 | private String remarks; 63 | 64 | /** 65 | * 版本 66 | */ 67 | private String version; 68 | 69 | /** 70 | * sql类型,select、insert、update、delete 71 | */ 72 | private String sqlType; 73 | /** 74 | * 返回结果类型:one、array、excel 75 | * 76 | */ 77 | private String resultType; 78 | /** 79 | * sql语句脚本 80 | */ 81 | private String sqlScript; 82 | 83 | /** 84 | * 是否显示脚本1/0 85 | */ 86 | private String showSqlScript; 87 | 88 | /** 89 | * 分页设置,不分页:0、只分页:page、分页并统计:pageCount 90 | */ 91 | private Integer pageSetup; 92 | 93 | /** 94 | * 数据源Id 95 | */ 96 | private Integer datasourceId; 97 | 98 | /** 99 | * 数据源名称 100 | */ 101 | private String datasourceName; 102 | 103 | /** 104 | * schema 105 | */ 106 | private String schemaName; 107 | 108 | /** 109 | * 数据源类型 110 | */ 111 | private String datasourceType; 112 | 113 | /** 114 | * 发布时间 115 | */ 116 | private Date releaseTime; 117 | 118 | /** 119 | * 父级关联ID 120 | */ 121 | private Long parentId; 122 | 123 | } 124 | -------------------------------------------------------------------------------- /crabc-boot/crabc-core/src/main/java/cn/crabc/core/app/service/system/impl/BaseUserServiceImpl.java: -------------------------------------------------------------------------------- 1 | package cn.crabc.core.app.service.system.impl; 2 | 3 | import cn.crabc.core.app.entity.BaseUser; 4 | import cn.crabc.core.app.mapper.BaseUserMapper; 5 | import cn.crabc.core.app.service.system.IBaseUserService; 6 | import cn.crabc.core.datasource.util.PageInfo; 7 | import cn.crabc.core.datasource.enums.ErrorStatusEnum; 8 | import cn.crabc.core.datasource.exception.CustomException; 9 | import com.github.pagehelper.PageHelper; 10 | import org.springframework.beans.factory.annotation.Autowired; 11 | import org.springframework.stereotype.Service; 12 | 13 | import java.util.Date; 14 | import java.util.List; 15 | 16 | /** 17 | * 用户信息 服务实现 18 | * 19 | * @author yuqf 20 | */ 21 | @Service 22 | public class BaseUserServiceImpl implements IBaseUserService { 23 | 24 | @Autowired 25 | private BaseUserMapper baseUserMapper; 26 | 27 | @Override 28 | public PageInfo page(String userName, Integer pageNum, Integer pageSize) { 29 | PageHelper.startPage(pageNum, pageSize); 30 | List list = baseUserMapper.selectList(userName); 31 | return new PageInfo<>(list, pageNum, pageSize); 32 | } 33 | 34 | @Override 35 | public BaseUser getUserByName(String userName) { 36 | try { 37 | return baseUserMapper.selectOne(null,userName); 38 | }catch (Exception e) { 39 | throw new CustomException(50010,"登录失败,请检查数据库链接是否正常!"); 40 | } 41 | } 42 | 43 | @Override 44 | public BaseUser getUserById(Long userId) { 45 | return baseUserMapper.selectOne(userId,null); 46 | } 47 | 48 | @Override 49 | public Integer updateUser(BaseUser baseUser) { 50 | BaseUser user = baseUserMapper.selectOne(baseUser.getUserId(), null); 51 | if (user == null) { 52 | return 0; 53 | } 54 | baseUser.setUpdateBy("1"); 55 | baseUser.setStatus("1"); 56 | baseUser.setUpdateTime(new Date()); 57 | return baseUserMapper.updateUser(baseUser); 58 | } 59 | 60 | @Override 61 | public Integer addUser(BaseUser baseUser) { 62 | BaseUser user = baseUserMapper.selectOne(null, baseUser.getUsername()); 63 | if (user != null) { 64 | throw new CustomException(ErrorStatusEnum.USER_REPEAT.getCode(), ErrorStatusEnum.USER_REPEAT.getMassage()); 65 | } 66 | baseUser.setCreateBy("1"); 67 | baseUser.setCreateTime(new Date()); 68 | return baseUserMapper.insertUser(baseUser); 69 | } 70 | } 71 | -------------------------------------------------------------------------------- /crabc-boot/crabc-spi/src/main/java/cn/crabc/core/spi/StatementMapper.java: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright 2023, crabc.cn (creabc@qq.com) 3 | * 4 | * Licensed under the Apache License, Version 2.0 (the "License"); 5 | * you may not use this file except in compliance with the License. 6 | * You may obtain a copy of the License at 7 | * 8 | * http://www.apache.org/licenses/LICENSE-2.0 9 | * 10 | * Unless required by applicable law or agreed to in writing, software 11 | * distributed under the License is distributed on an "AS IS" BASIS, 12 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 | * See the License for the specific language governing permissions and 14 | * limitations under the License. 15 | */ 16 | package cn.crabc.core.spi; 17 | 18 | import java.util.List; 19 | 20 | /** 21 | * 基础操作 Mapper 22 | * 23 | * @author yuqf 24 | */ 25 | public interface StatementMapper extends Mapper { 26 | 27 | /** 28 | * 查询单个对象 29 | * 30 | * @param dataSourceId 31 | * @param schema 32 | * @param sql 33 | * @param params 34 | * @return 35 | */ 36 | T selectOne(String dataSourceId, String schema, String sql, Object params); 37 | 38 | /** 39 | * 查询对象列表 40 | * 41 | * @param dataSourceId 42 | * @param schema 43 | * @param sql 44 | * @param params 45 | * @return 46 | */ 47 | List selectList(String dataSourceId, String schema, String sql, Object params); 48 | 49 | /** 50 | * 查询分页对象 51 | * 52 | * @param dataSourceId 53 | * @param schema 54 | * @param sql 55 | * @param params 56 | * @param pageNum 57 | * @param pageSize 58 | * @return 59 | */ 60 | Object selectPage(String dataSourceId, String schema, String sql, Object params, int pageNum, int pageSize); 61 | 62 | /** 63 | * 新增 64 | * 65 | * @param dataSourceId 66 | * @param schema 67 | * @param sql 68 | * @param params 69 | * @return 70 | */ 71 | int insert(String dataSourceId, String schema, String sql, Object params); 72 | 73 | /** 74 | * 删除 75 | * 76 | * @param dataSourceId 77 | * @param schema 78 | * @param sql 79 | * @param params 80 | * @return 81 | */ 82 | int delete(String dataSourceId, String schema, String sql, Object params); 83 | 84 | /** 85 | * 修改 86 | * 87 | * @param dataSourceId 88 | * @param schema 89 | * @param sql 90 | * @param params 91 | * @return 92 | */ 93 | int update(String dataSourceId, String schema, String sql, Object params); 94 | } 95 | -------------------------------------------------------------------------------- /crabc-boot/crabc-core/src/main/java/cn/crabc/core/app/controller/DataSourceController.java: -------------------------------------------------------------------------------- 1 | package cn.crabc.core.app.controller; 2 | 3 | import cn.crabc.core.app.entity.BaseDatasource; 4 | import cn.crabc.core.app.service.system.IBaseDataSourceService; 5 | import cn.crabc.core.datasource.util.PageInfo; 6 | import cn.crabc.core.app.util.Result; 7 | import org.springframework.beans.factory.annotation.Autowired; 8 | import org.springframework.web.bind.annotation.*; 9 | 10 | /** 11 | * 数据源管理 12 | * 13 | * @author yuqf 14 | */ 15 | @RestController 16 | @RequestMapping("/api/box/sys/datasource") 17 | public class DataSourceController { 18 | 19 | @Autowired 20 | private IBaseDataSourceService baseDataSourceService; 21 | 22 | /** 23 | * 数据源分页列表 24 | * @param datasourceName 25 | * @param pageNum 26 | * @param pageSize 27 | * @return 28 | */ 29 | @GetMapping("/page") 30 | public Result list(String datasourceName, Integer pageNum, Integer pageSize) { 31 | PageInfo dataSourcePage = baseDataSourceService.getDataSourcePage(datasourceName, pageNum, pageSize); 32 | return Result.success(dataSourcePage); 33 | } 34 | 35 | /** 36 | * 新增数据源 37 | * @param dataSource 38 | * @return 39 | */ 40 | @PostMapping 41 | public Result add(BaseDatasource dataSource) { 42 | Integer result = baseDataSourceService.addDataSource(dataSource); 43 | if(result == 1){ 44 | return Result.success("操作成功"); 45 | } 46 | return Result.error("操作失败"); 47 | } 48 | 49 | /** 50 | * 编辑 51 | * @param dataSource 52 | * @return 53 | */ 54 | @PutMapping 55 | public Result update(BaseDatasource dataSource) { 56 | Integer result = baseDataSourceService.updateDataSource(dataSource); 57 | if(result == 1){ 58 | return Result.success("操作成功"); 59 | } 60 | return Result.error("操作失败"); 61 | } 62 | 63 | /** 64 | * 数据源测试连接 65 | * @param dataSource 66 | * @return 67 | */ 68 | @PostMapping("/test") 69 | public Result test(BaseDatasource dataSource) { 70 | String test = baseDataSourceService.test(dataSource); 71 | if("1".equals(test)){ 72 | return Result.success("测试成功"); 73 | } 74 | return Result.error("测试失败:" + test); 75 | } 76 | 77 | /** 78 | * 删除数据源 79 | * @param dataSourceId 80 | * @return 81 | */ 82 | @DeleteMapping("/{dataSourceId}") 83 | public Result delete(@PathVariable Integer dataSourceId) { 84 | baseDataSourceService.deleteDataSource(dataSourceId); 85 | return Result.success("操作成功!"); 86 | } 87 | } 88 | -------------------------------------------------------------------------------- /crabc-boot/crabc-core/src/main/java/cn/crabc/core/app/exception/ExceptionHandler.java: -------------------------------------------------------------------------------- 1 | package cn.crabc.core.app.exception; 2 | 3 | import cn.crabc.core.app.util.Result; 4 | import cn.crabc.core.datasource.exception.CustomException; 5 | import cn.crabc.core.spi.PluginException; 6 | import jakarta.servlet.http.HttpServletRequest; 7 | import org.slf4j.Logger; 8 | import org.slf4j.LoggerFactory; 9 | import org.springframework.http.converter.HttpMessageNotReadableException; 10 | import org.springframework.web.bind.annotation.ResponseBody; 11 | import org.springframework.web.bind.annotation.RestControllerAdvice; 12 | 13 | 14 | /** 15 | * 异常统一返回处理 16 | * 17 | * @author yuqf 18 | */ 19 | @RestControllerAdvice 20 | public class ExceptionHandler { 21 | private final static Logger log = LoggerFactory.getLogger(ExceptionHandler.class); 22 | 23 | /** 24 | * 处理自定义异常 25 | * 26 | * @param e 27 | * @return 28 | */ 29 | @org.springframework.web.bind.annotation.ExceptionHandler(value = CustomException.class) 30 | @ResponseBody 31 | public Result custom(CustomException e) { 32 | return Result.error(e.getCode(), e.getMsg()); 33 | } 34 | 35 | /** 36 | * 处理插件异常 37 | * 38 | * @param e 39 | * @return 40 | */ 41 | @org.springframework.web.bind.annotation.ExceptionHandler(value = PluginException.class) 42 | @ResponseBody 43 | public Result custom(PluginException e) { 44 | return Result.error(e.getCode(), e.getMsg()); 45 | } 46 | 47 | /** 48 | * 处理空指针的异常 49 | * 50 | * @param req 51 | * @param e 52 | * @return 53 | */ 54 | @org.springframework.web.bind.annotation.ExceptionHandler(value = NullPointerException.class) 55 | @ResponseBody 56 | public Result exceptionHandler(HttpServletRequest req, NullPointerException e) { 57 | return Result.error(50001, "必传参数不能为空!"); 58 | } 59 | 60 | /** 61 | * 运行时异常 62 | * @param req 63 | * @param e 64 | * @return 65 | */ 66 | @org.springframework.web.bind.annotation.ExceptionHandler(value = RuntimeException.class) 67 | @ResponseBody 68 | public Result exceptionHandler(HttpServletRequest req, RuntimeException e) { 69 | return Result.error(50005, "执行异常:"+e.getMessage()); 70 | } 71 | 72 | /** 73 | * 处理参数校验异常 --Json 转换异常 74 | * 75 | * @param req 76 | * @param e 77 | * @return 78 | */ 79 | @org.springframework.web.bind.annotation.ExceptionHandler(value = HttpMessageNotReadableException.class) 80 | @ResponseBody 81 | public Result exceptionHandler(HttpServletRequest req, HttpMessageNotReadableException e) { 82 | return Result.error(50002, "Body参数异常,请检查Body/json是否正确传参"); 83 | } 84 | } 85 | -------------------------------------------------------------------------------- /crabc-boot/crabc-core/src/main/java/cn/crabc/core/app/mapper/BaseApiInfoMapper.java: -------------------------------------------------------------------------------- 1 | package cn.crabc.core.app.mapper; 2 | 3 | import cn.crabc.core.app.entity.BaseApiInfo; 4 | import cn.crabc.core.app.entity.dto.ApiInfoDTO; 5 | import cn.crabc.core.app.entity.vo.ApiComboBoxVO; 6 | import cn.crabc.core.app.entity.vo.BaseApiInfoVO; 7 | import org.apache.ibatis.annotations.Mapper; 8 | import org.apache.ibatis.annotations.Param; 9 | 10 | import java.util.List; 11 | 12 | /** 13 | * API基本信息 Mapper接口 14 | * 15 | * @author yuqf 16 | */ 17 | @Mapper 18 | public interface BaseApiInfoMapper { 19 | 20 | /** 21 | * API列表 22 | * 23 | * @param apiName 24 | * @return 25 | */ 26 | List selectList(@Param("apiName") String apiName, @Param("devType") String devType); 27 | 28 | /** 29 | * 分组查询API信息 30 | * 31 | * @param groupId 32 | * @return 33 | */ 34 | List selectApiGroup(@Param("groupId") Integer groupId, @Param("userId") String userId); 35 | 36 | /** 37 | * 查询关联应用的API 38 | * 39 | * @param appId 40 | * @return 41 | */ 42 | List selectApiApp(Long appId); 43 | 44 | /** 45 | * 根据Id查询基本信息 46 | * 47 | * @param apiId 48 | * @return 49 | */ 50 | BaseApiInfo selectApiById(Long apiId); 51 | 52 | /** 53 | * 根据Id查询api基本信息 54 | * 55 | * @param apiId 56 | * @return 57 | */ 58 | BaseApiInfoVO selectBaseApi(Long apiId); 59 | 60 | /** 61 | * 校验api地址是否已经存在 62 | * 63 | * @param apiPath 64 | * @param method 65 | * @return 66 | */ 67 | Integer checkApiPath(@Param("apiId") Long apiId, @Param("apiPath") String apiPath, @Param("method") String method); 68 | 69 | 70 | /** 71 | * 根据apiId查询信息 72 | * @param apiId 73 | * @return 74 | */ 75 | List selectApiDetail(@Param("apiId") Long apiId); 76 | 77 | /** 78 | * 插入API 79 | * 80 | * @param apiInfo 81 | * @return 82 | */ 83 | Integer insertApiInfo(BaseApiInfo apiInfo); 84 | 85 | /** 86 | * 编辑API信息 87 | * 88 | * @param apiInfo 89 | * @return 90 | */ 91 | Integer updateApiInfo(BaseApiInfo apiInfo); 92 | 93 | /** 94 | * 更新API状态 95 | * 96 | * @param apiInfo 97 | * @return 98 | */ 99 | Integer updateApiState(BaseApiInfo apiInfo); 100 | 101 | /** 102 | * 删除API 103 | * @param apiId 104 | * @return 105 | */ 106 | Integer deleteApiInfo(@Param("apiId") Long apiId,@Param("userId") String userId); 107 | 108 | /** 109 | * API校验统计 110 | * 111 | * @param apiId 112 | * @return 113 | */ 114 | Integer countApi(Long apiId); 115 | 116 | } 117 | -------------------------------------------------------------------------------- /crabc-boot/crabc-core/src/main/resources/mapper/BaseGroupMapper.xml: -------------------------------------------------------------------------------- 1 | 2 | 5 | 6 | 7 | 15 | 16 | 27 | 39 | 40 | UPDATE base_group 41 | 42 | group_name = #{groupName}, 43 | parent_id = #{parentId}, 44 | group_desc = #{groupDesc}, 45 | update_time =#{updateTime} 46 | 47 | WHERE group_id = #{groupId} 48 | 49 | 50 | 51 | insert into base_group( 52 | group_name, 53 | parent_id, 54 | group_desc, 55 | create_by, 56 | create_time 57 | )values( 58 | #{groupName}, 59 | #{parentId}, 60 | #{groupDesc}, 61 | #{createBy}, 62 | #{createTime} 63 | ) 64 | 65 | 66 | 67 | delete from base_group where group_id =#{groupId} 68 | 69 | 70 | 71 | delete from base_group where create_by =#{userId} 72 | 73 | -------------------------------------------------------------------------------- /crabc-boot/crabc-core/pom.xml: -------------------------------------------------------------------------------- 1 | 2 | 5 | 6 | crabc-boot 7 | cn.crabc 8 | ${revision} 9 | 10 | 4.0.0 11 | 12 | crabc-core 13 | 14 | 15 | 21 16 | 21 17 | 18 | 19 | 20 | 21 | junit 22 | junit 23 | test 24 | 25 | 26 | org.springframework.boot 27 | spring-boot-starter-test 28 | test 29 | 30 | 31 | org.springframework.boot 32 | spring-boot-starter-actuator 33 | 34 | 35 | org.springframework.boot 36 | spring-boot-starter-cache 37 | 38 | 39 | com.github.ben-manes.caffeine 40 | caffeine 41 | 42 | 43 | io.jsonwebtoken 44 | jjwt 45 | ${jwt.version} 46 | 47 | 48 | 49 | org.apache.commons 50 | commons-pool2 51 | ${commons-pool2.version} 52 | 53 | 54 | cn.crabc 55 | crabc-datasource 56 | ${project.version} 57 | 58 | 59 | org.apache.commons 60 | commons-lang3 61 | 62 | 63 | 64 | org.projectlombok 65 | lombok 66 | ${lombok.version} 67 | provided 68 | 69 | 70 | org.bouncycastle 71 | bcpkix-jdk18on 72 | ${jdk18on.version} 73 | 74 | 75 | -------------------------------------------------------------------------------- /crabc-boot/crabc-datasource/src/main/java/cn/crabc/core/datasource/mapper/BaseSelectProvider.java: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright 2023, crabc.cn (creabc@qq.com) 3 | * 4 | * Licensed under the Apache License, Version 2.0 (the "License"); 5 | * you may not use this file except in compliance with the License. 6 | * You may obtain a copy of the License at 7 | * 8 | * http://www.apache.org/licenses/LICENSE-2.0 9 | * 10 | * Unless required by applicable law or agreed to in writing, software 11 | * distributed under the License is distributed on an "AS IS" BASIS, 12 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 | * See the License for the specific language governing permissions and 14 | * limitations under the License. 15 | */ 16 | package cn.crabc.core.datasource.mapper; 17 | import cn.crabc.core.datasource.constant.BaseConstant; 18 | import org.apache.ibatis.annotations.Mapper; 19 | 20 | import java.util.Map; 21 | 22 | /** 23 | * mybatis SQL提供器 24 | * 25 | * @author yuqf 26 | */ 27 | @Mapper 28 | public class BaseSelectProvider { 29 | 30 | // 标签 31 | private static final String[] tags = {"","","","","","","",""; 42 | break; 43 | } 44 | } 45 | return sql; 46 | } 47 | 48 | /** 49 | * 查询类 50 | * @param params 51 | * @return 52 | */ 53 | public String executeQuery(Map params) { 54 | String sql = params.get(BaseConstant.BASE_SQL).toString(); 55 | params.remove(BaseConstant.BASE_SQL); 56 | sql = this.addScript(sql); 57 | return sql; 58 | } 59 | 60 | 61 | /** 62 | * 新增类 63 | * @param params 64 | * @return 65 | */ 66 | public String executeInsert(Map params) { 67 | String sql = params.get(BaseConstant.BASE_SQL).toString(); 68 | params.remove(BaseConstant.BASE_SQL); 69 | sql = this.addScript(sql); 70 | return sql; 71 | } 72 | 73 | /** 74 | * 修改类 75 | * @param params 76 | * @return 77 | */ 78 | public String executeUpdate(Map params) { 79 | String sql = params.get(BaseConstant.BASE_SQL).toString(); 80 | params.remove(BaseConstant.BASE_SQL); 81 | sql = this.addScript(sql); 82 | return sql; 83 | } 84 | 85 | /** 86 | * 删除类 87 | * @param params 88 | * @return 89 | */ 90 | public String executeDelete(Map params) { 91 | String sql = params.get(BaseConstant.BASE_SQL).toString(); 92 | params.remove(BaseConstant.BASE_SQL); 93 | sql = this.addScript(sql); 94 | return sql; 95 | } 96 | } 97 | -------------------------------------------------------------------------------- /crabc-boot/crabc-spi/src/main/java/cn/crabc/core/spi/bean/Column.java: -------------------------------------------------------------------------------- 1 | package cn.crabc.core.spi.bean; 2 | 3 | import java.io.Serializable; 4 | 5 | /** 6 | * 列属性 7 | * 8 | * @author yuqf 9 | */ 10 | 11 | public class Column implements Serializable { 12 | private static final long serialVersionUID = 1L; 13 | /** 数据源Id */ 14 | private String datasourceId; 15 | /** 库 */ 16 | private String catalog; 17 | /** 模式 */ 18 | private String schema; 19 | /** 表名称 */ 20 | private String tableName; 21 | 22 | private String columnName; 23 | 24 | private String remarks; 25 | /** 类型 */ 26 | private String columnType; 27 | /** 长度 */ 28 | private String columnSize; 29 | /** 精度 */ 30 | private String decimalDigits; 31 | private String columnDefault; 32 | 33 | private String typeIcon; 34 | public String getDatasourceId() { 35 | return datasourceId; 36 | } 37 | 38 | public void setDatasourceId(String datasourceId) { 39 | this.datasourceId = datasourceId; 40 | } 41 | 42 | public String getSchema() { 43 | return schema; 44 | } 45 | 46 | public void setSchema(String schema) { 47 | this.schema = schema; 48 | } 49 | 50 | public String getCatalog() { 51 | return catalog; 52 | } 53 | 54 | public void setCatalog(String catalog) { 55 | this.catalog = catalog; 56 | } 57 | 58 | public String getTableName() { 59 | return tableName; 60 | } 61 | 62 | public void setTableName(String tableName) { 63 | this.tableName = tableName; 64 | } 65 | 66 | public String getColumnName() { 67 | return columnName; 68 | } 69 | 70 | public void setColumnName(String columnName) { 71 | this.columnName = columnName; 72 | } 73 | 74 | public String getRemarks() { 75 | return remarks; 76 | } 77 | 78 | public void setRemarks(String remarks) { 79 | this.remarks = remarks; 80 | } 81 | 82 | public String getColumnType() { 83 | return columnType; 84 | } 85 | 86 | public void setColumnType(String columnType) { 87 | this.columnType = columnType; 88 | } 89 | 90 | public String getColumnSize() { 91 | return columnSize; 92 | } 93 | 94 | public void setColumnSize(String columnSize) { 95 | this.columnSize = columnSize; 96 | } 97 | 98 | public String getColumnDefault() { 99 | return columnDefault; 100 | } 101 | 102 | public void setColumnDefault(String columnDefault) { 103 | this.columnDefault = columnDefault; 104 | } 105 | 106 | public String getDecimalDigits() { 107 | return decimalDigits; 108 | } 109 | 110 | public void setDecimalDigits(String decimalDigits) { 111 | this.decimalDigits = decimalDigits; 112 | } 113 | 114 | public String getTypeIcon() { 115 | return typeIcon; 116 | } 117 | 118 | public void setTypeIcon(String typeIcon) { 119 | this.typeIcon = typeIcon; 120 | } 121 | } 122 | -------------------------------------------------------------------------------- /crabc-boot/crabc-core/src/main/java/cn/crabc/core/app/config/DataSourceConfig.java: -------------------------------------------------------------------------------- 1 | package cn.crabc.core.app.config; 2 | 3 | import cn.crabc.core.datasource.config.JdbcDataSourceRouter; 4 | import cn.crabc.core.datasource.driver.DataSourceManager; 5 | import cn.crabc.core.datasource.driver.jdbc.JdbcDataSourceDriver; 6 | import cn.crabc.core.datasource.mapper.BaseDataHandleMapper; 7 | import cn.crabc.core.spi.DataSourceDriver; 8 | import com.alibaba.druid.pool.DruidDataSource; 9 | import org.springframework.beans.factory.annotation.Value; 10 | import org.springframework.cache.annotation.EnableCaching; 11 | import org.springframework.context.annotation.Bean; 12 | import org.springframework.context.annotation.Configuration; 13 | import org.springframework.scheduling.annotation.EnableScheduling; 14 | 15 | import java.util.HashMap; 16 | 17 | /** 18 | * 数据源路由配置 19 | * 20 | * @author yuqf 21 | */ 22 | @EnableCaching 23 | @EnableScheduling 24 | @Configuration 25 | public class DataSourceConfig { 26 | 27 | @Value("${spring.datasource.url}") 28 | private String jdbcUrl; 29 | @Value("${spring.datasource.username}") 30 | private String username; 31 | @Value("${spring.datasource.password}") 32 | private String password; 33 | 34 | /** 35 | * 默认系统数据源 36 | * 37 | * @return 38 | */ 39 | @Bean 40 | public JdbcDataSourceRouter defaultDataSource() { 41 | DruidDataSource dataSource = new DruidDataSource(); 42 | dataSource.setUrl(jdbcUrl); 43 | dataSource.setUsername(username); 44 | dataSource.setPassword(password); 45 | dataSource.setInitialSize(1); 46 | dataSource.setMinIdle(1); 47 | dataSource.setMaxActive(20); 48 | // 配置获取连接等待超时的时间 49 | dataSource.setMaxWait(6000); 50 | dataSource.setKeepAlive(true); 51 | // 配置一个连接在池中最小生存的时间,单位是毫秒 52 | dataSource.setMinEvictableIdleTimeMillis(300000); 53 | dataSource.setMaxEvictableIdleTimeMillis(900000); 54 | // 配置间隔多久才进行一次检测,检测需要关闭的空闲连接,单位是毫秒 55 | dataSource.setTimeBetweenEvictionRunsMillis(60000); 56 | dataSource.setTestWhileIdle(true); 57 | dataSource.setTestOnBorrow(false); 58 | dataSource.setTestOnReturn(false); 59 | dataSource.setTestOnReturn(false); 60 | JdbcDataSourceRouter dynamic = new JdbcDataSourceRouter(); 61 | dynamic.setTargetDataSources(new HashMap<>()); 62 | // 设置默认数据源 63 | dynamic.setDefaultTargetDataSource(dataSource); 64 | return dynamic; 65 | } 66 | 67 | /** 68 | * JDBC 数据源驱动 69 | * 70 | * @param baseDataHandleMapper 71 | * @return 72 | */ 73 | @Bean 74 | public DataSourceDriver dataSourceDriver(BaseDataHandleMapper baseDataHandleMapper) { 75 | return new JdbcDataSourceDriver(baseDataHandleMapper); 76 | } 77 | 78 | /** 79 | * 数据源插件驱动 80 | * 81 | * @param jdbcDataSourceDriver 82 | * @return 83 | */ 84 | @Bean 85 | public DataSourceManager dataSourceDriverManager(DataSourceDriver jdbcDataSourceDriver) { 86 | return new DataSourceManager(jdbcDataSourceDriver); 87 | } 88 | } 89 | -------------------------------------------------------------------------------- /crabc-boot/crabc-core/src/main/resources/static/index.html: -------------------------------------------------------------------------------- 1 | Crabc

 

 
-------------------------------------------------------------------------------- /crabc-boot/crabc-core/src/main/java/cn/crabc/core/app/util/JwtUtil.java: -------------------------------------------------------------------------------- 1 | package cn.crabc.core.app.util; 2 | 3 | import io.jsonwebtoken.Claims; 4 | import io.jsonwebtoken.Jwts; 5 | import io.jsonwebtoken.security.Keys; 6 | import jakarta.servlet.http.HttpServletRequest; 7 | 8 | import java.util.Date; 9 | import java.util.HashMap; 10 | import java.util.Map; 11 | import java.util.UUID; 12 | 13 | /** 14 | * Jwt工具类 15 | * 16 | * @author yuqf 17 | */ 18 | public class JwtUtil { 19 | private static String header = "Authorization"; 20 | // 令牌秘钥 21 | private static String secret = "KLSDJIWKD27JKZDFJALKJKD82KM90DL1NWMD"; 22 | public static final String TOKEN_PREFIX = "bearer "; 23 | public static long expirationTime = 1000L * 60 * 60 * 8; // 8小时过期 24 | 25 | /** 26 | * 创建令牌 27 | */ 28 | public static String createToken(Long userId, String userName) { 29 | Map claims = new HashMap<>(); 30 | claims.put("userId", userId); 31 | claims.put("userName", userName); 32 | return createToken(claims); 33 | } 34 | 35 | /** 36 | * 生成令牌 37 | */ 38 | public static String createToken(Map claims) { 39 | String uuid = UUID.randomUUID().toString(); 40 | Date now = new Date(); 41 | Date expiration = new Date(now.getTime() + expirationTime); 42 | try { 43 | return Jwts.builder() 44 | .header() 45 | .add("typ", "JWT") 46 | .add("alg", "HS256") 47 | .and() 48 | .claims(claims) 49 | .expiration(expiration) 50 | .id(uuid) 51 | .signWith(Keys.hmacShaKeyFor(secret.getBytes())) 52 | .compact(); 53 | }catch (Exception e) { 54 | e.printStackTrace(); 55 | } 56 | return null; 57 | } 58 | 59 | /** 60 | * 从令牌中获取数据声明 61 | * 62 | * @param token 令牌 63 | * @return 数据声明 64 | */ 65 | public static Claims parseToken(String token) { 66 | try { 67 | return Jwts.parser() 68 | .verifyWith(Keys.hmacShaKeyFor(secret.getBytes())) 69 | .build() 70 | .parseSignedClaims(token).getPayload(); 71 | } catch (Exception e) { 72 | e.printStackTrace(); 73 | } 74 | return null; 75 | } 76 | 77 | /** 78 | * 从令牌中获取用户名 79 | * 80 | * @param token 令牌 81 | * @return 用户名 82 | */ 83 | public static String getUserId(String token) { 84 | Claims claims = parseToken(token); 85 | return claims.getSubject(); 86 | } 87 | 88 | /** 89 | * 获取请求token 90 | * 91 | * @param request 92 | * @return token 93 | */ 94 | public static String getToken(HttpServletRequest request) { 95 | String token = request.getHeader(header); 96 | if (token != null && token.startsWith(TOKEN_PREFIX)) { 97 | token = token.replace(TOKEN_PREFIX, ""); 98 | } 99 | return token; 100 | } 101 | } 102 | -------------------------------------------------------------------------------- /crabc-boot/crabc-core/src/main/resources/static/js/chunk-3ebec14d.b740b144.js: -------------------------------------------------------------------------------- 1 | (window.webpackJsonp=window.webpackJsonp||[]).push([["chunk-3ebec14d"],{"3e1f":function(t,e,n){"use strict";n.r(e);var i=n("680a"),a=n("5530"),o=n("2f62"),s={name:"Account",mixins:[{computed:Object(a.a)(Object(a.a)({},Object(o.b)({layout:function(t){return t.app.layout},navTheme:function(t){return t.app.theme},primaryColor:function(t){return t.app.color},colorWeak:function(t){return t.app.weak},fixedHeader:function(t){return t.app.fixedHeader},fixedSidebar:function(t){return t.app.fixedSidebar},contentWidth:function(t){return t.app.contentWidth},autoHideHeader:function(t){return t.app.autoHideHeader},isMobile:function(t){return t.app.isMobile},sideCollapsed:function(t){return t.app.sideCollapsed},multiTab:function(t){return t.app.multiTab}})),{},{isTopMenu:function(){return"topmenu"===this.layout}}),methods:{isSideMenu:function(){return!this.isTopMenu}}}],components:{RouteView:i.c},data:function(){return{mode:"inline",openKeys:["sub1","sub2","sub3","sub4","sub5"],selectedKeys:[],list:[{title:"数据源",key:"sub2",children:[{name:"数据源",icon:"database",url:"DataSource"}]},{title:"应用管理",key:"sub3",children:[{name:"应用列表",icon:"appstore",url:"Application"}]},{title:"接口管理",key:"sub4",children:[{name:"接口列表",icon:"api",url:"MyApi"}]},{title:"日志管理",key:"sub5",children:[{name:"接口日志",icon:"file-search",url:"UseLogList"}]}],defUrl:"",user:{nickname:""}}},beforeRouteEnter:function(t,e,n){n((function(t){t.defUrl=t.$route.meta.val}))},watch:{$route:function(t,e){this.defUrl=this.$route.meta.val}},created:function(){this.user.nickname=this.$store.state.user.info.nickname},methods:{onOpenChange:function(t){this.openKeys=t},openChange:function(){},goto:function(t){this.defUrl=t.url,this.$router.push({name:t.url})}}},r=(n("e759"),n("2877")),u=Object(r.a)(s,(function(){var t=this,e=t._self._c;return e("div",[e("div",{staticClass:"account-page-main"},[e("a-card",{style:{height:"100%"},attrs:{bordered:!1,bodyStyle:{padding:"16px 0",height:"100%"}}},[e("div",{staticClass:"account-settings-info-main",class:{mobile:t.isMobile}},[e("div",{staticClass:"account-settings-info-left"},[e("a-menu",{style:{border:"0",width:t.isMobile?"560px":"auto"},attrs:{mode:t.isMobile?"horizontal":"inline","open-keys":t.openKeys,type:"inner"},on:{openChange:t.onOpenChange}},t._l(t.list,(function(n){return e("a-sub-menu",{key:n.key},[e("span",{staticClass:"menu-title",attrs:{slot:"title"},slot:"title"},[t._v(t._s(n.title))]),t._l(n.children,(function(n){return e("a-menu-item",{key:n.url,staticClass:"account-list-item",class:t.defUrl==n.url?"active":"",on:{click:function(e){return t.goto(n)}}},[e("a-icon",{attrs:{type:n.icon}}),t._v(t._s(n.name)+" ")],1)}))],2)})),1)],1),e("div",{staticClass:"account-settings-info-right"},[e("div",{staticClass:"account-settings-info-title"},[this.$route.meta.detail?e("span",[e("router-link",{attrs:{to:{name:this.$route.meta.val}}},[e("a-icon",{staticStyle:{"font-size":"16px",cursor:"pointer",color:"#545c70"},attrs:{type:"arrow-left"}})],1),e("a-divider",{attrs:{type:"vertical"}})],1):t._e(),e("span",[t._v(" "+t._s(t.$t(t.$route.meta.title))+" ")])]),e("route-view")],1)])])],1)])}),[],!1,null,"253c29fe",null);e.default=u.exports},a36e:function(t,e,n){},e759:function(t,e,n){"use strict";n("a36e")}}]); -------------------------------------------------------------------------------- /crabc-boot/crabc-core/src/main/java/cn/crabc/core/app/util/Result.java: -------------------------------------------------------------------------------- 1 | package cn.crabc.core.app.util; 2 | 3 | import java.util.HashMap; 4 | 5 | /** 6 | * 返回对象 7 | * 8 | * @author yuqf 9 | */ 10 | public class Result extends HashMap 11 | { 12 | private static final long serialVersionUID = 1L; 13 | 14 | /** 状态码 */ 15 | public static final String CODE_TAG = "code"; 16 | 17 | /** 返回内容 */ 18 | public static final String MSG_TAG = "msg"; 19 | 20 | /** 数据对象 */ 21 | public static final String DATA_TAG = "data"; 22 | 23 | /** 24 | * 初始化一个新创建的 AjaxResult 对象,使其表示一个空消息。 25 | */ 26 | public Result() 27 | { 28 | } 29 | 30 | /** 31 | * 初始化一个新创建的 AjaxResult 对象 32 | * 33 | * @param code 状态码 34 | * @param msg 返回内容 35 | */ 36 | public Result(int code, String msg) 37 | { 38 | super.put(CODE_TAG, code); 39 | super.put(MSG_TAG, msg); 40 | } 41 | 42 | /** 43 | * 初始化一个新创建的 AjaxResult 对象 44 | * 45 | * @param code 状态码 46 | * @param msg 返回内容 47 | * @param data 数据对象 48 | */ 49 | public Result(int code, String msg, Object data) 50 | { 51 | super.put(CODE_TAG, code); 52 | super.put(MSG_TAG, msg); 53 | super.put(DATA_TAG, data); 54 | } 55 | 56 | /** 57 | * 方便链式调用 58 | * 59 | * @param key 60 | * @param value 61 | * @return 62 | */ 63 | @Override 64 | public Result put(String key, Object value) 65 | { 66 | super.put(key, value); 67 | return this; 68 | } 69 | 70 | /** 71 | * 返回成功消息 72 | * 73 | * @return 成功消息 74 | */ 75 | public static Result success() 76 | { 77 | return Result.success("success"); 78 | } 79 | 80 | /** 81 | * 返回成功数据 82 | * 83 | * @return 成功消息 84 | */ 85 | public static Result success(Object data) 86 | { 87 | return Result.success("success", data); 88 | } 89 | 90 | /** 91 | * 返回成功消息 92 | * 93 | * @param msg 返回内容 94 | * @param data 数据对象 95 | * @return 成功消息 96 | */ 97 | public static Result success(String msg, Object data) 98 | { 99 | return new Result(0, msg, data); 100 | } 101 | 102 | /** 103 | * 返回错误消息 104 | * 105 | * @return 106 | */ 107 | public static Result error() 108 | { 109 | return Result.error("fail"); 110 | } 111 | 112 | /** 113 | * 返回错误消息 114 | * 115 | * @param msg 返回内容 116 | * @return 警告消息 117 | */ 118 | public static Result error(String msg) 119 | { 120 | return Result.error(msg, null); 121 | } 122 | 123 | /** 124 | * 返回错误消息 125 | * 126 | * @param msg 返回内容 127 | * @param data 数据对象 128 | * @return 警告消息 129 | */ 130 | public static Result error(String msg, Object data) 131 | { 132 | return new Result(500, msg, data); 133 | } 134 | 135 | /** 136 | * 返回错误消息 137 | * 138 | * @param code 状态码 139 | * @param msg 返回内容 140 | * @return 警告消息 141 | */ 142 | public static Result error(int code, String msg) 143 | { 144 | return new Result(code, msg, null); 145 | } 146 | } 147 | -------------------------------------------------------------------------------- /crabc-boot/crabc-spi/src/main/java/cn/crabc/core/spi/bean/Table.java: -------------------------------------------------------------------------------- 1 | package cn.crabc.core.spi.bean; 2 | 3 | 4 | import java.io.Serializable; 5 | import java.util.Date; 6 | 7 | /** 8 | * 表属性 9 | * 10 | * @author yuqf 11 | */ 12 | public class Table implements Serializable { 13 | private static final long serialVersionUID = 1L; 14 | /** 15 | * 数据源Id 16 | */ 17 | private String datasourceId; 18 | /** 19 | * 库 20 | */ 21 | private String catalog; 22 | /** 23 | * 模式 24 | */ 25 | private String schema; 26 | /** 27 | * 表名 28 | */ 29 | private String tableName; 30 | /** 31 | * 表类型。典型的类型是“TABLE”,“VIEW”,“SYSTEM TABLE”,“GLOBAL TEMPORARY”,“LOCAL TEMPORARY”,“ALIAS”,“SYNONYM”。 32 | */ 33 | private String tableType; 34 | /** 35 | * 表备注 36 | */ 37 | private String remarks; 38 | /** 39 | * 表状态 40 | */ 41 | private String status; 42 | /** 43 | * 表大小(字节单位) 44 | */ 45 | private Long size; 46 | /** 47 | * 表行数 48 | */ 49 | private Long rows; 50 | /** 51 | * 表创建时间 52 | */ 53 | private Date createTime; 54 | /** 55 | * 表修改时间 56 | */ 57 | private Date updateTime; 58 | 59 | public String getDatasourceId() { 60 | return datasourceId; 61 | } 62 | 63 | public void setDatasourceId(String datasourceId) { 64 | this.datasourceId = datasourceId; 65 | } 66 | 67 | public String getCatalog() { 68 | return catalog; 69 | } 70 | 71 | public void setCatalog(String catalog) { 72 | this.catalog = catalog; 73 | } 74 | 75 | public String getSchema() { 76 | return schema; 77 | } 78 | 79 | public void setSchema(String schema) { 80 | this.schema = schema; 81 | } 82 | 83 | public String getTableName() { 84 | return tableName; 85 | } 86 | 87 | public void setTableName(String tableName) { 88 | this.tableName = tableName; 89 | } 90 | 91 | public String getTableType() { 92 | return tableType; 93 | } 94 | 95 | public void setTableType(String tableType) { 96 | this.tableType = tableType; 97 | } 98 | 99 | public String getRemarks() { 100 | return remarks; 101 | } 102 | 103 | public void setRemarks(String remarks) { 104 | this.remarks = remarks; 105 | } 106 | 107 | public String getStatus() { 108 | return status; 109 | } 110 | 111 | public void setStatus(String status) { 112 | this.status = status; 113 | } 114 | 115 | public Long getSize() { 116 | return size; 117 | } 118 | 119 | public void setSize(Long size) { 120 | this.size = size; 121 | } 122 | 123 | public Long getRows() { 124 | return rows; 125 | } 126 | 127 | public void setRows(Long rows) { 128 | this.rows = rows; 129 | } 130 | 131 | public Date getCreateTime() { 132 | return createTime; 133 | } 134 | 135 | public void setCreateTime(Date createTime) { 136 | this.createTime = createTime; 137 | } 138 | 139 | public Date getUpdateTime() { 140 | return updateTime; 141 | } 142 | 143 | public void setUpdateTime(Date updateTime) { 144 | this.updateTime = updateTime; 145 | } 146 | } 147 | -------------------------------------------------------------------------------- /crabc-boot/crabc-core/src/main/java/cn/crabc/core/app/service/system/impl/BaseApiParamServiceImpl.java: -------------------------------------------------------------------------------- 1 | package cn.crabc.core.app.service.system.impl; 2 | 3 | import cn.crabc.core.app.entity.vo.ApiParamsVO; 4 | import cn.crabc.core.app.entity.vo.RequestParamsVO; 5 | import cn.crabc.core.app.mapper.BaseApiParamMapper; 6 | import cn.crabc.core.app.service.system.IBaseApiParamService; 7 | import org.springframework.beans.factory.annotation.Autowired; 8 | import org.springframework.beans.factory.annotation.Value; 9 | import org.springframework.stereotype.Service; 10 | 11 | import java.util.ArrayList; 12 | import java.util.List; 13 | import java.util.Map; 14 | import java.util.stream.Collectors; 15 | 16 | /** 17 | * API参数 服务实现 18 | * 19 | * @author yuqf 20 | */ 21 | @Service 22 | public class BaseApiParamServiceImpl implements IBaseApiParamService { 23 | 24 | @Autowired 25 | private BaseApiParamMapper baseApiParamMapper; 26 | @Value("${crabc.result.code:code}") 27 | private String resultCode; 28 | @Value("${crabc.result.msg:msg}") 29 | private String resultMsg; 30 | @Value("${crabc.result.data:data}") 31 | private String resultData; 32 | 33 | public static final String REQUEST ="request"; 34 | /** 35 | * 响应参数 36 | */ 37 | public static final String RESPONSE ="response"; 38 | 39 | @Override 40 | public ApiParamsVO getApiDetailsParams(Long apiId) { 41 | ApiParamsVO apiParams = new ApiParamsVO(); 42 | List requestParams = baseApiParamMapper.selectApiParams(apiId); 43 | Map> paramMap = requestParams.stream().collect(Collectors.groupingBy(RequestParamsVO::getParamModel)); 44 | apiParams.setReqParams(paramMap.get(REQUEST)); 45 | List responseParam = paramMap.get(RESPONSE); 46 | apiParams.setResParams(this.setResponseParams(responseParam)); 47 | return apiParams; 48 | } 49 | 50 | /** 51 | * 处理返回参数 52 | * @param responseParams 53 | * @return 54 | */ 55 | public List setResponseParams(List responseParams) { 56 | List list = new ArrayList<>(); 57 | if (responseParams == null || responseParams.isEmpty()) { 58 | return list; 59 | } 60 | RequestParamsVO responseCode = new RequestParamsVO(); 61 | responseCode.setParamName(resultCode); 62 | responseCode.setParamDesc("状态码:0 成功"); 63 | responseCode.setParamType("Int"); 64 | responseCode.setExample("0"); 65 | responseCode.setRequired("1"); 66 | list.add(responseCode); 67 | 68 | RequestParamsVO responseMsg = new RequestParamsVO(); 69 | responseMsg.setParamName(resultMsg); 70 | responseMsg.setParamDesc("错误信息"); 71 | responseMsg.setParamType("String"); 72 | responseMsg.setExample(""); 73 | responseMsg.setChildren(null); 74 | responseCode.setRequired("1"); 75 | list.add(responseMsg); 76 | 77 | RequestParamsVO responseData = new RequestParamsVO(); 78 | responseData.setParamName(resultData); 79 | responseData.setParamDesc("数据"); 80 | responseData.setParamType("Array"); 81 | responseData.setExample(""); 82 | responseCode.setRequired("1"); 83 | responseData.setChildren(responseParams); 84 | list.add(responseData); 85 | return list; 86 | } 87 | 88 | } 89 | -------------------------------------------------------------------------------- /crabc-boot/crabc-core/src/main/resources/static/js/chunk-15a47081.80bdbdbd.js: -------------------------------------------------------------------------------- 1 | (window.webpackJsonp=window.webpackJsonp||[]).push([["chunk-15a47081"],{"1c0a":function(s,t,e){"use strict";e("e7e3")},3107:function(s,t,e){"use strict";var l={props:{codeDataShow:{type:String,required:!0}},computed:{showData:function(){return JSON.parse(this.codeDataShow)}}},i=(e("1c0a"),e("2877")),a=Object(i.a)(l,(function(){var s=this._self._c;return this.showData?s("div",{staticClass:"ueditor"},[s("json-viewer",{attrs:{theme:"my-awesome-json-theme",value:this.showData,"expand-depth":2}})],1):this._e()}),[],!1,null,"190efa6e",null);t.a=a.exports},"4eb6":function(s,t,e){"use strict";e("f68b")},b3ff:function(s,t,e){"use strict";e.r(t);var l={components:{Code:e("3107").a},data:function(){return{datanull:{},userlog:{}}},created:function(){this.userlog=JSON.parse(sessionStorage.getItem("DetailUesLog")),this.$route.meta.title="日志详情"}},i=(e("4eb6"),e("2877")),a=Object(i.a)(l,(function(){var s=this,t=s._self._c;return t("div",{staticClass:"detail-userlog"},[t("ul",{staticClass:"userlog-detail"},[t("li",[t("div",{staticClass:"userlog-title-detail"},[s._v("接口编号:")]),t("div",{staticClass:"log-content"},[s._v(s._s(s.userlog.apiId))]),t("div",{staticClass:"userlog-title-detail"},[s._v("接口名称:")]),t("div",[s._v(s._s(s.userlog.apiName))])]),t("li",[t("div",{staticClass:"userlog-title-detail"},[s._v("请求方式:")]),t("div",{staticClass:"log-content"},[s._v(s._s(s.userlog.apiMethod))]),t("div",{staticClass:"userlog-title-detail"},[s._v("接口地址:")]),t("div",[s._v(s._s(s.userlog.apiPath))])]),t("li",[t("div",{staticClass:"userlog-title-detail"},[s._v("认证方式:")]),t("div",{staticClass:"log-content"},[s._v(s._s("app_code"===s.userlog.authType?"Code认证":"签名认证"))]),t("div",{staticClass:"userlog-title-detail"},[s._v("应用名称:")]),t("div",[s._v(s._s(s.userlog.appName))])]),t("li",[t("div",{staticClass:"userlog-title-detail"},[s._v("请求时间:")]),t("div",{staticClass:"log-content"},[s._v(s._s(s.userlog.requestTime))]),t("div",{staticClass:"userlog-title-detail"},[s._v("响应时间:")]),t("div",[s._v(s._s(s.userlog.responseTime))])]),t("li",[t("div",{staticClass:"userlog-title-detail"},[s._v("响应时长:")]),s.userlog.costTime>=1e3&&s.userlog.costTime<2e3?t("div",{staticClass:"log-content",staticStyle:{color:"orange"}},[s._v(s._s(s.userlog.costTime)+"ms")]):s.userlog.costTime>=2e3?t("div",{staticClass:"log-content",staticStyle:{color:"#F95555"}},[s._v(s._s(s.userlog.costTime)+"ms")]):t("div",{staticClass:"log-content"},[s._v(s._s(s.userlog.costTime)+" ms")]),t("div",{staticClass:"userlog-title-detail"},[s._v("IP地址:")]),t("div",{staticClass:"log-content"},[s._v(s._s(s.userlog.requestIp))])]),t("li",[t("div",{staticClass:"userlog-title-detail"},[s._v("响应结果:")]),t("div",{staticClass:"log-content",style:{color:"success"===s.userlog.requestStatus?"#097f46":"#F95555"}},[s._v(s._s("success"===s.userlog.requestStatus?"成功":"失败"))]),t("div",{staticClass:"userlog-title-detail"},[s._v("响应码:")]),t("div",{staticClass:"log-content",style:{color:200==s.userlog.responseCode?"":"#F95555"}},[s._v(s._s(s.userlog.responseCode))])]),t("li",[t("div",{staticClass:"userlog-title-detail"},[s._v("Path参数:")]),t("div",{staticClass:"log-content"},[s._v(s._s(s.userlog.queryParam))])]),t("li",[t("div",{staticClass:"userlog-title-detail"},[s._v("请求Body:")]),null!==s.userlog.requestBody?t("div",[t("Code",{staticClass:"codeClass",attrs:{codeDataShow:s.userlog.requestBody||{}}})],1):s._e()]),t("li",[t("div",{staticClass:"userlog-title-detail"},[s._v("响应Body:")]),null!==s.userlog.responseBody?t("div",[t("Code",{staticClass:"codeClass",attrs:{codeDataShow:s.userlog.responseBody||{}}})],1):s._e()])])])}),[],!1,null,"5ff4cbbd",null);t.default=a.exports},e7e3:function(s,t,e){},f68b:function(s,t,e){}}]); -------------------------------------------------------------------------------- /crabc-boot/crabc-datasource/pom.xml: -------------------------------------------------------------------------------- 1 | 2 | 5 | 4.0.0 6 | 7 | cn.crabc 8 | crabc-boot 9 | ${revision} 10 | 11 | 12 | crabc-datasource 13 | 14 | 21 15 | 21 16 | UTF-8 17 | 18 | 19 | 20 | org.springframework.boot 21 | spring-boot-starter-web 22 | 23 | 24 | com.github.pagehelper 25 | pagehelper-spring-boot-starter 26 | ${pagehelper.boot.version} 27 | 28 | 29 | 30 | org.mybatis.spring.boot 31 | mybatis-spring-boot-starter 32 | ${spring-boot.mybatis.version} 33 | 34 | 35 | com.baomidou 36 | mybatis-plus-spring-boot3-starter 37 | ${mybatis-plus.version} 38 | 39 | 40 | com.alibaba 41 | druid-spring-boot-starter 42 | ${spring-boot.druid.version} 43 | 44 | 45 | cn.crabc 46 | crabc-spi 47 | ${project.version} 48 | 49 | 50 | 51 | mysql 52 | mysql-connector-java 53 | 8.0.32 54 | 55 | 56 | org.postgresql 57 | postgresql 58 | 59 | 60 | com.oracle.database.jdbc 61 | ojdbc8 62 | 21.5.0.0 63 | 64 | 65 | com.oracle.database.nls 66 | orai18n 67 | 21.5.0.0 68 | 69 | 70 | com.microsoft.sqlserver 71 | mssql-jdbc 72 | 11.2.1.jre8 73 | 74 | 75 | net.sourceforge.jtds 76 | jtds 77 | 1.3.1 78 | 79 | 80 | com.dameng 81 | DmJdbcDriver18 82 | 8.1.3.140 83 | 84 | 85 | ru.yandex.clickhouse 86 | clickhouse-jdbc 87 | 0.3.2 88 | 89 | 90 | -------------------------------------------------------------------------------- /crabc-boot/crabc-core/src/main/java/cn/crabc/core/app/service/system/IBaseApiInfoService.java: -------------------------------------------------------------------------------- 1 | package cn.crabc.core.app.service.system; 2 | 3 | import cn.crabc.core.app.entity.BaseApiInfo; 4 | import cn.crabc.core.app.entity.BaseAppApi; 5 | import cn.crabc.core.app.entity.dto.ApiInfoDTO; 6 | import cn.crabc.core.app.entity.param.ApiInfoParam; 7 | import cn.crabc.core.app.entity.vo.ApiComboBoxVO; 8 | import cn.crabc.core.app.entity.vo.ApiInfoVO; 9 | import cn.crabc.core.app.entity.vo.BaseApiInfoVO; 10 | import cn.crabc.core.datasource.util.PageInfo; 11 | 12 | import java.util.List; 13 | 14 | /** 15 | * API 基本信息 服务接口 16 | * 17 | * @author yuqf 18 | */ 19 | public interface IBaseApiInfoService { 20 | 21 | void initApi(); 22 | 23 | /** 24 | * 获取API关联数据 25 | * 26 | * @param apiId 27 | * @return 28 | */ 29 | List getApiCache(Long apiId); 30 | 31 | /** 32 | * API 分页列表 33 | * 34 | * @param apiName 35 | * @param pageNum 36 | * @param pageSize 37 | * @return 38 | */ 39 | PageInfo getApiPage(String apiName, String devType, int pageNum, int pageSize); 40 | 41 | /** 42 | * API列表 43 | * 44 | * @param apiName 45 | * @return 46 | */ 47 | List getApiList(String apiName); 48 | 49 | /** 50 | * 分组下API列表 51 | * 52 | * @param groupId 53 | * @return 54 | */ 55 | List getApiListGroup(Integer groupId); 56 | 57 | /** 58 | * 分组用户API列表 59 | * 60 | * @param userId 61 | * @return 62 | */ 63 | List getApiListUser(String userId); 64 | 65 | /** 66 | * 校验接口URL是否存在 67 | * 68 | * @param apiPath 69 | * @param method 70 | * @return 71 | */ 72 | Boolean checkApiPath(Long apiId, String apiPath, String method); 73 | 74 | /** 75 | * apiId获取详情 76 | * 77 | * @param apiId 78 | * @return 79 | */ 80 | BaseApiInfoVO getApiDetail(Long apiId); 81 | 82 | /** 83 | * 根据apiId查询详情 84 | * 85 | * @param apiId 86 | * @return 87 | */ 88 | ApiInfoVO getApiInfo(Long apiId); 89 | 90 | /** 91 | * 新增API 92 | * 93 | * @param apiInfo 94 | * @return 95 | */ 96 | Long addApiInfo(ApiInfoParam apiInfo); 97 | 98 | /** 99 | * 编辑API信息 100 | * 101 | * @param apiInfo 102 | * @return 103 | */ 104 | Long updateApiInfo(ApiInfoParam apiInfo); 105 | 106 | /** 107 | * 更新API状态 108 | * 109 | * @param apiId 110 | * @param status 111 | * @param enabled 112 | * @return 113 | */ 114 | Integer updateApiState(Long apiId, String status, Integer enabled); 115 | 116 | /** 117 | * 删除API 118 | * @param apiId 119 | * @param userId 120 | * @return 121 | */ 122 | Integer deleteApi(Long apiId, String userId); 123 | 124 | /** 125 | * API发布 126 | * 127 | * @param apiInfoParam 128 | * @return 129 | */ 130 | Long apiPublish(ApiInfoParam apiInfoParam); 131 | 132 | /** 133 | * 获取未关联应用的API 134 | * 135 | * @param appId 136 | * @return 137 | */ 138 | PageInfo getNotChooseApi(Long appId, Integer pageNum, Integer pageSize); 139 | 140 | /** 141 | * 获取已关联应用的API 142 | * 143 | * @param appId 144 | * @return 145 | */ 146 | PageInfo getChooseApi(Long appId, Integer pageNum, Integer pageSize); 147 | 148 | /** 149 | * 保存应用API的关系 150 | * 151 | * @param appApi 152 | * @return 153 | */ 154 | Integer addChooseApi(BaseAppApi appApi); 155 | 156 | /** 157 | * 销毁接口 158 | * @param apiId 159 | * @return 160 | */ 161 | Integer destroyApiInfo(Long apiId); 162 | } 163 | -------------------------------------------------------------------------------- /crabc-boot/crabc-core/src/main/java/cn/crabc/core/app/service/core/impl/BaseDataServiceImpl.java: -------------------------------------------------------------------------------- 1 | package cn.crabc.core.app.service.core.impl; 2 | 3 | 4 | import cn.crabc.core.app.entity.vo.PreviewVO; 5 | import cn.crabc.core.app.service.core.IBaseDataService; 6 | import cn.crabc.core.app.util.SQLUtil; 7 | import cn.crabc.core.datasource.constant.BaseConstant; 8 | import cn.crabc.core.datasource.driver.DataSourceManager; 9 | import cn.crabc.core.spi.StatementMapper; 10 | import cn.crabc.core.spi.bean.BaseDataSource; 11 | import org.springframework.beans.factory.annotation.Autowired; 12 | import org.springframework.stereotype.Service; 13 | 14 | import java.util.*; 15 | 16 | /** 17 | * 接口执行服务 实现类 18 | * 19 | * @author yuqf 20 | */ 21 | @Service 22 | public class BaseDataServiceImpl implements IBaseDataService { 23 | 24 | @Autowired 25 | private DataSourceManager dataSourceManager; 26 | 27 | @Override 28 | public String testConnection(BaseDataSource dataSource) { 29 | return dataSourceManager.test(dataSource); 30 | } 31 | 32 | @Override 33 | public PreviewVO sqlPreview(String datasourceId,String datasourceType, String schema, String sql) { 34 | StatementMapper statementMapper = dataSourceManager.getStatementMapper(datasourceId); 35 | Map params = new HashMap<>(); 36 | // 数据源类型 37 | if (datasourceType != null) { 38 | params.put(BaseConstant.DATA_SOURCE_TYPE, datasourceType); 39 | } 40 | params.put(BaseConstant.BASE_API_EXEC_TYPE, "preview"); 41 | Object result = this.execute(datasourceId, datasourceType, schema, sql, params); 42 | PreviewVO preview = new PreviewVO(); 43 | if (result instanceof List) { 44 | List> list = (List>) result; 45 | if (!list.isEmpty()) { 46 | preview.setData(list); 47 | preview.setMetadata(list.get(0).keySet()); 48 | } 49 | } else { 50 | Map data = new HashMap<>(); 51 | data.put("执行结果", String.format("执行成功,影响条数:%s", result)); 52 | List> list = Collections.singletonList(data); 53 | preview.setData(list); 54 | preview.setMetadata(Collections.singleton("执行结果")); 55 | } 56 | return preview; 57 | } 58 | 59 | @Override 60 | public Object execute(String datasourceId, String datasourceType, String schema, String sql, Map params) { 61 | StatementMapper statementMapper = dataSourceManager.getStatementMapper(datasourceId); 62 | 63 | if (datasourceType != null && !params.containsKey(BaseConstant.DATA_SOURCE_TYPE)) { 64 | params.put(BaseConstant.DATA_SOURCE_TYPE, datasourceType); 65 | } 66 | 67 | String sqlType = SQLUtil.getOperateType(sql).toLowerCase(); 68 | switch (sqlType) { 69 | case "insert": 70 | return statementMapper.insert(datasourceId, schema, sql, params); 71 | case "update": 72 | return statementMapper.update(datasourceId, schema, sql, params); 73 | case "delete": 74 | return statementMapper.delete(datasourceId, schema, sql, params); 75 | default: 76 | Object pageNum = params.get(BaseConstant.PAGE_NUM); 77 | Object pageSize = params.get(BaseConstant.PAGE_SIZE); 78 | if (pageNum != null && pageSize != null) { 79 | return statementMapper.selectPage(datasourceId, schema, sql, params, 80 | Integer.parseInt(pageNum.toString()), 81 | Integer.parseInt(pageSize.toString())); 82 | } 83 | return statementMapper.selectList(datasourceId, schema, sql, params); 84 | } 85 | } 86 | } 87 | -------------------------------------------------------------------------------- /crabc-boot/crabc-datasource/src/main/java/cn/crabc/core/datasource/driver/DataSourceManager.java: -------------------------------------------------------------------------------- 1 | package cn.crabc.core.datasource.driver; 2 | 3 | import cn.crabc.core.datasource.exception.CustomException; 4 | import cn.crabc.core.spi.DataSourceDriver; 5 | import cn.crabc.core.spi.MetaDataMapper; 6 | import cn.crabc.core.spi.StatementMapper; 7 | import cn.crabc.core.spi.bean.BaseDataSource; 8 | import com.zaxxer.hikari.HikariDataSource; 9 | 10 | import javax.sql.DataSource; 11 | import java.util.Arrays; 12 | import java.util.List; 13 | import java.util.Map; 14 | import java.util.concurrent.ConcurrentHashMap; 15 | 16 | /** 17 | * 数据源驱动管理 18 | * 19 | * @author yuqf 20 | */ 21 | public class DataSourceManager { 22 | 23 | /** 24 | * JDBC数据源连接池 25 | */ 26 | public static final Map DATA_SOURCE_POOL_JDBC = new ConcurrentHashMap<>(); 27 | 28 | /** 29 | * 支持的关系型数据源类型 30 | */ 31 | private static final List JDBC_DATA_SOURCE_TYPE = Arrays.asList("mysql", "mariadb", "oracle", "sqlserver", "postgresql","sybase", "db2","doris", "sqlite", "tidb", "opengauss", "oceanbase", "polardb", "tdsql", "dm", "gbase", "hive2"); 32 | /** 33 | * 默认数据源驱动实现 34 | */ 35 | private DataSourceDriver defaultDriver; 36 | 37 | public DataSourceManager(DataSourceDriver dataSourceDriver) { 38 | // 默认JDBC驱动 39 | this.defaultDriver = dataSourceDriver; 40 | } 41 | 42 | /** 43 | * 创建数据源 44 | * 45 | * @param dataSource 46 | */ 47 | public void createDataSource(BaseDataSource dataSource) { 48 | this.defaultDriver.init(dataSource); 49 | } 50 | 51 | /** 52 | * 测试数据源 53 | * 54 | * @param dataSource 55 | * @return 56 | */ 57 | public String test(BaseDataSource dataSource) { 58 | String datasourceType = dataSource.getDatasourceType(); 59 | if (JDBC_DATA_SOURCE_TYPE.contains(datasourceType)) { 60 | return defaultDriver.test(dataSource); 61 | } else { 62 | throw new CustomException(51001, "暂不支持" + datasourceType + "数据源类型!"); 63 | } 64 | } 65 | 66 | 67 | /** 68 | * 获取数据源驱动 69 | * 70 | * @param datasourceId 71 | * @return 72 | */ 73 | public DataSourceDriver getDataSource(String datasourceId) { 74 | DataSourceDriver dataSourceDriver = null; 75 | DataSource dataSource = DATA_SOURCE_POOL_JDBC.get(datasourceId); 76 | if (dataSource != null) { 77 | dataSourceDriver = this.defaultDriver; 78 | } 79 | if (dataSourceDriver == null) { 80 | throw new CustomException(51001, "数据源不存在!"); 81 | } 82 | return dataSourceDriver; 83 | } 84 | 85 | /** 86 | * 元数据对象 87 | * @param datasourceId 88 | * @return 89 | */ 90 | public MetaDataMapper getMetaData(String datasourceId){ 91 | DataSourceDriver dataSource = this.getDataSource(datasourceId); 92 | return dataSource.getMetaData(); 93 | } 94 | 95 | /** 96 | * 数据处理对象 97 | * @param datasourceId 98 | * @return 99 | */ 100 | public StatementMapper getStatementMapper(String datasourceId){ 101 | DataSourceDriver dataSource = this.getDataSource(datasourceId); 102 | return dataSource.getStatement(); 103 | } 104 | 105 | /** 106 | * 删除数据源驱动 107 | * 108 | * @param datasourceId 109 | */ 110 | public void remove(String datasourceId) { 111 | DataSource dataSource = DATA_SOURCE_POOL_JDBC.get(datasourceId); 112 | if (dataSource instanceof HikariDataSource) { 113 | HikariDataSource hikariDataSource = (HikariDataSource) dataSource; 114 | hikariDataSource.close(); 115 | } 116 | DATA_SOURCE_POOL_JDBC.remove(datasourceId); 117 | } 118 | } 119 | -------------------------------------------------------------------------------- /crabc-boot/crabc-core/src/main/resources/mapper/BaseApiParamMapper.xml: -------------------------------------------------------------------------------- 1 | 2 | 5 | 6 | 7 | 22 | 23 | 42 | 43 | 56 | 57 | 58 | insert into base_api_param( 59 | api_id,param_name, 60 | column_name, 61 | required, 62 | operation, 63 | param_type, 64 | default_value, 65 | param_desc, 66 | create_by, 67 | create_time 68 | )values( 69 | #{apiId},#{paramName}, 70 | #{columnName}, 71 | #{required}, 72 | #{operation}, 73 | #{paramType}, 74 | #{defaultValue}, 75 | #{paramDesc}, 76 | #{createBy}, 77 | #{createTime} 78 | ) 79 | 80 | 81 | 82 | insert into base_api_param( 83 | api_id,param_name,column_name,required,operation,param_type,param_model,default_value,param_desc 84 | ,datasource_id,schema_name,table_name,create_time 85 | ) values 86 | 87 | (#{apiId},#{param.paramName},#{param.columnName},#{param.required} 88 | ,#{param.operation},#{param.paramType},#{param.paramModel},#{param.defaultValue},#{param.paramDesc} 89 | ,#{param.datasourceId},#{param.schemaName},#{param.tableName},NOW() 90 | ) 91 | 92 | 93 | 94 | delete from base_api_param where api_id =#{apiId} 95 | 96 | 97 | -------------------------------------------------------------------------------- /pom.xml: -------------------------------------------------------------------------------- 1 | 2 | 5 | 4.0.0 6 | 7 | cn.crabc 8 | crabc 9 | ${revision} 10 | 11 | pom 12 | 接口开发平台 13 | 14 | crabc-boot 15 | crabc-spring-boot-starter 16 | 17 | 18 | 19 | 20 | 3.5.2 21 | 21 22 | 21 23 | 21 24 | UTF-8 25 | 3.5.6 26 | 3.0.5 27 | 3.5.14 28 | 2.1.0 29 | 1.2.25 30 | 2.0.49 31 | 0.12.5 32 | 2.12.0 33 | 1.18.34 34 | 1.80 35 | 36 | 37 | 38 | spring-milestones 39 | Spring Milestones 40 | https://repo.spring.io/milestone 41 | 42 | false 43 | 44 | 45 | 46 | 47 | 48 | 49 | org.springframework.boot 50 | spring-boot-dependencies 51 | ${spring-boot.version} 52 | pom 53 | import 54 | 55 | 56 | 57 | 58 | 59 | 60 | org.apache.maven.plugins 61 | maven-compiler-plugin 62 | 63 | ${java.version} 64 | ${java.version} 65 | ${project.build.sourceEncoding} 66 | true 67 | 68 | 69 | 70 | 71 | org.codehaus.mojo 72 | flatten-maven-plugin 73 | 1.5.0 74 | 75 | resolveCiFriendliesOnly 76 | true 77 | 78 | 79 | 80 | 81 | flatten 82 | 83 | flatten 84 | process-resources 85 | 86 | 87 | 88 | clean 89 | 90 | flatten.clean 91 | clean 92 | 93 | 94 | 95 | 96 | 97 | -------------------------------------------------------------------------------- /crabc-boot/crabc-core/src/main/resources/mapper/BaseApiLogMapper.xml: -------------------------------------------------------------------------------- 1 | 2 | 5 | 6 | 7 | 42 | 43 | 66 | 67 | 68 | insert into base_api_log( 69 | api_id, 70 | api_name, 71 | api_path, 72 | api_method, 73 | app_name, 74 | auth_type, 75 | request_ip, 76 | query_param, 77 | request_body, 78 | response_body, 79 | body_size, 80 | request_status, 81 | response_code, 82 | cost_time,request_time,response_time 83 | )values( 84 | #{apiId}, 85 | #{apiName}, 86 | #{apiPath}, 87 | #{apiMethod}, 88 | #{appName}, 89 | #{authType}, 90 | #{requestIp}, 91 | #{queryParam}, 92 | #{requestBody}, 93 | #{responseBody}, 94 | #{bodySize}, 95 | #{requestStatus}, 96 | #{responseCode}, 97 | #{costTime},#{requestTime},#{responseTime} 98 | ) 99 | 100 | --------------------------------------------------------------------------------